directix 1.11.0 → 2.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/nuxt/runtime/plugin.ts", "../../../src/directives/index.ts", "../../../packages/core/src/adapter/vue2.ts", "../../../packages/core/src/adapter/vue3.ts", "../../../packages/core/src/env.ts", "../../../packages/core/src/define.ts", "../../../src/directives/blur.ts", "../../../packages/shared/src/directive.ts", "../../../packages/shared/src/dom.ts", "../../../packages/shared/src/event.ts", "../../../packages/shared/src/event-modifiers.ts", "../../../packages/shared/src/utils.ts", "../../../src/utils/text-transform.ts", "../../../src/directives/capitalcase.ts", "../../../src/directives/click-delay.ts", "../../../src/directives/click-outside.ts", "../../../src/directives/click-wave.ts", "../../../src/directives/context-menu.ts", "../../../src/directives/copy.ts", "../../../src/directives/countdown.ts", "../../../src/directives/counter.ts", "../../../src/directives/debounce.ts", "../../../src/directives/draggable.ts", "../../../src/directives/ellipsis.ts", "../../../src/directives/emoji.ts", "../../../src/directives/export.ts", "../../../src/directives/fade.ts", "../../../src/directives/focus.ts", "../../../src/directives/fullscreen.ts", "../../../src/directives/highlight.ts", "../../../src/directives/hotkey.ts", "../../../src/utils/directive.ts", "../../../src/directives/hover.ts", "../../../src/directives/image-preview.ts", "../../../src/directives/infinite-scroll.ts", "../../../src/directives/intersect.ts", "../../../src/directives/lazy.ts", "../../../src/directives/loading.ts", "../../../src/directives/long-press.ts", "../../../src/directives/lottie.ts", "../../../src/directives/lowercase.ts", "../../../src/directives/mask.ts", "../../../src/utils/number.ts", "../../../src/directives/money.ts", "../../../src/directives/mutation.ts", "../../../src/directives/number.ts", "../../../src/directives/pan.ts", "../../../src/directives/parallax.ts", "../../../src/directives/permission.ts", "../../../src/directives/pinch.ts", "../../../src/directives/print.ts", "../../../src/directives/progress.ts", "../../../src/directives/pull-refresh.ts", "../../../src/directives/resize.ts", "../../../src/directives/ripple.ts", "../../../src/directives/rotate-gesture.ts", "../../../src/directives/sanitize.ts", "../../../src/directives/scroll.ts", "../../../src/directives/skeleton.ts", "../../../src/directives/sticky.ts", "../../../src/directives/swipe.ts", "../../../src/directives/throttle.ts", "../../../src/directives/tooltip.ts", "../../../src/directives/touch.ts", "../../../src/directives/trim.ts", "../../../src/directives/truncate.ts", "../../../src/directives/typewriter.ts", "../../../src/directives/uppercase.ts", "../../../src/directives/virtual-list.ts", "../../../src/directives/visible.ts", "../../../src/directives/watermark.ts"],
4
- "sourcesContent": ["import type { DirectiveOptions } from '../../types'\nimport { defineNuxtPlugin, useRuntimeConfig } from '#app'\nimport * as directives from '../../directives'\n\nexport default defineNuxtPlugin(nuxtApp => {\n\tconst config = useRuntimeConfig()\n\tconst directiveNames = (config.public as any).directix?.directiveNames || []\n\tconst directiveOptions = (config.public as any).directix?.directiveOptions || {}\n\n\t// Register all enabled directives\n\tfor (const name of directiveNames) {\n\t\tconst directive = (directives as Record<string, any>)[name]\n\t\tif (directive) {\n\t\t\t// Convert v-directive-name to directive-name\n\t\t\tconst directiveName = name.slice(1)\n\t\t\tnuxtApp.vueApp.directive(directiveName, directive)\n\n\t\t\t// Apply options if provided\n\t\t\tconst options = directiveOptions[name] as DirectiveOptions | undefined\n\t\t\tif (options?.config) {\n\t\t\t\t// Some directives have configure functions\n\t\t\t\tconst configureKey = `configure${name.charAt(1).toUpperCase() + name.slice(2).replace(/-([a-z])/g, (_: string, c: string) => c.toUpperCase())}`\n\t\t\t\tif (typeof (directives as Record<string, any>)[configureKey] === 'function') {\n\t\t\t\t\t(directives as Record<string, any>)[configureKey](options.config)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n})\n", "export { default as blur, vBlur } from './blur'\nexport type { BlurBinding, BlurOptions } from './blur'\n\nexport { default as capitalcase, vCapitalcase } from './capitalcase'\nexport type { CapitalcaseBinding, CapitalcaseOptions } from './capitalcase'\n\nexport { default as clickDelay, vClickDelay } from './click-delay'\nexport type { ClickDelayBinding, ClickDelayHandler, ClickDelayOptions } from './click-delay'\n\n// Event directives\nexport { default as clickOutside, vClickOutside } from './click-outside'\nexport type { ClickOutsideBinding, ClickOutsideHandler, ClickOutsideOptions } from './click-outside'\n\nexport { default as clickWave, vClickWave } from './click-wave'\nexport type { ClickWaveBinding, ClickWaveOptions } from './click-wave'\n\nexport { default as contextMenu, vContextMenu } from './context-menu'\nexport type { ContextMenuBinding, ContextMenuItem, ContextMenuOptions } from './context-menu'\n\nexport { default as copy, vCopy } from './copy'\nexport type { CopyBinding, CopyErrorCallback, CopyOptions, CopySuccessCallback } from './copy'\n\nexport { default as countdown, vCountdown } from './countdown'\nexport type {\n\tCountdownBinding,\n\tCountdownCompleteCallback,\n\tCountdownFormatFunction,\n\tCountdownOptions,\n\tCountdownTickCallback,\n\tCountdownTime,\n} from './countdown'\n\nexport { default as counter, vCounter } from './counter'\nexport type { CounterBinding, CounterEasing, CounterOptions } from './counter'\n\nexport { default as debounce, vDebounce } from './debounce'\nexport type { DebounceBinding, DebouncedFunction, DebounceOptions } from './debounce'\n\nexport { default as draggable, vDraggable } from './draggable'\nexport type { DraggableAxis, DraggableBinding, DraggableOptions } from './draggable'\n\nexport { default as ellipsis, vEllipsis } from './ellipsis'\nexport type { EllipsisBinding, EllipsisOptions } from './ellipsis'\n\nexport { default as emoji, vEmoji } from './emoji'\nexport type { EmojiBinding, EmojiOptions } from './emoji'\n\nexport { default as exportDirective, vExport } from './export'\nexport type { ExportBinding, ExportFormat, ExportOptions } from './export'\n\nexport { default as fade, vFade } from './fade'\nexport type { FadeBinding, FadeDirection, FadeOptions } from './fade'\n\nexport { default as focus, vFocus } from './focus'\nexport type { FocusBinding, FocusOptions } from './focus'\n\nexport { default as fullscreen, vFullscreen } from './fullscreen'\nexport type { FullscreenBinding, FullscreenOptions } from './fullscreen'\n\nexport { default as highlight, vHighlight } from './highlight'\nexport type { HighlightBinding, HighlightOptions } from './highlight'\n\nexport { default as hotkey, vHotkey } from './hotkey'\nexport type { HotkeyBinding, HotkeyDefinition, HotkeyHandler, ModifierKey } from './hotkey'\n\nexport { default as hover, vHover } from './hover'\nexport type { HoverBinding, HoverHandler, HoverOptions } from './hover'\n\nexport { default as imagePreview, vImagePreview } from './image-preview'\nexport type { ImagePreviewBinding, ImagePreviewOptions } from './image-preview'\n\nexport { default as infiniteScroll, vInfiniteScroll } from './infinite-scroll'\nexport type { InfiniteScrollBinding, InfiniteScrollHandler, InfiniteScrollOptions } from './infinite-scroll'\n\nexport { default as intersect, vIntersect } from './intersect'\nexport type { IntersectBinding, IntersectHandler, IntersectOptions } from './intersect'\n\n// Visibility directives\nexport { default as lazy, vLazy } from './lazy'\nexport type { LazyBinding, LazyOptions, LazyState } from './lazy'\n\nexport { default as loading, vLoading } from './loading'\nexport type { LoadingBinding, LoadingOptions } from './loading'\n\n// Event interaction directives\nexport { default as longPress, vLongPress } from './long-press'\nexport type { LongPressBinding, LongPressHandler, LongPressOptions } from './long-press'\n\nexport { default as lottie, vLottie } from './lottie'\nexport type { LottieAnimationState, LottieBinding, LottieOptions } from './lottie'\n\nexport { default as lowercase, vLowercase } from './lowercase'\nexport type { LowercaseBinding, LowercaseOptions } from './lowercase'\n\n// Form directives\nexport { default as mask, vMask } from './mask'\nexport type { MaskBinding, MaskOptions } from './mask'\n\nexport { default as money, vMoney } from './money'\nexport type { MoneyBinding, MoneyOptions } from './money'\n\nexport { default as mutation, vMutation } from './mutation'\nexport type { MutationBinding, MutationHandler, MutationOptions } from './mutation'\n\nexport { default as number, vNumber } from './number'\nexport type { NumberBinding, NumberOptions } from './number'\n\n// Gesture directives\nexport { default as pan, vPan } from './pan'\nexport type { PanBinding, PanEvent, PanOptions } from './pan'\n\nexport { default as parallax, vParallax } from './parallax'\nexport type { ParallaxBinding, ParallaxOptions } from './parallax'\n\n// Security directives\nexport { configurePermission, getPermissionConfig, default as permission, vPermission } from './permission'\nexport type { PermissionAction, PermissionBinding, PermissionConfig, PermissionOptions } from './permission'\n\nexport { default as pinch, vPinch } from './pinch'\nexport type { PinchBinding, PinchEvent, PinchOptions } from './pinch'\n\nexport { default as print, vPrint } from './print'\nexport type { PrintBeforeCallback, PrintBinding, PrintCompleteCallback, PrintOptions } from './print'\n\nexport { default as progress, vProgress } from './progress'\nexport type { ProgressBinding, ProgressOptions, ProgressPosition } from './progress'\n\nexport { default as pullRefresh, vPullRefresh } from './pull-refresh'\nexport type {\n\tPullRefreshBinding,\n\tPullRefreshHandler,\n\tPullRefreshOptions,\n\tPullRefreshState,\n} from './pull-refresh'\n\n// Observer directives\nexport { default as resize, vResize } from './resize'\nexport type { ResizeBinding, ResizeHandler, ResizeInfo, ResizeOptions } from './resize'\n\nexport { default as ripple, vRipple } from './ripple'\nexport type { RippleBinding, RippleOptions } from './ripple'\n\nexport { default as rotateGesture, vRotateGesture } from './rotate-gesture'\nexport type { RotateGestureBinding, RotateGestureEvent, RotateGestureOptions } from './rotate-gesture'\n\nexport { default as sanitize, vSanitize } from './sanitize'\nexport type { SanitizeBinding, SanitizeHandler, SanitizeOptions } from './sanitize'\n\n// Scroll directives\nexport { default as scroll, vScroll } from './scroll'\nexport type { ScrollBinding, ScrollHandler, ScrollInfo, ScrollOptions } from './scroll'\n\nexport { default as skeleton, vSkeleton } from './skeleton'\nexport type { SkeletonAnimation, SkeletonBinding, SkeletonOptions } from './skeleton'\n\nexport { default as sticky, vSticky } from './sticky'\nexport type { StickyBinding, StickyOptions } from './sticky'\n\nexport { default as swipe, vSwipe } from './swipe'\nexport type { SwipeBinding, SwipeDirection, SwipeHandler, SwipeOptions } from './swipe'\n\nexport { default as throttle, vThrottle } from './throttle'\nexport type { ThrottleBinding, ThrottledFunction, ThrottleOptions } from './throttle'\n\n// UI directives\nexport { default as tooltip, vTooltip } from './tooltip'\nexport type { TooltipBinding, TooltipOptions, TooltipPlacement, TooltipTrigger } from './tooltip'\n\nexport { default as touch, vTouch } from './touch'\nexport type { TouchOptions } from './touch'\n\nexport { default as trim, vTrim } from './trim'\nexport type { TrimBinding, TrimOptions, TrimPosition } from './trim'\n\n// Format directives\nexport { default as truncate, vTruncate } from './truncate'\nexport type { TruncateBinding, TruncateOptions, TruncatePosition } from './truncate'\n\nexport { default as typewriter, vTypewriter } from './typewriter'\nexport type { TypewriterBinding, TypewriterOptions } from './typewriter'\n\nexport { default as uppercase, vUppercase } from './uppercase'\nexport type { UppercaseBinding, UppercaseOptions } from './uppercase'\n\nexport { default as virtualList, vVirtualList } from './virtual-list'\nexport type {\n\tItemSizeFunction,\n\tVirtualListBinding,\n\tVirtualListOptions,\n\tVirtualListRenderFunction,\n} from './virtual-list'\n\nexport { default as visible, vVisible } from './visible'\nexport type { VisibleBinding, VisibleHandler, VisibleOptions } from './visible'\n\nexport { vWatermark, default as watermark } from './watermark'\nexport type { WatermarkBinding, WatermarkOptions } from './watermark'\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", "/**\n * Vue version type\n * - 2: Vue 2.6.x (requires @vue/composition-api for Composition API)\n * - 2.7: Vue 2.7.x (has built-in Composition API support)\n * - 3: Vue 3.x\n */\nexport type VueVersion = 2 | 2.7 | 3\n\n/**\n * Vue version detection\n */\nlet _vueVersion: VueVersion | null = null,\n\t_isVue2: boolean | null = null,\n\t_isVue27: boolean | null = null,\n\t_isVue3: boolean | null = null\n\n/**\n * Parse version string to VueVersion\n */\nfunction parseVersion(version: string): VueVersion | null {\n\tif (version.startsWith('2.7')) return 2.7\n\tif (version.startsWith('2')) return 2\n\tif (version.startsWith('3')) return 3\n\n\treturn null\n}\n\n/**\n * Get current Vue version\n */\nexport function getVueVersion(): VueVersion {\n\tif (_vueVersion !== null) return _vueVersion\n\n\t// Method 1: Check environment variable (highest priority)\n\tif (typeof process !== 'undefined') {\n\t\tconst envVersion = process.env.DIRECTIX_VUE_VERSION\n\n\t\tif (envVersion === '2.7') {\n\t\t\t_vueVersion = 2.7\n\n\t\t\treturn _vueVersion\n\t\t}\n\t\tif (envVersion === '2') {\n\t\t\t_vueVersion = 2\n\n\t\t\treturn _vueVersion\n\t\t}\n\t\tif (envVersion === '3') {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\t}\n\n\t// Method 2: Try require (CommonJS/Node.js)\n\ttry {\n\t\t// eslint-disable-next-line ts/no-require-imports\n\t\tconst vue = require('vue')\n\t\tconst version = parseVersion(vue?.version)\n\n\t\tif (version !== null) {\n\t\t\t_vueVersion = version\n\n\t\t\treturn _vueVersion\n\t\t}\n\t} catch {\n\t\t// require failed, continue to other methods\n\t}\n\n\t// Method 3: Check browser environment\n\tif (typeof window !== 'undefined') {\n\t\tconst win = window as any\n\t\tconst vue = win.Vue\n\n\t\t// Check version string\n\t\tif (vue?.version) {\n\t\t\tconst version = parseVersion(vue.version)\n\n\t\t\tif (version !== null) {\n\t\t\t\t_vueVersion = version\n\n\t\t\t\treturn _vueVersion\n\t\t\t}\n\t\t}\n\n\t\t// Check Vue 2 specific API\n\t\tif (typeof vue?.observable === 'function') {\n\t\t\t_vueVersion = 2\n\n\t\t\treturn _vueVersion\n\t\t}\n\n\t\t// Check Vue 3 specific API\n\t\tif (typeof vue?.createApp === 'function' && typeof vue?.observable !== 'function') {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\n\t\t// Check devtools hook\n\t\tconst devtools = win.__VUE_DEVTOOLS_GLOBAL_HOOK__\n\n\t\tif (devtools?.Vue?.version) {\n\t\t\tconst version = parseVersion(devtools.Vue.version)\n\n\t\t\tif (version !== null) {\n\t\t\t\t_vueVersion = version\n\n\t\t\t\treturn _vueVersion\n\t\t\t}\n\t\t}\n\t\tif (devtools?.apps?.length) {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\t}\n\n\t// Default to Vue 3 but warn\n\tif (_vueVersion === null) {\n\t\tif (typeof window !== 'undefined') {\n\t\t\tconsole.warn(\n\t\t\t\t'[Directix] Unable to detect Vue version, defaulting to Vue 3. '\n\t\t\t\t+ 'Set DIRECTIX_VUE_VERSION=2 or call setVueVersion(2) if using Vue 2.',\n\t\t\t)\n\t\t}\n\t\t_vueVersion = 3\n\t}\n\n\treturn _vueVersion\n}\n\n/**\n * Set Vue version explicitly (for cases where auto-detection fails)\n */\nexport function setVueVersion(version: VueVersion): void {\n\t_vueVersion = version\n\t_isVue2 = version === 2 || version === 2.7\n\t_isVue27 = version === 2.7\n\t_isVue3 = version === 3\n}\n\n/**\n * Reset Vue version (useful for testing)\n */\nexport function resetVueVersion(): void {\n\t_vueVersion = null\n\t_isVue2 = null\n\t_isVue27 = null\n\t_isVue3 = null\n}\n\n/**\n * Check if Vue 2 (includes 2.7)\n */\nexport function isVue2(): boolean {\n\tif (_isVue2 === null) {\n\t\tconst version = getVueVersion()\n\n\t\t_isVue2 = version === 2 || version === 2.7\n\t}\n\n\treturn _isVue2\n}\n\n/**\n * Check if Vue 2.7 (has built-in Composition API support)\n */\nexport function isVue27(): boolean {\n\tif (_isVue27 === null) {\n\t\t_isVue27 = getVueVersion() === 2.7\n\t}\n\n\treturn _isVue27\n}\n\n/**\n * Check if Vue 3\n */\nexport function isVue3(): boolean {\n\tif (_isVue3 === null) {\n\t\t_isVue3 = getVueVersion() === 3\n\t}\n\n\treturn _isVue3\n}\n\n/**\n * Check if browser environment\n */\nexport const isBrowser = (): boolean => {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\n/**\n * Check if server-side rendering\n */\nexport const isSSR = (): boolean => !isBrowser()\n\n/**\n * Check if passive event listening is supported\n */\nexport const supportsPassive = (): boolean => {\n\tif (!isBrowser()) return false\n\n\tlet supports = false\n\n\ttry {\n\t\tconst options = {\n\t\t\tget passive() {\n\t\t\t\tsupports = true\n\n\t\t\t\treturn false\n\t\t\t},\n\t\t}\n\n\t\twindow.addEventListener('test', null as any, options)\n\t\twindow.removeEventListener('test', null as any, options as any)\n\t} catch {\n\t\tsupports = false\n\t}\n\n\treturn supports\n}\n\n/**\n * Check if IntersectionObserver is supported\n */\nexport const supportsIntersectionObserver = (): boolean => {\n\treturn isBrowser() && 'IntersectionObserver' in window\n}\n\n/**\n * Check if ResizeObserver is supported\n */\nexport const supportsResizeObserver = (): boolean => {\n\treturn isBrowser() && 'ResizeObserver' in window\n}\n\n/**\n * Check if Clipboard API is supported\n */\nexport const supportsClipboard = (): boolean => {\n\treturn isBrowser() && 'clipboard' in navigator\n}\n\n/**\n * Check if MutationObserver is supported\n */\nexport const supportsMutationObserver = (): boolean => {\n\treturn isBrowser() && 'MutationObserver' in window\n}\n", "import type { Directive } from 'vue'\nimport type { DirectiveBinding, DirectiveDefinition, DirectiveHooks } from './types'\nimport { createVue2Directive } from './adapter/vue2'\nimport { createVue3Directive } from './adapter/vue3'\nimport { getVueVersion, isSSR } from './env'\n\n/**\n * Define a cross-version compatible directive\n * @param definition The directive definition\n * @returns Vue directive object\n */\nexport function defineDirective<T = any, B extends Element = Element>(\n\tdefinition: DirectiveDefinition<T, B>,\n): Directive {\n\tconst { name, version, ssr, defaults, ...hooks } = definition\n\n\t// SSR check\n\tif (isSSR() && !ssr) {\n\t\tif (typeof process !== 'undefined' && process.env?.NODE_ENV !== 'test') {\n\t\t\tconsole.warn(\n\t\t\t\t`[Directix] Directive \"${name}\" is not compatible with SSR. `\n\t\t\t\t+ 'It will be a no-op on the server side.',\n\t\t\t)\n\t\t}\n\n\t\treturn createNoOpDirective()\n\t}\n\n\t// Wrap hooks with default values\n\tconst wrappedHooks: DirectiveHooks<T, B> = {\n\t\tmounted: hooks.mounted ? (el, binding, vnode) => {\n\t\t\thooks.mounted!(el, applyDefaults(binding, defaults), vnode)\n\t\t} : undefined,\n\n\t\tupdated: hooks.updated ? (el, binding, vnode, prevBinding, prevVnode) => {\n\t\t\thooks.updated!(el, applyDefaults(binding, defaults), vnode, prevBinding, prevVnode)\n\t\t} : undefined,\n\n\t\tunmounted: hooks.unmounted,\n\t}\n\n\t// Create a lazy directive that determines version at runtime\n\treturn createLazyDirective(wrappedHooks)\n}\n\n/**\n * Create a lazy directive that determines Vue version at first use\n */\nfunction createLazyDirective<T, B extends Element>(hooks: DirectiveHooks<T, B>): Directive {\n\tlet cachedDirective: any = null\n\n\t// Unified detection entry point\n\tfunction getDirective(): any {\n\t\tif (!cachedDirective) {\n\t\t\tcachedDirective = getVueVersion() === 2 ? createVue2Directive(hooks) : createVue3Directive(hooks)\n\t\t}\n\n\t\treturn cachedDirective\n\t}\n\n\t// Hook generator to reduce code duplication\n\tfunction createHook(hookName: string) {\n\t\treturn function (el: B, binding: any, vnode: any, prevVnode?: any) {\n\t\t\tgetDirective()[hookName]?.(el, binding, vnode, prevVnode)\n\t\t}\n\t}\n\n\treturn {\n\t\t// Vue 2 hooks\n\t\tbind: createHook('bind'),\n\t\tinserted: createHook('inserted'),\n\t\tupdate: createHook('update'),\n\t\tcomponentUpdated: createHook('componentUpdated'),\n\t\tunbind: createHook('unbind'),\n\t\t// Vue 3 hooks\n\t\tcreated: createHook('created'),\n\t\tbeforeMount: createHook('beforeMount'),\n\t\tmounted: createHook('mounted'),\n\t\tbeforeUpdate: createHook('beforeUpdate'),\n\t\tupdated: createHook('updated'),\n\t\tbeforeUnmount: createHook('beforeUnmount'),\n\t\tunmounted: createHook('unmounted'),\n\t} as Directive\n}\n\n/**\n * Apply default values to binding\n */\nfunction applyDefaults<T>(\n\tbinding: DirectiveBinding<T>,\n\tdefaults?: Partial<T>,\n): DirectiveBinding<T> {\n\tif (!defaults) return binding\n\n\tconst value\n\t\t= typeof binding.value === 'object' && binding.value !== null ? { ...defaults, ...binding.value } : binding.value\n\n\treturn { ...binding, value: value as T }\n}\n\n/**\n * Create a no-op directive (for SSR)\n */\nfunction createNoOpDirective(): Directive {\n\treturn {\n\t\tmounted: () => {},\n\t\tupdated: () => {},\n\t\tunmounted: () => {},\n\t}\n}\n\n/**\n * Define a directive group\n */\nexport function defineDirectiveGroup(\n\tname: string,\n\tdirectives: Record<string, any>,\n): { name: string, directives: Record<string, any>, install: (app: any) => void } {\n\treturn {\n\t\tname,\n\t\tdirectives,\n\t\tinstall(app: any, _options?: any) {\n\t\t\tObject.entries(directives).forEach(([directiveName, directive]) => {\n\t\t\t\tconst fullName = `${name}-${directiveName}`\n\n\t\t\t\tapp.directive(fullName, directive)\n\t\t\t})\n\t\t},\n\t}\n}\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Blur directive options\n */\nexport interface BlurOptions {\n\t/**\n\t * Blur radius in pixels\n\t * @default 5\n\t */\n\tradius?: number\n\n\t/**\n\t * Whether to show blur effect\n\t * @default true\n\t */\n\tvisible?: boolean\n\n\t/**\n\t * Transition duration in milliseconds\n\t * @default 300\n\t */\n\tduration?: number\n\n\t/**\n\t * Overlay color\n\t * @default 'transparent'\n\t */\n\toverlayColor?: string\n\n\t/**\n\t * Z-index for the blur overlay\n\t * @default 999\n\t */\n\tzIndex?: number\n\n\t/**\n\t * Whether to lock scroll when blur is active\n\t * @default false\n\t */\n\tlockScroll?: boolean\n\n\t/**\n\t * Custom class for blur container\n\t */\n\tclass?: string\n\n\t/**\n\t * Callback when blur is shown\n\t */\n\tonShow?: () => void\n\n\t/**\n\t * Callback when blur is hidden\n\t */\n\tonHide?: () => void\n}\n\n/**\n * Directive binding value type\n */\nexport type BlurBinding = boolean | number | BlurOptions\n\n/**\n * Element state storage\n */\ninterface BlurState {\n\toptions: BlurOptions\n\tblurContainer: HTMLDivElement | null\n\toriginalOverflow: string\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: BlurBinding | undefined): BlurOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn {\n\t\t\tvisible: binding,\n\t\t\tradius: 5,\n\t\t\tduration: 300,\n\t\t\toverlayColor: 'transparent',\n\t\t\tzIndex: 999,\n\t\t\tlockScroll: false,\n\t\t}\n\t}\n\n\tif (typeof binding === 'number') {\n\t\treturn {\n\t\t\tvisible: true,\n\t\t\tradius: binding,\n\t\t\tduration: 300,\n\t\t\toverlayColor: 'transparent',\n\t\t\tzIndex: 999,\n\t\t\tlockScroll: false,\n\t\t}\n\t}\n\n\treturn {\n\t\tradius: 5,\n\t\tvisible: true,\n\t\tduration: 300,\n\t\toverlayColor: 'transparent',\n\t\tzIndex: 999,\n\t\tlockScroll: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Create blur overlay element\n */\nfunction createBlurOverlay(options: BlurOptions): HTMLDivElement {\n\tconst overlay = document.createElement('div')\n\toverlay.className = `v-blur-overlay ${options.class || ''}`\n\n\toverlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n backdrop-filter: blur(${options.radius}px);\n -webkit-backdrop-filter: blur(${options.radius}px);\n background: ${options.overlayColor || 'transparent'};\n z-index: ${options.zIndex};\n opacity: 0;\n transition: opacity ${options.duration}ms ease;\n pointer-events: auto;\n border-radius: inherit;\n `\n\n\treturn overlay\n}\n\n/**\n * v-blur directive\n * Background blur overlay effect\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple blur -->\n * <div v-blur=\"isBlurred\">Content behind blur</div>\n *\n * <!-- With radius -->\n * <div v-blur=\"15\">Blur with 15px radius</div>\n *\n * <!-- With options -->\n * <div v-blur=\"{\n * visible: isBlurred,\n * radius: 20,\n * overlayColor: 'rgba(255, 255, 255, 0.3)',\n * lockScroll: true\n * }\">\n * Content\n * </div>\n * </template>\n * ```\n */\nexport const vBlur = defineDirective<BlurBinding, HTMLElement>({\n\tname: 'blur',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: BlurState = {\n\t\t\toptions,\n\t\t\tblurContainer: null,\n\t\t\toriginalOverflow: '',\n\t\t}\n\n\t\t;(el as any).__blur = state\n\n\t\tif (options.visible) {\n\t\t\tshowBlur(el, state)\n\t\t}\n\n\t\tel.classList.add('v-blur')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: BlurState = (el as any).__blur\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst wasVisible = state.options.visible\n\n\t\tstate.options = newOptions\n\n\t\tif (newOptions.visible && !wasVisible) {\n\t\t\tshowBlur(el, state)\n\t\t} else if (!newOptions.visible && wasVisible) {\n\t\t\thideBlur(el, state)\n\t\t} else if (newOptions.visible && wasVisible) {\n\t\t\t// Update blur effect\n\t\t\tif (state.blurContainer) {\n\t\t\t\tstate.blurContainer.style.backdropFilter = `blur(${newOptions.radius}px)`\n\t\t\t\t;(state.blurContainer.style as any).webkitBackdropFilter = `blur(${newOptions.radius}px)`\n\t\t\t\tstate.blurContainer.style.background = newOptions.overlayColor || 'rgba(0, 0, 0, 0.5)'\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: BlurState = (el as any).__blur\n\n\t\tif (!state) return\n\n\t\thideBlur(el, state)\n\t\tel.classList.remove('v-blur')\n\n\t\tdelete (el as any).__blur\n\t},\n})\n\n/**\n * Show blur effect\n */\nfunction showBlur(el: HTMLElement, state: BlurState): void {\n\tconst options = state.options\n\n\t// Ensure element has position for absolute overlay\n\tconst computedStyle = window.getComputedStyle(el)\n\tif (computedStyle.position === 'static') {\n\t\tel.style.position = 'relative'\n\t}\n\n\t// Create blur overlay\n\tstate.blurContainer = createBlurOverlay(options)\n\n\t// Insert overlay inside the element\n\tel.appendChild(state.blurContainer)\n\n\t// Trigger reflow for transition\n\tString(state.blurContainer.offsetHeight)\n\n\t// Fade in\n\tstate.blurContainer.style.opacity = '1'\n\n\t// Lock scroll\n\tif (options.lockScroll) {\n\t\tstate.originalOverflow = document.body.style.overflow\n\t\tdocument.body.style.overflow = 'hidden'\n\t}\n\n\toptions.onShow?.()\n}\n\n/**\n * Hide blur effect\n */\nfunction hideBlur(_el: HTMLElement, state: BlurState): void {\n\tif (!state.blurContainer) return\n\n\tconst options = state.options\n\n\t// Fade out\n\tstate.blurContainer.style.opacity = '0'\n\n\t// Restore scroll\n\tif (options.lockScroll) {\n\t\tdocument.body.style.overflow = state.originalOverflow\n\t}\n\n\t// Remove after transition\n\tsetTimeout(() => {\n\t\tif (state.blurContainer && state.blurContainer.parentNode) {\n\t\t\tstate.blurContainer.parentNode.removeChild(state.blurContainer)\n\t\t}\n\t\tstate.blurContainer = null\n\t}, options.duration)\n\n\toptions.onHide?.()\n}\n\nexport default vBlur\n", "/**\n * Directive state management utilities\n * Layer: Shared (no Vue dependency)\n *\n * These are low-level utilities for storing state on DOM elements.\n * For higher-level directive utilities, see src/utils/directive.ts\n */\n\n/**\n * State key prefix for storing directive state on elements\n */\nconst STATE_PREFIX = '__directix_'\n\n/**\n * Set directive state on element\n * @param el - Target element\n * @param key - Directive name/key\n * @param state - State to store\n */\nexport function setState<E extends Element, T>(el: E, key: string, state: T): void {\n\t;(el as any)[STATE_PREFIX + key] = state\n}\n\n/**\n * Get directive state from element\n * @param el - Target element\n * @param key - Directive name/key\n * @returns Stored state or undefined\n */\nexport function getState<E extends Element, T>(el: E, key: string): T | undefined {\n\treturn (el as any)[STATE_PREFIX + key]\n}\n\n/**\n * Delete directive state from element\n * @param el - Target element\n * @param key - Directive name/key\n */\nexport function deleteState<E extends Element>(el: E, key: string): void {\n\tdelete (el as any)[STATE_PREFIX + key]\n}\n\n/**\n * Check if element has directive state\n * @param el - Target element\n * @param key - Directive name/key\n */\nexport function hasState<E extends Element>(el: E, key: string): boolean {\n\treturn STATE_PREFIX + key in (el as any)\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\t&& rect.left >= 0\n\t\t&& rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n\t\t&& rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t)\n}\n\n/**\n * Get nearest scrollable parent element\n */\nexport function getScrollParent(el: Element): Element | Window {\n\tif (!isBrowser()) return window\n\n\tlet parent: Element | null = el.parentElement\n\n\twhile (parent) {\n\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent)\n\n\t\tif (/(auto|scroll)/.test(overflow + overflowX + overflowY)) {\n\t\t\treturn parent\n\t\t}\n\n\t\tparent = parent.parentElement\n\t}\n\n\treturn window\n}\n\n/**\n * Check if element matches selector\n */\nexport function matches(el: Element, selector: string): boolean {\n\treturn el.matches(selector)\n}\n\n/**\n * Get nearest ancestor matching selector\n */\nexport function closest(el: Element, selector: string): Element | null {\n\treturn el.closest(selector)\n}\n\n/**\n * Check if element is an input or textarea\n */\nexport function isInputElement(el: Element): el is HTMLInputElement | HTMLTextAreaElement {\n\treturn el.tagName === 'INPUT' || el.tagName === 'TEXTAREA'\n}\n\n/**\n * Ensure element has specified position (set to relative if static)\n * @param el - Target element\n * @param position - Desired position value\n */\nexport function ensurePosition(el: HTMLElement, position: 'relative' | 'absolute' = 'relative'): void {\n\tif (!isBrowser()) return\n\tif (getComputedStyle(el).position === 'static') {\n\t\tel.style.position = position\n\t}\n}\n\n/**\n * Ensure element has overflow hidden (to contain child elements like ripple)\n * @param el - Target element\n */\nexport function ensureOverflowHidden(el: HTMLElement): void {\n\tif (!isBrowser()) return\n\tif (getComputedStyle(el).overflow === 'visible') {\n\t\tel.style.overflow = 'hidden'\n\t}\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/**\n * Event handlers map for batch binding\n */\nexport type EventHandlerMap = Record<string, (event: Event) => void>\n\n/**\n * Bind multiple events to a target\n * @param target - Event target\n * @param events - Map of event names to handlers\n * @param options - Event options\n * @returns Cleanup function to unbind all events\n *\n * @example\n * ```ts\n * const cleanup = bindEvents(el, {\n * touchstart: handleStart,\n * touchmove: handleMove,\n * touchend: handleEnd,\n * })\n *\n * // Later, clean up\n * cleanup()\n * ```\n */\nexport function bindEvents(\n\ttarget: EventTarget,\n\tevents: EventHandlerMap,\n\toptions: boolean | EventOptions = false,\n): () => void {\n\tObject.entries(events).forEach(([event, handler]) => {\n\t\ttarget.addEventListener(event, handler, typeof options === 'boolean' ? options : normalizeOptionsObject(options))\n\t})\n\n\treturn () => {\n\t\tObject.entries(events).forEach(([event, handler]) => {\n\t\t\ttarget.removeEventListener(event, handler, typeof options === 'boolean' ? options : normalizeOptionsObject(options))\n\t\t})\n\t}\n}\n\n/**\n * Normalize event options (internal use for bindEvents)\n */\nfunction normalizeOptionsObject(options: EventOptions): boolean | { capture: boolean, passive: boolean, once: boolean } {\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 a keyboard event matcher\n * @param key - Key to match\n * @param modifiers - Required modifiers\n * @returns Matcher function\n */\nexport function createKeyMatcher(\n\tkey: string,\n\tmodifiers?: { ctrl?: boolean, alt?: boolean, shift?: boolean, meta?: boolean },\n): (event: KeyboardEvent) => boolean {\n\tconst normalizedKey = key.toLowerCase()\n\n\treturn (event: KeyboardEvent): boolean => {\n\t\tif (event.key.toLowerCase() !== normalizedKey) return false\n\n\t\tif (modifiers) {\n\t\t\tif (modifiers.ctrl && !event.ctrlKey) return false\n\t\t\tif (modifiers.alt && !event.altKey) return false\n\t\t\tif (modifiers.shift && !event.shiftKey) return false\n\t\t\tif (modifiers.meta && !event.metaKey) return false\n\n\t\t\t// Check that no extra modifiers are pressed\n\t\t\tif (!modifiers.ctrl && event.ctrlKey) return false\n\t\t\tif (!modifiers.alt && event.altKey) return false\n\t\t\tif (!modifiers.shift && event.shiftKey) return false\n\t\t\tif (!modifiers.meta && event.metaKey) return false\n\t\t}\n\n\t\treturn true\n\t}\n}\n", "/**\n * Event type modifiers for directives like v-debounce, v-throttle\n */\n\n/**\n * Supported event type modifiers list\n */\nexport const EVENT_MODIFIERS = [\n\t'click',\n\t'input',\n\t'change',\n\t'submit',\n\t'scroll',\n\t'resize',\n\t'mouseenter',\n\t'mouseleave',\n\t'mousemove',\n\t'mousedown',\n\t'mouseup',\n\t'keydown',\n\t'keyup',\n\t'focus',\n\t'blur',\n\t'touchstart',\n\t'touchmove',\n\t'touchend',\n] as const\n\nexport type EventModifier = (typeof EVENT_MODIFIERS)[number]\n\n/**\n * Extract event type from directive modifiers\n * @param modifiers - Directive modifiers object\n * @returns Event type if found, null otherwise\n *\n * @example\n * ```ts\n * // v-debounce.click=\"handler\" -> 'click'\n * // v-debounce.scroll=\"handler\" -> 'scroll'\n * getEventTypeFromModifiers({ click: true }) // 'click'\n * ```\n */\nexport function getEventTypeFromModifiers(modifiers: Record<string, boolean>): string | null {\n\tfor (const modifier of EVENT_MODIFIERS) {\n\t\tif (modifiers[modifier]) {\n\t\t\treturn modifier\n\t\t}\n\t}\n\n\treturn null\n}\n\n/**\n * Get default event type for element\n * @param el - Target element\n * @returns Default event type based on element tag\n */\nexport function getDefaultEventType(el: HTMLElement): string {\n\tconst tagName = el.tagName.toLowerCase()\n\n\tif (tagName === 'input' || tagName === 'textarea') {\n\t\treturn 'input'\n\t}\n\n\treturn 'click'\n}\n", "/**\n * Check if value is a string\n */\nexport function isString(value: unknown): value is string {\n\treturn typeof value === 'string'\n}\n\n/**\n * Check if value is a number\n */\nexport function isNumber(value: unknown): value is number {\n\treturn typeof value === 'number' && !isNaN(value)\n}\n\n/**\n * Check if value is a boolean\n */\nexport function isBoolean(value: unknown): value is boolean {\n\treturn typeof value === 'boolean'\n}\n\n/**\n * Check if value is a function\n */\nexport function isFunction(value: unknown): value is (...args: any[]) => any {\n\treturn typeof value === 'function'\n}\n\n/**\n * Check if value is an object\n */\nexport function isObject(value: unknown): value is Record<string, any> {\n\treturn typeof value === 'object' && value !== null\n}\n\n/**\n * Check if value is an array\n */\nexport function isArray(value: unknown): value is any[] {\n\treturn Array.isArray(value)\n}\n\n/**\n * Check if value is empty\n */\nexport function isEmpty(value: unknown): boolean {\n\tif (value === null || value === undefined) return true\n\tif (isString(value) || isArray(value)) return value.length === 0\n\tif (isObject(value)) return Object.keys(value).length === 0\n\n\treturn false\n}\n\n/**\n * Check if value is a Promise\n */\nexport function isPromise<T = any>(value: unknown): value is Promise<T> {\n\treturn isObject(value) && isFunction((value as any).then)\n}\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n\tif (obj === null || typeof obj !== 'object') {\n\t\treturn obj\n\t}\n\n\tif (Array.isArray(obj)) {\n\t\treturn obj.map(item => deepClone(item)) as unknown as T\n\t}\n\n\tconst cloned = {} as T\n\n\tfor (const key in obj) {\n\t\tif (Object.prototype.hasOwnProperty.call(obj, key)) {\n\t\t\tcloned[key] = deepClone(obj[key])\n\t\t}\n\t}\n\n\treturn cloned\n}\n\n/**\n * Deep merge objects\n */\nexport function deepMerge<T extends Record<string, any>>(\n\ttarget: T,\n\t...sources: Partial<T>[]\n): T {\n\tif (!sources.length) return target\n\n\tconst source = sources.shift()\n\n\tif (isObject(target) && isObject(source)) {\n\t\tfor (const key in source) {\n\t\t\tif (isObject(source[key])) {\n\t\t\t\tif (!target[key]) {\n\t\t\t\t\tObject.assign(target, { [key]: {} })\n\t\t\t\t}\n\t\t\t\tdeepMerge(\n\t\t\t\t\ttarget[key] as Record<string, any>,\n\t\t\t\t\tsource[key] as Record<string, any>,\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tObject.assign(target, { [key]: source[key] })\n\t\t\t}\n\t\t}\n\t}\n\n\treturn deepMerge(target, ...sources)\n}\n\n/**\n * Get nested property value by path\n */\nexport function get<T = any>(\n\tobj: Record<string, any>,\n\tpath: string,\n\tdefaultValue?: T,\n): T {\n\tconst keys = path.split('.')\n\tlet result: any = obj\n\n\tfor (const key of keys) {\n\t\tif (result === null || result === undefined) {\n\t\t\treturn defaultValue as T\n\t\t}\n\t\tresult = result[key]\n\t}\n\n\treturn (result === undefined ? defaultValue : result) as T\n}\n\n/**\n * Set nested property value by path\n */\nexport function set(obj: Record<string, any>, path: string, value: any): void {\n\tconst keys = path.split('.')\n\tconst lastKey = keys.pop()!\n\tlet current = obj\n\n\tfor (const key of keys) {\n\t\tif (current[key] === undefined) {\n\t\t\tcurrent[key] = {}\n\t\t}\n\t\tcurrent = current[key]\n\t}\n\n\tcurrent[lastKey] = value\n}\n\n/**\n * Debounce function\n */\nexport function debounce<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number = 300,\n\toptions: { leading?: boolean, trailing?: boolean } = {},\n): ((...args: Parameters<T>) => void) & { cancel: () => void, flush: () => void } {\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null\n\n\tconst { leading = false, trailing = true } = options\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\tfunc.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst debounced = function (this: any, ...args: Parameters<T>): void {\n\t\tlastArgs = args\n\t\t// eslint-disable-next-line ts/no-this-alias\n\t\tlastThis = this\n\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t}\n\n\t\tif (leading && !timerId) {\n\t\t\tinvokeFunc()\n\t\t}\n\n\t\ttimerId = setTimeout(() => {\n\t\t\tif (trailing) {\n\t\t\t\tinvokeFunc()\n\t\t\t}\n\t\t\ttimerId = null\n\t\t}, wait)\n\t} as ((...args: Parameters<T>) => void) & { cancel: () => void, flush: () => void }\n\n\tdebounced.cancel = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tlastArgs = null\n\t\tlastThis = null\n\t}\n\n\tdebounced.flush = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\tinvokeFunc()\n\t\t\ttimerId = null\n\t\t}\n\t}\n\n\treturn debounced\n}\n\n/**\n * Throttle function\n */\nexport function throttle<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number = 300,\n\toptions: { leading?: boolean, trailing?: boolean } = {},\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null,\n\t\tlastCallTime = 0\n\n\tconst { leading = true, trailing = true } = options\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\tfunc.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst throttled = function (this: any, ...args: Parameters<T>): void {\n\t\tconst now = Date.now()\n\n\t\tif (!lastCallTime && !leading) {\n\t\t\tlastCallTime = now\n\t\t}\n\n\t\tconst remaining = wait - (now - lastCallTime)\n\n\t\tlastArgs = args\n\t\t// eslint-disable-next-line ts/no-this-alias\n\t\tlastThis = this\n\n\t\tif (remaining <= 0 || remaining > wait) {\n\t\t\tif (timerId) {\n\t\t\t\tclearTimeout(timerId)\n\t\t\t\ttimerId = null\n\t\t\t}\n\t\t\tlastCallTime = now\n\t\t\tinvokeFunc()\n\t\t} else if (!timerId && trailing) {\n\t\t\ttimerId = setTimeout(() => {\n\t\t\t\tlastCallTime = leading ? Date.now() : 0\n\t\t\t\ttimerId = null\n\t\t\t\tinvokeFunc()\n\t\t\t}, remaining)\n\t\t}\n\t} as ((...args: Parameters<T>) => void) & { cancel: () => void }\n\n\tthrottled.cancel = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tlastCallTime = 0\n\t\tlastArgs = null\n\t\tlastThis = null\n\t}\n\n\treturn throttled\n}\n\n/**\n * Parse time argument\n * Supports formats: \"300\" | \"300ms\" | \"1s\"\n */\nexport function parseTime(arg?: string): number | null {\n\tif (!arg) return null\n\n\tif (arg.endsWith('ms')) {\n\t\treturn parseInt(arg, 10)\n\t}\n\n\tif (arg.endsWith('s')) {\n\t\treturn parseFloat(arg) * 1000\n\t}\n\n\tconst num = parseInt(arg, 10)\n\n\treturn isNaN(num) ? null : num\n}\n\n/**\n * Generate unique ID\n */\nexport function generateId(prefix: string = ''): string {\n\treturn `${prefix}${Date.now().toString(36)}${Math.random().toString(36).slice(2, 9)}`\n}\n\n/**\n * Calculate distance between two points\n */\nexport function getDistance(\n\tp1: { x: number, y: number },\n\tp2: { x: number, y: number },\n): number {\n\treturn Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2)\n}\n\n/**\n * Clamp value within min/max bounds\n */\nexport function clamp(value: number, min?: number, max?: number): number {\n\tlet result = value\n\tif (min !== undefined) result = Math.max(min, result)\n\tif (max !== undefined) result = Math.min(max, result)\n\treturn result\n}\n\n/**\n * Escape special regex characters in a string\n */\nexport function escapeRegex(str: string): string {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n", "/**\n * Shared utilities for text transformation directives\n * (uppercase, lowercase, capitalcase, trim)\n */\n\nimport { isInputElement } from '@directix/shared'\n\n// Re-export isInputElement for convenience\nexport { isInputElement }\n\n/**\n * Base options for text transform directives\n */\nexport interface TextTransformOptions {\n\t/**\n\t * Whether to transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Setup an input element with text transformation\n * Returns cleanup function\n */\nexport function setupTextTransformInput(\n\tel: HTMLInputElement | HTMLTextAreaElement,\n\toptions: TextTransformOptions,\n\ttransformFn: (text: string) => string,\n): () => void {\n\tif (!options.onInput) {\n\t\treturn () => {}\n\t}\n\n\tconst handler = (): void => {\n\t\tconst start = el.selectionStart\n\t\tconst end = el.selectionEnd\n\t\tconst originalValue = el.value\n\t\tconst transformed = transformFn(originalValue)\n\n\t\tif (originalValue !== transformed) {\n\t\t\tel.value = transformed\n\t\t\t// Restore cursor position\n\t\t\tif (start !== null && end !== null) {\n\t\t\t\tel.setSelectionRange(start, end)\n\t\t\t}\n\t\t\t// Trigger input event for v-model\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t}\n\t}\n\n\tel.addEventListener('input', handler)\n\n\t// Initial transform\n\tel.value = transformFn(el.value)\n\n\treturn () => {\n\t\tel.removeEventListener('input', handler)\n\t}\n}\n\n/**\n * Transform text content of a non-input element\n */\nexport function transformTextContent(el: HTMLElement, transformFn: (text: string) => string): void {\n\tconst text = el.textContent || ''\n\n\tel.textContent = transformFn(text)\n}\n", "import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Capitalcase directive options\n */\nexport interface CapitalcaseOptions {\n\t/**\n\t * Whether to capitalize each word or just the first word\n\t * @default true\n\t */\n\tevery?: boolean\n\n\t/**\n\t * Words to keep lowercase (articles, prepositions, etc.)\n\t * @default ['a', 'an', 'the', 'and', 'but', 'or', 'for', 'nor', 'on', 'at', 'to', 'from', 'by']\n\t */\n\tkeepLower?: string[]\n\n\t/**\n\t * Whether to transform on input (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type CapitalcaseBinding = boolean | CapitalcaseOptions\n\n/**\n * Default words to keep lowercase\n */\nconst DEFAULT_KEEP_LOWER = [\n\t'a', 'an', 'the',\n\t'and', 'but', 'or', 'for', 'nor',\n\t'on', 'at', 'to', 'from', 'by',\n\t'in', 'of', 'with', 'as',\n]\n\n/**\n * Capitalize text based on options\n */\nfunction capitalizeText(text: string, options: CapitalcaseOptions): string {\n\tif (!text) return text\n\n\tconst { every = true, keepLower = DEFAULT_KEEP_LOWER } = options\n\n\tif (every) {\n\t\t// Capitalize each word\n\t\tconst words = text.toLowerCase().split(/\\s+/)\n\n\t\treturn words\n\t\t\t.map((word, index) => {\n\t\t\t\t// Always capitalize first word\n\t\t\t\tif (index === 0) {\n\t\t\t\t\treturn capitalizeWord(word)\n\t\t\t\t}\n\t\t\t\t// Keep certain words lowercase\n\t\t\t\tif (keepLower.includes(word.toLowerCase())) {\n\t\t\t\t\treturn word.toLowerCase()\n\t\t\t\t}\n\n\t\t\t\treturn capitalizeWord(word)\n\t\t\t})\n\t\t\t.join(' ')\n\t} else {\n\t\t// Capitalize only the first word\n\t\treturn capitalizeWord(text)\n\t}\n}\n\n/**\n * Capitalize a single word\n */\nfunction capitalizeWord(word: string): string {\n\tif (!word) return word\n\n\treturn word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CapitalcaseBinding | undefined): CapitalcaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { every: true, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { every: false, onInput: false }\n\t}\n\n\treturn {\n\t\tevery: binding.every ?? true,\n\t\tkeepLower: binding.keepLower ?? DEFAULT_KEEP_LOWER,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-capitalcase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: capitalize each word -->\n * <input v-capitalcase v-model=\"title\" />\n *\n * <!-- Capitalize only first word -->\n * <span v-capitalcase=\"{ every: false }\">{{ text }}</span>\n *\n * <!-- With custom lowercase words -->\n * <input v-capitalcase=\"{ keepLower: ['a', 'the'] }\" v-model=\"title\" />\n * </template>\n * ```\n */\nexport const vCapitalcase = defineDirective<CapitalcaseBinding, HTMLElement>({\n\tname: 'capitalcase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => capitalizeText(text, options))\n\n\t\t\t;(el as any).__capitalcaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => capitalizeText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = capitalizeText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => capitalizeText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__capitalcaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__capitalcaseCleanup\n\t},\n})\n\nexport default vCapitalcase\n", "import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\nimport { deleteState, getState, parseTime, setState } from '@directix/shared'\n\n/**\n * Click delay handler\n */\nexport type ClickDelayHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Click delay directive options\n */\nexport interface ClickDelayOptions {\n\t/**\n\t * Click handler\n\t * @required\n\t */\n\thandler: ClickDelayHandler\n\n\t/**\n\t * Delay time in milliseconds\n\t * @default 300\n\t */\n\tdelay?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * CSS class to add during delay\n\t * @default 'v-click-delay--pending'\n\t */\n\tpendingClass?: string\n\n\t/**\n\t * Whether to show visual feedback\n\t * @default true\n\t */\n\tfeedback?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ClickDelayBinding = ClickDelayHandler | ClickDelayOptions\n\n/**\n * Element state storage\n */\ninterface ClickDelayState {\n\toptions: ClickDelayOptions\n\thandler: (event: Event) => void\n\tisPending: boolean\n\ttimeoutId: ReturnType<typeof setTimeout> | null\n}\n\nconst STATE_KEY = 'clickDelay'\n\n/**\n * Remove pending class from element\n */\nfunction removePendingClass(el: HTMLElement, options: ClickDelayOptions): void {\n\tif (options.feedback && options.pendingClass) {\n\t\tel.classList.remove(options.pendingClass)\n\t}\n}\n\n/**\n * Create click handler with delay logic\n */\nfunction createClickHandler(\n\tel: HTMLElement,\n\toptions: ClickDelayOptions,\n): (event: Event) => void {\n\treturn (event: Event) => {\n\t\tconst state = getState<HTMLElement, ClickDelayState>(el, STATE_KEY)\n\n\t\tif (!state || state.isPending) {\n\t\t\tevent.preventDefault()\n\t\t\tevent.stopPropagation()\n\t\t\treturn\n\t\t}\n\n\t\t// Mark as pending\n\t\tstate.isPending = true\n\n\t\t// Add visual feedback\n\t\tif (options.feedback && options.pendingClass) {\n\t\t\tel.classList.add(options.pendingClass)\n\t\t}\n\n\t\t// Call handler\n\t\toptions.handler(event as MouseEvent | TouchEvent)\n\n\t\t// Set timeout to reset pending state\n\t\tstate.timeoutId = setTimeout(() => {\n\t\t\tstate.isPending = false\n\t\t\tstate.timeoutId = null\n\t\t\tremovePendingClass(el, options)\n\t\t}, options.delay)\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: ClickDelayBinding | undefined,\n\tdirectiveBinding: DirectiveBinding<ClickDelayBinding>,\n): ClickDelayOptions {\n\tconst delay = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn {\n\t\t\thandler: binding,\n\t\t\tdelay,\n\t\t\tdisabled: false,\n\t\t\tpendingClass: 'v-click-delay--pending',\n\t\t\tfeedback: true,\n\t\t}\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-click-delay: handler is required')\n\t}\n\n\treturn {\n\t\thandler: binding.handler,\n\t\tdelay: binding.delay ?? delay,\n\t\tdisabled: binding.disabled ?? false,\n\t\tpendingClass: binding.pendingClass ?? 'v-click-delay--pending',\n\t\tfeedback: binding.feedback ?? true,\n\t}\n}\n\n/**\n * v-click-delay directive\n *\n * Prevents repeated clicks within a specified time period.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Basic usage -->\n * <button v-click-delay=\"handleClick\">Click Me</button>\n *\n * <!-- With delay time -->\n * <button v-click-delay:500=\"handleClick\">Click Me (500ms)</button>\n *\n * <!-- With options -->\n * <button v-click-delay=\"{ handler: handleClick, delay: 1000 }\">\n * Click Me (1s)\n * </button>\n * </template>\n * ```\n */\nexport const vClickDelay = defineDirective<ClickDelayBinding, HTMLElement>({\n\tname: 'click-delay',\n\tssr: true,\n\tdefaults: {\n\t\tdelay: 300,\n\t\tdisabled: false,\n\t\tpendingClass: 'v-click-delay--pending',\n\t\tfeedback: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\n\t\tif (options.disabled) return\n\n\t\tconst state: ClickDelayState = {\n\t\t\toptions,\n\t\t\thandler: createClickHandler(el, options),\n\t\t\tisPending: false,\n\t\t\ttimeoutId: null,\n\t\t}\n\n\t\tsetState(el, STATE_KEY, state)\n\n\t\t// Bind click event\n\t\tel.addEventListener('click', state.handler)\n\t\tel.addEventListener('touchend', state.handler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = getState<HTMLElement, ClickDelayState>(el, STATE_KEY)\n\n\t\tif (!state) {\n\t\t\t// If previously disabled, reinitialize\n\t\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t\tif (!options.disabled) {\n\t\t\t\tconst newState: ClickDelayState = {\n\t\t\t\t\toptions,\n\t\t\t\t\thandler: createClickHandler(el, options),\n\t\t\t\t\tisPending: false,\n\t\t\t\t\ttimeoutId: null,\n\t\t\t\t}\n\t\t\t\tsetState(el, STATE_KEY, newState)\n\t\t\t\tel.addEventListener('click', newState.handler)\n\t\t\t\tel.addEventListener('touchend', newState.handler)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If disabled state changes\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disable: remove listeners\n\t\t\tel.removeEventListener('click', state.handler)\n\t\t\tel.removeEventListener('touchend', state.handler)\n\t\t\tif (state.timeoutId) {\n\t\t\t\tclearTimeout(state.timeoutId)\n\t\t\t}\n\t\t\tremovePendingClass(el, state.options)\n\t\t\tdeleteState(el, STATE_KEY)\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Enable: add listeners\n\t\t\tstate.handler = createClickHandler(el, newOptions)\n\t\t\tstate.isPending = false\n\t\t\tstate.timeoutId = null\n\t\t\tel.addEventListener('click', state.handler)\n\t\t\tel.addEventListener('touchend', state.handler)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state = getState<HTMLElement, ClickDelayState>(el, STATE_KEY)\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handler)\n\t\tel.removeEventListener('touchend', state.handler)\n\n\t\tif (state.timeoutId) {\n\t\t\tclearTimeout(state.timeoutId)\n\t\t}\n\n\t\tremovePendingClass(el, state.options)\n\t\tdeleteState(el, STATE_KEY)\n\t},\n})\n\nexport default vClickDelay\n", "import { defineDirective } from '@directix/core'\nimport { getElement, off, on } from '@directix/shared'\n\n/**\n * Click outside handler\n */\nexport type ClickOutsideHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Click outside directive options\n */\nexport interface ClickOutsideOptions {\n\t/**\n\t * Callback when clicking outside\n\t * @required\n\t */\n\thandler: ClickOutsideHandler\n\n\t/**\n\t * Excluded element selectors or element references\n\t */\n\texclude?: (string | HTMLElement | (() => HTMLElement | null))[]\n\n\t/**\n\t * Whether to use capture mode\n\t * @default true\n\t */\n\tcapture?: boolean\n\n\t/**\n\t * Event types to listen for\n\t * @default ['click']\n\t */\n\tevents?: ('click' | 'mousedown' | 'mouseup' | 'touchstart' | 'touchend')[]\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Stop propagation\n\t * @default false\n\t */\n\tstop?: boolean\n\n\t/**\n\t * Prevent default behavior\n\t * @default false\n\t */\n\tprevent?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ClickOutsideBinding = ClickOutsideHandler | ClickOutsideOptions\n\n/**\n * Element state storage\n */\ninterface ClickOutsideState {\n\toptions: ClickOutsideOptions\n\thandlers: Map<string, (event: Event) => void>\n}\n\n/**\n * v-click-outside directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-click-outside=\"handleClickOutside\">\n * Dropdown menu\n * </div>\n * </template>\n * ```\n */\nexport const vClickOutside = defineDirective<ClickOutsideBinding, HTMLElement>({\n\tname: 'click-outside',\n\tssr: false,\n\tdefaults: {\n\t\tcapture: true,\n\t\tevents: ['click'],\n\t\tdisabled: false,\n\t\tstop: false,\n\t\tprevent: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\tconst state: ClickOutsideState = {\n\t\t\toptions,\n\t\t\thandlers: new Map(),\n\t\t}\n\n ;(el as any).__clickOutside = state\n\n\t\t// Create event handler\n\t\tconst createHandler = (_eventType: string) => {\n\t\t\treturn (event: Event) => {\n\t\t\t\t// Check event target\n\t\t\t\tif (!isValidClick(el, event, options)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Stop propagation\n\t\t\t\tif (options.stop) {\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t}\n\n\t\t\t\t// Prevent default behavior\n\t\t\t\tif (options.prevent) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t}\n\n\t\t\t\t// Call handler\n\t\t\t\toptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t}\n\t\t}\n\n\t\t// Bind events\n\t\toptions.events!.forEach(eventType => {\n\t\t\tconst handler = createHandler(eventType)\n\n\t\t\tstate.handlers.set(eventType, handler)\n\n\t\t\tconst listenerOptions = {\n\t\t\t\tcapture: options.capture,\n\t\t\t\tpassive: !options.prevent,\n\t\t\t}\n\n\t\t\ton(document, eventType, handler, listenerOptions)\n\t\t})\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ClickOutsideState = (el as any).__clickOutside\n\n\t\tif (!state) return\n\n\t\tconst oldOptions = state.options\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// If disabled state changes\n\t\tif (oldOptions.disabled !== newOptions.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\t// Remove all listeners\n\t\t\t\tstate.handlers.forEach((handler, eventType) => {\n\t\t\t\t\toff(document, eventType, handler, { capture: oldOptions.capture })\n\t\t\t\t})\n\t\t\t\tstate.handlers.clear()\n\t\t\t} else {\n\t\t\t\t// Re-add listeners\n\t\t\t\tconst createHandler = (_eventType: string) => {\n\t\t\t\t\treturn (event: Event) => {\n\t\t\t\t\t\tif (!isValidClick(el, event, newOptions)) return\n\t\t\t\t\t\tif (newOptions.stop) event.stopPropagation()\n\t\t\t\t\t\tif (newOptions.prevent) event.preventDefault()\n\t\t\t\t\t\tnewOptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnewOptions.events!.forEach(eventType => {\n\t\t\t\t\tconst handler = createHandler(eventType)\n\n\t\t\t\t\tstate.handlers.set(eventType, handler)\n\t\t\t\t\ton(document, eventType, handler, {\n\t\t\t\t\t\tcapture: newOptions.capture,\n\t\t\t\t\t\tpassive: !newOptions.prevent,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ClickOutsideState = (el as any).__clickOutside\n\n\t\tif (!state) return\n\n\t\t// Remove all event listeners\n\t\tstate.handlers.forEach((handler, eventType) => {\n\t\t\toff(document, eventType, handler, { capture: state.options.capture })\n\t\t})\n\n\t\tdelete (el as any).__clickOutside\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ClickOutsideBinding | undefined): ClickOutsideOptions {\n\tif (typeof binding === 'function') {\n\t\treturn {\n\t\t\thandler: binding,\n\t\t\tcapture: true,\n\t\t\tevents: ['click'],\n\t\t\tdisabled: false,\n\t\t\tstop: false,\n\t\t\tprevent: false,\n\t\t}\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-click-outside: handler is required')\n\t}\n\n\treturn {\n\t\tcapture: binding.capture ?? true,\n\t\tevents: binding.events ?? ['click'],\n\t\tdisabled: binding.disabled ?? false,\n\t\tstop: binding.stop ?? false,\n\t\tprevent: binding.prevent ?? false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if click is valid (outside the element)\n */\nfunction isValidClick(\n\tel: HTMLElement,\n\tevent: Event,\n\toptions: ClickOutsideOptions,\n): boolean {\n\tconst target = event.target as Node\n\n\t// Check if clicked on element itself or its children\n\tif (el.contains(target)) {\n\t\treturn false\n\t}\n\n\t// Check excluded elements\n\tif (options.exclude?.length) {\n\t\tfor (const exclude of options.exclude) {\n\t\t\tconst excludeEl = typeof exclude === 'function' ? exclude() : getElement(exclude)\n\n\t\t\tif (excludeEl && (excludeEl === target || excludeEl.contains(target))) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true\n}\n\nexport default vClickOutside\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Click wave directive options\n * A simplified version of v-ripple with simpler configuration\n */\nexport interface ClickWaveOptions {\n\t/**\n\t * Wave color\n\t * @default 'currentColor'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Wave duration in milliseconds\n\t * @default 500\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to disable wave effect\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Wave size ratio (relative to element's smaller dimension)\n\t * @default 1.5\n\t */\n\tsizeRatio?: number\n}\n\n/**\n * Directive binding value type\n */\nexport type ClickWaveBinding = boolean | string | ClickWaveOptions\n\n/**\n * Element state storage\n */\ninterface ClickWaveState {\n\toptions: ClickWaveOptions\n\tclickHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ClickWaveBinding | undefined): ClickWaveOptions {\n\tif (binding === false) {\n\t\treturn { disabled: true, color: 'currentColor', duration: 500, sizeRatio: 1.5 }\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { color: binding, duration: 500, sizeRatio: 1.5 }\n\t}\n\n\tconst base: ClickWaveOptions = {\n\t\tcolor: 'currentColor',\n\t\tduration: 500,\n\t\tdisabled: false,\n\t\tsizeRatio: 1.5,\n\t}\n\n\treturn binding && typeof binding === 'object' ? { ...base, ...binding } : base\n}\n\n/**\n * Create wave element\n */\nfunction createWave(event: MouseEvent, el: HTMLElement, options: ClickWaveOptions): HTMLSpanElement | null {\n\tconst rect = el.getBoundingClientRect()\n\tconst x = event.clientX - rect.left\n\tconst y = event.clientY - rect.top\n\n\t// Calculate wave size based on element dimensions\n\tconst size = Math.min(rect.width, rect.height) * (options.sizeRatio || 1.5)\n\n\tconst wave = document.createElement('span')\n\n\twave.className = 'v-click-wave__effect'\n\twave.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(0);\n opacity: 0.5;\n z-index: 0;\n `\n\n\treturn wave\n}\n\n/**\n * Animate wave\n */\nfunction animateWave(wave: HTMLElement, options: ClickWaveOptions): void {\n\tconst duration = options.duration || 500\n\n\tif (typeof wave.animate === 'function') {\n\t\twave.animate(\n\t\t\t[\n\t\t\t\t{ transform: 'scale(0)', opacity: 0.5 },\n\t\t\t\t{ transform: 'scale(1)', 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\twave.remove()\n\t\t}\n\t} else {\n\t\twave.style.transition = `transform ${duration}ms ease-out, opacity ${duration}ms ease-out`\n\t\t// Force reflow\n\t\tString(wave.offsetHeight)\n\t\twave.style.transform = 'scale(1)'\n\t\twave.style.opacity = '0'\n\n\t\tsetTimeout(() => {\n\t\t\twave.remove()\n\t\t}, duration)\n\t}\n}\n\n/**\n * v-click-wave directive\n * A simplified click wave effect directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-click-wave>Click me</button>\n * <button v-click-wave=\"'rgba(255, 255, 255, 0.3)'\">Custom color</button>\n * <button v-click-wave=\"{ color: 'red', duration: 400 }\">Custom options</button>\n * </template>\n * ```\n */\nexport const vClickWave = defineDirective<ClickWaveBinding, HTMLElement>({\n\tname: 'click-wave',\n\tssr: false,\n\tdefaults: {\n\t\tcolor: 'currentColor',\n\t\tduration: 500,\n\t\tdisabled: false,\n\t\tsizeRatio: 1.5,\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\tif (computedStyle.overflow === 'visible') {\n\t\t\tel.style.overflow = 'hidden'\n\t\t}\n\n\t\tel.classList.add('v-click-wave')\n\n\t\tconst state: ClickWaveState = {\n\t\t\toptions,\n\t\t\tclickHandler: (e: Event) => {\n\t\t\t\tif (state.options.disabled) return\n\n\t\t\t\tconst mouseEvent = e as MouseEvent\n\t\t\t\tconst wave = createWave(mouseEvent, el, state.options)\n\n\t\t\t\tif (wave) {\n\t\t\t\t\tel.appendChild(wave)\n\t\t\t\t\tanimateWave(wave, state.options)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t;(el as any).__clickWave = state\n\n\t\tel.addEventListener('click', state.clickHandler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ClickWaveState = (el as any).__clickWave\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ClickWaveState = (el as any).__clickWave\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.clickHandler)\n\t\tel.classList.remove('v-click-wave')\n\n\t\tdelete (el as any).__clickWave\n\t},\n})\n\nexport default vClickWave\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Context menu item\n */\nexport interface ContextMenuItem {\n\t/** Item label */\n\tlabel: string\n\t/** Click handler */\n\thandler?: () => void\n\t/** Whether the item is disabled */\n\tdisabled?: boolean\n\t/** Divider before this item */\n\tdivider?: boolean\n\t/** Custom icon */\n\ticon?: string\n\t/** Custom class */\n\tclass?: string\n}\n\n/**\n * Context menu directive options\n */\nexport interface ContextMenuOptions {\n\t/** Menu items */\n\titems: ContextMenuItem[]\n\t/** Custom class for menu container */\n\tclass?: string\n\t/** Menu width */\n\twidth?: number | string\n\t/** Whether to disable the context menu */\n\tdisabled?: boolean\n\t/** Custom render function for menu item */\n\trenderItem?: (item: ContextMenuItem, index: number) => HTMLElement\n\t/** Callback before menu shows */\n\tonBeforeShow?: (e: MouseEvent) => boolean | void\n\t/** Callback after menu shows */\n\tonAfterShow?: () => void\n\t/** Callback after menu hides */\n\tonHide?: () => void\n}\n\n/**\n * Directive binding value type\n */\nexport type ContextMenuBinding = ContextMenuItem[] | ContextMenuOptions\n\n/**\n * Element state storage\n */\ninterface ContextMenuState {\n\toptions: ContextMenuOptions\n\tcontextMenuHandler: (e: MouseEvent) => void\n\tmenuElement: HTMLDivElement | null\n\tclickOutsideHandler: (e: MouseEvent) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ContextMenuBinding): ContextMenuOptions {\n\tif (Array.isArray(binding)) {\n\t\treturn { items: binding }\n\t}\n\treturn binding\n}\n\n/**\n * Create menu element\n */\nfunction createMenu(options: ContextMenuOptions, x: number, y: number): HTMLDivElement {\n\tconst menu = document.createElement('div')\n\tmenu.className = `v-context-menu ${options.class || ''}`\n\n\tconst width = options.width ? (typeof options.width === 'number' ? `${options.width}px` : options.width) : '150px'\n\tmenu.style.cssText = `\n position: fixed;\n left: ${x}px;\n top: ${y}px;\n min-width: ${width};\n background: #fff;\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n padding: 4px 0;\n z-index: 9999;\n font-size: 14px;\n `\n\n\toptions.items.forEach((item, index) => {\n\t\tif (item.divider) {\n\t\t\tconst divider = document.createElement('div')\n\t\t\tdivider.className = 'v-context-menu__divider'\n\t\t\tdivider.style.cssText = `\n height: 1px;\n background: #e8e8e8;\n margin: 4px 0;\n `\n\t\t\tmenu.appendChild(divider)\n\t\t}\n\n\t\tif (options.renderItem) {\n\t\t\tconst customItem = options.renderItem(item, index)\n\t\t\tmenu.appendChild(customItem)\n\t\t} else {\n\t\t\tconst menuItem = document.createElement('div')\n\t\t\tmenuItem.className = `v-context-menu__item ${item.class || ''}`\n\n\t\t\tif (item.disabled) {\n\t\t\t\tmenuItem.classList.add('v-context-menu__item--disabled')\n\t\t\t}\n\n\t\t\tmenuItem.style.cssText = `\n padding: 8px 16px;\n cursor: ${item.disabled ? 'not-allowed' : 'pointer'};\n color: ${item.disabled ? '#b0b0b0' : '#333'};\n display: flex;\n align-items: center;\n gap: 8px;\n `\n\n\t\t\tif (item.icon) {\n\t\t\t\tconst icon = document.createElement('span')\n\t\t\t\ticon.className = 'v-context-menu__icon'\n\t\t\t\ticon.innerHTML = item.icon\n\t\t\t\tmenuItem.appendChild(icon)\n\t\t\t}\n\n\t\t\tconst label = document.createElement('span')\n\t\t\tlabel.textContent = item.label\n\t\t\tmenuItem.appendChild(label)\n\n\t\t\tif (!item.disabled && item.handler) {\n\t\t\t\tmenuItem.addEventListener('click', () => {\n\t\t\t\t\titem.handler!()\n\t\t\t\t\tremoveMenu(menu)\n\t\t\t\t})\n\n\t\t\t\tmenuItem.addEventListener('mouseenter', () => {\n\t\t\t\t\tmenuItem.style.background = '#f5f5f5'\n\t\t\t\t})\n\n\t\t\t\tmenuItem.addEventListener('mouseleave', () => {\n\t\t\t\t\tmenuItem.style.background = 'transparent'\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tmenu.appendChild(menuItem)\n\t\t}\n\t})\n\n\treturn menu\n}\n\n/**\n * Remove menu from DOM\n */\nfunction removeMenu(menu: HTMLDivElement | null): void {\n\tif (menu && menu.parentNode) {\n\t\tmenu.parentNode.removeChild(menu)\n\t}\n}\n\n/**\n * Adjust menu position to stay within viewport\n */\nfunction adjustMenuPosition(menu: HTMLDivElement, x: number, y: number): void {\n\tconst rect = menu.getBoundingClientRect()\n\tconst viewportWidth = window.innerWidth\n\tconst viewportHeight = window.innerHeight\n\n\t// Adjust horizontal position\n\tif (x + rect.width > viewportWidth) {\n\t\tmenu.style.left = `${viewportWidth - rect.width - 8}px`\n\t}\n\n\t// Adjust vertical position\n\tif (y + rect.height > viewportHeight) {\n\t\tmenu.style.top = `${viewportHeight - rect.height - 8}px`\n\t}\n}\n\n/**\n * v-context-menu directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-context-menu=\"menuItems\">Right click here</div>\n * <div v-context-menu=\"{ items: menuItems, width: 200 }\">Custom width</div>\n * </template>\n *\n * <script setup>\n * const menuItems = [\n * { label: 'Copy', handler: () => console.log('Copy') },\n * { label: 'Paste', handler: () => console.log('Paste') },\n * { divider: true, label: '' },\n * { label: 'Delete', handler: () => console.log('Delete') }\n * ]\n * </script>\n * ```\n */\nexport const vContextMenu = defineDirective<ContextMenuBinding, HTMLElement>({\n\tname: 'context-menu',\n\tssr: 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 state: ContextMenuState = {\n\t\t\toptions,\n\t\t\tcontextMenuHandler: (e: MouseEvent) => {\n\t\t\t\te.preventDefault()\n\n\t\t\t\t// Remove existing menu\n\t\t\t\tif (state.menuElement) {\n\t\t\t\t\tremoveMenu(state.menuElement)\n\t\t\t\t}\n\n\t\t\t\t// Call before show callback\n\t\t\t\tif (options.onBeforeShow?.(e) === false) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Create and show menu\n\t\t\t\tstate.menuElement = createMenu(state.options, e.clientX, e.clientY)\n\t\t\t\tdocument.body.appendChild(state.menuElement)\n\n\t\t\t\t// Adjust position\n\t\t\t\tadjustMenuPosition(state.menuElement, e.clientX, e.clientY)\n\n\t\t\t\t// Add click outside handler\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tdocument.addEventListener('click', state.clickOutsideHandler)\n\t\t\t\t}, 0)\n\n\t\t\t\toptions.onAfterShow?.()\n\t\t\t},\n\t\t\tmenuElement: null,\n\t\t\tclickOutsideHandler: (e: MouseEvent) => {\n\t\t\t\tconst target = e.target as Node\n\n\t\t\t\t// Don't close if clicking inside menu\n\t\t\t\tif (state.menuElement && state.menuElement.contains(target)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tremoveMenu(state.menuElement)\n\t\t\t\tstate.menuElement = null\n\t\t\t\tdocument.removeEventListener('click', state.clickOutsideHandler)\n\t\t\t\toptions.onHide?.()\n\t\t\t},\n\t\t}\n\n\t\t;(el as any).__contextMenu = state\n\n\t\ton(el, 'contextmenu', state.contextMenuHandler as (e: Event) => void)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ContextMenuState = (el as any).__contextMenu\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ContextMenuState = (el as any).__contextMenu\n\n\t\tif (!state) return\n\n\t\toff(el, 'contextmenu', state.contextMenuHandler as (e: Event) => void)\n\n\t\t// Remove menu if still visible\n\t\tif (state.menuElement) {\n\t\t\tremoveMenu(state.menuElement)\n\t\t\tdocument.removeEventListener('click', state.clickOutsideHandler)\n\t\t}\n\n\t\tdelete (el as any).__contextMenu\n\t},\n})\n\nexport default vContextMenu\n", "import { defineDirective, supportsClipboard } from '@directix/core'\n\n/**\n * Copy success callback\n */\nexport type CopySuccessCallback = (text: string) => void\n\n/**\n * Copy error callback\n */\nexport type CopyErrorCallback = (error: Error) => void\n\n/**\n * Copy directive options\n */\nexport interface CopyOptions {\n\t/**\n\t * Text to copy\n\t * @required\n\t */\n\tvalue: string\n\n\t/**\n\t * Callback on copy success\n\t */\n\tonSuccess?: CopySuccessCallback\n\n\t/**\n\t * Callback on copy error\n\t */\n\tonError?: CopyErrorCallback\n\n\t/**\n\t * Tooltip text for the copy button\n\t */\n\ttitle?: string\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type CopyBinding = string | CopyOptions\n\n/**\n * Element state storage\n */\ninterface CopyState {\n\thandler: () => void\n\toptions: CopyOptions\n}\n\n/**\n * Copy text to clipboard\n * Prefer Clipboard API, fallback to execCommand\n */\nasync function copyToClipboard(text: string): Promise<boolean> {\n\t// Method 1: Use Clipboard API\n\tif (supportsClipboard()) {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(text)\n\n\t\t\treturn true\n\t\t} catch {\n\t\t\t// Permission denied or other error, fallback\n\t\t\tconsole.warn('[Directix] Clipboard API failed, falling back to execCommand')\n\t\t}\n\t}\n\n\t// Method 2: Use execCommand (deprecated but has good compatibility)\n\treturn copyWithExecCommand(text)\n}\n\n/**\n * Copy using execCommand\n */\nfunction copyWithExecCommand(text: string): boolean {\n\t// Create temporary textarea\n\tconst textarea = document.createElement('textarea')\n\n\ttextarea.value = text\n\n\t// Set styles to make it invisible\n\ttextarea.style.cssText = `\n position: fixed;\n top: -9999px;\n left: -9999px;\n opacity: 0;\n pointer-events: none;\n `\n\n\tdocument.body.appendChild(textarea)\n\n\ttry {\n\t\t// Select and copy\n\t\ttextarea.select()\n\t\ttextarea.setSelectionRange(0, textarea.value.length)\n\n\t\treturn document.execCommand('copy')\n\t} catch {\n\t\treturn false\n\t} finally {\n\t\t// Cleanup\n\t\tdocument.body.removeChild(textarea)\n\t}\n}\n\n/**\n * v-copy directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-copy=\"textToCopy\">Copy Text</button>\n * </template>\n * ```\n */\nexport const vCopy = defineDirective<CopyBinding, HTMLElement>({\n\tname: 'copy',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Set tooltip\n\t\tif (options.title) {\n\t\t\tel.setAttribute('title', options.title)\n\t\t}\n\n\t\t// State storage - handler reads latest value from here\n\t\tconst state: CopyState = {\n\t\t\thandler: null as any,\n\t\t\toptions,\n\t\t}\n\n\t\t// Add click event - read latest options from state\n\t\tstate.handler = async () => {\n\t\t\tconst text = state.options.value\n\n\t\t\tif (!text) {\n\t\t\t\tconsole.warn('[Directix] v-copy: No text to copy')\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst success = await copyToClipboard(text)\n\n\t\t\t\tif (success) {\n\t\t\t\t\tstate.options.onSuccess?.(text)\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('copy:success', { detail: { text } }))\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Copy failed')\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err as Error\n\n\t\t\t\tstate.options.onError?.(error)\n\t\t\t\tel.dispatchEvent(new CustomEvent('copy:error', { detail: { error } }))\n\t\t\t}\n\t\t}\n\n\t\tel.addEventListener('click', state.handler)\n\t\t;(el as any).__copy = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: CopyState = (el as any).__copy\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\tif (state.options.title) {\n\t\t\tel.setAttribute('title', state.options.title)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: CopyState = (el as any).__copy\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handler)\n\t\tdelete (el as any).__copy\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CopyBinding): CopyOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { value: binding }\n\t}\n\n\treturn binding\n}\n\nexport default vCopy\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Countdown format function\n */\nexport type CountdownFormatFunction = (time: CountdownTime) => string\n\n/**\n * Countdown complete callback\n */\nexport type CountdownCompleteCallback = () => void\n\n/**\n * Countdown tick callback\n */\nexport type CountdownTickCallback = (time: CountdownTime) => void\n\n/**\n * Countdown time object\n */\nexport interface CountdownTime {\n\tdays: number\n\thours: number\n\tminutes: number\n\tseconds: number\n\tmilliseconds: number\n\ttotal: number\n}\n\n/**\n * Countdown directive options\n */\nexport interface CountdownOptions {\n\t/**\n\t * Target time (Date object, timestamp, or ISO string)\n\t * @required\n\t */\n\ttarget: Date | number | string\n\n\t/**\n\t * Format string or custom format function\n\t * - 'dd:hh:mm:ss' - Days:Hours:Minutes:Seconds\n\t * - 'hh:mm:ss' - Hours:Minutes:Seconds\n\t * - 'mm:ss' - Minutes:Seconds\n\t * - 'ss' - Seconds only\n\t * @default 'hh:mm:ss'\n\t */\n\tformat?: string | CountdownFormatFunction\n\n\t/**\n\t * Callback when countdown completes\n\t */\n\tonComplete?: CountdownCompleteCallback\n\n\t/**\n\t * Callback on each tick\n\t */\n\tonTick?: CountdownTickCallback\n\n\t/**\n\t * Update interval in milliseconds\n\t * @default 1000\n\t */\n\tinterval?: number\n\n\t/**\n\t * Whether to show milliseconds\n\t * @default false\n\t */\n\tshowMilliseconds?: boolean\n\n\t/**\n\t * Whether to auto-start\n\t * @default true\n\t */\n\tautoStart?: boolean\n\n\t/**\n\t * Custom labels for i18n\n\t */\n\tlabels?: {\n\t\tdays?: string\n\t\thours?: string\n\t\tminutes?: string\n\t\tseconds?: string\n\t\tmilliseconds?: string\n\t}\n}\n\n/**\n * Directive binding value type\n */\nexport type CountdownBinding = CountdownOptions | Date | number | string\n\n/**\n * Element state storage\n */\ninterface CountdownState {\n\toptions: CountdownOptions\n\ttargetTime: number\n\tintervalId: ReturnType<typeof setInterval> | null\n\tpaused: boolean\n\tremaining: number\n}\n\n/**\n * Parse target time to timestamp\n */\nfunction parseTargetTime(target: Date | number | string): number {\n\tif (target instanceof Date) {\n\t\treturn target.getTime()\n\t}\n\n\tif (typeof target === 'number') {\n\t\treturn target\n\t}\n\n\treturn new Date(target).getTime()\n}\n\n/**\n * Calculate remaining time\n */\nfunction calculateTime(remaining: number): CountdownTime {\n\tconst total = Math.max(0, remaining)\n\n\treturn {\n\t\tdays: Math.floor(total / (1000 * 60 * 60 * 24)),\n\t\thours: Math.floor((total % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)),\n\t\tminutes: Math.floor((total % (1000 * 60 * 60)) / (1000 * 60)),\n\t\tseconds: Math.floor((total % (1000 * 60)) / 1000),\n\t\tmilliseconds: total % 1000,\n\t\ttotal,\n\t}\n}\n\n/**\n * Format time to string\n */\nfunction formatTime(time: CountdownTime, format: string | CountdownFormatFunction): string {\n\tif (typeof format === 'function') {\n\t\treturn format(time)\n\t}\n\n\tconst pad = (n: number, len = 2): string => String(n).padStart(len, '0')\n\n\t// Replace placeholders\n\tconst result = format\n\t\t.replace(/dd/gi, pad(time.days))\n\t\t.replace(/hh/gi, pad(time.hours))\n\t\t.replace(/mm/gi, pad(time.minutes))\n\t\t.replace(/ss/gi, pad(time.seconds))\n\t\t.replace(/S{3}/gi, pad(time.milliseconds, 3))\n\t\t.replace(/SS/gi, pad(Math.floor(time.milliseconds / 10)))\n\t\t.replace(/S/gi, String(Math.floor(time.milliseconds / 100)))\n\n\treturn result\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CountdownBinding): CountdownOptions {\n\tif (typeof binding === 'object' && binding !== null && 'target' in binding) {\n\t\treturn {\n\t\t\ttarget: binding.target,\n\t\t\tformat: binding.format ?? 'hh:mm:ss',\n\t\t\tonComplete: binding.onComplete,\n\t\t\tonTick: binding.onTick,\n\t\t\tinterval: binding.interval ?? 1000,\n\t\t\tshowMilliseconds: binding.showMilliseconds ?? false,\n\t\t\tautoStart: binding.autoStart ?? true,\n\t\t\tlabels: binding.labels,\n\t\t}\n\t}\n\n\t// binding is Date | number | string\n\treturn {\n\t\ttarget: binding as Date | number | string,\n\t\tformat: 'hh:mm:ss',\n\t\tinterval: 1000,\n\t\tshowMilliseconds: false,\n\t\tautoStart: true,\n\t}\n}\n\n/**\n * v-countdown directive\n *\n * Displays a countdown timer.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Basic usage -->\n * <span v-countdown=\"targetDate\"></span>\n *\n * <!-- With timestamp -->\n * <span v-countdown=\"Date.now() + 60000\"></span>\n *\n * <!-- With options -->\n * <span v-countdown=\"{\n * target: targetDate,\n * format: 'dd:hh:mm:ss',\n * onComplete: handleComplete\n * }\"></span>\n *\n * <!-- With custom format function -->\n * <span v-countdown=\"{\n * target: targetDate,\n * format: (time) => `${time.days} days ${time.hours}:${time.minutes}:${time.seconds}`\n * }\"></span>\n * </template>\n * ```\n */\nexport const vCountdown = defineDirective<CountdownBinding, HTMLElement>({\n\tname: 'countdown',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst targetTime = parseTargetTime(options.target)\n\n\t\tconst state: CountdownState = {\n\t\t\toptions,\n\t\t\ttargetTime,\n\t\t\tintervalId: null,\n\t\t\tpaused: false,\n\t\t\tremaining: 0,\n\t\t}\n\n\t\t;(el as any).__countdown = state\n\n\t\tif (options.autoStart !== false) {\n\t\t\tstartCountdown(el, state)\n\t\t} else {\n\t\t\t// Show initial time\n\t\t\tupdateDisplay(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: CountdownState = (el as any).__countdown\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst newTargetTime = parseTargetTime(newOptions.target)\n\n\t\t// Check if target changed\n\t\tif (newTargetTime !== state.targetTime) {\n\t\t\tstate.targetTime = newTargetTime\n\t\t\tstate.options = newOptions\n\n\t\t\t// Clear existing interval if any\n\t\t\tif (state.intervalId) {\n\t\t\t\tclearInterval(state.intervalId)\n\t\t\t\tstate.intervalId = null\n\t\t\t}\n\n\t\t\t// Restart countdown if not paused\n\t\t\tif (!state.paused) {\n\t\t\t\tstartCountdown(el, state)\n\t\t\t}\n\t\t} else {\n\t\t\tstate.options = newOptions\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: CountdownState | undefined = (el as any).__countdown\n\n\t\tif (state?.intervalId) {\n\t\t\tclearInterval(state.intervalId)\n\t\t}\n\n\t\tdelete (el as any).__countdown\n\t},\n})\n\n/**\n * Start countdown\n */\nfunction startCountdown(el: HTMLElement, state: CountdownState): void {\n\tconst tick = (): void => {\n\t\tconst now = Date.now()\n\t\tstate.remaining = state.targetTime - now\n\n\t\tif (state.remaining <= 0) {\n\t\t\tstate.remaining = 0\n\t\t\tupdateDisplay(el, state)\n\t\t\tstopCountdown(state)\n\n\t\t\t// Call onComplete\n\t\t\tif (state.options.onComplete) {\n\t\t\t\tstate.options.onComplete()\n\t\t\t}\n\n\t\t\t// Dispatch event\n\t\t\tel.dispatchEvent(new CustomEvent('countdown:complete'))\n\t\t\treturn\n\t\t}\n\n\t\tupdateDisplay(el, state)\n\n\t\t// Call onTick\n\t\tif (state.options.onTick) {\n\t\t\tconst time = calculateTime(state.remaining)\n\t\t\tstate.options.onTick(time)\n\t\t}\n\t}\n\n\t// Initial tick\n\ttick()\n\n\t// Start interval\n\tstate.intervalId = setInterval(tick, state.options.interval || 1000)\n}\n\n/**\n * Stop countdown\n */\nfunction stopCountdown(state: CountdownState): void {\n\tif (state.intervalId) {\n\t\tclearInterval(state.intervalId)\n\t\tstate.intervalId = null\n\t}\n}\n\n/**\n * Update display\n */\nfunction updateDisplay(el: HTMLElement, state: CountdownState): void {\n\tconst time = calculateTime(state.remaining)\n\tconst display = formatTime(time, state.options.format || 'hh:mm:ss')\n\tel.textContent = display\n}\n\n// Export helper functions for external use\nexport { calculateTime, formatTime, parseTargetTime }\n\nexport default vCountdown\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Counter easing function type\n */\nexport type CounterEasing = 'linear' | 'easeOut' | 'easeInOut' | 'easeOutQuart' | 'easeOutExpo'\n\n/**\n * Counter directive options\n */\nexport interface CounterOptions {\n\t/**\n\t * Target value\n\t */\n\tvalue: number\n\n\t/**\n\t * Starting value\n\t * @default 0\n\t */\n\tstartValue?: number\n\n\t/**\n\t * Animation duration in milliseconds\n\t * @default 2000\n\t */\n\tduration?: number\n\n\t/**\n\t * Number of decimal places\n\t * @default 0\n\t */\n\tdecimals?: number\n\n\t/**\n\t * Whether to use thousands separator\n\t * @default false\n\t */\n\tuseGrouping?: boolean\n\n\t/**\n\t * Locale for formatting\n\t * @default 'en-US'\n\t */\n\tlocale?: string\n\n\t/**\n\t * Custom format function\n\t */\n\tformatter?: (value: number) => string\n\n\t/**\n\t * Easing function\n\t * @default 'easeOutQuart'\n\t */\n\teasing?: CounterEasing\n\n\t/**\n\t * Custom easing function\n\t */\n\tcustomEasing?: (t: number) => number\n\n\t/**\n\t * Animation delay in milliseconds\n\t * @default 0\n\t */\n\tdelay?: number\n\n\t/**\n\t * Callback on each frame\n\t */\n\tonUpdate?: (value: number, formattedValue: string) => void\n\n\t/**\n\t * Callback when animation completes\n\t */\n\tonComplete?: (value: number) => void\n\n\t/**\n\t * Callback when animation starts\n\t */\n\tonStart?: () => void\n}\n\n/**\n * Directive binding value type\n */\nexport type CounterBinding = number | CounterOptions\n\n/**\n * Element state storage\n */\ninterface CounterState {\n\toptions: CounterOptions\n\tanimationFrame: number | null\n\tstartTime: number | null\n\tstartValue: number\n\tcurrentValue: number\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CounterBinding | undefined): CounterOptions {\n\tif (typeof binding === 'number') {\n\t\treturn { value: binding }\n\t}\n\n\treturn {\n\t\tvalue: 0,\n\t\tstartValue: 0,\n\t\tduration: 2000,\n\t\tdecimals: 0,\n\t\tuseGrouping: false,\n\t\tlocale: 'en-US',\n\t\teasing: 'easeOutQuart',\n\t\tdelay: 0,\n\t\t...(binding || {}),\n\t}\n}\n\n/**\n * Easing functions\n */\nconst easingFunctions: Record<CounterEasing, (t: number) => number> = {\n\tlinear: t => t,\n\teaseOut: t => 1 - (1 - t) ** 3,\n\teaseInOut: t => t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2,\n\teaseOutQuart: t => 1 - (1 - t) ** 4,\n\teaseOutExpo: t => t === 1 ? 1 : 1 - 2 ** (-10 * t),\n}\n\n/**\n * Format number\n */\nfunction formatNumber(value: number, options: CounterOptions): string {\n\tif (options.formatter) {\n\t\treturn options.formatter(value)\n\t}\n\n\treturn new Intl.NumberFormat(options.locale, {\n\t\tminimumFractionDigits: options.decimals,\n\t\tmaximumFractionDigits: options.decimals,\n\t\tuseGrouping: options.useGrouping,\n\t}).format(value)\n}\n\n/**\n * v-counter directive\n * Animated number counter\n *\n * @example\n * ```vue\n * <template>\n * <span v-counter=\"1000\">0</span>\n *\n * <span v-counter=\"{\n * value: 10000,\n * duration: 3000,\n * decimals: 2,\n * useGrouping: true\n * }\">0</span>\n *\n * <span v-counter=\"{\n * value: targetValue,\n * formatter: (v) => '$' + v.toFixed(2)\n * }\">0</span>\n * </template>\n * ```\n */\nexport const vCounter = defineDirective<CounterBinding, HTMLElement>({\n\tname: 'counter',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: CounterState = {\n\t\t\toptions,\n\t\t\tanimationFrame: null,\n\t\t\tstartTime: null,\n\t\t\tstartValue: options.startValue || 0,\n\t\t\tcurrentValue: options.startValue || 0,\n\t\t}\n\n\t\t;(el as any).__counter = state\n\n\t\t// Set initial value\n\t\tel.textContent = formatNumber(state.startValue, options)\n\n\t\tel.classList.add('v-counter')\n\n\t\t// Start animation after delay\n\t\tif (isBrowser() && options.value !== state.startValue) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tanimateCounter(el, state)\n\t\t\t}, options.delay || 0)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: CounterState = (el as any).__counter\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst oldValue = state.options.value\n\t\tconst newValue = newOptions.value\n\n\t\t// Cancel current animation\n\t\tif (state.animationFrame) {\n\t\t\tcancelAnimationFrame(state.animationFrame)\n\t\t\tstate.animationFrame = null\n\t\t}\n\n\t\t// Update start value to current value for smooth transition\n\t\tstate.startValue = state.currentValue\n\t\tstate.startTime = null\n\t\tstate.options = newOptions\n\n\t\t// Restart animation if value changed\n\t\tif (newValue !== oldValue) {\n\t\t\tanimateCounter(el, state)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: CounterState = (el as any).__counter\n\n\t\tif (!state) return\n\n\t\tif (state.animationFrame) {\n\t\t\tcancelAnimationFrame(state.animationFrame)\n\t\t}\n\n\t\tel.classList.remove('v-counter')\n\t\tdelete (el as any).__counter\n\t},\n})\n\n/**\n * Animate counter\n */\nfunction animateCounter(el: HTMLElement, state: CounterState): void {\n\tconst { options, startValue } = state\n\tconst endValue = options.value\n\tconst duration = options.duration || 2000\n\n\tstate.startTime = null\n\toptions.onStart?.()\n\n\tfunction animate(timestamp: number): void {\n\t\tif (!state.startTime) {\n\t\t\tstate.startTime = timestamp\n\t\t}\n\n\t\tconst elapsed = timestamp - state.startTime\n\t\tconst progress = Math.min(elapsed / duration, 1)\n\n\t\t// Apply easing\n\t\tconst easingFn = options.customEasing || easingFunctions[options.easing || 'easeOutQuart']\n\t\tconst easedProgress = easingFn(progress)\n\n\t\t// Calculate current value\n\t\tstate.currentValue = startValue + (endValue - startValue) * easedProgress\n\n\t\t// Format and update\n\t\tconst formattedValue = formatNumber(state.currentValue, options)\n\t\tel.textContent = formattedValue\n\n\t\toptions.onUpdate?.(state.currentValue, formattedValue)\n\n\t\t// Continue or complete\n\t\tif (progress < 1) {\n\t\t\tstate.animationFrame = requestAnimationFrame(animate)\n\t\t} else {\n\t\t\tstate.currentValue = endValue\n\t\t\tel.textContent = formatNumber(endValue, options)\n\t\t\tstate.animationFrame = null\n\t\t\toptions.onComplete?.(endValue)\n\t\t}\n\t}\n\n\tstate.animationFrame = requestAnimationFrame(animate)\n}\n\nexport default vCounter\n", "import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\nimport { debounce, getDefaultEventType, getEventTypeFromModifiers, parseTime } from '@directix/shared'\n\n/**\n * Debounced function type\n */\nexport interface DebouncedFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n\tflush: () => void\n}\n\n/**\n * Debounce directive options\n */\nexport interface DebounceOptions<T extends (...args: any[]) => any = any> {\n\t/**\n\t * Function to debounce\n\t */\n\thandler: T\n\n\t/**\n\t * Delay time in milliseconds\n\t * @default 300\n\t */\n\twait?: number\n\n\t/**\n\t * Whether to invoke immediately before delay starts\n\t * @default false\n\t */\n\tleading?: boolean\n\n\t/**\n\t * Whether to invoke after delay ends\n\t * @default true\n\t */\n\ttrailing?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type DebounceBinding<T extends (...args: any[]) => any = any>\n\t= | T\n\t\t| DebounceOptions<T>\n\n/**\n * Element state storage\n */\ninterface DebounceState {\n\tdebouncedFn: DebouncedFunction<any>\n\teventType: string\n\toptions: DebounceOptions\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: DebounceBinding,\n\tdirectiveBinding: DirectiveBinding<DebounceBinding>,\n): DebounceOptions {\n\tconst wait = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, wait }\n\t}\n\n\treturn { ...binding, wait: binding.wait || wait }\n}\n\n/**\n * v-debounce directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-debounce=\"handleInput\" />\n * <input v-debounce:500ms=\"handleInput\" />\n * <input v-debounce=\"{ handler: handleInput, wait: 500 }\" />\n * <div v-debounce.scroll=\"handleScroll\">Scroll Debounce</div>\n * <div v-debounce:100.scroll=\"handleScroll\">100ms Scroll Debounce</div>\n * </template>\n * ```\n */\nexport const vDebounce = defineDirective<DebounceBinding, HTMLElement>({\n\tname: 'debounce',\n\tssr: true, // SSR safe - event binding is skipped on server\n\tdefaults: {\n\t\twait: 300,\n\t\tleading: false,\n\t\ttrailing: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t// Prefer event type from modifiers, otherwise infer from element type\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getDefaultEventType(el)\n\n\t\t// Create debounced function\n\t\tconst debouncedFn = debounce(options.handler, options.wait, {\n\t\t\tleading: options.leading,\n\t\t\ttrailing: options.trailing,\n\t\t})\n\n\t\t// Bind event\n\t\tel.addEventListener(eventType, debouncedFn as any)\n\n\t\t;(el as any).__debounce = {\n\t\t\tdebouncedFn,\n\t\t\teventType,\n\t\t\toptions,\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: DebounceState = (el as any).__debounce\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If configuration changes, recreate debounced function\n\t\tif (\n\t\t\tnewOptions.wait !== state.options.wait\n\t\t\t|| newOptions.leading !== state.options.leading\n\t\t\t|| newOptions.trailing !== state.options.trailing\n\t\t) {\n\t\t\t// Cancel old one\n\t\t\tstate.debouncedFn.cancel()\n\n\t\t\t// Create new one\n\t\t\tconst debouncedFn = debounce(newOptions.handler, newOptions.wait, {\n\t\t\t\tleading: newOptions.leading,\n\t\t\t\ttrailing: newOptions.trailing,\n\t\t\t})\n\n\t\t\tel.removeEventListener(state.eventType, state.debouncedFn as any)\n\t\t\tel.addEventListener(state.eventType, debouncedFn as any)\n\n\t\t\t;(el as any).__debounce = {\n\t\t\t\tdebouncedFn,\n\t\t\t\teventType: state.eventType,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t} else if (newOptions.handler !== state.options.handler) {\n\t\t\t// Only update handler\n\t\t\tstate.options.handler = newOptions.handler\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: DebounceState = (el as any).__debounce\n\n\t\tif (!state) return\n\n\t\tstate.debouncedFn.cancel()\n\t\tel.removeEventListener(state.eventType, state.debouncedFn as any)\n\t\tdelete (el as any).__debounce\n\t},\n})\n\nexport default vDebounce\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Draggable axis\n */\nexport type DraggableAxis = 'x' | 'y' | 'both'\n\n/**\n * Draggable directive options\n */\nexport interface DraggableOptions {\n\t/**\n\t * Drag axis\n\t * @default 'both'\n\t */\n\taxis?: DraggableAxis\n\n\t/**\n\t * Constrain to parent element\n\t * @default false\n\t */\n\tconstrain?: boolean\n\n\t/**\n\t * Boundary element selector or element\n\t */\n\tboundary?: string | HTMLElement | (() => HTMLElement | null)\n\n\t/**\n\t * Handle element selector\n\t */\n\thandle?: string\n\n\t/**\n\t * Whether dragging is disabled\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Grid snapping [x, y]\n\t */\n\tgrid?: [number, number]\n\n\t/**\n\t * Start drag callback\n\t */\n\tonStart?: (position: { x: number, y: number }, event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Drag callback\n\t */\n\tonDrag?: (position: { x: number, y: number }, event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * End drag callback\n\t */\n\tonEnd?: (position: { x: number, y: number }, event: MouseEvent | TouchEvent) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type DraggableBinding = boolean | DraggableOptions\n\n/**\n * Draggable state\n */\ninterface DraggableState {\n\toptions: DraggableOptions\n\tisDragging: boolean\n\tstartX: number\n\tstartY: number\n\toffsetX: number\n\toffsetY: number\n\tinitialLeft: number\n\tinitialTop: number\n\tboundaryWidth: number\n\tboundaryHeight: number\n\telWidth: number\n\telHeight: number\n\thandleEl: HTMLElement | null\n\tmoveHandler: ((e: MouseEvent | TouchEvent) => void) | null\n\tendHandler: ((e: MouseEvent | TouchEvent) => void) | null\n}\n\n/**\n * Get element boundary\n */\nfunction getBoundary(_el: HTMLElement, boundary?: string | HTMLElement | (() => HTMLElement | null)): DOMRect | null {\n\tif (!boundary) return null\n\n\tif (typeof boundary === 'function') {\n\t\tconst boundaryEl = boundary()\n\t\treturn boundaryEl?.getBoundingClientRect() ?? null\n\t}\n\n\tif (typeof boundary === 'string') {\n\t\tconst boundaryEl = document.querySelector(boundary)\n\t\treturn boundaryEl?.getBoundingClientRect() ?? null\n\t}\n\n\treturn boundary.getBoundingClientRect()\n}\n\n/**\n * Get client coordinates from mouse or touch event\n */\nfunction getClientCoords(e: MouseEvent | TouchEvent): { clientX: number, clientY: number } {\n\tif (e.type.startsWith('touch')) {\n\t\tconst touch = (e as TouchEvent).touches[0]\n\t\treturn { clientX: touch.clientX, clientY: touch.clientY }\n\t}\n\tconst mouseEvent = e as MouseEvent\n\treturn { clientX: mouseEvent.clientX, clientY: mouseEvent.clientY }\n}\n\n/**\n * Parse transform translate values\n */\nfunction parseTranslate(transform: string): { x: number, y: number } {\n\tconst match = transform.match(/translate\\(([-\\d.]+)px,\\s*([-\\d.]+)px\\)/)\n\tif (match) {\n\t\treturn { x: parseFloat(match[1]), y: parseFloat(match[2]) }\n\t}\n\treturn { x: 0, y: 0 }\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: DraggableBinding): DraggableOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { axis: 'both', constrain: false, disabled: false }\n\t}\n\n\tif (binding === false) {\n\t\treturn { axis: 'both', constrain: false, disabled: true }\n\t}\n\n\treturn {\n\t\taxis: binding.axis ?? 'both',\n\t\tconstrain: binding.constrain ?? false,\n\t\tboundary: binding.boundary,\n\t\thandle: binding.handle,\n\t\tdisabled: binding.disabled ?? false,\n\t\tgrid: binding.grid,\n\t\tonStart: binding.onStart,\n\t\tonDrag: binding.onDrag,\n\t\tonEnd: binding.onEnd,\n\t}\n}\n\n/**\n * v-draggable directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage -->\n * <div v-draggable>Drag me</div>\n *\n * <!-- Constrain to parent -->\n * <div v-draggable=\"{ constrain: true }\">Drag me</div>\n *\n * <!-- With handle -->\n * <div v-draggable=\"{ handle: '.drag-handle' }\">\n * <div class=\"drag-handle\">Drag here</div>\n * <div>Content</div>\n * </div>\n *\n * <!-- With callbacks -->\n * <div v-draggable=\"{ onDrag: handleDrag }\">Drag me</div>\n * </template>\n * ```\n */\nexport const vDraggable = defineDirective<DraggableBinding, HTMLElement>({\n\tname: 'draggable',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tif (options.disabled) return\n\n\t\t// Make element positionable\n\t\tif (getComputedStyle(el).position === 'static') {\n\t\t\tel.style.position = 'absolute'\n\t\t}\n\n\t\tconst state: DraggableState = {\n\t\t\toptions,\n\t\t\tisDragging: false,\n\t\t\tstartX: 0,\n\t\t\tstartY: 0,\n\t\t\toffsetX: 0,\n\t\t\toffsetY: 0,\n\t\t\tinitialLeft: 0,\n\t\t\tinitialTop: 0,\n\t\t\tboundaryWidth: 0,\n\t\t\tboundaryHeight: 0,\n\t\t\telWidth: 0,\n\t\t\telHeight: 0,\n\t\t\thandleEl: options.handle ? el.querySelector(options.handle) : null,\n\t\t\tmoveHandler: null,\n\t\t\tendHandler: null,\n\t\t}\n\n\t\t;(el as any).__draggable = state\n\n\t\t// Add event listeners to handle or element\n\t\tconst targetEl = state.handleEl || el\n\t\ttargetEl.addEventListener('mousedown', startDrag)\n\t\ttargetEl.addEventListener('touchstart', startDrag, { passive: false })\n\n\t\tfunction startDrag(e: MouseEvent | TouchEvent): void {\n\t\t\tif (state.options.disabled) return\n\n\t\t\t// Prevent default for touch events\n\t\t\tif (e.type === 'touchstart') {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\n\t\t\tconst { clientX, clientY } = getClientCoords(e)\n\t\t\tstate.isDragging = true\n\t\t\tstate.startX = clientX\n\t\t\tstate.startY = clientY\n\n\t\t\t// Get current transform offset\n\t\t\tconst { x, y } = parseTranslate(el.style.transform)\n\t\t\tstate.offsetX = x\n\t\t\tstate.offsetY = y\n\n\t\t\t// Store boundary info for constraint\n\t\t\tif (state.options.constrain || state.options.boundary) {\n\t\t\t\tconst boundary = state.options.boundary ? getBoundary(el, state.options.boundary) : el.parentElement?.getBoundingClientRect()\n\n\t\t\t\tif (boundary) {\n\t\t\t\t\tconst elRect = el.getBoundingClientRect()\n\t\t\t\t\tstate.initialLeft = elRect.left - boundary.left\n\t\t\t\t\tstate.initialTop = elRect.top - boundary.top\n\t\t\t\t\tstate.boundaryWidth = boundary.width\n\t\t\t\t\tstate.boundaryHeight = boundary.height\n\t\t\t\t\tstate.elWidth = elRect.width\n\t\t\t\t\tstate.elHeight = elRect.height\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add drag class\n\t\t\tel.classList.add('v-draggable--dragging')\n\n\t\t\t// Create move and end handlers\n\t\t\tstate.moveHandler = (moveEvent: MouseEvent | TouchEvent) => {\n\t\t\t\tif (!state.isDragging) return\n\n\t\t\t\tconst { clientX: moveX, clientY: moveY } = getClientCoords(moveEvent)\n\t\t\t\tlet deltaX = moveX - state.startX,\n\t\t\t\t\tdeltaY = moveY - state.startY\n\n\t\t\t\t// Apply axis constraint\n\t\t\t\tif (state.options.axis === 'x') {\n\t\t\t\t\tdeltaY = 0\n\t\t\t\t} else if (state.options.axis === 'y') {\n\t\t\t\t\tdeltaX = 0\n\t\t\t\t}\n\n\t\t\t\t// Apply grid snapping\n\t\t\t\tif (state.options.grid) {\n\t\t\t\t\tdeltaX = Math.round(deltaX / state.options.grid[0]) * state.options.grid[0]\n\t\t\t\t\tdeltaY = Math.round(deltaY / state.options.grid[1]) * state.options.grid[1]\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line one-var\n\t\t\t\tlet newX = state.offsetX + deltaX,\n\t\t\t\t\tnewY = state.offsetY + deltaY\n\n\t\t\t\t// Apply boundary constraints\n\t\t\t\tif (state.options.constrain || state.options.boundary) {\n\t\t\t\t\tconst newLeft = state.initialLeft + deltaX\n\t\t\t\t\tconst newTop = state.initialTop + deltaY\n\t\t\t\t\tconst maxLeft = state.boundaryWidth - state.elWidth\n\t\t\t\t\tconst maxTop = state.boundaryHeight - state.elHeight\n\n\t\t\t\t\tconst constrainedLeft = Math.max(0, Math.min(newLeft, maxLeft))\n\t\t\t\t\tconst constrainedTop = Math.max(0, Math.min(newTop, maxTop))\n\n\t\t\t\t\tnewX = state.offsetX + (constrainedLeft - state.initialLeft)\n\t\t\t\t\tnewY = state.offsetY + (constrainedTop - state.initialTop)\n\t\t\t\t}\n\n\t\t\t\t// Apply transform\n\t\t\t\tel.style.transform = `translate(${newX}px, ${newY}px)`\n\n\t\t\t\t// Call callback\n\t\t\t\tstate.options.onDrag?.({ x: newX, y: newY }, moveEvent)\n\t\t\t}\n\n\t\t\tstate.endHandler = () => {\n\t\t\t\tif (!state.isDragging) return\n\n\t\t\t\tstate.isDragging = false\n\t\t\t\tel.classList.remove('v-draggable--dragging')\n\n\t\t\t\t// Remove event listeners\n\t\t\t\tif (state.moveHandler) {\n\t\t\t\t\tdocument.removeEventListener('mousemove', state.moveHandler)\n\t\t\t\t\tdocument.removeEventListener('touchmove', state.moveHandler)\n\t\t\t\t}\n\t\t\t\tif (state.endHandler) {\n\t\t\t\t\tdocument.removeEventListener('mouseup', state.endHandler)\n\t\t\t\t\tdocument.removeEventListener('touchend', state.endHandler)\n\t\t\t\t}\n\n\t\t\t\t// Get final position\n\t\t\t\tconst { x: finalX, y: finalY } = parseTranslate(el.style.transform)\n\t\t\t\tstate.options.onEnd?.({ x: finalX, y: finalY }, new MouseEvent('mouseup'))\n\t\t\t}\n\n\t\t\t// Add move and end listeners\n\t\t\tdocument.addEventListener('mousemove', state.moveHandler)\n\t\t\tdocument.addEventListener('touchmove', state.moveHandler, { passive: false })\n\t\t\tdocument.addEventListener('mouseup', state.endHandler)\n\t\t\tdocument.addEventListener('touchend', state.endHandler)\n\n\t\t\t// Call start callback\n\t\t\tstate.options.onStart?.({ x: state.offsetX, y: state.offsetY }, e)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: DraggableState | undefined = (el as any).__draggable\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\t// Update handle element\n\t\tif (state.options.handle) {\n\t\t\tstate.handleEl = el.querySelector(state.options.handle)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: DraggableState | undefined = (el as any).__draggable\n\t\tif (!state) return\n\n\t\t// Remove event listeners\n\t\tif (state.moveHandler) {\n\t\t\tdocument.removeEventListener('mousemove', state.moveHandler)\n\t\t\tdocument.removeEventListener('touchmove', state.moveHandler)\n\t\t}\n\t\tif (state.endHandler) {\n\t\t\tdocument.removeEventListener('mouseup', state.endHandler)\n\t\t\tdocument.removeEventListener('touchend', state.endHandler)\n\t\t}\n\n\t\tdelete (el as any).__draggable\n\t},\n})\n\nexport default vDraggable\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Ellipsis directive options\n */\nexport interface EllipsisOptions {\n\t/**\n\t * Number of lines to show before truncating\n\t * @default 1\n\t */\n\tlines?: number\n\n\t/**\n\t * Custom ellipsis string\n\t * @default '...'\n\t */\n\tellipsis?: string\n\n\t/**\n\t * Whether to expand on click\n\t * @default false\n\t */\n\texpandable?: boolean\n\n\t/**\n\t * Title attribute behavior\n\t * - 'auto': Show full text as title only when truncated\n\t * - 'always': Always show full text as title\n\t * - 'none': Don't show title\n\t * @default 'auto'\n\t */\n\ttitleBehavior?: 'auto' | 'always' | 'none'\n}\n\n/**\n * Directive binding value type\n */\nexport type EllipsisBinding = number | EllipsisOptions\n\n/**\n * Element state storage\n */\ninterface EllipsisState {\n\toptions: EllipsisOptions\n\toriginalText: string\n\tclickHandler: (() => void) | null\n\texpanded: boolean\n}\n\n/**\n * v-ellipsis directive\n *\n * Truncates text with ellipsis, supports single and multi-line truncation.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Single line ellipsis -->\n * <p v-ellipsis>Long text here...</p>\n *\n * <!-- Multi-line ellipsis (3 lines) -->\n * <p v-ellipsis=\"3\">Long text here...</p>\n *\n * <!-- With options -->\n * <p v-ellipsis=\"{ lines: 2, expandable: true }\">\n * Click to expand long text...\n * </p>\n * </template>\n * ```\n */\nexport const vEllipsis = defineDirective<EllipsisBinding, HTMLElement>({\n\tname: 'ellipsis',\n\tssr: true,\n\tdefaults: {\n\t\tlines: 1,\n\t\tellipsis: '...',\n\t\texpandable: false,\n\t\ttitleBehavior: 'auto',\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tapplyEllipsis(el, options)\n\n\t\tconst state: EllipsisState = {\n\t\t\toptions,\n\t\t\toriginalText: el.textContent || '',\n\t\t\tclickHandler: null,\n\t\t\texpanded: false,\n\t\t}\n\n\t\t// Handle expandable\n\t\tif (options.expandable) {\n\t\t\tconst handler = (): void => {\n\t\t\t\tif (state.expanded) {\n\t\t\t\t\t// Collapse\n\t\t\t\t\tapplyEllipsis(el, options)\n\t\t\t\t\tstate.expanded = false\n\t\t\t\t} else {\n\t\t\t\t\t// Expand\n\t\t\t\t\tel.textContent = state.originalText\n\t\t\t\t\tel.style.webkitLineClamp = ''\n\t\t\t\t\tel.style.display = ''\n\t\t\t\t\tel.style.overflow = ''\n\t\t\t\t\tel.style.cursor = ''\n\t\t\t\t\tstate.expanded = true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tel.addEventListener('click', handler)\n\t\t\tel.style.cursor = 'pointer'\n\t\t\tstate.clickHandler = handler\n\t\t}\n\n\t\t// Handle title\n\t\tif (options.titleBehavior === 'always') {\n\t\t\tel.title = state.originalText\n\t\t} else if (options.titleBehavior === 'auto') {\n\t\t\t// Check if text is actually truncated\n\t\t\tif (isTextTruncated(el)) {\n\t\t\t\tel.title = state.originalText\n\t\t\t}\n\t\t}\n\n\t\t;(el as any).__ellipsis = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: EllipsisState = (el as any).__ellipsis\n\n\t\tif (!state) {\n\t\t\tconst options = normalizeOptions(binding.value)\n\t\t\tapplyEllipsis(el, options)\n\t\t\treturn\n\t\t}\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst textChanged = el.textContent !== state.originalText\n\n\t\tif (textChanged) {\n\t\t\tstate.originalText = el.textContent || ''\n\t\t\tstate.expanded = false\n\t\t}\n\n\t\t// Update click handler if expandable changed\n\t\tif (state.options.expandable !== newOptions.expandable) {\n\t\t\tif (state.clickHandler) {\n\t\t\t\tel.removeEventListener('click', state.clickHandler)\n\t\t\t\tstate.clickHandler = null\n\t\t\t}\n\n\t\t\tif (newOptions.expandable) {\n\t\t\t\tconst handler = (): void => {\n\t\t\t\t\tif (state.expanded) {\n\t\t\t\t\t\tapplyEllipsis(el, newOptions)\n\t\t\t\t\t\tstate.expanded = false\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel.textContent = state.originalText\n\t\t\t\t\t\tel.style.webkitLineClamp = ''\n\t\t\t\t\t\tel.style.display = ''\n\t\t\t\t\t\tel.style.overflow = ''\n\t\t\t\t\t\tstate.expanded = true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tel.addEventListener('click', handler)\n\t\t\t\tel.style.cursor = 'pointer'\n\t\t\t\tstate.clickHandler = handler\n\t\t\t} else {\n\t\t\t\tel.style.cursor = ''\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\n\t\t// Reapply ellipsis if not expanded\n\t\tif (!state.expanded) {\n\t\t\tapplyEllipsis(el, newOptions)\n\t\t}\n\n\t\t// Update title\n\t\tif (newOptions.titleBehavior === 'always') {\n\t\t\tel.title = state.originalText\n\t\t} else if (newOptions.titleBehavior === 'auto') {\n\t\t\tel.title = isTextTruncated(el) ? state.originalText : ''\n\t\t} else {\n\t\t\tel.removeAttribute('title')\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: EllipsisState | undefined = (el as any).__ellipsis\n\n\t\tif (!state) return\n\n\t\tif (state.clickHandler) {\n\t\t\tel.removeEventListener('click', state.clickHandler)\n\t\t}\n\n\t\t// Clean up styles\n\t\tel.style.removeProperty('-webkit-line-clamp')\n\t\tel.style.removeProperty('-webkit-box-orient')\n\t\tel.style.removeProperty('display')\n\t\tel.style.removeProperty('overflow')\n\t\tel.style.removeProperty('text-overflow')\n\t\tel.style.removeProperty('white-space')\n\t\tel.style.removeProperty('cursor')\n\n\t\tdelete (el as any).__ellipsis\n\t},\n})\n\n/**\n * Apply ellipsis styles to element\n */\nfunction applyEllipsis(el: HTMLElement, options: EllipsisOptions): void {\n\tconst lines = options.lines || 1\n\n\tif (lines === 1) {\n\t\t// Single line ellipsis\n\t\tel.style.overflow = 'hidden'\n\t\tel.style.textOverflow = 'ellipsis'\n\t\tel.style.whiteSpace = 'nowrap'\n\t} else {\n\t\t// Multi-line ellipsis\n\t\tel.style.display = '-webkit-box'\n\t\tel.style.overflow = 'hidden'\n\t\tel.style.webkitBoxOrient = 'vertical'\n\t\tel.style.webkitLineClamp = String(lines)\n\t}\n}\n\n/**\n * Check if text is truncated\n */\nfunction isTextTruncated(el: HTMLElement): boolean {\n\treturn el.scrollWidth > el.clientWidth || el.scrollHeight > el.clientHeight\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: EllipsisBinding | undefined): EllipsisOptions {\n\tif (typeof binding === 'number') {\n\t\treturn {\n\t\t\tlines: binding,\n\t\t\tellipsis: '...',\n\t\t\texpandable: false,\n\t\t\ttitleBehavior: 'auto',\n\t\t}\n\t}\n\n\treturn {\n\t\tlines: binding?.lines ?? 1,\n\t\tellipsis: binding?.ellipsis ?? '...',\n\t\texpandable: binding?.expandable ?? false,\n\t\ttitleBehavior: binding?.titleBehavior ?? 'auto',\n\t}\n}\n\nexport default vEllipsis\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Emoji directive options\n */\nexport interface EmojiOptions {\n\t/**\n\t * Whether to strip emoji from input\n\t * @default true\n\t */\n\tstrip?: boolean\n\n\t/**\n\t * Whether to allow specific emojis (array of emoji strings)\n\t */\n\tallowList?: string[]\n\n\t/**\n\t * Whether to block specific emojis (array of emoji strings)\n\t */\n\tblockList?: string[]\n\n\t/**\n\t * Custom emoji pattern (regex string)\n\t */\n\tpattern?: string\n\n\t/**\n\t * Replacement character for stripped emojis\n\t * @default ''\n\t */\n\treplacement?: string\n\n\t/**\n\t * Callback when emoji is detected\n\t */\n\tonEmoji?: (emoji: string, position: number) => void\n\n\t/**\n\t * Callback when emoji is stripped\n\t */\n\tonStrip?: (original: string, cleaned: string) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type EmojiBinding = boolean | EmojiOptions\n\n/**\n * Element state storage\n */\ninterface EmojiState {\n\toptions: EmojiOptions\n\tinputHandler: (e: Event) => void\n\tpasteHandler: (e: ClipboardEvent) => void\n}\n\n/**\n * Common emoji pattern\n */\nconst EMOJI_PATTERN = /[\\p{Emoji_Presentation}\\p{Extended_Pictographic}]/gu\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: EmojiBinding | undefined): EmojiOptions {\n\tif (binding === false) {\n\t\treturn { strip: false }\n\t}\n\n\tif (binding === true || binding === undefined) {\n\t\treturn { strip: true }\n\t}\n\n\treturn {\n\t\tstrip: true,\n\t\treplacement: '',\n\t\t...binding,\n\t}\n}\n\n/**\n * Get emoji pattern based on options\n */\nfunction getEmojiPattern(options: EmojiOptions): RegExp {\n\tif (options.pattern) {\n\t\treturn new RegExp(options.pattern, 'gu')\n\t}\n\n\tif (options.blockList && options.blockList.length > 0) {\n\t\t// Build pattern for specific blocked emojis\n\t\tconst escaped = options.blockList.map(e => e.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|')\n\t\treturn new RegExp(escaped, 'gu')\n\t}\n\n\tif (options.allowList && options.allowList.length > 0) {\n\t\t// Build negative pattern for allowed emojis\n\t\t// This is more complex - we strip all emojis except those in allowList\n\t\treturn EMOJI_PATTERN\n\t}\n\n\treturn EMOJI_PATTERN\n}\n\n/**\n * Check if emoji is in allow list\n */\nfunction isAllowed(char: string, allowList?: string[]): boolean {\n\tif (!allowList || allowList.length === 0) {\n\t\treturn false\n\t}\n\treturn allowList.includes(char)\n}\n\n/**\n * Strip emojis from text\n */\nfunction stripEmojis(text: string, options: EmojiOptions): string {\n\tconst pattern = getEmojiPattern(options)\n\tconst replacement = options.replacement || ''\n\tlet result = text\n\n\t// If we have an allow list, we need to process differently\n\tif (options.allowList && options.allowList.length > 0) {\n\t\tresult = text.replace(pattern, match => {\n\t\t\tif (isAllowed(match, options.allowList)) {\n\t\t\t\treturn match\n\t\t\t}\n\t\t\toptions.onEmoji?.(match, text.indexOf(match))\n\t\t\treturn replacement\n\t\t})\n\t} else {\n\t\tconst matches = text.match(pattern)\n\t\tif (matches) {\n\t\t\tmatches.forEach(match => {\n\t\t\t\toptions.onEmoji?.(match, text.indexOf(match))\n\t\t\t})\n\t\t}\n\t\tresult = text.replace(pattern, replacement)\n\t}\n\n\tif (result !== text) {\n\t\toptions.onStrip?.(text, result)\n\t}\n\n\treturn result\n}\n\n/**\n * v-emoji directive\n * Restrict or filter emoji input\n *\n * @example\n * ```vue\n * <template>\n * <!-- Strip all emojis -->\n * <input v-emoji type=\"text\" />\n *\n * <!-- Strip emojis with replacement -->\n * <input v-emoji=\"{ strip: true, replacement: '*' }\" type=\"text\" />\n *\n * <!-- Allow specific emojis -->\n * <input v-emoji=\"{ allowList: ['\uD83D\uDE0A', '\uD83D\uDC4D'] }\" type=\"text\" />\n *\n * <!-- Block specific emojis -->\n * <input v-emoji=\"{ blockList: ['\uD83D\uDEAB', '\u274C'] }\" type=\"text\" />\n * </template>\n * ```\n */\nexport const vEmoji = defineDirective<EmojiBinding, HTMLInputElement | HTMLTextAreaElement>({\n\tname: 'emoji',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!options.strip && !options.blockList?.length) return\n\n\t\tconst state: EmojiState = {\n\t\t\toptions,\n\t\t\tinputHandler: (e: Event) => {\n\t\t\t\tconst target = e.target as HTMLInputElement | HTMLTextAreaElement\n\t\t\t\tconst original = target.value\n\t\t\t\tconst cleaned = stripEmojis(original, state.options)\n\n\t\t\t\tif (cleaned !== original) {\n\t\t\t\t\t// Preserve cursor position\n\t\t\t\t\tconst start = target.selectionStart || 0\n\t\t\t\t\tconst end = target.selectionEnd || 0\n\n\t\t\t\t\ttarget.value = cleaned\n\n\t\t\t\t\t// Adjust cursor position if emojis were stripped\n\t\t\t\t\tconst diff = original.length - cleaned.length\n\t\t\t\t\ttarget.setSelectionRange(Math.max(0, start - diff), Math.max(0, end - diff))\n\n\t\t\t\t\t// Trigger input event for v-model\n\t\t\t\t\ttarget.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t}\n\t\t\t},\n\t\t\tpasteHandler: (e: ClipboardEvent) => {\n\t\t\t\tif (!state.options.strip) return\n\n\t\t\t\tconst pastedText = e.clipboardData?.getData('text')\n\t\t\t\tif (pastedText && EMOJI_PATTERN.test(pastedText)) {\n\t\t\t\t\te.preventDefault()\n\n\t\t\t\t\tconst cleaned = stripEmojis(pastedText, state.options)\n\t\t\t\t\tconst target = e.target as HTMLInputElement | HTMLTextAreaElement\n\n\t\t\t\t\t// Insert cleaned text\n\t\t\t\t\tconst start = target.selectionStart || 0\n\t\t\t\t\tconst end = target.selectionEnd || 0\n\t\t\t\t\tconst value = target.value\n\n\t\t\t\t\ttarget.value = value.substring(0, start) + cleaned + value.substring(end)\n\t\t\t\t\ttarget.setSelectionRange(start + cleaned.length, start + cleaned.length)\n\n\t\t\t\t\t// Trigger input event for v-model\n\t\t\t\t\ttarget.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t;(el as any).__emoji = state\n\n\t\ton(el, 'input', state.inputHandler)\n\t\ton(el, 'paste', state.pasteHandler as (e: Event) => void)\n\n\t\t// Process initial value\n\t\tif (el.value) {\n\t\t\tconst cleaned = stripEmojis(el.value, state.options)\n\t\t\tif (cleaned !== el.value) {\n\t\t\t\tel.value = cleaned\n\t\t\t}\n\t\t}\n\n\t\tel.classList.add('v-emoji')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: EmojiState = (el as any).__emoji\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: EmojiState = (el as any).__emoji\n\n\t\tif (!state) return\n\n\t\toff(el, 'input', state.inputHandler)\n\t\toff(el, 'paste', state.pasteHandler as (e: Event) => void)\n\t\tel.classList.remove('v-emoji')\n\n\t\tdelete (el as any).__emoji\n\t},\n})\n\nexport default vEmoji\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Export format type\n */\nexport type ExportFormat = 'csv' | 'json' | 'txt' | 'html'\n\n/**\n * Export directive options\n */\nexport interface ExportOptions {\n\t/**\n\t * Data to export\n\t */\n\tdata: any[] | object | string\n\n\t/**\n\t * Export format\n\t * @default 'csv'\n\t */\n\tformat?: ExportFormat\n\n\t/**\n\t * Filename (without extension)\n\t * @default 'export'\n\t */\n\tfilename?: string\n\n\t/**\n\t * Whether to include headers (for CSV)\n\t * @default true\n\t */\n\tincludeHeaders?: boolean\n\n\t/**\n\t * Custom delimiter for CSV\n\t * @default ','\n\t */\n\tdelimiter?: string\n\n\t/**\n\t * Columns to export (for array of objects)\n\t */\n\tcolumns?: string[]\n\n\t/**\n\t * Custom headers mapping\n\t */\n\theaders?: Record<string, string>\n\n\t/**\n\t * Callback before export\n\t */\n\tonBeforeExport?: () => boolean | void\n\n\t/**\n\t * Callback after export\n\t */\n\tonAfterExport?: () => 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 ExportBinding = ExportOptions | ExportOptions['data']\n\n/**\n * Element state storage\n */\ninterface ExportState {\n\toptions: ExportOptions\n\tclickHandler: () => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ExportBinding): ExportOptions {\n\tif (!binding || typeof binding === 'string' || Array.isArray(binding)) {\n\t\treturn { data: binding, format: 'csv', filename: 'export' }\n\t}\n\n\tconst opts = binding as ExportOptions\n\treturn {\n\t\tformat: 'csv',\n\t\tfilename: 'export',\n\t\tincludeHeaders: true,\n\t\tdelimiter: ',',\n\t\t...opts,\n\t\tdata: opts.data ?? [],\n\t}\n}\n\n/**\n * Convert data to CSV\n */\nfunction toCSV(data: any[], options: ExportOptions): string {\n\tif (!Array.isArray(data) || data.length === 0) {\n\t\treturn ''\n\t}\n\n\tconst delimiter = options.delimiter || ','\n\tconst columns = options.columns || Object.keys(data[0])\n\tconst headers = options.headers || {}\n\n\t// Build header row\n\tconst headerRow = options.includeHeaders ? `${columns.map(col => headers[col] || col).join(delimiter)}\\n` : ''\n\n\t// Build data rows\n\tconst dataRows = data\n\t\t.map(row =>\n\t\t\tcolumns\n\t\t\t\t.map(col => {\n\t\t\t\t\tconst value = row[col]\n\t\t\t\t\t// Escape quotes and wrap in quotes if contains delimiter or newline\n\t\t\t\t\tif (typeof value === 'string' && (value.includes(delimiter) || value.includes('\\n') || value.includes('\"'))) {\n\t\t\t\t\t\treturn `\"${value.replace(/\"/g, '\"\"')}\"`\n\t\t\t\t\t}\n\t\t\t\t\treturn value ?? ''\n\t\t\t\t})\n\t\t\t\t.join(delimiter),\n\t\t)\n\t\t.join('\\n')\n\n\treturn headerRow + dataRows\n}\n\n/**\n * Convert data to JSON\n */\nfunction toJSON(data: any): string {\n\treturn JSON.stringify(data, null, 2)\n}\n\n/**\n * Convert data to HTML table\n */\nfunction toHTML(data: any[], options: ExportOptions): string {\n\tif (!Array.isArray(data) || data.length === 0) {\n\t\treturn ''\n\t}\n\n\tconst columns = options.columns || Object.keys(data[0])\n\tconst headers = options.headers || {}\n\n\tlet html = '<table border=\"1\">\\n'\n\n\t// Build header\n\tif (options.includeHeaders) {\n\t\thtml += ' <thead>\\n <tr>\\n'\n\t\tfor (const col of columns) {\n\t\t\thtml += ` <th>${headers[col] || col}</th>\\n`\n\t\t}\n\t\thtml += ' </tr>\\n </thead>\\n'\n\t}\n\n\t// Build body\n\thtml += ' <tbody>\\n'\n\tfor (const row of data) {\n\t\thtml += ' <tr>\\n'\n\t\tfor (const col of columns) {\n\t\t\thtml += ` <td>${row[col] ?? ''}</td>\\n`\n\t\t}\n\t\thtml += ' </tr>\\n'\n\t}\n\thtml += ' </tbody>\\n</table>'\n\n\treturn html\n}\n\n/**\n * Download content as file\n */\nfunction downloadFile(content: string, filename: string, format: ExportFormat): void {\n\tconst mimeTypes: Record<ExportFormat, string> = {\n\t\tcsv: 'text/csv;charset=utf-8;',\n\t\tjson: 'application/json;charset=utf-8;',\n\t\ttxt: 'text/plain;charset=utf-8;',\n\t\thtml: 'text/html;charset=utf-8;',\n\t}\n\n\tconst blob = new Blob([content], { type: mimeTypes[format] })\n\tconst url = URL.createObjectURL(blob)\n\n\tconst link = document.createElement('a')\n\tlink.href = url\n\tlink.download = `${filename}.${format}`\n\n\tdocument.body.appendChild(link)\n\tlink.click()\n\tdocument.body.removeChild(link)\n\n\tURL.revokeObjectURL(url)\n}\n\n/**\n * Export data\n */\nfunction exportData(options: ExportOptions): void {\n\tconst { data, format = 'csv', filename = 'export' } = options\n\n\tlet content: string\n\n\tswitch (format) {\n\t\tcase 'json':\n\t\t\tcontent = toJSON(data)\n\t\t\tbreak\n\t\tcase 'html':\n\t\t\tcontent = toHTML(Array.isArray(data) ? data : [data], options)\n\t\t\tbreak\n\t\tcase 'txt':\n\t\t\tcontent = typeof data === 'string' ? data : JSON.stringify(data, null, 2)\n\t\t\tbreak\n\t\tcase 'csv':\n\t\tdefault:\n\t\t\tcontent = toCSV(Array.isArray(data) ? data : [data], options)\n\t\t\tbreak\n\t}\n\n\tdownloadFile(content, filename, format)\n}\n\n/**\n * v-export directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-export=\"exportData\">Export CSV</button>\n *\n * <button v-export=\"{ data: tableData, format: 'json', filename: 'my-data' }\">\n * Export JSON\n * </button>\n *\n * <button v-export=\"{\n * data: tableData,\n * format: 'csv',\n * columns: ['name', 'email'],\n * headers: { name: 'Name', email: 'Email Address' }\n * }\">\n * Export with custom columns\n * </button>\n * </template>\n *\n * <script setup>\n * const tableData = [\n * { name: 'John', email: 'john@example.com', age: 30 },\n * { name: 'Jane', email: 'jane@example.com', age: 25 }\n * ]\n * </script>\n * ```\n */\nexport const vExport = defineDirective<ExportBinding, HTMLElement>({\n\tname: 'export',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!isBrowser()) return\n\n\t\tconst state: ExportState = {\n\t\t\toptions,\n\t\t\tclickHandler: () => {\n\t\t\t\t// Check before export callback\n\t\t\t\tif (state.options.onBeforeExport?.() === false) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\texportData(state.options)\n\t\t\t\t\tstate.options.onAfterExport?.()\n\t\t\t\t} catch (error) {\n\t\t\t\t\tstate.options.onError?.(error as Error)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t;(el as any).__export = state\n\n\t\ton(el, 'click', state.clickHandler)\n\n\t\t// Add visual cue\n\t\tel.classList.add('v-export')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ExportState = (el as any).__export\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ExportState = (el as any).__export\n\n\t\tif (!state) return\n\n\t\toff(el, 'click', state.clickHandler)\n\t\tel.classList.remove('v-export')\n\n\t\tdelete (el as any).__export\n\t},\n})\n\nexport default vExport\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Fade animation direction\n */\nexport type FadeDirection = 'in' | 'out' | 'toggle'\n\n/**\n * Fade directive options\n */\nexport interface FadeOptions {\n\t/**\n\t * Fade direction\n\t * @default 'toggle'\n\t */\n\tdirection?: FadeDirection\n\n\t/**\n\t * Whether element is visible initially\n\t * @default true\n\t */\n\tvisible?: boolean\n\n\t/**\n\t * Animation duration in milliseconds\n\t * @default 300\n\t */\n\tduration?: number\n\n\t/**\n\t * Animation delay in milliseconds\n\t * @default 0\n\t */\n\tdelay?: number\n\n\t/**\n\t * CSS easing function\n\t * @default 'ease'\n\t */\n\teasing?: string\n\n\t/**\n\t * Minimum opacity when fading out\n\t * @default 0\n\t */\n\tminOpacity?: number\n\n\t/**\n\t * Maximum opacity when fading in\n\t * @default 1\n\t */\n\tmaxOpacity?: number\n\n\t/**\n\t * Callback when fade starts\n\t */\n\tonStart?: (direction: 'in' | 'out') => void\n\n\t/**\n\t * Callback when fade completes\n\t */\n\tonComplete?: (direction: 'in' | 'out') => void\n}\n\n/**\n * Directive binding value type\n */\nexport type FadeBinding = boolean | FadeDirection | FadeOptions\n\n/**\n * Element state storage\n */\ninterface FadeState {\n\toptions: FadeOptions\n\tcurrentOpacity: number\n\tanimationFrame: number | null\n\tisAnimating: boolean\n}\n\n/**\n * Default options\n */\nconst defaultOptions: FadeOptions = {\n\tdirection: 'toggle',\n\tvisible: true,\n\tduration: 300,\n\tdelay: 0,\n\teasing: 'ease',\n\tminOpacity: 0,\n\tmaxOpacity: 1,\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: FadeBinding | undefined): FadeOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { ...defaultOptions, visible: binding }\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { ...defaultOptions, direction: binding as FadeDirection }\n\t}\n\n\treturn { ...defaultOptions, ...binding }\n}\n\n/**\n * Parse easing to timing function\n */\nfunction getTimingFunction(easing: string): string {\n\tconst easingMap: Record<string, string> = {\n\t\tease: 'ease',\n\t\t'ease-in': 'ease-in',\n\t\t'ease-out': 'ease-out',\n\t\t'ease-in-out': 'ease-in-out',\n\t\tlinear: 'linear',\n\t}\n\n\treturn easingMap[easing] || easing\n}\n\n/**\n * v-fade directive\n * Fade in/out transition effect\n *\n * @example\n * ```vue\n * <template>\n * <!-- Toggle visibility with fade -->\n * <div v-fade=\"isVisible\">Fade content</div>\n *\n * <!-- Fade in only -->\n * <div v-fade=\"'in'\">Fade in</div>\n *\n * <!-- Fade out only -->\n * <div v-fade=\"'out'\">Fade out</div>\n *\n * <!-- With options -->\n * <div v-fade=\"{\n * visible: isVisible,\n * duration: 500,\n * easing: 'ease-in-out',\n * onComplete: () => console.log('Fade complete')\n * }\">\n * Content\n * </div>\n * </template>\n * ```\n */\nexport const vFade = defineDirective<FadeBinding, HTMLElement>({\n\tname: 'fade',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: FadeState = {\n\t\t\toptions,\n\t\t\tcurrentOpacity: options.visible ? options.maxOpacity || 1 : options.minOpacity || 0,\n\t\t\tanimationFrame: null,\n\t\t\tisAnimating: false,\n\t\t}\n\n\t\t;(el as any).__fade = state\n\n\t\t// Set transition style\n\t\tel.style.transition = `opacity ${options.duration}ms ${getTimingFunction(options.easing || 'ease')} ${options.delay}ms`\n\n\t\t// Handle direction on mount\n\t\tif (options.direction === 'in') {\n\t\t\t// Start invisible, then fade in\n\t\t\tel.style.opacity = String(options.minOpacity || 0)\n\t\t\tel.style.display = ''\n\t\t\t// Force reflow\n\t\t\tString(el.offsetHeight)\n\t\t\t// Fade in\n\t\t\tstate.animationFrame = requestAnimationFrame(() => {\n\t\t\t\tstate.animationFrame = null\n\t\t\t\tel.style.opacity = String(options.maxOpacity || 1)\n\t\t\t\tstate.currentOpacity = options.maxOpacity || 1\n\t\t\t})\n\t\t} else if (options.direction === 'out') {\n\t\t\t// Start visible, then fade out\n\t\t\tel.style.opacity = String(options.maxOpacity || 1)\n\t\t\tel.style.display = ''\n\t\t\t// Fade out\n\t\t\tstate.animationFrame = requestAnimationFrame(() => {\n\t\t\t\tstate.animationFrame = null\n\t\t\t\tel.style.opacity = String(options.minOpacity || 0)\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tel.style.display = 'none'\n\t\t\t\t}, (options.duration || 300) + (options.delay || 0))\n\t\t\t})\n\t\t} else {\n\t\t\t// Toggle mode: set initial state based on visible\n\t\t\tel.style.opacity = String(state.currentOpacity)\n\t\t\tif (!options.visible) {\n\t\t\t\tel.style.display = 'none'\n\t\t\t}\n\t\t}\n\n\t\tel.classList.add('v-fade')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: FadeState = (el as any).__fade\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst isVisible = newOptions.visible !== false\n\n\t\t// Store old visible state before updating options\n\t\tconst oldVisible = state.options.visible\n\n\t\tstate.options = newOptions\n\n\t\t// Update transition\n\t\tel.style.transition = `opacity ${newOptions.duration}ms ${getTimingFunction(newOptions.easing || 'ease')} ${newOptions.delay}ms`\n\n\t\t// Only animate if visible state changed\n\t\tif (oldVisible !== newOptions.visible) {\n\t\t\tanimate(el, state, isVisible ? 'in' : 'out')\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: FadeState = (el as any).__fade\n\n\t\tif (!state) return\n\n\t\tif (state.animationFrame) {\n\t\t\tcancelAnimationFrame(state.animationFrame)\n\t\t}\n\n\t\tel.classList.remove('v-fade')\n\n\t\tdelete (el as any).__fade\n\t},\n})\n\n/**\n * Animate fade\n */\nfunction animate(el: HTMLElement, state: FadeState, direction: 'in' | 'out'): void {\n\tif (state.isAnimating) return\n\n\tconst options = state.options\n\tstate.isAnimating = true\n\n\toptions.onStart?.(direction)\n\n\tif (direction === 'in') {\n\t\t// Show element before fade in\n\t\tel.style.display = ''\n\t\tel.style.opacity = String(options.minOpacity || 0)\n\n\t\t// Force reflow\n\t\tString(el.offsetHeight)\n\n\t\t// Fade in\n\t\trequestAnimationFrame(() => {\n\t\t\tel.style.opacity = String(options.maxOpacity || 1)\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tstate.isAnimating = false\n\t\t\t\tstate.currentOpacity = options.maxOpacity || 1\n\t\t\t\toptions.onComplete?.(direction)\n\t\t\t}, (options.duration || 300) + (options.delay || 0))\n\t\t})\n\t} else {\n\t\t// Fade out\n\t\tel.style.opacity = String(options.minOpacity || 0)\n\n\t\tsetTimeout(() => {\n\t\t\tstate.isAnimating = false\n\t\t\tstate.currentOpacity = options.minOpacity || 0\n\t\t\tel.style.display = 'none'\n\t\t\toptions.onComplete?.(direction)\n\t\t}, (options.duration || 300) + (options.delay || 0))\n\t}\n}\n\nexport default vFade\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Focus directive options\n */\nexport interface FocusOptions {\n\t/**\n\t * Whether to auto focus\n\t * @default true\n\t */\n\tfocus?: boolean\n\n\t/**\n\t * Whether to refocus when binding value changes\n\t * @default false\n\t */\n\trefocus?: boolean\n\n\t/**\n\t * Callback when focused\n\t */\n\tonFocus?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when blurred\n\t */\n\tonBlur?: (el: HTMLElement) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type FocusBinding = boolean | FocusOptions\n\n/**\n * Element state storage\n */\ninterface FocusState {\n\toptions: FocusOptions\n\thandleFocus: () => void\n\thandleBlur: () => void\n\tlastValue: FocusBinding\n}\n\nconst FOCUSABLE_TAGS = new Set(['input', 'textarea', 'select', 'button'])\n\n/**\n * Compare two values for equality (supports primitive types and shallow object comparison)\n */\nfunction isEqual(a: unknown, b: unknown): boolean {\n\tif (a === b) return true\n\tif (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n\tconst objA = a as Record<string, unknown>\n\tconst objB = b as Record<string, unknown>\n\tconst keysA = Object.keys(objA)\n\tconst keysB = Object.keys(objB)\n\n\tif (keysA.length !== keysB.length) return false\n\n\treturn keysA.every(key => objA[key] === objB[key])\n}\n\n/**\n * v-focus directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-focus />\n * <input v-focus=\"{ focus: true, refocus: true }\" />\n * </template>\n * ```\n */\nexport const vFocus = defineDirective<FocusBinding, HTMLElement>({\n\tname: 'focus',\n\tssr: true, // SSR safe - will skip focus on server\n\tdefaults: {\n\t\tfocus: true,\n\t\trefocus: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!options.focus || !isFocusable(el)) {\n\t\t\tif (options.focus) {\n\t\t\t\tconsole.warn('[Directix] v-focus: Element is not focusable')\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tconst handleFocus = (): void => options.onFocus?.(el)\n\t\tconst handleBlur = (): void => options.onBlur?.(el)\n\n\t\tel.addEventListener('focus', handleFocus)\n\t\tel.addEventListener('blur', handleBlur)\n\n\t\t;(el as any).__focus = {\n\t\t\toptions,\n\t\t\thandleFocus,\n\t\t\thandleBlur,\n\t\t\tlastValue: binding.value,\n\t\t} as FocusState\n\n\t\tel.focus()\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: FocusState | undefined = (el as any).__focus\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Update event listeners only when callbacks change\n\t\tif (newOptions.onFocus !== state.options.onFocus) {\n\t\t\tel.removeEventListener('focus', state.handleFocus)\n\t\t\tstate.handleFocus = () => newOptions.onFocus?.(el)\n\t\t\tel.addEventListener('focus', state.handleFocus)\n\t\t}\n\n\t\tif (newOptions.onBlur !== state.options.onBlur) {\n\t\t\tel.removeEventListener('blur', state.handleBlur)\n\t\t\tstate.handleBlur = () => newOptions.onBlur?.(el)\n\t\t\tel.addEventListener('blur', state.handleBlur)\n\t\t}\n\n\t\t// Check if value actually changed\n\t\tconst valueChanged = !isEqual(binding.value, state.lastValue)\n\n\t\t// Refocus when value changes and refocus is enabled\n\t\tif (newOptions.refocus && newOptions.focus && valueChanged) {\n\t\t\tel.focus()\n\t\t}\n\n\t\tstate.options = newOptions\n\t\tstate.lastValue = binding.value\n\t},\n\n\tunmounted(el) {\n\t\tconst state: FocusState | undefined = (el as any).__focus\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('focus', state.handleFocus)\n\t\tel.removeEventListener('blur', state.handleBlur)\n\t\tdelete (el as any).__focus\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: FocusBinding | undefined): FocusOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { focus: binding, refocus: false }\n\t}\n\n\treturn {\n\t\tfocus: true,\n\t\trefocus: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if element is focusable\n */\nfunction isFocusable(el: HTMLElement): boolean {\n\tif (!isBrowser()) return false\n\n\tconst tagName = el.tagName.toLowerCase()\n\n\t// Form elements\n\tif (FOCUSABLE_TAGS.has(tagName)) {\n\t\treturn !(el as HTMLInputElement).disabled\n\t}\n\n\t// Contenteditable elements\n\tif (el.isContentEditable) return true\n\n\t// Elements with tabindex\n\tconst tabindex = el.getAttribute('tabindex')\n\n\tif (tabindex != null) return tabindex !== '-1'\n\n\t// Link elements\n\tif (tagName === 'a' || tagName === 'area') {\n\t\treturn el.hasAttribute('href')\n\t}\n\n\treturn false\n}\n\nexport default vFocus\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Fullscreen directive options\n */\nexport interface FullscreenOptions {\n\t/**\n\t * Whether to enter fullscreen mode initially\n\t * @default false\n\t */\n\tinitialState?: boolean\n\n\t/**\n\t * Custom class when in fullscreen mode\n\t */\n\tfullscreenClass?: string\n\n\t/**\n\t * Callback when entering fullscreen\n\t */\n\tonEnter?: () => void\n\n\t/**\n\t * Callback when exiting fullscreen\n\t */\n\tonExit?: () => void\n\n\t/**\n\t * Callback when fullscreen state changes\n\t */\n\tonChange?: (isFullscreen: boolean) => void\n\n\t/**\n\t * Key to toggle fullscreen (e.g., 'Escape', 'f')\n\t * Set to false to disable keyboard toggle\n\t * @default 'Escape'\n\t */\n\ttoggleKey?: string | false\n}\n\n/**\n * Directive binding value type\n */\nexport type FullscreenBinding = boolean | FullscreenOptions\n\n/**\n * Element state storage\n */\ninterface FullscreenState {\n\toptions: FullscreenOptions\n\tclickHandler: () => void\n\tkeydownHandler: (e: KeyboardEvent) => void\n\tchangeHandler: () => void\n\tisFullscreen: boolean\n}\n\n/**\n * Check if fullscreen is supported\n */\nfunction isFullscreenSupported(): boolean {\n\treturn !!(\n\t\tdocument.fullscreenEnabled\n\t\t|| (document as any).webkitFullscreenEnabled\n\t\t|| (document as any).mozFullScreenEnabled\n\t\t|| (document as any).msFullscreenEnabled\n\t)\n}\n\n/**\n * Get fullscreen element\n */\nfunction getFullscreenElement(): Element | null {\n\treturn (\n\t\tdocument.fullscreenElement\n\t\t|| (document as any).webkitFullscreenElement\n\t\t|| (document as any).mozFullScreenElement\n\t\t|| (document as any).msFullscreenElement\n\t\t|| null\n\t)\n}\n\n/**\n * Request fullscreen\n */\nasync function requestFullscreen(el: HTMLElement): Promise<void> {\n\tif (el.requestFullscreen) {\n\t\tawait el.requestFullscreen()\n\t} else if ((el as any).webkitRequestFullscreen) {\n\t\tawait (el as any).webkitRequestFullscreen()\n\t} else if ((el as any).mozRequestFullScreen) {\n\t\tawait (el as any).mozRequestFullScreen()\n\t} else if ((el as any).msRequestFullscreen) {\n\t\tawait (el as any).msRequestFullscreen()\n\t}\n}\n\n/**\n * Exit fullscreen\n */\nasync function exitFullscreen(): Promise<void> {\n\tif (document.exitFullscreen) {\n\t\tawait document.exitFullscreen()\n\t} else if ((document as any).webkitExitFullscreen) {\n\t\tawait (document as any).webkitExitFullscreen()\n\t} else if ((document as any).mozCancelFullScreen) {\n\t\tawait (document as any).mozCancelFullScreen()\n\t} else if ((document as any).msExitFullscreen) {\n\t\tawait (document as any).msExitFullscreen()\n\t}\n}\n\n/**\n * Toggle fullscreen\n */\nasync function toggleFullscreen(el: HTMLElement, state: FullscreenState): Promise<void> {\n\tif (state.isFullscreen) {\n\t\tawait exitFullscreen()\n\t} else {\n\t\tawait requestFullscreen(el)\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: FullscreenBinding | undefined): FullscreenOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { initialState: binding }\n\t}\n\n\treturn {\n\t\tinitialState: false,\n\t\ttoggleKey: 'Escape',\n\t\t...binding,\n\t}\n}\n\n/**\n * v-fullscreen directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-fullscreen>\n * Content to show in fullscreen\n * <button @click=\"toggleFullscreen\">Toggle</button>\n * </div>\n *\n * <div v-fullscreen=\"{ fullscreenClass: 'my-fullscreen' }\">\n * Custom fullscreen class\n * </div>\n * </template>\n * ```\n */\nexport const vFullscreen = defineDirective<FullscreenBinding, HTMLElement>({\n\tname: 'fullscreen',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!isBrowser() || !isFullscreenSupported()) return\n\n\t\tconst state: FullscreenState = {\n\t\t\toptions,\n\t\t\tclickHandler: () => toggleFullscreen(el, state),\n\t\t\tkeydownHandler: (e: KeyboardEvent) => {\n\t\t\t\tif (state.options.toggleKey === false) return\n\n\t\t\t\tif (e.key === state.options.toggleKey && state.isFullscreen) {\n\t\t\t\t\texitFullscreen()\n\t\t\t\t}\n\t\t\t},\n\t\t\tchangeHandler: () => {\n\t\t\t\tconst wasFullscreen = state.isFullscreen\n\t\t\t\tstate.isFullscreen = getFullscreenElement() === el\n\n\t\t\t\tif (wasFullscreen !== state.isFullscreen) {\n\t\t\t\t\tif (state.isFullscreen) {\n\t\t\t\t\t\tel.classList.add(state.options.fullscreenClass || 'v-fullscreen--active')\n\t\t\t\t\t\tstate.options.onEnter?.()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel.classList.remove(state.options.fullscreenClass || 'v-fullscreen--active')\n\t\t\t\t\t\tstate.options.onExit?.()\n\t\t\t\t\t}\n\t\t\t\t\tstate.options.onChange?.(state.isFullscreen)\n\t\t\t\t}\n\t\t\t},\n\t\t\tisFullscreen: false,\n\t\t}\n\n\t\t;(el as any).__fullscreen = state\n\n\t\t// Listen for fullscreen changes\n\t\tdocument.addEventListener('fullscreenchange', state.changeHandler)\n\t\tdocument.addEventListener('webkitfullscreenchange', state.changeHandler)\n\t\tdocument.addEventListener('mozfullscreenchange', state.changeHandler)\n\t\tdocument.addEventListener('MSFullscreenChange', state.changeHandler)\n\n\t\t// Add keyboard handler\n\t\tif (options.toggleKey !== false) {\n\t\t\tdocument.addEventListener('keydown', state.keydownHandler)\n\t\t}\n\n\t\t// Add toggle method to element\n\t\t;(el as any).toggleFullscreen = state.clickHandler\n\n\t\t// Enter fullscreen if initialState is true\n\t\tif (options.initialState) {\n\t\t\trequestFullscreen(el)\n\t\t}\n\n\t\t// Add base class\n\t\tel.classList.add('v-fullscreen')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: FullscreenState = (el as any).__fullscreen\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: FullscreenState = (el as any).__fullscreen\n\n\t\tif (!state) return\n\n\t\t// Exit fullscreen if currently active\n\t\tif (state.isFullscreen) {\n\t\t\texitFullscreen()\n\t\t}\n\n\t\t// Remove event listeners\n\t\tdocument.removeEventListener('fullscreenchange', state.changeHandler)\n\t\tdocument.removeEventListener('webkitfullscreenchange', state.changeHandler)\n\t\tdocument.removeEventListener('mozfullscreenchange', state.changeHandler)\n\t\tdocument.removeEventListener('MSFullscreenChange', state.changeHandler)\n\n\t\tif (state.options.toggleKey !== false) {\n\t\t\tdocument.removeEventListener('keydown', state.keydownHandler)\n\t\t}\n\n\t\tel.classList.remove('v-fullscreen')\n\t\tel.classList.remove(state.options.fullscreenClass || 'v-fullscreen--active')\n\n\t\tdelete (el as any).__fullscreen\n\t\tdelete (el as any).toggleFullscreen\n\t},\n})\n\nexport default vFullscreen\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Highlight directive options\n */\nexport interface HighlightOptions {\n\t/**\n\t * Keywords to highlight (string or array of strings)\n\t */\n\tkeywords: string | string[]\n\n\t/**\n\t * Highlight style class name\n\t * @default 'v-highlight'\n\t */\n\tclassName?: string\n\n\t/**\n\t * Inline style for highlighted text\n\t */\n\tstyle?: string\n\n\t/**\n\t * Whether to match case\n\t * @default false\n\t */\n\tcaseSensitive?: boolean\n\n\t/**\n\t * Whether to match whole words only\n\t * @default false\n\t */\n\twholeWord?: boolean\n\n\t/**\n\t * Tag name for highlight wrapper\n\t * @default 'mark'\n\t */\n\ttag?: string\n\n\t/**\n\t * Callback when highlight is applied\n\t */\n\tonHighlight?: (count: number) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type HighlightBinding = string | string[] | HighlightOptions\n\n/**\n * Element state storage\n */\ninterface HighlightState {\n\toptions: HighlightOptions\n\toriginalContent: string\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: HighlightBinding): HighlightOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { keywords: binding }\n\t}\n\n\tif (Array.isArray(binding)) {\n\t\treturn { keywords: binding }\n\t}\n\n\treturn {\n\t\tclassName: 'v-highlight',\n\t\tcaseSensitive: false,\n\t\twholeWord: false,\n\t\ttag: 'mark',\n\t\t...binding,\n\t}\n}\n\n/**\n * Escape regex special characters\n */\nfunction escapeRegex(str: string): string {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * Highlight keywords in text\n */\nfunction highlightKeywords(text: string, options: HighlightOptions): string {\n\tconst keywords = Array.isArray(options.keywords) ? options.keywords : [options.keywords]\n\n\tif (keywords.length === 0 || !text) {\n\t\treturn text\n\t}\n\n\tconst caseSensitive = options.caseSensitive || false\n\tconst wholeWord = options.wholeWord || false\n\tconst tag = options.tag || 'mark'\n\tconst className = options.className || 'v-highlight'\n\tconst style = options.style ? ` style=\"${options.style}\"` : ''\n\n\t// Sort keywords by length (longer first) to avoid nested highlights\n\tkeywords.sort((a, b) => b.length - a.length)\n\n\tlet result = text\n\n\tfor (const keyword of keywords) {\n\t\tif (!keyword) continue\n\n\t\tconst escapedKeyword = escapeRegex(keyword)\n\t\tconst wordBoundary = wholeWord ? '\\\\b' : ''\n\t\tconst flags = caseSensitive ? 'g' : 'gi'\n\t\tconst pattern = new RegExp(`${wordBoundary}${escapedKeyword}${wordBoundary}`, flags)\n\n\t\tresult = result.replace(pattern, `<${tag} class=\"${className}\"${style}>$&</${tag}>`)\n\t}\n\n\treturn result\n}\n\n/**\n * Check if element contains only text (no nested elements)\n */\nfunction isTextNodeOnly(element: HTMLElement): boolean {\n\tfor (const child of element.childNodes) {\n\t\tif (child.nodeType === Node.ELEMENT_NODE) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n/**\n * v-highlight directive\n *\n * @example\n * ```vue\n * <template>\n * <p v-highlight=\"'important'\">This is an important message.</p>\n *\n * <p v-highlight=\"['Vue', 'React']\">Vue and React are popular frameworks.</p>\n *\n * <p v-highlight=\"{\n * keywords: 'highlight',\n * className: 'my-highlight',\n * style: 'background: yellow; color: black;',\n * caseSensitive: true\n * }\">\n * This will highlight the word.\n * </p>\n * </template>\n * ```\n */\nexport const vHighlight = defineDirective<HighlightBinding, HTMLElement>({\n\tname: 'highlight',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!options.keywords || (Array.isArray(options.keywords) && options.keywords.length === 0)) {\n\t\t\treturn\n\t\t}\n\n\t\t// Store original content\n\t\tconst state: HighlightState = {\n\t\t\toptions,\n\t\t\toriginalContent: el.innerHTML,\n\t\t}\n\n\t\t;(el as any).__highlight = state\n\n\t\t// Apply highlight\n\t\tapplyHighlight(el, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: HighlightState = (el as any).__highlight\n\n\t\tif (!state) {\n\t\t\t// New highlight\n\t\t\tconst options = normalizeOptions(binding.value)\n\t\t\tif (options.keywords) {\n\t\t\t\tconst newState: HighlightState = {\n\t\t\t\t\toptions,\n\t\t\t\t\toriginalContent: el.innerHTML,\n\t\t\t\t}\n\t\t\t\t;(el as any).__highlight = newState\n\t\t\t\tapplyHighlight(el, newState)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Check if keywords changed\n\t\tconst oldKeywords = Array.isArray(state.options.keywords) ? state.options.keywords.join(',') : state.options.keywords\n\t\tconst newKeywords = Array.isArray(newOptions.keywords) ? newOptions.keywords.join(',') : newOptions.keywords\n\n\t\tif (oldKeywords !== newKeywords || JSON.stringify(state.options) !== JSON.stringify(newOptions)) {\n\t\t\t// Restore original content first\n\t\t\tel.innerHTML = state.originalContent\n\t\t\tstate.options = newOptions\n\t\t\tstate.originalContent = el.innerHTML\n\t\t\tapplyHighlight(el, state)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: HighlightState = (el as any).__highlight\n\n\t\tif (!state) return\n\n\t\t// Restore original content\n\t\tel.innerHTML = state.originalContent\n\n\t\tdelete (el as any).__highlight\n\t},\n})\n\n/**\n * Apply highlight to element\n */\nfunction applyHighlight(el: HTMLElement, state: HighlightState): void {\n\t// For text-only elements, we can use innerHTML\n\tif (isTextNodeOnly(el)) {\n\t\tconst highlighted = highlightKeywords(state.originalContent, state.options)\n\t\tel.innerHTML = highlighted\n\n\t\t// Count highlights\n\t\tconst count = el.querySelectorAll(state.options.tag || 'mark').length\n\t\tstate.options.onHighlight?.(count)\n\t} else {\n\t\t// For elements with nested elements, we need to process text nodes\n\t\tprocessTextNodes(el, state)\n\t}\n}\n\n/**\n * Process text nodes in element tree\n */\nfunction processTextNodes(element: HTMLElement, state: HighlightState): void {\n\tconst walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null)\n\n\t// Collect all text nodes\n\tconst textNodes: Text[] = []\n\tlet node = walker.nextNode() as Text | null,\n\t\thighlightCount = 0\n\n\twhile (node) {\n\t\t// Skip text nodes inside our highlight tags\n\t\tif ((node.parentNode as Element)?.tagName?.toLowerCase() === (state.options.tag || 'mark').toLowerCase()) {\n\t\t\tnode = walker.nextNode() as Text | null\n\t\t\tcontinue\n\t\t}\n\t\ttextNodes.push(node)\n\t\tnode = walker.nextNode() as Text | null\n\t}\n\n\t// Process each text node\n\tfor (const textNode of textNodes) {\n\t\tconst text = textNode.textContent || ''\n\t\tconst highlighted = highlightKeywords(text, state.options)\n\n\t\tif (highlighted !== text) {\n\t\t\t// Create a temporary container to parse the HTML\n\t\t\tconst temp = document.createElement('span')\n\t\t\ttemp.innerHTML = highlighted\n\n\t\t\t// Replace text node with highlighted content\n\t\t\tconst parent = textNode.parentNode\n\t\t\tif (parent) {\n\t\t\t\tparent.insertBefore(temp, textNode)\n\t\t\t\tparent.removeChild(textNode)\n\n\t\t\t\t// Unwrap the span if it's a direct child\n\t\t\t\twhile (temp.firstChild) {\n\t\t\t\t\tparent.insertBefore(temp.firstChild, temp)\n\t\t\t\t}\n\t\t\t\tparent.removeChild(temp)\n\t\t\t}\n\n\t\t\thighlightCount += element.querySelectorAll(state.options.tag || 'mark').length\n\t\t}\n\t}\n\n\tstate.options.onHighlight?.(highlightCount)\n}\n\nexport default vHighlight\n", "import { defineDirective } from '@directix/core'\n\nexport type HotkeyHandler = (event: KeyboardEvent) => void\n\nexport type ModifierKey = 'ctrl' | 'alt' | 'shift' | 'meta'\n\nexport interface HotkeyDefinition {\n\tkey: string\n\tmodifiers?: ModifierKey[]\n\thandler: HotkeyHandler\n\tprevent?: boolean\n\tstop?: boolean\n\tdisabled?: boolean\n\tglobal?: boolean\n}\n\nexport type HotkeyBinding\n\t= | HotkeyHandler\n\t\t| HotkeyDefinition\n\t\t| HotkeyDefinition[]\n\t\t| Record<string, HotkeyHandler | HotkeyDefinition>\n\ninterface HotkeyEntry {\n\tkey: string\n\tmodifiers: Set<ModifierKey>\n\thandler: HotkeyHandler\n\tprevent: boolean\n\tstop: boolean\n\tdisabled: boolean\n}\n\ninterface HotkeyState {\n\tentries: HotkeyEntry[]\n\thandler: (event: KeyboardEvent) => void\n}\n\nconst KEY_ALIASES: Record<string, string> = {\n\tesc: 'escape',\n\tspace: ' ',\n\tup: 'arrowup',\n\tdown: 'arrowdown',\n\tleft: 'arrowleft',\n\tright: 'arrowright',\n\tenter: 'enter',\n\ttab: 'tab',\n\tdelete: 'delete',\n\tbackspace: 'backspace',\n\tinsert: 'insert',\n\thome: 'home',\n\tend: 'end',\n\tpagedown: 'pagedown',\n\tpageup: 'pageup',\n\tf1: 'f1',\n\tf2: 'f2',\n\tf3: 'f3',\n\tf4: 'f4',\n\tf5: 'f5',\n\tf6: 'f6',\n\tf7: 'f7',\n\tf8: 'f8',\n\tf9: 'f9',\n\tf10: 'f10',\n\tf11: 'f11',\n\tf12: 'f12',\n}\n\nconst MODIFIER_KEYS = new Set(['ctrl', 'alt', 'shift', 'meta'])\n\nfunction normalizeKey(key: string): string {\n\tconst lowerKey = key.toLowerCase()\n\treturn KEY_ALIASES[lowerKey] || lowerKey\n}\n\nfunction parseHotkeyString(hotkey: string): { key: string, modifiers: ModifierKey[] } {\n\tconst parts = hotkey.toLowerCase().split(/[+.]/)\n\tconst modifiers: ModifierKey[] = []\n\tlet key = ''\n\n\tfor (const part of parts) {\n\t\tif (MODIFIER_KEYS.has(part)) {\n\t\t\tmodifiers.push(part as ModifierKey)\n\t\t} else {\n\t\t\tkey = normalizeKey(part)\n\t\t}\n\t}\n\n\treturn { key, modifiers }\n}\n\nfunction matchesHotkey(event: KeyboardEvent, entry: HotkeyEntry): boolean {\n\tif (normalizeKey(event.key) !== entry.key) return false\n\n\tconst eventModifiers = new Set<ModifierKey>()\n\tif (event.ctrlKey) eventModifiers.add('ctrl')\n\tif (event.altKey) eventModifiers.add('alt')\n\tif (event.shiftKey) eventModifiers.add('shift')\n\tif (event.metaKey) eventModifiers.add('meta')\n\n\tif (eventModifiers.size !== entry.modifiers.size) return false\n\n\tfor (const mod of entry.modifiers) {\n\t\tif (!eventModifiers.has(mod)) return false\n\t}\n\n\treturn true\n}\n\nfunction createEntry(\n\tkey: string,\n\tmodifiers: ModifierKey[],\n\thandler: HotkeyHandler,\n\toptions: { prevent?: boolean, stop?: boolean, disabled?: boolean } = {},\n): HotkeyEntry {\n\treturn {\n\t\tkey: normalizeKey(key),\n\t\tmodifiers: new Set(modifiers),\n\t\thandler,\n\t\tprevent: options.prevent ?? true,\n\t\tstop: options.stop ?? true,\n\t\tdisabled: options.disabled ?? false,\n\t}\n}\n\nfunction normalizeBinding(\n\tbinding: HotkeyBinding,\n\targ: string | undefined,\n\tmodifiers: Record<string, boolean>,\n): HotkeyEntry[] {\n\t// Argument syntax: v-hotkey:ctrl.s=\"handler\" or v-hotkey:escape=\"handler\"\n\tif (arg) {\n\t\tconst argLower = arg.toLowerCase()\n\t\tconst argIsModifier = MODIFIER_KEYS.has(argLower)\n\n\t\tlet key: string\n\t\tconst parsedModifiers: ModifierKey[] = []\n\n\t\tif (argIsModifier) {\n\t\t\t// v-hotkey:ctrl.s -> arg is modifier, key in directive modifiers\n\t\t\tparsedModifiers.push(argLower as ModifierKey)\n\t\t\tfor (const mod of Object.keys(modifiers)) {\n\t\t\t\tconst modLower = mod.toLowerCase()\n\t\t\t\tif (MODIFIER_KEYS.has(modLower)) {\n\t\t\t\t\tparsedModifiers.push(modLower as ModifierKey)\n\t\t\t\t} else {\n\t\t\t\t\tkey = normalizeKey(mod)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// v-hotkey:escape -> arg is the key\n\t\t\tconst parsed = parseHotkeyString(arg)\n\t\t\tkey = parsed.key\n\t\t\tparsedModifiers.push(...parsed.modifiers)\n\t\t\tfor (const mod of Object.keys(modifiers)) {\n\t\t\t\tconst modLower = mod.toLowerCase()\n\t\t\t\tif (MODIFIER_KEYS.has(modLower)) {\n\t\t\t\t\tparsedModifiers.push(modLower as ModifierKey)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst handler = typeof binding === 'function' ? binding : (binding as HotkeyDefinition).handler\n\t\treturn [createEntry(key!, parsedModifiers, handler)]\n\t}\n\n\t// Function without arg - invalid\n\tif (typeof binding === 'function') {\n\t\tconsole.warn('[Directix] v-hotkey: hotkey definition required (use v-hotkey:ctrl.s=\"handler\")')\n\t\treturn []\n\t}\n\n\t// Array syntax: [{ key: 's', modifiers: ['ctrl'], handler }]\n\tif (Array.isArray(binding)) {\n\t\treturn binding.map(item =>\n\t\t\tcreateEntry(item.key, item.modifiers || [], item.handler, {\n\t\t\t\tprevent: item.prevent,\n\t\t\t\tstop: item.stop,\n\t\t\t\tdisabled: item.disabled,\n\t\t\t}),\n\t\t)\n\t}\n\n\t// Object syntax\n\tif (typeof binding === 'object' && binding !== null) {\n\t\t// Single HotkeyDefinition: { key: 's', handler }\n\t\tif ('handler' in binding && typeof binding.handler === 'function') {\n\t\t\tconst def = binding as HotkeyDefinition\n\t\t\treturn [createEntry(def.key, def.modifiers || [], def.handler, def)]\n\t\t}\n\n\t\t// Record syntax: { 'ctrl+s': handler }\n\t\tconst entries: HotkeyEntry[] = []\n\t\tfor (const [hotkeyStr, value] of Object.entries(binding)) {\n\t\t\tconst { key, modifiers: parsedModifiers } = parseHotkeyString(hotkeyStr)\n\t\t\tconst handler = typeof value === 'function' ? value : value.handler\n\t\t\tconst options = typeof value === 'object' ? value : {}\n\t\t\tentries.push(createEntry(key, parsedModifiers, handler, options))\n\t\t}\n\t\treturn entries\n\t}\n\n\treturn []\n}\n\nfunction createKeydownHandler(state: HotkeyState) {\n\treturn (event: KeyboardEvent) => {\n\t\tfor (const entry of state.entries) {\n\t\t\tif (entry.disabled) continue\n\t\t\tif (!matchesHotkey(event, entry)) continue\n\n\t\t\tif (entry.prevent) event.preventDefault()\n\t\t\tif (entry.stop) event.stopPropagation()\n\t\t\tentry.handler(event)\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunction setupState(el: HTMLElement, entries: HotkeyEntry[]): HotkeyState | null {\n\tif (entries.length === 0) return null\n\n\tconst state: HotkeyState = { entries, handler: null as any }\n\tstate.handler = createKeydownHandler(state)\n\n\tel.tabIndex = el.tabIndex || -1\n\tel.addEventListener('keydown', state.handler)\n\t;(el as any).__hotkey = state\n\n\treturn state\n}\n\nexport const vHotkey = defineDirective<HotkeyBinding, HTMLElement>({\n\tname: 'hotkey',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst entries = normalizeBinding(binding.value, binding.arg, binding.modifiers)\n\t\tsetupState(el, entries)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: HotkeyState | undefined = (el as any).__hotkey\n\t\tconst newEntries = normalizeBinding(binding.value, binding.arg, binding.modifiers)\n\n\t\tif (state) {\n\t\t\tstate.entries = newEntries\n\t\t} else {\n\t\t\tsetupState(el, newEntries)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: HotkeyState | undefined = (el as any).__hotkey\n\t\tif (!state) return\n\n\t\tel.removeEventListener('keydown', state.handler)\n\t\tdelete (el as any).__hotkey\n\t},\n})\n\nexport default vHotkey\n", "/**\n * Directive utilities - high-level helpers for directive implementations\n * Layer: Directive (depends on @directix/core and @directix/shared)\n *\n * This module provides utilities specifically designed for directive implementations,\n * building on top of the low-level utilities in @directix/shared.\n */\n\nimport type { DirectiveBinding } from '@directix/core'\nimport { parseTime } from '@directix/shared'\n\n// Re-export state management from shared for convenience\nexport { deleteState, getState, hasState, setState } from '@directix/shared'\n\n/**\n * Options for creating a normalizer\n */\nexport interface NormalizerOptions<T> {\n\t/** Default values */\n\tdefaults: T\n\t/** Key to use when binding is a function */\n\thandlerKey?: keyof T\n\t/** Key to use when binding is a string */\n\tvalueKey?: keyof T\n}\n\n/**\n * Create a normalize function for directive options\n * @param options - Normalizer configuration\n * @returns Normalize function\n *\n * @example\n * ```ts\n * const normalize = createNormalizer({\n * defaults: { capture: true, disabled: false },\n * handlerKey: 'handler'\n * })\n *\n * // Function binding\n * normalize(fn) // { handler: fn, capture: true, disabled: false }\n *\n * // Object binding\n * normalize({ capture: false }) // { capture: false, disabled: false }\n * ```\n */\nexport function createNormalizer<T extends Record<string, any>>(\n\toptions: NormalizerOptions<T>,\n): (binding: unknown) => T {\n\tconst { defaults, handlerKey, valueKey } = options\n\n\treturn (binding: unknown): T => {\n\t\t// Handle function binding\n\t\tif (typeof binding === 'function' && handlerKey) {\n\t\t\treturn { ...defaults, [handlerKey]: binding } as T\n\t\t}\n\n\t\t// Handle string binding\n\t\tif (typeof binding === 'string' && valueKey) {\n\t\t\treturn { ...defaults, [valueKey]: binding } as T\n\t\t}\n\n\t\t// Handle boolean binding (e.g., v-ripple=\"false\")\n\t\tif (typeof binding === 'boolean') {\n\t\t\treturn { ...defaults, disabled: !binding } as T\n\t\t}\n\n\t\t// Handle object binding\n\t\tif (binding && typeof binding === 'object') {\n\t\t\treturn { ...defaults, ...binding } as T\n\t\t}\n\n\t\t// Return defaults for undefined/null\n\t\treturn { ...defaults } as T\n\t}\n}\n\n/**\n * Simple normalize function for common handler pattern\n * @param binding - Directive binding value\n * @param defaults - Default options\n * @returns Normalized options with handler\n *\n * @example\n * ```ts\n * // For directives like v-click-outside, v-long-press\n * normalizeHandlerOptions(fn, { disabled: false })\n * normalizeHandlerOptions({ handler: fn, disabled: true }, { disabled: false })\n * ```\n */\nexport function normalizeHandlerOptions<T extends { handler?: (...args: any[]) => any }>(\n\tbinding: ((...args: any[]) => any) | T | undefined,\n\tdefaults: Omit<T, 'handler'> & Partial<Pick<T, 'handler'>>,\n): T {\n\tif (typeof binding === 'function') {\n\t\treturn { ...defaults, handler: binding } as T\n\t}\n\treturn { ...defaults, ...binding } as T\n}\n\n/**\n * Normalize options with time parsing from directive argument\n * @param binding - Directive binding value\n * @param directiveBinding - Full directive binding with arg\n * @param defaults - Default options\n * @returns Normalized options with parsed time\n *\n * @example\n * ```ts\n * // v-debounce:500=\"handler\" or v-debounce:1s=\"handler\"\n * normalizeTimeOptions(binding, binding, { wait: 300, handler: fn })\n * ```\n */\nexport function normalizeTimeOptions<T extends { handler?: (...args: any[]) => any, wait?: number }>(\n\tbinding: ((...args: any[]) => any) | T | undefined,\n\tdirectiveBinding: DirectiveBinding<any>,\n\tdefaults: Omit<T, 'handler'> & { wait: number },\n): T {\n\tconst wait = parseTime(directiveBinding.arg) || defaults.wait\n\n\tif (typeof binding === 'function') {\n\t\treturn { ...defaults, handler: binding, wait } as T\n\t}\n\n\treturn { ...defaults, ...binding, wait: binding?.wait ?? wait } as T\n}\n\n/**\n * Timer manager interface\n */\nexport interface TimerManager {\n\t/**\n\t * Set a timeout (tracked for cleanup)\n\t */\n\tsetTimeout: (fn: () => void, delay: number) => ReturnType<typeof setTimeout>\n\n\t/**\n\t * Clear a specific timeout\n\t */\n\tclearTimeout: (id: ReturnType<typeof setTimeout>) => void\n\n\t/**\n\t * Set an interval (tracked for cleanup)\n\t */\n\tsetInterval: (fn: () => void, delay: number) => ReturnType<typeof setInterval>\n\n\t/**\n\t * Clear a specific interval\n\t */\n\tclearInterval: (id: ReturnType<typeof setInterval>) => void\n\n\t/**\n\t * Clear all tracked timers\n\t */\n\tclearAll: () => void\n\n\t/**\n\t * Check if there are any active timers\n\t */\n\thasActive: () => boolean\n}\n\n/**\n * Timer manager for directives that use setTimeout/setInterval\n * Automatically tracks and cleans up timers\n *\n * @example\n * ```ts\n * const timer = useTimer()\n *\n * timer.setTimeout(() => {}, 1000)\n * timer.setInterval(() => {}, 500)\n *\n * // Clean up all timers on unmount\n * timer.clearAll()\n * ```\n */\nexport function useTimer(): TimerManager {\n\tconst timeouts = new Set<ReturnType<typeof setTimeout>>()\n\tconst intervals = new Set<ReturnType<typeof setInterval>>()\n\n\treturn {\n\t\t/**\n\t\t * Set a timeout (tracked for cleanup)\n\t\t */\n\t\tsetTimeout(fn: () => void, delay: number): ReturnType<typeof setTimeout> {\n\t\t\tconst id = setTimeout(() => {\n\t\t\t\ttimeouts.delete(id)\n\t\t\t\tfn()\n\t\t\t}, delay)\n\t\t\ttimeouts.add(id)\n\t\t\treturn id\n\t\t},\n\n\t\t/**\n\t\t * Clear a specific timeout\n\t\t */\n\t\tclearTimeout(id: ReturnType<typeof setTimeout>): void {\n\t\t\tclearTimeout(id)\n\t\t\ttimeouts.delete(id)\n\t\t},\n\n\t\t/**\n\t\t * Set an interval (tracked for cleanup)\n\t\t */\n\t\tsetInterval(fn: () => void, delay: number): ReturnType<typeof setInterval> {\n\t\t\tconst id = setInterval(fn, delay)\n\t\t\tintervals.add(id)\n\t\t\treturn id\n\t\t},\n\n\t\t/**\n\t\t * Clear a specific interval\n\t\t */\n\t\tclearInterval(id: ReturnType<typeof setInterval>): void {\n\t\t\tclearInterval(id)\n\t\t\tintervals.delete(id)\n\t\t},\n\n\t\t/**\n\t\t * Clear all tracked timers\n\t\t */\n\t\tclearAll(): void {\n\t\t\ttimeouts.forEach(id => clearTimeout(id))\n\t\t\tintervals.forEach(id => clearInterval(id))\n\t\t\ttimeouts.clear()\n\t\t\tintervals.clear()\n\t\t},\n\n\t\t/**\n\t\t * Check if there are any active timers\n\t\t */\n\t\thasActive(): boolean {\n\t\t\treturn timeouts.size > 0 || intervals.size > 0\n\t\t},\n\t}\n}\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { bindEvents, deleteState, getState, setState } from '@directix/shared'\nimport { useTimer } from '../utils/directive'\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\ttimer: ReturnType<typeof useTimer>\n\tcleanup: (() => void) | null\n}\n\nconst STATE_KEY = 'hover'\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 * 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\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 timer = useTimer()\n\t\tlet isHovering = false\n\n\t\tconst state: HoverState = {\n\t\t\toptions,\n\t\t\tisHovering: false,\n\t\t\ttimer,\n\t\t\tcleanup: null,\n\t\t}\n\n\t\t// Enter handler\n\t\tconst enterHandler = (e: Event): void => {\n\t\t\tconst event = e as MouseEvent\n\n\t\t\t// Clear leave timer if exists\n\t\t\ttimer.clearAll()\n\n\t\t\t// If already hovering, do nothing\n\t\t\tif (isHovering) return\n\n\t\t\t// Handle enter delay\n\t\t\tif (options.enterDelay && options.enterDelay > 0) {\n\t\t\t\ttimer.setTimeout(() => {\n\t\t\t\t\tisHovering = true\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\tisHovering = true\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\tconst leaveHandler = (e: Event): void => {\n\t\t\tconst event = e as MouseEvent\n\n\t\t\t// Clear enter timer if exists\n\t\t\ttimer.clearAll()\n\n\t\t\t// If not hovering, do nothing\n\t\t\tif (!isHovering) return\n\n\t\t\t// Handle leave delay\n\t\t\tif (options.leaveDelay && options.leaveDelay > 0) {\n\t\t\t\ttimer.setTimeout(() => {\n\t\t\t\t\tisHovering = false\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\tisHovering = false\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// Bind events using bindEvents helper\n\t\tstate.cleanup = bindEvents(el, {\n\t\t\tmouseenter: enterHandler,\n\t\t\tmouseleave: leaveHandler,\n\t\t})\n\n\t\tsetState(el, STATE_KEY, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = getState<HTMLElement, HoverState>(el, STATE_KEY)\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\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 = getState<HTMLElement, HoverState>(el, STATE_KEY)\n\n\t\tif (!state) return\n\n\t\t// Clear timers\n\t\tstate.timer.clearAll()\n\n\t\t// Unbind events\n\t\tstate.cleanup?.()\n\n\t\t// Remove class\n\t\tel.classList.remove(state.options.class || 'v-hover')\n\n\t\tdeleteState(el, STATE_KEY)\n\t},\n})\n\nexport default vHover\n", "import { defineDirective } from '@directix/core'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Image preview options\n */\nexport interface ImagePreviewOptions {\n\t/** Image source URL */\n\tsrc?: string\n\t/** Preview image source URL (higher resolution) */\n\tpreviewSrc?: string\n\t/** Alt text for accessibility */\n\talt?: string\n\t/** Whether preview is disabled @default false */\n\tdisabled?: boolean\n\t/** Close on click outside @default true */\n\tcloseOnClickOutside?: boolean\n\t/** Close on escape key @default true */\n\tcloseOnEsc?: boolean\n\t/** Show close button @default true */\n\tshowCloseButton?: boolean\n\t/** Z-index of the preview overlay @default 9999 */\n\tzIndex?: number\n\t/** Custom class for the preview overlay */\n\tclass?: string\n\t/** Enable pinch zoom on mobile @default true */\n\tenablePinchZoom?: boolean\n\t/** Enable double tap to zoom @default true */\n\tenableDoubleTap?: boolean\n\t/** Enable swipe up to close @default true */\n\tenableSwipeClose?: boolean\n\t/** Show zoom indicator @default true */\n\tshowZoomIndicator?: boolean\n\t/** Minimum zoom scale @default 0.5 */\n\tminScale?: number\n\t/** Maximum zoom scale @default 5 */\n\tmaxScale?: number\n\t/** Callback when preview opens */\n\tonOpen?: () => void\n\t/** Callback when preview closes */\n\tonClose?: () => void\n}\n\nexport type ImagePreviewBinding = string | ImagePreviewOptions\n\ninterface TransformState {\n\tscale: number\n\ttranslateX: number\n\ttranslateY: number\n}\n\ninterface GestureState {\n\tisDragging: boolean\n\tstartX: number\n\tstartY: number\n\tstartDistance: number\n\tstartScale: number\n\tlastTapTime: number\n\tswipeStartY: number\n}\n\ninterface PreviewState {\n\toptions: ImagePreviewOptions\n\toverlay: HTMLElement | null\n\timageContainer: HTMLElement | null\n\timage: HTMLImageElement | null\n\tisOpen: boolean\n\ttransform: TransformState\n\tgesture: GestureState\n\thandlers: {\n\t\tclick: () => void\n\t\tesc: ((e: KeyboardEvent) => void) | null\n\t\ttouchStart: ((e: TouchEvent) => void) | null\n\t\ttouchMove: ((e: TouchEvent) => void) | null\n\t\ttouchEnd: ((e: TouchEvent) => void) | null\n\t\tmouseDown: ((e: MouseEvent) => void) | null\n\t\tmouseMove: ((e: MouseEvent) => void) | null\n\t\tmouseUp: ((e: MouseEvent) => void) | null\n\t\twheel: ((e: WheelEvent) => void) | null\n\t}\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULTS = {\n\tminScale: 0.5,\n\tmaxScale: 5,\n\tdoubleTapZoom: 2.5,\n\tswipeThreshold: 100,\n\ttapTimeout: 300,\n\tanimationDuration: 300,\n\thintDuration: 3000,\n\tzoomIndicatorDuration: 1500,\n} as const\n\nlet globalZIndex = 9999\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction getDistance(x1: number, y1: number, x2: number, y2: number): number {\n\treturn Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n\treturn Math.max(min, Math.min(max, value))\n}\n\n// ============================================================================\n// UI Components\n// ============================================================================\n\nfunction createOverlay(options: ImagePreviewOptions): {\n\toverlay: HTMLElement\n\timageContainer: HTMLElement\n\timage: HTMLImageElement\n} {\n\tconst zIndex = options.zIndex ?? ++globalZIndex\n\n\t// Main overlay\n\tconst overlay = document.createElement('div')\n\toverlay.className = 'v-image-preview-overlay'\n\tif (options.class) overlay.classList.add(options.class)\n\n\tObject.assign(overlay.style, {\n\t\tposition: 'fixed',\n\t\tinset: '0',\n\t\tbackground: 'rgba(0, 0, 0, 0.95)',\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tzIndex: String(zIndex),\n\t\tcursor: 'zoom-out',\n\t\topacity: '0',\n\t\ttransition: 'opacity 0.3s',\n\t\ttouchAction: 'none',\n\t\toverflow: 'hidden',\n\t})\n\n\t// Image container\n\tconst imageContainer = document.createElement('div')\n\tObject.assign(imageContainer.style, {\n\t\tposition: 'relative',\n\t\ttransformOrigin: 'center center',\n\t\ttransition: 'transform 0.1s ease-out',\n\t\twillChange: 'transform',\n\t})\n\n\t// Image element\n\tconst image = document.createElement('img')\n\timage.src = options.previewSrc || options.src || ''\n\timage.alt = options.alt || ''\n\tObject.assign(image.style, {\n\t\tmaxWidth: '95vw',\n\t\tmaxHeight: '90vh',\n\t\tobjectFit: 'contain',\n\t\tcursor: 'grab',\n\t\tuserSelect: 'none',\n\t\tWebkitUserDrag: 'none',\n\t})\n\timage.addEventListener('dragstart', e => e.preventDefault())\n\n\timageContainer.appendChild(image)\n\n\t// Close button\n\tif (options.showCloseButton !== false) {\n\t\tconst closeBtn = document.createElement('button')\n\t\tcloseBtn.className = 'v-image-preview-close'\n\t\tcloseBtn.innerHTML = '\u00D7'\n\t\tcloseBtn.setAttribute('aria-label', 'Close preview')\n\n\t\tObject.assign(closeBtn.style, {\n\t\t\tposition: 'fixed',\n\t\t\ttop: '16px',\n\t\t\tright: '16px',\n\t\t\twidth: '44px',\n\t\t\theight: '44px',\n\t\t\tborder: 'none',\n\t\t\tbackground: 'rgba(255, 255, 255, 0.15)',\n\t\t\tcolor: 'white',\n\t\t\tfontSize: '28px',\n\t\t\tcursor: 'pointer',\n\t\t\tborderRadius: '50%',\n\t\t\ttransition: 'background 0.2s, transform 0.2s',\n\t\t\tzIndex: String(zIndex + 1),\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t\tjustifyContent: 'center',\n\t\t\tbackdropFilter: 'blur(10px)',\n\t\t\tWebkitBackdropFilter: 'blur(10px)',\n\t\t})\n\n\t\tconst setBtnStyle = (bg: string, scale: string): void => {\n\t\t\tcloseBtn.style.background = bg\n\t\t\tcloseBtn.style.transform = scale\n\t\t}\n\n\t\tcloseBtn.addEventListener('mouseenter', () => setBtnStyle('rgba(255, 255, 255, 0.25)', 'scale(1.1)'))\n\t\tcloseBtn.addEventListener('mouseleave', () => setBtnStyle('rgba(255, 255, 255, 0.15)', 'scale(1)'))\n\t\tcloseBtn.addEventListener('touchstart', () => setBtnStyle('rgba(255, 255, 255, 0.35)', 'scale(1.15)'), { passive: true })\n\t\tcloseBtn.addEventListener('touchend', () => setBtnStyle('rgba(255, 255, 255, 0.15)', 'scale(1)'), { passive: true })\n\n\t\toverlay.appendChild(closeBtn)\n\t}\n\n\t// Zoom indicator\n\tif (options.showZoomIndicator !== false) {\n\t\tconst zoomIndicator = document.createElement('div')\n\t\tzoomIndicator.className = 'v-image-preview-zoom'\n\t\tzoomIndicator.textContent = '100%'\n\n\t\tObject.assign(zoomIndicator.style, {\n\t\t\tposition: 'fixed',\n\t\t\tbottom: '24px',\n\t\t\tleft: '50%',\n\t\t\ttransform: 'translateX(-50%)',\n\t\t\tbackground: 'rgba(0, 0, 0, 0.6)',\n\t\t\tcolor: 'white',\n\t\t\tpadding: '8px 16px',\n\t\t\tborderRadius: '20px',\n\t\t\tfontSize: '14px',\n\t\t\tfontWeight: '500',\n\t\t\topacity: '0',\n\t\t\ttransition: 'opacity 0.3s',\n\t\t\tzIndex: String(zIndex + 1),\n\t\t\tbackdropFilter: 'blur(10px)',\n\t\t\tWebkitBackdropFilter: 'blur(10px)',\n\t\t})\n\n\t\toverlay.appendChild(zoomIndicator)\n\t}\n\n\t// Hint\n\tconst hint = document.createElement('div')\n\thint.className = 'v-image-preview-hint'\n\thint.textContent = 'Pinch to zoom \u2022 Double tap \u2022 Swipe up to close'\n\n\tObject.assign(hint.style, {\n\t\tposition: 'fixed',\n\t\tbottom: '60px',\n\t\tleft: '50%',\n\t\ttransform: 'translateX(-50%)',\n\t\tcolor: 'rgba(255, 255, 255, 0.6)',\n\t\tfontSize: '12px',\n\t\topacity: '1',\n\t\ttransition: 'opacity 0.5s',\n\t\tzIndex: String(zIndex + 1),\n\t\tpointerEvents: 'none',\n\t})\n\n\toverlay.appendChild(hint)\n\tsetTimeout(() => (hint.style.opacity = '0'), DEFAULTS.hintDuration)\n\n\toverlay.appendChild(imageContainer)\n\n\treturn { overlay, imageContainer, image }\n}\n\n// ============================================================================\n// Transform Helpers\n// ============================================================================\n\ninterface TransformManager {\n\tupdateTransform: (animate?: boolean) => void\n\tresetTransform: () => void\n\tconstrainScale: (newScale: number) => number\n\tconstrainTranslate: (x: number, y: number) => { x: number, y: number }\n}\n\nfunction createTransformManager(state: PreviewState): TransformManager {\n\tconst updateTransform = (animate = false): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tconst { scale, translateX, translateY } = state.transform\n\t\tstate.imageContainer.style.transition = animate ? 'transform 0.2s ease-out' : 'none'\n\t\tstate.imageContainer.style.transform = `translate(${translateX}px, ${translateY}px) scale(${scale})`\n\n\t\t// Update zoom indicator\n\t\tconst zoomIndicator = state.overlay?.querySelector('.v-image-preview-zoom') as HTMLElement | null\n\t\tif (zoomIndicator) {\n\t\t\tzoomIndicator.textContent = `${Math.round(scale * 100)}%`\n\t\t\tzoomIndicator.style.opacity = '1'\n\n\t\t\tclearTimeout((zoomIndicator as any)._hideTimer)\n\t\t\t;(zoomIndicator as any)._hideTimer = setTimeout(() => {\n\t\t\t\tzoomIndicator.style.opacity = '0'\n\t\t\t}, DEFAULTS.zoomIndicatorDuration)\n\t\t}\n\t}\n\n\tconst resetTransform = (): void => {\n\t\tstate.transform = { scale: 1, translateX: 0, translateY: 0 }\n\t\tupdateTransform(true)\n\t}\n\n\tconst constrainScale = (newScale: number): number => {\n\t\tconst { minScale = DEFAULTS.minScale, maxScale = DEFAULTS.maxScale } = state.options\n\t\treturn clamp(newScale, minScale, maxScale)\n\t}\n\n\tconst constrainTranslate = (x: number, y: number): { x: number, y: number } => {\n\t\tconst { scale } = state.transform\n\t\tif (!state.image || scale <= 1) return { x: 0, y: 0 }\n\n\t\tconst rect = state.image.getBoundingClientRect()\n\t\tconst maxX = (rect.width * (scale - 1)) / 2\n\t\tconst maxY = (rect.height * (scale - 1)) / 2\n\n\t\treturn {\n\t\t\tx: clamp(x, -maxX, maxX),\n\t\t\ty: clamp(y, -maxY, maxY),\n\t\t}\n\t}\n\n\treturn { updateTransform, resetTransform, constrainScale, constrainTranslate }\n}\n\n// ============================================================================\n// Gesture Handlers\n// ============================================================================\n\ninterface GestureHandlers {\n\thandleTouchStart: (e: TouchEvent) => void\n\thandleTouchMove: (e: TouchEvent) => void\n\thandleTouchEnd: (e: TouchEvent) => void\n\thandleMouseDown: (e: MouseEvent) => void\n\thandleMouseMove: (e: MouseEvent) => void\n\thandleMouseUp: () => void\n\thandleWheel: (e: WheelEvent) => void\n}\n\nfunction createGestureHandlers(\n\tstate: PreviewState,\n\ttransformManager: TransformManager,\n\tclosePreview: () => void,\n): GestureHandlers {\n\tconst { updateTransform, resetTransform, constrainScale, constrainTranslate } = transformManager\n\n\tconst handleTouchStart = (e: TouchEvent): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tconst now = Date.now()\n\t\tconst { gesture, transform, options } = state\n\n\t\tif (e.touches.length === 1) {\n\t\t\t// Double tap detection\n\t\t\tif (options.enableDoubleTap !== false && now - gesture.lastTapTime < DEFAULTS.tapTimeout) {\n\t\t\t\te.preventDefault()\n\t\t\t\ttransform.scale = transform.scale > 1 ? 1 : constrainScale(DEFAULTS.doubleTapZoom)\n\t\t\t\tgesture.lastTapTime = 0\n\t\t\t\tupdateTransform(true)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tgesture.lastTapTime = now\n\t\t\tgesture.isDragging = true\n\t\t\tgesture.startX = e.touches[0].clientX - transform.translateX\n\t\t\tgesture.startY = e.touches[0].clientY - transform.translateY\n\t\t\tgesture.swipeStartY = e.touches[0].clientY\n\t\t} else if (e.touches.length === 2 && options.enablePinchZoom !== false) {\n\t\t\tgesture.isDragging = false\n\t\t\tgesture.startDistance = getDistance(\n\t\t\t\te.touches[0].clientX,\n\t\t\t\te.touches[0].clientY,\n\t\t\t\te.touches[1].clientX,\n\t\t\t\te.touches[1].clientY,\n\t\t\t)\n\t\t\tgesture.startScale = transform.scale\n\t\t}\n\t}\n\n\tconst handleTouchMove = (e: TouchEvent): void => {\n\t\tif (!state.imageContainer) return\n\t\te.preventDefault()\n\n\t\tconst { gesture, transform, options } = state\n\n\t\tif (e.touches.length === 1 && gesture.isDragging) {\n\t\t\tconst newX = e.touches[0].clientX - gesture.startX\n\t\t\tconst newY = e.touches[0].clientY - gesture.startY\n\t\t\tconst constrained = constrainTranslate(newX, newY)\n\n\t\t\ttransform.translateX = constrained.x\n\t\t\ttransform.translateY = constrained.y\n\t\t\tupdateTransform(false)\n\t\t} else if (e.touches.length === 2 && options.enablePinchZoom !== false) {\n\t\t\tconst currentDistance = getDistance(\n\t\t\t\te.touches[0].clientX,\n\t\t\t\te.touches[0].clientY,\n\t\t\t\te.touches[1].clientX,\n\t\t\t\te.touches[1].clientY,\n\t\t\t)\n\n\t\t\ttransform.scale = constrainScale(gesture.startScale * (currentDistance / gesture.startDistance))\n\t\t\tupdateTransform(false)\n\t\t}\n\t}\n\n\tconst handleTouchEnd = (e: TouchEvent): void => {\n\t\tconst { gesture, transform, options } = state\n\t\tgesture.isDragging = false\n\n\t\t// Swipe up to close\n\t\tif (options.enableSwipeClose !== false && e.changedTouches.length === 1 && transform.scale <= 1) {\n\t\t\tconst deltaY = e.changedTouches[0].clientY - gesture.swipeStartY\n\t\t\tif (deltaY < -DEFAULTS.swipeThreshold) {\n\t\t\t\tclosePreview()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\t// Snap back if scale < 1\n\t\tif (transform.scale < 1) {\n\t\t\tresetTransform()\n\t\t}\n\t}\n\n\tconst handleMouseDown = (e: MouseEvent): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tstate.gesture.isDragging = true\n\t\tstate.gesture.startX = e.clientX - state.transform.translateX\n\t\tstate.gesture.startY = e.clientY - state.transform.translateY\n\t\tstate.imageContainer.style.cursor = 'grabbing'\n\t}\n\n\tconst handleMouseMove = (e: MouseEvent): void => {\n\t\tif (!state.gesture.isDragging || !state.imageContainer) return\n\n\t\tconst newX = e.clientX - state.gesture.startX\n\t\tconst newY = e.clientY - state.gesture.startY\n\t\tconst constrained = constrainTranslate(newX, newY)\n\n\t\tstate.transform.translateX = constrained.x\n\t\tstate.transform.translateY = constrained.y\n\t\tupdateTransform(false)\n\t}\n\n\tconst handleMouseUp = (): void => {\n\t\tstate.gesture.isDragging = false\n\t\tif (state.imageContainer) {\n\t\t\tstate.imageContainer.style.cursor = 'grab'\n\t\t}\n\t}\n\n\tconst handleWheel = (e: WheelEvent): void => {\n\t\tif (!state.imageContainer || state.options.enablePinchZoom === false) return\n\t\te.preventDefault()\n\n\t\tconst delta = e.deltaY > 0 ? 0.9 : 1.1\n\t\tstate.transform.scale = constrainScale(state.transform.scale * delta)\n\t\tupdateTransform(false)\n\n\t\t// Reset if too small\n\t\tif (state.transform.scale < 0.8) {\n\t\t\tsetTimeout(resetTransform, 100)\n\t\t}\n\t}\n\n\treturn { handleTouchStart, handleTouchMove, handleTouchEnd, handleMouseDown, handleMouseMove, handleMouseUp, handleWheel }\n}\n\n// ============================================================================\n// Normalize Options\n// ============================================================================\n\nfunction normalizeOptions(binding: ImagePreviewBinding, el: HTMLElement): ImagePreviewOptions {\n\tconst elSrc = el.tagName === 'IMG' ? (el as HTMLImageElement).src : undefined\n\tconst elPreviewSrc = el.getAttribute('data-preview') || undefined\n\tconst elAlt = el.tagName === 'IMG' ? (el as HTMLImageElement).alt : el.getAttribute('alt') || undefined\n\n\tif (typeof binding === 'string') {\n\t\treturn {\n\t\t\tsrc: binding,\n\t\t\tpreviewSrc: elPreviewSrc,\n\t\t\talt: elAlt,\n\t\t\tenablePinchZoom: true,\n\t\t\tenableDoubleTap: true,\n\t\t\tenableSwipeClose: true,\n\t\t\tshowZoomIndicator: true,\n\t\t\tshowCloseButton: true,\n\t\t\tcloseOnClickOutside: true,\n\t\t\tcloseOnEsc: true,\n\t\t\tminScale: DEFAULTS.minScale,\n\t\t\tmaxScale: DEFAULTS.maxScale,\n\t\t}\n\t}\n\n\treturn {\n\t\tsrc: binding?.src || elSrc,\n\t\tpreviewSrc: binding?.previewSrc || elPreviewSrc,\n\t\talt: binding?.alt || elAlt,\n\t\tdisabled: binding?.disabled ?? false,\n\t\tcloseOnClickOutside: binding?.closeOnClickOutside ?? true,\n\t\tcloseOnEsc: binding?.closeOnEsc ?? true,\n\t\tshowCloseButton: binding?.showCloseButton ?? true,\n\t\tzIndex: binding?.zIndex,\n\t\tclass: binding?.class,\n\t\tenablePinchZoom: binding?.enablePinchZoom ?? true,\n\t\tenableDoubleTap: binding?.enableDoubleTap ?? true,\n\t\tenableSwipeClose: binding?.enableSwipeClose ?? true,\n\t\tshowZoomIndicator: binding?.showZoomIndicator ?? true,\n\t\tminScale: binding?.minScale ?? DEFAULTS.minScale,\n\t\tmaxScale: binding?.maxScale ?? DEFAULTS.maxScale,\n\t\tonOpen: binding?.onOpen,\n\t\tonClose: binding?.onClose,\n\t}\n}\n\n// ============================================================================\n// Directive\n// ============================================================================\n\n/**\n * v-image-preview directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage -->\n * <img v-image-preview src=\"thumbnail.jpg\" data-preview=\"full.jpg\" />\n *\n * <!-- With options -->\n * <img v-image-preview=\"{ src: 'thumbnail.jpg', previewSrc: 'full.jpg' }\" />\n *\n * <!-- On non-img element -->\n * <div v-image-preview=\"{ src: 'image.jpg' }\">Click to preview</div>\n * </template>\n * ```\n */\nexport const vImagePreview = defineDirective<ImagePreviewBinding, HTMLElement>({\n\tname: 'image-preview',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, el)\n\n\t\tconst state: PreviewState = {\n\t\t\toptions,\n\t\t\toverlay: null,\n\t\t\timageContainer: null,\n\t\t\timage: null,\n\t\t\tisOpen: false,\n\t\t\ttransform: { scale: 1, translateX: 0, translateY: 0 },\n\t\t\tgesture: {\n\t\t\t\tisDragging: false,\n\t\t\t\tstartX: 0,\n\t\t\t\tstartY: 0,\n\t\t\t\tstartDistance: 0,\n\t\t\t\tstartScale: 1,\n\t\t\t\tlastTapTime: 0,\n\t\t\t\tswipeStartY: 0,\n\t\t\t},\n\t\t\thandlers: {\n\t\t\t\tclick: () => {},\n\t\t\t\tesc: null,\n\t\t\t\ttouchStart: null,\n\t\t\t\ttouchMove: null,\n\t\t\t\ttouchEnd: null,\n\t\t\t\tmouseDown: null,\n\t\t\t\tmouseMove: null,\n\t\t\t\tmouseUp: null,\n\t\t\t\twheel: null,\n\t\t\t},\n\t\t}\n\n\t\t;(el as any).__imagePreview = state\n\n\t\tif (options.disabled) return\n\t\tel.style.cursor = 'zoom-in'\n\n\t\t// Transform manager\n\t\tconst transformManager = createTransformManager(state)\n\n\t\t// Close preview\n\t\tconst closePreview = (): void => {\n\t\t\tif (!state.isOpen || !state.overlay) return\n\n\t\t\tstate.overlay.style.opacity = '0'\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!state.overlay) return\n\n\t\t\t\tstate.overlay.remove()\n\t\t\t\tstate.overlay = null\n\t\t\t\tstate.imageContainer = null\n\t\t\t\tstate.image = null\n\t\t\t\tstate.isOpen = false\n\t\t\t\tstate.transform = { scale: 1, translateX: 0, translateY: 0 }\n\t\t\t\tdocument.body.style.overflow = ''\n\n\t\t\t\t// Cleanup handlers\n\t\t\t\tconst { handlers } = state\n\t\t\t\tif (handlers.esc) document.removeEventListener('keydown', handlers.esc)\n\t\t\t\tif (handlers.touchStart) document.removeEventListener('touchstart', handlers.touchStart)\n\t\t\t\tif (handlers.touchMove) document.removeEventListener('touchmove', handlers.touchMove)\n\t\t\t\tif (handlers.touchEnd) document.removeEventListener('touchend', handlers.touchEnd)\n\t\t\t\tif (handlers.mouseDown) document.removeEventListener('mousedown', handlers.mouseDown)\n\t\t\t\tif (handlers.mouseMove) document.removeEventListener('mousemove', handlers.mouseMove)\n\t\t\t\tif (handlers.mouseUp) document.removeEventListener('mouseup', handlers.mouseUp)\n\t\t\t\tif (handlers.wheel) document.removeEventListener('wheel', handlers.wheel)\n\n\t\t\t\tstate.options.onClose?.()\n\t\t\t}, DEFAULTS.animationDuration)\n\t\t}\n\n\t\t// Gesture handlers\n\t\tconst gestureHandlers = createGestureHandlers(state, transformManager, closePreview)\n\n\t\t// Open preview\n\t\tconst openPreview = (): void => {\n\t\t\tif (state.isOpen || state.options.disabled) return\n\n\t\t\tconst { overlay, imageContainer, image } = createOverlay(state.options)\n\t\t\tstate.overlay = overlay\n\t\t\tstate.imageContainer = imageContainer\n\t\t\tstate.image = image\n\t\t\tstate.isOpen = true\n\n\t\t\tdocument.body.appendChild(overlay)\n\t\t\tdocument.body.style.overflow = 'hidden'\n\n\t\t\trequestAnimationFrame(() => (overlay.style.opacity = '1'))\n\n\t\t\t// Store handlers\n\t\t\tstate.handlers.touchStart = gestureHandlers.handleTouchStart\n\t\t\tstate.handlers.touchMove = gestureHandlers.handleTouchMove\n\t\t\tstate.handlers.touchEnd = gestureHandlers.handleTouchEnd\n\t\t\tstate.handlers.mouseDown = gestureHandlers.handleMouseDown\n\t\t\tstate.handlers.mouseMove = gestureHandlers.handleMouseMove\n\t\t\tstate.handlers.mouseUp = gestureHandlers.handleMouseUp\n\t\t\tstate.handlers.wheel = gestureHandlers.handleWheel\n\n\t\t\t// Touch events\n\t\t\toverlay.addEventListener('touchstart', gestureHandlers.handleTouchStart, { passive: false })\n\t\t\toverlay.addEventListener('touchmove', gestureHandlers.handleTouchMove, { passive: false })\n\t\t\toverlay.addEventListener('touchend', gestureHandlers.handleTouchEnd, { passive: true })\n\n\t\t\t// Mouse events\n\t\t\timage.addEventListener('mousedown', gestureHandlers.handleMouseDown)\n\t\t\tdocument.addEventListener('mousemove', gestureHandlers.handleMouseMove)\n\t\t\tdocument.addEventListener('mouseup', gestureHandlers.handleMouseUp)\n\n\t\t\t// Wheel zoom\n\t\t\toverlay.addEventListener('wheel', gestureHandlers.handleWheel, { passive: false })\n\n\t\t\t// Close button\n\t\t\toverlay.querySelector('.v-image-preview-close')?.addEventListener('click', e => {\n\t\t\t\te.stopPropagation()\n\t\t\t\tclosePreview()\n\t\t\t})\n\n\t\t\t// Click outside\n\t\t\tif (state.options.closeOnClickOutside !== false) {\n\t\t\t\toverlay.addEventListener('click', () => {\n\t\t\t\t\tif (state.transform.scale <= 1) {\n\t\t\t\t\t\tclosePreview()\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttransformManager.resetTransform()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Escape key\n\t\t\tif (state.options.closeOnEsc !== false) {\n\t\t\t\tstate.handlers.esc = e => {\n\t\t\t\t\tif (e.key === 'Escape') {\n\t\t\t\t\t\tstate.transform.scale > 1 ? transformManager.resetTransform() : closePreview()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdocument.addEventListener('keydown', state.handlers.esc)\n\t\t\t}\n\n\t\t\tstate.options.onOpen?.()\n\t\t}\n\n\t\tstate.handlers.click = openPreview\n\t\tel.addEventListener('click', openPreview)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__imagePreview as PreviewState | undefined\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value, el)\n\t\tel.style.cursor = state.options.disabled ? '' : 'zoom-in'\n\t},\n\n\tunmounted(el) {\n\t\tconst state = (el as any).__imagePreview as PreviewState | undefined\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handlers.click)\n\n\t\tif (state.isOpen && state.overlay) {\n\t\t\tstate.overlay.remove()\n\t\t\tdocument.body.style.overflow = ''\n\t\t}\n\n\t\tif (state.handlers.esc) document.removeEventListener('keydown', state.handlers.esc)\n\t\tif (state.handlers.touchStart) document.removeEventListener('touchstart', state.handlers.touchStart)\n\t\tif (state.handlers.touchMove) document.removeEventListener('touchmove', state.handlers.touchMove)\n\t\tif (state.handlers.touchEnd) document.removeEventListener('touchend', state.handlers.touchEnd)\n\t\tif (state.handlers.mouseDown) document.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\tif (state.handlers.mouseMove) document.removeEventListener('mousemove', state.handlers.mouseMove)\n\t\tif (state.handlers.mouseUp) document.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\tif (state.handlers.wheel) document.removeEventListener('wheel', state.handlers.wheel)\n\n\t\tdelete (el as any).__imagePreview\n\t},\n})\n\nexport default vImagePreview\n", "import { defineDirective, isBrowser, supportsIntersectionObserver } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\n/**\n * Infinite scroll handler\n */\nexport type InfiniteScrollHandler = () => void | Promise<void>\n\n/**\n * Infinite scroll directive options\n */\nexport interface InfiniteScrollOptions {\n\t/**\n\t * Handler to call when scrolling to bottom\n\t * @required\n\t */\n\thandler: InfiniteScrollHandler\n\n\t/**\n\t * Distance from bottom to trigger load (in pixels)\n\t * @default 0\n\t */\n\tdistance?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether currently loading\n\t * @default false\n\t */\n\tloading?: boolean\n\n\t/**\n\t * Whether to use IntersectionObserver (more efficient)\n\t * @default true\n\t */\n\tuseIntersection?: boolean\n\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 200\n\t */\n\tthrottle?: number\n\n\t/**\n\t * Custom scroll container\n\t */\n\tcontainer?: string | Element | null\n\n\t/**\n\t * Callback when load starts\n\t */\n\tonLoadStart?: () => void\n\n\t/**\n\t * Callback when load completes\n\t */\n\tonLoadEnd?: () => void\n\n\t/**\n\t * Callback on error\n\t */\n\tonError?: (error: Error) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type InfiniteScrollBinding = InfiniteScrollHandler | InfiniteScrollOptions\n\n/**\n * Element state storage\n */\ninterface InfiniteScrollState {\n\toptions: InfiniteScrollOptions\n\tscrollHandler: (e: Event) => void\n\tcontainer: Element | Window\n\tsentinel: HTMLDivElement | null\n\tobserver: IntersectionObserver | null\n\tthrottleTimer: ReturnType<typeof setTimeout> | null\n\tisLoading: boolean\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: InfiniteScrollBinding | undefined): InfiniteScrollOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, distance: 0, throttle: 200, useIntersection: true }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-infinite-scroll: handler is required')\n\t}\n\n\treturn {\n\t\tdistance: 0,\n\t\tdisabled: false,\n\t\tloading: false,\n\t\tuseIntersection: true,\n\t\tthrottle: 200,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-infinite-scroll directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-infinite-scroll=\"loadMore\" class=\"scroll-container\">\n * <div v-for=\"item in items\" :key=\"item.id\">{{ item.name }}</div>\n * </div>\n *\n * <div v-infinite-scroll=\"{ handler: loadMore, distance: 100, disabled: isLoading }\">\n * <div v-for=\"item in items\" :key=\"item.id\">{{ item.name }}</div>\n * </div>\n * </template>\n * ```\n */\nexport const vInfiniteScroll = defineDirective<InfiniteScrollBinding, HTMLElement>({\n\tname: 'infinite-scroll',\n\tssr: false,\n\tdefaults: {\n\t\tdistance: 0,\n\t\tdisabled: false,\n\t\tloading: false,\n\t\tuseIntersection: true,\n\t\tthrottle: 200,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Determine scroll container\n\t\tlet container: Element | Window\n\n\t\tif (options.container) {\n\t\t\tif (typeof options.container === 'string') {\n\t\t\t\tconst found = document.querySelector(options.container)\n\n\t\t\t\tcontainer = found || getScrollParent(el)\n\t\t\t} else {\n\t\t\t\tcontainer = options.container\n\t\t\t}\n\t\t} else {\n\t\t\tcontainer = getScrollParent(el)\n\t\t}\n\n\t\tconst state: InfiniteScrollState = {\n\t\t\toptions,\n\t\t\tcontainer,\n\t\t\tsentinel: null,\n\t\t\tobserver: null,\n\t\t\tthrottleTimer: null,\n\t\t\tisLoading: false,\n\t\t\tscrollHandler: async (_e: Event) => {\n\t\t\t\tif (state.isLoading || state.options.disabled || state.options.loading) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Throttle\n\t\t\t\tif (state.throttleTimer) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tstate.throttleTimer = setTimeout(() => {\n\t\t\t\t\tstate.throttleTimer = null\n\t\t\t\t}, options.throttle)\n\n\t\t\t\t// Check scroll position\n\t\t\t\tconst shouldLoad = checkShouldLoad(container, el, options.distance || 0)\n\n\t\t\t\tif (shouldLoad) {\n\t\t\t\t\tawait triggerLoad(state, el)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__infiniteScroll = state\n\n\t\t// Use IntersectionObserver if available and enabled\n\t\tif (options.useIntersection && supportsIntersectionObserver()) {\n\t\t\tsetupIntersectionObserver(el, state)\n\t\t} else {\n\t\t\t// Use scroll event listener\n\t\t\ton(container, 'scroll', state.scrollHandler, { passive: true })\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: InfiniteScrollState = (el as any).__infiniteScroll\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: InfiniteScrollState = (el as any).__infiniteScroll\n\n\t\tif (!state) return\n\n\t\t// Clear throttle timer\n\t\tif (state.throttleTimer) {\n\t\t\tclearTimeout(state.throttleTimer)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\t// Remove sentinel\n\t\tif (state.sentinel && state.sentinel.parentNode) {\n\t\t\tstate.sentinel.parentNode.removeChild(state.sentinel)\n\t\t}\n\n\t\t// Remove scroll listener\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\n\t\tdelete (el as any).__infiniteScroll\n\t},\n})\n\n/**\n * Check if should load more\n */\nfunction checkShouldLoad(container: Element | Window, _el: HTMLElement, distance: number): boolean {\n\tif (container === window) {\n\t\tconst scrollTop = window.scrollY || document.documentElement.scrollTop\n\t\tconst scrollHeight = document.documentElement.scrollHeight\n\t\tconst clientHeight = window.innerHeight\n\n\t\treturn scrollTop + clientHeight >= scrollHeight - distance\n\t}\n\n\tconst el = container as Element\n\tconst scrollTop = el.scrollTop\n\tconst scrollHeight = el.scrollHeight\n\tconst clientHeight = el.clientHeight\n\n\treturn scrollTop + clientHeight >= scrollHeight - distance\n}\n\n/**\n * Trigger load handler\n */\nasync function triggerLoad(state: InfiniteScrollState, el: HTMLElement): Promise<void> {\n\tstate.isLoading = true\n\tstate.options.onLoadStart?.()\n\n\tel.classList.add('v-infinite-scroll--loading')\n\n\ttry {\n\t\tawait state.options.handler()\n\t} catch (err) {\n\t\tstate.options.onError?.(err as Error)\n\t} finally {\n\t\tstate.isLoading = false\n\t\tstate.options.onLoadEnd?.()\n\t\tel.classList.remove('v-infinite-scroll--loading')\n\t}\n}\n\n/**\n * Setup IntersectionObserver\n */\nfunction setupIntersectionObserver(el: HTMLElement, state: InfiniteScrollState): void {\n\t// Create sentinel element\n\tconst sentinel = document.createElement('div')\n\n\tsentinel.className = 'v-infinite-scroll__sentinel'\n\tsentinel.style.cssText = `\n height: 1px;\n width: 100%;\n clear: both;\n `\n\n\tel.appendChild(sentinel)\n\tstate.sentinel = sentinel\n\n\t// Create observer\n\tstate.observer = new IntersectionObserver(\n\t\tasync entries => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tif (!state.isLoading && !state.options.disabled && !state.options.loading) {\n\t\t\t\t\t\tawait triggerLoad(state, el)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\troot: state.container === window ? null : (state.container as Element),\n\t\t\trootMargin: `${state.options.distance || 0}px`,\n\t\t\tthreshold: 0,\n\t\t},\n\t)\n\n\tstate.observer.observe(sentinel)\n}\n\nexport default vInfiniteScroll\n", "import { defineDirective, isBrowser, supportsIntersectionObserver } from '@directix/core'\n\n/**\n * Intersect event handler\n */\nexport type IntersectHandler = (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\n/**\n * Intersect directive options\n */\nexport interface IntersectOptions {\n\t/** Callback when element intersects */\n\thandler?: IntersectHandler\n\t/** Callback when element enters viewport */\n\tonEnter?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\t/** Callback when element leaves viewport */\n\tonLeave?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\t/** Callback when element changes intersection */\n\tonChange?: (isIntersecting: boolean, entry: IntersectionObserverEntry) => void\n\t/** Root element for intersection @default null (viewport) */\n\troot?: Element | null\n\t/** Margin around the root @default '0px' */\n\trootMargin?: string\n\t/** Threshold(s) at which to trigger callback @default 0 */\n\tthreshold?: number | number[]\n\t/** Whether to disable @default false */\n\tdisabled?: boolean\n\t/** Whether to trigger only once @default false */\n\tonce?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type IntersectBinding = IntersectHandler | IntersectOptions\n\n/**\n * Element state storage\n */\ninterface IntersectState {\n\toptions: IntersectOptions\n\tobserver: IntersectionObserver | null\n\thasTriggeredOnce: boolean\n}\n\nconst STATE_KEY = '__intersect'\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: IntersectBinding | undefined): IntersectOptions {\n\tconst options: IntersectOptions = typeof binding === 'function' ? { handler: binding } : { ...binding }\n\n\t// Unref root if it's a ref object (for Vue Composition API)\n\tif (options.root !== null && typeof options.root === 'object' && 'value' in options.root) {\n\t\toptions.root = (options.root as { value: Element | null }).value\n\t}\n\n\treturn options\n}\n\n/**\n * Create observer callback\n */\nfunction createObserverCallback(\n\tel: HTMLElement,\n\tstate: IntersectState,\n\toptions: IntersectOptions,\n): (entries: IntersectionObserverEntry[]) => void {\n\treturn entries => {\n\t\tfor (const entry of entries) {\n\t\t\tif (options.once && state.hasTriggeredOnce) continue\n\n\t\t\tconst { isIntersecting } = entry\n\n\t\t\toptions.handler?.(entry, state.observer!)\n\t\t\toptions.onChange?.(isIntersecting, entry)\n\n\t\t\tif (isIntersecting) {\n\t\t\t\toptions.onEnter?.(entry, state.observer!)\n\t\t\t\tif (options.once) state.hasTriggeredOnce = true\n\t\t\t} else {\n\t\t\t\toptions.onLeave?.(entry, state.observer!)\n\t\t\t}\n\n\t\t\tel.dispatchEvent(new CustomEvent('intersect', { detail: { isIntersecting, entry } }))\n\t\t}\n\t}\n}\n\n/**\n * Create IntersectionObserver\n */\nfunction createObserver(\n\tel: HTMLElement,\n\tstate: IntersectState,\n\toptions: IntersectOptions,\n): IntersectionObserver {\n\treturn new IntersectionObserver(createObserverCallback(el, state, options), {\n\t\troot: options.root,\n\t\trootMargin: options.rootMargin,\n\t\tthreshold: options.threshold,\n\t})\n}\n\n/**\n * v-intersect directive\n *\n * @example\n * ```vue\n * <div v-intersect=\"handleIntersect\">Observe me</div>\n * <div v-intersect=\"{ onEnter: handleEnter, onLeave: handleLeave }\">Track visibility</div>\n * <div v-intersect=\"{ threshold: 0.5, once: true }\">Trigger once at 50%</div>\n * ```\n */\nexport const vIntersect = defineDirective<IntersectBinding, HTMLElement>({\n\tname: 'intersect',\n\tssr: false,\n\tdefaults: {\n\t\tdisabled: false,\n\t\tonce: false,\n\t\trootMargin: '0px',\n\t\tthreshold: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser() || !supportsIntersectionObserver()) {\n\t\t\tif (!supportsIntersectionObserver()) {\n\t\t\t\tconsole.warn('[Directix] v-intersect: IntersectionObserver not supported')\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tconst state: IntersectState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t\thasTriggeredOnce: false,\n\t\t}\n\n\t\tstate.observer = createObserver(el, state, options)\n\t\t;(el as any)[STATE_KEY] = state\n\t\tstate.observer.observe(el)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: IntersectState | undefined = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst observerOptionsChanged\n\t\t\t= newOptions.root !== state.options.root\n\t\t\t\t|| newOptions.rootMargin !== state.options.rootMargin\n\t\t\t\t|| newOptions.threshold !== state.options.threshold\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled !== state.options.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\tstate.observer?.disconnect()\n\t\t\t} else {\n\t\t\t\tstate.observer?.observe(el)\n\t\t\t}\n\t\t}\n\n\t\t// Recreate observer if options changed\n\t\tif (observerOptionsChanged) {\n\t\t\tstate.observer?.disconnect()\n\t\t\tstate.observer = createObserver(el, state, newOptions)\n\t\t\tstate.observer.observe(el)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: IntersectState | undefined = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tstate.observer?.disconnect()\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vIntersect\n", "import { defineDirective, supportsIntersectionObserver } from '@directix/core'\n\n/**\n * Lazy loading state\n */\nexport type LazyState = 'pending' | 'loading' | 'loaded' | 'error'\n\n/**\n * Lazy directive options\n */\nexport interface LazyOptions {\n\t/**\n\t * Image source URL\n\t */\n\tsrc?: string\n\n\t/**\n\t * Placeholder image URL\n\t */\n\tplaceholder?: string\n\n\t/**\n\t * Error image URL (shown when loading fails)\n\t */\n\terror?: string\n\n\t/**\n\t * Preload distance in pixels\n\t * @default 0\n\t */\n\tpreload?: number\n\n\t/**\n\t * Callback when image loads successfully\n\t */\n\tonLoad?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when image fails to load\n\t */\n\tonError?: (el: HTMLElement, error: Error) => void\n\n\t/**\n\t * Number of retry attempts\n\t * @default 1\n\t */\n\tattempt?: number\n\n\t/**\n\t * Filter function, return false to skip loading\n\t */\n\tfilter?: (src: string) => boolean\n\n\t/**\n\t * Custom IntersectionObserver\n\t */\n\tobserver?: IntersectionObserver\n\n\t/**\n\t * Whether to disable lazy loading\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LazyBinding = string | LazyOptions\n\n/**\n * Element state storage\n */\ninterface LazyElementState {\n\toptions: LazyOptions\n\tattempt: number\n\tobserver?: IntersectionObserver\n}\n\n// Global observer instance\nlet globalObserver: IntersectionObserver | null = null\n\n/**\n * Get or create global IntersectionObserver\n */\nfunction getGlobalObserver(preload: number): IntersectionObserver {\n\tif (globalObserver) return globalObserver\n\n\tglobalObserver = new IntersectionObserver(\n\t\tentries => {\n\t\t\tentries.forEach(entry => {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tload(entry.target as HTMLElement)\n\t\t\t\t\tglobalObserver?.unobserve(entry.target)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\trootMargin: `${preload}px`,\n\t\t},\n\t)\n\n\treturn globalObserver\n}\n\n/**\n * Set image source on element\n */\nfunction setSrc(el: HTMLElement, src: string): void {\n\tif (el.tagName === 'IMG') {\n\t\t;(el as HTMLImageElement).src = src\n\t} else {\n\t\tel.style.backgroundImage = `url(\"${src}\")`\n\t}\n}\n\n/**\n * Set lazy state on element\n */\nfunction setLazyState(el: HTMLElement, state: LazyState): void {\n\tel.dataset.lazyState = state\n}\n\n/**\n * Get lazy state from element\n */\nfunction getLazyState(el: HTMLElement): LazyState {\n\treturn (el.dataset.lazyState as LazyState) || 'pending'\n}\n\n/**\n * Load image\n */\nfunction load(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state || !state.options.src) return\n\n\t// Filter check\n\tif (state.options.filter && !state.options.filter(state.options.src)) {\n\t\treturn\n\t}\n\n\tsetLazyState(el, 'loading')\n\tstate.attempt++\n\n\tel.classList.add('v-lazy--loading')\n\n\tconst img = new Image()\n\n\timg.onload = () => {\n\t\tsetSrc(el, state.options.src!)\n\t\tsetLazyState(el, 'loaded')\n\t\tel.classList.remove('v-lazy--loading')\n\t\tel.classList.add('v-lazy--loaded')\n\t\tstate.options.onLoad?.(el)\n\t}\n\n\timg.onerror = () => {\n\t\tel.classList.remove('v-lazy--loading')\n\n\t\t// Check if should retry\n\t\tif (state.attempt < (state.options.attempt || 1)) {\n\t\t\tsetTimeout(() => load(el), 1000 * state.attempt)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Show error image\n\t\tif (state.options.error) {\n\t\t\tsetSrc(el, state.options.error)\n\t\t}\n\n\t\tsetLazyState(el, 'error')\n\t\tel.classList.add('v-lazy--error')\n\t\tstate.options.onError?.(el, new Error('Failed to load image'))\n\t}\n\n\timg.src = state.options.src\n}\n\n/**\n * Observe element\n */\nfunction observe(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state) return\n\n\t// Check IntersectionObserver support\n\tif (!supportsIntersectionObserver()) {\n\t\t// Fallback: load directly\n\t\tload(el)\n\n\t\treturn\n\t}\n\n\t// Use custom observer or global observer\n\tif (state.options.observer) {\n\t\tstate.observer = state.options.observer\n\t\tstate.observer.observe(el)\n\t} else {\n\t\tconst observer = getGlobalObserver(state.options.preload || 0)\n\n\t\tstate.observer = observer\n\t\tobserver.observe(el)\n\t}\n}\n\n/**\n * Unobserve element\n */\nfunction unobserve(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state) return\n\n\tif (state.observer) {\n\t\tstate.observer.unobserve(el)\n\t} else if (globalObserver) {\n\t\tglobalObserver.unobserve(el)\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LazyBinding | undefined): LazyOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { src: binding }\n\t}\n\n\treturn binding || {}\n}\n\n/**\n * v-lazy directive\n *\n * @example\n * ```vue\n * <template>\n * <img v-lazy=\"imageUrl\" />\n * <img v-lazy=\"{ src: imageUrl, placeholder: 'placeholder.jpg' }\" />\n * <div v-lazy=\"backgroundImageUrl\"></div>\n * </template>\n * ```\n */\nexport const vLazy = defineDirective<LazyBinding, HTMLElement>({\n\tname: 'lazy',\n\tssr: false,\n\tdefaults: {\n\t\tpreload: 0,\n\t\tattempt: 1,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\tif (!options.src) {\n\t\t\tconsole.warn('[Directix] v-lazy: No source provided')\n\n\t\t\treturn\n\t\t}\n\n\t\t// Set initial state\n\t\tsetLazyState(el, 'pending')\n\n\t\t// Set placeholder\n\t\tif (options.placeholder) {\n\t\t\tsetSrc(el, options.placeholder)\n\t\t}\n\n\t\t// Add class\n\t\tel.classList.add('v-lazy')\n\n\t\t// Store state\n\t\tconst state: LazyElementState = {\n\t\t\toptions,\n\t\t\tattempt: 0,\n\t\t}\n\n\t\t;(el as any).__lazy = state\n\n\t\t// Start observing\n\t\tobserve(el)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LazyElementState = (el as any).__lazy\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (newOptions.disabled) {\n\t\t\tunobserve(el)\n\n\t\t\treturn\n\t\t}\n\n\t\tif (newOptions.src !== state.options.src) {\n\t\t\tstate.options = newOptions\n\t\t\tstate.attempt = 0\n\n\t\t\t// If already loaded, reload\n\t\t\tif (getLazyState(el) !== 'pending') {\n\t\t\t\tsetLazyState(el, 'pending')\n\t\t\t\tel.classList.remove('v-lazy--loaded', 'v-lazy--error')\n\n\t\t\t\tif (newOptions.placeholder) {\n\t\t\t\t\tsetSrc(el, newOptions.placeholder)\n\t\t\t\t}\n\n\t\t\t\tobserve(el)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tunobserve(el)\n\t\tdelete (el as any).__lazy\n\t},\n})\n\nexport default vLazy\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { ensurePosition } from '@directix/shared'\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\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\t// Ensure element has relative positioning\n\t\tensurePosition(el)\n\n\t\t// Show loading if value is true\n\t\tif (options.value) {\n\t\t\tshowLoading(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LoadingState = (el as any).__loading\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (newOptions.disabled) {\n\t\t\thideLoading(el, state)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Handle loading state change\n\t\tif (newOptions.value && !state.options.value) {\n\t\t\tshowLoading(el, state)\n\t\t} else if (!newOptions.value && state.options.value) {\n\t\t\thideLoading(el, state)\n\t\t}\n\n\t\t// Update text if changed\n\t\tif (state.loadingOverlay && newOptions.text !== state.options.text) {\n\t\t\tconst textEl = state.loadingOverlay.querySelector(`.${state.options.textClass}`)\n\n\t\t\tif (textEl) {\n\t\t\t\ttextEl.textContent = newOptions.text || ''\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LoadingState = (el as any).__loading\n\n\t\tif (!state) return\n\n\t\thideLoading(el, state)\n\n\t\t// Restore original styles\n\t\tel.style.position = state.originalPosition\n\t\tel.style.overflow = state.originalOverflow\n\n\t\tdelete (el as any).__loading\n\t},\n})\n\n/**\n * Show loading overlay\n */\nfunction showLoading(el: HTMLElement, state: LoadingState): void {\n\tif (state.loadingOverlay) return\n\n\t// Create and append overlay\n\tstate.loadingOverlay = createLoadingOverlay(state.options)\n\tel.appendChild(state.loadingOverlay)\n\n\t// Lock scroll if needed\n\tif (state.options.lock) {\n\t\tel.style.overflow = 'hidden'\n\t}\n\n\t// Add class\n\tel.classList.add('v-loading--active')\n}\n\n/**\n * Hide loading overlay\n */\nfunction hideLoading(el: HTMLElement, state: LoadingState): void {\n\tif (!state.loadingOverlay) return\n\n\t// Remove overlay\n\tstate.loadingOverlay.remove()\n\tstate.loadingOverlay = null\n\n\t// Restore scroll\n\tif (state.options.lock) {\n\t\tel.style.overflow = state.originalOverflow\n\t}\n\n\t// Remove class\n\tel.classList.remove('v-loading--active')\n}\n\nexport default vLoading\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { getEventPosition, off, on } from '@directix/shared'\n\n/**\n * Long press handler\n */\nexport type LongPressHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Long press directive options\n */\nexport interface LongPressOptions {\n\t/**\n\t * Callback when long press is triggered\n\t * @required\n\t */\n\thandler: LongPressHandler\n\n\t/**\n\t * Duration in milliseconds to trigger long press\n\t * @default 500\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Maximum movement distance before canceling\n\t * @default 10\n\t */\n\tdistance?: number\n\n\t/**\n\t * Callback when long press starts (on mousedown/touchstart)\n\t */\n\tonStart?: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Callback when long press is canceled\n\t */\n\tonCancel?: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Callback on each tick during long press\n\t */\n\tonTick?: (remaining: number) => void\n\n\t/**\n\t * Interval for onTick callback in milliseconds\n\t * @default 100\n\t */\n\ttickInterval?: number\n\n\t/**\n\t * Whether to prevent default behavior\n\t * @default true\n\t */\n\tprevent?: boolean\n\n\t/**\n\t * Whether to stop propagation\n\t * @default false\n\t */\n\tstop?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LongPressBinding = LongPressHandler | LongPressOptions\n\n/**\n * Element state storage\n */\ninterface LongPressState {\n\toptions: LongPressOptions\n\ttimerId: ReturnType<typeof setTimeout> | null\n\ttickTimerId: ReturnType<typeof setInterval> | null\n\tstartTime: number\n\tstartPos: { x: number, y: number }\n\tstartHandler: (e: Event) => void\n\tendHandler: (e: Event) => void\n\tmoveHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LongPressBinding | undefined): LongPressOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, duration: 500, distance: 10 }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-long-press: handler is required')\n\t}\n\n\treturn {\n\t\tduration: 500,\n\t\tdistance: 10,\n\t\tdisabled: false,\n\t\tprevent: true,\n\t\tstop: false,\n\t\ttickInterval: 100,\n\t\t...binding,\n\t}\n}\n\n/**\n * Calculate distance between two points\n */\nfunction getDistance(p1: { x: number, y: number }, p2: { x: number, y: number }): number {\n\treturn Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2)\n}\n\n/**\n * v-long-press directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-long-press=\"handleLongPress\">Long Press Me</button>\n * <button v-long-press=\"{ handler: handleLongPress, duration: 1000 }\">1 Second Press</button>\n * </template>\n * ```\n */\nexport const vLongPress = defineDirective<LongPressBinding, HTMLElement>({\n\tname: 'long-press',\n\tssr: false,\n\tdefaults: {\n\t\tduration: 500,\n\t\tdistance: 10,\n\t\tdisabled: false,\n\t\tprevent: true,\n\t\tstop: false,\n\t\ttickInterval: 100,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst state: LongPressState = {\n\t\t\toptions,\n\t\t\ttimerId: null,\n\t\t\ttickTimerId: null,\n\t\t\tstartTime: 0,\n\t\t\tstartPos: { x: 0, y: 0 },\n\t\t\tstartHandler: () => {},\n\t\t\tendHandler: () => {},\n\t\t\tmoveHandler: () => {},\n\t\t}\n\n\t\t// Start handler\n\t\tstate.startHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\n\t\t\t// Prevent context menu on long press\n\t\t\tif (options.prevent) {\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\n\t\t\tif (options.stop) {\n\t\t\t\tevent.stopPropagation()\n\t\t\t}\n\n\t\t\t// Clear any existing timer\n\t\t\tif (state.timerId) {\n\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\tstate.timerId = null\n\t\t\t}\n\n\t\t\tif (state.tickTimerId) {\n\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\tstate.tickTimerId = null\n\t\t\t}\n\n\t\t\t// Store start position\n\t\t\tconst pos = getEventPosition(event)\n\n\t\t\tstate.startPos = { x: pos.x, y: pos.y }\n\t\t\tstate.startTime = Date.now()\n\n\t\t\t// Trigger start callback\n\t\t\toptions.onStart?.(event)\n\n\t\t\t// Start tick timer\n\t\t\tif (options.onTick) {\n\t\t\t\tlet remaining = options.duration!\n\n\t\t\t\tstate.tickTimerId = setInterval(() => {\n\t\t\t\t\tremaining -= options.tickInterval!\n\t\t\t\t\toptions.onTick?.(Math.max(0, remaining))\n\t\t\t\t}, options.tickInterval)\n\t\t\t}\n\n\t\t\t// Start long press timer\n\t\t\tstate.timerId = setTimeout(() => {\n\t\t\t\tif (state.tickTimerId) {\n\t\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\t\tstate.tickTimerId = null\n\t\t\t\t}\n\t\t\t\toptions.handler(event)\n\t\t\t}, options.duration)\n\t\t}\n\n\t\t// End handler\n\t\tstate.endHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\n\t\t\tif (state.timerId) {\n\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\tstate.timerId = null\n\t\t\t}\n\n\t\t\tif (state.tickTimerId) {\n\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\tstate.tickTimerId = null\n\t\t\t}\n\n\t\t\t// Trigger cancel callback if was in progress\n\t\t\tif (state.startTime > 0) {\n\t\t\t\toptions.onCancel?.(event)\n\t\t\t}\n\n\t\t\tstate.startTime = 0\n\t\t}\n\n\t\t// Move handler - cancel if moved too far\n\t\tstate.moveHandler = (e: Event) => {\n\t\t\tif (!state.timerId) return\n\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\t\t\tconst pos = getEventPosition(event)\n\t\t\tconst distance = getDistance(state.startPos, { x: pos.x, y: pos.y })\n\n\t\t\tif (distance > (options.distance || 10)) {\n\t\t\t\tif (state.timerId) {\n\t\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\t\tstate.timerId = null\n\t\t\t\t}\n\n\t\t\t\tif (state.tickTimerId) {\n\t\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\t\tstate.tickTimerId = null\n\t\t\t\t}\n\n\t\t\t\toptions.onCancel?.(event)\n\t\t\t\tstate.startTime = 0\n\t\t\t}\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__longPress = state\n\n\t\t// Bind events - mouse\n\t\ton(el, 'mousedown', state.startHandler)\n\t\ton(el, 'mouseup', state.endHandler)\n\t\ton(el, 'mouseleave', state.endHandler)\n\t\ton(el, 'mousemove', state.moveHandler)\n\n\t\t// Bind events - touch\n\t\ton(el, 'touchstart', state.startHandler, { passive: !options.prevent })\n\t\ton(el, 'touchend', state.endHandler)\n\t\ton(el, 'touchcancel', state.endHandler)\n\t\ton(el, 'touchmove', state.moveHandler, { passive: true })\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LongPressState = (el as any).__longPress\n\n\t\tif (!state) {\n\t\t\t// Re-initialize if not exists\n\t\t\tconst options = normalizeOptions(binding.value)\n\n\t\t\tif (!options.disabled) {\n\t\t\t\t// Re-mount by clearing and re-setting\n\t\t\t\t;(el as any).__longPress = null\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LongPressState = (el as any).__longPress\n\n\t\tif (!state) return\n\n\t\t// Clear timers\n\t\tif (state.timerId) {\n\t\t\tclearTimeout(state.timerId)\n\t\t}\n\n\t\tif (state.tickTimerId) {\n\t\t\tclearInterval(state.tickTimerId)\n\t\t}\n\n\t\t// Unbind events - mouse\n\t\toff(el, 'mousedown', state.startHandler)\n\t\toff(el, 'mouseup', state.endHandler)\n\t\toff(el, 'mouseleave', state.endHandler)\n\t\toff(el, 'mousemove', state.moveHandler)\n\n\t\t// Unbind events - touch\n\t\toff(el, 'touchstart', state.startHandler)\n\t\toff(el, 'touchend', state.endHandler)\n\t\toff(el, 'touchcancel', state.endHandler)\n\t\toff(el, 'touchmove', state.moveHandler)\n\n\t\tdelete (el as any).__longPress\n\t},\n})\n\nexport default vLongPress\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Lottie animation state type\n */\nexport type LottieAnimationState = 'playing' | 'paused' | 'stopped'\n\n/**\n * Lottie directive options\n */\nexport interface LottieOptions {\n\t/**\n\t * Animation data (JSON) or URL to animation file\n\t */\n\tanimationData: object | string\n\n\t/**\n\t * Whether to autoplay\n\t * @default true\n\t */\n\tautoplay?: boolean\n\n\t/**\n\t * Whether to loop\n\t * @default true\n\t */\n\tloop?: boolean\n\n\t/**\n\t * Animation speed (0.1 to 3)\n\t * @default 1\n\t */\n\tspeed?: number\n\n\t/**\n\t * Animation direction (1 for forward, -1 for reverse)\n\t * @default 1\n\t */\n\tdirection?: 1 | -1\n\n\t/**\n\t * Animation segments to play [startFrame, endFrame]\n\t */\n\tsegments?: [number, number]\n\n\t/**\n\t * Renderer type\n\t * @default 'svg'\n\t */\n\trenderer?: 'svg' | 'canvas' | 'html'\n\n\t/**\n\t * Whether to preserve aspect ratio\n\t * @default true\n\t */\n\tpreserveAspectRatio?: boolean\n\n\t/**\n\t * Custom class for container\n\t */\n\tclass?: string\n\n\t/**\n\t * Callback when animation is ready\n\t */\n\tonReady?: (animation: any) => void\n\n\t/**\n\t * Callback when animation completes\n\t */\n\tonComplete?: () => void\n\n\t/**\n\t * Callback when animation loops\n\t */\n\tonLoopComplete?: () => void\n\n\t/**\n\t * Callback on frame update\n\t */\n\tonEnterFrame?: (frame: number) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type LottieBinding = string | object | LottieOptions\n\n/**\n * Element state storage\n */\ninterface LottieState {\n\toptions: LottieOptions\n\tanimation: any\n\tcontainer: HTMLDivElement\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LottieBinding): LottieOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { animationData: binding }\n\t}\n\n\tif (binding && typeof binding === 'object' && !('animationData' in binding)) {\n\t\treturn { animationData: binding }\n\t}\n\n\treturn {\n\t\tautoplay: true,\n\t\tloop: true,\n\t\tspeed: 1,\n\t\tdirection: 1,\n\t\trenderer: 'svg',\n\t\tpreserveAspectRatio: true,\n\t\t...(binding as LottieOptions),\n\t}\n}\n\n/**\n * Dynamically load Lottie library\n */\nasync function loadLottie(): Promise<any> {\n\tif ((window as any).lottie) {\n\t\treturn (window as any).lottie\n\t}\n\n\t// Dynamic import\n\ttry {\n\t\tconst lottie = await import('lottie-web')\n\t\t;(window as any).lottie = lottie.default || lottie\n\t\treturn lottie.default || lottie\n\t} catch {\n\t\tconsole.warn('[Directix] v-lottie: lottie-web not found. Please install it: npm install lottie-web')\n\t\treturn null\n\t}\n}\n\n/**\n * v-lottie directive\n * Lottie animation player\n *\n * @example\n * ```vue\n * <template>\n * <!-- With URL -->\n * <div v-lottie=\"'https://assets.example.com/animation.json'\"></div>\n *\n * <!-- With animation data -->\n * <div v-lottie=\"animationData\"></div>\n *\n * <!-- With options -->\n * <div v-lottie=\"{\n * animationData: animationData,\n * autoplay: true,\n * loop: true,\n * speed: 1.5,\n * onComplete: () => console.log('Done')\n * }\"></div>\n * </template>\n *\n * <script setup>\n * import animationData from './animation.json'\n * </script>\n * ```\n */\nexport const vLottie = defineDirective<LottieBinding, HTMLElement>({\n\tname: 'lottie',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst container = document.createElement('div')\n\t\tcontainer.className = `v-lottie ${options.class || ''}`\n\t\tcontainer.style.cssText = `\n width: 100%;\n height: 100%;\n ${options.preserveAspectRatio !== false ? 'display: flex; align-items: center; justify-content: center;' : ''}\n `\n\n\t\tel.appendChild(container)\n\n\t\tconst state: LottieState = {\n\t\t\toptions,\n\t\t\tanimation: null,\n\t\t\tcontainer,\n\t\t}\n\n\t\t;(el as any).__lottie = state\n\n\t\t// Load and initialize animation\n\t\tinitAnimation(state)\n\n\t\tel.classList.add('v-lottie-container')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LottieState = (el as any).__lottie\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst oldData = state.options.animationData\n\t\tconst newData = newOptions.animationData\n\n\t\t// Check if animation data changed\n\t\tif (JSON.stringify(oldData) !== JSON.stringify(newData)) {\n\t\t\t// Destroy old animation\n\t\t\tif (state.animation) {\n\t\t\t\tstate.animation.destroy()\n\t\t\t}\n\n\t\t\tstate.options = newOptions\n\t\t\tinitAnimation(state)\n\t\t} else {\n\t\t\t// Update options\n\t\t\tstate.options = newOptions\n\n\t\t\tif (state.animation) {\n\t\t\t\t// Update speed\n\t\t\t\tif (newOptions.speed !== undefined) {\n\t\t\t\t\tstate.animation.setSpeed(newOptions.speed)\n\t\t\t\t}\n\n\t\t\t\t// Update direction\n\t\t\t\tif (newOptions.direction !== undefined) {\n\t\t\t\t\tstate.animation.setDirection(newOptions.direction)\n\t\t\t\t}\n\n\t\t\t\t// Update loop\n\t\t\t\tif (newOptions.loop !== undefined) {\n\t\t\t\t\tstate.animation.loop = newOptions.loop\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LottieState = (el as any).__lottie\n\n\t\tif (!state) return\n\n\t\tif (state.animation) {\n\t\t\tstate.animation.destroy()\n\t\t}\n\n\t\tel.removeChild(state.container)\n\t\tel.classList.remove('v-lottie-container')\n\n\t\tdelete (el as any).__lottie\n\t},\n})\n\n/**\n * Initialize animation\n */\nasync function initAnimation(state: LottieState): Promise<void> {\n\tconst lottie = await loadLottie()\n\n\tif (!lottie) return\n\n\tconst options = state.options\n\n\tconst animationConfig: any = {\n\t\tcontainer: state.container,\n\t\trenderer: options.renderer || 'svg',\n\t\tloop: options.loop !== false,\n\t\tautoplay: options.autoplay !== false,\n\t}\n\n\t// Set animation source\n\tif (typeof options.animationData === 'string' && options.animationData.startsWith('http')) {\n\t\tanimationConfig.path = options.animationData\n\t} else {\n\t\tanimationConfig.animationData = options.animationData\n\t}\n\n\tstate.animation = lottie.loadAnimation(animationConfig)\n\n\t// Set speed\n\tif (options.speed !== undefined) {\n\t\tstate.animation.setSpeed(options.speed)\n\t}\n\n\t// Set direction\n\tif (options.direction !== undefined) {\n\t\tstate.animation.setDirection(options.direction)\n\t}\n\n\t// Play segments if specified\n\tif (options.segments) {\n\t\tstate.animation.playSegments(options.segments, true)\n\t}\n\n\t// Event listeners\n\tif (options.onReady) {\n\t\tstate.animation.addEventListener('DOMLoaded', () => {\n\t\t\toptions.onReady!(state.animation)\n\t\t})\n\t}\n\n\tif (options.onComplete) {\n\t\tstate.animation.addEventListener('complete', options.onComplete)\n\t}\n\n\tif (options.onLoopComplete) {\n\t\tstate.animation.addEventListener('loopComplete', options.onLoopComplete)\n\t}\n\n\tif (options.onEnterFrame) {\n\t\tstate.animation.addEventListener('enterFrame', (e: any) => {\n\t\t\toptions.onEnterFrame!(e.currentTime)\n\t\t})\n\t}\n\n\t// Expose animation methods on element\n\tconst el = state.container.parentElement\n\tif (el) {\n\t\t;(el as any).lottiePlay = () => state.animation?.play()\n\t\t;(el as any).lottiePause = () => state.animation?.pause()\n\t\t;(el as any).lottieStop = () => state.animation?.stop()\n\t\t;(el as any).lottieSetSpeed = (speed: number) => state.animation?.setSpeed(speed)\n\t\t;(el as any).lottieSetDirection = (direction: 1 | -1) => state.animation?.setDirection(direction)\n\t\t;(el as any).lottieGoToAndPlay = (frame: number, isFrame: boolean = true) => state.animation?.goToAndPlay(frame, isFrame)\n\t\t;(el as any).lottieGoToAndStop = (frame: number, isFrame: boolean = true) => state.animation?.goToAndStop(frame, isFrame)\n\t}\n}\n\nexport default vLottie\n", "import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Lowercase directive options\n */\nexport interface LowercaseOptions {\n\t/**\n\t * Transform only the first character\n\t * @default false\n\t */\n\tfirst?: boolean\n\n\t/**\n\t * Transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LowercaseBinding = boolean | LowercaseOptions\n\n/**\n * Transform text to lowercase\n */\nfunction transformText(text: string, options: LowercaseOptions): string {\n\tif (!text) return text\n\n\tif (options.first) {\n\t\treturn text.charAt(0).toLowerCase() + text.slice(1)\n\t}\n\n\treturn text.toLowerCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LowercaseBinding | undefined): LowercaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { first: false, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { first: false, onInput: false }\n\t}\n\n\treturn {\n\t\tfirst: binding.first ?? false,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-lowercase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Transform all characters to lowercase -->\n * <input v-lowercase v-model=\"text\" />\n *\n * <!-- Transform only first character -->\n * <span v-lowercase=\"{ first: true }\">{{ text }}</span>\n * </template>\n * ```\n */\nexport const vLowercase = defineDirective<LowercaseBinding, HTMLElement>({\n\tname: 'lowercase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => transformText(text, options))\n\n\t\t\t;(el as any).__lowercaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = transformText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__lowercaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__lowercaseCleanup\n\t},\n})\n\nexport default vLowercase\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { isInputElement, 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\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 (!isInputElement(el)) {\n\t\t\tconsole.warn('[Directix] v-mask: directive must be used on input or textarea elements')\n\n\t\t\treturn\n\t\t}\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst placeholder = options.placeholder || '_'\n\t\tconst tokens = parseMask(options.mask, placeholder)\n\n\t\tconst inputHandler = (e: Event): void => {\n\t\t\tconst target = e.target as HTMLInputElement\n\t\t\tconst rawValue = target.value\n\t\t\tconst cursorPos = target.selectionStart || 0\n\n\t\t\tconst formatted = formatValue(rawValue, tokens, placeholder, options.showPlaceholder ?? true)\n\n\t\t\tif (formatted !== rawValue) {\n\t\t\t\ttarget.value = formatted\n\t\t\t\ttarget.setSelectionRange(getCursorPos(tokens, cursorPos), getCursorPos(tokens, cursorPos))\n\t\t\t\ttarget.dispatchEvent(new Event('input', { bubbles: true }))\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\toptions.onChange?.(formatted, getRawValue(formatted, tokens, placeholder))\n\t\t\tif (isComplete(formatted, tokens, placeholder)) {\n\t\t\t\toptions.onComplete?.(formatted)\n\t\t\t}\n\t\t}\n\n\t\tconst focusHandler = (): void => {\n\t\t\tif (!el.value && options.showPlaceholder) {\n\t\t\t\tel.value = formatValue('', tokens, placeholder, true)\n\t\t\t}\n\t\t}\n\n\t\tconst blurHandler = (): void => {\n\t\t\tif (!options.showMaskOnBlur && !isComplete(el.value, tokens, placeholder) && options.clearIncomplete) {\n\t\t\t\tel.value = ''\n\t\t\t}\n\t\t}\n\n\t\ton(el, 'input', inputHandler)\n\t\ton(el, 'focus', focusHandler)\n\t\ton(el, 'blur', blurHandler)\n\n\t\t;(el as any)[STATE_KEY] = { options, tokens, placeholder, inputHandler, focusHandler, blurHandler }\n\n\t\tif (el.value) {\n\t\t\tel.value = formatValue(el.value, tokens, placeholder, options.showPlaceholder ?? true)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: MaskState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t\tstate.tokens = parseMask(state.options.mask, state.placeholder)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MaskState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\toff(el, 'input', state.inputHandler)\n\t\toff(el, 'focus', state.focusHandler)\n\t\toff(el, 'blur', state.blurHandler)\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vMask\n", "/**\n * Shared utilities for number and money formatting directives\n */\n\nimport { clamp } from '@directix/shared'\n\n/**\n * Base options shared by number and money formatting\n */\nexport interface NumberFormatOptions {\n\t/** Number of decimal places */\n\tprecision?: number\n\t/** Thousands separator */\n\tseparator?: string\n\t/** Decimal separator */\n\tdecimal?: string\n\t/** Whether to allow negative numbers @default true */\n\tallowNegative?: boolean\n\t/** Minimum value */\n\tmin?: number\n\t/** Maximum value */\n\tmax?: number\n}\n\n/**\n * Format number to string with thousands separator\n */\nexport function formatNumber(value: number, options: NumberFormatOptions): string {\n\tconst { precision = 0, separator = ',', decimal = '.', prefix = '', suffix = '' } = options as any\n\n\tconst fixed = value.toFixed(precision)\n\tconst [intPart, decPart] = fixed.split('.')\n\n\t// Add thousands separator to integer part\n\tconst formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n\n\tlet result = formattedInt\n\n\tif (precision > 0 && decPart) {\n\t\tresult += decimal + decPart\n\t}\n\n\treturn prefix + result + suffix\n}\n\n/**\n * Parse string to number, removing non-numeric characters\n */\nexport function parseToNumber(value: string, decimal: string): number | null {\n\tconst cleaned = value.replace(/[^\\d.-]/g, '').replace(decimal, '.')\n\tconst num = Number.parseFloat(cleaned)\n\n\treturn isNaN(num) ? null : num\n}\n\n/**\n * Clamp value within min/max bounds\n */\nexport function clampValue(value: number, options: NumberFormatOptions): number {\n\tlet result = value\n\n\t// allowNegative defaults to true if not specified\n\tconst allowNegative = options.allowNegative ?? true\n\n\tif (!allowNegative && result < 0) {\n\t\tresult = Math.abs(result)\n\t}\n\n\treturn clamp(result, options.min, options.max)\n}\n\n/**\n * Calculate cursor position after formatting\n * Preserves cursor position relative to digit count\n */\nexport function calculateCursorPosition(\n\trawValue: string,\n\tformatted: string,\n\tcursorPos: number,\n\tstartOffset: number = 0,\n): number {\n\t// Count digits before cursor in old value\n\tlet digitsBeforeCursor = 0,\n\t\t// Find position after same number of digits in new value\n\t\tdigitCount = 0\n\n\tfor (let i = 0; i < cursorPos && i < rawValue.length; i++) {\n\t\tif (/\\d/.test(rawValue[i])) {\n\t\t\tdigitsBeforeCursor++\n\t\t}\n\t}\n\n\tfor (let i = startOffset; i < formatted.length; i++) {\n\t\tif (/\\d/.test(formatted[i])) {\n\t\t\tdigitCount++\n\t\t}\n\t\tif (digitCount >= digitsBeforeCursor) {\n\t\t\treturn i + 1\n\t\t}\n\t}\n\n\t// Default to end of formatted string\n\treturn formatted.length\n}\n\n/**\n * Setup input element with live formatting\n */\nexport function setupNumberInput(\n\tel: HTMLInputElement | HTMLTextAreaElement,\n\toptions: NumberFormatOptions & { prefix?: string, suffix?: string },\n\tformatFn: (value: number, options: any) => string,\n): () => void {\n\tconst { decimal = '.', prefix = '' } = options\n\tlet isFormatting = false\n\n\tconst onInput = (): void => {\n\t\tif (isFormatting) return\n\n\t\tconst rawValue = el.value\n\t\tconst cursorPos = el.selectionStart || 0\n\n\t\t// Handle empty or just minus\n\t\tif (!rawValue || rawValue === '-') {\n\t\t\treturn\n\t\t}\n\n\t\t// Parse the number\n\t\tconst num = parseToNumber(rawValue, decimal)\n\n\t\tif (num === null) {\n\t\t\tisFormatting = true\n\t\t\tel.value = ''\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\n\t\t\treturn\n\t\t}\n\n\t\t// Format the number\n\t\tconst clamped = clampValue(num, options)\n\t\tconst formatted = formatFn(clamped, options)\n\n\t\tif (formatted !== rawValue) {\n\t\t\tisFormatting = true\n\n\t\t\t// Calculate new cursor position (start after prefix)\n\t\t\tconst startOffset = prefix.length\n\t\t\tconst newCursorPos = calculateCursorPosition(rawValue, formatted, cursorPos, startOffset)\n\n\t\t\tel.value = formatted\n\t\t\tel.setSelectionRange(newCursorPos, newCursorPos)\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\tconst onBlur = (): void => {\n\t\tif (!el.value || el.value === '-') return\n\n\t\tconst num = parseToNumber(el.value, decimal)\n\n\t\tif (num !== null) {\n\t\t\tconst clamped = clampValue(num, options)\n\t\t\tconst formatted = formatFn(clamped, options)\n\n\t\t\tisFormatting = true\n\t\t\tel.value = formatted\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\tel.addEventListener('input', onInput)\n\tel.addEventListener('blur', onBlur)\n\n\t// Initial format\n\tif (el.value) {\n\t\tconst num = parseToNumber(el.value, decimal)\n\n\t\tif (num !== null) {\n\t\t\tconst formatted = formatFn(clampValue(num, options), options)\n\n\t\t\tisFormatting = true\n\t\t\tel.value = formatted\n\t\t\t// Trigger input to sync with v-model\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\treturn () => {\n\t\tel.removeEventListener('input', onInput)\n\t\tel.removeEventListener('blur', onBlur)\n\t}\n}\n", "import { defineDirective } from '@directix/core'\nimport { isInputElement } from '@directix/shared'\nimport { clampValue, type NumberFormatOptions, parseToNumber, setupNumberInput } from '../utils/number'\n\n/**\n * Money directive options\n */\nexport interface MoneyOptions extends NumberFormatOptions {\n\t/** Currency symbol @default '$' */\n\tsymbol?: string\n\t/** Symbol position @default 'before' */\n\tsymbolPosition?: 'before' | 'after'\n}\n\nexport type MoneyBinding = string | MoneyOptions\n\ninterface MoneyState {\n\toptions: MoneyOptions\n\tcleanup: () => void\n}\n\n/**\n * Format number to money string\n */\nfunction formatMoney(value: number, options: MoneyOptions): string {\n\tconst { precision = 2, separator = ',', decimal = '.', symbol = '$', symbolPosition = 'before' } = options\n\n\tconst fixed = value.toFixed(precision)\n\tconst [intPart, decPart] = fixed.split('.')\n\n\t// Add thousands separator\n\tconst formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n\n\tlet result = formattedInt\n\n\tif (precision > 0 && decPart) {\n\t\tresult += decimal + decPart\n\t}\n\n\treturn symbolPosition === 'before' ? symbol + result : result + symbol\n}\n\nexport const vMoney = defineDirective<MoneyBinding, HTMLElement>({\n\tname: 'money',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options: MoneyOptions = typeof binding.value === 'string' ? { symbol: binding.value } : (binding.value ?? {})\n\n\t\t// Set defaults for money\n\t\toptions.precision = options.precision ?? 2\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst { symbol = '$', symbolPosition = 'before' } = options\n\t\t\t// For money, prefix is the symbol when positioned before\n\t\t\tconst prefix = symbolPosition === 'before' ? symbol : ''\n\t\t\tconst cleanup = setupNumberInput(el as HTMLInputElement, { ...options, prefix }, formatMoney)\n\n\t\t\t;(el as any).__money = { options, cleanup }\n\n\t\t\t// Format initial value after DOM is ready\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst inputEl = el as HTMLInputElement\n\n\t\t\t\tif (inputEl.value) {\n\t\t\t\t\tconst num = parseToNumber(inputEl.value, options.decimal || '.')\n\n\t\t\t\t\tif (num !== null) {\n\t\t\t\t\t\tconst formatted = formatMoney(clampValue(num, options), options)\n\n\t\t\t\t\t\tif (formatted !== inputEl.value) {\n\t\t\t\t\t\t\tinputEl.value = formatted\n\t\t\t\t\t\t\tinputEl.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\t// For non-input elements, format the text content\n\t\t\tlet value: number | null = null\n\n\t\t\tif (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t} else {\n\t\t\t\t// Try to parse from element's text content\n\t\t\t\tconst textContent = el.textContent?.trim()\n\n\t\t\t\tif (textContent) {\n\t\t\t\t\tvalue = parseToNumber(textContent, options.decimal || '.')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatMoney(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options: MoneyOptions = typeof binding.value === 'string' ? { symbol: binding.value } : (binding.value ?? {})\n\n\t\t// Set defaults for money\n\t\toptions.precision = options.precision ?? 2\n\n\t\tconst state: MoneyState | undefined = (el as any).__money\n\n\t\tif (state) {\n\t\t\tstate.options = options\n\t\t} else if (!isInputElement(el)) {\n\t\t\t// Only format non-input elements on update\n\t\t\tlet value: number | null = null\n\n\t\t\tif (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatMoney(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MoneyState | undefined = (el as any).__money\n\n\t\tstate?.cleanup()\n\t\tdelete (el as any).__money\n\t},\n})\n\nexport default vMoney\n", "import { defineDirective, isBrowser, supportsMutationObserver } from '@directix/core'\n\n/**\n * Mutation change handler\n */\nexport type MutationHandler = (mutations: MutationRecord[], observer: MutationObserver) => void\n\n/**\n * Mutation directive options\n */\nexport interface MutationOptions {\n\t/**\n\t * Callback when mutations occur\n\t * @required\n\t */\n\thandler: MutationHandler\n\n\t/**\n\t * Whether to observe attribute changes\n\t * @default false\n\t */\n\tattributes?: boolean\n\n\t/**\n\t * Specific attributes to observe\n\t */\n\tattributeFilter?: string[]\n\n\t/**\n\t * Whether to observe child node additions/removals\n\t * @default true\n\t */\n\tchildList?: boolean\n\n\t/**\n\t * Whether to observe all descendants, not just direct children\n\t * @default false\n\t */\n\tsubtree?: boolean\n\n\t/**\n\t * Whether to observe character data changes\n\t * @default false\n\t */\n\tcharacterData?: boolean\n\n\t/**\n\t * Whether to record old attribute values\n\t * @default false\n\t */\n\tattributeOldValue?: boolean\n\n\t/**\n\t * Whether to record old character data\n\t * @default false\n\t */\n\tcharacterDataOldValue?: boolean\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type MutationBinding = MutationHandler | MutationOptions\n\n/**\n * Element state storage\n */\ninterface MutationState {\n\toptions: MutationOptions\n\tobserver: MutationObserver | null\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: MutationBinding | undefined): MutationOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, childList: true }\n\t}\n\n\tif (!binding || !binding.handler) {\n\t\tthrow new Error('[Directix] v-mutation: handler is required')\n\t}\n\n\treturn {\n\t\tattributes: false,\n\t\tchildList: true,\n\t\tsubtree: false,\n\t\tcharacterData: false,\n\t\tattributeOldValue: false,\n\t\tcharacterDataOldValue: false,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-mutation directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-mutation=\"handleMutation\">Observe my changes</div>\n * <div v-mutation=\"{ handler: handleMutation, attributes: true, subtree: true }\">\n * Observe attributes and subtree\n * </div>\n * </template>\n *\n * <script setup>\n * function handleMutation(mutations: MutationRecord[], observer: MutationObserver) {\n * mutations.forEach(mutation => {\n * console.log('Type:', mutation.type)\n * console.log('Target:', mutation.target)\n * })\n * }\n * </script>\n * ```\n */\nexport const vMutation = defineDirective<MutationBinding, HTMLElement>({\n\tname: 'mutation',\n\tssr: false,\n\tdefaults: {\n\t\tattributes: false,\n\t\tchildList: true,\n\t\tsubtree: false,\n\t\tcharacterData: false,\n\t\tattributeOldValue: false,\n\t\tcharacterDataOldValue: false,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Check MutationObserver support\n\t\tif (!supportsMutationObserver()) {\n\t\t\tconsole.warn('[Directix] v-mutation: MutationObserver not supported')\n\n\t\t\treturn\n\t\t}\n\n\t\tconst state: MutationState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t}\n\n\t\t// Create observer\n\t\tstate.observer = new MutationObserver((mutations, observer) => {\n\t\t\toptions.handler(mutations, observer)\n\t\t})\n\n\t\t// Start observing\n\t\tstate.observer.observe(el, {\n\t\t\tattributes: options.attributes,\n\t\t\tattributeFilter: options.attributeFilter,\n\t\t\tchildList: options.childList,\n\t\t\tsubtree: options.subtree,\n\t\t\tcharacterData: options.characterData,\n\t\t\tattributeOldValue: options.attributeOldValue,\n\t\t\tcharacterDataOldValue: options.characterDataOldValue,\n\t\t})\n\n\t\t// Store state\n\t\t;(el as any).__mutation = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: MutationState = (el as any).__mutation\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disconnect if was enabled\n\t\t\tif (state.observer) {\n\t\t\t\tstate.observer.disconnect()\n\t\t\t}\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Re-observe if was disabled\n\t\t\tif (state.observer) {\n\t\t\t\tstate.observer.observe(el, {\n\t\t\t\t\tattributes: newOptions.attributes,\n\t\t\t\t\tattributeFilter: newOptions.attributeFilter,\n\t\t\t\t\tchildList: newOptions.childList,\n\t\t\t\t\tsubtree: newOptions.subtree,\n\t\t\t\t\tcharacterData: newOptions.characterData,\n\t\t\t\t\tattributeOldValue: newOptions.attributeOldValue,\n\t\t\t\t\tcharacterDataOldValue: newOptions.characterDataOldValue,\n\t\t\t\t})\n\t\t\t}\n\t\t} else if (!newOptions.disabled) {\n\t\t\t// If options changed, reconnect with new options\n\t\t\tif (\n\t\t\t\tnewOptions.attributes !== state.options.attributes\n\t\t\t\t|| newOptions.childList !== state.options.childList\n\t\t\t\t|| newOptions.subtree !== state.options.subtree\n\t\t\t\t|| newOptions.characterData !== state.options.characterData\n\t\t\t) {\n\t\t\t\tif (state.observer) {\n\t\t\t\t\tstate.observer.disconnect()\n\t\t\t\t\tstate.observer.observe(el, {\n\t\t\t\t\t\tattributes: newOptions.attributes,\n\t\t\t\t\t\tattributeFilter: newOptions.attributeFilter,\n\t\t\t\t\t\tchildList: newOptions.childList,\n\t\t\t\t\t\tsubtree: newOptions.subtree,\n\t\t\t\t\t\tcharacterData: newOptions.characterData,\n\t\t\t\t\t\tattributeOldValue: newOptions.attributeOldValue,\n\t\t\t\t\t\tcharacterDataOldValue: newOptions.characterDataOldValue,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MutationState = (el as any).__mutation\n\n\t\tif (!state) return\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\tdelete (el as any).__mutation\n\t},\n})\n\nexport default vMutation\n", "import { defineDirective } from '@directix/core'\nimport { isInputElement } from '@directix/shared'\nimport { clampValue, formatNumber, type NumberFormatOptions, parseToNumber, setupNumberInput } from '../utils/number'\n\n/**\n * Number directive options\n */\nexport interface NumberOptions extends NumberFormatOptions {\n\t/** Prefix string (e.g., '$') */\n\tprefix?: string\n\t/** Suffix string (e.g., '%') */\n\tsuffix?: string\n}\n\nexport type NumberBinding = number | NumberOptions\n\ninterface NumberState {\n\toptions: NumberOptions\n\tcleanup: () => void\n}\n\nexport const vNumber = defineDirective<NumberBinding, HTMLElement>({\n\tname: 'number',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options: NumberOptions = typeof binding.value === 'number' ? { precision: binding.value } : (binding.value ?? {})\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupNumberInput(el as HTMLInputElement, options, formatNumber)\n\n\t\t\t;(el as any).__number = { options, cleanup }\n\n\t\t\t// Format initial value after DOM is ready\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst inputEl = el as HTMLInputElement\n\n\t\t\t\tif (inputEl.value) {\n\t\t\t\t\tconst num = parseToNumber(inputEl.value, options.decimal || '.')\n\n\t\t\t\t\tif (num !== null) {\n\t\t\t\t\t\tconst formatted = formatNumber(clampValue(num, options), options)\n\n\t\t\t\t\t\tif (formatted !== inputEl.value) {\n\t\t\t\t\t\t\tinputEl.value = formatted\n\t\t\t\t\t\t\tinputEl.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\t// For non-input elements, format the text content\n\t\t\tlet value: number | null = null\n\n\t\t\tif (typeof binding.value === 'number') {\n\t\t\t\tvalue = binding.value\n\t\t\t} else if (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t} else {\n\t\t\t\t// Try to parse from element's text content\n\t\t\t\tconst textContent = el.textContent?.trim()\n\n\t\t\t\tif (textContent) {\n\t\t\t\t\tvalue = parseToNumber(textContent, options.decimal || '.')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatNumber(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options: NumberOptions = typeof binding.value === 'number' ? { precision: binding.value } : (binding.value ?? {})\n\n\t\tconst state: NumberState | undefined = (el as any).__number\n\n\t\tif (state) {\n\t\t\tstate.options = options\n\t\t} else if (!isInputElement(el)) {\n\t\t\t// Only format non-input elements on update\n\t\t\tlet value: number | null = null\n\n\t\t\tif (typeof binding.value === 'number') {\n\t\t\t\tvalue = binding.value\n\t\t\t} else if (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatNumber(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: NumberState | undefined = (el as any).__number\n\n\t\tstate?.cleanup()\n\t\tdelete (el as any).__number\n\t},\n})\n\nexport default vNumber\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Pan gesture event data\n */\nexport interface PanEvent {\n\t/** Original event */\n\toriginalEvent: TouchEvent | MouseEvent\n\t/** Pan direction */\n\tdirection: 'left' | 'right' | 'up' | 'down'\n\t/** Delta X from start */\n\tdeltaX: number\n\t/** Delta Y from start */\n\tdeltaY: number\n\t/** Distance from start */\n\tdistance: number\n\t/** Current X position */\n\tx: number\n\t/** Current Y position */\n\ty: number\n\t/** Start X position */\n\tstartX: number\n\t/** Start Y position */\n\tstartY: number\n\t/** Whether pan is in progress */\n\tisPanning: boolean\n\t/** Whether pan just started */\n\tisFirst: boolean\n\t/** Whether pan just ended */\n\tisFinal: boolean\n\t/** Velocity */\n\tvelocity: number\n}\n\n/**\n * Pan directive options\n */\nexport interface PanOptions {\n\t/**\n\t * Callback when pan starts\n\t */\n\tonStart?: (e: PanEvent) => void\n\n\t/**\n\t * Callback during pan\n\t */\n\tonPan?: (e: PanEvent) => void\n\n\t/**\n\t * Callback when pan ends\n\t */\n\tonEnd?: (e: PanEvent) => void\n\n\t/**\n\t * Minimum distance to trigger pan\n\t * @default 10\n\t */\n\tthreshold?: number\n\n\t/**\n\t * Direction constraint\n\t */\n\tdirection?: 'horizontal' | 'vertical' | 'all'\n\n\t/**\n\t * Whether to prevent default behavior\n\t * @default true\n\t */\n\tpreventDefault?: boolean\n\n\t/**\n\t * Whether to stop propagation\n\t * @default false\n\t */\n\tstopPropagation?: boolean\n\n\t/**\n\t * Pointer types to listen to\n\t * @default ['touch', 'mouse']\n\t */\n\tpointers?: ('touch' | 'mouse')[]\n}\n\n/**\n * Directive binding value type\n */\nexport type PanBinding = PanOptions['onPan'] | PanOptions\n\n/**\n * Element state storage\n */\ninterface PanState {\n\toptions: PanOptions\n\tstartX: number\n\tstartY: number\n\tcurrentX: number\n\tcurrentY: number\n\tisPanning: boolean\n\tstartTime: number\n\ttouchstartHandler: (e: Event) => void\n\ttouchmoveHandler: (e: Event) => void\n\ttouchendHandler: (e: Event) => void\n\tmousedownHandler: (e: Event) => void\n\tmousemoveHandler: (e: Event) => void\n\tmouseupHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: PanBinding): PanOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { onPan: binding }\n\t}\n\n\treturn {\n\t\tthreshold: 10,\n\t\tdirection: 'all',\n\t\tpreventDefault: true,\n\t\tstopPropagation: false,\n\t\tpointers: ['touch', 'mouse'],\n\t\t...binding,\n\t}\n}\n\n/**\n * Get direction from delta\n */\nfunction getDirection(deltaX: number, deltaY: number): 'left' | 'right' | 'up' | 'down' {\n\tif (Math.abs(deltaX) > Math.abs(deltaY)) {\n\t\treturn deltaX > 0 ? 'right' : 'left'\n\t}\n\treturn deltaY > 0 ? 'down' : 'up'\n}\n\n/**\n * Create pan event object\n */\nfunction createPanEvent(\n\toriginalEvent: TouchEvent | MouseEvent,\n\tstate: PanState,\n\tisFirst: boolean = false,\n\tisFinal: boolean = false,\n): PanEvent {\n\tconst deltaX = state.currentX - state.startX\n\tconst deltaY = state.currentY - state.startY\n\tconst distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY)\n\tconst duration = Date.now() - state.startTime\n\n\treturn {\n\t\toriginalEvent,\n\t\tdirection: getDirection(deltaX, deltaY),\n\t\tdeltaX,\n\t\tdeltaY,\n\t\tdistance,\n\t\tx: state.currentX,\n\t\ty: state.currentY,\n\t\tstartX: state.startX,\n\t\tstartY: state.startY,\n\t\tisPanning: state.isPanning,\n\t\tisFirst,\n\t\tisFinal,\n\t\tvelocity: distance / (duration || 1),\n\t}\n}\n\n/**\n * Get position from event\n */\nfunction getPosition(e: TouchEvent | MouseEvent): { x: number, y: number } {\n\tif ('touches' in e && e.touches.length > 0) {\n\t\treturn { x: e.touches[0].clientX, y: e.touches[0].clientY }\n\t}\n\treturn { x: (e as MouseEvent).clientX, y: (e as MouseEvent).clientY }\n}\n\n/**\n * Check if direction is allowed\n */\nfunction isDirectionAllowed(direction: 'left' | 'right' | 'up' | 'down', constraint?: 'horizontal' | 'vertical' | 'all'): boolean {\n\tif (!constraint || constraint === 'all') return true\n\tif (constraint === 'horizontal') return direction === 'left' || direction === 'right'\n\treturn direction === 'up' || direction === 'down'\n}\n\n/**\n * v-pan directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-pan=\"handlePan\">Swipe me</div>\n *\n * <div v-pan=\"{\n * onPan: handlePan,\n * direction: 'horizontal',\n * threshold: 20\n * }\">\n * Horizontal only\n * </div>\n * </template>\n *\n * <script setup>\n * function handlePan(e) {\n * console.log('Direction:', e.direction)\n * console.log('Distance:', e.distance)\n * }\n * </script>\n * ```\n */\nexport const vPan = defineDirective<PanBinding, HTMLElement>({\n\tname: 'pan',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state: PanState = {\n\t\t\toptions,\n\t\t\tstartX: 0,\n\t\t\tstartY: 0,\n\t\t\tcurrentX: 0,\n\t\t\tcurrentY: 0,\n\t\t\tisPanning: false,\n\t\t\tstartTime: 0,\n\t\t\ttouchstartHandler: (e: Event) => handleStart(e, state, el),\n\t\t\ttouchmoveHandler: (e: Event) => handleMove(e, state, el),\n\t\t\ttouchendHandler: (e: Event) => handleEnd(e, state),\n\t\t\tmousedownHandler: (e: Event) => handleStart(e, state, el),\n\t\t\tmousemoveHandler: (e: Event) => handleMove(e, state, el),\n\t\t\tmouseupHandler: (e: Event) => handleEnd(e, state),\n\t\t}\n\n\t\t;(el as any).__pan = state\n\n\t\t// Touch events\n\t\tif (options.pointers?.includes('touch')) {\n\t\t\ton(el, 'touchstart', state.touchstartHandler, { passive: false })\n\t\t\ton(el, 'touchmove', state.touchmoveHandler, { passive: false })\n\t\t\ton(el, 'touchend', state.touchendHandler)\n\t\t\ton(el, 'touchcancel', state.touchendHandler)\n\t\t}\n\n\t\t// Mouse events\n\t\tif (options.pointers?.includes('mouse')) {\n\t\t\ton(el, 'mousedown', state.mousedownHandler)\n\t\t}\n\n\t\tel.classList.add('v-pan')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: PanState = (el as any).__pan\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: PanState = (el as any).__pan\n\t\tif (!state) return\n\n\t\toff(el, 'touchstart', state.touchstartHandler)\n\t\toff(el, 'touchmove', state.touchmoveHandler)\n\t\toff(el, 'touchend', state.touchendHandler)\n\t\toff(el, 'touchcancel', state.touchendHandler)\n\t\toff(el, 'mousedown', state.mousedownHandler)\n\n\t\tel.classList.remove('v-pan')\n\t\tdelete (el as any).__pan\n\t},\n})\n\n/**\n * Handle pan start\n */\nfunction handleStart(e: Event, state: PanState, _el: HTMLElement): void {\n\tconst pos = getPosition(e as TouchEvent | MouseEvent)\n\tstate.startX = pos.x\n\tstate.startY = pos.y\n\tstate.currentX = pos.x\n\tstate.currentY = pos.y\n\tstate.isPanning = false\n\tstate.startTime = Date.now()\n\n\tif (state.options.preventDefault) {\n\t\te.preventDefault()\n\t}\n\tif (state.options.stopPropagation) {\n\t\te.stopPropagation()\n\t}\n\n\t// Add document-level listeners for mouse\n\tif ((e as MouseEvent).type === 'mousedown') {\n\t\tdocument.addEventListener('mousemove', state.mousemoveHandler)\n\t\tdocument.addEventListener('mouseup', state.mouseupHandler)\n\t}\n}\n\n/**\n * Handle pan move\n */\nfunction handleMove(e: Event, state: PanState, _el: HTMLElement): void {\n\tconst pos = getPosition(e as TouchEvent | MouseEvent)\n\tstate.currentX = pos.x\n\tstate.currentY = pos.y\n\n\tconst deltaX = state.currentX - state.startX\n\tconst deltaY = state.currentY - state.startY\n\tconst distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY)\n\tconst threshold = state.options.threshold || 10\n\n\t// Check threshold\n\tif (!state.isPanning && distance < threshold) {\n\t\treturn\n\t}\n\n\t// Check direction constraint\n\tconst direction = getDirection(deltaX, deltaY)\n\tif (!isDirectionAllowed(direction, state.options.direction)) {\n\t\treturn\n\t}\n\n\tif (state.options.preventDefault) {\n\t\te.preventDefault()\n\t}\n\n\tconst wasPanning = state.isPanning\n\tstate.isPanning = true\n\n\tconst panEvent = createPanEvent(e as TouchEvent | MouseEvent, state, !wasPanning)\n\n\tif (!wasPanning) {\n\t\tstate.options.onStart?.(panEvent)\n\t}\n\n\tstate.options.onPan?.(panEvent)\n}\n\n/**\n * Handle pan end\n */\nfunction handleEnd(e: Event, state: PanState): void {\n\t// Remove document-level listeners for mouse events\n\tdocument.removeEventListener('mousemove', state.mousemoveHandler)\n\tdocument.removeEventListener('mouseup', state.mouseupHandler)\n\n\tif (!state.isPanning) return\n\n\tconst panEvent = createPanEvent(e as TouchEvent | MouseEvent, state, false, true)\n\tstate.options.onEnd?.(panEvent)\n\n\tstate.isPanning = false\n}\n\nexport default vPan\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Parallax directive options\n */\nexport interface ParallaxOptions {\n\t/**\n\t * Parallax speed factor (0-1)\n\t * @default 0.5\n\t */\n\tspeed?: number\n\n\t/**\n\t * Whether parallax is enabled\n\t * @default true\n\t */\n\tenabled?: boolean\n\n\t/**\n\t * Minimum scroll position\n\t */\n\tminScroll?: number\n\n\t/**\n\t * Maximum scroll position\n\t */\n\tmaxScroll?: number\n\n\t/**\n\t * Whether to reverse direction\n\t * @default false\n\t */\n\treverse?: boolean\n\n\t/**\n\t * Horizontal parallax\n\t * @default false\n\t */\n\thorizontal?: boolean\n\n\t/**\n\t * Custom transform function\n\t */\n\ttransform?: (offset: number, el: HTMLElement) => string\n\n\t/**\n\t * Whether to use CSS transform\n\t * @default true\n\t */\n\tuseTransform?: boolean\n\n\t/**\n\t * Mobile breakpoint (disable below this width)\n\t */\n\tmobileBreakpoint?: number\n}\n\n/**\n * Directive binding value type\n */\nexport type ParallaxBinding = boolean | number | ParallaxOptions\n\n/**\n * Element state storage\n */\ninterface ParallaxState {\n\toptions: ParallaxOptions\n\tscrollHandler: () => void\n\tresizeHandler: () => void\n\tisVisible: boolean\n\tlastOffset: number\n\tticking: boolean\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ParallaxBinding | undefined): ParallaxOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { enabled: binding, speed: 0.5 }\n\t}\n\n\tif (typeof binding === 'number') {\n\t\treturn { speed: binding, enabled: true }\n\t}\n\n\treturn {\n\t\tspeed: 0.5,\n\t\tenabled: true,\n\t\treverse: false,\n\t\thorizontal: false,\n\t\tuseTransform: true,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if mobile\n */\nfunction isMobile(breakpoint?: number): boolean {\n\tif (!breakpoint) return false\n\treturn window.innerWidth < breakpoint\n}\n\n/**\n * v-parallax directive\n * Parallax scrolling effect\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple parallax -->\n * <div v-parallax>Parallax content</div>\n *\n * <!-- With speed factor -->\n * <div v-parallax=\"0.3\">Slower parallax</div>\n *\n * <!-- With options -->\n * <div v-parallax=\"{\n * speed: 0.5,\n * reverse: true,\n * mobileBreakpoint: 768\n * }\">\n * Reverse parallax, disabled on mobile\n * </div>\n * </template>\n * ```\n */\nexport const vParallax = defineDirective<ParallaxBinding, HTMLElement>({\n\tname: 'parallax',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: ParallaxState = {\n\t\t\toptions,\n\t\t\tscrollHandler: () => handleScroll(el, state),\n\t\t\tresizeHandler: () => handleResize(el, state),\n\t\t\tisVisible: true,\n\t\t\tlastOffset: 0,\n\t\t\tticking: false,\n\t\t}\n\n\t\t;(el as any).__parallax = state\n\n\t\t// Set initial styles\n\t\tel.style.willChange = 'transform'\n\n\t\t// Add scroll listener\n\t\tconst scrollParent = getScrollParent(el)\n\t\ton(scrollParent, 'scroll', state.scrollHandler, { passive: true })\n\t\ton(window, 'resize', state.resizeHandler, { passive: true })\n\n\t\t// Initial position\n\t\thandleScroll(el, state)\n\n\t\tel.classList.add('v-parallax')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ParallaxState = (el as any).__parallax\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ParallaxState = (el as any).__parallax\n\t\tif (!state) return\n\n\t\tconst scrollParent = getScrollParent(el)\n\t\toff(scrollParent, 'scroll', state.scrollHandler)\n\t\toff(window, 'resize', state.resizeHandler)\n\n\t\tel.style.willChange = ''\n\t\tel.style.transform = ''\n\n\t\tel.classList.remove('v-parallax')\n\t\tdelete (el as any).__parallax\n\t},\n})\n\n/**\n * Handle scroll event\n */\nfunction handleScroll(el: HTMLElement, state: ParallaxState): void {\n\tif (!state.options.enabled || isMobile(state.options.mobileBreakpoint)) {\n\t\treturn\n\t}\n\n\tif (state.ticking) return\n\n\tstate.ticking = true\n\n\trequestAnimationFrame(() => {\n\t\tconst rect = el.getBoundingClientRect()\n\t\tconst viewportHeight = window.innerHeight\n\n\t\t// Check if element is in viewport\n\t\tstate.isVisible = rect.top < viewportHeight && rect.bottom > 0\n\n\t\tif (state.isVisible) {\n\t\t\tconst scrollY = window.scrollY\n\t\t\tconst elementTop = rect.top + scrollY\n\n\t\t\t// Calculate parallax offset\n\t\t\tlet offset = (scrollY - elementTop) * (state.options.speed || 0.5)\n\n\t\t\t// Apply min/max constraints\n\t\t\tif (state.options.minScroll !== undefined) {\n\t\t\t\toffset = Math.max(offset, state.options.minScroll)\n\t\t\t}\n\t\t\tif (state.options.maxScroll !== undefined) {\n\t\t\t\toffset = Math.min(offset, state.options.maxScroll)\n\t\t\t}\n\n\t\t\t// Reverse if needed\n\t\t\tif (state.options.reverse) {\n\t\t\t\toffset = -offset\n\t\t\t}\n\n\t\t\t// Apply transform\n\t\t\tif (state.options.transform) {\n\t\t\t\tel.style.transform = state.options.transform(offset, el)\n\t\t\t} else if (state.options.useTransform !== false) {\n\t\t\t\tif (state.options.horizontal) {\n\t\t\t\t\tel.style.transform = `translateX(${offset}px)`\n\t\t\t\t} else {\n\t\t\t\t\tel.style.transform = `translateY(${offset}px)`\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstate.lastOffset = offset\n\t\t}\n\n\t\tstate.ticking = false\n\t})\n}\n\n/**\n * Handle resize event\n */\nfunction handleResize(el: HTMLElement, state: ParallaxState): void {\n\thandleScroll(el, state)\n}\n\n/**\n * Get scroll parent element\n */\nfunction getScrollParent(el: HTMLElement): Element | Window {\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\nexport default vParallax\n", "import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\n\n// ============ Types ============\n\n/**\n * Permission action mode\n */\nexport type PermissionAction = 'remove' | 'disable' | 'hide'\n\n/**\n * Permission check mode\n */\nexport type PermissionMode = 'some' | 'every'\n\n/**\n * Permission directive options\n */\nexport interface PermissionOptions {\n\t/** Permission value(s) to check */\n\tvalue: string | string[]\n\t/** Logic for multiple permissions: 'some' (OR) or 'every' (AND). Default: 'some' */\n\tmode?: PermissionMode\n\t/** Action when permission denied. Default: 'remove' */\n\taction?: PermissionAction\n\t/** Custom permission check function */\n\tcheck?: (permission: string | string[], mode: PermissionMode) => boolean\n\t/** Callback when permission state changes */\n\tonChange?: (hasPermission: boolean) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type PermissionBinding = string | string[] | PermissionOptions\n\n/**\n * Permission configuration\n */\nexport interface PermissionConfig {\n\t/** Get current user's permissions */\n\tgetPermissions: () => string[]\n\t/** Get current user's roles */\n\tgetRoles?: () => string[]\n\t/** Role to permission mapping */\n\troleMap?: Record<string, string[]>\n}\n\n// ============ Constants ============\n\nconst STATE_KEY = '__permission' as const\nconst WILDCARD = '*' as const\n\n// ============ State ============\n\ninterface ElementState {\n\toptions: PermissionOptions\n\toriginalDisplay: string\n\toriginalDisabled: boolean | string\n\tparentNode: Node | null\n\tplaceholder: Comment | null\n}\n\n// Global configuration\nlet globalConfig: PermissionConfig | null = null\n\n// ============ Configuration ============\n\n/**\n * Configure permission directive\n */\nexport function configurePermission(config: PermissionConfig): void {\n\tglobalConfig = config\n}\n\n/**\n * Get current configuration\n */\nexport function getPermissionConfig(): PermissionConfig | null {\n\treturn globalConfig\n}\n\n// ============ Helpers ============\n\n/**\n * Normalize binding value to options object\n */\nfunction normalizeOptions(binding: PermissionBinding | undefined): PermissionOptions {\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-permission: permission value is required')\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { value: binding }\n\t}\n\n\tif (Array.isArray(binding)) {\n\t\treturn { value: binding }\n\t}\n\n\treturn binding\n}\n\n/**\n * Check if a permission is granted (supports wildcard)\n */\nfunction hasPermission(required: string, permissions: string[]): boolean {\n\treturn permissions.includes(WILDCARD) || permissions.includes(required)\n}\n\n/**\n * Verify permission against configuration\n */\nfunction verifyPermission(options: PermissionOptions): boolean {\n\t// Custom check function takes priority\n\tif (options.check) {\n\t\treturn options.check(options.value, options.mode || 'some')\n\t}\n\n\t// Require global configuration\n\tif (!globalConfig) {\n\t\tconsole.warn('[Directix] v-permission: No permission config provided')\n\n\t\treturn true\n\t}\n\n\tconst permissions = globalConfig.getPermissions()\n\tconst roles = globalConfig.getRoles?.() || []\n\tconst roleMap = globalConfig.roleMap || {}\n\tconst required = Array.isArray(options.value) ? options.value : [options.value]\n\tconst mode = options.mode || 'some'\n\n\t/**\n\t * Check a single value - can be a role name or permission\n\t */\n\tfunction checkSingle(value: string): boolean {\n\t\t// If value is a role name in roleMap, check if user has that role\n\t\tif (value in roleMap) {\n\t\t\treturn roles.includes(value)\n\t\t}\n\n\t\t// Check direct permission\n\t\tif (hasPermission(value, permissions)) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Check if any of user's roles grant this permission\n\t\tfor (const role of roles) {\n\t\t\tconst rolePermissions = roleMap[role] || []\n\n\t\t\tif (hasPermission(value, rolePermissions)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\treturn mode === 'every' ? required.every(checkSingle) : required.some(checkSingle)\n}\n\n/**\n * Handle element when permission is denied\n */\nfunction handleDenied(el: HTMLElement, action: PermissionAction, state: ElementState): void {\n\tswitch (action) {\n\t\tcase 'remove':\n\t\t\tstate.parentNode = el.parentNode\n\t\t\tstate.placeholder = document.createComment('v-permission')\n\t\t\tel.parentNode?.insertBefore(state.placeholder, el)\n\t\t\tel.parentNode?.removeChild(el)\n\t\t\tbreak\n\t\tcase 'disable':\n\t\t\tstate.originalDisabled = el.getAttribute('disabled') || false\n\t\t\tel.setAttribute('disabled', 'true')\n\t\t\tel.classList.add('v-permission--disabled')\n\t\t\tbreak\n\t\tcase 'hide':\n\t\t\tstate.originalDisplay = el.style.display\n\t\t\tel.style.display = 'none'\n\t\t\tel.classList.add('v-permission--hidden')\n\t\t\tbreak\n\t}\n}\n\n/**\n * Restore element when permission is granted\n */\nfunction handleGranted(el: HTMLElement, action: PermissionAction, state: ElementState): void {\n\tswitch (action) {\n\t\tcase 'remove':\n\t\t\tif (state.placeholder && state.parentNode) {\n\t\t\t\tstate.parentNode.insertBefore(el, state.placeholder)\n\t\t\t\tstate.parentNode.removeChild(state.placeholder)\n\t\t\t\tstate.placeholder = null\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'disable':\n\t\t\tif (state.originalDisabled === false) {\n\t\t\t\tel.removeAttribute('disabled')\n\t\t\t} else if (state.originalDisabled) {\n\t\t\t\tel.setAttribute('disabled', state.originalDisabled as string)\n\t\t\t}\n\t\t\tel.classList.remove('v-permission--disabled')\n\t\t\tbreak\n\t\tcase 'hide':\n\t\t\tel.style.display = state.originalDisplay || ''\n\t\t\tel.classList.remove('v-permission--hidden')\n\t\t\tbreak\n\t}\n}\n\n/**\n * Get or create element state\n */\nfunction getState(el: HTMLElement): ElementState {\n\tif (!(el as any)[STATE_KEY]) {\n\t\t;(el as any)[STATE_KEY] = {\n\t\t\toptions: { value: '' },\n\t\t\toriginalDisplay: '',\n\t\t\toriginalDisabled: false,\n\t\t\tparentNode: null,\n\t\t\tplaceholder: null,\n\t\t} as ElementState\n\t}\n\n\treturn (el as any)[STATE_KEY]\n}\n\n/**\n * Check permission and update element state\n */\nfunction checkPermission(el: HTMLElement, binding: DirectiveBinding<PermissionBinding>): void {\n\tconst state = getState(el)\n\n\tstate.options = normalizeOptions(binding.value)\n\n\tconst granted = verifyPermission(state.options)\n\n\t// Trigger change callback\n\tstate.options.onChange?.(granted)\n\n\tconst action = state.options.action || 'remove'\n\n\tif (granted) {\n\t\thandleGranted(el, action, state)\n\t} else {\n\t\thandleDenied(el, action, state)\n\t}\n}\n\n/**\n * Cleanup element state\n */\nfunction cleanup(el: HTMLElement): void {\n\tconst state: ElementState = (el as any)[STATE_KEY]\n\n\tif (state?.placeholder && state.parentNode) {\n\t\tstate.parentNode.removeChild(state.placeholder)\n\t}\n\n\tdelete (el as any)[STATE_KEY]\n}\n\n// ============ Directive ============\n\n/**\n * v-permission directive\n *\n * Controls element visibility and state based on user permissions.\n * Supports role-based and permission-based access control with wildcard support.\n *\n * @example\n * ```vue\n * <template>\n * <button v-permission=\"'admin'\">Admin Only</button>\n * <button v-permission=\"['admin', 'editor']\">Admin or Editor</button>\n * <button v-permission=\"{ value: ['read', 'write'], mode: 'every' }\">Read & Write</button>\n * <button v-permission=\"{ value: 'admin', action: 'disable' }\">Disabled for non-admin</button>\n * </template>\n *\n * <script setup>\n * import { configurePermission } from 'directix'\n *\n * configurePermission({\n * getPermissions: () => store.getters.permissions,\n * getRoles: () => store.getters.roles,\n * roleMap: { admin: ['*'], editor: ['read', 'write'] }\n * })\n * </script>\n * ```\n */\nexport const vPermission = defineDirective<PermissionBinding, HTMLElement>({\n\tname: 'permission',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tcheckPermission(el, binding)\n\t},\n\n\tupdated(el, binding) {\n\t\tcheckPermission(el, binding)\n\t},\n\n\tunmounted(el) {\n\t\tcleanup(el)\n\t},\n})\n\nexport default vPermission\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Pinch gesture event data\n */\nexport interface PinchEvent {\n\t/** Original event */\n\toriginalEvent: TouchEvent\n\t/** Scale factor (relative to start) */\n\tscale: number\n\t/** Current distance between two fingers */\n\tdistance: number\n\t/** Initial distance */\n\tinitialDistance: number\n\t/** Center point X */\n\tcenterX: number\n\t/** Center point Y */\n\tcenterY: number\n\t/** Whether pinch is in progress */\n\tisPinching: boolean\n\t/** Whether pinch just started */\n\tisFirst: boolean\n\t/** Whether pinch just ended */\n\tisFinal: boolean\n}\n\n/**\n * Pinch directive options\n */\nexport interface PinchOptions {\n\t/**\n\t * Callback when pinch starts\n\t */\n\tonStart?: (e: PinchEvent) => void\n\n\t/**\n\t * Callback during pinch\n\t */\n\tonPinch?: (e: PinchEvent) => void\n\n\t/**\n\t * Callback when pinch ends\n\t */\n\tonEnd?: (e: PinchEvent) => void\n\n\t/**\n\t * Minimum scale to trigger callback\n\t */\n\tminScale?: number\n\n\t/**\n\t * Maximum scale to trigger callback\n\t */\n\tmaxScale?: number\n\n\t/**\n\t * Whether to prevent default behavior\n\t * @default true\n\t */\n\tpreventDefault?: boolean\n\n\t/**\n\t * Whether to stop propagation\n\t * @default false\n\t */\n\tstopPropagation?: boolean\n\n\t/**\n\t * Enable scale transform on element\n\t * @default false\n\t */\n\tenableTransform?: boolean\n\n\t/**\n\t * Transform origin for scaling\n\t * @default 'center center'\n\t */\n\ttransformOrigin?: string\n}\n\n/**\n * Directive binding value type\n */\nexport type PinchBinding = PinchOptions['onPinch'] | PinchOptions\n\n/**\n * Element state storage\n */\ninterface PinchState {\n\toptions: PinchOptions\n\tinitialDistance: number\n\tcurrentDistance: number\n\tisPinching: boolean\n\ttouchstartHandler: (e: Event) => void\n\ttouchmoveHandler: (e: Event) => void\n\ttouchendHandler: (e: Event) => void\n\tinitialScale: number\n\tsavedTransition: string\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: PinchBinding): PinchOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { onPinch: binding }\n\t}\n\n\treturn {\n\t\tpreventDefault: true,\n\t\tstopPropagation: false,\n\t\tenableTransform: false,\n\t\ttransformOrigin: 'center center',\n\t\t...binding,\n\t}\n}\n\n/**\n * Get distance between two touch points\n */\nfunction getDistance(touches: TouchList): number {\n\tif (touches.length < 2) return 0\n\tconst dx = touches[0].clientX - touches[1].clientX\n\tconst dy = touches[0].clientY - touches[1].clientY\n\treturn Math.sqrt(dx * dx + dy * dy)\n}\n\n/**\n * Get center point between two touch points\n */\nfunction getCenter(touches: TouchList): { x: number, y: number } {\n\tif (touches.length < 2) return { x: touches[0].clientX, y: touches[0].clientY }\n\treturn {\n\t\tx: (touches[0].clientX + touches[1].clientX) / 2,\n\t\ty: (touches[0].clientY + touches[1].clientY) / 2,\n\t}\n}\n\n/**\n * Create pinch event object\n */\nfunction createPinchEvent(originalEvent: TouchEvent, state: PinchState, isFirst: boolean = false, isFinal: boolean = false): PinchEvent {\n\tconst center = getCenter(originalEvent.touches)\n\tconst scale = state.initialDistance > 0 ? state.currentDistance / state.initialDistance : 1\n\n\treturn {\n\t\toriginalEvent,\n\t\tscale,\n\t\tdistance: state.currentDistance,\n\t\tinitialDistance: state.initialDistance,\n\t\tcenterX: center.x,\n\t\tcenterY: center.y,\n\t\tisPinching: state.isPinching,\n\t\tisFirst,\n\t\tisFinal,\n\t}\n}\n\n/**\n * v-pinch directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-pinch=\"handlePinch\">Pinch to zoom</div>\n *\n * <div v-pinch=\"{\n * onPinch: handlePinch,\n * enableTransform: true,\n * minScale: 0.5,\n * maxScale: 3\n * }\">\n * Pinch to scale\n * </div>\n * </template>\n *\n * <script setup>\n * function handlePinch(e) {\n * console.log('Scale:', e.scale)\n * console.log('Center:', e.centerX, e.centerY)\n * }\n * </script>\n * ```\n */\nexport const vPinch = defineDirective<PinchBinding, HTMLElement>({\n\tname: 'pinch',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state: PinchState = {\n\t\t\toptions,\n\t\t\tinitialDistance: 0,\n\t\t\tcurrentDistance: 0,\n\t\t\tisPinching: false,\n\t\t\tinitialScale: 1,\n\t\t\tsavedTransition: '',\n\t\t\ttouchstartHandler: (e: Event) => handleStart(e as TouchEvent, state, el),\n\t\t\ttouchmoveHandler: (e: Event) => handleMove(e as TouchEvent, state, el),\n\t\t\ttouchendHandler: (e: Event) => handleEnd(e as TouchEvent, state, el),\n\t\t}\n\n\t\t;(el as any).__pinch = state\n\n\t\ton(el, 'touchstart', state.touchstartHandler, { passive: false })\n\t\ton(el, 'touchmove', state.touchmoveHandler, { passive: false })\n\t\ton(el, 'touchend', state.touchendHandler)\n\t\ton(el, 'touchcancel', state.touchendHandler)\n\n\t\tel.classList.add('v-pinch')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: PinchState = (el as any).__pinch\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: PinchState = (el as any).__pinch\n\t\tif (!state) return\n\n\t\toff(el, 'touchstart', state.touchstartHandler)\n\t\toff(el, 'touchmove', state.touchmoveHandler)\n\t\toff(el, 'touchend', state.touchendHandler)\n\t\toff(el, 'touchcancel', state.touchendHandler)\n\n\t\tel.classList.remove('v-pinch')\n\t\tdelete (el as any).__pinch\n\t},\n})\n\n/**\n * Handle pinch start\n */\nfunction handleStart(e: TouchEvent, state: PinchState, el: HTMLElement): void {\n\tif (e.touches.length !== 2) return\n\n\tstate.initialDistance = getDistance(e.touches)\n\tstate.currentDistance = state.initialDistance\n\tstate.isPinching = false\n\n\tif (state.options.enableTransform) {\n\t\t// Get current scale from transform\n\t\tconst transform = getComputedStyle(el).transform\n\t\tconst matrix = new DOMMatrix(transform)\n\t\tstate.initialScale = matrix.a // Get scale from matrix\n\t\t// Disable transition during pinch for smooth response\n\t\tstate.savedTransition = el.style.transition\n\t\tel.style.transition = 'none'\n\t}\n\n\tif (state.options.preventDefault) {\n\t\te.preventDefault()\n\t}\n\tif (state.options.stopPropagation) {\n\t\te.stopPropagation()\n\t}\n}\n\n/**\n * Handle pinch move\n */\nfunction handleMove(e: TouchEvent, state: PinchState, el: HTMLElement): void {\n\tif (e.touches.length !== 2) return\n\n\tstate.currentDistance = getDistance(e.touches)\n\n\tif (state.initialDistance <= 0) return\n\n\tconst scale = state.currentDistance / state.initialDistance\n\n\t// Check scale constraints\n\tif (state.options.minScale !== undefined && scale < state.options.minScale) return\n\tif (state.options.maxScale !== undefined && scale > state.options.maxScale) return\n\n\tif (state.options.preventDefault) {\n\t\te.preventDefault()\n\t}\n\n\tconst wasPinching = state.isPinching\n\tstate.isPinching = true\n\n\tconst pinchEvent = createPinchEvent(e, state, !wasPinching)\n\n\tif (!wasPinching) {\n\t\tstate.options.onStart?.(pinchEvent)\n\t}\n\n\t// Apply transform if enabled\n\tif (state.options.enableTransform) {\n\t\tconst transformOrigin = state.options.transformOrigin || 'center center'\n\t\tel.style.transformOrigin = transformOrigin\n\t\tel.style.transform = `scale(${state.initialScale * scale})`\n\t}\n\n\tstate.options.onPinch?.(pinchEvent)\n}\n\n/**\n * Handle pinch end\n */\nfunction handleEnd(e: TouchEvent, state: PinchState, el: HTMLElement): void {\n\tif (!state.isPinching) return\n\n\t// Restore transition\n\tif (state.options.enableTransform) {\n\t\tel.style.transition = state.savedTransition\n\t}\n\n\t// Create final event with 0 touches\n\tconst finalEvent = {\n\t\t...e,\n\t\ttouches: e.touches.length >= 2 ? e.touches : ([] as any),\n\t} as TouchEvent\n\n\tconst pinchEvent = createPinchEvent(finalEvent, state, false, true)\n\tstate.options.onEnd?.(pinchEvent)\n\n\tstate.isPinching = false\n\tstate.initialDistance = 0\n\tstate.currentDistance = 0\n}\n\nexport default vPinch\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Print complete callback\n */\nexport type PrintCompleteCallback = () => void\n\n/**\n * Print before callback\n */\nexport type PrintBeforeCallback = () => boolean | void\n\n/**\n * Print directive options\n */\nexport interface PrintOptions {\n\t/**\n\t * Title for the printed document\n\t */\n\ttitle?: string\n\n\t/**\n\t * Additional CSS styles to inject\n\t */\n\tstyles?: string | string[]\n\n\t/**\n\t * Additional CSS URLs to include\n\t */\n\tcssUrls?: string[]\n\n\t/**\n\t * Callback before printing\n\t * Return false to cancel printing\n\t */\n\tonBeforePrint?: PrintBeforeCallback\n\n\t/**\n\t * Callback after printing\n\t */\n\tonAfterPrint?: PrintCompleteCallback\n\n\t/**\n\t * Whether to print immediately on mount\n\t * @default false\n\t */\n\timmediate?: boolean\n\n\t/**\n\t * Print target selector\n\t * If not specified, prints the element itself\n\t */\n\ttarget?: string\n\n\t/**\n\t * Whether to print in a new window\n\t * @default false\n\t */\n\tnewWindow?: boolean\n\n\t/**\n\t * Custom class for print container\n\t */\n\tprintClass?: string\n}\n\n/**\n * Directive binding value type\n */\nexport type PrintBinding = PrintOptions | boolean\n\n/**\n * Element state storage\n */\ninterface PrintState {\n\toptions: PrintOptions\n\tclickHandler: (() => void) | null\n}\n\n/**\n * v-print directive\n *\n * Prints the element content when clicked or immediately.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Print on click -->\n * <button v-print>Print Page</button>\n *\n * <!-- Print specific element -->\n * <button v-print=\"{ target: '#content' }\">Print Content</button>\n *\n * <!-- Print with custom title -->\n * <button v-print=\"{ title: 'My Document', styles: 'body { font-size: 12px }' }\">\n * Print\n * </button>\n *\n * <!-- Print immediately on mount -->\n * <div v-print=\"{ immediate: true }\">Auto print</div>\n * </template>\n * ```\n */\nexport const vPrint = defineDirective<PrintBinding, HTMLElement>({\n\tname: 'print',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: PrintState = {\n\t\t\toptions,\n\t\t\tclickHandler: null,\n\t\t}\n\n\t\t;(el as any).__print = state\n\n\t\t// Print immediately if specified\n\t\tif (options.immediate) {\n\t\t\tsetTimeout(() => printElement(el, options), 100)\n\t\t\treturn\n\t\t}\n\n\t\t// Add click handler\n\t\tconst clickHandler = (): void => {\n\t\t\tprintElement(el, state.options)\n\t\t}\n\n\t\tel.addEventListener('click', clickHandler)\n\t\tstate.clickHandler = clickHandler\n\n\t\t// Add cursor style\n\t\tel.style.cursor = 'pointer'\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: PrintState = (el as any).__print\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: PrintState | undefined = (el as any).__print\n\n\t\tif (!state) return\n\n\t\tif (state.clickHandler) {\n\t\t\tel.removeEventListener('click', state.clickHandler)\n\t\t}\n\n\t\tel.style.cursor = ''\n\n\t\tdelete (el as any).__print\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: PrintBinding | undefined): PrintOptions {\n\tif (binding === true) {\n\t\treturn { immediate: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn {}\n\t}\n\n\treturn binding || {}\n}\n\n/**\n * Print element\n */\nasync function printElement(triggerEl: HTMLElement, options: PrintOptions): Promise<void> {\n\t// Call before callback\n\tif (options.onBeforePrint) {\n\t\tconst result = options.onBeforePrint()\n\t\tif (result === false) return\n\t}\n\n\t// Get target element\n\tconst targetEl = options.target ? document.querySelector(options.target) : triggerEl\n\n\tif (!targetEl) {\n\t\tconsole.warn('[Directix] v-print: Target element not found')\n\t\treturn\n\t}\n\n\t// Create print window/iframe\n\tif (options.newWindow) {\n\t\tawait printInNewWindow(targetEl as HTMLElement, options)\n\t} else {\n\t\tawait printInIframe(targetEl as HTMLElement, options)\n\t}\n\n\t// Call after callback\n\tif (options.onAfterPrint) {\n\t\toptions.onAfterPrint()\n\t}\n}\n\n/**\n * Print using iframe\n */\nasync function printInIframe(el: HTMLElement, options: PrintOptions): Promise<void> {\n\t// Create iframe\n\tconst iframe = document.createElement('iframe')\n\tiframe.style.cssText = 'position: absolute; top: -10000px; left: -10000px; width: 0; height: 0; border: none;'\n\tdocument.body.appendChild(iframe)\n\n\tconst iframeDoc = iframe.contentDocument || iframe.contentWindow?.document\n\n\tif (!iframeDoc) {\n\t\tconsole.warn('[Directix] v-print: Could not access iframe document')\n\t\tdocument.body.removeChild(iframe)\n\t\treturn\n\t}\n\n\t// Build document content\n\tconst content = buildPrintContent(el, options)\n\n\tiframeDoc.open()\n\tiframeDoc.write(content)\n\tiframeDoc.close()\n\n\t// Wait for images to load\n\tawait waitForImages(iframeDoc)\n\n\t// Print\n\ttry {\n\t\tiframe.contentWindow?.focus()\n\t\tiframe.contentWindow?.print()\n\t} catch (err) {\n\t\tconsole.error('[Directix] v-print: Print failed', err)\n\t}\n\n\t// Cleanup after print\n\tsetTimeout(() => {\n\t\tdocument.body.removeChild(iframe)\n\t}, 1000)\n}\n\n/**\n * Print in new window\n */\nasync function printInNewWindow(el: HTMLElement, options: PrintOptions): Promise<void> {\n\tconst printWindow = window.open('', '_blank')\n\n\tif (!printWindow) {\n\t\tconsole.warn('[Directix] v-print: Could not open print window')\n\t\treturn\n\t}\n\n\tconst content = buildPrintContent(el, options)\n\n\tprintWindow.document.open()\n\tprintWindow.document.write(content)\n\tprintWindow.document.close()\n\n\t// Wait for images to load\n\tawait waitForImages(printWindow.document)\n\n\t// Print\n\tprintWindow.focus()\n\tprintWindow.print()\n\n\t// Close after print\n\tsetTimeout(() => {\n\t\tprintWindow.close()\n\t}, 1000)\n}\n\n/**\n * Build print content HTML\n */\nfunction buildPrintContent(el: HTMLElement, options: PrintOptions): string {\n\t// Get all stylesheets\n\tlet styles = ''\n\n\t// Include existing stylesheets\n\tdocument.querySelectorAll('style, link[rel=\"stylesheet\"]').forEach(styleEl => {\n\t\tif (styleEl.tagName === 'STYLE') {\n\t\t\tstyles += `<style>${styleEl.textContent}</style>`\n\t\t} else if (styleEl.tagName === 'LINK') {\n\t\t\tconst href = (styleEl as HTMLLinkElement).href\n\t\t\tstyles += `<link rel=\"stylesheet\" href=\"${href}\">`\n\t\t}\n\t})\n\n\t// Add custom CSS URLs\n\tif (options.cssUrls) {\n\t\toptions.cssUrls.forEach(url => {\n\t\t\tstyles += `<link rel=\"stylesheet\" href=\"${url}\">`\n\t\t})\n\t}\n\n\t// Add custom styles\n\tif (options.styles) {\n\t\tconst customStyles = Array.isArray(options.styles) ? options.styles.join('\\n') : options.styles\n\t\tstyles += `<style>${customStyles}</style>`\n\t}\n\n\t// Add print-specific styles\n\tstyles += `\n\t\t<style>\n\t\t\t@media print {\n\t\t\t\tbody { margin: 0; padding: 20px; }\n\t\t\t\t${options.printClass ? `.${options.printClass} { page-break-inside: avoid; }` : ''}\n\t\t\t}\n\t\t</style>\n\t`\n\n\t// Build HTML\n\tconst title = options.title || document.title || 'Print'\n\tconst content = el.outerHTML\n\n\treturn `<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>${title}</title>\n\t${styles}\n</head>\n<body>\n\t${content}\n</body>\n</html>`\n}\n\n/**\n * Wait for images to load\n */\nfunction waitForImages(doc: Document): Promise<void[]> {\n\tconst images = doc.querySelectorAll('img')\n\tconst promises: Promise<void>[] = []\n\n\timages.forEach(img => {\n\t\tif (!img.complete) {\n\t\t\tpromises.push(\n\t\t\t\tnew Promise(resolve => {\n\t\t\t\t\timg.onload = () => resolve()\n\t\t\t\t\timg.onerror = () => resolve()\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t})\n\n\treturn Promise.all(promises)\n}\n\nexport default vPrint\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Progress bar position\n */\nexport type ProgressPosition = 'top' | 'bottom'\n\n/**\n * Progress directive options\n */\nexport interface ProgressOptions {\n\t/**\n\t * Current progress value (0-100)\n\t */\n\tvalue: number\n\n\t/**\n\t * Maximum value\n\t * @default 100\n\t */\n\tmax?: number\n\n\t/**\n\t * Minimum value\n\t * @default 0\n\t */\n\tmin?: number\n\n\t/**\n\t * Progress bar height\n\t * @default 4\n\t */\n\theight?: number\n\n\t/**\n\t * Progress bar color\n\t * @default '#42b883'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Background color\n\t * @default 'rgba(0, 0, 0, 0.1)'\n\t */\n\tbackgroundColor?: string\n\n\t/**\n\t * Transition duration in milliseconds\n\t * @default 300\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to show percentage text\n\t * @default false\n\t */\n\tshowText?: boolean\n\n\t/**\n\t * Whether to animate on mount\n\t * @default true\n\t */\n\tanimate?: boolean\n\n\t/**\n\t * Indeterminate mode\n\t * @default false\n\t */\n\tindeterminate?: boolean\n\n\t/**\n\t * Stripe pattern\n\t * @default false\n\t */\n\tstriped?: boolean\n\n\t/**\n\t * Animate stripes\n\t * @default false\n\t */\n\tanimated?: boolean\n\n\t/**\n\t * Position (top or bottom of container)\n\t * @default 'top'\n\t */\n\tposition?: ProgressPosition\n\n\t/**\n\t * Custom class\n\t */\n\tclass?: string\n\n\t/**\n\t * Callback when progress changes\n\t */\n\tonChange?: (value: number, percent: number) => void\n\n\t/**\n\t * Callback when animation completes\n\t */\n\tonComplete?: () => void\n}\n\n/**\n * Directive binding value type\n */\nexport type ProgressBinding = number | ProgressOptions\n\n/**\n * Element state storage\n */\ninterface ProgressState {\n\toptions: ProgressOptions\n\tprogressBar: HTMLDivElement | null\n\tcontainer: HTMLDivElement | null\n\tcurrentValue: number\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ProgressBinding | undefined): ProgressOptions {\n\tif (typeof binding === 'number') {\n\t\treturn { value: binding }\n\t}\n\n\treturn {\n\t\tvalue: 0,\n\t\tmax: 100,\n\t\tmin: 0,\n\t\theight: 4,\n\t\tcolor: '#42b883',\n\t\tbackgroundColor: 'rgba(0, 0, 0, 0.1)',\n\t\tduration: 300,\n\t\tshowText: false,\n\t\tanimate: true,\n\t\tindeterminate: false,\n\t\tstriped: false,\n\t\tanimated: false,\n\t\tposition: 'top',\n\t\t...(binding || {}),\n\t}\n}\n\n/**\n * Create progress bar container\n */\nfunction createProgressContainer(options: ProgressOptions): { container: HTMLDivElement, progressBar: HTMLDivElement } {\n\tconst container = document.createElement('div')\n\tcontainer.className = `v-progress ${options.class || ''}`\n\n\tcontainer.style.cssText = `\n position: absolute;\n ${options.position === 'bottom' ? 'bottom' : 'top'}: 0;\n left: 0;\n right: 0;\n height: ${options.height}px;\n background: ${options.backgroundColor};\n overflow: hidden;\n z-index: 1000;\n `\n\n\tconst progressBar = document.createElement('div')\n\tprogressBar.className = 'v-progress__bar'\n\n\tlet barStyle = `\n height: 100%;\n background-color: ${options.color};\n transition: ${options.animate !== false ? `width ${options.duration}ms ease` : 'none'};\n width: 0%;\n `\n\n\tif (options.striped) {\n\t\tbarStyle += `\n background-image: linear-gradient(\n 45deg,\n rgba(255, 255, 255, 0.15) 25%,\n transparent 25%,\n transparent 50%,\n rgba(255, 255, 255, 0.15) 50%,\n rgba(255, 255, 255, 0.15) 75%,\n transparent 75%,\n transparent\n );\n background-size: 1rem 1rem;\n `\n\t}\n\n\tprogressBar.style.cssText = barStyle\n\n\t// Add animation for indeterminate or animated stripes\n\tif (options.indeterminate) {\n\t\tprogressBar.classList.add('v-progress--indeterminate')\n\t\tprogressBar.style.width = '30%'\n\t\tprogressBar.style.animation = 'v-progress-indeterminate 1.5s infinite linear'\n\t} else if (options.animated) {\n\t\tprogressBar.style.animation = 'v-progress-stripes 1s linear infinite'\n\t}\n\n\tcontainer.appendChild(progressBar)\n\n\t// Add text if enabled\n\tif (options.showText) {\n\t\tconst textEl = document.createElement('span')\n\t\ttextEl.className = 'v-progress__text'\n\t\ttextEl.style.cssText = `\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: ${Math.max((options.height || 4) - 2, 10)}px;\n color: #fff;\n text-shadow: 0 0 2px rgba(0, 0, 0, 0.5);\n `\n\t\tcontainer.appendChild(textEl)\n\t}\n\n\treturn { container, progressBar }\n}\n\n/**\n * Ensure global styles\n */\nfunction ensureStyles(): void {\n\tif (!isBrowser()) return\n\n\tconst styleId = 'v-progress-styles'\n\tif (document.getElementById(styleId)) return\n\n\tconst style = document.createElement('style')\n\tstyle.id = styleId\n\tstyle.textContent = `\n @keyframes v-progress-stripes {\n from { background-position: 1rem 0; }\n to { background-position: 0 0; }\n }\n @keyframes v-progress-indeterminate {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(400%); }\n }\n .v-progress--indeterminate {\n position: absolute;\n width: 30% !important;\n }\n `\n\n\tdocument.head.appendChild(style)\n}\n\n/**\n * v-progress directive\n * Progress bar animation\n *\n * @example\n * ```vue\n * <template>\n * <div v-progress=\"50\">Progress at 50%</div>\n *\n * <div v-progress=\"{\n * value: progressValue,\n * color: '#42b883',\n * height: 8,\n * showText: true\n * }\">\n * Content\n * </div>\n *\n * <div v-progress=\"{ indeterminate: true }\">\n * Loading...\n * </div>\n * </template>\n * ```\n */\nexport const vProgress = defineDirective<ProgressBinding, HTMLElement>({\n\tname: 'progress',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tensureStyles()\n\n\t\t// Ensure parent has position\n\t\tconst computedStyle = getComputedStyle(el)\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\tconst { container, progressBar } = createProgressContainer(options)\n\n\t\tconst state: ProgressState = {\n\t\t\toptions,\n\t\t\tprogressBar,\n\t\t\tcontainer,\n\t\t\tcurrentValue: 0,\n\t\t}\n\n\t\t;(el as any).__progress = state\n\n\t\tel.appendChild(container)\n\n\t\t// Set initial progress\n\t\tif (!options.indeterminate) {\n\t\t\tsetProgress(state, options.value)\n\t\t}\n\n\t\tel.classList.add('v-progress-container')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ProgressState = (el as any).__progress\n\n\t\tif (!state) return\n\n\t\tconst oldOptions = state.options\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tstate.options = newOptions\n\n\t\t// Update styles\n\t\tif (state.container) {\n\t\t\tstate.container.style.height = `${newOptions.height}px`\n\t\t\tstate.container.style.background = newOptions.backgroundColor || 'rgba(0, 0, 0, 0.1)'\n\t\t}\n\n\t\tif (state.progressBar) {\n\t\t\tstate.progressBar.style.backgroundColor = newOptions.color || '#42b883'\n\t\t}\n\n\t\t// Handle indeterminate state change\n\t\tif (oldOptions.indeterminate !== newOptions.indeterminate && state.progressBar) {\n\t\t\tif (newOptions.indeterminate) {\n\t\t\t\t// Start indeterminate animation\n\t\t\t\tstate.progressBar.classList.add('v-progress--indeterminate')\n\t\t\t\tstate.progressBar.style.width = '30%'\n\t\t\t\tstate.progressBar.style.animation = 'v-progress-indeterminate 1.5s infinite linear'\n\t\t\t} else {\n\t\t\t\t// Stop indeterminate animation\n\t\t\t\tstate.progressBar.classList.remove('v-progress--indeterminate')\n\t\t\t\tstate.progressBar.style.animation = ''\n\t\t\t\t// Set to current value\n\t\t\t\tsetProgress(state, newOptions.value)\n\t\t\t}\n\t\t} else if (!newOptions.indeterminate && newOptions.value !== oldOptions.value) {\n\t\t\t// Update progress value\n\t\t\tsetProgress(state, newOptions.value)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ProgressState = (el as any).__progress\n\n\t\tif (!state) return\n\n\t\tif (state.container && state.container.parentNode) {\n\t\t\tstate.container.parentNode.removeChild(state.container)\n\t\t}\n\n\t\tel.classList.remove('v-progress-container')\n\t\tdelete (el as any).__progress\n\t},\n})\n\n/**\n * Set progress value\n */\nfunction setProgress(state: ProgressState, value: number): void {\n\tconst { options, progressBar, container } = state\n\n\tif (!progressBar || !container) return\n\n\tconst min = options.min || 0\n\tconst max = options.max || 100\n\tconst clampedValue = Math.max(min, Math.min(max, value))\n\tconst percent = ((clampedValue - min) / (max - min)) * 100\n\n\tprogressBar.style.width = `${percent}%`\n\n\t// Update text\n\tif (options.showText) {\n\t\tconst textEl = container.querySelector('.v-progress__text') as HTMLSpanElement\n\t\tif (textEl) {\n\t\t\ttextEl.textContent = `${Math.round(percent)}%`\n\t\t}\n\t}\n\n\tstate.currentValue = clampedValue\n\toptions.onChange?.(clampedValue, percent)\n\n\t// Check for completion\n\tif (percent >= 100) {\n\t\toptions.onComplete?.()\n\t}\n}\n\nexport default vProgress\n", "import { defineDirective } from '@directix/core'\n\nexport type PullRefreshHandler = () => Promise<void> | void\n\nexport type PullRefreshState = 'idle' | 'pulling' | 'ready' | 'loading' | 'success' | 'error'\n\nexport interface PullRefreshOptions {\n\thandler: PullRefreshHandler\n\tdistance?: number\n\tmaxDistance?: number\n\tdisabled?: boolean\n\tindicator?: {\n\t\tidle?: string\n\t\tpulling?: string\n\t\tready?: string\n\t\tloading?: string\n\t\tsuccess?: string\n\t\terror?: string\n\t}\n\tsuccessDuration?: number\n\terrorDuration?: number\n\tonStateChange?: (state: PullRefreshState) => void\n}\n\nexport type PullRefreshBinding = PullRefreshHandler | PullRefreshOptions\n\ninterface PullRefreshInternalState {\n\toptions: PullRefreshOptions\n\tstate: PullRefreshState\n\tstartY: number\n\tcurrentY: number\n\tpulling: boolean\n\tindicatorEl: HTMLDivElement\n\tcontentEl: HTMLElement\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: () => void\n\t}\n}\n\nconst DEFAULT_DISTANCE = 60\nconst DEFAULT_MAX_DISTANCE = 100\nconst DEFAULT_SUCCESS_DURATION = 500\nconst DEFAULT_ERROR_DURATION = 1000\n\nconst DEFAULT_INDICATORS: Record<PullRefreshState, string> = {\n\tidle: '\u2193',\n\tpulling: '\u2193 Pull',\n\tready: '\u2193 Release',\n\tloading: '\u27F3 Loading...',\n\tsuccess: '\u2713 Done',\n\terror: '\u2717 Failed',\n}\n\nfunction normalizeOptions(binding: PullRefreshBinding): PullRefreshOptions {\n\tif (typeof binding === 'function') return { handler: binding }\n\n\treturn {\n\t\thandler: binding.handler,\n\t\tdistance: binding.distance ?? DEFAULT_DISTANCE,\n\t\tmaxDistance: binding.maxDistance ?? DEFAULT_MAX_DISTANCE,\n\t\tdisabled: binding.disabled ?? false,\n\t\tindicator: binding.indicator,\n\t\tsuccessDuration: binding.successDuration ?? DEFAULT_SUCCESS_DURATION,\n\t\terrorDuration: binding.errorDuration ?? DEFAULT_ERROR_DURATION,\n\t\tonStateChange: binding.onStateChange,\n\t}\n}\n\nfunction createIndicator(): HTMLDivElement {\n\tconst el = document.createElement('div')\n\tel.className = 'v-pull-refresh__indicator'\n\tel.style.cssText = `\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tright: 0;\n\t\theight: 60px;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tbackground: #f5f5f5;\n\t\tfont-size: 14px;\n\t\tcolor: #666;\n\t\tz-index: 10;\n\t\tpointer-events: none;\n\t\topacity: 0;\n\t\ttransition: opacity 0.2s ease;\n\t`\n\treturn el\n}\n\nfunction updateIndicator(el: HTMLDivElement, state: PullRefreshState, options: PullRefreshOptions): void {\n\tconst customIndicator = options.indicator?.[state]\n\tel.textContent = customIndicator || DEFAULT_INDICATORS[state]\n}\n\nfunction setState(internal: PullRefreshInternalState, newState: PullRefreshState): void {\n\tif (internal.state === newState) return\n\n\tinternal.state = newState\n\tupdateIndicator(internal.indicatorEl, newState, internal.options)\n\tinternal.options.onStateChange?.(newState)\n}\n\nfunction applyTransform(internal: PullRefreshInternalState, distance: number, showIndicator: boolean): void {\n\tinternal.contentEl.style.transform = `translateY(${distance}px)`\n\tinternal.indicatorEl.style.opacity = showIndicator ? '1' : '0'\n\tinternal.indicatorEl.style.transform = `translateY(${distance}px)`\n}\n\nfunction resetPosition(internal: PullRefreshInternalState): void {\n\tinternal.contentEl.style.transform = ''\n\tinternal.indicatorEl.style.opacity = '0'\n\tsetState(internal, 'idle')\n}\n\nasync function triggerRefresh(internal: PullRefreshInternalState): Promise<void> {\n\tsetState(internal, 'loading')\n\n\tconst distance = internal.options.distance!\n\tapplyTransform(internal, distance, true)\n\n\ttry {\n\t\tawait internal.options.handler()\n\t\tsetState(internal, 'success')\n\t\tawait sleep(internal.options.successDuration!)\n\t} catch {\n\t\tsetState(internal, 'error')\n\t\tawait sleep(internal.options.errorDuration!)\n\t} finally {\n\t\tresetPosition(internal)\n\t}\n}\n\nfunction sleep(ms: number): Promise<void> {\n\treturn new Promise(resolve => setTimeout(resolve, ms))\n}\n\nfunction createHandlers(internal: PullRefreshInternalState): PullRefreshInternalState['handlers'] {\n\tconst { contentEl, options } = internal\n\n\treturn {\n\t\ttouchStart: (e: TouchEvent) => {\n\t\t\tif (options.disabled || internal.state === 'loading') return\n\t\t\tif (contentEl.scrollTop > 0) return\n\n\t\t\tinternal.pulling = true\n\t\t\tinternal.startY = e.touches[0].clientY\n\t\t\tinternal.currentY = internal.startY\n\t\t\tsetState(internal, 'idle')\n\t\t},\n\n\t\ttouchMove: (e: TouchEvent) => {\n\t\t\tif (!internal.pulling || options.disabled || internal.state === 'loading') return\n\n\t\t\tinternal.currentY = e.touches[0].clientY\n\t\t\tconst diff = internal.currentY - internal.startY\n\n\t\t\t// Handle upward swipe - reset\n\t\t\tif (diff <= 0) {\n\t\t\t\tif (contentEl.style.transform) {\n\t\t\t\t\tcontentEl.style.transition = ''\n\t\t\t\t\tresetPosition(internal)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Prevent page scroll\n\t\t\te.preventDefault()\n\n\t\t\tconst distance = Math.min(diff * 0.5, options.maxDistance!)\n\t\t\tconst progress = distance / options.distance!\n\n\t\t\tcontentEl.style.transition = 'none'\n\t\t\tapplyTransform(internal, distance, true)\n\t\t\tsetState(internal, progress >= 1 ? 'ready' : 'pulling')\n\t\t},\n\n\t\ttouchEnd: () => {\n\t\t\tif (!internal.pulling || options.disabled) return\n\n\t\t\tinternal.pulling = false\n\t\t\tconst diff = internal.currentY - internal.startY\n\t\t\tconst distance = Math.min(diff * 0.5, options.maxDistance!)\n\n\t\t\tcontentEl.style.transition = ''\n\n\t\t\tif (internal.state === 'ready' && distance >= options.distance!) {\n\t\t\t\ttriggerRefresh(internal)\n\t\t\t} else {\n\t\t\t\tresetPosition(internal)\n\t\t\t}\n\t\t},\n\t}\n}\n\nfunction bindEvents(el: HTMLElement, handlers: PullRefreshInternalState['handlers']): void {\n\tel.addEventListener('touchstart', handlers.touchStart, { passive: false })\n\tel.addEventListener('touchmove', handlers.touchMove, { passive: false })\n\tel.addEventListener('touchend', handlers.touchEnd, { passive: true })\n}\n\nfunction unbindEvents(el: HTMLElement, handlers: PullRefreshInternalState['handlers']): void {\n\tel.removeEventListener('touchstart', handlers.touchStart)\n\tel.removeEventListener('touchmove', handlers.touchMove)\n\tel.removeEventListener('touchend', handlers.touchEnd)\n}\n\nexport const vPullRefresh = defineDirective<PullRefreshBinding, HTMLElement>({\n\tname: 'pull-refresh',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Setup container\n\t\tel.style.position = 'relative'\n\t\tel.style.overflow = 'hidden'\n\t\tel.classList.add('v-pull-refresh')\n\n\t\t// Create content wrapper\n\t\tconst contentEl = document.createElement('div')\n\t\tcontentEl.className = 'v-pull-refresh__content'\n\t\tcontentEl.style.cssText = 'position: relative; height: 100%; overflow-y: auto;'\n\n\t\t// Move children to wrapper\n\t\twhile (el.firstChild) {\n\t\t\tcontentEl.appendChild(el.firstChild)\n\t\t}\n\t\tel.appendChild(contentEl)\n\n\t\t// Create indicator\n\t\tconst indicatorEl = createIndicator()\n\t\tel.insertBefore(indicatorEl, contentEl)\n\n\t\t// Initialize state\n\t\tconst internal: PullRefreshInternalState = {\n\t\t\toptions,\n\t\t\tstate: 'idle',\n\t\t\tstartY: 0,\n\t\t\tcurrentY: 0,\n\t\t\tpulling: false,\n\t\t\tindicatorEl,\n\t\t\tcontentEl,\n\t\t\thandlers: null as any,\n\t\t}\n\n\t\tinternal.handlers = createHandlers(internal)\n\t\t;(el as any).__pullRefresh = internal\n\n\t\tif (!options.disabled) {\n\t\t\tbindEvents(el, internal.handlers)\n\t\t}\n\n\t\tupdateIndicator(indicatorEl, 'idle', options)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst internal: PullRefreshInternalState = (el as any).__pullRefresh\n\t\tif (!internal) return\n\n\t\tconst wasDisabled = internal.options.disabled\n\t\tinternal.options = normalizeOptions(binding.value)\n\n\t\tupdateIndicator(internal.indicatorEl, internal.state, internal.options)\n\n\t\tif (internal.options.disabled && !wasDisabled) {\n\t\t\tunbindEvents(el, internal.handlers)\n\t\t} else if (!internal.options.disabled && wasDisabled) {\n\t\t\tbindEvents(el, internal.handlers)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst internal: PullRefreshInternalState = (el as any).__pullRefresh\n\t\tif (!internal) return\n\n\t\tunbindEvents(el, internal.handlers)\n\t\tdelete (el as any).__pullRefresh\n\t},\n})\n\nexport default vPullRefresh\n", "import { defineDirective, isBrowser, supportsResizeObserver } from '@directix/core'\nimport { ensurePosition } from '@directix/shared'\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 positioning for fallback\n\t\tensurePosition(el)\n\n\t\tconst state: ResizeState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t\tdebounceTimer: null,\n\t\t\tpendingEntry: null,\n\t\t\tfallbackIframe: null,\n\t\t\thandler: (entry: ResizeObserverEntry) => {\n\t\t\t\t// Handle debounce\n\t\t\t\tif (options.debounce && options.debounce > 0) {\n\t\t\t\t\tstate.pendingEntry = entry\n\n\t\t\t\t\tif (!state.debounceTimer) {\n\t\t\t\t\t\tstate.debounceTimer = setTimeout(() => {\n\t\t\t\t\t\t\tif (state.pendingEntry) {\n\t\t\t\t\t\t\t\toptions.handler(state.pendingEntry)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate.debounceTimer = null\n\t\t\t\t\t\t\tstate.pendingEntry = null\n\t\t\t\t\t\t}, options.debounce)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\toptions.handler(entry)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__resize = state\n\n\t\t// Use ResizeObserver if available\n\t\tif (supportsResizeObserver()) {\n\t\t\tstate.observer = new ResizeObserver(entries => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tstate.handler(entry)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate.observer.observe(el, { box: options.box })\n\t\t} else {\n\t\t\t// Fallback using iframe\n\t\t\tconsole.warn('[Directix] v-resize: ResizeObserver not supported, using fallback')\n\n\t\t\tconst { iframe, cleanup } = createFallbackResize(el, () => {\n\t\t\t\tconst rect = el.getBoundingClientRect()\n\t\t\t\tconst entry = {\n\t\t\t\t\ttarget: el,\n\t\t\t\t\tcontentRect: rect as DOMRectReadOnly,\n\t\t\t\t\tborderBoxSize: [] as any,\n\t\t\t\t\tcontentBoxSize: [] as any,\n\t\t\t\t\tdevicePixelContentBoxSize: [] as any,\n\t\t\t\t}\n\n\t\t\t\tstate.handler(entry as ResizeObserverEntry)\n\n\t\t\t\tif (options.onFallback) {\n\t\t\t\t\toptions.onFallback(getResizeInfo(entry as ResizeObserverEntry))\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate.fallbackIframe = iframe\n\t\t\t;(el as any).__resizeCleanup = cleanup\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ResizeState = (el as any).__resize\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ResizeState = (el as any).__resize\n\n\t\tif (!state) return\n\n\t\t// Clear debounce timer\n\t\tif (state.debounceTimer) {\n\t\t\tclearTimeout(state.debounceTimer)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\t// Cleanup fallback\n\t\tconst cleanup = (el as any).__resizeCleanup\n\n\t\tif (cleanup) {\n\t\t\tcleanup()\n\t\t}\n\n\t\tdelete (el as any).__resize\n\t\tdelete (el as any).__resizeCleanup\n\t},\n})\n\nexport default vResize\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { ensureOverflowHidden, ensurePosition, 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 and overflow\n\t\tensurePosition(el)\n\t\tensureOverflowHidden(el)\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\n/**\n * Rotate gesture event data\n */\nexport interface RotateGestureEvent {\n\t/** Original event */\n\toriginalEvent: TouchEvent\n\t/** Rotation angle in degrees */\n\tangle: number\n\t/** Rotation angle in radians */\n\tradians: number\n\t/** Current angle relative to start */\n\trotation: number\n\t/** Center point X */\n\tcenterX: number\n\t/** Center point Y */\n\tcenterY: number\n\t/** Whether rotation is in progress */\n\tisRotating: boolean\n\t/** Whether rotation just started */\n\tisFirst: boolean\n\t/** Whether rotation just ended */\n\tisFinal: boolean\n}\n\n/**\n * Rotate directive options\n */\nexport interface RotateGestureOptions {\n\t/**\n\t * Callback when rotation starts\n\t */\n\tonStart?: (e: RotateGestureEvent) => void\n\n\t/**\n\t * Callback during rotation\n\t */\n\tonRotate?: (e: RotateGestureEvent) => void\n\n\t/**\n\t * Callback when rotation ends\n\t */\n\tonEnd?: (e: RotateGestureEvent) => void\n\n\t/**\n\t * Whether to prevent default behavior\n\t * @default true\n\t */\n\tpreventDefault?: boolean\n\n\t/**\n\t * Whether to stop propagation\n\t * @default false\n\t */\n\tstopPropagation?: boolean\n\n\t/**\n\t * Enable rotation transform on element\n\t * @default false\n\t */\n\tenableTransform?: boolean\n\n\t/**\n\t * Transform origin for rotation\n\t * @default 'center center'\n\t */\n\ttransformOrigin?: string\n}\n\n/**\n * Directive binding value type\n */\nexport type RotateGestureBinding = RotateGestureOptions['onRotate'] | RotateGestureOptions\n\n/**\n * Element state storage\n */\ninterface RotateGestureState {\n\toptions: RotateGestureOptions\n\tinitialAngle: number\n\tcurrentAngle: number\n\tisRotating: boolean\n\ttouchstartHandler: (e: Event) => void\n\ttouchmoveHandler: (e: Event) => void\n\ttouchendHandler: (e: Event) => void\n\tbaseRotation: number\n\tsavedTransition: string\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: RotateGestureBinding): RotateGestureOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { onRotate: binding }\n\t}\n\n\treturn {\n\t\tpreventDefault: true,\n\t\tstopPropagation: false,\n\t\tenableTransform: false,\n\t\ttransformOrigin: 'center center',\n\t\t...binding,\n\t}\n}\n\n/**\n * Get angle between two touch points\n */\nfunction getAngle(touches: TouchList): number {\n\tif (touches.length < 2) return 0\n\tconst dx = touches[1].clientX - touches[0].clientX\n\tconst dy = touches[1].clientY - touches[0].clientY\n\t// Return angle in degrees\n\treturn Math.atan2(dy, dx) * (180 / Math.PI)\n}\n\n/**\n * Get center point between two touch points\n */\nfunction getCenter(touches: TouchList): { x: number, y: number } {\n\tif (touches.length < 2) return { x: touches[0].clientX, y: touches[0].clientY }\n\treturn {\n\t\tx: (touches[0].clientX + touches[1].clientX) / 2,\n\t\ty: (touches[0].clientY + touches[1].clientY) / 2,\n\t}\n}\n\n/**\n * Create rotate event object\n */\nfunction createRotateEvent(\n\toriginalEvent: TouchEvent,\n\tstate: RotateGestureState,\n\tisFirst: boolean = false,\n\tisFinal: boolean = false,\n): RotateGestureEvent {\n\tconst center = getCenter(originalEvent.touches)\n\tconst radians = state.currentAngle * (Math.PI / 180)\n\n\treturn {\n\t\toriginalEvent,\n\t\tangle: state.currentAngle,\n\t\tradians,\n\t\trotation: state.currentAngle - state.initialAngle,\n\t\tcenterX: center.x,\n\t\tcenterY: center.y,\n\t\tisRotating: state.isRotating,\n\t\tisFirst,\n\t\tisFinal,\n\t}\n}\n\n/**\n * v-rotate directive\n * Two-finger rotation gesture\n *\n * @example\n * ```vue\n * <template>\n * <div v-rotate=\"handleRotate\">Rotate with two fingers</div>\n *\n * <div v-rotate=\"{\n * onRotate: handleRotate,\n * enableTransform: true\n * }\">\n * Rotate with transform\n * </div>\n * </template>\n *\n * <script setup>\n * function handleRotate(e) {\n * console.log('Rotation:', e.rotation)\n * console.log('Angle:', e.angle)\n * }\n * </script>\n * ```\n */\nexport const vRotateGesture = defineDirective<RotateGestureBinding, HTMLElement>({\n\tname: 'rotate-gesture',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state: RotateGestureState = {\n\t\t\toptions,\n\t\t\tinitialAngle: 0,\n\t\t\tcurrentAngle: 0,\n\t\t\tisRotating: false,\n\t\t\tbaseRotation: 0,\n\t\t\tsavedTransition: '',\n\t\t\ttouchstartHandler: (e: Event) => handleStart(e as TouchEvent, state, el),\n\t\t\ttouchmoveHandler: (e: Event) => handleMove(e as TouchEvent, state, el),\n\t\t\ttouchendHandler: (e: Event) => handleEnd(e as TouchEvent, state, el),\n\t\t}\n\n\t\t;(el as any).__rotateGesture = state\n\n\t\ton(el, 'touchstart', state.touchstartHandler, { passive: false })\n\t\ton(el, 'touchmove', state.touchmoveHandler, { passive: false })\n\t\ton(el, 'touchend', state.touchendHandler)\n\t\ton(el, 'touchcancel', state.touchendHandler)\n\n\t\tel.classList.add('v-rotate-gesture')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: RotateGestureState = (el as any).__rotateGesture\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: RotateGestureState = (el as any).__rotateGesture\n\t\tif (!state) return\n\n\t\toff(el, 'touchstart', state.touchstartHandler)\n\t\toff(el, 'touchmove', state.touchmoveHandler)\n\t\toff(el, 'touchend', state.touchendHandler)\n\t\toff(el, 'touchcancel', state.touchendHandler)\n\n\t\tel.classList.remove('v-rotate-gesture')\n\t\tdelete (el as any).__rotateGesture\n\t},\n})\n\n/**\n * Handle rotation start\n */\nfunction handleStart(e: TouchEvent, state: RotateGestureState, el: HTMLElement): void {\n\tif (e.touches.length !== 2) return\n\n\tstate.initialAngle = getAngle(e.touches)\n\tstate.currentAngle = state.initialAngle\n\tstate.isRotating = false\n\n\tif (state.options.enableTransform) {\n\t\t// Get current rotation from transform\n\t\tconst transform = getComputedStyle(el).transform\n\t\tconst matrix = new DOMMatrix(transform)\n\t\t// Extract rotation angle from matrix\n\t\tstate.baseRotation = Math.atan2(matrix.b, matrix.a) * (180 / Math.PI)\n\t\t// Disable transition during rotation for smooth response\n\t\tstate.savedTransition = el.style.transition\n\t\tel.style.transition = 'none'\n\t}\n\n\tif (state.options.preventDefault) {\n\t\te.preventDefault()\n\t}\n\tif (state.options.stopPropagation) {\n\t\te.stopPropagation()\n\t}\n}\n\n/**\n * Handle rotation move\n */\nfunction handleMove(e: TouchEvent, state: RotateGestureState, el: HTMLElement): void {\n\tif (e.touches.length !== 2) return\n\n\tstate.currentAngle = getAngle(e.touches)\n\n\tif (state.options.preventDefault) {\n\t\te.preventDefault()\n\t}\n\n\tconst wasRotating = state.isRotating\n\tstate.isRotating = true\n\n\tconst rotateEvent = createRotateEvent(e, state, !wasRotating)\n\n\tif (!wasRotating) {\n\t\tstate.options.onStart?.(rotateEvent)\n\t}\n\n\t// Apply transform if enabled\n\tif (state.options.enableTransform) {\n\t\tconst rotation = state.currentAngle - state.initialAngle\n\t\tconst transformOrigin = state.options.transformOrigin || 'center center'\n\t\tel.style.transformOrigin = transformOrigin\n\t\tel.style.transform = `rotate(${state.baseRotation + rotation}deg)`\n\t}\n\n\tstate.options.onRotate?.(rotateEvent)\n}\n\n/**\n * Handle rotation end\n */\nfunction handleEnd(e: TouchEvent, state: RotateGestureState, el: HTMLElement): void {\n\tif (!state.isRotating) return\n\n\t// Restore transition\n\tif (state.options.enableTransform) {\n\t\tel.style.transition = state.savedTransition\n\t}\n\n\t// Create final event\n\tconst finalEvent = {\n\t\t...e,\n\t\ttouches: e.touches.length >= 2 ? e.touches : ([] as any),\n\t} as TouchEvent\n\n\tconst rotateEvent = createRotateEvent(finalEvent, state, false, true)\n\tstate.options.onEnd?.(rotateEvent)\n\n\tstate.isRotating = false\n\tstate.initialAngle = 0\n\tstate.currentAngle = 0\n}\n\nexport default vRotateGesture\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\t// Store options even when disabled so updated hook can work\n\t\t;(el as any).__sanitize = { options }\n\n\t\tif (options.disabled) return\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\tconst prevDisabled = state.options.disabled\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\tif (state.options.disabled || !state.options.sanitizeOnUpdate) {\n\t\t\t// If was previously disabled and now enabled, sanitize\n\t\t\tif (prevDisabled && !state.options.disabled) {\n\t\t\t\tconst content = el.innerHTML\n\t\t\t\tif (content) {\n\t\t\t\t\tel.innerHTML = sanitizeHtml(content, state.options)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// Sanitize updated content\n\t\tconst content = el.innerHTML\n\n\t\tif (content) {\n\t\t\tel.innerHTML = sanitizeHtml(content, state.options)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tdelete (el as any).__sanitize\n\t},\n})\n\nexport default vSanitize\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\n/**\n * Scroll event handler\n */\nexport type ScrollHandler = (event: Event, info: ScrollInfo) => void\n\n/**\n * Scroll information\n */\nexport interface ScrollInfo {\n\t/** Current scroll left position */\n\tscrollLeft: number\n\t/** Current scroll top position */\n\tscrollTop: number\n\t/** Maximum scroll left */\n\tscrollLeftMax: number\n\t/** Maximum scroll top */\n\tscrollTopMax: number\n\t/** Horizontal scroll progress (0-1) */\n\tprogressX: number\n\t/** Vertical scroll progress (0-1) */\n\tprogressY: number\n\t/** Direction of horizontal scroll (-1: left, 1: right, 0: none) */\n\tdirectionX: -1 | 0 | 1\n\t/** Direction of vertical scroll (-1: up, 1: down, 0: none) */\n\tdirectionY: -1 | 0 | 1\n\t/** Scroll container element or window */\n\tcontainer: Element | Window\n}\n\n/**\n * Scroll directive options\n */\nexport interface ScrollOptions {\n\t/**\n\t * Scroll event handler\n\t * @required\n\t */\n\thandler: ScrollHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to use passive event listener\n\t * @default true\n\t */\n\tpassive?: boolean\n\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 0 (no throttle)\n\t */\n\tthrottle?: number\n\n\t/**\n\t * Custom scroll container selector or element\n\t */\n\tcontainer?: string | Element | Window | null\n}\n\n/**\n * Directive binding value type\n */\nexport type ScrollBinding = ScrollHandler | ScrollOptions\n\n/**\n * Element state storage\n */\ninterface ScrollState {\n\toptions: ScrollOptions\n\tscrollHandler: (e: Event) => void\n\tcontainer: Element | Window\n\tlastScrollLeft: number\n\tlastScrollTop: number\n\tthrottleTimer: ReturnType<typeof setTimeout> | null\n\tpendingEvent: Event | null\n}\n\n/**\n * Get scroll info\n */\nfunction getScrollInfo(container: Element | Window, lastScrollLeft: number, lastScrollTop: number): ScrollInfo {\n\tlet scrollLeft = 0,\n\t\tscrollTop = 0,\n\t\tscrollLeftMax = 0,\n\t\tscrollTopMax = 0\n\n\tif (container === window) {\n\t\tscrollLeft = window.scrollX || document.documentElement.scrollLeft\n\t\tscrollTop = window.scrollY || document.documentElement.scrollTop\n\t\tscrollLeftMax = document.documentElement.scrollWidth - window.innerWidth\n\t\tscrollTopMax = document.documentElement.scrollHeight - window.innerHeight\n\t} else {\n\t\tconst el = container as Element\n\n\t\tscrollLeft = el.scrollLeft\n\t\tscrollTop = el.scrollTop\n\t\tscrollLeftMax = el.scrollWidth - el.clientWidth\n\t\tscrollTopMax = el.scrollHeight - el.clientHeight\n\t}\n\n\tconst progressX = scrollLeftMax > 0 ? scrollLeft / scrollLeftMax : 0\n\tconst progressY = scrollTopMax > 0 ? scrollTop / scrollTopMax : 0\n\n\t// Calculate direction\n\tconst directionX: -1 | 0 | 1 = scrollLeft !== lastScrollLeft ? (scrollLeft > lastScrollLeft ? 1 : -1) : 0\n\tconst directionY: -1 | 0 | 1 = scrollTop !== lastScrollTop ? (scrollTop > lastScrollTop ? 1 : -1) : 0\n\n\treturn {\n\t\tscrollLeft,\n\t\tscrollTop,\n\t\tscrollLeftMax,\n\t\tscrollTopMax,\n\t\tprogressX,\n\t\tprogressY,\n\t\tdirectionX,\n\t\tdirectionY,\n\t\tcontainer,\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ScrollBinding | undefined): ScrollOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, passive: true }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-scroll: handler is required')\n\t}\n\n\treturn {\n\t\tpassive: true,\n\t\tthrottle: 0,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-scroll directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-scroll=\"handleScroll\">Scroll container</div>\n * <div v-scroll=\"{ handler: handleScroll, throttle: 100 }\">Throttled scroll</div>\n * </template>\n * ```\n */\nexport const vScroll = defineDirective<ScrollBinding, HTMLElement>({\n\tname: 'scroll',\n\tssr: false,\n\tdefaults: {\n\t\tpassive: true,\n\t\tthrottle: 0,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Determine scroll container\n\t\tlet container: Element | Window\n\n\t\tif (options.container) {\n\t\t\tif (options.container === window) {\n\t\t\t\tcontainer = window\n\t\t\t} else if (typeof options.container === 'string') {\n\t\t\t\tconst found = document.querySelector(options.container)\n\n\t\t\t\tcontainer = found || getScrollParent(el)\n\t\t\t} else {\n\t\t\t\tcontainer = options.container\n\t\t\t}\n\t\t} else {\n\t\t\t// Check if element itself is scrollable\n\t\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(el)\n\t\t\tconst isSelfScrollable = /(auto|scroll)/.test(overflow + overflowX + overflowY)\n\n\t\t\tcontainer = isSelfScrollable ? el : getScrollParent(el)\n\t\t}\n\n\t\tconst state: ScrollState = {\n\t\t\toptions,\n\t\t\tcontainer,\n\t\t\tlastScrollLeft: 0,\n\t\t\tlastScrollTop: 0,\n\t\t\tthrottleTimer: null,\n\t\t\tpendingEvent: null,\n\t\t\tscrollHandler: (e: Event) => {\n\t\t\t\t// Handle throttle\n\t\t\t\tif (options.throttle && options.throttle > 0) {\n\t\t\t\t\tstate.pendingEvent = e\n\n\t\t\t\t\tif (!state.throttleTimer) {\n\t\t\t\t\t\tstate.throttleTimer = setTimeout(() => {\n\t\t\t\t\t\t\tif (state.pendingEvent) {\n\t\t\t\t\t\t\t\tconst info = getScrollInfo(container, state.lastScrollLeft, state.lastScrollTop)\n\n\t\t\t\t\t\t\t\tstate.lastScrollLeft = info.scrollLeft\n\t\t\t\t\t\t\t\tstate.lastScrollTop = info.scrollTop\n\t\t\t\t\t\t\t\toptions.handler(state.pendingEvent, info)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate.throttleTimer = null\n\t\t\t\t\t\t\tstate.pendingEvent = null\n\t\t\t\t\t\t}, options.throttle)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst info = getScrollInfo(container, state.lastScrollLeft, state.lastScrollTop)\n\n\t\t\t\t\tstate.lastScrollLeft = info.scrollLeft\n\t\t\t\t\tstate.lastScrollTop = info.scrollTop\n\t\t\t\t\toptions.handler(e, info)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Initialize last scroll position\n\t\tconst initialInfo = getScrollInfo(container, 0, 0)\n\n\t\tstate.lastScrollLeft = initialInfo.scrollLeft\n\t\tstate.lastScrollTop = initialInfo.scrollTop\n\n\t\t// Store state\n\t\t;(el as any).__scroll = state\n\n\t\t// Bind scroll event\n\t\ton(container, 'scroll', state.scrollHandler, { passive: options.passive })\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ScrollState = (el as any).__scroll\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ScrollState = (el as any).__scroll\n\n\t\tif (!state) return\n\n\t\t// Clear throttle timer\n\t\tif (state.throttleTimer) {\n\t\t\tclearTimeout(state.throttleTimer)\n\t\t}\n\n\t\t// Unbind scroll event\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\n\t\tdelete (el as any).__scroll\n\t},\n})\n\nexport default vScroll\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Skeleton animation type\n */\nexport type SkeletonAnimation = 'wave' | 'pulse' | 'none'\n\n/**\n * Skeleton directive options\n */\nexport interface SkeletonOptions {\n\t/**\n\t * Whether to show skeleton loading state\n\t * @default true\n\t */\n\tloading?: boolean\n\n\t/**\n\t * Animation type\n\t * @default 'wave'\n\t */\n\tanimation?: SkeletonAnimation\n\n\t/**\n\t * Skeleton width\n\t * @default '100%'\n\t */\n\twidth?: string | number\n\n\t/**\n\t * Skeleton height\n\t * @default '1em'\n\t */\n\theight?: string | number\n\n\t/**\n\t * Border radius\n\t * @default '4px'\n\t */\n\tradius?: string | number\n\n\t/**\n\t * Skeleton color\n\t * @default '#e8e8e8'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Animation color (for wave effect)\n\t * @default '#f0f0f0'\n\t */\n\tanimationColor?: string\n\n\t/**\n\t * Custom class for skeleton element\n\t */\n\tclass?: string\n\n\t/**\n\t * Whether to preserve the original content dimensions\n\t * @default true\n\t */\n\tpreserveDimensions?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type SkeletonBinding = boolean | SkeletonOptions\n\n/**\n * Element state storage\n */\ninterface SkeletonState {\n\toptions: SkeletonOptions\n\toriginalDisplay: string\n\toriginalWidth: string\n\toriginalHeight: string\n\tskeletonEl: HTMLDivElement | null\n}\n\n/**\n * Default skeleton options\n */\nconst defaultOptions: SkeletonOptions = {\n\tloading: true,\n\tanimation: 'wave',\n\twidth: '100%',\n\theight: '1em',\n\tradius: '4px',\n\tcolor: '#e8e8e8',\n\tanimationColor: '#f0f0f0',\n\tpreserveDimensions: true,\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: SkeletonBinding | undefined): SkeletonOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { ...defaultOptions, loading: binding }\n\t}\n\n\treturn { ...defaultOptions, ...binding }\n}\n\n/**\n * Create skeleton element\n */\nfunction createSkeleton(options: SkeletonOptions): HTMLDivElement {\n\tconst skeleton = document.createElement('div')\n\tskeleton.className = `v-skeleton ${options.class || ''}`\n\n\tconst width = typeof options.width === 'number' ? `${options.width}px` : options.width\n\tconst height = typeof options.height === 'number' ? `${options.height}px` : options.height\n\tconst radius = typeof options.radius === 'number' ? `${options.radius}px` : options.radius\n\n\tlet animationStyle = ''\n\n\tif (options.animation === 'wave') {\n\t\tanimationStyle = `\n background: linear-gradient(90deg, ${options.color} 25%, ${options.animationColor} 50%, ${options.color} 75%);\n background-size: 200% 100%;\n animation: skeleton-wave 1.5s ease-in-out infinite;\n `\n\t} else if (options.animation === 'pulse') {\n\t\tanimationStyle = `\n background: ${options.color};\n animation: skeleton-pulse 1.5s ease-in-out infinite;\n `\n\t} else {\n\t\tanimationStyle = `background: ${options.color};`\n\t}\n\n\tskeleton.style.cssText = `\n width: ${width};\n height: ${height};\n border-radius: ${radius};\n ${animationStyle}\n `\n\n\treturn skeleton\n}\n\n/**\n * Add global styles if not present\n */\nfunction ensureStyles(): void {\n\tif (!isBrowser()) return\n\n\tconst styleId = 'v-skeleton-styles'\n\n\tif (document.getElementById(styleId)) return\n\n\tconst style = document.createElement('style')\n\tstyle.id = styleId\n\tstyle.textContent = `\n @keyframes skeleton-wave {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n @keyframes skeleton-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `\n\n\tdocument.head.appendChild(style)\n}\n\n/**\n * v-skeleton directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Basic usage -->\n * <div v-skeleton=\"isLoading\">Content here</div>\n *\n * <!-- With options -->\n * <div v-skeleton=\"{ loading: isLoading, animation: 'pulse', width: 200, height: 20 }\">\n * Content here\n * </div>\n *\n * <!-- Multiple skeleton lines -->\n * <div v-skeleton=\"{ loading: isLoading, height: '1em' }\">Line 1</div>\n * <div v-skeleton=\"{ loading: isLoading, height: '1em' }\">Line 2</div>\n * </template>\n * ```\n */\nexport const vSkeleton = defineDirective<SkeletonBinding, HTMLElement>({\n\tname: 'skeleton',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tensureStyles()\n\n\t\tconst state: SkeletonState = {\n\t\t\toptions,\n\t\t\toriginalDisplay: getComputedStyle(el).display,\n\t\t\toriginalWidth: el.style.width,\n\t\t\toriginalHeight: el.style.height,\n\t\t\tskeletonEl: null,\n\t\t}\n\n\t\t;(el as any).__skeleton = state\n\n\t\tif (options.loading) {\n\t\t\tshowSkeleton(el, state)\n\t\t}\n\n\t\tel.classList.add('v-skeleton-container')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: SkeletonState = (el as any).__skeleton\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst wasLoading = state.options.loading\n\n\t\tstate.options = newOptions\n\n\t\tif (newOptions.loading && !wasLoading) {\n\t\t\tshowSkeleton(el, state)\n\t\t} else if (!newOptions.loading && wasLoading) {\n\t\t\thideSkeleton(el, state)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: SkeletonState = (el as any).__skeleton\n\n\t\tif (!state) return\n\n\t\t// Remove skeleton element\n\t\tif (state.skeletonEl && state.skeletonEl.parentNode) {\n\t\t\tstate.skeletonEl.parentNode.removeChild(state.skeletonEl)\n\t\t}\n\n\t\tel.classList.remove('v-skeleton-container')\n\t\tel.style.display = state.originalDisplay\n\t\tel.style.width = state.originalWidth\n\t\tel.style.height = state.originalHeight\n\n\t\tdelete (el as any).__skeleton\n\t},\n})\n\n/**\n * Show skeleton\n */\nfunction showSkeleton(el: HTMLElement, state: SkeletonState): void {\n\tconst options = state.options\n\n\t// Store original styles\n\tstate.originalDisplay = el.style.display || getComputedStyle(el).display\n\n\tif (options.preserveDimensions) {\n\t\tconst computedStyle = getComputedStyle(el)\n\t\tif (!state.originalWidth) {\n\t\t\tstate.originalWidth = el.style.width\n\t\t}\n\t\tif (!state.originalHeight) {\n\t\t\tstate.originalHeight = el.style.height\n\t\t}\n\t\toptions.width = computedStyle.width\n\t\toptions.height = computedStyle.height\n\t}\n\n\t// Hide original content\n\tel.style.display = 'none'\n\n\t// Create and insert skeleton\n\tstate.skeletonEl = createSkeleton(options)\n\tel.parentNode?.insertBefore(state.skeletonEl, el.nextSibling)\n}\n\n/**\n * Hide skeleton\n */\nfunction hideSkeleton(el: HTMLElement, state: SkeletonState): void {\n\t// Remove skeleton element\n\tif (state.skeletonEl && state.skeletonEl.parentNode) {\n\t\tstate.skeletonEl.parentNode.removeChild(state.skeletonEl)\n\t\tstate.skeletonEl = null\n\t}\n\n\t// Restore original content\n\tel.style.display = state.originalDisplay\n\tel.style.width = state.originalWidth\n\tel.style.height = state.originalHeight\n}\n\nexport default vSkeleton\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\nconst STATE_KEY = '__sticky' as const\n\n/**\n * Sticky directive options\n */\nexport interface StickyOptions {\n\t/** Top offset when sticky @default 0 */\n\ttop?: number | string\n\t/** Bottom offset when sticky */\n\tbottom?: number | string\n\t/** Z-index when sticky @default 100 */\n\tzIndex?: number\n\t/** CSS class to add when sticky @default 'v-sticky--fixed' */\n\tstickyClass?: string\n\t/** Whether to disable @default false */\n\tdisabled?: boolean\n\t/** Callback when sticky state changes */\n\tonChange?: (isSticky: boolean) => void\n\t/** Custom scroll container */\n\tcontainer?: string | Element | null\n}\n\nexport type StickyBinding = boolean | number | StickyOptions\n\ninterface StickyState {\n\toptions: StickyOptions\n\tplaceholder: HTMLDivElement | null\n\toriginalStyles: { position: string, top: string, bottom: string, zIndex: string, width: string }\n\tisSticky: boolean\n\tscrollHandler: () => void\n\tresizeHandler: () => void\n\tcontainer: Element | Window\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: StickyBinding | undefined): StickyOptions {\n\tif (binding === false) return { disabled: true, top: 0, zIndex: 100 }\n\tif (typeof binding === 'number') return { top: binding, zIndex: 100 }\n\n\treturn {\n\t\ttop: 0,\n\t\tzIndex: 100,\n\t\tstickyClass: 'v-sticky--fixed',\n\t\tdisabled: false,\n\t\t...(binding && typeof binding === 'object' ? binding : {}),\n\t}\n}\n\n/**\n * Parse offset value to CSS string\n */\nfunction parseOffset(value: number | string | undefined): string {\n\tif (value === undefined) return '0'\n\n\treturn typeof value === 'number' ? `${value}px` : value\n}\n\n/**\n * Get scroll container for element\n */\nfunction getScrollContainer(el: HTMLElement, customContainer?: string | Element | null): Element | Window {\n\tif (customContainer) {\n\t\tif (typeof customContainer === 'string') {\n\t\t\treturn document.querySelector(customContainer) || getScrollParent(el)\n\t\t}\n\n\t\treturn customContainer\n\t}\n\n\t// Check if parent element is scrollable\n\tconst parent = el.parentElement\n\n\tif (parent) {\n\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent)\n\n\t\tif (/(auto|scroll)/.test(overflow + overflowX + overflowY)) {\n\t\t\treturn parent\n\t\t}\n\t}\n\n\treturn getScrollParent(el)\n}\n\n/**\n * Check and update sticky state\n */\nfunction checkSticky(el: HTMLElement, state: StickyState): void {\n\tif (state.options.disabled) {\n\t\tunsetSticky(el, state)\n\n\t\treturn\n\t}\n\n\tconst topOffset = parseFloat(parseOffset(state.options.top))\n\tconst containerRect = state.container === window ? { top: 0 } : (state.container as Element).getBoundingClientRect()\n\n\t// Use placeholder position when sticky, otherwise use element position\n\tconst referenceEl = state.placeholder || el\n\tconst rect = referenceEl.getBoundingClientRect()\n\tconst elementTopRelativeToContainer = rect.top - containerRect.top\n\n\tconst shouldSticky = elementTopRelativeToContainer <= topOffset\n\n\tif (shouldSticky && !state.isSticky) {\n\t\tsetSticky(el, state, topOffset, containerRect.top)\n\t} else if (!shouldSticky && state.isSticky) {\n\t\tunsetSticky(el, state)\n\t}\n}\n\n/**\n * Set element as sticky\n */\nfunction setSticky(el: HTMLElement, state: StickyState, topOffset: number, containerTop: number): void {\n\tstate.isSticky = true\n\n\t// Create placeholder to maintain layout\n\tconst placeholder = document.createElement('div')\n\n\tplaceholder.style.cssText = `width:${el.offsetWidth}px;height:${el.offsetHeight}px`\n\tel.parentNode?.insertBefore(placeholder, el)\n\tstate.placeholder = placeholder\n\n\t// Calculate fixed top position relative to viewport\n\tconst fixedTop = state.container === window ? topOffset : containerTop + topOffset\n\n\t// Apply sticky styles\n\tel.style.position = 'fixed'\n\tel.style.top = `${fixedTop}px`\n\tel.style.zIndex = String(state.options.zIndex || 100)\n\tel.style.width = `${el.offsetWidth}px`\n\n\tif (state.options.bottom !== undefined) {\n\t\tel.style.bottom = parseOffset(state.options.bottom)\n\t}\n\n\tstate.options.stickyClass && el.classList.add(state.options.stickyClass)\n\tel.dispatchEvent(new CustomEvent('sticky:change', { detail: { isSticky: true } }))\n\tstate.options.onChange?.(true)\n}\n\n/**\n * Unset element as sticky\n */\nfunction unsetSticky(el: HTMLElement, state: StickyState): void {\n\tif (!state.isSticky) return\n\n\tstate.isSticky = false\n\n\t// Remove placeholder\n\tstate.placeholder?.parentNode?.removeChild(state.placeholder)\n\tstate.placeholder = null\n\n\t// Restore original styles\n\tObject.assign(el.style, state.originalStyles)\n\n\tstate.options.stickyClass && el.classList.remove(state.options.stickyClass)\n\tel.dispatchEvent(new CustomEvent('sticky:change', { detail: { isSticky: false } }))\n\tstate.options.onChange?.(false)\n}\n\n/**\n * v-sticky directive\n *\n * @example\n * ```vue\n * <div v-sticky>Sticky header</div>\n * <div v-sticky=\"50\">Sticky with 50px top offset</div>\n * <div v-sticky=\"{ top: 60, zIndex: 1000 }\">Custom sticky</div>\n * ```\n */\nexport const vSticky = defineDirective<StickyBinding, HTMLElement>({\n\tname: 'sticky',\n\tssr: false,\n\tdefaults: { top: 0, zIndex: 100, stickyClass: 'v-sticky--fixed', disabled: false },\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst container = getScrollContainer(el, options.container)\n\n\t\tconst state: StickyState = {\n\t\t\toptions,\n\t\t\tplaceholder: null,\n\t\t\toriginalStyles: {\n\t\t\t\tposition: el.style.position,\n\t\t\t\ttop: el.style.top,\n\t\t\t\tbottom: el.style.bottom,\n\t\t\t\tzIndex: el.style.zIndex,\n\t\t\t\twidth: el.style.width,\n\t\t\t},\n\t\t\tisSticky: false,\n\t\t\tcontainer,\n\t\t\tscrollHandler: () => checkSticky(el, state),\n\t\t\tresizeHandler: () => checkSticky(el, state),\n\t\t}\n\n\t\tel.classList.add('v-sticky')\n\t\t;(el as any)[STATE_KEY] = state\n\n\t\ton(container, 'scroll', state.scrollHandler, { passive: true })\n\t\ton(window, 'resize', state.resizeHandler, { passive: true })\n\t\tcheckSticky(el, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: StickyState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t\tcheckSticky(el, state)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: StickyState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tstate.placeholder?.parentNode?.removeChild(state.placeholder)\n\n\t\tObject.assign(el.style, state.originalStyles)\n\t\tel.classList.remove('v-sticky', state.options.stickyClass || 'v-sticky--fixed')\n\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\t\toff(window, 'resize', state.resizeHandler)\n\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vSticky\n", "import { defineDirective } from '@directix/core'\n\nexport type SwipeDirection = 'left' | 'right' | 'up' | 'down'\n\nexport type SwipeHandler = (direction: SwipeDirection, event: Event) => void\n\nexport interface SwipeOptions {\n\thandler?: SwipeHandler\n\tthreshold?: number\n\tmaxTime?: number\n\tdirections?: SwipeDirection[]\n\tpreventScrollOnSwipe?: boolean\n\tdisabled?: boolean\n\tmouse?: boolean\n\tonLeft?: () => void\n\tonRight?: () => void\n\tonUp?: () => void\n\tonDown?: () => void\n}\n\nexport type SwipeBinding = SwipeHandler | SwipeOptions\n\ninterface SwipeState {\n\toptions: SwipeOptions\n\tstartX: number\n\tstartY: number\n\tstartTime: number\n\tisActive: boolean\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: (e: TouchEvent) => void\n\t\tmouseDown: (e: MouseEvent) => void\n\t\tmouseUp: (e: MouseEvent) => void\n\t}\n}\n\nconst DEFAULT_THRESHOLD = 30\nconst DEFAULT_MAX_TIME = 500\nconst DEFAULT_DIRECTIONS: SwipeDirection[] = ['left', 'right', 'up', 'down']\n\nfunction getSwipeDirection(\n\tdeltaX: number,\n\tdeltaY: number,\n\tallowedDirections: SwipeDirection[],\n): SwipeDirection | null {\n\tconst absX = Math.abs(deltaX)\n\tconst absY = Math.abs(deltaY)\n\n\tif (absX > absY) {\n\t\tconst direction = deltaX > 0 ? 'right' : 'left'\n\t\treturn allowedDirections.includes(direction) ? direction : null\n\t} else {\n\t\tconst direction = deltaY > 0 ? 'down' : 'up'\n\t\treturn allowedDirections.includes(direction) ? direction : null\n\t}\n}\n\nfunction normalizeOptions(binding: SwipeBinding): SwipeOptions {\n\tif (typeof binding === 'function') return { handler: binding }\n\n\treturn {\n\t\thandler: binding.handler,\n\t\tthreshold: binding.threshold ?? DEFAULT_THRESHOLD,\n\t\tmaxTime: binding.maxTime ?? DEFAULT_MAX_TIME,\n\t\tdirections: binding.directions ?? [...DEFAULT_DIRECTIONS],\n\t\tpreventScrollOnSwipe: binding.preventScrollOnSwipe ?? true,\n\t\tdisabled: binding.disabled ?? false,\n\t\tmouse: binding.mouse ?? true,\n\t\tonLeft: binding.onLeft,\n\t\tonRight: binding.onRight,\n\t\tonUp: binding.onUp,\n\t\tonDown: binding.onDown,\n\t}\n}\n\nfunction triggerSwipe(\n\tstate: SwipeState,\n\tdeltaX: number,\n\tdeltaY: number,\n\tdeltaTime: number,\n\tevent: Event,\n\tel: HTMLElement,\n): void {\n\tconst { options } = state\n\n\t// Check time\n\tif (deltaTime > (options.maxTime ?? DEFAULT_MAX_TIME)) return\n\n\t// Check distance\n\tconst distance = Math.max(Math.abs(deltaX), Math.abs(deltaY))\n\tif (distance < (options.threshold ?? DEFAULT_THRESHOLD)) return\n\n\t// Get direction\n\tconst direction = getSwipeDirection(deltaX, deltaY, options.directions ?? DEFAULT_DIRECTIONS)\n\tif (!direction) return\n\n\t// Prevent scroll\n\tif (options.preventScrollOnSwipe && event.cancelable) {\n\t\tevent.preventDefault()\n\t}\n\n\t// Call handlers\n\toptions.handler?.(direction, event)\n\n\t// Direction-specific callbacks\n\tconst callbacks: Record<SwipeDirection, (() => void) | undefined> = {\n\t\tleft: options.onLeft,\n\t\tright: options.onRight,\n\t\tup: options.onUp,\n\t\tdown: options.onDown,\n\t}\n\tcallbacks[direction]?.()\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('swipe', { detail: { direction, deltaX, deltaY, deltaTime } }))\n}\n\nfunction createSwipeHandler(\n\tel: HTMLElement,\n\tstate: SwipeState,\n): (clientX: number, clientY: number, event: Event) => void {\n\treturn (clientX, clientY, event) => {\n\t\tconst deltaX = clientX - state.startX\n\t\tconst deltaY = clientY - state.startY\n\t\tconst deltaTime = Date.now() - state.startTime\n\t\ttriggerSwipe(state, deltaX, deltaY, deltaTime, event, el)\n\t}\n}\n\nfunction setupState(el: HTMLElement, options: SwipeOptions): SwipeState | null {\n\tif (options.disabled) return null\n\n\tel.style.touchAction = 'none'\n\tel.style.userSelect = 'none'\n\n\tconst state: SwipeState = {\n\t\toptions,\n\t\tstartX: 0,\n\t\tstartY: 0,\n\t\tstartTime: 0,\n\t\tisActive: false,\n\t\thandlers: null as any,\n\t}\n\n\tconst handleSwipe = createSwipeHandler(el, state)\n\n\tstate.handlers = {\n\t\ttouchStart: (e: TouchEvent) => {\n\t\t\tif (state.options.disabled) return\n\t\t\tstate.startX = e.touches[0].clientX\n\t\t\tstate.startY = e.touches[0].clientY\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isActive = true\n\t\t},\n\n\t\ttouchMove: (e: TouchEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tif (state.options.preventScrollOnSwipe) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\t\t},\n\n\t\ttouchEnd: (e: TouchEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tstate.isActive = false\n\t\t\tconst touch = e.changedTouches[0]\n\t\t\thandleSwipe(touch.clientX, touch.clientY, e)\n\t\t},\n\n\t\tmouseDown: (e: MouseEvent) => {\n\t\t\tif (state.options.disabled) return\n\t\t\tstate.startX = e.clientX\n\t\t\tstate.startY = e.clientY\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isActive = true\n\t\t},\n\n\t\tmouseUp: (e: MouseEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tstate.isActive = false\n\t\t\thandleSwipe(e.clientX, e.clientY, e)\n\t\t},\n\t}\n\n\treturn state\n}\n\nfunction bindEvents(el: HTMLElement, state: SwipeState): void {\n\tconst { handlers } = state\n\tconst enableMouse = state.options.mouse ?? true\n\n\tel.addEventListener('touchstart', handlers.touchStart, { passive: true })\n\tel.addEventListener('touchmove', handlers.touchMove, { passive: false })\n\tel.addEventListener('touchend', handlers.touchEnd)\n\tel.addEventListener('touchcancel', handlers.touchEnd)\n\n\tif (enableMouse) {\n\t\tel.addEventListener('mousedown', handlers.mouseDown)\n\t\tel.addEventListener('mouseup', handlers.mouseUp)\n\t\tel.addEventListener('mouseleave', handlers.mouseUp)\n\t}\n}\n\nfunction unbindEvents(el: HTMLElement, state: SwipeState): void {\n\tconst { handlers } = state\n\tconst enableMouse = state.options.mouse ?? true\n\n\tel.removeEventListener('touchstart', handlers.touchStart)\n\tel.removeEventListener('touchmove', handlers.touchMove)\n\tel.removeEventListener('touchend', handlers.touchEnd)\n\tel.removeEventListener('touchcancel', handlers.touchEnd)\n\n\tif (enableMouse) {\n\t\tel.removeEventListener('mousedown', handlers.mouseDown)\n\t\tel.removeEventListener('mouseup', handlers.mouseUp)\n\t\tel.removeEventListener('mouseleave', handlers.mouseUp)\n\t}\n}\n\nexport const vSwipe = defineDirective<SwipeBinding, HTMLElement>({\n\tname: 'swipe',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state = setupState(el, options)\n\t\tif (!state) return\n\n\t\t;(el as any).__swipe = state\n\t\tbindEvents(el, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: SwipeState | undefined = (el as any).__swipe\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (!state) {\n\t\t\tconst newState = setupState(el, newOptions)\n\t\t\tif (newState) {\n\t\t\t\t;(el as any).__swipe = newState\n\t\t\t\tbindEvents(el, newState)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst wasDisabled = state.options.disabled\n\t\tconst wasMouseEnabled = state.options.mouse ?? true\n\t\tconst nowMouseEnabled = newOptions.mouse ?? true\n\n\t\tstate.options = newOptions\n\n\t\tif (newOptions.disabled && !wasDisabled) {\n\t\t\tunbindEvents(el, state)\n\t\t} else if (!newOptions.disabled && wasDisabled) {\n\t\t\tbindEvents(el, state)\n\t\t} else if (wasMouseEnabled !== nowMouseEnabled) {\n\t\t\tif (wasMouseEnabled) {\n\t\t\t\tel.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\t\t\tel.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\t\t\tel.removeEventListener('mouseleave', state.handlers.mouseUp)\n\t\t\t}\n\t\t\tif (nowMouseEnabled) {\n\t\t\t\tel.addEventListener('mousedown', state.handlers.mouseDown)\n\t\t\t\tel.addEventListener('mouseup', state.handlers.mouseUp)\n\t\t\t\tel.addEventListener('mouseleave', state.handlers.mouseUp)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: SwipeState | undefined = (el as any).__swipe\n\t\tif (!state) return\n\n\t\tunbindEvents(el, state)\n\t\tdelete (el as any).__swipe\n\t},\n})\n\nexport default vSwipe\n", "import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\nimport { getDefaultEventType, getEventTypeFromModifiers, parseTime, throttle } from '@directix/shared'\n\n/**\n * Throttled function type\n */\nexport interface ThrottledFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n}\n\n/**\n * Throttle directive options\n */\nexport interface ThrottleOptions<T extends (...args: any[]) => any = any> {\n\t/**\n\t * Function to throttle\n\t */\n\thandler: T\n\n\t/**\n\t * Delay time in milliseconds\n\t * @default 300\n\t */\n\twait?: number\n\n\t/**\n\t * Whether to invoke immediately before delay starts\n\t * @default true\n\t */\n\tleading?: boolean\n\n\t/**\n\t * Whether to invoke after delay ends\n\t * @default true\n\t */\n\ttrailing?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ThrottleBinding<T extends (...args: any[]) => any = any>\n\t= | T\n\t\t| ThrottleOptions<T>\n\n/**\n * Element state storage\n */\ninterface ThrottleState {\n\tthrottledFn: ThrottledFunction<any>\n\teventType: string\n\toptions: ThrottleOptions\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: ThrottleBinding,\n\tdirectiveBinding: DirectiveBinding<ThrottleBinding>,\n): ThrottleOptions {\n\tconst wait = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, wait }\n\t}\n\n\treturn { ...binding, wait: binding.wait || wait }\n}\n\n/**\n * v-throttle directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-throttle=\"handleClick\">Throttled Button</button>\n * <button v-throttle:1s=\"handleClick\">1s Throttled</button>\n * <div v-throttle.scroll=\"handleScroll\">Scroll Throttle</div>\n * <div v-throttle:100.scroll=\"handleScroll\">100ms Scroll Throttle</div>\n * </template>\n * ```\n */\nexport const vThrottle = defineDirective<ThrottleBinding, HTMLElement>({\n\tname: 'throttle',\n\tssr: true, // SSR safe - event binding is skipped on server\n\tdefaults: {\n\t\twait: 300,\n\t\tleading: true,\n\t\ttrailing: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t// Prefer event type from modifiers, otherwise infer from element type\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getDefaultEventType(el)\n\n\t\t// Create throttled function\n\t\tconst throttledFn = throttle(options.handler, options.wait, {\n\t\t\tleading: options.leading,\n\t\t\ttrailing: options.trailing,\n\t\t})\n\n\t\t// Bind event\n\t\tel.addEventListener(eventType, throttledFn as any)\n\n\t\t;(el as any).__throttle = {\n\t\t\tthrottledFn,\n\t\t\teventType,\n\t\t\toptions,\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ThrottleState = (el as any).__throttle\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If configuration changes, recreate throttled function\n\t\tif (\n\t\t\tnewOptions.wait !== state.options.wait\n\t\t\t|| newOptions.leading !== state.options.leading\n\t\t\t|| newOptions.trailing !== state.options.trailing\n\t\t) {\n\t\t\t// Cancel old one\n\t\t\tstate.throttledFn.cancel()\n\n\t\t\t// Create new one\n\t\t\tconst throttledFn = throttle(newOptions.handler, newOptions.wait, {\n\t\t\t\tleading: newOptions.leading,\n\t\t\t\ttrailing: newOptions.trailing,\n\t\t\t})\n\n\t\t\tel.removeEventListener(state.eventType, state.throttledFn as any)\n\t\t\tel.addEventListener(state.eventType, throttledFn as any)\n\n\t\t\t;(el as any).__throttle = {\n\t\t\t\tthrottledFn,\n\t\t\t\teventType: state.eventType,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t} else if (newOptions.handler !== state.options.handler) {\n\t\t\t// Only update handler\n\t\t\tstate.options.handler = newOptions.handler\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ThrottleState = (el as any).__throttle\n\n\t\tif (!state) return\n\n\t\tstate.throttledFn.cancel()\n\t\tel.removeEventListener(state.eventType, state.throttledFn as any)\n\t\tdelete (el as any).__throttle\n\t},\n})\n\nexport default vThrottle\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Tooltip placement\n */\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right'\n\n/**\n * Tooltip trigger\n */\nexport type TooltipTrigger = 'hover' | 'click' | 'focus' | 'manual'\n\n/**\n * Tooltip directive options\n */\nexport interface TooltipOptions {\n\t/** Tooltip content */\n\tcontent: string\n\t/** Tooltip placement @default 'top' */\n\tplacement?: TooltipPlacement\n\t/** Trigger type @default 'hover' */\n\ttrigger?: TooltipTrigger\n\t/** Show delay in milliseconds @default 0 */\n\tdelay?: number\n\t/** Hide delay in milliseconds @default 0 */\n\thideDelay?: number\n\t/** Offset from the element in pixels @default 8 */\n\toffset?: number\n\t/** Custom class for the tooltip */\n\tclass?: string\n\t/** Whether to show arrow @default true */\n\tarrow?: boolean\n\t/** Whether the tooltip is disabled @default false */\n\tdisabled?: boolean\n\t/** Maximum width of the tooltip */\n\tmaxWidth?: number | string\n\t/** Z-index of the tooltip @default 9999 */\n\tzIndex?: number\n\t/** Callback when tooltip is shown */\n\tonShow?: () => void\n\t/** Callback when tooltip is hidden */\n\tonHide?: () => void\n}\n\nexport type TooltipBinding = string | TooltipOptions\n\ninterface TooltipState {\n\toptions: TooltipOptions\n\ttooltip: HTMLElement | null\n\tshowTimeout: ReturnType<typeof setTimeout> | null\n\thideTimeout: ReturnType<typeof setTimeout> | null\n\tisVisible: boolean\n\thandlers: {\n\t\tshow?: () => void\n\t\thide?: () => void\n\t\ttoggle?: () => void\n\t\tdocHide?: (e: Event) => void\n\t}\n}\n\n// Default tooltip styles\nconst TOOLTIP_STYLES = {\n\tpadding: '8px 12px',\n\tbackground: '#333',\n\tcolor: '#fff',\n\tborderRadius: '6px',\n\tfontSize: '14px',\n\tlineHeight: '1.5',\n\tminWidth: '96px',\n\tmaxWidth: '320px',\n\tboxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n}\n\n// Global tooltip container\nlet tooltipContainer: HTMLElement | null = null\n\nfunction getTooltipContainer(): HTMLElement {\n\t// Check if container exists and is still in the DOM\n\tif (tooltipContainer && document.body.contains(tooltipContainer)) {\n\t\treturn tooltipContainer\n\t}\n\n\t// Create new container\n\ttooltipContainer = document.createElement('div')\n\ttooltipContainer.id = 'directix-tooltip-container'\n\ttooltipContainer.style.cssText = 'position: fixed; top: 0; left: 0; pointer-events: none; z-index: 9999;'\n\tdocument.body.appendChild(tooltipContainer)\n\n\treturn tooltipContainer\n}\n\nfunction createTooltip(options: TooltipOptions): HTMLElement {\n\tconst tooltip = document.createElement('div')\n\n\ttooltip.className = `v-tooltip v-tooltip--${options.placement || 'top'}`\n\tif (options.class) tooltip.classList.add(options.class)\n\n\tconst maxWidth = options.maxWidth ? typeof options.maxWidth === 'number' ? `${options.maxWidth}px` : options.maxWidth : TOOLTIP_STYLES.maxWidth\n\n\ttooltip.style.cssText = [\n\t\t'position: absolute',\n\t\t`padding: ${TOOLTIP_STYLES.padding}`,\n\t\t`background: ${TOOLTIP_STYLES.background}`,\n\t\t`color: ${TOOLTIP_STYLES.color}`,\n\t\t`border-radius: ${TOOLTIP_STYLES.borderRadius}`,\n\t\t`font-size: ${TOOLTIP_STYLES.fontSize}`,\n\t\t`line-height: ${TOOLTIP_STYLES.lineHeight}`,\n\t\t`min-width: ${TOOLTIP_STYLES.minWidth}`,\n\t\t`max-width: ${maxWidth}`,\n\t\t'word-wrap: break-word',\n\t\t`box-shadow: ${TOOLTIP_STYLES.boxShadow}`,\n\t\t'pointer-events: none',\n\t\t'opacity: 0',\n\t\t'transition: opacity 0.2s ease',\n\t\t`z-index: ${options.zIndex || 9999}`,\n\t].join(';')\n\n\t// Add arrow\n\tif (options.arrow !== false) {\n\t\tconst arrow = document.createElement('div')\n\n\t\tarrow.className = 'v-tooltip__arrow'\n\t\tarrow.style.cssText = 'position: absolute; width: 8px; height: 8px; background: #333; transform: rotate(45deg);'\n\t\ttooltip.appendChild(arrow)\n\t}\n\n\t// Add content\n\tconst content = document.createElement('div')\n\n\tcontent.className = 'v-tooltip__content'\n\tcontent.textContent = options.content\n\ttooltip.appendChild(content)\n\n\treturn tooltip\n}\n\nfunction positionTooltip(\n\ttooltip: HTMLElement,\n\tel: HTMLElement,\n\tplacement: TooltipPlacement,\n\toffset: number,\n): void {\n\tconst elRect = el.getBoundingClientRect()\n\tconst tooltipRect = tooltip.getBoundingClientRect()\n\n\tlet top = 0,\n\t\tleft = 0\n\n\tswitch (placement) {\n\t\tcase 'top':\n\t\t\ttop = elRect.top - tooltipRect.height - offset\n\t\t\tleft = elRect.left + (elRect.width - tooltipRect.width) / 2\n\t\t\tbreak\n\t\tcase 'bottom':\n\t\t\ttop = elRect.bottom + offset\n\t\t\tleft = elRect.left + (elRect.width - tooltipRect.width) / 2\n\t\t\tbreak\n\t\tcase 'left':\n\t\t\ttop = elRect.top + (elRect.height - tooltipRect.height) / 2\n\t\t\tleft = elRect.left - tooltipRect.width - offset\n\t\t\tbreak\n\t\tcase 'right':\n\t\t\ttop = elRect.top + (elRect.height - tooltipRect.height) / 2\n\t\t\tleft = elRect.right + offset\n\t\t\tbreak\n\t}\n\n\t// Keep within viewport\n\tconst viewportWidth = window.innerWidth\n\tconst viewportHeight = window.innerHeight\n\n\tif (left < 0) left = 8\n\tif (left + tooltipRect.width > viewportWidth) left = viewportWidth - tooltipRect.width - 8\n\tif (top < 0) top = 8\n\tif (top + tooltipRect.height > viewportHeight) top = viewportHeight - tooltipRect.height - 8\n\n\ttooltip.style.top = `${top}px`\n\ttooltip.style.left = `${left}px`\n\n\t// Position arrow\n\tconst arrow = tooltip.querySelector('.v-tooltip__arrow') as HTMLElement\n\n\tif (arrow) {\n\t\tconst halfArrow = 4\n\n\t\tswitch (placement) {\n\t\t\tcase 'top':\n\t\t\t\tObject.assign(arrow.style, { bottom: `-${halfArrow}px`, left: '50%', transform: 'translateX(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'bottom':\n\t\t\t\tObject.assign(arrow.style, { top: `-${halfArrow}px`, left: '50%', transform: 'translateX(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'left':\n\t\t\t\tObject.assign(arrow.style, { right: `-${halfArrow}px`, top: '50%', transform: 'translateY(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'right':\n\t\t\t\tObject.assign(arrow.style, { left: `-${halfArrow}px`, top: '50%', transform: 'translateY(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunction showTooltip(el: HTMLElement, state: TooltipState): void {\n\tif (state.isVisible || state.options.disabled) return\n\n\tif (state.hideTimeout) {\n\t\tclearTimeout(state.hideTimeout)\n\t\tstate.hideTimeout = null\n\t}\n\n\tconst doShow = (): void => {\n\t\tconst tooltip = createTooltip(state.options)\n\n\t\tstate.tooltip = tooltip\n\t\tgetTooltipContainer().appendChild(tooltip)\n\n\t\trequestAnimationFrame(() => {\n\t\t\tpositionTooltip(tooltip, el, state.options.placement || 'top', state.options.offset || 8)\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\ttooltip.style.opacity = '1'\n\t\t\t})\n\t\t})\n\n\t\tstate.isVisible = true\n\t\tstate.options.onShow?.()\n\t}\n\n\tif (state.options.delay && state.options.delay > 0) {\n\t\tstate.showTimeout = setTimeout(doShow, state.options.delay)\n\t} else {\n\t\tdoShow()\n\t}\n}\n\nfunction hideTooltip(state: TooltipState): void {\n\tif (!state.isVisible) return\n\n\tif (state.showTimeout) {\n\t\tclearTimeout(state.showTimeout)\n\t\tstate.showTimeout = null\n\t}\n\n\tconst doHide = (): void => {\n\t\tif (state.tooltip) {\n\t\t\tstate.tooltip.style.opacity = '0'\n\t\t\tsetTimeout(() => {\n\t\t\t\tstate.tooltip?.remove()\n\t\t\t\tstate.tooltip = null\n\t\t\t}, 200)\n\t\t}\n\n\t\tstate.isVisible = false\n\t\tstate.options.onHide?.()\n\t}\n\n\tif (state.options.hideDelay && state.options.hideDelay > 0) {\n\t\tstate.hideTimeout = setTimeout(doHide, state.options.hideDelay)\n\t} else {\n\t\tdoHide()\n\t}\n}\n\nfunction setupTriggerHandlers(el: HTMLElement, state: TooltipState): void {\n\tconst { trigger = 'hover' } = state.options\n\n\tconst show = (): void => showTooltip(el, state)\n\tconst hide = (): void => hideTooltip(state)\n\tconst toggle = (): void => (state.isVisible ? hide() : show())\n\n\tstate.handlers = { show, hide, toggle }\n\n\tswitch (trigger) {\n\t\tcase 'hover':\n\t\t\tel.addEventListener('mouseenter', show)\n\t\t\tel.addEventListener('mouseleave', hide)\n\t\t\tbreak\n\t\tcase 'click':\n\t\t\tel.addEventListener('click', toggle)\n\t\t\tdocument.addEventListener('click', state.handlers.docHide = (e: Event) => {\n\t\t\t\tif (state.isVisible && !el.contains(e.target as Node)) hide()\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'focus':\n\t\t\tel.addEventListener('focus', show)\n\t\t\tel.addEventListener('blur', hide)\n\t\t\tbreak\n\t\t// 'manual' - no automatic handlers\n\t}\n}\n\nfunction removeTriggerHandlers(el: HTMLElement, state: TooltipState): void {\n\tconst { show, hide, toggle, docHide } = state.handlers\n\n\tif (show) {\n\t\tel.removeEventListener('mouseenter', show)\n\t\tel.removeEventListener('focus', show)\n\t}\n\tif (hide) {\n\t\tel.removeEventListener('mouseleave', hide)\n\t\tel.removeEventListener('blur', hide)\n\t}\n\tif (toggle) {\n\t\tel.removeEventListener('click', toggle)\n\t}\n\tif (docHide) {\n\t\tdocument.removeEventListener('click', docHide)\n\t}\n}\n\nfunction normalizeOptions(binding: TooltipBinding | undefined): TooltipOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { content: binding, placement: 'top', trigger: 'hover' }\n\t}\n\n\tif (!binding) {\n\t\treturn { content: '', placement: 'top', trigger: 'hover' }\n\t}\n\n\treturn {\n\t\tcontent: binding.content,\n\t\tplacement: binding.placement ?? 'top',\n\t\ttrigger: binding.trigger ?? 'hover',\n\t\tdelay: binding.delay ?? 0,\n\t\thideDelay: binding.hideDelay ?? 0,\n\t\toffset: binding.offset ?? 8,\n\t\tclass: binding.class,\n\t\tarrow: binding.arrow ?? true,\n\t\tdisabled: binding.disabled ?? false,\n\t\tmaxWidth: binding.maxWidth,\n\t\tzIndex: binding.zIndex ?? 9999,\n\t\tonShow: binding.onShow,\n\t\tonHide: binding.onHide,\n\t}\n}\n\nfunction createState(options: TooltipOptions): TooltipState {\n\treturn {\n\t\toptions,\n\t\ttooltip: null,\n\t\tshowTimeout: null,\n\t\thideTimeout: null,\n\t\tisVisible: false,\n\t\thandlers: {},\n\t}\n}\n\nexport const vTooltip = defineDirective<TooltipBinding, HTMLElement>({\n\tname: 'tooltip',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !options.content) return\n\n\t\tconst state = createState(options)\n\n\t\t;(el as any).__tooltip = state\n\t\tsetupTriggerHandlers(el, state)\n\t\tel.setAttribute('aria-describedby', 'v-tooltip')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: TooltipState | undefined = (el as any).__tooltip\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// No state exists - create if needed\n\t\tif (!state) {\n\t\t\tif (!newOptions.disabled && newOptions.content) {\n\t\t\t\tconst newState = createState(newOptions)\n\n\t\t\t\t;(el as any).__tooltip = newState\n\t\t\t\tsetupTriggerHandlers(el, newState)\n\t\t\t\tel.setAttribute('aria-describedby', 'v-tooltip')\n\n\t\t\t\tif (newOptions.trigger === 'manual') {\n\t\t\t\t\tshowTooltip(el, newState)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\t// Handle manual trigger\n\t\tif (newOptions.trigger === 'manual') {\n\t\t\tconst oldDisabled = state.options.disabled\n\n\t\t\tstate.options = newOptions\n\n\t\t\tif (newOptions.disabled && !oldDisabled) {\n\t\t\t\thideTooltip(state)\n\t\t\t} else if (!newOptions.disabled && oldDisabled) {\n\t\t\t\tshowTooltip(el, state)\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\t// Update visible tooltip content\n\t\tif (state.tooltip && state.isVisible) {\n\t\t\tconst content = state.tooltip.querySelector('.v-tooltip__content')\n\n\t\t\tif (content) content.textContent = newOptions.content\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: TooltipState | undefined = (el as any).__tooltip\n\n\t\tif (!state) return\n\n\t\tif (state.showTimeout) clearTimeout(state.showTimeout)\n\t\tif (state.hideTimeout) clearTimeout(state.hideTimeout)\n\t\tstate.tooltip?.remove()\n\t\tremoveTriggerHandlers(el, state)\n\t\tdelete (el as any).__tooltip\n\t},\n})\n\nexport default vTooltip\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Swipe direction\n */\nexport type SwipeDirection = 'left' | 'right' | 'up' | 'down'\n\n/**\n * Touch gesture options\n */\nexport interface TouchOptions {\n\t/** Minimum swipe distance in pixels @default 30 */\n\tswipeThreshold?: number\n\t/** Maximum time for a swipe in milliseconds @default 500 */\n\tswipeTimeout?: number\n\t/** Minimum pinch scale change @default 0.1 */\n\tpinchThreshold?: number\n\t/** Enable swipe detection @default true */\n\tenableSwipe?: boolean\n\t/** Enable pinch detection @default true */\n\tenablePinch?: boolean\n\t/** Enable rotate detection @default true */\n\tenableRotate?: boolean\n\t/** Enable tap detection @default true */\n\tenableTap?: boolean\n\t/** Maximum time for a tap in milliseconds @default 250 */\n\ttapTimeout?: number\n\t/** Maximum movement for a tap in pixels @default 10 */\n\ttapThreshold?: number\n\t/** Enable long press detection @default true */\n\tenableLongPress?: boolean\n\t/** Long press timeout in milliseconds @default 500 */\n\tlongPressTimeout?: number\n\t/** Enable mouse event simulation for desktop @default true */\n\tenableMouse?: boolean\n\n\tonSwipe?: (direction: SwipeDirection, event: TouchEvent | MouseEvent) => void\n\tonSwipeLeft?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeRight?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeUp?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeDown?: (event: TouchEvent | MouseEvent) => void\n\tonPinch?: (scale: number, event: TouchEvent) => void\n\tonRotate?: (angle: number, event: TouchEvent) => void\n\tonTap?: (event: TouchEvent | MouseEvent) => void\n\tonLongPress?: (event: TouchEvent | MouseEvent) => void\n\tonTouchStart?: (event: TouchEvent | MouseEvent) => void\n\tonTouchMove?: (event: TouchEvent | MouseEvent) => void\n\tonTouchEnd?: (event: TouchEvent | MouseEvent) => void\n}\n\ninterface TouchState {\n\toptions: TouchOptions\n\tstartX: number\n\tstartY: number\n\tstartTime: number\n\tstartDistance: number\n\tstartAngle: number\n\tlastScale: number\n\tlastAngle: number\n\tlongPressTimer: ReturnType<typeof setTimeout> | null\n\tisLongPress: boolean\n\tisMouseDown: boolean\n\tlastTouchEndTime: number\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: (e: TouchEvent) => void\n\t\tmouseDown?: (e: MouseEvent) => void\n\t\tmouseMove?: (e: MouseEvent) => void\n\t\tmouseUp?: (e: MouseEvent) => void\n\t}\n}\n\nconst getDistance = (x1: number, y1: number, x2: number, y2: number): number =>\n\tMath.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)\n\nconst getAngle = (x1: number, y1: number, x2: number, y2: number): number =>\n\t(Math.atan2(y2 - y1, x2 - x1) * 180) / Math.PI\n\nconst MOUSE_IGNORE_DURATION = 400\n\nexport const vTouch = defineDirective<TouchOptions, HTMLElement>({\n\tname: 'touch',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: TouchState = {\n\t\t\toptions,\n\t\t\tstartX: 0,\n\t\t\tstartY: 0,\n\t\t\tstartTime: 0,\n\t\t\tstartDistance: 0,\n\t\t\tstartAngle: 0,\n\t\t\tlastScale: 1,\n\t\t\tlastAngle: 0,\n\t\t\tlongPressTimer: null,\n\t\t\tisLongPress: false,\n\t\t\tisMouseDown: false,\n\t\t\tlastTouchEndTime: 0,\n\t\t\thandlers: { touchStart: () => {}, touchMove: () => {}, touchEnd: () => {} },\n\t\t}\n\n\t\t;(el as any).__touch = state\n\n\t\tconst clearLongPressTimer = (): void => {\n\t\t\tif (state.longPressTimer) {\n\t\t\t\tclearTimeout(state.longPressTimer)\n\t\t\t\tstate.longPressTimer = null\n\t\t\t}\n\t\t}\n\n\t\tconst startLongPressTimer = (event: TouchEvent | MouseEvent): void => {\n\t\t\tclearLongPressTimer()\n\t\t\tif (state.options.enableLongPress && state.options.onLongPress) {\n\t\t\t\tstate.longPressTimer = setTimeout(() => {\n\t\t\t\t\tstate.isLongPress = true\n\t\t\t\t\tstate.options.onLongPress!(event)\n\t\t\t\t}, state.options.longPressTimeout || 500)\n\t\t\t}\n\t\t}\n\n\t\tconst exceedsThreshold = (x: number, y: number): boolean => {\n\t\t\tconst threshold = state.options.tapThreshold || 10\n\t\t\treturn Math.abs(x - state.startX) > threshold || Math.abs(y - state.startY) > threshold\n\t\t}\n\n\t\tconst handleGestureEnd = (endX: number, endY: number, event: TouchEvent | MouseEvent): void => {\n\t\t\tif (state.isLongPress) return\n\n\t\t\tconst duration = Date.now() - state.startTime\n\t\t\tconst deltaX = endX - state.startX\n\t\t\tconst deltaY = endY - state.startY\n\t\t\tconst distance = Math.sqrt(deltaX ** 2 + deltaY ** 2)\n\n\t\t\t// Swipe detection\n\t\t\tif (\n\t\t\t\tstate.options.enableSwipe\n\t\t\t\t&& distance >= (state.options.swipeThreshold || 30)\n\t\t\t\t&& duration <= (state.options.swipeTimeout || 500)\n\t\t\t) {\n\t\t\t\tconst direction: SwipeDirection = Math.abs(deltaX) > Math.abs(deltaY) ? (deltaX > 0 ? 'right' : 'left') : (deltaY > 0 ? 'down' : 'up')\n\n\t\t\t\tstate.options.onSwipe?.(direction, event)\n\t\t\t\tif (direction === 'left') state.options.onSwipeLeft?.(event)\n\t\t\t\telse if (direction === 'right') state.options.onSwipeRight?.(event)\n\t\t\t\telse if (direction === 'up') state.options.onSwipeUp?.(event)\n\t\t\t\telse state.options.onSwipeDown?.(event)\n\t\t\t} else if (\n\t\t\t\tstate.options.enableTap\n\t\t\t\t&& distance < (state.options.tapThreshold || 10)\n\t\t\t\t&& duration < (state.options.tapTimeout || 250)\n\t\t\t) {\n\t\t\t\tstate.options.onTap?.(event)\n\t\t\t}\n\t\t}\n\n\t\t// Touch handlers\n\t\tconst handleTouchStart = (e: TouchEvent): void => {\n\t\t\t// Prevent page zoom on multi-touch\n\t\t\tif (e.touches.length > 1) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isLongPress = false\n\n\t\t\tif (e.touches.length === 1) {\n\t\t\t\tstate.startX = e.touches[0].clientX\n\t\t\t\tstate.startY = e.touches[0].clientY\n\t\t\t\tstartLongPressTimer(e)\n\t\t\t} else if (e.touches.length === 2) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t\tconst [t1, t2] = e.touches\n\t\t\t\tstate.startDistance = getDistance(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tstate.startAngle = getAngle(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tstate.lastScale = 1\n\t\t\t\tstate.lastAngle = 0\n\t\t\t}\n\n\t\t\tstate.options.onTouchStart?.(e)\n\t\t}\n\n\t\tconst handleTouchMove = (e: TouchEvent): void => {\n\t\t\t// Prevent page scroll and zoom during gesture\n\t\t\tif (e.touches.length >= 1) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\n\t\t\tif (state.longPressTimer && e.touches.length === 1 && exceedsThreshold(e.touches[0].clientX, e.touches[0].clientY)) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t}\n\n\t\t\tif (e.touches.length === 2) {\n\t\t\t\tconst [t1, t2] = e.touches\n\t\t\t\tconst currentDistance = getDistance(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tconst currentAngle = getAngle(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\n\t\t\t\tif (state.options.enablePinch && state.options.onPinch) {\n\t\t\t\t\tconst scale = currentDistance / state.startDistance\n\t\t\t\t\tif (Math.abs(scale - state.lastScale) >= (state.options.pinchThreshold || 0.1)) {\n\t\t\t\t\t\tstate.options.onPinch(scale, e)\n\t\t\t\t\t\tstate.lastScale = scale\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (state.options.enableRotate && state.options.onRotate) {\n\t\t\t\t\tconst angleDiff = currentAngle - state.startAngle\n\t\t\t\t\tif (Math.abs(angleDiff - state.lastAngle) > 5) {\n\t\t\t\t\t\tstate.options.onRotate(angleDiff, e)\n\t\t\t\t\t\tstate.lastAngle = angleDiff\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstate.options.onTouchMove?.(e)\n\t\t}\n\n\t\tconst handleTouchEnd = (e: TouchEvent): void => {\n\t\t\tclearLongPressTimer()\n\n\t\t\tif (e.touches.length === 0) {\n\t\t\t\tstate.lastTouchEndTime = Date.now()\n\t\t\t\tconst touch = e.changedTouches[0]\n\t\t\t\thandleGestureEnd(touch.clientX, touch.clientY, e)\n\t\t\t}\n\n\t\t\tstate.options.onTouchEnd?.(e)\n\t\t}\n\n\t\t// Mouse handlers for desktop\n\t\tconst handleMouseDown = (e: MouseEvent): void => {\n\t\t\tif (!state.options.enableMouse) return\n\t\t\t// Ignore simulated mouse events after touch\n\t\t\tif (Date.now() - state.lastTouchEndTime < MOUSE_IGNORE_DURATION) return\n\n\t\t\te.preventDefault()\n\t\t\tstate.isMouseDown = true\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.startX = e.clientX\n\t\t\tstate.startY = e.clientY\n\t\t\tstate.isLongPress = false\n\t\t\tstartLongPressTimer(e)\n\n\t\t\tstate.options.onTouchStart?.(e)\n\t\t}\n\n\t\tconst handleMouseMove = (e: MouseEvent): void => {\n\t\t\tif (!state.isMouseDown || !state.options.enableMouse) return\n\t\t\tif (state.longPressTimer && exceedsThreshold(e.clientX, e.clientY)) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t}\n\t\t\tstate.options.onTouchMove?.(e)\n\t\t}\n\n\t\tconst handleMouseUp = (e: MouseEvent): void => {\n\t\t\tif (!state.isMouseDown || !state.options.enableMouse) return\n\n\t\t\tstate.isMouseDown = false\n\t\t\tclearLongPressTimer()\n\n\t\t\tif (!state.isLongPress) {\n\t\t\t\thandleGestureEnd(e.clientX, e.clientY, e)\n\t\t\t}\n\n\t\t\tstate.options.onTouchEnd?.(e)\n\t\t}\n\n\t\tstate.handlers = { touchStart: handleTouchStart, touchMove: handleTouchMove, touchEnd: handleTouchEnd, mouseDown: handleMouseDown, mouseMove: handleMouseMove, mouseUp: handleMouseUp }\n\n\t\tel.addEventListener('touchstart', handleTouchStart, { passive: false })\n\t\tel.addEventListener('touchmove', handleTouchMove, { passive: false })\n\t\tel.addEventListener('touchend', handleTouchEnd)\n\t\tel.addEventListener('touchcancel', handleTouchEnd)\n\n\t\tif (options.enableMouse) {\n\t\t\tel.addEventListener('mousedown', handleMouseDown)\n\t\t\tdocument.addEventListener('mousemove', handleMouseMove)\n\t\t\tdocument.addEventListener('mouseup', handleMouseUp)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__touch as TouchState | undefined\n\t\tif (state) state.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state = (el as any).__touch as TouchState | undefined\n\n\t\tif (state?.longPressTimer) clearTimeout(state.longPressTimer)\n\n\t\tif (state?.handlers) {\n\t\t\tel.removeEventListener('touchstart', state.handlers.touchStart)\n\t\t\tel.removeEventListener('touchmove', state.handlers.touchMove)\n\t\t\tel.removeEventListener('touchend', state.handlers.touchEnd)\n\t\t\tel.removeEventListener('touchcancel', state.handlers.touchEnd)\n\t\t\tif (state.handlers.mouseDown) el.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\t\tif (state.handlers.mouseMove) document.removeEventListener('mousemove', state.handlers.mouseMove)\n\t\t\tif (state.handlers.mouseUp) document.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\t}\n\n\t\tdelete (el as any).__touch\n\t},\n})\n\nfunction normalizeOptions(binding: TouchOptions | undefined): TouchOptions {\n\treturn {\n\t\tswipeThreshold: binding?.swipeThreshold ?? 30,\n\t\tswipeTimeout: binding?.swipeTimeout ?? 500,\n\t\tpinchThreshold: binding?.pinchThreshold ?? 0.1,\n\t\tenableSwipe: binding?.enableSwipe ?? true,\n\t\tenablePinch: binding?.enablePinch ?? true,\n\t\tenableRotate: binding?.enableRotate ?? true,\n\t\tenableTap: binding?.enableTap ?? true,\n\t\ttapTimeout: binding?.tapTimeout ?? 250,\n\t\ttapThreshold: binding?.tapThreshold ?? 10,\n\t\tenableLongPress: binding?.enableLongPress ?? true,\n\t\tlongPressTimeout: binding?.longPressTimeout ?? 500,\n\t\tenableMouse: binding?.enableMouse ?? true,\n\t\tonSwipe: binding?.onSwipe,\n\t\tonSwipeLeft: binding?.onSwipeLeft,\n\t\tonSwipeRight: binding?.onSwipeRight,\n\t\tonSwipeUp: binding?.onSwipeUp,\n\t\tonSwipeDown: binding?.onSwipeDown,\n\t\tonPinch: binding?.onPinch,\n\t\tonRotate: binding?.onRotate,\n\t\tonTap: binding?.onTap,\n\t\tonLongPress: binding?.onLongPress,\n\t\tonTouchStart: binding?.onTouchStart,\n\t\tonTouchMove: binding?.onTouchMove,\n\t\tonTouchEnd: binding?.onTouchEnd,\n\t}\n}\n\nexport default vTouch\n", "import { defineDirective } from '@directix/core'\nimport { escapeRegex, isInputElement } from '@directix/shared'\n\n/**\n * Trim position\n */\nexport type TrimPosition = 'start' | 'end' | 'both'\n\n/**\n * Trim directive options\n */\nexport interface TrimOptions {\n\t/**\n\t * Trim position\n\t * @default 'both'\n\t */\n\tposition?: TrimPosition\n\n\t/**\n\t * Whether to trim on input (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n\n\t/**\n\t * Whether to trim on blur\n\t * @default true\n\t */\n\tonBlur?: boolean\n\n\t/**\n\t * Custom characters to trim (in addition to whitespace)\n\t */\n\tchars?: string\n}\n\n/**\n * Directive binding value type\n */\nexport type TrimBinding = boolean | TrimPosition | TrimOptions\n\n/**\n * Element state storage\n */\ninterface TrimState {\n\toptions: TrimOptions\n\tinputHandler?: () => void\n\tblurHandler?: () => void\n}\n\n/**\n * Trim text based on options\n */\nfunction trimText(text: string, options: TrimOptions): string {\n\tconst { position = 'both', chars } = options\n\n\t// Build regex pattern for custom chars\n\tconst charPattern = chars ? `[\\\\s${escapeRegex(chars)}]` : '\\\\s'\n\n\tswitch (position) {\n\t\tcase 'start':\n\t\t\treturn text.replace(new RegExp(`^${charPattern}+`, 'g'), '')\n\n\t\tcase 'end':\n\t\t\treturn text.replace(new RegExp(`${charPattern}+$`, 'g'), '')\n\n\t\tcase 'both':\n\t\tdefault:\n\t\t\treturn text.replace(new RegExp(`^${charPattern}+|${charPattern}+$`, 'g'), '')\n\t}\n}\n\n/**\n * v-trim directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: trim both sides -->\n * <input v-trim v-model=\"text\" />\n *\n * <!-- Trim only start -->\n * <input v-trim=\"'start'\" v-model=\"text\" />\n *\n * <!-- Trim only end -->\n * <input v-trim=\"'end'\" v-model=\"text\" />\n *\n * <!-- With options -->\n * <input v-trim=\"{ position: 'both', onBlur: true }\" v-model=\"text\" />\n *\n * <!-- For display only -->\n * <span v-trim> Text with spaces </span>\n * </template>\n * ```\n */\nexport const vTrim = defineDirective<TrimBinding, HTMLElement>({\n\tname: 'trim',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tsetupInputElement(el as HTMLInputElement | HTMLTextAreaElement, options)\n\t\t} else {\n\t\t\t// For non-input elements, trim text content\n\t\t\tconst text = el.textContent || ''\n\n\t\t\tel.textContent = trimText(text, options)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state: TrimState | undefined = (el as any).__trim\n\n\t\tif (isInputElement(el)) {\n\t\t\t// For input elements, trimming happens on blur/input events\n\t\t\tif (state) {\n\t\t\t\tstate.options = options\n\t\t\t}\n\t\t} else {\n\t\t\t// For non-input elements, trim text content\n\t\t\tconst text = el.textContent || ''\n\n\t\t\tel.textContent = trimText(text, options)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: TrimState | undefined = (el as any).__trim\n\n\t\tif (state?.inputHandler) {\n\t\t\tel.removeEventListener('input', state.inputHandler)\n\t\t}\n\t\tif (state?.blurHandler) {\n\t\t\tel.removeEventListener('blur', state.blurHandler)\n\t\t}\n\n\t\tdelete (el as any).__trim\n\t},\n})\n\n/**\n * Setup input element\n */\nfunction setupInputElement(el: HTMLInputElement | HTMLTextAreaElement, options: TrimOptions): void {\n\tconst state: TrimState = { options }\n\n\t;(el as any).__trim = state\n\n\tconst performTrim = (): void => {\n\t\tconst originalValue = el.value\n\t\tconst trimmed = trimText(originalValue, options)\n\n\t\tif (originalValue !== trimmed) {\n\t\t\tel.value = trimmed\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t}\n\t}\n\n\t// Create handlers based on options\n\tif (options.onInput) {\n\t\tconst inputHandler = (): void => {\n\t\t\t// For real-time trimming, we need to be careful about cursor position\n\t\t\t// We'll only trim on blur for better UX, or trim end on input\n\t\t\tconst originalValue = el.value\n\t\t\tconst cursorPos = el.selectionStart\n\n\t\t\t// Trim end while typing\n\t\t\tconst trimmed = originalValue.replace(/\\s+$/g, '')\n\n\t\t\tif (originalValue !== trimmed) {\n\t\t\t\tel.value = trimmed\n\t\t\t\t// Adjust cursor position\n\t\t\t\tif (cursorPos !== null) {\n\t\t\t\t\tconst newCursorPos = Math.min(cursorPos, trimmed.length)\n\n\t\t\t\t\tel.setSelectionRange(newCursorPos, newCursorPos)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tel.addEventListener('input', inputHandler)\n\t\tstate.inputHandler = inputHandler\n\t}\n\n\tif (options.onBlur) {\n\t\tconst blurHandler = (): void => performTrim()\n\n\t\tel.addEventListener('blur', blurHandler)\n\t\tstate.blurHandler = blurHandler\n\t}\n\n\t// Initial trim\n\tif (el.value) {\n\t\tperformTrim()\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: TrimBinding | undefined): TrimOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { position: 'both', onInput: true, onBlur: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { position: 'both', onInput: false, onBlur: false }\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { position: binding, onInput: true, onBlur: true }\n\t}\n\n\treturn {\n\t\tposition: binding.position ?? 'both',\n\t\tonInput: binding.onInput ?? true,\n\t\tonBlur: binding.onBlur ?? true,\n\t\tchars: binding.chars,\n\t}\n}\n\nexport default vTrim\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Truncate position\n */\nexport type TruncatePosition = 'start' | 'middle' | 'end'\n\n/**\n * Truncate directive options\n */\nexport interface TruncateOptions {\n\t/**\n\t * Maximum length of text\n\t * @default 100\n\t */\n\tlength?: number\n\n\t/**\n\t * Truncation position\n\t * @default 'end'\n\t */\n\tposition?: TruncatePosition\n\n\t/**\n\t * Ellipsis string\n\t * @default '...'\n\t */\n\tellipsis?: string\n\n\t/**\n\t * Whether to use CSS truncation (use text-overflow: ellipsis)\n\t * When true, length and position options are ignored\n\t * @default false\n\t */\n\tuseCss?: boolean\n\n\t/**\n\t * Show full text on hover (as title attribute)\n\t * @default true\n\t */\n\tshowTitle?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type TruncateBinding = number | TruncateOptions\n\n/**\n * Element state storage\n */\ninterface TruncateState {\n\toriginalText: string\n\toptions: TruncateOptions\n}\n\n/**\n * Truncate text based on options\n */\nfunction truncateText(text: string, options: TruncateOptions): string {\n\tconst { length = 100, position = 'end', ellipsis = '...' } = options\n\n\tif (text.length <= length) {\n\t\treturn text\n\t}\n\n\tswitch (position) {\n\t\tcase 'start':\n\t\t\treturn ellipsis + text.slice(-(length - ellipsis.length))\n\n\t\tcase 'middle': {\n\t\t\tconst startLen = Math.ceil((length - ellipsis.length) / 2)\n\t\t\tconst endLen = Math.floor((length - ellipsis.length) / 2)\n\n\t\t\treturn text.slice(0, startLen) + ellipsis + text.slice(-endLen)\n\t\t}\n\n\t\tcase 'end':\n\t\tdefault:\n\t\t\treturn text.slice(0, length - ellipsis.length) + ellipsis\n\t}\n}\n\n/**\n * v-truncate directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: truncate to 50 characters -->\n * <p v-truncate=\"50\">Long text here...</p>\n *\n * <!-- With options -->\n * <p v-truncate=\"{ length: 100, position: 'middle' }\">Long text here...</p>\n *\n * <!-- CSS truncation -->\n * <p v-truncate=\"{ useCss: true }\">Long text here...</p>\n * </template>\n * ```\n */\nexport const vTruncate = defineDirective<TruncateBinding, HTMLElement>({\n\tname: 'truncate',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst text = el.textContent || ''\n\n\t\t// Store original text\n\t\tconst state: TruncateState = {\n\t\t\toriginalText: text,\n\t\t\toptions,\n\t\t}\n\n\t\t;(el as any).__truncate = state\n\n\t\tapplyTruncation(el, text, options)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: TruncateState | undefined = (el as any).__truncate\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (state) {\n\t\t\t// Always use original text for re-truncation\n\t\t\tconst originalText = state.originalText\n\n\t\t\t// Check if options changed\n\t\t\tif (JSON.stringify(newOptions) !== JSON.stringify(state.options)) {\n\t\t\t\tstate.options = newOptions\n\t\t\t\tapplyTruncation(el, originalText, newOptions)\n\t\t\t}\n\t\t} else {\n\t\t\tconst text = el.textContent || ''\n\n\t\t\t;(el as any).__truncate = {\n\t\t\t\toriginalText: text,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t\tapplyTruncation(el, text, newOptions)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tdelete (el as any).__truncate\n\t},\n})\n\n/**\n * Apply truncation to element\n */\nfunction applyTruncation(el: HTMLElement, text: string, options: TruncateOptions): void {\n\tconst { useCss, showTitle = true } = options\n\n\tif (useCss) {\n\t\t// Use CSS truncation\n\t\tel.style.overflow = 'hidden'\n\t\tel.style.textOverflow = 'ellipsis'\n\t\tel.style.whiteSpace = 'nowrap'\n\n\t\tif (showTitle && text) {\n\t\t\tel.setAttribute('title', text)\n\t\t}\n\t} else {\n\t\t// Use JavaScript truncation\n\t\tconst truncated = truncateText(text, options)\n\n\t\tel.textContent = truncated\n\n\t\tif (showTitle && text && text !== truncated) {\n\t\t\tel.setAttribute('title', text)\n\t\t}\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: TruncateBinding | undefined): TruncateOptions {\n\tif (typeof binding === 'number') {\n\t\treturn {\n\t\t\tlength: binding,\n\t\t\tposition: 'end',\n\t\t\tellipsis: '...',\n\t\t\tuseCss: false,\n\t\t\tshowTitle: true,\n\t\t}\n\t}\n\n\treturn {\n\t\tlength: binding?.length ?? 100,\n\t\tposition: binding?.position ?? 'end',\n\t\tellipsis: binding?.ellipsis ?? '...',\n\t\tuseCss: binding?.useCss ?? false,\n\t\tshowTitle: binding?.showTitle ?? true,\n\t}\n}\n\nexport default vTruncate\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Typewriter directive options\n */\nexport interface TypewriterOptions {\n\t/**\n\t * Text to type\n\t */\n\ttext: string\n\n\t/**\n\t * Typing speed in milliseconds\n\t * @default 50\n\t */\n\tspeed?: number\n\n\t/**\n\t * Delay before starting in milliseconds\n\t * @default 0\n\t */\n\tdelay?: number\n\n\t/**\n\t * Whether to loop the animation\n\t * @default false\n\t */\n\tloop?: boolean\n\n\t/**\n\t * Delay before deleting (when looping)\n\t * @default 1500\n\t */\n\tdeleteDelay?: number\n\n\t/**\n\t * Deleting speed in milliseconds\n\t * @default 30\n\t */\n\tdeleteSpeed?: number\n\n\t/**\n\t * Cursor character\n\t * @default '|'\n\t */\n\tcursor?: string | false\n\n\t/**\n\t * Cursor blink animation\n\t * @default true\n\t */\n\tcursorBlink?: boolean\n\n\t/**\n\t * Callback when typing starts\n\t */\n\tonStart?: () => void\n\n\t/**\n\t * Callback for each character typed\n\t */\n\tonType?: (char: string, index: number) => void\n\n\t/**\n\t * Callback when typing completes\n\t */\n\tonComplete?: () => void\n\n\t/**\n\t * Callback when deleting starts (for loop)\n\t */\n\tonDeleteStart?: () => void\n\n\t/**\n\t * Callback when deleting completes (for loop)\n\t */\n\tonDeleteComplete?: () => void\n}\n\n/**\n * Directive binding value type\n */\nexport type TypewriterBinding = string | TypewriterOptions\n\n/**\n * Element state storage\n */\ninterface TypewriterState {\n\toptions: TypewriterOptions\n\toriginalContent: string\n\tcurrentText: string\n\ttimeoutId: ReturnType<typeof setTimeout> | null\n\tanimationFrameId: number | null\n\tisTyping: boolean\n\tisDeleting: boolean\n\tcursorElement: HTMLSpanElement | null\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: TypewriterBinding): TypewriterOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { text: binding }\n\t}\n\n\treturn {\n\t\tspeed: 50,\n\t\tdelay: 0,\n\t\tloop: false,\n\t\tdeleteDelay: 1500,\n\t\tdeleteSpeed: 30,\n\t\tcursor: '|',\n\t\tcursorBlink: true,\n\t\t...binding,\n\t\ttext: typeof binding === 'string' ? binding : binding.text || '',\n\t}\n}\n\n/**\n * Create cursor element\n */\nfunction createCursor(options: TypewriterOptions): HTMLSpanElement | null {\n\tif (options.cursor === false) return null\n\n\tconst cursor = document.createElement('span')\n\tcursor.className = 'v-typewriter__cursor'\n\tcursor.textContent = options.cursor || '|'\n\n\tif (options.cursorBlink !== false) {\n\t\tcursor.style.animation = 'v-typewriter-blink 0.7s infinite'\n\t}\n\n\treturn cursor\n}\n\n/**\n * Ensure global styles\n */\nfunction ensureStyles(): void {\n\tif (!isBrowser()) return\n\n\tconst styleId = 'v-typewriter-styles'\n\tif (document.getElementById(styleId)) return\n\n\tconst style = document.createElement('style')\n\tstyle.id = styleId\n\tstyle.textContent = `\n @keyframes v-typewriter-blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0; }\n }\n .v-typewriter__cursor {\n display: inline-block;\n margin-left: 1px;\n }\n `\n\n\tdocument.head.appendChild(style)\n}\n\n/**\n * v-typewriter directive\n * Typewriter animation effect\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage -->\n * <span v-typewriter=\"'Hello, World!'\"></span>\n *\n * <!-- With options -->\n * <span v-typewriter=\"{\n * text: 'Typing animation',\n * speed: 100,\n * cursor: '_',\n * onComplete: () => console.log('Done!')\n * }\"></span>\n *\n * <!-- Loop mode -->\n * <span v-typewriter=\"{\n * text: 'Loop animation',\n * loop: true,\n * deleteDelay: 1000\n * }\"></span>\n * </template>\n * ```\n */\nexport const vTypewriter = defineDirective<TypewriterBinding, HTMLElement>({\n\tname: 'typewriter',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!options.text) return\n\n\t\tif (isBrowser()) {\n\t\t\tensureStyles()\n\t\t}\n\n\t\tconst state: TypewriterState = {\n\t\t\toptions,\n\t\t\toriginalContent: el.textContent || '',\n\t\t\tcurrentText: '',\n\t\t\ttimeoutId: null,\n\t\t\tanimationFrameId: null,\n\t\t\tisTyping: false,\n\t\t\tisDeleting: false,\n\t\t\tcursorElement: null,\n\t\t}\n\n\t\t;(el as any).__typewriter = state\n\n\t\t// Clear initial content\n\t\tel.textContent = ''\n\n\t\t// Add cursor\n\t\tstate.cursorElement = createCursor(options)\n\t\tif (state.cursorElement) {\n\t\t\tel.appendChild(state.cursorElement)\n\t\t}\n\n\t\tel.classList.add('v-typewriter')\n\n\t\t// Start typing after delay\n\t\tif (isBrowser()) {\n\t\t\tstate.timeoutId = setTimeout(() => {\n\t\t\t\tstartTyping(el, state)\n\t\t\t}, options.delay || 0)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: TypewriterState = (el as any).__typewriter\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Check if text changed\n\t\tif (newOptions.text !== state.options.text) {\n\t\t\t// Cancel current animation\n\t\t\tcancelAnimation(state)\n\n\t\t\t// Reset state\n\t\t\tstate.options = newOptions\n\t\t\tstate.currentText = ''\n\t\t\tstate.isTyping = false\n\t\t\tstate.isDeleting = false\n\n\t\t\t// Clear content\n\t\t\tel.textContent = ''\n\n\t\t\t// Re-add cursor\n\t\t\tstate.cursorElement = createCursor(newOptions)\n\t\t\tif (state.cursorElement) {\n\t\t\t\tel.appendChild(state.cursorElement)\n\t\t\t}\n\n\t\t\t// Start new animation\n\t\t\tif (isBrowser()) {\n\t\t\t\tstate.timeoutId = setTimeout(() => {\n\t\t\t\t\tstartTyping(el, state)\n\t\t\t\t}, newOptions.delay || 0)\n\t\t\t}\n\t\t} else {\n\t\t\tstate.options = newOptions\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: TypewriterState = (el as any).__typewriter\n\n\t\tif (!state) return\n\n\t\tcancelAnimation(state)\n\t\tel.classList.remove('v-typewriter')\n\n\t\tdelete (el as any).__typewriter\n\t},\n})\n\n/**\n * Start typing animation\n */\nfunction startTyping(el: HTMLElement, state: TypewriterState): void {\n\tconst { options, cursorElement } = state\n\n\tstate.isTyping = true\n\toptions.onStart?.()\n\n\tconst text = options.text\n\n\tfunction typeNextChar(index: number): void {\n\t\tif (index >= text.length) {\n\t\t\tstate.isTyping = false\n\t\t\toptions.onComplete?.()\n\n\t\t\t// Start deleting if looping\n\t\t\tif (options.loop) {\n\t\t\t\tstate.timeoutId = setTimeout(() => {\n\t\t\t\t\tstartDeleting(el, state)\n\t\t\t\t}, options.deleteDelay)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst char = text[index]\n\t\tstate.currentText += char\n\n\t\t// Update element\n\t\tel.textContent = state.currentText\n\t\tif (cursorElement) {\n\t\t\tel.appendChild(cursorElement)\n\t\t}\n\n\t\toptions.onType?.(char, index)\n\n\t\t// Schedule next character\n\t\tstate.timeoutId = setTimeout(() => {\n\t\t\ttypeNextChar(index + 1)\n\t\t}, options.speed || 50)\n\t}\n\n\ttypeNextChar(0)\n}\n\n/**\n * Start deleting animation\n */\nfunction startDeleting(el: HTMLElement, state: TypewriterState): void {\n\tconst { options, cursorElement } = state\n\n\tstate.isDeleting = true\n\toptions.onDeleteStart?.()\n\n\tfunction deleteNextChar(): void {\n\t\tif (state.currentText.length === 0) {\n\t\t\tstate.isDeleting = false\n\t\t\toptions.onDeleteComplete?.()\n\n\t\t\t// Restart typing if looping\n\t\t\tif (options.loop) {\n\t\t\t\tstate.timeoutId = setTimeout(() => {\n\t\t\t\t\tstartTyping(el, state)\n\t\t\t\t}, options.delay || 0)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tstate.currentText = state.currentText.slice(0, -1)\n\n\t\t// Update element\n\t\tel.textContent = state.currentText\n\t\tif (cursorElement) {\n\t\t\tel.appendChild(cursorElement)\n\t\t}\n\n\t\t// Schedule next deletion\n\t\tstate.timeoutId = setTimeout(() => {\n\t\t\tdeleteNextChar()\n\t\t}, options.deleteSpeed || 30)\n\t}\n\n\tdeleteNextChar()\n}\n\n/**\n * Cancel ongoing animation\n */\nfunction cancelAnimation(state: TypewriterState): void {\n\tif (state.timeoutId) {\n\t\tclearTimeout(state.timeoutId)\n\t\tstate.timeoutId = null\n\t}\n\n\tif (state.animationFrameId) {\n\t\tcancelAnimationFrame(state.animationFrameId)\n\t\tstate.animationFrameId = null\n\t}\n\n\tstate.isTyping = false\n\tstate.isDeleting = false\n}\n\nexport default vTypewriter\n", "import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Uppercase directive options\n */\nexport interface UppercaseOptions {\n\t/**\n\t * Transform only the first character\n\t * @default false\n\t */\n\tfirst?: boolean\n\n\t/**\n\t * Transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type UppercaseBinding = boolean | UppercaseOptions\n\n/**\n * Transform text to uppercase\n */\nfunction transformText(text: string, options: UppercaseOptions): string {\n\tif (!text) return text\n\n\tif (options.first) {\n\t\treturn text.charAt(0).toUpperCase() + text.slice(1)\n\t}\n\n\treturn text.toUpperCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: UppercaseBinding | undefined): UppercaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { first: false, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { first: false, onInput: false }\n\t}\n\n\treturn {\n\t\tfirst: binding.first ?? false,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-uppercase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Transform all characters to uppercase -->\n * <input v-uppercase v-model=\"text\" />\n *\n * <!-- Transform only first character -->\n * <span v-uppercase=\"{ first: true }\">{{ text }}</span>\n * </template>\n * ```\n */\nexport const vUppercase = defineDirective<UppercaseBinding, HTMLElement>({\n\tname: 'uppercase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => transformText(text, options))\n\n\t\t\t;(el as any).__uppercaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = transformText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__uppercaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__uppercaseCleanup\n\t},\n})\n\nexport default vUppercase\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Virtual list item size function\n */\nexport type ItemSizeFunction = (index: number) => number\n\n/**\n * Virtual list render function\n */\nexport type VirtualListRenderFunction = (item: any, index: number) => string\n\n/**\n * Virtual list directive options\n */\nexport interface VirtualListOptions<T = any> {\n\t/**\n\t * Array of items to render\n\t * @required\n\t */\n\titems: T[]\n\n\t/**\n\t * Height of each item (in pixels)\n\t * Can be a fixed number or a function\n\t * @default 50\n\t */\n\titemSize?: number | ItemSizeFunction\n\n\t/**\n\t * Height of the container (in pixels)\n\t * @default 400\n\t */\n\theight?: number | string\n\n\t/**\n\t * Number of extra items to render above/below visible area\n\t * @default 3\n\t */\n\toverscan?: number\n\n\t/**\n\t * Custom render function\n\t */\n\trender?: VirtualListRenderFunction\n\n\t/**\n\t * Key field name for items\n\t * @default 'id'\n\t */\n\tkeyField?: string\n\n\t/**\n\t * Callback when scroll position changes\n\t */\n\tonScroll?: (scrollTop: number) => void\n\n\t/**\n\t * Callback when visible range changes\n\t */\n\tonVisibleChange?: (startIndex: number, endIndex: number) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type VirtualListBinding<T = any> = VirtualListOptions<T> | T[]\n\n/**\n * Element state storage\n */\ninterface VirtualListState {\n\toptions: VirtualListOptions\n\tcontainerEl: HTMLElement | null\n\tcontentEl: HTMLElement | null\n\tscrollHandler: ((event: Event) => void) | null\n\tresizeObserver: ResizeObserver | null\n\tstartIndex: number\n\tendIndex: number\n\tvisibleItems: any[]\n}\n\n/**\n * Get item height\n */\nfunction getItemSize(options: VirtualListOptions, index: number): number {\n\tif (typeof options.itemSize === 'function') {\n\t\treturn options.itemSize(index)\n\t}\n\treturn options.itemSize || 50\n}\n\n/**\n * Calculate total height\n */\nfunction calculateTotalHeight(options: VirtualListOptions): number {\n\tif (typeof options.itemSize === 'function') {\n\t\tlet total = 0\n\t\tfor (let i = 0; i < options.items.length; i++) {\n\t\t\ttotal += options.itemSize(i)\n\t\t}\n\t\treturn total\n\t}\n\treturn (options.itemSize || 50) * options.items.length\n}\n\n/**\n * Calculate visible range\n */\nfunction calculateVisibleRange(\n\tscrollTop: number,\n\tcontainerHeight: number,\n\toptions: VirtualListOptions,\n): { startIndex: number, endIndex: number, offsetY: number } {\n\tconst items = options.items\n\tconst itemSize = options.itemSize || 50\n\tconst overscan = options.overscan || 3\n\n\tlet startIndex = 0,\n\t\tendIndex = 0,\n\t\toffsetY = 0\n\n\tif (typeof itemSize === 'function') {\n\t\t// Variable size items\n\t\tlet currentOffset = 0\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst size = itemSize(i)\n\t\t\tif (currentOffset + size > scrollTop) {\n\t\t\t\tstartIndex = i\n\t\t\t\toffsetY = currentOffset\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcurrentOffset += size\n\t\t}\n\n\t\t// Find end index\n\t\tendIndex = startIndex\n\t\tcurrentOffset = offsetY\n\t\twhile (endIndex < items.length && currentOffset < scrollTop + containerHeight) {\n\t\t\tcurrentOffset += itemSize(endIndex)\n\t\t\tendIndex++\n\t\t}\n\n\t\t// Add overscan\n\t\tstartIndex = Math.max(0, startIndex - overscan)\n\t\tendIndex = Math.min(items.length, endIndex + overscan)\n\n\t\t// Recalculate offset for overscan\n\t\tcurrentOffset = 0\n\t\tfor (let i = 0; i < startIndex; i++) {\n\t\t\tcurrentOffset += itemSize(i)\n\t\t}\n\t\toffsetY = currentOffset\n\n\t\treturn { startIndex, endIndex, offsetY }\n\t}\n\n\t// Fixed size items\n\tstartIndex = Math.max(0, Math.floor(scrollTop / itemSize) - overscan)\n\tendIndex = Math.min(items.length, Math.ceil((scrollTop + containerHeight) / itemSize) + overscan)\n\toffsetY = startIndex * itemSize\n\n\treturn { startIndex, endIndex, offsetY }\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions<T>(binding: VirtualListBinding<T>): VirtualListOptions<T> {\n\tif (Array.isArray(binding)) {\n\t\treturn {\n\t\t\titems: binding,\n\t\t\titemSize: 50,\n\t\t\theight: 400,\n\t\t\toverscan: 3,\n\t\t\tkeyField: 'id',\n\t\t}\n\t}\n\n\treturn {\n\t\titems: binding.items,\n\t\titemSize: binding.itemSize ?? 50,\n\t\theight: binding.height ?? 400,\n\t\toverscan: binding.overscan ?? 3,\n\t\trender: binding.render,\n\t\tkeyField: binding.keyField ?? 'id',\n\t\tonScroll: binding.onScroll,\n\t\tonVisibleChange: binding.onVisibleChange,\n\t}\n}\n\n/**\n * Create item element\n */\nfunction createItemElement(\n\titem: any,\n\tindex: number,\n\toptions: VirtualListOptions,\n): HTMLElement {\n\tconst el = document.createElement('div')\n\tel.className = 'v-virtual-list__item'\n\tel.dataset.index = String(index)\n\n\t// Get item key\n\tconst keyField = options.keyField || 'id'\n\tif (typeof item === 'object' && item !== null && keyField in item) {\n\t\tel.dataset.key = String(item[keyField])\n\t}\n\n\t// Set height\n\tconst height = getItemSize(options, index)\n\tel.style.height = `${height}px`\n\tel.style.boxSizing = 'border-box'\n\n\t// Render content\n\tif (options.render) {\n\t\tel.innerHTML = options.render(item, index)\n\t} else {\n\t\tel.textContent = typeof item === 'object' ? JSON.stringify(item) : String(item)\n\t}\n\n\treturn el\n}\n\n/**\n * v-virtual-list directive\n *\n * Renders a large list efficiently using virtualization.\n *\n * @example\n * ```vue\n * <template>\n * <div v-virtual-list=\"{ items: largeList, itemSize: 50 }\"></div>\n *\n * <div v-virtual-list=\"{\n * items: largeList,\n * itemSize: (index) => index % 10 === 0 ? 100 : 50,\n * height: 600,\n * overscan: 5,\n * render: (item, index) => `<div class=\"item\">${item.name}</div>`\n * }\"></div>\n * </template>\n * ```\n */\nexport const vVirtualList = defineDirective<VirtualListBinding, HTMLElement>({\n\tname: 'virtual-list',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Setup container\n\t\tel.classList.add('v-virtual-list')\n\t\tel.style.height = typeof options.height === 'number' ? `${options.height}px` : options.height as string\n\t\tel.style.overflow = 'auto'\n\t\tel.style.position = 'relative'\n\n\t\t// Create content wrapper\n\t\tconst contentEl = document.createElement('div')\n\t\tcontentEl.className = 'v-virtual-list__content'\n\t\tcontentEl.style.position = 'relative'\n\t\tcontentEl.style.height = `${calculateTotalHeight(options)}px`\n\t\tel.appendChild(contentEl)\n\n\t\t// Create visible items wrapper\n\t\tconst visibleEl = document.createElement('div')\n\t\tvisibleEl.className = 'v-virtual-list__visible'\n\t\tvisibleEl.style.position = 'absolute'\n\t\tvisibleEl.style.top = '0'\n\t\tvisibleEl.style.left = '0'\n\t\tvisibleEl.style.right = '0'\n\t\tcontentEl.appendChild(visibleEl)\n\n\t\tconst state: VirtualListState = {\n\t\t\toptions,\n\t\t\tcontainerEl: el,\n\t\t\tcontentEl,\n\t\t\tscrollHandler: null,\n\t\t\tresizeObserver: null,\n\t\t\tstartIndex: 0,\n\t\t\tendIndex: 0,\n\t\t\tvisibleItems: [],\n\t\t}\n\n\t\t;(el as any).__virtualList = state\n\n\t\t// Create scroll handler\n\t\tconst scrollHandler = (_event: Event): void => {\n\t\t\tconst scrollTop = el.scrollTop\n\t\t\tconst containerHeight = el.clientHeight\n\n\t\t\t// Calculate visible range\n\t\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(\n\t\t\t\tscrollTop,\n\t\t\t\tcontainerHeight,\n\t\t\t\tstate.options,\n\t\t\t)\n\n\t\t\t// Check if range changed\n\t\t\tif (startIndex !== state.startIndex || endIndex !== state.endIndex) {\n\t\t\t\tstate.startIndex = startIndex\n\t\t\t\tstate.endIndex = endIndex\n\n\t\t\t\t// Render visible items\n\t\t\t\trenderVisibleItems(visibleEl, state, offsetY)\n\n\t\t\t\t// Callback\n\t\t\t\tif (state.options.onVisibleChange) {\n\t\t\t\t\tstate.options.onVisibleChange(startIndex, endIndex)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Scroll callback\n\t\t\tif (state.options.onScroll) {\n\t\t\t\tstate.options.onScroll(scrollTop)\n\t\t\t}\n\t\t}\n\n\t\tstate.scrollHandler = scrollHandler\n\t\tel.addEventListener('scroll', scrollHandler, { passive: true })\n\n\t\t// Initial render\n\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(0, el.clientHeight, options)\n\t\tstate.startIndex = startIndex\n\t\tstate.endIndex = endIndex\n\t\trenderVisibleItems(visibleEl, state, offsetY)\n\n\t\t// Setup resize observer\n\t\tif (typeof ResizeObserver !== 'undefined') {\n\t\t\tconst resizeObserver = new ResizeObserver(() => {\n\t\t\t\t// Recalculate on resize\n\t\t\t\tscrollHandler(new Event('scroll'))\n\t\t\t})\n\t\t\tresizeObserver.observe(el)\n\t\t\tstate.resizeObserver = resizeObserver\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: VirtualListState = (el as any).__virtualList\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tstate.options = newOptions\n\n\t\t// Update content height\n\t\tif (state.contentEl) {\n\t\t\tstate.contentEl.style.height = `${calculateTotalHeight(newOptions)}px`\n\t\t}\n\n\t\t// Force re-render\n\t\tconst scrollTop = el.scrollTop\n\t\tconst containerHeight = el.clientHeight\n\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(\n\t\t\tscrollTop,\n\t\t\tcontainerHeight,\n\t\t\tnewOptions,\n\t\t)\n\t\tstate.startIndex = startIndex\n\t\tstate.endIndex = endIndex\n\n\t\tconst visibleEl = state.contentEl?.querySelector('.v-virtual-list__visible') as HTMLElement\n\t\tif (visibleEl) {\n\t\t\trenderVisibleItems(visibleEl, state, offsetY)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: VirtualListState | undefined = (el as any).__virtualList\n\n\t\tif (!state) return\n\n\t\tif (state.scrollHandler) {\n\t\t\tel.removeEventListener('scroll', state.scrollHandler)\n\t\t}\n\n\t\tif (state.resizeObserver) {\n\t\t\tstate.resizeObserver.disconnect()\n\t\t}\n\n\t\tdelete (el as any).__virtualList\n\t},\n})\n\n/**\n * Render visible items\n */\nfunction renderVisibleItems(\n\tvisibleEl: HTMLElement,\n\tstate: VirtualListState,\n\toffsetY: number,\n): void {\n\tconst { options, startIndex, endIndex } = state\n\n\t// Set transform\n\tvisibleEl.style.transform = `translateY(${offsetY}px)`\n\n\t// Clear existing items\n\tvisibleEl.innerHTML = ''\n\n\t// Render items\n\tfor (let i = startIndex; i < endIndex; i++) {\n\t\tconst item = options.items[i]\n\t\tif (item !== undefined) {\n\t\t\tconst itemEl = createItemElement(item, i, options)\n\t\t\tvisibleEl.appendChild(itemEl)\n\t\t}\n\t}\n}\n\nexport default vVirtualList\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Visible change handler\n */\nexport type VisibleHandler = (isVisible: boolean) => void\n\n/**\n * Visible directive options\n */\nexport interface VisibleOptions {\n\t/**\n\t * Callback when visibility changes\n\t */\n\thandler?: VisibleHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to set visibility: hidden instead of display: none\n\t * @default false\n\t */\n\tuseHidden?: boolean\n\n\t/**\n\t * Initial visibility\n\t * @default true\n\t */\n\tinitial?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type VisibleBinding = boolean | VisibleOptions\n\n/**\n * Element state storage\n */\ninterface VisibleState {\n\toptions: VisibleOptions\n\tisVisible: boolean\n\toriginalDisplay: string\n\toriginalVisibility: string\n\ttransitionEndHandler: (e: TransitionEvent) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: VisibleBinding | undefined): VisibleOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { initial: binding }\n\t}\n\n\treturn {\n\t\tinitial: true,\n\t\tdisabled: false,\n\t\tuseHidden: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-visible directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-visible=\"showElement\">Show/Hide</div>\n * <div v-visible=\"{ handler: onVisibleChange }\">Track visibility</div>\n * <div v-visible=\"{ useHidden: true, initial: false }\">Uses visibility: hidden</div>\n * </template>\n * ```\n */\nexport const vVisible = defineDirective<VisibleBinding, HTMLElement>({\n\tname: 'visible',\n\tssr: true, // SSR safe - will set initial visibility on server\n\tdefaults: {\n\t\tinitial: true,\n\t\tdisabled: false,\n\t\tuseHidden: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Store original styles\n\t\tconst originalDisplay = el.style.display\n\t\tconst originalVisibility = el.style.visibility\n\n\t\tconst state: VisibleState = {\n\t\t\toptions,\n\t\t\tisVisible: options.initial ?? true,\n\t\t\toriginalDisplay,\n\t\t\toriginalVisibility,\n\t\t\ttransitionEndHandler: (e: TransitionEvent) => {\n\t\t\t\t// Handle transition end for animations\n\t\t\t\tif (e.propertyName === 'opacity' || e.propertyName === 'visibility') {\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('visible:transition-end', {\n\t\t\t\t\t\tdetail: { isVisible: state.isVisible },\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__visible = state\n\n\t\t// Add transition listener\n\t\ton(el, 'transitionend', state.transitionEndHandler as (e: Event) => void)\n\n\t\t// Apply initial visibility\n\t\tapplyVisibility(el, state, options.initial ?? true)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: VisibleState = (el as any).__visible\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Determine new visibility\n\t\tlet newVisibility: boolean\n\n\t\tif (typeof binding.value === 'boolean') {\n\t\t\tnewVisibility = binding.value\n\t\t} else {\n\t\t\tnewVisibility = newOptions.initial ?? true\n\t\t}\n\n\t\t// Update if changed\n\t\tif (state.isVisible !== newVisibility) {\n\t\t\tapplyVisibility(el, state, newVisibility)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: VisibleState = (el as any).__visible\n\n\t\tif (!state) return\n\n\t\t// Remove transition listener\n\t\toff(el, 'transitionend', state.transitionEndHandler as (e: Event) => void)\n\n\t\t// Restore original styles\n\t\tel.style.display = state.originalDisplay\n\t\tel.style.visibility = state.originalVisibility\n\n\t\tdelete (el as any).__visible\n\t},\n})\n\n/**\n * Apply visibility to element\n */\nfunction applyVisibility(el: HTMLElement, state: VisibleState, isVisible: boolean): void {\n\tconst previousVisibility = state.isVisible\n\n\tstate.isVisible = isVisible\n\n\t// Add/remove class first (for CSS transitions)\n\tif (isVisible) {\n\t\tel.classList.remove('v-hidden')\n\t\tel.classList.add('v-visible')\n\t} else {\n\t\tel.classList.remove('v-visible')\n\t\tel.classList.add('v-hidden')\n\t}\n\n\tif (state.options.useHidden) {\n\t\t// Use visibility: hidden with animation support\n\t\tif (isVisible) {\n\t\t\t// Show: set visibility first, then animate\n\t\t\tel.style.visibility = state.originalVisibility || 'visible'\n\t\t} else {\n\t\t\t// Hide: wait for transition, then set hidden\n\t\t\tconst computedStyle = getComputedStyle(el)\n\t\t\tconst hasTransition = computedStyle.transitionDuration !== '0s'\n\n\t\t\tif (hasTransition) {\n\t\t\t\t// Wait for transition to complete\n\t\t\t\tconst handleTransitionEnd = (e: TransitionEvent): void => {\n\t\t\t\t\tif (e.target === el && (e.propertyName === 'opacity' || e.propertyName === 'transform')) {\n\t\t\t\t\t\tif (!state.isVisible) {\n\t\t\t\t\t\t\tel.style.visibility = 'hidden'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tel.removeEventListener('transitionend', handleTransitionEnd)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tel.addEventListener('transitionend', handleTransitionEnd)\n\t\t\t} else {\n\t\t\t\tel.style.visibility = 'hidden'\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Use display: none (no animation support)\n\t\tel.style.display = isVisible ? state.originalDisplay : 'none'\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('visible:change', {\n\t\tdetail: { isVisible, previousVisibility },\n\t}))\n\n\t// Trigger handler\n\tif (state.options.handler && previousVisibility !== isVisible) {\n\t\tstate.options.handler(isVisible)\n\t}\n}\n\nexport default vVisible\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Watermark options\n */\nexport interface WatermarkOptions {\n\t/**\n\t * Watermark text content\n\t * @required\n\t */\n\tcontent: string | string[]\n\n\t/**\n\t * Width of watermark canvas\n\t * @default 300\n\t */\n\twidth?: number\n\n\t/**\n\t * Height of watermark canvas\n\t * @default 200\n\t */\n\theight?: number\n\n\t/**\n\t * Rotation angle in degrees\n\t * @default -22\n\t */\n\trotate?: number\n\n\t/**\n\t * Font size in pixels\n\t * @default 16\n\t */\n\tfontSize?: number\n\n\t/**\n\t * Font family\n\t * @default 'sans-serif'\n\t */\n\tfontFamily?: string\n\n\t/**\n\t * Font weight\n\t * @default 'normal'\n\t */\n\tfontWeight?: string | number\n\n\t/**\n\t * Font color\n\t * @default 'rgba(128, 128, 128, 0.15)'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Gap between watermarks in pixels\n\t * @default [100, 100]\n\t */\n\tgap?: [number, number] | number\n\n\t/**\n\t * Z-index of watermark layer\n\t * @default 9999\n\t */\n\tzIndex?: number\n\n\t/**\n\t * Whether to disable watermark (for dynamic control)\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to prevent removal attempts\n\t * @default true\n\t */\n\tprotect?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type WatermarkBinding = string | WatermarkOptions\n\n/**\n * Element state storage\n */\ninterface WatermarkState {\n\toptions: WatermarkOptions\n\twatermarkEl: HTMLDivElement | null\n\tobserver: MutationObserver | null\n\tcanvas: HTMLCanvasElement | null\n}\n\n/**\n * Create watermark canvas\n */\nfunction createWatermarkCanvas(options: WatermarkOptions): HTMLCanvasElement {\n\tconst canvas = document.createElement('canvas')\n\tconst ctx = canvas.getContext('2d')\n\n\tif (!ctx) {\n\t\tthrow new Error('[Directix] v-watermark: Could not get canvas context')\n\t}\n\n\tconst width = options.width || 300\n\tconst height = options.height || 200\n\tconst fontSize = options.fontSize || 16\n\tconst fontFamily = options.fontFamily || 'sans-serif'\n\tconst fontWeight = options.fontWeight || 'normal'\n\tconst color = options.color || 'rgba(128, 128, 128, 0.15)'\n\tconst rotate = options.rotate ?? -22\n\n\tcanvas.width = width\n\tcanvas.height = height\n\n\tctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`\n\tctx.fillStyle = color\n\tctx.textAlign = 'center'\n\tctx.textBaseline = 'middle'\n\n\t// Rotate canvas\n\tctx.translate(width / 2, height / 2)\n\tctx.rotate((rotate * Math.PI) / 180)\n\n\t// Draw text\n\tconst content = Array.isArray(options.content) ? options.content : [options.content]\n\tconst lineHeight = fontSize * 1.5\n\tconst startY = -((content.length - 1) * lineHeight) / 2\n\n\tcontent.forEach((text, index) => {\n\t\tctx.fillText(text, 0, startY + index * lineHeight)\n\t})\n\n\treturn canvas\n}\n\n/**\n * Create watermark element\n */\nfunction createWatermarkElement(canvas: HTMLCanvasElement, options: WatermarkOptions): HTMLDivElement {\n\tconst gap = Array.isArray(options.gap) ? options.gap : [options.gap || 100, options.gap || 100]\n\tconst zIndex = options.zIndex ?? 9999\n\n\tconst el = document.createElement('div')\n\tel.className = 'v-watermark'\n\tel.style.cssText = `\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tpointer-events: none;\n\t\tz-index: ${zIndex};\n\t\tbackground-image: url(\"${canvas.toDataURL()}\");\n\t\tbackground-repeat: repeat;\n\t\tbackground-position: ${gap[0] / 2}px ${gap[1] / 2}px;\n\t\tbackground-size: ${canvas.width + gap[0]}px ${canvas.height + gap[1]}px;\n\t`\n\n\treturn el\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: WatermarkBinding): WatermarkOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { content: binding }\n\t}\n\n\treturn {\n\t\tcontent: binding.content,\n\t\twidth: binding.width ?? 300,\n\t\theight: binding.height ?? 200,\n\t\trotate: binding.rotate ?? -22,\n\t\tfontSize: binding.fontSize ?? 16,\n\t\tfontFamily: binding.fontFamily ?? 'sans-serif',\n\t\tfontWeight: binding.fontWeight ?? 'normal',\n\t\tcolor: binding.color ?? 'rgba(128, 128, 128, 0.15)',\n\t\tgap: binding.gap ?? [100, 100],\n\t\tzIndex: binding.zIndex ?? 9999,\n\t\tdisabled: binding.disabled ?? false,\n\t\tprotect: binding.protect ?? true,\n\t}\n}\n\n/**\n * v-watermark directive\n *\n * Adds a watermark layer to an element.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple watermark -->\n * <div v-watermark=\"'Confidential'\">Protected content</div>\n *\n * <!-- Multi-line watermark -->\n * <div v-watermark=\"{ content: ['Company Name', 'User: John'] }\">\n * Protected content\n * </div>\n *\n * <!-- Customized watermark -->\n * <div v-watermark=\"{\n * content: 'DRAFT',\n * fontSize: 24,\n * color: 'rgba(255, 0, 0, 0.2)',\n * rotate: -30,\n * gap: 50\n * }\">\n * Draft document\n * </div>\n * </template>\n * ```\n */\nexport const vWatermark = defineDirective<WatermarkBinding, HTMLElement>({\n\tname: 'watermark',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Make sure element has position\n\t\tconst computedStyle = getComputedStyle(el)\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\tconst state: WatermarkState = {\n\t\t\toptions,\n\t\t\twatermarkEl: null,\n\t\t\tobserver: null,\n\t\t\tcanvas: null,\n\t\t}\n\n\t\t;(el as any).__watermark = state\n\n\t\tif (!options.disabled) {\n\t\t\tapplyWatermark(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: WatermarkState = (el as any).__watermark\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Check if disabled state changed\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disable: remove watermark\n\t\t\tremoveWatermark(state)\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Enable: add watermark\n\t\t\tstate.options = newOptions\n\t\t\tapplyWatermark(el, state)\n\t\t} else if (!newOptions.disabled) {\n\t\t\t// Update watermark\n\t\t\tstate.options = newOptions\n\t\t\tremoveWatermark(state)\n\t\t\tapplyWatermark(el, state)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: WatermarkState | undefined = (el as any).__watermark\n\n\t\tif (!state) return\n\n\t\tremoveWatermark(state)\n\n\t\tdelete (el as any).__watermark\n\t},\n})\n\n/**\n * Apply watermark to element\n */\nfunction applyWatermark(el: HTMLElement, state: WatermarkState): void {\n\tconst options = state.options\n\n\t// Create canvas\n\tstate.canvas = createWatermarkCanvas(options)\n\n\t// Create watermark element\n\tstate.watermarkEl = createWatermarkElement(state.canvas, options)\n\n\t// Append to element\n\tel.appendChild(state.watermarkEl)\n\n\t// Set up protection observer if enabled\n\tif (options.protect) {\n\t\tsetupProtection(el, state)\n\t}\n}\n\n/**\n * Remove watermark\n */\nfunction removeWatermark(state: WatermarkState): void {\n\t// Disconnect observer\n\tif (state.observer) {\n\t\tstate.observer.disconnect()\n\t\tstate.observer = null\n\t}\n\n\t// Remove watermark element\n\tif (state.watermarkEl && state.watermarkEl.parentNode) {\n\t\tstate.watermarkEl.parentNode.removeChild(state.watermarkEl)\n\t}\n\n\tstate.watermarkEl = null\n\tstate.canvas = null\n}\n\n/**\n * Set up protection against removal\n */\nfunction setupProtection(el: HTMLElement, state: WatermarkState): void {\n\tif (typeof MutationObserver === 'undefined') return\n\n\tstate.observer = new MutationObserver(mutations => {\n\t\t// Check if watermark was removed\n\t\tif (!state.watermarkEl || !el.contains(state.watermarkEl)) {\n\t\t\t// Re-add watermark\n\t\t\tif (!state.options.disabled) {\n\t\t\t\tstate.canvas = createWatermarkCanvas(state.options)\n\t\t\t\tstate.watermarkEl = createWatermarkElement(state.canvas, state.options)\n\t\t\t\tel.appendChild(state.watermarkEl)\n\t\t\t}\n\t\t}\n\n\t\t// Check if watermark styles were modified\n\t\tfor (const mutation of mutations) {\n\t\t\tif (mutation.type === 'attributes' && mutation.target === state.watermarkEl) {\n\t\t\t\t// Restore styles\n\t\t\t\tconst gap = Array.isArray(state.options.gap) ? state.options.gap : [state.options.gap || 100, state.options.gap || 100]\n\n\t\t\t\tstate.watermarkEl.style.display = 'block'\n\t\t\t\tstate.watermarkEl.style.visibility = 'visible'\n\t\t\t\tstate.watermarkEl.style.opacity = '1'\n\t\t\t\tif (state.canvas) {\n\t\t\t\t\tstate.watermarkEl.style.backgroundImage = `url(\"${state.canvas.toDataURL()}\")`\n\t\t\t\t}\n\t\t\t\tstate.watermarkEl.style.backgroundSize = `${state.canvas!.width + gap[0]}px ${state.canvas!.height + gap[1]}px`\n\t\t\t}\n\t\t}\n\t})\n\n\tstate.observer.observe(el, {\n\t\tchildList: true,\n\t\tsubtree: true,\n\t\tattributes: true,\n\t\tattributeFilter: ['style', 'class', 'hidden'],\n\t})\n}\n\nexport default vWatermark\n"],
5
- "mappings": "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",
6
- "names": ["normalizeOptions", "normalizeOptions", "normalizeOptions", "cleanup", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "animate", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "escapeRegex", "normalizeBinding", "STATE_KEY", "normalizeOptions", "clamp", "animate", "normalizeOptions", "normalizeOptions", "scrollTop", "scrollHeight", "clientHeight", "STATE_KEY", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "getDistance", "normalizeOptions", "normalizeOptions", "cleanup", "STATE_KEY", "normalizeOptions", "formatNumber", "cleanup", "normalizeOptions", "cleanup", "formatNumber", "normalizeOptions", "normalizeOptions", "getScrollParent", "STATE_KEY", "normalizeOptions", "getState", "normalizeOptions", "getDistance", "handleStart", "handleMove", "handleEnd", "normalizeOptions", "normalizeOptions", "normalizeOptions", "setState", "bindEvents", "normalizeOptions", "cleanup", "normalizeOptions", "normalizeOptions", "getCenter", "handleStart", "handleMove", "handleEnd", "normalizeOptions", "isAllowed", "content", "normalizeOptions", "defaultOptions", "normalizeOptions", "ensureStyles", "STATE_KEY", "normalizeOptions", "normalizeOptions", "setupState", "bindEvents", "unbindEvents", "normalizeOptions", "normalizeOptions", "getDistance", "getAngle", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "ensureStyles", "transformText", "normalizeOptions", "cleanup", "normalizeOptions", "startIndex", "endIndex", "offsetY", "normalizeOptions", "normalizeOptions"]
4
+ "sourcesContent": ["import type { DirectiveOptions } from '../../types'\nimport { defineNuxtPlugin, useRuntimeConfig } from '#app'\nimport * as directives from '../../directives'\n\nexport default defineNuxtPlugin(nuxtApp => {\n\tconst config = useRuntimeConfig()\n\tconst directiveNames = (config.public as any).directix?.directiveNames || []\n\tconst directiveOptions = (config.public as any).directix?.directiveOptions || {}\n\n\t// Register all enabled directives\n\tfor (const name of directiveNames) {\n\t\tconst directive = (directives as Record<string, any>)[name]\n\t\tif (directive) {\n\t\t\t// Convert v-directive-name to directive-name\n\t\t\tconst directiveName = name.slice(1)\n\t\t\tnuxtApp.vueApp.directive(directiveName, directive)\n\n\t\t\t// Apply options if provided\n\t\t\tconst options = directiveOptions[name] as DirectiveOptions | undefined\n\t\t\tif (options?.config) {\n\t\t\t\t// Some directives have configure functions\n\t\t\t\tconst configureKey = `configure${name.charAt(1).toUpperCase() + name.slice(2).replace(/-([a-z])/g, (_: string, c: string) => c.toUpperCase())}`\n\t\t\t\tif (typeof (directives as Record<string, any>)[configureKey] === 'function') {\n\t\t\t\t\t(directives as Record<string, any>)[configureKey](options.config)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n})\n", "export { default as blur, vBlur } from './blur'\nexport type { BlurBinding, BlurOptions } from './blur'\n\nexport { default as capitalcase, vCapitalcase } from './capitalcase'\nexport type { CapitalcaseBinding, CapitalcaseOptions } from './capitalcase'\n\nexport { default as clickDelay, vClickDelay } from './click-delay'\nexport type { ClickDelayBinding, ClickDelayHandler, ClickDelayOptions } from './click-delay'\n\n// Event directives\nexport { default as clickOutside, vClickOutside } from './click-outside'\nexport type { ClickOutsideBinding, ClickOutsideHandler, ClickOutsideOptions } from './click-outside'\n\nexport { default as clickWave, vClickWave } from './click-wave'\nexport type { ClickWaveBinding, ClickWaveOptions } from './click-wave'\n\nexport { default as contextMenu, vContextMenu } from './context-menu'\nexport type { ContextMenuBinding, ContextMenuItem, ContextMenuOptions } from './context-menu'\n\nexport { default as copy, vCopy } from './copy'\nexport type { CopyBinding, CopyErrorCallback, CopyOptions, CopySuccessCallback } from './copy'\n\nexport { default as countdown, vCountdown } from './countdown'\nexport type {\n\tCountdownBinding,\n\tCountdownCompleteCallback,\n\tCountdownFormatFunction,\n\tCountdownOptions,\n\tCountdownTickCallback,\n\tCountdownTime,\n} from './countdown'\n\nexport { default as counter, vCounter } from './counter'\nexport type { CounterBinding, CounterEasing, CounterOptions } from './counter'\n\nexport { default as debounce, vDebounce } from './debounce'\nexport type { DebounceBinding, DebouncedFunction, DebounceOptions } from './debounce'\n\nexport { default as draggable, vDraggable } from './draggable'\nexport type { DraggableAxis, DraggableBinding, DraggableOptions } from './draggable'\n\nexport { default as ellipsis, vEllipsis } from './ellipsis'\nexport type { EllipsisBinding, EllipsisOptions } from './ellipsis'\n\nexport { default as emoji, vEmoji } from './emoji'\nexport type { EmojiBinding, EmojiOptions } from './emoji'\n\nexport { default as exportDirective, vExport } from './export'\nexport type { ExportBinding, ExportFormat, ExportOptions } from './export'\n\nexport { default as fade, vFade } from './fade'\nexport type { FadeBinding, FadeDirection, FadeOptions } from './fade'\n\nexport { default as focus, vFocus } from './focus'\nexport type { FocusBinding, FocusOptions } from './focus'\n\nexport { default as fullscreen, vFullscreen } from './fullscreen'\nexport type { FullscreenBinding, FullscreenOptions } from './fullscreen'\n\nexport { default as highlight, vHighlight } from './highlight'\nexport type { HighlightBinding, HighlightOptions } from './highlight'\n\nexport { default as hotkey, vHotkey } from './hotkey'\nexport type { HotkeyBinding, HotkeyDefinition, HotkeyHandler, ModifierKey } from './hotkey'\n\nexport { default as hover, vHover } from './hover'\nexport type { HoverBinding, HoverHandler, HoverOptions } from './hover'\n\nexport { default as imagePreview, vImagePreview } from './image-preview'\nexport type { ImagePreviewBinding, ImagePreviewOptions } from './image-preview'\n\nexport { default as infiniteScroll, vInfiniteScroll } from './infinite-scroll'\nexport type { InfiniteScrollBinding, InfiniteScrollHandler, InfiniteScrollOptions } from './infinite-scroll'\n\nexport { default as intersect, vIntersect } from './intersect'\nexport type { IntersectBinding, IntersectHandler, IntersectOptions } from './intersect'\n\n// Visibility directives\nexport { default as lazy, vLazy } from './lazy'\nexport type { LazyBinding, LazyOptions, LazyState } from './lazy'\n\nexport { default as loading, vLoading } from './loading'\nexport type { LoadingBinding, LoadingOptions } from './loading'\n\n// Event interaction directives\nexport { default as longPress, vLongPress } from './long-press'\nexport type { LongPressBinding, LongPressHandler, LongPressOptions } from './long-press'\n\nexport { default as lottie, vLottie } from './lottie'\nexport type { LottieAnimationState, LottieBinding, LottieOptions } from './lottie'\n\nexport { default as lowercase, vLowercase } from './lowercase'\nexport type { LowercaseBinding, LowercaseOptions } from './lowercase'\n\n// Form directives\nexport { default as mask, vMask } from './mask'\nexport type { MaskBinding, MaskOptions } from './mask'\n\nexport { default as money, vMoney } from './money'\nexport type { MoneyBinding, MoneyOptions } from './money'\n\nexport { default as mutation, vMutation } from './mutation'\nexport type { MutationBinding, MutationHandler, MutationOptions } from './mutation'\n\nexport { default as number, vNumber } from './number'\nexport type { NumberBinding, NumberOptions } from './number'\n\n// Gesture directives\nexport { default as pan, vPan } from './pan'\nexport type { PanBinding, PanEvent, PanOptions } from './pan'\n\nexport { default as parallax, vParallax } from './parallax'\nexport type { ParallaxBinding, ParallaxOptions } from './parallax'\n\n// Security directives\nexport { configurePermission, getPermissionConfig, default as permission, vPermission } from './permission'\nexport type { PermissionAction, PermissionBinding, PermissionConfig, PermissionOptions } from './permission'\n\nexport { default as pinch, vPinch } from './pinch'\nexport type { PinchBinding, PinchEvent, PinchOptions } from './pinch'\n\nexport { default as print, vPrint } from './print'\nexport type { PrintBeforeCallback, PrintBinding, PrintCompleteCallback, PrintOptions } from './print'\n\nexport { default as progress, vProgress } from './progress'\nexport type { ProgressBinding, ProgressOptions, ProgressPosition } from './progress'\n\nexport { default as pullRefresh, vPullRefresh } from './pull-refresh'\nexport type {\n\tPullRefreshBinding,\n\tPullRefreshHandler,\n\tPullRefreshOptions,\n\tPullRefreshState,\n} from './pull-refresh'\n\n// Observer directives\nexport { default as resize, vResize } from './resize'\nexport type { ResizeBinding, ResizeHandler, ResizeInfo, ResizeOptions } from './resize'\n\nexport { default as ripple, vRipple } from './ripple'\nexport type { RippleBinding, RippleOptions } from './ripple'\n\nexport { default as rotateGesture, vRotateGesture } from './rotate-gesture'\nexport type { RotateGestureBinding, RotateGestureEvent, RotateGestureOptions } from './rotate-gesture'\n\nexport { default as sanitize, vSanitize } from './sanitize'\nexport type { SanitizeBinding, SanitizeHandler, SanitizeOptions } from './sanitize'\n\n// Scroll directives\nexport { default as scroll, vScroll } from './scroll'\nexport type { ScrollBinding, ScrollHandler, ScrollInfo, ScrollOptions } from './scroll'\n\nexport { default as skeleton, vSkeleton } from './skeleton'\nexport type { SkeletonAnimation, SkeletonBinding, SkeletonOptions } from './skeleton'\n\nexport { default as sticky, vSticky } from './sticky'\nexport type { StickyBinding, StickyOptions } from './sticky'\n\nexport { default as swipe, vSwipe } from './swipe'\nexport type { SwipeBinding, SwipeDirection, SwipeHandler, SwipeOptions } from './swipe'\n\nexport { default as throttle, vThrottle } from './throttle'\nexport type { ThrottleBinding, ThrottledFunction, ThrottleOptions } from './throttle'\n\n// UI directives\nexport { default as tooltip, vTooltip } from './tooltip'\nexport type { TooltipBinding, TooltipOptions, TooltipPlacement, TooltipTrigger } from './tooltip'\n\nexport { default as touch, vTouch } from './touch'\nexport type { TouchOptions } from './touch'\n\nexport { default as trim, vTrim } from './trim'\nexport type { TrimBinding, TrimOptions, TrimPosition } from './trim'\n\n// Format directives\nexport { default as truncate, vTruncate } from './truncate'\nexport type { TruncateBinding, TruncateOptions, TruncatePosition } from './truncate'\n\nexport { default as typewriter, vTypewriter } from './typewriter'\nexport type { TypewriterBinding, TypewriterOptions } from './typewriter'\n\nexport { default as uppercase, vUppercase } from './uppercase'\nexport type { UppercaseBinding, UppercaseOptions } from './uppercase'\n\nexport { default as virtualList, vVirtualList } from './virtual-list'\nexport type {\n\tItemSizeFunction,\n\tVirtualListBinding,\n\tVirtualListOptions,\n\tVirtualListRenderFunction,\n} from './virtual-list'\n\nexport { default as visible, vVisible } from './visible'\nexport type { VisibleBinding, VisibleHandler, VisibleOptions } from './visible'\n\nexport { vWatermark, default as watermark } from './watermark'\nexport type { WatermarkBinding, WatermarkOptions } from './watermark'\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'\nimport { markRaw, shallowReactive } from 'vue'\n\n/**\n * Element state storage (Vue 3 optimized)\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Create Vue 3 directive with optimizations\n * Uses markRaw for DOM elements and shallowReactive for state\n * @returns Vue 3 directive object\n */\nexport function createVue3Directive<T, B extends Element>(\n\thooks: DirectiveHooks<T, B>,\n): Record<string, any> {\n\treturn {\n\t\tcreated(el: B, binding: any, vnode: VNode) {\n\t\t\t// Use shallowReactive for better performance with large objects\n\t\t\t// Only use markRaw for non-null/undefined values\n\t\t\tconst state: ElementState = shallowReactive({\n\t\t\t\tvalue: binding.value != null ? markRaw(binding.value) : binding.value,\n\t\t\t\tvnode,\n\t\t\t\tcleanup: [],\n\t\t\t})\n\n\t\t\t// Store state on element\n\t\t\t;(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 hook (can be used for pre-mount setup)\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, normalizeBinding(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 hook\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\tnormalizeBinding(binding),\n\t\t\t\t\tvnode,\n\t\t\t\t\tnormalizeBinding({ ...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 != null ? markRaw(binding.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 hook\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, 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\n/**\n * Normalize Vue 3 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,\n\t}\n}\n\n/**\n * Add cleanup function to element\n */\nexport function addCleanup(el: Element, fn: () => void): void {\n\tconst state = (el as any).__directix_state__\n\n\tif (state) {\n\t\tstate.cleanup.push(fn)\n\t}\n}\n", "/**\n * Vue version type\n * - 2: Vue 2.6.x (requires @vue/composition-api for Composition API)\n * - 2.7: Vue 2.7.x (has built-in Composition API support)\n * - 3: Vue 3.x\n */\nexport type VueVersion = 2 | 2.7 | 3\n\n/**\n * Vue version detection\n */\nlet _vueVersion: VueVersion | null = null,\n\t_isVue2: boolean | null = null,\n\t_isVue27: boolean | null = null,\n\t_isVue3: boolean | null = null\n\n/**\n * Parse version string to VueVersion\n */\nfunction parseVersion(version: string): VueVersion | null {\n\tif (version.startsWith('2.7')) return 2.7\n\tif (version.startsWith('2')) return 2\n\tif (version.startsWith('3')) return 3\n\n\treturn null\n}\n\n/**\n * Get current Vue version\n */\nexport function getVueVersion(): VueVersion {\n\tif (_vueVersion !== null) return _vueVersion\n\n\t// Method 1: Check environment variable (highest priority)\n\tif (typeof process !== 'undefined') {\n\t\tconst envVersion = process.env.DIRECTIX_VUE_VERSION\n\n\t\tif (envVersion === '2.7') {\n\t\t\t_vueVersion = 2.7\n\n\t\t\treturn _vueVersion\n\t\t}\n\t\tif (envVersion === '2') {\n\t\t\t_vueVersion = 2\n\n\t\t\treturn _vueVersion\n\t\t}\n\t\tif (envVersion === '3') {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\t}\n\n\t// Method 2: Try require (CommonJS/Node.js)\n\ttry {\n\t\t// eslint-disable-next-line ts/no-require-imports\n\t\tconst vue = require('vue')\n\t\tconst version = parseVersion(vue?.version)\n\n\t\tif (version !== null) {\n\t\t\t_vueVersion = version\n\n\t\t\treturn _vueVersion\n\t\t}\n\t} catch {\n\t\t// require failed, continue to other methods\n\t}\n\n\t// Method 3: Check browser environment\n\tif (typeof window !== 'undefined') {\n\t\tconst win = window as any\n\t\tconst vue = win.Vue\n\n\t\t// Check version string\n\t\tif (vue?.version) {\n\t\t\tconst version = parseVersion(vue.version)\n\n\t\t\tif (version !== null) {\n\t\t\t\t_vueVersion = version\n\n\t\t\t\treturn _vueVersion\n\t\t\t}\n\t\t}\n\n\t\t// Check Vue 2 specific API\n\t\tif (typeof vue?.observable === 'function') {\n\t\t\t_vueVersion = 2\n\n\t\t\treturn _vueVersion\n\t\t}\n\n\t\t// Check Vue 3 specific API\n\t\tif (typeof vue?.createApp === 'function' && typeof vue?.observable !== 'function') {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\n\t\t// Check devtools hook\n\t\tconst devtools = win.__VUE_DEVTOOLS_GLOBAL_HOOK__\n\n\t\tif (devtools?.Vue?.version) {\n\t\t\tconst version = parseVersion(devtools.Vue.version)\n\n\t\t\tif (version !== null) {\n\t\t\t\t_vueVersion = version\n\n\t\t\t\treturn _vueVersion\n\t\t\t}\n\t\t}\n\t\tif (devtools?.apps?.length) {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\t}\n\n\t// Default to Vue 3 but warn\n\tif (_vueVersion === null) {\n\t\tif (typeof window !== 'undefined') {\n\t\t\tconsole.warn(\n\t\t\t\t'[Directix] Unable to detect Vue version, defaulting to Vue 3. '\n\t\t\t\t+ 'Set DIRECTIX_VUE_VERSION=2 or call setVueVersion(2) if using Vue 2.',\n\t\t\t)\n\t\t}\n\t\t_vueVersion = 3\n\t}\n\n\treturn _vueVersion\n}\n\n/**\n * Set Vue version explicitly (for cases where auto-detection fails)\n */\nexport function setVueVersion(version: VueVersion): void {\n\t_vueVersion = version\n\t_isVue2 = version === 2 || version === 2.7\n\t_isVue27 = version === 2.7\n\t_isVue3 = version === 3\n}\n\n/**\n * Reset Vue version (useful for testing)\n */\nexport function resetVueVersion(): void {\n\t_vueVersion = null\n\t_isVue2 = null\n\t_isVue27 = null\n\t_isVue3 = null\n}\n\n/**\n * Check if Vue 2 (includes 2.7)\n */\nexport function isVue2(): boolean {\n\tif (_isVue2 === null) {\n\t\tconst version = getVueVersion()\n\n\t\t_isVue2 = version === 2 || version === 2.7\n\t}\n\n\treturn _isVue2\n}\n\n/**\n * Check if Vue 2.7 (has built-in Composition API support)\n */\nexport function isVue27(): boolean {\n\tif (_isVue27 === null) {\n\t\t_isVue27 = getVueVersion() === 2.7\n\t}\n\n\treturn _isVue27\n}\n\n/**\n * Check if Vue 3\n */\nexport function isVue3(): boolean {\n\tif (_isVue3 === null) {\n\t\t_isVue3 = getVueVersion() === 3\n\t}\n\n\treturn _isVue3\n}\n\n/**\n * Check if browser environment\n */\nexport const isBrowser = (): boolean => {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\n/**\n * Check if server-side rendering\n */\nexport const isSSR = (): boolean => !isBrowser()\n\n/**\n * Check if passive event listening is supported\n */\nexport const supportsPassive = (): boolean => {\n\tif (!isBrowser()) return false\n\n\tlet supports = false\n\n\ttry {\n\t\tconst options = {\n\t\t\tget passive() {\n\t\t\t\tsupports = true\n\n\t\t\t\treturn false\n\t\t\t},\n\t\t}\n\n\t\twindow.addEventListener('test', null as any, options)\n\t\twindow.removeEventListener('test', null as any, options as any)\n\t} catch {\n\t\tsupports = false\n\t}\n\n\treturn supports\n}\n\n/**\n * Check if IntersectionObserver is supported\n */\nexport const supportsIntersectionObserver = (): boolean => {\n\treturn isBrowser() && 'IntersectionObserver' in window\n}\n\n/**\n * Check if ResizeObserver is supported\n */\nexport const supportsResizeObserver = (): boolean => {\n\treturn isBrowser() && 'ResizeObserver' in window\n}\n\n/**\n * Check if Clipboard API is supported\n */\nexport const supportsClipboard = (): boolean => {\n\treturn isBrowser() && 'clipboard' in navigator\n}\n\n/**\n * Check if MutationObserver is supported\n */\nexport const supportsMutationObserver = (): boolean => {\n\treturn isBrowser() && 'MutationObserver' in window\n}\n", "import type { Directive } from 'vue'\nimport type { DirectiveBinding, DirectiveDefinition, DirectiveHooks } from './types'\nimport { createVue2Directive } from './adapter/vue2'\nimport { createVue3Directive } from './adapter/vue3'\nimport { getVueVersion, isSSR } from './env'\n\n/**\n * Define a cross-version compatible directive\n * @param definition The directive definition\n * @returns Vue directive object\n */\nexport function defineDirective<T = any, B extends Element = Element>(\n\tdefinition: DirectiveDefinition<T, B>,\n): Directive {\n\tconst { name, version, ssr, defaults, ...hooks } = definition\n\n\t// SSR check\n\tif (isSSR() && !ssr) {\n\t\tif (typeof process !== 'undefined' && process.env?.NODE_ENV !== 'test') {\n\t\t\tconsole.warn(\n\t\t\t\t`[Directix] Directive \"${name}\" is not compatible with SSR. `\n\t\t\t\t+ 'It will be a no-op on the server side.',\n\t\t\t)\n\t\t}\n\n\t\treturn createNoOpDirective()\n\t}\n\n\t// Wrap hooks with default values\n\tconst wrappedHooks: DirectiveHooks<T, B> = {\n\t\tmounted: hooks.mounted ? (el, binding, vnode) => {\n\t\t\thooks.mounted!(el, applyDefaults(binding, defaults), vnode)\n\t\t} : undefined,\n\n\t\tupdated: hooks.updated ? (el, binding, vnode, prevBinding, prevVnode) => {\n\t\t\thooks.updated!(el, applyDefaults(binding, defaults), vnode, prevBinding, prevVnode)\n\t\t} : undefined,\n\n\t\tunmounted: hooks.unmounted,\n\t}\n\n\t// Create a lazy directive that determines version at runtime\n\treturn createLazyDirective(wrappedHooks)\n}\n\n/**\n * Create a lazy directive that determines Vue version at first use\n */\nfunction createLazyDirective<T, B extends Element>(hooks: DirectiveHooks<T, B>): Directive {\n\tlet cachedDirective: any = null\n\n\t// Unified detection entry point\n\tfunction getDirective(): any {\n\t\tif (!cachedDirective) {\n\t\t\tcachedDirective = getVueVersion() === 2 ? createVue2Directive(hooks) : createVue3Directive(hooks)\n\t\t}\n\n\t\treturn cachedDirective\n\t}\n\n\t// Hook generator to reduce code duplication\n\tfunction createHook(hookName: string) {\n\t\treturn function (el: B, binding: any, vnode: any, prevVnode?: any) {\n\t\t\tgetDirective()[hookName]?.(el, binding, vnode, prevVnode)\n\t\t}\n\t}\n\n\treturn {\n\t\t// Vue 2 hooks\n\t\tbind: createHook('bind'),\n\t\tinserted: createHook('inserted'),\n\t\tupdate: createHook('update'),\n\t\tcomponentUpdated: createHook('componentUpdated'),\n\t\tunbind: createHook('unbind'),\n\t\t// Vue 3 hooks\n\t\tcreated: createHook('created'),\n\t\tbeforeMount: createHook('beforeMount'),\n\t\tmounted: createHook('mounted'),\n\t\tbeforeUpdate: createHook('beforeUpdate'),\n\t\tupdated: createHook('updated'),\n\t\tbeforeUnmount: createHook('beforeUnmount'),\n\t\tunmounted: createHook('unmounted'),\n\t} as Directive\n}\n\n/**\n * Apply default values to binding\n */\nfunction applyDefaults<T>(\n\tbinding: DirectiveBinding<T>,\n\tdefaults?: Partial<T>,\n): DirectiveBinding<T> {\n\tif (!defaults) return binding\n\n\tconst value\n\t\t= typeof binding.value === 'object' && binding.value !== null ? { ...defaults, ...binding.value } : binding.value\n\n\treturn { ...binding, value: value as T }\n}\n\n/**\n * Create a no-op directive (for SSR)\n */\nfunction createNoOpDirective(): Directive {\n\treturn {\n\t\tmounted: () => {},\n\t\tupdated: () => {},\n\t\tunmounted: () => {},\n\t}\n}\n\n/**\n * Define a directive group\n */\nexport function defineDirectiveGroup(\n\tname: string,\n\tdirectives: Record<string, any>,\n): { name: string, directives: Record<string, any>, install: (app: any) => void } {\n\treturn {\n\t\tname,\n\t\tdirectives,\n\t\tinstall(app: any, _options?: any) {\n\t\t\tObject.entries(directives).forEach(([directiveName, directive]) => {\n\t\t\t\tconst fullName = `${name}-${directiveName}`\n\n\t\t\t\tapp.directive(fullName, directive)\n\t\t\t})\n\t\t},\n\t}\n}\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Blur directive options\n */\nexport interface BlurOptions {\n\t/**\n\t * Blur radius in pixels\n\t * @default 5\n\t */\n\tradius?: number\n\n\t/**\n\t * Whether to show blur effect\n\t * @default true\n\t */\n\tvisible?: boolean\n\n\t/**\n\t * Transition duration in milliseconds\n\t * @default 300\n\t */\n\tduration?: number\n\n\t/**\n\t * Overlay color\n\t * @default 'transparent'\n\t */\n\toverlayColor?: string\n\n\t/**\n\t * Z-index for the blur overlay\n\t * @default 999\n\t */\n\tzIndex?: number\n\n\t/**\n\t * Whether to lock scroll when blur is active\n\t * @default false\n\t */\n\tlockScroll?: boolean\n\n\t/**\n\t * Custom class for blur container\n\t */\n\tclass?: string\n\n\t/**\n\t * Callback when blur is shown\n\t */\n\tonShow?: () => void\n\n\t/**\n\t * Callback when blur is hidden\n\t */\n\tonHide?: () => void\n}\n\n/**\n * Directive binding value type\n */\nexport type BlurBinding = boolean | number | BlurOptions\n\n/**\n * Element state storage\n */\ninterface BlurState {\n\toptions: BlurOptions\n\tblurContainer: HTMLDivElement | null\n\toriginalOverflow: string\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: BlurBinding | undefined): BlurOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn {\n\t\t\tvisible: binding,\n\t\t\tradius: 5,\n\t\t\tduration: 300,\n\t\t\toverlayColor: 'transparent',\n\t\t\tzIndex: 999,\n\t\t\tlockScroll: false,\n\t\t}\n\t}\n\n\tif (typeof binding === 'number') {\n\t\treturn {\n\t\t\tvisible: true,\n\t\t\tradius: binding,\n\t\t\tduration: 300,\n\t\t\toverlayColor: 'transparent',\n\t\t\tzIndex: 999,\n\t\t\tlockScroll: false,\n\t\t}\n\t}\n\n\treturn {\n\t\tradius: 5,\n\t\tvisible: true,\n\t\tduration: 300,\n\t\toverlayColor: 'transparent',\n\t\tzIndex: 999,\n\t\tlockScroll: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Create blur overlay element\n */\nfunction createBlurOverlay(options: BlurOptions): HTMLDivElement {\n\tconst overlay = document.createElement('div')\n\toverlay.className = `v-blur-overlay ${options.class || ''}`\n\n\toverlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n backdrop-filter: blur(${options.radius}px);\n -webkit-backdrop-filter: blur(${options.radius}px);\n background: ${options.overlayColor || 'transparent'};\n z-index: ${options.zIndex};\n opacity: 0;\n transition: opacity ${options.duration}ms ease;\n pointer-events: auto;\n border-radius: inherit;\n `\n\n\treturn overlay\n}\n\n/**\n * v-blur directive\n * Background blur overlay effect\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple blur -->\n * <div v-blur=\"isBlurred\">Content behind blur</div>\n *\n * <!-- With radius -->\n * <div v-blur=\"15\">Blur with 15px radius</div>\n *\n * <!-- With options -->\n * <div v-blur=\"{\n * visible: isBlurred,\n * radius: 20,\n * overlayColor: 'rgba(255, 255, 255, 0.3)',\n * lockScroll: true\n * }\">\n * Content\n * </div>\n * </template>\n * ```\n */\nexport const vBlur = defineDirective<BlurBinding, HTMLElement>({\n\tname: 'blur',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: BlurState = {\n\t\t\toptions,\n\t\t\tblurContainer: null,\n\t\t\toriginalOverflow: '',\n\t\t}\n\n\t\t;(el as any).__blur = state\n\n\t\tif (options.visible) {\n\t\t\tshowBlur(el, state)\n\t\t}\n\n\t\tel.classList.add('v-blur')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: BlurState = (el as any).__blur\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst wasVisible = state.options.visible\n\n\t\tstate.options = newOptions\n\n\t\tif (newOptions.visible && !wasVisible) {\n\t\t\tshowBlur(el, state)\n\t\t} else if (!newOptions.visible && wasVisible) {\n\t\t\thideBlur(el, state)\n\t\t} else if (newOptions.visible && wasVisible) {\n\t\t\t// Update blur effect\n\t\t\tif (state.blurContainer) {\n\t\t\t\tstate.blurContainer.style.backdropFilter = `blur(${newOptions.radius}px)`\n\t\t\t\t;(state.blurContainer.style as any).webkitBackdropFilter = `blur(${newOptions.radius}px)`\n\t\t\t\tstate.blurContainer.style.background = newOptions.overlayColor || 'rgba(0, 0, 0, 0.5)'\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: BlurState = (el as any).__blur\n\n\t\tif (!state) return\n\n\t\thideBlur(el, state)\n\t\tel.classList.remove('v-blur')\n\n\t\tdelete (el as any).__blur\n\t},\n})\n\n/**\n * Show blur effect\n */\nfunction showBlur(el: HTMLElement, state: BlurState): void {\n\tconst options = state.options\n\n\t// Ensure element has position for absolute overlay\n\tconst computedStyle = window.getComputedStyle(el)\n\tif (computedStyle.position === 'static') {\n\t\tel.style.position = 'relative'\n\t}\n\n\t// Create blur overlay\n\tstate.blurContainer = createBlurOverlay(options)\n\n\t// Insert overlay inside the element\n\tel.appendChild(state.blurContainer)\n\n\t// Trigger reflow for transition\n\tString(state.blurContainer.offsetHeight)\n\n\t// Fade in\n\tstate.blurContainer.style.opacity = '1'\n\n\t// Lock scroll\n\tif (options.lockScroll) {\n\t\tstate.originalOverflow = document.body.style.overflow\n\t\tdocument.body.style.overflow = 'hidden'\n\t}\n\n\toptions.onShow?.()\n}\n\n/**\n * Hide blur effect\n */\nfunction hideBlur(_el: HTMLElement, state: BlurState): void {\n\tif (!state.blurContainer) return\n\n\tconst options = state.options\n\n\t// Fade out\n\tstate.blurContainer.style.opacity = '0'\n\n\t// Restore scroll\n\tif (options.lockScroll) {\n\t\tdocument.body.style.overflow = state.originalOverflow\n\t}\n\n\t// Remove after transition\n\tsetTimeout(() => {\n\t\tif (state.blurContainer && state.blurContainer.parentNode) {\n\t\t\tstate.blurContainer.parentNode.removeChild(state.blurContainer)\n\t\t}\n\t\tstate.blurContainer = null\n\t}, options.duration)\n\n\toptions.onHide?.()\n}\n\nexport default vBlur\n", "/**\n * Directive state management utilities\n * Layer: Shared (no Vue dependency)\n *\n * These are low-level utilities for storing state on DOM elements.\n * For higher-level directive utilities, see src/utils/directive.ts\n */\n\n/**\n * State key prefix for storing directive state on elements\n */\nconst STATE_PREFIX = '__directix_'\n\n/**\n * Set directive state on element\n * @param el - Target element\n * @param key - Directive name/key\n * @param state - State to store\n */\nexport function setState<E extends Element, T>(el: E, key: string, state: T): void {\n\t;(el as any)[STATE_PREFIX + key] = state\n}\n\n/**\n * Get directive state from element\n * @param el - Target element\n * @param key - Directive name/key\n * @returns Stored state or undefined\n */\nexport function getState<E extends Element, T>(el: E, key: string): T | undefined {\n\treturn (el as any)[STATE_PREFIX + key]\n}\n\n/**\n * Delete directive state from element\n * @param el - Target element\n * @param key - Directive name/key\n */\nexport function deleteState<E extends Element>(el: E, key: string): void {\n\tdelete (el as any)[STATE_PREFIX + key]\n}\n\n/**\n * Check if element has directive state\n * @param el - Target element\n * @param key - Directive name/key\n */\nexport function hasState<E extends Element>(el: E, key: string): boolean {\n\treturn STATE_PREFIX + key in (el as any)\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\t&& rect.left >= 0\n\t\t&& rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n\t\t&& rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t)\n}\n\n/**\n * Get nearest scrollable parent element\n */\nexport function getScrollParent(el: Element): Element | Window {\n\tif (!isBrowser()) return window\n\n\tlet parent: Element | null = el.parentElement\n\n\twhile (parent) {\n\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent)\n\n\t\tif (/(auto|scroll)/.test(overflow + overflowX + overflowY)) {\n\t\t\treturn parent\n\t\t}\n\n\t\tparent = parent.parentElement\n\t}\n\n\treturn window\n}\n\n/**\n * Check if element matches selector\n */\nexport function matches(el: Element, selector: string): boolean {\n\treturn el.matches(selector)\n}\n\n/**\n * Get nearest ancestor matching selector\n */\nexport function closest(el: Element, selector: string): Element | null {\n\treturn el.closest(selector)\n}\n\n/**\n * Check if element is an input or textarea\n */\nexport function isInputElement(el: Element): el is HTMLInputElement | HTMLTextAreaElement {\n\treturn el.tagName === 'INPUT' || el.tagName === 'TEXTAREA'\n}\n\n/**\n * Ensure element has specified position (set to relative if static)\n * @param el - Target element\n * @param position - Desired position value\n */\nexport function ensurePosition(el: HTMLElement, position: 'relative' | 'absolute' = 'relative'): void {\n\tif (!isBrowser()) return\n\tif (getComputedStyle(el).position === 'static') {\n\t\tel.style.position = position\n\t}\n}\n\n/**\n * Ensure element has overflow hidden (to contain child elements like ripple)\n * @param el - Target element\n */\nexport function ensureOverflowHidden(el: HTMLElement): void {\n\tif (!isBrowser()) return\n\tif (getComputedStyle(el).overflow === 'visible') {\n\t\tel.style.overflow = 'hidden'\n\t}\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/**\n * Event handlers map for batch binding\n */\nexport type EventHandlerMap = Record<string, (event: Event) => void>\n\n/**\n * Bind multiple events to a target\n * @param target - Event target\n * @param events - Map of event names to handlers\n * @param options - Event options\n * @returns Cleanup function to unbind all events\n *\n * @example\n * ```ts\n * const cleanup = bindEvents(el, {\n * touchstart: handleStart,\n * touchmove: handleMove,\n * touchend: handleEnd,\n * })\n *\n * // Later, clean up\n * cleanup()\n * ```\n */\nexport function bindEvents(\n\ttarget: EventTarget,\n\tevents: EventHandlerMap,\n\toptions: boolean | EventOptions = false,\n): () => void {\n\tObject.entries(events).forEach(([event, handler]) => {\n\t\ttarget.addEventListener(event, handler, typeof options === 'boolean' ? options : normalizeOptionsObject(options))\n\t})\n\n\treturn () => {\n\t\tObject.entries(events).forEach(([event, handler]) => {\n\t\t\ttarget.removeEventListener(event, handler, typeof options === 'boolean' ? options : normalizeOptionsObject(options))\n\t\t})\n\t}\n}\n\n/**\n * Normalize event options (internal use for bindEvents)\n */\nfunction normalizeOptionsObject(options: EventOptions): boolean | { capture: boolean, passive: boolean, once: boolean } {\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 a keyboard event matcher\n * @param key - Key to match\n * @param modifiers - Required modifiers\n * @returns Matcher function\n */\nexport function createKeyMatcher(\n\tkey: string,\n\tmodifiers?: { ctrl?: boolean, alt?: boolean, shift?: boolean, meta?: boolean },\n): (event: KeyboardEvent) => boolean {\n\tconst normalizedKey = key.toLowerCase()\n\n\treturn (event: KeyboardEvent): boolean => {\n\t\tif (event.key.toLowerCase() !== normalizedKey) return false\n\n\t\tif (modifiers) {\n\t\t\tif (modifiers.ctrl && !event.ctrlKey) return false\n\t\t\tif (modifiers.alt && !event.altKey) return false\n\t\t\tif (modifiers.shift && !event.shiftKey) return false\n\t\t\tif (modifiers.meta && !event.metaKey) return false\n\n\t\t\t// Check that no extra modifiers are pressed\n\t\t\tif (!modifiers.ctrl && event.ctrlKey) return false\n\t\t\tif (!modifiers.alt && event.altKey) return false\n\t\t\tif (!modifiers.shift && event.shiftKey) return false\n\t\t\tif (!modifiers.meta && event.metaKey) return false\n\t\t}\n\n\t\treturn true\n\t}\n}\n", "/**\n * Event type modifiers for directives like v-debounce, v-throttle\n */\n\n/**\n * Supported event type modifiers list\n */\nexport const EVENT_MODIFIERS = [\n\t'click',\n\t'input',\n\t'change',\n\t'submit',\n\t'scroll',\n\t'resize',\n\t'mouseenter',\n\t'mouseleave',\n\t'mousemove',\n\t'mousedown',\n\t'mouseup',\n\t'keydown',\n\t'keyup',\n\t'focus',\n\t'blur',\n\t'touchstart',\n\t'touchmove',\n\t'touchend',\n] as const\n\nexport type EventModifier = (typeof EVENT_MODIFIERS)[number]\n\n/**\n * Extract event type from directive modifiers\n * @param modifiers - Directive modifiers object\n * @returns Event type if found, null otherwise\n *\n * @example\n * ```ts\n * // v-debounce.click=\"handler\" -> 'click'\n * // v-debounce.scroll=\"handler\" -> 'scroll'\n * getEventTypeFromModifiers({ click: true }) // 'click'\n * ```\n */\nexport function getEventTypeFromModifiers(modifiers: Record<string, boolean>): string | null {\n\tfor (const modifier of EVENT_MODIFIERS) {\n\t\tif (modifiers[modifier]) {\n\t\t\treturn modifier\n\t\t}\n\t}\n\n\treturn null\n}\n\n/**\n * Get default event type for element\n * @param el - Target element\n * @returns Default event type based on element tag\n */\nexport function getDefaultEventType(el: HTMLElement): string {\n\tconst tagName = el.tagName.toLowerCase()\n\n\tif (tagName === 'input' || tagName === 'textarea') {\n\t\treturn 'input'\n\t}\n\n\treturn 'click'\n}\n", "/**\n * Check if value is a string\n */\nexport function isString(value: unknown): value is string {\n\treturn typeof value === 'string'\n}\n\n/**\n * Check if value is a number\n */\nexport function isNumber(value: unknown): value is number {\n\treturn typeof value === 'number' && !isNaN(value)\n}\n\n/**\n * Check if value is a boolean\n */\nexport function isBoolean(value: unknown): value is boolean {\n\treturn typeof value === 'boolean'\n}\n\n/**\n * Check if value is a function\n */\nexport function isFunction(value: unknown): value is (...args: any[]) => any {\n\treturn typeof value === 'function'\n}\n\n/**\n * Check if value is an object\n */\nexport function isObject(value: unknown): value is Record<string, any> {\n\treturn typeof value === 'object' && value !== null\n}\n\n/**\n * Check if value is an array\n */\nexport function isArray(value: unknown): value is any[] {\n\treturn Array.isArray(value)\n}\n\n/**\n * Check if value is empty\n */\nexport function isEmpty(value: unknown): boolean {\n\tif (value === null || value === undefined) return true\n\tif (isString(value) || isArray(value)) return value.length === 0\n\tif (isObject(value)) return Object.keys(value).length === 0\n\n\treturn false\n}\n\n/**\n * Check if value is a Promise\n */\nexport function isPromise<T = any>(value: unknown): value is Promise<T> {\n\treturn isObject(value) && isFunction((value as any).then)\n}\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n\tif (obj === null || typeof obj !== 'object') {\n\t\treturn obj\n\t}\n\n\tif (Array.isArray(obj)) {\n\t\treturn obj.map(item => deepClone(item)) as unknown as T\n\t}\n\n\tconst cloned = {} as T\n\n\tfor (const key in obj) {\n\t\tif (Object.prototype.hasOwnProperty.call(obj, key)) {\n\t\t\tcloned[key] = deepClone(obj[key])\n\t\t}\n\t}\n\n\treturn cloned\n}\n\n/**\n * Deep merge objects\n */\nexport function deepMerge<T extends Record<string, any>>(\n\ttarget: T,\n\t...sources: Partial<T>[]\n): T {\n\tif (!sources.length) return target\n\n\tconst source = sources.shift()\n\n\tif (isObject(target) && isObject(source)) {\n\t\tfor (const key in source) {\n\t\t\tif (isObject(source[key])) {\n\t\t\t\tif (!target[key]) {\n\t\t\t\t\tObject.assign(target, { [key]: {} })\n\t\t\t\t}\n\t\t\t\tdeepMerge(\n\t\t\t\t\ttarget[key] as Record<string, any>,\n\t\t\t\t\tsource[key] as Record<string, any>,\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tObject.assign(target, { [key]: source[key] })\n\t\t\t}\n\t\t}\n\t}\n\n\treturn deepMerge(target, ...sources)\n}\n\n/**\n * Get nested property value by path\n */\nexport function get<T = any>(\n\tobj: Record<string, any>,\n\tpath: string,\n\tdefaultValue?: T,\n): T {\n\tconst keys = path.split('.')\n\tlet result: any = obj\n\n\tfor (const key of keys) {\n\t\tif (result === null || result === undefined) {\n\t\t\treturn defaultValue as T\n\t\t}\n\t\tresult = result[key]\n\t}\n\n\treturn (result === undefined ? defaultValue : result) as T\n}\n\n/**\n * Set nested property value by path\n */\nexport function set(obj: Record<string, any>, path: string, value: any): void {\n\tconst keys = path.split('.')\n\tconst lastKey = keys.pop()!\n\tlet current = obj\n\n\tfor (const key of keys) {\n\t\tif (current[key] === undefined) {\n\t\t\tcurrent[key] = {}\n\t\t}\n\t\tcurrent = current[key]\n\t}\n\n\tcurrent[lastKey] = value\n}\n\n/**\n * Debounce function\n */\nexport function debounce<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number = 300,\n\toptions: { leading?: boolean, trailing?: boolean } = {},\n): ((...args: Parameters<T>) => void) & { cancel: () => void, flush: () => void } {\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null\n\n\tconst { leading = false, trailing = true } = options\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\tfunc.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst debounced = function (this: any, ...args: Parameters<T>): void {\n\t\tlastArgs = args\n\t\t// eslint-disable-next-line ts/no-this-alias\n\t\tlastThis = this\n\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t}\n\n\t\tif (leading && !timerId) {\n\t\t\tinvokeFunc()\n\t\t}\n\n\t\ttimerId = setTimeout(() => {\n\t\t\tif (trailing) {\n\t\t\t\tinvokeFunc()\n\t\t\t}\n\t\t\ttimerId = null\n\t\t}, wait)\n\t} as ((...args: Parameters<T>) => void) & { cancel: () => void, flush: () => void }\n\n\tdebounced.cancel = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tlastArgs = null\n\t\tlastThis = null\n\t}\n\n\tdebounced.flush = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\tinvokeFunc()\n\t\t\ttimerId = null\n\t\t}\n\t}\n\n\treturn debounced\n}\n\n/**\n * Throttle function\n */\nexport function throttle<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number = 300,\n\toptions: { leading?: boolean, trailing?: boolean } = {},\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null,\n\t\tlastCallTime = 0\n\n\tconst { leading = true, trailing = true } = options\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\tfunc.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst throttled = function (this: any, ...args: Parameters<T>): void {\n\t\tconst now = Date.now()\n\n\t\tif (!lastCallTime && !leading) {\n\t\t\tlastCallTime = now\n\t\t}\n\n\t\tconst remaining = wait - (now - lastCallTime)\n\n\t\tlastArgs = args\n\t\t// eslint-disable-next-line ts/no-this-alias\n\t\tlastThis = this\n\n\t\tif (remaining <= 0 || remaining > wait) {\n\t\t\tif (timerId) {\n\t\t\t\tclearTimeout(timerId)\n\t\t\t\ttimerId = null\n\t\t\t}\n\t\t\tlastCallTime = now\n\t\t\tinvokeFunc()\n\t\t} else if (!timerId && trailing) {\n\t\t\ttimerId = setTimeout(() => {\n\t\t\t\tlastCallTime = leading ? Date.now() : 0\n\t\t\t\ttimerId = null\n\t\t\t\tinvokeFunc()\n\t\t\t}, remaining)\n\t\t}\n\t} as ((...args: Parameters<T>) => void) & { cancel: () => void }\n\n\tthrottled.cancel = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tlastCallTime = 0\n\t\tlastArgs = null\n\t\tlastThis = null\n\t}\n\n\treturn throttled\n}\n\n/**\n * Parse time argument\n * Supports formats: \"300\" | \"300ms\" | \"1s\"\n */\nexport function parseTime(arg?: string): number | null {\n\tif (!arg) return null\n\n\tif (arg.endsWith('ms')) {\n\t\treturn parseInt(arg, 10)\n\t}\n\n\tif (arg.endsWith('s')) {\n\t\treturn parseFloat(arg) * 1000\n\t}\n\n\tconst num = parseInt(arg, 10)\n\n\treturn isNaN(num) ? null : num\n}\n\n/**\n * Generate unique ID\n */\nexport function generateId(prefix: string = ''): string {\n\treturn `${prefix}${Date.now().toString(36)}${Math.random().toString(36).slice(2, 9)}`\n}\n\n/**\n * Calculate distance between two points\n */\nexport function getDistance(\n\tp1: { x: number, y: number },\n\tp2: { x: number, y: number },\n): number {\n\treturn Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2)\n}\n\n/**\n * Clamp value within min/max bounds\n */\nexport function clamp(value: number, min?: number, max?: number): number {\n\tlet result = value\n\tif (min !== undefined) result = Math.max(min, result)\n\tif (max !== undefined) result = Math.min(max, result)\n\treturn result\n}\n\n/**\n * Escape special regex characters in a string\n */\nexport function escapeRegex(str: string): string {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n", "/**\n * Shared utilities for text transformation directives\n * (uppercase, lowercase, capitalcase, trim)\n */\n\nimport { isInputElement } from '@directix/shared'\n\n// Re-export isInputElement for convenience\nexport { isInputElement }\n\n/**\n * Base options for text transform directives\n */\nexport interface TextTransformOptions {\n\t/**\n\t * Whether to transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Setup an input element with text transformation\n * Returns cleanup function\n */\nexport function setupTextTransformInput(\n\tel: HTMLInputElement | HTMLTextAreaElement,\n\toptions: TextTransformOptions,\n\ttransformFn: (text: string) => string,\n): () => void {\n\tif (!options.onInput) {\n\t\treturn () => {}\n\t}\n\n\tconst handler = (): void => {\n\t\tconst start = el.selectionStart\n\t\tconst end = el.selectionEnd\n\t\tconst originalValue = el.value\n\t\tconst transformed = transformFn(originalValue)\n\n\t\tif (originalValue !== transformed) {\n\t\t\tel.value = transformed\n\t\t\t// Restore cursor position\n\t\t\tif (start !== null && end !== null) {\n\t\t\t\tel.setSelectionRange(start, end)\n\t\t\t}\n\t\t\t// Trigger input event for v-model\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t}\n\t}\n\n\tel.addEventListener('input', handler)\n\n\t// Initial transform\n\tel.value = transformFn(el.value)\n\n\treturn () => {\n\t\tel.removeEventListener('input', handler)\n\t}\n}\n\n/**\n * Transform text content of a non-input element\n */\nexport function transformTextContent(el: HTMLElement, transformFn: (text: string) => string): void {\n\tconst text = el.textContent || ''\n\n\tel.textContent = transformFn(text)\n}\n", "import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Capitalcase directive options\n */\nexport interface CapitalcaseOptions {\n\t/**\n\t * Whether to capitalize each word or just the first word\n\t * @default true\n\t */\n\tevery?: boolean\n\n\t/**\n\t * Words to keep lowercase (articles, prepositions, etc.)\n\t * @default ['a', 'an', 'the', 'and', 'but', 'or', 'for', 'nor', 'on', 'at', 'to', 'from', 'by']\n\t */\n\tkeepLower?: string[]\n\n\t/**\n\t * Whether to transform on input (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type CapitalcaseBinding = boolean | CapitalcaseOptions\n\n/**\n * Default words to keep lowercase\n */\nconst DEFAULT_KEEP_LOWER = [\n\t'a', 'an', 'the',\n\t'and', 'but', 'or', 'for', 'nor',\n\t'on', 'at', 'to', 'from', 'by',\n\t'in', 'of', 'with', 'as',\n]\n\n/**\n * Capitalize text based on options\n */\nfunction capitalizeText(text: string, options: CapitalcaseOptions): string {\n\tif (!text) return text\n\n\tconst { every = true, keepLower = DEFAULT_KEEP_LOWER } = options\n\n\tif (every) {\n\t\t// Capitalize each word\n\t\tconst words = text.toLowerCase().split(/\\s+/)\n\n\t\treturn words\n\t\t\t.map((word, index) => {\n\t\t\t\t// Always capitalize first word\n\t\t\t\tif (index === 0) {\n\t\t\t\t\treturn capitalizeWord(word)\n\t\t\t\t}\n\t\t\t\t// Keep certain words lowercase\n\t\t\t\tif (keepLower.includes(word.toLowerCase())) {\n\t\t\t\t\treturn word.toLowerCase()\n\t\t\t\t}\n\n\t\t\t\treturn capitalizeWord(word)\n\t\t\t})\n\t\t\t.join(' ')\n\t} else {\n\t\t// Capitalize only the first word\n\t\treturn capitalizeWord(text)\n\t}\n}\n\n/**\n * Capitalize a single word\n */\nfunction capitalizeWord(word: string): string {\n\tif (!word) return word\n\n\treturn word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CapitalcaseBinding | undefined): CapitalcaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { every: true, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { every: false, onInput: false }\n\t}\n\n\treturn {\n\t\tevery: binding.every ?? true,\n\t\tkeepLower: binding.keepLower ?? DEFAULT_KEEP_LOWER,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-capitalcase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: capitalize each word -->\n * <input v-capitalcase v-model=\"title\" />\n *\n * <!-- Capitalize only first word -->\n * <span v-capitalcase=\"{ every: false }\">{{ text }}</span>\n *\n * <!-- With custom lowercase words -->\n * <input v-capitalcase=\"{ keepLower: ['a', 'the'] }\" v-model=\"title\" />\n * </template>\n * ```\n */\nexport const vCapitalcase = defineDirective<CapitalcaseBinding, HTMLElement>({\n\tname: 'capitalcase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => capitalizeText(text, options))\n\n\t\t\t;(el as any).__capitalcaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => capitalizeText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = capitalizeText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => capitalizeText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__capitalcaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__capitalcaseCleanup\n\t},\n})\n\nexport default vCapitalcase\n", "import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\nimport { deleteState, getState, parseTime, setState } from '@directix/shared'\n\n/**\n * Click delay handler\n */\nexport type ClickDelayHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Click delay directive options\n */\nexport interface ClickDelayOptions {\n\t/**\n\t * Click handler\n\t * @required\n\t */\n\thandler: ClickDelayHandler\n\n\t/**\n\t * Delay time in milliseconds\n\t * @default 300\n\t */\n\tdelay?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * CSS class to add during delay\n\t * @default 'v-click-delay--pending'\n\t */\n\tpendingClass?: string\n\n\t/**\n\t * Whether to show visual feedback\n\t * @default true\n\t */\n\tfeedback?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ClickDelayBinding = ClickDelayHandler | ClickDelayOptions\n\n/**\n * Element state storage\n */\ninterface ClickDelayState {\n\toptions: ClickDelayOptions\n\thandler: (event: Event) => void\n\tisPending: boolean\n\ttimeoutId: ReturnType<typeof setTimeout> | null\n}\n\nconst STATE_KEY = 'clickDelay'\n\n/**\n * Remove pending class from element\n */\nfunction removePendingClass(el: HTMLElement, options: ClickDelayOptions): void {\n\tif (options.feedback && options.pendingClass) {\n\t\tel.classList.remove(options.pendingClass)\n\t}\n}\n\n/**\n * Create click handler with delay logic\n */\nfunction createClickHandler(\n\tel: HTMLElement,\n\toptions: ClickDelayOptions,\n): (event: Event) => void {\n\treturn (event: Event) => {\n\t\tconst state = getState<HTMLElement, ClickDelayState>(el, STATE_KEY)\n\n\t\tif (!state || state.isPending) {\n\t\t\tevent.preventDefault()\n\t\t\tevent.stopPropagation()\n\t\t\treturn\n\t\t}\n\n\t\t// Mark as pending\n\t\tstate.isPending = true\n\n\t\t// Add visual feedback\n\t\tif (options.feedback && options.pendingClass) {\n\t\t\tel.classList.add(options.pendingClass)\n\t\t}\n\n\t\t// Call handler\n\t\toptions.handler(event as MouseEvent | TouchEvent)\n\n\t\t// Set timeout to reset pending state\n\t\tstate.timeoutId = setTimeout(() => {\n\t\t\tstate.isPending = false\n\t\t\tstate.timeoutId = null\n\t\t\tremovePendingClass(el, options)\n\t\t}, options.delay)\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: ClickDelayBinding | undefined,\n\tdirectiveBinding: DirectiveBinding<ClickDelayBinding>,\n): ClickDelayOptions {\n\tconst delay = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn {\n\t\t\thandler: binding,\n\t\t\tdelay,\n\t\t\tdisabled: false,\n\t\t\tpendingClass: 'v-click-delay--pending',\n\t\t\tfeedback: true,\n\t\t}\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-click-delay: handler is required')\n\t}\n\n\treturn {\n\t\thandler: binding.handler,\n\t\tdelay: binding.delay ?? delay,\n\t\tdisabled: binding.disabled ?? false,\n\t\tpendingClass: binding.pendingClass ?? 'v-click-delay--pending',\n\t\tfeedback: binding.feedback ?? true,\n\t}\n}\n\n/**\n * v-click-delay directive\n *\n * Prevents repeated clicks within a specified time period.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Basic usage -->\n * <button v-click-delay=\"handleClick\">Click Me</button>\n *\n * <!-- With delay time -->\n * <button v-click-delay:500=\"handleClick\">Click Me (500ms)</button>\n *\n * <!-- With options -->\n * <button v-click-delay=\"{ handler: handleClick, delay: 1000 }\">\n * Click Me (1s)\n * </button>\n * </template>\n * ```\n */\nexport const vClickDelay = defineDirective<ClickDelayBinding, HTMLElement>({\n\tname: 'click-delay',\n\tssr: true,\n\tdefaults: {\n\t\tdelay: 300,\n\t\tdisabled: false,\n\t\tpendingClass: 'v-click-delay--pending',\n\t\tfeedback: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\n\t\tif (options.disabled) return\n\n\t\tconst state: ClickDelayState = {\n\t\t\toptions,\n\t\t\thandler: createClickHandler(el, options),\n\t\t\tisPending: false,\n\t\t\ttimeoutId: null,\n\t\t}\n\n\t\tsetState(el, STATE_KEY, state)\n\n\t\t// Bind click event\n\t\tel.addEventListener('click', state.handler)\n\t\tel.addEventListener('touchend', state.handler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = getState<HTMLElement, ClickDelayState>(el, STATE_KEY)\n\n\t\tif (!state) {\n\t\t\t// If previously disabled, reinitialize\n\t\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t\tif (!options.disabled) {\n\t\t\t\tconst newState: ClickDelayState = {\n\t\t\t\t\toptions,\n\t\t\t\t\thandler: createClickHandler(el, options),\n\t\t\t\t\tisPending: false,\n\t\t\t\t\ttimeoutId: null,\n\t\t\t\t}\n\t\t\t\tsetState(el, STATE_KEY, newState)\n\t\t\t\tel.addEventListener('click', newState.handler)\n\t\t\t\tel.addEventListener('touchend', newState.handler)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If disabled state changes\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disable: remove listeners\n\t\t\tel.removeEventListener('click', state.handler)\n\t\t\tel.removeEventListener('touchend', state.handler)\n\t\t\tif (state.timeoutId) {\n\t\t\t\tclearTimeout(state.timeoutId)\n\t\t\t}\n\t\t\tremovePendingClass(el, state.options)\n\t\t\tdeleteState(el, STATE_KEY)\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Enable: add listeners\n\t\t\tstate.handler = createClickHandler(el, newOptions)\n\t\t\tstate.isPending = false\n\t\t\tstate.timeoutId = null\n\t\t\tel.addEventListener('click', state.handler)\n\t\t\tel.addEventListener('touchend', state.handler)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state = getState<HTMLElement, ClickDelayState>(el, STATE_KEY)\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handler)\n\t\tel.removeEventListener('touchend', state.handler)\n\n\t\tif (state.timeoutId) {\n\t\t\tclearTimeout(state.timeoutId)\n\t\t}\n\n\t\tremovePendingClass(el, state.options)\n\t\tdeleteState(el, STATE_KEY)\n\t},\n})\n\nexport default vClickDelay\n", "import { defineDirective } from '@directix/core'\nimport { getElement, off, on } from '@directix/shared'\n\n/**\n * Click outside handler\n */\nexport type ClickOutsideHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Click outside directive options\n */\nexport interface ClickOutsideOptions {\n\t/**\n\t * Callback when clicking outside\n\t * @required\n\t */\n\thandler: ClickOutsideHandler\n\n\t/**\n\t * Excluded element selectors or element references\n\t */\n\texclude?: (string | HTMLElement | (() => HTMLElement | null))[]\n\n\t/**\n\t * Whether to use capture mode\n\t * @default true\n\t */\n\tcapture?: boolean\n\n\t/**\n\t * Event types to listen for\n\t * @default ['click']\n\t */\n\tevents?: ('click' | 'mousedown' | 'mouseup' | 'touchstart' | 'touchend')[]\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Stop propagation\n\t * @default false\n\t */\n\tstop?: boolean\n\n\t/**\n\t * Prevent default behavior\n\t * @default false\n\t */\n\tprevent?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ClickOutsideBinding = ClickOutsideHandler | ClickOutsideOptions\n\n/**\n * Element state storage\n */\ninterface ClickOutsideState {\n\toptions: ClickOutsideOptions\n\thandlers: Map<string, (event: Event) => void>\n}\n\n/**\n * v-click-outside directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-click-outside=\"handleClickOutside\">\n * Dropdown menu\n * </div>\n * </template>\n * ```\n */\nexport const vClickOutside = defineDirective<ClickOutsideBinding, HTMLElement>({\n\tname: 'click-outside',\n\tssr: false,\n\tdefaults: {\n\t\tcapture: true,\n\t\tevents: ['click'],\n\t\tdisabled: false,\n\t\tstop: false,\n\t\tprevent: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\tconst state: ClickOutsideState = {\n\t\t\toptions,\n\t\t\thandlers: new Map(),\n\t\t}\n\n ;(el as any).__clickOutside = state\n\n\t\t// Create event handler\n\t\tconst createHandler = (_eventType: string) => {\n\t\t\treturn (event: Event) => {\n\t\t\t\t// Check event target\n\t\t\t\tif (!isValidClick(el, event, options)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Stop propagation\n\t\t\t\tif (options.stop) {\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t}\n\n\t\t\t\t// Prevent default behavior\n\t\t\t\tif (options.prevent) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t}\n\n\t\t\t\t// Call handler\n\t\t\t\toptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t}\n\t\t}\n\n\t\t// Bind events\n\t\toptions.events!.forEach(eventType => {\n\t\t\tconst handler = createHandler(eventType)\n\n\t\t\tstate.handlers.set(eventType, handler)\n\n\t\t\tconst listenerOptions = {\n\t\t\t\tcapture: options.capture,\n\t\t\t\tpassive: !options.prevent,\n\t\t\t}\n\n\t\t\ton(document, eventType, handler, listenerOptions)\n\t\t})\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ClickOutsideState = (el as any).__clickOutside\n\n\t\tif (!state) return\n\n\t\tconst oldOptions = state.options\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// If disabled state changes\n\t\tif (oldOptions.disabled !== newOptions.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\t// Remove all listeners\n\t\t\t\tstate.handlers.forEach((handler, eventType) => {\n\t\t\t\t\toff(document, eventType, handler, { capture: oldOptions.capture })\n\t\t\t\t})\n\t\t\t\tstate.handlers.clear()\n\t\t\t} else {\n\t\t\t\t// Re-add listeners\n\t\t\t\tconst createHandler = (_eventType: string) => {\n\t\t\t\t\treturn (event: Event) => {\n\t\t\t\t\t\tif (!isValidClick(el, event, newOptions)) return\n\t\t\t\t\t\tif (newOptions.stop) event.stopPropagation()\n\t\t\t\t\t\tif (newOptions.prevent) event.preventDefault()\n\t\t\t\t\t\tnewOptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnewOptions.events!.forEach(eventType => {\n\t\t\t\t\tconst handler = createHandler(eventType)\n\n\t\t\t\t\tstate.handlers.set(eventType, handler)\n\t\t\t\t\ton(document, eventType, handler, {\n\t\t\t\t\t\tcapture: newOptions.capture,\n\t\t\t\t\t\tpassive: !newOptions.prevent,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ClickOutsideState = (el as any).__clickOutside\n\n\t\tif (!state) return\n\n\t\t// Remove all event listeners\n\t\tstate.handlers.forEach((handler, eventType) => {\n\t\t\toff(document, eventType, handler, { capture: state.options.capture })\n\t\t})\n\n\t\tdelete (el as any).__clickOutside\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ClickOutsideBinding | undefined): ClickOutsideOptions {\n\tif (typeof binding === 'function') {\n\t\treturn {\n\t\t\thandler: binding,\n\t\t\tcapture: true,\n\t\t\tevents: ['click'],\n\t\t\tdisabled: false,\n\t\t\tstop: false,\n\t\t\tprevent: false,\n\t\t}\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-click-outside: handler is required')\n\t}\n\n\treturn {\n\t\tcapture: binding.capture ?? true,\n\t\tevents: binding.events ?? ['click'],\n\t\tdisabled: binding.disabled ?? false,\n\t\tstop: binding.stop ?? false,\n\t\tprevent: binding.prevent ?? false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if click is valid (outside the element)\n */\nfunction isValidClick(\n\tel: HTMLElement,\n\tevent: Event,\n\toptions: ClickOutsideOptions,\n): boolean {\n\tconst target = event.target as Node\n\n\t// Check if clicked on element itself or its children\n\tif (el.contains(target)) {\n\t\treturn false\n\t}\n\n\t// Check excluded elements\n\tif (options.exclude?.length) {\n\t\tfor (const exclude of options.exclude) {\n\t\t\tconst excludeEl = typeof exclude === 'function' ? exclude() : getElement(exclude)\n\n\t\t\tif (excludeEl && (excludeEl === target || excludeEl.contains(target))) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true\n}\n\nexport default vClickOutside\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Click wave directive options\n * A simplified version of v-ripple with simpler configuration\n */\nexport interface ClickWaveOptions {\n\t/**\n\t * Wave color\n\t * @default 'currentColor'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Wave duration in milliseconds\n\t * @default 500\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to disable wave effect\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Wave size ratio (relative to element's smaller dimension)\n\t * @default 1.5\n\t */\n\tsizeRatio?: number\n}\n\n/**\n * Directive binding value type\n */\nexport type ClickWaveBinding = boolean | string | ClickWaveOptions\n\n/**\n * Element state storage\n */\ninterface ClickWaveState {\n\toptions: ClickWaveOptions\n\tclickHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ClickWaveBinding | undefined): ClickWaveOptions {\n\tif (binding === false) {\n\t\treturn { disabled: true, color: 'currentColor', duration: 500, sizeRatio: 1.5 }\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { color: binding, duration: 500, sizeRatio: 1.5 }\n\t}\n\n\tconst base: ClickWaveOptions = {\n\t\tcolor: 'currentColor',\n\t\tduration: 500,\n\t\tdisabled: false,\n\t\tsizeRatio: 1.5,\n\t}\n\n\treturn binding && typeof binding === 'object' ? { ...base, ...binding } : base\n}\n\n/**\n * Create wave element\n */\nfunction createWave(event: MouseEvent, el: HTMLElement, options: ClickWaveOptions): HTMLSpanElement | null {\n\tconst rect = el.getBoundingClientRect()\n\tconst x = event.clientX - rect.left\n\tconst y = event.clientY - rect.top\n\n\t// Calculate wave size based on element dimensions\n\tconst size = Math.min(rect.width, rect.height) * (options.sizeRatio || 1.5)\n\n\tconst wave = document.createElement('span')\n\n\twave.className = 'v-click-wave__effect'\n\twave.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(0);\n opacity: 0.5;\n z-index: 0;\n `\n\n\treturn wave\n}\n\n/**\n * Animate wave\n */\nfunction animateWave(wave: HTMLElement, options: ClickWaveOptions): void {\n\tconst duration = options.duration || 500\n\n\tif (typeof wave.animate === 'function') {\n\t\twave.animate(\n\t\t\t[\n\t\t\t\t{ transform: 'scale(0)', opacity: 0.5 },\n\t\t\t\t{ transform: 'scale(1)', 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\twave.remove()\n\t\t}\n\t} else {\n\t\twave.style.transition = `transform ${duration}ms ease-out, opacity ${duration}ms ease-out`\n\t\t// Force reflow\n\t\tString(wave.offsetHeight)\n\t\twave.style.transform = 'scale(1)'\n\t\twave.style.opacity = '0'\n\n\t\tsetTimeout(() => {\n\t\t\twave.remove()\n\t\t}, duration)\n\t}\n}\n\n/**\n * v-click-wave directive\n * A simplified click wave effect directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-click-wave>Click me</button>\n * <button v-click-wave=\"'rgba(255, 255, 255, 0.3)'\">Custom color</button>\n * <button v-click-wave=\"{ color: 'red', duration: 400 }\">Custom options</button>\n * </template>\n * ```\n */\nexport const vClickWave = defineDirective<ClickWaveBinding, HTMLElement>({\n\tname: 'click-wave',\n\tssr: false,\n\tdefaults: {\n\t\tcolor: 'currentColor',\n\t\tduration: 500,\n\t\tdisabled: false,\n\t\tsizeRatio: 1.5,\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\tif (computedStyle.overflow === 'visible') {\n\t\t\tel.style.overflow = 'hidden'\n\t\t}\n\n\t\tel.classList.add('v-click-wave')\n\n\t\tconst state: ClickWaveState = {\n\t\t\toptions,\n\t\t\tclickHandler: (e: Event) => {\n\t\t\t\tif (state.options.disabled) return\n\n\t\t\t\tconst mouseEvent = e as MouseEvent\n\t\t\t\tconst wave = createWave(mouseEvent, el, state.options)\n\n\t\t\t\tif (wave) {\n\t\t\t\t\tel.appendChild(wave)\n\t\t\t\t\tanimateWave(wave, state.options)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t;(el as any).__clickWave = state\n\n\t\tel.addEventListener('click', state.clickHandler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ClickWaveState = (el as any).__clickWave\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ClickWaveState = (el as any).__clickWave\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.clickHandler)\n\t\tel.classList.remove('v-click-wave')\n\n\t\tdelete (el as any).__clickWave\n\t},\n})\n\nexport default vClickWave\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Context menu item\n */\nexport interface ContextMenuItem {\n\t/** Item label */\n\tlabel: string\n\t/** Click handler */\n\thandler?: () => void\n\t/** Whether the item is disabled */\n\tdisabled?: boolean\n\t/** Divider before this item */\n\tdivider?: boolean\n\t/** Custom icon */\n\ticon?: string\n\t/** Custom class */\n\tclass?: string\n}\n\n/**\n * Context menu directive options\n */\nexport interface ContextMenuOptions {\n\t/** Menu items */\n\titems: ContextMenuItem[]\n\t/** Custom class for menu container */\n\tclass?: string\n\t/** Menu width */\n\twidth?: number | string\n\t/** Whether to disable the context menu */\n\tdisabled?: boolean\n\t/** Custom render function for menu item */\n\trenderItem?: (item: ContextMenuItem, index: number) => HTMLElement\n\t/** Callback before menu shows */\n\tonBeforeShow?: (e: MouseEvent) => boolean | void\n\t/** Callback after menu shows */\n\tonAfterShow?: () => void\n\t/** Callback after menu hides */\n\tonHide?: () => void\n}\n\n/**\n * Directive binding value type\n */\nexport type ContextMenuBinding = ContextMenuItem[] | ContextMenuOptions\n\n/**\n * Element state storage\n */\ninterface ContextMenuState {\n\toptions: ContextMenuOptions\n\tcontextMenuHandler: (e: MouseEvent) => void\n\tmenuElement: HTMLDivElement | null\n\tclickOutsideHandler: (e: MouseEvent) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ContextMenuBinding): ContextMenuOptions {\n\tif (Array.isArray(binding)) {\n\t\treturn { items: binding }\n\t}\n\treturn binding\n}\n\n/**\n * Create menu element\n */\nfunction createMenu(options: ContextMenuOptions, x: number, y: number): HTMLDivElement {\n\tconst menu = document.createElement('div')\n\tmenu.className = `v-context-menu ${options.class || ''}`\n\n\tconst width = options.width ? (typeof options.width === 'number' ? `${options.width}px` : options.width) : '150px'\n\tmenu.style.cssText = `\n position: fixed;\n left: ${x}px;\n top: ${y}px;\n min-width: ${width};\n background: #fff;\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n padding: 4px 0;\n z-index: 9999;\n font-size: 14px;\n `\n\n\toptions.items.forEach((item, index) => {\n\t\tif (item.divider) {\n\t\t\tconst divider = document.createElement('div')\n\t\t\tdivider.className = 'v-context-menu__divider'\n\t\t\tdivider.style.cssText = `\n height: 1px;\n background: #e8e8e8;\n margin: 4px 0;\n `\n\t\t\tmenu.appendChild(divider)\n\t\t}\n\n\t\tif (options.renderItem) {\n\t\t\tconst customItem = options.renderItem(item, index)\n\t\t\tmenu.appendChild(customItem)\n\t\t} else {\n\t\t\tconst menuItem = document.createElement('div')\n\t\t\tmenuItem.className = `v-context-menu__item ${item.class || ''}`\n\n\t\t\tif (item.disabled) {\n\t\t\t\tmenuItem.classList.add('v-context-menu__item--disabled')\n\t\t\t}\n\n\t\t\tmenuItem.style.cssText = `\n padding: 8px 16px;\n cursor: ${item.disabled ? 'not-allowed' : 'pointer'};\n color: ${item.disabled ? '#b0b0b0' : '#333'};\n display: flex;\n align-items: center;\n gap: 8px;\n `\n\n\t\t\tif (item.icon) {\n\t\t\t\tconst icon = document.createElement('span')\n\t\t\t\ticon.className = 'v-context-menu__icon'\n\t\t\t\ticon.innerHTML = item.icon\n\t\t\t\tmenuItem.appendChild(icon)\n\t\t\t}\n\n\t\t\tconst label = document.createElement('span')\n\t\t\tlabel.textContent = item.label\n\t\t\tmenuItem.appendChild(label)\n\n\t\t\tif (!item.disabled && item.handler) {\n\t\t\t\tmenuItem.addEventListener('click', () => {\n\t\t\t\t\titem.handler!()\n\t\t\t\t\tremoveMenu(menu)\n\t\t\t\t})\n\n\t\t\t\tmenuItem.addEventListener('mouseenter', () => {\n\t\t\t\t\tmenuItem.style.background = '#f5f5f5'\n\t\t\t\t})\n\n\t\t\t\tmenuItem.addEventListener('mouseleave', () => {\n\t\t\t\t\tmenuItem.style.background = 'transparent'\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tmenu.appendChild(menuItem)\n\t\t}\n\t})\n\n\treturn menu\n}\n\n/**\n * Remove menu from DOM\n */\nfunction removeMenu(menu: HTMLDivElement | null): void {\n\tif (menu && menu.parentNode) {\n\t\tmenu.parentNode.removeChild(menu)\n\t}\n}\n\n/**\n * Adjust menu position to stay within viewport\n */\nfunction adjustMenuPosition(menu: HTMLDivElement, x: number, y: number): void {\n\tconst rect = menu.getBoundingClientRect()\n\tconst viewportWidth = window.innerWidth\n\tconst viewportHeight = window.innerHeight\n\n\t// Adjust horizontal position\n\tif (x + rect.width > viewportWidth) {\n\t\tmenu.style.left = `${viewportWidth - rect.width - 8}px`\n\t}\n\n\t// Adjust vertical position\n\tif (y + rect.height > viewportHeight) {\n\t\tmenu.style.top = `${viewportHeight - rect.height - 8}px`\n\t}\n}\n\n/**\n * v-context-menu directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-context-menu=\"menuItems\">Right click here</div>\n * <div v-context-menu=\"{ items: menuItems, width: 200 }\">Custom width</div>\n * </template>\n *\n * <script setup>\n * const menuItems = [\n * { label: 'Copy', handler: () => console.log('Copy') },\n * { label: 'Paste', handler: () => console.log('Paste') },\n * { divider: true, label: '' },\n * { label: 'Delete', handler: () => console.log('Delete') }\n * ]\n * </script>\n * ```\n */\nexport const vContextMenu = defineDirective<ContextMenuBinding, HTMLElement>({\n\tname: 'context-menu',\n\tssr: 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 state: ContextMenuState = {\n\t\t\toptions,\n\t\t\tcontextMenuHandler: (e: MouseEvent) => {\n\t\t\t\te.preventDefault()\n\n\t\t\t\t// Remove existing menu\n\t\t\t\tif (state.menuElement) {\n\t\t\t\t\tremoveMenu(state.menuElement)\n\t\t\t\t}\n\n\t\t\t\t// Call before show callback\n\t\t\t\tif (options.onBeforeShow?.(e) === false) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Create and show menu\n\t\t\t\tstate.menuElement = createMenu(state.options, e.clientX, e.clientY)\n\t\t\t\tdocument.body.appendChild(state.menuElement)\n\n\t\t\t\t// Adjust position\n\t\t\t\tadjustMenuPosition(state.menuElement, e.clientX, e.clientY)\n\n\t\t\t\t// Add click outside handler\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tdocument.addEventListener('click', state.clickOutsideHandler)\n\t\t\t\t}, 0)\n\n\t\t\t\toptions.onAfterShow?.()\n\t\t\t},\n\t\t\tmenuElement: null,\n\t\t\tclickOutsideHandler: (e: MouseEvent) => {\n\t\t\t\tconst target = e.target as Node\n\n\t\t\t\t// Don't close if clicking inside menu\n\t\t\t\tif (state.menuElement && state.menuElement.contains(target)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tremoveMenu(state.menuElement)\n\t\t\t\tstate.menuElement = null\n\t\t\t\tdocument.removeEventListener('click', state.clickOutsideHandler)\n\t\t\t\toptions.onHide?.()\n\t\t\t},\n\t\t}\n\n\t\t;(el as any).__contextMenu = state\n\n\t\ton(el, 'contextmenu', state.contextMenuHandler as (e: Event) => void)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ContextMenuState = (el as any).__contextMenu\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ContextMenuState = (el as any).__contextMenu\n\n\t\tif (!state) return\n\n\t\toff(el, 'contextmenu', state.contextMenuHandler as (e: Event) => void)\n\n\t\t// Remove menu if still visible\n\t\tif (state.menuElement) {\n\t\t\tremoveMenu(state.menuElement)\n\t\t\tdocument.removeEventListener('click', state.clickOutsideHandler)\n\t\t}\n\n\t\tdelete (el as any).__contextMenu\n\t},\n})\n\nexport default vContextMenu\n", "import { defineDirective, supportsClipboard } from '@directix/core'\n\n/**\n * Copy success callback\n */\nexport type CopySuccessCallback = (text: string) => void\n\n/**\n * Copy error callback\n */\nexport type CopyErrorCallback = (error: Error) => void\n\n/**\n * Copy directive options\n */\nexport interface CopyOptions {\n\t/**\n\t * Text to copy\n\t * @required\n\t */\n\tvalue: string\n\n\t/**\n\t * Callback on copy success\n\t */\n\tonSuccess?: CopySuccessCallback\n\n\t/**\n\t * Callback on copy error\n\t */\n\tonError?: CopyErrorCallback\n\n\t/**\n\t * Tooltip text for the copy button\n\t */\n\ttitle?: string\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type CopyBinding = string | CopyOptions\n\n/**\n * Element state storage\n */\ninterface CopyState {\n\thandler: () => void\n\toptions: CopyOptions\n}\n\n/**\n * Copy text to clipboard\n * Prefer Clipboard API, fallback to execCommand\n */\nasync function copyToClipboard(text: string): Promise<boolean> {\n\t// Method 1: Use Clipboard API\n\tif (supportsClipboard()) {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(text)\n\n\t\t\treturn true\n\t\t} catch {\n\t\t\t// Permission denied or other error, fallback\n\t\t\tconsole.warn('[Directix] Clipboard API failed, falling back to execCommand')\n\t\t}\n\t}\n\n\t// Method 2: Use execCommand (deprecated but has good compatibility)\n\treturn copyWithExecCommand(text)\n}\n\n/**\n * Copy using execCommand\n */\nfunction copyWithExecCommand(text: string): boolean {\n\t// Create temporary textarea\n\tconst textarea = document.createElement('textarea')\n\n\ttextarea.value = text\n\n\t// Set styles to make it invisible\n\ttextarea.style.cssText = `\n position: fixed;\n top: -9999px;\n left: -9999px;\n opacity: 0;\n pointer-events: none;\n `\n\n\tdocument.body.appendChild(textarea)\n\n\ttry {\n\t\t// Select and copy\n\t\ttextarea.select()\n\t\ttextarea.setSelectionRange(0, textarea.value.length)\n\n\t\treturn document.execCommand('copy')\n\t} catch {\n\t\treturn false\n\t} finally {\n\t\t// Cleanup\n\t\tdocument.body.removeChild(textarea)\n\t}\n}\n\n/**\n * v-copy directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-copy=\"textToCopy\">Copy Text</button>\n * </template>\n * ```\n */\nexport const vCopy = defineDirective<CopyBinding, HTMLElement>({\n\tname: 'copy',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Set tooltip\n\t\tif (options.title) {\n\t\t\tel.setAttribute('title', options.title)\n\t\t}\n\n\t\t// State storage - handler reads latest value from here\n\t\tconst state: CopyState = {\n\t\t\thandler: null as any,\n\t\t\toptions,\n\t\t}\n\n\t\t// Add click event - read latest options from state\n\t\tstate.handler = async () => {\n\t\t\tconst text = state.options.value\n\n\t\t\tif (!text) {\n\t\t\t\tconsole.warn('[Directix] v-copy: No text to copy')\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst success = await copyToClipboard(text)\n\n\t\t\t\tif (success) {\n\t\t\t\t\tstate.options.onSuccess?.(text)\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('copy:success', { detail: { text } }))\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Copy failed')\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err as Error\n\n\t\t\t\tstate.options.onError?.(error)\n\t\t\t\tel.dispatchEvent(new CustomEvent('copy:error', { detail: { error } }))\n\t\t\t}\n\t\t}\n\n\t\tel.addEventListener('click', state.handler)\n\t\t;(el as any).__copy = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: CopyState = (el as any).__copy\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\tif (state.options.title) {\n\t\t\tel.setAttribute('title', state.options.title)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: CopyState = (el as any).__copy\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handler)\n\t\tdelete (el as any).__copy\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CopyBinding): CopyOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { value: binding }\n\t}\n\n\treturn binding\n}\n\nexport default vCopy\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Countdown format function\n */\nexport type CountdownFormatFunction = (time: CountdownTime) => string\n\n/**\n * Countdown complete callback\n */\nexport type CountdownCompleteCallback = () => void\n\n/**\n * Countdown tick callback\n */\nexport type CountdownTickCallback = (time: CountdownTime) => void\n\n/**\n * Countdown time object\n */\nexport interface CountdownTime {\n\tdays: number\n\thours: number\n\tminutes: number\n\tseconds: number\n\tmilliseconds: number\n\ttotal: number\n}\n\n/**\n * Countdown directive options\n */\nexport interface CountdownOptions {\n\t/**\n\t * Target time (Date object, timestamp, or ISO string)\n\t * @required\n\t */\n\ttarget: Date | number | string\n\n\t/**\n\t * Format string or custom format function\n\t * - 'dd:hh:mm:ss' - Days:Hours:Minutes:Seconds\n\t * - 'hh:mm:ss' - Hours:Minutes:Seconds\n\t * - 'mm:ss' - Minutes:Seconds\n\t * - 'ss' - Seconds only\n\t * @default 'hh:mm:ss'\n\t */\n\tformat?: string | CountdownFormatFunction\n\n\t/**\n\t * Callback when countdown completes\n\t */\n\tonComplete?: CountdownCompleteCallback\n\n\t/**\n\t * Callback on each tick\n\t */\n\tonTick?: CountdownTickCallback\n\n\t/**\n\t * Update interval in milliseconds\n\t * @default 1000\n\t */\n\tinterval?: number\n\n\t/**\n\t * Whether to show milliseconds\n\t * @default false\n\t */\n\tshowMilliseconds?: boolean\n\n\t/**\n\t * Whether to auto-start\n\t * @default true\n\t */\n\tautoStart?: boolean\n\n\t/**\n\t * Custom labels for i18n\n\t */\n\tlabels?: {\n\t\tdays?: string\n\t\thours?: string\n\t\tminutes?: string\n\t\tseconds?: string\n\t\tmilliseconds?: string\n\t}\n}\n\n/**\n * Directive binding value type\n */\nexport type CountdownBinding = CountdownOptions | Date | number | string\n\n/**\n * Element state storage\n */\ninterface CountdownState {\n\toptions: CountdownOptions\n\ttargetTime: number\n\tintervalId: ReturnType<typeof setInterval> | null\n\tpaused: boolean\n\tremaining: number\n}\n\n/**\n * Parse target time to timestamp\n */\nfunction parseTargetTime(target: Date | number | string): number {\n\tif (target instanceof Date) {\n\t\treturn target.getTime()\n\t}\n\n\tif (typeof target === 'number') {\n\t\treturn target\n\t}\n\n\treturn new Date(target).getTime()\n}\n\n/**\n * Calculate remaining time\n */\nfunction calculateTime(remaining: number): CountdownTime {\n\tconst total = Math.max(0, remaining)\n\n\treturn {\n\t\tdays: Math.floor(total / (1000 * 60 * 60 * 24)),\n\t\thours: Math.floor((total % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)),\n\t\tminutes: Math.floor((total % (1000 * 60 * 60)) / (1000 * 60)),\n\t\tseconds: Math.floor((total % (1000 * 60)) / 1000),\n\t\tmilliseconds: total % 1000,\n\t\ttotal,\n\t}\n}\n\n/**\n * Format time to string\n */\nfunction formatTime(time: CountdownTime, format: string | CountdownFormatFunction): string {\n\tif (typeof format === 'function') {\n\t\treturn format(time)\n\t}\n\n\tconst pad = (n: number, len = 2): string => String(n).padStart(len, '0')\n\n\t// Replace placeholders\n\tconst result = format\n\t\t.replace(/dd/gi, pad(time.days))\n\t\t.replace(/hh/gi, pad(time.hours))\n\t\t.replace(/mm/gi, pad(time.minutes))\n\t\t.replace(/ss/gi, pad(time.seconds))\n\t\t.replace(/S{3}/gi, pad(time.milliseconds, 3))\n\t\t.replace(/SS/gi, pad(Math.floor(time.milliseconds / 10)))\n\t\t.replace(/S/gi, String(Math.floor(time.milliseconds / 100)))\n\n\treturn result\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CountdownBinding): CountdownOptions {\n\tif (typeof binding === 'object' && binding !== null && 'target' in binding) {\n\t\treturn {\n\t\t\ttarget: binding.target,\n\t\t\tformat: binding.format ?? 'hh:mm:ss',\n\t\t\tonComplete: binding.onComplete,\n\t\t\tonTick: binding.onTick,\n\t\t\tinterval: binding.interval ?? 1000,\n\t\t\tshowMilliseconds: binding.showMilliseconds ?? false,\n\t\t\tautoStart: binding.autoStart ?? true,\n\t\t\tlabels: binding.labels,\n\t\t}\n\t}\n\n\t// binding is Date | number | string\n\treturn {\n\t\ttarget: binding as Date | number | string,\n\t\tformat: 'hh:mm:ss',\n\t\tinterval: 1000,\n\t\tshowMilliseconds: false,\n\t\tautoStart: true,\n\t}\n}\n\n/**\n * v-countdown directive\n *\n * Displays a countdown timer.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Basic usage -->\n * <span v-countdown=\"targetDate\"></span>\n *\n * <!-- With timestamp -->\n * <span v-countdown=\"Date.now() + 60000\"></span>\n *\n * <!-- With options -->\n * <span v-countdown=\"{\n * target: targetDate,\n * format: 'dd:hh:mm:ss',\n * onComplete: handleComplete\n * }\"></span>\n *\n * <!-- With custom format function -->\n * <span v-countdown=\"{\n * target: targetDate,\n * format: (time) => `${time.days} days ${time.hours}:${time.minutes}:${time.seconds}`\n * }\"></span>\n * </template>\n * ```\n */\nexport const vCountdown = defineDirective<CountdownBinding, HTMLElement>({\n\tname: 'countdown',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst targetTime = parseTargetTime(options.target)\n\n\t\tconst state: CountdownState = {\n\t\t\toptions,\n\t\t\ttargetTime,\n\t\t\tintervalId: null,\n\t\t\tpaused: false,\n\t\t\tremaining: 0,\n\t\t}\n\n\t\t;(el as any).__countdown = state\n\n\t\tif (options.autoStart !== false) {\n\t\t\tstartCountdown(el, state)\n\t\t} else {\n\t\t\t// Show initial time\n\t\t\tupdateDisplay(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: CountdownState = (el as any).__countdown\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst newTargetTime = parseTargetTime(newOptions.target)\n\n\t\t// Check if target changed\n\t\tif (newTargetTime !== state.targetTime) {\n\t\t\tstate.targetTime = newTargetTime\n\t\t\tstate.options = newOptions\n\n\t\t\t// Clear existing interval if any\n\t\t\tif (state.intervalId) {\n\t\t\t\tclearInterval(state.intervalId)\n\t\t\t\tstate.intervalId = null\n\t\t\t}\n\n\t\t\t// Restart countdown if not paused\n\t\t\tif (!state.paused) {\n\t\t\t\tstartCountdown(el, state)\n\t\t\t}\n\t\t} else {\n\t\t\tstate.options = newOptions\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: CountdownState | undefined = (el as any).__countdown\n\n\t\tif (state?.intervalId) {\n\t\t\tclearInterval(state.intervalId)\n\t\t}\n\n\t\tdelete (el as any).__countdown\n\t},\n})\n\n/**\n * Start countdown\n */\nfunction startCountdown(el: HTMLElement, state: CountdownState): void {\n\tconst tick = (): void => {\n\t\tconst now = Date.now()\n\t\tstate.remaining = state.targetTime - now\n\n\t\tif (state.remaining <= 0) {\n\t\t\tstate.remaining = 0\n\t\t\tupdateDisplay(el, state)\n\t\t\tstopCountdown(state)\n\n\t\t\t// Call onComplete\n\t\t\tif (state.options.onComplete) {\n\t\t\t\tstate.options.onComplete()\n\t\t\t}\n\n\t\t\t// Dispatch event\n\t\t\tel.dispatchEvent(new CustomEvent('countdown:complete'))\n\t\t\treturn\n\t\t}\n\n\t\tupdateDisplay(el, state)\n\n\t\t// Call onTick\n\t\tif (state.options.onTick) {\n\t\t\tconst time = calculateTime(state.remaining)\n\t\t\tstate.options.onTick(time)\n\t\t}\n\t}\n\n\t// Initial tick\n\ttick()\n\n\t// Start interval\n\tstate.intervalId = setInterval(tick, state.options.interval || 1000)\n}\n\n/**\n * Stop countdown\n */\nfunction stopCountdown(state: CountdownState): void {\n\tif (state.intervalId) {\n\t\tclearInterval(state.intervalId)\n\t\tstate.intervalId = null\n\t}\n}\n\n/**\n * Update display\n */\nfunction updateDisplay(el: HTMLElement, state: CountdownState): void {\n\tconst time = calculateTime(state.remaining)\n\tconst display = formatTime(time, state.options.format || 'hh:mm:ss')\n\tel.textContent = display\n}\n\n// Export helper functions for external use\nexport { calculateTime, formatTime, parseTargetTime }\n\nexport default vCountdown\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Counter easing function type\n */\nexport type CounterEasing = 'linear' | 'easeOut' | 'easeInOut' | 'easeOutQuart' | 'easeOutExpo'\n\n/**\n * Counter directive options\n */\nexport interface CounterOptions {\n\t/**\n\t * Target value\n\t */\n\tvalue: number\n\n\t/**\n\t * Starting value\n\t * @default 0\n\t */\n\tstartValue?: number\n\n\t/**\n\t * Animation duration in milliseconds\n\t * @default 2000\n\t */\n\tduration?: number\n\n\t/**\n\t * Number of decimal places\n\t * @default 0\n\t */\n\tdecimals?: number\n\n\t/**\n\t * Whether to use thousands separator\n\t * @default false\n\t */\n\tuseGrouping?: boolean\n\n\t/**\n\t * Locale for formatting\n\t * @default 'en-US'\n\t */\n\tlocale?: string\n\n\t/**\n\t * Custom format function\n\t */\n\tformatter?: (value: number) => string\n\n\t/**\n\t * Easing function\n\t * @default 'easeOutQuart'\n\t */\n\teasing?: CounterEasing\n\n\t/**\n\t * Custom easing function\n\t */\n\tcustomEasing?: (t: number) => number\n\n\t/**\n\t * Animation delay in milliseconds\n\t * @default 0\n\t */\n\tdelay?: number\n\n\t/**\n\t * Callback on each frame\n\t */\n\tonUpdate?: (value: number, formattedValue: string) => void\n\n\t/**\n\t * Callback when animation completes\n\t */\n\tonComplete?: (value: number) => void\n\n\t/**\n\t * Callback when animation starts\n\t */\n\tonStart?: () => void\n}\n\n/**\n * Directive binding value type\n */\nexport type CounterBinding = number | CounterOptions\n\n/**\n * Element state storage\n */\ninterface CounterState {\n\toptions: CounterOptions\n\tanimationFrame: number | null\n\tstartTime: number | null\n\tstartValue: number\n\tcurrentValue: number\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CounterBinding | undefined): CounterOptions {\n\tif (typeof binding === 'number') {\n\t\treturn { value: binding }\n\t}\n\n\treturn {\n\t\tvalue: 0,\n\t\tstartValue: 0,\n\t\tduration: 2000,\n\t\tdecimals: 0,\n\t\tuseGrouping: false,\n\t\tlocale: 'en-US',\n\t\teasing: 'easeOutQuart',\n\t\tdelay: 0,\n\t\t...(binding || {}),\n\t}\n}\n\n/**\n * Easing functions\n */\nconst easingFunctions: Record<CounterEasing, (t: number) => number> = {\n\tlinear: t => t,\n\teaseOut: t => 1 - (1 - t) ** 3,\n\teaseInOut: t => t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2,\n\teaseOutQuart: t => 1 - (1 - t) ** 4,\n\teaseOutExpo: t => t === 1 ? 1 : 1 - 2 ** (-10 * t),\n}\n\n/**\n * Format number\n */\nfunction formatNumber(value: number, options: CounterOptions): string {\n\tif (options.formatter) {\n\t\treturn options.formatter(value)\n\t}\n\n\treturn new Intl.NumberFormat(options.locale, {\n\t\tminimumFractionDigits: options.decimals,\n\t\tmaximumFractionDigits: options.decimals,\n\t\tuseGrouping: options.useGrouping,\n\t}).format(value)\n}\n\n/**\n * v-counter directive\n * Animated number counter\n *\n * @example\n * ```vue\n * <template>\n * <span v-counter=\"1000\">0</span>\n *\n * <span v-counter=\"{\n * value: 10000,\n * duration: 3000,\n * decimals: 2,\n * useGrouping: true\n * }\">0</span>\n *\n * <span v-counter=\"{\n * value: targetValue,\n * formatter: (v) => '$' + v.toFixed(2)\n * }\">0</span>\n * </template>\n * ```\n */\nexport const vCounter = defineDirective<CounterBinding, HTMLElement>({\n\tname: 'counter',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: CounterState = {\n\t\t\toptions,\n\t\t\tanimationFrame: null,\n\t\t\tstartTime: null,\n\t\t\tstartValue: options.startValue || 0,\n\t\t\tcurrentValue: options.startValue || 0,\n\t\t}\n\n\t\t;(el as any).__counter = state\n\n\t\t// Set initial value\n\t\tel.textContent = formatNumber(state.startValue, options)\n\n\t\tel.classList.add('v-counter')\n\n\t\t// Start animation after delay\n\t\tif (isBrowser() && options.value !== state.startValue) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tanimateCounter(el, state)\n\t\t\t}, options.delay || 0)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: CounterState = (el as any).__counter\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst oldValue = state.options.value\n\t\tconst newValue = newOptions.value\n\n\t\t// Cancel current animation\n\t\tif (state.animationFrame) {\n\t\t\tcancelAnimationFrame(state.animationFrame)\n\t\t\tstate.animationFrame = null\n\t\t}\n\n\t\t// Update start value to current value for smooth transition\n\t\tstate.startValue = state.currentValue\n\t\tstate.startTime = null\n\t\tstate.options = newOptions\n\n\t\t// Restart animation if value changed\n\t\tif (newValue !== oldValue) {\n\t\t\tanimateCounter(el, state)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: CounterState = (el as any).__counter\n\n\t\tif (!state) return\n\n\t\tif (state.animationFrame) {\n\t\t\tcancelAnimationFrame(state.animationFrame)\n\t\t}\n\n\t\tel.classList.remove('v-counter')\n\t\tdelete (el as any).__counter\n\t},\n})\n\n/**\n * Animate counter\n */\nfunction animateCounter(el: HTMLElement, state: CounterState): void {\n\tconst { options, startValue } = state\n\tconst endValue = options.value\n\tconst duration = options.duration || 2000\n\n\tstate.startTime = null\n\toptions.onStart?.()\n\n\tfunction animate(timestamp: number): void {\n\t\tif (!state.startTime) {\n\t\t\tstate.startTime = timestamp\n\t\t}\n\n\t\tconst elapsed = timestamp - state.startTime\n\t\tconst progress = Math.min(elapsed / duration, 1)\n\n\t\t// Apply easing\n\t\tconst easingFn = options.customEasing || easingFunctions[options.easing || 'easeOutQuart']\n\t\tconst easedProgress = easingFn(progress)\n\n\t\t// Calculate current value\n\t\tstate.currentValue = startValue + (endValue - startValue) * easedProgress\n\n\t\t// Format and update\n\t\tconst formattedValue = formatNumber(state.currentValue, options)\n\t\tel.textContent = formattedValue\n\n\t\toptions.onUpdate?.(state.currentValue, formattedValue)\n\n\t\t// Continue or complete\n\t\tif (progress < 1) {\n\t\t\tstate.animationFrame = requestAnimationFrame(animate)\n\t\t} else {\n\t\t\tstate.currentValue = endValue\n\t\t\tel.textContent = formatNumber(endValue, options)\n\t\t\tstate.animationFrame = null\n\t\t\toptions.onComplete?.(endValue)\n\t\t}\n\t}\n\n\tstate.animationFrame = requestAnimationFrame(animate)\n}\n\nexport default vCounter\n", "import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\nimport { debounce, getDefaultEventType, getEventTypeFromModifiers, parseTime } from '@directix/shared'\n\n/**\n * Debounced function type\n */\nexport interface DebouncedFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n\tflush: () => void\n}\n\n/**\n * Debounce directive options\n */\nexport interface DebounceOptions<T extends (...args: any[]) => any = any> {\n\t/**\n\t * Function to debounce\n\t */\n\thandler: T\n\n\t/**\n\t * Delay time in milliseconds\n\t * @default 300\n\t */\n\twait?: number\n\n\t/**\n\t * Whether to invoke immediately before delay starts\n\t * @default false\n\t */\n\tleading?: boolean\n\n\t/**\n\t * Whether to invoke after delay ends\n\t * @default true\n\t */\n\ttrailing?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type DebounceBinding<T extends (...args: any[]) => any = any>\n\t= | T\n\t\t| DebounceOptions<T>\n\n/**\n * Element state storage\n */\ninterface DebounceState {\n\tdebouncedFn: DebouncedFunction<any>\n\teventType: string\n\toptions: DebounceOptions\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: DebounceBinding,\n\tdirectiveBinding: DirectiveBinding<DebounceBinding>,\n): DebounceOptions {\n\tconst wait = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, wait }\n\t}\n\n\treturn { ...binding, wait: binding.wait || wait }\n}\n\n/**\n * v-debounce directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-debounce=\"handleInput\" />\n * <input v-debounce:500ms=\"handleInput\" />\n * <input v-debounce=\"{ handler: handleInput, wait: 500 }\" />\n * <div v-debounce.scroll=\"handleScroll\">Scroll Debounce</div>\n * <div v-debounce:100.scroll=\"handleScroll\">100ms Scroll Debounce</div>\n * </template>\n * ```\n */\nexport const vDebounce = defineDirective<DebounceBinding, HTMLElement>({\n\tname: 'debounce',\n\tssr: true, // SSR safe - event binding is skipped on server\n\tdefaults: {\n\t\twait: 300,\n\t\tleading: false,\n\t\ttrailing: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t// Prefer event type from modifiers, otherwise infer from element type\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getDefaultEventType(el)\n\n\t\t// Create debounced function\n\t\tconst debouncedFn = debounce(options.handler, options.wait, {\n\t\t\tleading: options.leading,\n\t\t\ttrailing: options.trailing,\n\t\t})\n\n\t\t// Bind event\n\t\tel.addEventListener(eventType, debouncedFn as any)\n\n\t\t;(el as any).__debounce = {\n\t\t\tdebouncedFn,\n\t\t\teventType,\n\t\t\toptions,\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: DebounceState = (el as any).__debounce\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If configuration changes, recreate debounced function\n\t\tif (\n\t\t\tnewOptions.wait !== state.options.wait\n\t\t\t|| newOptions.leading !== state.options.leading\n\t\t\t|| newOptions.trailing !== state.options.trailing\n\t\t) {\n\t\t\t// Cancel old one\n\t\t\tstate.debouncedFn.cancel()\n\n\t\t\t// Create new one\n\t\t\tconst debouncedFn = debounce(newOptions.handler, newOptions.wait, {\n\t\t\t\tleading: newOptions.leading,\n\t\t\t\ttrailing: newOptions.trailing,\n\t\t\t})\n\n\t\t\tel.removeEventListener(state.eventType, state.debouncedFn as any)\n\t\t\tel.addEventListener(state.eventType, debouncedFn as any)\n\n\t\t\t;(el as any).__debounce = {\n\t\t\t\tdebouncedFn,\n\t\t\t\teventType: state.eventType,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t} else if (newOptions.handler !== state.options.handler) {\n\t\t\t// Only update handler\n\t\t\tstate.options.handler = newOptions.handler\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: DebounceState = (el as any).__debounce\n\n\t\tif (!state) return\n\n\t\tstate.debouncedFn.cancel()\n\t\tel.removeEventListener(state.eventType, state.debouncedFn as any)\n\t\tdelete (el as any).__debounce\n\t},\n})\n\nexport default vDebounce\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Draggable axis\n */\nexport type DraggableAxis = 'x' | 'y' | 'both'\n\n/**\n * Draggable directive options\n */\nexport interface DraggableOptions {\n\t/**\n\t * Drag axis\n\t * @default 'both'\n\t */\n\taxis?: DraggableAxis\n\n\t/**\n\t * Constrain to parent element\n\t * @default false\n\t */\n\tconstrain?: boolean\n\n\t/**\n\t * Boundary element selector or element\n\t */\n\tboundary?: string | HTMLElement | (() => HTMLElement | null)\n\n\t/**\n\t * Handle element selector\n\t */\n\thandle?: string\n\n\t/**\n\t * Whether dragging is disabled\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Grid snapping [x, y]\n\t */\n\tgrid?: [number, number]\n\n\t/**\n\t * Start drag callback\n\t */\n\tonStart?: (position: { x: number, y: number }, event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Drag callback\n\t */\n\tonDrag?: (position: { x: number, y: number }, event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * End drag callback\n\t */\n\tonEnd?: (position: { x: number, y: number }, event: MouseEvent | TouchEvent) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type DraggableBinding = boolean | DraggableOptions\n\n/**\n * Draggable state\n */\ninterface DraggableState {\n\toptions: DraggableOptions\n\tisDragging: boolean\n\tstartX: number\n\tstartY: number\n\toffsetX: number\n\toffsetY: number\n\tinitialLeft: number\n\tinitialTop: number\n\tboundaryWidth: number\n\tboundaryHeight: number\n\telWidth: number\n\telHeight: number\n\thandleEl: HTMLElement | null\n\tmoveHandler: ((e: MouseEvent | TouchEvent) => void) | null\n\tendHandler: ((e: MouseEvent | TouchEvent) => void) | null\n}\n\n/**\n * Get element boundary\n */\nfunction getBoundary(_el: HTMLElement, boundary?: string | HTMLElement | (() => HTMLElement | null)): DOMRect | null {\n\tif (!boundary) return null\n\n\tif (typeof boundary === 'function') {\n\t\tconst boundaryEl = boundary()\n\t\treturn boundaryEl?.getBoundingClientRect() ?? null\n\t}\n\n\tif (typeof boundary === 'string') {\n\t\tconst boundaryEl = document.querySelector(boundary)\n\t\treturn boundaryEl?.getBoundingClientRect() ?? null\n\t}\n\n\treturn boundary.getBoundingClientRect()\n}\n\n/**\n * Get client coordinates from mouse or touch event\n */\nfunction getClientCoords(e: MouseEvent | TouchEvent): { clientX: number, clientY: number } {\n\tif (e.type.startsWith('touch')) {\n\t\tconst touch = (e as TouchEvent).touches[0]\n\t\treturn { clientX: touch.clientX, clientY: touch.clientY }\n\t}\n\tconst mouseEvent = e as MouseEvent\n\treturn { clientX: mouseEvent.clientX, clientY: mouseEvent.clientY }\n}\n\n/**\n * Parse transform translate values\n */\nfunction parseTranslate(transform: string): { x: number, y: number } {\n\tconst match = transform.match(/translate\\(([-\\d.]+)px,\\s*([-\\d.]+)px\\)/)\n\tif (match) {\n\t\treturn { x: parseFloat(match[1]), y: parseFloat(match[2]) }\n\t}\n\treturn { x: 0, y: 0 }\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: DraggableBinding): DraggableOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { axis: 'both', constrain: false, disabled: false }\n\t}\n\n\tif (binding === false) {\n\t\treturn { axis: 'both', constrain: false, disabled: true }\n\t}\n\n\treturn {\n\t\taxis: binding.axis ?? 'both',\n\t\tconstrain: binding.constrain ?? false,\n\t\tboundary: binding.boundary,\n\t\thandle: binding.handle,\n\t\tdisabled: binding.disabled ?? false,\n\t\tgrid: binding.grid,\n\t\tonStart: binding.onStart,\n\t\tonDrag: binding.onDrag,\n\t\tonEnd: binding.onEnd,\n\t}\n}\n\n/**\n * v-draggable directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage -->\n * <div v-draggable>Drag me</div>\n *\n * <!-- Constrain to parent -->\n * <div v-draggable=\"{ constrain: true }\">Drag me</div>\n *\n * <!-- With handle -->\n * <div v-draggable=\"{ handle: '.drag-handle' }\">\n * <div class=\"drag-handle\">Drag here</div>\n * <div>Content</div>\n * </div>\n *\n * <!-- With callbacks -->\n * <div v-draggable=\"{ onDrag: handleDrag }\">Drag me</div>\n * </template>\n * ```\n */\nexport const vDraggable = defineDirective<DraggableBinding, HTMLElement>({\n\tname: 'draggable',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tif (options.disabled) return\n\n\t\t// Make element positionable\n\t\tif (getComputedStyle(el).position === 'static') {\n\t\t\tel.style.position = 'absolute'\n\t\t}\n\n\t\tconst state: DraggableState = {\n\t\t\toptions,\n\t\t\tisDragging: false,\n\t\t\tstartX: 0,\n\t\t\tstartY: 0,\n\t\t\toffsetX: 0,\n\t\t\toffsetY: 0,\n\t\t\tinitialLeft: 0,\n\t\t\tinitialTop: 0,\n\t\t\tboundaryWidth: 0,\n\t\t\tboundaryHeight: 0,\n\t\t\telWidth: 0,\n\t\t\telHeight: 0,\n\t\t\thandleEl: options.handle ? el.querySelector(options.handle) : null,\n\t\t\tmoveHandler: null,\n\t\t\tendHandler: null,\n\t\t}\n\n\t\t;(el as any).__draggable = state\n\n\t\t// Add event listeners to handle or element\n\t\tconst targetEl = state.handleEl || el\n\t\ttargetEl.addEventListener('mousedown', startDrag)\n\t\ttargetEl.addEventListener('touchstart', startDrag, { passive: false })\n\n\t\tfunction startDrag(e: MouseEvent | TouchEvent): void {\n\t\t\tif (state.options.disabled) return\n\n\t\t\t// Prevent default for touch events\n\t\t\tif (e.type === 'touchstart') {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\n\t\t\tconst { clientX, clientY } = getClientCoords(e)\n\t\t\tstate.isDragging = true\n\t\t\tstate.startX = clientX\n\t\t\tstate.startY = clientY\n\n\t\t\t// Get current transform offset\n\t\t\tconst { x, y } = parseTranslate(el.style.transform)\n\t\t\tstate.offsetX = x\n\t\t\tstate.offsetY = y\n\n\t\t\t// Store boundary info for constraint\n\t\t\tif (state.options.constrain || state.options.boundary) {\n\t\t\t\tconst boundary = state.options.boundary ? getBoundary(el, state.options.boundary) : el.parentElement?.getBoundingClientRect()\n\n\t\t\t\tif (boundary) {\n\t\t\t\t\tconst elRect = el.getBoundingClientRect()\n\t\t\t\t\tstate.initialLeft = elRect.left - boundary.left\n\t\t\t\t\tstate.initialTop = elRect.top - boundary.top\n\t\t\t\t\tstate.boundaryWidth = boundary.width\n\t\t\t\t\tstate.boundaryHeight = boundary.height\n\t\t\t\t\tstate.elWidth = elRect.width\n\t\t\t\t\tstate.elHeight = elRect.height\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add drag class\n\t\t\tel.classList.add('v-draggable--dragging')\n\n\t\t\t// Create move and end handlers\n\t\t\tstate.moveHandler = (moveEvent: MouseEvent | TouchEvent) => {\n\t\t\t\tif (!state.isDragging) return\n\n\t\t\t\tconst { clientX: moveX, clientY: moveY } = getClientCoords(moveEvent)\n\t\t\t\tlet deltaX = moveX - state.startX,\n\t\t\t\t\tdeltaY = moveY - state.startY\n\n\t\t\t\t// Apply axis constraint\n\t\t\t\tif (state.options.axis === 'x') {\n\t\t\t\t\tdeltaY = 0\n\t\t\t\t} else if (state.options.axis === 'y') {\n\t\t\t\t\tdeltaX = 0\n\t\t\t\t}\n\n\t\t\t\t// Apply grid snapping\n\t\t\t\tif (state.options.grid) {\n\t\t\t\t\tdeltaX = Math.round(deltaX / state.options.grid[0]) * state.options.grid[0]\n\t\t\t\t\tdeltaY = Math.round(deltaY / state.options.grid[1]) * state.options.grid[1]\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line one-var\n\t\t\t\tlet newX = state.offsetX + deltaX,\n\t\t\t\t\tnewY = state.offsetY + deltaY\n\n\t\t\t\t// Apply boundary constraints\n\t\t\t\tif (state.options.constrain || state.options.boundary) {\n\t\t\t\t\tconst newLeft = state.initialLeft + deltaX\n\t\t\t\t\tconst newTop = state.initialTop + deltaY\n\t\t\t\t\tconst maxLeft = state.boundaryWidth - state.elWidth\n\t\t\t\t\tconst maxTop = state.boundaryHeight - state.elHeight\n\n\t\t\t\t\tconst constrainedLeft = Math.max(0, Math.min(newLeft, maxLeft))\n\t\t\t\t\tconst constrainedTop = Math.max(0, Math.min(newTop, maxTop))\n\n\t\t\t\t\tnewX = state.offsetX + (constrainedLeft - state.initialLeft)\n\t\t\t\t\tnewY = state.offsetY + (constrainedTop - state.initialTop)\n\t\t\t\t}\n\n\t\t\t\t// Apply transform\n\t\t\t\tel.style.transform = `translate(${newX}px, ${newY}px)`\n\n\t\t\t\t// Call callback\n\t\t\t\tstate.options.onDrag?.({ x: newX, y: newY }, moveEvent)\n\t\t\t}\n\n\t\t\tstate.endHandler = () => {\n\t\t\t\tif (!state.isDragging) return\n\n\t\t\t\tstate.isDragging = false\n\t\t\t\tel.classList.remove('v-draggable--dragging')\n\n\t\t\t\t// Remove event listeners\n\t\t\t\tif (state.moveHandler) {\n\t\t\t\t\tdocument.removeEventListener('mousemove', state.moveHandler)\n\t\t\t\t\tdocument.removeEventListener('touchmove', state.moveHandler)\n\t\t\t\t}\n\t\t\t\tif (state.endHandler) {\n\t\t\t\t\tdocument.removeEventListener('mouseup', state.endHandler)\n\t\t\t\t\tdocument.removeEventListener('touchend', state.endHandler)\n\t\t\t\t}\n\n\t\t\t\t// Get final position\n\t\t\t\tconst { x: finalX, y: finalY } = parseTranslate(el.style.transform)\n\t\t\t\tstate.options.onEnd?.({ x: finalX, y: finalY }, new MouseEvent('mouseup'))\n\t\t\t}\n\n\t\t\t// Add move and end listeners\n\t\t\tdocument.addEventListener('mousemove', state.moveHandler)\n\t\t\tdocument.addEventListener('touchmove', state.moveHandler, { passive: false })\n\t\t\tdocument.addEventListener('mouseup', state.endHandler)\n\t\t\tdocument.addEventListener('touchend', state.endHandler)\n\n\t\t\t// Call start callback\n\t\t\tstate.options.onStart?.({ x: state.offsetX, y: state.offsetY }, e)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: DraggableState | undefined = (el as any).__draggable\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\t// Update handle element\n\t\tif (state.options.handle) {\n\t\t\tstate.handleEl = el.querySelector(state.options.handle)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: DraggableState | undefined = (el as any).__draggable\n\t\tif (!state) return\n\n\t\t// Remove event listeners\n\t\tif (state.moveHandler) {\n\t\t\tdocument.removeEventListener('mousemove', state.moveHandler)\n\t\t\tdocument.removeEventListener('touchmove', state.moveHandler)\n\t\t}\n\t\tif (state.endHandler) {\n\t\t\tdocument.removeEventListener('mouseup', state.endHandler)\n\t\t\tdocument.removeEventListener('touchend', state.endHandler)\n\t\t}\n\n\t\tdelete (el as any).__draggable\n\t},\n})\n\nexport default vDraggable\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Ellipsis directive options\n */\nexport interface EllipsisOptions {\n\t/**\n\t * Number of lines to show before truncating\n\t * @default 1\n\t */\n\tlines?: number\n\n\t/**\n\t * Custom ellipsis string\n\t * @default '...'\n\t */\n\tellipsis?: string\n\n\t/**\n\t * Whether to expand on click\n\t * @default false\n\t */\n\texpandable?: boolean\n\n\t/**\n\t * Title attribute behavior\n\t * - 'auto': Show full text as title only when truncated\n\t * - 'always': Always show full text as title\n\t * - 'none': Don't show title\n\t * @default 'auto'\n\t */\n\ttitleBehavior?: 'auto' | 'always' | 'none'\n}\n\n/**\n * Directive binding value type\n */\nexport type EllipsisBinding = number | EllipsisOptions\n\n/**\n * Element state storage\n */\ninterface EllipsisState {\n\toptions: EllipsisOptions\n\toriginalText: string\n\tclickHandler: (() => void) | null\n\texpanded: boolean\n}\n\n/**\n * v-ellipsis directive\n *\n * Truncates text with ellipsis, supports single and multi-line truncation.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Single line ellipsis -->\n * <p v-ellipsis>Long text here...</p>\n *\n * <!-- Multi-line ellipsis (3 lines) -->\n * <p v-ellipsis=\"3\">Long text here...</p>\n *\n * <!-- With options -->\n * <p v-ellipsis=\"{ lines: 2, expandable: true }\">\n * Click to expand long text...\n * </p>\n * </template>\n * ```\n */\nexport const vEllipsis = defineDirective<EllipsisBinding, HTMLElement>({\n\tname: 'ellipsis',\n\tssr: true,\n\tdefaults: {\n\t\tlines: 1,\n\t\tellipsis: '...',\n\t\texpandable: false,\n\t\ttitleBehavior: 'auto',\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tapplyEllipsis(el, options)\n\n\t\tconst state: EllipsisState = {\n\t\t\toptions,\n\t\t\toriginalText: el.textContent || '',\n\t\t\tclickHandler: null,\n\t\t\texpanded: false,\n\t\t}\n\n\t\t// Handle expandable\n\t\tif (options.expandable) {\n\t\t\tconst handler = (): void => {\n\t\t\t\tif (state.expanded) {\n\t\t\t\t\t// Collapse\n\t\t\t\t\tapplyEllipsis(el, options)\n\t\t\t\t\tstate.expanded = false\n\t\t\t\t} else {\n\t\t\t\t\t// Expand\n\t\t\t\t\tel.textContent = state.originalText\n\t\t\t\t\tel.style.webkitLineClamp = ''\n\t\t\t\t\tel.style.display = ''\n\t\t\t\t\tel.style.overflow = ''\n\t\t\t\t\tel.style.cursor = ''\n\t\t\t\t\tstate.expanded = true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tel.addEventListener('click', handler)\n\t\t\tel.style.cursor = 'pointer'\n\t\t\tstate.clickHandler = handler\n\t\t}\n\n\t\t// Handle title\n\t\tif (options.titleBehavior === 'always') {\n\t\t\tel.title = state.originalText\n\t\t} else if (options.titleBehavior === 'auto') {\n\t\t\t// Check if text is actually truncated\n\t\t\tif (isTextTruncated(el)) {\n\t\t\t\tel.title = state.originalText\n\t\t\t}\n\t\t}\n\n\t\t;(el as any).__ellipsis = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: EllipsisState = (el as any).__ellipsis\n\n\t\tif (!state) {\n\t\t\tconst options = normalizeOptions(binding.value)\n\t\t\tapplyEllipsis(el, options)\n\t\t\treturn\n\t\t}\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst textChanged = el.textContent !== state.originalText\n\n\t\tif (textChanged) {\n\t\t\tstate.originalText = el.textContent || ''\n\t\t\tstate.expanded = false\n\t\t}\n\n\t\t// Update click handler if expandable changed\n\t\tif (state.options.expandable !== newOptions.expandable) {\n\t\t\tif (state.clickHandler) {\n\t\t\t\tel.removeEventListener('click', state.clickHandler)\n\t\t\t\tstate.clickHandler = null\n\t\t\t}\n\n\t\t\tif (newOptions.expandable) {\n\t\t\t\tconst handler = (): void => {\n\t\t\t\t\tif (state.expanded) {\n\t\t\t\t\t\tapplyEllipsis(el, newOptions)\n\t\t\t\t\t\tstate.expanded = false\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel.textContent = state.originalText\n\t\t\t\t\t\tel.style.webkitLineClamp = ''\n\t\t\t\t\t\tel.style.display = ''\n\t\t\t\t\t\tel.style.overflow = ''\n\t\t\t\t\t\tstate.expanded = true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tel.addEventListener('click', handler)\n\t\t\t\tel.style.cursor = 'pointer'\n\t\t\t\tstate.clickHandler = handler\n\t\t\t} else {\n\t\t\t\tel.style.cursor = ''\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\n\t\t// Reapply ellipsis if not expanded\n\t\tif (!state.expanded) {\n\t\t\tapplyEllipsis(el, newOptions)\n\t\t}\n\n\t\t// Update title\n\t\tif (newOptions.titleBehavior === 'always') {\n\t\t\tel.title = state.originalText\n\t\t} else if (newOptions.titleBehavior === 'auto') {\n\t\t\tel.title = isTextTruncated(el) ? state.originalText : ''\n\t\t} else {\n\t\t\tel.removeAttribute('title')\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: EllipsisState | undefined = (el as any).__ellipsis\n\n\t\tif (!state) return\n\n\t\tif (state.clickHandler) {\n\t\t\tel.removeEventListener('click', state.clickHandler)\n\t\t}\n\n\t\t// Clean up styles\n\t\tel.style.removeProperty('-webkit-line-clamp')\n\t\tel.style.removeProperty('-webkit-box-orient')\n\t\tel.style.removeProperty('display')\n\t\tel.style.removeProperty('overflow')\n\t\tel.style.removeProperty('text-overflow')\n\t\tel.style.removeProperty('white-space')\n\t\tel.style.removeProperty('cursor')\n\n\t\tdelete (el as any).__ellipsis\n\t},\n})\n\n/**\n * Apply ellipsis styles to element\n */\nfunction applyEllipsis(el: HTMLElement, options: EllipsisOptions): void {\n\tconst lines = options.lines || 1\n\n\tif (lines === 1) {\n\t\t// Single line ellipsis\n\t\tel.style.overflow = 'hidden'\n\t\tel.style.textOverflow = 'ellipsis'\n\t\tel.style.whiteSpace = 'nowrap'\n\t} else {\n\t\t// Multi-line ellipsis\n\t\tel.style.display = '-webkit-box'\n\t\tel.style.overflow = 'hidden'\n\t\tel.style.webkitBoxOrient = 'vertical'\n\t\tel.style.webkitLineClamp = String(lines)\n\t}\n}\n\n/**\n * Check if text is truncated\n */\nfunction isTextTruncated(el: HTMLElement): boolean {\n\treturn el.scrollWidth > el.clientWidth || el.scrollHeight > el.clientHeight\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: EllipsisBinding | undefined): EllipsisOptions {\n\tif (typeof binding === 'number') {\n\t\treturn {\n\t\t\tlines: binding,\n\t\t\tellipsis: '...',\n\t\t\texpandable: false,\n\t\t\ttitleBehavior: 'auto',\n\t\t}\n\t}\n\n\treturn {\n\t\tlines: binding?.lines ?? 1,\n\t\tellipsis: binding?.ellipsis ?? '...',\n\t\texpandable: binding?.expandable ?? false,\n\t\ttitleBehavior: binding?.titleBehavior ?? 'auto',\n\t}\n}\n\nexport default vEllipsis\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Emoji directive options\n */\nexport interface EmojiOptions {\n\t/**\n\t * Whether to strip emoji from input\n\t * @default true\n\t */\n\tstrip?: boolean\n\n\t/**\n\t * Whether to allow specific emojis (array of emoji strings)\n\t */\n\tallowList?: string[]\n\n\t/**\n\t * Whether to block specific emojis (array of emoji strings)\n\t */\n\tblockList?: string[]\n\n\t/**\n\t * Custom emoji pattern (regex string)\n\t */\n\tpattern?: string\n\n\t/**\n\t * Replacement character for stripped emojis\n\t * @default ''\n\t */\n\treplacement?: string\n\n\t/**\n\t * Callback when emoji is detected\n\t */\n\tonEmoji?: (emoji: string, position: number) => void\n\n\t/**\n\t * Callback when emoji is stripped\n\t */\n\tonStrip?: (original: string, cleaned: string) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type EmojiBinding = boolean | EmojiOptions\n\n/**\n * Element state storage\n */\ninterface EmojiState {\n\toptions: EmojiOptions\n\tinputHandler: (e: Event) => void\n\tpasteHandler: (e: ClipboardEvent) => void\n}\n\n/**\n * Common emoji pattern\n */\nconst EMOJI_PATTERN = /[\\p{Emoji_Presentation}\\p{Extended_Pictographic}]/gu\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: EmojiBinding | undefined): EmojiOptions {\n\tif (binding === false) {\n\t\treturn { strip: false }\n\t}\n\n\tif (binding === true || binding === undefined) {\n\t\treturn { strip: true }\n\t}\n\n\treturn {\n\t\tstrip: true,\n\t\treplacement: '',\n\t\t...binding,\n\t}\n}\n\n/**\n * Get emoji pattern based on options\n */\nfunction getEmojiPattern(options: EmojiOptions): RegExp {\n\tif (options.pattern) {\n\t\treturn new RegExp(options.pattern, 'gu')\n\t}\n\n\tif (options.blockList && options.blockList.length > 0) {\n\t\t// Build pattern for specific blocked emojis\n\t\tconst escaped = options.blockList.map(e => e.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|')\n\t\treturn new RegExp(escaped, 'gu')\n\t}\n\n\tif (options.allowList && options.allowList.length > 0) {\n\t\t// Build negative pattern for allowed emojis\n\t\t// This is more complex - we strip all emojis except those in allowList\n\t\treturn EMOJI_PATTERN\n\t}\n\n\treturn EMOJI_PATTERN\n}\n\n/**\n * Check if emoji is in allow list\n */\nfunction isAllowed(char: string, allowList?: string[]): boolean {\n\tif (!allowList || allowList.length === 0) {\n\t\treturn false\n\t}\n\treturn allowList.includes(char)\n}\n\n/**\n * Strip emojis from text\n */\nfunction stripEmojis(text: string, options: EmojiOptions): string {\n\tconst pattern = getEmojiPattern(options)\n\tconst replacement = options.replacement || ''\n\tlet result = text\n\n\t// If we have an allow list, we need to process differently\n\tif (options.allowList && options.allowList.length > 0) {\n\t\tresult = text.replace(pattern, match => {\n\t\t\tif (isAllowed(match, options.allowList)) {\n\t\t\t\treturn match\n\t\t\t}\n\t\t\toptions.onEmoji?.(match, text.indexOf(match))\n\t\t\treturn replacement\n\t\t})\n\t} else {\n\t\tconst matches = text.match(pattern)\n\t\tif (matches) {\n\t\t\tmatches.forEach(match => {\n\t\t\t\toptions.onEmoji?.(match, text.indexOf(match))\n\t\t\t})\n\t\t}\n\t\tresult = text.replace(pattern, replacement)\n\t}\n\n\tif (result !== text) {\n\t\toptions.onStrip?.(text, result)\n\t}\n\n\treturn result\n}\n\n/**\n * v-emoji directive\n * Restrict or filter emoji input\n *\n * @example\n * ```vue\n * <template>\n * <!-- Strip all emojis -->\n * <input v-emoji type=\"text\" />\n *\n * <!-- Strip emojis with replacement -->\n * <input v-emoji=\"{ strip: true, replacement: '*' }\" type=\"text\" />\n *\n * <!-- Allow specific emojis -->\n * <input v-emoji=\"{ allowList: ['\uD83D\uDE0A', '\uD83D\uDC4D'] }\" type=\"text\" />\n *\n * <!-- Block specific emojis -->\n * <input v-emoji=\"{ blockList: ['\uD83D\uDEAB', '\u274C'] }\" type=\"text\" />\n * </template>\n * ```\n */\nexport const vEmoji = defineDirective<EmojiBinding, HTMLInputElement | HTMLTextAreaElement>({\n\tname: 'emoji',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!options.strip && !options.blockList?.length) return\n\n\t\tconst state: EmojiState = {\n\t\t\toptions,\n\t\t\tinputHandler: (e: Event) => {\n\t\t\t\tconst target = e.target as HTMLInputElement | HTMLTextAreaElement\n\t\t\t\tconst original = target.value\n\t\t\t\tconst cleaned = stripEmojis(original, state.options)\n\n\t\t\t\tif (cleaned !== original) {\n\t\t\t\t\t// Preserve cursor position\n\t\t\t\t\tconst start = target.selectionStart || 0\n\t\t\t\t\tconst end = target.selectionEnd || 0\n\n\t\t\t\t\ttarget.value = cleaned\n\n\t\t\t\t\t// Adjust cursor position if emojis were stripped\n\t\t\t\t\tconst diff = original.length - cleaned.length\n\t\t\t\t\ttarget.setSelectionRange(Math.max(0, start - diff), Math.max(0, end - diff))\n\n\t\t\t\t\t// Trigger input event for v-model\n\t\t\t\t\ttarget.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t}\n\t\t\t},\n\t\t\tpasteHandler: (e: ClipboardEvent) => {\n\t\t\t\tif (!state.options.strip) return\n\n\t\t\t\tconst pastedText = e.clipboardData?.getData('text')\n\t\t\t\tif (pastedText && EMOJI_PATTERN.test(pastedText)) {\n\t\t\t\t\te.preventDefault()\n\n\t\t\t\t\tconst cleaned = stripEmojis(pastedText, state.options)\n\t\t\t\t\tconst target = e.target as HTMLInputElement | HTMLTextAreaElement\n\n\t\t\t\t\t// Insert cleaned text\n\t\t\t\t\tconst start = target.selectionStart || 0\n\t\t\t\t\tconst end = target.selectionEnd || 0\n\t\t\t\t\tconst value = target.value\n\n\t\t\t\t\ttarget.value = value.substring(0, start) + cleaned + value.substring(end)\n\t\t\t\t\ttarget.setSelectionRange(start + cleaned.length, start + cleaned.length)\n\n\t\t\t\t\t// Trigger input event for v-model\n\t\t\t\t\ttarget.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t;(el as any).__emoji = state\n\n\t\ton(el, 'input', state.inputHandler)\n\t\ton(el, 'paste', state.pasteHandler as (e: Event) => void)\n\n\t\t// Process initial value\n\t\tif (el.value) {\n\t\t\tconst cleaned = stripEmojis(el.value, state.options)\n\t\t\tif (cleaned !== el.value) {\n\t\t\t\tel.value = cleaned\n\t\t\t}\n\t\t}\n\n\t\tel.classList.add('v-emoji')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: EmojiState = (el as any).__emoji\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: EmojiState = (el as any).__emoji\n\n\t\tif (!state) return\n\n\t\toff(el, 'input', state.inputHandler)\n\t\toff(el, 'paste', state.pasteHandler as (e: Event) => void)\n\t\tel.classList.remove('v-emoji')\n\n\t\tdelete (el as any).__emoji\n\t},\n})\n\nexport default vEmoji\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Export format type\n */\nexport type ExportFormat = 'csv' | 'json' | 'txt' | 'html'\n\n/**\n * Export directive options\n */\nexport interface ExportOptions {\n\t/**\n\t * Data to export\n\t */\n\tdata: any[] | object | string\n\n\t/**\n\t * Export format\n\t * @default 'csv'\n\t */\n\tformat?: ExportFormat\n\n\t/**\n\t * Filename (without extension)\n\t * @default 'export'\n\t */\n\tfilename?: string\n\n\t/**\n\t * Whether to include headers (for CSV)\n\t * @default true\n\t */\n\tincludeHeaders?: boolean\n\n\t/**\n\t * Custom delimiter for CSV\n\t * @default ','\n\t */\n\tdelimiter?: string\n\n\t/**\n\t * Columns to export (for array of objects)\n\t */\n\tcolumns?: string[]\n\n\t/**\n\t * Custom headers mapping\n\t */\n\theaders?: Record<string, string>\n\n\t/**\n\t * Callback before export\n\t */\n\tonBeforeExport?: () => boolean | void\n\n\t/**\n\t * Callback after export\n\t */\n\tonAfterExport?: () => 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 ExportBinding = ExportOptions | ExportOptions['data']\n\n/**\n * Element state storage\n */\ninterface ExportState {\n\toptions: ExportOptions\n\tclickHandler: () => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ExportBinding): ExportOptions {\n\tif (!binding || typeof binding === 'string' || Array.isArray(binding)) {\n\t\treturn { data: binding, format: 'csv', filename: 'export' }\n\t}\n\n\tconst opts = binding as ExportOptions\n\treturn {\n\t\tformat: 'csv',\n\t\tfilename: 'export',\n\t\tincludeHeaders: true,\n\t\tdelimiter: ',',\n\t\t...opts,\n\t\tdata: opts.data ?? [],\n\t}\n}\n\n/**\n * Convert data to CSV\n */\nfunction toCSV(data: any[], options: ExportOptions): string {\n\tif (!Array.isArray(data) || data.length === 0) {\n\t\treturn ''\n\t}\n\n\tconst delimiter = options.delimiter || ','\n\tconst columns = options.columns || Object.keys(data[0])\n\tconst headers = options.headers || {}\n\n\t// Build header row\n\tconst headerRow = options.includeHeaders ? `${columns.map(col => headers[col] || col).join(delimiter)}\\n` : ''\n\n\t// Build data rows\n\tconst dataRows = data\n\t\t.map(row =>\n\t\t\tcolumns\n\t\t\t\t.map(col => {\n\t\t\t\t\tconst value = row[col]\n\t\t\t\t\t// Escape quotes and wrap in quotes if contains delimiter or newline\n\t\t\t\t\tif (typeof value === 'string' && (value.includes(delimiter) || value.includes('\\n') || value.includes('\"'))) {\n\t\t\t\t\t\treturn `\"${value.replace(/\"/g, '\"\"')}\"`\n\t\t\t\t\t}\n\t\t\t\t\treturn value ?? ''\n\t\t\t\t})\n\t\t\t\t.join(delimiter),\n\t\t)\n\t\t.join('\\n')\n\n\treturn headerRow + dataRows\n}\n\n/**\n * Convert data to JSON\n */\nfunction toJSON(data: any): string {\n\treturn JSON.stringify(data, null, 2)\n}\n\n/**\n * Convert data to HTML table\n */\nfunction toHTML(data: any[], options: ExportOptions): string {\n\tif (!Array.isArray(data) || data.length === 0) {\n\t\treturn ''\n\t}\n\n\tconst columns = options.columns || Object.keys(data[0])\n\tconst headers = options.headers || {}\n\n\tlet html = '<table border=\"1\">\\n'\n\n\t// Build header\n\tif (options.includeHeaders) {\n\t\thtml += ' <thead>\\n <tr>\\n'\n\t\tfor (const col of columns) {\n\t\t\thtml += ` <th>${headers[col] || col}</th>\\n`\n\t\t}\n\t\thtml += ' </tr>\\n </thead>\\n'\n\t}\n\n\t// Build body\n\thtml += ' <tbody>\\n'\n\tfor (const row of data) {\n\t\thtml += ' <tr>\\n'\n\t\tfor (const col of columns) {\n\t\t\thtml += ` <td>${row[col] ?? ''}</td>\\n`\n\t\t}\n\t\thtml += ' </tr>\\n'\n\t}\n\thtml += ' </tbody>\\n</table>'\n\n\treturn html\n}\n\n/**\n * Download content as file\n */\nfunction downloadFile(content: string, filename: string, format: ExportFormat): void {\n\tconst mimeTypes: Record<ExportFormat, string> = {\n\t\tcsv: 'text/csv;charset=utf-8;',\n\t\tjson: 'application/json;charset=utf-8;',\n\t\ttxt: 'text/plain;charset=utf-8;',\n\t\thtml: 'text/html;charset=utf-8;',\n\t}\n\n\tconst blob = new Blob([content], { type: mimeTypes[format] })\n\tconst url = URL.createObjectURL(blob)\n\n\tconst link = document.createElement('a')\n\tlink.href = url\n\tlink.download = `${filename}.${format}`\n\n\tdocument.body.appendChild(link)\n\tlink.click()\n\tdocument.body.removeChild(link)\n\n\tURL.revokeObjectURL(url)\n}\n\n/**\n * Export data\n */\nfunction exportData(options: ExportOptions): void {\n\tconst { data, format = 'csv', filename = 'export' } = options\n\n\tlet content: string\n\n\tswitch (format) {\n\t\tcase 'json':\n\t\t\tcontent = toJSON(data)\n\t\t\tbreak\n\t\tcase 'html':\n\t\t\tcontent = toHTML(Array.isArray(data) ? data : [data], options)\n\t\t\tbreak\n\t\tcase 'txt':\n\t\t\tcontent = typeof data === 'string' ? data : JSON.stringify(data, null, 2)\n\t\t\tbreak\n\t\tcase 'csv':\n\t\tdefault:\n\t\t\tcontent = toCSV(Array.isArray(data) ? data : [data], options)\n\t\t\tbreak\n\t}\n\n\tdownloadFile(content, filename, format)\n}\n\n/**\n * v-export directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-export=\"exportData\">Export CSV</button>\n *\n * <button v-export=\"{ data: tableData, format: 'json', filename: 'my-data' }\">\n * Export JSON\n * </button>\n *\n * <button v-export=\"{\n * data: tableData,\n * format: 'csv',\n * columns: ['name', 'email'],\n * headers: { name: 'Name', email: 'Email Address' }\n * }\">\n * Export with custom columns\n * </button>\n * </template>\n *\n * <script setup>\n * const tableData = [\n * { name: 'John', email: 'john@example.com', age: 30 },\n * { name: 'Jane', email: 'jane@example.com', age: 25 }\n * ]\n * </script>\n * ```\n */\nexport const vExport = defineDirective<ExportBinding, HTMLElement>({\n\tname: 'export',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!isBrowser()) return\n\n\t\tconst state: ExportState = {\n\t\t\toptions,\n\t\t\tclickHandler: () => {\n\t\t\t\t// Check before export callback\n\t\t\t\tif (state.options.onBeforeExport?.() === false) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\texportData(state.options)\n\t\t\t\t\tstate.options.onAfterExport?.()\n\t\t\t\t} catch (error) {\n\t\t\t\t\tstate.options.onError?.(error as Error)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t;(el as any).__export = state\n\n\t\ton(el, 'click', state.clickHandler)\n\n\t\t// Add visual cue\n\t\tel.classList.add('v-export')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ExportState = (el as any).__export\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ExportState = (el as any).__export\n\n\t\tif (!state) return\n\n\t\toff(el, 'click', state.clickHandler)\n\t\tel.classList.remove('v-export')\n\n\t\tdelete (el as any).__export\n\t},\n})\n\nexport default vExport\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Fade animation direction\n */\nexport type FadeDirection = 'in' | 'out' | 'toggle'\n\n/**\n * Fade directive options\n */\nexport interface FadeOptions {\n\t/**\n\t * Fade direction\n\t * @default 'toggle'\n\t */\n\tdirection?: FadeDirection\n\n\t/**\n\t * Whether element is visible initially\n\t * @default true\n\t */\n\tvisible?: boolean\n\n\t/**\n\t * Animation duration in milliseconds\n\t * @default 300\n\t */\n\tduration?: number\n\n\t/**\n\t * Animation delay in milliseconds\n\t * @default 0\n\t */\n\tdelay?: number\n\n\t/**\n\t * CSS easing function\n\t * @default 'ease'\n\t */\n\teasing?: string\n\n\t/**\n\t * Minimum opacity when fading out\n\t * @default 0\n\t */\n\tminOpacity?: number\n\n\t/**\n\t * Maximum opacity when fading in\n\t * @default 1\n\t */\n\tmaxOpacity?: number\n\n\t/**\n\t * Callback when fade starts\n\t */\n\tonStart?: (direction: 'in' | 'out') => void\n\n\t/**\n\t * Callback when fade completes\n\t */\n\tonComplete?: (direction: 'in' | 'out') => void\n}\n\n/**\n * Directive binding value type\n */\nexport type FadeBinding = boolean | FadeDirection | FadeOptions\n\n/**\n * Element state storage\n */\ninterface FadeState {\n\toptions: FadeOptions\n\tcurrentOpacity: number\n\tanimationFrame: number | null\n\tisAnimating: boolean\n}\n\n/**\n * Default options\n */\nconst defaultOptions: FadeOptions = {\n\tdirection: 'toggle',\n\tvisible: true,\n\tduration: 300,\n\tdelay: 0,\n\teasing: 'ease',\n\tminOpacity: 0,\n\tmaxOpacity: 1,\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: FadeBinding | undefined): FadeOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { ...defaultOptions, visible: binding }\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { ...defaultOptions, direction: binding as FadeDirection }\n\t}\n\n\treturn { ...defaultOptions, ...binding }\n}\n\n/**\n * Parse easing to timing function\n */\nfunction getTimingFunction(easing: string): string {\n\tconst easingMap: Record<string, string> = {\n\t\tease: 'ease',\n\t\t'ease-in': 'ease-in',\n\t\t'ease-out': 'ease-out',\n\t\t'ease-in-out': 'ease-in-out',\n\t\tlinear: 'linear',\n\t}\n\n\treturn easingMap[easing] || easing\n}\n\n/**\n * v-fade directive\n * Fade in/out transition effect\n *\n * @example\n * ```vue\n * <template>\n * <!-- Toggle visibility with fade -->\n * <div v-fade=\"isVisible\">Fade content</div>\n *\n * <!-- Fade in only -->\n * <div v-fade=\"'in'\">Fade in</div>\n *\n * <!-- Fade out only -->\n * <div v-fade=\"'out'\">Fade out</div>\n *\n * <!-- With options -->\n * <div v-fade=\"{\n * visible: isVisible,\n * duration: 500,\n * easing: 'ease-in-out',\n * onComplete: () => console.log('Fade complete')\n * }\">\n * Content\n * </div>\n * </template>\n * ```\n */\nexport const vFade = defineDirective<FadeBinding, HTMLElement>({\n\tname: 'fade',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: FadeState = {\n\t\t\toptions,\n\t\t\tcurrentOpacity: options.visible ? options.maxOpacity || 1 : options.minOpacity || 0,\n\t\t\tanimationFrame: null,\n\t\t\tisAnimating: false,\n\t\t}\n\n\t\t;(el as any).__fade = state\n\n\t\t// Set transition style\n\t\tel.style.transition = `opacity ${options.duration}ms ${getTimingFunction(options.easing || 'ease')} ${options.delay}ms`\n\n\t\t// Handle direction on mount\n\t\tif (options.direction === 'in') {\n\t\t\t// Start invisible, then fade in\n\t\t\tel.style.opacity = String(options.minOpacity || 0)\n\t\t\tel.style.display = ''\n\t\t\t// Force reflow\n\t\t\tString(el.offsetHeight)\n\t\t\t// Fade in\n\t\t\tstate.animationFrame = requestAnimationFrame(() => {\n\t\t\t\tstate.animationFrame = null\n\t\t\t\tel.style.opacity = String(options.maxOpacity || 1)\n\t\t\t\tstate.currentOpacity = options.maxOpacity || 1\n\t\t\t})\n\t\t} else if (options.direction === 'out') {\n\t\t\t// Start visible, then fade out\n\t\t\tel.style.opacity = String(options.maxOpacity || 1)\n\t\t\tel.style.display = ''\n\t\t\t// Fade out\n\t\t\tstate.animationFrame = requestAnimationFrame(() => {\n\t\t\t\tstate.animationFrame = null\n\t\t\t\tel.style.opacity = String(options.minOpacity || 0)\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tel.style.display = 'none'\n\t\t\t\t}, (options.duration || 300) + (options.delay || 0))\n\t\t\t})\n\t\t} else {\n\t\t\t// Toggle mode: set initial state based on visible\n\t\t\tel.style.opacity = String(state.currentOpacity)\n\t\t\tif (!options.visible) {\n\t\t\t\tel.style.display = 'none'\n\t\t\t}\n\t\t}\n\n\t\tel.classList.add('v-fade')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: FadeState = (el as any).__fade\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst isVisible = newOptions.visible !== false\n\n\t\t// Store old visible state before updating options\n\t\tconst oldVisible = state.options.visible\n\n\t\tstate.options = newOptions\n\n\t\t// Update transition\n\t\tel.style.transition = `opacity ${newOptions.duration}ms ${getTimingFunction(newOptions.easing || 'ease')} ${newOptions.delay}ms`\n\n\t\t// Only animate if visible state changed\n\t\tif (oldVisible !== newOptions.visible) {\n\t\t\tanimate(el, state, isVisible ? 'in' : 'out')\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: FadeState = (el as any).__fade\n\n\t\tif (!state) return\n\n\t\tif (state.animationFrame) {\n\t\t\tcancelAnimationFrame(state.animationFrame)\n\t\t}\n\n\t\tel.classList.remove('v-fade')\n\n\t\tdelete (el as any).__fade\n\t},\n})\n\n/**\n * Animate fade\n */\nfunction animate(el: HTMLElement, state: FadeState, direction: 'in' | 'out'): void {\n\tif (state.isAnimating) return\n\n\tconst options = state.options\n\tstate.isAnimating = true\n\n\toptions.onStart?.(direction)\n\n\tif (direction === 'in') {\n\t\t// Show element before fade in\n\t\tel.style.display = ''\n\t\tel.style.opacity = String(options.minOpacity || 0)\n\n\t\t// Force reflow\n\t\tString(el.offsetHeight)\n\n\t\t// Fade in\n\t\trequestAnimationFrame(() => {\n\t\t\tel.style.opacity = String(options.maxOpacity || 1)\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tstate.isAnimating = false\n\t\t\t\tstate.currentOpacity = options.maxOpacity || 1\n\t\t\t\toptions.onComplete?.(direction)\n\t\t\t}, (options.duration || 300) + (options.delay || 0))\n\t\t})\n\t} else {\n\t\t// Fade out\n\t\tel.style.opacity = String(options.minOpacity || 0)\n\n\t\tsetTimeout(() => {\n\t\t\tstate.isAnimating = false\n\t\t\tstate.currentOpacity = options.minOpacity || 0\n\t\t\tel.style.display = 'none'\n\t\t\toptions.onComplete?.(direction)\n\t\t}, (options.duration || 300) + (options.delay || 0))\n\t}\n}\n\nexport default vFade\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Focus directive options\n */\nexport interface FocusOptions {\n\t/**\n\t * Whether to auto focus\n\t * @default true\n\t */\n\tfocus?: boolean\n\n\t/**\n\t * Whether to refocus when binding value changes\n\t * @default false\n\t */\n\trefocus?: boolean\n\n\t/**\n\t * Callback when focused\n\t */\n\tonFocus?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when blurred\n\t */\n\tonBlur?: (el: HTMLElement) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type FocusBinding = boolean | FocusOptions\n\n/**\n * Element state storage\n */\ninterface FocusState {\n\toptions: FocusOptions\n\thandleFocus: () => void\n\thandleBlur: () => void\n\tlastValue: FocusBinding\n}\n\nconst FOCUSABLE_TAGS = new Set(['input', 'textarea', 'select', 'button'])\n\n/**\n * Compare two values for equality (supports primitive types and shallow object comparison)\n */\nfunction isEqual(a: unknown, b: unknown): boolean {\n\tif (a === b) return true\n\tif (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n\tconst objA = a as Record<string, unknown>\n\tconst objB = b as Record<string, unknown>\n\tconst keysA = Object.keys(objA)\n\tconst keysB = Object.keys(objB)\n\n\tif (keysA.length !== keysB.length) return false\n\n\treturn keysA.every(key => objA[key] === objB[key])\n}\n\n/**\n * v-focus directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-focus />\n * <input v-focus=\"{ focus: true, refocus: true }\" />\n * </template>\n * ```\n */\nexport const vFocus = defineDirective<FocusBinding, HTMLElement>({\n\tname: 'focus',\n\tssr: true, // SSR safe - will skip focus on server\n\tdefaults: {\n\t\tfocus: true,\n\t\trefocus: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!options.focus || !isFocusable(el)) {\n\t\t\tif (options.focus) {\n\t\t\t\tconsole.warn('[Directix] v-focus: Element is not focusable')\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tconst handleFocus = (): void => options.onFocus?.(el)\n\t\tconst handleBlur = (): void => options.onBlur?.(el)\n\n\t\tel.addEventListener('focus', handleFocus)\n\t\tel.addEventListener('blur', handleBlur)\n\n\t\t;(el as any).__focus = {\n\t\t\toptions,\n\t\t\thandleFocus,\n\t\t\thandleBlur,\n\t\t\tlastValue: binding.value,\n\t\t} as FocusState\n\n\t\tel.focus()\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: FocusState | undefined = (el as any).__focus\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Update event listeners only when callbacks change\n\t\tif (newOptions.onFocus !== state.options.onFocus) {\n\t\t\tel.removeEventListener('focus', state.handleFocus)\n\t\t\tstate.handleFocus = () => newOptions.onFocus?.(el)\n\t\t\tel.addEventListener('focus', state.handleFocus)\n\t\t}\n\n\t\tif (newOptions.onBlur !== state.options.onBlur) {\n\t\t\tel.removeEventListener('blur', state.handleBlur)\n\t\t\tstate.handleBlur = () => newOptions.onBlur?.(el)\n\t\t\tel.addEventListener('blur', state.handleBlur)\n\t\t}\n\n\t\t// Check if value actually changed\n\t\tconst valueChanged = !isEqual(binding.value, state.lastValue)\n\n\t\t// Refocus when value changes and refocus is enabled\n\t\tif (newOptions.refocus && newOptions.focus && valueChanged) {\n\t\t\tel.focus()\n\t\t}\n\n\t\tstate.options = newOptions\n\t\tstate.lastValue = binding.value\n\t},\n\n\tunmounted(el) {\n\t\tconst state: FocusState | undefined = (el as any).__focus\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('focus', state.handleFocus)\n\t\tel.removeEventListener('blur', state.handleBlur)\n\t\tdelete (el as any).__focus\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: FocusBinding | undefined): FocusOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { focus: binding, refocus: false }\n\t}\n\n\treturn {\n\t\tfocus: true,\n\t\trefocus: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if element is focusable\n */\nfunction isFocusable(el: HTMLElement): boolean {\n\tif (!isBrowser()) return false\n\n\tconst tagName = el.tagName.toLowerCase()\n\n\t// Form elements\n\tif (FOCUSABLE_TAGS.has(tagName)) {\n\t\treturn !(el as HTMLInputElement).disabled\n\t}\n\n\t// Contenteditable elements\n\tif (el.isContentEditable) return true\n\n\t// Elements with tabindex\n\tconst tabindex = el.getAttribute('tabindex')\n\n\tif (tabindex != null) return tabindex !== '-1'\n\n\t// Link elements\n\tif (tagName === 'a' || tagName === 'area') {\n\t\treturn el.hasAttribute('href')\n\t}\n\n\treturn false\n}\n\nexport default vFocus\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Fullscreen directive options\n */\nexport interface FullscreenOptions {\n\t/**\n\t * Whether to enter fullscreen mode initially\n\t * @default false\n\t */\n\tinitialState?: boolean\n\n\t/**\n\t * Custom class when in fullscreen mode\n\t */\n\tfullscreenClass?: string\n\n\t/**\n\t * Callback when entering fullscreen\n\t */\n\tonEnter?: () => void\n\n\t/**\n\t * Callback when exiting fullscreen\n\t */\n\tonExit?: () => void\n\n\t/**\n\t * Callback when fullscreen state changes\n\t */\n\tonChange?: (isFullscreen: boolean) => void\n\n\t/**\n\t * Key to toggle fullscreen (e.g., 'Escape', 'f')\n\t * Set to false to disable keyboard toggle\n\t * @default 'Escape'\n\t */\n\ttoggleKey?: string | false\n}\n\n/**\n * Directive binding value type\n */\nexport type FullscreenBinding = boolean | FullscreenOptions\n\n/**\n * Element state storage\n */\ninterface FullscreenState {\n\toptions: FullscreenOptions\n\tclickHandler: () => void\n\tkeydownHandler: (e: KeyboardEvent) => void\n\tchangeHandler: () => void\n\tisFullscreen: boolean\n}\n\n/**\n * Check if fullscreen is supported\n */\nfunction isFullscreenSupported(): boolean {\n\treturn !!(\n\t\tdocument.fullscreenEnabled\n\t\t|| (document as any).webkitFullscreenEnabled\n\t\t|| (document as any).mozFullScreenEnabled\n\t\t|| (document as any).msFullscreenEnabled\n\t)\n}\n\n/**\n * Get fullscreen element\n */\nfunction getFullscreenElement(): Element | null {\n\treturn (\n\t\tdocument.fullscreenElement\n\t\t|| (document as any).webkitFullscreenElement\n\t\t|| (document as any).mozFullScreenElement\n\t\t|| (document as any).msFullscreenElement\n\t\t|| null\n\t)\n}\n\n/**\n * Request fullscreen\n */\nasync function requestFullscreen(el: HTMLElement): Promise<void> {\n\tif (el.requestFullscreen) {\n\t\tawait el.requestFullscreen()\n\t} else if ((el as any).webkitRequestFullscreen) {\n\t\tawait (el as any).webkitRequestFullscreen()\n\t} else if ((el as any).mozRequestFullScreen) {\n\t\tawait (el as any).mozRequestFullScreen()\n\t} else if ((el as any).msRequestFullscreen) {\n\t\tawait (el as any).msRequestFullscreen()\n\t}\n}\n\n/**\n * Exit fullscreen\n */\nasync function exitFullscreen(): Promise<void> {\n\tif (document.exitFullscreen) {\n\t\tawait document.exitFullscreen()\n\t} else if ((document as any).webkitExitFullscreen) {\n\t\tawait (document as any).webkitExitFullscreen()\n\t} else if ((document as any).mozCancelFullScreen) {\n\t\tawait (document as any).mozCancelFullScreen()\n\t} else if ((document as any).msExitFullscreen) {\n\t\tawait (document as any).msExitFullscreen()\n\t}\n}\n\n/**\n * Toggle fullscreen\n */\nasync function toggleFullscreen(el: HTMLElement, state: FullscreenState): Promise<void> {\n\tif (state.isFullscreen) {\n\t\tawait exitFullscreen()\n\t} else {\n\t\tawait requestFullscreen(el)\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: FullscreenBinding | undefined): FullscreenOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { initialState: binding }\n\t}\n\n\treturn {\n\t\tinitialState: false,\n\t\ttoggleKey: 'Escape',\n\t\t...binding,\n\t}\n}\n\n/**\n * v-fullscreen directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-fullscreen>\n * Content to show in fullscreen\n * <button @click=\"toggleFullscreen\">Toggle</button>\n * </div>\n *\n * <div v-fullscreen=\"{ fullscreenClass: 'my-fullscreen' }\">\n * Custom fullscreen class\n * </div>\n * </template>\n * ```\n */\nexport const vFullscreen = defineDirective<FullscreenBinding, HTMLElement>({\n\tname: 'fullscreen',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!isBrowser() || !isFullscreenSupported()) return\n\n\t\tconst state: FullscreenState = {\n\t\t\toptions,\n\t\t\tclickHandler: () => toggleFullscreen(el, state),\n\t\t\tkeydownHandler: (e: KeyboardEvent) => {\n\t\t\t\tif (state.options.toggleKey === false) return\n\n\t\t\t\tif (e.key === state.options.toggleKey && state.isFullscreen) {\n\t\t\t\t\texitFullscreen()\n\t\t\t\t}\n\t\t\t},\n\t\t\tchangeHandler: () => {\n\t\t\t\tconst wasFullscreen = state.isFullscreen\n\t\t\t\tstate.isFullscreen = getFullscreenElement() === el\n\n\t\t\t\tif (wasFullscreen !== state.isFullscreen) {\n\t\t\t\t\tif (state.isFullscreen) {\n\t\t\t\t\t\tel.classList.add(state.options.fullscreenClass || 'v-fullscreen--active')\n\t\t\t\t\t\tstate.options.onEnter?.()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel.classList.remove(state.options.fullscreenClass || 'v-fullscreen--active')\n\t\t\t\t\t\tstate.options.onExit?.()\n\t\t\t\t\t}\n\t\t\t\t\tstate.options.onChange?.(state.isFullscreen)\n\t\t\t\t}\n\t\t\t},\n\t\t\tisFullscreen: false,\n\t\t}\n\n\t\t;(el as any).__fullscreen = state\n\n\t\t// Listen for fullscreen changes\n\t\tdocument.addEventListener('fullscreenchange', state.changeHandler)\n\t\tdocument.addEventListener('webkitfullscreenchange', state.changeHandler)\n\t\tdocument.addEventListener('mozfullscreenchange', state.changeHandler)\n\t\tdocument.addEventListener('MSFullscreenChange', state.changeHandler)\n\n\t\t// Add keyboard handler\n\t\tif (options.toggleKey !== false) {\n\t\t\tdocument.addEventListener('keydown', state.keydownHandler)\n\t\t}\n\n\t\t// Add toggle method to element\n\t\t;(el as any).toggleFullscreen = state.clickHandler\n\n\t\t// Enter fullscreen if initialState is true\n\t\tif (options.initialState) {\n\t\t\trequestFullscreen(el)\n\t\t}\n\n\t\t// Add base class\n\t\tel.classList.add('v-fullscreen')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: FullscreenState = (el as any).__fullscreen\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: FullscreenState = (el as any).__fullscreen\n\n\t\tif (!state) return\n\n\t\t// Exit fullscreen if currently active\n\t\tif (state.isFullscreen) {\n\t\t\texitFullscreen()\n\t\t}\n\n\t\t// Remove event listeners\n\t\tdocument.removeEventListener('fullscreenchange', state.changeHandler)\n\t\tdocument.removeEventListener('webkitfullscreenchange', state.changeHandler)\n\t\tdocument.removeEventListener('mozfullscreenchange', state.changeHandler)\n\t\tdocument.removeEventListener('MSFullscreenChange', state.changeHandler)\n\n\t\tif (state.options.toggleKey !== false) {\n\t\t\tdocument.removeEventListener('keydown', state.keydownHandler)\n\t\t}\n\n\t\tel.classList.remove('v-fullscreen')\n\t\tel.classList.remove(state.options.fullscreenClass || 'v-fullscreen--active')\n\n\t\tdelete (el as any).__fullscreen\n\t\tdelete (el as any).toggleFullscreen\n\t},\n})\n\nexport default vFullscreen\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Highlight directive options\n */\nexport interface HighlightOptions {\n\t/**\n\t * Keywords to highlight (string or array of strings)\n\t */\n\tkeywords: string | string[]\n\n\t/**\n\t * Highlight style class name\n\t * @default 'v-highlight'\n\t */\n\tclassName?: string\n\n\t/**\n\t * Inline style for highlighted text\n\t */\n\tstyle?: string\n\n\t/**\n\t * Whether to match case\n\t * @default false\n\t */\n\tcaseSensitive?: boolean\n\n\t/**\n\t * Whether to match whole words only\n\t * @default false\n\t */\n\twholeWord?: boolean\n\n\t/**\n\t * Tag name for highlight wrapper\n\t * @default 'mark'\n\t */\n\ttag?: string\n\n\t/**\n\t * Callback when highlight is applied\n\t */\n\tonHighlight?: (count: number) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type HighlightBinding = string | string[] | HighlightOptions\n\n/**\n * Element state storage\n */\ninterface HighlightState {\n\toptions: HighlightOptions\n\toriginalContent: string\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: HighlightBinding): HighlightOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { keywords: binding }\n\t}\n\n\tif (Array.isArray(binding)) {\n\t\treturn { keywords: binding }\n\t}\n\n\treturn {\n\t\tclassName: 'v-highlight',\n\t\tcaseSensitive: false,\n\t\twholeWord: false,\n\t\ttag: 'mark',\n\t\t...binding,\n\t}\n}\n\n/**\n * Escape regex special characters\n */\nfunction escapeRegex(str: string): string {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * Highlight keywords in text\n */\nfunction highlightKeywords(text: string, options: HighlightOptions): string {\n\tconst keywords = Array.isArray(options.keywords) ? options.keywords : [options.keywords]\n\n\tif (keywords.length === 0 || !text) {\n\t\treturn text\n\t}\n\n\tconst caseSensitive = options.caseSensitive || false\n\tconst wholeWord = options.wholeWord || false\n\tconst tag = options.tag || 'mark'\n\tconst className = options.className || 'v-highlight'\n\tconst style = options.style ? ` style=\"${options.style}\"` : ''\n\n\t// Sort keywords by length (longer first) to avoid nested highlights\n\tkeywords.sort((a, b) => b.length - a.length)\n\n\tlet result = text\n\n\tfor (const keyword of keywords) {\n\t\tif (!keyword) continue\n\n\t\tconst escapedKeyword = escapeRegex(keyword)\n\t\tconst wordBoundary = wholeWord ? '\\\\b' : ''\n\t\tconst flags = caseSensitive ? 'g' : 'gi'\n\t\tconst pattern = new RegExp(`${wordBoundary}${escapedKeyword}${wordBoundary}`, flags)\n\n\t\tresult = result.replace(pattern, `<${tag} class=\"${className}\"${style}>$&</${tag}>`)\n\t}\n\n\treturn result\n}\n\n/**\n * Check if element contains only text (no nested elements)\n */\nfunction isTextNodeOnly(element: HTMLElement): boolean {\n\tfor (const child of element.childNodes) {\n\t\tif (child.nodeType === Node.ELEMENT_NODE) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n/**\n * v-highlight directive\n *\n * @example\n * ```vue\n * <template>\n * <p v-highlight=\"'important'\">This is an important message.</p>\n *\n * <p v-highlight=\"['Vue', 'React']\">Vue and React are popular frameworks.</p>\n *\n * <p v-highlight=\"{\n * keywords: 'highlight',\n * className: 'my-highlight',\n * style: 'background: yellow; color: black;',\n * caseSensitive: true\n * }\">\n * This will highlight the word.\n * </p>\n * </template>\n * ```\n */\nexport const vHighlight = defineDirective<HighlightBinding, HTMLElement>({\n\tname: 'highlight',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!options.keywords || (Array.isArray(options.keywords) && options.keywords.length === 0)) {\n\t\t\treturn\n\t\t}\n\n\t\t// Store original content\n\t\tconst state: HighlightState = {\n\t\t\toptions,\n\t\t\toriginalContent: el.innerHTML,\n\t\t}\n\n\t\t;(el as any).__highlight = state\n\n\t\t// Apply highlight\n\t\tapplyHighlight(el, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: HighlightState = (el as any).__highlight\n\n\t\tif (!state) {\n\t\t\t// New highlight\n\t\t\tconst options = normalizeOptions(binding.value)\n\t\t\tif (options.keywords) {\n\t\t\t\tconst newState: HighlightState = {\n\t\t\t\t\toptions,\n\t\t\t\t\toriginalContent: el.innerHTML,\n\t\t\t\t}\n\t\t\t\t;(el as any).__highlight = newState\n\t\t\t\tapplyHighlight(el, newState)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Check if keywords changed\n\t\tconst oldKeywords = Array.isArray(state.options.keywords) ? state.options.keywords.join(',') : state.options.keywords\n\t\tconst newKeywords = Array.isArray(newOptions.keywords) ? newOptions.keywords.join(',') : newOptions.keywords\n\n\t\tif (oldKeywords !== newKeywords || JSON.stringify(state.options) !== JSON.stringify(newOptions)) {\n\t\t\t// Restore original content first\n\t\t\tel.innerHTML = state.originalContent\n\t\t\tstate.options = newOptions\n\t\t\tstate.originalContent = el.innerHTML\n\t\t\tapplyHighlight(el, state)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: HighlightState = (el as any).__highlight\n\n\t\tif (!state) return\n\n\t\t// Restore original content\n\t\tel.innerHTML = state.originalContent\n\n\t\tdelete (el as any).__highlight\n\t},\n})\n\n/**\n * Apply highlight to element\n */\nfunction applyHighlight(el: HTMLElement, state: HighlightState): void {\n\t// For text-only elements, we can use innerHTML\n\tif (isTextNodeOnly(el)) {\n\t\tconst highlighted = highlightKeywords(state.originalContent, state.options)\n\t\tel.innerHTML = highlighted\n\n\t\t// Count highlights\n\t\tconst count = el.querySelectorAll(state.options.tag || 'mark').length\n\t\tstate.options.onHighlight?.(count)\n\t} else {\n\t\t// For elements with nested elements, we need to process text nodes\n\t\tprocessTextNodes(el, state)\n\t}\n}\n\n/**\n * Process text nodes in element tree\n */\nfunction processTextNodes(element: HTMLElement, state: HighlightState): void {\n\tconst walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null)\n\n\t// Collect all text nodes\n\tconst textNodes: Text[] = []\n\tlet node = walker.nextNode() as Text | null,\n\t\thighlightCount = 0\n\n\twhile (node) {\n\t\t// Skip text nodes inside our highlight tags\n\t\tif ((node.parentNode as Element)?.tagName?.toLowerCase() === (state.options.tag || 'mark').toLowerCase()) {\n\t\t\tnode = walker.nextNode() as Text | null\n\t\t\tcontinue\n\t\t}\n\t\ttextNodes.push(node)\n\t\tnode = walker.nextNode() as Text | null\n\t}\n\n\t// Process each text node\n\tfor (const textNode of textNodes) {\n\t\tconst text = textNode.textContent || ''\n\t\tconst highlighted = highlightKeywords(text, state.options)\n\n\t\tif (highlighted !== text) {\n\t\t\t// Create a temporary container to parse the HTML\n\t\t\tconst temp = document.createElement('span')\n\t\t\ttemp.innerHTML = highlighted\n\n\t\t\t// Replace text node with highlighted content\n\t\t\tconst parent = textNode.parentNode\n\t\t\tif (parent) {\n\t\t\t\tparent.insertBefore(temp, textNode)\n\t\t\t\tparent.removeChild(textNode)\n\n\t\t\t\t// Unwrap the span if it's a direct child\n\t\t\t\twhile (temp.firstChild) {\n\t\t\t\t\tparent.insertBefore(temp.firstChild, temp)\n\t\t\t\t}\n\t\t\t\tparent.removeChild(temp)\n\t\t\t}\n\n\t\t\thighlightCount += element.querySelectorAll(state.options.tag || 'mark').length\n\t\t}\n\t}\n\n\tstate.options.onHighlight?.(highlightCount)\n}\n\nexport default vHighlight\n", "import { defineDirective } from '@directix/core'\n\nexport type HotkeyHandler = (event: KeyboardEvent) => void\n\nexport type ModifierKey = 'ctrl' | 'alt' | 'shift' | 'meta'\n\nexport interface HotkeyDefinition {\n\tkey: string\n\tmodifiers?: ModifierKey[]\n\thandler: HotkeyHandler\n\tprevent?: boolean\n\tstop?: boolean\n\tdisabled?: boolean\n\tglobal?: boolean\n}\n\nexport type HotkeyBinding\n\t= | HotkeyHandler\n\t\t| HotkeyDefinition\n\t\t| HotkeyDefinition[]\n\t\t| Record<string, HotkeyHandler | HotkeyDefinition>\n\ninterface HotkeyEntry {\n\tkey: string\n\tmodifiers: Set<ModifierKey>\n\thandler: HotkeyHandler\n\tprevent: boolean\n\tstop: boolean\n\tdisabled: boolean\n}\n\ninterface HotkeyState {\n\tentries: HotkeyEntry[]\n\thandler: (event: KeyboardEvent) => void\n}\n\nconst KEY_ALIASES: Record<string, string> = {\n\tesc: 'escape',\n\tspace: ' ',\n\tup: 'arrowup',\n\tdown: 'arrowdown',\n\tleft: 'arrowleft',\n\tright: 'arrowright',\n\tenter: 'enter',\n\ttab: 'tab',\n\tdelete: 'delete',\n\tbackspace: 'backspace',\n\tinsert: 'insert',\n\thome: 'home',\n\tend: 'end',\n\tpagedown: 'pagedown',\n\tpageup: 'pageup',\n\tf1: 'f1',\n\tf2: 'f2',\n\tf3: 'f3',\n\tf4: 'f4',\n\tf5: 'f5',\n\tf6: 'f6',\n\tf7: 'f7',\n\tf8: 'f8',\n\tf9: 'f9',\n\tf10: 'f10',\n\tf11: 'f11',\n\tf12: 'f12',\n}\n\nconst MODIFIER_KEYS = new Set(['ctrl', 'alt', 'shift', 'meta'])\n\nfunction normalizeKey(key: string): string {\n\tconst lowerKey = key.toLowerCase()\n\treturn KEY_ALIASES[lowerKey] || lowerKey\n}\n\nfunction parseHotkeyString(hotkey: string): { key: string, modifiers: ModifierKey[] } {\n\tconst parts = hotkey.toLowerCase().split(/[+.]/)\n\tconst modifiers: ModifierKey[] = []\n\tlet key = ''\n\n\tfor (const part of parts) {\n\t\tif (MODIFIER_KEYS.has(part)) {\n\t\t\tmodifiers.push(part as ModifierKey)\n\t\t} else {\n\t\t\tkey = normalizeKey(part)\n\t\t}\n\t}\n\n\treturn { key, modifiers }\n}\n\nfunction matchesHotkey(event: KeyboardEvent, entry: HotkeyEntry): boolean {\n\tif (normalizeKey(event.key) !== entry.key) return false\n\n\tconst eventModifiers = new Set<ModifierKey>()\n\tif (event.ctrlKey) eventModifiers.add('ctrl')\n\tif (event.altKey) eventModifiers.add('alt')\n\tif (event.shiftKey) eventModifiers.add('shift')\n\tif (event.metaKey) eventModifiers.add('meta')\n\n\tif (eventModifiers.size !== entry.modifiers.size) return false\n\n\tfor (const mod of entry.modifiers) {\n\t\tif (!eventModifiers.has(mod)) return false\n\t}\n\n\treturn true\n}\n\nfunction createEntry(\n\tkey: string,\n\tmodifiers: ModifierKey[],\n\thandler: HotkeyHandler,\n\toptions: { prevent?: boolean, stop?: boolean, disabled?: boolean } = {},\n): HotkeyEntry {\n\treturn {\n\t\tkey: normalizeKey(key),\n\t\tmodifiers: new Set(modifiers),\n\t\thandler,\n\t\tprevent: options.prevent ?? true,\n\t\tstop: options.stop ?? true,\n\t\tdisabled: options.disabled ?? false,\n\t}\n}\n\nfunction normalizeBinding(\n\tbinding: HotkeyBinding,\n\targ: string | undefined,\n\tmodifiers: Record<string, boolean>,\n): HotkeyEntry[] {\n\t// Argument syntax: v-hotkey:ctrl.s=\"handler\" or v-hotkey:escape=\"handler\"\n\tif (arg) {\n\t\tconst argLower = arg.toLowerCase()\n\t\tconst argIsModifier = MODIFIER_KEYS.has(argLower)\n\n\t\tlet key: string\n\t\tconst parsedModifiers: ModifierKey[] = []\n\n\t\tif (argIsModifier) {\n\t\t\t// v-hotkey:ctrl.s -> arg is modifier, key in directive modifiers\n\t\t\tparsedModifiers.push(argLower as ModifierKey)\n\t\t\tfor (const mod of Object.keys(modifiers)) {\n\t\t\t\tconst modLower = mod.toLowerCase()\n\t\t\t\tif (MODIFIER_KEYS.has(modLower)) {\n\t\t\t\t\tparsedModifiers.push(modLower as ModifierKey)\n\t\t\t\t} else {\n\t\t\t\t\tkey = normalizeKey(mod)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// v-hotkey:escape -> arg is the key\n\t\t\tconst parsed = parseHotkeyString(arg)\n\t\t\tkey = parsed.key\n\t\t\tparsedModifiers.push(...parsed.modifiers)\n\t\t\tfor (const mod of Object.keys(modifiers)) {\n\t\t\t\tconst modLower = mod.toLowerCase()\n\t\t\t\tif (MODIFIER_KEYS.has(modLower)) {\n\t\t\t\t\tparsedModifiers.push(modLower as ModifierKey)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst handler = typeof binding === 'function' ? binding : (binding as HotkeyDefinition).handler\n\t\treturn [createEntry(key!, parsedModifiers, handler)]\n\t}\n\n\t// Function without arg - invalid\n\tif (typeof binding === 'function') {\n\t\tconsole.warn('[Directix] v-hotkey: hotkey definition required (use v-hotkey:ctrl.s=\"handler\")')\n\t\treturn []\n\t}\n\n\t// Array syntax: [{ key: 's', modifiers: ['ctrl'], handler }]\n\tif (Array.isArray(binding)) {\n\t\treturn binding.map(item =>\n\t\t\tcreateEntry(item.key, item.modifiers || [], item.handler, {\n\t\t\t\tprevent: item.prevent,\n\t\t\t\tstop: item.stop,\n\t\t\t\tdisabled: item.disabled,\n\t\t\t}),\n\t\t)\n\t}\n\n\t// Object syntax\n\tif (typeof binding === 'object' && binding !== null) {\n\t\t// Single HotkeyDefinition: { key: 's', handler }\n\t\tif ('handler' in binding && typeof binding.handler === 'function') {\n\t\t\tconst def = binding as HotkeyDefinition\n\t\t\treturn [createEntry(def.key, def.modifiers || [], def.handler, def)]\n\t\t}\n\n\t\t// Record syntax: { 'ctrl+s': handler }\n\t\tconst entries: HotkeyEntry[] = []\n\t\tfor (const [hotkeyStr, value] of Object.entries(binding)) {\n\t\t\tconst { key, modifiers: parsedModifiers } = parseHotkeyString(hotkeyStr)\n\t\t\tconst handler = typeof value === 'function' ? value : value.handler\n\t\t\tconst options = typeof value === 'object' ? value : {}\n\t\t\tentries.push(createEntry(key, parsedModifiers, handler, options))\n\t\t}\n\t\treturn entries\n\t}\n\n\treturn []\n}\n\nfunction createKeydownHandler(state: HotkeyState) {\n\treturn (event: KeyboardEvent) => {\n\t\tfor (const entry of state.entries) {\n\t\t\tif (entry.disabled) continue\n\t\t\tif (!matchesHotkey(event, entry)) continue\n\n\t\t\tif (entry.prevent) event.preventDefault()\n\t\t\tif (entry.stop) event.stopPropagation()\n\t\t\tentry.handler(event)\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunction setupState(el: HTMLElement, entries: HotkeyEntry[]): HotkeyState | null {\n\tif (entries.length === 0) return null\n\n\tconst state: HotkeyState = { entries, handler: null as any }\n\tstate.handler = createKeydownHandler(state)\n\n\tel.tabIndex = el.tabIndex || -1\n\tel.addEventListener('keydown', state.handler)\n\t;(el as any).__hotkey = state\n\n\treturn state\n}\n\nexport const vHotkey = defineDirective<HotkeyBinding, HTMLElement>({\n\tname: 'hotkey',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst entries = normalizeBinding(binding.value, binding.arg, binding.modifiers)\n\t\tsetupState(el, entries)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: HotkeyState | undefined = (el as any).__hotkey\n\t\tconst newEntries = normalizeBinding(binding.value, binding.arg, binding.modifiers)\n\n\t\tif (state) {\n\t\t\tstate.entries = newEntries\n\t\t} else {\n\t\t\tsetupState(el, newEntries)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: HotkeyState | undefined = (el as any).__hotkey\n\t\tif (!state) return\n\n\t\tel.removeEventListener('keydown', state.handler)\n\t\tdelete (el as any).__hotkey\n\t},\n})\n\nexport default vHotkey\n", "/**\n * Directive utilities - high-level helpers for directive implementations\n * Layer: Directive (depends on @directix/core and @directix/shared)\n *\n * This module provides utilities specifically designed for directive implementations,\n * building on top of the low-level utilities in @directix/shared.\n */\n\nimport type { DirectiveBinding } from '@directix/core'\nimport { parseTime } from '@directix/shared'\n\n// Re-export state management from shared for convenience\nexport { deleteState, getState, hasState, setState } from '@directix/shared'\n\n/**\n * Options for creating a normalizer\n */\nexport interface NormalizerOptions<T> {\n\t/** Default values */\n\tdefaults: T\n\t/** Key to use when binding is a function */\n\thandlerKey?: keyof T\n\t/** Key to use when binding is a string */\n\tvalueKey?: keyof T\n}\n\n/**\n * Create a normalize function for directive options\n * @param options - Normalizer configuration\n * @returns Normalize function\n *\n * @example\n * ```ts\n * const normalize = createNormalizer({\n * defaults: { capture: true, disabled: false },\n * handlerKey: 'handler'\n * })\n *\n * // Function binding\n * normalize(fn) // { handler: fn, capture: true, disabled: false }\n *\n * // Object binding\n * normalize({ capture: false }) // { capture: false, disabled: false }\n * ```\n */\nexport function createNormalizer<T extends Record<string, any>>(\n\toptions: NormalizerOptions<T>,\n): (binding: unknown) => T {\n\tconst { defaults, handlerKey, valueKey } = options\n\n\treturn (binding: unknown): T => {\n\t\t// Handle function binding\n\t\tif (typeof binding === 'function' && handlerKey) {\n\t\t\treturn { ...defaults, [handlerKey]: binding } as T\n\t\t}\n\n\t\t// Handle string binding\n\t\tif (typeof binding === 'string' && valueKey) {\n\t\t\treturn { ...defaults, [valueKey]: binding } as T\n\t\t}\n\n\t\t// Handle boolean binding (e.g., v-ripple=\"false\")\n\t\tif (typeof binding === 'boolean') {\n\t\t\treturn { ...defaults, disabled: !binding } as T\n\t\t}\n\n\t\t// Handle object binding\n\t\tif (binding && typeof binding === 'object') {\n\t\t\treturn { ...defaults, ...binding } as T\n\t\t}\n\n\t\t// Return defaults for undefined/null\n\t\treturn { ...defaults } as T\n\t}\n}\n\n/**\n * Simple normalize function for common handler pattern\n * @param binding - Directive binding value\n * @param defaults - Default options\n * @returns Normalized options with handler\n *\n * @example\n * ```ts\n * // For directives like v-click-outside, v-long-press\n * normalizeHandlerOptions(fn, { disabled: false })\n * normalizeHandlerOptions({ handler: fn, disabled: true }, { disabled: false })\n * ```\n */\nexport function normalizeHandlerOptions<T extends { handler?: (...args: any[]) => any }>(\n\tbinding: ((...args: any[]) => any) | T | undefined,\n\tdefaults: Omit<T, 'handler'> & Partial<Pick<T, 'handler'>>,\n): T {\n\tif (typeof binding === 'function') {\n\t\treturn { ...defaults, handler: binding } as T\n\t}\n\treturn { ...defaults, ...binding } as T\n}\n\n/**\n * Normalize options with time parsing from directive argument\n * @param binding - Directive binding value\n * @param directiveBinding - Full directive binding with arg\n * @param defaults - Default options\n * @returns Normalized options with parsed time\n *\n * @example\n * ```ts\n * // v-debounce:500=\"handler\" or v-debounce:1s=\"handler\"\n * normalizeTimeOptions(binding, binding, { wait: 300, handler: fn })\n * ```\n */\nexport function normalizeTimeOptions<T extends { handler?: (...args: any[]) => any, wait?: number }>(\n\tbinding: ((...args: any[]) => any) | T | undefined,\n\tdirectiveBinding: DirectiveBinding<any>,\n\tdefaults: Omit<T, 'handler'> & { wait: number },\n): T {\n\tconst wait = parseTime(directiveBinding.arg) || defaults.wait\n\n\tif (typeof binding === 'function') {\n\t\treturn { ...defaults, handler: binding, wait } as T\n\t}\n\n\treturn { ...defaults, ...binding, wait: binding?.wait ?? wait } as T\n}\n\n/**\n * Timer manager interface\n */\nexport interface TimerManager {\n\t/**\n\t * Set a timeout (tracked for cleanup)\n\t */\n\tsetTimeout: (fn: () => void, delay: number) => ReturnType<typeof setTimeout>\n\n\t/**\n\t * Clear a specific timeout\n\t */\n\tclearTimeout: (id: ReturnType<typeof setTimeout>) => void\n\n\t/**\n\t * Set an interval (tracked for cleanup)\n\t */\n\tsetInterval: (fn: () => void, delay: number) => ReturnType<typeof setInterval>\n\n\t/**\n\t * Clear a specific interval\n\t */\n\tclearInterval: (id: ReturnType<typeof setInterval>) => void\n\n\t/**\n\t * Clear all tracked timers\n\t */\n\tclearAll: () => void\n\n\t/**\n\t * Check if there are any active timers\n\t */\n\thasActive: () => boolean\n}\n\n/**\n * Timer manager for directives that use setTimeout/setInterval\n * Automatically tracks and cleans up timers\n *\n * @example\n * ```ts\n * const timer = useTimer()\n *\n * timer.setTimeout(() => {}, 1000)\n * timer.setInterval(() => {}, 500)\n *\n * // Clean up all timers on unmount\n * timer.clearAll()\n * ```\n */\nexport function useTimer(): TimerManager {\n\tconst timeouts = new Set<ReturnType<typeof setTimeout>>()\n\tconst intervals = new Set<ReturnType<typeof setInterval>>()\n\n\treturn {\n\t\t/**\n\t\t * Set a timeout (tracked for cleanup)\n\t\t */\n\t\tsetTimeout(fn: () => void, delay: number): ReturnType<typeof setTimeout> {\n\t\t\tconst id = setTimeout(() => {\n\t\t\t\ttimeouts.delete(id)\n\t\t\t\tfn()\n\t\t\t}, delay)\n\t\t\ttimeouts.add(id)\n\t\t\treturn id\n\t\t},\n\n\t\t/**\n\t\t * Clear a specific timeout\n\t\t */\n\t\tclearTimeout(id: ReturnType<typeof setTimeout>): void {\n\t\t\tclearTimeout(id)\n\t\t\ttimeouts.delete(id)\n\t\t},\n\n\t\t/**\n\t\t * Set an interval (tracked for cleanup)\n\t\t */\n\t\tsetInterval(fn: () => void, delay: number): ReturnType<typeof setInterval> {\n\t\t\tconst id = setInterval(fn, delay)\n\t\t\tintervals.add(id)\n\t\t\treturn id\n\t\t},\n\n\t\t/**\n\t\t * Clear a specific interval\n\t\t */\n\t\tclearInterval(id: ReturnType<typeof setInterval>): void {\n\t\t\tclearInterval(id)\n\t\t\tintervals.delete(id)\n\t\t},\n\n\t\t/**\n\t\t * Clear all tracked timers\n\t\t */\n\t\tclearAll(): void {\n\t\t\ttimeouts.forEach(id => clearTimeout(id))\n\t\t\tintervals.forEach(id => clearInterval(id))\n\t\t\ttimeouts.clear()\n\t\t\tintervals.clear()\n\t\t},\n\n\t\t/**\n\t\t * Check if there are any active timers\n\t\t */\n\t\thasActive(): boolean {\n\t\t\treturn timeouts.size > 0 || intervals.size > 0\n\t\t},\n\t}\n}\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { bindEvents, deleteState, getState, setState } from '@directix/shared'\nimport { useTimer } from '../utils/directive'\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\ttimer: ReturnType<typeof useTimer>\n\tcleanup: (() => void) | null\n}\n\nconst STATE_KEY = 'hover'\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 * 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\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 timer = useTimer()\n\t\tlet isHovering = false\n\n\t\tconst state: HoverState = {\n\t\t\toptions,\n\t\t\tisHovering: false,\n\t\t\ttimer,\n\t\t\tcleanup: null,\n\t\t}\n\n\t\t// Enter handler\n\t\tconst enterHandler = (e: Event): void => {\n\t\t\tconst event = e as MouseEvent\n\n\t\t\t// Clear leave timer if exists\n\t\t\ttimer.clearAll()\n\n\t\t\t// If already hovering, do nothing\n\t\t\tif (isHovering) return\n\n\t\t\t// Handle enter delay\n\t\t\tif (options.enterDelay && options.enterDelay > 0) {\n\t\t\t\ttimer.setTimeout(() => {\n\t\t\t\t\tisHovering = true\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\tisHovering = true\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\tconst leaveHandler = (e: Event): void => {\n\t\t\tconst event = e as MouseEvent\n\n\t\t\t// Clear enter timer if exists\n\t\t\ttimer.clearAll()\n\n\t\t\t// If not hovering, do nothing\n\t\t\tif (!isHovering) return\n\n\t\t\t// Handle leave delay\n\t\t\tif (options.leaveDelay && options.leaveDelay > 0) {\n\t\t\t\ttimer.setTimeout(() => {\n\t\t\t\t\tisHovering = false\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\tisHovering = false\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// Bind events using bindEvents helper\n\t\tstate.cleanup = bindEvents(el, {\n\t\t\tmouseenter: enterHandler,\n\t\t\tmouseleave: leaveHandler,\n\t\t})\n\n\t\tsetState(el, STATE_KEY, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = getState<HTMLElement, HoverState>(el, STATE_KEY)\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\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 = getState<HTMLElement, HoverState>(el, STATE_KEY)\n\n\t\tif (!state) return\n\n\t\t// Clear timers\n\t\tstate.timer.clearAll()\n\n\t\t// Unbind events\n\t\tstate.cleanup?.()\n\n\t\t// Remove class\n\t\tel.classList.remove(state.options.class || 'v-hover')\n\n\t\tdeleteState(el, STATE_KEY)\n\t},\n})\n\nexport default vHover\n", "import { defineDirective } from '@directix/core'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Image preview options\n */\nexport interface ImagePreviewOptions {\n\t/** Image source URL */\n\tsrc?: string\n\t/** Preview image source URL (higher resolution) */\n\tpreviewSrc?: string\n\t/** Alt text for accessibility */\n\talt?: string\n\t/** Whether preview is disabled @default false */\n\tdisabled?: boolean\n\t/** Close on click outside @default true */\n\tcloseOnClickOutside?: boolean\n\t/** Close on escape key @default true */\n\tcloseOnEsc?: boolean\n\t/** Show close button @default true */\n\tshowCloseButton?: boolean\n\t/** Z-index of the preview overlay @default 9999 */\n\tzIndex?: number\n\t/** Custom class for the preview overlay */\n\tclass?: string\n\t/** Enable pinch zoom on mobile @default true */\n\tenablePinchZoom?: boolean\n\t/** Enable double tap to zoom @default true */\n\tenableDoubleTap?: boolean\n\t/** Enable swipe up to close @default true */\n\tenableSwipeClose?: boolean\n\t/** Show zoom indicator @default true */\n\tshowZoomIndicator?: boolean\n\t/** Minimum zoom scale @default 0.5 */\n\tminScale?: number\n\t/** Maximum zoom scale @default 5 */\n\tmaxScale?: number\n\t/** Callback when preview opens */\n\tonOpen?: () => void\n\t/** Callback when preview closes */\n\tonClose?: () => void\n}\n\nexport type ImagePreviewBinding = string | ImagePreviewOptions\n\ninterface TransformState {\n\tscale: number\n\ttranslateX: number\n\ttranslateY: number\n}\n\ninterface GestureState {\n\tisDragging: boolean\n\tstartX: number\n\tstartY: number\n\tstartDistance: number\n\tstartScale: number\n\tlastTapTime: number\n\tswipeStartY: number\n}\n\ninterface PreviewState {\n\toptions: ImagePreviewOptions\n\toverlay: HTMLElement | null\n\timageContainer: HTMLElement | null\n\timage: HTMLImageElement | null\n\tisOpen: boolean\n\ttransform: TransformState\n\tgesture: GestureState\n\thandlers: {\n\t\tclick: () => void\n\t\tesc: ((e: KeyboardEvent) => void) | null\n\t\ttouchStart: ((e: TouchEvent) => void) | null\n\t\ttouchMove: ((e: TouchEvent) => void) | null\n\t\ttouchEnd: ((e: TouchEvent) => void) | null\n\t\tmouseDown: ((e: MouseEvent) => void) | null\n\t\tmouseMove: ((e: MouseEvent) => void) | null\n\t\tmouseUp: ((e: MouseEvent) => void) | null\n\t\twheel: ((e: WheelEvent) => void) | null\n\t}\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULTS = {\n\tminScale: 0.5,\n\tmaxScale: 5,\n\tdoubleTapZoom: 2.5,\n\tswipeThreshold: 100,\n\ttapTimeout: 300,\n\tanimationDuration: 300,\n\thintDuration: 3000,\n\tzoomIndicatorDuration: 1500,\n} as const\n\nlet globalZIndex = 9999\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction getDistance(x1: number, y1: number, x2: number, y2: number): number {\n\treturn Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n\treturn Math.max(min, Math.min(max, value))\n}\n\n// ============================================================================\n// UI Components\n// ============================================================================\n\nfunction createOverlay(options: ImagePreviewOptions): {\n\toverlay: HTMLElement\n\timageContainer: HTMLElement\n\timage: HTMLImageElement\n} {\n\tconst zIndex = options.zIndex ?? ++globalZIndex\n\n\t// Main overlay\n\tconst overlay = document.createElement('div')\n\toverlay.className = 'v-image-preview-overlay'\n\tif (options.class) overlay.classList.add(options.class)\n\n\tObject.assign(overlay.style, {\n\t\tposition: 'fixed',\n\t\tinset: '0',\n\t\tbackground: 'rgba(0, 0, 0, 0.95)',\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tzIndex: String(zIndex),\n\t\tcursor: 'zoom-out',\n\t\topacity: '0',\n\t\ttransition: 'opacity 0.3s',\n\t\ttouchAction: 'none',\n\t\toverflow: 'hidden',\n\t})\n\n\t// Image container\n\tconst imageContainer = document.createElement('div')\n\tObject.assign(imageContainer.style, {\n\t\tposition: 'relative',\n\t\ttransformOrigin: 'center center',\n\t\ttransition: 'transform 0.1s ease-out',\n\t\twillChange: 'transform',\n\t})\n\n\t// Image element\n\tconst image = document.createElement('img')\n\timage.src = options.previewSrc || options.src || ''\n\timage.alt = options.alt || ''\n\tObject.assign(image.style, {\n\t\tmaxWidth: '95vw',\n\t\tmaxHeight: '90vh',\n\t\tobjectFit: 'contain',\n\t\tcursor: 'grab',\n\t\tuserSelect: 'none',\n\t\tWebkitUserDrag: 'none',\n\t})\n\timage.addEventListener('dragstart', e => e.preventDefault())\n\n\timageContainer.appendChild(image)\n\n\t// Close button\n\tif (options.showCloseButton !== false) {\n\t\tconst closeBtn = document.createElement('button')\n\t\tcloseBtn.className = 'v-image-preview-close'\n\t\tcloseBtn.innerHTML = '\u00D7'\n\t\tcloseBtn.setAttribute('aria-label', 'Close preview')\n\n\t\tObject.assign(closeBtn.style, {\n\t\t\tposition: 'fixed',\n\t\t\ttop: '16px',\n\t\t\tright: '16px',\n\t\t\twidth: '44px',\n\t\t\theight: '44px',\n\t\t\tborder: 'none',\n\t\t\tbackground: 'rgba(255, 255, 255, 0.15)',\n\t\t\tcolor: 'white',\n\t\t\tfontSize: '28px',\n\t\t\tcursor: 'pointer',\n\t\t\tborderRadius: '50%',\n\t\t\ttransition: 'background 0.2s, transform 0.2s',\n\t\t\tzIndex: String(zIndex + 1),\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t\tjustifyContent: 'center',\n\t\t\tbackdropFilter: 'blur(10px)',\n\t\t\tWebkitBackdropFilter: 'blur(10px)',\n\t\t})\n\n\t\tconst setBtnStyle = (bg: string, scale: string): void => {\n\t\t\tcloseBtn.style.background = bg\n\t\t\tcloseBtn.style.transform = scale\n\t\t}\n\n\t\tcloseBtn.addEventListener('mouseenter', () => setBtnStyle('rgba(255, 255, 255, 0.25)', 'scale(1.1)'))\n\t\tcloseBtn.addEventListener('mouseleave', () => setBtnStyle('rgba(255, 255, 255, 0.15)', 'scale(1)'))\n\t\tcloseBtn.addEventListener('touchstart', () => setBtnStyle('rgba(255, 255, 255, 0.35)', 'scale(1.15)'), { passive: true })\n\t\tcloseBtn.addEventListener('touchend', () => setBtnStyle('rgba(255, 255, 255, 0.15)', 'scale(1)'), { passive: true })\n\n\t\toverlay.appendChild(closeBtn)\n\t}\n\n\t// Zoom indicator\n\tif (options.showZoomIndicator !== false) {\n\t\tconst zoomIndicator = document.createElement('div')\n\t\tzoomIndicator.className = 'v-image-preview-zoom'\n\t\tzoomIndicator.textContent = '100%'\n\n\t\tObject.assign(zoomIndicator.style, {\n\t\t\tposition: 'fixed',\n\t\t\tbottom: '24px',\n\t\t\tleft: '50%',\n\t\t\ttransform: 'translateX(-50%)',\n\t\t\tbackground: 'rgba(0, 0, 0, 0.6)',\n\t\t\tcolor: 'white',\n\t\t\tpadding: '8px 16px',\n\t\t\tborderRadius: '20px',\n\t\t\tfontSize: '14px',\n\t\t\tfontWeight: '500',\n\t\t\topacity: '0',\n\t\t\ttransition: 'opacity 0.3s',\n\t\t\tzIndex: String(zIndex + 1),\n\t\t\tbackdropFilter: 'blur(10px)',\n\t\t\tWebkitBackdropFilter: 'blur(10px)',\n\t\t})\n\n\t\toverlay.appendChild(zoomIndicator)\n\t}\n\n\t// Hint\n\tconst hint = document.createElement('div')\n\thint.className = 'v-image-preview-hint'\n\thint.textContent = 'Pinch to zoom \u2022 Double tap \u2022 Swipe up to close'\n\n\tObject.assign(hint.style, {\n\t\tposition: 'fixed',\n\t\tbottom: '60px',\n\t\tleft: '50%',\n\t\ttransform: 'translateX(-50%)',\n\t\tcolor: 'rgba(255, 255, 255, 0.6)',\n\t\tfontSize: '12px',\n\t\topacity: '1',\n\t\ttransition: 'opacity 0.5s',\n\t\tzIndex: String(zIndex + 1),\n\t\tpointerEvents: 'none',\n\t})\n\n\toverlay.appendChild(hint)\n\tsetTimeout(() => (hint.style.opacity = '0'), DEFAULTS.hintDuration)\n\n\toverlay.appendChild(imageContainer)\n\n\treturn { overlay, imageContainer, image }\n}\n\n// ============================================================================\n// Transform Helpers\n// ============================================================================\n\ninterface TransformManager {\n\tupdateTransform: (animate?: boolean) => void\n\tresetTransform: () => void\n\tconstrainScale: (newScale: number) => number\n\tconstrainTranslate: (x: number, y: number) => { x: number, y: number }\n}\n\nfunction createTransformManager(state: PreviewState): TransformManager {\n\tconst updateTransform = (animate = false): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tconst { scale, translateX, translateY } = state.transform\n\t\tstate.imageContainer.style.transition = animate ? 'transform 0.2s ease-out' : 'none'\n\t\tstate.imageContainer.style.transform = `translate(${translateX}px, ${translateY}px) scale(${scale})`\n\n\t\t// Update zoom indicator\n\t\tconst zoomIndicator = state.overlay?.querySelector('.v-image-preview-zoom') as HTMLElement | null\n\t\tif (zoomIndicator) {\n\t\t\tzoomIndicator.textContent = `${Math.round(scale * 100)}%`\n\t\t\tzoomIndicator.style.opacity = '1'\n\n\t\t\tclearTimeout((zoomIndicator as any)._hideTimer)\n\t\t\t;(zoomIndicator as any)._hideTimer = setTimeout(() => {\n\t\t\t\tzoomIndicator.style.opacity = '0'\n\t\t\t}, DEFAULTS.zoomIndicatorDuration)\n\t\t}\n\t}\n\n\tconst resetTransform = (): void => {\n\t\tstate.transform = { scale: 1, translateX: 0, translateY: 0 }\n\t\tupdateTransform(true)\n\t}\n\n\tconst constrainScale = (newScale: number): number => {\n\t\tconst { minScale = DEFAULTS.minScale, maxScale = DEFAULTS.maxScale } = state.options\n\t\treturn clamp(newScale, minScale, maxScale)\n\t}\n\n\tconst constrainTranslate = (x: number, y: number): { x: number, y: number } => {\n\t\tconst { scale } = state.transform\n\t\tif (!state.image || scale <= 1) return { x: 0, y: 0 }\n\n\t\tconst rect = state.image.getBoundingClientRect()\n\t\tconst maxX = (rect.width * (scale - 1)) / 2\n\t\tconst maxY = (rect.height * (scale - 1)) / 2\n\n\t\treturn {\n\t\t\tx: clamp(x, -maxX, maxX),\n\t\t\ty: clamp(y, -maxY, maxY),\n\t\t}\n\t}\n\n\treturn { updateTransform, resetTransform, constrainScale, constrainTranslate }\n}\n\n// ============================================================================\n// Gesture Handlers\n// ============================================================================\n\ninterface GestureHandlers {\n\thandleTouchStart: (e: TouchEvent) => void\n\thandleTouchMove: (e: TouchEvent) => void\n\thandleTouchEnd: (e: TouchEvent) => void\n\thandleMouseDown: (e: MouseEvent) => void\n\thandleMouseMove: (e: MouseEvent) => void\n\thandleMouseUp: () => void\n\thandleWheel: (e: WheelEvent) => void\n}\n\nfunction createGestureHandlers(\n\tstate: PreviewState,\n\ttransformManager: TransformManager,\n\tclosePreview: () => void,\n): GestureHandlers {\n\tconst { updateTransform, resetTransform, constrainScale, constrainTranslate } = transformManager\n\n\tconst handleTouchStart = (e: TouchEvent): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tconst now = Date.now()\n\t\tconst { gesture, transform, options } = state\n\n\t\tif (e.touches.length === 1) {\n\t\t\t// Double tap detection\n\t\t\tif (options.enableDoubleTap !== false && now - gesture.lastTapTime < DEFAULTS.tapTimeout) {\n\t\t\t\te.preventDefault()\n\t\t\t\ttransform.scale = transform.scale > 1 ? 1 : constrainScale(DEFAULTS.doubleTapZoom)\n\t\t\t\tgesture.lastTapTime = 0\n\t\t\t\tupdateTransform(true)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tgesture.lastTapTime = now\n\t\t\tgesture.isDragging = true\n\t\t\tgesture.startX = e.touches[0].clientX - transform.translateX\n\t\t\tgesture.startY = e.touches[0].clientY - transform.translateY\n\t\t\tgesture.swipeStartY = e.touches[0].clientY\n\t\t} else if (e.touches.length === 2 && options.enablePinchZoom !== false) {\n\t\t\tgesture.isDragging = false\n\t\t\tgesture.startDistance = getDistance(\n\t\t\t\te.touches[0].clientX,\n\t\t\t\te.touches[0].clientY,\n\t\t\t\te.touches[1].clientX,\n\t\t\t\te.touches[1].clientY,\n\t\t\t)\n\t\t\tgesture.startScale = transform.scale\n\t\t}\n\t}\n\n\tconst handleTouchMove = (e: TouchEvent): void => {\n\t\tif (!state.imageContainer) return\n\t\te.preventDefault()\n\n\t\tconst { gesture, transform, options } = state\n\n\t\tif (e.touches.length === 1 && gesture.isDragging) {\n\t\t\tconst newX = e.touches[0].clientX - gesture.startX\n\t\t\tconst newY = e.touches[0].clientY - gesture.startY\n\t\t\tconst constrained = constrainTranslate(newX, newY)\n\n\t\t\ttransform.translateX = constrained.x\n\t\t\ttransform.translateY = constrained.y\n\t\t\tupdateTransform(false)\n\t\t} else if (e.touches.length === 2 && options.enablePinchZoom !== false) {\n\t\t\tconst currentDistance = getDistance(\n\t\t\t\te.touches[0].clientX,\n\t\t\t\te.touches[0].clientY,\n\t\t\t\te.touches[1].clientX,\n\t\t\t\te.touches[1].clientY,\n\t\t\t)\n\n\t\t\ttransform.scale = constrainScale(gesture.startScale * (currentDistance / gesture.startDistance))\n\t\t\tupdateTransform(false)\n\t\t}\n\t}\n\n\tconst handleTouchEnd = (e: TouchEvent): void => {\n\t\tconst { gesture, transform, options } = state\n\t\tgesture.isDragging = false\n\n\t\t// Swipe up to close\n\t\tif (options.enableSwipeClose !== false && e.changedTouches.length === 1 && transform.scale <= 1) {\n\t\t\tconst deltaY = e.changedTouches[0].clientY - gesture.swipeStartY\n\t\t\tif (deltaY < -DEFAULTS.swipeThreshold) {\n\t\t\t\tclosePreview()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\t// Snap back if scale < 1\n\t\tif (transform.scale < 1) {\n\t\t\tresetTransform()\n\t\t}\n\t}\n\n\tconst handleMouseDown = (e: MouseEvent): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tstate.gesture.isDragging = true\n\t\tstate.gesture.startX = e.clientX - state.transform.translateX\n\t\tstate.gesture.startY = e.clientY - state.transform.translateY\n\t\tstate.imageContainer.style.cursor = 'grabbing'\n\t}\n\n\tconst handleMouseMove = (e: MouseEvent): void => {\n\t\tif (!state.gesture.isDragging || !state.imageContainer) return\n\n\t\tconst newX = e.clientX - state.gesture.startX\n\t\tconst newY = e.clientY - state.gesture.startY\n\t\tconst constrained = constrainTranslate(newX, newY)\n\n\t\tstate.transform.translateX = constrained.x\n\t\tstate.transform.translateY = constrained.y\n\t\tupdateTransform(false)\n\t}\n\n\tconst handleMouseUp = (): void => {\n\t\tstate.gesture.isDragging = false\n\t\tif (state.imageContainer) {\n\t\t\tstate.imageContainer.style.cursor = 'grab'\n\t\t}\n\t}\n\n\tconst handleWheel = (e: WheelEvent): void => {\n\t\tif (!state.imageContainer || state.options.enablePinchZoom === false) return\n\t\te.preventDefault()\n\n\t\tconst delta = e.deltaY > 0 ? 0.9 : 1.1\n\t\tstate.transform.scale = constrainScale(state.transform.scale * delta)\n\t\tupdateTransform(false)\n\n\t\t// Reset if too small\n\t\tif (state.transform.scale < 0.8) {\n\t\t\tsetTimeout(resetTransform, 100)\n\t\t}\n\t}\n\n\treturn { handleTouchStart, handleTouchMove, handleTouchEnd, handleMouseDown, handleMouseMove, handleMouseUp, handleWheel }\n}\n\n// ============================================================================\n// Normalize Options\n// ============================================================================\n\nfunction normalizeOptions(binding: ImagePreviewBinding, el: HTMLElement): ImagePreviewOptions {\n\tconst elSrc = el.tagName === 'IMG' ? (el as HTMLImageElement).src : undefined\n\tconst elPreviewSrc = el.getAttribute('data-preview') || undefined\n\tconst elAlt = el.tagName === 'IMG' ? (el as HTMLImageElement).alt : el.getAttribute('alt') || undefined\n\n\tif (typeof binding === 'string') {\n\t\treturn {\n\t\t\tsrc: binding,\n\t\t\tpreviewSrc: elPreviewSrc,\n\t\t\talt: elAlt,\n\t\t\tenablePinchZoom: true,\n\t\t\tenableDoubleTap: true,\n\t\t\tenableSwipeClose: true,\n\t\t\tshowZoomIndicator: true,\n\t\t\tshowCloseButton: true,\n\t\t\tcloseOnClickOutside: true,\n\t\t\tcloseOnEsc: true,\n\t\t\tminScale: DEFAULTS.minScale,\n\t\t\tmaxScale: DEFAULTS.maxScale,\n\t\t}\n\t}\n\n\treturn {\n\t\tsrc: binding?.src || elSrc,\n\t\tpreviewSrc: binding?.previewSrc || elPreviewSrc,\n\t\talt: binding?.alt || elAlt,\n\t\tdisabled: binding?.disabled ?? false,\n\t\tcloseOnClickOutside: binding?.closeOnClickOutside ?? true,\n\t\tcloseOnEsc: binding?.closeOnEsc ?? true,\n\t\tshowCloseButton: binding?.showCloseButton ?? true,\n\t\tzIndex: binding?.zIndex,\n\t\tclass: binding?.class,\n\t\tenablePinchZoom: binding?.enablePinchZoom ?? true,\n\t\tenableDoubleTap: binding?.enableDoubleTap ?? true,\n\t\tenableSwipeClose: binding?.enableSwipeClose ?? true,\n\t\tshowZoomIndicator: binding?.showZoomIndicator ?? true,\n\t\tminScale: binding?.minScale ?? DEFAULTS.minScale,\n\t\tmaxScale: binding?.maxScale ?? DEFAULTS.maxScale,\n\t\tonOpen: binding?.onOpen,\n\t\tonClose: binding?.onClose,\n\t}\n}\n\n// ============================================================================\n// Directive\n// ============================================================================\n\n/**\n * v-image-preview directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage -->\n * <img v-image-preview src=\"thumbnail.jpg\" data-preview=\"full.jpg\" />\n *\n * <!-- With options -->\n * <img v-image-preview=\"{ src: 'thumbnail.jpg', previewSrc: 'full.jpg' }\" />\n *\n * <!-- On non-img element -->\n * <div v-image-preview=\"{ src: 'image.jpg' }\">Click to preview</div>\n * </template>\n * ```\n */\nexport const vImagePreview = defineDirective<ImagePreviewBinding, HTMLElement>({\n\tname: 'image-preview',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, el)\n\n\t\tconst state: PreviewState = {\n\t\t\toptions,\n\t\t\toverlay: null,\n\t\t\timageContainer: null,\n\t\t\timage: null,\n\t\t\tisOpen: false,\n\t\t\ttransform: { scale: 1, translateX: 0, translateY: 0 },\n\t\t\tgesture: {\n\t\t\t\tisDragging: false,\n\t\t\t\tstartX: 0,\n\t\t\t\tstartY: 0,\n\t\t\t\tstartDistance: 0,\n\t\t\t\tstartScale: 1,\n\t\t\t\tlastTapTime: 0,\n\t\t\t\tswipeStartY: 0,\n\t\t\t},\n\t\t\thandlers: {\n\t\t\t\tclick: () => {},\n\t\t\t\tesc: null,\n\t\t\t\ttouchStart: null,\n\t\t\t\ttouchMove: null,\n\t\t\t\ttouchEnd: null,\n\t\t\t\tmouseDown: null,\n\t\t\t\tmouseMove: null,\n\t\t\t\tmouseUp: null,\n\t\t\t\twheel: null,\n\t\t\t},\n\t\t}\n\n\t\t;(el as any).__imagePreview = state\n\n\t\tif (options.disabled) return\n\t\tel.style.cursor = 'zoom-in'\n\n\t\t// Transform manager\n\t\tconst transformManager = createTransformManager(state)\n\n\t\t// Close preview\n\t\tconst closePreview = (): void => {\n\t\t\tif (!state.isOpen || !state.overlay) return\n\n\t\t\tstate.overlay.style.opacity = '0'\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!state.overlay) return\n\n\t\t\t\tstate.overlay.remove()\n\t\t\t\tstate.overlay = null\n\t\t\t\tstate.imageContainer = null\n\t\t\t\tstate.image = null\n\t\t\t\tstate.isOpen = false\n\t\t\t\tstate.transform = { scale: 1, translateX: 0, translateY: 0 }\n\t\t\t\tdocument.body.style.overflow = ''\n\n\t\t\t\t// Cleanup handlers\n\t\t\t\tconst { handlers } = state\n\t\t\t\tif (handlers.esc) document.removeEventListener('keydown', handlers.esc)\n\t\t\t\tif (handlers.touchStart) document.removeEventListener('touchstart', handlers.touchStart)\n\t\t\t\tif (handlers.touchMove) document.removeEventListener('touchmove', handlers.touchMove)\n\t\t\t\tif (handlers.touchEnd) document.removeEventListener('touchend', handlers.touchEnd)\n\t\t\t\tif (handlers.mouseDown) document.removeEventListener('mousedown', handlers.mouseDown)\n\t\t\t\tif (handlers.mouseMove) document.removeEventListener('mousemove', handlers.mouseMove)\n\t\t\t\tif (handlers.mouseUp) document.removeEventListener('mouseup', handlers.mouseUp)\n\t\t\t\tif (handlers.wheel) document.removeEventListener('wheel', handlers.wheel)\n\n\t\t\t\tstate.options.onClose?.()\n\t\t\t}, DEFAULTS.animationDuration)\n\t\t}\n\n\t\t// Gesture handlers\n\t\tconst gestureHandlers = createGestureHandlers(state, transformManager, closePreview)\n\n\t\t// Open preview\n\t\tconst openPreview = (): void => {\n\t\t\tif (state.isOpen || state.options.disabled) return\n\n\t\t\tconst { overlay, imageContainer, image } = createOverlay(state.options)\n\t\t\tstate.overlay = overlay\n\t\t\tstate.imageContainer = imageContainer\n\t\t\tstate.image = image\n\t\t\tstate.isOpen = true\n\n\t\t\tdocument.body.appendChild(overlay)\n\t\t\tdocument.body.style.overflow = 'hidden'\n\n\t\t\trequestAnimationFrame(() => (overlay.style.opacity = '1'))\n\n\t\t\t// Store handlers\n\t\t\tstate.handlers.touchStart = gestureHandlers.handleTouchStart\n\t\t\tstate.handlers.touchMove = gestureHandlers.handleTouchMove\n\t\t\tstate.handlers.touchEnd = gestureHandlers.handleTouchEnd\n\t\t\tstate.handlers.mouseDown = gestureHandlers.handleMouseDown\n\t\t\tstate.handlers.mouseMove = gestureHandlers.handleMouseMove\n\t\t\tstate.handlers.mouseUp = gestureHandlers.handleMouseUp\n\t\t\tstate.handlers.wheel = gestureHandlers.handleWheel\n\n\t\t\t// Touch events\n\t\t\toverlay.addEventListener('touchstart', gestureHandlers.handleTouchStart, { passive: false })\n\t\t\toverlay.addEventListener('touchmove', gestureHandlers.handleTouchMove, { passive: false })\n\t\t\toverlay.addEventListener('touchend', gestureHandlers.handleTouchEnd, { passive: true })\n\n\t\t\t// Mouse events\n\t\t\timage.addEventListener('mousedown', gestureHandlers.handleMouseDown)\n\t\t\tdocument.addEventListener('mousemove', gestureHandlers.handleMouseMove)\n\t\t\tdocument.addEventListener('mouseup', gestureHandlers.handleMouseUp)\n\n\t\t\t// Wheel zoom\n\t\t\toverlay.addEventListener('wheel', gestureHandlers.handleWheel, { passive: false })\n\n\t\t\t// Close button\n\t\t\toverlay.querySelector('.v-image-preview-close')?.addEventListener('click', e => {\n\t\t\t\te.stopPropagation()\n\t\t\t\tclosePreview()\n\t\t\t})\n\n\t\t\t// Click outside\n\t\t\tif (state.options.closeOnClickOutside !== false) {\n\t\t\t\toverlay.addEventListener('click', () => {\n\t\t\t\t\tif (state.transform.scale <= 1) {\n\t\t\t\t\t\tclosePreview()\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttransformManager.resetTransform()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Escape key\n\t\t\tif (state.options.closeOnEsc !== false) {\n\t\t\t\tstate.handlers.esc = e => {\n\t\t\t\t\tif (e.key === 'Escape') {\n\t\t\t\t\t\tstate.transform.scale > 1 ? transformManager.resetTransform() : closePreview()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdocument.addEventListener('keydown', state.handlers.esc)\n\t\t\t}\n\n\t\t\tstate.options.onOpen?.()\n\t\t}\n\n\t\tstate.handlers.click = openPreview\n\t\tel.addEventListener('click', openPreview)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__imagePreview as PreviewState | undefined\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value, el)\n\t\tel.style.cursor = state.options.disabled ? '' : 'zoom-in'\n\t},\n\n\tunmounted(el) {\n\t\tconst state = (el as any).__imagePreview as PreviewState | undefined\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handlers.click)\n\n\t\tif (state.isOpen && state.overlay) {\n\t\t\tstate.overlay.remove()\n\t\t\tdocument.body.style.overflow = ''\n\t\t}\n\n\t\tif (state.handlers.esc) document.removeEventListener('keydown', state.handlers.esc)\n\t\tif (state.handlers.touchStart) document.removeEventListener('touchstart', state.handlers.touchStart)\n\t\tif (state.handlers.touchMove) document.removeEventListener('touchmove', state.handlers.touchMove)\n\t\tif (state.handlers.touchEnd) document.removeEventListener('touchend', state.handlers.touchEnd)\n\t\tif (state.handlers.mouseDown) document.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\tif (state.handlers.mouseMove) document.removeEventListener('mousemove', state.handlers.mouseMove)\n\t\tif (state.handlers.mouseUp) document.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\tif (state.handlers.wheel) document.removeEventListener('wheel', state.handlers.wheel)\n\n\t\tdelete (el as any).__imagePreview\n\t},\n})\n\nexport default vImagePreview\n", "import { defineDirective, isBrowser, supportsIntersectionObserver } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\n/**\n * Infinite scroll handler\n */\nexport type InfiniteScrollHandler = () => void | Promise<void>\n\n/**\n * Infinite scroll directive options\n */\nexport interface InfiniteScrollOptions {\n\t/**\n\t * Handler to call when scrolling to bottom\n\t * @required\n\t */\n\thandler: InfiniteScrollHandler\n\n\t/**\n\t * Distance from bottom to trigger load (in pixels)\n\t * @default 0\n\t */\n\tdistance?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether currently loading\n\t * @default false\n\t */\n\tloading?: boolean\n\n\t/**\n\t * Whether to use IntersectionObserver (more efficient)\n\t * @default true\n\t */\n\tuseIntersection?: boolean\n\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 200\n\t */\n\tthrottle?: number\n\n\t/**\n\t * Custom scroll container\n\t */\n\tcontainer?: string | Element | null\n\n\t/**\n\t * Callback when load starts\n\t */\n\tonLoadStart?: () => void\n\n\t/**\n\t * Callback when load completes\n\t */\n\tonLoadEnd?: () => void\n\n\t/**\n\t * Callback on error\n\t */\n\tonError?: (error: Error) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type InfiniteScrollBinding = InfiniteScrollHandler | InfiniteScrollOptions\n\n/**\n * Element state storage\n */\ninterface InfiniteScrollState {\n\toptions: InfiniteScrollOptions\n\tscrollHandler: (e: Event) => void\n\tcontainer: Element | Window\n\tsentinel: HTMLDivElement | null\n\tobserver: IntersectionObserver | null\n\tthrottleTimer: ReturnType<typeof setTimeout> | null\n\tisLoading: boolean\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: InfiniteScrollBinding | undefined): InfiniteScrollOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, distance: 0, throttle: 200, useIntersection: true }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-infinite-scroll: handler is required')\n\t}\n\n\treturn {\n\t\tdistance: 0,\n\t\tdisabled: false,\n\t\tloading: false,\n\t\tuseIntersection: true,\n\t\tthrottle: 200,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-infinite-scroll directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-infinite-scroll=\"loadMore\" class=\"scroll-container\">\n * <div v-for=\"item in items\" :key=\"item.id\">{{ item.name }}</div>\n * </div>\n *\n * <div v-infinite-scroll=\"{ handler: loadMore, distance: 100, disabled: isLoading }\">\n * <div v-for=\"item in items\" :key=\"item.id\">{{ item.name }}</div>\n * </div>\n * </template>\n * ```\n */\nexport const vInfiniteScroll = defineDirective<InfiniteScrollBinding, HTMLElement>({\n\tname: 'infinite-scroll',\n\tssr: false,\n\tdefaults: {\n\t\tdistance: 0,\n\t\tdisabled: false,\n\t\tloading: false,\n\t\tuseIntersection: true,\n\t\tthrottle: 200,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Determine scroll container\n\t\tlet container: Element | Window\n\n\t\tif (options.container) {\n\t\t\tif (typeof options.container === 'string') {\n\t\t\t\tconst found = document.querySelector(options.container)\n\n\t\t\t\tcontainer = found || getScrollParent(el)\n\t\t\t} else {\n\t\t\t\tcontainer = options.container\n\t\t\t}\n\t\t} else {\n\t\t\tcontainer = getScrollParent(el)\n\t\t}\n\n\t\tconst state: InfiniteScrollState = {\n\t\t\toptions,\n\t\t\tcontainer,\n\t\t\tsentinel: null,\n\t\t\tobserver: null,\n\t\t\tthrottleTimer: null,\n\t\t\tisLoading: false,\n\t\t\tscrollHandler: async (_e: Event) => {\n\t\t\t\tif (state.isLoading || state.options.disabled || state.options.loading) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Throttle\n\t\t\t\tif (state.throttleTimer) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tstate.throttleTimer = setTimeout(() => {\n\t\t\t\t\tstate.throttleTimer = null\n\t\t\t\t}, options.throttle)\n\n\t\t\t\t// Check scroll position\n\t\t\t\tconst shouldLoad = checkShouldLoad(container, el, options.distance || 0)\n\n\t\t\t\tif (shouldLoad) {\n\t\t\t\t\tawait triggerLoad(state, el)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__infiniteScroll = state\n\n\t\t// Use IntersectionObserver if available and enabled\n\t\tif (options.useIntersection && supportsIntersectionObserver()) {\n\t\t\tsetupIntersectionObserver(el, state)\n\t\t} else {\n\t\t\t// Use scroll event listener\n\t\t\ton(container, 'scroll', state.scrollHandler, { passive: true })\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: InfiniteScrollState = (el as any).__infiniteScroll\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: InfiniteScrollState = (el as any).__infiniteScroll\n\n\t\tif (!state) return\n\n\t\t// Clear throttle timer\n\t\tif (state.throttleTimer) {\n\t\t\tclearTimeout(state.throttleTimer)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\t// Remove sentinel\n\t\tif (state.sentinel && state.sentinel.parentNode) {\n\t\t\tstate.sentinel.parentNode.removeChild(state.sentinel)\n\t\t}\n\n\t\t// Remove scroll listener\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\n\t\tdelete (el as any).__infiniteScroll\n\t},\n})\n\n/**\n * Check if should load more\n */\nfunction checkShouldLoad(container: Element | Window, _el: HTMLElement, distance: number): boolean {\n\tif (container === window) {\n\t\tconst scrollTop = window.scrollY || document.documentElement.scrollTop\n\t\tconst scrollHeight = document.documentElement.scrollHeight\n\t\tconst clientHeight = window.innerHeight\n\n\t\treturn scrollTop + clientHeight >= scrollHeight - distance\n\t}\n\n\tconst el = container as Element\n\tconst scrollTop = el.scrollTop\n\tconst scrollHeight = el.scrollHeight\n\tconst clientHeight = el.clientHeight\n\n\treturn scrollTop + clientHeight >= scrollHeight - distance\n}\n\n/**\n * Trigger load handler\n */\nasync function triggerLoad(state: InfiniteScrollState, el: HTMLElement): Promise<void> {\n\tstate.isLoading = true\n\tstate.options.onLoadStart?.()\n\n\tel.classList.add('v-infinite-scroll--loading')\n\n\ttry {\n\t\tawait state.options.handler()\n\t} catch (err) {\n\t\tstate.options.onError?.(err as Error)\n\t} finally {\n\t\tstate.isLoading = false\n\t\tstate.options.onLoadEnd?.()\n\t\tel.classList.remove('v-infinite-scroll--loading')\n\t}\n}\n\n/**\n * Setup IntersectionObserver\n */\nfunction setupIntersectionObserver(el: HTMLElement, state: InfiniteScrollState): void {\n\t// Create sentinel element\n\tconst sentinel = document.createElement('div')\n\n\tsentinel.className = 'v-infinite-scroll__sentinel'\n\tsentinel.style.cssText = `\n height: 1px;\n width: 100%;\n clear: both;\n `\n\n\tel.appendChild(sentinel)\n\tstate.sentinel = sentinel\n\n\t// Create observer\n\tstate.observer = new IntersectionObserver(\n\t\tasync entries => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tif (!state.isLoading && !state.options.disabled && !state.options.loading) {\n\t\t\t\t\t\tawait triggerLoad(state, el)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\troot: state.container === window ? null : (state.container as Element),\n\t\t\trootMargin: `${state.options.distance || 0}px`,\n\t\t\tthreshold: 0,\n\t\t},\n\t)\n\n\tstate.observer.observe(sentinel)\n}\n\nexport default vInfiniteScroll\n", "import { defineDirective, isBrowser, supportsIntersectionObserver } from '@directix/core'\n\n/**\n * Intersect event handler\n */\nexport type IntersectHandler = (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\n/**\n * Intersect directive options\n */\nexport interface IntersectOptions {\n\t/** Callback when element intersects */\n\thandler?: IntersectHandler\n\t/** Callback when element enters viewport */\n\tonEnter?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\t/** Callback when element leaves viewport */\n\tonLeave?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\t/** Callback when element changes intersection */\n\tonChange?: (isIntersecting: boolean, entry: IntersectionObserverEntry) => void\n\t/** Root element for intersection @default null (viewport) */\n\troot?: Element | null\n\t/** Margin around the root @default '0px' */\n\trootMargin?: string\n\t/** Threshold(s) at which to trigger callback @default 0 */\n\tthreshold?: number | number[]\n\t/** Whether to disable @default false */\n\tdisabled?: boolean\n\t/** Whether to trigger only once @default false */\n\tonce?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type IntersectBinding = IntersectHandler | IntersectOptions\n\n/**\n * Element state storage\n */\ninterface IntersectState {\n\toptions: IntersectOptions\n\tobserver: IntersectionObserver | null\n\thasTriggeredOnce: boolean\n}\n\nconst STATE_KEY = '__intersect'\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: IntersectBinding | undefined): IntersectOptions {\n\tconst options: IntersectOptions = typeof binding === 'function' ? { handler: binding } : { ...binding }\n\n\t// Unref root if it's a ref object (for Vue Composition API)\n\tif (options.root !== null && typeof options.root === 'object' && 'value' in options.root) {\n\t\toptions.root = (options.root as { value: Element | null }).value\n\t}\n\n\treturn options\n}\n\n/**\n * Create observer callback\n */\nfunction createObserverCallback(\n\tel: HTMLElement,\n\tstate: IntersectState,\n\toptions: IntersectOptions,\n): (entries: IntersectionObserverEntry[]) => void {\n\treturn entries => {\n\t\tfor (const entry of entries) {\n\t\t\tif (options.once && state.hasTriggeredOnce) continue\n\n\t\t\tconst { isIntersecting } = entry\n\n\t\t\toptions.handler?.(entry, state.observer!)\n\t\t\toptions.onChange?.(isIntersecting, entry)\n\n\t\t\tif (isIntersecting) {\n\t\t\t\toptions.onEnter?.(entry, state.observer!)\n\t\t\t\tif (options.once) state.hasTriggeredOnce = true\n\t\t\t} else {\n\t\t\t\toptions.onLeave?.(entry, state.observer!)\n\t\t\t}\n\n\t\t\tel.dispatchEvent(new CustomEvent('intersect', { detail: { isIntersecting, entry } }))\n\t\t}\n\t}\n}\n\n/**\n * Create IntersectionObserver\n */\nfunction createObserver(\n\tel: HTMLElement,\n\tstate: IntersectState,\n\toptions: IntersectOptions,\n): IntersectionObserver {\n\treturn new IntersectionObserver(createObserverCallback(el, state, options), {\n\t\troot: options.root,\n\t\trootMargin: options.rootMargin,\n\t\tthreshold: options.threshold,\n\t})\n}\n\n/**\n * v-intersect directive\n *\n * @example\n * ```vue\n * <div v-intersect=\"handleIntersect\">Observe me</div>\n * <div v-intersect=\"{ onEnter: handleEnter, onLeave: handleLeave }\">Track visibility</div>\n * <div v-intersect=\"{ threshold: 0.5, once: true }\">Trigger once at 50%</div>\n * ```\n */\nexport const vIntersect = defineDirective<IntersectBinding, HTMLElement>({\n\tname: 'intersect',\n\tssr: false,\n\tdefaults: {\n\t\tdisabled: false,\n\t\tonce: false,\n\t\trootMargin: '0px',\n\t\tthreshold: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser() || !supportsIntersectionObserver()) {\n\t\t\tif (!supportsIntersectionObserver()) {\n\t\t\t\tconsole.warn('[Directix] v-intersect: IntersectionObserver not supported')\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tconst state: IntersectState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t\thasTriggeredOnce: false,\n\t\t}\n\n\t\tstate.observer = createObserver(el, state, options)\n\t\t;(el as any)[STATE_KEY] = state\n\t\tstate.observer.observe(el)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: IntersectState | undefined = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst observerOptionsChanged\n\t\t\t= newOptions.root !== state.options.root\n\t\t\t\t|| newOptions.rootMargin !== state.options.rootMargin\n\t\t\t\t|| newOptions.threshold !== state.options.threshold\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled !== state.options.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\tstate.observer?.disconnect()\n\t\t\t} else {\n\t\t\t\tstate.observer?.observe(el)\n\t\t\t}\n\t\t}\n\n\t\t// Recreate observer if options changed\n\t\tif (observerOptionsChanged) {\n\t\t\tstate.observer?.disconnect()\n\t\t\tstate.observer = createObserver(el, state, newOptions)\n\t\t\tstate.observer.observe(el)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: IntersectState | undefined = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tstate.observer?.disconnect()\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vIntersect\n", "import { defineDirective, supportsIntersectionObserver } from '@directix/core'\n\n/**\n * Lazy loading state\n */\nexport type LazyState = 'pending' | 'loading' | 'loaded' | 'error'\n\n/**\n * Lazy directive options\n */\nexport interface LazyOptions {\n\t/**\n\t * Image source URL\n\t */\n\tsrc?: string\n\n\t/**\n\t * Placeholder image URL\n\t */\n\tplaceholder?: string\n\n\t/**\n\t * Error image URL (shown when loading fails)\n\t */\n\terror?: string\n\n\t/**\n\t * Preload distance in pixels\n\t * @default 0\n\t */\n\tpreload?: number\n\n\t/**\n\t * Callback when image loads successfully\n\t */\n\tonLoad?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when image fails to load\n\t */\n\tonError?: (el: HTMLElement, error: Error) => void\n\n\t/**\n\t * Number of retry attempts\n\t * @default 1\n\t */\n\tattempt?: number\n\n\t/**\n\t * Filter function, return false to skip loading\n\t */\n\tfilter?: (src: string) => boolean\n\n\t/**\n\t * Custom IntersectionObserver\n\t */\n\tobserver?: IntersectionObserver\n\n\t/**\n\t * Whether to disable lazy loading\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LazyBinding = string | LazyOptions\n\n/**\n * Element state storage\n */\ninterface LazyElementState {\n\toptions: LazyOptions\n\tattempt: number\n\tobserver?: IntersectionObserver\n}\n\n// Global observer instance\nlet globalObserver: IntersectionObserver | null = null\n\n/**\n * Get or create global IntersectionObserver\n */\nfunction getGlobalObserver(preload: number): IntersectionObserver {\n\tif (globalObserver) return globalObserver\n\n\tglobalObserver = new IntersectionObserver(\n\t\tentries => {\n\t\t\tentries.forEach(entry => {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tload(entry.target as HTMLElement)\n\t\t\t\t\tglobalObserver?.unobserve(entry.target)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\trootMargin: `${preload}px`,\n\t\t},\n\t)\n\n\treturn globalObserver\n}\n\n/**\n * Set image source on element\n */\nfunction setSrc(el: HTMLElement, src: string): void {\n\tif (el.tagName === 'IMG') {\n\t\t;(el as HTMLImageElement).src = src\n\t} else {\n\t\tel.style.backgroundImage = `url(\"${src}\")`\n\t}\n}\n\n/**\n * Set lazy state on element\n */\nfunction setLazyState(el: HTMLElement, state: LazyState): void {\n\tel.dataset.lazyState = state\n}\n\n/**\n * Get lazy state from element\n */\nfunction getLazyState(el: HTMLElement): LazyState {\n\treturn (el.dataset.lazyState as LazyState) || 'pending'\n}\n\n/**\n * Load image\n */\nfunction load(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state || !state.options.src) return\n\n\t// Filter check\n\tif (state.options.filter && !state.options.filter(state.options.src)) {\n\t\treturn\n\t}\n\n\tsetLazyState(el, 'loading')\n\tstate.attempt++\n\n\tel.classList.add('v-lazy--loading')\n\n\tconst img = new Image()\n\n\timg.onload = () => {\n\t\tsetSrc(el, state.options.src!)\n\t\tsetLazyState(el, 'loaded')\n\t\tel.classList.remove('v-lazy--loading')\n\t\tel.classList.add('v-lazy--loaded')\n\t\tstate.options.onLoad?.(el)\n\t}\n\n\timg.onerror = () => {\n\t\tel.classList.remove('v-lazy--loading')\n\n\t\t// Check if should retry\n\t\tif (state.attempt < (state.options.attempt || 1)) {\n\t\t\tsetTimeout(() => load(el), 1000 * state.attempt)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Show error image\n\t\tif (state.options.error) {\n\t\t\tsetSrc(el, state.options.error)\n\t\t}\n\n\t\tsetLazyState(el, 'error')\n\t\tel.classList.add('v-lazy--error')\n\t\tstate.options.onError?.(el, new Error('Failed to load image'))\n\t}\n\n\timg.src = state.options.src\n}\n\n/**\n * Observe element\n */\nfunction observe(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state) return\n\n\t// Check IntersectionObserver support\n\tif (!supportsIntersectionObserver()) {\n\t\t// Fallback: load directly\n\t\tload(el)\n\n\t\treturn\n\t}\n\n\t// Use custom observer or global observer\n\tif (state.options.observer) {\n\t\tstate.observer = state.options.observer\n\t\tstate.observer.observe(el)\n\t} else {\n\t\tconst observer = getGlobalObserver(state.options.preload || 0)\n\n\t\tstate.observer = observer\n\t\tobserver.observe(el)\n\t}\n}\n\n/**\n * Unobserve element\n */\nfunction unobserve(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state) return\n\n\tif (state.observer) {\n\t\tstate.observer.unobserve(el)\n\t} else if (globalObserver) {\n\t\tglobalObserver.unobserve(el)\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LazyBinding | undefined): LazyOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { src: binding }\n\t}\n\n\treturn binding || {}\n}\n\n/**\n * v-lazy directive\n *\n * @example\n * ```vue\n * <template>\n * <img v-lazy=\"imageUrl\" />\n * <img v-lazy=\"{ src: imageUrl, placeholder: 'placeholder.jpg' }\" />\n * <div v-lazy=\"backgroundImageUrl\"></div>\n * </template>\n * ```\n */\nexport const vLazy = defineDirective<LazyBinding, HTMLElement>({\n\tname: 'lazy',\n\tssr: false,\n\tdefaults: {\n\t\tpreload: 0,\n\t\tattempt: 1,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\tif (!options.src) {\n\t\t\tconsole.warn('[Directix] v-lazy: No source provided')\n\n\t\t\treturn\n\t\t}\n\n\t\t// Set initial state\n\t\tsetLazyState(el, 'pending')\n\n\t\t// Set placeholder\n\t\tif (options.placeholder) {\n\t\t\tsetSrc(el, options.placeholder)\n\t\t}\n\n\t\t// Add class\n\t\tel.classList.add('v-lazy')\n\n\t\t// Store state\n\t\tconst state: LazyElementState = {\n\t\t\toptions,\n\t\t\tattempt: 0,\n\t\t}\n\n\t\t;(el as any).__lazy = state\n\n\t\t// Start observing\n\t\tobserve(el)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LazyElementState = (el as any).__lazy\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (newOptions.disabled) {\n\t\t\tunobserve(el)\n\n\t\t\treturn\n\t\t}\n\n\t\tif (newOptions.src !== state.options.src) {\n\t\t\tstate.options = newOptions\n\t\t\tstate.attempt = 0\n\n\t\t\t// If already loaded, reload\n\t\t\tif (getLazyState(el) !== 'pending') {\n\t\t\t\tsetLazyState(el, 'pending')\n\t\t\t\tel.classList.remove('v-lazy--loaded', 'v-lazy--error')\n\n\t\t\t\tif (newOptions.placeholder) {\n\t\t\t\t\tsetSrc(el, newOptions.placeholder)\n\t\t\t\t}\n\n\t\t\t\tobserve(el)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tunobserve(el)\n\t\tdelete (el as any).__lazy\n\t},\n})\n\nexport default vLazy\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { ensurePosition } from '@directix/shared'\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\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\t// Ensure element has relative positioning\n\t\tensurePosition(el)\n\n\t\t// Show loading if value is true\n\t\tif (options.value) {\n\t\t\tshowLoading(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LoadingState = (el as any).__loading\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (newOptions.disabled) {\n\t\t\thideLoading(el, state)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Handle loading state change\n\t\tif (newOptions.value && !state.options.value) {\n\t\t\tshowLoading(el, state)\n\t\t} else if (!newOptions.value && state.options.value) {\n\t\t\thideLoading(el, state)\n\t\t}\n\n\t\t// Update text if changed\n\t\tif (state.loadingOverlay && newOptions.text !== state.options.text) {\n\t\t\tconst textEl = state.loadingOverlay.querySelector(`.${state.options.textClass}`)\n\n\t\t\tif (textEl) {\n\t\t\t\ttextEl.textContent = newOptions.text || ''\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LoadingState = (el as any).__loading\n\n\t\tif (!state) return\n\n\t\thideLoading(el, state)\n\n\t\t// Restore original styles\n\t\tel.style.position = state.originalPosition\n\t\tel.style.overflow = state.originalOverflow\n\n\t\tdelete (el as any).__loading\n\t},\n})\n\n/**\n * Show loading overlay\n */\nfunction showLoading(el: HTMLElement, state: LoadingState): void {\n\tif (state.loadingOverlay) return\n\n\t// Create and append overlay\n\tstate.loadingOverlay = createLoadingOverlay(state.options)\n\tel.appendChild(state.loadingOverlay)\n\n\t// Lock scroll if needed\n\tif (state.options.lock) {\n\t\tel.style.overflow = 'hidden'\n\t}\n\n\t// Add class\n\tel.classList.add('v-loading--active')\n}\n\n/**\n * Hide loading overlay\n */\nfunction hideLoading(el: HTMLElement, state: LoadingState): void {\n\tif (!state.loadingOverlay) return\n\n\t// Remove overlay\n\tstate.loadingOverlay.remove()\n\tstate.loadingOverlay = null\n\n\t// Restore scroll\n\tif (state.options.lock) {\n\t\tel.style.overflow = state.originalOverflow\n\t}\n\n\t// Remove class\n\tel.classList.remove('v-loading--active')\n}\n\nexport default vLoading\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { getEventPosition, off, on } from '@directix/shared'\n\n/**\n * Long press handler\n */\nexport type LongPressHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Long press directive options\n */\nexport interface LongPressOptions {\n\t/**\n\t * Callback when long press is triggered\n\t * @required\n\t */\n\thandler: LongPressHandler\n\n\t/**\n\t * Duration in milliseconds to trigger long press\n\t * @default 500\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Maximum movement distance before canceling\n\t * @default 10\n\t */\n\tdistance?: number\n\n\t/**\n\t * Callback when long press starts (on mousedown/touchstart)\n\t */\n\tonStart?: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Callback when long press is canceled\n\t */\n\tonCancel?: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Callback on each tick during long press\n\t */\n\tonTick?: (remaining: number) => void\n\n\t/**\n\t * Interval for onTick callback in milliseconds\n\t * @default 100\n\t */\n\ttickInterval?: number\n\n\t/**\n\t * Whether to prevent default behavior\n\t * @default true\n\t */\n\tprevent?: boolean\n\n\t/**\n\t * Whether to stop propagation\n\t * @default false\n\t */\n\tstop?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LongPressBinding = LongPressHandler | LongPressOptions\n\n/**\n * Element state storage\n */\ninterface LongPressState {\n\toptions: LongPressOptions\n\ttimerId: ReturnType<typeof setTimeout> | null\n\ttickTimerId: ReturnType<typeof setInterval> | null\n\tstartTime: number\n\tstartPos: { x: number, y: number }\n\tstartHandler: (e: Event) => void\n\tendHandler: (e: Event) => void\n\tmoveHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LongPressBinding | undefined): LongPressOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, duration: 500, distance: 10 }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-long-press: handler is required')\n\t}\n\n\treturn {\n\t\tduration: 500,\n\t\tdistance: 10,\n\t\tdisabled: false,\n\t\tprevent: true,\n\t\tstop: false,\n\t\ttickInterval: 100,\n\t\t...binding,\n\t}\n}\n\n/**\n * Calculate distance between two points\n */\nfunction getDistance(p1: { x: number, y: number }, p2: { x: number, y: number }): number {\n\treturn Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2)\n}\n\n/**\n * v-long-press directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-long-press=\"handleLongPress\">Long Press Me</button>\n * <button v-long-press=\"{ handler: handleLongPress, duration: 1000 }\">1 Second Press</button>\n * </template>\n * ```\n */\nexport const vLongPress = defineDirective<LongPressBinding, HTMLElement>({\n\tname: 'long-press',\n\tssr: false,\n\tdefaults: {\n\t\tduration: 500,\n\t\tdistance: 10,\n\t\tdisabled: false,\n\t\tprevent: true,\n\t\tstop: false,\n\t\ttickInterval: 100,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst state: LongPressState = {\n\t\t\toptions,\n\t\t\ttimerId: null,\n\t\t\ttickTimerId: null,\n\t\t\tstartTime: 0,\n\t\t\tstartPos: { x: 0, y: 0 },\n\t\t\tstartHandler: () => {},\n\t\t\tendHandler: () => {},\n\t\t\tmoveHandler: () => {},\n\t\t}\n\n\t\t// Start handler\n\t\tstate.startHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\n\t\t\t// Prevent context menu on long press\n\t\t\tif (options.prevent) {\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\n\t\t\tif (options.stop) {\n\t\t\t\tevent.stopPropagation()\n\t\t\t}\n\n\t\t\t// Clear any existing timer\n\t\t\tif (state.timerId) {\n\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\tstate.timerId = null\n\t\t\t}\n\n\t\t\tif (state.tickTimerId) {\n\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\tstate.tickTimerId = null\n\t\t\t}\n\n\t\t\t// Store start position\n\t\t\tconst pos = getEventPosition(event)\n\n\t\t\tstate.startPos = { x: pos.x, y: pos.y }\n\t\t\tstate.startTime = Date.now()\n\n\t\t\t// Trigger start callback\n\t\t\toptions.onStart?.(event)\n\n\t\t\t// Start tick timer\n\t\t\tif (options.onTick) {\n\t\t\t\tlet remaining = options.duration!\n\n\t\t\t\tstate.tickTimerId = setInterval(() => {\n\t\t\t\t\tremaining -= options.tickInterval!\n\t\t\t\t\toptions.onTick?.(Math.max(0, remaining))\n\t\t\t\t}, options.tickInterval)\n\t\t\t}\n\n\t\t\t// Start long press timer\n\t\t\tstate.timerId = setTimeout(() => {\n\t\t\t\tif (state.tickTimerId) {\n\t\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\t\tstate.tickTimerId = null\n\t\t\t\t}\n\t\t\t\toptions.handler(event)\n\t\t\t}, options.duration)\n\t\t}\n\n\t\t// End handler\n\t\tstate.endHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\n\t\t\tif (state.timerId) {\n\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\tstate.timerId = null\n\t\t\t}\n\n\t\t\tif (state.tickTimerId) {\n\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\tstate.tickTimerId = null\n\t\t\t}\n\n\t\t\t// Trigger cancel callback if was in progress\n\t\t\tif (state.startTime > 0) {\n\t\t\t\toptions.onCancel?.(event)\n\t\t\t}\n\n\t\t\tstate.startTime = 0\n\t\t}\n\n\t\t// Move handler - cancel if moved too far\n\t\tstate.moveHandler = (e: Event) => {\n\t\t\tif (!state.timerId) return\n\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\t\t\tconst pos = getEventPosition(event)\n\t\t\tconst distance = getDistance(state.startPos, { x: pos.x, y: pos.y })\n\n\t\t\tif (distance > (options.distance || 10)) {\n\t\t\t\tif (state.timerId) {\n\t\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\t\tstate.timerId = null\n\t\t\t\t}\n\n\t\t\t\tif (state.tickTimerId) {\n\t\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\t\tstate.tickTimerId = null\n\t\t\t\t}\n\n\t\t\t\toptions.onCancel?.(event)\n\t\t\t\tstate.startTime = 0\n\t\t\t}\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__longPress = state\n\n\t\t// Bind events - mouse\n\t\ton(el, 'mousedown', state.startHandler)\n\t\ton(el, 'mouseup', state.endHandler)\n\t\ton(el, 'mouseleave', state.endHandler)\n\t\ton(el, 'mousemove', state.moveHandler)\n\n\t\t// Bind events - touch\n\t\ton(el, 'touchstart', state.startHandler, { passive: !options.prevent })\n\t\ton(el, 'touchend', state.endHandler)\n\t\ton(el, 'touchcancel', state.endHandler)\n\t\ton(el, 'touchmove', state.moveHandler, { passive: true })\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LongPressState = (el as any).__longPress\n\n\t\tif (!state) {\n\t\t\t// Re-initialize if not exists\n\t\t\tconst options = normalizeOptions(binding.value)\n\n\t\t\tif (!options.disabled) {\n\t\t\t\t// Re-mount by clearing and re-setting\n\t\t\t\t;(el as any).__longPress = null\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LongPressState = (el as any).__longPress\n\n\t\tif (!state) return\n\n\t\t// Clear timers\n\t\tif (state.timerId) {\n\t\t\tclearTimeout(state.timerId)\n\t\t}\n\n\t\tif (state.tickTimerId) {\n\t\t\tclearInterval(state.tickTimerId)\n\t\t}\n\n\t\t// Unbind events - mouse\n\t\toff(el, 'mousedown', state.startHandler)\n\t\toff(el, 'mouseup', state.endHandler)\n\t\toff(el, 'mouseleave', state.endHandler)\n\t\toff(el, 'mousemove', state.moveHandler)\n\n\t\t// Unbind events - touch\n\t\toff(el, 'touchstart', state.startHandler)\n\t\toff(el, 'touchend', state.endHandler)\n\t\toff(el, 'touchcancel', state.endHandler)\n\t\toff(el, 'touchmove', state.moveHandler)\n\n\t\tdelete (el as any).__longPress\n\t},\n})\n\nexport default vLongPress\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Lottie animation state type\n */\nexport type LottieAnimationState = 'playing' | 'paused' | 'stopped'\n\n/**\n * Lottie directive options\n */\nexport interface LottieOptions {\n\t/**\n\t * Animation data (JSON) or URL to animation file\n\t */\n\tanimationData: object | string\n\n\t/**\n\t * Whether to autoplay\n\t * @default true\n\t */\n\tautoplay?: boolean\n\n\t/**\n\t * Whether to loop\n\t * @default true\n\t */\n\tloop?: boolean\n\n\t/**\n\t * Animation speed (0.1 to 3)\n\t * @default 1\n\t */\n\tspeed?: number\n\n\t/**\n\t * Animation direction (1 for forward, -1 for reverse)\n\t * @default 1\n\t */\n\tdirection?: 1 | -1\n\n\t/**\n\t * Animation segments to play [startFrame, endFrame]\n\t */\n\tsegments?: [number, number]\n\n\t/**\n\t * Renderer type\n\t * @default 'svg'\n\t */\n\trenderer?: 'svg' | 'canvas' | 'html'\n\n\t/**\n\t * Whether to preserve aspect ratio\n\t * @default true\n\t */\n\tpreserveAspectRatio?: boolean\n\n\t/**\n\t * Custom class for container\n\t */\n\tclass?: string\n\n\t/**\n\t * Callback when animation is ready\n\t */\n\tonReady?: (animation: any) => void\n\n\t/**\n\t * Callback when animation completes\n\t */\n\tonComplete?: () => void\n\n\t/**\n\t * Callback when animation loops\n\t */\n\tonLoopComplete?: () => void\n\n\t/**\n\t * Callback on frame update\n\t */\n\tonEnterFrame?: (frame: number) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type LottieBinding = string | object | LottieOptions\n\n/**\n * Element state storage\n */\ninterface LottieState {\n\toptions: LottieOptions\n\tanimation: any\n\tcontainer: HTMLDivElement\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LottieBinding): LottieOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { animationData: binding }\n\t}\n\n\tif (binding && typeof binding === 'object' && !('animationData' in binding)) {\n\t\treturn { animationData: binding }\n\t}\n\n\treturn {\n\t\tautoplay: true,\n\t\tloop: true,\n\t\tspeed: 1,\n\t\tdirection: 1,\n\t\trenderer: 'svg',\n\t\tpreserveAspectRatio: true,\n\t\t...(binding as LottieOptions),\n\t}\n}\n\n/**\n * Dynamically load Lottie library\n */\nasync function loadLottie(): Promise<any> {\n\tif ((window as any).lottie) {\n\t\treturn (window as any).lottie\n\t}\n\n\t// Dynamic import\n\ttry {\n\t\tconst lottie = await import('lottie-web')\n\t\t;(window as any).lottie = lottie.default || lottie\n\t\treturn lottie.default || lottie\n\t} catch {\n\t\tconsole.warn('[Directix] v-lottie: lottie-web not found. Please install it: npm install lottie-web')\n\t\treturn null\n\t}\n}\n\n/**\n * v-lottie directive\n * Lottie animation player\n *\n * @example\n * ```vue\n * <template>\n * <!-- With URL -->\n * <div v-lottie=\"'https://assets.example.com/animation.json'\"></div>\n *\n * <!-- With animation data -->\n * <div v-lottie=\"animationData\"></div>\n *\n * <!-- With options -->\n * <div v-lottie=\"{\n * animationData: animationData,\n * autoplay: true,\n * loop: true,\n * speed: 1.5,\n * onComplete: () => console.log('Done')\n * }\"></div>\n * </template>\n *\n * <script setup>\n * import animationData from './animation.json'\n * </script>\n * ```\n */\nexport const vLottie = defineDirective<LottieBinding, HTMLElement>({\n\tname: 'lottie',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst container = document.createElement('div')\n\t\tcontainer.className = `v-lottie ${options.class || ''}`\n\t\tcontainer.style.cssText = `\n width: 100%;\n height: 100%;\n ${options.preserveAspectRatio !== false ? 'display: flex; align-items: center; justify-content: center;' : ''}\n `\n\n\t\tel.appendChild(container)\n\n\t\tconst state: LottieState = {\n\t\t\toptions,\n\t\t\tanimation: null,\n\t\t\tcontainer,\n\t\t}\n\n\t\t;(el as any).__lottie = state\n\n\t\t// Load and initialize animation\n\t\tinitAnimation(state)\n\n\t\tel.classList.add('v-lottie-container')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LottieState = (el as any).__lottie\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst oldData = state.options.animationData\n\t\tconst newData = newOptions.animationData\n\n\t\t// Check if animation data changed\n\t\tif (JSON.stringify(oldData) !== JSON.stringify(newData)) {\n\t\t\t// Destroy old animation\n\t\t\tif (state.animation) {\n\t\t\t\tstate.animation.destroy()\n\t\t\t}\n\n\t\t\tstate.options = newOptions\n\t\t\tinitAnimation(state)\n\t\t} else {\n\t\t\t// Update options\n\t\t\tstate.options = newOptions\n\n\t\t\tif (state.animation) {\n\t\t\t\t// Update speed\n\t\t\t\tif (newOptions.speed !== undefined) {\n\t\t\t\t\tstate.animation.setSpeed(newOptions.speed)\n\t\t\t\t}\n\n\t\t\t\t// Update direction\n\t\t\t\tif (newOptions.direction !== undefined) {\n\t\t\t\t\tstate.animation.setDirection(newOptions.direction)\n\t\t\t\t}\n\n\t\t\t\t// Update loop\n\t\t\t\tif (newOptions.loop !== undefined) {\n\t\t\t\t\tstate.animation.loop = newOptions.loop\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LottieState = (el as any).__lottie\n\n\t\tif (!state) return\n\n\t\tif (state.animation) {\n\t\t\tstate.animation.destroy()\n\t\t}\n\n\t\tel.removeChild(state.container)\n\t\tel.classList.remove('v-lottie-container')\n\n\t\tdelete (el as any).__lottie\n\t},\n})\n\n/**\n * Initialize animation\n */\nasync function initAnimation(state: LottieState): Promise<void> {\n\tconst lottie = await loadLottie()\n\n\tif (!lottie) return\n\n\tconst options = state.options\n\n\tconst animationConfig: any = {\n\t\tcontainer: state.container,\n\t\trenderer: options.renderer || 'svg',\n\t\tloop: options.loop !== false,\n\t\tautoplay: options.autoplay !== false,\n\t}\n\n\t// Set animation source\n\tif (typeof options.animationData === 'string' && options.animationData.startsWith('http')) {\n\t\tanimationConfig.path = options.animationData\n\t} else {\n\t\tanimationConfig.animationData = options.animationData\n\t}\n\n\tstate.animation = lottie.loadAnimation(animationConfig)\n\n\t// Set speed\n\tif (options.speed !== undefined) {\n\t\tstate.animation.setSpeed(options.speed)\n\t}\n\n\t// Set direction\n\tif (options.direction !== undefined) {\n\t\tstate.animation.setDirection(options.direction)\n\t}\n\n\t// Play segments if specified\n\tif (options.segments) {\n\t\tstate.animation.playSegments(options.segments, true)\n\t}\n\n\t// Event listeners\n\tif (options.onReady) {\n\t\tstate.animation.addEventListener('DOMLoaded', () => {\n\t\t\toptions.onReady!(state.animation)\n\t\t})\n\t}\n\n\tif (options.onComplete) {\n\t\tstate.animation.addEventListener('complete', options.onComplete)\n\t}\n\n\tif (options.onLoopComplete) {\n\t\tstate.animation.addEventListener('loopComplete', options.onLoopComplete)\n\t}\n\n\tif (options.onEnterFrame) {\n\t\tstate.animation.addEventListener('enterFrame', (e: any) => {\n\t\t\toptions.onEnterFrame!(e.currentTime)\n\t\t})\n\t}\n\n\t// Expose animation methods on element\n\tconst el = state.container.parentElement\n\tif (el) {\n\t\t;(el as any).lottiePlay = () => state.animation?.play()\n\t\t;(el as any).lottiePause = () => state.animation?.pause()\n\t\t;(el as any).lottieStop = () => state.animation?.stop()\n\t\t;(el as any).lottieSetSpeed = (speed: number) => state.animation?.setSpeed(speed)\n\t\t;(el as any).lottieSetDirection = (direction: 1 | -1) => state.animation?.setDirection(direction)\n\t\t;(el as any).lottieGoToAndPlay = (frame: number, isFrame: boolean = true) => state.animation?.goToAndPlay(frame, isFrame)\n\t\t;(el as any).lottieGoToAndStop = (frame: number, isFrame: boolean = true) => state.animation?.goToAndStop(frame, isFrame)\n\t}\n}\n\nexport default vLottie\n", "import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Lowercase directive options\n */\nexport interface LowercaseOptions {\n\t/**\n\t * Transform only the first character\n\t * @default false\n\t */\n\tfirst?: boolean\n\n\t/**\n\t * Transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LowercaseBinding = boolean | LowercaseOptions\n\n/**\n * Transform text to lowercase\n */\nfunction transformText(text: string, options: LowercaseOptions): string {\n\tif (!text) return text\n\n\tif (options.first) {\n\t\treturn text.charAt(0).toLowerCase() + text.slice(1)\n\t}\n\n\treturn text.toLowerCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LowercaseBinding | undefined): LowercaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { first: false, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { first: false, onInput: false }\n\t}\n\n\treturn {\n\t\tfirst: binding.first ?? false,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-lowercase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Transform all characters to lowercase -->\n * <input v-lowercase v-model=\"text\" />\n *\n * <!-- Transform only first character -->\n * <span v-lowercase=\"{ first: true }\">{{ text }}</span>\n * </template>\n * ```\n */\nexport const vLowercase = defineDirective<LowercaseBinding, HTMLElement>({\n\tname: 'lowercase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => transformText(text, options))\n\n\t\t\t;(el as any).__lowercaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = transformText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__lowercaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__lowercaseCleanup\n\t},\n})\n\nexport default vLowercase\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { isInputElement, 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\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 (!isInputElement(el)) {\n\t\t\tconsole.warn('[Directix] v-mask: directive must be used on input or textarea elements')\n\n\t\t\treturn\n\t\t}\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst placeholder = options.placeholder || '_'\n\t\tconst tokens = parseMask(options.mask, placeholder)\n\n\t\tconst inputHandler = (e: Event): void => {\n\t\t\tconst target = e.target as HTMLInputElement\n\t\t\tconst rawValue = target.value\n\t\t\tconst cursorPos = target.selectionStart || 0\n\n\t\t\tconst formatted = formatValue(rawValue, tokens, placeholder, options.showPlaceholder ?? true)\n\n\t\t\tif (formatted !== rawValue) {\n\t\t\t\ttarget.value = formatted\n\t\t\t\ttarget.setSelectionRange(getCursorPos(tokens, cursorPos), getCursorPos(tokens, cursorPos))\n\t\t\t\ttarget.dispatchEvent(new Event('input', { bubbles: true }))\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\toptions.onChange?.(formatted, getRawValue(formatted, tokens, placeholder))\n\t\t\tif (isComplete(formatted, tokens, placeholder)) {\n\t\t\t\toptions.onComplete?.(formatted)\n\t\t\t}\n\t\t}\n\n\t\tconst focusHandler = (): void => {\n\t\t\tif (!el.value && options.showPlaceholder) {\n\t\t\t\tel.value = formatValue('', tokens, placeholder, true)\n\t\t\t}\n\t\t}\n\n\t\tconst blurHandler = (): void => {\n\t\t\tif (!options.showMaskOnBlur && !isComplete(el.value, tokens, placeholder) && options.clearIncomplete) {\n\t\t\t\tel.value = ''\n\t\t\t}\n\t\t}\n\n\t\ton(el, 'input', inputHandler)\n\t\ton(el, 'focus', focusHandler)\n\t\ton(el, 'blur', blurHandler)\n\n\t\t;(el as any)[STATE_KEY] = { options, tokens, placeholder, inputHandler, focusHandler, blurHandler }\n\n\t\tif (el.value) {\n\t\t\tel.value = formatValue(el.value, tokens, placeholder, options.showPlaceholder ?? true)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: MaskState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t\tstate.tokens = parseMask(state.options.mask, state.placeholder)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MaskState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\toff(el, 'input', state.inputHandler)\n\t\toff(el, 'focus', state.focusHandler)\n\t\toff(el, 'blur', state.blurHandler)\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vMask\n", "/**\n * Shared utilities for number and money formatting directives\n */\n\nimport { clamp } from '@directix/shared'\n\n/**\n * Base options shared by number and money formatting\n */\nexport interface NumberFormatOptions {\n\t/** Number of decimal places */\n\tprecision?: number\n\t/** Thousands separator */\n\tseparator?: string\n\t/** Decimal separator */\n\tdecimal?: string\n\t/** Whether to allow negative numbers @default true */\n\tallowNegative?: boolean\n\t/** Minimum value */\n\tmin?: number\n\t/** Maximum value */\n\tmax?: number\n}\n\n/**\n * Format number to string with thousands separator\n */\nexport function formatNumber(value: number, options: NumberFormatOptions): string {\n\tconst { precision = 0, separator = ',', decimal = '.', prefix = '', suffix = '' } = options as any\n\n\tconst fixed = value.toFixed(precision)\n\tconst [intPart, decPart] = fixed.split('.')\n\n\t// Add thousands separator to integer part\n\tconst formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n\n\tlet result = formattedInt\n\n\tif (precision > 0 && decPart) {\n\t\tresult += decimal + decPart\n\t}\n\n\treturn prefix + result + suffix\n}\n\n/**\n * Parse string to number, removing non-numeric characters\n */\nexport function parseToNumber(value: string, decimal: string): number | null {\n\tconst cleaned = value.replace(/[^\\d.-]/g, '').replace(decimal, '.')\n\tconst num = Number.parseFloat(cleaned)\n\n\treturn isNaN(num) ? null : num\n}\n\n/**\n * Clamp value within min/max bounds\n */\nexport function clampValue(value: number, options: NumberFormatOptions): number {\n\tlet result = value\n\n\t// allowNegative defaults to true if not specified\n\tconst allowNegative = options.allowNegative ?? true\n\n\tif (!allowNegative && result < 0) {\n\t\tresult = Math.abs(result)\n\t}\n\n\treturn clamp(result, options.min, options.max)\n}\n\n/**\n * Calculate cursor position after formatting\n * Preserves cursor position relative to digit count\n */\nexport function calculateCursorPosition(\n\trawValue: string,\n\tformatted: string,\n\tcursorPos: number,\n\tstartOffset: number = 0,\n): number {\n\t// Count digits before cursor in old value\n\tlet digitsBeforeCursor = 0,\n\t\t// Find position after same number of digits in new value\n\t\tdigitCount = 0\n\n\tfor (let i = 0; i < cursorPos && i < rawValue.length; i++) {\n\t\tif (/\\d/.test(rawValue[i])) {\n\t\t\tdigitsBeforeCursor++\n\t\t}\n\t}\n\n\tfor (let i = startOffset; i < formatted.length; i++) {\n\t\tif (/\\d/.test(formatted[i])) {\n\t\t\tdigitCount++\n\t\t}\n\t\tif (digitCount >= digitsBeforeCursor) {\n\t\t\treturn i + 1\n\t\t}\n\t}\n\n\t// Default to end of formatted string\n\treturn formatted.length\n}\n\n/**\n * Setup input element with live formatting\n */\nexport function setupNumberInput(\n\tel: HTMLInputElement | HTMLTextAreaElement,\n\toptions: NumberFormatOptions & { prefix?: string, suffix?: string },\n\tformatFn: (value: number, options: any) => string,\n): () => void {\n\tconst { decimal = '.', prefix = '' } = options\n\tlet isFormatting = false\n\n\tconst onInput = (): void => {\n\t\tif (isFormatting) return\n\n\t\tconst rawValue = el.value\n\t\tconst cursorPos = el.selectionStart || 0\n\n\t\t// Handle empty or just minus\n\t\tif (!rawValue || rawValue === '-') {\n\t\t\treturn\n\t\t}\n\n\t\t// Parse the number\n\t\tconst num = parseToNumber(rawValue, decimal)\n\n\t\tif (num === null) {\n\t\t\tisFormatting = true\n\t\t\tel.value = ''\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\n\t\t\treturn\n\t\t}\n\n\t\t// Format the number\n\t\tconst clamped = clampValue(num, options)\n\t\tconst formatted = formatFn(clamped, options)\n\n\t\tif (formatted !== rawValue) {\n\t\t\tisFormatting = true\n\n\t\t\t// Calculate new cursor position (start after prefix)\n\t\t\tconst startOffset = prefix.length\n\t\t\tconst newCursorPos = calculateCursorPosition(rawValue, formatted, cursorPos, startOffset)\n\n\t\t\tel.value = formatted\n\t\t\tel.setSelectionRange(newCursorPos, newCursorPos)\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\tconst onBlur = (): void => {\n\t\tif (!el.value || el.value === '-') return\n\n\t\tconst num = parseToNumber(el.value, decimal)\n\n\t\tif (num !== null) {\n\t\t\tconst clamped = clampValue(num, options)\n\t\t\tconst formatted = formatFn(clamped, options)\n\n\t\t\tisFormatting = true\n\t\t\tel.value = formatted\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\tel.addEventListener('input', onInput)\n\tel.addEventListener('blur', onBlur)\n\n\t// Initial format\n\tif (el.value) {\n\t\tconst num = parseToNumber(el.value, decimal)\n\n\t\tif (num !== null) {\n\t\t\tconst formatted = formatFn(clampValue(num, options), options)\n\n\t\t\tisFormatting = true\n\t\t\tel.value = formatted\n\t\t\t// Trigger input to sync with v-model\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\treturn () => {\n\t\tel.removeEventListener('input', onInput)\n\t\tel.removeEventListener('blur', onBlur)\n\t}\n}\n", "import { defineDirective } from '@directix/core'\nimport { isInputElement } from '@directix/shared'\nimport { clampValue, type NumberFormatOptions, parseToNumber, setupNumberInput } from '../utils/number'\n\n/**\n * Money directive options\n */\nexport interface MoneyOptions extends NumberFormatOptions {\n\t/** Currency symbol @default '$' */\n\tsymbol?: string\n\t/** Symbol position @default 'before' */\n\tsymbolPosition?: 'before' | 'after'\n}\n\nexport type MoneyBinding = string | MoneyOptions\n\ninterface MoneyState {\n\toptions: MoneyOptions\n\tcleanup: () => void\n}\n\n/**\n * Format number to money string\n */\nfunction formatMoney(value: number, options: MoneyOptions): string {\n\tconst { precision = 2, separator = ',', decimal = '.', symbol = '$', symbolPosition = 'before' } = options\n\n\tconst fixed = value.toFixed(precision)\n\tconst [intPart, decPart] = fixed.split('.')\n\n\t// Add thousands separator\n\tconst formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n\n\tlet result = formattedInt\n\n\tif (precision > 0 && decPart) {\n\t\tresult += decimal + decPart\n\t}\n\n\treturn symbolPosition === 'before' ? symbol + result : result + symbol\n}\n\nexport const vMoney = defineDirective<MoneyBinding, HTMLElement>({\n\tname: 'money',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options: MoneyOptions = typeof binding.value === 'string' ? { symbol: binding.value } : (binding.value ?? {})\n\n\t\t// Set defaults for money\n\t\toptions.precision = options.precision ?? 2\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst { symbol = '$', symbolPosition = 'before' } = options\n\t\t\t// For money, prefix is the symbol when positioned before\n\t\t\tconst prefix = symbolPosition === 'before' ? symbol : ''\n\t\t\tconst cleanup = setupNumberInput(el as HTMLInputElement, { ...options, prefix }, formatMoney)\n\n\t\t\t;(el as any).__money = { options, cleanup }\n\n\t\t\t// Format initial value after DOM is ready\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst inputEl = el as HTMLInputElement\n\n\t\t\t\tif (inputEl.value) {\n\t\t\t\t\tconst num = parseToNumber(inputEl.value, options.decimal || '.')\n\n\t\t\t\t\tif (num !== null) {\n\t\t\t\t\t\tconst formatted = formatMoney(clampValue(num, options), options)\n\n\t\t\t\t\t\tif (formatted !== inputEl.value) {\n\t\t\t\t\t\t\tinputEl.value = formatted\n\t\t\t\t\t\t\tinputEl.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\t// For non-input elements, format the text content\n\t\t\tlet value: number | null = null\n\n\t\t\tif (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t} else {\n\t\t\t\t// Try to parse from element's text content\n\t\t\t\tconst textContent = el.textContent?.trim()\n\n\t\t\t\tif (textContent) {\n\t\t\t\t\tvalue = parseToNumber(textContent, options.decimal || '.')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatMoney(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options: MoneyOptions = typeof binding.value === 'string' ? { symbol: binding.value } : (binding.value ?? {})\n\n\t\t// Set defaults for money\n\t\toptions.precision = options.precision ?? 2\n\n\t\tconst state: MoneyState | undefined = (el as any).__money\n\n\t\tif (state) {\n\t\t\tstate.options = options\n\t\t} else if (!isInputElement(el)) {\n\t\t\t// Only format non-input elements on update\n\t\t\tlet value: number | null = null\n\n\t\t\tif (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatMoney(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MoneyState | undefined = (el as any).__money\n\n\t\tstate?.cleanup()\n\t\tdelete (el as any).__money\n\t},\n})\n\nexport default vMoney\n", "import { defineDirective, isBrowser, supportsMutationObserver } from '@directix/core'\n\n/**\n * Mutation change handler\n */\nexport type MutationHandler = (mutations: MutationRecord[], observer: MutationObserver) => void\n\n/**\n * Mutation directive options\n */\nexport interface MutationOptions {\n\t/**\n\t * Callback when mutations occur\n\t * @required\n\t */\n\thandler: MutationHandler\n\n\t/**\n\t * Whether to observe attribute changes\n\t * @default false\n\t */\n\tattributes?: boolean\n\n\t/**\n\t * Specific attributes to observe\n\t */\n\tattributeFilter?: string[]\n\n\t/**\n\t * Whether to observe child node additions/removals\n\t * @default true\n\t */\n\tchildList?: boolean\n\n\t/**\n\t * Whether to observe all descendants, not just direct children\n\t * @default false\n\t */\n\tsubtree?: boolean\n\n\t/**\n\t * Whether to observe character data changes\n\t * @default false\n\t */\n\tcharacterData?: boolean\n\n\t/**\n\t * Whether to record old attribute values\n\t * @default false\n\t */\n\tattributeOldValue?: boolean\n\n\t/**\n\t * Whether to record old character data\n\t * @default false\n\t */\n\tcharacterDataOldValue?: boolean\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type MutationBinding = MutationHandler | MutationOptions\n\n/**\n * Element state storage\n */\ninterface MutationState {\n\toptions: MutationOptions\n\tobserver: MutationObserver | null\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: MutationBinding | undefined): MutationOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, childList: true }\n\t}\n\n\tif (!binding || !binding.handler) {\n\t\tthrow new Error('[Directix] v-mutation: handler is required')\n\t}\n\n\treturn {\n\t\tattributes: false,\n\t\tchildList: true,\n\t\tsubtree: false,\n\t\tcharacterData: false,\n\t\tattributeOldValue: false,\n\t\tcharacterDataOldValue: false,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-mutation directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-mutation=\"handleMutation\">Observe my changes</div>\n * <div v-mutation=\"{ handler: handleMutation, attributes: true, subtree: true }\">\n * Observe attributes and subtree\n * </div>\n * </template>\n *\n * <script setup>\n * function handleMutation(mutations: MutationRecord[], observer: MutationObserver) {\n * mutations.forEach(mutation => {\n * console.log('Type:', mutation.type)\n * console.log('Target:', mutation.target)\n * })\n * }\n * </script>\n * ```\n */\nexport const vMutation = defineDirective<MutationBinding, HTMLElement>({\n\tname: 'mutation',\n\tssr: false,\n\tdefaults: {\n\t\tattributes: false,\n\t\tchildList: true,\n\t\tsubtree: false,\n\t\tcharacterData: false,\n\t\tattributeOldValue: false,\n\t\tcharacterDataOldValue: false,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Check MutationObserver support\n\t\tif (!supportsMutationObserver()) {\n\t\t\tconsole.warn('[Directix] v-mutation: MutationObserver not supported')\n\n\t\t\treturn\n\t\t}\n\n\t\tconst state: MutationState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t}\n\n\t\t// Create observer\n\t\tstate.observer = new MutationObserver((mutations, observer) => {\n\t\t\toptions.handler(mutations, observer)\n\t\t})\n\n\t\t// Start observing\n\t\tstate.observer.observe(el, {\n\t\t\tattributes: options.attributes,\n\t\t\tattributeFilter: options.attributeFilter,\n\t\t\tchildList: options.childList,\n\t\t\tsubtree: options.subtree,\n\t\t\tcharacterData: options.characterData,\n\t\t\tattributeOldValue: options.attributeOldValue,\n\t\t\tcharacterDataOldValue: options.characterDataOldValue,\n\t\t})\n\n\t\t// Store state\n\t\t;(el as any).__mutation = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: MutationState = (el as any).__mutation\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disconnect if was enabled\n\t\t\tif (state.observer) {\n\t\t\t\tstate.observer.disconnect()\n\t\t\t}\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Re-observe if was disabled\n\t\t\tif (state.observer) {\n\t\t\t\tstate.observer.observe(el, {\n\t\t\t\t\tattributes: newOptions.attributes,\n\t\t\t\t\tattributeFilter: newOptions.attributeFilter,\n\t\t\t\t\tchildList: newOptions.childList,\n\t\t\t\t\tsubtree: newOptions.subtree,\n\t\t\t\t\tcharacterData: newOptions.characterData,\n\t\t\t\t\tattributeOldValue: newOptions.attributeOldValue,\n\t\t\t\t\tcharacterDataOldValue: newOptions.characterDataOldValue,\n\t\t\t\t})\n\t\t\t}\n\t\t} else if (!newOptions.disabled) {\n\t\t\t// If options changed, reconnect with new options\n\t\t\tif (\n\t\t\t\tnewOptions.attributes !== state.options.attributes\n\t\t\t\t|| newOptions.childList !== state.options.childList\n\t\t\t\t|| newOptions.subtree !== state.options.subtree\n\t\t\t\t|| newOptions.characterData !== state.options.characterData\n\t\t\t) {\n\t\t\t\tif (state.observer) {\n\t\t\t\t\tstate.observer.disconnect()\n\t\t\t\t\tstate.observer.observe(el, {\n\t\t\t\t\t\tattributes: newOptions.attributes,\n\t\t\t\t\t\tattributeFilter: newOptions.attributeFilter,\n\t\t\t\t\t\tchildList: newOptions.childList,\n\t\t\t\t\t\tsubtree: newOptions.subtree,\n\t\t\t\t\t\tcharacterData: newOptions.characterData,\n\t\t\t\t\t\tattributeOldValue: newOptions.attributeOldValue,\n\t\t\t\t\t\tcharacterDataOldValue: newOptions.characterDataOldValue,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MutationState = (el as any).__mutation\n\n\t\tif (!state) return\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\tdelete (el as any).__mutation\n\t},\n})\n\nexport default vMutation\n", "import { defineDirective } from '@directix/core'\nimport { isInputElement } from '@directix/shared'\nimport { clampValue, formatNumber, type NumberFormatOptions, parseToNumber, setupNumberInput } from '../utils/number'\n\n/**\n * Number directive options\n */\nexport interface NumberOptions extends NumberFormatOptions {\n\t/** Prefix string (e.g., '$') */\n\tprefix?: string\n\t/** Suffix string (e.g., '%') */\n\tsuffix?: string\n}\n\nexport type NumberBinding = number | NumberOptions\n\ninterface NumberState {\n\toptions: NumberOptions\n\tcleanup: () => void\n}\n\nexport const vNumber = defineDirective<NumberBinding, HTMLElement>({\n\tname: 'number',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options: NumberOptions = typeof binding.value === 'number' ? { precision: binding.value } : (binding.value ?? {})\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupNumberInput(el as HTMLInputElement, options, formatNumber)\n\n\t\t\t;(el as any).__number = { options, cleanup }\n\n\t\t\t// Format initial value after DOM is ready\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst inputEl = el as HTMLInputElement\n\n\t\t\t\tif (inputEl.value) {\n\t\t\t\t\tconst num = parseToNumber(inputEl.value, options.decimal || '.')\n\n\t\t\t\t\tif (num !== null) {\n\t\t\t\t\t\tconst formatted = formatNumber(clampValue(num, options), options)\n\n\t\t\t\t\t\tif (formatted !== inputEl.value) {\n\t\t\t\t\t\t\tinputEl.value = formatted\n\t\t\t\t\t\t\tinputEl.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\t// For non-input elements, format the text content\n\t\t\tlet value: number | null = null\n\n\t\t\tif (typeof binding.value === 'number') {\n\t\t\t\tvalue = binding.value\n\t\t\t} else if (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t} else {\n\t\t\t\t// Try to parse from element's text content\n\t\t\t\tconst textContent = el.textContent?.trim()\n\n\t\t\t\tif (textContent) {\n\t\t\t\t\tvalue = parseToNumber(textContent, options.decimal || '.')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatNumber(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options: NumberOptions = typeof binding.value === 'number' ? { precision: binding.value } : (binding.value ?? {})\n\n\t\tconst state: NumberState | undefined = (el as any).__number\n\n\t\tif (state) {\n\t\t\tstate.options = options\n\t\t} else if (!isInputElement(el)) {\n\t\t\t// Only format non-input elements on update\n\t\t\tlet value: number | null = null\n\n\t\t\tif (typeof binding.value === 'number') {\n\t\t\t\tvalue = binding.value\n\t\t\t} else if (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatNumber(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: NumberState | undefined = (el as any).__number\n\n\t\tstate?.cleanup()\n\t\tdelete (el as any).__number\n\t},\n})\n\nexport default vNumber\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Pan gesture event data\n */\nexport interface PanEvent {\n\t/** Original event */\n\toriginalEvent: TouchEvent | MouseEvent\n\t/** Pan direction */\n\tdirection: 'left' | 'right' | 'up' | 'down'\n\t/** Delta X from start */\n\tdeltaX: number\n\t/** Delta Y from start */\n\tdeltaY: number\n\t/** Distance from start */\n\tdistance: number\n\t/** Current X position */\n\tx: number\n\t/** Current Y position */\n\ty: number\n\t/** Start X position */\n\tstartX: number\n\t/** Start Y position */\n\tstartY: number\n\t/** Whether pan is in progress */\n\tisPanning: boolean\n\t/** Whether pan just started */\n\tisFirst: boolean\n\t/** Whether pan just ended */\n\tisFinal: boolean\n\t/** Velocity */\n\tvelocity: number\n}\n\n/**\n * Pan directive options\n */\nexport interface PanOptions {\n\t/**\n\t * Callback when pan starts\n\t */\n\tonStart?: (e: PanEvent) => void\n\n\t/**\n\t * Callback during pan\n\t */\n\tonPan?: (e: PanEvent) => void\n\n\t/**\n\t * Callback when pan ends\n\t */\n\tonEnd?: (e: PanEvent) => void\n\n\t/**\n\t * Minimum distance to trigger pan\n\t * @default 10\n\t */\n\tthreshold?: number\n\n\t/**\n\t * Direction constraint\n\t */\n\tdirection?: 'horizontal' | 'vertical' | 'all'\n\n\t/**\n\t * Whether to prevent default behavior\n\t * @default true\n\t */\n\tpreventDefault?: boolean\n\n\t/**\n\t * Whether to stop propagation\n\t * @default false\n\t */\n\tstopPropagation?: boolean\n\n\t/**\n\t * Pointer types to listen to\n\t * @default ['touch', 'mouse']\n\t */\n\tpointers?: ('touch' | 'mouse')[]\n}\n\n/**\n * Directive binding value type\n */\nexport type PanBinding = PanOptions['onPan'] | PanOptions\n\n/**\n * Element state storage\n */\ninterface PanState {\n\toptions: PanOptions\n\tstartX: number\n\tstartY: number\n\tcurrentX: number\n\tcurrentY: number\n\tisPanning: boolean\n\tstartTime: number\n\ttouchstartHandler: (e: Event) => void\n\ttouchmoveHandler: (e: Event) => void\n\ttouchendHandler: (e: Event) => void\n\tmousedownHandler: (e: Event) => void\n\tmousemoveHandler: (e: Event) => void\n\tmouseupHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: PanBinding): PanOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { onPan: binding }\n\t}\n\n\treturn {\n\t\tthreshold: 10,\n\t\tdirection: 'all',\n\t\tpreventDefault: true,\n\t\tstopPropagation: false,\n\t\tpointers: ['touch', 'mouse'],\n\t\t...binding,\n\t}\n}\n\n/**\n * Get direction from delta\n */\nfunction getDirection(deltaX: number, deltaY: number): 'left' | 'right' | 'up' | 'down' {\n\tif (Math.abs(deltaX) > Math.abs(deltaY)) {\n\t\treturn deltaX > 0 ? 'right' : 'left'\n\t}\n\treturn deltaY > 0 ? 'down' : 'up'\n}\n\n/**\n * Create pan event object\n */\nfunction createPanEvent(\n\toriginalEvent: TouchEvent | MouseEvent,\n\tstate: PanState,\n\tisFirst: boolean = false,\n\tisFinal: boolean = false,\n): PanEvent {\n\tconst deltaX = state.currentX - state.startX\n\tconst deltaY = state.currentY - state.startY\n\tconst distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY)\n\tconst duration = Date.now() - state.startTime\n\n\treturn {\n\t\toriginalEvent,\n\t\tdirection: getDirection(deltaX, deltaY),\n\t\tdeltaX,\n\t\tdeltaY,\n\t\tdistance,\n\t\tx: state.currentX,\n\t\ty: state.currentY,\n\t\tstartX: state.startX,\n\t\tstartY: state.startY,\n\t\tisPanning: state.isPanning,\n\t\tisFirst,\n\t\tisFinal,\n\t\tvelocity: distance / (duration || 1),\n\t}\n}\n\n/**\n * Get position from event\n */\nfunction getPosition(e: TouchEvent | MouseEvent): { x: number, y: number } {\n\tif ('touches' in e && e.touches.length > 0) {\n\t\treturn { x: e.touches[0].clientX, y: e.touches[0].clientY }\n\t}\n\treturn { x: (e as MouseEvent).clientX, y: (e as MouseEvent).clientY }\n}\n\n/**\n * Check if direction is allowed\n */\nfunction isDirectionAllowed(direction: 'left' | 'right' | 'up' | 'down', constraint?: 'horizontal' | 'vertical' | 'all'): boolean {\n\tif (!constraint || constraint === 'all') return true\n\tif (constraint === 'horizontal') return direction === 'left' || direction === 'right'\n\treturn direction === 'up' || direction === 'down'\n}\n\n/**\n * v-pan directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-pan=\"handlePan\">Swipe me</div>\n *\n * <div v-pan=\"{\n * onPan: handlePan,\n * direction: 'horizontal',\n * threshold: 20\n * }\">\n * Horizontal only\n * </div>\n * </template>\n *\n * <script setup>\n * function handlePan(e) {\n * console.log('Direction:', e.direction)\n * console.log('Distance:', e.distance)\n * }\n * </script>\n * ```\n */\nexport const vPan = defineDirective<PanBinding, HTMLElement>({\n\tname: 'pan',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state: PanState = {\n\t\t\toptions,\n\t\t\tstartX: 0,\n\t\t\tstartY: 0,\n\t\t\tcurrentX: 0,\n\t\t\tcurrentY: 0,\n\t\t\tisPanning: false,\n\t\t\tstartTime: 0,\n\t\t\ttouchstartHandler: (e: Event) => handleStart(e, state, el),\n\t\t\ttouchmoveHandler: (e: Event) => handleMove(e, state, el),\n\t\t\ttouchendHandler: (e: Event) => handleEnd(e, state),\n\t\t\tmousedownHandler: (e: Event) => handleStart(e, state, el),\n\t\t\tmousemoveHandler: (e: Event) => handleMove(e, state, el),\n\t\t\tmouseupHandler: (e: Event) => handleEnd(e, state),\n\t\t}\n\n\t\t;(el as any).__pan = state\n\n\t\t// Touch events\n\t\tif (options.pointers?.includes('touch')) {\n\t\t\ton(el, 'touchstart', state.touchstartHandler, { passive: false })\n\t\t\ton(el, 'touchmove', state.touchmoveHandler, { passive: false })\n\t\t\ton(el, 'touchend', state.touchendHandler)\n\t\t\ton(el, 'touchcancel', state.touchendHandler)\n\t\t}\n\n\t\t// Mouse events\n\t\tif (options.pointers?.includes('mouse')) {\n\t\t\ton(el, 'mousedown', state.mousedownHandler)\n\t\t}\n\n\t\tel.classList.add('v-pan')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: PanState = (el as any).__pan\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: PanState = (el as any).__pan\n\t\tif (!state) return\n\n\t\toff(el, 'touchstart', state.touchstartHandler)\n\t\toff(el, 'touchmove', state.touchmoveHandler)\n\t\toff(el, 'touchend', state.touchendHandler)\n\t\toff(el, 'touchcancel', state.touchendHandler)\n\t\toff(el, 'mousedown', state.mousedownHandler)\n\n\t\tel.classList.remove('v-pan')\n\t\tdelete (el as any).__pan\n\t},\n})\n\n/**\n * Handle pan start\n */\nfunction handleStart(e: Event, state: PanState, _el: HTMLElement): void {\n\tconst pos = getPosition(e as TouchEvent | MouseEvent)\n\tstate.startX = pos.x\n\tstate.startY = pos.y\n\tstate.currentX = pos.x\n\tstate.currentY = pos.y\n\tstate.isPanning = false\n\tstate.startTime = Date.now()\n\n\tif (state.options.preventDefault) {\n\t\te.preventDefault()\n\t}\n\tif (state.options.stopPropagation) {\n\t\te.stopPropagation()\n\t}\n\n\t// Add document-level listeners for mouse\n\tif ((e as MouseEvent).type === 'mousedown') {\n\t\tdocument.addEventListener('mousemove', state.mousemoveHandler)\n\t\tdocument.addEventListener('mouseup', state.mouseupHandler)\n\t}\n}\n\n/**\n * Handle pan move\n */\nfunction handleMove(e: Event, state: PanState, _el: HTMLElement): void {\n\tconst pos = getPosition(e as TouchEvent | MouseEvent)\n\tstate.currentX = pos.x\n\tstate.currentY = pos.y\n\n\tconst deltaX = state.currentX - state.startX\n\tconst deltaY = state.currentY - state.startY\n\tconst distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY)\n\tconst threshold = state.options.threshold || 10\n\n\t// Check threshold\n\tif (!state.isPanning && distance < threshold) {\n\t\treturn\n\t}\n\n\t// Check direction constraint\n\tconst direction = getDirection(deltaX, deltaY)\n\tif (!isDirectionAllowed(direction, state.options.direction)) {\n\t\treturn\n\t}\n\n\tif (state.options.preventDefault) {\n\t\te.preventDefault()\n\t}\n\n\tconst wasPanning = state.isPanning\n\tstate.isPanning = true\n\n\tconst panEvent = createPanEvent(e as TouchEvent | MouseEvent, state, !wasPanning)\n\n\tif (!wasPanning) {\n\t\tstate.options.onStart?.(panEvent)\n\t}\n\n\tstate.options.onPan?.(panEvent)\n}\n\n/**\n * Handle pan end\n */\nfunction handleEnd(e: Event, state: PanState): void {\n\t// Remove document-level listeners for mouse events\n\tdocument.removeEventListener('mousemove', state.mousemoveHandler)\n\tdocument.removeEventListener('mouseup', state.mouseupHandler)\n\n\tif (!state.isPanning) return\n\n\tconst panEvent = createPanEvent(e as TouchEvent | MouseEvent, state, false, true)\n\tstate.options.onEnd?.(panEvent)\n\n\tstate.isPanning = false\n}\n\nexport default vPan\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Parallax directive options\n */\nexport interface ParallaxOptions {\n\t/**\n\t * Parallax speed factor (0-1)\n\t * @default 0.5\n\t */\n\tspeed?: number\n\n\t/**\n\t * Whether parallax is enabled\n\t * @default true\n\t */\n\tenabled?: boolean\n\n\t/**\n\t * Minimum scroll position\n\t */\n\tminScroll?: number\n\n\t/**\n\t * Maximum scroll position\n\t */\n\tmaxScroll?: number\n\n\t/**\n\t * Whether to reverse direction\n\t * @default false\n\t */\n\treverse?: boolean\n\n\t/**\n\t * Horizontal parallax\n\t * @default false\n\t */\n\thorizontal?: boolean\n\n\t/**\n\t * Custom transform function\n\t */\n\ttransform?: (offset: number, el: HTMLElement) => string\n\n\t/**\n\t * Whether to use CSS transform\n\t * @default true\n\t */\n\tuseTransform?: boolean\n\n\t/**\n\t * Mobile breakpoint (disable below this width)\n\t */\n\tmobileBreakpoint?: number\n}\n\n/**\n * Directive binding value type\n */\nexport type ParallaxBinding = boolean | number | ParallaxOptions\n\n/**\n * Element state storage\n */\ninterface ParallaxState {\n\toptions: ParallaxOptions\n\tscrollHandler: () => void\n\tresizeHandler: () => void\n\tisVisible: boolean\n\tlastOffset: number\n\tticking: boolean\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ParallaxBinding | undefined): ParallaxOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { enabled: binding, speed: 0.5 }\n\t}\n\n\tif (typeof binding === 'number') {\n\t\treturn { speed: binding, enabled: true }\n\t}\n\n\treturn {\n\t\tspeed: 0.5,\n\t\tenabled: true,\n\t\treverse: false,\n\t\thorizontal: false,\n\t\tuseTransform: true,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if mobile\n */\nfunction isMobile(breakpoint?: number): boolean {\n\tif (!breakpoint) return false\n\treturn window.innerWidth < breakpoint\n}\n\n/**\n * v-parallax directive\n * Parallax scrolling effect\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple parallax -->\n * <div v-parallax>Parallax content</div>\n *\n * <!-- With speed factor -->\n * <div v-parallax=\"0.3\">Slower parallax</div>\n *\n * <!-- With options -->\n * <div v-parallax=\"{\n * speed: 0.5,\n * reverse: true,\n * mobileBreakpoint: 768\n * }\">\n * Reverse parallax, disabled on mobile\n * </div>\n * </template>\n * ```\n */\nexport const vParallax = defineDirective<ParallaxBinding, HTMLElement>({\n\tname: 'parallax',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: ParallaxState = {\n\t\t\toptions,\n\t\t\tscrollHandler: () => handleScroll(el, state),\n\t\t\tresizeHandler: () => handleResize(el, state),\n\t\t\tisVisible: true,\n\t\t\tlastOffset: 0,\n\t\t\tticking: false,\n\t\t}\n\n\t\t;(el as any).__parallax = state\n\n\t\t// Set initial styles\n\t\tel.style.willChange = 'transform'\n\n\t\t// Add scroll listener\n\t\tconst scrollParent = getScrollParent(el)\n\t\ton(scrollParent, 'scroll', state.scrollHandler, { passive: true })\n\t\ton(window, 'resize', state.resizeHandler, { passive: true })\n\n\t\t// Initial position\n\t\thandleScroll(el, state)\n\n\t\tel.classList.add('v-parallax')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ParallaxState = (el as any).__parallax\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ParallaxState = (el as any).__parallax\n\t\tif (!state) return\n\n\t\tconst scrollParent = getScrollParent(el)\n\t\toff(scrollParent, 'scroll', state.scrollHandler)\n\t\toff(window, 'resize', state.resizeHandler)\n\n\t\tel.style.willChange = ''\n\t\tel.style.transform = ''\n\n\t\tel.classList.remove('v-parallax')\n\t\tdelete (el as any).__parallax\n\t},\n})\n\n/**\n * Handle scroll event\n */\nfunction handleScroll(el: HTMLElement, state: ParallaxState): void {\n\tif (!state.options.enabled || isMobile(state.options.mobileBreakpoint)) {\n\t\treturn\n\t}\n\n\tif (state.ticking) return\n\n\tstate.ticking = true\n\n\trequestAnimationFrame(() => {\n\t\tconst rect = el.getBoundingClientRect()\n\t\tconst viewportHeight = window.innerHeight\n\n\t\t// Check if element is in viewport\n\t\tstate.isVisible = rect.top < viewportHeight && rect.bottom > 0\n\n\t\tif (state.isVisible) {\n\t\t\tconst scrollY = window.scrollY\n\t\t\tconst elementTop = rect.top + scrollY\n\n\t\t\t// Calculate parallax offset\n\t\t\tlet offset = (scrollY - elementTop) * (state.options.speed || 0.5)\n\n\t\t\t// Apply min/max constraints\n\t\t\tif (state.options.minScroll !== undefined) {\n\t\t\t\toffset = Math.max(offset, state.options.minScroll)\n\t\t\t}\n\t\t\tif (state.options.maxScroll !== undefined) {\n\t\t\t\toffset = Math.min(offset, state.options.maxScroll)\n\t\t\t}\n\n\t\t\t// Reverse if needed\n\t\t\tif (state.options.reverse) {\n\t\t\t\toffset = -offset\n\t\t\t}\n\n\t\t\t// Apply transform\n\t\t\tif (state.options.transform) {\n\t\t\t\tel.style.transform = state.options.transform(offset, el)\n\t\t\t} else if (state.options.useTransform !== false) {\n\t\t\t\tif (state.options.horizontal) {\n\t\t\t\t\tel.style.transform = `translateX(${offset}px)`\n\t\t\t\t} else {\n\t\t\t\t\tel.style.transform = `translateY(${offset}px)`\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstate.lastOffset = offset\n\t\t}\n\n\t\tstate.ticking = false\n\t})\n}\n\n/**\n * Handle resize event\n */\nfunction handleResize(el: HTMLElement, state: ParallaxState): void {\n\thandleScroll(el, state)\n}\n\n/**\n * Get scroll parent element\n */\nfunction getScrollParent(el: HTMLElement): Element | Window {\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\nexport default vParallax\n", "import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\n\n// ============ Types ============\n\n/**\n * Permission action mode\n */\nexport type PermissionAction = 'remove' | 'disable' | 'hide'\n\n/**\n * Permission check mode\n */\nexport type PermissionMode = 'some' | 'every'\n\n/**\n * Permission directive options\n */\nexport interface PermissionOptions {\n\t/** Permission value(s) to check */\n\tvalue: string | string[]\n\t/** Logic for multiple permissions: 'some' (OR) or 'every' (AND). Default: 'some' */\n\tmode?: PermissionMode\n\t/** Action when permission denied. Default: 'remove' */\n\taction?: PermissionAction\n\t/** Custom permission check function */\n\tcheck?: (permission: string | string[], mode: PermissionMode) => boolean\n\t/** Callback when permission state changes */\n\tonChange?: (hasPermission: boolean) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type PermissionBinding = string | string[] | PermissionOptions\n\n/**\n * Permission configuration\n */\nexport interface PermissionConfig {\n\t/** Get current user's permissions */\n\tgetPermissions: () => string[]\n\t/** Get current user's roles */\n\tgetRoles?: () => string[]\n\t/** Role to permission mapping */\n\troleMap?: Record<string, string[]>\n}\n\n// ============ Constants ============\n\nconst STATE_KEY = '__permission' as const\nconst WILDCARD = '*' as const\n\n// ============ State ============\n\ninterface ElementState {\n\toptions: PermissionOptions\n\toriginalDisplay: string\n\toriginalDisabled: boolean | string\n\tparentNode: Node | null\n\tplaceholder: Comment | null\n}\n\n// Global configuration\nlet globalConfig: PermissionConfig | null = null\n\n// ============ Configuration ============\n\n/**\n * Configure permission directive\n */\nexport function configurePermission(config: PermissionConfig): void {\n\tglobalConfig = config\n}\n\n/**\n * Get current configuration\n */\nexport function getPermissionConfig(): PermissionConfig | null {\n\treturn globalConfig\n}\n\n// ============ Helpers ============\n\n/**\n * Normalize binding value to options object\n */\nfunction normalizeOptions(binding: PermissionBinding | undefined): PermissionOptions {\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-permission: permission value is required')\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { value: binding }\n\t}\n\n\tif (Array.isArray(binding)) {\n\t\treturn { value: binding }\n\t}\n\n\treturn binding\n}\n\n/**\n * Check if a permission is granted (supports wildcard)\n */\nfunction hasPermission(required: string, permissions: string[]): boolean {\n\treturn permissions.includes(WILDCARD) || permissions.includes(required)\n}\n\n/**\n * Verify permission against configuration\n */\nfunction verifyPermission(options: PermissionOptions): boolean {\n\t// Custom check function takes priority\n\tif (options.check) {\n\t\treturn options.check(options.value, options.mode || 'some')\n\t}\n\n\t// Require global configuration\n\tif (!globalConfig) {\n\t\tconsole.warn('[Directix] v-permission: No permission config provided')\n\n\t\treturn true\n\t}\n\n\tconst permissions = globalConfig.getPermissions()\n\tconst roles = globalConfig.getRoles?.() || []\n\tconst roleMap = globalConfig.roleMap || {}\n\tconst required = Array.isArray(options.value) ? options.value : [options.value]\n\tconst mode = options.mode || 'some'\n\n\t/**\n\t * Check a single value - can be a role name or permission\n\t */\n\tfunction checkSingle(value: string): boolean {\n\t\t// If value is a role name in roleMap, check if user has that role\n\t\tif (value in roleMap) {\n\t\t\treturn roles.includes(value)\n\t\t}\n\n\t\t// Check direct permission\n\t\tif (hasPermission(value, permissions)) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Check if any of user's roles grant this permission\n\t\tfor (const role of roles) {\n\t\t\tconst rolePermissions = roleMap[role] || []\n\n\t\t\tif (hasPermission(value, rolePermissions)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\treturn mode === 'every' ? required.every(checkSingle) : required.some(checkSingle)\n}\n\n/**\n * Handle element when permission is denied\n */\nfunction handleDenied(el: HTMLElement, action: PermissionAction, state: ElementState): void {\n\tswitch (action) {\n\t\tcase 'remove':\n\t\t\tstate.parentNode = el.parentNode\n\t\t\tstate.placeholder = document.createComment('v-permission')\n\t\t\tel.parentNode?.insertBefore(state.placeholder, el)\n\t\t\tel.parentNode?.removeChild(el)\n\t\t\tbreak\n\t\tcase 'disable':\n\t\t\tstate.originalDisabled = el.getAttribute('disabled') || false\n\t\t\tel.setAttribute('disabled', 'true')\n\t\t\tel.classList.add('v-permission--disabled')\n\t\t\tbreak\n\t\tcase 'hide':\n\t\t\tstate.originalDisplay = el.style.display\n\t\t\tel.style.display = 'none'\n\t\t\tel.classList.add('v-permission--hidden')\n\t\t\tbreak\n\t}\n}\n\n/**\n * Restore element when permission is granted\n */\nfunction handleGranted(el: HTMLElement, action: PermissionAction, state: ElementState): void {\n\tswitch (action) {\n\t\tcase 'remove':\n\t\t\tif (state.placeholder && state.parentNode) {\n\t\t\t\tstate.parentNode.insertBefore(el, state.placeholder)\n\t\t\t\tstate.parentNode.removeChild(state.placeholder)\n\t\t\t\tstate.placeholder = null\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'disable':\n\t\t\tif (state.originalDisabled === false) {\n\t\t\t\tel.removeAttribute('disabled')\n\t\t\t} else if (state.originalDisabled) {\n\t\t\t\tel.setAttribute('disabled', state.originalDisabled as string)\n\t\t\t}\n\t\t\tel.classList.remove('v-permission--disabled')\n\t\t\tbreak\n\t\tcase 'hide':\n\t\t\tel.style.display = state.originalDisplay || ''\n\t\t\tel.classList.remove('v-permission--hidden')\n\t\t\tbreak\n\t}\n}\n\n/**\n * Get or create element state\n */\nfunction getState(el: HTMLElement): ElementState {\n\tif (!(el as any)[STATE_KEY]) {\n\t\t;(el as any)[STATE_KEY] = {\n\t\t\toptions: { value: '' },\n\t\t\toriginalDisplay: '',\n\t\t\toriginalDisabled: false,\n\t\t\tparentNode: null,\n\t\t\tplaceholder: null,\n\t\t} as ElementState\n\t}\n\n\treturn (el as any)[STATE_KEY]\n}\n\n/**\n * Check permission and update element state\n */\nfunction checkPermission(el: HTMLElement, binding: DirectiveBinding<PermissionBinding>): void {\n\tconst state = getState(el)\n\n\tstate.options = normalizeOptions(binding.value)\n\n\tconst granted = verifyPermission(state.options)\n\n\t// Trigger change callback\n\tstate.options.onChange?.(granted)\n\n\tconst action = state.options.action || 'remove'\n\n\tif (granted) {\n\t\thandleGranted(el, action, state)\n\t} else {\n\t\thandleDenied(el, action, state)\n\t}\n}\n\n/**\n * Cleanup element state\n */\nfunction cleanup(el: HTMLElement): void {\n\tconst state: ElementState = (el as any)[STATE_KEY]\n\n\tif (state?.placeholder && state.parentNode) {\n\t\tstate.parentNode.removeChild(state.placeholder)\n\t}\n\n\tdelete (el as any)[STATE_KEY]\n}\n\n// ============ Directive ============\n\n/**\n * v-permission directive\n *\n * Controls element visibility and state based on user permissions.\n * Supports role-based and permission-based access control with wildcard support.\n *\n * @example\n * ```vue\n * <template>\n * <button v-permission=\"'admin'\">Admin Only</button>\n * <button v-permission=\"['admin', 'editor']\">Admin or Editor</button>\n * <button v-permission=\"{ value: ['read', 'write'], mode: 'every' }\">Read & Write</button>\n * <button v-permission=\"{ value: 'admin', action: 'disable' }\">Disabled for non-admin</button>\n * </template>\n *\n * <script setup>\n * import { configurePermission } from 'directix'\n *\n * configurePermission({\n * getPermissions: () => store.getters.permissions,\n * getRoles: () => store.getters.roles,\n * roleMap: { admin: ['*'], editor: ['read', 'write'] }\n * })\n * </script>\n * ```\n */\nexport const vPermission = defineDirective<PermissionBinding, HTMLElement>({\n\tname: 'permission',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tcheckPermission(el, binding)\n\t},\n\n\tupdated(el, binding) {\n\t\tcheckPermission(el, binding)\n\t},\n\n\tunmounted(el) {\n\t\tcleanup(el)\n\t},\n})\n\nexport default vPermission\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Pinch gesture event data\n */\nexport interface PinchEvent {\n\t/** Original event */\n\toriginalEvent: TouchEvent\n\t/** Scale factor (relative to start) */\n\tscale: number\n\t/** Current distance between two fingers */\n\tdistance: number\n\t/** Initial distance */\n\tinitialDistance: number\n\t/** Center point X */\n\tcenterX: number\n\t/** Center point Y */\n\tcenterY: number\n\t/** Whether pinch is in progress */\n\tisPinching: boolean\n\t/** Whether pinch just started */\n\tisFirst: boolean\n\t/** Whether pinch just ended */\n\tisFinal: boolean\n}\n\n/**\n * Pinch directive options\n */\nexport interface PinchOptions {\n\t/**\n\t * Callback when pinch starts\n\t */\n\tonStart?: (e: PinchEvent) => void\n\n\t/**\n\t * Callback during pinch\n\t */\n\tonPinch?: (e: PinchEvent) => void\n\n\t/**\n\t * Callback when pinch ends\n\t */\n\tonEnd?: (e: PinchEvent) => void\n\n\t/**\n\t * Minimum scale to trigger callback\n\t */\n\tminScale?: number\n\n\t/**\n\t * Maximum scale to trigger callback\n\t */\n\tmaxScale?: number\n\n\t/**\n\t * Whether to prevent default behavior\n\t * @default true\n\t */\n\tpreventDefault?: boolean\n\n\t/**\n\t * Whether to stop propagation\n\t * @default false\n\t */\n\tstopPropagation?: boolean\n\n\t/**\n\t * Enable scale transform on element\n\t * @default false\n\t */\n\tenableTransform?: boolean\n\n\t/**\n\t * Transform origin for scaling\n\t * @default 'center center'\n\t */\n\ttransformOrigin?: string\n}\n\n/**\n * Directive binding value type\n */\nexport type PinchBinding = PinchOptions['onPinch'] | PinchOptions\n\n/**\n * Element state storage\n */\ninterface PinchState {\n\toptions: PinchOptions\n\tinitialDistance: number\n\tcurrentDistance: number\n\tisPinching: boolean\n\ttouchstartHandler: (e: Event) => void\n\ttouchmoveHandler: (e: Event) => void\n\ttouchendHandler: (e: Event) => void\n\tinitialScale: number\n\tsavedTransition: string\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: PinchBinding): PinchOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { onPinch: binding }\n\t}\n\n\treturn {\n\t\tpreventDefault: true,\n\t\tstopPropagation: false,\n\t\tenableTransform: false,\n\t\ttransformOrigin: 'center center',\n\t\t...binding,\n\t}\n}\n\n/**\n * Get distance between two touch points\n */\nfunction getDistance(touches: TouchList): number {\n\tif (touches.length < 2) return 0\n\tconst dx = touches[0].clientX - touches[1].clientX\n\tconst dy = touches[0].clientY - touches[1].clientY\n\treturn Math.sqrt(dx * dx + dy * dy)\n}\n\n/**\n * Get center point between two touch points\n */\nfunction getCenter(touches: TouchList): { x: number, y: number } {\n\tif (touches.length < 2) return { x: touches[0].clientX, y: touches[0].clientY }\n\treturn {\n\t\tx: (touches[0].clientX + touches[1].clientX) / 2,\n\t\ty: (touches[0].clientY + touches[1].clientY) / 2,\n\t}\n}\n\n/**\n * Create pinch event object\n */\nfunction createPinchEvent(originalEvent: TouchEvent, state: PinchState, isFirst: boolean = false, isFinal: boolean = false): PinchEvent {\n\tconst center = getCenter(originalEvent.touches)\n\tconst scale = state.initialDistance > 0 ? state.currentDistance / state.initialDistance : 1\n\n\treturn {\n\t\toriginalEvent,\n\t\tscale,\n\t\tdistance: state.currentDistance,\n\t\tinitialDistance: state.initialDistance,\n\t\tcenterX: center.x,\n\t\tcenterY: center.y,\n\t\tisPinching: state.isPinching,\n\t\tisFirst,\n\t\tisFinal,\n\t}\n}\n\n/**\n * v-pinch directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-pinch=\"handlePinch\">Pinch to zoom</div>\n *\n * <div v-pinch=\"{\n * onPinch: handlePinch,\n * enableTransform: true,\n * minScale: 0.5,\n * maxScale: 3\n * }\">\n * Pinch to scale\n * </div>\n * </template>\n *\n * <script setup>\n * function handlePinch(e) {\n * console.log('Scale:', e.scale)\n * console.log('Center:', e.centerX, e.centerY)\n * }\n * </script>\n * ```\n */\nexport const vPinch = defineDirective<PinchBinding, HTMLElement>({\n\tname: 'pinch',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state: PinchState = {\n\t\t\toptions,\n\t\t\tinitialDistance: 0,\n\t\t\tcurrentDistance: 0,\n\t\t\tisPinching: false,\n\t\t\tinitialScale: 1,\n\t\t\tsavedTransition: '',\n\t\t\ttouchstartHandler: (e: Event) => handleStart(e as TouchEvent, state, el),\n\t\t\ttouchmoveHandler: (e: Event) => handleMove(e as TouchEvent, state, el),\n\t\t\ttouchendHandler: (e: Event) => handleEnd(e as TouchEvent, state, el),\n\t\t}\n\n\t\t;(el as any).__pinch = state\n\n\t\ton(el, 'touchstart', state.touchstartHandler, { passive: false })\n\t\ton(el, 'touchmove', state.touchmoveHandler, { passive: false })\n\t\ton(el, 'touchend', state.touchendHandler)\n\t\ton(el, 'touchcancel', state.touchendHandler)\n\n\t\tel.classList.add('v-pinch')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: PinchState = (el as any).__pinch\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: PinchState = (el as any).__pinch\n\t\tif (!state) return\n\n\t\toff(el, 'touchstart', state.touchstartHandler)\n\t\toff(el, 'touchmove', state.touchmoveHandler)\n\t\toff(el, 'touchend', state.touchendHandler)\n\t\toff(el, 'touchcancel', state.touchendHandler)\n\n\t\tel.classList.remove('v-pinch')\n\t\tdelete (el as any).__pinch\n\t},\n})\n\n/**\n * Handle pinch start\n */\nfunction handleStart(e: TouchEvent, state: PinchState, el: HTMLElement): void {\n\tif (e.touches.length !== 2) return\n\n\tstate.initialDistance = getDistance(e.touches)\n\tstate.currentDistance = state.initialDistance\n\tstate.isPinching = false\n\n\tif (state.options.enableTransform) {\n\t\t// Get current scale from transform\n\t\tconst transform = getComputedStyle(el).transform\n\t\tconst matrix = new DOMMatrix(transform)\n\t\tstate.initialScale = matrix.a // Get scale from matrix\n\t\t// Disable transition during pinch for smooth response\n\t\tstate.savedTransition = el.style.transition\n\t\tel.style.transition = 'none'\n\t}\n\n\tif (state.options.preventDefault) {\n\t\te.preventDefault()\n\t}\n\tif (state.options.stopPropagation) {\n\t\te.stopPropagation()\n\t}\n}\n\n/**\n * Handle pinch move\n */\nfunction handleMove(e: TouchEvent, state: PinchState, el: HTMLElement): void {\n\tif (e.touches.length !== 2) return\n\n\tstate.currentDistance = getDistance(e.touches)\n\n\tif (state.initialDistance <= 0) return\n\n\tconst scale = state.currentDistance / state.initialDistance\n\n\t// Check scale constraints\n\tif (state.options.minScale !== undefined && scale < state.options.minScale) return\n\tif (state.options.maxScale !== undefined && scale > state.options.maxScale) return\n\n\tif (state.options.preventDefault) {\n\t\te.preventDefault()\n\t}\n\n\tconst wasPinching = state.isPinching\n\tstate.isPinching = true\n\n\tconst pinchEvent = createPinchEvent(e, state, !wasPinching)\n\n\tif (!wasPinching) {\n\t\tstate.options.onStart?.(pinchEvent)\n\t}\n\n\t// Apply transform if enabled\n\tif (state.options.enableTransform) {\n\t\tconst transformOrigin = state.options.transformOrigin || 'center center'\n\t\tel.style.transformOrigin = transformOrigin\n\t\tel.style.transform = `scale(${state.initialScale * scale})`\n\t}\n\n\tstate.options.onPinch?.(pinchEvent)\n}\n\n/**\n * Handle pinch end\n */\nfunction handleEnd(e: TouchEvent, state: PinchState, el: HTMLElement): void {\n\tif (!state.isPinching) return\n\n\t// Restore transition\n\tif (state.options.enableTransform) {\n\t\tel.style.transition = state.savedTransition\n\t}\n\n\t// Create final event with 0 touches\n\tconst finalEvent = {\n\t\t...e,\n\t\ttouches: e.touches.length >= 2 ? e.touches : ([] as any),\n\t} as TouchEvent\n\n\tconst pinchEvent = createPinchEvent(finalEvent, state, false, true)\n\tstate.options.onEnd?.(pinchEvent)\n\n\tstate.isPinching = false\n\tstate.initialDistance = 0\n\tstate.currentDistance = 0\n}\n\nexport default vPinch\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Print complete callback\n */\nexport type PrintCompleteCallback = () => void\n\n/**\n * Print before callback\n */\nexport type PrintBeforeCallback = () => boolean | void\n\n/**\n * Print directive options\n */\nexport interface PrintOptions {\n\t/**\n\t * Title for the printed document\n\t */\n\ttitle?: string\n\n\t/**\n\t * Additional CSS styles to inject\n\t */\n\tstyles?: string | string[]\n\n\t/**\n\t * Additional CSS URLs to include\n\t */\n\tcssUrls?: string[]\n\n\t/**\n\t * Callback before printing\n\t * Return false to cancel printing\n\t */\n\tonBeforePrint?: PrintBeforeCallback\n\n\t/**\n\t * Callback after printing\n\t */\n\tonAfterPrint?: PrintCompleteCallback\n\n\t/**\n\t * Whether to print immediately on mount\n\t * @default false\n\t */\n\timmediate?: boolean\n\n\t/**\n\t * Print target selector\n\t * If not specified, prints the element itself\n\t */\n\ttarget?: string\n\n\t/**\n\t * Whether to print in a new window\n\t * @default false\n\t */\n\tnewWindow?: boolean\n\n\t/**\n\t * Custom class for print container\n\t */\n\tprintClass?: string\n}\n\n/**\n * Directive binding value type\n */\nexport type PrintBinding = PrintOptions | boolean\n\n/**\n * Element state storage\n */\ninterface PrintState {\n\toptions: PrintOptions\n\tclickHandler: (() => void) | null\n}\n\n/**\n * v-print directive\n *\n * Prints the element content when clicked or immediately.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Print on click -->\n * <button v-print>Print Page</button>\n *\n * <!-- Print specific element -->\n * <button v-print=\"{ target: '#content' }\">Print Content</button>\n *\n * <!-- Print with custom title -->\n * <button v-print=\"{ title: 'My Document', styles: 'body { font-size: 12px }' }\">\n * Print\n * </button>\n *\n * <!-- Print immediately on mount -->\n * <div v-print=\"{ immediate: true }\">Auto print</div>\n * </template>\n * ```\n */\nexport const vPrint = defineDirective<PrintBinding, HTMLElement>({\n\tname: 'print',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: PrintState = {\n\t\t\toptions,\n\t\t\tclickHandler: null,\n\t\t}\n\n\t\t;(el as any).__print = state\n\n\t\t// Print immediately if specified\n\t\tif (options.immediate) {\n\t\t\tsetTimeout(() => printElement(el, options), 100)\n\t\t\treturn\n\t\t}\n\n\t\t// Add click handler\n\t\tconst clickHandler = (): void => {\n\t\t\tprintElement(el, state.options)\n\t\t}\n\n\t\tel.addEventListener('click', clickHandler)\n\t\tstate.clickHandler = clickHandler\n\n\t\t// Add cursor style\n\t\tel.style.cursor = 'pointer'\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: PrintState = (el as any).__print\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: PrintState | undefined = (el as any).__print\n\n\t\tif (!state) return\n\n\t\tif (state.clickHandler) {\n\t\t\tel.removeEventListener('click', state.clickHandler)\n\t\t}\n\n\t\tel.style.cursor = ''\n\n\t\tdelete (el as any).__print\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: PrintBinding | undefined): PrintOptions {\n\tif (binding === true) {\n\t\treturn { immediate: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn {}\n\t}\n\n\treturn binding || {}\n}\n\n/**\n * Print element\n */\nasync function printElement(triggerEl: HTMLElement, options: PrintOptions): Promise<void> {\n\t// Call before callback\n\tif (options.onBeforePrint) {\n\t\tconst result = options.onBeforePrint()\n\t\tif (result === false) return\n\t}\n\n\t// Get target element\n\tconst targetEl = options.target ? document.querySelector(options.target) : triggerEl\n\n\tif (!targetEl) {\n\t\tconsole.warn('[Directix] v-print: Target element not found')\n\t\treturn\n\t}\n\n\t// Create print window/iframe\n\tif (options.newWindow) {\n\t\tawait printInNewWindow(targetEl as HTMLElement, options)\n\t} else {\n\t\tawait printInIframe(targetEl as HTMLElement, options)\n\t}\n\n\t// Call after callback\n\tif (options.onAfterPrint) {\n\t\toptions.onAfterPrint()\n\t}\n}\n\n/**\n * Print using iframe\n */\nasync function printInIframe(el: HTMLElement, options: PrintOptions): Promise<void> {\n\t// Create iframe\n\tconst iframe = document.createElement('iframe')\n\tiframe.style.cssText = 'position: absolute; top: -10000px; left: -10000px; width: 0; height: 0; border: none;'\n\tdocument.body.appendChild(iframe)\n\n\tconst iframeDoc = iframe.contentDocument || iframe.contentWindow?.document\n\n\tif (!iframeDoc) {\n\t\tconsole.warn('[Directix] v-print: Could not access iframe document')\n\t\tdocument.body.removeChild(iframe)\n\t\treturn\n\t}\n\n\t// Build document content\n\tconst content = buildPrintContent(el, options)\n\n\tiframeDoc.open()\n\tiframeDoc.write(content)\n\tiframeDoc.close()\n\n\t// Wait for images to load\n\tawait waitForImages(iframeDoc)\n\n\t// Print\n\ttry {\n\t\tiframe.contentWindow?.focus()\n\t\tiframe.contentWindow?.print()\n\t} catch (err) {\n\t\tconsole.error('[Directix] v-print: Print failed', err)\n\t}\n\n\t// Cleanup after print\n\tsetTimeout(() => {\n\t\tdocument.body.removeChild(iframe)\n\t}, 1000)\n}\n\n/**\n * Print in new window\n */\nasync function printInNewWindow(el: HTMLElement, options: PrintOptions): Promise<void> {\n\tconst printWindow = window.open('', '_blank')\n\n\tif (!printWindow) {\n\t\tconsole.warn('[Directix] v-print: Could not open print window')\n\t\treturn\n\t}\n\n\tconst content = buildPrintContent(el, options)\n\n\tprintWindow.document.open()\n\tprintWindow.document.write(content)\n\tprintWindow.document.close()\n\n\t// Wait for images to load\n\tawait waitForImages(printWindow.document)\n\n\t// Print\n\tprintWindow.focus()\n\tprintWindow.print()\n\n\t// Close after print\n\tsetTimeout(() => {\n\t\tprintWindow.close()\n\t}, 1000)\n}\n\n/**\n * Build print content HTML\n */\nfunction buildPrintContent(el: HTMLElement, options: PrintOptions): string {\n\t// Get all stylesheets\n\tlet styles = ''\n\n\t// Include existing stylesheets\n\tdocument.querySelectorAll('style, link[rel=\"stylesheet\"]').forEach(styleEl => {\n\t\tif (styleEl.tagName === 'STYLE') {\n\t\t\tstyles += `<style>${styleEl.textContent}</style>`\n\t\t} else if (styleEl.tagName === 'LINK') {\n\t\t\tconst href = (styleEl as HTMLLinkElement).href\n\t\t\tstyles += `<link rel=\"stylesheet\" href=\"${href}\">`\n\t\t}\n\t})\n\n\t// Add custom CSS URLs\n\tif (options.cssUrls) {\n\t\toptions.cssUrls.forEach(url => {\n\t\t\tstyles += `<link rel=\"stylesheet\" href=\"${url}\">`\n\t\t})\n\t}\n\n\t// Add custom styles\n\tif (options.styles) {\n\t\tconst customStyles = Array.isArray(options.styles) ? options.styles.join('\\n') : options.styles\n\t\tstyles += `<style>${customStyles}</style>`\n\t}\n\n\t// Add print-specific styles\n\tstyles += `\n\t\t<style>\n\t\t\t@media print {\n\t\t\t\tbody { margin: 0; padding: 20px; }\n\t\t\t\t${options.printClass ? `.${options.printClass} { page-break-inside: avoid; }` : ''}\n\t\t\t}\n\t\t</style>\n\t`\n\n\t// Build HTML\n\tconst title = options.title || document.title || 'Print'\n\tconst content = el.outerHTML\n\n\treturn `<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>${title}</title>\n\t${styles}\n</head>\n<body>\n\t${content}\n</body>\n</html>`\n}\n\n/**\n * Wait for images to load\n */\nfunction waitForImages(doc: Document): Promise<void[]> {\n\tconst images = doc.querySelectorAll('img')\n\tconst promises: Promise<void>[] = []\n\n\timages.forEach(img => {\n\t\tif (!img.complete) {\n\t\t\tpromises.push(\n\t\t\t\tnew Promise(resolve => {\n\t\t\t\t\timg.onload = () => resolve()\n\t\t\t\t\timg.onerror = () => resolve()\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t})\n\n\treturn Promise.all(promises)\n}\n\nexport default vPrint\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Progress bar position\n */\nexport type ProgressPosition = 'top' | 'bottom'\n\n/**\n * Progress directive options\n */\nexport interface ProgressOptions {\n\t/**\n\t * Current progress value (0-100)\n\t */\n\tvalue: number\n\n\t/**\n\t * Maximum value\n\t * @default 100\n\t */\n\tmax?: number\n\n\t/**\n\t * Minimum value\n\t * @default 0\n\t */\n\tmin?: number\n\n\t/**\n\t * Progress bar height\n\t * @default 4\n\t */\n\theight?: number\n\n\t/**\n\t * Progress bar color\n\t * @default '#42b883'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Background color\n\t * @default 'rgba(0, 0, 0, 0.1)'\n\t */\n\tbackgroundColor?: string\n\n\t/**\n\t * Transition duration in milliseconds\n\t * @default 300\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to show percentage text\n\t * @default false\n\t */\n\tshowText?: boolean\n\n\t/**\n\t * Whether to animate on mount\n\t * @default true\n\t */\n\tanimate?: boolean\n\n\t/**\n\t * Indeterminate mode\n\t * @default false\n\t */\n\tindeterminate?: boolean\n\n\t/**\n\t * Stripe pattern\n\t * @default false\n\t */\n\tstriped?: boolean\n\n\t/**\n\t * Animate stripes\n\t * @default false\n\t */\n\tanimated?: boolean\n\n\t/**\n\t * Position (top or bottom of container)\n\t * @default 'top'\n\t */\n\tposition?: ProgressPosition\n\n\t/**\n\t * Custom class\n\t */\n\tclass?: string\n\n\t/**\n\t * Callback when progress changes\n\t */\n\tonChange?: (value: number, percent: number) => void\n\n\t/**\n\t * Callback when animation completes\n\t */\n\tonComplete?: () => void\n}\n\n/**\n * Directive binding value type\n */\nexport type ProgressBinding = number | ProgressOptions\n\n/**\n * Element state storage\n */\ninterface ProgressState {\n\toptions: ProgressOptions\n\tprogressBar: HTMLDivElement | null\n\tcontainer: HTMLDivElement | null\n\tcurrentValue: number\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ProgressBinding | undefined): ProgressOptions {\n\tif (typeof binding === 'number') {\n\t\treturn { value: binding }\n\t}\n\n\treturn {\n\t\tvalue: 0,\n\t\tmax: 100,\n\t\tmin: 0,\n\t\theight: 4,\n\t\tcolor: '#42b883',\n\t\tbackgroundColor: 'rgba(0, 0, 0, 0.1)',\n\t\tduration: 300,\n\t\tshowText: false,\n\t\tanimate: true,\n\t\tindeterminate: false,\n\t\tstriped: false,\n\t\tanimated: false,\n\t\tposition: 'top',\n\t\t...(binding || {}),\n\t}\n}\n\n/**\n * Create progress bar container\n */\nfunction createProgressContainer(options: ProgressOptions): { container: HTMLDivElement, progressBar: HTMLDivElement } {\n\tconst container = document.createElement('div')\n\tcontainer.className = `v-progress ${options.class || ''}`\n\n\tcontainer.style.cssText = `\n position: absolute;\n ${options.position === 'bottom' ? 'bottom' : 'top'}: 0;\n left: 0;\n right: 0;\n height: ${options.height}px;\n background: ${options.backgroundColor};\n overflow: hidden;\n z-index: 1000;\n `\n\n\tconst progressBar = document.createElement('div')\n\tprogressBar.className = 'v-progress__bar'\n\n\tlet barStyle = `\n height: 100%;\n background-color: ${options.color};\n transition: ${options.animate !== false ? `width ${options.duration}ms ease` : 'none'};\n width: 0%;\n `\n\n\tif (options.striped) {\n\t\tbarStyle += `\n background-image: linear-gradient(\n 45deg,\n rgba(255, 255, 255, 0.15) 25%,\n transparent 25%,\n transparent 50%,\n rgba(255, 255, 255, 0.15) 50%,\n rgba(255, 255, 255, 0.15) 75%,\n transparent 75%,\n transparent\n );\n background-size: 1rem 1rem;\n `\n\t}\n\n\tprogressBar.style.cssText = barStyle\n\n\t// Add animation for indeterminate or animated stripes\n\tif (options.indeterminate) {\n\t\tprogressBar.classList.add('v-progress--indeterminate')\n\t\tprogressBar.style.width = '30%'\n\t\tprogressBar.style.animation = 'v-progress-indeterminate 1.5s infinite linear'\n\t} else if (options.animated) {\n\t\tprogressBar.style.animation = 'v-progress-stripes 1s linear infinite'\n\t}\n\n\tcontainer.appendChild(progressBar)\n\n\t// Add text if enabled\n\tif (options.showText) {\n\t\tconst textEl = document.createElement('span')\n\t\ttextEl.className = 'v-progress__text'\n\t\ttextEl.style.cssText = `\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: ${Math.max((options.height || 4) - 2, 10)}px;\n color: #fff;\n text-shadow: 0 0 2px rgba(0, 0, 0, 0.5);\n `\n\t\tcontainer.appendChild(textEl)\n\t}\n\n\treturn { container, progressBar }\n}\n\n/**\n * Ensure global styles\n */\nfunction ensureStyles(): void {\n\tif (!isBrowser()) return\n\n\tconst styleId = 'v-progress-styles'\n\tif (document.getElementById(styleId)) return\n\n\tconst style = document.createElement('style')\n\tstyle.id = styleId\n\tstyle.textContent = `\n @keyframes v-progress-stripes {\n from { background-position: 1rem 0; }\n to { background-position: 0 0; }\n }\n @keyframes v-progress-indeterminate {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(400%); }\n }\n .v-progress--indeterminate {\n position: absolute;\n width: 30% !important;\n }\n `\n\n\tdocument.head.appendChild(style)\n}\n\n/**\n * v-progress directive\n * Progress bar animation\n *\n * @example\n * ```vue\n * <template>\n * <div v-progress=\"50\">Progress at 50%</div>\n *\n * <div v-progress=\"{\n * value: progressValue,\n * color: '#42b883',\n * height: 8,\n * showText: true\n * }\">\n * Content\n * </div>\n *\n * <div v-progress=\"{ indeterminate: true }\">\n * Loading...\n * </div>\n * </template>\n * ```\n */\nexport const vProgress = defineDirective<ProgressBinding, HTMLElement>({\n\tname: 'progress',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tensureStyles()\n\n\t\t// Ensure parent has position\n\t\tconst computedStyle = getComputedStyle(el)\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\tconst { container, progressBar } = createProgressContainer(options)\n\n\t\tconst state: ProgressState = {\n\t\t\toptions,\n\t\t\tprogressBar,\n\t\t\tcontainer,\n\t\t\tcurrentValue: 0,\n\t\t}\n\n\t\t;(el as any).__progress = state\n\n\t\tel.appendChild(container)\n\n\t\t// Set initial progress\n\t\tif (!options.indeterminate) {\n\t\t\tsetProgress(state, options.value)\n\t\t}\n\n\t\tel.classList.add('v-progress-container')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ProgressState = (el as any).__progress\n\n\t\tif (!state) return\n\n\t\tconst oldOptions = state.options\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tstate.options = newOptions\n\n\t\t// Update styles\n\t\tif (state.container) {\n\t\t\tstate.container.style.height = `${newOptions.height}px`\n\t\t\tstate.container.style.background = newOptions.backgroundColor || 'rgba(0, 0, 0, 0.1)'\n\t\t}\n\n\t\tif (state.progressBar) {\n\t\t\tstate.progressBar.style.backgroundColor = newOptions.color || '#42b883'\n\t\t}\n\n\t\t// Handle indeterminate state change\n\t\tif (oldOptions.indeterminate !== newOptions.indeterminate && state.progressBar) {\n\t\t\tif (newOptions.indeterminate) {\n\t\t\t\t// Start indeterminate animation\n\t\t\t\tstate.progressBar.classList.add('v-progress--indeterminate')\n\t\t\t\tstate.progressBar.style.width = '30%'\n\t\t\t\tstate.progressBar.style.animation = 'v-progress-indeterminate 1.5s infinite linear'\n\t\t\t} else {\n\t\t\t\t// Stop indeterminate animation\n\t\t\t\tstate.progressBar.classList.remove('v-progress--indeterminate')\n\t\t\t\tstate.progressBar.style.animation = ''\n\t\t\t\t// Set to current value\n\t\t\t\tsetProgress(state, newOptions.value)\n\t\t\t}\n\t\t} else if (!newOptions.indeterminate && newOptions.value !== oldOptions.value) {\n\t\t\t// Update progress value\n\t\t\tsetProgress(state, newOptions.value)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ProgressState = (el as any).__progress\n\n\t\tif (!state) return\n\n\t\tif (state.container && state.container.parentNode) {\n\t\t\tstate.container.parentNode.removeChild(state.container)\n\t\t}\n\n\t\tel.classList.remove('v-progress-container')\n\t\tdelete (el as any).__progress\n\t},\n})\n\n/**\n * Set progress value\n */\nfunction setProgress(state: ProgressState, value: number): void {\n\tconst { options, progressBar, container } = state\n\n\tif (!progressBar || !container) return\n\n\tconst min = options.min || 0\n\tconst max = options.max || 100\n\tconst clampedValue = Math.max(min, Math.min(max, value))\n\tconst percent = ((clampedValue - min) / (max - min)) * 100\n\n\tprogressBar.style.width = `${percent}%`\n\n\t// Update text\n\tif (options.showText) {\n\t\tconst textEl = container.querySelector('.v-progress__text') as HTMLSpanElement\n\t\tif (textEl) {\n\t\t\ttextEl.textContent = `${Math.round(percent)}%`\n\t\t}\n\t}\n\n\tstate.currentValue = clampedValue\n\toptions.onChange?.(clampedValue, percent)\n\n\t// Check for completion\n\tif (percent >= 100) {\n\t\toptions.onComplete?.()\n\t}\n}\n\nexport default vProgress\n", "import { defineDirective } from '@directix/core'\n\nexport type PullRefreshHandler = () => Promise<void> | void\n\nexport type PullRefreshState = 'idle' | 'pulling' | 'ready' | 'loading' | 'success' | 'error'\n\nexport interface PullRefreshOptions {\n\thandler: PullRefreshHandler\n\tdistance?: number\n\tmaxDistance?: number\n\tdisabled?: boolean\n\tindicator?: {\n\t\tidle?: string\n\t\tpulling?: string\n\t\tready?: string\n\t\tloading?: string\n\t\tsuccess?: string\n\t\terror?: string\n\t}\n\tsuccessDuration?: number\n\terrorDuration?: number\n\tonStateChange?: (state: PullRefreshState) => void\n}\n\nexport type PullRefreshBinding = PullRefreshHandler | PullRefreshOptions\n\ninterface PullRefreshInternalState {\n\toptions: PullRefreshOptions\n\tstate: PullRefreshState\n\tstartY: number\n\tcurrentY: number\n\tpulling: boolean\n\tindicatorEl: HTMLDivElement\n\tcontentEl: HTMLElement\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: () => void\n\t}\n}\n\nconst DEFAULT_DISTANCE = 60\nconst DEFAULT_MAX_DISTANCE = 100\nconst DEFAULT_SUCCESS_DURATION = 500\nconst DEFAULT_ERROR_DURATION = 1000\n\nconst DEFAULT_INDICATORS: Record<PullRefreshState, string> = {\n\tidle: '\u2193',\n\tpulling: '\u2193 Pull',\n\tready: '\u2193 Release',\n\tloading: '\u27F3 Loading...',\n\tsuccess: '\u2713 Done',\n\terror: '\u2717 Failed',\n}\n\nfunction normalizeOptions(binding: PullRefreshBinding): PullRefreshOptions {\n\tif (typeof binding === 'function') return { handler: binding }\n\n\treturn {\n\t\thandler: binding.handler,\n\t\tdistance: binding.distance ?? DEFAULT_DISTANCE,\n\t\tmaxDistance: binding.maxDistance ?? DEFAULT_MAX_DISTANCE,\n\t\tdisabled: binding.disabled ?? false,\n\t\tindicator: binding.indicator,\n\t\tsuccessDuration: binding.successDuration ?? DEFAULT_SUCCESS_DURATION,\n\t\terrorDuration: binding.errorDuration ?? DEFAULT_ERROR_DURATION,\n\t\tonStateChange: binding.onStateChange,\n\t}\n}\n\nfunction createIndicator(): HTMLDivElement {\n\tconst el = document.createElement('div')\n\tel.className = 'v-pull-refresh__indicator'\n\tel.style.cssText = `\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tright: 0;\n\t\theight: 60px;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tbackground: #f5f5f5;\n\t\tfont-size: 14px;\n\t\tcolor: #666;\n\t\tz-index: 10;\n\t\tpointer-events: none;\n\t\topacity: 0;\n\t\ttransition: opacity 0.2s ease;\n\t`\n\treturn el\n}\n\nfunction updateIndicator(el: HTMLDivElement, state: PullRefreshState, options: PullRefreshOptions): void {\n\tconst customIndicator = options.indicator?.[state]\n\tel.textContent = customIndicator || DEFAULT_INDICATORS[state]\n}\n\nfunction setState(internal: PullRefreshInternalState, newState: PullRefreshState): void {\n\tif (internal.state === newState) return\n\n\tinternal.state = newState\n\tupdateIndicator(internal.indicatorEl, newState, internal.options)\n\tinternal.options.onStateChange?.(newState)\n}\n\nfunction applyTransform(internal: PullRefreshInternalState, distance: number, showIndicator: boolean): void {\n\tinternal.contentEl.style.transform = `translateY(${distance}px)`\n\tinternal.indicatorEl.style.opacity = showIndicator ? '1' : '0'\n\tinternal.indicatorEl.style.transform = `translateY(${distance}px)`\n}\n\nfunction resetPosition(internal: PullRefreshInternalState): void {\n\tinternal.contentEl.style.transform = ''\n\tinternal.indicatorEl.style.opacity = '0'\n\tsetState(internal, 'idle')\n}\n\nasync function triggerRefresh(internal: PullRefreshInternalState): Promise<void> {\n\tsetState(internal, 'loading')\n\n\tconst distance = internal.options.distance!\n\tapplyTransform(internal, distance, true)\n\n\ttry {\n\t\tawait internal.options.handler()\n\t\tsetState(internal, 'success')\n\t\tawait sleep(internal.options.successDuration!)\n\t} catch {\n\t\tsetState(internal, 'error')\n\t\tawait sleep(internal.options.errorDuration!)\n\t} finally {\n\t\tresetPosition(internal)\n\t}\n}\n\nfunction sleep(ms: number): Promise<void> {\n\treturn new Promise(resolve => setTimeout(resolve, ms))\n}\n\nfunction createHandlers(internal: PullRefreshInternalState): PullRefreshInternalState['handlers'] {\n\tconst { contentEl, options } = internal\n\n\treturn {\n\t\ttouchStart: (e: TouchEvent) => {\n\t\t\tif (options.disabled || internal.state === 'loading') return\n\t\t\tif (contentEl.scrollTop > 0) return\n\n\t\t\tinternal.pulling = true\n\t\t\tinternal.startY = e.touches[0].clientY\n\t\t\tinternal.currentY = internal.startY\n\t\t\tsetState(internal, 'idle')\n\t\t},\n\n\t\ttouchMove: (e: TouchEvent) => {\n\t\t\tif (!internal.pulling || options.disabled || internal.state === 'loading') return\n\n\t\t\tinternal.currentY = e.touches[0].clientY\n\t\t\tconst diff = internal.currentY - internal.startY\n\n\t\t\t// Handle upward swipe - reset\n\t\t\tif (diff <= 0) {\n\t\t\t\tif (contentEl.style.transform) {\n\t\t\t\t\tcontentEl.style.transition = ''\n\t\t\t\t\tresetPosition(internal)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Prevent page scroll\n\t\t\te.preventDefault()\n\n\t\t\tconst distance = Math.min(diff * 0.5, options.maxDistance!)\n\t\t\tconst progress = distance / options.distance!\n\n\t\t\tcontentEl.style.transition = 'none'\n\t\t\tapplyTransform(internal, distance, true)\n\t\t\tsetState(internal, progress >= 1 ? 'ready' : 'pulling')\n\t\t},\n\n\t\ttouchEnd: () => {\n\t\t\tif (!internal.pulling || options.disabled) return\n\n\t\t\tinternal.pulling = false\n\t\t\tconst diff = internal.currentY - internal.startY\n\t\t\tconst distance = Math.min(diff * 0.5, options.maxDistance!)\n\n\t\t\tcontentEl.style.transition = ''\n\n\t\t\tif (internal.state === 'ready' && distance >= options.distance!) {\n\t\t\t\ttriggerRefresh(internal)\n\t\t\t} else {\n\t\t\t\tresetPosition(internal)\n\t\t\t}\n\t\t},\n\t}\n}\n\nfunction bindEvents(el: HTMLElement, handlers: PullRefreshInternalState['handlers']): void {\n\tel.addEventListener('touchstart', handlers.touchStart, { passive: false })\n\tel.addEventListener('touchmove', handlers.touchMove, { passive: false })\n\tel.addEventListener('touchend', handlers.touchEnd, { passive: true })\n}\n\nfunction unbindEvents(el: HTMLElement, handlers: PullRefreshInternalState['handlers']): void {\n\tel.removeEventListener('touchstart', handlers.touchStart)\n\tel.removeEventListener('touchmove', handlers.touchMove)\n\tel.removeEventListener('touchend', handlers.touchEnd)\n}\n\nexport const vPullRefresh = defineDirective<PullRefreshBinding, HTMLElement>({\n\tname: 'pull-refresh',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Setup container\n\t\tel.style.position = 'relative'\n\t\tel.style.overflow = 'hidden'\n\t\tel.classList.add('v-pull-refresh')\n\n\t\t// Create content wrapper\n\t\tconst contentEl = document.createElement('div')\n\t\tcontentEl.className = 'v-pull-refresh__content'\n\t\tcontentEl.style.cssText = 'position: relative; height: 100%; overflow-y: auto;'\n\n\t\t// Move children to wrapper\n\t\twhile (el.firstChild) {\n\t\t\tcontentEl.appendChild(el.firstChild)\n\t\t}\n\t\tel.appendChild(contentEl)\n\n\t\t// Create indicator\n\t\tconst indicatorEl = createIndicator()\n\t\tel.insertBefore(indicatorEl, contentEl)\n\n\t\t// Initialize state\n\t\tconst internal: PullRefreshInternalState = {\n\t\t\toptions,\n\t\t\tstate: 'idle',\n\t\t\tstartY: 0,\n\t\t\tcurrentY: 0,\n\t\t\tpulling: false,\n\t\t\tindicatorEl,\n\t\t\tcontentEl,\n\t\t\thandlers: null as any,\n\t\t}\n\n\t\tinternal.handlers = createHandlers(internal)\n\t\t;(el as any).__pullRefresh = internal\n\n\t\tif (!options.disabled) {\n\t\t\tbindEvents(el, internal.handlers)\n\t\t}\n\n\t\tupdateIndicator(indicatorEl, 'idle', options)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst internal: PullRefreshInternalState = (el as any).__pullRefresh\n\t\tif (!internal) return\n\n\t\tconst wasDisabled = internal.options.disabled\n\t\tinternal.options = normalizeOptions(binding.value)\n\n\t\tupdateIndicator(internal.indicatorEl, internal.state, internal.options)\n\n\t\tif (internal.options.disabled && !wasDisabled) {\n\t\t\tunbindEvents(el, internal.handlers)\n\t\t} else if (!internal.options.disabled && wasDisabled) {\n\t\t\tbindEvents(el, internal.handlers)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst internal: PullRefreshInternalState = (el as any).__pullRefresh\n\t\tif (!internal) return\n\n\t\tunbindEvents(el, internal.handlers)\n\t\tdelete (el as any).__pullRefresh\n\t},\n})\n\nexport default vPullRefresh\n", "import { defineDirective, isBrowser, supportsResizeObserver } from '@directix/core'\nimport { ensurePosition } from '@directix/shared'\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 positioning for fallback\n\t\tensurePosition(el)\n\n\t\tconst state: ResizeState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t\tdebounceTimer: null,\n\t\t\tpendingEntry: null,\n\t\t\tfallbackIframe: null,\n\t\t\thandler: (entry: ResizeObserverEntry) => {\n\t\t\t\t// Handle debounce\n\t\t\t\tif (options.debounce && options.debounce > 0) {\n\t\t\t\t\tstate.pendingEntry = entry\n\n\t\t\t\t\tif (!state.debounceTimer) {\n\t\t\t\t\t\tstate.debounceTimer = setTimeout(() => {\n\t\t\t\t\t\t\tif (state.pendingEntry) {\n\t\t\t\t\t\t\t\toptions.handler(state.pendingEntry)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate.debounceTimer = null\n\t\t\t\t\t\t\tstate.pendingEntry = null\n\t\t\t\t\t\t}, options.debounce)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\toptions.handler(entry)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__resize = state\n\n\t\t// Use ResizeObserver if available\n\t\tif (supportsResizeObserver()) {\n\t\t\tstate.observer = new ResizeObserver(entries => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tstate.handler(entry)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate.observer.observe(el, { box: options.box })\n\t\t} else {\n\t\t\t// Fallback using iframe\n\t\t\tconsole.warn('[Directix] v-resize: ResizeObserver not supported, using fallback')\n\n\t\t\tconst { iframe, cleanup } = createFallbackResize(el, () => {\n\t\t\t\tconst rect = el.getBoundingClientRect()\n\t\t\t\tconst entry = {\n\t\t\t\t\ttarget: el,\n\t\t\t\t\tcontentRect: rect as DOMRectReadOnly,\n\t\t\t\t\tborderBoxSize: [] as any,\n\t\t\t\t\tcontentBoxSize: [] as any,\n\t\t\t\t\tdevicePixelContentBoxSize: [] as any,\n\t\t\t\t}\n\n\t\t\t\tstate.handler(entry as ResizeObserverEntry)\n\n\t\t\t\tif (options.onFallback) {\n\t\t\t\t\toptions.onFallback(getResizeInfo(entry as ResizeObserverEntry))\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate.fallbackIframe = iframe\n\t\t\t;(el as any).__resizeCleanup = cleanup\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ResizeState = (el as any).__resize\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ResizeState = (el as any).__resize\n\n\t\tif (!state) return\n\n\t\t// Clear debounce timer\n\t\tif (state.debounceTimer) {\n\t\t\tclearTimeout(state.debounceTimer)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\t// Cleanup fallback\n\t\tconst cleanup = (el as any).__resizeCleanup\n\n\t\tif (cleanup) {\n\t\t\tcleanup()\n\t\t}\n\n\t\tdelete (el as any).__resize\n\t\tdelete (el as any).__resizeCleanup\n\t},\n})\n\nexport default vResize\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { ensureOverflowHidden, ensurePosition, 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 and overflow\n\t\tensurePosition(el)\n\t\tensureOverflowHidden(el)\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\n/**\n * Rotate gesture event data\n */\nexport interface RotateGestureEvent {\n\t/** Original event */\n\toriginalEvent: TouchEvent\n\t/** Rotation angle in degrees */\n\tangle: number\n\t/** Rotation angle in radians */\n\tradians: number\n\t/** Current angle relative to start */\n\trotation: number\n\t/** Center point X */\n\tcenterX: number\n\t/** Center point Y */\n\tcenterY: number\n\t/** Whether rotation is in progress */\n\tisRotating: boolean\n\t/** Whether rotation just started */\n\tisFirst: boolean\n\t/** Whether rotation just ended */\n\tisFinal: boolean\n}\n\n/**\n * Rotate directive options\n */\nexport interface RotateGestureOptions {\n\t/**\n\t * Callback when rotation starts\n\t */\n\tonStart?: (e: RotateGestureEvent) => void\n\n\t/**\n\t * Callback during rotation\n\t */\n\tonRotate?: (e: RotateGestureEvent) => void\n\n\t/**\n\t * Callback when rotation ends\n\t */\n\tonEnd?: (e: RotateGestureEvent) => void\n\n\t/**\n\t * Whether to prevent default behavior\n\t * @default true\n\t */\n\tpreventDefault?: boolean\n\n\t/**\n\t * Whether to stop propagation\n\t * @default false\n\t */\n\tstopPropagation?: boolean\n\n\t/**\n\t * Enable rotation transform on element\n\t * @default false\n\t */\n\tenableTransform?: boolean\n\n\t/**\n\t * Transform origin for rotation\n\t * @default 'center center'\n\t */\n\ttransformOrigin?: string\n}\n\n/**\n * Directive binding value type\n */\nexport type RotateGestureBinding = RotateGestureOptions['onRotate'] | RotateGestureOptions\n\n/**\n * Element state storage\n */\ninterface RotateGestureState {\n\toptions: RotateGestureOptions\n\tinitialAngle: number\n\tcurrentAngle: number\n\tisRotating: boolean\n\ttouchstartHandler: (e: Event) => void\n\ttouchmoveHandler: (e: Event) => void\n\ttouchendHandler: (e: Event) => void\n\tbaseRotation: number\n\tsavedTransition: string\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: RotateGestureBinding): RotateGestureOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { onRotate: binding }\n\t}\n\n\treturn {\n\t\tpreventDefault: true,\n\t\tstopPropagation: false,\n\t\tenableTransform: false,\n\t\ttransformOrigin: 'center center',\n\t\t...binding,\n\t}\n}\n\n/**\n * Get angle between two touch points\n */\nfunction getAngle(touches: TouchList): number {\n\tif (touches.length < 2) return 0\n\tconst dx = touches[1].clientX - touches[0].clientX\n\tconst dy = touches[1].clientY - touches[0].clientY\n\t// Return angle in degrees\n\treturn Math.atan2(dy, dx) * (180 / Math.PI)\n}\n\n/**\n * Get center point between two touch points\n */\nfunction getCenter(touches: TouchList): { x: number, y: number } {\n\tif (touches.length < 2) return { x: touches[0].clientX, y: touches[0].clientY }\n\treturn {\n\t\tx: (touches[0].clientX + touches[1].clientX) / 2,\n\t\ty: (touches[0].clientY + touches[1].clientY) / 2,\n\t}\n}\n\n/**\n * Create rotate event object\n */\nfunction createRotateEvent(\n\toriginalEvent: TouchEvent,\n\tstate: RotateGestureState,\n\tisFirst: boolean = false,\n\tisFinal: boolean = false,\n): RotateGestureEvent {\n\tconst center = getCenter(originalEvent.touches)\n\tconst radians = state.currentAngle * (Math.PI / 180)\n\n\treturn {\n\t\toriginalEvent,\n\t\tangle: state.currentAngle,\n\t\tradians,\n\t\trotation: state.currentAngle - state.initialAngle,\n\t\tcenterX: center.x,\n\t\tcenterY: center.y,\n\t\tisRotating: state.isRotating,\n\t\tisFirst,\n\t\tisFinal,\n\t}\n}\n\n/**\n * v-rotate directive\n * Two-finger rotation gesture\n *\n * @example\n * ```vue\n * <template>\n * <div v-rotate=\"handleRotate\">Rotate with two fingers</div>\n *\n * <div v-rotate=\"{\n * onRotate: handleRotate,\n * enableTransform: true\n * }\">\n * Rotate with transform\n * </div>\n * </template>\n *\n * <script setup>\n * function handleRotate(e) {\n * console.log('Rotation:', e.rotation)\n * console.log('Angle:', e.angle)\n * }\n * </script>\n * ```\n */\nexport const vRotateGesture = defineDirective<RotateGestureBinding, HTMLElement>({\n\tname: 'rotate-gesture',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state: RotateGestureState = {\n\t\t\toptions,\n\t\t\tinitialAngle: 0,\n\t\t\tcurrentAngle: 0,\n\t\t\tisRotating: false,\n\t\t\tbaseRotation: 0,\n\t\t\tsavedTransition: '',\n\t\t\ttouchstartHandler: (e: Event) => handleStart(e as TouchEvent, state, el),\n\t\t\ttouchmoveHandler: (e: Event) => handleMove(e as TouchEvent, state, el),\n\t\t\ttouchendHandler: (e: Event) => handleEnd(e as TouchEvent, state, el),\n\t\t}\n\n\t\t;(el as any).__rotateGesture = state\n\n\t\ton(el, 'touchstart', state.touchstartHandler, { passive: false })\n\t\ton(el, 'touchmove', state.touchmoveHandler, { passive: false })\n\t\ton(el, 'touchend', state.touchendHandler)\n\t\ton(el, 'touchcancel', state.touchendHandler)\n\n\t\tel.classList.add('v-rotate-gesture')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: RotateGestureState = (el as any).__rotateGesture\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: RotateGestureState = (el as any).__rotateGesture\n\t\tif (!state) return\n\n\t\toff(el, 'touchstart', state.touchstartHandler)\n\t\toff(el, 'touchmove', state.touchmoveHandler)\n\t\toff(el, 'touchend', state.touchendHandler)\n\t\toff(el, 'touchcancel', state.touchendHandler)\n\n\t\tel.classList.remove('v-rotate-gesture')\n\t\tdelete (el as any).__rotateGesture\n\t},\n})\n\n/**\n * Handle rotation start\n */\nfunction handleStart(e: TouchEvent, state: RotateGestureState, el: HTMLElement): void {\n\tif (e.touches.length !== 2) return\n\n\tstate.initialAngle = getAngle(e.touches)\n\tstate.currentAngle = state.initialAngle\n\tstate.isRotating = false\n\n\tif (state.options.enableTransform) {\n\t\t// Get current rotation from transform\n\t\tconst transform = getComputedStyle(el).transform\n\t\tconst matrix = new DOMMatrix(transform)\n\t\t// Extract rotation angle from matrix\n\t\tstate.baseRotation = Math.atan2(matrix.b, matrix.a) * (180 / Math.PI)\n\t\t// Disable transition during rotation for smooth response\n\t\tstate.savedTransition = el.style.transition\n\t\tel.style.transition = 'none'\n\t}\n\n\tif (state.options.preventDefault) {\n\t\te.preventDefault()\n\t}\n\tif (state.options.stopPropagation) {\n\t\te.stopPropagation()\n\t}\n}\n\n/**\n * Handle rotation move\n */\nfunction handleMove(e: TouchEvent, state: RotateGestureState, el: HTMLElement): void {\n\tif (e.touches.length !== 2) return\n\n\tstate.currentAngle = getAngle(e.touches)\n\n\tif (state.options.preventDefault) {\n\t\te.preventDefault()\n\t}\n\n\tconst wasRotating = state.isRotating\n\tstate.isRotating = true\n\n\tconst rotateEvent = createRotateEvent(e, state, !wasRotating)\n\n\tif (!wasRotating) {\n\t\tstate.options.onStart?.(rotateEvent)\n\t}\n\n\t// Apply transform if enabled\n\tif (state.options.enableTransform) {\n\t\tconst rotation = state.currentAngle - state.initialAngle\n\t\tconst transformOrigin = state.options.transformOrigin || 'center center'\n\t\tel.style.transformOrigin = transformOrigin\n\t\tel.style.transform = `rotate(${state.baseRotation + rotation}deg)`\n\t}\n\n\tstate.options.onRotate?.(rotateEvent)\n}\n\n/**\n * Handle rotation end\n */\nfunction handleEnd(e: TouchEvent, state: RotateGestureState, el: HTMLElement): void {\n\tif (!state.isRotating) return\n\n\t// Restore transition\n\tif (state.options.enableTransform) {\n\t\tel.style.transition = state.savedTransition\n\t}\n\n\t// Create final event\n\tconst finalEvent = {\n\t\t...e,\n\t\ttouches: e.touches.length >= 2 ? e.touches : ([] as any),\n\t} as TouchEvent\n\n\tconst rotateEvent = createRotateEvent(finalEvent, state, false, true)\n\tstate.options.onEnd?.(rotateEvent)\n\n\tstate.isRotating = false\n\tstate.initialAngle = 0\n\tstate.currentAngle = 0\n}\n\nexport default vRotateGesture\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\t// Store options even when disabled so updated hook can work\n\t\t;(el as any).__sanitize = { options }\n\n\t\tif (options.disabled) return\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\tconst prevDisabled = state.options.disabled\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\tif (state.options.disabled || !state.options.sanitizeOnUpdate) {\n\t\t\t// If was previously disabled and now enabled, sanitize\n\t\t\tif (prevDisabled && !state.options.disabled) {\n\t\t\t\tconst content = el.innerHTML\n\t\t\t\tif (content) {\n\t\t\t\t\tel.innerHTML = sanitizeHtml(content, state.options)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// Sanitize updated content\n\t\tconst content = el.innerHTML\n\n\t\tif (content) {\n\t\t\tel.innerHTML = sanitizeHtml(content, state.options)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tdelete (el as any).__sanitize\n\t},\n})\n\nexport default vSanitize\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\n/**\n * Scroll event handler\n */\nexport type ScrollHandler = (event: Event, info: ScrollInfo) => void\n\n/**\n * Scroll information\n */\nexport interface ScrollInfo {\n\t/** Current scroll left position */\n\tscrollLeft: number\n\t/** Current scroll top position */\n\tscrollTop: number\n\t/** Maximum scroll left */\n\tscrollLeftMax: number\n\t/** Maximum scroll top */\n\tscrollTopMax: number\n\t/** Horizontal scroll progress (0-1) */\n\tprogressX: number\n\t/** Vertical scroll progress (0-1) */\n\tprogressY: number\n\t/** Direction of horizontal scroll (-1: left, 1: right, 0: none) */\n\tdirectionX: -1 | 0 | 1\n\t/** Direction of vertical scroll (-1: up, 1: down, 0: none) */\n\tdirectionY: -1 | 0 | 1\n\t/** Scroll container element or window */\n\tcontainer: Element | Window\n}\n\n/**\n * Scroll directive options\n */\nexport interface ScrollOptions {\n\t/**\n\t * Scroll event handler\n\t * @required\n\t */\n\thandler: ScrollHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to use passive event listener\n\t * @default true\n\t */\n\tpassive?: boolean\n\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 0 (no throttle)\n\t */\n\tthrottle?: number\n\n\t/**\n\t * Custom scroll container selector or element\n\t */\n\tcontainer?: string | Element | Window | null\n}\n\n/**\n * Directive binding value type\n */\nexport type ScrollBinding = ScrollHandler | ScrollOptions\n\n/**\n * Element state storage\n */\ninterface ScrollState {\n\toptions: ScrollOptions\n\tscrollHandler: (e: Event) => void\n\tcontainer: Element | Window\n\tlastScrollLeft: number\n\tlastScrollTop: number\n\tthrottleTimer: ReturnType<typeof setTimeout> | null\n\tpendingEvent: Event | null\n}\n\n/**\n * Get scroll info\n */\nfunction getScrollInfo(container: Element | Window, lastScrollLeft: number, lastScrollTop: number): ScrollInfo {\n\tlet scrollLeft = 0,\n\t\tscrollTop = 0,\n\t\tscrollLeftMax = 0,\n\t\tscrollTopMax = 0\n\n\tif (container === window) {\n\t\tscrollLeft = window.scrollX || document.documentElement.scrollLeft\n\t\tscrollTop = window.scrollY || document.documentElement.scrollTop\n\t\tscrollLeftMax = document.documentElement.scrollWidth - window.innerWidth\n\t\tscrollTopMax = document.documentElement.scrollHeight - window.innerHeight\n\t} else {\n\t\tconst el = container as Element\n\n\t\tscrollLeft = el.scrollLeft\n\t\tscrollTop = el.scrollTop\n\t\tscrollLeftMax = el.scrollWidth - el.clientWidth\n\t\tscrollTopMax = el.scrollHeight - el.clientHeight\n\t}\n\n\tconst progressX = scrollLeftMax > 0 ? scrollLeft / scrollLeftMax : 0\n\tconst progressY = scrollTopMax > 0 ? scrollTop / scrollTopMax : 0\n\n\t// Calculate direction\n\tconst directionX: -1 | 0 | 1 = scrollLeft !== lastScrollLeft ? (scrollLeft > lastScrollLeft ? 1 : -1) : 0\n\tconst directionY: -1 | 0 | 1 = scrollTop !== lastScrollTop ? (scrollTop > lastScrollTop ? 1 : -1) : 0\n\n\treturn {\n\t\tscrollLeft,\n\t\tscrollTop,\n\t\tscrollLeftMax,\n\t\tscrollTopMax,\n\t\tprogressX,\n\t\tprogressY,\n\t\tdirectionX,\n\t\tdirectionY,\n\t\tcontainer,\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ScrollBinding | undefined): ScrollOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, passive: true }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-scroll: handler is required')\n\t}\n\n\treturn {\n\t\tpassive: true,\n\t\tthrottle: 0,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-scroll directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-scroll=\"handleScroll\">Scroll container</div>\n * <div v-scroll=\"{ handler: handleScroll, throttle: 100 }\">Throttled scroll</div>\n * </template>\n * ```\n */\nexport const vScroll = defineDirective<ScrollBinding, HTMLElement>({\n\tname: 'scroll',\n\tssr: false,\n\tdefaults: {\n\t\tpassive: true,\n\t\tthrottle: 0,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Determine scroll container\n\t\tlet container: Element | Window\n\n\t\tif (options.container) {\n\t\t\tif (options.container === window) {\n\t\t\t\tcontainer = window\n\t\t\t} else if (typeof options.container === 'string') {\n\t\t\t\tconst found = document.querySelector(options.container)\n\n\t\t\t\tcontainer = found || getScrollParent(el)\n\t\t\t} else {\n\t\t\t\tcontainer = options.container\n\t\t\t}\n\t\t} else {\n\t\t\t// Check if element itself is scrollable\n\t\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(el)\n\t\t\tconst isSelfScrollable = /(auto|scroll)/.test(overflow + overflowX + overflowY)\n\n\t\t\tcontainer = isSelfScrollable ? el : getScrollParent(el)\n\t\t}\n\n\t\tconst state: ScrollState = {\n\t\t\toptions,\n\t\t\tcontainer,\n\t\t\tlastScrollLeft: 0,\n\t\t\tlastScrollTop: 0,\n\t\t\tthrottleTimer: null,\n\t\t\tpendingEvent: null,\n\t\t\tscrollHandler: (e: Event) => {\n\t\t\t\t// Handle throttle\n\t\t\t\tif (options.throttle && options.throttle > 0) {\n\t\t\t\t\tstate.pendingEvent = e\n\n\t\t\t\t\tif (!state.throttleTimer) {\n\t\t\t\t\t\tstate.throttleTimer = setTimeout(() => {\n\t\t\t\t\t\t\tif (state.pendingEvent) {\n\t\t\t\t\t\t\t\tconst info = getScrollInfo(container, state.lastScrollLeft, state.lastScrollTop)\n\n\t\t\t\t\t\t\t\tstate.lastScrollLeft = info.scrollLeft\n\t\t\t\t\t\t\t\tstate.lastScrollTop = info.scrollTop\n\t\t\t\t\t\t\t\toptions.handler(state.pendingEvent, info)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate.throttleTimer = null\n\t\t\t\t\t\t\tstate.pendingEvent = null\n\t\t\t\t\t\t}, options.throttle)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst info = getScrollInfo(container, state.lastScrollLeft, state.lastScrollTop)\n\n\t\t\t\t\tstate.lastScrollLeft = info.scrollLeft\n\t\t\t\t\tstate.lastScrollTop = info.scrollTop\n\t\t\t\t\toptions.handler(e, info)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Initialize last scroll position\n\t\tconst initialInfo = getScrollInfo(container, 0, 0)\n\n\t\tstate.lastScrollLeft = initialInfo.scrollLeft\n\t\tstate.lastScrollTop = initialInfo.scrollTop\n\n\t\t// Store state\n\t\t;(el as any).__scroll = state\n\n\t\t// Bind scroll event\n\t\ton(container, 'scroll', state.scrollHandler, { passive: options.passive })\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ScrollState = (el as any).__scroll\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ScrollState = (el as any).__scroll\n\n\t\tif (!state) return\n\n\t\t// Clear throttle timer\n\t\tif (state.throttleTimer) {\n\t\t\tclearTimeout(state.throttleTimer)\n\t\t}\n\n\t\t// Unbind scroll event\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\n\t\tdelete (el as any).__scroll\n\t},\n})\n\nexport default vScroll\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Skeleton animation type\n */\nexport type SkeletonAnimation = 'wave' | 'pulse' | 'none'\n\n/**\n * Skeleton directive options\n */\nexport interface SkeletonOptions {\n\t/**\n\t * Whether to show skeleton loading state\n\t * @default true\n\t */\n\tloading?: boolean\n\n\t/**\n\t * Animation type\n\t * @default 'wave'\n\t */\n\tanimation?: SkeletonAnimation\n\n\t/**\n\t * Skeleton width\n\t * @default '100%'\n\t */\n\twidth?: string | number\n\n\t/**\n\t * Skeleton height\n\t * @default '1em'\n\t */\n\theight?: string | number\n\n\t/**\n\t * Border radius\n\t * @default '4px'\n\t */\n\tradius?: string | number\n\n\t/**\n\t * Skeleton color\n\t * @default '#e8e8e8'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Animation color (for wave effect)\n\t * @default '#f0f0f0'\n\t */\n\tanimationColor?: string\n\n\t/**\n\t * Custom class for skeleton element\n\t */\n\tclass?: string\n\n\t/**\n\t * Whether to preserve the original content dimensions\n\t * @default true\n\t */\n\tpreserveDimensions?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type SkeletonBinding = boolean | SkeletonOptions\n\n/**\n * Element state storage\n */\ninterface SkeletonState {\n\toptions: SkeletonOptions\n\toriginalDisplay: string\n\toriginalWidth: string\n\toriginalHeight: string\n\tskeletonEl: HTMLDivElement | null\n}\n\n/**\n * Default skeleton options\n */\nconst defaultOptions: SkeletonOptions = {\n\tloading: true,\n\tanimation: 'wave',\n\twidth: '100%',\n\theight: '1em',\n\tradius: '4px',\n\tcolor: '#e8e8e8',\n\tanimationColor: '#f0f0f0',\n\tpreserveDimensions: true,\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: SkeletonBinding | undefined): SkeletonOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { ...defaultOptions, loading: binding }\n\t}\n\n\treturn { ...defaultOptions, ...binding }\n}\n\n/**\n * Create skeleton element\n */\nfunction createSkeleton(options: SkeletonOptions): HTMLDivElement {\n\tconst skeleton = document.createElement('div')\n\tskeleton.className = `v-skeleton ${options.class || ''}`\n\n\tconst width = typeof options.width === 'number' ? `${options.width}px` : options.width\n\tconst height = typeof options.height === 'number' ? `${options.height}px` : options.height\n\tconst radius = typeof options.radius === 'number' ? `${options.radius}px` : options.radius\n\n\tlet animationStyle = ''\n\n\tif (options.animation === 'wave') {\n\t\tanimationStyle = `\n background: linear-gradient(90deg, ${options.color} 25%, ${options.animationColor} 50%, ${options.color} 75%);\n background-size: 200% 100%;\n animation: skeleton-wave 1.5s ease-in-out infinite;\n `\n\t} else if (options.animation === 'pulse') {\n\t\tanimationStyle = `\n background: ${options.color};\n animation: skeleton-pulse 1.5s ease-in-out infinite;\n `\n\t} else {\n\t\tanimationStyle = `background: ${options.color};`\n\t}\n\n\tskeleton.style.cssText = `\n width: ${width};\n height: ${height};\n border-radius: ${radius};\n ${animationStyle}\n `\n\n\treturn skeleton\n}\n\n/**\n * Add global styles if not present\n */\nfunction ensureStyles(): void {\n\tif (!isBrowser()) return\n\n\tconst styleId = 'v-skeleton-styles'\n\n\tif (document.getElementById(styleId)) return\n\n\tconst style = document.createElement('style')\n\tstyle.id = styleId\n\tstyle.textContent = `\n @keyframes skeleton-wave {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n @keyframes skeleton-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `\n\n\tdocument.head.appendChild(style)\n}\n\n/**\n * v-skeleton directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Basic usage -->\n * <div v-skeleton=\"isLoading\">Content here</div>\n *\n * <!-- With options -->\n * <div v-skeleton=\"{ loading: isLoading, animation: 'pulse', width: 200, height: 20 }\">\n * Content here\n * </div>\n *\n * <!-- Multiple skeleton lines -->\n * <div v-skeleton=\"{ loading: isLoading, height: '1em' }\">Line 1</div>\n * <div v-skeleton=\"{ loading: isLoading, height: '1em' }\">Line 2</div>\n * </template>\n * ```\n */\nexport const vSkeleton = defineDirective<SkeletonBinding, HTMLElement>({\n\tname: 'skeleton',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tensureStyles()\n\n\t\tconst state: SkeletonState = {\n\t\t\toptions,\n\t\t\toriginalDisplay: getComputedStyle(el).display,\n\t\t\toriginalWidth: el.style.width,\n\t\t\toriginalHeight: el.style.height,\n\t\t\tskeletonEl: null,\n\t\t}\n\n\t\t;(el as any).__skeleton = state\n\n\t\tif (options.loading) {\n\t\t\tshowSkeleton(el, state)\n\t\t}\n\n\t\tel.classList.add('v-skeleton-container')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: SkeletonState = (el as any).__skeleton\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst wasLoading = state.options.loading\n\n\t\tstate.options = newOptions\n\n\t\tif (newOptions.loading && !wasLoading) {\n\t\t\tshowSkeleton(el, state)\n\t\t} else if (!newOptions.loading && wasLoading) {\n\t\t\thideSkeleton(el, state)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: SkeletonState = (el as any).__skeleton\n\n\t\tif (!state) return\n\n\t\t// Remove skeleton element\n\t\tif (state.skeletonEl && state.skeletonEl.parentNode) {\n\t\t\tstate.skeletonEl.parentNode.removeChild(state.skeletonEl)\n\t\t}\n\n\t\tel.classList.remove('v-skeleton-container')\n\t\tel.style.display = state.originalDisplay\n\t\tel.style.width = state.originalWidth\n\t\tel.style.height = state.originalHeight\n\n\t\tdelete (el as any).__skeleton\n\t},\n})\n\n/**\n * Show skeleton\n */\nfunction showSkeleton(el: HTMLElement, state: SkeletonState): void {\n\tconst options = state.options\n\n\t// Store original styles\n\tstate.originalDisplay = el.style.display || getComputedStyle(el).display\n\n\tif (options.preserveDimensions) {\n\t\tconst computedStyle = getComputedStyle(el)\n\t\tif (!state.originalWidth) {\n\t\t\tstate.originalWidth = el.style.width\n\t\t}\n\t\tif (!state.originalHeight) {\n\t\t\tstate.originalHeight = el.style.height\n\t\t}\n\t\toptions.width = computedStyle.width\n\t\toptions.height = computedStyle.height\n\t}\n\n\t// Hide original content\n\tel.style.display = 'none'\n\n\t// Create and insert skeleton\n\tstate.skeletonEl = createSkeleton(options)\n\tel.parentNode?.insertBefore(state.skeletonEl, el.nextSibling)\n}\n\n/**\n * Hide skeleton\n */\nfunction hideSkeleton(el: HTMLElement, state: SkeletonState): void {\n\t// Remove skeleton element\n\tif (state.skeletonEl && state.skeletonEl.parentNode) {\n\t\tstate.skeletonEl.parentNode.removeChild(state.skeletonEl)\n\t\tstate.skeletonEl = null\n\t}\n\n\t// Restore original content\n\tel.style.display = state.originalDisplay\n\tel.style.width = state.originalWidth\n\tel.style.height = state.originalHeight\n}\n\nexport default vSkeleton\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\nconst STATE_KEY = '__sticky' as const\n\n/**\n * Sticky directive options\n */\nexport interface StickyOptions {\n\t/** Top offset when sticky @default 0 */\n\ttop?: number | string\n\t/** Bottom offset when sticky */\n\tbottom?: number | string\n\t/** Z-index when sticky @default 100 */\n\tzIndex?: number\n\t/** CSS class to add when sticky @default 'v-sticky--fixed' */\n\tstickyClass?: string\n\t/** Whether to disable @default false */\n\tdisabled?: boolean\n\t/** Callback when sticky state changes */\n\tonChange?: (isSticky: boolean) => void\n\t/** Custom scroll container */\n\tcontainer?: string | Element | null\n}\n\nexport type StickyBinding = boolean | number | StickyOptions\n\ninterface StickyState {\n\toptions: StickyOptions\n\tplaceholder: HTMLDivElement | null\n\toriginalStyles: { position: string, top: string, bottom: string, zIndex: string, width: string }\n\tisSticky: boolean\n\tscrollHandler: () => void\n\tresizeHandler: () => void\n\tcontainer: Element | Window\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: StickyBinding | undefined): StickyOptions {\n\tif (binding === false) return { disabled: true, top: 0, zIndex: 100 }\n\tif (typeof binding === 'number') return { top: binding, zIndex: 100 }\n\n\treturn {\n\t\ttop: 0,\n\t\tzIndex: 100,\n\t\tstickyClass: 'v-sticky--fixed',\n\t\tdisabled: false,\n\t\t...(binding && typeof binding === 'object' ? binding : {}),\n\t}\n}\n\n/**\n * Parse offset value to CSS string\n */\nfunction parseOffset(value: number | string | undefined): string {\n\tif (value === undefined) return '0'\n\n\treturn typeof value === 'number' ? `${value}px` : value\n}\n\n/**\n * Get scroll container for element\n */\nfunction getScrollContainer(el: HTMLElement, customContainer?: string | Element | null): Element | Window {\n\tif (customContainer) {\n\t\tif (typeof customContainer === 'string') {\n\t\t\treturn document.querySelector(customContainer) || getScrollParent(el)\n\t\t}\n\n\t\treturn customContainer\n\t}\n\n\t// Check if parent element is scrollable\n\tconst parent = el.parentElement\n\n\tif (parent) {\n\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent)\n\n\t\tif (/(auto|scroll)/.test(overflow + overflowX + overflowY)) {\n\t\t\treturn parent\n\t\t}\n\t}\n\n\treturn getScrollParent(el)\n}\n\n/**\n * Check and update sticky state\n */\nfunction checkSticky(el: HTMLElement, state: StickyState): void {\n\tif (state.options.disabled) {\n\t\tunsetSticky(el, state)\n\n\t\treturn\n\t}\n\n\tconst topOffset = parseFloat(parseOffset(state.options.top))\n\tconst containerRect = state.container === window ? { top: 0 } : (state.container as Element).getBoundingClientRect()\n\n\t// Use placeholder position when sticky, otherwise use element position\n\tconst referenceEl = state.placeholder || el\n\tconst rect = referenceEl.getBoundingClientRect()\n\tconst elementTopRelativeToContainer = rect.top - containerRect.top\n\n\tconst shouldSticky = elementTopRelativeToContainer <= topOffset\n\n\tif (shouldSticky && !state.isSticky) {\n\t\tsetSticky(el, state, topOffset, containerRect.top)\n\t} else if (!shouldSticky && state.isSticky) {\n\t\tunsetSticky(el, state)\n\t}\n}\n\n/**\n * Set element as sticky\n */\nfunction setSticky(el: HTMLElement, state: StickyState, topOffset: number, containerTop: number): void {\n\tstate.isSticky = true\n\n\t// Create placeholder to maintain layout\n\tconst placeholder = document.createElement('div')\n\n\tplaceholder.style.cssText = `width:${el.offsetWidth}px;height:${el.offsetHeight}px`\n\tel.parentNode?.insertBefore(placeholder, el)\n\tstate.placeholder = placeholder\n\n\t// Calculate fixed top position relative to viewport\n\tconst fixedTop = state.container === window ? topOffset : containerTop + topOffset\n\n\t// Apply sticky styles\n\tel.style.position = 'fixed'\n\tel.style.top = `${fixedTop}px`\n\tel.style.zIndex = String(state.options.zIndex || 100)\n\tel.style.width = `${el.offsetWidth}px`\n\n\tif (state.options.bottom !== undefined) {\n\t\tel.style.bottom = parseOffset(state.options.bottom)\n\t}\n\n\tstate.options.stickyClass && el.classList.add(state.options.stickyClass)\n\tel.dispatchEvent(new CustomEvent('sticky:change', { detail: { isSticky: true } }))\n\tstate.options.onChange?.(true)\n}\n\n/**\n * Unset element as sticky\n */\nfunction unsetSticky(el: HTMLElement, state: StickyState): void {\n\tif (!state.isSticky) return\n\n\tstate.isSticky = false\n\n\t// Remove placeholder\n\tstate.placeholder?.parentNode?.removeChild(state.placeholder)\n\tstate.placeholder = null\n\n\t// Restore original styles\n\tObject.assign(el.style, state.originalStyles)\n\n\tstate.options.stickyClass && el.classList.remove(state.options.stickyClass)\n\tel.dispatchEvent(new CustomEvent('sticky:change', { detail: { isSticky: false } }))\n\tstate.options.onChange?.(false)\n}\n\n/**\n * v-sticky directive\n *\n * @example\n * ```vue\n * <div v-sticky>Sticky header</div>\n * <div v-sticky=\"50\">Sticky with 50px top offset</div>\n * <div v-sticky=\"{ top: 60, zIndex: 1000 }\">Custom sticky</div>\n * ```\n */\nexport const vSticky = defineDirective<StickyBinding, HTMLElement>({\n\tname: 'sticky',\n\tssr: false,\n\tdefaults: { top: 0, zIndex: 100, stickyClass: 'v-sticky--fixed', disabled: false },\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst container = getScrollContainer(el, options.container)\n\n\t\tconst state: StickyState = {\n\t\t\toptions,\n\t\t\tplaceholder: null,\n\t\t\toriginalStyles: {\n\t\t\t\tposition: el.style.position,\n\t\t\t\ttop: el.style.top,\n\t\t\t\tbottom: el.style.bottom,\n\t\t\t\tzIndex: el.style.zIndex,\n\t\t\t\twidth: el.style.width,\n\t\t\t},\n\t\t\tisSticky: false,\n\t\t\tcontainer,\n\t\t\tscrollHandler: () => checkSticky(el, state),\n\t\t\tresizeHandler: () => checkSticky(el, state),\n\t\t}\n\n\t\tel.classList.add('v-sticky')\n\t\t;(el as any)[STATE_KEY] = state\n\n\t\ton(container, 'scroll', state.scrollHandler, { passive: true })\n\t\ton(window, 'resize', state.resizeHandler, { passive: true })\n\t\tcheckSticky(el, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: StickyState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t\tcheckSticky(el, state)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: StickyState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tstate.placeholder?.parentNode?.removeChild(state.placeholder)\n\n\t\tObject.assign(el.style, state.originalStyles)\n\t\tel.classList.remove('v-sticky', state.options.stickyClass || 'v-sticky--fixed')\n\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\t\toff(window, 'resize', state.resizeHandler)\n\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vSticky\n", "import { defineDirective } from '@directix/core'\n\nexport type SwipeDirection = 'left' | 'right' | 'up' | 'down'\n\nexport type SwipeHandler = (direction: SwipeDirection, event: Event) => void\n\nexport interface SwipeOptions {\n\thandler?: SwipeHandler\n\tthreshold?: number\n\tmaxTime?: number\n\tdirections?: SwipeDirection[]\n\tpreventScrollOnSwipe?: boolean\n\tdisabled?: boolean\n\tmouse?: boolean\n\tonLeft?: () => void\n\tonRight?: () => void\n\tonUp?: () => void\n\tonDown?: () => void\n}\n\nexport type SwipeBinding = SwipeHandler | SwipeOptions\n\ninterface SwipeState {\n\toptions: SwipeOptions\n\tstartX: number\n\tstartY: number\n\tstartTime: number\n\tisActive: boolean\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: (e: TouchEvent) => void\n\t\tmouseDown: (e: MouseEvent) => void\n\t\tmouseUp: (e: MouseEvent) => void\n\t}\n}\n\nconst DEFAULT_THRESHOLD = 30\nconst DEFAULT_MAX_TIME = 500\nconst DEFAULT_DIRECTIONS: SwipeDirection[] = ['left', 'right', 'up', 'down']\n\nfunction getSwipeDirection(\n\tdeltaX: number,\n\tdeltaY: number,\n\tallowedDirections: SwipeDirection[],\n): SwipeDirection | null {\n\tconst absX = Math.abs(deltaX)\n\tconst absY = Math.abs(deltaY)\n\n\tif (absX > absY) {\n\t\tconst direction = deltaX > 0 ? 'right' : 'left'\n\t\treturn allowedDirections.includes(direction) ? direction : null\n\t} else {\n\t\tconst direction = deltaY > 0 ? 'down' : 'up'\n\t\treturn allowedDirections.includes(direction) ? direction : null\n\t}\n}\n\nfunction normalizeOptions(binding: SwipeBinding): SwipeOptions {\n\tif (typeof binding === 'function') return { handler: binding }\n\n\treturn {\n\t\thandler: binding.handler,\n\t\tthreshold: binding.threshold ?? DEFAULT_THRESHOLD,\n\t\tmaxTime: binding.maxTime ?? DEFAULT_MAX_TIME,\n\t\tdirections: binding.directions ?? [...DEFAULT_DIRECTIONS],\n\t\tpreventScrollOnSwipe: binding.preventScrollOnSwipe ?? true,\n\t\tdisabled: binding.disabled ?? false,\n\t\tmouse: binding.mouse ?? true,\n\t\tonLeft: binding.onLeft,\n\t\tonRight: binding.onRight,\n\t\tonUp: binding.onUp,\n\t\tonDown: binding.onDown,\n\t}\n}\n\nfunction triggerSwipe(\n\tstate: SwipeState,\n\tdeltaX: number,\n\tdeltaY: number,\n\tdeltaTime: number,\n\tevent: Event,\n\tel: HTMLElement,\n): void {\n\tconst { options } = state\n\n\t// Check time\n\tif (deltaTime > (options.maxTime ?? DEFAULT_MAX_TIME)) return\n\n\t// Check distance\n\tconst distance = Math.max(Math.abs(deltaX), Math.abs(deltaY))\n\tif (distance < (options.threshold ?? DEFAULT_THRESHOLD)) return\n\n\t// Get direction\n\tconst direction = getSwipeDirection(deltaX, deltaY, options.directions ?? DEFAULT_DIRECTIONS)\n\tif (!direction) return\n\n\t// Prevent scroll\n\tif (options.preventScrollOnSwipe && event.cancelable) {\n\t\tevent.preventDefault()\n\t}\n\n\t// Call handlers\n\toptions.handler?.(direction, event)\n\n\t// Direction-specific callbacks\n\tconst callbacks: Record<SwipeDirection, (() => void) | undefined> = {\n\t\tleft: options.onLeft,\n\t\tright: options.onRight,\n\t\tup: options.onUp,\n\t\tdown: options.onDown,\n\t}\n\tcallbacks[direction]?.()\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('swipe', { detail: { direction, deltaX, deltaY, deltaTime } }))\n}\n\nfunction createSwipeHandler(\n\tel: HTMLElement,\n\tstate: SwipeState,\n): (clientX: number, clientY: number, event: Event) => void {\n\treturn (clientX, clientY, event) => {\n\t\tconst deltaX = clientX - state.startX\n\t\tconst deltaY = clientY - state.startY\n\t\tconst deltaTime = Date.now() - state.startTime\n\t\ttriggerSwipe(state, deltaX, deltaY, deltaTime, event, el)\n\t}\n}\n\nfunction setupState(el: HTMLElement, options: SwipeOptions): SwipeState | null {\n\tif (options.disabled) return null\n\n\tel.style.touchAction = 'none'\n\tel.style.userSelect = 'none'\n\n\tconst state: SwipeState = {\n\t\toptions,\n\t\tstartX: 0,\n\t\tstartY: 0,\n\t\tstartTime: 0,\n\t\tisActive: false,\n\t\thandlers: null as any,\n\t}\n\n\tconst handleSwipe = createSwipeHandler(el, state)\n\n\tstate.handlers = {\n\t\ttouchStart: (e: TouchEvent) => {\n\t\t\tif (state.options.disabled) return\n\t\t\tstate.startX = e.touches[0].clientX\n\t\t\tstate.startY = e.touches[0].clientY\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isActive = true\n\t\t},\n\n\t\ttouchMove: (e: TouchEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tif (state.options.preventScrollOnSwipe) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\t\t},\n\n\t\ttouchEnd: (e: TouchEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tstate.isActive = false\n\t\t\tconst touch = e.changedTouches[0]\n\t\t\thandleSwipe(touch.clientX, touch.clientY, e)\n\t\t},\n\n\t\tmouseDown: (e: MouseEvent) => {\n\t\t\tif (state.options.disabled) return\n\t\t\tstate.startX = e.clientX\n\t\t\tstate.startY = e.clientY\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isActive = true\n\t\t},\n\n\t\tmouseUp: (e: MouseEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tstate.isActive = false\n\t\t\thandleSwipe(e.clientX, e.clientY, e)\n\t\t},\n\t}\n\n\treturn state\n}\n\nfunction bindEvents(el: HTMLElement, state: SwipeState): void {\n\tconst { handlers } = state\n\tconst enableMouse = state.options.mouse ?? true\n\n\tel.addEventListener('touchstart', handlers.touchStart, { passive: true })\n\tel.addEventListener('touchmove', handlers.touchMove, { passive: false })\n\tel.addEventListener('touchend', handlers.touchEnd)\n\tel.addEventListener('touchcancel', handlers.touchEnd)\n\n\tif (enableMouse) {\n\t\tel.addEventListener('mousedown', handlers.mouseDown)\n\t\tel.addEventListener('mouseup', handlers.mouseUp)\n\t\tel.addEventListener('mouseleave', handlers.mouseUp)\n\t}\n}\n\nfunction unbindEvents(el: HTMLElement, state: SwipeState): void {\n\tconst { handlers } = state\n\tconst enableMouse = state.options.mouse ?? true\n\n\tel.removeEventListener('touchstart', handlers.touchStart)\n\tel.removeEventListener('touchmove', handlers.touchMove)\n\tel.removeEventListener('touchend', handlers.touchEnd)\n\tel.removeEventListener('touchcancel', handlers.touchEnd)\n\n\tif (enableMouse) {\n\t\tel.removeEventListener('mousedown', handlers.mouseDown)\n\t\tel.removeEventListener('mouseup', handlers.mouseUp)\n\t\tel.removeEventListener('mouseleave', handlers.mouseUp)\n\t}\n}\n\nexport const vSwipe = defineDirective<SwipeBinding, HTMLElement>({\n\tname: 'swipe',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state = setupState(el, options)\n\t\tif (!state) return\n\n\t\t;(el as any).__swipe = state\n\t\tbindEvents(el, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: SwipeState | undefined = (el as any).__swipe\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (!state) {\n\t\t\tconst newState = setupState(el, newOptions)\n\t\t\tif (newState) {\n\t\t\t\t;(el as any).__swipe = newState\n\t\t\t\tbindEvents(el, newState)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst wasDisabled = state.options.disabled\n\t\tconst wasMouseEnabled = state.options.mouse ?? true\n\t\tconst nowMouseEnabled = newOptions.mouse ?? true\n\n\t\tstate.options = newOptions\n\n\t\tif (newOptions.disabled && !wasDisabled) {\n\t\t\tunbindEvents(el, state)\n\t\t} else if (!newOptions.disabled && wasDisabled) {\n\t\t\tbindEvents(el, state)\n\t\t} else if (wasMouseEnabled !== nowMouseEnabled) {\n\t\t\tif (wasMouseEnabled) {\n\t\t\t\tel.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\t\t\tel.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\t\t\tel.removeEventListener('mouseleave', state.handlers.mouseUp)\n\t\t\t}\n\t\t\tif (nowMouseEnabled) {\n\t\t\t\tel.addEventListener('mousedown', state.handlers.mouseDown)\n\t\t\t\tel.addEventListener('mouseup', state.handlers.mouseUp)\n\t\t\t\tel.addEventListener('mouseleave', state.handlers.mouseUp)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: SwipeState | undefined = (el as any).__swipe\n\t\tif (!state) return\n\n\t\tunbindEvents(el, state)\n\t\tdelete (el as any).__swipe\n\t},\n})\n\nexport default vSwipe\n", "import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\nimport { getDefaultEventType, getEventTypeFromModifiers, parseTime, throttle } from '@directix/shared'\n\n/**\n * Throttled function type\n */\nexport interface ThrottledFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n}\n\n/**\n * Throttle directive options\n */\nexport interface ThrottleOptions<T extends (...args: any[]) => any = any> {\n\t/**\n\t * Function to throttle\n\t */\n\thandler: T\n\n\t/**\n\t * Delay time in milliseconds\n\t * @default 300\n\t */\n\twait?: number\n\n\t/**\n\t * Whether to invoke immediately before delay starts\n\t * @default true\n\t */\n\tleading?: boolean\n\n\t/**\n\t * Whether to invoke after delay ends\n\t * @default true\n\t */\n\ttrailing?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ThrottleBinding<T extends (...args: any[]) => any = any>\n\t= | T\n\t\t| ThrottleOptions<T>\n\n/**\n * Element state storage\n */\ninterface ThrottleState {\n\tthrottledFn: ThrottledFunction<any>\n\teventType: string\n\toptions: ThrottleOptions\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: ThrottleBinding,\n\tdirectiveBinding: DirectiveBinding<ThrottleBinding>,\n): ThrottleOptions {\n\tconst wait = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, wait }\n\t}\n\n\treturn { ...binding, wait: binding.wait || wait }\n}\n\n/**\n * v-throttle directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-throttle=\"handleClick\">Throttled Button</button>\n * <button v-throttle:1s=\"handleClick\">1s Throttled</button>\n * <div v-throttle.scroll=\"handleScroll\">Scroll Throttle</div>\n * <div v-throttle:100.scroll=\"handleScroll\">100ms Scroll Throttle</div>\n * </template>\n * ```\n */\nexport const vThrottle = defineDirective<ThrottleBinding, HTMLElement>({\n\tname: 'throttle',\n\tssr: true, // SSR safe - event binding is skipped on server\n\tdefaults: {\n\t\twait: 300,\n\t\tleading: true,\n\t\ttrailing: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t// Prefer event type from modifiers, otherwise infer from element type\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getDefaultEventType(el)\n\n\t\t// Create throttled function\n\t\tconst throttledFn = throttle(options.handler, options.wait, {\n\t\t\tleading: options.leading,\n\t\t\ttrailing: options.trailing,\n\t\t})\n\n\t\t// Bind event\n\t\tel.addEventListener(eventType, throttledFn as any)\n\n\t\t;(el as any).__throttle = {\n\t\t\tthrottledFn,\n\t\t\teventType,\n\t\t\toptions,\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ThrottleState = (el as any).__throttle\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If configuration changes, recreate throttled function\n\t\tif (\n\t\t\tnewOptions.wait !== state.options.wait\n\t\t\t|| newOptions.leading !== state.options.leading\n\t\t\t|| newOptions.trailing !== state.options.trailing\n\t\t) {\n\t\t\t// Cancel old one\n\t\t\tstate.throttledFn.cancel()\n\n\t\t\t// Create new one\n\t\t\tconst throttledFn = throttle(newOptions.handler, newOptions.wait, {\n\t\t\t\tleading: newOptions.leading,\n\t\t\t\ttrailing: newOptions.trailing,\n\t\t\t})\n\n\t\t\tel.removeEventListener(state.eventType, state.throttledFn as any)\n\t\t\tel.addEventListener(state.eventType, throttledFn as any)\n\n\t\t\t;(el as any).__throttle = {\n\t\t\t\tthrottledFn,\n\t\t\t\teventType: state.eventType,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t} else if (newOptions.handler !== state.options.handler) {\n\t\t\t// Only update handler\n\t\t\tstate.options.handler = newOptions.handler\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ThrottleState = (el as any).__throttle\n\n\t\tif (!state) return\n\n\t\tstate.throttledFn.cancel()\n\t\tel.removeEventListener(state.eventType, state.throttledFn as any)\n\t\tdelete (el as any).__throttle\n\t},\n})\n\nexport default vThrottle\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Tooltip placement\n */\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right'\n\n/**\n * Tooltip trigger\n */\nexport type TooltipTrigger = 'hover' | 'click' | 'focus' | 'manual'\n\n/**\n * Tooltip directive options\n */\nexport interface TooltipOptions {\n\t/** Tooltip content */\n\tcontent: string\n\t/** Tooltip placement @default 'top' */\n\tplacement?: TooltipPlacement\n\t/** Trigger type @default 'hover' */\n\ttrigger?: TooltipTrigger\n\t/** Show delay in milliseconds @default 0 */\n\tdelay?: number\n\t/** Hide delay in milliseconds @default 0 */\n\thideDelay?: number\n\t/** Offset from the element in pixels @default 8 */\n\toffset?: number\n\t/** Custom class for the tooltip */\n\tclass?: string\n\t/** Whether to show arrow @default true */\n\tarrow?: boolean\n\t/** Whether the tooltip is disabled @default false */\n\tdisabled?: boolean\n\t/** Maximum width of the tooltip */\n\tmaxWidth?: number | string\n\t/** Z-index of the tooltip @default 9999 */\n\tzIndex?: number\n\t/** Callback when tooltip is shown */\n\tonShow?: () => void\n\t/** Callback when tooltip is hidden */\n\tonHide?: () => void\n}\n\nexport type TooltipBinding = string | TooltipOptions\n\ninterface TooltipState {\n\toptions: TooltipOptions\n\ttooltip: HTMLElement | null\n\tshowTimeout: ReturnType<typeof setTimeout> | null\n\thideTimeout: ReturnType<typeof setTimeout> | null\n\tisVisible: boolean\n\thandlers: {\n\t\tshow?: () => void\n\t\thide?: () => void\n\t\ttoggle?: () => void\n\t\tdocHide?: (e: Event) => void\n\t}\n}\n\n// Default tooltip styles\nconst TOOLTIP_STYLES = {\n\tpadding: '8px 12px',\n\tbackground: '#333',\n\tcolor: '#fff',\n\tborderRadius: '6px',\n\tfontSize: '14px',\n\tlineHeight: '1.5',\n\tminWidth: '96px',\n\tmaxWidth: '320px',\n\tboxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n}\n\n// Global tooltip container\nlet tooltipContainer: HTMLElement | null = null\n\nfunction getTooltipContainer(): HTMLElement {\n\t// Check if container exists and is still in the DOM\n\tif (tooltipContainer && document.body.contains(tooltipContainer)) {\n\t\treturn tooltipContainer\n\t}\n\n\t// Create new container\n\ttooltipContainer = document.createElement('div')\n\ttooltipContainer.id = 'directix-tooltip-container'\n\ttooltipContainer.style.cssText = 'position: fixed; top: 0; left: 0; pointer-events: none; z-index: 9999;'\n\tdocument.body.appendChild(tooltipContainer)\n\n\treturn tooltipContainer\n}\n\nfunction createTooltip(options: TooltipOptions): HTMLElement {\n\tconst tooltip = document.createElement('div')\n\n\ttooltip.className = `v-tooltip v-tooltip--${options.placement || 'top'}`\n\tif (options.class) tooltip.classList.add(options.class)\n\n\tconst maxWidth = options.maxWidth ? typeof options.maxWidth === 'number' ? `${options.maxWidth}px` : options.maxWidth : TOOLTIP_STYLES.maxWidth\n\n\ttooltip.style.cssText = [\n\t\t'position: absolute',\n\t\t`padding: ${TOOLTIP_STYLES.padding}`,\n\t\t`background: ${TOOLTIP_STYLES.background}`,\n\t\t`color: ${TOOLTIP_STYLES.color}`,\n\t\t`border-radius: ${TOOLTIP_STYLES.borderRadius}`,\n\t\t`font-size: ${TOOLTIP_STYLES.fontSize}`,\n\t\t`line-height: ${TOOLTIP_STYLES.lineHeight}`,\n\t\t`min-width: ${TOOLTIP_STYLES.minWidth}`,\n\t\t`max-width: ${maxWidth}`,\n\t\t'word-wrap: break-word',\n\t\t`box-shadow: ${TOOLTIP_STYLES.boxShadow}`,\n\t\t'pointer-events: none',\n\t\t'opacity: 0',\n\t\t'transition: opacity 0.2s ease',\n\t\t`z-index: ${options.zIndex || 9999}`,\n\t].join(';')\n\n\t// Add arrow\n\tif (options.arrow !== false) {\n\t\tconst arrow = document.createElement('div')\n\n\t\tarrow.className = 'v-tooltip__arrow'\n\t\tarrow.style.cssText = 'position: absolute; width: 8px; height: 8px; background: #333; transform: rotate(45deg);'\n\t\ttooltip.appendChild(arrow)\n\t}\n\n\t// Add content\n\tconst content = document.createElement('div')\n\n\tcontent.className = 'v-tooltip__content'\n\tcontent.textContent = options.content\n\ttooltip.appendChild(content)\n\n\treturn tooltip\n}\n\nfunction positionTooltip(\n\ttooltip: HTMLElement,\n\tel: HTMLElement,\n\tplacement: TooltipPlacement,\n\toffset: number,\n): void {\n\tconst elRect = el.getBoundingClientRect()\n\tconst tooltipRect = tooltip.getBoundingClientRect()\n\n\tlet top = 0,\n\t\tleft = 0\n\n\tswitch (placement) {\n\t\tcase 'top':\n\t\t\ttop = elRect.top - tooltipRect.height - offset\n\t\t\tleft = elRect.left + (elRect.width - tooltipRect.width) / 2\n\t\t\tbreak\n\t\tcase 'bottom':\n\t\t\ttop = elRect.bottom + offset\n\t\t\tleft = elRect.left + (elRect.width - tooltipRect.width) / 2\n\t\t\tbreak\n\t\tcase 'left':\n\t\t\ttop = elRect.top + (elRect.height - tooltipRect.height) / 2\n\t\t\tleft = elRect.left - tooltipRect.width - offset\n\t\t\tbreak\n\t\tcase 'right':\n\t\t\ttop = elRect.top + (elRect.height - tooltipRect.height) / 2\n\t\t\tleft = elRect.right + offset\n\t\t\tbreak\n\t}\n\n\t// Keep within viewport\n\tconst viewportWidth = window.innerWidth\n\tconst viewportHeight = window.innerHeight\n\n\tif (left < 0) left = 8\n\tif (left + tooltipRect.width > viewportWidth) left = viewportWidth - tooltipRect.width - 8\n\tif (top < 0) top = 8\n\tif (top + tooltipRect.height > viewportHeight) top = viewportHeight - tooltipRect.height - 8\n\n\ttooltip.style.top = `${top}px`\n\ttooltip.style.left = `${left}px`\n\n\t// Position arrow\n\tconst arrow = tooltip.querySelector('.v-tooltip__arrow') as HTMLElement\n\n\tif (arrow) {\n\t\tconst halfArrow = 4\n\n\t\tswitch (placement) {\n\t\t\tcase 'top':\n\t\t\t\tObject.assign(arrow.style, { bottom: `-${halfArrow}px`, left: '50%', transform: 'translateX(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'bottom':\n\t\t\t\tObject.assign(arrow.style, { top: `-${halfArrow}px`, left: '50%', transform: 'translateX(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'left':\n\t\t\t\tObject.assign(arrow.style, { right: `-${halfArrow}px`, top: '50%', transform: 'translateY(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'right':\n\t\t\t\tObject.assign(arrow.style, { left: `-${halfArrow}px`, top: '50%', transform: 'translateY(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunction showTooltip(el: HTMLElement, state: TooltipState): void {\n\tif (state.isVisible || state.options.disabled) return\n\n\tif (state.hideTimeout) {\n\t\tclearTimeout(state.hideTimeout)\n\t\tstate.hideTimeout = null\n\t}\n\n\tconst doShow = (): void => {\n\t\tconst tooltip = createTooltip(state.options)\n\n\t\tstate.tooltip = tooltip\n\t\tgetTooltipContainer().appendChild(tooltip)\n\n\t\trequestAnimationFrame(() => {\n\t\t\tpositionTooltip(tooltip, el, state.options.placement || 'top', state.options.offset || 8)\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\ttooltip.style.opacity = '1'\n\t\t\t})\n\t\t})\n\n\t\tstate.isVisible = true\n\t\tstate.options.onShow?.()\n\t}\n\n\tif (state.options.delay && state.options.delay > 0) {\n\t\tstate.showTimeout = setTimeout(doShow, state.options.delay)\n\t} else {\n\t\tdoShow()\n\t}\n}\n\nfunction hideTooltip(state: TooltipState): void {\n\tif (!state.isVisible) return\n\n\tif (state.showTimeout) {\n\t\tclearTimeout(state.showTimeout)\n\t\tstate.showTimeout = null\n\t}\n\n\tconst doHide = (): void => {\n\t\tif (state.tooltip) {\n\t\t\tstate.tooltip.style.opacity = '0'\n\t\t\tsetTimeout(() => {\n\t\t\t\tstate.tooltip?.remove()\n\t\t\t\tstate.tooltip = null\n\t\t\t}, 200)\n\t\t}\n\n\t\tstate.isVisible = false\n\t\tstate.options.onHide?.()\n\t}\n\n\tif (state.options.hideDelay && state.options.hideDelay > 0) {\n\t\tstate.hideTimeout = setTimeout(doHide, state.options.hideDelay)\n\t} else {\n\t\tdoHide()\n\t}\n}\n\nfunction setupTriggerHandlers(el: HTMLElement, state: TooltipState): void {\n\tconst { trigger = 'hover' } = state.options\n\n\tconst show = (): void => showTooltip(el, state)\n\tconst hide = (): void => hideTooltip(state)\n\tconst toggle = (): void => (state.isVisible ? hide() : show())\n\n\tstate.handlers = { show, hide, toggle }\n\n\tswitch (trigger) {\n\t\tcase 'hover':\n\t\t\tel.addEventListener('mouseenter', show)\n\t\t\tel.addEventListener('mouseleave', hide)\n\t\t\tbreak\n\t\tcase 'click':\n\t\t\tel.addEventListener('click', toggle)\n\t\t\tdocument.addEventListener('click', state.handlers.docHide = (e: Event) => {\n\t\t\t\tif (state.isVisible && !el.contains(e.target as Node)) hide()\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'focus':\n\t\t\tel.addEventListener('focus', show)\n\t\t\tel.addEventListener('blur', hide)\n\t\t\tbreak\n\t\t// 'manual' - no automatic handlers\n\t}\n}\n\nfunction removeTriggerHandlers(el: HTMLElement, state: TooltipState): void {\n\tconst { show, hide, toggle, docHide } = state.handlers\n\n\tif (show) {\n\t\tel.removeEventListener('mouseenter', show)\n\t\tel.removeEventListener('focus', show)\n\t}\n\tif (hide) {\n\t\tel.removeEventListener('mouseleave', hide)\n\t\tel.removeEventListener('blur', hide)\n\t}\n\tif (toggle) {\n\t\tel.removeEventListener('click', toggle)\n\t}\n\tif (docHide) {\n\t\tdocument.removeEventListener('click', docHide)\n\t}\n}\n\nfunction normalizeOptions(binding: TooltipBinding | undefined): TooltipOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { content: binding, placement: 'top', trigger: 'hover' }\n\t}\n\n\tif (!binding) {\n\t\treturn { content: '', placement: 'top', trigger: 'hover' }\n\t}\n\n\treturn {\n\t\tcontent: binding.content,\n\t\tplacement: binding.placement ?? 'top',\n\t\ttrigger: binding.trigger ?? 'hover',\n\t\tdelay: binding.delay ?? 0,\n\t\thideDelay: binding.hideDelay ?? 0,\n\t\toffset: binding.offset ?? 8,\n\t\tclass: binding.class,\n\t\tarrow: binding.arrow ?? true,\n\t\tdisabled: binding.disabled ?? false,\n\t\tmaxWidth: binding.maxWidth,\n\t\tzIndex: binding.zIndex ?? 9999,\n\t\tonShow: binding.onShow,\n\t\tonHide: binding.onHide,\n\t}\n}\n\nfunction createState(options: TooltipOptions): TooltipState {\n\treturn {\n\t\toptions,\n\t\ttooltip: null,\n\t\tshowTimeout: null,\n\t\thideTimeout: null,\n\t\tisVisible: false,\n\t\thandlers: {},\n\t}\n}\n\nexport const vTooltip = defineDirective<TooltipBinding, HTMLElement>({\n\tname: 'tooltip',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !options.content) return\n\n\t\tconst state = createState(options)\n\n\t\t;(el as any).__tooltip = state\n\t\tsetupTriggerHandlers(el, state)\n\t\tel.setAttribute('aria-describedby', 'v-tooltip')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: TooltipState | undefined = (el as any).__tooltip\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// No state exists - create if needed\n\t\tif (!state) {\n\t\t\tif (!newOptions.disabled && newOptions.content) {\n\t\t\t\tconst newState = createState(newOptions)\n\n\t\t\t\t;(el as any).__tooltip = newState\n\t\t\t\tsetupTriggerHandlers(el, newState)\n\t\t\t\tel.setAttribute('aria-describedby', 'v-tooltip')\n\n\t\t\t\tif (newOptions.trigger === 'manual') {\n\t\t\t\t\tshowTooltip(el, newState)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\t// Handle manual trigger\n\t\tif (newOptions.trigger === 'manual') {\n\t\t\tconst oldDisabled = state.options.disabled\n\n\t\t\tstate.options = newOptions\n\n\t\t\tif (newOptions.disabled && !oldDisabled) {\n\t\t\t\thideTooltip(state)\n\t\t\t} else if (!newOptions.disabled && oldDisabled) {\n\t\t\t\tshowTooltip(el, state)\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\t// Update visible tooltip content\n\t\tif (state.tooltip && state.isVisible) {\n\t\t\tconst content = state.tooltip.querySelector('.v-tooltip__content')\n\n\t\t\tif (content) content.textContent = newOptions.content\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: TooltipState | undefined = (el as any).__tooltip\n\n\t\tif (!state) return\n\n\t\tif (state.showTimeout) clearTimeout(state.showTimeout)\n\t\tif (state.hideTimeout) clearTimeout(state.hideTimeout)\n\t\tstate.tooltip?.remove()\n\t\tremoveTriggerHandlers(el, state)\n\t\tdelete (el as any).__tooltip\n\t},\n})\n\nexport default vTooltip\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Swipe direction\n */\nexport type SwipeDirection = 'left' | 'right' | 'up' | 'down'\n\n/**\n * Touch gesture options\n */\nexport interface TouchOptions {\n\t/** Minimum swipe distance in pixels @default 30 */\n\tswipeThreshold?: number\n\t/** Maximum time for a swipe in milliseconds @default 500 */\n\tswipeTimeout?: number\n\t/** Minimum pinch scale change @default 0.1 */\n\tpinchThreshold?: number\n\t/** Enable swipe detection @default true */\n\tenableSwipe?: boolean\n\t/** Enable pinch detection @default true */\n\tenablePinch?: boolean\n\t/** Enable rotate detection @default true */\n\tenableRotate?: boolean\n\t/** Enable tap detection @default true */\n\tenableTap?: boolean\n\t/** Maximum time for a tap in milliseconds @default 250 */\n\ttapTimeout?: number\n\t/** Maximum movement for a tap in pixels @default 10 */\n\ttapThreshold?: number\n\t/** Enable long press detection @default true */\n\tenableLongPress?: boolean\n\t/** Long press timeout in milliseconds @default 500 */\n\tlongPressTimeout?: number\n\t/** Enable mouse event simulation for desktop @default true */\n\tenableMouse?: boolean\n\n\tonSwipe?: (direction: SwipeDirection, event: TouchEvent | MouseEvent) => void\n\tonSwipeLeft?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeRight?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeUp?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeDown?: (event: TouchEvent | MouseEvent) => void\n\tonPinch?: (scale: number, event: TouchEvent) => void\n\tonRotate?: (angle: number, event: TouchEvent) => void\n\tonTap?: (event: TouchEvent | MouseEvent) => void\n\tonLongPress?: (event: TouchEvent | MouseEvent) => void\n\tonTouchStart?: (event: TouchEvent | MouseEvent) => void\n\tonTouchMove?: (event: TouchEvent | MouseEvent) => void\n\tonTouchEnd?: (event: TouchEvent | MouseEvent) => void\n}\n\ninterface TouchState {\n\toptions: TouchOptions\n\tstartX: number\n\tstartY: number\n\tstartTime: number\n\tstartDistance: number\n\tstartAngle: number\n\tlastScale: number\n\tlastAngle: number\n\tlongPressTimer: ReturnType<typeof setTimeout> | null\n\tisLongPress: boolean\n\tisMouseDown: boolean\n\tlastTouchEndTime: number\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: (e: TouchEvent) => void\n\t\tmouseDown?: (e: MouseEvent) => void\n\t\tmouseMove?: (e: MouseEvent) => void\n\t\tmouseUp?: (e: MouseEvent) => void\n\t}\n}\n\nconst getDistance = (x1: number, y1: number, x2: number, y2: number): number =>\n\tMath.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)\n\nconst getAngle = (x1: number, y1: number, x2: number, y2: number): number =>\n\t(Math.atan2(y2 - y1, x2 - x1) * 180) / Math.PI\n\nconst MOUSE_IGNORE_DURATION = 400\n\nexport const vTouch = defineDirective<TouchOptions, HTMLElement>({\n\tname: 'touch',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: TouchState = {\n\t\t\toptions,\n\t\t\tstartX: 0,\n\t\t\tstartY: 0,\n\t\t\tstartTime: 0,\n\t\t\tstartDistance: 0,\n\t\t\tstartAngle: 0,\n\t\t\tlastScale: 1,\n\t\t\tlastAngle: 0,\n\t\t\tlongPressTimer: null,\n\t\t\tisLongPress: false,\n\t\t\tisMouseDown: false,\n\t\t\tlastTouchEndTime: 0,\n\t\t\thandlers: { touchStart: () => {}, touchMove: () => {}, touchEnd: () => {} },\n\t\t}\n\n\t\t;(el as any).__touch = state\n\n\t\tconst clearLongPressTimer = (): void => {\n\t\t\tif (state.longPressTimer) {\n\t\t\t\tclearTimeout(state.longPressTimer)\n\t\t\t\tstate.longPressTimer = null\n\t\t\t}\n\t\t}\n\n\t\tconst startLongPressTimer = (event: TouchEvent | MouseEvent): void => {\n\t\t\tclearLongPressTimer()\n\t\t\tif (state.options.enableLongPress && state.options.onLongPress) {\n\t\t\t\tstate.longPressTimer = setTimeout(() => {\n\t\t\t\t\tstate.isLongPress = true\n\t\t\t\t\tstate.options.onLongPress!(event)\n\t\t\t\t}, state.options.longPressTimeout || 500)\n\t\t\t}\n\t\t}\n\n\t\tconst exceedsThreshold = (x: number, y: number): boolean => {\n\t\t\tconst threshold = state.options.tapThreshold || 10\n\t\t\treturn Math.abs(x - state.startX) > threshold || Math.abs(y - state.startY) > threshold\n\t\t}\n\n\t\tconst handleGestureEnd = (endX: number, endY: number, event: TouchEvent | MouseEvent): void => {\n\t\t\tif (state.isLongPress) return\n\n\t\t\tconst duration = Date.now() - state.startTime\n\t\t\tconst deltaX = endX - state.startX\n\t\t\tconst deltaY = endY - state.startY\n\t\t\tconst distance = Math.sqrt(deltaX ** 2 + deltaY ** 2)\n\n\t\t\t// Swipe detection\n\t\t\tif (\n\t\t\t\tstate.options.enableSwipe\n\t\t\t\t&& distance >= (state.options.swipeThreshold || 30)\n\t\t\t\t&& duration <= (state.options.swipeTimeout || 500)\n\t\t\t) {\n\t\t\t\tconst direction: SwipeDirection = Math.abs(deltaX) > Math.abs(deltaY) ? (deltaX > 0 ? 'right' : 'left') : (deltaY > 0 ? 'down' : 'up')\n\n\t\t\t\tstate.options.onSwipe?.(direction, event)\n\t\t\t\tif (direction === 'left') state.options.onSwipeLeft?.(event)\n\t\t\t\telse if (direction === 'right') state.options.onSwipeRight?.(event)\n\t\t\t\telse if (direction === 'up') state.options.onSwipeUp?.(event)\n\t\t\t\telse state.options.onSwipeDown?.(event)\n\t\t\t} else if (\n\t\t\t\tstate.options.enableTap\n\t\t\t\t&& distance < (state.options.tapThreshold || 10)\n\t\t\t\t&& duration < (state.options.tapTimeout || 250)\n\t\t\t) {\n\t\t\t\tstate.options.onTap?.(event)\n\t\t\t}\n\t\t}\n\n\t\t// Touch handlers\n\t\tconst handleTouchStart = (e: TouchEvent): void => {\n\t\t\t// Prevent page zoom on multi-touch\n\t\t\tif (e.touches.length > 1) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isLongPress = false\n\n\t\t\tif (e.touches.length === 1) {\n\t\t\t\tstate.startX = e.touches[0].clientX\n\t\t\t\tstate.startY = e.touches[0].clientY\n\t\t\t\tstartLongPressTimer(e)\n\t\t\t} else if (e.touches.length === 2) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t\tconst [t1, t2] = e.touches\n\t\t\t\tstate.startDistance = getDistance(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tstate.startAngle = getAngle(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tstate.lastScale = 1\n\t\t\t\tstate.lastAngle = 0\n\t\t\t}\n\n\t\t\tstate.options.onTouchStart?.(e)\n\t\t}\n\n\t\tconst handleTouchMove = (e: TouchEvent): void => {\n\t\t\t// Prevent page scroll and zoom during gesture\n\t\t\tif (e.touches.length >= 1) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\n\t\t\tif (state.longPressTimer && e.touches.length === 1 && exceedsThreshold(e.touches[0].clientX, e.touches[0].clientY)) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t}\n\n\t\t\tif (e.touches.length === 2) {\n\t\t\t\tconst [t1, t2] = e.touches\n\t\t\t\tconst currentDistance = getDistance(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tconst currentAngle = getAngle(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\n\t\t\t\tif (state.options.enablePinch && state.options.onPinch) {\n\t\t\t\t\tconst scale = currentDistance / state.startDistance\n\t\t\t\t\tif (Math.abs(scale - state.lastScale) >= (state.options.pinchThreshold || 0.1)) {\n\t\t\t\t\t\tstate.options.onPinch(scale, e)\n\t\t\t\t\t\tstate.lastScale = scale\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (state.options.enableRotate && state.options.onRotate) {\n\t\t\t\t\tconst angleDiff = currentAngle - state.startAngle\n\t\t\t\t\tif (Math.abs(angleDiff - state.lastAngle) > 5) {\n\t\t\t\t\t\tstate.options.onRotate(angleDiff, e)\n\t\t\t\t\t\tstate.lastAngle = angleDiff\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstate.options.onTouchMove?.(e)\n\t\t}\n\n\t\tconst handleTouchEnd = (e: TouchEvent): void => {\n\t\t\tclearLongPressTimer()\n\n\t\t\tif (e.touches.length === 0) {\n\t\t\t\tstate.lastTouchEndTime = Date.now()\n\t\t\t\tconst touch = e.changedTouches[0]\n\t\t\t\thandleGestureEnd(touch.clientX, touch.clientY, e)\n\t\t\t}\n\n\t\t\tstate.options.onTouchEnd?.(e)\n\t\t}\n\n\t\t// Mouse handlers for desktop\n\t\tconst handleMouseDown = (e: MouseEvent): void => {\n\t\t\tif (!state.options.enableMouse) return\n\t\t\t// Ignore simulated mouse events after touch\n\t\t\tif (Date.now() - state.lastTouchEndTime < MOUSE_IGNORE_DURATION) return\n\n\t\t\te.preventDefault()\n\t\t\tstate.isMouseDown = true\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.startX = e.clientX\n\t\t\tstate.startY = e.clientY\n\t\t\tstate.isLongPress = false\n\t\t\tstartLongPressTimer(e)\n\n\t\t\tstate.options.onTouchStart?.(e)\n\t\t}\n\n\t\tconst handleMouseMove = (e: MouseEvent): void => {\n\t\t\tif (!state.isMouseDown || !state.options.enableMouse) return\n\t\t\tif (state.longPressTimer && exceedsThreshold(e.clientX, e.clientY)) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t}\n\t\t\tstate.options.onTouchMove?.(e)\n\t\t}\n\n\t\tconst handleMouseUp = (e: MouseEvent): void => {\n\t\t\tif (!state.isMouseDown || !state.options.enableMouse) return\n\n\t\t\tstate.isMouseDown = false\n\t\t\tclearLongPressTimer()\n\n\t\t\tif (!state.isLongPress) {\n\t\t\t\thandleGestureEnd(e.clientX, e.clientY, e)\n\t\t\t}\n\n\t\t\tstate.options.onTouchEnd?.(e)\n\t\t}\n\n\t\tstate.handlers = { touchStart: handleTouchStart, touchMove: handleTouchMove, touchEnd: handleTouchEnd, mouseDown: handleMouseDown, mouseMove: handleMouseMove, mouseUp: handleMouseUp }\n\n\t\tel.addEventListener('touchstart', handleTouchStart, { passive: false })\n\t\tel.addEventListener('touchmove', handleTouchMove, { passive: false })\n\t\tel.addEventListener('touchend', handleTouchEnd)\n\t\tel.addEventListener('touchcancel', handleTouchEnd)\n\n\t\tif (options.enableMouse) {\n\t\t\tel.addEventListener('mousedown', handleMouseDown)\n\t\t\tdocument.addEventListener('mousemove', handleMouseMove)\n\t\t\tdocument.addEventListener('mouseup', handleMouseUp)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__touch as TouchState | undefined\n\t\tif (state) state.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state = (el as any).__touch as TouchState | undefined\n\n\t\tif (state?.longPressTimer) clearTimeout(state.longPressTimer)\n\n\t\tif (state?.handlers) {\n\t\t\tel.removeEventListener('touchstart', state.handlers.touchStart)\n\t\t\tel.removeEventListener('touchmove', state.handlers.touchMove)\n\t\t\tel.removeEventListener('touchend', state.handlers.touchEnd)\n\t\t\tel.removeEventListener('touchcancel', state.handlers.touchEnd)\n\t\t\tif (state.handlers.mouseDown) el.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\t\tif (state.handlers.mouseMove) document.removeEventListener('mousemove', state.handlers.mouseMove)\n\t\t\tif (state.handlers.mouseUp) document.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\t}\n\n\t\tdelete (el as any).__touch\n\t},\n})\n\nfunction normalizeOptions(binding: TouchOptions | undefined): TouchOptions {\n\treturn {\n\t\tswipeThreshold: binding?.swipeThreshold ?? 30,\n\t\tswipeTimeout: binding?.swipeTimeout ?? 500,\n\t\tpinchThreshold: binding?.pinchThreshold ?? 0.1,\n\t\tenableSwipe: binding?.enableSwipe ?? true,\n\t\tenablePinch: binding?.enablePinch ?? true,\n\t\tenableRotate: binding?.enableRotate ?? true,\n\t\tenableTap: binding?.enableTap ?? true,\n\t\ttapTimeout: binding?.tapTimeout ?? 250,\n\t\ttapThreshold: binding?.tapThreshold ?? 10,\n\t\tenableLongPress: binding?.enableLongPress ?? true,\n\t\tlongPressTimeout: binding?.longPressTimeout ?? 500,\n\t\tenableMouse: binding?.enableMouse ?? true,\n\t\tonSwipe: binding?.onSwipe,\n\t\tonSwipeLeft: binding?.onSwipeLeft,\n\t\tonSwipeRight: binding?.onSwipeRight,\n\t\tonSwipeUp: binding?.onSwipeUp,\n\t\tonSwipeDown: binding?.onSwipeDown,\n\t\tonPinch: binding?.onPinch,\n\t\tonRotate: binding?.onRotate,\n\t\tonTap: binding?.onTap,\n\t\tonLongPress: binding?.onLongPress,\n\t\tonTouchStart: binding?.onTouchStart,\n\t\tonTouchMove: binding?.onTouchMove,\n\t\tonTouchEnd: binding?.onTouchEnd,\n\t}\n}\n\nexport default vTouch\n", "import { defineDirective } from '@directix/core'\nimport { escapeRegex, isInputElement } from '@directix/shared'\n\n/**\n * Trim position\n */\nexport type TrimPosition = 'start' | 'end' | 'both'\n\n/**\n * Trim directive options\n */\nexport interface TrimOptions {\n\t/**\n\t * Trim position\n\t * @default 'both'\n\t */\n\tposition?: TrimPosition\n\n\t/**\n\t * Whether to trim on input (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n\n\t/**\n\t * Whether to trim on blur\n\t * @default true\n\t */\n\tonBlur?: boolean\n\n\t/**\n\t * Custom characters to trim (in addition to whitespace)\n\t */\n\tchars?: string\n}\n\n/**\n * Directive binding value type\n */\nexport type TrimBinding = boolean | TrimPosition | TrimOptions\n\n/**\n * Element state storage\n */\ninterface TrimState {\n\toptions: TrimOptions\n\tinputHandler?: () => void\n\tblurHandler?: () => void\n}\n\n/**\n * Trim text based on options\n */\nfunction trimText(text: string, options: TrimOptions): string {\n\tconst { position = 'both', chars } = options\n\n\t// Build regex pattern for custom chars\n\tconst charPattern = chars ? `[\\\\s${escapeRegex(chars)}]` : '\\\\s'\n\n\tswitch (position) {\n\t\tcase 'start':\n\t\t\treturn text.replace(new RegExp(`^${charPattern}+`, 'g'), '')\n\n\t\tcase 'end':\n\t\t\treturn text.replace(new RegExp(`${charPattern}+$`, 'g'), '')\n\n\t\tcase 'both':\n\t\tdefault:\n\t\t\treturn text.replace(new RegExp(`^${charPattern}+|${charPattern}+$`, 'g'), '')\n\t}\n}\n\n/**\n * v-trim directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: trim both sides -->\n * <input v-trim v-model=\"text\" />\n *\n * <!-- Trim only start -->\n * <input v-trim=\"'start'\" v-model=\"text\" />\n *\n * <!-- Trim only end -->\n * <input v-trim=\"'end'\" v-model=\"text\" />\n *\n * <!-- With options -->\n * <input v-trim=\"{ position: 'both', onBlur: true }\" v-model=\"text\" />\n *\n * <!-- For display only -->\n * <span v-trim> Text with spaces </span>\n * </template>\n * ```\n */\nexport const vTrim = defineDirective<TrimBinding, HTMLElement>({\n\tname: 'trim',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tsetupInputElement(el as HTMLInputElement | HTMLTextAreaElement, options)\n\t\t} else {\n\t\t\t// For non-input elements, trim text content\n\t\t\tconst text = el.textContent || ''\n\n\t\t\tel.textContent = trimText(text, options)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state: TrimState | undefined = (el as any).__trim\n\n\t\tif (isInputElement(el)) {\n\t\t\t// For input elements, trimming happens on blur/input events\n\t\t\tif (state) {\n\t\t\t\tstate.options = options\n\t\t\t}\n\t\t} else {\n\t\t\t// For non-input elements, trim text content\n\t\t\tconst text = el.textContent || ''\n\n\t\t\tel.textContent = trimText(text, options)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: TrimState | undefined = (el as any).__trim\n\n\t\tif (state?.inputHandler) {\n\t\t\tel.removeEventListener('input', state.inputHandler)\n\t\t}\n\t\tif (state?.blurHandler) {\n\t\t\tel.removeEventListener('blur', state.blurHandler)\n\t\t}\n\n\t\tdelete (el as any).__trim\n\t},\n})\n\n/**\n * Setup input element\n */\nfunction setupInputElement(el: HTMLInputElement | HTMLTextAreaElement, options: TrimOptions): void {\n\tconst state: TrimState = { options }\n\n\t;(el as any).__trim = state\n\n\tconst performTrim = (): void => {\n\t\tconst originalValue = el.value\n\t\tconst trimmed = trimText(originalValue, options)\n\n\t\tif (originalValue !== trimmed) {\n\t\t\tel.value = trimmed\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t}\n\t}\n\n\t// Create handlers based on options\n\tif (options.onInput) {\n\t\tconst inputHandler = (): void => {\n\t\t\t// For real-time trimming, we need to be careful about cursor position\n\t\t\t// We'll only trim on blur for better UX, or trim end on input\n\t\t\tconst originalValue = el.value\n\t\t\tconst cursorPos = el.selectionStart\n\n\t\t\t// Trim end while typing\n\t\t\tconst trimmed = originalValue.replace(/\\s+$/g, '')\n\n\t\t\tif (originalValue !== trimmed) {\n\t\t\t\tel.value = trimmed\n\t\t\t\t// Adjust cursor position\n\t\t\t\tif (cursorPos !== null) {\n\t\t\t\t\tconst newCursorPos = Math.min(cursorPos, trimmed.length)\n\n\t\t\t\t\tel.setSelectionRange(newCursorPos, newCursorPos)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tel.addEventListener('input', inputHandler)\n\t\tstate.inputHandler = inputHandler\n\t}\n\n\tif (options.onBlur) {\n\t\tconst blurHandler = (): void => performTrim()\n\n\t\tel.addEventListener('blur', blurHandler)\n\t\tstate.blurHandler = blurHandler\n\t}\n\n\t// Initial trim\n\tif (el.value) {\n\t\tperformTrim()\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: TrimBinding | undefined): TrimOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { position: 'both', onInput: true, onBlur: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { position: 'both', onInput: false, onBlur: false }\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { position: binding, onInput: true, onBlur: true }\n\t}\n\n\treturn {\n\t\tposition: binding.position ?? 'both',\n\t\tonInput: binding.onInput ?? true,\n\t\tonBlur: binding.onBlur ?? true,\n\t\tchars: binding.chars,\n\t}\n}\n\nexport default vTrim\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Truncate position\n */\nexport type TruncatePosition = 'start' | 'middle' | 'end'\n\n/**\n * Truncate directive options\n */\nexport interface TruncateOptions {\n\t/**\n\t * Maximum length of text\n\t * @default 100\n\t */\n\tlength?: number\n\n\t/**\n\t * Truncation position\n\t * @default 'end'\n\t */\n\tposition?: TruncatePosition\n\n\t/**\n\t * Ellipsis string\n\t * @default '...'\n\t */\n\tellipsis?: string\n\n\t/**\n\t * Whether to use CSS truncation (use text-overflow: ellipsis)\n\t * When true, length and position options are ignored\n\t * @default false\n\t */\n\tuseCss?: boolean\n\n\t/**\n\t * Show full text on hover (as title attribute)\n\t * @default true\n\t */\n\tshowTitle?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type TruncateBinding = number | TruncateOptions\n\n/**\n * Element state storage\n */\ninterface TruncateState {\n\toriginalText: string\n\toptions: TruncateOptions\n}\n\n/**\n * Truncate text based on options\n */\nfunction truncateText(text: string, options: TruncateOptions): string {\n\tconst { length = 100, position = 'end', ellipsis = '...' } = options\n\n\tif (text.length <= length) {\n\t\treturn text\n\t}\n\n\tswitch (position) {\n\t\tcase 'start':\n\t\t\treturn ellipsis + text.slice(-(length - ellipsis.length))\n\n\t\tcase 'middle': {\n\t\t\tconst startLen = Math.ceil((length - ellipsis.length) / 2)\n\t\t\tconst endLen = Math.floor((length - ellipsis.length) / 2)\n\n\t\t\treturn text.slice(0, startLen) + ellipsis + text.slice(-endLen)\n\t\t}\n\n\t\tcase 'end':\n\t\tdefault:\n\t\t\treturn text.slice(0, length - ellipsis.length) + ellipsis\n\t}\n}\n\n/**\n * v-truncate directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: truncate to 50 characters -->\n * <p v-truncate=\"50\">Long text here...</p>\n *\n * <!-- With options -->\n * <p v-truncate=\"{ length: 100, position: 'middle' }\">Long text here...</p>\n *\n * <!-- CSS truncation -->\n * <p v-truncate=\"{ useCss: true }\">Long text here...</p>\n * </template>\n * ```\n */\nexport const vTruncate = defineDirective<TruncateBinding, HTMLElement>({\n\tname: 'truncate',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst text = el.textContent || ''\n\n\t\t// Store original text\n\t\tconst state: TruncateState = {\n\t\t\toriginalText: text,\n\t\t\toptions,\n\t\t}\n\n\t\t;(el as any).__truncate = state\n\n\t\tapplyTruncation(el, text, options)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: TruncateState | undefined = (el as any).__truncate\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (state) {\n\t\t\t// Always use original text for re-truncation\n\t\t\tconst originalText = state.originalText\n\n\t\t\t// Check if options changed\n\t\t\tif (JSON.stringify(newOptions) !== JSON.stringify(state.options)) {\n\t\t\t\tstate.options = newOptions\n\t\t\t\tapplyTruncation(el, originalText, newOptions)\n\t\t\t}\n\t\t} else {\n\t\t\tconst text = el.textContent || ''\n\n\t\t\t;(el as any).__truncate = {\n\t\t\t\toriginalText: text,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t\tapplyTruncation(el, text, newOptions)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tdelete (el as any).__truncate\n\t},\n})\n\n/**\n * Apply truncation to element\n */\nfunction applyTruncation(el: HTMLElement, text: string, options: TruncateOptions): void {\n\tconst { useCss, showTitle = true } = options\n\n\tif (useCss) {\n\t\t// Use CSS truncation\n\t\tel.style.overflow = 'hidden'\n\t\tel.style.textOverflow = 'ellipsis'\n\t\tel.style.whiteSpace = 'nowrap'\n\n\t\tif (showTitle && text) {\n\t\t\tel.setAttribute('title', text)\n\t\t}\n\t} else {\n\t\t// Use JavaScript truncation\n\t\tconst truncated = truncateText(text, options)\n\n\t\tel.textContent = truncated\n\n\t\tif (showTitle && text && text !== truncated) {\n\t\t\tel.setAttribute('title', text)\n\t\t}\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: TruncateBinding | undefined): TruncateOptions {\n\tif (typeof binding === 'number') {\n\t\treturn {\n\t\t\tlength: binding,\n\t\t\tposition: 'end',\n\t\t\tellipsis: '...',\n\t\t\tuseCss: false,\n\t\t\tshowTitle: true,\n\t\t}\n\t}\n\n\treturn {\n\t\tlength: binding?.length ?? 100,\n\t\tposition: binding?.position ?? 'end',\n\t\tellipsis: binding?.ellipsis ?? '...',\n\t\tuseCss: binding?.useCss ?? false,\n\t\tshowTitle: binding?.showTitle ?? true,\n\t}\n}\n\nexport default vTruncate\n", "import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Typewriter directive options\n */\nexport interface TypewriterOptions {\n\t/**\n\t * Text to type\n\t */\n\ttext: string\n\n\t/**\n\t * Typing speed in milliseconds\n\t * @default 50\n\t */\n\tspeed?: number\n\n\t/**\n\t * Delay before starting in milliseconds\n\t * @default 0\n\t */\n\tdelay?: number\n\n\t/**\n\t * Whether to loop the animation\n\t * @default false\n\t */\n\tloop?: boolean\n\n\t/**\n\t * Delay before deleting (when looping)\n\t * @default 1500\n\t */\n\tdeleteDelay?: number\n\n\t/**\n\t * Deleting speed in milliseconds\n\t * @default 30\n\t */\n\tdeleteSpeed?: number\n\n\t/**\n\t * Cursor character\n\t * @default '|'\n\t */\n\tcursor?: string | false\n\n\t/**\n\t * Cursor blink animation\n\t * @default true\n\t */\n\tcursorBlink?: boolean\n\n\t/**\n\t * Callback when typing starts\n\t */\n\tonStart?: () => void\n\n\t/**\n\t * Callback for each character typed\n\t */\n\tonType?: (char: string, index: number) => void\n\n\t/**\n\t * Callback when typing completes\n\t */\n\tonComplete?: () => void\n\n\t/**\n\t * Callback when deleting starts (for loop)\n\t */\n\tonDeleteStart?: () => void\n\n\t/**\n\t * Callback when deleting completes (for loop)\n\t */\n\tonDeleteComplete?: () => void\n}\n\n/**\n * Directive binding value type\n */\nexport type TypewriterBinding = string | TypewriterOptions\n\n/**\n * Element state storage\n */\ninterface TypewriterState {\n\toptions: TypewriterOptions\n\toriginalContent: string\n\tcurrentText: string\n\ttimeoutId: ReturnType<typeof setTimeout> | null\n\tanimationFrameId: number | null\n\tisTyping: boolean\n\tisDeleting: boolean\n\tcursorElement: HTMLSpanElement | null\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: TypewriterBinding): TypewriterOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { text: binding }\n\t}\n\n\treturn {\n\t\tspeed: 50,\n\t\tdelay: 0,\n\t\tloop: false,\n\t\tdeleteDelay: 1500,\n\t\tdeleteSpeed: 30,\n\t\tcursor: '|',\n\t\tcursorBlink: true,\n\t\t...binding,\n\t\ttext: typeof binding === 'string' ? binding : binding.text || '',\n\t}\n}\n\n/**\n * Create cursor element\n */\nfunction createCursor(options: TypewriterOptions): HTMLSpanElement | null {\n\tif (options.cursor === false) return null\n\n\tconst cursor = document.createElement('span')\n\tcursor.className = 'v-typewriter__cursor'\n\tcursor.textContent = options.cursor || '|'\n\n\tif (options.cursorBlink !== false) {\n\t\tcursor.style.animation = 'v-typewriter-blink 0.7s infinite'\n\t}\n\n\treturn cursor\n}\n\n/**\n * Ensure global styles\n */\nfunction ensureStyles(): void {\n\tif (!isBrowser()) return\n\n\tconst styleId = 'v-typewriter-styles'\n\tif (document.getElementById(styleId)) return\n\n\tconst style = document.createElement('style')\n\tstyle.id = styleId\n\tstyle.textContent = `\n @keyframes v-typewriter-blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0; }\n }\n .v-typewriter__cursor {\n display: inline-block;\n margin-left: 1px;\n }\n `\n\n\tdocument.head.appendChild(style)\n}\n\n/**\n * v-typewriter directive\n * Typewriter animation effect\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage -->\n * <span v-typewriter=\"'Hello, World!'\"></span>\n *\n * <!-- With options -->\n * <span v-typewriter=\"{\n * text: 'Typing animation',\n * speed: 100,\n * cursor: '_',\n * onComplete: () => console.log('Done!')\n * }\"></span>\n *\n * <!-- Loop mode -->\n * <span v-typewriter=\"{\n * text: 'Loop animation',\n * loop: true,\n * deleteDelay: 1000\n * }\"></span>\n * </template>\n * ```\n */\nexport const vTypewriter = defineDirective<TypewriterBinding, HTMLElement>({\n\tname: 'typewriter',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!options.text) return\n\n\t\tif (isBrowser()) {\n\t\t\tensureStyles()\n\t\t}\n\n\t\tconst state: TypewriterState = {\n\t\t\toptions,\n\t\t\toriginalContent: el.textContent || '',\n\t\t\tcurrentText: '',\n\t\t\ttimeoutId: null,\n\t\t\tanimationFrameId: null,\n\t\t\tisTyping: false,\n\t\t\tisDeleting: false,\n\t\t\tcursorElement: null,\n\t\t}\n\n\t\t;(el as any).__typewriter = state\n\n\t\t// Clear initial content\n\t\tel.textContent = ''\n\n\t\t// Add cursor\n\t\tstate.cursorElement = createCursor(options)\n\t\tif (state.cursorElement) {\n\t\t\tel.appendChild(state.cursorElement)\n\t\t}\n\n\t\tel.classList.add('v-typewriter')\n\n\t\t// Start typing after delay\n\t\tif (isBrowser()) {\n\t\t\tstate.timeoutId = setTimeout(() => {\n\t\t\t\tstartTyping(el, state)\n\t\t\t}, options.delay || 0)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: TypewriterState = (el as any).__typewriter\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Check if text changed\n\t\tif (newOptions.text !== state.options.text) {\n\t\t\t// Cancel current animation\n\t\t\tcancelAnimation(state)\n\n\t\t\t// Reset state\n\t\t\tstate.options = newOptions\n\t\t\tstate.currentText = ''\n\t\t\tstate.isTyping = false\n\t\t\tstate.isDeleting = false\n\n\t\t\t// Clear content\n\t\t\tel.textContent = ''\n\n\t\t\t// Re-add cursor\n\t\t\tstate.cursorElement = createCursor(newOptions)\n\t\t\tif (state.cursorElement) {\n\t\t\t\tel.appendChild(state.cursorElement)\n\t\t\t}\n\n\t\t\t// Start new animation\n\t\t\tif (isBrowser()) {\n\t\t\t\tstate.timeoutId = setTimeout(() => {\n\t\t\t\t\tstartTyping(el, state)\n\t\t\t\t}, newOptions.delay || 0)\n\t\t\t}\n\t\t} else {\n\t\t\tstate.options = newOptions\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: TypewriterState = (el as any).__typewriter\n\n\t\tif (!state) return\n\n\t\tcancelAnimation(state)\n\t\tel.classList.remove('v-typewriter')\n\n\t\tdelete (el as any).__typewriter\n\t},\n})\n\n/**\n * Start typing animation\n */\nfunction startTyping(el: HTMLElement, state: TypewriterState): void {\n\tconst { options, cursorElement } = state\n\n\tstate.isTyping = true\n\toptions.onStart?.()\n\n\tconst text = options.text\n\n\tfunction typeNextChar(index: number): void {\n\t\tif (index >= text.length) {\n\t\t\tstate.isTyping = false\n\t\t\toptions.onComplete?.()\n\n\t\t\t// Start deleting if looping\n\t\t\tif (options.loop) {\n\t\t\t\tstate.timeoutId = setTimeout(() => {\n\t\t\t\t\tstartDeleting(el, state)\n\t\t\t\t}, options.deleteDelay)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst char = text[index]\n\t\tstate.currentText += char\n\n\t\t// Update element\n\t\tel.textContent = state.currentText\n\t\tif (cursorElement) {\n\t\t\tel.appendChild(cursorElement)\n\t\t}\n\n\t\toptions.onType?.(char, index)\n\n\t\t// Schedule next character\n\t\tstate.timeoutId = setTimeout(() => {\n\t\t\ttypeNextChar(index + 1)\n\t\t}, options.speed || 50)\n\t}\n\n\ttypeNextChar(0)\n}\n\n/**\n * Start deleting animation\n */\nfunction startDeleting(el: HTMLElement, state: TypewriterState): void {\n\tconst { options, cursorElement } = state\n\n\tstate.isDeleting = true\n\toptions.onDeleteStart?.()\n\n\tfunction deleteNextChar(): void {\n\t\tif (state.currentText.length === 0) {\n\t\t\tstate.isDeleting = false\n\t\t\toptions.onDeleteComplete?.()\n\n\t\t\t// Restart typing if looping\n\t\t\tif (options.loop) {\n\t\t\t\tstate.timeoutId = setTimeout(() => {\n\t\t\t\t\tstartTyping(el, state)\n\t\t\t\t}, options.delay || 0)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tstate.currentText = state.currentText.slice(0, -1)\n\n\t\t// Update element\n\t\tel.textContent = state.currentText\n\t\tif (cursorElement) {\n\t\t\tel.appendChild(cursorElement)\n\t\t}\n\n\t\t// Schedule next deletion\n\t\tstate.timeoutId = setTimeout(() => {\n\t\t\tdeleteNextChar()\n\t\t}, options.deleteSpeed || 30)\n\t}\n\n\tdeleteNextChar()\n}\n\n/**\n * Cancel ongoing animation\n */\nfunction cancelAnimation(state: TypewriterState): void {\n\tif (state.timeoutId) {\n\t\tclearTimeout(state.timeoutId)\n\t\tstate.timeoutId = null\n\t}\n\n\tif (state.animationFrameId) {\n\t\tcancelAnimationFrame(state.animationFrameId)\n\t\tstate.animationFrameId = null\n\t}\n\n\tstate.isTyping = false\n\tstate.isDeleting = false\n}\n\nexport default vTypewriter\n", "import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Uppercase directive options\n */\nexport interface UppercaseOptions {\n\t/**\n\t * Transform only the first character\n\t * @default false\n\t */\n\tfirst?: boolean\n\n\t/**\n\t * Transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type UppercaseBinding = boolean | UppercaseOptions\n\n/**\n * Transform text to uppercase\n */\nfunction transformText(text: string, options: UppercaseOptions): string {\n\tif (!text) return text\n\n\tif (options.first) {\n\t\treturn text.charAt(0).toUpperCase() + text.slice(1)\n\t}\n\n\treturn text.toUpperCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: UppercaseBinding | undefined): UppercaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { first: false, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { first: false, onInput: false }\n\t}\n\n\treturn {\n\t\tfirst: binding.first ?? false,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-uppercase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Transform all characters to uppercase -->\n * <input v-uppercase v-model=\"text\" />\n *\n * <!-- Transform only first character -->\n * <span v-uppercase=\"{ first: true }\">{{ text }}</span>\n * </template>\n * ```\n */\nexport const vUppercase = defineDirective<UppercaseBinding, HTMLElement>({\n\tname: 'uppercase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => transformText(text, options))\n\n\t\t\t;(el as any).__uppercaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = transformText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__uppercaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__uppercaseCleanup\n\t},\n})\n\nexport default vUppercase\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Virtual list item size function\n */\nexport type ItemSizeFunction = (index: number) => number\n\n/**\n * Virtual list render function\n */\nexport type VirtualListRenderFunction = (item: any, index: number) => string\n\n/**\n * Virtual list directive options\n */\nexport interface VirtualListOptions<T = any> {\n\t/**\n\t * Array of items to render\n\t * @required\n\t */\n\titems: T[]\n\n\t/**\n\t * Height of each item (in pixels)\n\t * Can be a fixed number or a function\n\t * @default 50\n\t */\n\titemSize?: number | ItemSizeFunction\n\n\t/**\n\t * Height of the container (in pixels)\n\t * @default 400\n\t */\n\theight?: number | string\n\n\t/**\n\t * Number of extra items to render above/below visible area\n\t * @default 3\n\t */\n\toverscan?: number\n\n\t/**\n\t * Custom render function\n\t */\n\trender?: VirtualListRenderFunction\n\n\t/**\n\t * Key field name for items\n\t * @default 'id'\n\t */\n\tkeyField?: string\n\n\t/**\n\t * Callback when scroll position changes\n\t */\n\tonScroll?: (scrollTop: number) => void\n\n\t/**\n\t * Callback when visible range changes\n\t */\n\tonVisibleChange?: (startIndex: number, endIndex: number) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type VirtualListBinding<T = any> = VirtualListOptions<T> | T[]\n\n/**\n * Element state storage\n */\ninterface VirtualListState {\n\toptions: VirtualListOptions\n\tcontainerEl: HTMLElement | null\n\tcontentEl: HTMLElement | null\n\tscrollHandler: ((event: Event) => void) | null\n\tresizeObserver: ResizeObserver | null\n\tstartIndex: number\n\tendIndex: number\n\tvisibleItems: any[]\n}\n\n/**\n * Get item height\n */\nfunction getItemSize(options: VirtualListOptions, index: number): number {\n\tif (typeof options.itemSize === 'function') {\n\t\treturn options.itemSize(index)\n\t}\n\treturn options.itemSize || 50\n}\n\n/**\n * Calculate total height\n */\nfunction calculateTotalHeight(options: VirtualListOptions): number {\n\tif (typeof options.itemSize === 'function') {\n\t\tlet total = 0\n\t\tfor (let i = 0; i < options.items.length; i++) {\n\t\t\ttotal += options.itemSize(i)\n\t\t}\n\t\treturn total\n\t}\n\treturn (options.itemSize || 50) * options.items.length\n}\n\n/**\n * Calculate visible range\n */\nfunction calculateVisibleRange(\n\tscrollTop: number,\n\tcontainerHeight: number,\n\toptions: VirtualListOptions,\n): { startIndex: number, endIndex: number, offsetY: number } {\n\tconst items = options.items\n\tconst itemSize = options.itemSize || 50\n\tconst overscan = options.overscan || 3\n\n\tlet startIndex = 0,\n\t\tendIndex = 0,\n\t\toffsetY = 0\n\n\tif (typeof itemSize === 'function') {\n\t\t// Variable size items\n\t\tlet currentOffset = 0\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst size = itemSize(i)\n\t\t\tif (currentOffset + size > scrollTop) {\n\t\t\t\tstartIndex = i\n\t\t\t\toffsetY = currentOffset\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcurrentOffset += size\n\t\t}\n\n\t\t// Find end index\n\t\tendIndex = startIndex\n\t\tcurrentOffset = offsetY\n\t\twhile (endIndex < items.length && currentOffset < scrollTop + containerHeight) {\n\t\t\tcurrentOffset += itemSize(endIndex)\n\t\t\tendIndex++\n\t\t}\n\n\t\t// Add overscan\n\t\tstartIndex = Math.max(0, startIndex - overscan)\n\t\tendIndex = Math.min(items.length, endIndex + overscan)\n\n\t\t// Recalculate offset for overscan\n\t\tcurrentOffset = 0\n\t\tfor (let i = 0; i < startIndex; i++) {\n\t\t\tcurrentOffset += itemSize(i)\n\t\t}\n\t\toffsetY = currentOffset\n\n\t\treturn { startIndex, endIndex, offsetY }\n\t}\n\n\t// Fixed size items\n\tstartIndex = Math.max(0, Math.floor(scrollTop / itemSize) - overscan)\n\tendIndex = Math.min(items.length, Math.ceil((scrollTop + containerHeight) / itemSize) + overscan)\n\toffsetY = startIndex * itemSize\n\n\treturn { startIndex, endIndex, offsetY }\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions<T>(binding: VirtualListBinding<T>): VirtualListOptions<T> {\n\tif (Array.isArray(binding)) {\n\t\treturn {\n\t\t\titems: binding,\n\t\t\titemSize: 50,\n\t\t\theight: 400,\n\t\t\toverscan: 3,\n\t\t\tkeyField: 'id',\n\t\t}\n\t}\n\n\treturn {\n\t\titems: binding.items,\n\t\titemSize: binding.itemSize ?? 50,\n\t\theight: binding.height ?? 400,\n\t\toverscan: binding.overscan ?? 3,\n\t\trender: binding.render,\n\t\tkeyField: binding.keyField ?? 'id',\n\t\tonScroll: binding.onScroll,\n\t\tonVisibleChange: binding.onVisibleChange,\n\t}\n}\n\n/**\n * Create item element\n */\nfunction createItemElement(\n\titem: any,\n\tindex: number,\n\toptions: VirtualListOptions,\n): HTMLElement {\n\tconst el = document.createElement('div')\n\tel.className = 'v-virtual-list__item'\n\tel.dataset.index = String(index)\n\n\t// Get item key\n\tconst keyField = options.keyField || 'id'\n\tif (typeof item === 'object' && item !== null && keyField in item) {\n\t\tel.dataset.key = String(item[keyField])\n\t}\n\n\t// Set height\n\tconst height = getItemSize(options, index)\n\tel.style.height = `${height}px`\n\tel.style.boxSizing = 'border-box'\n\n\t// Render content\n\tif (options.render) {\n\t\tel.innerHTML = options.render(item, index)\n\t} else {\n\t\tel.textContent = typeof item === 'object' ? JSON.stringify(item) : String(item)\n\t}\n\n\treturn el\n}\n\n/**\n * v-virtual-list directive\n *\n * Renders a large list efficiently using virtualization.\n *\n * @example\n * ```vue\n * <template>\n * <div v-virtual-list=\"{ items: largeList, itemSize: 50 }\"></div>\n *\n * <div v-virtual-list=\"{\n * items: largeList,\n * itemSize: (index) => index % 10 === 0 ? 100 : 50,\n * height: 600,\n * overscan: 5,\n * render: (item, index) => `<div class=\"item\">${item.name}</div>`\n * }\"></div>\n * </template>\n * ```\n */\nexport const vVirtualList = defineDirective<VirtualListBinding, HTMLElement>({\n\tname: 'virtual-list',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Setup container\n\t\tel.classList.add('v-virtual-list')\n\t\tel.style.height = typeof options.height === 'number' ? `${options.height}px` : options.height as string\n\t\tel.style.overflow = 'auto'\n\t\tel.style.position = 'relative'\n\n\t\t// Create content wrapper\n\t\tconst contentEl = document.createElement('div')\n\t\tcontentEl.className = 'v-virtual-list__content'\n\t\tcontentEl.style.position = 'relative'\n\t\tcontentEl.style.height = `${calculateTotalHeight(options)}px`\n\t\tel.appendChild(contentEl)\n\n\t\t// Create visible items wrapper\n\t\tconst visibleEl = document.createElement('div')\n\t\tvisibleEl.className = 'v-virtual-list__visible'\n\t\tvisibleEl.style.position = 'absolute'\n\t\tvisibleEl.style.top = '0'\n\t\tvisibleEl.style.left = '0'\n\t\tvisibleEl.style.right = '0'\n\t\tcontentEl.appendChild(visibleEl)\n\n\t\tconst state: VirtualListState = {\n\t\t\toptions,\n\t\t\tcontainerEl: el,\n\t\t\tcontentEl,\n\t\t\tscrollHandler: null,\n\t\t\tresizeObserver: null,\n\t\t\tstartIndex: 0,\n\t\t\tendIndex: 0,\n\t\t\tvisibleItems: [],\n\t\t}\n\n\t\t;(el as any).__virtualList = state\n\n\t\t// Create scroll handler\n\t\tconst scrollHandler = (_event: Event): void => {\n\t\t\tconst scrollTop = el.scrollTop\n\t\t\tconst containerHeight = el.clientHeight\n\n\t\t\t// Calculate visible range\n\t\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(\n\t\t\t\tscrollTop,\n\t\t\t\tcontainerHeight,\n\t\t\t\tstate.options,\n\t\t\t)\n\n\t\t\t// Check if range changed\n\t\t\tif (startIndex !== state.startIndex || endIndex !== state.endIndex) {\n\t\t\t\tstate.startIndex = startIndex\n\t\t\t\tstate.endIndex = endIndex\n\n\t\t\t\t// Render visible items\n\t\t\t\trenderVisibleItems(visibleEl, state, offsetY)\n\n\t\t\t\t// Callback\n\t\t\t\tif (state.options.onVisibleChange) {\n\t\t\t\t\tstate.options.onVisibleChange(startIndex, endIndex)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Scroll callback\n\t\t\tif (state.options.onScroll) {\n\t\t\t\tstate.options.onScroll(scrollTop)\n\t\t\t}\n\t\t}\n\n\t\tstate.scrollHandler = scrollHandler\n\t\tel.addEventListener('scroll', scrollHandler, { passive: true })\n\n\t\t// Initial render\n\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(0, el.clientHeight, options)\n\t\tstate.startIndex = startIndex\n\t\tstate.endIndex = endIndex\n\t\trenderVisibleItems(visibleEl, state, offsetY)\n\n\t\t// Setup resize observer\n\t\tif (typeof ResizeObserver !== 'undefined') {\n\t\t\tconst resizeObserver = new ResizeObserver(() => {\n\t\t\t\t// Recalculate on resize\n\t\t\t\tscrollHandler(new Event('scroll'))\n\t\t\t})\n\t\t\tresizeObserver.observe(el)\n\t\t\tstate.resizeObserver = resizeObserver\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: VirtualListState = (el as any).__virtualList\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tstate.options = newOptions\n\n\t\t// Update content height\n\t\tif (state.contentEl) {\n\t\t\tstate.contentEl.style.height = `${calculateTotalHeight(newOptions)}px`\n\t\t}\n\n\t\t// Force re-render\n\t\tconst scrollTop = el.scrollTop\n\t\tconst containerHeight = el.clientHeight\n\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(\n\t\t\tscrollTop,\n\t\t\tcontainerHeight,\n\t\t\tnewOptions,\n\t\t)\n\t\tstate.startIndex = startIndex\n\t\tstate.endIndex = endIndex\n\n\t\tconst visibleEl = state.contentEl?.querySelector('.v-virtual-list__visible') as HTMLElement\n\t\tif (visibleEl) {\n\t\t\trenderVisibleItems(visibleEl, state, offsetY)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: VirtualListState | undefined = (el as any).__virtualList\n\n\t\tif (!state) return\n\n\t\tif (state.scrollHandler) {\n\t\t\tel.removeEventListener('scroll', state.scrollHandler)\n\t\t}\n\n\t\tif (state.resizeObserver) {\n\t\t\tstate.resizeObserver.disconnect()\n\t\t}\n\n\t\tdelete (el as any).__virtualList\n\t},\n})\n\n/**\n * Render visible items\n */\nfunction renderVisibleItems(\n\tvisibleEl: HTMLElement,\n\tstate: VirtualListState,\n\toffsetY: number,\n): void {\n\tconst { options, startIndex, endIndex } = state\n\n\t// Set transform\n\tvisibleEl.style.transform = `translateY(${offsetY}px)`\n\n\t// Clear existing items\n\tvisibleEl.innerHTML = ''\n\n\t// Render items\n\tfor (let i = startIndex; i < endIndex; i++) {\n\t\tconst item = options.items[i]\n\t\tif (item !== undefined) {\n\t\t\tconst itemEl = createItemElement(item, i, options)\n\t\t\tvisibleEl.appendChild(itemEl)\n\t\t}\n\t}\n}\n\nexport default vVirtualList\n", "import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Visible change handler\n */\nexport type VisibleHandler = (isVisible: boolean) => void\n\n/**\n * Visible directive options\n */\nexport interface VisibleOptions {\n\t/**\n\t * Callback when visibility changes\n\t */\n\thandler?: VisibleHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to set visibility: hidden instead of display: none\n\t * @default false\n\t */\n\tuseHidden?: boolean\n\n\t/**\n\t * Initial visibility\n\t * @default true\n\t */\n\tinitial?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type VisibleBinding = boolean | VisibleOptions\n\n/**\n * Element state storage\n */\ninterface VisibleState {\n\toptions: VisibleOptions\n\tisVisible: boolean\n\toriginalDisplay: string\n\toriginalVisibility: string\n\ttransitionEndHandler: (e: TransitionEvent) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: VisibleBinding | undefined): VisibleOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { initial: binding }\n\t}\n\n\treturn {\n\t\tinitial: true,\n\t\tdisabled: false,\n\t\tuseHidden: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-visible directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-visible=\"showElement\">Show/Hide</div>\n * <div v-visible=\"{ handler: onVisibleChange }\">Track visibility</div>\n * <div v-visible=\"{ useHidden: true, initial: false }\">Uses visibility: hidden</div>\n * </template>\n * ```\n */\nexport const vVisible = defineDirective<VisibleBinding, HTMLElement>({\n\tname: 'visible',\n\tssr: true, // SSR safe - will set initial visibility on server\n\tdefaults: {\n\t\tinitial: true,\n\t\tdisabled: false,\n\t\tuseHidden: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Store original styles\n\t\tconst originalDisplay = el.style.display\n\t\tconst originalVisibility = el.style.visibility\n\n\t\tconst state: VisibleState = {\n\t\t\toptions,\n\t\t\tisVisible: options.initial ?? true,\n\t\t\toriginalDisplay,\n\t\t\toriginalVisibility,\n\t\t\ttransitionEndHandler: (e: TransitionEvent) => {\n\t\t\t\t// Handle transition end for animations\n\t\t\t\tif (e.propertyName === 'opacity' || e.propertyName === 'visibility') {\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('visible:transition-end', {\n\t\t\t\t\t\tdetail: { isVisible: state.isVisible },\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__visible = state\n\n\t\t// Add transition listener\n\t\ton(el, 'transitionend', state.transitionEndHandler as (e: Event) => void)\n\n\t\t// Apply initial visibility\n\t\tapplyVisibility(el, state, options.initial ?? true)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: VisibleState = (el as any).__visible\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Determine new visibility\n\t\tlet newVisibility: boolean\n\n\t\tif (typeof binding.value === 'boolean') {\n\t\t\tnewVisibility = binding.value\n\t\t} else {\n\t\t\tnewVisibility = newOptions.initial ?? true\n\t\t}\n\n\t\t// Update if changed\n\t\tif (state.isVisible !== newVisibility) {\n\t\t\tapplyVisibility(el, state, newVisibility)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: VisibleState = (el as any).__visible\n\n\t\tif (!state) return\n\n\t\t// Remove transition listener\n\t\toff(el, 'transitionend', state.transitionEndHandler as (e: Event) => void)\n\n\t\t// Restore original styles\n\t\tel.style.display = state.originalDisplay\n\t\tel.style.visibility = state.originalVisibility\n\n\t\tdelete (el as any).__visible\n\t},\n})\n\n/**\n * Apply visibility to element\n */\nfunction applyVisibility(el: HTMLElement, state: VisibleState, isVisible: boolean): void {\n\tconst previousVisibility = state.isVisible\n\n\tstate.isVisible = isVisible\n\n\t// Add/remove class first (for CSS transitions)\n\tif (isVisible) {\n\t\tel.classList.remove('v-hidden')\n\t\tel.classList.add('v-visible')\n\t} else {\n\t\tel.classList.remove('v-visible')\n\t\tel.classList.add('v-hidden')\n\t}\n\n\tif (state.options.useHidden) {\n\t\t// Use visibility: hidden with animation support\n\t\tif (isVisible) {\n\t\t\t// Show: set visibility first, then animate\n\t\t\tel.style.visibility = state.originalVisibility || 'visible'\n\t\t} else {\n\t\t\t// Hide: wait for transition, then set hidden\n\t\t\tconst computedStyle = getComputedStyle(el)\n\t\t\tconst hasTransition = computedStyle.transitionDuration !== '0s'\n\n\t\t\tif (hasTransition) {\n\t\t\t\t// Wait for transition to complete\n\t\t\t\tconst handleTransitionEnd = (e: TransitionEvent): void => {\n\t\t\t\t\tif (e.target === el && (e.propertyName === 'opacity' || e.propertyName === 'transform')) {\n\t\t\t\t\t\tif (!state.isVisible) {\n\t\t\t\t\t\t\tel.style.visibility = 'hidden'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tel.removeEventListener('transitionend', handleTransitionEnd)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tel.addEventListener('transitionend', handleTransitionEnd)\n\t\t\t} else {\n\t\t\t\tel.style.visibility = 'hidden'\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Use display: none (no animation support)\n\t\tel.style.display = isVisible ? state.originalDisplay : 'none'\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('visible:change', {\n\t\tdetail: { isVisible, previousVisibility },\n\t}))\n\n\t// Trigger handler\n\tif (state.options.handler && previousVisibility !== isVisible) {\n\t\tstate.options.handler(isVisible)\n\t}\n}\n\nexport default vVisible\n", "import { defineDirective } from '@directix/core'\n\n/**\n * Watermark options\n */\nexport interface WatermarkOptions {\n\t/**\n\t * Watermark text content\n\t * @required\n\t */\n\tcontent: string | string[]\n\n\t/**\n\t * Width of watermark canvas\n\t * @default 300\n\t */\n\twidth?: number\n\n\t/**\n\t * Height of watermark canvas\n\t * @default 200\n\t */\n\theight?: number\n\n\t/**\n\t * Rotation angle in degrees\n\t * @default -22\n\t */\n\trotate?: number\n\n\t/**\n\t * Font size in pixels\n\t * @default 16\n\t */\n\tfontSize?: number\n\n\t/**\n\t * Font family\n\t * @default 'sans-serif'\n\t */\n\tfontFamily?: string\n\n\t/**\n\t * Font weight\n\t * @default 'normal'\n\t */\n\tfontWeight?: string | number\n\n\t/**\n\t * Font color\n\t * @default 'rgba(128, 128, 128, 0.15)'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Gap between watermarks in pixels\n\t * @default [100, 100]\n\t */\n\tgap?: [number, number] | number\n\n\t/**\n\t * Z-index of watermark layer\n\t * @default 9999\n\t */\n\tzIndex?: number\n\n\t/**\n\t * Whether to disable watermark (for dynamic control)\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to prevent removal attempts\n\t * @default true\n\t */\n\tprotect?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type WatermarkBinding = string | WatermarkOptions\n\n/**\n * Element state storage\n */\ninterface WatermarkState {\n\toptions: WatermarkOptions\n\twatermarkEl: HTMLDivElement | null\n\tobserver: MutationObserver | null\n\tcanvas: HTMLCanvasElement | null\n}\n\n/**\n * Create watermark canvas\n */\nfunction createWatermarkCanvas(options: WatermarkOptions): HTMLCanvasElement {\n\tconst canvas = document.createElement('canvas')\n\tconst ctx = canvas.getContext('2d')\n\n\tif (!ctx) {\n\t\tthrow new Error('[Directix] v-watermark: Could not get canvas context')\n\t}\n\n\tconst width = options.width || 300\n\tconst height = options.height || 200\n\tconst fontSize = options.fontSize || 16\n\tconst fontFamily = options.fontFamily || 'sans-serif'\n\tconst fontWeight = options.fontWeight || 'normal'\n\tconst color = options.color || 'rgba(128, 128, 128, 0.15)'\n\tconst rotate = options.rotate ?? -22\n\n\tcanvas.width = width\n\tcanvas.height = height\n\n\tctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`\n\tctx.fillStyle = color\n\tctx.textAlign = 'center'\n\tctx.textBaseline = 'middle'\n\n\t// Rotate canvas\n\tctx.translate(width / 2, height / 2)\n\tctx.rotate((rotate * Math.PI) / 180)\n\n\t// Draw text\n\tconst content = Array.isArray(options.content) ? options.content : [options.content]\n\tconst lineHeight = fontSize * 1.5\n\tconst startY = -((content.length - 1) * lineHeight) / 2\n\n\tcontent.forEach((text, index) => {\n\t\tctx.fillText(text, 0, startY + index * lineHeight)\n\t})\n\n\treturn canvas\n}\n\n/**\n * Create watermark element\n */\nfunction createWatermarkElement(canvas: HTMLCanvasElement, options: WatermarkOptions): HTMLDivElement {\n\tconst gap = Array.isArray(options.gap) ? options.gap : [options.gap || 100, options.gap || 100]\n\tconst zIndex = options.zIndex ?? 9999\n\n\tconst el = document.createElement('div')\n\tel.className = 'v-watermark'\n\tel.style.cssText = `\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tpointer-events: none;\n\t\tz-index: ${zIndex};\n\t\tbackground-image: url(\"${canvas.toDataURL()}\");\n\t\tbackground-repeat: repeat;\n\t\tbackground-position: ${gap[0] / 2}px ${gap[1] / 2}px;\n\t\tbackground-size: ${canvas.width + gap[0]}px ${canvas.height + gap[1]}px;\n\t`\n\n\treturn el\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: WatermarkBinding): WatermarkOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { content: binding }\n\t}\n\n\treturn {\n\t\tcontent: binding.content,\n\t\twidth: binding.width ?? 300,\n\t\theight: binding.height ?? 200,\n\t\trotate: binding.rotate ?? -22,\n\t\tfontSize: binding.fontSize ?? 16,\n\t\tfontFamily: binding.fontFamily ?? 'sans-serif',\n\t\tfontWeight: binding.fontWeight ?? 'normal',\n\t\tcolor: binding.color ?? 'rgba(128, 128, 128, 0.15)',\n\t\tgap: binding.gap ?? [100, 100],\n\t\tzIndex: binding.zIndex ?? 9999,\n\t\tdisabled: binding.disabled ?? false,\n\t\tprotect: binding.protect ?? true,\n\t}\n}\n\n/**\n * v-watermark directive\n *\n * Adds a watermark layer to an element.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple watermark -->\n * <div v-watermark=\"'Confidential'\">Protected content</div>\n *\n * <!-- Multi-line watermark -->\n * <div v-watermark=\"{ content: ['Company Name', 'User: John'] }\">\n * Protected content\n * </div>\n *\n * <!-- Customized watermark -->\n * <div v-watermark=\"{\n * content: 'DRAFT',\n * fontSize: 24,\n * color: 'rgba(255, 0, 0, 0.2)',\n * rotate: -30,\n * gap: 50\n * }\">\n * Draft document\n * </div>\n * </template>\n * ```\n */\nexport const vWatermark = defineDirective<WatermarkBinding, HTMLElement>({\n\tname: 'watermark',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Make sure element has position\n\t\tconst computedStyle = getComputedStyle(el)\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\tconst state: WatermarkState = {\n\t\t\toptions,\n\t\t\twatermarkEl: null,\n\t\t\tobserver: null,\n\t\t\tcanvas: null,\n\t\t}\n\n\t\t;(el as any).__watermark = state\n\n\t\tif (!options.disabled) {\n\t\t\tapplyWatermark(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: WatermarkState = (el as any).__watermark\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Check if disabled state changed\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disable: remove watermark\n\t\t\tremoveWatermark(state)\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Enable: add watermark\n\t\t\tstate.options = newOptions\n\t\t\tapplyWatermark(el, state)\n\t\t} else if (!newOptions.disabled) {\n\t\t\t// Update watermark\n\t\t\tstate.options = newOptions\n\t\t\tremoveWatermark(state)\n\t\t\tapplyWatermark(el, state)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: WatermarkState | undefined = (el as any).__watermark\n\n\t\tif (!state) return\n\n\t\tremoveWatermark(state)\n\n\t\tdelete (el as any).__watermark\n\t},\n})\n\n/**\n * Apply watermark to element\n */\nfunction applyWatermark(el: HTMLElement, state: WatermarkState): void {\n\tconst options = state.options\n\n\t// Create canvas\n\tstate.canvas = createWatermarkCanvas(options)\n\n\t// Create watermark element\n\tstate.watermarkEl = createWatermarkElement(state.canvas, options)\n\n\t// Append to element\n\tel.appendChild(state.watermarkEl)\n\n\t// Set up protection observer if enabled\n\tif (options.protect) {\n\t\tsetupProtection(el, state)\n\t}\n}\n\n/**\n * Remove watermark\n */\nfunction removeWatermark(state: WatermarkState): void {\n\t// Disconnect observer\n\tif (state.observer) {\n\t\tstate.observer.disconnect()\n\t\tstate.observer = null\n\t}\n\n\t// Remove watermark element\n\tif (state.watermarkEl && state.watermarkEl.parentNode) {\n\t\tstate.watermarkEl.parentNode.removeChild(state.watermarkEl)\n\t}\n\n\tstate.watermarkEl = null\n\tstate.canvas = null\n}\n\n/**\n * Set up protection against removal\n */\nfunction setupProtection(el: HTMLElement, state: WatermarkState): void {\n\tif (typeof MutationObserver === 'undefined') return\n\n\tstate.observer = new MutationObserver(mutations => {\n\t\t// Check if watermark was removed\n\t\tif (!state.watermarkEl || !el.contains(state.watermarkEl)) {\n\t\t\t// Re-add watermark\n\t\t\tif (!state.options.disabled) {\n\t\t\t\tstate.canvas = createWatermarkCanvas(state.options)\n\t\t\t\tstate.watermarkEl = createWatermarkElement(state.canvas, state.options)\n\t\t\t\tel.appendChild(state.watermarkEl)\n\t\t\t}\n\t\t}\n\n\t\t// Check if watermark styles were modified\n\t\tfor (const mutation of mutations) {\n\t\t\tif (mutation.type === 'attributes' && mutation.target === state.watermarkEl) {\n\t\t\t\t// Restore styles\n\t\t\t\tconst gap = Array.isArray(state.options.gap) ? state.options.gap : [state.options.gap || 100, state.options.gap || 100]\n\n\t\t\t\tstate.watermarkEl.style.display = 'block'\n\t\t\t\tstate.watermarkEl.style.visibility = 'visible'\n\t\t\t\tstate.watermarkEl.style.opacity = '1'\n\t\t\t\tif (state.canvas) {\n\t\t\t\t\tstate.watermarkEl.style.backgroundImage = `url(\"${state.canvas.toDataURL()}\")`\n\t\t\t\t}\n\t\t\t\tstate.watermarkEl.style.backgroundSize = `${state.canvas!.width + gap[0]}px ${state.canvas!.height + gap[1]}px`\n\t\t\t}\n\t\t}\n\t})\n\n\tstate.observer.observe(el, {\n\t\tchildList: true,\n\t\tsubtree: true,\n\t\tattributes: true,\n\t\tattributeFilter: ['style', 'class', 'hidden'],\n\t})\n}\n\nexport default vWatermark\n"],
5
+ "mappings": "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",
6
+ "names": ["normalizeBinding", "normalizeOptions", "normalizeOptions", "normalizeOptions", "cleanup", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "animate", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "escapeRegex", "normalizeBinding", "STATE_KEY", "normalizeOptions", "clamp", "animate", "normalizeOptions", "normalizeOptions", "scrollTop", "scrollHeight", "clientHeight", "STATE_KEY", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "getDistance", "normalizeOptions", "normalizeOptions", "cleanup", "STATE_KEY", "normalizeOptions", "formatNumber", "cleanup", "normalizeOptions", "cleanup", "formatNumber", "normalizeOptions", "normalizeOptions", "getScrollParent", "STATE_KEY", "normalizeOptions", "getState", "normalizeOptions", "getDistance", "handleStart", "handleMove", "handleEnd", "normalizeOptions", "normalizeOptions", "normalizeOptions", "setState", "bindEvents", "normalizeOptions", "cleanup", "normalizeOptions", "normalizeOptions", "getCenter", "handleStart", "handleMove", "handleEnd", "normalizeOptions", "isAllowed", "content", "normalizeOptions", "defaultOptions", "normalizeOptions", "ensureStyles", "STATE_KEY", "normalizeOptions", "normalizeOptions", "setupState", "bindEvents", "unbindEvents", "normalizeOptions", "normalizeOptions", "getDistance", "getAngle", "normalizeOptions", "normalizeOptions", "normalizeOptions", "normalizeOptions", "ensureStyles", "transformText", "normalizeOptions", "cleanup", "normalizeOptions", "startIndex", "endIndex", "offsetY", "normalizeOptions", "normalizeOptions"]
7
7
  }