directix 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../packages/core/src/adapter/vue2.ts","../packages/core/src/adapter/vue3.ts","../packages/core/src/env.ts","../packages/core/src/define.ts","../src/utils/text-transform.ts","../src/directives/capitalcase.ts","../src/directives/click-delay.ts","../packages/shared/src/dom.ts","../packages/shared/src/event.ts","../packages/shared/src/utils.ts","../src/directives/click-outside.ts","../src/directives/copy.ts","../src/directives/countdown.ts","../src/utils/event.ts","../src/directives/debounce.ts","../src/directives/draggable.ts","../src/directives/ellipsis.ts","../src/directives/focus.ts","../src/directives/hotkey.ts","../src/directives/hover.ts","../src/directives/image-preview.ts","../src/directives/infinite-scroll.ts","../src/directives/intersect.ts","../src/directives/lazy.ts","../src/directives/loading.ts","../src/directives/long-press.ts","../src/directives/lowercase.ts","../src/directives/mask.ts","../src/utils/number.ts","../src/directives/money.ts","../src/directives/mutation.ts","../src/directives/number.ts","../src/directives/permission.ts","../src/directives/print.ts","../src/directives/pull-refresh.ts","../src/directives/resize.ts","../src/directives/ripple.ts","../src/directives/sanitize.ts","../src/directives/scroll.ts","../src/directives/sticky.ts","../src/directives/swipe.ts","../src/directives/throttle.ts","../src/directives/tooltip.ts","../src/directives/touch.ts","../src/directives/trim.ts","../src/directives/truncate.ts","../src/directives/uppercase.ts","../src/directives/virtual-list.ts","../src/directives/visible.ts","../src/directives/watermark.ts","../src/index.ts"],"sourcesContent":["import type { VNode } from 'vue'\nimport type { DirectiveBinding, DirectiveHooks } from '../types'\n\n/**\n * Element state storage\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Vue 2 directive adapter\n * @returns Vue 2 directive object with bind/inserted/update/unbind hooks\n */\nexport function createVue2Directive<T, B extends Element>(\n\thooks: DirectiveHooks<T, B>,\n): Record<string, any> {\n\tconst directive = {\n\t\tbind(el: B, binding: any, vnode: VNode) {\n\t\t\t// Store state\n\t\t\tconst state: ElementState = {\n\t\t\t\tvalue: binding.value,\n\t\t\t\tvnode,\n\t\t\t\tcleanup: [],\n\t\t\t}\n\n ;(el as any).__directix_state__ = state\n\t\t},\n\n\t\tinserted(el: B, binding: any, vnode: VNode) {\n\t\t\t// Vue 2's inserted is called after element is inserted into DOM\n\t\t\t// Call mounted here to ensure element is in DOM\n\t\t\tif (hooks.mounted) {\n\t\t\t\thooks.mounted(el, normalizeBinding(binding), vnode)\n\t\t\t}\n\t\t},\n\n\t\tupdate(el: B, binding: any, vnode: VNode, oldVnode: VNode) {\n\t\t\tconst state = (el as any).__directix_state__\n\n\t\t\tif (hooks.updated) {\n\t\t\t\thooks.updated(\n\t\t\t\t\tel,\n\t\t\t\t\tnormalizeBinding(binding),\n\t\t\t\t\tvnode,\n\t\t\t\t\tnormalizeBinding({ ...binding, value: binding.oldValue }),\n\t\t\t\t\toldVnode,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Update state\n\t\t\tif (state) {\n\t\t\t\tstate.value = binding.value\n\t\t\t\tstate.vnode = vnode\n\t\t\t}\n\t\t},\n\n\t\tcomponentUpdated(_el: B, _binding: any, _vnode: VNode, _oldVnode: VNode) {\n\t\t\t// Vue 2 specific, called after component update completes\n\t\t\t// Usually update is sufficient\n\t\t},\n\n\t\tunbind(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.unmounted) {\n\t\t\t\thooks.unmounted(el, normalizeBinding(binding), vnode)\n\t\t\t}\n\n\t\t\t// Execute cleanup functions\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (state?.cleanup) {\n\t\t\t\tstate.cleanup.forEach(fn => fn())\n\t\t\t}\n\t\t\tdelete (el as any).__directix_state__\n\t\t},\n\t}\n\n\treturn directive\n}\n\n/**\n * Normalize Vue 2 binding to unified format\n */\nfunction normalizeBinding<T>(binding: any): DirectiveBinding<T> {\n\treturn {\n\t\tvalue: binding.value,\n\t\toldValue: binding.oldValue ?? null,\n\t\targ: binding.arg,\n\t\tmodifiers: binding.modifiers || {},\n\t\tinstance: binding.instance || null,\n\t}\n}\n\n/**\n * Add cleanup function to element\n */\nexport function addCleanup(el: Element, fn: () => void): void {\n\tconst state = (el as any).__directix_state__\n\n\tif (state) {\n\t\tstate.cleanup.push(fn)\n\t}\n}\n","import type { VNode } from 'vue'\nimport type { DirectiveBinding, DirectiveHooks } from '../types'\n\n/**\n * Element state storage\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Vue 3 directive adapter\n * @returns Vue 3 directive object with created/mounted/updated/unmounted hooks\n */\nexport function createVue3Directive<T, B extends Element>(\n\thooks: DirectiveHooks<T, B>,\n): Record<string, any> {\n\tconst directive = {\n\t\tcreated(el: B, binding: any, vnode: VNode) {\n\t\t\t// Vue 3's created is called when element is created\n\t\t\t// Initialize state\n\t\t\tconst state: ElementState = {\n\t\t\t\tvalue: binding.value,\n\t\t\t\tvnode,\n\t\t\t\tcleanup: [],\n\t\t\t}\n\n ;(el as any).__directix_state__ = state\n\t\t},\n\n\t\tbeforeMount(_el: B, _binding: any, _vnode: VNode) {\n\t\t\t// Before mount\n\t\t},\n\n\t\tmounted(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.mounted) {\n\t\t\t\thooks.mounted(el, normalizeBindingVue3(binding), vnode)\n\t\t\t}\n\t\t},\n\n\t\tbeforeUpdate(_el: B, _binding: any, _vnode: VNode, _prevVnode: VNode) {\n\t\t\t// Before update\n\t\t},\n\n\t\tupdated(el: B, binding: any, vnode: VNode, prevVnode: VNode) {\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (hooks.updated) {\n\t\t\t\thooks.updated(\n\t\t\t\t\tel,\n\t\t\t\t\tnormalizeBindingVue3(binding),\n\t\t\t\t\tvnode,\n\t\t\t\t\tnormalizeBindingVue3({ ...binding, value: binding.oldValue }),\n\t\t\t\t\tprevVnode,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Update state\n\t\t\tif (state) {\n\t\t\t\tstate.value = binding.value\n\t\t\t\tstate.vnode = vnode\n\t\t\t}\n\t\t},\n\n\t\tbeforeUnmount(_el: B, _binding: any, _vnode: VNode) {\n\t\t\t// Before unmount\n\t\t},\n\n\t\tunmounted(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.unmounted) {\n\t\t\t\thooks.unmounted(el, normalizeBindingVue3(binding), vnode)\n\t\t\t}\n\n\t\t\t// Execute cleanup functions\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (state?.cleanup) {\n\t\t\t\tstate.cleanup.forEach(fn => fn())\n\t\t\t}\n\t\t\tdelete (el as any).__directix_state__\n\t\t},\n\t}\n\n\treturn directive\n}\n\n/**\n * Normalize Vue 3 binding to unified format\n */\nfunction normalizeBindingVue3<T>(binding: any): DirectiveBinding<T> {\n\treturn {\n\t\tvalue: binding.value,\n\t\toldValue: binding.oldValue ?? null,\n\t\targ: binding.arg,\n\t\tmodifiers: binding.modifiers || {},\n\t\tinstance: binding.instance,\n\t}\n}\n\n/**\n * Add cleanup function to element\n */\nexport function addCleanup(el: Element, fn: () => void): void {\n\tconst state = (el as any).__directix_state__\n\n\tif (state) {\n\t\tstate.cleanup.push(fn)\n\t}\n}\n","/**\n * Vue version type\n * - 2: Vue 2.6.x (requires @vue/composition-api for Composition API)\n * - 2.7: Vue 2.7.x (has built-in Composition API support)\n * - 3: Vue 3.x\n */\nexport type VueVersion = 2 | 2.7 | 3\n\n/**\n * Vue version detection\n */\nlet _vueVersion: VueVersion | null = null,\n\t_isVue2: boolean | null = null,\n\t_isVue27: boolean | null = null,\n\t_isVue3: boolean | null = null\n\n/**\n * Parse version string to VueVersion\n */\nfunction parseVersion(version: string): VueVersion | null {\n\tif (version.startsWith('2.7')) return 2.7\n\tif (version.startsWith('2')) return 2\n\tif (version.startsWith('3')) return 3\n\n\treturn null\n}\n\n/**\n * Get current Vue version\n */\nexport function getVueVersion(): VueVersion {\n\tif (_vueVersion !== null) return _vueVersion\n\n\t// Method 1: Check environment variable (highest priority)\n\tif (typeof process !== 'undefined') {\n\t\tconst envVersion = process.env.DIRECTIX_VUE_VERSION\n\n\t\tif (envVersion === '2.7') {\n\t\t\t_vueVersion = 2.7\n\n\t\t\treturn _vueVersion\n\t\t}\n\t\tif (envVersion === '2') {\n\t\t\t_vueVersion = 2\n\n\t\t\treturn _vueVersion\n\t\t}\n\t\tif (envVersion === '3') {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\t}\n\n\t// Method 2: Try require (CommonJS/Node.js)\n\ttry {\n\t\t// eslint-disable-next-line ts/no-require-imports\n\t\tconst vue = require('vue')\n\t\tconst version = parseVersion(vue?.version)\n\n\t\tif (version !== null) {\n\t\t\t_vueVersion = version\n\n\t\t\treturn _vueVersion\n\t\t}\n\t} catch {\n\t\t// require failed, continue to other methods\n\t}\n\n\t// Method 3: Check browser environment\n\tif (typeof window !== 'undefined') {\n\t\tconst win = window as any\n\t\tconst vue = win.Vue\n\n\t\t// Check version string\n\t\tif (vue?.version) {\n\t\t\tconst version = parseVersion(vue.version)\n\n\t\t\tif (version !== null) {\n\t\t\t\t_vueVersion = version\n\n\t\t\t\treturn _vueVersion\n\t\t\t}\n\t\t}\n\n\t\t// Check Vue 2 specific API\n\t\tif (typeof vue?.observable === 'function') {\n\t\t\t_vueVersion = 2\n\n\t\t\treturn _vueVersion\n\t\t}\n\n\t\t// Check Vue 3 specific API\n\t\tif (typeof vue?.createApp === 'function' && typeof vue?.observable !== 'function') {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\n\t\t// Check devtools hook\n\t\tconst devtools = win.__VUE_DEVTOOLS_GLOBAL_HOOK__\n\n\t\tif (devtools?.Vue?.version) {\n\t\t\tconst version = parseVersion(devtools.Vue.version)\n\n\t\t\tif (version !== null) {\n\t\t\t\t_vueVersion = version\n\n\t\t\t\treturn _vueVersion\n\t\t\t}\n\t\t}\n\t\tif (devtools?.apps?.length) {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\t}\n\n\t// Default to Vue 3 but warn\n\tif (_vueVersion === null) {\n\t\tif (typeof window !== 'undefined') {\n\t\t\tconsole.warn(\n\t\t\t\t'[Directix] Unable to detect Vue version, defaulting to Vue 3. '\n\t\t\t\t+ 'Set DIRECTIX_VUE_VERSION=2 or call setVueVersion(2) if using Vue 2.',\n\t\t\t)\n\t\t}\n\t\t_vueVersion = 3\n\t}\n\n\treturn _vueVersion\n}\n\n/**\n * Set Vue version explicitly (for cases where auto-detection fails)\n */\nexport function setVueVersion(version: VueVersion): void {\n\t_vueVersion = version\n\t_isVue2 = version === 2 || version === 2.7\n\t_isVue27 = version === 2.7\n\t_isVue3 = version === 3\n}\n\n/**\n * Reset Vue version (useful for testing)\n */\nexport function resetVueVersion(): void {\n\t_vueVersion = null\n\t_isVue2 = null\n\t_isVue27 = null\n\t_isVue3 = null\n}\n\n/**\n * Check if Vue 2 (includes 2.7)\n */\nexport function isVue2(): boolean {\n\tif (_isVue2 === null) {\n\t\tconst version = getVueVersion()\n\n\t\t_isVue2 = version === 2 || version === 2.7\n\t}\n\n\treturn _isVue2\n}\n\n/**\n * Check if Vue 2.7 (has built-in Composition API support)\n */\nexport function isVue27(): boolean {\n\tif (_isVue27 === null) {\n\t\t_isVue27 = getVueVersion() === 2.7\n\t}\n\n\treturn _isVue27\n}\n\n/**\n * Check if Vue 3\n */\nexport function isVue3(): boolean {\n\tif (_isVue3 === null) {\n\t\t_isVue3 = getVueVersion() === 3\n\t}\n\n\treturn _isVue3\n}\n\n/**\n * Check if browser environment\n */\nexport const isBrowser = (): boolean => {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\n/**\n * Check if server-side rendering\n */\nexport const isSSR = (): boolean => !isBrowser()\n\n/**\n * Check if passive event listening is supported\n */\nexport const supportsPassive = (): boolean => {\n\tif (!isBrowser()) return false\n\n\tlet supports = false\n\n\ttry {\n\t\tconst options = {\n\t\t\tget passive() {\n\t\t\t\tsupports = true\n\n\t\t\t\treturn false\n\t\t\t},\n\t\t}\n\n\t\twindow.addEventListener('test', null as any, options)\n\t\twindow.removeEventListener('test', null as any, options as any)\n\t} catch {\n\t\tsupports = false\n\t}\n\n\treturn supports\n}\n\n/**\n * Check if IntersectionObserver is supported\n */\nexport const supportsIntersectionObserver = (): boolean => {\n\treturn isBrowser() && 'IntersectionObserver' in window\n}\n\n/**\n * Check if ResizeObserver is supported\n */\nexport const supportsResizeObserver = (): boolean => {\n\treturn isBrowser() && 'ResizeObserver' in window\n}\n\n/**\n * Check if Clipboard API is supported\n */\nexport const supportsClipboard = (): boolean => {\n\treturn isBrowser() && 'clipboard' in navigator\n}\n\n/**\n * Check if MutationObserver is supported\n */\nexport const supportsMutationObserver = (): boolean => {\n\treturn isBrowser() && 'MutationObserver' in window\n}\n","import type { Directive } from 'vue'\nimport type { DirectiveBinding, DirectiveDefinition, DirectiveHooks } from './types'\nimport { createVue2Directive } from './adapter/vue2'\nimport { createVue3Directive } from './adapter/vue3'\nimport { getVueVersion, isSSR } from './env'\n\n/**\n * Define a cross-version compatible directive\n * @param definition The directive definition\n * @returns Vue directive object\n */\nexport function defineDirective<T = any, B extends Element = Element>(\n\tdefinition: DirectiveDefinition<T, B>,\n): Directive {\n\tconst { name, version, ssr, defaults, ...hooks } = definition\n\n\t// SSR check\n\tif (isSSR() && !ssr) {\n\t\tif (typeof process !== 'undefined' && process.env?.NODE_ENV !== 'test') {\n\t\t\tconsole.warn(\n\t\t\t\t`[Directix] Directive \"${name}\" is not compatible with SSR. `\n\t\t\t\t+ 'It will be a no-op on the server side.',\n\t\t\t)\n\t\t}\n\n\t\treturn createNoOpDirective()\n\t}\n\n\t// Wrap hooks with default values\n\tconst wrappedHooks: DirectiveHooks<T, B> = {\n\t\tmounted: hooks.mounted ? (el, binding, vnode) => {\n\t\t\thooks.mounted!(el, applyDefaults(binding, defaults), vnode)\n\t\t} : undefined,\n\n\t\tupdated: hooks.updated ? (el, binding, vnode, prevBinding, prevVnode) => {\n\t\t\thooks.updated!(el, applyDefaults(binding, defaults), vnode, prevBinding, prevVnode)\n\t\t} : undefined,\n\n\t\tunmounted: hooks.unmounted,\n\t}\n\n\t// Create a lazy directive that determines version at runtime\n\treturn createLazyDirective(wrappedHooks)\n}\n\n/**\n * Create a lazy directive that determines Vue version at first use\n */\nfunction createLazyDirective<T, B extends Element>(hooks: DirectiveHooks<T, B>): Directive {\n\tlet cachedDirective: any = null\n\n\t// Unified detection entry point\n\tfunction getDirective(): any {\n\t\tif (!cachedDirective) {\n\t\t\tcachedDirective = getVueVersion() === 2 ? createVue2Directive(hooks) : createVue3Directive(hooks)\n\t\t}\n\n\t\treturn cachedDirective\n\t}\n\n\t// Hook generator to reduce code duplication\n\tfunction createHook(hookName: string) {\n\t\treturn function (el: B, binding: any, vnode: any, prevVnode?: any) {\n\t\t\tgetDirective()[hookName]?.(el, binding, vnode, prevVnode)\n\t\t}\n\t}\n\n\treturn {\n\t\t// Vue 2 hooks\n\t\tbind: createHook('bind'),\n\t\tinserted: createHook('inserted'),\n\t\tupdate: createHook('update'),\n\t\tcomponentUpdated: createHook('componentUpdated'),\n\t\tunbind: createHook('unbind'),\n\t\t// Vue 3 hooks\n\t\tcreated: createHook('created'),\n\t\tbeforeMount: createHook('beforeMount'),\n\t\tmounted: createHook('mounted'),\n\t\tbeforeUpdate: createHook('beforeUpdate'),\n\t\tupdated: createHook('updated'),\n\t\tbeforeUnmount: createHook('beforeUnmount'),\n\t\tunmounted: createHook('unmounted'),\n\t} as Directive\n}\n\n/**\n * Apply default values to binding\n */\nfunction applyDefaults<T>(\n\tbinding: DirectiveBinding<T>,\n\tdefaults?: Partial<T>,\n): DirectiveBinding<T> {\n\tif (!defaults) return binding\n\n\tconst value\n\t\t= typeof binding.value === 'object' && binding.value !== null ? { ...defaults, ...binding.value } : binding.value\n\n\treturn { ...binding, value: value as T }\n}\n\n/**\n * Create a no-op directive (for SSR)\n */\nfunction createNoOpDirective(): Directive {\n\treturn {\n\t\tmounted: () => {},\n\t\tupdated: () => {},\n\t\tunmounted: () => {},\n\t}\n}\n\n/**\n * Define a directive group\n */\nexport function defineDirectiveGroup(\n\tname: string,\n\tdirectives: Record<string, any>,\n): { name: string, directives: Record<string, any>, install: (app: any) => void } {\n\treturn {\n\t\tname,\n\t\tdirectives,\n\t\tinstall(app: any, _options?: any) {\n\t\t\tObject.entries(directives).forEach(([directiveName, directive]) => {\n\t\t\t\tconst fullName = `${name}-${directiveName}`\n\n\t\t\t\tapp.directive(fullName, directive)\n\t\t\t})\n\t\t},\n\t}\n}\n","/**\n * Shared utilities for text transformation directives\n * (uppercase, lowercase, capitalcase, trim)\n */\n\n/**\n * Base options for text transform directives\n */\nexport interface TextTransformOptions {\n\t/**\n\t * Whether to transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Setup an input element with text transformation\n * Returns cleanup function\n */\nexport function setupTextTransformInput(\n\tel: HTMLInputElement | HTMLTextAreaElement,\n\toptions: TextTransformOptions,\n\ttransformFn: (text: string) => string,\n): () => void {\n\tif (!options.onInput) {\n\t\treturn () => {}\n\t}\n\n\tconst handler = (): void => {\n\t\tconst start = el.selectionStart\n\t\tconst end = el.selectionEnd\n\t\tconst originalValue = el.value\n\t\tconst transformed = transformFn(originalValue)\n\n\t\tif (originalValue !== transformed) {\n\t\t\tel.value = transformed\n\t\t\t// Restore cursor position\n\t\t\tif (start !== null && end !== null) {\n\t\t\t\tel.setSelectionRange(start, end)\n\t\t\t}\n\t\t\t// Trigger input event for v-model\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t}\n\t}\n\n\tel.addEventListener('input', handler)\n\n\t// Initial transform\n\tel.value = transformFn(el.value)\n\n\treturn () => {\n\t\tel.removeEventListener('input', handler)\n\t}\n}\n\n/**\n * Transform text content of a non-input element\n */\nexport function transformTextContent(el: HTMLElement, transformFn: (text: string) => string): void {\n\tconst text = el.textContent || ''\n\n\tel.textContent = transformFn(text)\n}\n\n/**\n * Check if element is an input or textarea\n */\nexport function isInputElement(el: HTMLElement): el is HTMLInputElement | HTMLTextAreaElement {\n\treturn el.tagName === 'INPUT' || el.tagName === 'TEXTAREA'\n}\n","import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Capitalcase directive options\n */\nexport interface CapitalcaseOptions {\n\t/**\n\t * Whether to capitalize each word or just the first word\n\t * @default true\n\t */\n\tevery?: boolean\n\n\t/**\n\t * Words to keep lowercase (articles, prepositions, etc.)\n\t * @default ['a', 'an', 'the', 'and', 'but', 'or', 'for', 'nor', 'on', 'at', 'to', 'from', 'by']\n\t */\n\tkeepLower?: string[]\n\n\t/**\n\t * Whether to transform on input (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type CapitalcaseBinding = boolean | CapitalcaseOptions\n\n/**\n * Default words to keep lowercase\n */\nconst DEFAULT_KEEP_LOWER = [\n\t'a', 'an', 'the',\n\t'and', 'but', 'or', 'for', 'nor',\n\t'on', 'at', 'to', 'from', 'by',\n\t'in', 'of', 'with', 'as',\n]\n\n/**\n * Capitalize text based on options\n */\nfunction capitalizeText(text: string, options: CapitalcaseOptions): string {\n\tif (!text) return text\n\n\tconst { every = true, keepLower = DEFAULT_KEEP_LOWER } = options\n\n\tif (every) {\n\t\t// Capitalize each word\n\t\tconst words = text.toLowerCase().split(/\\s+/)\n\n\t\treturn words\n\t\t\t.map((word, index) => {\n\t\t\t\t// Always capitalize first word\n\t\t\t\tif (index === 0) {\n\t\t\t\t\treturn capitalizeWord(word)\n\t\t\t\t}\n\t\t\t\t// Keep certain words lowercase\n\t\t\t\tif (keepLower.includes(word.toLowerCase())) {\n\t\t\t\t\treturn word.toLowerCase()\n\t\t\t\t}\n\n\t\t\t\treturn capitalizeWord(word)\n\t\t\t})\n\t\t\t.join(' ')\n\t} else {\n\t\t// Capitalize only the first word\n\t\treturn capitalizeWord(text)\n\t}\n}\n\n/**\n * Capitalize a single word\n */\nfunction capitalizeWord(word: string): string {\n\tif (!word) return word\n\n\treturn word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CapitalcaseBinding | undefined): CapitalcaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { every: true, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { every: false, onInput: false }\n\t}\n\n\treturn {\n\t\tevery: binding.every ?? true,\n\t\tkeepLower: binding.keepLower ?? DEFAULT_KEEP_LOWER,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-capitalcase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: capitalize each word -->\n * <input v-capitalcase v-model=\"title\" />\n *\n * <!-- Capitalize only first word -->\n * <span v-capitalcase=\"{ every: false }\">{{ text }}</span>\n *\n * <!-- With custom lowercase words -->\n * <input v-capitalcase=\"{ keepLower: ['a', 'the'] }\" v-model=\"title\" />\n * </template>\n * ```\n */\nexport const vCapitalcase = defineDirective<CapitalcaseBinding, HTMLElement>({\n\tname: 'capitalcase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => capitalizeText(text, options))\n\n\t\t\t;(el as any).__capitalcaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => capitalizeText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = capitalizeText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => capitalizeText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__capitalcaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__capitalcaseCleanup\n\t},\n})\n\nexport default vCapitalcase\n","import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\n\n/**\n * Click delay handler\n */\nexport type ClickDelayHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Click delay directive options\n */\nexport interface ClickDelayOptions {\n\t/**\n\t * Click handler\n\t * @required\n\t */\n\thandler: ClickDelayHandler\n\n\t/**\n\t * Delay time in milliseconds\n\t * @default 300\n\t */\n\tdelay?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * CSS class to add during delay\n\t * @default 'v-click-delay--pending'\n\t */\n\tpendingClass?: string\n\n\t/**\n\t * Whether to show visual feedback\n\t * @default true\n\t */\n\tfeedback?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ClickDelayBinding = ClickDelayHandler | ClickDelayOptions\n\n/**\n * Element state storage\n */\ninterface ClickDelayState {\n\toptions: ClickDelayOptions\n\thandler: (event: Event) => void\n\tisPending: boolean\n\ttimeoutId: ReturnType<typeof setTimeout> | null\n}\n\n/**\n * v-click-delay directive\n *\n * Prevents repeated clicks within a specified time period.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Basic usage -->\n * <button v-click-delay=\"handleClick\">Click Me</button>\n *\n * <!-- With delay time -->\n * <button v-click-delay:500=\"handleClick\">Click Me (500ms)</button>\n *\n * <!-- With options -->\n * <button v-click-delay=\"{ handler: handleClick, delay: 1000 }\">\n * Click Me (1s)\n * </button>\n * </template>\n * ```\n */\nexport const vClickDelay = defineDirective<ClickDelayBinding, HTMLElement>({\n\tname: 'click-delay',\n\tssr: true,\n\tdefaults: {\n\t\tdelay: 300,\n\t\tdisabled: false,\n\t\tpendingClass: 'v-click-delay--pending',\n\t\tfeedback: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\n\t\tif (options.disabled) return\n\n\t\tconst state: ClickDelayState = {\n\t\t\toptions,\n\t\t\thandler: createClickHandler(el, options),\n\t\t\tisPending: false,\n\t\t\ttimeoutId: null,\n\t\t}\n\n\t\t;(el as any).__clickDelay = state\n\n\t\t// Bind click event\n\t\tel.addEventListener('click', state.handler)\n\t\tel.addEventListener('touchend', state.handler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ClickDelayState = (el as any).__clickDelay\n\n\t\tif (!state) {\n\t\t\t// If previously disabled, reinitialize\n\t\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t\tif (!options.disabled) {\n\t\t\t\tconst newState: ClickDelayState = {\n\t\t\t\t\toptions,\n\t\t\t\t\thandler: createClickHandler(el, options),\n\t\t\t\t\tisPending: false,\n\t\t\t\t\ttimeoutId: null,\n\t\t\t\t}\n\t\t\t\t;(el as any).__clickDelay = newState\n\t\t\t\tel.addEventListener('click', newState.handler)\n\t\t\t\tel.addEventListener('touchend', newState.handler)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If disabled state changes\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disable: remove listeners\n\t\t\tel.removeEventListener('click', state.handler)\n\t\t\tel.removeEventListener('touchend', state.handler)\n\t\t\tif (state.timeoutId) {\n\t\t\t\tclearTimeout(state.timeoutId)\n\t\t\t}\n\t\t\tremovePendingClass(el, state.options)\n\t\t\tdelete (el as any).__clickDelay\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Enable: add listeners\n\t\t\tstate.handler = createClickHandler(el, newOptions)\n\t\t\tstate.isPending = false\n\t\t\tstate.timeoutId = null\n\t\t\tel.addEventListener('click', state.handler)\n\t\t\tel.addEventListener('touchend', state.handler)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ClickDelayState = (el as any).__clickDelay\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handler)\n\t\tel.removeEventListener('touchend', state.handler)\n\n\t\tif (state.timeoutId) {\n\t\t\tclearTimeout(state.timeoutId)\n\t\t}\n\n\t\tremovePendingClass(el, state.options)\n\t\tdelete (el as any).__clickDelay\n\t},\n})\n\n/**\n * Create click handler with delay logic\n */\nfunction createClickHandler(\n\tel: HTMLElement,\n\toptions: ClickDelayOptions,\n): (event: Event) => void {\n\treturn (event: Event) => {\n\t\tconst state: ClickDelayState = (el as any).__clickDelay\n\n\t\tif (!state || state.isPending) {\n\t\t\tevent.preventDefault()\n\t\t\tevent.stopPropagation()\n\t\t\treturn\n\t\t}\n\n\t\t// Mark as pending\n\t\tstate.isPending = true\n\n\t\t// Add visual feedback\n\t\tif (options.feedback && options.pendingClass) {\n\t\t\tel.classList.add(options.pendingClass)\n\t\t}\n\n\t\t// Call handler\n\t\toptions.handler(event as MouseEvent | TouchEvent)\n\n\t\t// Set timeout to reset pending state\n\t\tstate.timeoutId = setTimeout(() => {\n\t\t\tstate.isPending = false\n\t\t\tstate.timeoutId = null\n\t\t\tremovePendingClass(el, options)\n\t\t}, options.delay)\n\t}\n}\n\n/**\n * Remove pending class from element\n */\nfunction removePendingClass(el: HTMLElement, options: ClickDelayOptions): void {\n\tif (options.feedback && options.pendingClass) {\n\t\tel.classList.remove(options.pendingClass)\n\t}\n}\n\n/**\n * Parse time from argument\n * Supports formats: \"300\" | \"300ms\" | \"1s\"\n */\nfunction parseTime(arg?: string): number | null {\n\tif (!arg) return null\n\n\tif (arg.endsWith('ms')) {\n\t\treturn parseInt(arg, 10)\n\t}\n\n\tif (arg.endsWith('s')) {\n\t\treturn parseFloat(arg) * 1000\n\t}\n\n\tconst num = parseInt(arg, 10)\n\treturn Number.isNaN(num) ? null : num\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: ClickDelayBinding | undefined,\n\tdirectiveBinding: DirectiveBinding<ClickDelayBinding>,\n): ClickDelayOptions {\n\tconst delay = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn {\n\t\t\thandler: binding,\n\t\t\tdelay,\n\t\t\tdisabled: false,\n\t\t\tpendingClass: 'v-click-delay--pending',\n\t\t\tfeedback: true,\n\t\t}\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-click-delay: handler is required')\n\t}\n\n\treturn {\n\t\thandler: binding.handler,\n\t\tdelay: binding.delay ?? delay,\n\t\tdisabled: binding.disabled ?? false,\n\t\tpendingClass: binding.pendingClass ?? 'v-click-delay--pending',\n\t\tfeedback: binding.feedback ?? true,\n\t}\n}\n\nexport default vClickDelay\n","import { isBrowser } from '@directix/core'\n\n/**\n * Check if value is an Element\n */\nexport function isElement(value: unknown): value is Element {\n\treturn value instanceof Element\n}\n\n/**\n * Check if value is an HTMLElement\n */\nexport function isHTMLElement(value: unknown): value is HTMLElement {\n\treturn value instanceof HTMLElement\n}\n\n/**\n * Get element by selector or return element itself\n */\nexport function getElement(target: string | Element | null | undefined): Element | null {\n\tif (!target) return null\n\n\tif (typeof target === 'string') {\n\t\tif (!isBrowser()) return null\n\n\t\treturn document.querySelector(target)\n\t}\n\n\treturn isElement(target) ? target : null\n}\n\n/**\n * Get all elements matching selector\n */\nexport function getAllElements(target: string): Element[] {\n\tif (!isBrowser()) return []\n\n\treturn Array.from(document.querySelectorAll(target))\n}\n\n/**\n * Add classes to element\n */\nexport function addClass(el: Element, ...classes: string[]): void {\n\tel.classList.add(...classes)\n}\n\n/**\n * Remove classes from element\n */\nexport function removeClass(el: Element, ...classes: string[]): void {\n\tel.classList.remove(...classes)\n}\n\n/**\n * Toggle class on element\n */\nexport function toggleClass(el: Element, className: string, force?: boolean): void {\n\tel.classList.toggle(className, force)\n}\n\n/**\n * Check if element has class\n */\nexport function hasClass(el: Element, className: string): boolean {\n\treturn el.classList.contains(className)\n}\n\n/**\n * Get element style property\n */\nexport function getStyle(el: Element, property: string): string {\n\tif (!isBrowser()) return ''\n\n\treturn getComputedStyle(el).getPropertyValue(property)\n}\n\n/**\n * Set element style property\n */\nexport function setStyle(el: HTMLElement, property: string, value: string | number): void {\n\tel.style.setProperty(property, typeof value === 'number' ? `${value}px` : value)\n}\n\n/**\n * Set multiple styles on element\n */\nexport function setStyles(el: HTMLElement, styles: Record<string, string | number>): void {\n\tObject.entries(styles).forEach(([property, value]) => {\n\t\tsetStyle(el, property, value)\n\t})\n}\n\n/**\n * Get element offset position\n */\nexport function getOffset(el: Element): { top: number, left: number } {\n\tif (!isBrowser()) return { top: 0, left: 0 }\n\tconst rect = el.getBoundingClientRect()\n\n\treturn {\n\t\ttop: rect.top + window.scrollY,\n\t\tleft: rect.left + window.scrollX,\n\t}\n}\n\n/**\n * Get element size\n */\nexport function getSize(el: Element): { width: number, height: number } {\n\tconst rect = el.getBoundingClientRect()\n\n\treturn {\n\t\twidth: rect.width,\n\t\theight: rect.height,\n\t}\n}\n\n/**\n * Check if element is in viewport\n */\nexport function isInViewport(el: Element): boolean {\n\tif (!isBrowser()) return false\n\tconst rect = el.getBoundingClientRect()\n\n\treturn (\n\t\trect.top >= 0\n\t\t&& rect.left >= 0\n\t\t&& rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n\t\t&& rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t)\n}\n\n/**\n * Get nearest scrollable parent element\n */\nexport function getScrollParent(el: Element): Element | Window {\n\tif (!isBrowser()) return window\n\n\tlet parent: Element | null = el.parentElement\n\n\twhile (parent) {\n\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent)\n\n\t\tif (/(auto|scroll)/.test(overflow + overflowX + overflowY)) {\n\t\t\treturn parent\n\t\t}\n\n\t\tparent = parent.parentElement\n\t}\n\n\treturn window\n}\n\n/**\n * Check if element matches selector\n */\nexport function matches(el: Element, selector: string): boolean {\n\treturn el.matches(selector)\n}\n\n/**\n * Get nearest ancestor matching selector\n */\nexport function closest(el: Element, selector: string): Element | null {\n\treturn el.closest(selector)\n}\n","import { isBrowser, supportsPassive } from '@directix/core'\n\nexport interface EventOptions {\n\tcapture?: boolean\n\tpassive?: boolean\n\tonce?: boolean\n}\n\n/**\n * Add event listener\n */\nexport function on(\n\ttarget: EventTarget,\n\tevent: string,\n\thandler: (event: Event) => void,\n\toptions: boolean | EventOptions = false,\n): void {\n\tif (!isBrowser()) return\n\tconst opts = normalizeOptions(options)\n\n\ttarget.addEventListener(event, handler, opts)\n}\n\n/**\n * Remove event listener\n */\nexport function off(\n\ttarget: EventTarget,\n\tevent: string,\n\thandler: (event: Event) => void,\n\toptions: boolean | EventOptions = false,\n): void {\n\tif (!isBrowser()) return\n\tconst opts = normalizeOptions(options)\n\n\ttarget.removeEventListener(event, handler, opts)\n}\n\n/**\n * Emit custom event\n */\nexport function emit(target: EventTarget, event: string, detail?: any): boolean {\n\tif (!isBrowser()) return false\n\n\treturn target.dispatchEvent(new CustomEvent(event, { detail }))\n}\n\n/**\n * Normalize event options\n */\nfunction normalizeOptions(options: boolean | EventOptions): boolean | { capture: boolean, passive: boolean, once: boolean } {\n\tif (typeof options === 'boolean') {\n\t\treturn options\n\t}\n\n\tconst { capture = false, passive = false, once = false } = options\n\n\tif (supportsPassive()) {\n\t\treturn { capture, passive, once }\n\t}\n\n\treturn capture\n}\n\n/**\n * Create event delegation\n */\nexport function delegate(\n\tcontainer: Element,\n\tselector: string,\n\tevent: string,\n\thandler: (el: Element, e: Event) => void,\n\toptions?: EventOptions,\n): () => void {\n\tconst listener = (e: Event): void => {\n\t\tconst target = e.target as Element\n\t\tconst matched = target.closest(selector)\n\n\t\tif (matched && container.contains(matched)) {\n\t\t\thandler(matched, e)\n\t\t}\n\t}\n\n\ton(container, event, listener, options)\n\n\treturn () => off(container, event, listener, options)\n}\n\n/**\n * Stop event propagation\n */\nexport function stopPropagation(e: Event): void {\n\te.stopPropagation()\n}\n\n/**\n * Prevent default behavior\n */\nexport function preventDefault(e: Event): void {\n\te.preventDefault()\n}\n\n/**\n * Stop event propagation and prevent default behavior\n */\nexport function stopEvent(e: Event): void {\n\tstopPropagation(e)\n\tpreventDefault(e)\n}\n\n/**\n * Get event target\n */\nexport function getEventTarget<T extends EventTarget = EventTarget>(e: Event): T | null {\n\treturn e.target as T | null\n}\n\n/**\n * Get current event target\n */\nexport function getCurrentTarget<T extends EventTarget = EventTarget>(e: Event): T | null {\n\treturn e.currentTarget as T | null\n}\n\n/**\n * Get mouse/touch position from event\n */\nexport function getEventPosition(\n\te: MouseEvent | TouchEvent,\n): { x: number, y: number, clientX: number, clientY: number } {\n\tlet clientX = 0,\n\t\tclientY = 0\n\n\tif ('touches' in e && e.touches.length > 0) {\n\t\tclientX = e.touches[0].clientX\n\t\tclientY = e.touches[0].clientY\n\t} else if ('clientX' in e) {\n\t\tclientX = e.clientX\n\t\tclientY = e.clientY\n\t}\n\n\treturn {\n\t\tx: clientX,\n\t\ty: clientY,\n\t\tclientX,\n\t\tclientY,\n\t}\n}\n","/**\n * Check if value is a string\n */\nexport function isString(value: unknown): value is string {\n\treturn typeof value === 'string'\n}\n\n/**\n * Check if value is a number\n */\nexport function isNumber(value: unknown): value is number {\n\treturn typeof value === 'number' && !isNaN(value)\n}\n\n/**\n * Check if value is a boolean\n */\nexport function isBoolean(value: unknown): value is boolean {\n\treturn typeof value === 'boolean'\n}\n\n/**\n * Check if value is a function\n */\nexport function isFunction(value: unknown): value is (...args: any[]) => any {\n\treturn typeof value === 'function'\n}\n\n/**\n * Check if value is an object\n */\nexport function isObject(value: unknown): value is Record<string, any> {\n\treturn typeof value === 'object' && value !== null\n}\n\n/**\n * Check if value is an array\n */\nexport function isArray(value: unknown): value is any[] {\n\treturn Array.isArray(value)\n}\n\n/**\n * Check if value is empty\n */\nexport function isEmpty(value: unknown): boolean {\n\tif (value === null || value === undefined) return true\n\tif (isString(value) || isArray(value)) return value.length === 0\n\tif (isObject(value)) return Object.keys(value).length === 0\n\n\treturn false\n}\n\n/**\n * Check if value is a Promise\n */\nexport function isPromise<T = any>(value: unknown): value is Promise<T> {\n\treturn isObject(value) && isFunction((value as any).then)\n}\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n\tif (obj === null || typeof obj !== 'object') {\n\t\treturn obj\n\t}\n\n\tif (Array.isArray(obj)) {\n\t\treturn obj.map(item => deepClone(item)) as unknown as T\n\t}\n\n\tconst cloned = {} as T\n\n\tfor (const key in obj) {\n\t\tif (Object.prototype.hasOwnProperty.call(obj, key)) {\n\t\t\tcloned[key] = deepClone(obj[key])\n\t\t}\n\t}\n\n\treturn cloned\n}\n\n/**\n * Deep merge objects\n */\nexport function deepMerge<T extends Record<string, any>>(\n\ttarget: T,\n\t...sources: Partial<T>[]\n): T {\n\tif (!sources.length) return target\n\n\tconst source = sources.shift()\n\n\tif (isObject(target) && isObject(source)) {\n\t\tfor (const key in source) {\n\t\t\tif (isObject(source[key])) {\n\t\t\t\tif (!target[key]) {\n\t\t\t\t\tObject.assign(target, { [key]: {} })\n\t\t\t\t}\n\t\t\t\tdeepMerge(\n\t\t\t\t\ttarget[key] as Record<string, any>,\n\t\t\t\t\tsource[key] as Record<string, any>,\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tObject.assign(target, { [key]: source[key] })\n\t\t\t}\n\t\t}\n\t}\n\n\treturn deepMerge(target, ...sources)\n}\n\n/**\n * Get nested property value by path\n */\nexport function get<T = any>(\n\tobj: Record<string, any>,\n\tpath: string,\n\tdefaultValue?: T,\n): T {\n\tconst keys = path.split('.')\n\tlet result: any = obj\n\n\tfor (const key of keys) {\n\t\tif (result === null || result === undefined) {\n\t\t\treturn defaultValue as T\n\t\t}\n\t\tresult = result[key]\n\t}\n\n\treturn (result === undefined ? defaultValue : result) as T\n}\n\n/**\n * Set nested property value by path\n */\nexport function set(obj: Record<string, any>, path: string, value: any): void {\n\tconst keys = path.split('.')\n\tconst lastKey = keys.pop()!\n\tlet current = obj\n\n\tfor (const key of keys) {\n\t\tif (current[key] === undefined) {\n\t\t\tcurrent[key] = {}\n\t\t}\n\t\tcurrent = current[key]\n\t}\n\n\tcurrent[lastKey] = value\n}\n\n/**\n * Debounce function\n */\nexport function debounce<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number = 300,\n\toptions: { leading?: boolean, trailing?: boolean } = {},\n): ((...args: Parameters<T>) => void) & { cancel: () => void, flush: () => void } {\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null\n\n\tconst { leading = false, trailing = true } = options\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\tfunc.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst debounced = function (this: any, ...args: Parameters<T>): void {\n\t\tlastArgs = args\n\t\t// eslint-disable-next-line ts/no-this-alias\n\t\tlastThis = this\n\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t}\n\n\t\tif (leading && !timerId) {\n\t\t\tinvokeFunc()\n\t\t}\n\n\t\ttimerId = setTimeout(() => {\n\t\t\tif (trailing) {\n\t\t\t\tinvokeFunc()\n\t\t\t}\n\t\t\ttimerId = null\n\t\t}, wait)\n\t} as ((...args: Parameters<T>) => void) & { cancel: () => void, flush: () => void }\n\n\tdebounced.cancel = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tlastArgs = null\n\t\tlastThis = null\n\t}\n\n\tdebounced.flush = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\tinvokeFunc()\n\t\t\ttimerId = null\n\t\t}\n\t}\n\n\treturn debounced\n}\n\n/**\n * Throttle function\n */\nexport function throttle<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number = 300,\n\toptions: { leading?: boolean, trailing?: boolean } = {},\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null,\n\t\tlastCallTime = 0\n\n\tconst { leading = true, trailing = true } = options\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\tfunc.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst throttled = function (this: any, ...args: Parameters<T>): void {\n\t\tconst now = Date.now()\n\n\t\tif (!lastCallTime && !leading) {\n\t\t\tlastCallTime = now\n\t\t}\n\n\t\tconst remaining = wait - (now - lastCallTime)\n\n\t\tlastArgs = args\n\t\t// eslint-disable-next-line ts/no-this-alias\n\t\tlastThis = this\n\n\t\tif (remaining <= 0 || remaining > wait) {\n\t\t\tif (timerId) {\n\t\t\t\tclearTimeout(timerId)\n\t\t\t\ttimerId = null\n\t\t\t}\n\t\t\tlastCallTime = now\n\t\t\tinvokeFunc()\n\t\t} else if (!timerId && trailing) {\n\t\t\ttimerId = setTimeout(() => {\n\t\t\t\tlastCallTime = leading ? Date.now() : 0\n\t\t\t\ttimerId = null\n\t\t\t\tinvokeFunc()\n\t\t\t}, remaining)\n\t\t}\n\t} as ((...args: Parameters<T>) => void) & { cancel: () => void }\n\n\tthrottled.cancel = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tlastCallTime = 0\n\t\tlastArgs = null\n\t\tlastThis = null\n\t}\n\n\treturn throttled\n}\n\n/**\n * Parse time argument\n * Supports formats: \"300\" | \"300ms\" | \"1s\"\n */\nexport function parseTime(arg?: string): number | null {\n\tif (!arg) return null\n\n\tif (arg.endsWith('ms')) {\n\t\treturn parseInt(arg, 10)\n\t}\n\n\tif (arg.endsWith('s')) {\n\t\treturn parseFloat(arg) * 1000\n\t}\n\n\tconst num = parseInt(arg, 10)\n\n\treturn isNaN(num) ? null : num\n}\n\n/**\n * Generate unique ID\n */\nexport function generateId(prefix: string = ''): string {\n\treturn `${prefix}${Date.now().toString(36)}${Math.random().toString(36).slice(2, 9)}`\n}\n","import { defineDirective } from '@directix/core'\nimport { getElement, off, on } from '@directix/shared'\n\n/**\n * Click outside handler\n */\nexport type ClickOutsideHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Click outside directive options\n */\nexport interface ClickOutsideOptions {\n\t/**\n\t * Callback when clicking outside\n\t * @required\n\t */\n\thandler: ClickOutsideHandler\n\n\t/**\n\t * Excluded element selectors or element references\n\t */\n\texclude?: (string | HTMLElement | (() => HTMLElement | null))[]\n\n\t/**\n\t * Whether to use capture mode\n\t * @default true\n\t */\n\tcapture?: boolean\n\n\t/**\n\t * Event types to listen for\n\t * @default ['click']\n\t */\n\tevents?: ('click' | 'mousedown' | 'mouseup' | 'touchstart' | 'touchend')[]\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Stop propagation\n\t * @default false\n\t */\n\tstop?: boolean\n\n\t/**\n\t * Prevent default behavior\n\t * @default false\n\t */\n\tprevent?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ClickOutsideBinding = ClickOutsideHandler | ClickOutsideOptions\n\n/**\n * Element state storage\n */\ninterface ClickOutsideState {\n\toptions: ClickOutsideOptions\n\thandlers: Map<string, (event: Event) => void>\n}\n\n/**\n * v-click-outside directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-click-outside=\"handleClickOutside\">\n * Dropdown menu\n * </div>\n * </template>\n * ```\n */\nexport const vClickOutside = defineDirective<ClickOutsideBinding, HTMLElement>({\n\tname: 'click-outside',\n\tssr: false,\n\tdefaults: {\n\t\tcapture: true,\n\t\tevents: ['click'],\n\t\tdisabled: false,\n\t\tstop: false,\n\t\tprevent: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\tconst state: ClickOutsideState = {\n\t\t\toptions,\n\t\t\thandlers: new Map(),\n\t\t}\n\n ;(el as any).__clickOutside = state\n\n\t\t// Create event handler\n\t\tconst createHandler = (_eventType: string) => {\n\t\t\treturn (event: Event) => {\n\t\t\t\t// Check event target\n\t\t\t\tif (!isValidClick(el, event, options)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Stop propagation\n\t\t\t\tif (options.stop) {\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t}\n\n\t\t\t\t// Prevent default behavior\n\t\t\t\tif (options.prevent) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t}\n\n\t\t\t\t// Call handler\n\t\t\t\toptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t}\n\t\t}\n\n\t\t// Bind events\n\t\toptions.events!.forEach(eventType => {\n\t\t\tconst handler = createHandler(eventType)\n\n\t\t\tstate.handlers.set(eventType, handler)\n\n\t\t\tconst listenerOptions = {\n\t\t\t\tcapture: options.capture,\n\t\t\t\tpassive: !options.prevent,\n\t\t\t}\n\n\t\t\ton(document, eventType, handler, listenerOptions)\n\t\t})\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ClickOutsideState = (el as any).__clickOutside\n\n\t\tif (!state) return\n\n\t\tconst oldOptions = state.options\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// If disabled state changes\n\t\tif (oldOptions.disabled !== newOptions.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\t// Remove all listeners\n\t\t\t\tstate.handlers.forEach((handler, eventType) => {\n\t\t\t\t\toff(document, eventType, handler, { capture: oldOptions.capture })\n\t\t\t\t})\n\t\t\t\tstate.handlers.clear()\n\t\t\t} else {\n\t\t\t\t// Re-add listeners\n\t\t\t\tconst createHandler = (_eventType: string) => {\n\t\t\t\t\treturn (event: Event) => {\n\t\t\t\t\t\tif (!isValidClick(el, event, newOptions)) return\n\t\t\t\t\t\tif (newOptions.stop) event.stopPropagation()\n\t\t\t\t\t\tif (newOptions.prevent) event.preventDefault()\n\t\t\t\t\t\tnewOptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnewOptions.events!.forEach(eventType => {\n\t\t\t\t\tconst handler = createHandler(eventType)\n\n\t\t\t\t\tstate.handlers.set(eventType, handler)\n\t\t\t\t\ton(document, eventType, handler, {\n\t\t\t\t\t\tcapture: newOptions.capture,\n\t\t\t\t\t\tpassive: !newOptions.prevent,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ClickOutsideState = (el as any).__clickOutside\n\n\t\tif (!state) return\n\n\t\t// Remove all event listeners\n\t\tstate.handlers.forEach((handler, eventType) => {\n\t\t\toff(document, eventType, handler, { capture: state.options.capture })\n\t\t})\n\n\t\tdelete (el as any).__clickOutside\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ClickOutsideBinding | undefined): ClickOutsideOptions {\n\tif (typeof binding === 'function') {\n\t\treturn {\n\t\t\thandler: binding,\n\t\t\tcapture: true,\n\t\t\tevents: ['click'],\n\t\t\tdisabled: false,\n\t\t\tstop: false,\n\t\t\tprevent: false,\n\t\t}\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-click-outside: handler is required')\n\t}\n\n\treturn {\n\t\tcapture: binding.capture ?? true,\n\t\tevents: binding.events ?? ['click'],\n\t\tdisabled: binding.disabled ?? false,\n\t\tstop: binding.stop ?? false,\n\t\tprevent: binding.prevent ?? false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if click is valid (outside the element)\n */\nfunction isValidClick(\n\tel: HTMLElement,\n\tevent: Event,\n\toptions: ClickOutsideOptions,\n): boolean {\n\tconst target = event.target as Node\n\n\t// Check if clicked on element itself or its children\n\tif (el.contains(target)) {\n\t\treturn false\n\t}\n\n\t// Check excluded elements\n\tif (options.exclude?.length) {\n\t\tfor (const exclude of options.exclude) {\n\t\t\tconst excludeEl = typeof exclude === 'function' ? exclude() : getElement(exclude)\n\n\t\t\tif (excludeEl && (excludeEl === target || excludeEl.contains(target))) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true\n}\n\nexport default vClickOutside\n","import { defineDirective, supportsClipboard } from '@directix/core'\n\n/**\n * Copy success callback\n */\nexport type CopySuccessCallback = (text: string) => void\n\n/**\n * Copy error callback\n */\nexport type CopyErrorCallback = (error: Error) => void\n\n/**\n * Copy directive options\n */\nexport interface CopyOptions {\n\t/**\n\t * Text to copy\n\t * @required\n\t */\n\tvalue: string\n\n\t/**\n\t * Callback on copy success\n\t */\n\tonSuccess?: CopySuccessCallback\n\n\t/**\n\t * Callback on copy error\n\t */\n\tonError?: CopyErrorCallback\n\n\t/**\n\t * Tooltip text for the copy button\n\t */\n\ttitle?: string\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type CopyBinding = string | CopyOptions\n\n/**\n * Element state storage\n */\ninterface CopyState {\n\thandler: () => void\n\toptions: CopyOptions\n}\n\n/**\n * Copy text to clipboard\n * Prefer Clipboard API, fallback to execCommand\n */\nasync function copyToClipboard(text: string): Promise<boolean> {\n\t// Method 1: Use Clipboard API\n\tif (supportsClipboard()) {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(text)\n\n\t\t\treturn true\n\t\t} catch {\n\t\t\t// Permission denied or other error, fallback\n\t\t\tconsole.warn('[Directix] Clipboard API failed, falling back to execCommand')\n\t\t}\n\t}\n\n\t// Method 2: Use execCommand (deprecated but has good compatibility)\n\treturn copyWithExecCommand(text)\n}\n\n/**\n * Copy using execCommand\n */\nfunction copyWithExecCommand(text: string): boolean {\n\t// Create temporary textarea\n\tconst textarea = document.createElement('textarea')\n\n\ttextarea.value = text\n\n\t// Set styles to make it invisible\n\ttextarea.style.cssText = `\n position: fixed;\n top: -9999px;\n left: -9999px;\n opacity: 0;\n pointer-events: none;\n `\n\n\tdocument.body.appendChild(textarea)\n\n\ttry {\n\t\t// Select and copy\n\t\ttextarea.select()\n\t\ttextarea.setSelectionRange(0, textarea.value.length)\n\n\t\treturn document.execCommand('copy')\n\t} catch {\n\t\treturn false\n\t} finally {\n\t\t// Cleanup\n\t\tdocument.body.removeChild(textarea)\n\t}\n}\n\n/**\n * v-copy directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-copy=\"textToCopy\">Copy Text</button>\n * </template>\n * ```\n */\nexport const vCopy = defineDirective<CopyBinding, HTMLElement>({\n\tname: 'copy',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Set tooltip\n\t\tif (options.title) {\n\t\t\tel.setAttribute('title', options.title)\n\t\t}\n\n\t\t// State storage - handler reads latest value from here\n\t\tconst state: CopyState = {\n\t\t\thandler: null as any,\n\t\t\toptions,\n\t\t}\n\n\t\t// Add click event - read latest options from state\n\t\tstate.handler = async () => {\n\t\t\tconst text = state.options.value\n\n\t\t\tif (!text) {\n\t\t\t\tconsole.warn('[Directix] v-copy: No text to copy')\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst success = await copyToClipboard(text)\n\n\t\t\t\tif (success) {\n\t\t\t\t\tstate.options.onSuccess?.(text)\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('copy:success', { detail: { text } }))\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Copy failed')\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err as Error\n\n\t\t\t\tstate.options.onError?.(error)\n\t\t\t\tel.dispatchEvent(new CustomEvent('copy:error', { detail: { error } }))\n\t\t\t}\n\t\t}\n\n\t\tel.addEventListener('click', state.handler)\n\t\t;(el as any).__copy = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: CopyState = (el as any).__copy\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\tif (state.options.title) {\n\t\t\tel.setAttribute('title', state.options.title)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: CopyState = (el as any).__copy\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handler)\n\t\tdelete (el as any).__copy\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CopyBinding): CopyOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { value: binding }\n\t}\n\n\treturn binding\n}\n\nexport default vCopy\n","import { defineDirective } from '@directix/core'\n\n/**\n * Countdown format function\n */\nexport type CountdownFormatFunction = (time: CountdownTime) => string\n\n/**\n * Countdown complete callback\n */\nexport type CountdownCompleteCallback = () => void\n\n/**\n * Countdown tick callback\n */\nexport type CountdownTickCallback = (time: CountdownTime) => void\n\n/**\n * Countdown time object\n */\nexport interface CountdownTime {\n\tdays: number\n\thours: number\n\tminutes: number\n\tseconds: number\n\tmilliseconds: number\n\ttotal: number\n}\n\n/**\n * Countdown directive options\n */\nexport interface CountdownOptions {\n\t/**\n\t * Target time (Date object, timestamp, or ISO string)\n\t * @required\n\t */\n\ttarget: Date | number | string\n\n\t/**\n\t * Format string or custom format function\n\t * - 'dd:hh:mm:ss' - Days:Hours:Minutes:Seconds\n\t * - 'hh:mm:ss' - Hours:Minutes:Seconds\n\t * - 'mm:ss' - Minutes:Seconds\n\t * - 'ss' - Seconds only\n\t * @default 'hh:mm:ss'\n\t */\n\tformat?: string | CountdownFormatFunction\n\n\t/**\n\t * Callback when countdown completes\n\t */\n\tonComplete?: CountdownCompleteCallback\n\n\t/**\n\t * Callback on each tick\n\t */\n\tonTick?: CountdownTickCallback\n\n\t/**\n\t * Update interval in milliseconds\n\t * @default 1000\n\t */\n\tinterval?: number\n\n\t/**\n\t * Whether to show milliseconds\n\t * @default false\n\t */\n\tshowMilliseconds?: boolean\n\n\t/**\n\t * Whether to auto-start\n\t * @default true\n\t */\n\tautoStart?: boolean\n\n\t/**\n\t * Custom labels for i18n\n\t */\n\tlabels?: {\n\t\tdays?: string\n\t\thours?: string\n\t\tminutes?: string\n\t\tseconds?: string\n\t\tmilliseconds?: string\n\t}\n}\n\n/**\n * Directive binding value type\n */\nexport type CountdownBinding = CountdownOptions | Date | number | string\n\n/**\n * Element state storage\n */\ninterface CountdownState {\n\toptions: CountdownOptions\n\ttargetTime: number\n\tintervalId: ReturnType<typeof setInterval> | null\n\tpaused: boolean\n\tremaining: number\n}\n\n/**\n * Parse target time to timestamp\n */\nfunction parseTargetTime(target: Date | number | string): number {\n\tif (target instanceof Date) {\n\t\treturn target.getTime()\n\t}\n\n\tif (typeof target === 'number') {\n\t\treturn target\n\t}\n\n\treturn new Date(target).getTime()\n}\n\n/**\n * Calculate remaining time\n */\nfunction calculateTime(remaining: number): CountdownTime {\n\tconst total = Math.max(0, remaining)\n\n\treturn {\n\t\tdays: Math.floor(total / (1000 * 60 * 60 * 24)),\n\t\thours: Math.floor((total % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)),\n\t\tminutes: Math.floor((total % (1000 * 60 * 60)) / (1000 * 60)),\n\t\tseconds: Math.floor((total % (1000 * 60)) / 1000),\n\t\tmilliseconds: total % 1000,\n\t\ttotal,\n\t}\n}\n\n/**\n * Format time to string\n */\nfunction formatTime(time: CountdownTime, format: string | CountdownFormatFunction): string {\n\tif (typeof format === 'function') {\n\t\treturn format(time)\n\t}\n\n\tconst pad = (n: number, len = 2): string => String(n).padStart(len, '0')\n\n\t// Replace placeholders\n\tconst result = format\n\t\t.replace(/dd/gi, pad(time.days))\n\t\t.replace(/hh/gi, pad(time.hours))\n\t\t.replace(/mm/gi, pad(time.minutes))\n\t\t.replace(/ss/gi, pad(time.seconds))\n\t\t.replace(/S{3}/gi, pad(time.milliseconds, 3))\n\t\t.replace(/SS/gi, pad(Math.floor(time.milliseconds / 10)))\n\t\t.replace(/S/gi, String(Math.floor(time.milliseconds / 100)))\n\n\treturn result\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CountdownBinding): CountdownOptions {\n\tif (typeof binding === 'object' && binding !== null && 'target' in binding) {\n\t\treturn {\n\t\t\ttarget: binding.target,\n\t\t\tformat: binding.format ?? 'hh:mm:ss',\n\t\t\tonComplete: binding.onComplete,\n\t\t\tonTick: binding.onTick,\n\t\t\tinterval: binding.interval ?? 1000,\n\t\t\tshowMilliseconds: binding.showMilliseconds ?? false,\n\t\t\tautoStart: binding.autoStart ?? true,\n\t\t\tlabels: binding.labels,\n\t\t}\n\t}\n\n\t// binding is Date | number | string\n\treturn {\n\t\ttarget: binding as Date | number | string,\n\t\tformat: 'hh:mm:ss',\n\t\tinterval: 1000,\n\t\tshowMilliseconds: false,\n\t\tautoStart: true,\n\t}\n}\n\n/**\n * v-countdown directive\n *\n * Displays a countdown timer.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Basic usage -->\n * <span v-countdown=\"targetDate\"></span>\n *\n * <!-- With timestamp -->\n * <span v-countdown=\"Date.now() + 60000\"></span>\n *\n * <!-- With options -->\n * <span v-countdown=\"{\n * target: targetDate,\n * format: 'dd:hh:mm:ss',\n * onComplete: handleComplete\n * }\"></span>\n *\n * <!-- With custom format function -->\n * <span v-countdown=\"{\n * target: targetDate,\n * format: (time) => `${time.days} days ${time.hours}:${time.minutes}:${time.seconds}`\n * }\"></span>\n * </template>\n * ```\n */\nexport const vCountdown = defineDirective<CountdownBinding, HTMLElement>({\n\tname: 'countdown',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst targetTime = parseTargetTime(options.target)\n\n\t\tconst state: CountdownState = {\n\t\t\toptions,\n\t\t\ttargetTime,\n\t\t\tintervalId: null,\n\t\t\tpaused: false,\n\t\t\tremaining: 0,\n\t\t}\n\n\t\t;(el as any).__countdown = state\n\n\t\tif (options.autoStart !== false) {\n\t\t\tstartCountdown(el, state)\n\t\t} else {\n\t\t\t// Show initial time\n\t\t\tupdateDisplay(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: CountdownState = (el as any).__countdown\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst newTargetTime = parseTargetTime(newOptions.target)\n\n\t\t// Check if target changed\n\t\tif (newTargetTime !== state.targetTime) {\n\t\t\tstate.targetTime = newTargetTime\n\t\t\tstate.options = newOptions\n\n\t\t\t// Clear existing interval if any\n\t\t\tif (state.intervalId) {\n\t\t\t\tclearInterval(state.intervalId)\n\t\t\t\tstate.intervalId = null\n\t\t\t}\n\n\t\t\t// Restart countdown if not paused\n\t\t\tif (!state.paused) {\n\t\t\t\tstartCountdown(el, state)\n\t\t\t}\n\t\t} else {\n\t\t\tstate.options = newOptions\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: CountdownState | undefined = (el as any).__countdown\n\n\t\tif (state?.intervalId) {\n\t\t\tclearInterval(state.intervalId)\n\t\t}\n\n\t\tdelete (el as any).__countdown\n\t},\n})\n\n/**\n * Start countdown\n */\nfunction startCountdown(el: HTMLElement, state: CountdownState): void {\n\tconst tick = (): void => {\n\t\tconst now = Date.now()\n\t\tstate.remaining = state.targetTime - now\n\n\t\tif (state.remaining <= 0) {\n\t\t\tstate.remaining = 0\n\t\t\tupdateDisplay(el, state)\n\t\t\tstopCountdown(state)\n\n\t\t\t// Call onComplete\n\t\t\tif (state.options.onComplete) {\n\t\t\t\tstate.options.onComplete()\n\t\t\t}\n\n\t\t\t// Dispatch event\n\t\t\tel.dispatchEvent(new CustomEvent('countdown:complete'))\n\t\t\treturn\n\t\t}\n\n\t\tupdateDisplay(el, state)\n\n\t\t// Call onTick\n\t\tif (state.options.onTick) {\n\t\t\tconst time = calculateTime(state.remaining)\n\t\t\tstate.options.onTick(time)\n\t\t}\n\t}\n\n\t// Initial tick\n\ttick()\n\n\t// Start interval\n\tstate.intervalId = setInterval(tick, state.options.interval || 1000)\n}\n\n/**\n * Stop countdown\n */\nfunction stopCountdown(state: CountdownState): void {\n\tif (state.intervalId) {\n\t\tclearInterval(state.intervalId)\n\t\tstate.intervalId = null\n\t}\n}\n\n/**\n * Update display\n */\nfunction updateDisplay(el: HTMLElement, state: CountdownState): void {\n\tconst time = calculateTime(state.remaining)\n\tconst display = formatTime(time, state.options.format || 'hh:mm:ss')\n\tel.textContent = display\n}\n\n// Export helper functions for external use\nexport { calculateTime, formatTime, parseTargetTime }\n\nexport default vCountdown\n","/**\n * Shared utilities for event-based directives\n * (debounce, throttle)\n */\n\n/**\n * Supported event type modifiers list\n */\nexport const EVENT_MODIFIERS = [\n\t'click',\n\t'input',\n\t'change',\n\t'submit',\n\t'scroll',\n\t'resize',\n\t'mouseenter',\n\t'mouseleave',\n\t'mousemove',\n\t'mousedown',\n\t'mouseup',\n\t'keydown',\n\t'keyup',\n\t'focus',\n\t'blur',\n\t'touchstart',\n\t'touchmove',\n\t'touchend',\n] as const\n\nexport type EventModifier = (typeof EVENT_MODIFIERS)[number]\n\n/**\n * Extract event type from modifiers\n */\nexport function getEventTypeFromModifiers(modifiers: Record<string, boolean>): string | null {\n\tfor (const modifier of EVENT_MODIFIERS) {\n\t\tif (modifiers[modifier]) {\n\t\t\treturn modifier\n\t\t}\n\t}\n\n\treturn null\n}\n\n/**\n * Get default event type for element\n */\nexport function getDefaultEventType(el: HTMLElement): string {\n\tconst tagName = el.tagName.toLowerCase()\n\n\tif (tagName === 'input' || tagName === 'textarea') {\n\t\treturn 'input'\n\t}\n\n\treturn 'click'\n}\n","import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\nimport { debounce, parseTime } from '@directix/shared'\nimport { getDefaultEventType, getEventTypeFromModifiers } from '../utils/event'\n\n/**\n * Debounced function type\n */\nexport interface DebouncedFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n\tflush: () => void\n}\n\n/**\n * Debounce directive options\n */\nexport interface DebounceOptions<T extends (...args: any[]) => any = any> {\n\t/**\n\t * Function to debounce\n\t */\n\thandler: T\n\n\t/**\n\t * Delay time in milliseconds\n\t * @default 300\n\t */\n\twait?: number\n\n\t/**\n\t * Whether to invoke immediately before delay starts\n\t * @default false\n\t */\n\tleading?: boolean\n\n\t/**\n\t * Whether to invoke after delay ends\n\t * @default true\n\t */\n\ttrailing?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type DebounceBinding<T extends (...args: any[]) => any = any>\n\t= | T\n\t\t| DebounceOptions<T>\n\n/**\n * Element state storage\n */\ninterface DebounceState {\n\tdebouncedFn: DebouncedFunction<any>\n\teventType: string\n\toptions: DebounceOptions\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: DebounceBinding,\n\tdirectiveBinding: DirectiveBinding<DebounceBinding>,\n): DebounceOptions {\n\tconst wait = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, wait }\n\t}\n\n\treturn { ...binding, wait: binding.wait || wait }\n}\n\n/**\n * v-debounce directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-debounce=\"handleInput\" />\n * <input v-debounce:500ms=\"handleInput\" />\n * <input v-debounce=\"{ handler: handleInput, wait: 500 }\" />\n * <div v-debounce.scroll=\"handleScroll\">Scroll Debounce</div>\n * <div v-debounce:100.scroll=\"handleScroll\">100ms Scroll Debounce</div>\n * </template>\n * ```\n */\nexport const vDebounce = defineDirective<DebounceBinding, HTMLElement>({\n\tname: 'debounce',\n\tssr: true, // SSR safe - event binding is skipped on server\n\tdefaults: {\n\t\twait: 300,\n\t\tleading: false,\n\t\ttrailing: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t// Prefer event type from modifiers, otherwise infer from element type\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getDefaultEventType(el)\n\n\t\t// Create debounced function\n\t\tconst debouncedFn = debounce(options.handler, options.wait, {\n\t\t\tleading: options.leading,\n\t\t\ttrailing: options.trailing,\n\t\t})\n\n\t\t// Bind event\n\t\tel.addEventListener(eventType, debouncedFn as any)\n\n\t\t;(el as any).__debounce = {\n\t\t\tdebouncedFn,\n\t\t\teventType,\n\t\t\toptions,\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: DebounceState = (el as any).__debounce\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If configuration changes, recreate debounced function\n\t\tif (\n\t\t\tnewOptions.wait !== state.options.wait\n\t\t\t|| newOptions.leading !== state.options.leading\n\t\t\t|| newOptions.trailing !== state.options.trailing\n\t\t) {\n\t\t\t// Cancel old one\n\t\t\tstate.debouncedFn.cancel()\n\n\t\t\t// Create new one\n\t\t\tconst debouncedFn = debounce(newOptions.handler, newOptions.wait, {\n\t\t\t\tleading: newOptions.leading,\n\t\t\t\ttrailing: newOptions.trailing,\n\t\t\t})\n\n\t\t\tel.removeEventListener(state.eventType, state.debouncedFn as any)\n\t\t\tel.addEventListener(state.eventType, debouncedFn as any)\n\n\t\t\t;(el as any).__debounce = {\n\t\t\t\tdebouncedFn,\n\t\t\t\teventType: state.eventType,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t} else if (newOptions.handler !== state.options.handler) {\n\t\t\t// Only update handler\n\t\t\tstate.options.handler = newOptions.handler\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: DebounceState = (el as any).__debounce\n\n\t\tif (!state) return\n\n\t\tstate.debouncedFn.cancel()\n\t\tel.removeEventListener(state.eventType, state.debouncedFn as any)\n\t\tdelete (el as any).__debounce\n\t},\n})\n\nexport default vDebounce\n","import { defineDirective } from '@directix/core'\n\n/**\n * Draggable axis\n */\nexport type DraggableAxis = 'x' | 'y' | 'both'\n\n/**\n * Draggable directive options\n */\nexport interface DraggableOptions {\n\t/**\n\t * Drag axis\n\t * @default 'both'\n\t */\n\taxis?: DraggableAxis\n\n\t/**\n\t * Constrain to parent element\n\t * @default false\n\t */\n\tconstrain?: boolean\n\n\t/**\n\t * Boundary element selector or element\n\t */\n\tboundary?: string | HTMLElement | (() => HTMLElement | null)\n\n\t/**\n\t * Handle element selector\n\t */\n\thandle?: string\n\n\t/**\n\t * Whether dragging is disabled\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Grid snapping [x, y]\n\t */\n\tgrid?: [number, number]\n\n\t/**\n\t * Start drag callback\n\t */\n\tonStart?: (position: { x: number, y: number }, event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Drag callback\n\t */\n\tonDrag?: (position: { x: number, y: number }, event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * End drag callback\n\t */\n\tonEnd?: (position: { x: number, y: number }, event: MouseEvent | TouchEvent) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type DraggableBinding = boolean | DraggableOptions\n\n/**\n * Draggable state\n */\ninterface DraggableState {\n\toptions: DraggableOptions\n\tisDragging: boolean\n\tstartX: number\n\tstartY: number\n\toffsetX: number\n\toffsetY: number\n\tinitialLeft: number\n\tinitialTop: number\n\tboundaryWidth: number\n\tboundaryHeight: number\n\telWidth: number\n\telHeight: number\n\thandleEl: HTMLElement | null\n\tmoveHandler: ((e: MouseEvent | TouchEvent) => void) | null\n\tendHandler: ((e: MouseEvent | TouchEvent) => void) | null\n}\n\n/**\n * Get element boundary\n */\nfunction getBoundary(_el: HTMLElement, boundary?: string | HTMLElement | (() => HTMLElement | null)): DOMRect | null {\n\tif (!boundary) return null\n\n\tif (typeof boundary === 'function') {\n\t\tconst boundaryEl = boundary()\n\t\treturn boundaryEl?.getBoundingClientRect() ?? null\n\t}\n\n\tif (typeof boundary === 'string') {\n\t\tconst boundaryEl = document.querySelector(boundary)\n\t\treturn boundaryEl?.getBoundingClientRect() ?? null\n\t}\n\n\treturn boundary.getBoundingClientRect()\n}\n\n/**\n * Get client coordinates from mouse or touch event\n */\nfunction getClientCoords(e: MouseEvent | TouchEvent): { clientX: number, clientY: number } {\n\tif (e.type.startsWith('touch')) {\n\t\tconst touch = (e as TouchEvent).touches[0]\n\t\treturn { clientX: touch.clientX, clientY: touch.clientY }\n\t}\n\tconst mouseEvent = e as MouseEvent\n\treturn { clientX: mouseEvent.clientX, clientY: mouseEvent.clientY }\n}\n\n/**\n * Parse transform translate values\n */\nfunction parseTranslate(transform: string): { x: number, y: number } {\n\tconst match = transform.match(/translate\\(([-\\d.]+)px,\\s*([-\\d.]+)px\\)/)\n\tif (match) {\n\t\treturn { x: parseFloat(match[1]), y: parseFloat(match[2]) }\n\t}\n\treturn { x: 0, y: 0 }\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: DraggableBinding): DraggableOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { axis: 'both', constrain: false, disabled: false }\n\t}\n\n\tif (binding === false) {\n\t\treturn { axis: 'both', constrain: false, disabled: true }\n\t}\n\n\treturn {\n\t\taxis: binding.axis ?? 'both',\n\t\tconstrain: binding.constrain ?? false,\n\t\tboundary: binding.boundary,\n\t\thandle: binding.handle,\n\t\tdisabled: binding.disabled ?? false,\n\t\tgrid: binding.grid,\n\t\tonStart: binding.onStart,\n\t\tonDrag: binding.onDrag,\n\t\tonEnd: binding.onEnd,\n\t}\n}\n\n/**\n * v-draggable directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage -->\n * <div v-draggable>Drag me</div>\n *\n * <!-- Constrain to parent -->\n * <div v-draggable=\"{ constrain: true }\">Drag me</div>\n *\n * <!-- With handle -->\n * <div v-draggable=\"{ handle: '.drag-handle' }\">\n * <div class=\"drag-handle\">Drag here</div>\n * <div>Content</div>\n * </div>\n *\n * <!-- With callbacks -->\n * <div v-draggable=\"{ onDrag: handleDrag }\">Drag me</div>\n * </template>\n * ```\n */\nexport const vDraggable = defineDirective<DraggableBinding, HTMLElement>({\n\tname: 'draggable',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tif (options.disabled) return\n\n\t\t// Make element positionable\n\t\tif (getComputedStyle(el).position === 'static') {\n\t\t\tel.style.position = 'absolute'\n\t\t}\n\n\t\tconst state: DraggableState = {\n\t\t\toptions,\n\t\t\tisDragging: false,\n\t\t\tstartX: 0,\n\t\t\tstartY: 0,\n\t\t\toffsetX: 0,\n\t\t\toffsetY: 0,\n\t\t\tinitialLeft: 0,\n\t\t\tinitialTop: 0,\n\t\t\tboundaryWidth: 0,\n\t\t\tboundaryHeight: 0,\n\t\t\telWidth: 0,\n\t\t\telHeight: 0,\n\t\t\thandleEl: options.handle ? el.querySelector(options.handle) : null,\n\t\t\tmoveHandler: null,\n\t\t\tendHandler: null,\n\t\t}\n\n\t\t;(el as any).__draggable = state\n\n\t\t// Add event listeners to handle or element\n\t\tconst targetEl = state.handleEl || el\n\t\ttargetEl.addEventListener('mousedown', startDrag)\n\t\ttargetEl.addEventListener('touchstart', startDrag, { passive: false })\n\n\t\tfunction startDrag(e: MouseEvent | TouchEvent): void {\n\t\t\tif (state.options.disabled) return\n\n\t\t\t// Prevent default for touch events\n\t\t\tif (e.type === 'touchstart') {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\n\t\t\tconst { clientX, clientY } = getClientCoords(e)\n\t\t\tstate.isDragging = true\n\t\t\tstate.startX = clientX\n\t\t\tstate.startY = clientY\n\n\t\t\t// Get current transform offset\n\t\t\tconst { x, y } = parseTranslate(el.style.transform)\n\t\t\tstate.offsetX = x\n\t\t\tstate.offsetY = y\n\n\t\t\t// Store boundary info for constraint\n\t\t\tif (state.options.constrain || state.options.boundary) {\n\t\t\t\tconst boundary = state.options.boundary ? getBoundary(el, state.options.boundary) : el.parentElement?.getBoundingClientRect()\n\n\t\t\t\tif (boundary) {\n\t\t\t\t\tconst elRect = el.getBoundingClientRect()\n\t\t\t\t\tstate.initialLeft = elRect.left - boundary.left\n\t\t\t\t\tstate.initialTop = elRect.top - boundary.top\n\t\t\t\t\tstate.boundaryWidth = boundary.width\n\t\t\t\t\tstate.boundaryHeight = boundary.height\n\t\t\t\t\tstate.elWidth = elRect.width\n\t\t\t\t\tstate.elHeight = elRect.height\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add drag class\n\t\t\tel.classList.add('v-draggable--dragging')\n\n\t\t\t// Create move and end handlers\n\t\t\tstate.moveHandler = (moveEvent: MouseEvent | TouchEvent) => {\n\t\t\t\tif (!state.isDragging) return\n\n\t\t\t\tconst { clientX: moveX, clientY: moveY } = getClientCoords(moveEvent)\n\t\t\t\tlet deltaX = moveX - state.startX,\n\t\t\t\t\tdeltaY = moveY - state.startY\n\n\t\t\t\t// Apply axis constraint\n\t\t\t\tif (state.options.axis === 'x') {\n\t\t\t\t\tdeltaY = 0\n\t\t\t\t} else if (state.options.axis === 'y') {\n\t\t\t\t\tdeltaX = 0\n\t\t\t\t}\n\n\t\t\t\t// Apply grid snapping\n\t\t\t\tif (state.options.grid) {\n\t\t\t\t\tdeltaX = Math.round(deltaX / state.options.grid[0]) * state.options.grid[0]\n\t\t\t\t\tdeltaY = Math.round(deltaY / state.options.grid[1]) * state.options.grid[1]\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line one-var\n\t\t\t\tlet newX = state.offsetX + deltaX,\n\t\t\t\t\tnewY = state.offsetY + deltaY\n\n\t\t\t\t// Apply boundary constraints\n\t\t\t\tif (state.options.constrain || state.options.boundary) {\n\t\t\t\t\tconst newLeft = state.initialLeft + deltaX\n\t\t\t\t\tconst newTop = state.initialTop + deltaY\n\t\t\t\t\tconst maxLeft = state.boundaryWidth - state.elWidth\n\t\t\t\t\tconst maxTop = state.boundaryHeight - state.elHeight\n\n\t\t\t\t\tconst constrainedLeft = Math.max(0, Math.min(newLeft, maxLeft))\n\t\t\t\t\tconst constrainedTop = Math.max(0, Math.min(newTop, maxTop))\n\n\t\t\t\t\tnewX = state.offsetX + (constrainedLeft - state.initialLeft)\n\t\t\t\t\tnewY = state.offsetY + (constrainedTop - state.initialTop)\n\t\t\t\t}\n\n\t\t\t\t// Apply transform\n\t\t\t\tel.style.transform = `translate(${newX}px, ${newY}px)`\n\n\t\t\t\t// Call callback\n\t\t\t\tstate.options.onDrag?.({ x: newX, y: newY }, moveEvent)\n\t\t\t}\n\n\t\t\tstate.endHandler = () => {\n\t\t\t\tif (!state.isDragging) return\n\n\t\t\t\tstate.isDragging = false\n\t\t\t\tel.classList.remove('v-draggable--dragging')\n\n\t\t\t\t// Remove event listeners\n\t\t\t\tif (state.moveHandler) {\n\t\t\t\t\tdocument.removeEventListener('mousemove', state.moveHandler)\n\t\t\t\t\tdocument.removeEventListener('touchmove', state.moveHandler)\n\t\t\t\t}\n\t\t\t\tif (state.endHandler) {\n\t\t\t\t\tdocument.removeEventListener('mouseup', state.endHandler)\n\t\t\t\t\tdocument.removeEventListener('touchend', state.endHandler)\n\t\t\t\t}\n\n\t\t\t\t// Get final position\n\t\t\t\tconst { x: finalX, y: finalY } = parseTranslate(el.style.transform)\n\t\t\t\tstate.options.onEnd?.({ x: finalX, y: finalY }, new MouseEvent('mouseup'))\n\t\t\t}\n\n\t\t\t// Add move and end listeners\n\t\t\tdocument.addEventListener('mousemove', state.moveHandler)\n\t\t\tdocument.addEventListener('touchmove', state.moveHandler, { passive: false })\n\t\t\tdocument.addEventListener('mouseup', state.endHandler)\n\t\t\tdocument.addEventListener('touchend', state.endHandler)\n\n\t\t\t// Call start callback\n\t\t\tstate.options.onStart?.({ x: state.offsetX, y: state.offsetY }, e)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: DraggableState | undefined = (el as any).__draggable\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\t// Update handle element\n\t\tif (state.options.handle) {\n\t\t\tstate.handleEl = el.querySelector(state.options.handle)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: DraggableState | undefined = (el as any).__draggable\n\t\tif (!state) return\n\n\t\t// Remove event listeners\n\t\tif (state.moveHandler) {\n\t\t\tdocument.removeEventListener('mousemove', state.moveHandler)\n\t\t\tdocument.removeEventListener('touchmove', state.moveHandler)\n\t\t}\n\t\tif (state.endHandler) {\n\t\t\tdocument.removeEventListener('mouseup', state.endHandler)\n\t\t\tdocument.removeEventListener('touchend', state.endHandler)\n\t\t}\n\n\t\tdelete (el as any).__draggable\n\t},\n})\n\nexport default vDraggable\n","import { defineDirective } from '@directix/core'\n\n/**\n * Ellipsis directive options\n */\nexport interface EllipsisOptions {\n\t/**\n\t * Number of lines to show before truncating\n\t * @default 1\n\t */\n\tlines?: number\n\n\t/**\n\t * Custom ellipsis string\n\t * @default '...'\n\t */\n\tellipsis?: string\n\n\t/**\n\t * Whether to expand on click\n\t * @default false\n\t */\n\texpandable?: boolean\n\n\t/**\n\t * Title attribute behavior\n\t * - 'auto': Show full text as title only when truncated\n\t * - 'always': Always show full text as title\n\t * - 'none': Don't show title\n\t * @default 'auto'\n\t */\n\ttitleBehavior?: 'auto' | 'always' | 'none'\n}\n\n/**\n * Directive binding value type\n */\nexport type EllipsisBinding = number | EllipsisOptions\n\n/**\n * Element state storage\n */\ninterface EllipsisState {\n\toptions: EllipsisOptions\n\toriginalText: string\n\tclickHandler: (() => void) | null\n\texpanded: boolean\n}\n\n/**\n * v-ellipsis directive\n *\n * Truncates text with ellipsis, supports single and multi-line truncation.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Single line ellipsis -->\n * <p v-ellipsis>Long text here...</p>\n *\n * <!-- Multi-line ellipsis (3 lines) -->\n * <p v-ellipsis=\"3\">Long text here...</p>\n *\n * <!-- With options -->\n * <p v-ellipsis=\"{ lines: 2, expandable: true }\">\n * Click to expand long text...\n * </p>\n * </template>\n * ```\n */\nexport const vEllipsis = defineDirective<EllipsisBinding, HTMLElement>({\n\tname: 'ellipsis',\n\tssr: true,\n\tdefaults: {\n\t\tlines: 1,\n\t\tellipsis: '...',\n\t\texpandable: false,\n\t\ttitleBehavior: 'auto',\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tapplyEllipsis(el, options)\n\n\t\tconst state: EllipsisState = {\n\t\t\toptions,\n\t\t\toriginalText: el.textContent || '',\n\t\t\tclickHandler: null,\n\t\t\texpanded: false,\n\t\t}\n\n\t\t// Handle expandable\n\t\tif (options.expandable) {\n\t\t\tconst handler = (): void => {\n\t\t\t\tif (state.expanded) {\n\t\t\t\t\t// Collapse\n\t\t\t\t\tapplyEllipsis(el, options)\n\t\t\t\t\tstate.expanded = false\n\t\t\t\t} else {\n\t\t\t\t\t// Expand\n\t\t\t\t\tel.textContent = state.originalText\n\t\t\t\t\tel.style.webkitLineClamp = ''\n\t\t\t\t\tel.style.display = ''\n\t\t\t\t\tel.style.overflow = ''\n\t\t\t\t\tel.style.cursor = ''\n\t\t\t\t\tstate.expanded = true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tel.addEventListener('click', handler)\n\t\t\tel.style.cursor = 'pointer'\n\t\t\tstate.clickHandler = handler\n\t\t}\n\n\t\t// Handle title\n\t\tif (options.titleBehavior === 'always') {\n\t\t\tel.title = state.originalText\n\t\t} else if (options.titleBehavior === 'auto') {\n\t\t\t// Check if text is actually truncated\n\t\t\tif (isTextTruncated(el)) {\n\t\t\t\tel.title = state.originalText\n\t\t\t}\n\t\t}\n\n\t\t;(el as any).__ellipsis = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: EllipsisState = (el as any).__ellipsis\n\n\t\tif (!state) {\n\t\t\tconst options = normalizeOptions(binding.value)\n\t\t\tapplyEllipsis(el, options)\n\t\t\treturn\n\t\t}\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst textChanged = el.textContent !== state.originalText\n\n\t\tif (textChanged) {\n\t\t\tstate.originalText = el.textContent || ''\n\t\t\tstate.expanded = false\n\t\t}\n\n\t\t// Update click handler if expandable changed\n\t\tif (state.options.expandable !== newOptions.expandable) {\n\t\t\tif (state.clickHandler) {\n\t\t\t\tel.removeEventListener('click', state.clickHandler)\n\t\t\t\tstate.clickHandler = null\n\t\t\t}\n\n\t\t\tif (newOptions.expandable) {\n\t\t\t\tconst handler = (): void => {\n\t\t\t\t\tif (state.expanded) {\n\t\t\t\t\t\tapplyEllipsis(el, newOptions)\n\t\t\t\t\t\tstate.expanded = false\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel.textContent = state.originalText\n\t\t\t\t\t\tel.style.webkitLineClamp = ''\n\t\t\t\t\t\tel.style.display = ''\n\t\t\t\t\t\tel.style.overflow = ''\n\t\t\t\t\t\tstate.expanded = true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tel.addEventListener('click', handler)\n\t\t\t\tel.style.cursor = 'pointer'\n\t\t\t\tstate.clickHandler = handler\n\t\t\t} else {\n\t\t\t\tel.style.cursor = ''\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\n\t\t// Reapply ellipsis if not expanded\n\t\tif (!state.expanded) {\n\t\t\tapplyEllipsis(el, newOptions)\n\t\t}\n\n\t\t// Update title\n\t\tif (newOptions.titleBehavior === 'always') {\n\t\t\tel.title = state.originalText\n\t\t} else if (newOptions.titleBehavior === 'auto') {\n\t\t\tel.title = isTextTruncated(el) ? state.originalText : ''\n\t\t} else {\n\t\t\tel.removeAttribute('title')\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: EllipsisState | undefined = (el as any).__ellipsis\n\n\t\tif (!state) return\n\n\t\tif (state.clickHandler) {\n\t\t\tel.removeEventListener('click', state.clickHandler)\n\t\t}\n\n\t\t// Clean up styles\n\t\tel.style.removeProperty('-webkit-line-clamp')\n\t\tel.style.removeProperty('-webkit-box-orient')\n\t\tel.style.removeProperty('display')\n\t\tel.style.removeProperty('overflow')\n\t\tel.style.removeProperty('text-overflow')\n\t\tel.style.removeProperty('white-space')\n\t\tel.style.removeProperty('cursor')\n\n\t\tdelete (el as any).__ellipsis\n\t},\n})\n\n/**\n * Apply ellipsis styles to element\n */\nfunction applyEllipsis(el: HTMLElement, options: EllipsisOptions): void {\n\tconst lines = options.lines || 1\n\n\tif (lines === 1) {\n\t\t// Single line ellipsis\n\t\tel.style.overflow = 'hidden'\n\t\tel.style.textOverflow = 'ellipsis'\n\t\tel.style.whiteSpace = 'nowrap'\n\t} else {\n\t\t// Multi-line ellipsis\n\t\tel.style.display = '-webkit-box'\n\t\tel.style.overflow = 'hidden'\n\t\tel.style.webkitBoxOrient = 'vertical'\n\t\tel.style.webkitLineClamp = String(lines)\n\t}\n}\n\n/**\n * Check if text is truncated\n */\nfunction isTextTruncated(el: HTMLElement): boolean {\n\treturn el.scrollWidth > el.clientWidth || el.scrollHeight > el.clientHeight\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: EllipsisBinding | undefined): EllipsisOptions {\n\tif (typeof binding === 'number') {\n\t\treturn {\n\t\t\tlines: binding,\n\t\t\tellipsis: '...',\n\t\t\texpandable: false,\n\t\t\ttitleBehavior: 'auto',\n\t\t}\n\t}\n\n\treturn {\n\t\tlines: binding?.lines ?? 1,\n\t\tellipsis: binding?.ellipsis ?? '...',\n\t\texpandable: binding?.expandable ?? false,\n\t\ttitleBehavior: binding?.titleBehavior ?? 'auto',\n\t}\n}\n\nexport default vEllipsis\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Focus directive options\n */\nexport interface FocusOptions {\n\t/**\n\t * Whether to auto focus\n\t * @default true\n\t */\n\tfocus?: boolean\n\n\t/**\n\t * Whether to refocus when binding value changes\n\t * @default false\n\t */\n\trefocus?: boolean\n\n\t/**\n\t * Callback when focused\n\t */\n\tonFocus?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when blurred\n\t */\n\tonBlur?: (el: HTMLElement) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type FocusBinding = boolean | FocusOptions\n\n/**\n * Element state storage\n */\ninterface FocusState {\n\toptions: FocusOptions\n\thandleFocus: () => void\n\thandleBlur: () => void\n\tlastValue: FocusBinding\n}\n\nconst FOCUSABLE_TAGS = new Set(['input', 'textarea', 'select', 'button'])\n\n/**\n * Compare two values for equality (supports primitive types and shallow object comparison)\n */\nfunction isEqual(a: unknown, b: unknown): boolean {\n\tif (a === b) return true\n\tif (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n\tconst objA = a as Record<string, unknown>\n\tconst objB = b as Record<string, unknown>\n\tconst keysA = Object.keys(objA)\n\tconst keysB = Object.keys(objB)\n\n\tif (keysA.length !== keysB.length) return false\n\n\treturn keysA.every(key => objA[key] === objB[key])\n}\n\n/**\n * v-focus directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-focus />\n * <input v-focus=\"{ focus: true, refocus: true }\" />\n * </template>\n * ```\n */\nexport const vFocus = defineDirective<FocusBinding, HTMLElement>({\n\tname: 'focus',\n\tssr: true, // SSR safe - will skip focus on server\n\tdefaults: {\n\t\tfocus: true,\n\t\trefocus: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!options.focus || !isFocusable(el)) {\n\t\t\tif (options.focus) {\n\t\t\t\tconsole.warn('[Directix] v-focus: Element is not focusable')\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tconst handleFocus = (): void => options.onFocus?.(el)\n\t\tconst handleBlur = (): void => options.onBlur?.(el)\n\n\t\tel.addEventListener('focus', handleFocus)\n\t\tel.addEventListener('blur', handleBlur)\n\n\t\t;(el as any).__focus = {\n\t\t\toptions,\n\t\t\thandleFocus,\n\t\t\thandleBlur,\n\t\t\tlastValue: binding.value,\n\t\t} as FocusState\n\n\t\tel.focus()\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: FocusState | undefined = (el as any).__focus\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Update event listeners only when callbacks change\n\t\tif (newOptions.onFocus !== state.options.onFocus) {\n\t\t\tel.removeEventListener('focus', state.handleFocus)\n\t\t\tstate.handleFocus = () => newOptions.onFocus?.(el)\n\t\t\tel.addEventListener('focus', state.handleFocus)\n\t\t}\n\n\t\tif (newOptions.onBlur !== state.options.onBlur) {\n\t\t\tel.removeEventListener('blur', state.handleBlur)\n\t\t\tstate.handleBlur = () => newOptions.onBlur?.(el)\n\t\t\tel.addEventListener('blur', state.handleBlur)\n\t\t}\n\n\t\t// Check if value actually changed\n\t\tconst valueChanged = !isEqual(binding.value, state.lastValue)\n\n\t\t// Refocus when value changes and refocus is enabled\n\t\tif (newOptions.refocus && newOptions.focus && valueChanged) {\n\t\t\tel.focus()\n\t\t}\n\n\t\tstate.options = newOptions\n\t\tstate.lastValue = binding.value\n\t},\n\n\tunmounted(el) {\n\t\tconst state: FocusState | undefined = (el as any).__focus\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('focus', state.handleFocus)\n\t\tel.removeEventListener('blur', state.handleBlur)\n\t\tdelete (el as any).__focus\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: FocusBinding | undefined): FocusOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { focus: binding, refocus: false }\n\t}\n\n\treturn {\n\t\tfocus: true,\n\t\trefocus: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if element is focusable\n */\nfunction isFocusable(el: HTMLElement): boolean {\n\tif (!isBrowser()) return false\n\n\tconst tagName = el.tagName.toLowerCase()\n\n\t// Form elements\n\tif (FOCUSABLE_TAGS.has(tagName)) {\n\t\treturn !(el as HTMLInputElement).disabled\n\t}\n\n\t// Contenteditable elements\n\tif (el.isContentEditable) return true\n\n\t// Elements with tabindex\n\tconst tabindex = el.getAttribute('tabindex')\n\n\tif (tabindex != null) return tabindex !== '-1'\n\n\t// Link elements\n\tif (tagName === 'a' || tagName === 'area') {\n\t\treturn el.hasAttribute('href')\n\t}\n\n\treturn false\n}\n\nexport default vFocus\n","import { defineDirective } from '@directix/core'\n\nexport type HotkeyHandler = (event: KeyboardEvent) => void\n\nexport type ModifierKey = 'ctrl' | 'alt' | 'shift' | 'meta'\n\nexport interface HotkeyDefinition {\n\tkey: string\n\tmodifiers?: ModifierKey[]\n\thandler: HotkeyHandler\n\tprevent?: boolean\n\tstop?: boolean\n\tdisabled?: boolean\n\tglobal?: boolean\n}\n\nexport type HotkeyBinding\n\t= | HotkeyHandler\n\t\t| HotkeyDefinition\n\t\t| HotkeyDefinition[]\n\t\t| Record<string, HotkeyHandler | HotkeyDefinition>\n\ninterface HotkeyEntry {\n\tkey: string\n\tmodifiers: Set<ModifierKey>\n\thandler: HotkeyHandler\n\tprevent: boolean\n\tstop: boolean\n\tdisabled: boolean\n}\n\ninterface HotkeyState {\n\tentries: HotkeyEntry[]\n\thandler: (event: KeyboardEvent) => void\n}\n\nconst KEY_ALIASES: Record<string, string> = {\n\tesc: 'escape',\n\tspace: ' ',\n\tup: 'arrowup',\n\tdown: 'arrowdown',\n\tleft: 'arrowleft',\n\tright: 'arrowright',\n\tenter: 'enter',\n\ttab: 'tab',\n\tdelete: 'delete',\n\tbackspace: 'backspace',\n\tinsert: 'insert',\n\thome: 'home',\n\tend: 'end',\n\tpagedown: 'pagedown',\n\tpageup: 'pageup',\n\tf1: 'f1',\n\tf2: 'f2',\n\tf3: 'f3',\n\tf4: 'f4',\n\tf5: 'f5',\n\tf6: 'f6',\n\tf7: 'f7',\n\tf8: 'f8',\n\tf9: 'f9',\n\tf10: 'f10',\n\tf11: 'f11',\n\tf12: 'f12',\n}\n\nconst MODIFIER_KEYS = new Set(['ctrl', 'alt', 'shift', 'meta'])\n\nfunction normalizeKey(key: string): string {\n\tconst lowerKey = key.toLowerCase()\n\treturn KEY_ALIASES[lowerKey] || lowerKey\n}\n\nfunction parseHotkeyString(hotkey: string): { key: string, modifiers: ModifierKey[] } {\n\tconst parts = hotkey.toLowerCase().split(/[+.]/)\n\tconst modifiers: ModifierKey[] = []\n\tlet key = ''\n\n\tfor (const part of parts) {\n\t\tif (MODIFIER_KEYS.has(part)) {\n\t\t\tmodifiers.push(part as ModifierKey)\n\t\t} else {\n\t\t\tkey = normalizeKey(part)\n\t\t}\n\t}\n\n\treturn { key, modifiers }\n}\n\nfunction matchesHotkey(event: KeyboardEvent, entry: HotkeyEntry): boolean {\n\tif (normalizeKey(event.key) !== entry.key) return false\n\n\tconst eventModifiers = new Set<ModifierKey>()\n\tif (event.ctrlKey) eventModifiers.add('ctrl')\n\tif (event.altKey) eventModifiers.add('alt')\n\tif (event.shiftKey) eventModifiers.add('shift')\n\tif (event.metaKey) eventModifiers.add('meta')\n\n\tif (eventModifiers.size !== entry.modifiers.size) return false\n\n\tfor (const mod of entry.modifiers) {\n\t\tif (!eventModifiers.has(mod)) return false\n\t}\n\n\treturn true\n}\n\nfunction createEntry(\n\tkey: string,\n\tmodifiers: ModifierKey[],\n\thandler: HotkeyHandler,\n\toptions: { prevent?: boolean, stop?: boolean, disabled?: boolean } = {},\n): HotkeyEntry {\n\treturn {\n\t\tkey: normalizeKey(key),\n\t\tmodifiers: new Set(modifiers),\n\t\thandler,\n\t\tprevent: options.prevent ?? true,\n\t\tstop: options.stop ?? true,\n\t\tdisabled: options.disabled ?? false,\n\t}\n}\n\nfunction normalizeBinding(\n\tbinding: HotkeyBinding,\n\targ: string | undefined,\n\tmodifiers: Record<string, boolean>,\n): HotkeyEntry[] {\n\t// Argument syntax: v-hotkey:ctrl.s=\"handler\" or v-hotkey:escape=\"handler\"\n\tif (arg) {\n\t\tconst argLower = arg.toLowerCase()\n\t\tconst argIsModifier = MODIFIER_KEYS.has(argLower)\n\n\t\tlet key: string\n\t\tconst parsedModifiers: ModifierKey[] = []\n\n\t\tif (argIsModifier) {\n\t\t\t// v-hotkey:ctrl.s -> arg is modifier, key in directive modifiers\n\t\t\tparsedModifiers.push(argLower as ModifierKey)\n\t\t\tfor (const mod of Object.keys(modifiers)) {\n\t\t\t\tconst modLower = mod.toLowerCase()\n\t\t\t\tif (MODIFIER_KEYS.has(modLower)) {\n\t\t\t\t\tparsedModifiers.push(modLower as ModifierKey)\n\t\t\t\t} else {\n\t\t\t\t\tkey = normalizeKey(mod)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// v-hotkey:escape -> arg is the key\n\t\t\tconst parsed = parseHotkeyString(arg)\n\t\t\tkey = parsed.key\n\t\t\tparsedModifiers.push(...parsed.modifiers)\n\t\t\tfor (const mod of Object.keys(modifiers)) {\n\t\t\t\tconst modLower = mod.toLowerCase()\n\t\t\t\tif (MODIFIER_KEYS.has(modLower)) {\n\t\t\t\t\tparsedModifiers.push(modLower as ModifierKey)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst handler = typeof binding === 'function' ? binding : (binding as HotkeyDefinition).handler\n\t\treturn [createEntry(key!, parsedModifiers, handler)]\n\t}\n\n\t// Function without arg - invalid\n\tif (typeof binding === 'function') {\n\t\tconsole.warn('[Directix] v-hotkey: hotkey definition required (use v-hotkey:ctrl.s=\"handler\")')\n\t\treturn []\n\t}\n\n\t// Array syntax: [{ key: 's', modifiers: ['ctrl'], handler }]\n\tif (Array.isArray(binding)) {\n\t\treturn binding.map(item =>\n\t\t\tcreateEntry(item.key, item.modifiers || [], item.handler, {\n\t\t\t\tprevent: item.prevent,\n\t\t\t\tstop: item.stop,\n\t\t\t\tdisabled: item.disabled,\n\t\t\t}),\n\t\t)\n\t}\n\n\t// Object syntax\n\tif (typeof binding === 'object' && binding !== null) {\n\t\t// Single HotkeyDefinition: { key: 's', handler }\n\t\tif ('handler' in binding && typeof binding.handler === 'function') {\n\t\t\tconst def = binding as HotkeyDefinition\n\t\t\treturn [createEntry(def.key, def.modifiers || [], def.handler, def)]\n\t\t}\n\n\t\t// Record syntax: { 'ctrl+s': handler }\n\t\tconst entries: HotkeyEntry[] = []\n\t\tfor (const [hotkeyStr, value] of Object.entries(binding)) {\n\t\t\tconst { key, modifiers: parsedModifiers } = parseHotkeyString(hotkeyStr)\n\t\t\tconst handler = typeof value === 'function' ? value : value.handler\n\t\t\tconst options = typeof value === 'object' ? value : {}\n\t\t\tentries.push(createEntry(key, parsedModifiers, handler, options))\n\t\t}\n\t\treturn entries\n\t}\n\n\treturn []\n}\n\nfunction createKeydownHandler(state: HotkeyState) {\n\treturn (event: KeyboardEvent) => {\n\t\tfor (const entry of state.entries) {\n\t\t\tif (entry.disabled) continue\n\t\t\tif (!matchesHotkey(event, entry)) continue\n\n\t\t\tif (entry.prevent) event.preventDefault()\n\t\t\tif (entry.stop) event.stopPropagation()\n\t\t\tentry.handler(event)\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunction setupState(el: HTMLElement, entries: HotkeyEntry[]): HotkeyState | null {\n\tif (entries.length === 0) return null\n\n\tconst state: HotkeyState = { entries, handler: null as any }\n\tstate.handler = createKeydownHandler(state)\n\n\tel.tabIndex = el.tabIndex || -1\n\tel.addEventListener('keydown', state.handler)\n\t;(el as any).__hotkey = state\n\n\treturn state\n}\n\nexport const vHotkey = defineDirective<HotkeyBinding, HTMLElement>({\n\tname: 'hotkey',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst entries = normalizeBinding(binding.value, binding.arg, binding.modifiers)\n\t\tsetupState(el, entries)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: HotkeyState | undefined = (el as any).__hotkey\n\t\tconst newEntries = normalizeBinding(binding.value, binding.arg, binding.modifiers)\n\n\t\tif (state) {\n\t\t\tstate.entries = newEntries\n\t\t} else {\n\t\t\tsetupState(el, newEntries)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: HotkeyState | undefined = (el as any).__hotkey\n\t\tif (!state) return\n\n\t\tel.removeEventListener('keydown', state.handler)\n\t\tdelete (el as any).__hotkey\n\t},\n})\n\nexport default vHotkey\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Hover state change handler\n */\nexport type HoverHandler = (isHovering: boolean, event: MouseEvent) => void\n\n/**\n * Hover directive options\n */\nexport interface HoverOptions {\n\t/**\n\t * Callback when hover state changes\n\t */\n\thandler?: HoverHandler\n\n\t/**\n\t * Callback when mouse enters\n\t */\n\tonEnter?: (event: MouseEvent) => void\n\n\t/**\n\t * Callback when mouse leaves\n\t */\n\tonLeave?: (event: MouseEvent) => void\n\n\t/**\n\t * CSS class to add when hovering\n\t * @default 'v-hover'\n\t */\n\tclass?: string\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Delay in milliseconds before triggering enter\n\t * @default 0\n\t */\n\tenterDelay?: number\n\n\t/**\n\t * Delay in milliseconds before triggering leave\n\t * @default 0\n\t */\n\tleaveDelay?: number\n}\n\n/**\n * Directive binding value type\n */\nexport type HoverBinding = HoverHandler | HoverOptions\n\n/**\n * Element state storage\n */\ninterface HoverState {\n\toptions: HoverOptions\n\tisHovering: boolean\n\tenterTimerId: ReturnType<typeof setTimeout> | null\n\tleaveTimerId: ReturnType<typeof setTimeout> | null\n\tenterHandler: (e: Event) => void\n\tleaveHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: HoverBinding | undefined): HoverOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, class: 'v-hover' }\n\t}\n\n\treturn {\n\t\tclass: 'v-hover',\n\t\tdisabled: false,\n\t\tenterDelay: 0,\n\t\tleaveDelay: 0,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-hover directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-hover=\"handleHover\">Hover me</div>\n * <div v-hover=\"{ onEnter: handleEnter, onLeave: handleLeave, class: 'is-hovering' }\">Hover me</div>\n * </template>\n * ```\n */\nexport const vHover = defineDirective<HoverBinding, HTMLElement>({\n\tname: 'hover',\n\tssr: false,\n\tdefaults: {\n\t\tclass: 'v-hover',\n\t\tdisabled: false,\n\t\tenterDelay: 0,\n\t\tleaveDelay: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst state: HoverState = {\n\t\t\toptions,\n\t\t\tisHovering: false,\n\t\t\tenterTimerId: null,\n\t\t\tleaveTimerId: null,\n\t\t\tenterHandler: () => {},\n\t\t\tleaveHandler: () => {},\n\t\t}\n\n\t\t// Enter handler\n\t\tstate.enterHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent\n\n\t\t\t// Clear leave timer if exists\n\t\t\tif (state.leaveTimerId) {\n\t\t\t\tclearTimeout(state.leaveTimerId)\n\t\t\t\tstate.leaveTimerId = null\n\t\t\t}\n\n\t\t\t// If already hovering, do nothing\n\t\t\tif (state.isHovering) return\n\n\t\t\t// Handle enter delay\n\t\t\tif (options.enterDelay && options.enterDelay > 0) {\n\t\t\t\tstate.enterTimerId = setTimeout(() => {\n\t\t\t\t\tstate.isHovering = true\n\t\t\t\t\tapplyHoverState(el, state, event)\n\t\t\t\t}, options.enterDelay)\n\t\t\t} else {\n\t\t\t\tstate.isHovering = true\n\t\t\t\tapplyHoverState(el, state, event)\n\t\t\t}\n\t\t}\n\n\t\t// Leave handler\n\t\tstate.leaveHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent\n\n\t\t\t// Clear enter timer if exists\n\t\t\tif (state.enterTimerId) {\n\t\t\t\tclearTimeout(state.enterTimerId)\n\t\t\t\tstate.enterTimerId = null\n\t\t\t}\n\n\t\t\t// If not hovering, do nothing\n\t\t\tif (!state.isHovering) return\n\n\t\t\t// Handle leave delay\n\t\t\tif (options.leaveDelay && options.leaveDelay > 0) {\n\t\t\t\tstate.leaveTimerId = setTimeout(() => {\n\t\t\t\t\tstate.isHovering = false\n\t\t\t\t\tapplyLeaveState(el, state, event)\n\t\t\t\t}, options.leaveDelay)\n\t\t\t} else {\n\t\t\t\tstate.isHovering = false\n\t\t\t\tapplyLeaveState(el, state, event)\n\t\t\t}\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__hover = state\n\n\t\t// Bind events\n\t\ton(el, 'mouseenter', state.enterHandler)\n\t\ton(el, 'mouseleave', state.leaveHandler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: HoverState = (el as any).__hover\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Was enabled, now disabled - remove class and listeners\n\t\t\tel.classList.remove(state.options.class || 'v-hover')\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Was disabled, now enabled - re-add listeners (already bound)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: HoverState = (el as any).__hover\n\n\t\tif (!state) return\n\n\t\t// Clear timers\n\t\tif (state.enterTimerId) {\n\t\t\tclearTimeout(state.enterTimerId)\n\t\t}\n\n\t\tif (state.leaveTimerId) {\n\t\t\tclearTimeout(state.leaveTimerId)\n\t\t}\n\n\t\t// Unbind events\n\t\toff(el, 'mouseenter', state.enterHandler)\n\t\toff(el, 'mouseleave', state.leaveHandler)\n\n\t\t// Remove class\n\t\tel.classList.remove(state.options.class || 'v-hover')\n\n\t\tdelete (el as any).__hover\n\t},\n})\n\n/**\n * Apply hover state\n */\nfunction applyHoverState(el: HTMLElement, state: HoverState, e: MouseEvent): void {\n\tconst { options } = state\n\n\t// Add class\n\tif (options.class) {\n\t\tel.classList.add(options.class)\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('hover:enter', { detail: { event: e } }))\n\n\t// Trigger callbacks\n\toptions.onEnter?.(e)\n\toptions.handler?.(true, e)\n}\n\n/**\n * Apply leave state\n */\nfunction applyLeaveState(el: HTMLElement, state: HoverState, e: MouseEvent): void {\n\tconst { options } = state\n\n\t// Remove class\n\tif (options.class) {\n\t\tel.classList.remove(options.class)\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('hover:leave', { detail: { event: e } }))\n\n\t// Trigger callbacks\n\toptions.onLeave?.(e)\n\toptions.handler?.(false, e)\n}\n\nexport default vHover\n","import { defineDirective } from '@directix/core'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Image preview options\n */\nexport interface ImagePreviewOptions {\n\t/** Image source URL */\n\tsrc?: string\n\t/** Preview image source URL (higher resolution) */\n\tpreviewSrc?: string\n\t/** Alt text for accessibility */\n\talt?: string\n\t/** Whether preview is disabled @default false */\n\tdisabled?: boolean\n\t/** Close on click outside @default true */\n\tcloseOnClickOutside?: boolean\n\t/** Close on escape key @default true */\n\tcloseOnEsc?: boolean\n\t/** Show close button @default true */\n\tshowCloseButton?: boolean\n\t/** Z-index of the preview overlay @default 9999 */\n\tzIndex?: number\n\t/** Custom class for the preview overlay */\n\tclass?: string\n\t/** Enable pinch zoom on mobile @default true */\n\tenablePinchZoom?: boolean\n\t/** Enable double tap to zoom @default true */\n\tenableDoubleTap?: boolean\n\t/** Enable swipe up to close @default true */\n\tenableSwipeClose?: boolean\n\t/** Show zoom indicator @default true */\n\tshowZoomIndicator?: boolean\n\t/** Minimum zoom scale @default 0.5 */\n\tminScale?: number\n\t/** Maximum zoom scale @default 5 */\n\tmaxScale?: number\n\t/** Callback when preview opens */\n\tonOpen?: () => void\n\t/** Callback when preview closes */\n\tonClose?: () => void\n}\n\nexport type ImagePreviewBinding = string | ImagePreviewOptions\n\ninterface TransformState {\n\tscale: number\n\ttranslateX: number\n\ttranslateY: number\n}\n\ninterface GestureState {\n\tisDragging: boolean\n\tstartX: number\n\tstartY: number\n\tstartDistance: number\n\tstartScale: number\n\tlastTapTime: number\n\tswipeStartY: number\n}\n\ninterface PreviewState {\n\toptions: ImagePreviewOptions\n\toverlay: HTMLElement | null\n\timageContainer: HTMLElement | null\n\timage: HTMLImageElement | null\n\tisOpen: boolean\n\ttransform: TransformState\n\tgesture: GestureState\n\thandlers: {\n\t\tclick: () => void\n\t\tesc: ((e: KeyboardEvent) => void) | null\n\t\ttouchStart: ((e: TouchEvent) => void) | null\n\t\ttouchMove: ((e: TouchEvent) => void) | null\n\t\ttouchEnd: ((e: TouchEvent) => void) | null\n\t\tmouseDown: ((e: MouseEvent) => void) | null\n\t\tmouseMove: ((e: MouseEvent) => void) | null\n\t\tmouseUp: ((e: MouseEvent) => void) | null\n\t\twheel: ((e: WheelEvent) => void) | null\n\t}\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULTS = {\n\tminScale: 0.5,\n\tmaxScale: 5,\n\tdoubleTapZoom: 2.5,\n\tswipeThreshold: 100,\n\ttapTimeout: 300,\n\tanimationDuration: 300,\n\thintDuration: 3000,\n\tzoomIndicatorDuration: 1500,\n} as const\n\nlet globalZIndex = 9999\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction getDistance(x1: number, y1: number, x2: number, y2: number): number {\n\treturn Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n\treturn Math.max(min, Math.min(max, value))\n}\n\n// ============================================================================\n// UI Components\n// ============================================================================\n\nfunction createOverlay(options: ImagePreviewOptions): {\n\toverlay: HTMLElement\n\timageContainer: HTMLElement\n\timage: HTMLImageElement\n} {\n\tconst zIndex = options.zIndex ?? ++globalZIndex\n\n\t// Main overlay\n\tconst overlay = document.createElement('div')\n\toverlay.className = 'v-image-preview-overlay'\n\tif (options.class) overlay.classList.add(options.class)\n\n\tObject.assign(overlay.style, {\n\t\tposition: 'fixed',\n\t\tinset: '0',\n\t\tbackground: 'rgba(0, 0, 0, 0.95)',\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tzIndex: String(zIndex),\n\t\tcursor: 'zoom-out',\n\t\topacity: '0',\n\t\ttransition: 'opacity 0.3s',\n\t\ttouchAction: 'none',\n\t\toverflow: 'hidden',\n\t})\n\n\t// Image container\n\tconst imageContainer = document.createElement('div')\n\tObject.assign(imageContainer.style, {\n\t\tposition: 'relative',\n\t\ttransformOrigin: 'center center',\n\t\ttransition: 'transform 0.1s ease-out',\n\t\twillChange: 'transform',\n\t})\n\n\t// Image element\n\tconst image = document.createElement('img')\n\timage.src = options.previewSrc || options.src || ''\n\timage.alt = options.alt || ''\n\tObject.assign(image.style, {\n\t\tmaxWidth: '95vw',\n\t\tmaxHeight: '90vh',\n\t\tobjectFit: 'contain',\n\t\tcursor: 'grab',\n\t\tuserSelect: 'none',\n\t\tWebkitUserDrag: 'none',\n\t})\n\timage.addEventListener('dragstart', e => e.preventDefault())\n\n\timageContainer.appendChild(image)\n\n\t// Close button\n\tif (options.showCloseButton !== false) {\n\t\tconst closeBtn = document.createElement('button')\n\t\tcloseBtn.className = 'v-image-preview-close'\n\t\tcloseBtn.innerHTML = '×'\n\t\tcloseBtn.setAttribute('aria-label', 'Close preview')\n\n\t\tObject.assign(closeBtn.style, {\n\t\t\tposition: 'fixed',\n\t\t\ttop: '16px',\n\t\t\tright: '16px',\n\t\t\twidth: '44px',\n\t\t\theight: '44px',\n\t\t\tborder: 'none',\n\t\t\tbackground: 'rgba(255, 255, 255, 0.15)',\n\t\t\tcolor: 'white',\n\t\t\tfontSize: '28px',\n\t\t\tcursor: 'pointer',\n\t\t\tborderRadius: '50%',\n\t\t\ttransition: 'background 0.2s, transform 0.2s',\n\t\t\tzIndex: String(zIndex + 1),\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t\tjustifyContent: 'center',\n\t\t\tbackdropFilter: 'blur(10px)',\n\t\t\tWebkitBackdropFilter: 'blur(10px)',\n\t\t})\n\n\t\tconst setBtnStyle = (bg: string, scale: string): void => {\n\t\t\tcloseBtn.style.background = bg\n\t\t\tcloseBtn.style.transform = scale\n\t\t}\n\n\t\tcloseBtn.addEventListener('mouseenter', () => setBtnStyle('rgba(255, 255, 255, 0.25)', 'scale(1.1)'))\n\t\tcloseBtn.addEventListener('mouseleave', () => setBtnStyle('rgba(255, 255, 255, 0.15)', 'scale(1)'))\n\t\tcloseBtn.addEventListener('touchstart', () => setBtnStyle('rgba(255, 255, 255, 0.35)', 'scale(1.15)'), { passive: true })\n\t\tcloseBtn.addEventListener('touchend', () => setBtnStyle('rgba(255, 255, 255, 0.15)', 'scale(1)'), { passive: true })\n\n\t\toverlay.appendChild(closeBtn)\n\t}\n\n\t// Zoom indicator\n\tif (options.showZoomIndicator !== false) {\n\t\tconst zoomIndicator = document.createElement('div')\n\t\tzoomIndicator.className = 'v-image-preview-zoom'\n\t\tzoomIndicator.textContent = '100%'\n\n\t\tObject.assign(zoomIndicator.style, {\n\t\t\tposition: 'fixed',\n\t\t\tbottom: '24px',\n\t\t\tleft: '50%',\n\t\t\ttransform: 'translateX(-50%)',\n\t\t\tbackground: 'rgba(0, 0, 0, 0.6)',\n\t\t\tcolor: 'white',\n\t\t\tpadding: '8px 16px',\n\t\t\tborderRadius: '20px',\n\t\t\tfontSize: '14px',\n\t\t\tfontWeight: '500',\n\t\t\topacity: '0',\n\t\t\ttransition: 'opacity 0.3s',\n\t\t\tzIndex: String(zIndex + 1),\n\t\t\tbackdropFilter: 'blur(10px)',\n\t\t\tWebkitBackdropFilter: 'blur(10px)',\n\t\t})\n\n\t\toverlay.appendChild(zoomIndicator)\n\t}\n\n\t// Hint\n\tconst hint = document.createElement('div')\n\thint.className = 'v-image-preview-hint'\n\thint.textContent = 'Pinch to zoom • Double tap • Swipe up to close'\n\n\tObject.assign(hint.style, {\n\t\tposition: 'fixed',\n\t\tbottom: '60px',\n\t\tleft: '50%',\n\t\ttransform: 'translateX(-50%)',\n\t\tcolor: 'rgba(255, 255, 255, 0.6)',\n\t\tfontSize: '12px',\n\t\topacity: '1',\n\t\ttransition: 'opacity 0.5s',\n\t\tzIndex: String(zIndex + 1),\n\t\tpointerEvents: 'none',\n\t})\n\n\toverlay.appendChild(hint)\n\tsetTimeout(() => (hint.style.opacity = '0'), DEFAULTS.hintDuration)\n\n\toverlay.appendChild(imageContainer)\n\n\treturn { overlay, imageContainer, image }\n}\n\n// ============================================================================\n// Transform Helpers\n// ============================================================================\n\ninterface TransformManager {\n\tupdateTransform: (animate?: boolean) => void\n\tresetTransform: () => void\n\tconstrainScale: (newScale: number) => number\n\tconstrainTranslate: (x: number, y: number) => { x: number, y: number }\n}\n\nfunction createTransformManager(state: PreviewState): TransformManager {\n\tconst updateTransform = (animate = false): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tconst { scale, translateX, translateY } = state.transform\n\t\tstate.imageContainer.style.transition = animate ? 'transform 0.2s ease-out' : 'none'\n\t\tstate.imageContainer.style.transform = `translate(${translateX}px, ${translateY}px) scale(${scale})`\n\n\t\t// Update zoom indicator\n\t\tconst zoomIndicator = state.overlay?.querySelector('.v-image-preview-zoom') as HTMLElement | null\n\t\tif (zoomIndicator) {\n\t\t\tzoomIndicator.textContent = `${Math.round(scale * 100)}%`\n\t\t\tzoomIndicator.style.opacity = '1'\n\n\t\t\tclearTimeout((zoomIndicator as any)._hideTimer)\n\t\t\t;(zoomIndicator as any)._hideTimer = setTimeout(() => {\n\t\t\t\tzoomIndicator.style.opacity = '0'\n\t\t\t}, DEFAULTS.zoomIndicatorDuration)\n\t\t}\n\t}\n\n\tconst resetTransform = (): void => {\n\t\tstate.transform = { scale: 1, translateX: 0, translateY: 0 }\n\t\tupdateTransform(true)\n\t}\n\n\tconst constrainScale = (newScale: number): number => {\n\t\tconst { minScale = DEFAULTS.minScale, maxScale = DEFAULTS.maxScale } = state.options\n\t\treturn clamp(newScale, minScale, maxScale)\n\t}\n\n\tconst constrainTranslate = (x: number, y: number): { x: number, y: number } => {\n\t\tconst { scale } = state.transform\n\t\tif (!state.image || scale <= 1) return { x: 0, y: 0 }\n\n\t\tconst rect = state.image.getBoundingClientRect()\n\t\tconst maxX = (rect.width * (scale - 1)) / 2\n\t\tconst maxY = (rect.height * (scale - 1)) / 2\n\n\t\treturn {\n\t\t\tx: clamp(x, -maxX, maxX),\n\t\t\ty: clamp(y, -maxY, maxY),\n\t\t}\n\t}\n\n\treturn { updateTransform, resetTransform, constrainScale, constrainTranslate }\n}\n\n// ============================================================================\n// Gesture Handlers\n// ============================================================================\n\ninterface GestureHandlers {\n\thandleTouchStart: (e: TouchEvent) => void\n\thandleTouchMove: (e: TouchEvent) => void\n\thandleTouchEnd: (e: TouchEvent) => void\n\thandleMouseDown: (e: MouseEvent) => void\n\thandleMouseMove: (e: MouseEvent) => void\n\thandleMouseUp: () => void\n\thandleWheel: (e: WheelEvent) => void\n}\n\nfunction createGestureHandlers(\n\tstate: PreviewState,\n\ttransformManager: TransformManager,\n\tclosePreview: () => void,\n): GestureHandlers {\n\tconst { updateTransform, resetTransform, constrainScale, constrainTranslate } = transformManager\n\n\tconst handleTouchStart = (e: TouchEvent): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tconst now = Date.now()\n\t\tconst { gesture, transform, options } = state\n\n\t\tif (e.touches.length === 1) {\n\t\t\t// Double tap detection\n\t\t\tif (options.enableDoubleTap !== false && now - gesture.lastTapTime < DEFAULTS.tapTimeout) {\n\t\t\t\te.preventDefault()\n\t\t\t\ttransform.scale = transform.scale > 1 ? 1 : constrainScale(DEFAULTS.doubleTapZoom)\n\t\t\t\tgesture.lastTapTime = 0\n\t\t\t\tupdateTransform(true)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tgesture.lastTapTime = now\n\t\t\tgesture.isDragging = true\n\t\t\tgesture.startX = e.touches[0].clientX - transform.translateX\n\t\t\tgesture.startY = e.touches[0].clientY - transform.translateY\n\t\t\tgesture.swipeStartY = e.touches[0].clientY\n\t\t} else if (e.touches.length === 2 && options.enablePinchZoom !== false) {\n\t\t\tgesture.isDragging = false\n\t\t\tgesture.startDistance = getDistance(\n\t\t\t\te.touches[0].clientX,\n\t\t\t\te.touches[0].clientY,\n\t\t\t\te.touches[1].clientX,\n\t\t\t\te.touches[1].clientY,\n\t\t\t)\n\t\t\tgesture.startScale = transform.scale\n\t\t}\n\t}\n\n\tconst handleTouchMove = (e: TouchEvent): void => {\n\t\tif (!state.imageContainer) return\n\t\te.preventDefault()\n\n\t\tconst { gesture, transform, options } = state\n\n\t\tif (e.touches.length === 1 && gesture.isDragging) {\n\t\t\tconst newX = e.touches[0].clientX - gesture.startX\n\t\t\tconst newY = e.touches[0].clientY - gesture.startY\n\t\t\tconst constrained = constrainTranslate(newX, newY)\n\n\t\t\ttransform.translateX = constrained.x\n\t\t\ttransform.translateY = constrained.y\n\t\t\tupdateTransform(false)\n\t\t} else if (e.touches.length === 2 && options.enablePinchZoom !== false) {\n\t\t\tconst currentDistance = getDistance(\n\t\t\t\te.touches[0].clientX,\n\t\t\t\te.touches[0].clientY,\n\t\t\t\te.touches[1].clientX,\n\t\t\t\te.touches[1].clientY,\n\t\t\t)\n\n\t\t\ttransform.scale = constrainScale(gesture.startScale * (currentDistance / gesture.startDistance))\n\t\t\tupdateTransform(false)\n\t\t}\n\t}\n\n\tconst handleTouchEnd = (e: TouchEvent): void => {\n\t\tconst { gesture, transform, options } = state\n\t\tgesture.isDragging = false\n\n\t\t// Swipe up to close\n\t\tif (options.enableSwipeClose !== false && e.changedTouches.length === 1 && transform.scale <= 1) {\n\t\t\tconst deltaY = e.changedTouches[0].clientY - gesture.swipeStartY\n\t\t\tif (deltaY < -DEFAULTS.swipeThreshold) {\n\t\t\t\tclosePreview()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\t// Snap back if scale < 1\n\t\tif (transform.scale < 1) {\n\t\t\tresetTransform()\n\t\t}\n\t}\n\n\tconst handleMouseDown = (e: MouseEvent): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tstate.gesture.isDragging = true\n\t\tstate.gesture.startX = e.clientX - state.transform.translateX\n\t\tstate.gesture.startY = e.clientY - state.transform.translateY\n\t\tstate.imageContainer.style.cursor = 'grabbing'\n\t}\n\n\tconst handleMouseMove = (e: MouseEvent): void => {\n\t\tif (!state.gesture.isDragging || !state.imageContainer) return\n\n\t\tconst newX = e.clientX - state.gesture.startX\n\t\tconst newY = e.clientY - state.gesture.startY\n\t\tconst constrained = constrainTranslate(newX, newY)\n\n\t\tstate.transform.translateX = constrained.x\n\t\tstate.transform.translateY = constrained.y\n\t\tupdateTransform(false)\n\t}\n\n\tconst handleMouseUp = (): void => {\n\t\tstate.gesture.isDragging = false\n\t\tif (state.imageContainer) {\n\t\t\tstate.imageContainer.style.cursor = 'grab'\n\t\t}\n\t}\n\n\tconst handleWheel = (e: WheelEvent): void => {\n\t\tif (!state.imageContainer || state.options.enablePinchZoom === false) return\n\t\te.preventDefault()\n\n\t\tconst delta = e.deltaY > 0 ? 0.9 : 1.1\n\t\tstate.transform.scale = constrainScale(state.transform.scale * delta)\n\t\tupdateTransform(false)\n\n\t\t// Reset if too small\n\t\tif (state.transform.scale < 0.8) {\n\t\t\tsetTimeout(resetTransform, 100)\n\t\t}\n\t}\n\n\treturn { handleTouchStart, handleTouchMove, handleTouchEnd, handleMouseDown, handleMouseMove, handleMouseUp, handleWheel }\n}\n\n// ============================================================================\n// Normalize Options\n// ============================================================================\n\nfunction normalizeOptions(binding: ImagePreviewBinding, el: HTMLElement): ImagePreviewOptions {\n\tconst elSrc = el.tagName === 'IMG' ? (el as HTMLImageElement).src : undefined\n\tconst elPreviewSrc = el.getAttribute('data-preview') || undefined\n\tconst elAlt = el.tagName === 'IMG' ? (el as HTMLImageElement).alt : el.getAttribute('alt') || undefined\n\n\tif (typeof binding === 'string') {\n\t\treturn {\n\t\t\tsrc: binding,\n\t\t\tpreviewSrc: elPreviewSrc,\n\t\t\talt: elAlt,\n\t\t\tenablePinchZoom: true,\n\t\t\tenableDoubleTap: true,\n\t\t\tenableSwipeClose: true,\n\t\t\tshowZoomIndicator: true,\n\t\t\tshowCloseButton: true,\n\t\t\tcloseOnClickOutside: true,\n\t\t\tcloseOnEsc: true,\n\t\t\tminScale: DEFAULTS.minScale,\n\t\t\tmaxScale: DEFAULTS.maxScale,\n\t\t}\n\t}\n\n\treturn {\n\t\tsrc: binding?.src || elSrc,\n\t\tpreviewSrc: binding?.previewSrc || elPreviewSrc,\n\t\talt: binding?.alt || elAlt,\n\t\tdisabled: binding?.disabled ?? false,\n\t\tcloseOnClickOutside: binding?.closeOnClickOutside ?? true,\n\t\tcloseOnEsc: binding?.closeOnEsc ?? true,\n\t\tshowCloseButton: binding?.showCloseButton ?? true,\n\t\tzIndex: binding?.zIndex,\n\t\tclass: binding?.class,\n\t\tenablePinchZoom: binding?.enablePinchZoom ?? true,\n\t\tenableDoubleTap: binding?.enableDoubleTap ?? true,\n\t\tenableSwipeClose: binding?.enableSwipeClose ?? true,\n\t\tshowZoomIndicator: binding?.showZoomIndicator ?? true,\n\t\tminScale: binding?.minScale ?? DEFAULTS.minScale,\n\t\tmaxScale: binding?.maxScale ?? DEFAULTS.maxScale,\n\t\tonOpen: binding?.onOpen,\n\t\tonClose: binding?.onClose,\n\t}\n}\n\n// ============================================================================\n// Directive\n// ============================================================================\n\n/**\n * v-image-preview directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage -->\n * <img v-image-preview src=\"thumbnail.jpg\" data-preview=\"full.jpg\" />\n *\n * <!-- With options -->\n * <img v-image-preview=\"{ src: 'thumbnail.jpg', previewSrc: 'full.jpg' }\" />\n *\n * <!-- On non-img element -->\n * <div v-image-preview=\"{ src: 'image.jpg' }\">Click to preview</div>\n * </template>\n * ```\n */\nexport const vImagePreview = defineDirective<ImagePreviewBinding, HTMLElement>({\n\tname: 'image-preview',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, el)\n\n\t\tconst state: PreviewState = {\n\t\t\toptions,\n\t\t\toverlay: null,\n\t\t\timageContainer: null,\n\t\t\timage: null,\n\t\t\tisOpen: false,\n\t\t\ttransform: { scale: 1, translateX: 0, translateY: 0 },\n\t\t\tgesture: {\n\t\t\t\tisDragging: false,\n\t\t\t\tstartX: 0,\n\t\t\t\tstartY: 0,\n\t\t\t\tstartDistance: 0,\n\t\t\t\tstartScale: 1,\n\t\t\t\tlastTapTime: 0,\n\t\t\t\tswipeStartY: 0,\n\t\t\t},\n\t\t\thandlers: {\n\t\t\t\tclick: () => {},\n\t\t\t\tesc: null,\n\t\t\t\ttouchStart: null,\n\t\t\t\ttouchMove: null,\n\t\t\t\ttouchEnd: null,\n\t\t\t\tmouseDown: null,\n\t\t\t\tmouseMove: null,\n\t\t\t\tmouseUp: null,\n\t\t\t\twheel: null,\n\t\t\t},\n\t\t}\n\n\t\t;(el as any).__imagePreview = state\n\n\t\tif (options.disabled) return\n\t\tel.style.cursor = 'zoom-in'\n\n\t\t// Transform manager\n\t\tconst transformManager = createTransformManager(state)\n\n\t\t// Close preview\n\t\tconst closePreview = (): void => {\n\t\t\tif (!state.isOpen || !state.overlay) return\n\n\t\t\tstate.overlay.style.opacity = '0'\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!state.overlay) return\n\n\t\t\t\tstate.overlay.remove()\n\t\t\t\tstate.overlay = null\n\t\t\t\tstate.imageContainer = null\n\t\t\t\tstate.image = null\n\t\t\t\tstate.isOpen = false\n\t\t\t\tstate.transform = { scale: 1, translateX: 0, translateY: 0 }\n\t\t\t\tdocument.body.style.overflow = ''\n\n\t\t\t\t// Cleanup handlers\n\t\t\t\tconst { handlers } = state\n\t\t\t\tif (handlers.esc) document.removeEventListener('keydown', handlers.esc)\n\t\t\t\tif (handlers.touchStart) document.removeEventListener('touchstart', handlers.touchStart)\n\t\t\t\tif (handlers.touchMove) document.removeEventListener('touchmove', handlers.touchMove)\n\t\t\t\tif (handlers.touchEnd) document.removeEventListener('touchend', handlers.touchEnd)\n\t\t\t\tif (handlers.mouseDown) document.removeEventListener('mousedown', handlers.mouseDown)\n\t\t\t\tif (handlers.mouseMove) document.removeEventListener('mousemove', handlers.mouseMove)\n\t\t\t\tif (handlers.mouseUp) document.removeEventListener('mouseup', handlers.mouseUp)\n\t\t\t\tif (handlers.wheel) document.removeEventListener('wheel', handlers.wheel)\n\n\t\t\t\tstate.options.onClose?.()\n\t\t\t}, DEFAULTS.animationDuration)\n\t\t}\n\n\t\t// Gesture handlers\n\t\tconst gestureHandlers = createGestureHandlers(state, transformManager, closePreview)\n\n\t\t// Open preview\n\t\tconst openPreview = (): void => {\n\t\t\tif (state.isOpen || state.options.disabled) return\n\n\t\t\tconst { overlay, imageContainer, image } = createOverlay(state.options)\n\t\t\tstate.overlay = overlay\n\t\t\tstate.imageContainer = imageContainer\n\t\t\tstate.image = image\n\t\t\tstate.isOpen = true\n\n\t\t\tdocument.body.appendChild(overlay)\n\t\t\tdocument.body.style.overflow = 'hidden'\n\n\t\t\trequestAnimationFrame(() => (overlay.style.opacity = '1'))\n\n\t\t\t// Store handlers\n\t\t\tstate.handlers.touchStart = gestureHandlers.handleTouchStart\n\t\t\tstate.handlers.touchMove = gestureHandlers.handleTouchMove\n\t\t\tstate.handlers.touchEnd = gestureHandlers.handleTouchEnd\n\t\t\tstate.handlers.mouseDown = gestureHandlers.handleMouseDown\n\t\t\tstate.handlers.mouseMove = gestureHandlers.handleMouseMove\n\t\t\tstate.handlers.mouseUp = gestureHandlers.handleMouseUp\n\t\t\tstate.handlers.wheel = gestureHandlers.handleWheel\n\n\t\t\t// Touch events\n\t\t\toverlay.addEventListener('touchstart', gestureHandlers.handleTouchStart, { passive: false })\n\t\t\toverlay.addEventListener('touchmove', gestureHandlers.handleTouchMove, { passive: false })\n\t\t\toverlay.addEventListener('touchend', gestureHandlers.handleTouchEnd, { passive: true })\n\n\t\t\t// Mouse events\n\t\t\timage.addEventListener('mousedown', gestureHandlers.handleMouseDown)\n\t\t\tdocument.addEventListener('mousemove', gestureHandlers.handleMouseMove)\n\t\t\tdocument.addEventListener('mouseup', gestureHandlers.handleMouseUp)\n\n\t\t\t// Wheel zoom\n\t\t\toverlay.addEventListener('wheel', gestureHandlers.handleWheel, { passive: false })\n\n\t\t\t// Close button\n\t\t\toverlay.querySelector('.v-image-preview-close')?.addEventListener('click', e => {\n\t\t\t\te.stopPropagation()\n\t\t\t\tclosePreview()\n\t\t\t})\n\n\t\t\t// Click outside\n\t\t\tif (state.options.closeOnClickOutside !== false) {\n\t\t\t\toverlay.addEventListener('click', () => {\n\t\t\t\t\tif (state.transform.scale <= 1) {\n\t\t\t\t\t\tclosePreview()\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttransformManager.resetTransform()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Escape key\n\t\t\tif (state.options.closeOnEsc !== false) {\n\t\t\t\tstate.handlers.esc = e => {\n\t\t\t\t\tif (e.key === 'Escape') {\n\t\t\t\t\t\tstate.transform.scale > 1 ? transformManager.resetTransform() : closePreview()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdocument.addEventListener('keydown', state.handlers.esc)\n\t\t\t}\n\n\t\t\tstate.options.onOpen?.()\n\t\t}\n\n\t\tstate.handlers.click = openPreview\n\t\tel.addEventListener('click', openPreview)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__imagePreview as PreviewState | undefined\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value, el)\n\t\tel.style.cursor = state.options.disabled ? '' : 'zoom-in'\n\t},\n\n\tunmounted(el) {\n\t\tconst state = (el as any).__imagePreview as PreviewState | undefined\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handlers.click)\n\n\t\tif (state.isOpen && state.overlay) {\n\t\t\tstate.overlay.remove()\n\t\t\tdocument.body.style.overflow = ''\n\t\t}\n\n\t\tif (state.handlers.esc) document.removeEventListener('keydown', state.handlers.esc)\n\t\tif (state.handlers.touchStart) document.removeEventListener('touchstart', state.handlers.touchStart)\n\t\tif (state.handlers.touchMove) document.removeEventListener('touchmove', state.handlers.touchMove)\n\t\tif (state.handlers.touchEnd) document.removeEventListener('touchend', state.handlers.touchEnd)\n\t\tif (state.handlers.mouseDown) document.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\tif (state.handlers.mouseMove) document.removeEventListener('mousemove', state.handlers.mouseMove)\n\t\tif (state.handlers.mouseUp) document.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\tif (state.handlers.wheel) document.removeEventListener('wheel', state.handlers.wheel)\n\n\t\tdelete (el as any).__imagePreview\n\t},\n})\n\nexport default vImagePreview\n","import { defineDirective, isBrowser, supportsIntersectionObserver } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\n/**\n * Infinite scroll handler\n */\nexport type InfiniteScrollHandler = () => void | Promise<void>\n\n/**\n * Infinite scroll directive options\n */\nexport interface InfiniteScrollOptions {\n\t/**\n\t * Handler to call when scrolling to bottom\n\t * @required\n\t */\n\thandler: InfiniteScrollHandler\n\n\t/**\n\t * Distance from bottom to trigger load (in pixels)\n\t * @default 0\n\t */\n\tdistance?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether currently loading\n\t * @default false\n\t */\n\tloading?: boolean\n\n\t/**\n\t * Whether to use IntersectionObserver (more efficient)\n\t * @default true\n\t */\n\tuseIntersection?: boolean\n\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 200\n\t */\n\tthrottle?: number\n\n\t/**\n\t * Custom scroll container\n\t */\n\tcontainer?: string | Element | null\n\n\t/**\n\t * Callback when load starts\n\t */\n\tonLoadStart?: () => void\n\n\t/**\n\t * Callback when load completes\n\t */\n\tonLoadEnd?: () => void\n\n\t/**\n\t * Callback on error\n\t */\n\tonError?: (error: Error) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type InfiniteScrollBinding = InfiniteScrollHandler | InfiniteScrollOptions\n\n/**\n * Element state storage\n */\ninterface InfiniteScrollState {\n\toptions: InfiniteScrollOptions\n\tscrollHandler: (e: Event) => void\n\tcontainer: Element | Window\n\tsentinel: HTMLDivElement | null\n\tobserver: IntersectionObserver | null\n\tthrottleTimer: ReturnType<typeof setTimeout> | null\n\tisLoading: boolean\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: InfiniteScrollBinding | undefined): InfiniteScrollOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, distance: 0, throttle: 200, useIntersection: true }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-infinite-scroll: handler is required')\n\t}\n\n\treturn {\n\t\tdistance: 0,\n\t\tdisabled: false,\n\t\tloading: false,\n\t\tuseIntersection: true,\n\t\tthrottle: 200,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-infinite-scroll directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-infinite-scroll=\"loadMore\" class=\"scroll-container\">\n * <div v-for=\"item in items\" :key=\"item.id\">{{ item.name }}</div>\n * </div>\n *\n * <div v-infinite-scroll=\"{ handler: loadMore, distance: 100, disabled: isLoading }\">\n * <div v-for=\"item in items\" :key=\"item.id\">{{ item.name }}</div>\n * </div>\n * </template>\n * ```\n */\nexport const vInfiniteScroll = defineDirective<InfiniteScrollBinding, HTMLElement>({\n\tname: 'infinite-scroll',\n\tssr: false,\n\tdefaults: {\n\t\tdistance: 0,\n\t\tdisabled: false,\n\t\tloading: false,\n\t\tuseIntersection: true,\n\t\tthrottle: 200,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Determine scroll container\n\t\tlet container: Element | Window\n\n\t\tif (options.container) {\n\t\t\tif (typeof options.container === 'string') {\n\t\t\t\tconst found = document.querySelector(options.container)\n\n\t\t\t\tcontainer = found || getScrollParent(el)\n\t\t\t} else {\n\t\t\t\tcontainer = options.container\n\t\t\t}\n\t\t} else {\n\t\t\tcontainer = getScrollParent(el)\n\t\t}\n\n\t\tconst state: InfiniteScrollState = {\n\t\t\toptions,\n\t\t\tcontainer,\n\t\t\tsentinel: null,\n\t\t\tobserver: null,\n\t\t\tthrottleTimer: null,\n\t\t\tisLoading: false,\n\t\t\tscrollHandler: async (_e: Event) => {\n\t\t\t\tif (state.isLoading || state.options.disabled || state.options.loading) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Throttle\n\t\t\t\tif (state.throttleTimer) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tstate.throttleTimer = setTimeout(() => {\n\t\t\t\t\tstate.throttleTimer = null\n\t\t\t\t}, options.throttle)\n\n\t\t\t\t// Check scroll position\n\t\t\t\tconst shouldLoad = checkShouldLoad(container, el, options.distance || 0)\n\n\t\t\t\tif (shouldLoad) {\n\t\t\t\t\tawait triggerLoad(state, el)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__infiniteScroll = state\n\n\t\t// Use IntersectionObserver if available and enabled\n\t\tif (options.useIntersection && supportsIntersectionObserver()) {\n\t\t\tsetupIntersectionObserver(el, state)\n\t\t} else {\n\t\t\t// Use scroll event listener\n\t\t\ton(container, 'scroll', state.scrollHandler, { passive: true })\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: InfiniteScrollState = (el as any).__infiniteScroll\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: InfiniteScrollState = (el as any).__infiniteScroll\n\n\t\tif (!state) return\n\n\t\t// Clear throttle timer\n\t\tif (state.throttleTimer) {\n\t\t\tclearTimeout(state.throttleTimer)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\t// Remove sentinel\n\t\tif (state.sentinel && state.sentinel.parentNode) {\n\t\t\tstate.sentinel.parentNode.removeChild(state.sentinel)\n\t\t}\n\n\t\t// Remove scroll listener\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\n\t\tdelete (el as any).__infiniteScroll\n\t},\n})\n\n/**\n * Check if should load more\n */\nfunction checkShouldLoad(container: Element | Window, _el: HTMLElement, distance: number): boolean {\n\tif (container === window) {\n\t\tconst scrollTop = window.scrollY || document.documentElement.scrollTop\n\t\tconst scrollHeight = document.documentElement.scrollHeight\n\t\tconst clientHeight = window.innerHeight\n\n\t\treturn scrollTop + clientHeight >= scrollHeight - distance\n\t}\n\n\tconst el = container as Element\n\tconst scrollTop = el.scrollTop\n\tconst scrollHeight = el.scrollHeight\n\tconst clientHeight = el.clientHeight\n\n\treturn scrollTop + clientHeight >= scrollHeight - distance\n}\n\n/**\n * Trigger load handler\n */\nasync function triggerLoad(state: InfiniteScrollState, el: HTMLElement): Promise<void> {\n\tstate.isLoading = true\n\tstate.options.onLoadStart?.()\n\n\tel.classList.add('v-infinite-scroll--loading')\n\n\ttry {\n\t\tawait state.options.handler()\n\t} catch (err) {\n\t\tstate.options.onError?.(err as Error)\n\t} finally {\n\t\tstate.isLoading = false\n\t\tstate.options.onLoadEnd?.()\n\t\tel.classList.remove('v-infinite-scroll--loading')\n\t}\n}\n\n/**\n * Setup IntersectionObserver\n */\nfunction setupIntersectionObserver(el: HTMLElement, state: InfiniteScrollState): void {\n\t// Create sentinel element\n\tconst sentinel = document.createElement('div')\n\n\tsentinel.className = 'v-infinite-scroll__sentinel'\n\tsentinel.style.cssText = `\n height: 1px;\n width: 100%;\n clear: both;\n `\n\n\tel.appendChild(sentinel)\n\tstate.sentinel = sentinel\n\n\t// Create observer\n\tstate.observer = new IntersectionObserver(\n\t\tasync entries => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tif (!state.isLoading && !state.options.disabled && !state.options.loading) {\n\t\t\t\t\t\tawait triggerLoad(state, el)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\troot: state.container === window ? null : (state.container as Element),\n\t\t\trootMargin: `${state.options.distance || 0}px`,\n\t\t\tthreshold: 0,\n\t\t},\n\t)\n\n\tstate.observer.observe(sentinel)\n}\n\nexport default vInfiniteScroll\n","import { defineDirective, isBrowser, supportsIntersectionObserver } from '@directix/core'\n\n/**\n * Intersect event handler\n */\nexport type IntersectHandler = (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\n/**\n * Intersect directive options\n */\nexport interface IntersectOptions {\n\t/** Callback when element intersects */\n\thandler?: IntersectHandler\n\t/** Callback when element enters viewport */\n\tonEnter?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\t/** Callback when element leaves viewport */\n\tonLeave?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\t/** Callback when element changes intersection */\n\tonChange?: (isIntersecting: boolean, entry: IntersectionObserverEntry) => void\n\t/** Root element for intersection @default null (viewport) */\n\troot?: Element | null\n\t/** Margin around the root @default '0px' */\n\trootMargin?: string\n\t/** Threshold(s) at which to trigger callback @default 0 */\n\tthreshold?: number | number[]\n\t/** Whether to disable @default false */\n\tdisabled?: boolean\n\t/** Whether to trigger only once @default false */\n\tonce?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type IntersectBinding = IntersectHandler | IntersectOptions\n\n/**\n * Element state storage\n */\ninterface IntersectState {\n\toptions: IntersectOptions\n\tobserver: IntersectionObserver | null\n\thasTriggeredOnce: boolean\n}\n\nconst STATE_KEY = '__intersect'\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: IntersectBinding | undefined): IntersectOptions {\n\tconst options: IntersectOptions = typeof binding === 'function' ? { handler: binding } : { ...binding }\n\n\t// Unref root if it's a ref object (for Vue Composition API)\n\tif (options.root !== null && typeof options.root === 'object' && 'value' in options.root) {\n\t\toptions.root = (options.root as { value: Element | null }).value\n\t}\n\n\treturn options\n}\n\n/**\n * Create observer callback\n */\nfunction createObserverCallback(\n\tel: HTMLElement,\n\tstate: IntersectState,\n\toptions: IntersectOptions,\n): (entries: IntersectionObserverEntry[]) => void {\n\treturn entries => {\n\t\tfor (const entry of entries) {\n\t\t\tif (options.once && state.hasTriggeredOnce) continue\n\n\t\t\tconst { isIntersecting } = entry\n\n\t\t\toptions.handler?.(entry, state.observer!)\n\t\t\toptions.onChange?.(isIntersecting, entry)\n\n\t\t\tif (isIntersecting) {\n\t\t\t\toptions.onEnter?.(entry, state.observer!)\n\t\t\t\tif (options.once) state.hasTriggeredOnce = true\n\t\t\t} else {\n\t\t\t\toptions.onLeave?.(entry, state.observer!)\n\t\t\t}\n\n\t\t\tel.dispatchEvent(new CustomEvent('intersect', { detail: { isIntersecting, entry } }))\n\t\t}\n\t}\n}\n\n/**\n * Create IntersectionObserver\n */\nfunction createObserver(\n\tel: HTMLElement,\n\tstate: IntersectState,\n\toptions: IntersectOptions,\n): IntersectionObserver {\n\treturn new IntersectionObserver(createObserverCallback(el, state, options), {\n\t\troot: options.root,\n\t\trootMargin: options.rootMargin,\n\t\tthreshold: options.threshold,\n\t})\n}\n\n/**\n * v-intersect directive\n *\n * @example\n * ```vue\n * <div v-intersect=\"handleIntersect\">Observe me</div>\n * <div v-intersect=\"{ onEnter: handleEnter, onLeave: handleLeave }\">Track visibility</div>\n * <div v-intersect=\"{ threshold: 0.5, once: true }\">Trigger once at 50%</div>\n * ```\n */\nexport const vIntersect = defineDirective<IntersectBinding, HTMLElement>({\n\tname: 'intersect',\n\tssr: false,\n\tdefaults: {\n\t\tdisabled: false,\n\t\tonce: false,\n\t\trootMargin: '0px',\n\t\tthreshold: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser() || !supportsIntersectionObserver()) {\n\t\t\tif (!supportsIntersectionObserver()) {\n\t\t\t\tconsole.warn('[Directix] v-intersect: IntersectionObserver not supported')\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tconst state: IntersectState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t\thasTriggeredOnce: false,\n\t\t}\n\n\t\tstate.observer = createObserver(el, state, options)\n\t\t;(el as any)[STATE_KEY] = state\n\t\tstate.observer.observe(el)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: IntersectState | undefined = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst observerOptionsChanged\n\t\t\t= newOptions.root !== state.options.root\n\t\t\t\t|| newOptions.rootMargin !== state.options.rootMargin\n\t\t\t\t|| newOptions.threshold !== state.options.threshold\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled !== state.options.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\tstate.observer?.disconnect()\n\t\t\t} else {\n\t\t\t\tstate.observer?.observe(el)\n\t\t\t}\n\t\t}\n\n\t\t// Recreate observer if options changed\n\t\tif (observerOptionsChanged) {\n\t\t\tstate.observer?.disconnect()\n\t\t\tstate.observer = createObserver(el, state, newOptions)\n\t\t\tstate.observer.observe(el)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: IntersectState | undefined = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tstate.observer?.disconnect()\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vIntersect\n","import { defineDirective, supportsIntersectionObserver } from '@directix/core'\n\n/**\n * Lazy loading state\n */\nexport type LazyState = 'pending' | 'loading' | 'loaded' | 'error'\n\n/**\n * Lazy directive options\n */\nexport interface LazyOptions {\n\t/**\n\t * Image source URL\n\t */\n\tsrc?: string\n\n\t/**\n\t * Placeholder image URL\n\t */\n\tplaceholder?: string\n\n\t/**\n\t * Error image URL (shown when loading fails)\n\t */\n\terror?: string\n\n\t/**\n\t * Preload distance in pixels\n\t * @default 0\n\t */\n\tpreload?: number\n\n\t/**\n\t * Callback when image loads successfully\n\t */\n\tonLoad?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when image fails to load\n\t */\n\tonError?: (el: HTMLElement, error: Error) => void\n\n\t/**\n\t * Number of retry attempts\n\t * @default 1\n\t */\n\tattempt?: number\n\n\t/**\n\t * Filter function, return false to skip loading\n\t */\n\tfilter?: (src: string) => boolean\n\n\t/**\n\t * Custom IntersectionObserver\n\t */\n\tobserver?: IntersectionObserver\n\n\t/**\n\t * Whether to disable lazy loading\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LazyBinding = string | LazyOptions\n\n/**\n * Element state storage\n */\ninterface LazyElementState {\n\toptions: LazyOptions\n\tattempt: number\n\tobserver?: IntersectionObserver\n}\n\n// Global observer instance\nlet globalObserver: IntersectionObserver | null = null\n\n/**\n * Get or create global IntersectionObserver\n */\nfunction getGlobalObserver(preload: number): IntersectionObserver {\n\tif (globalObserver) return globalObserver\n\n\tglobalObserver = new IntersectionObserver(\n\t\tentries => {\n\t\t\tentries.forEach(entry => {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tload(entry.target as HTMLElement)\n\t\t\t\t\tglobalObserver?.unobserve(entry.target)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\trootMargin: `${preload}px`,\n\t\t},\n\t)\n\n\treturn globalObserver\n}\n\n/**\n * Set image source on element\n */\nfunction setSrc(el: HTMLElement, src: string): void {\n\tif (el.tagName === 'IMG') {\n\t\t;(el as HTMLImageElement).src = src\n\t} else {\n\t\tel.style.backgroundImage = `url(\"${src}\")`\n\t}\n}\n\n/**\n * Set lazy state on element\n */\nfunction setLazyState(el: HTMLElement, state: LazyState): void {\n\tel.dataset.lazyState = state\n}\n\n/**\n * Get lazy state from element\n */\nfunction getLazyState(el: HTMLElement): LazyState {\n\treturn (el.dataset.lazyState as LazyState) || 'pending'\n}\n\n/**\n * Load image\n */\nfunction load(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state || !state.options.src) return\n\n\t// Filter check\n\tif (state.options.filter && !state.options.filter(state.options.src)) {\n\t\treturn\n\t}\n\n\tsetLazyState(el, 'loading')\n\tstate.attempt++\n\n\tel.classList.add('v-lazy--loading')\n\n\tconst img = new Image()\n\n\timg.onload = () => {\n\t\tsetSrc(el, state.options.src!)\n\t\tsetLazyState(el, 'loaded')\n\t\tel.classList.remove('v-lazy--loading')\n\t\tel.classList.add('v-lazy--loaded')\n\t\tstate.options.onLoad?.(el)\n\t}\n\n\timg.onerror = () => {\n\t\tel.classList.remove('v-lazy--loading')\n\n\t\t// Check if should retry\n\t\tif (state.attempt < (state.options.attempt || 1)) {\n\t\t\tsetTimeout(() => load(el), 1000 * state.attempt)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Show error image\n\t\tif (state.options.error) {\n\t\t\tsetSrc(el, state.options.error)\n\t\t}\n\n\t\tsetLazyState(el, 'error')\n\t\tel.classList.add('v-lazy--error')\n\t\tstate.options.onError?.(el, new Error('Failed to load image'))\n\t}\n\n\timg.src = state.options.src\n}\n\n/**\n * Observe element\n */\nfunction observe(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state) return\n\n\t// Check IntersectionObserver support\n\tif (!supportsIntersectionObserver()) {\n\t\t// Fallback: load directly\n\t\tload(el)\n\n\t\treturn\n\t}\n\n\t// Use custom observer or global observer\n\tif (state.options.observer) {\n\t\tstate.observer = state.options.observer\n\t\tstate.observer.observe(el)\n\t} else {\n\t\tconst observer = getGlobalObserver(state.options.preload || 0)\n\n\t\tstate.observer = observer\n\t\tobserver.observe(el)\n\t}\n}\n\n/**\n * Unobserve element\n */\nfunction unobserve(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state) return\n\n\tif (state.observer) {\n\t\tstate.observer.unobserve(el)\n\t} else if (globalObserver) {\n\t\tglobalObserver.unobserve(el)\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LazyBinding | undefined): LazyOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { src: binding }\n\t}\n\n\treturn binding || {}\n}\n\n/**\n * v-lazy directive\n *\n * @example\n * ```vue\n * <template>\n * <img v-lazy=\"imageUrl\" />\n * <img v-lazy=\"{ src: imageUrl, placeholder: 'placeholder.jpg' }\" />\n * <div v-lazy=\"backgroundImageUrl\"></div>\n * </template>\n * ```\n */\nexport const vLazy = defineDirective<LazyBinding, HTMLElement>({\n\tname: 'lazy',\n\tssr: false,\n\tdefaults: {\n\t\tpreload: 0,\n\t\tattempt: 1,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\tif (!options.src) {\n\t\t\tconsole.warn('[Directix] v-lazy: No source provided')\n\n\t\t\treturn\n\t\t}\n\n\t\t// Set initial state\n\t\tsetLazyState(el, 'pending')\n\n\t\t// Set placeholder\n\t\tif (options.placeholder) {\n\t\t\tsetSrc(el, options.placeholder)\n\t\t}\n\n\t\t// Add class\n\t\tel.classList.add('v-lazy')\n\n\t\t// Store state\n\t\tconst state: LazyElementState = {\n\t\t\toptions,\n\t\t\tattempt: 0,\n\t\t}\n\n\t\t;(el as any).__lazy = state\n\n\t\t// Start observing\n\t\tobserve(el)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LazyElementState = (el as any).__lazy\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (newOptions.disabled) {\n\t\t\tunobserve(el)\n\n\t\t\treturn\n\t\t}\n\n\t\tif (newOptions.src !== state.options.src) {\n\t\t\tstate.options = newOptions\n\t\t\tstate.attempt = 0\n\n\t\t\t// If already loaded, reload\n\t\t\tif (getLazyState(el) !== 'pending') {\n\t\t\t\tsetLazyState(el, 'pending')\n\t\t\t\tel.classList.remove('v-lazy--loaded', 'v-lazy--error')\n\n\t\t\t\tif (newOptions.placeholder) {\n\t\t\t\t\tsetSrc(el, newOptions.placeholder)\n\t\t\t\t}\n\n\t\t\t\tobserve(el)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tunobserve(el)\n\t\tdelete (el as any).__lazy\n\t},\n})\n\nexport default vLazy\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Loading directive options\n */\nexport interface LoadingOptions {\n\t/**\n\t * Loading state\n\t * @default true\n\t */\n\tvalue?: boolean\n\n\t/**\n\t * Loading text to display\n\t */\n\ttext?: string\n\n\t/**\n\t * CSS class for loading overlay\n\t * @default 'v-loading'\n\t */\n\tloadingClass?: string\n\n\t/**\n\t * CSS class for loading spinner\n\t * @default 'v-loading__spinner'\n\t */\n\tspinnerClass?: string\n\n\t/**\n\t * CSS class for loading text\n\t * @default 'v-loading__text'\n\t */\n\ttextClass?: string\n\n\t/**\n\t * Custom spinner HTML\n\t */\n\tspinner?: string\n\n\t/**\n\t * Background color\n\t * @default 'rgba(255, 255, 255, 0.9)'\n\t */\n\tbackground?: string\n\n\t/**\n\t * Whether to lock scroll while loading\n\t * @default false\n\t */\n\tlock?: boolean\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LoadingBinding = boolean | LoadingOptions\n\n/**\n * Element state storage\n */\ninterface LoadingState {\n\toptions: LoadingOptions\n\tloadingOverlay: HTMLDivElement | null\n\toriginalPosition: string\n\toriginalOverflow: string\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LoadingBinding | undefined): LoadingOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { value: binding }\n\t}\n\n\treturn {\n\t\tvalue: true,\n\t\tloadingClass: 'v-loading',\n\t\tspinnerClass: 'v-loading__spinner',\n\t\ttextClass: 'v-loading__text',\n\t\tbackground: 'rgba(255, 255, 255, 0.9)',\n\t\tlock: false,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Default spinner HTML\n */\nconst DEFAULT_SPINNER = `\n<svg class=\"v-loading__circular\" viewBox=\"25 25 50 50\">\n <circle class=\"v-loading__path\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-width=\"2\" stroke-miterlimit=\"10\"/>\n</svg>\n`\n\n/**\n * Create loading overlay element\n */\nfunction createLoadingOverlay(options: LoadingOptions): HTMLDivElement {\n\tconst overlay = document.createElement('div')\n\n\toverlay.className = options.loadingClass || 'v-loading'\n\toverlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1000;\n background: ${options.background || 'rgba(255, 255, 255, 0.9)'};\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `\n\n\t// Add spinner\n\tconst spinnerHtml = options.spinner || DEFAULT_SPINNER\n\tconst spinnerContainer = document.createElement('div')\n\n\tspinnerContainer.className = options.spinnerClass || 'v-loading__spinner'\n\tspinnerContainer.innerHTML = spinnerHtml\n\toverlay.appendChild(spinnerContainer)\n\n\t// Add text\n\tif (options.text) {\n\t\tconst textEl = document.createElement('div')\n\n\t\ttextEl.className = options.textClass || 'v-loading__text'\n\t\ttextEl.textContent = options.text\n\t\toverlay.appendChild(textEl)\n\t}\n\n\treturn overlay\n}\n\n/**\n * v-loading directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-loading=\"isLoading\">Content</div>\n * <div v-loading=\"{ value: isLoading, text: 'Loading...' }\">Content</div>\n * <div v-loading=\"{ value: isLoading, lock: true }\">Locked scroll while loading</div>\n * </template>\n * ```\n */\nexport const vLoading = defineDirective<LoadingBinding, HTMLElement>({\n\tname: 'loading',\n\tssr: true, // SSR safe - will skip DOM manipulation on server\n\tdefaults: {\n\t\tvalue: true,\n\t\tloadingClass: 'v-loading',\n\t\tspinnerClass: 'v-loading__spinner',\n\t\ttextClass: 'v-loading__text',\n\t\tbackground: 'rgba(255, 255, 255, 0.9)',\n\t\tlock: false,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Ensure element has relative positioning\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tconst originalPosition = el.style.position\n\t\tconst originalOverflow = el.style.overflow\n\n\t\tconst state: LoadingState = {\n\t\t\toptions,\n\t\t\tloadingOverlay: null,\n\t\t\toriginalPosition,\n\t\t\toriginalOverflow,\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__loading = state\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\t// Show loading if value is true\n\t\tif (options.value) {\n\t\t\tshowLoading(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LoadingState = (el as any).__loading\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (newOptions.disabled) {\n\t\t\thideLoading(el, state)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Handle loading state change\n\t\tif (newOptions.value && !state.options.value) {\n\t\t\tshowLoading(el, state)\n\t\t} else if (!newOptions.value && state.options.value) {\n\t\t\thideLoading(el, state)\n\t\t}\n\n\t\t// Update text if changed\n\t\tif (state.loadingOverlay && newOptions.text !== state.options.text) {\n\t\t\tconst textEl = state.loadingOverlay.querySelector(`.${state.options.textClass}`)\n\n\t\t\tif (textEl) {\n\t\t\t\ttextEl.textContent = newOptions.text || ''\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LoadingState = (el as any).__loading\n\n\t\tif (!state) return\n\n\t\thideLoading(el, state)\n\n\t\t// Restore original styles\n\t\tel.style.position = state.originalPosition\n\t\tel.style.overflow = state.originalOverflow\n\n\t\tdelete (el as any).__loading\n\t},\n})\n\n/**\n * Show loading overlay\n */\nfunction showLoading(el: HTMLElement, state: LoadingState): void {\n\tif (state.loadingOverlay) return\n\n\t// Create and append overlay\n\tstate.loadingOverlay = createLoadingOverlay(state.options)\n\tel.appendChild(state.loadingOverlay)\n\n\t// Lock scroll if needed\n\tif (state.options.lock) {\n\t\tel.style.overflow = 'hidden'\n\t}\n\n\t// Add class\n\tel.classList.add('v-loading--active')\n}\n\n/**\n * Hide loading overlay\n */\nfunction hideLoading(el: HTMLElement, state: LoadingState): void {\n\tif (!state.loadingOverlay) return\n\n\t// Remove overlay\n\tstate.loadingOverlay.remove()\n\tstate.loadingOverlay = null\n\n\t// Restore scroll\n\tif (state.options.lock) {\n\t\tel.style.overflow = state.originalOverflow\n\t}\n\n\t// Remove class\n\tel.classList.remove('v-loading--active')\n}\n\nexport default vLoading\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getEventPosition, off, on } from '@directix/shared'\n\n/**\n * Long press handler\n */\nexport type LongPressHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Long press directive options\n */\nexport interface LongPressOptions {\n\t/**\n\t * Callback when long press is triggered\n\t * @required\n\t */\n\thandler: LongPressHandler\n\n\t/**\n\t * Duration in milliseconds to trigger long press\n\t * @default 500\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Maximum movement distance before canceling\n\t * @default 10\n\t */\n\tdistance?: number\n\n\t/**\n\t * Callback when long press starts (on mousedown/touchstart)\n\t */\n\tonStart?: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Callback when long press is canceled\n\t */\n\tonCancel?: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Callback on each tick during long press\n\t */\n\tonTick?: (remaining: number) => void\n\n\t/**\n\t * Interval for onTick callback in milliseconds\n\t * @default 100\n\t */\n\ttickInterval?: number\n\n\t/**\n\t * Whether to prevent default behavior\n\t * @default true\n\t */\n\tprevent?: boolean\n\n\t/**\n\t * Whether to stop propagation\n\t * @default false\n\t */\n\tstop?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LongPressBinding = LongPressHandler | LongPressOptions\n\n/**\n * Element state storage\n */\ninterface LongPressState {\n\toptions: LongPressOptions\n\ttimerId: ReturnType<typeof setTimeout> | null\n\ttickTimerId: ReturnType<typeof setInterval> | null\n\tstartTime: number\n\tstartPos: { x: number, y: number }\n\tstartHandler: (e: Event) => void\n\tendHandler: (e: Event) => void\n\tmoveHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LongPressBinding | undefined): LongPressOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, duration: 500, distance: 10 }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-long-press: handler is required')\n\t}\n\n\treturn {\n\t\tduration: 500,\n\t\tdistance: 10,\n\t\tdisabled: false,\n\t\tprevent: true,\n\t\tstop: false,\n\t\ttickInterval: 100,\n\t\t...binding,\n\t}\n}\n\n/**\n * Calculate distance between two points\n */\nfunction getDistance(p1: { x: number, y: number }, p2: { x: number, y: number }): number {\n\treturn Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2)\n}\n\n/**\n * v-long-press directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-long-press=\"handleLongPress\">Long Press Me</button>\n * <button v-long-press=\"{ handler: handleLongPress, duration: 1000 }\">1 Second Press</button>\n * </template>\n * ```\n */\nexport const vLongPress = defineDirective<LongPressBinding, HTMLElement>({\n\tname: 'long-press',\n\tssr: false,\n\tdefaults: {\n\t\tduration: 500,\n\t\tdistance: 10,\n\t\tdisabled: false,\n\t\tprevent: true,\n\t\tstop: false,\n\t\ttickInterval: 100,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst state: LongPressState = {\n\t\t\toptions,\n\t\t\ttimerId: null,\n\t\t\ttickTimerId: null,\n\t\t\tstartTime: 0,\n\t\t\tstartPos: { x: 0, y: 0 },\n\t\t\tstartHandler: () => {},\n\t\t\tendHandler: () => {},\n\t\t\tmoveHandler: () => {},\n\t\t}\n\n\t\t// Start handler\n\t\tstate.startHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\n\t\t\t// Prevent context menu on long press\n\t\t\tif (options.prevent) {\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\n\t\t\tif (options.stop) {\n\t\t\t\tevent.stopPropagation()\n\t\t\t}\n\n\t\t\t// Clear any existing timer\n\t\t\tif (state.timerId) {\n\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\tstate.timerId = null\n\t\t\t}\n\n\t\t\tif (state.tickTimerId) {\n\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\tstate.tickTimerId = null\n\t\t\t}\n\n\t\t\t// Store start position\n\t\t\tconst pos = getEventPosition(event)\n\n\t\t\tstate.startPos = { x: pos.x, y: pos.y }\n\t\t\tstate.startTime = Date.now()\n\n\t\t\t// Trigger start callback\n\t\t\toptions.onStart?.(event)\n\n\t\t\t// Start tick timer\n\t\t\tif (options.onTick) {\n\t\t\t\tlet remaining = options.duration!\n\n\t\t\t\tstate.tickTimerId = setInterval(() => {\n\t\t\t\t\tremaining -= options.tickInterval!\n\t\t\t\t\toptions.onTick?.(Math.max(0, remaining))\n\t\t\t\t}, options.tickInterval)\n\t\t\t}\n\n\t\t\t// Start long press timer\n\t\t\tstate.timerId = setTimeout(() => {\n\t\t\t\tif (state.tickTimerId) {\n\t\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\t\tstate.tickTimerId = null\n\t\t\t\t}\n\t\t\t\toptions.handler(event)\n\t\t\t}, options.duration)\n\t\t}\n\n\t\t// End handler\n\t\tstate.endHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\n\t\t\tif (state.timerId) {\n\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\tstate.timerId = null\n\t\t\t}\n\n\t\t\tif (state.tickTimerId) {\n\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\tstate.tickTimerId = null\n\t\t\t}\n\n\t\t\t// Trigger cancel callback if was in progress\n\t\t\tif (state.startTime > 0) {\n\t\t\t\toptions.onCancel?.(event)\n\t\t\t}\n\n\t\t\tstate.startTime = 0\n\t\t}\n\n\t\t// Move handler - cancel if moved too far\n\t\tstate.moveHandler = (e: Event) => {\n\t\t\tif (!state.timerId) return\n\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\t\t\tconst pos = getEventPosition(event)\n\t\t\tconst distance = getDistance(state.startPos, { x: pos.x, y: pos.y })\n\n\t\t\tif (distance > (options.distance || 10)) {\n\t\t\t\tif (state.timerId) {\n\t\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\t\tstate.timerId = null\n\t\t\t\t}\n\n\t\t\t\tif (state.tickTimerId) {\n\t\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\t\tstate.tickTimerId = null\n\t\t\t\t}\n\n\t\t\t\toptions.onCancel?.(event)\n\t\t\t\tstate.startTime = 0\n\t\t\t}\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__longPress = state\n\n\t\t// Bind events - mouse\n\t\ton(el, 'mousedown', state.startHandler)\n\t\ton(el, 'mouseup', state.endHandler)\n\t\ton(el, 'mouseleave', state.endHandler)\n\t\ton(el, 'mousemove', state.moveHandler)\n\n\t\t// Bind events - touch\n\t\ton(el, 'touchstart', state.startHandler, { passive: !options.prevent })\n\t\ton(el, 'touchend', state.endHandler)\n\t\ton(el, 'touchcancel', state.endHandler)\n\t\ton(el, 'touchmove', state.moveHandler, { passive: true })\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LongPressState = (el as any).__longPress\n\n\t\tif (!state) {\n\t\t\t// Re-initialize if not exists\n\t\t\tconst options = normalizeOptions(binding.value)\n\n\t\t\tif (!options.disabled) {\n\t\t\t\t// Re-mount by clearing and re-setting\n\t\t\t\t;(el as any).__longPress = null\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LongPressState = (el as any).__longPress\n\n\t\tif (!state) return\n\n\t\t// Clear timers\n\t\tif (state.timerId) {\n\t\t\tclearTimeout(state.timerId)\n\t\t}\n\n\t\tif (state.tickTimerId) {\n\t\t\tclearInterval(state.tickTimerId)\n\t\t}\n\n\t\t// Unbind events - mouse\n\t\toff(el, 'mousedown', state.startHandler)\n\t\toff(el, 'mouseup', state.endHandler)\n\t\toff(el, 'mouseleave', state.endHandler)\n\t\toff(el, 'mousemove', state.moveHandler)\n\n\t\t// Unbind events - touch\n\t\toff(el, 'touchstart', state.startHandler)\n\t\toff(el, 'touchend', state.endHandler)\n\t\toff(el, 'touchcancel', state.endHandler)\n\t\toff(el, 'touchmove', state.moveHandler)\n\n\t\tdelete (el as any).__longPress\n\t},\n})\n\nexport default vLongPress\n","import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Lowercase directive options\n */\nexport interface LowercaseOptions {\n\t/**\n\t * Transform only the first character\n\t * @default false\n\t */\n\tfirst?: boolean\n\n\t/**\n\t * Transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LowercaseBinding = boolean | LowercaseOptions\n\n/**\n * Transform text to lowercase\n */\nfunction transformText(text: string, options: LowercaseOptions): string {\n\tif (!text) return text\n\n\tif (options.first) {\n\t\treturn text.charAt(0).toLowerCase() + text.slice(1)\n\t}\n\n\treturn text.toLowerCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LowercaseBinding | undefined): LowercaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { first: false, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { first: false, onInput: false }\n\t}\n\n\treturn {\n\t\tfirst: binding.first ?? false,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-lowercase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Transform all characters to lowercase -->\n * <input v-lowercase v-model=\"text\" />\n *\n * <!-- Transform only first character -->\n * <span v-lowercase=\"{ first: true }\">{{ text }}</span>\n * </template>\n * ```\n */\nexport const vLowercase = defineDirective<LowercaseBinding, HTMLElement>({\n\tname: 'lowercase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => transformText(text, options))\n\n\t\t\t;(el as any).__lowercaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = transformText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__lowercaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__lowercaseCleanup\n\t},\n})\n\nexport default vLowercase\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\nconst STATE_KEY = '__mask' as const\n\n/**\n * Mask directive options\n */\nexport interface MaskOptions {\n\t/** Mask pattern: # digit, A letter, N alphanumeric, X any, others as literals */\n\tmask: string\n\t/** Placeholder character @default '_' */\n\tplaceholder?: string\n\t/** Show mask placeholder on focus @default true */\n\tshowPlaceholder?: boolean\n\t/** Show mask on blur @default false */\n\tshowMaskOnBlur?: boolean\n\t/** Clear incomplete on blur @default false */\n\tclearIncomplete?: boolean\n\t/** Disable @default false */\n\tdisabled?: boolean\n\t/** Callback when value changes */\n\tonChange?: (value: string, rawValue: string) => void\n\t/** Callback when mask is complete */\n\tonComplete?: (value: string) => void\n}\n\nexport type MaskBinding = string | MaskOptions\n\ninterface MaskToken {\n\tpattern: RegExp\n\tplaceholder: string\n\tisLiteral: boolean\n}\n\ninterface MaskState {\n\toptions: MaskOptions\n\ttokens: MaskToken[]\n\tplaceholder: string\n\tinputHandler: (e: Event) => void\n\tfocusHandler: () => void\n\tblurHandler: () => void\n}\n\nconst TOKEN_PATTERNS: Record<string, RegExp> = {\n\t'#': /\\d/,\n\tA: /[A-Za-z]/,\n\tN: /[A-Za-z0-9]/,\n\tX: /./,\n}\n\nfunction parseMask(mask: string, placeholder: string): MaskToken[] {\n\treturn [...mask].map(char => {\n\t\tconst pattern = TOKEN_PATTERNS[char]\n\n\t\treturn pattern ? { pattern, placeholder, isLiteral: false } : { pattern: new RegExp(`\\\\${char}`), placeholder: char, isLiteral: true }\n\t})\n}\n\nfunction normalizeOptions(binding: MaskBinding | undefined): MaskOptions {\n\tif (typeof binding === 'string') return { mask: binding, placeholder: '_', showPlaceholder: true }\n\tif (!binding?.mask) throw new Error('[Directix] v-mask: mask is required')\n\n\treturn { placeholder: '_', showPlaceholder: true, showMaskOnBlur: false, clearIncomplete: false, disabled: false, ...binding }\n}\n\nfunction isInput(el: HTMLElement): el is HTMLInputElement | HTMLTextAreaElement {\n\treturn el.tagName === 'INPUT' || el.tagName === 'TEXTAREA'\n}\n\n/**\n * Format value with mask\n */\nfunction formatValue(value: string, tokens: MaskToken[], placeholder: string, showPlaceholder: boolean): string {\n\tlet result = '',\n\t\tvalueIndex = 0\n\n\tfor (const token of tokens) {\n\t\tif (valueIndex >= value.length) {\n\t\t\tresult += token.isLiteral ? token.placeholder : (showPlaceholder ? placeholder : '')\n\t\t\tcontinue\n\t\t}\n\n\t\tconst inputChar = value[valueIndex]\n\n\t\tif (token.isLiteral) {\n\t\t\tif (inputChar === token.placeholder) valueIndex++\n\t\t\tresult += token.placeholder\n\t\t} else if (token.pattern.test(inputChar)) {\n\t\t\tresult += inputChar\n\t\t\tvalueIndex++\n\t\t} else if (inputChar === placeholder) {\n\t\t\tresult += showPlaceholder ? placeholder : ''\n\t\t\tvalueIndex++\n\t\t} else {\n\t\t\tvalueIndex++\n\t\t\t// Re-check this token with next input char - need to decrement in loop\n\t\t}\n\t}\n\n\treturn result\n}\n\n/**\n * Get raw value (without mask literals)\n */\nfunction getRawValue(value: string, tokens: MaskToken[], placeholder: string): string {\n\tlet raw = ''\n\n\tfor (let i = 0; i < value.length && i < tokens.length; i++) {\n\t\tif (!tokens[i].isLiteral && value[i] !== placeholder) {\n\t\t\traw += value[i]\n\t\t}\n\t}\n\n\treturn raw\n}\n\n/**\n * Check if mask is complete\n */\nfunction isComplete(value: string, tokens: MaskToken[], placeholder: string): boolean {\n\tfor (let i = 0; i < tokens.length; i++) {\n\t\tif (!tokens[i].isLiteral && (i >= value.length || value[i] === placeholder)) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n/**\n * Calculate cursor position, skipping literals\n */\nfunction getCursorPos(tokens: MaskToken[], rawCursorPos: number): number {\n\tlet pos = rawCursorPos\n\n\twhile (pos < tokens.length && tokens[pos].isLiteral) {\n\t\tpos++\n\t}\n\n\treturn Math.min(pos, tokens.length)\n}\n\n/**\n * v-mask directive\n *\n * @example\n * ```vue\n * <input v-mask=\"'###-##-####'\" placeholder=\"SSN\" />\n * <input v-mask=\"'(###) ###-####'\" placeholder=\"Phone\" />\n * <input v-mask=\"{ mask: '##/##/####' }\" placeholder=\"Date\" />\n * ```\n */\nexport const vMask = defineDirective<MaskBinding, HTMLInputElement>({\n\tname: 'mask',\n\tssr: false,\n\tdefaults: { placeholder: '_', showPlaceholder: true, showMaskOnBlur: false, clearIncomplete: false, disabled: false },\n\n\tmounted(el, binding) {\n\t\tif (!isInput(el)) {\n\t\t\tconsole.warn('[Directix] v-mask: directive must be used on input or textarea elements')\n\n\t\t\treturn\n\t\t}\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst placeholder = options.placeholder || '_'\n\t\tconst tokens = parseMask(options.mask, placeholder)\n\n\t\tconst inputHandler = (e: Event): void => {\n\t\t\tconst target = e.target as HTMLInputElement\n\t\t\tconst rawValue = target.value\n\t\t\tconst cursorPos = target.selectionStart || 0\n\n\t\t\tconst formatted = formatValue(rawValue, tokens, placeholder, options.showPlaceholder ?? true)\n\n\t\t\tif (formatted !== rawValue) {\n\t\t\t\ttarget.value = formatted\n\t\t\t\ttarget.setSelectionRange(getCursorPos(tokens, cursorPos), getCursorPos(tokens, cursorPos))\n\t\t\t\ttarget.dispatchEvent(new Event('input', { bubbles: true }))\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\toptions.onChange?.(formatted, getRawValue(formatted, tokens, placeholder))\n\t\t\tif (isComplete(formatted, tokens, placeholder)) {\n\t\t\t\toptions.onComplete?.(formatted)\n\t\t\t}\n\t\t}\n\n\t\tconst focusHandler = (): void => {\n\t\t\tif (!el.value && options.showPlaceholder) {\n\t\t\t\tel.value = formatValue('', tokens, placeholder, true)\n\t\t\t}\n\t\t}\n\n\t\tconst blurHandler = (): void => {\n\t\t\tif (!options.showMaskOnBlur && !isComplete(el.value, tokens, placeholder) && options.clearIncomplete) {\n\t\t\t\tel.value = ''\n\t\t\t}\n\t\t}\n\n\t\ton(el, 'input', inputHandler)\n\t\ton(el, 'focus', focusHandler)\n\t\ton(el, 'blur', blurHandler)\n\n\t\t;(el as any)[STATE_KEY] = { options, tokens, placeholder, inputHandler, focusHandler, blurHandler }\n\n\t\tif (el.value) {\n\t\t\tel.value = formatValue(el.value, tokens, placeholder, options.showPlaceholder ?? true)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: MaskState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t\tstate.tokens = parseMask(state.options.mask, state.placeholder)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MaskState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\toff(el, 'input', state.inputHandler)\n\t\toff(el, 'focus', state.focusHandler)\n\t\toff(el, 'blur', state.blurHandler)\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vMask\n","/**\n * Shared utilities for number and money formatting directives\n */\n\n/**\n * Base options shared by number and money formatting\n */\nexport interface NumberFormatOptions {\n\t/** Number of decimal places */\n\tprecision?: number\n\t/** Thousands separator */\n\tseparator?: string\n\t/** Decimal separator */\n\tdecimal?: string\n\t/** Whether to allow negative numbers @default true */\n\tallowNegative?: boolean\n\t/** Minimum value */\n\tmin?: number\n\t/** Maximum value */\n\tmax?: number\n}\n\n/**\n * Format number to string with thousands separator\n */\nexport function formatNumber(value: number, options: NumberFormatOptions): string {\n\tconst { precision = 0, separator = ',', decimal = '.', prefix = '', suffix = '' } = options as any\n\n\tconst fixed = value.toFixed(precision)\n\tconst [intPart, decPart] = fixed.split('.')\n\n\t// Add thousands separator to integer part\n\tconst formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n\n\tlet result = formattedInt\n\n\tif (precision > 0 && decPart) {\n\t\tresult += decimal + decPart\n\t}\n\n\treturn prefix + result + suffix\n}\n\n/**\n * Parse string to number, removing non-numeric characters\n */\nexport function parseToNumber(value: string, decimal: string): number | null {\n\tconst cleaned = value.replace(/[^\\d.-]/g, '').replace(decimal, '.')\n\tconst num = Number.parseFloat(cleaned)\n\n\treturn isNaN(num) ? null : num\n}\n\n/**\n * Clamp value within min/max bounds\n */\nexport function clampValue(value: number, options: NumberFormatOptions): number {\n\tlet result = value\n\n\t// allowNegative defaults to true if not specified\n\tconst allowNegative = options.allowNegative ?? true\n\n\tif (!allowNegative && result < 0) {\n\t\tresult = Math.abs(result)\n\t}\n\tif (options.min !== undefined) result = Math.max(options.min, result)\n\tif (options.max !== undefined) result = Math.min(options.max, result)\n\n\treturn result\n}\n\n/**\n * Calculate cursor position after formatting\n * Preserves cursor position relative to digit count\n */\nexport function calculateCursorPosition(\n\trawValue: string,\n\tformatted: string,\n\tcursorPos: number,\n\tstartOffset: number = 0,\n): number {\n\t// Count digits before cursor in old value\n\tlet digitsBeforeCursor = 0,\n\t\t// Find position after same number of digits in new value\n\t\tdigitCount = 0\n\n\tfor (let i = 0; i < cursorPos && i < rawValue.length; i++) {\n\t\tif (/\\d/.test(rawValue[i])) {\n\t\t\tdigitsBeforeCursor++\n\t\t}\n\t}\n\n\tfor (let i = startOffset; i < formatted.length; i++) {\n\t\tif (/\\d/.test(formatted[i])) {\n\t\t\tdigitCount++\n\t\t}\n\t\tif (digitCount >= digitsBeforeCursor) {\n\t\t\treturn i + 1\n\t\t}\n\t}\n\n\t// Default to end of formatted string\n\treturn formatted.length\n}\n\n/**\n * Setup input element with live formatting\n */\nexport function setupNumberInput(\n\tel: HTMLInputElement | HTMLTextAreaElement,\n\toptions: NumberFormatOptions & { prefix?: string, suffix?: string },\n\tformatFn: (value: number, options: any) => string,\n): () => void {\n\tconst { decimal = '.', prefix = '' } = options\n\tlet isFormatting = false\n\n\tconst onInput = (): void => {\n\t\tif (isFormatting) return\n\n\t\tconst rawValue = el.value\n\t\tconst cursorPos = el.selectionStart || 0\n\n\t\t// Handle empty or just minus\n\t\tif (!rawValue || rawValue === '-') {\n\t\t\treturn\n\t\t}\n\n\t\t// Parse the number\n\t\tconst num = parseToNumber(rawValue, decimal)\n\n\t\tif (num === null) {\n\t\t\tisFormatting = true\n\t\t\tel.value = ''\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\n\t\t\treturn\n\t\t}\n\n\t\t// Format the number\n\t\tconst clamped = clampValue(num, options)\n\t\tconst formatted = formatFn(clamped, options)\n\n\t\tif (formatted !== rawValue) {\n\t\t\tisFormatting = true\n\n\t\t\t// Calculate new cursor position (start after prefix)\n\t\t\tconst startOffset = prefix.length\n\t\t\tconst newCursorPos = calculateCursorPosition(rawValue, formatted, cursorPos, startOffset)\n\n\t\t\tel.value = formatted\n\t\t\tel.setSelectionRange(newCursorPos, newCursorPos)\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\tconst onBlur = (): void => {\n\t\tif (!el.value || el.value === '-') return\n\n\t\tconst num = parseToNumber(el.value, decimal)\n\n\t\tif (num !== null) {\n\t\t\tconst clamped = clampValue(num, options)\n\t\t\tconst formatted = formatFn(clamped, options)\n\n\t\t\tisFormatting = true\n\t\t\tel.value = formatted\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\tel.addEventListener('input', onInput)\n\tel.addEventListener('blur', onBlur)\n\n\t// Initial format\n\tif (el.value) {\n\t\tconst num = parseToNumber(el.value, decimal)\n\n\t\tif (num !== null) {\n\t\t\tconst formatted = formatFn(clampValue(num, options), options)\n\n\t\t\tisFormatting = true\n\t\t\tel.value = formatted\n\t\t\t// Trigger input to sync with v-model\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\treturn () => {\n\t\tel.removeEventListener('input', onInput)\n\t\tel.removeEventListener('blur', onBlur)\n\t}\n}\n","import { defineDirective } from '@directix/core'\nimport { clampValue, type NumberFormatOptions, parseToNumber, setupNumberInput } from '../utils/number'\n\n/**\n * Money directive options\n */\nexport interface MoneyOptions extends NumberFormatOptions {\n\t/** Currency symbol @default '$' */\n\tsymbol?: string\n\t/** Symbol position @default 'before' */\n\tsymbolPosition?: 'before' | 'after'\n}\n\nexport type MoneyBinding = string | MoneyOptions\n\ninterface MoneyState {\n\toptions: MoneyOptions\n\tcleanup: () => void\n}\n\n/**\n * Format number to money string\n */\nfunction formatMoney(value: number, options: MoneyOptions): string {\n\tconst { precision = 2, separator = ',', decimal = '.', symbol = '$', symbolPosition = 'before' } = options\n\n\tconst fixed = value.toFixed(precision)\n\tconst [intPart, decPart] = fixed.split('.')\n\n\t// Add thousands separator\n\tconst formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n\n\tlet result = formattedInt\n\n\tif (precision > 0 && decPart) {\n\t\tresult += decimal + decPart\n\t}\n\n\treturn symbolPosition === 'before' ? symbol + result : result + symbol\n}\n\nexport const vMoney = defineDirective<MoneyBinding, HTMLElement>({\n\tname: 'money',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options: MoneyOptions = typeof binding.value === 'string' ? { symbol: binding.value } : (binding.value ?? {})\n\n\t\t// Set defaults for money\n\t\toptions.precision = options.precision ?? 2\n\n\t\tif (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {\n\t\t\tconst { symbol = '$', symbolPosition = 'before' } = options\n\t\t\t// For money, prefix is the symbol when positioned before\n\t\t\tconst prefix = symbolPosition === 'before' ? symbol : ''\n\t\t\tconst cleanup = setupNumberInput(el as HTMLInputElement, { ...options, prefix }, formatMoney)\n\n\t\t\t;(el as any).__money = { options, cleanup }\n\n\t\t\t// Format initial value after DOM is ready\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst inputEl = el as HTMLInputElement\n\n\t\t\t\tif (inputEl.value) {\n\t\t\t\t\tconst num = parseToNumber(inputEl.value, options.decimal || '.')\n\n\t\t\t\t\tif (num !== null) {\n\t\t\t\t\t\tconst formatted = formatMoney(clampValue(num, options), options)\n\n\t\t\t\t\t\tif (formatted !== inputEl.value) {\n\t\t\t\t\t\t\tinputEl.value = formatted\n\t\t\t\t\t\t\tinputEl.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\t// For non-input elements, format the text content\n\t\t\tlet value: number | null = null\n\n\t\t\tif (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t} else {\n\t\t\t\t// Try to parse from element's text content\n\t\t\t\tconst textContent = el.textContent?.trim()\n\n\t\t\t\tif (textContent) {\n\t\t\t\t\tvalue = parseToNumber(textContent, options.decimal || '.')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatMoney(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options: MoneyOptions = typeof binding.value === 'string' ? { symbol: binding.value } : (binding.value ?? {})\n\n\t\t// Set defaults for money\n\t\toptions.precision = options.precision ?? 2\n\n\t\tconst state: MoneyState | undefined = (el as any).__money\n\n\t\tif (state) {\n\t\t\tstate.options = options\n\t\t} else if (!(el.tagName === 'INPUT' || el.tagName === 'TEXTAREA')) {\n\t\t\t// Only format non-input elements on update\n\t\t\tlet value: number | null = null\n\n\t\t\tif (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatMoney(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MoneyState | undefined = (el as any).__money\n\n\t\tstate?.cleanup()\n\t\tdelete (el as any).__money\n\t},\n})\n\nexport default vMoney\n","import { defineDirective, isBrowser, supportsMutationObserver } from '@directix/core'\n\n/**\n * Mutation change handler\n */\nexport type MutationHandler = (mutations: MutationRecord[], observer: MutationObserver) => void\n\n/**\n * Mutation directive options\n */\nexport interface MutationOptions {\n\t/**\n\t * Callback when mutations occur\n\t * @required\n\t */\n\thandler: MutationHandler\n\n\t/**\n\t * Whether to observe attribute changes\n\t * @default false\n\t */\n\tattributes?: boolean\n\n\t/**\n\t * Specific attributes to observe\n\t */\n\tattributeFilter?: string[]\n\n\t/**\n\t * Whether to observe child node additions/removals\n\t * @default true\n\t */\n\tchildList?: boolean\n\n\t/**\n\t * Whether to observe all descendants, not just direct children\n\t * @default false\n\t */\n\tsubtree?: boolean\n\n\t/**\n\t * Whether to observe character data changes\n\t * @default false\n\t */\n\tcharacterData?: boolean\n\n\t/**\n\t * Whether to record old attribute values\n\t * @default false\n\t */\n\tattributeOldValue?: boolean\n\n\t/**\n\t * Whether to record old character data\n\t * @default false\n\t */\n\tcharacterDataOldValue?: boolean\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type MutationBinding = MutationHandler | MutationOptions\n\n/**\n * Element state storage\n */\ninterface MutationState {\n\toptions: MutationOptions\n\tobserver: MutationObserver | null\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: MutationBinding | undefined): MutationOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, childList: true }\n\t}\n\n\tif (!binding || !binding.handler) {\n\t\tthrow new Error('[Directix] v-mutation: handler is required')\n\t}\n\n\treturn {\n\t\tattributes: false,\n\t\tchildList: true,\n\t\tsubtree: false,\n\t\tcharacterData: false,\n\t\tattributeOldValue: false,\n\t\tcharacterDataOldValue: false,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-mutation directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-mutation=\"handleMutation\">Observe my changes</div>\n * <div v-mutation=\"{ handler: handleMutation, attributes: true, subtree: true }\">\n * Observe attributes and subtree\n * </div>\n * </template>\n *\n * <script setup>\n * function handleMutation(mutations: MutationRecord[], observer: MutationObserver) {\n * mutations.forEach(mutation => {\n * console.log('Type:', mutation.type)\n * console.log('Target:', mutation.target)\n * })\n * }\n * </script>\n * ```\n */\nexport const vMutation = defineDirective<MutationBinding, HTMLElement>({\n\tname: 'mutation',\n\tssr: false,\n\tdefaults: {\n\t\tattributes: false,\n\t\tchildList: true,\n\t\tsubtree: false,\n\t\tcharacterData: false,\n\t\tattributeOldValue: false,\n\t\tcharacterDataOldValue: false,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Check MutationObserver support\n\t\tif (!supportsMutationObserver()) {\n\t\t\tconsole.warn('[Directix] v-mutation: MutationObserver not supported')\n\n\t\t\treturn\n\t\t}\n\n\t\tconst state: MutationState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t}\n\n\t\t// Create observer\n\t\tstate.observer = new MutationObserver((mutations, observer) => {\n\t\t\toptions.handler(mutations, observer)\n\t\t})\n\n\t\t// Start observing\n\t\tstate.observer.observe(el, {\n\t\t\tattributes: options.attributes,\n\t\t\tattributeFilter: options.attributeFilter,\n\t\t\tchildList: options.childList,\n\t\t\tsubtree: options.subtree,\n\t\t\tcharacterData: options.characterData,\n\t\t\tattributeOldValue: options.attributeOldValue,\n\t\t\tcharacterDataOldValue: options.characterDataOldValue,\n\t\t})\n\n\t\t// Store state\n\t\t;(el as any).__mutation = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: MutationState = (el as any).__mutation\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disconnect if was enabled\n\t\t\tif (state.observer) {\n\t\t\t\tstate.observer.disconnect()\n\t\t\t}\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Re-observe if was disabled\n\t\t\tif (state.observer) {\n\t\t\t\tstate.observer.observe(el, {\n\t\t\t\t\tattributes: newOptions.attributes,\n\t\t\t\t\tattributeFilter: newOptions.attributeFilter,\n\t\t\t\t\tchildList: newOptions.childList,\n\t\t\t\t\tsubtree: newOptions.subtree,\n\t\t\t\t\tcharacterData: newOptions.characterData,\n\t\t\t\t\tattributeOldValue: newOptions.attributeOldValue,\n\t\t\t\t\tcharacterDataOldValue: newOptions.characterDataOldValue,\n\t\t\t\t})\n\t\t\t}\n\t\t} else if (!newOptions.disabled) {\n\t\t\t// If options changed, reconnect with new options\n\t\t\tif (\n\t\t\t\tnewOptions.attributes !== state.options.attributes\n\t\t\t\t|| newOptions.childList !== state.options.childList\n\t\t\t\t|| newOptions.subtree !== state.options.subtree\n\t\t\t\t|| newOptions.characterData !== state.options.characterData\n\t\t\t) {\n\t\t\t\tif (state.observer) {\n\t\t\t\t\tstate.observer.disconnect()\n\t\t\t\t\tstate.observer.observe(el, {\n\t\t\t\t\t\tattributes: newOptions.attributes,\n\t\t\t\t\t\tattributeFilter: newOptions.attributeFilter,\n\t\t\t\t\t\tchildList: newOptions.childList,\n\t\t\t\t\t\tsubtree: newOptions.subtree,\n\t\t\t\t\t\tcharacterData: newOptions.characterData,\n\t\t\t\t\t\tattributeOldValue: newOptions.attributeOldValue,\n\t\t\t\t\t\tcharacterDataOldValue: newOptions.characterDataOldValue,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MutationState = (el as any).__mutation\n\n\t\tif (!state) return\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\tdelete (el as any).__mutation\n\t},\n})\n\nexport default vMutation\n","import { defineDirective } from '@directix/core'\nimport { clampValue, formatNumber, type NumberFormatOptions, parseToNumber, setupNumberInput } from '../utils/number'\n\n/**\n * Number directive options\n */\nexport interface NumberOptions extends NumberFormatOptions {\n\t/** Prefix string (e.g., '$') */\n\tprefix?: string\n\t/** Suffix string (e.g., '%') */\n\tsuffix?: string\n}\n\nexport type NumberBinding = number | NumberOptions\n\ninterface NumberState {\n\toptions: NumberOptions\n\tcleanup: () => void\n}\n\nexport const vNumber = defineDirective<NumberBinding, HTMLElement>({\n\tname: 'number',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options: NumberOptions = typeof binding.value === 'number' ? { precision: binding.value } : (binding.value ?? {})\n\n\t\tif (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {\n\t\t\tconst cleanup = setupNumberInput(el as HTMLInputElement, options, formatNumber)\n\n\t\t\t;(el as any).__number = { options, cleanup }\n\n\t\t\t// Format initial value after DOM is ready\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst inputEl = el as HTMLInputElement\n\n\t\t\t\tif (inputEl.value) {\n\t\t\t\t\tconst num = parseToNumber(inputEl.value, options.decimal || '.')\n\n\t\t\t\t\tif (num !== null) {\n\t\t\t\t\t\tconst formatted = formatNumber(clampValue(num, options), options)\n\n\t\t\t\t\t\tif (formatted !== inputEl.value) {\n\t\t\t\t\t\t\tinputEl.value = formatted\n\t\t\t\t\t\t\tinputEl.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\t// For non-input elements, format the text content\n\t\t\tlet value: number | null = null\n\n\t\t\tif (typeof binding.value === 'number') {\n\t\t\t\tvalue = binding.value\n\t\t\t} else if (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t} else {\n\t\t\t\t// Try to parse from element's text content\n\t\t\t\tconst textContent = el.textContent?.trim()\n\n\t\t\t\tif (textContent) {\n\t\t\t\t\tvalue = parseToNumber(textContent, options.decimal || '.')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatNumber(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options: NumberOptions = typeof binding.value === 'number' ? { precision: binding.value } : (binding.value ?? {})\n\n\t\tconst state: NumberState | undefined = (el as any).__number\n\n\t\tif (state) {\n\t\t\tstate.options = options\n\t\t} else if (!(el.tagName === 'INPUT' || el.tagName === 'TEXTAREA')) {\n\t\t\t// Only format non-input elements on update\n\t\t\tlet value: number | null = null\n\n\t\t\tif (typeof binding.value === 'number') {\n\t\t\t\tvalue = binding.value\n\t\t\t} else if (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatNumber(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: NumberState | undefined = (el as any).__number\n\n\t\tstate?.cleanup()\n\t\tdelete (el as any).__number\n\t},\n})\n\nexport default vNumber\n","import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\n\n// ============ Types ============\n\n/**\n * Permission action mode\n */\nexport type PermissionAction = 'remove' | 'disable' | 'hide'\n\n/**\n * Permission check mode\n */\nexport type PermissionMode = 'some' | 'every'\n\n/**\n * Permission directive options\n */\nexport interface PermissionOptions {\n\t/** Permission value(s) to check */\n\tvalue: string | string[]\n\t/** Logic for multiple permissions: 'some' (OR) or 'every' (AND). Default: 'some' */\n\tmode?: PermissionMode\n\t/** Action when permission denied. Default: 'remove' */\n\taction?: PermissionAction\n\t/** Custom permission check function */\n\tcheck?: (permission: string | string[], mode: PermissionMode) => boolean\n\t/** Callback when permission state changes */\n\tonChange?: (hasPermission: boolean) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type PermissionBinding = string | string[] | PermissionOptions\n\n/**\n * Permission configuration\n */\nexport interface PermissionConfig {\n\t/** Get current user's permissions */\n\tgetPermissions: () => string[]\n\t/** Get current user's roles */\n\tgetRoles?: () => string[]\n\t/** Role to permission mapping */\n\troleMap?: Record<string, string[]>\n}\n\n// ============ Constants ============\n\nconst STATE_KEY = '__permission' as const\nconst WILDCARD = '*' as const\n\n// ============ State ============\n\ninterface ElementState {\n\toptions: PermissionOptions\n\toriginalDisplay: string\n\toriginalDisabled: boolean | string\n\tparentNode: Node | null\n\tplaceholder: Comment | null\n}\n\n// Global configuration\nlet globalConfig: PermissionConfig | null = null\n\n// ============ Configuration ============\n\n/**\n * Configure permission directive\n */\nexport function configurePermission(config: PermissionConfig): void {\n\tglobalConfig = config\n}\n\n/**\n * Get current configuration\n */\nexport function getPermissionConfig(): PermissionConfig | null {\n\treturn globalConfig\n}\n\n// ============ Helpers ============\n\n/**\n * Normalize binding value to options object\n */\nfunction normalizeOptions(binding: PermissionBinding | undefined): PermissionOptions {\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-permission: permission value is required')\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { value: binding }\n\t}\n\n\tif (Array.isArray(binding)) {\n\t\treturn { value: binding }\n\t}\n\n\treturn binding\n}\n\n/**\n * Check if a permission is granted (supports wildcard)\n */\nfunction hasPermission(required: string, permissions: string[]): boolean {\n\treturn permissions.includes(WILDCARD) || permissions.includes(required)\n}\n\n/**\n * Verify permission against configuration\n */\nfunction verifyPermission(options: PermissionOptions): boolean {\n\t// Custom check function takes priority\n\tif (options.check) {\n\t\treturn options.check(options.value, options.mode || 'some')\n\t}\n\n\t// Require global configuration\n\tif (!globalConfig) {\n\t\tconsole.warn('[Directix] v-permission: No permission config provided')\n\n\t\treturn true\n\t}\n\n\tconst permissions = globalConfig.getPermissions()\n\tconst roles = globalConfig.getRoles?.() || []\n\tconst roleMap = globalConfig.roleMap || {}\n\tconst required = Array.isArray(options.value) ? options.value : [options.value]\n\tconst mode = options.mode || 'some'\n\n\t/**\n\t * Check a single value - can be a role name or permission\n\t */\n\tfunction checkSingle(value: string): boolean {\n\t\t// If value is a role name in roleMap, check if user has that role\n\t\tif (value in roleMap) {\n\t\t\treturn roles.includes(value)\n\t\t}\n\n\t\t// Check direct permission\n\t\tif (hasPermission(value, permissions)) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Check if any of user's roles grant this permission\n\t\tfor (const role of roles) {\n\t\t\tconst rolePermissions = roleMap[role] || []\n\n\t\t\tif (hasPermission(value, rolePermissions)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\treturn mode === 'every' ? required.every(checkSingle) : required.some(checkSingle)\n}\n\n/**\n * Handle element when permission is denied\n */\nfunction handleDenied(el: HTMLElement, action: PermissionAction, state: ElementState): void {\n\tswitch (action) {\n\t\tcase 'remove':\n\t\t\tstate.parentNode = el.parentNode\n\t\t\tstate.placeholder = document.createComment('v-permission')\n\t\t\tel.parentNode?.insertBefore(state.placeholder, el)\n\t\t\tel.parentNode?.removeChild(el)\n\t\t\tbreak\n\t\tcase 'disable':\n\t\t\tstate.originalDisabled = el.getAttribute('disabled') || false\n\t\t\tel.setAttribute('disabled', 'true')\n\t\t\tel.classList.add('v-permission--disabled')\n\t\t\tbreak\n\t\tcase 'hide':\n\t\t\tstate.originalDisplay = el.style.display\n\t\t\tel.style.display = 'none'\n\t\t\tel.classList.add('v-permission--hidden')\n\t\t\tbreak\n\t}\n}\n\n/**\n * Restore element when permission is granted\n */\nfunction handleGranted(el: HTMLElement, action: PermissionAction, state: ElementState): void {\n\tswitch (action) {\n\t\tcase 'remove':\n\t\t\tif (state.placeholder && state.parentNode) {\n\t\t\t\tstate.parentNode.insertBefore(el, state.placeholder)\n\t\t\t\tstate.parentNode.removeChild(state.placeholder)\n\t\t\t\tstate.placeholder = null\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'disable':\n\t\t\tif (state.originalDisabled === false) {\n\t\t\t\tel.removeAttribute('disabled')\n\t\t\t} else if (state.originalDisabled) {\n\t\t\t\tel.setAttribute('disabled', state.originalDisabled as string)\n\t\t\t}\n\t\t\tel.classList.remove('v-permission--disabled')\n\t\t\tbreak\n\t\tcase 'hide':\n\t\t\tel.style.display = state.originalDisplay || ''\n\t\t\tel.classList.remove('v-permission--hidden')\n\t\t\tbreak\n\t}\n}\n\n/**\n * Get or create element state\n */\nfunction getState(el: HTMLElement): ElementState {\n\tif (!(el as any)[STATE_KEY]) {\n\t\t;(el as any)[STATE_KEY] = {\n\t\t\toptions: { value: '' },\n\t\t\toriginalDisplay: '',\n\t\t\toriginalDisabled: false,\n\t\t\tparentNode: null,\n\t\t\tplaceholder: null,\n\t\t} as ElementState\n\t}\n\n\treturn (el as any)[STATE_KEY]\n}\n\n/**\n * Check permission and update element state\n */\nfunction checkPermission(el: HTMLElement, binding: DirectiveBinding<PermissionBinding>): void {\n\tconst state = getState(el)\n\n\tstate.options = normalizeOptions(binding.value)\n\n\tconst granted = verifyPermission(state.options)\n\n\t// Trigger change callback\n\tstate.options.onChange?.(granted)\n\n\tconst action = state.options.action || 'remove'\n\n\tif (granted) {\n\t\thandleGranted(el, action, state)\n\t} else {\n\t\thandleDenied(el, action, state)\n\t}\n}\n\n/**\n * Cleanup element state\n */\nfunction cleanup(el: HTMLElement): void {\n\tconst state: ElementState = (el as any)[STATE_KEY]\n\n\tif (state?.placeholder && state.parentNode) {\n\t\tstate.parentNode.removeChild(state.placeholder)\n\t}\n\n\tdelete (el as any)[STATE_KEY]\n}\n\n// ============ Directive ============\n\n/**\n * v-permission directive\n *\n * Controls element visibility and state based on user permissions.\n * Supports role-based and permission-based access control with wildcard support.\n *\n * @example\n * ```vue\n * <template>\n * <button v-permission=\"'admin'\">Admin Only</button>\n * <button v-permission=\"['admin', 'editor']\">Admin or Editor</button>\n * <button v-permission=\"{ value: ['read', 'write'], mode: 'every' }\">Read & Write</button>\n * <button v-permission=\"{ value: 'admin', action: 'disable' }\">Disabled for non-admin</button>\n * </template>\n *\n * <script setup>\n * import { configurePermission } from 'directix'\n *\n * configurePermission({\n * getPermissions: () => store.getters.permissions,\n * getRoles: () => store.getters.roles,\n * roleMap: { admin: ['*'], editor: ['read', 'write'] }\n * })\n * </script>\n * ```\n */\nexport const vPermission = defineDirective<PermissionBinding, HTMLElement>({\n\tname: 'permission',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tcheckPermission(el, binding)\n\t},\n\n\tupdated(el, binding) {\n\t\tcheckPermission(el, binding)\n\t},\n\n\tunmounted(el) {\n\t\tcleanup(el)\n\t},\n})\n\nexport default vPermission\n","import { defineDirective } from '@directix/core'\n\n/**\n * Print complete callback\n */\nexport type PrintCompleteCallback = () => void\n\n/**\n * Print before callback\n */\nexport type PrintBeforeCallback = () => boolean | void\n\n/**\n * Print directive options\n */\nexport interface PrintOptions {\n\t/**\n\t * Title for the printed document\n\t */\n\ttitle?: string\n\n\t/**\n\t * Additional CSS styles to inject\n\t */\n\tstyles?: string | string[]\n\n\t/**\n\t * Additional CSS URLs to include\n\t */\n\tcssUrls?: string[]\n\n\t/**\n\t * Callback before printing\n\t * Return false to cancel printing\n\t */\n\tonBeforePrint?: PrintBeforeCallback\n\n\t/**\n\t * Callback after printing\n\t */\n\tonAfterPrint?: PrintCompleteCallback\n\n\t/**\n\t * Whether to print immediately on mount\n\t * @default false\n\t */\n\timmediate?: boolean\n\n\t/**\n\t * Print target selector\n\t * If not specified, prints the element itself\n\t */\n\ttarget?: string\n\n\t/**\n\t * Whether to print in a new window\n\t * @default false\n\t */\n\tnewWindow?: boolean\n\n\t/**\n\t * Custom class for print container\n\t */\n\tprintClass?: string\n}\n\n/**\n * Directive binding value type\n */\nexport type PrintBinding = PrintOptions | boolean\n\n/**\n * Element state storage\n */\ninterface PrintState {\n\toptions: PrintOptions\n\tclickHandler: (() => void) | null\n}\n\n/**\n * v-print directive\n *\n * Prints the element content when clicked or immediately.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Print on click -->\n * <button v-print>Print Page</button>\n *\n * <!-- Print specific element -->\n * <button v-print=\"{ target: '#content' }\">Print Content</button>\n *\n * <!-- Print with custom title -->\n * <button v-print=\"{ title: 'My Document', styles: 'body { font-size: 12px }' }\">\n * Print\n * </button>\n *\n * <!-- Print immediately on mount -->\n * <div v-print=\"{ immediate: true }\">Auto print</div>\n * </template>\n * ```\n */\nexport const vPrint = defineDirective<PrintBinding, HTMLElement>({\n\tname: 'print',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: PrintState = {\n\t\t\toptions,\n\t\t\tclickHandler: null,\n\t\t}\n\n\t\t;(el as any).__print = state\n\n\t\t// Print immediately if specified\n\t\tif (options.immediate) {\n\t\t\tsetTimeout(() => printElement(el, options), 100)\n\t\t\treturn\n\t\t}\n\n\t\t// Add click handler\n\t\tconst clickHandler = (): void => {\n\t\t\tprintElement(el, state.options)\n\t\t}\n\n\t\tel.addEventListener('click', clickHandler)\n\t\tstate.clickHandler = clickHandler\n\n\t\t// Add cursor style\n\t\tel.style.cursor = 'pointer'\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: PrintState = (el as any).__print\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: PrintState | undefined = (el as any).__print\n\n\t\tif (!state) return\n\n\t\tif (state.clickHandler) {\n\t\t\tel.removeEventListener('click', state.clickHandler)\n\t\t}\n\n\t\tel.style.cursor = ''\n\n\t\tdelete (el as any).__print\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: PrintBinding | undefined): PrintOptions {\n\tif (binding === true) {\n\t\treturn { immediate: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn {}\n\t}\n\n\treturn binding || {}\n}\n\n/**\n * Print element\n */\nasync function printElement(triggerEl: HTMLElement, options: PrintOptions): Promise<void> {\n\t// Call before callback\n\tif (options.onBeforePrint) {\n\t\tconst result = options.onBeforePrint()\n\t\tif (result === false) return\n\t}\n\n\t// Get target element\n\tconst targetEl = options.target ? document.querySelector(options.target) : triggerEl\n\n\tif (!targetEl) {\n\t\tconsole.warn('[Directix] v-print: Target element not found')\n\t\treturn\n\t}\n\n\t// Create print window/iframe\n\tif (options.newWindow) {\n\t\tawait printInNewWindow(targetEl as HTMLElement, options)\n\t} else {\n\t\tawait printInIframe(targetEl as HTMLElement, options)\n\t}\n\n\t// Call after callback\n\tif (options.onAfterPrint) {\n\t\toptions.onAfterPrint()\n\t}\n}\n\n/**\n * Print using iframe\n */\nasync function printInIframe(el: HTMLElement, options: PrintOptions): Promise<void> {\n\t// Create iframe\n\tconst iframe = document.createElement('iframe')\n\tiframe.style.cssText = 'position: absolute; top: -10000px; left: -10000px; width: 0; height: 0; border: none;'\n\tdocument.body.appendChild(iframe)\n\n\tconst iframeDoc = iframe.contentDocument || iframe.contentWindow?.document\n\n\tif (!iframeDoc) {\n\t\tconsole.warn('[Directix] v-print: Could not access iframe document')\n\t\tdocument.body.removeChild(iframe)\n\t\treturn\n\t}\n\n\t// Build document content\n\tconst content = buildPrintContent(el, options)\n\n\tiframeDoc.open()\n\tiframeDoc.write(content)\n\tiframeDoc.close()\n\n\t// Wait for images to load\n\tawait waitForImages(iframeDoc)\n\n\t// Print\n\ttry {\n\t\tiframe.contentWindow?.focus()\n\t\tiframe.contentWindow?.print()\n\t} catch (err) {\n\t\tconsole.error('[Directix] v-print: Print failed', err)\n\t}\n\n\t// Cleanup after print\n\tsetTimeout(() => {\n\t\tdocument.body.removeChild(iframe)\n\t}, 1000)\n}\n\n/**\n * Print in new window\n */\nasync function printInNewWindow(el: HTMLElement, options: PrintOptions): Promise<void> {\n\tconst printWindow = window.open('', '_blank')\n\n\tif (!printWindow) {\n\t\tconsole.warn('[Directix] v-print: Could not open print window')\n\t\treturn\n\t}\n\n\tconst content = buildPrintContent(el, options)\n\n\tprintWindow.document.open()\n\tprintWindow.document.write(content)\n\tprintWindow.document.close()\n\n\t// Wait for images to load\n\tawait waitForImages(printWindow.document)\n\n\t// Print\n\tprintWindow.focus()\n\tprintWindow.print()\n\n\t// Close after print\n\tsetTimeout(() => {\n\t\tprintWindow.close()\n\t}, 1000)\n}\n\n/**\n * Build print content HTML\n */\nfunction buildPrintContent(el: HTMLElement, options: PrintOptions): string {\n\t// Get all stylesheets\n\tlet styles = ''\n\n\t// Include existing stylesheets\n\tdocument.querySelectorAll('style, link[rel=\"stylesheet\"]').forEach(styleEl => {\n\t\tif (styleEl.tagName === 'STYLE') {\n\t\t\tstyles += `<style>${styleEl.textContent}</style>`\n\t\t} else if (styleEl.tagName === 'LINK') {\n\t\t\tconst href = (styleEl as HTMLLinkElement).href\n\t\t\tstyles += `<link rel=\"stylesheet\" href=\"${href}\">`\n\t\t}\n\t})\n\n\t// Add custom CSS URLs\n\tif (options.cssUrls) {\n\t\toptions.cssUrls.forEach(url => {\n\t\t\tstyles += `<link rel=\"stylesheet\" href=\"${url}\">`\n\t\t})\n\t}\n\n\t// Add custom styles\n\tif (options.styles) {\n\t\tconst customStyles = Array.isArray(options.styles) ? options.styles.join('\\n') : options.styles\n\t\tstyles += `<style>${customStyles}</style>`\n\t}\n\n\t// Add print-specific styles\n\tstyles += `\n\t\t<style>\n\t\t\t@media print {\n\t\t\t\tbody { margin: 0; padding: 20px; }\n\t\t\t\t${options.printClass ? `.${options.printClass} { page-break-inside: avoid; }` : ''}\n\t\t\t}\n\t\t</style>\n\t`\n\n\t// Build HTML\n\tconst title = options.title || document.title || 'Print'\n\tconst content = el.outerHTML\n\n\treturn `<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>${title}</title>\n\t${styles}\n</head>\n<body>\n\t${content}\n</body>\n</html>`\n}\n\n/**\n * Wait for images to load\n */\nfunction waitForImages(doc: Document): Promise<void[]> {\n\tconst images = doc.querySelectorAll('img')\n\tconst promises: Promise<void>[] = []\n\n\timages.forEach(img => {\n\t\tif (!img.complete) {\n\t\t\tpromises.push(\n\t\t\t\tnew Promise(resolve => {\n\t\t\t\t\timg.onload = () => resolve()\n\t\t\t\t\timg.onerror = () => resolve()\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t})\n\n\treturn Promise.all(promises)\n}\n\nexport default vPrint\n","import { defineDirective } from '@directix/core'\n\nexport type PullRefreshHandler = () => Promise<void> | void\n\nexport type PullRefreshState = 'idle' | 'pulling' | 'ready' | 'loading' | 'success' | 'error'\n\nexport interface PullRefreshOptions {\n\thandler: PullRefreshHandler\n\tdistance?: number\n\tmaxDistance?: number\n\tdisabled?: boolean\n\tindicator?: {\n\t\tidle?: string\n\t\tpulling?: string\n\t\tready?: string\n\t\tloading?: string\n\t\tsuccess?: string\n\t\terror?: string\n\t}\n\tsuccessDuration?: number\n\terrorDuration?: number\n\tonStateChange?: (state: PullRefreshState) => void\n}\n\nexport type PullRefreshBinding = PullRefreshHandler | PullRefreshOptions\n\ninterface PullRefreshInternalState {\n\toptions: PullRefreshOptions\n\tstate: PullRefreshState\n\tstartY: number\n\tcurrentY: number\n\tpulling: boolean\n\tindicatorEl: HTMLDivElement\n\tcontentEl: HTMLElement\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: () => void\n\t}\n}\n\nconst DEFAULT_DISTANCE = 60\nconst DEFAULT_MAX_DISTANCE = 100\nconst DEFAULT_SUCCESS_DURATION = 500\nconst DEFAULT_ERROR_DURATION = 1000\n\nconst DEFAULT_INDICATORS: Record<PullRefreshState, string> = {\n\tidle: '↓',\n\tpulling: '↓ Pull',\n\tready: '↓ Release',\n\tloading: '⟳ Loading...',\n\tsuccess: '✓ Done',\n\terror: '✗ Failed',\n}\n\nfunction normalizeOptions(binding: PullRefreshBinding): PullRefreshOptions {\n\tif (typeof binding === 'function') return { handler: binding }\n\n\treturn {\n\t\thandler: binding.handler,\n\t\tdistance: binding.distance ?? DEFAULT_DISTANCE,\n\t\tmaxDistance: binding.maxDistance ?? DEFAULT_MAX_DISTANCE,\n\t\tdisabled: binding.disabled ?? false,\n\t\tindicator: binding.indicator,\n\t\tsuccessDuration: binding.successDuration ?? DEFAULT_SUCCESS_DURATION,\n\t\terrorDuration: binding.errorDuration ?? DEFAULT_ERROR_DURATION,\n\t\tonStateChange: binding.onStateChange,\n\t}\n}\n\nfunction createIndicator(): HTMLDivElement {\n\tconst el = document.createElement('div')\n\tel.className = 'v-pull-refresh__indicator'\n\tel.style.cssText = `\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tright: 0;\n\t\theight: 60px;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tbackground: #f5f5f5;\n\t\tfont-size: 14px;\n\t\tcolor: #666;\n\t\tz-index: 10;\n\t\tpointer-events: none;\n\t\topacity: 0;\n\t\ttransition: opacity 0.2s ease;\n\t`\n\treturn el\n}\n\nfunction updateIndicator(el: HTMLDivElement, state: PullRefreshState, options: PullRefreshOptions): void {\n\tconst customIndicator = options.indicator?.[state]\n\tel.textContent = customIndicator || DEFAULT_INDICATORS[state]\n}\n\nfunction setState(internal: PullRefreshInternalState, newState: PullRefreshState): void {\n\tif (internal.state === newState) return\n\n\tinternal.state = newState\n\tupdateIndicator(internal.indicatorEl, newState, internal.options)\n\tinternal.options.onStateChange?.(newState)\n}\n\nfunction applyTransform(internal: PullRefreshInternalState, distance: number, showIndicator: boolean): void {\n\tinternal.contentEl.style.transform = `translateY(${distance}px)`\n\tinternal.indicatorEl.style.opacity = showIndicator ? '1' : '0'\n\tinternal.indicatorEl.style.transform = `translateY(${distance}px)`\n}\n\nfunction resetPosition(internal: PullRefreshInternalState): void {\n\tinternal.contentEl.style.transform = ''\n\tinternal.indicatorEl.style.opacity = '0'\n\tsetState(internal, 'idle')\n}\n\nasync function triggerRefresh(internal: PullRefreshInternalState): Promise<void> {\n\tsetState(internal, 'loading')\n\n\tconst distance = internal.options.distance!\n\tapplyTransform(internal, distance, true)\n\n\ttry {\n\t\tawait internal.options.handler()\n\t\tsetState(internal, 'success')\n\t\tawait sleep(internal.options.successDuration!)\n\t} catch {\n\t\tsetState(internal, 'error')\n\t\tawait sleep(internal.options.errorDuration!)\n\t} finally {\n\t\tresetPosition(internal)\n\t}\n}\n\nfunction sleep(ms: number): Promise<void> {\n\treturn new Promise(resolve => setTimeout(resolve, ms))\n}\n\nfunction createHandlers(internal: PullRefreshInternalState): PullRefreshInternalState['handlers'] {\n\tconst { contentEl, options } = internal\n\n\treturn {\n\t\ttouchStart: (e: TouchEvent) => {\n\t\t\tif (options.disabled || internal.state === 'loading') return\n\t\t\tif (contentEl.scrollTop > 0) return\n\n\t\t\tinternal.pulling = true\n\t\t\tinternal.startY = e.touches[0].clientY\n\t\t\tinternal.currentY = internal.startY\n\t\t\tsetState(internal, 'idle')\n\t\t},\n\n\t\ttouchMove: (e: TouchEvent) => {\n\t\t\tif (!internal.pulling || options.disabled || internal.state === 'loading') return\n\n\t\t\tinternal.currentY = e.touches[0].clientY\n\t\t\tconst diff = internal.currentY - internal.startY\n\n\t\t\t// Handle upward swipe - reset\n\t\t\tif (diff <= 0) {\n\t\t\t\tif (contentEl.style.transform) {\n\t\t\t\t\tcontentEl.style.transition = ''\n\t\t\t\t\tresetPosition(internal)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Prevent page scroll\n\t\t\te.preventDefault()\n\n\t\t\tconst distance = Math.min(diff * 0.5, options.maxDistance!)\n\t\t\tconst progress = distance / options.distance!\n\n\t\t\tcontentEl.style.transition = 'none'\n\t\t\tapplyTransform(internal, distance, true)\n\t\t\tsetState(internal, progress >= 1 ? 'ready' : 'pulling')\n\t\t},\n\n\t\ttouchEnd: () => {\n\t\t\tif (!internal.pulling || options.disabled) return\n\n\t\t\tinternal.pulling = false\n\t\t\tconst diff = internal.currentY - internal.startY\n\t\t\tconst distance = Math.min(diff * 0.5, options.maxDistance!)\n\n\t\t\tcontentEl.style.transition = ''\n\n\t\t\tif (internal.state === 'ready' && distance >= options.distance!) {\n\t\t\t\ttriggerRefresh(internal)\n\t\t\t} else {\n\t\t\t\tresetPosition(internal)\n\t\t\t}\n\t\t},\n\t}\n}\n\nfunction bindEvents(el: HTMLElement, handlers: PullRefreshInternalState['handlers']): void {\n\tel.addEventListener('touchstart', handlers.touchStart, { passive: false })\n\tel.addEventListener('touchmove', handlers.touchMove, { passive: false })\n\tel.addEventListener('touchend', handlers.touchEnd, { passive: true })\n}\n\nfunction unbindEvents(el: HTMLElement, handlers: PullRefreshInternalState['handlers']): void {\n\tel.removeEventListener('touchstart', handlers.touchStart)\n\tel.removeEventListener('touchmove', handlers.touchMove)\n\tel.removeEventListener('touchend', handlers.touchEnd)\n}\n\nexport const vPullRefresh = defineDirective<PullRefreshBinding, HTMLElement>({\n\tname: 'pull-refresh',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Setup container\n\t\tel.style.position = 'relative'\n\t\tel.style.overflow = 'hidden'\n\t\tel.classList.add('v-pull-refresh')\n\n\t\t// Create content wrapper\n\t\tconst contentEl = document.createElement('div')\n\t\tcontentEl.className = 'v-pull-refresh__content'\n\t\tcontentEl.style.cssText = 'position: relative; height: 100%; overflow-y: auto;'\n\n\t\t// Move children to wrapper\n\t\twhile (el.firstChild) {\n\t\t\tcontentEl.appendChild(el.firstChild)\n\t\t}\n\t\tel.appendChild(contentEl)\n\n\t\t// Create indicator\n\t\tconst indicatorEl = createIndicator()\n\t\tel.insertBefore(indicatorEl, contentEl)\n\n\t\t// Initialize state\n\t\tconst internal: PullRefreshInternalState = {\n\t\t\toptions,\n\t\t\tstate: 'idle',\n\t\t\tstartY: 0,\n\t\t\tcurrentY: 0,\n\t\t\tpulling: false,\n\t\t\tindicatorEl,\n\t\t\tcontentEl,\n\t\t\thandlers: null as any,\n\t\t}\n\n\t\tinternal.handlers = createHandlers(internal)\n\t\t;(el as any).__pullRefresh = internal\n\n\t\tif (!options.disabled) {\n\t\t\tbindEvents(el, internal.handlers)\n\t\t}\n\n\t\tupdateIndicator(indicatorEl, 'idle', options)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst internal: PullRefreshInternalState = (el as any).__pullRefresh\n\t\tif (!internal) return\n\n\t\tconst wasDisabled = internal.options.disabled\n\t\tinternal.options = normalizeOptions(binding.value)\n\n\t\tupdateIndicator(internal.indicatorEl, internal.state, internal.options)\n\n\t\tif (internal.options.disabled && !wasDisabled) {\n\t\t\tunbindEvents(el, internal.handlers)\n\t\t} else if (!internal.options.disabled && wasDisabled) {\n\t\t\tbindEvents(el, internal.handlers)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst internal: PullRefreshInternalState = (el as any).__pullRefresh\n\t\tif (!internal) return\n\n\t\tunbindEvents(el, internal.handlers)\n\t\tdelete (el as any).__pullRefresh\n\t},\n})\n\nexport default vPullRefresh\n","import { defineDirective, isBrowser, supportsResizeObserver } from '@directix/core'\n\n/**\n * Resize event handler\n */\nexport type ResizeHandler = (entry: ResizeObserverEntry) => void\n\n/**\n * Resize information\n */\nexport interface ResizeInfo {\n\t/** New width */\n\twidth: number\n\t/** New height */\n\theight: number\n\t/** Content rect */\n\tcontentRect: DOMRectReadOnly\n\t/** Border box size */\n\tborderBoxSize: ReadonlyArray<ResizeObserverSize>\n\t/** Content box size */\n\tcontentBoxSize: ReadonlyArray<ResizeObserverSize>\n\t/** Device pixel content box size */\n\tdevicePixelContentBoxSize: ReadonlyArray<ResizeObserverSize>\n}\n\n/**\n * Resize directive options\n */\nexport interface ResizeOptions {\n\t/**\n\t * Resize event handler\n\t * @required\n\t */\n\thandler: ResizeHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to use box model\n\t * - 'content-box': size of content area\n\t * - 'border-box': size of border box\n\t * - 'device-pixel-content-box': size in device pixels\n\t * @default 'content-box'\n\t */\n\tbox?: 'content-box' | 'border-box' | 'device-pixel-content-box'\n\n\t/**\n\t * Debounce time in milliseconds\n\t * @default 0 (no debounce)\n\t */\n\tdebounce?: number\n\n\t/**\n\t * Callback for browsers without ResizeObserver (uses object fallback)\n\t */\n\tonFallback?: (info: ResizeInfo) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type ResizeBinding = ResizeHandler | ResizeOptions\n\n/**\n * Element state storage\n */\ninterface ResizeState {\n\toptions: ResizeOptions\n\tobserver: ResizeObserver | null\n\thandler: (entry: ResizeObserverEntry) => void\n\tdebounceTimer: ReturnType<typeof setTimeout> | null\n\tpendingEntry: ResizeObserverEntry | null\n\tfallbackIframe: HTMLIFrameElement | null\n}\n\n/**\n * Get resize info from entry\n */\nfunction getResizeInfo(entry: ResizeObserverEntry): ResizeInfo {\n\treturn {\n\t\twidth: entry.contentRect.width,\n\t\theight: entry.contentRect.height,\n\t\tcontentRect: entry.contentRect,\n\t\tborderBoxSize: entry.borderBoxSize,\n\t\tcontentBoxSize: entry.contentBoxSize,\n\t\tdevicePixelContentBoxSize: entry.devicePixelContentBoxSize,\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ResizeBinding | undefined): ResizeOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-resize: handler is required')\n\t}\n\n\treturn {\n\t\tdisabled: false,\n\t\tbox: 'content-box',\n\t\tdebounce: 0,\n\t\t...binding,\n\t}\n}\n\n/**\n * Create fallback resize detection using object\n */\nfunction createFallbackResize(\n\tel: HTMLElement,\n\tcallback: () => void,\n): { iframe: HTMLIFrameElement, cleanup: () => void } {\n\t// Create an invisible iframe for resize detection\n\tconst iframe = document.createElement('iframe')\n\n\tiframe.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: none;\n pointer-events: none;\n opacity: 0;\n `\n\n\tel.appendChild(iframe)\n\n\tconst iWindow = iframe.contentWindow\n\n\tif (iWindow) {\n\t\tiWindow.addEventListener('resize', callback)\n\t}\n\n\treturn {\n\t\tiframe,\n\t\tcleanup: () => {\n\t\t\tif (iWindow) {\n\t\t\t\tiWindow.removeEventListener('resize', callback)\n\t\t\t}\n\n\t\t\tiframe.remove()\n\t\t},\n\t}\n}\n\n/**\n * v-resize directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-resize=\"handleResize\">Resize me</div>\n * <div v-resize=\"{ handler: handleResize, debounce: 200 }\">Debounced resize</div>\n * </template>\n * ```\n */\nexport const vResize = defineDirective<ResizeBinding, HTMLElement>({\n\tname: 'resize',\n\tssr: false,\n\tdefaults: {\n\t\tdisabled: false,\n\t\tbox: 'content-box',\n\t\tdebounce: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Ensure element has relative or absolute positioning for fallback\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\tconst state: ResizeState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t\tdebounceTimer: null,\n\t\t\tpendingEntry: null,\n\t\t\tfallbackIframe: null,\n\t\t\thandler: (entry: ResizeObserverEntry) => {\n\t\t\t\t// Handle debounce\n\t\t\t\tif (options.debounce && options.debounce > 0) {\n\t\t\t\t\tstate.pendingEntry = entry\n\n\t\t\t\t\tif (!state.debounceTimer) {\n\t\t\t\t\t\tstate.debounceTimer = setTimeout(() => {\n\t\t\t\t\t\t\tif (state.pendingEntry) {\n\t\t\t\t\t\t\t\toptions.handler(state.pendingEntry)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate.debounceTimer = null\n\t\t\t\t\t\t\tstate.pendingEntry = null\n\t\t\t\t\t\t}, options.debounce)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\toptions.handler(entry)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__resize = state\n\n\t\t// Use ResizeObserver if available\n\t\tif (supportsResizeObserver()) {\n\t\t\tstate.observer = new ResizeObserver(entries => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tstate.handler(entry)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate.observer.observe(el, { box: options.box })\n\t\t} else {\n\t\t\t// Fallback using iframe\n\t\t\tconsole.warn('[Directix] v-resize: ResizeObserver not supported, using fallback')\n\n\t\t\tconst { iframe, cleanup } = createFallbackResize(el, () => {\n\t\t\t\tconst rect = el.getBoundingClientRect()\n\t\t\t\tconst entry = {\n\t\t\t\t\ttarget: el,\n\t\t\t\t\tcontentRect: rect as DOMRectReadOnly,\n\t\t\t\t\tborderBoxSize: [] as any,\n\t\t\t\t\tcontentBoxSize: [] as any,\n\t\t\t\t\tdevicePixelContentBoxSize: [] as any,\n\t\t\t\t}\n\n\t\t\t\tstate.handler(entry as ResizeObserverEntry)\n\n\t\t\t\tif (options.onFallback) {\n\t\t\t\t\toptions.onFallback(getResizeInfo(entry as ResizeObserverEntry))\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate.fallbackIframe = iframe\n\t\t\t;(el as any).__resizeCleanup = cleanup\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ResizeState = (el as any).__resize\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ResizeState = (el as any).__resize\n\n\t\tif (!state) return\n\n\t\t// Clear debounce timer\n\t\tif (state.debounceTimer) {\n\t\t\tclearTimeout(state.debounceTimer)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\t// Cleanup fallback\n\t\tconst cleanup = (el as any).__resizeCleanup\n\n\t\tif (cleanup) {\n\t\t\tcleanup()\n\t\t}\n\n\t\tdelete (el as any).__resize\n\t\tdelete (el as any).__resizeCleanup\n\t},\n})\n\nexport default vResize\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Ripple directive options\n */\nexport interface RippleOptions {\n\t/**\n\t * Ripple color\n\t * @default 'currentColor'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Ripple duration in milliseconds\n\t * @default 600\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to disable ripple\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Initial scale of ripple\n\t * @default 0\n\t */\n\tinitialScale?: number\n\n\t/**\n\t * Final scale of ripple\n\t * @default 2\n\t */\n\tfinalScale?: number\n}\n\n/**\n * Directive binding value type\n */\nexport type RippleBinding = boolean | string | RippleOptions\n\n/**\n * Element state storage\n */\ninterface RippleState {\n\toptions: RippleOptions\n\tclickHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: RippleBinding | undefined): RippleOptions {\n\tif (binding === false) {\n\t\treturn { disabled: true, color: 'currentColor', duration: 600 }\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { color: binding, duration: 600 }\n\t}\n\n\tconst base: RippleOptions = {\n\t\tcolor: 'currentColor',\n\t\tduration: 600,\n\t\tdisabled: false,\n\t\tinitialScale: 0,\n\t\tfinalScale: 2,\n\t}\n\n\treturn binding && typeof binding === 'object' ? { ...base, ...binding } : base\n}\n\n/**\n * Create ripple element\n */\nfunction createRipple(\n\tevent: MouseEvent,\n\tel: HTMLElement,\n\toptions: RippleOptions,\n): HTMLSpanElement | null {\n\t// Get element dimensions\n\tconst rect = el.getBoundingClientRect()\n\n\t// Calculate ripple position\n\tconst x = event.clientX - rect.left\n\tconst y = event.clientY - rect.top\n\n\t// Calculate ripple size (use diagonal for full coverage)\n\tconst size = Math.max(rect.width, rect.height) * 2\n\n\t// Create ripple element\n\tconst ripple = document.createElement('span')\n\n\tripple.className = 'v-ripple__wave'\n\tripple.style.cssText = `\n position: absolute;\n border-radius: 50%;\n pointer-events: none;\n background-color: ${options.color};\n width: ${size}px;\n height: ${size}px;\n left: ${x - size / 2}px;\n top: ${y - size / 2}px;\n transform: scale(${options.initialScale});\n opacity: 0.3;\n z-index: 0;\n `\n\n\treturn ripple\n}\n\n/**\n * Animate ripple\n */\nfunction animateRipple(ripple: HTMLElement, options: RippleOptions): void {\n\tconst duration = options.duration || 600\n\tconst initialScale = options.initialScale || 0\n\tconst finalScale = options.finalScale || 2\n\n\t// Use Web Animations API if available\n\tif (typeof ripple.animate === 'function') {\n\t\tripple.animate(\n\t\t\t[\n\t\t\t\t{ transform: `scale(${initialScale})`, opacity: 0.3 },\n\t\t\t\t{ transform: `scale(${finalScale})`, opacity: 0 },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration,\n\t\t\t\teasing: 'ease-out',\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t).onfinish = () => {\n\t\t\tripple.remove()\n\t\t}\n\t} else {\n\t\t// Fallback for older browsers\n\t\tripple.style.transition = `transform ${duration}ms ease-out, opacity ${duration}ms ease-out`\n\n\t\t// Force reflow\n\t\tString(ripple.offsetHeight)\n\n\t\tripple.style.transform = `scale(${finalScale})`\n\t\tripple.style.opacity = '0'\n\n\t\tsetTimeout(() => {\n\t\t\tripple.remove()\n\t\t}, duration)\n\t}\n}\n\n/**\n * v-ripple directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-ripple>Click me</button>\n * <button v-ripple=\"'rgba(255, 255, 255, 0.3)'\">Custom color</button>\n * <button v-ripple=\"{ color: 'red', duration: 800 }\">Custom options</button>\n * </template>\n * ```\n */\nexport const vRipple = defineDirective<RippleBinding, HTMLElement>({\n\tname: 'ripple',\n\tssr: false,\n\tdefaults: {\n\t\tcolor: 'currentColor',\n\t\tduration: 600,\n\t\tdisabled: false,\n\t\tinitialScale: 0,\n\t\tfinalScale: 2,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Ensure element has proper positioning\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\t// Ensure overflow is hidden to contain ripple\n\t\tif (computedStyle.overflow === 'visible') {\n\t\t\tel.style.overflow = 'hidden'\n\t\t}\n\n\t\t// Add base class\n\t\tel.classList.add('v-ripple')\n\n\t\tconst state: RippleState = {\n\t\t\toptions,\n\t\t\tclickHandler: (e: Event) => {\n\t\t\t\t// Ignore if disabled\n\t\t\t\tif (state.options.disabled) return\n\n\t\t\t\tconst mouseEvent = e as MouseEvent\n\n\t\t\t\t// Create and append ripple\n\t\t\t\tconst ripple = createRipple(mouseEvent, el, state.options)\n\n\t\t\t\tif (ripple) {\n\t\t\t\t\tel.appendChild(ripple)\n\t\t\t\t\tanimateRipple(ripple, state.options)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__ripple = state\n\n\t\t// Bind click event\n\t\ton(el, 'click', state.clickHandler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: RippleState = (el as any).__ripple\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: RippleState = (el as any).__ripple\n\n\t\tif (!state) return\n\n\t\t// Unbind event\n\t\toff(el, 'click', state.clickHandler)\n\n\t\t// Remove class\n\t\tel.classList.remove('v-ripple')\n\n\t\tdelete (el as any).__ripple\n\t},\n})\n\nexport default vRipple\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Sanitize handler\n */\nexport type SanitizeHandler = (value: string) => string\n\n/**\n * Sanitize directive options\n */\nexport interface SanitizeOptions {\n\t/**\n\t * Tags to allow (whitelist)\n\t * @default []\n\t */\n\tallowedTags?: string[]\n\n\t/**\n\t * Attributes to allow (whitelist)\n\t * @default []\n\t */\n\tallowedAttributes?: string[]\n\n\t/**\n\t * Whether to allow data URLs\n\t * @default false\n\t */\n\tallowDataUrls?: boolean\n\n\t/**\n\t * Whether to allow inline styles\n\t * @default false\n\t */\n\tallowStyles?: boolean\n\n\t/**\n\t * Whether to allow class attribute\n\t * @default false\n\t */\n\tallowClass?: boolean\n\n\t/**\n\t * Whether to allow id attribute\n\t * @default false\n\t */\n\tallowId?: boolean\n\n\t/**\n\t * Custom sanitize function\n\t */\n\thandler?: SanitizeHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to sanitize on update\n\t * @default true\n\t */\n\tsanitizeOnUpdate?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type SanitizeBinding = boolean | SanitizeOptions\n\n/**\n * Default allowed tags (safe subset)\n */\nconst DEFAULT_ALLOWED_TAGS = ['b', 'i', 'u', 'strong', 'em', 'br', 'p', 'span', 'div']\n\n/**\n * Default allowed attributes\n */\nconst DEFAULT_ALLOWED_ATTRIBUTES = ['title', 'alt', 'href', 'src']\n\n/**\n * Dangerous tags that should always be removed\n */\nconst DANGEROUS_TAGS = ['script', 'iframe', 'object', 'embed', 'form', 'input', 'style', 'link', 'meta', 'base']\n\n/**\n * Dangerous attributes that should always be removed\n */\nconst DANGEROUS_ATTRIBUTES = ['onclick', 'onerror', 'onload', 'onmouseover', 'onfocus', 'onblur', 'onchange', 'onsubmit']\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: SanitizeBinding | undefined): SanitizeOptions {\n\tif (binding === false) {\n\t\treturn { disabled: true }\n\t}\n\n\tif (binding === true) {\n\t\treturn {\n\t\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\t}\n\t}\n\n\treturn {\n\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\tallowDataUrls: false,\n\t\tallowStyles: false,\n\t\tallowClass: false,\n\t\tallowId: false,\n\t\tdisabled: false,\n\t\tsanitizeOnUpdate: true,\n\t\t...binding,\n\t}\n}\n\n/**\n * Basic HTML sanitizer\n */\nfunction sanitizeHtml(html: string, options: SanitizeOptions): string {\n\t// Use custom handler if provided\n\tif (options.handler) {\n\t\treturn options.handler(html)\n\t}\n\n\t// Create a temporary element for parsing\n\tconst temp = document.createElement('div')\n\n\ttemp.innerHTML = html\n\n\t// Remove dangerous tags\n\tfor (const tag of DANGEROUS_TAGS) {\n\t\tconst elements = temp.getElementsByTagName(tag)\n\n\t\twhile (elements.length > 0) {\n\t\t\telements[0].parentNode?.removeChild(elements[0])\n\t\t}\n\t}\n\n\t// Process all elements\n\tconst processElement = (el: Element): void => {\n\t\t// Check if tag is allowed\n\t\tconst tagName = el.tagName.toLowerCase()\n\n\t\tif (options.allowedTags && !options.allowedTags.includes(tagName)) {\n\t\t\t// Replace with text content\n\t\t\tconst text = document.createTextNode(el.textContent || '')\n\n\t\t\tel.parentNode?.replaceChild(text, el)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Remove dangerous attributes\n\t\tfor (const attr of DANGEROUS_ATTRIBUTES) {\n\t\t\tel.removeAttribute(attr)\n\t\t}\n\n\t\t// Remove javascript: URLs\n\t\tconst href = el.getAttribute('href')\n\n\t\tif (href && href.toLowerCase().startsWith('javascript:')) {\n\t\t\tel.removeAttribute('href')\n\t\t}\n\n\t\t// Remove data: URLs if not allowed\n\t\tif (!options.allowDataUrls) {\n\t\t\tconst src = el.getAttribute('src')\n\n\t\t\tif (src && src.toLowerCase().startsWith('data:')) {\n\t\t\t\tel.removeAttribute('src')\n\t\t\t}\n\t\t}\n\n\t\t// Filter attributes\n\t\tif (options.allowedAttributes) {\n\t\t\tconst attrs = Array.from(el.attributes)\n\n\t\t\tfor (const attr of attrs) {\n\t\t\t\tconst isAllowed = options.allowedAttributes.includes(attr.name.toLowerCase())\n\t\t\t\tconst isClass = attr.name === 'class' && options.allowClass\n\t\t\t\tconst isId = attr.name === 'id' && options.allowId\n\t\t\t\tconst isStyle = attr.name === 'style' && options.allowStyles\n\n\t\t\t\tif (!isAllowed && !isClass && !isId && !isStyle) {\n\t\t\t\t\tel.removeAttribute(attr.name)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Process children\n\t\tfor (const child of Array.from(el.children)) {\n\t\t\tprocessElement(child)\n\t\t}\n\t}\n\n\t// Process all child elements\n\tfor (const child of Array.from(temp.children)) {\n\t\tprocessElement(child)\n\t}\n\n\treturn temp.innerHTML\n}\n\n/**\n * v-sanitize directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-sanitize v-html=\"userContent\"></div>\n * <div v-sanitize=\"{ allowedTags: ['b', 'i', 'p'] }\" v-html=\"userContent\"></div>\n * <div v-sanitize=\"{ handler: customSanitizer }\" v-html=\"userContent\"></div>\n * </template>\n * ```\n */\nexport const vSanitize = defineDirective<SanitizeBinding, HTMLElement>({\n\tname: 'sanitize',\n\tssr: true,\n\tdefaults: {\n\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\tallowDataUrls: false,\n\t\tallowStyles: false,\n\t\tallowClass: false,\n\t\tallowId: false,\n\t\tdisabled: false,\n\t\tsanitizeOnUpdate: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Store options\n\t\t;(el as any).__sanitize = { options }\n\n\t\t// Sanitize initial content\n\t\tconst content = el.innerHTML\n\n\t\tif (content) {\n\t\t\tel.innerHTML = sanitizeHtml(content, options)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__sanitize\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\tif (state.options.disabled || !state.options.sanitizeOnUpdate) return\n\n\t\t// Sanitize updated content\n\t\tconst content = el.innerHTML\n\n\t\tif (content) {\n\t\t\tel.innerHTML = sanitizeHtml(content, state.options)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tdelete (el as any).__sanitize\n\t},\n})\n\nexport default vSanitize\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\n/**\n * Scroll event handler\n */\nexport type ScrollHandler = (event: Event, info: ScrollInfo) => void\n\n/**\n * Scroll information\n */\nexport interface ScrollInfo {\n\t/** Current scroll left position */\n\tscrollLeft: number\n\t/** Current scroll top position */\n\tscrollTop: number\n\t/** Maximum scroll left */\n\tscrollLeftMax: number\n\t/** Maximum scroll top */\n\tscrollTopMax: number\n\t/** Horizontal scroll progress (0-1) */\n\tprogressX: number\n\t/** Vertical scroll progress (0-1) */\n\tprogressY: number\n\t/** Direction of horizontal scroll (-1: left, 1: right, 0: none) */\n\tdirectionX: -1 | 0 | 1\n\t/** Direction of vertical scroll (-1: up, 1: down, 0: none) */\n\tdirectionY: -1 | 0 | 1\n\t/** Scroll container element or window */\n\tcontainer: Element | Window\n}\n\n/**\n * Scroll directive options\n */\nexport interface ScrollOptions {\n\t/**\n\t * Scroll event handler\n\t * @required\n\t */\n\thandler: ScrollHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to use passive event listener\n\t * @default true\n\t */\n\tpassive?: boolean\n\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 0 (no throttle)\n\t */\n\tthrottle?: number\n\n\t/**\n\t * Custom scroll container selector or element\n\t */\n\tcontainer?: string | Element | Window | null\n}\n\n/**\n * Directive binding value type\n */\nexport type ScrollBinding = ScrollHandler | ScrollOptions\n\n/**\n * Element state storage\n */\ninterface ScrollState {\n\toptions: ScrollOptions\n\tscrollHandler: (e: Event) => void\n\tcontainer: Element | Window\n\tlastScrollLeft: number\n\tlastScrollTop: number\n\tthrottleTimer: ReturnType<typeof setTimeout> | null\n\tpendingEvent: Event | null\n}\n\n/**\n * Get scroll info\n */\nfunction getScrollInfo(container: Element | Window, lastScrollLeft: number, lastScrollTop: number): ScrollInfo {\n\tlet scrollLeft = 0,\n\t\tscrollTop = 0,\n\t\tscrollLeftMax = 0,\n\t\tscrollTopMax = 0\n\n\tif (container === window) {\n\t\tscrollLeft = window.scrollX || document.documentElement.scrollLeft\n\t\tscrollTop = window.scrollY || document.documentElement.scrollTop\n\t\tscrollLeftMax = document.documentElement.scrollWidth - window.innerWidth\n\t\tscrollTopMax = document.documentElement.scrollHeight - window.innerHeight\n\t} else {\n\t\tconst el = container as Element\n\n\t\tscrollLeft = el.scrollLeft\n\t\tscrollTop = el.scrollTop\n\t\tscrollLeftMax = el.scrollWidth - el.clientWidth\n\t\tscrollTopMax = el.scrollHeight - el.clientHeight\n\t}\n\n\tconst progressX = scrollLeftMax > 0 ? scrollLeft / scrollLeftMax : 0\n\tconst progressY = scrollTopMax > 0 ? scrollTop / scrollTopMax : 0\n\n\t// Calculate direction\n\tconst directionX: -1 | 0 | 1 = scrollLeft !== lastScrollLeft ? (scrollLeft > lastScrollLeft ? 1 : -1) : 0\n\tconst directionY: -1 | 0 | 1 = scrollTop !== lastScrollTop ? (scrollTop > lastScrollTop ? 1 : -1) : 0\n\n\treturn {\n\t\tscrollLeft,\n\t\tscrollTop,\n\t\tscrollLeftMax,\n\t\tscrollTopMax,\n\t\tprogressX,\n\t\tprogressY,\n\t\tdirectionX,\n\t\tdirectionY,\n\t\tcontainer,\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ScrollBinding | undefined): ScrollOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, passive: true }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-scroll: handler is required')\n\t}\n\n\treturn {\n\t\tpassive: true,\n\t\tthrottle: 0,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-scroll directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-scroll=\"handleScroll\">Scroll container</div>\n * <div v-scroll=\"{ handler: handleScroll, throttle: 100 }\">Throttled scroll</div>\n * </template>\n * ```\n */\nexport const vScroll = defineDirective<ScrollBinding, HTMLElement>({\n\tname: 'scroll',\n\tssr: false,\n\tdefaults: {\n\t\tpassive: true,\n\t\tthrottle: 0,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Determine scroll container\n\t\tlet container: Element | Window\n\n\t\tif (options.container) {\n\t\t\tif (options.container === window) {\n\t\t\t\tcontainer = window\n\t\t\t} else if (typeof options.container === 'string') {\n\t\t\t\tconst found = document.querySelector(options.container)\n\n\t\t\t\tcontainer = found || getScrollParent(el)\n\t\t\t} else {\n\t\t\t\tcontainer = options.container\n\t\t\t}\n\t\t} else {\n\t\t\t// Check if element itself is scrollable\n\t\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(el)\n\t\t\tconst isSelfScrollable = /(auto|scroll)/.test(overflow + overflowX + overflowY)\n\n\t\t\tcontainer = isSelfScrollable ? el : getScrollParent(el)\n\t\t}\n\n\t\tconst state: ScrollState = {\n\t\t\toptions,\n\t\t\tcontainer,\n\t\t\tlastScrollLeft: 0,\n\t\t\tlastScrollTop: 0,\n\t\t\tthrottleTimer: null,\n\t\t\tpendingEvent: null,\n\t\t\tscrollHandler: (e: Event) => {\n\t\t\t\t// Handle throttle\n\t\t\t\tif (options.throttle && options.throttle > 0) {\n\t\t\t\t\tstate.pendingEvent = e\n\n\t\t\t\t\tif (!state.throttleTimer) {\n\t\t\t\t\t\tstate.throttleTimer = setTimeout(() => {\n\t\t\t\t\t\t\tif (state.pendingEvent) {\n\t\t\t\t\t\t\t\tconst info = getScrollInfo(container, state.lastScrollLeft, state.lastScrollTop)\n\n\t\t\t\t\t\t\t\tstate.lastScrollLeft = info.scrollLeft\n\t\t\t\t\t\t\t\tstate.lastScrollTop = info.scrollTop\n\t\t\t\t\t\t\t\toptions.handler(state.pendingEvent, info)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate.throttleTimer = null\n\t\t\t\t\t\t\tstate.pendingEvent = null\n\t\t\t\t\t\t}, options.throttle)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst info = getScrollInfo(container, state.lastScrollLeft, state.lastScrollTop)\n\n\t\t\t\t\tstate.lastScrollLeft = info.scrollLeft\n\t\t\t\t\tstate.lastScrollTop = info.scrollTop\n\t\t\t\t\toptions.handler(e, info)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Initialize last scroll position\n\t\tconst initialInfo = getScrollInfo(container, 0, 0)\n\n\t\tstate.lastScrollLeft = initialInfo.scrollLeft\n\t\tstate.lastScrollTop = initialInfo.scrollTop\n\n\t\t// Store state\n\t\t;(el as any).__scroll = state\n\n\t\t// Bind scroll event\n\t\ton(container, 'scroll', state.scrollHandler, { passive: options.passive })\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ScrollState = (el as any).__scroll\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ScrollState = (el as any).__scroll\n\n\t\tif (!state) return\n\n\t\t// Clear throttle timer\n\t\tif (state.throttleTimer) {\n\t\t\tclearTimeout(state.throttleTimer)\n\t\t}\n\n\t\t// Unbind scroll event\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\n\t\tdelete (el as any).__scroll\n\t},\n})\n\nexport default vScroll\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\nconst STATE_KEY = '__sticky' as const\n\n/**\n * Sticky directive options\n */\nexport interface StickyOptions {\n\t/** Top offset when sticky @default 0 */\n\ttop?: number | string\n\t/** Bottom offset when sticky */\n\tbottom?: number | string\n\t/** Z-index when sticky @default 100 */\n\tzIndex?: number\n\t/** CSS class to add when sticky @default 'v-sticky--fixed' */\n\tstickyClass?: string\n\t/** Whether to disable @default false */\n\tdisabled?: boolean\n\t/** Callback when sticky state changes */\n\tonChange?: (isSticky: boolean) => void\n\t/** Custom scroll container */\n\tcontainer?: string | Element | null\n}\n\nexport type StickyBinding = boolean | number | StickyOptions\n\ninterface StickyState {\n\toptions: StickyOptions\n\tplaceholder: HTMLDivElement | null\n\toriginalStyles: { position: string, top: string, bottom: string, zIndex: string, width: string }\n\tisSticky: boolean\n\tscrollHandler: () => void\n\tresizeHandler: () => void\n\tcontainer: Element | Window\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: StickyBinding | undefined): StickyOptions {\n\tif (binding === false) return { disabled: true, top: 0, zIndex: 100 }\n\tif (typeof binding === 'number') return { top: binding, zIndex: 100 }\n\n\treturn {\n\t\ttop: 0,\n\t\tzIndex: 100,\n\t\tstickyClass: 'v-sticky--fixed',\n\t\tdisabled: false,\n\t\t...(binding && typeof binding === 'object' ? binding : {}),\n\t}\n}\n\n/**\n * Parse offset value to CSS string\n */\nfunction parseOffset(value: number | string | undefined): string {\n\tif (value === undefined) return '0'\n\n\treturn typeof value === 'number' ? `${value}px` : value\n}\n\n/**\n * Get scroll container for element\n */\nfunction getScrollContainer(el: HTMLElement, customContainer?: string | Element | null): Element | Window {\n\tif (customContainer) {\n\t\tif (typeof customContainer === 'string') {\n\t\t\treturn document.querySelector(customContainer) || getScrollParent(el)\n\t\t}\n\n\t\treturn customContainer\n\t}\n\n\t// Check if parent element is scrollable\n\tconst parent = el.parentElement\n\n\tif (parent) {\n\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent)\n\n\t\tif (/(auto|scroll)/.test(overflow + overflowX + overflowY)) {\n\t\t\treturn parent\n\t\t}\n\t}\n\n\treturn getScrollParent(el)\n}\n\n/**\n * Check and update sticky state\n */\nfunction checkSticky(el: HTMLElement, state: StickyState): void {\n\tif (state.options.disabled) {\n\t\tunsetSticky(el, state)\n\n\t\treturn\n\t}\n\n\tconst topOffset = parseFloat(parseOffset(state.options.top))\n\tconst containerRect = state.container === window ? { top: 0 } : (state.container as Element).getBoundingClientRect()\n\n\t// Use placeholder position when sticky, otherwise use element position\n\tconst referenceEl = state.placeholder || el\n\tconst rect = referenceEl.getBoundingClientRect()\n\tconst elementTopRelativeToContainer = rect.top - containerRect.top\n\n\tconst shouldSticky = elementTopRelativeToContainer <= topOffset\n\n\tif (shouldSticky && !state.isSticky) {\n\t\tsetSticky(el, state, topOffset, containerRect.top)\n\t} else if (!shouldSticky && state.isSticky) {\n\t\tunsetSticky(el, state)\n\t}\n}\n\n/**\n * Set element as sticky\n */\nfunction setSticky(el: HTMLElement, state: StickyState, topOffset: number, containerTop: number): void {\n\tstate.isSticky = true\n\n\t// Create placeholder to maintain layout\n\tconst placeholder = document.createElement('div')\n\n\tplaceholder.style.cssText = `width:${el.offsetWidth}px;height:${el.offsetHeight}px`\n\tel.parentNode?.insertBefore(placeholder, el)\n\tstate.placeholder = placeholder\n\n\t// Calculate fixed top position relative to viewport\n\tconst fixedTop = state.container === window ? topOffset : containerTop + topOffset\n\n\t// Apply sticky styles\n\tel.style.position = 'fixed'\n\tel.style.top = `${fixedTop}px`\n\tel.style.zIndex = String(state.options.zIndex || 100)\n\tel.style.width = `${el.offsetWidth}px`\n\n\tif (state.options.bottom !== undefined) {\n\t\tel.style.bottom = parseOffset(state.options.bottom)\n\t}\n\n\tstate.options.stickyClass && el.classList.add(state.options.stickyClass)\n\tel.dispatchEvent(new CustomEvent('sticky:change', { detail: { isSticky: true } }))\n\tstate.options.onChange?.(true)\n}\n\n/**\n * Unset element as sticky\n */\nfunction unsetSticky(el: HTMLElement, state: StickyState): void {\n\tif (!state.isSticky) return\n\n\tstate.isSticky = false\n\n\t// Remove placeholder\n\tstate.placeholder?.parentNode?.removeChild(state.placeholder)\n\tstate.placeholder = null\n\n\t// Restore original styles\n\tObject.assign(el.style, state.originalStyles)\n\n\tstate.options.stickyClass && el.classList.remove(state.options.stickyClass)\n\tel.dispatchEvent(new CustomEvent('sticky:change', { detail: { isSticky: false } }))\n\tstate.options.onChange?.(false)\n}\n\n/**\n * v-sticky directive\n *\n * @example\n * ```vue\n * <div v-sticky>Sticky header</div>\n * <div v-sticky=\"50\">Sticky with 50px top offset</div>\n * <div v-sticky=\"{ top: 60, zIndex: 1000 }\">Custom sticky</div>\n * ```\n */\nexport const vSticky = defineDirective<StickyBinding, HTMLElement>({\n\tname: 'sticky',\n\tssr: false,\n\tdefaults: { top: 0, zIndex: 100, stickyClass: 'v-sticky--fixed', disabled: false },\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst container = getScrollContainer(el, options.container)\n\n\t\tconst state: StickyState = {\n\t\t\toptions,\n\t\t\tplaceholder: null,\n\t\t\toriginalStyles: {\n\t\t\t\tposition: el.style.position,\n\t\t\t\ttop: el.style.top,\n\t\t\t\tbottom: el.style.bottom,\n\t\t\t\tzIndex: el.style.zIndex,\n\t\t\t\twidth: el.style.width,\n\t\t\t},\n\t\t\tisSticky: false,\n\t\t\tcontainer,\n\t\t\tscrollHandler: () => checkSticky(el, state),\n\t\t\tresizeHandler: () => checkSticky(el, state),\n\t\t}\n\n\t\tel.classList.add('v-sticky')\n\t\t;(el as any)[STATE_KEY] = state\n\n\t\ton(container, 'scroll', state.scrollHandler, { passive: true })\n\t\ton(window, 'resize', state.resizeHandler, { passive: true })\n\t\tcheckSticky(el, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: StickyState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t\tcheckSticky(el, state)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: StickyState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tstate.placeholder?.parentNode?.removeChild(state.placeholder)\n\n\t\tObject.assign(el.style, state.originalStyles)\n\t\tel.classList.remove('v-sticky', state.options.stickyClass || 'v-sticky--fixed')\n\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\t\toff(window, 'resize', state.resizeHandler)\n\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vSticky\n","import { defineDirective } from '@directix/core'\n\nexport type SwipeDirection = 'left' | 'right' | 'up' | 'down'\n\nexport type SwipeHandler = (direction: SwipeDirection, event: Event) => void\n\nexport interface SwipeOptions {\n\thandler?: SwipeHandler\n\tthreshold?: number\n\tmaxTime?: number\n\tdirections?: SwipeDirection[]\n\tpreventScrollOnSwipe?: boolean\n\tdisabled?: boolean\n\tmouse?: boolean\n\tonLeft?: () => void\n\tonRight?: () => void\n\tonUp?: () => void\n\tonDown?: () => void\n}\n\nexport type SwipeBinding = SwipeHandler | SwipeOptions\n\ninterface SwipeState {\n\toptions: SwipeOptions\n\tstartX: number\n\tstartY: number\n\tstartTime: number\n\tisActive: boolean\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: (e: TouchEvent) => void\n\t\tmouseDown: (e: MouseEvent) => void\n\t\tmouseUp: (e: MouseEvent) => void\n\t}\n}\n\nconst DEFAULT_THRESHOLD = 30\nconst DEFAULT_MAX_TIME = 500\nconst DEFAULT_DIRECTIONS: SwipeDirection[] = ['left', 'right', 'up', 'down']\n\nfunction getSwipeDirection(\n\tdeltaX: number,\n\tdeltaY: number,\n\tallowedDirections: SwipeDirection[],\n): SwipeDirection | null {\n\tconst absX = Math.abs(deltaX)\n\tconst absY = Math.abs(deltaY)\n\n\tif (absX > absY) {\n\t\tconst direction = deltaX > 0 ? 'right' : 'left'\n\t\treturn allowedDirections.includes(direction) ? direction : null\n\t} else {\n\t\tconst direction = deltaY > 0 ? 'down' : 'up'\n\t\treturn allowedDirections.includes(direction) ? direction : null\n\t}\n}\n\nfunction normalizeOptions(binding: SwipeBinding): SwipeOptions {\n\tif (typeof binding === 'function') return { handler: binding }\n\n\treturn {\n\t\thandler: binding.handler,\n\t\tthreshold: binding.threshold ?? DEFAULT_THRESHOLD,\n\t\tmaxTime: binding.maxTime ?? DEFAULT_MAX_TIME,\n\t\tdirections: binding.directions ?? [...DEFAULT_DIRECTIONS],\n\t\tpreventScrollOnSwipe: binding.preventScrollOnSwipe ?? true,\n\t\tdisabled: binding.disabled ?? false,\n\t\tmouse: binding.mouse ?? true,\n\t\tonLeft: binding.onLeft,\n\t\tonRight: binding.onRight,\n\t\tonUp: binding.onUp,\n\t\tonDown: binding.onDown,\n\t}\n}\n\nfunction triggerSwipe(\n\tstate: SwipeState,\n\tdeltaX: number,\n\tdeltaY: number,\n\tdeltaTime: number,\n\tevent: Event,\n\tel: HTMLElement,\n): void {\n\tconst { options } = state\n\n\t// Check time\n\tif (deltaTime > (options.maxTime ?? DEFAULT_MAX_TIME)) return\n\n\t// Check distance\n\tconst distance = Math.max(Math.abs(deltaX), Math.abs(deltaY))\n\tif (distance < (options.threshold ?? DEFAULT_THRESHOLD)) return\n\n\t// Get direction\n\tconst direction = getSwipeDirection(deltaX, deltaY, options.directions ?? DEFAULT_DIRECTIONS)\n\tif (!direction) return\n\n\t// Prevent scroll\n\tif (options.preventScrollOnSwipe && event.cancelable) {\n\t\tevent.preventDefault()\n\t}\n\n\t// Call handlers\n\toptions.handler?.(direction, event)\n\n\t// Direction-specific callbacks\n\tconst callbacks: Record<SwipeDirection, (() => void) | undefined> = {\n\t\tleft: options.onLeft,\n\t\tright: options.onRight,\n\t\tup: options.onUp,\n\t\tdown: options.onDown,\n\t}\n\tcallbacks[direction]?.()\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('swipe', { detail: { direction, deltaX, deltaY, deltaTime } }))\n}\n\nfunction createSwipeHandler(\n\tel: HTMLElement,\n\tstate: SwipeState,\n): (clientX: number, clientY: number, event: Event) => void {\n\treturn (clientX, clientY, event) => {\n\t\tconst deltaX = clientX - state.startX\n\t\tconst deltaY = clientY - state.startY\n\t\tconst deltaTime = Date.now() - state.startTime\n\t\ttriggerSwipe(state, deltaX, deltaY, deltaTime, event, el)\n\t}\n}\n\nfunction setupState(el: HTMLElement, options: SwipeOptions): SwipeState | null {\n\tif (options.disabled) return null\n\n\tel.style.touchAction = 'none'\n\tel.style.userSelect = 'none'\n\n\tconst state: SwipeState = {\n\t\toptions,\n\t\tstartX: 0,\n\t\tstartY: 0,\n\t\tstartTime: 0,\n\t\tisActive: false,\n\t\thandlers: null as any,\n\t}\n\n\tconst handleSwipe = createSwipeHandler(el, state)\n\n\tstate.handlers = {\n\t\ttouchStart: (e: TouchEvent) => {\n\t\t\tif (state.options.disabled) return\n\t\t\tstate.startX = e.touches[0].clientX\n\t\t\tstate.startY = e.touches[0].clientY\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isActive = true\n\t\t},\n\n\t\ttouchMove: (e: TouchEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tif (state.options.preventScrollOnSwipe) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\t\t},\n\n\t\ttouchEnd: (e: TouchEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tstate.isActive = false\n\t\t\tconst touch = e.changedTouches[0]\n\t\t\thandleSwipe(touch.clientX, touch.clientY, e)\n\t\t},\n\n\t\tmouseDown: (e: MouseEvent) => {\n\t\t\tif (state.options.disabled) return\n\t\t\tstate.startX = e.clientX\n\t\t\tstate.startY = e.clientY\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isActive = true\n\t\t},\n\n\t\tmouseUp: (e: MouseEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tstate.isActive = false\n\t\t\thandleSwipe(e.clientX, e.clientY, e)\n\t\t},\n\t}\n\n\treturn state\n}\n\nfunction bindEvents(el: HTMLElement, state: SwipeState): void {\n\tconst { handlers } = state\n\tconst enableMouse = state.options.mouse ?? true\n\n\tel.addEventListener('touchstart', handlers.touchStart, { passive: true })\n\tel.addEventListener('touchmove', handlers.touchMove, { passive: false })\n\tel.addEventListener('touchend', handlers.touchEnd)\n\tel.addEventListener('touchcancel', handlers.touchEnd)\n\n\tif (enableMouse) {\n\t\tel.addEventListener('mousedown', handlers.mouseDown)\n\t\tel.addEventListener('mouseup', handlers.mouseUp)\n\t\tel.addEventListener('mouseleave', handlers.mouseUp)\n\t}\n}\n\nfunction unbindEvents(el: HTMLElement, state: SwipeState): void {\n\tconst { handlers } = state\n\tconst enableMouse = state.options.mouse ?? true\n\n\tel.removeEventListener('touchstart', handlers.touchStart)\n\tel.removeEventListener('touchmove', handlers.touchMove)\n\tel.removeEventListener('touchend', handlers.touchEnd)\n\tel.removeEventListener('touchcancel', handlers.touchEnd)\n\n\tif (enableMouse) {\n\t\tel.removeEventListener('mousedown', handlers.mouseDown)\n\t\tel.removeEventListener('mouseup', handlers.mouseUp)\n\t\tel.removeEventListener('mouseleave', handlers.mouseUp)\n\t}\n}\n\nexport const vSwipe = defineDirective<SwipeBinding, HTMLElement>({\n\tname: 'swipe',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state = setupState(el, options)\n\t\tif (!state) return\n\n\t\t;(el as any).__swipe = state\n\t\tbindEvents(el, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: SwipeState | undefined = (el as any).__swipe\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (!state) {\n\t\t\tconst newState = setupState(el, newOptions)\n\t\t\tif (newState) {\n\t\t\t\t;(el as any).__swipe = newState\n\t\t\t\tbindEvents(el, newState)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst wasDisabled = state.options.disabled\n\t\tconst wasMouseEnabled = state.options.mouse ?? true\n\t\tconst nowMouseEnabled = newOptions.mouse ?? true\n\n\t\tstate.options = newOptions\n\n\t\tif (newOptions.disabled && !wasDisabled) {\n\t\t\tunbindEvents(el, state)\n\t\t} else if (!newOptions.disabled && wasDisabled) {\n\t\t\tbindEvents(el, state)\n\t\t} else if (wasMouseEnabled !== nowMouseEnabled) {\n\t\t\tif (wasMouseEnabled) {\n\t\t\t\tel.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\t\t\tel.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\t\t\tel.removeEventListener('mouseleave', state.handlers.mouseUp)\n\t\t\t}\n\t\t\tif (nowMouseEnabled) {\n\t\t\t\tel.addEventListener('mousedown', state.handlers.mouseDown)\n\t\t\t\tel.addEventListener('mouseup', state.handlers.mouseUp)\n\t\t\t\tel.addEventListener('mouseleave', state.handlers.mouseUp)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: SwipeState | undefined = (el as any).__swipe\n\t\tif (!state) return\n\n\t\tunbindEvents(el, state)\n\t\tdelete (el as any).__swipe\n\t},\n})\n\nexport default vSwipe\n","import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\nimport { parseTime, throttle } from '@directix/shared'\nimport { getDefaultEventType, getEventTypeFromModifiers } from '../utils/event'\n\n/**\n * Throttled function type\n */\nexport interface ThrottledFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n}\n\n/**\n * Throttle directive options\n */\nexport interface ThrottleOptions<T extends (...args: any[]) => any = any> {\n\t/**\n\t * Function to throttle\n\t */\n\thandler: T\n\n\t/**\n\t * Delay time in milliseconds\n\t * @default 300\n\t */\n\twait?: number\n\n\t/**\n\t * Whether to invoke immediately before delay starts\n\t * @default true\n\t */\n\tleading?: boolean\n\n\t/**\n\t * Whether to invoke after delay ends\n\t * @default true\n\t */\n\ttrailing?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ThrottleBinding<T extends (...args: any[]) => any = any>\n\t= | T\n\t\t| ThrottleOptions<T>\n\n/**\n * Element state storage\n */\ninterface ThrottleState {\n\tthrottledFn: ThrottledFunction<any>\n\teventType: string\n\toptions: ThrottleOptions\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: ThrottleBinding,\n\tdirectiveBinding: DirectiveBinding<ThrottleBinding>,\n): ThrottleOptions {\n\tconst wait = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, wait }\n\t}\n\n\treturn { ...binding, wait: binding.wait || wait }\n}\n\n/**\n * v-throttle directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-throttle=\"handleClick\">Throttled Button</button>\n * <button v-throttle:1s=\"handleClick\">1s Throttled</button>\n * <div v-throttle.scroll=\"handleScroll\">Scroll Throttle</div>\n * <div v-throttle:100.scroll=\"handleScroll\">100ms Scroll Throttle</div>\n * </template>\n * ```\n */\nexport const vThrottle = defineDirective<ThrottleBinding, HTMLElement>({\n\tname: 'throttle',\n\tssr: true, // SSR safe - event binding is skipped on server\n\tdefaults: {\n\t\twait: 300,\n\t\tleading: true,\n\t\ttrailing: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t// Prefer event type from modifiers, otherwise infer from element type\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getDefaultEventType(el)\n\n\t\t// Create throttled function\n\t\tconst throttledFn = throttle(options.handler, options.wait, {\n\t\t\tleading: options.leading,\n\t\t\ttrailing: options.trailing,\n\t\t})\n\n\t\t// Bind event\n\t\tel.addEventListener(eventType, throttledFn as any)\n\n\t\t;(el as any).__throttle = {\n\t\t\tthrottledFn,\n\t\t\teventType,\n\t\t\toptions,\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ThrottleState = (el as any).__throttle\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If configuration changes, recreate throttled function\n\t\tif (\n\t\t\tnewOptions.wait !== state.options.wait\n\t\t\t|| newOptions.leading !== state.options.leading\n\t\t\t|| newOptions.trailing !== state.options.trailing\n\t\t) {\n\t\t\t// Cancel old one\n\t\t\tstate.throttledFn.cancel()\n\n\t\t\t// Create new one\n\t\t\tconst throttledFn = throttle(newOptions.handler, newOptions.wait, {\n\t\t\t\tleading: newOptions.leading,\n\t\t\t\ttrailing: newOptions.trailing,\n\t\t\t})\n\n\t\t\tel.removeEventListener(state.eventType, state.throttledFn as any)\n\t\t\tel.addEventListener(state.eventType, throttledFn as any)\n\n\t\t\t;(el as any).__throttle = {\n\t\t\t\tthrottledFn,\n\t\t\t\teventType: state.eventType,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t} else if (newOptions.handler !== state.options.handler) {\n\t\t\t// Only update handler\n\t\t\tstate.options.handler = newOptions.handler\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ThrottleState = (el as any).__throttle\n\n\t\tif (!state) return\n\n\t\tstate.throttledFn.cancel()\n\t\tel.removeEventListener(state.eventType, state.throttledFn as any)\n\t\tdelete (el as any).__throttle\n\t},\n})\n\nexport default vThrottle\n","import { defineDirective } from '@directix/core'\n\n/**\n * Tooltip placement\n */\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right'\n\n/**\n * Tooltip trigger\n */\nexport type TooltipTrigger = 'hover' | 'click' | 'focus' | 'manual'\n\n/**\n * Tooltip directive options\n */\nexport interface TooltipOptions {\n\t/** Tooltip content */\n\tcontent: string\n\t/** Tooltip placement @default 'top' */\n\tplacement?: TooltipPlacement\n\t/** Trigger type @default 'hover' */\n\ttrigger?: TooltipTrigger\n\t/** Show delay in milliseconds @default 0 */\n\tdelay?: number\n\t/** Hide delay in milliseconds @default 0 */\n\thideDelay?: number\n\t/** Offset from the element in pixels @default 8 */\n\toffset?: number\n\t/** Custom class for the tooltip */\n\tclass?: string\n\t/** Whether to show arrow @default true */\n\tarrow?: boolean\n\t/** Whether the tooltip is disabled @default false */\n\tdisabled?: boolean\n\t/** Maximum width of the tooltip */\n\tmaxWidth?: number | string\n\t/** Z-index of the tooltip @default 9999 */\n\tzIndex?: number\n\t/** Callback when tooltip is shown */\n\tonShow?: () => void\n\t/** Callback when tooltip is hidden */\n\tonHide?: () => void\n}\n\nexport type TooltipBinding = string | TooltipOptions\n\ninterface TooltipState {\n\toptions: TooltipOptions\n\ttooltip: HTMLElement | null\n\tshowTimeout: ReturnType<typeof setTimeout> | null\n\thideTimeout: ReturnType<typeof setTimeout> | null\n\tisVisible: boolean\n\thandlers: {\n\t\tshow?: () => void\n\t\thide?: () => void\n\t\ttoggle?: () => void\n\t\tdocHide?: (e: Event) => void\n\t}\n}\n\n// Default tooltip styles\nconst TOOLTIP_STYLES = {\n\tpadding: '8px 12px',\n\tbackground: '#333',\n\tcolor: '#fff',\n\tborderRadius: '6px',\n\tfontSize: '14px',\n\tlineHeight: '1.5',\n\tminWidth: '96px',\n\tmaxWidth: '320px',\n\tboxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n}\n\n// Global tooltip container\nlet tooltipContainer: HTMLElement | null = null\n\nfunction getTooltipContainer(): HTMLElement {\n\tif (!tooltipContainer && typeof document !== 'undefined') {\n\t\ttooltipContainer = document.createElement('div')\n\t\ttooltipContainer.id = 'directix-tooltip-container'\n\t\ttooltipContainer.style.cssText = 'position: fixed; top: 0; left: 0; pointer-events: none; z-index: 9999;'\n\t\tdocument.body.appendChild(tooltipContainer)\n\t}\n\n\treturn tooltipContainer!\n}\n\nfunction createTooltip(options: TooltipOptions): HTMLElement {\n\tconst tooltip = document.createElement('div')\n\n\ttooltip.className = `v-tooltip v-tooltip--${options.placement || 'top'}`\n\tif (options.class) tooltip.classList.add(options.class)\n\n\tconst maxWidth = options.maxWidth ? typeof options.maxWidth === 'number' ? `${options.maxWidth}px` : options.maxWidth : TOOLTIP_STYLES.maxWidth\n\n\ttooltip.style.cssText = [\n\t\t'position: absolute',\n\t\t`padding: ${TOOLTIP_STYLES.padding}`,\n\t\t`background: ${TOOLTIP_STYLES.background}`,\n\t\t`color: ${TOOLTIP_STYLES.color}`,\n\t\t`border-radius: ${TOOLTIP_STYLES.borderRadius}`,\n\t\t`font-size: ${TOOLTIP_STYLES.fontSize}`,\n\t\t`line-height: ${TOOLTIP_STYLES.lineHeight}`,\n\t\t`min-width: ${TOOLTIP_STYLES.minWidth}`,\n\t\t`max-width: ${maxWidth}`,\n\t\t'word-wrap: break-word',\n\t\t`box-shadow: ${TOOLTIP_STYLES.boxShadow}`,\n\t\t'pointer-events: none',\n\t\t'opacity: 0',\n\t\t'transition: opacity 0.2s ease',\n\t\t`z-index: ${options.zIndex || 9999}`,\n\t].join(';')\n\n\t// Add arrow\n\tif (options.arrow !== false) {\n\t\tconst arrow = document.createElement('div')\n\n\t\tarrow.className = 'v-tooltip__arrow'\n\t\tarrow.style.cssText = 'position: absolute; width: 8px; height: 8px; background: #333; transform: rotate(45deg);'\n\t\ttooltip.appendChild(arrow)\n\t}\n\n\t// Add content\n\tconst content = document.createElement('div')\n\n\tcontent.className = 'v-tooltip__content'\n\tcontent.textContent = options.content\n\ttooltip.appendChild(content)\n\n\treturn tooltip\n}\n\nfunction positionTooltip(\n\ttooltip: HTMLElement,\n\tel: HTMLElement,\n\tplacement: TooltipPlacement,\n\toffset: number,\n): void {\n\tconst elRect = el.getBoundingClientRect()\n\tconst tooltipRect = tooltip.getBoundingClientRect()\n\n\tlet top = 0,\n\t\tleft = 0\n\n\tswitch (placement) {\n\t\tcase 'top':\n\t\t\ttop = elRect.top - tooltipRect.height - offset\n\t\t\tleft = elRect.left + (elRect.width - tooltipRect.width) / 2\n\t\t\tbreak\n\t\tcase 'bottom':\n\t\t\ttop = elRect.bottom + offset\n\t\t\tleft = elRect.left + (elRect.width - tooltipRect.width) / 2\n\t\t\tbreak\n\t\tcase 'left':\n\t\t\ttop = elRect.top + (elRect.height - tooltipRect.height) / 2\n\t\t\tleft = elRect.left - tooltipRect.width - offset\n\t\t\tbreak\n\t\tcase 'right':\n\t\t\ttop = elRect.top + (elRect.height - tooltipRect.height) / 2\n\t\t\tleft = elRect.right + offset\n\t\t\tbreak\n\t}\n\n\t// Keep within viewport\n\tconst viewportWidth = window.innerWidth\n\tconst viewportHeight = window.innerHeight\n\n\tif (left < 0) left = 8\n\tif (left + tooltipRect.width > viewportWidth) left = viewportWidth - tooltipRect.width - 8\n\tif (top < 0) top = 8\n\tif (top + tooltipRect.height > viewportHeight) top = viewportHeight - tooltipRect.height - 8\n\n\ttooltip.style.top = `${top}px`\n\ttooltip.style.left = `${left}px`\n\n\t// Position arrow\n\tconst arrow = tooltip.querySelector('.v-tooltip__arrow') as HTMLElement\n\n\tif (arrow) {\n\t\tconst halfArrow = 4\n\n\t\tswitch (placement) {\n\t\t\tcase 'top':\n\t\t\t\tObject.assign(arrow.style, { bottom: `-${halfArrow}px`, left: '50%', transform: 'translateX(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'bottom':\n\t\t\t\tObject.assign(arrow.style, { top: `-${halfArrow}px`, left: '50%', transform: 'translateX(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'left':\n\t\t\t\tObject.assign(arrow.style, { right: `-${halfArrow}px`, top: '50%', transform: 'translateY(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'right':\n\t\t\t\tObject.assign(arrow.style, { left: `-${halfArrow}px`, top: '50%', transform: 'translateY(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunction showTooltip(el: HTMLElement, state: TooltipState): void {\n\tif (state.isVisible || state.options.disabled) return\n\n\tif (state.hideTimeout) {\n\t\tclearTimeout(state.hideTimeout)\n\t\tstate.hideTimeout = null\n\t}\n\n\tconst doShow = (): void => {\n\t\tconst tooltip = createTooltip(state.options)\n\n\t\tstate.tooltip = tooltip\n\t\tgetTooltipContainer().appendChild(tooltip)\n\n\t\trequestAnimationFrame(() => {\n\t\t\tpositionTooltip(tooltip, el, state.options.placement || 'top', state.options.offset || 8)\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\ttooltip.style.opacity = '1'\n\t\t\t})\n\t\t})\n\n\t\tstate.isVisible = true\n\t\tstate.options.onShow?.()\n\t}\n\n\tif (state.options.delay && state.options.delay > 0) {\n\t\tstate.showTimeout = setTimeout(doShow, state.options.delay)\n\t} else {\n\t\tdoShow()\n\t}\n}\n\nfunction hideTooltip(state: TooltipState): void {\n\tif (!state.isVisible) return\n\n\tif (state.showTimeout) {\n\t\tclearTimeout(state.showTimeout)\n\t\tstate.showTimeout = null\n\t}\n\n\tconst doHide = (): void => {\n\t\tif (state.tooltip) {\n\t\t\tstate.tooltip.style.opacity = '0'\n\t\t\tsetTimeout(() => {\n\t\t\t\tstate.tooltip?.remove()\n\t\t\t\tstate.tooltip = null\n\t\t\t}, 200)\n\t\t}\n\n\t\tstate.isVisible = false\n\t\tstate.options.onHide?.()\n\t}\n\n\tif (state.options.hideDelay && state.options.hideDelay > 0) {\n\t\tstate.hideTimeout = setTimeout(doHide, state.options.hideDelay)\n\t} else {\n\t\tdoHide()\n\t}\n}\n\nfunction setupTriggerHandlers(el: HTMLElement, state: TooltipState): void {\n\tconst { trigger = 'hover' } = state.options\n\n\tconst show = (): void => showTooltip(el, state)\n\tconst hide = (): void => hideTooltip(state)\n\tconst toggle = (): void => (state.isVisible ? hide() : show())\n\n\tstate.handlers = { show, hide, toggle }\n\n\tswitch (trigger) {\n\t\tcase 'hover':\n\t\t\tel.addEventListener('mouseenter', show)\n\t\t\tel.addEventListener('mouseleave', hide)\n\t\t\tbreak\n\t\tcase 'click':\n\t\t\tel.addEventListener('click', toggle)\n\t\t\tdocument.addEventListener('click', state.handlers.docHide = (e: Event) => {\n\t\t\t\tif (state.isVisible && !el.contains(e.target as Node)) hide()\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'focus':\n\t\t\tel.addEventListener('focus', show)\n\t\t\tel.addEventListener('blur', hide)\n\t\t\tbreak\n\t\t// 'manual' - no automatic handlers\n\t}\n}\n\nfunction removeTriggerHandlers(el: HTMLElement, state: TooltipState): void {\n\tconst { show, hide, toggle, docHide } = state.handlers\n\n\tif (show) {\n\t\tel.removeEventListener('mouseenter', show)\n\t\tel.removeEventListener('focus', show)\n\t}\n\tif (hide) {\n\t\tel.removeEventListener('mouseleave', hide)\n\t\tel.removeEventListener('blur', hide)\n\t}\n\tif (toggle) {\n\t\tel.removeEventListener('click', toggle)\n\t}\n\tif (docHide) {\n\t\tdocument.removeEventListener('click', docHide)\n\t}\n}\n\nfunction normalizeOptions(binding: TooltipBinding | undefined): TooltipOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { content: binding, placement: 'top', trigger: 'hover' }\n\t}\n\n\tif (!binding) {\n\t\treturn { content: '', placement: 'top', trigger: 'hover' }\n\t}\n\n\treturn {\n\t\tcontent: binding.content,\n\t\tplacement: binding.placement ?? 'top',\n\t\ttrigger: binding.trigger ?? 'hover',\n\t\tdelay: binding.delay ?? 0,\n\t\thideDelay: binding.hideDelay ?? 0,\n\t\toffset: binding.offset ?? 8,\n\t\tclass: binding.class,\n\t\tarrow: binding.arrow ?? true,\n\t\tdisabled: binding.disabled ?? false,\n\t\tmaxWidth: binding.maxWidth,\n\t\tzIndex: binding.zIndex ?? 9999,\n\t\tonShow: binding.onShow,\n\t\tonHide: binding.onHide,\n\t}\n}\n\nfunction createState(options: TooltipOptions): TooltipState {\n\treturn {\n\t\toptions,\n\t\ttooltip: null,\n\t\tshowTimeout: null,\n\t\thideTimeout: null,\n\t\tisVisible: false,\n\t\thandlers: {},\n\t}\n}\n\nexport const vTooltip = defineDirective<TooltipBinding, HTMLElement>({\n\tname: 'tooltip',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !options.content) return\n\n\t\tconst state = createState(options)\n\n\t\t;(el as any).__tooltip = state\n\t\tsetupTriggerHandlers(el, state)\n\t\tel.setAttribute('aria-describedby', 'v-tooltip')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: TooltipState | undefined = (el as any).__tooltip\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// No state exists - create if needed\n\t\tif (!state) {\n\t\t\tif (!newOptions.disabled && newOptions.content) {\n\t\t\t\tconst newState = createState(newOptions)\n\n\t\t\t\t;(el as any).__tooltip = newState\n\t\t\t\tsetupTriggerHandlers(el, newState)\n\n\t\t\t\tif (newOptions.trigger === 'manual') {\n\t\t\t\t\tshowTooltip(el, newState)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\t// Handle manual trigger\n\t\tif (newOptions.trigger === 'manual') {\n\t\t\tconst oldDisabled = state.options.disabled\n\n\t\t\tstate.options = newOptions\n\n\t\t\tif (newOptions.disabled && !oldDisabled) {\n\t\t\t\thideTooltip(state)\n\t\t\t} else if (!newOptions.disabled && oldDisabled) {\n\t\t\t\tshowTooltip(el, state)\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\t// Update visible tooltip content\n\t\tif (state.tooltip && state.isVisible) {\n\t\t\tconst content = state.tooltip.querySelector('.v-tooltip__content')\n\n\t\t\tif (content) content.textContent = newOptions.content\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: TooltipState | undefined = (el as any).__tooltip\n\n\t\tif (!state) return\n\n\t\tif (state.showTimeout) clearTimeout(state.showTimeout)\n\t\tif (state.hideTimeout) clearTimeout(state.hideTimeout)\n\t\tstate.tooltip?.remove()\n\t\tremoveTriggerHandlers(el, state)\n\t\tdelete (el as any).__tooltip\n\t},\n})\n\nexport default vTooltip\n","import { defineDirective } from '@directix/core'\n\n/**\n * Swipe direction\n */\nexport type SwipeDirection = 'left' | 'right' | 'up' | 'down'\n\n/**\n * Touch gesture options\n */\nexport interface TouchOptions {\n\t/** Minimum swipe distance in pixels @default 30 */\n\tswipeThreshold?: number\n\t/** Maximum time for a swipe in milliseconds @default 500 */\n\tswipeTimeout?: number\n\t/** Minimum pinch scale change @default 0.1 */\n\tpinchThreshold?: number\n\t/** Enable swipe detection @default true */\n\tenableSwipe?: boolean\n\t/** Enable pinch detection @default true */\n\tenablePinch?: boolean\n\t/** Enable rotate detection @default true */\n\tenableRotate?: boolean\n\t/** Enable tap detection @default true */\n\tenableTap?: boolean\n\t/** Maximum time for a tap in milliseconds @default 250 */\n\ttapTimeout?: number\n\t/** Maximum movement for a tap in pixels @default 10 */\n\ttapThreshold?: number\n\t/** Enable long press detection @default true */\n\tenableLongPress?: boolean\n\t/** Long press timeout in milliseconds @default 500 */\n\tlongPressTimeout?: number\n\t/** Enable mouse event simulation for desktop @default true */\n\tenableMouse?: boolean\n\n\tonSwipe?: (direction: SwipeDirection, event: TouchEvent | MouseEvent) => void\n\tonSwipeLeft?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeRight?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeUp?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeDown?: (event: TouchEvent | MouseEvent) => void\n\tonPinch?: (scale: number, event: TouchEvent) => void\n\tonRotate?: (angle: number, event: TouchEvent) => void\n\tonTap?: (event: TouchEvent | MouseEvent) => void\n\tonLongPress?: (event: TouchEvent | MouseEvent) => void\n\tonTouchStart?: (event: TouchEvent | MouseEvent) => void\n\tonTouchMove?: (event: TouchEvent | MouseEvent) => void\n\tonTouchEnd?: (event: TouchEvent | MouseEvent) => void\n}\n\ninterface TouchState {\n\toptions: TouchOptions\n\tstartX: number\n\tstartY: number\n\tstartTime: number\n\tstartDistance: number\n\tstartAngle: number\n\tlastScale: number\n\tlastAngle: number\n\tlongPressTimer: ReturnType<typeof setTimeout> | null\n\tisLongPress: boolean\n\tisMouseDown: boolean\n\tlastTouchEndTime: number\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: (e: TouchEvent) => void\n\t\tmouseDown?: (e: MouseEvent) => void\n\t\tmouseMove?: (e: MouseEvent) => void\n\t\tmouseUp?: (e: MouseEvent) => void\n\t}\n}\n\nconst getDistance = (x1: number, y1: number, x2: number, y2: number): number =>\n\tMath.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)\n\nconst getAngle = (x1: number, y1: number, x2: number, y2: number): number =>\n\t(Math.atan2(y2 - y1, x2 - x1) * 180) / Math.PI\n\nconst MOUSE_IGNORE_DURATION = 400\n\nexport const vTouch = defineDirective<TouchOptions, HTMLElement>({\n\tname: 'touch',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: TouchState = {\n\t\t\toptions,\n\t\t\tstartX: 0,\n\t\t\tstartY: 0,\n\t\t\tstartTime: 0,\n\t\t\tstartDistance: 0,\n\t\t\tstartAngle: 0,\n\t\t\tlastScale: 1,\n\t\t\tlastAngle: 0,\n\t\t\tlongPressTimer: null,\n\t\t\tisLongPress: false,\n\t\t\tisMouseDown: false,\n\t\t\tlastTouchEndTime: 0,\n\t\t\thandlers: { touchStart: () => {}, touchMove: () => {}, touchEnd: () => {} },\n\t\t}\n\n\t\t;(el as any).__touch = state\n\n\t\tconst clearLongPressTimer = (): void => {\n\t\t\tif (state.longPressTimer) {\n\t\t\t\tclearTimeout(state.longPressTimer)\n\t\t\t\tstate.longPressTimer = null\n\t\t\t}\n\t\t}\n\n\t\tconst startLongPressTimer = (event: TouchEvent | MouseEvent): void => {\n\t\t\tclearLongPressTimer()\n\t\t\tif (state.options.enableLongPress && state.options.onLongPress) {\n\t\t\t\tstate.longPressTimer = setTimeout(() => {\n\t\t\t\t\tstate.isLongPress = true\n\t\t\t\t\tstate.options.onLongPress!(event)\n\t\t\t\t}, state.options.longPressTimeout || 500)\n\t\t\t}\n\t\t}\n\n\t\tconst exceedsThreshold = (x: number, y: number): boolean => {\n\t\t\tconst threshold = state.options.tapThreshold || 10\n\t\t\treturn Math.abs(x - state.startX) > threshold || Math.abs(y - state.startY) > threshold\n\t\t}\n\n\t\tconst handleGestureEnd = (endX: number, endY: number, event: TouchEvent | MouseEvent): void => {\n\t\t\tif (state.isLongPress) return\n\n\t\t\tconst duration = Date.now() - state.startTime\n\t\t\tconst deltaX = endX - state.startX\n\t\t\tconst deltaY = endY - state.startY\n\t\t\tconst distance = Math.sqrt(deltaX ** 2 + deltaY ** 2)\n\n\t\t\t// Swipe detection\n\t\t\tif (\n\t\t\t\tstate.options.enableSwipe\n\t\t\t\t&& distance >= (state.options.swipeThreshold || 30)\n\t\t\t\t&& duration <= (state.options.swipeTimeout || 500)\n\t\t\t) {\n\t\t\t\tconst direction: SwipeDirection = Math.abs(deltaX) > Math.abs(deltaY) ? (deltaX > 0 ? 'right' : 'left') : (deltaY > 0 ? 'down' : 'up')\n\n\t\t\t\tstate.options.onSwipe?.(direction, event)\n\t\t\t\tif (direction === 'left') state.options.onSwipeLeft?.(event)\n\t\t\t\telse if (direction === 'right') state.options.onSwipeRight?.(event)\n\t\t\t\telse if (direction === 'up') state.options.onSwipeUp?.(event)\n\t\t\t\telse state.options.onSwipeDown?.(event)\n\t\t\t} else if (\n\t\t\t\tstate.options.enableTap\n\t\t\t\t&& distance < (state.options.tapThreshold || 10)\n\t\t\t\t&& duration < (state.options.tapTimeout || 250)\n\t\t\t) {\n\t\t\t\tstate.options.onTap?.(event)\n\t\t\t}\n\t\t}\n\n\t\t// Touch handlers\n\t\tconst handleTouchStart = (e: TouchEvent): void => {\n\t\t\t// Prevent page zoom on multi-touch\n\t\t\tif (e.touches.length > 1) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isLongPress = false\n\n\t\t\tif (e.touches.length === 1) {\n\t\t\t\tstate.startX = e.touches[0].clientX\n\t\t\t\tstate.startY = e.touches[0].clientY\n\t\t\t\tstartLongPressTimer(e)\n\t\t\t} else if (e.touches.length === 2) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t\tconst [t1, t2] = e.touches\n\t\t\t\tstate.startDistance = getDistance(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tstate.startAngle = getAngle(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tstate.lastScale = 1\n\t\t\t\tstate.lastAngle = 0\n\t\t\t}\n\n\t\t\tstate.options.onTouchStart?.(e)\n\t\t}\n\n\t\tconst handleTouchMove = (e: TouchEvent): void => {\n\t\t\t// Prevent page scroll and zoom during gesture\n\t\t\tif (e.touches.length >= 1) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\n\t\t\tif (state.longPressTimer && e.touches.length === 1 && exceedsThreshold(e.touches[0].clientX, e.touches[0].clientY)) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t}\n\n\t\t\tif (e.touches.length === 2) {\n\t\t\t\tconst [t1, t2] = e.touches\n\t\t\t\tconst currentDistance = getDistance(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tconst currentAngle = getAngle(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\n\t\t\t\tif (state.options.enablePinch && state.options.onPinch) {\n\t\t\t\t\tconst scale = currentDistance / state.startDistance\n\t\t\t\t\tif (Math.abs(scale - state.lastScale) >= (state.options.pinchThreshold || 0.1)) {\n\t\t\t\t\t\tstate.options.onPinch(scale, e)\n\t\t\t\t\t\tstate.lastScale = scale\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (state.options.enableRotate && state.options.onRotate) {\n\t\t\t\t\tconst angleDiff = currentAngle - state.startAngle\n\t\t\t\t\tif (Math.abs(angleDiff - state.lastAngle) > 5) {\n\t\t\t\t\t\tstate.options.onRotate(angleDiff, e)\n\t\t\t\t\t\tstate.lastAngle = angleDiff\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstate.options.onTouchMove?.(e)\n\t\t}\n\n\t\tconst handleTouchEnd = (e: TouchEvent): void => {\n\t\t\tclearLongPressTimer()\n\n\t\t\tif (e.touches.length === 0) {\n\t\t\t\tstate.lastTouchEndTime = Date.now()\n\t\t\t\tconst touch = e.changedTouches[0]\n\t\t\t\thandleGestureEnd(touch.clientX, touch.clientY, e)\n\t\t\t}\n\n\t\t\tstate.options.onTouchEnd?.(e)\n\t\t}\n\n\t\t// Mouse handlers for desktop\n\t\tconst handleMouseDown = (e: MouseEvent): void => {\n\t\t\tif (!state.options.enableMouse) return\n\t\t\t// Ignore simulated mouse events after touch\n\t\t\tif (Date.now() - state.lastTouchEndTime < MOUSE_IGNORE_DURATION) return\n\n\t\t\te.preventDefault()\n\t\t\tstate.isMouseDown = true\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.startX = e.clientX\n\t\t\tstate.startY = e.clientY\n\t\t\tstate.isLongPress = false\n\t\t\tstartLongPressTimer(e)\n\n\t\t\tstate.options.onTouchStart?.(e)\n\t\t}\n\n\t\tconst handleMouseMove = (e: MouseEvent): void => {\n\t\t\tif (!state.isMouseDown || !state.options.enableMouse) return\n\t\t\tif (state.longPressTimer && exceedsThreshold(e.clientX, e.clientY)) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t}\n\t\t\tstate.options.onTouchMove?.(e)\n\t\t}\n\n\t\tconst handleMouseUp = (e: MouseEvent): void => {\n\t\t\tif (!state.isMouseDown || !state.options.enableMouse) return\n\n\t\t\tstate.isMouseDown = false\n\t\t\tclearLongPressTimer()\n\n\t\t\tif (!state.isLongPress) {\n\t\t\t\thandleGestureEnd(e.clientX, e.clientY, e)\n\t\t\t}\n\n\t\t\tstate.options.onTouchEnd?.(e)\n\t\t}\n\n\t\tstate.handlers = { touchStart: handleTouchStart, touchMove: handleTouchMove, touchEnd: handleTouchEnd, mouseDown: handleMouseDown, mouseMove: handleMouseMove, mouseUp: handleMouseUp }\n\n\t\tel.addEventListener('touchstart', handleTouchStart, { passive: false })\n\t\tel.addEventListener('touchmove', handleTouchMove, { passive: false })\n\t\tel.addEventListener('touchend', handleTouchEnd)\n\t\tel.addEventListener('touchcancel', handleTouchEnd)\n\n\t\tif (options.enableMouse) {\n\t\t\tel.addEventListener('mousedown', handleMouseDown)\n\t\t\tdocument.addEventListener('mousemove', handleMouseMove)\n\t\t\tdocument.addEventListener('mouseup', handleMouseUp)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__touch as TouchState | undefined\n\t\tif (state) state.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state = (el as any).__touch as TouchState | undefined\n\n\t\tif (state?.longPressTimer) clearTimeout(state.longPressTimer)\n\n\t\tif (state?.handlers) {\n\t\t\tel.removeEventListener('touchstart', state.handlers.touchStart)\n\t\t\tel.removeEventListener('touchmove', state.handlers.touchMove)\n\t\t\tel.removeEventListener('touchend', state.handlers.touchEnd)\n\t\t\tel.removeEventListener('touchcancel', state.handlers.touchEnd)\n\t\t\tif (state.handlers.mouseDown) el.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\t\tif (state.handlers.mouseMove) document.removeEventListener('mousemove', state.handlers.mouseMove)\n\t\t\tif (state.handlers.mouseUp) document.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\t}\n\n\t\tdelete (el as any).__touch\n\t},\n})\n\nfunction normalizeOptions(binding: TouchOptions | undefined): TouchOptions {\n\treturn {\n\t\tswipeThreshold: binding?.swipeThreshold ?? 30,\n\t\tswipeTimeout: binding?.swipeTimeout ?? 500,\n\t\tpinchThreshold: binding?.pinchThreshold ?? 0.1,\n\t\tenableSwipe: binding?.enableSwipe ?? true,\n\t\tenablePinch: binding?.enablePinch ?? true,\n\t\tenableRotate: binding?.enableRotate ?? true,\n\t\tenableTap: binding?.enableTap ?? true,\n\t\ttapTimeout: binding?.tapTimeout ?? 250,\n\t\ttapThreshold: binding?.tapThreshold ?? 10,\n\t\tenableLongPress: binding?.enableLongPress ?? true,\n\t\tlongPressTimeout: binding?.longPressTimeout ?? 500,\n\t\tenableMouse: binding?.enableMouse ?? true,\n\t\tonSwipe: binding?.onSwipe,\n\t\tonSwipeLeft: binding?.onSwipeLeft,\n\t\tonSwipeRight: binding?.onSwipeRight,\n\t\tonSwipeUp: binding?.onSwipeUp,\n\t\tonSwipeDown: binding?.onSwipeDown,\n\t\tonPinch: binding?.onPinch,\n\t\tonRotate: binding?.onRotate,\n\t\tonTap: binding?.onTap,\n\t\tonLongPress: binding?.onLongPress,\n\t\tonTouchStart: binding?.onTouchStart,\n\t\tonTouchMove: binding?.onTouchMove,\n\t\tonTouchEnd: binding?.onTouchEnd,\n\t}\n}\n\nexport default vTouch\n","import { defineDirective } from '@directix/core'\n\n/**\n * Trim position\n */\nexport type TrimPosition = 'start' | 'end' | 'both'\n\n/**\n * Trim directive options\n */\nexport interface TrimOptions {\n\t/**\n\t * Trim position\n\t * @default 'both'\n\t */\n\tposition?: TrimPosition\n\n\t/**\n\t * Whether to trim on input (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n\n\t/**\n\t * Whether to trim on blur\n\t * @default true\n\t */\n\tonBlur?: boolean\n\n\t/**\n\t * Custom characters to trim (in addition to whitespace)\n\t */\n\tchars?: string\n}\n\n/**\n * Directive binding value type\n */\nexport type TrimBinding = boolean | TrimPosition | TrimOptions\n\n/**\n * Element state storage\n */\ninterface TrimState {\n\toptions: TrimOptions\n\tinputHandler?: () => void\n\tblurHandler?: () => void\n}\n\n/**\n * Trim text based on options\n */\nfunction trimText(text: string, options: TrimOptions): string {\n\tconst { position = 'both', chars } = options\n\n\t// Build regex pattern for custom chars\n\tconst charPattern = chars ? `[\\\\s${escapeRegex(chars)}]` : '\\\\s'\n\n\tswitch (position) {\n\t\tcase 'start':\n\t\t\treturn text.replace(new RegExp(`^${charPattern}+`, 'g'), '')\n\n\t\tcase 'end':\n\t\t\treturn text.replace(new RegExp(`${charPattern}+$`, 'g'), '')\n\n\t\tcase 'both':\n\t\tdefault:\n\t\t\treturn text.replace(new RegExp(`^${charPattern}+|${charPattern}+$`, 'g'), '')\n\t}\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegex(str: string): string {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * v-trim directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: trim both sides -->\n * <input v-trim v-model=\"text\" />\n *\n * <!-- Trim only start -->\n * <input v-trim=\"'start'\" v-model=\"text\" />\n *\n * <!-- Trim only end -->\n * <input v-trim=\"'end'\" v-model=\"text\" />\n *\n * <!-- With options -->\n * <input v-trim=\"{ position: 'both', onBlur: true }\" v-model=\"text\" />\n *\n * <!-- For display only -->\n * <span v-trim> Text with spaces </span>\n * </template>\n * ```\n */\nexport const vTrim = defineDirective<TrimBinding, HTMLElement>({\n\tname: 'trim',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {\n\t\t\tsetupInputElement(el as HTMLInputElement | HTMLTextAreaElement, options)\n\t\t} else {\n\t\t\t// For non-input elements, trim text content\n\t\t\tconst text = el.textContent || ''\n\n\t\t\tel.textContent = trimText(text, options)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state: TrimState | undefined = (el as any).__trim\n\n\t\tif (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {\n\t\t\t// For input elements, trimming happens on blur/input events\n\t\t\tif (state) {\n\t\t\t\tstate.options = options\n\t\t\t}\n\t\t} else {\n\t\t\t// For non-input elements, trim text content\n\t\t\tconst text = el.textContent || ''\n\n\t\t\tel.textContent = trimText(text, options)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: TrimState | undefined = (el as any).__trim\n\n\t\tif (state?.inputHandler) {\n\t\t\tel.removeEventListener('input', state.inputHandler)\n\t\t}\n\t\tif (state?.blurHandler) {\n\t\t\tel.removeEventListener('blur', state.blurHandler)\n\t\t}\n\n\t\tdelete (el as any).__trim\n\t},\n})\n\n/**\n * Setup input element\n */\nfunction setupInputElement(el: HTMLInputElement | HTMLTextAreaElement, options: TrimOptions): void {\n\tconst state: TrimState = { options }\n\n\t;(el as any).__trim = state\n\n\tconst performTrim = (): void => {\n\t\tconst originalValue = el.value\n\t\tconst trimmed = trimText(originalValue, options)\n\n\t\tif (originalValue !== trimmed) {\n\t\t\tel.value = trimmed\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t}\n\t}\n\n\t// Create handlers based on options\n\tif (options.onInput) {\n\t\tconst inputHandler = (): void => {\n\t\t\t// For real-time trimming, we need to be careful about cursor position\n\t\t\t// We'll only trim on blur for better UX, or trim end on input\n\t\t\tconst originalValue = el.value\n\t\t\tconst cursorPos = el.selectionStart\n\n\t\t\t// Trim end while typing\n\t\t\tconst trimmed = originalValue.replace(/\\s+$/g, '')\n\n\t\t\tif (originalValue !== trimmed) {\n\t\t\t\tel.value = trimmed\n\t\t\t\t// Adjust cursor position\n\t\t\t\tif (cursorPos !== null) {\n\t\t\t\t\tconst newCursorPos = Math.min(cursorPos, trimmed.length)\n\n\t\t\t\t\tel.setSelectionRange(newCursorPos, newCursorPos)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tel.addEventListener('input', inputHandler)\n\t\tstate.inputHandler = inputHandler\n\t}\n\n\tif (options.onBlur) {\n\t\tconst blurHandler = (): void => performTrim()\n\n\t\tel.addEventListener('blur', blurHandler)\n\t\tstate.blurHandler = blurHandler\n\t}\n\n\t// Initial trim\n\tif (el.value) {\n\t\tperformTrim()\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: TrimBinding | undefined): TrimOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { position: 'both', onInput: true, onBlur: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { position: 'both', onInput: false, onBlur: false }\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { position: binding, onInput: true, onBlur: true }\n\t}\n\n\treturn {\n\t\tposition: binding.position ?? 'both',\n\t\tonInput: binding.onInput ?? true,\n\t\tonBlur: binding.onBlur ?? true,\n\t\tchars: binding.chars,\n\t}\n}\n\nexport default vTrim\n","import { defineDirective } from '@directix/core'\n\n/**\n * Truncate position\n */\nexport type TruncatePosition = 'start' | 'middle' | 'end'\n\n/**\n * Truncate directive options\n */\nexport interface TruncateOptions {\n\t/**\n\t * Maximum length of text\n\t * @default 100\n\t */\n\tlength?: number\n\n\t/**\n\t * Truncation position\n\t * @default 'end'\n\t */\n\tposition?: TruncatePosition\n\n\t/**\n\t * Ellipsis string\n\t * @default '...'\n\t */\n\tellipsis?: string\n\n\t/**\n\t * Whether to use CSS truncation (use text-overflow: ellipsis)\n\t * When true, length and position options are ignored\n\t * @default false\n\t */\n\tuseCss?: boolean\n\n\t/**\n\t * Show full text on hover (as title attribute)\n\t * @default true\n\t */\n\tshowTitle?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type TruncateBinding = number | TruncateOptions\n\n/**\n * Element state storage\n */\ninterface TruncateState {\n\toriginalText: string\n\toptions: TruncateOptions\n}\n\n/**\n * Truncate text based on options\n */\nfunction truncateText(text: string, options: TruncateOptions): string {\n\tconst { length = 100, position = 'end', ellipsis = '...' } = options\n\n\tif (text.length <= length) {\n\t\treturn text\n\t}\n\n\tswitch (position) {\n\t\tcase 'start':\n\t\t\treturn ellipsis + text.slice(-(length - ellipsis.length))\n\n\t\tcase 'middle': {\n\t\t\tconst startLen = Math.ceil((length - ellipsis.length) / 2)\n\t\t\tconst endLen = Math.floor((length - ellipsis.length) / 2)\n\n\t\t\treturn text.slice(0, startLen) + ellipsis + text.slice(-endLen)\n\t\t}\n\n\t\tcase 'end':\n\t\tdefault:\n\t\t\treturn text.slice(0, length - ellipsis.length) + ellipsis\n\t}\n}\n\n/**\n * v-truncate directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: truncate to 50 characters -->\n * <p v-truncate=\"50\">Long text here...</p>\n *\n * <!-- With options -->\n * <p v-truncate=\"{ length: 100, position: 'middle' }\">Long text here...</p>\n *\n * <!-- CSS truncation -->\n * <p v-truncate=\"{ useCss: true }\">Long text here...</p>\n * </template>\n * ```\n */\nexport const vTruncate = defineDirective<TruncateBinding, HTMLElement>({\n\tname: 'truncate',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst text = el.textContent || ''\n\n\t\t// Store original text\n\t\tconst state: TruncateState = {\n\t\t\toriginalText: text,\n\t\t\toptions,\n\t\t}\n\n\t\t;(el as any).__truncate = state\n\n\t\tapplyTruncation(el, text, options)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: TruncateState | undefined = (el as any).__truncate\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (state) {\n\t\t\t// Always use original text for re-truncation\n\t\t\tconst originalText = state.originalText\n\n\t\t\t// Check if options changed\n\t\t\tif (JSON.stringify(newOptions) !== JSON.stringify(state.options)) {\n\t\t\t\tstate.options = newOptions\n\t\t\t\tapplyTruncation(el, originalText, newOptions)\n\t\t\t}\n\t\t} else {\n\t\t\tconst text = el.textContent || ''\n\n\t\t\t;(el as any).__truncate = {\n\t\t\t\toriginalText: text,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t\tapplyTruncation(el, text, newOptions)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tdelete (el as any).__truncate\n\t},\n})\n\n/**\n * Apply truncation to element\n */\nfunction applyTruncation(el: HTMLElement, text: string, options: TruncateOptions): void {\n\tconst { useCss, showTitle = true } = options\n\n\tif (useCss) {\n\t\t// Use CSS truncation\n\t\tel.style.overflow = 'hidden'\n\t\tel.style.textOverflow = 'ellipsis'\n\t\tel.style.whiteSpace = 'nowrap'\n\n\t\tif (showTitle && text) {\n\t\t\tel.setAttribute('title', text)\n\t\t}\n\t} else {\n\t\t// Use JavaScript truncation\n\t\tconst truncated = truncateText(text, options)\n\n\t\tel.textContent = truncated\n\n\t\tif (showTitle && text && text !== truncated) {\n\t\t\tel.setAttribute('title', text)\n\t\t}\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: TruncateBinding | undefined): TruncateOptions {\n\tif (typeof binding === 'number') {\n\t\treturn {\n\t\t\tlength: binding,\n\t\t\tposition: 'end',\n\t\t\tellipsis: '...',\n\t\t\tuseCss: false,\n\t\t\tshowTitle: true,\n\t\t}\n\t}\n\n\treturn {\n\t\tlength: binding?.length ?? 100,\n\t\tposition: binding?.position ?? 'end',\n\t\tellipsis: binding?.ellipsis ?? '...',\n\t\tuseCss: binding?.useCss ?? false,\n\t\tshowTitle: binding?.showTitle ?? true,\n\t}\n}\n\nexport default vTruncate\n","import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Uppercase directive options\n */\nexport interface UppercaseOptions {\n\t/**\n\t * Transform only the first character\n\t * @default false\n\t */\n\tfirst?: boolean\n\n\t/**\n\t * Transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type UppercaseBinding = boolean | UppercaseOptions\n\n/**\n * Transform text to uppercase\n */\nfunction transformText(text: string, options: UppercaseOptions): string {\n\tif (!text) return text\n\n\tif (options.first) {\n\t\treturn text.charAt(0).toUpperCase() + text.slice(1)\n\t}\n\n\treturn text.toUpperCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: UppercaseBinding | undefined): UppercaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { first: false, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { first: false, onInput: false }\n\t}\n\n\treturn {\n\t\tfirst: binding.first ?? false,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-uppercase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Transform all characters to uppercase -->\n * <input v-uppercase v-model=\"text\" />\n *\n * <!-- Transform only first character -->\n * <span v-uppercase=\"{ first: true }\">{{ text }}</span>\n * </template>\n * ```\n */\nexport const vUppercase = defineDirective<UppercaseBinding, HTMLElement>({\n\tname: 'uppercase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => transformText(text, options))\n\n\t\t\t;(el as any).__uppercaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = transformText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__uppercaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__uppercaseCleanup\n\t},\n})\n\nexport default vUppercase\n","import { defineDirective } from '@directix/core'\n\n/**\n * Virtual list item size function\n */\nexport type ItemSizeFunction = (index: number) => number\n\n/**\n * Virtual list render function\n */\nexport type VirtualListRenderFunction = (item: any, index: number) => string\n\n/**\n * Virtual list directive options\n */\nexport interface VirtualListOptions<T = any> {\n\t/**\n\t * Array of items to render\n\t * @required\n\t */\n\titems: T[]\n\n\t/**\n\t * Height of each item (in pixels)\n\t * Can be a fixed number or a function\n\t * @default 50\n\t */\n\titemSize?: number | ItemSizeFunction\n\n\t/**\n\t * Height of the container (in pixels)\n\t * @default 400\n\t */\n\theight?: number | string\n\n\t/**\n\t * Number of extra items to render above/below visible area\n\t * @default 3\n\t */\n\toverscan?: number\n\n\t/**\n\t * Custom render function\n\t */\n\trender?: VirtualListRenderFunction\n\n\t/**\n\t * Key field name for items\n\t * @default 'id'\n\t */\n\tkeyField?: string\n\n\t/**\n\t * Callback when scroll position changes\n\t */\n\tonScroll?: (scrollTop: number) => void\n\n\t/**\n\t * Callback when visible range changes\n\t */\n\tonVisibleChange?: (startIndex: number, endIndex: number) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type VirtualListBinding<T = any> = VirtualListOptions<T> | T[]\n\n/**\n * Element state storage\n */\ninterface VirtualListState {\n\toptions: VirtualListOptions\n\tcontainerEl: HTMLElement | null\n\tcontentEl: HTMLElement | null\n\tscrollHandler: ((event: Event) => void) | null\n\tresizeObserver: ResizeObserver | null\n\tstartIndex: number\n\tendIndex: number\n\tvisibleItems: any[]\n}\n\n/**\n * Get item height\n */\nfunction getItemSize(options: VirtualListOptions, index: number): number {\n\tif (typeof options.itemSize === 'function') {\n\t\treturn options.itemSize(index)\n\t}\n\treturn options.itemSize || 50\n}\n\n/**\n * Calculate total height\n */\nfunction calculateTotalHeight(options: VirtualListOptions): number {\n\tif (typeof options.itemSize === 'function') {\n\t\tlet total = 0\n\t\tfor (let i = 0; i < options.items.length; i++) {\n\t\t\ttotal += options.itemSize(i)\n\t\t}\n\t\treturn total\n\t}\n\treturn (options.itemSize || 50) * options.items.length\n}\n\n/**\n * Calculate visible range\n */\nfunction calculateVisibleRange(\n\tscrollTop: number,\n\tcontainerHeight: number,\n\toptions: VirtualListOptions,\n): { startIndex: number, endIndex: number, offsetY: number } {\n\tconst items = options.items\n\tconst itemSize = options.itemSize || 50\n\tconst overscan = options.overscan || 3\n\n\tlet startIndex = 0,\n\t\tendIndex = 0,\n\t\toffsetY = 0\n\n\tif (typeof itemSize === 'function') {\n\t\t// Variable size items\n\t\tlet currentOffset = 0\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst size = itemSize(i)\n\t\t\tif (currentOffset + size > scrollTop) {\n\t\t\t\tstartIndex = i\n\t\t\t\toffsetY = currentOffset\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcurrentOffset += size\n\t\t}\n\n\t\t// Find end index\n\t\tendIndex = startIndex\n\t\tcurrentOffset = offsetY\n\t\twhile (endIndex < items.length && currentOffset < scrollTop + containerHeight) {\n\t\t\tcurrentOffset += itemSize(endIndex)\n\t\t\tendIndex++\n\t\t}\n\n\t\t// Add overscan\n\t\tstartIndex = Math.max(0, startIndex - overscan)\n\t\tendIndex = Math.min(items.length, endIndex + overscan)\n\n\t\t// Recalculate offset for overscan\n\t\tcurrentOffset = 0\n\t\tfor (let i = 0; i < startIndex; i++) {\n\t\t\tcurrentOffset += itemSize(i)\n\t\t}\n\t\toffsetY = currentOffset\n\n\t\treturn { startIndex, endIndex, offsetY }\n\t}\n\n\t// Fixed size items\n\tstartIndex = Math.max(0, Math.floor(scrollTop / itemSize) - overscan)\n\tendIndex = Math.min(items.length, Math.ceil((scrollTop + containerHeight) / itemSize) + overscan)\n\toffsetY = startIndex * itemSize\n\n\treturn { startIndex, endIndex, offsetY }\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions<T>(binding: VirtualListBinding<T>): VirtualListOptions<T> {\n\tif (Array.isArray(binding)) {\n\t\treturn {\n\t\t\titems: binding,\n\t\t\titemSize: 50,\n\t\t\theight: 400,\n\t\t\toverscan: 3,\n\t\t\tkeyField: 'id',\n\t\t}\n\t}\n\n\treturn {\n\t\titems: binding.items,\n\t\titemSize: binding.itemSize ?? 50,\n\t\theight: binding.height ?? 400,\n\t\toverscan: binding.overscan ?? 3,\n\t\trender: binding.render,\n\t\tkeyField: binding.keyField ?? 'id',\n\t\tonScroll: binding.onScroll,\n\t\tonVisibleChange: binding.onVisibleChange,\n\t}\n}\n\n/**\n * Create item element\n */\nfunction createItemElement(\n\titem: any,\n\tindex: number,\n\toptions: VirtualListOptions,\n): HTMLElement {\n\tconst el = document.createElement('div')\n\tel.className = 'v-virtual-list__item'\n\tel.dataset.index = String(index)\n\n\t// Get item key\n\tconst keyField = options.keyField || 'id'\n\tif (typeof item === 'object' && item !== null && keyField in item) {\n\t\tel.dataset.key = String(item[keyField])\n\t}\n\n\t// Set height\n\tconst height = getItemSize(options, index)\n\tel.style.height = `${height}px`\n\tel.style.boxSizing = 'border-box'\n\n\t// Render content\n\tif (options.render) {\n\t\tel.innerHTML = options.render(item, index)\n\t} else {\n\t\tel.textContent = typeof item === 'object' ? JSON.stringify(item) : String(item)\n\t}\n\n\treturn el\n}\n\n/**\n * v-virtual-list directive\n *\n * Renders a large list efficiently using virtualization.\n *\n * @example\n * ```vue\n * <template>\n * <div v-virtual-list=\"{ items: largeList, itemSize: 50 }\"></div>\n *\n * <div v-virtual-list=\"{\n * items: largeList,\n * itemSize: (index) => index % 10 === 0 ? 100 : 50,\n * height: 600,\n * overscan: 5,\n * render: (item, index) => `<div class=\"item\">${item.name}</div>`\n * }\"></div>\n * </template>\n * ```\n */\nexport const vVirtualList = defineDirective<VirtualListBinding, HTMLElement>({\n\tname: 'virtual-list',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Setup container\n\t\tel.classList.add('v-virtual-list')\n\t\tel.style.height = typeof options.height === 'number' ? `${options.height}px` : options.height as string\n\t\tel.style.overflow = 'auto'\n\t\tel.style.position = 'relative'\n\n\t\t// Create content wrapper\n\t\tconst contentEl = document.createElement('div')\n\t\tcontentEl.className = 'v-virtual-list__content'\n\t\tcontentEl.style.position = 'relative'\n\t\tcontentEl.style.height = `${calculateTotalHeight(options)}px`\n\t\tel.appendChild(contentEl)\n\n\t\t// Create visible items wrapper\n\t\tconst visibleEl = document.createElement('div')\n\t\tvisibleEl.className = 'v-virtual-list__visible'\n\t\tvisibleEl.style.position = 'absolute'\n\t\tvisibleEl.style.top = '0'\n\t\tvisibleEl.style.left = '0'\n\t\tvisibleEl.style.right = '0'\n\t\tcontentEl.appendChild(visibleEl)\n\n\t\tconst state: VirtualListState = {\n\t\t\toptions,\n\t\t\tcontainerEl: el,\n\t\t\tcontentEl,\n\t\t\tscrollHandler: null,\n\t\t\tresizeObserver: null,\n\t\t\tstartIndex: 0,\n\t\t\tendIndex: 0,\n\t\t\tvisibleItems: [],\n\t\t}\n\n\t\t;(el as any).__virtualList = state\n\n\t\t// Create scroll handler\n\t\tconst scrollHandler = (_event: Event): void => {\n\t\t\tconst scrollTop = el.scrollTop\n\t\t\tconst containerHeight = el.clientHeight\n\n\t\t\t// Calculate visible range\n\t\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(\n\t\t\t\tscrollTop,\n\t\t\t\tcontainerHeight,\n\t\t\t\tstate.options,\n\t\t\t)\n\n\t\t\t// Check if range changed\n\t\t\tif (startIndex !== state.startIndex || endIndex !== state.endIndex) {\n\t\t\t\tstate.startIndex = startIndex\n\t\t\t\tstate.endIndex = endIndex\n\n\t\t\t\t// Render visible items\n\t\t\t\trenderVisibleItems(visibleEl, state, offsetY)\n\n\t\t\t\t// Callback\n\t\t\t\tif (state.options.onVisibleChange) {\n\t\t\t\t\tstate.options.onVisibleChange(startIndex, endIndex)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Scroll callback\n\t\t\tif (state.options.onScroll) {\n\t\t\t\tstate.options.onScroll(scrollTop)\n\t\t\t}\n\t\t}\n\n\t\tstate.scrollHandler = scrollHandler\n\t\tel.addEventListener('scroll', scrollHandler, { passive: true })\n\n\t\t// Initial render\n\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(0, el.clientHeight, options)\n\t\tstate.startIndex = startIndex\n\t\tstate.endIndex = endIndex\n\t\trenderVisibleItems(visibleEl, state, offsetY)\n\n\t\t// Setup resize observer\n\t\tif (typeof ResizeObserver !== 'undefined') {\n\t\t\tconst resizeObserver = new ResizeObserver(() => {\n\t\t\t\t// Recalculate on resize\n\t\t\t\tscrollHandler(new Event('scroll'))\n\t\t\t})\n\t\t\tresizeObserver.observe(el)\n\t\t\tstate.resizeObserver = resizeObserver\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: VirtualListState = (el as any).__virtualList\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tstate.options = newOptions\n\n\t\t// Update content height\n\t\tif (state.contentEl) {\n\t\t\tstate.contentEl.style.height = `${calculateTotalHeight(newOptions)}px`\n\t\t}\n\n\t\t// Force re-render\n\t\tconst scrollTop = el.scrollTop\n\t\tconst containerHeight = el.clientHeight\n\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(\n\t\t\tscrollTop,\n\t\t\tcontainerHeight,\n\t\t\tnewOptions,\n\t\t)\n\t\tstate.startIndex = startIndex\n\t\tstate.endIndex = endIndex\n\n\t\tconst visibleEl = state.contentEl?.querySelector('.v-virtual-list__visible') as HTMLElement\n\t\tif (visibleEl) {\n\t\t\trenderVisibleItems(visibleEl, state, offsetY)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: VirtualListState | undefined = (el as any).__virtualList\n\n\t\tif (!state) return\n\n\t\tif (state.scrollHandler) {\n\t\t\tel.removeEventListener('scroll', state.scrollHandler)\n\t\t}\n\n\t\tif (state.resizeObserver) {\n\t\t\tstate.resizeObserver.disconnect()\n\t\t}\n\n\t\tdelete (el as any).__virtualList\n\t},\n})\n\n/**\n * Render visible items\n */\nfunction renderVisibleItems(\n\tvisibleEl: HTMLElement,\n\tstate: VirtualListState,\n\toffsetY: number,\n): void {\n\tconst { options, startIndex, endIndex } = state\n\n\t// Set transform\n\tvisibleEl.style.transform = `translateY(${offsetY}px)`\n\n\t// Clear existing items\n\tvisibleEl.innerHTML = ''\n\n\t// Render items\n\tfor (let i = startIndex; i < endIndex; i++) {\n\t\tconst item = options.items[i]\n\t\tif (item !== undefined) {\n\t\t\tconst itemEl = createItemElement(item, i, options)\n\t\t\tvisibleEl.appendChild(itemEl)\n\t\t}\n\t}\n}\n\nexport default vVirtualList\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Visible change handler\n */\nexport type VisibleHandler = (isVisible: boolean) => void\n\n/**\n * Visible directive options\n */\nexport interface VisibleOptions {\n\t/**\n\t * Callback when visibility changes\n\t */\n\thandler?: VisibleHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to set visibility: hidden instead of display: none\n\t * @default false\n\t */\n\tuseHidden?: boolean\n\n\t/**\n\t * Initial visibility\n\t * @default true\n\t */\n\tinitial?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type VisibleBinding = boolean | VisibleOptions\n\n/**\n * Element state storage\n */\ninterface VisibleState {\n\toptions: VisibleOptions\n\tisVisible: boolean\n\toriginalDisplay: string\n\toriginalVisibility: string\n\ttransitionEndHandler: (e: TransitionEvent) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: VisibleBinding | undefined): VisibleOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { initial: binding }\n\t}\n\n\treturn {\n\t\tinitial: true,\n\t\tdisabled: false,\n\t\tuseHidden: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-visible directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-visible=\"showElement\">Show/Hide</div>\n * <div v-visible=\"{ handler: onVisibleChange }\">Track visibility</div>\n * <div v-visible=\"{ useHidden: true, initial: false }\">Uses visibility: hidden</div>\n * </template>\n * ```\n */\nexport const vVisible = defineDirective<VisibleBinding, HTMLElement>({\n\tname: 'visible',\n\tssr: true, // SSR safe - will set initial visibility on server\n\tdefaults: {\n\t\tinitial: true,\n\t\tdisabled: false,\n\t\tuseHidden: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Store original styles\n\t\tconst originalDisplay = el.style.display\n\t\tconst originalVisibility = el.style.visibility\n\n\t\tconst state: VisibleState = {\n\t\t\toptions,\n\t\t\tisVisible: options.initial ?? true,\n\t\t\toriginalDisplay,\n\t\t\toriginalVisibility,\n\t\t\ttransitionEndHandler: (e: TransitionEvent) => {\n\t\t\t\t// Handle transition end for animations\n\t\t\t\tif (e.propertyName === 'opacity' || e.propertyName === 'visibility') {\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('visible:transition-end', {\n\t\t\t\t\t\tdetail: { isVisible: state.isVisible },\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__visible = state\n\n\t\t// Add transition listener\n\t\ton(el, 'transitionend', state.transitionEndHandler as (e: Event) => void)\n\n\t\t// Apply initial visibility\n\t\tapplyVisibility(el, state, options.initial ?? true)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: VisibleState = (el as any).__visible\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Determine new visibility\n\t\tlet newVisibility: boolean\n\n\t\tif (typeof binding.value === 'boolean') {\n\t\t\tnewVisibility = binding.value\n\t\t} else {\n\t\t\tnewVisibility = newOptions.initial ?? true\n\t\t}\n\n\t\t// Update if changed\n\t\tif (state.isVisible !== newVisibility) {\n\t\t\tapplyVisibility(el, state, newVisibility)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: VisibleState = (el as any).__visible\n\n\t\tif (!state) return\n\n\t\t// Remove transition listener\n\t\toff(el, 'transitionend', state.transitionEndHandler as (e: Event) => void)\n\n\t\t// Restore original styles\n\t\tel.style.display = state.originalDisplay\n\t\tel.style.visibility = state.originalVisibility\n\n\t\tdelete (el as any).__visible\n\t},\n})\n\n/**\n * Apply visibility to element\n */\nfunction applyVisibility(el: HTMLElement, state: VisibleState, isVisible: boolean): void {\n\tconst previousVisibility = state.isVisible\n\n\tstate.isVisible = isVisible\n\n\t// Add/remove class first (for CSS transitions)\n\tif (isVisible) {\n\t\tel.classList.remove('v-hidden')\n\t\tel.classList.add('v-visible')\n\t} else {\n\t\tel.classList.remove('v-visible')\n\t\tel.classList.add('v-hidden')\n\t}\n\n\tif (state.options.useHidden) {\n\t\t// Use visibility: hidden with animation support\n\t\tif (isVisible) {\n\t\t\t// Show: set visibility first, then animate\n\t\t\tel.style.visibility = state.originalVisibility || 'visible'\n\t\t} else {\n\t\t\t// Hide: wait for transition, then set hidden\n\t\t\tconst computedStyle = getComputedStyle(el)\n\t\t\tconst hasTransition = computedStyle.transitionDuration !== '0s'\n\n\t\t\tif (hasTransition) {\n\t\t\t\t// Wait for transition to complete\n\t\t\t\tconst handleTransitionEnd = (e: TransitionEvent): void => {\n\t\t\t\t\tif (e.target === el && (e.propertyName === 'opacity' || e.propertyName === 'transform')) {\n\t\t\t\t\t\tif (!state.isVisible) {\n\t\t\t\t\t\t\tel.style.visibility = 'hidden'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tel.removeEventListener('transitionend', handleTransitionEnd)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tel.addEventListener('transitionend', handleTransitionEnd)\n\t\t\t} else {\n\t\t\t\tel.style.visibility = 'hidden'\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Use display: none (no animation support)\n\t\tel.style.display = isVisible ? state.originalDisplay : 'none'\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('visible:change', {\n\t\tdetail: { isVisible, previousVisibility },\n\t}))\n\n\t// Trigger handler\n\tif (state.options.handler && previousVisibility !== isVisible) {\n\t\tstate.options.handler(isVisible)\n\t}\n}\n\nexport default vVisible\n","import { defineDirective } from '@directix/core'\n\n/**\n * Watermark options\n */\nexport interface WatermarkOptions {\n\t/**\n\t * Watermark text content\n\t * @required\n\t */\n\tcontent: string | string[]\n\n\t/**\n\t * Width of watermark canvas\n\t * @default 300\n\t */\n\twidth?: number\n\n\t/**\n\t * Height of watermark canvas\n\t * @default 200\n\t */\n\theight?: number\n\n\t/**\n\t * Rotation angle in degrees\n\t * @default -22\n\t */\n\trotate?: number\n\n\t/**\n\t * Font size in pixels\n\t * @default 16\n\t */\n\tfontSize?: number\n\n\t/**\n\t * Font family\n\t * @default 'sans-serif'\n\t */\n\tfontFamily?: string\n\n\t/**\n\t * Font weight\n\t * @default 'normal'\n\t */\n\tfontWeight?: string | number\n\n\t/**\n\t * Font color\n\t * @default 'rgba(128, 128, 128, 0.15)'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Gap between watermarks in pixels\n\t * @default [100, 100]\n\t */\n\tgap?: [number, number] | number\n\n\t/**\n\t * Z-index of watermark layer\n\t * @default 9999\n\t */\n\tzIndex?: number\n\n\t/**\n\t * Whether to disable watermark (for dynamic control)\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to prevent removal attempts\n\t * @default true\n\t */\n\tprotect?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type WatermarkBinding = string | WatermarkOptions\n\n/**\n * Element state storage\n */\ninterface WatermarkState {\n\toptions: WatermarkOptions\n\twatermarkEl: HTMLDivElement | null\n\tobserver: MutationObserver | null\n\tcanvas: HTMLCanvasElement | null\n}\n\n/**\n * Create watermark canvas\n */\nfunction createWatermarkCanvas(options: WatermarkOptions): HTMLCanvasElement {\n\tconst canvas = document.createElement('canvas')\n\tconst ctx = canvas.getContext('2d')\n\n\tif (!ctx) {\n\t\tthrow new Error('[Directix] v-watermark: Could not get canvas context')\n\t}\n\n\tconst width = options.width || 300\n\tconst height = options.height || 200\n\tconst fontSize = options.fontSize || 16\n\tconst fontFamily = options.fontFamily || 'sans-serif'\n\tconst fontWeight = options.fontWeight || 'normal'\n\tconst color = options.color || 'rgba(128, 128, 128, 0.15)'\n\tconst rotate = options.rotate ?? -22\n\n\tcanvas.width = width\n\tcanvas.height = height\n\n\tctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`\n\tctx.fillStyle = color\n\tctx.textAlign = 'center'\n\tctx.textBaseline = 'middle'\n\n\t// Rotate canvas\n\tctx.translate(width / 2, height / 2)\n\tctx.rotate((rotate * Math.PI) / 180)\n\n\t// Draw text\n\tconst content = Array.isArray(options.content) ? options.content : [options.content]\n\tconst lineHeight = fontSize * 1.5\n\tconst startY = -((content.length - 1) * lineHeight) / 2\n\n\tcontent.forEach((text, index) => {\n\t\tctx.fillText(text, 0, startY + index * lineHeight)\n\t})\n\n\treturn canvas\n}\n\n/**\n * Create watermark element\n */\nfunction createWatermarkElement(canvas: HTMLCanvasElement, options: WatermarkOptions): HTMLDivElement {\n\tconst gap = Array.isArray(options.gap) ? options.gap : [options.gap || 100, options.gap || 100]\n\tconst zIndex = options.zIndex ?? 9999\n\n\tconst el = document.createElement('div')\n\tel.className = 'v-watermark'\n\tel.style.cssText = `\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tpointer-events: none;\n\t\tz-index: ${zIndex};\n\t\tbackground-image: url(\"${canvas.toDataURL()}\");\n\t\tbackground-repeat: repeat;\n\t\tbackground-position: ${gap[0] / 2}px ${gap[1] / 2}px;\n\t\tbackground-size: ${canvas.width + gap[0]}px ${canvas.height + gap[1]}px;\n\t`\n\n\treturn el\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: WatermarkBinding): WatermarkOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { content: binding }\n\t}\n\n\treturn {\n\t\tcontent: binding.content,\n\t\twidth: binding.width ?? 300,\n\t\theight: binding.height ?? 200,\n\t\trotate: binding.rotate ?? -22,\n\t\tfontSize: binding.fontSize ?? 16,\n\t\tfontFamily: binding.fontFamily ?? 'sans-serif',\n\t\tfontWeight: binding.fontWeight ?? 'normal',\n\t\tcolor: binding.color ?? 'rgba(128, 128, 128, 0.15)',\n\t\tgap: binding.gap ?? [100, 100],\n\t\tzIndex: binding.zIndex ?? 9999,\n\t\tdisabled: binding.disabled ?? false,\n\t\tprotect: binding.protect ?? true,\n\t}\n}\n\n/**\n * v-watermark directive\n *\n * Adds a watermark layer to an element.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple watermark -->\n * <div v-watermark=\"'Confidential'\">Protected content</div>\n *\n * <!-- Multi-line watermark -->\n * <div v-watermark=\"{ content: ['Company Name', 'User: John'] }\">\n * Protected content\n * </div>\n *\n * <!-- Customized watermark -->\n * <div v-watermark=\"{\n * content: 'DRAFT',\n * fontSize: 24,\n * color: 'rgba(255, 0, 0, 0.2)',\n * rotate: -30,\n * gap: 50\n * }\">\n * Draft document\n * </div>\n * </template>\n * ```\n */\nexport const vWatermark = defineDirective<WatermarkBinding, HTMLElement>({\n\tname: 'watermark',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Make sure element has position\n\t\tconst computedStyle = getComputedStyle(el)\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\tconst state: WatermarkState = {\n\t\t\toptions,\n\t\t\twatermarkEl: null,\n\t\t\tobserver: null,\n\t\t\tcanvas: null,\n\t\t}\n\n\t\t;(el as any).__watermark = state\n\n\t\tif (!options.disabled) {\n\t\t\tapplyWatermark(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: WatermarkState = (el as any).__watermark\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Check if disabled state changed\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disable: remove watermark\n\t\t\tremoveWatermark(state)\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Enable: add watermark\n\t\t\tstate.options = newOptions\n\t\t\tapplyWatermark(el, state)\n\t\t} else if (!newOptions.disabled) {\n\t\t\t// Update watermark\n\t\t\tstate.options = newOptions\n\t\t\tremoveWatermark(state)\n\t\t\tapplyWatermark(el, state)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: WatermarkState | undefined = (el as any).__watermark\n\n\t\tif (!state) return\n\n\t\tremoveWatermark(state)\n\n\t\tdelete (el as any).__watermark\n\t},\n})\n\n/**\n * Apply watermark to element\n */\nfunction applyWatermark(el: HTMLElement, state: WatermarkState): void {\n\tconst options = state.options\n\n\t// Create canvas\n\tstate.canvas = createWatermarkCanvas(options)\n\n\t// Create watermark element\n\tstate.watermarkEl = createWatermarkElement(state.canvas, options)\n\n\t// Append to element\n\tel.appendChild(state.watermarkEl)\n\n\t// Set up protection observer if enabled\n\tif (options.protect) {\n\t\tsetupProtection(el, state)\n\t}\n}\n\n/**\n * Remove watermark\n */\nfunction removeWatermark(state: WatermarkState): void {\n\t// Disconnect observer\n\tif (state.observer) {\n\t\tstate.observer.disconnect()\n\t\tstate.observer = null\n\t}\n\n\t// Remove watermark element\n\tif (state.watermarkEl && state.watermarkEl.parentNode) {\n\t\tstate.watermarkEl.parentNode.removeChild(state.watermarkEl)\n\t}\n\n\tstate.watermarkEl = null\n\tstate.canvas = null\n}\n\n/**\n * Set up protection against removal\n */\nfunction setupProtection(el: HTMLElement, state: WatermarkState): void {\n\tif (typeof MutationObserver === 'undefined') return\n\n\tstate.observer = new MutationObserver(mutations => {\n\t\t// Check if watermark was removed\n\t\tif (!state.watermarkEl || !el.contains(state.watermarkEl)) {\n\t\t\t// Re-add watermark\n\t\t\tif (!state.options.disabled) {\n\t\t\t\tstate.canvas = createWatermarkCanvas(state.options)\n\t\t\t\tstate.watermarkEl = createWatermarkElement(state.canvas, state.options)\n\t\t\t\tel.appendChild(state.watermarkEl)\n\t\t\t}\n\t\t}\n\n\t\t// Check if watermark styles were modified\n\t\tfor (const mutation of mutations) {\n\t\t\tif (mutation.type === 'attributes' && mutation.target === state.watermarkEl) {\n\t\t\t\t// Restore styles\n\t\t\t\tconst gap = Array.isArray(state.options.gap) ? state.options.gap : [state.options.gap || 100, state.options.gap || 100]\n\n\t\t\t\tstate.watermarkEl.style.display = 'block'\n\t\t\t\tstate.watermarkEl.style.visibility = 'visible'\n\t\t\t\tstate.watermarkEl.style.opacity = '1'\n\t\t\t\tif (state.canvas) {\n\t\t\t\t\tstate.watermarkEl.style.backgroundImage = `url(\"${state.canvas.toDataURL()}\")`\n\t\t\t\t}\n\t\t\t\tstate.watermarkEl.style.backgroundSize = `${state.canvas!.width + gap[0]}px ${state.canvas!.height + gap[1]}px`\n\t\t\t}\n\t\t}\n\t})\n\n\tstate.observer.observe(el, {\n\t\tchildList: true,\n\t\tsubtree: true,\n\t\tattributes: true,\n\t\tattributeFilter: ['style', 'class', 'hidden'],\n\t})\n}\n\nexport default vWatermark\n","import type { DirectiveInstallOptions } from '@directix/core'\nimport type { App, Directive, Plugin } from 'vue'\nimport { setVueVersion } from '@directix/core'\nimport {\n\tvCapitalcase,\n\tvClickDelay,\n\tvClickOutside,\n\tvCopy,\n\tvCountdown,\n\tvDebounce,\n\tvDraggable,\n\tvEllipsis,\n\tvFocus,\n\tvHotkey,\n\tvHover,\n\tvImagePreview,\n\tvInfiniteScroll,\n\tvIntersect,\n\tvLazy,\n\tvLoading,\n\tvLongPress,\n\tvLowercase,\n\tvMask,\n\tvMoney,\n\tvMutation,\n\tvNumber,\n\tvPermission,\n\tvPrint,\n\tvPullRefresh,\n\tvResize,\n\tvRipple,\n\tvSanitize,\n\tvScroll,\n\tvSticky,\n\tvSwipe,\n\tvThrottle,\n\tvTooltip,\n\tvTouch,\n\tvTrim,\n\tvTruncate,\n\tvUppercase,\n\tvVirtualList,\n\tvVisible,\n\tvWatermark,\n} from './directives'\n\n// Export all directives\nexport * from './directives'\n\n// Export core utilities\nexport * from '@directix/core'\n\n// Export shared utilities (excluding tools with the same name as directives)\nexport {\n\tdeepClone,\n\tdeepMerge,\n\tgenerateId,\n\tget,\n\tisArray,\n\tisBoolean,\n\tisEmpty,\n\tisFunction,\n\tisNumber,\n\tisObject,\n\tisPromise,\n\tisString,\n\tparseTime,\n\tset,\n} from '@directix/shared'\n// Export debounce and throttle utility functions separately (with aliases)\nexport {\n\tdebounce as debounceFn,\n\tthrottle as throttleFn,\n} from '@directix/shared'\n\n// All directives list\nconst allDirectives: Record<string, Directive> = {\n\t'click-outside': vClickOutside,\n\t'click-delay': vClickDelay,\n\tcopy: vCopy,\n\tdebounce: vDebounce,\n\tthrottle: vThrottle,\n\tfocus: vFocus,\n\thotkey: vHotkey,\n\tlazy: vLazy,\n\tintersect: vIntersect,\n\tvisible: vVisible,\n\tloading: vLoading,\n\tscroll: vScroll,\n\t'infinite-scroll': vInfiniteScroll,\n\tsticky: vSticky,\n\t'long-press': vLongPress,\n\thover: vHover,\n\tripple: vRipple,\n\tmask: vMask,\n\tpermission: vPermission,\n\tsanitize: vSanitize,\n\tresize: vResize,\n\tmutation: vMutation,\n\ttruncate: vTruncate,\n\tellipsis: vEllipsis,\n\tuppercase: vUppercase,\n\tlowercase: vLowercase,\n\tcapitalcase: vCapitalcase,\n\tnumber: vNumber,\n\tmoney: vMoney,\n\ttrim: vTrim,\n\ttooltip: vTooltip,\n\tdraggable: vDraggable,\n\ttouch: vTouch,\n\tswipe: vSwipe,\n\t'image-preview': vImagePreview,\n\tcountdown: vCountdown,\n\twatermark: vWatermark,\n\tprint: vPrint,\n\t'virtual-list': vVirtualList,\n\t'pull-refresh': vPullRefresh,\n}\n\n/**\n * Install all directives\n */\nconst install = (app: App | any, options: DirectiveInstallOptions = {}): void => {\n\t// Detect Vue version from app instance\n\t// Vue 2: app is the Vue constructor (has version static property, has directive static method)\n\t// Vue 3: app is an app instance (has config property, version on app.constructor or as _context)\n\n\tlet vueVersion: 2 | 3 | null = null\n\n\t// Check if it's Vue 2 constructor\n\tif (typeof app === 'function' && app.version?.startsWith('2')) {\n\t\tvueVersion = 2\n\t} else if (app?.config && app?.version?.startsWith('3')) {\n\t\t// Check if it's Vue 3 app instance\n\t\tvueVersion = 3\n\t} else if (typeof app?.directive === 'function' && typeof app?.mixin === 'function' && app.version?.startsWith('2')) {\n\t\t// Check for Vue 2 static methods (directive, component, mixin, etc.)\n\t\tvueVersion = 2\n\t} else if (typeof window !== 'undefined') {\n\t\t// Fallback: check global Vue\n\t\tconst win = window as any\n\n\t\tif (win.Vue?.version?.startsWith('2')) {\n\t\t\tvueVersion = 2\n\t\t} else if (win.Vue?.version?.startsWith('3')) {\n\t\t\tvueVersion = 3\n\t\t}\n\t}\n\n\t// Set the detected version\n\tif (vueVersion) {\n\t\tsetVueVersion(vueVersion)\n\t}\n\n\tconst { directives, all = false } = options\n\n\tif (all || !directives) {\n\t\t// Register all directives\n\t\tObject.entries(allDirectives).forEach(([name, directive]) => {\n\t\t\tapp.directive(name, directive)\n\t\t})\n\t} else {\n\t\t// Register specified directives\n\t\tdirectives.forEach(name => {\n\t\t\tconst directive = allDirectives[name]\n\n\t\t\tif (directive) {\n\t\t\t\tapp.directive(name, directive)\n\t\t\t} else {\n\t\t\t\tconsole.warn(`[Directix] Unknown directive: ${name}`)\n\t\t\t}\n\t\t})\n\t}\n}\n\n/**\n * Directix plugin\n */\nexport const Directix: Plugin = {\n\tinstall,\n}\n"],"names":["normalizeBinding","addCleanup","normalizeOptions","cleanup","parseTime","_b","_a","setupState","getDistance","scrollTop","scrollHeight","clientHeight","STATE_KEY","transformText","bindEvents","unbindEvents","startIndex","endIndex","offsetY"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../packages/core/src/adapter/vue2.ts","../packages/core/src/adapter/vue3.ts","../packages/core/src/env.ts","../packages/core/src/define.ts","../src/utils/text-transform.ts","../src/directives/capitalcase.ts","../packages/shared/src/directive.ts","../packages/shared/src/dom.ts","../packages/shared/src/event.ts","../packages/shared/src/event-modifiers.ts","../packages/shared/src/utils.ts","../src/directives/click-delay.ts","../src/directives/click-outside.ts","../src/directives/copy.ts","../src/directives/countdown.ts","../src/directives/debounce.ts","../src/directives/draggable.ts","../src/directives/ellipsis.ts","../src/directives/focus.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/lowercase.ts","../src/directives/mask.ts","../src/utils/number.ts","../src/directives/money.ts","../src/directives/mutation.ts","../src/directives/number.ts","../src/directives/permission.ts","../src/directives/print.ts","../src/directives/pull-refresh.ts","../src/directives/resize.ts","../src/directives/ripple.ts","../src/directives/sanitize.ts","../src/directives/scroll.ts","../src/directives/sticky.ts","../src/directives/swipe.ts","../src/directives/throttle.ts","../src/directives/tooltip.ts","../src/directives/touch.ts","../src/directives/trim.ts","../src/directives/truncate.ts","../src/directives/uppercase.ts","../src/directives/virtual-list.ts","../src/directives/visible.ts","../src/directives/watermark.ts","../src/composables/use-capitalcase.ts","../src/composables/use-click-delay.ts","../src/composables/use-click-outside.ts","../src/composables/use-copy.ts","../src/composables/use-countdown.ts","../src/composables/use-debounce.ts","../src/composables/use-draggable.ts","../src/composables/use-ellipsis.ts","../src/composables/use-focus.ts","../src/composables/use-hotkey.ts","../src/composables/use-hover.ts","../src/composables/use-image-preview.ts","../src/composables/use-intersect.ts","../src/composables/use-long-press.ts","../src/composables/use-lowercase.ts","../src/composables/use-money.ts","../src/composables/use-number.ts","../src/composables/use-permission.ts","../src/composables/use-print.ts","../src/composables/use-pull-refresh.ts","../src/composables/use-resize.ts","../src/composables/use-scroll.ts","../src/composables/use-swipe.ts","../src/composables/use-throttle.ts","../src/composables/use-touch.ts","../src/composables/use-trim.ts","../src/composables/use-uppercase.ts","../src/composables/use-virtual-list.ts","../src/composables/use-visible.ts","../src/composables/use-watermark.ts","../src/index.ts"],"sourcesContent":["import type { VNode } from 'vue'\nimport type { DirectiveBinding, DirectiveHooks } from '../types'\n\n/**\n * Element state storage\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Vue 2 directive adapter\n * @returns Vue 2 directive object with bind/inserted/update/unbind hooks\n */\nexport function createVue2Directive<T, B extends Element>(\n\thooks: DirectiveHooks<T, B>,\n): Record<string, any> {\n\tconst directive = {\n\t\tbind(el: B, binding: any, vnode: VNode) {\n\t\t\t// Store state\n\t\t\tconst state: ElementState = {\n\t\t\t\tvalue: binding.value,\n\t\t\t\tvnode,\n\t\t\t\tcleanup: [],\n\t\t\t}\n\n ;(el as any).__directix_state__ = state\n\t\t},\n\n\t\tinserted(el: B, binding: any, vnode: VNode) {\n\t\t\t// Vue 2's inserted is called after element is inserted into DOM\n\t\t\t// Call mounted here to ensure element is in DOM\n\t\t\tif (hooks.mounted) {\n\t\t\t\thooks.mounted(el, normalizeBinding(binding), vnode)\n\t\t\t}\n\t\t},\n\n\t\tupdate(el: B, binding: any, vnode: VNode, oldVnode: VNode) {\n\t\t\tconst state = (el as any).__directix_state__\n\n\t\t\tif (hooks.updated) {\n\t\t\t\thooks.updated(\n\t\t\t\t\tel,\n\t\t\t\t\tnormalizeBinding(binding),\n\t\t\t\t\tvnode,\n\t\t\t\t\tnormalizeBinding({ ...binding, value: binding.oldValue }),\n\t\t\t\t\toldVnode,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Update state\n\t\t\tif (state) {\n\t\t\t\tstate.value = binding.value\n\t\t\t\tstate.vnode = vnode\n\t\t\t}\n\t\t},\n\n\t\tcomponentUpdated(_el: B, _binding: any, _vnode: VNode, _oldVnode: VNode) {\n\t\t\t// Vue 2 specific, called after component update completes\n\t\t\t// Usually update is sufficient\n\t\t},\n\n\t\tunbind(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.unmounted) {\n\t\t\t\thooks.unmounted(el, normalizeBinding(binding), vnode)\n\t\t\t}\n\n\t\t\t// Execute cleanup functions\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (state?.cleanup) {\n\t\t\t\tstate.cleanup.forEach(fn => fn())\n\t\t\t}\n\t\t\tdelete (el as any).__directix_state__\n\t\t},\n\t}\n\n\treturn directive\n}\n\n/**\n * Normalize Vue 2 binding to unified format\n */\nfunction normalizeBinding<T>(binding: any): DirectiveBinding<T> {\n\treturn {\n\t\tvalue: binding.value,\n\t\toldValue: binding.oldValue ?? null,\n\t\targ: binding.arg,\n\t\tmodifiers: binding.modifiers || {},\n\t\tinstance: binding.instance || null,\n\t}\n}\n\n/**\n * Add cleanup function to element\n */\nexport function addCleanup(el: Element, fn: () => void): void {\n\tconst state = (el as any).__directix_state__\n\n\tif (state) {\n\t\tstate.cleanup.push(fn)\n\t}\n}\n","import type { VNode } from 'vue'\nimport type { DirectiveBinding, DirectiveHooks } from '../types'\n\n/**\n * Element state storage\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Vue 3 directive adapter\n * @returns Vue 3 directive object with created/mounted/updated/unmounted hooks\n */\nexport function createVue3Directive<T, B extends Element>(\n\thooks: DirectiveHooks<T, B>,\n): Record<string, any> {\n\tconst directive = {\n\t\tcreated(el: B, binding: any, vnode: VNode) {\n\t\t\t// Vue 3's created is called when element is created\n\t\t\t// Initialize state\n\t\t\tconst state: ElementState = {\n\t\t\t\tvalue: binding.value,\n\t\t\t\tvnode,\n\t\t\t\tcleanup: [],\n\t\t\t}\n\n ;(el as any).__directix_state__ = state\n\t\t},\n\n\t\tbeforeMount(_el: B, _binding: any, _vnode: VNode) {\n\t\t\t// Before mount\n\t\t},\n\n\t\tmounted(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.mounted) {\n\t\t\t\thooks.mounted(el, normalizeBindingVue3(binding), vnode)\n\t\t\t}\n\t\t},\n\n\t\tbeforeUpdate(_el: B, _binding: any, _vnode: VNode, _prevVnode: VNode) {\n\t\t\t// Before update\n\t\t},\n\n\t\tupdated(el: B, binding: any, vnode: VNode, prevVnode: VNode) {\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (hooks.updated) {\n\t\t\t\thooks.updated(\n\t\t\t\t\tel,\n\t\t\t\t\tnormalizeBindingVue3(binding),\n\t\t\t\t\tvnode,\n\t\t\t\t\tnormalizeBindingVue3({ ...binding, value: binding.oldValue }),\n\t\t\t\t\tprevVnode,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Update state\n\t\t\tif (state) {\n\t\t\t\tstate.value = binding.value\n\t\t\t\tstate.vnode = vnode\n\t\t\t}\n\t\t},\n\n\t\tbeforeUnmount(_el: B, _binding: any, _vnode: VNode) {\n\t\t\t// Before unmount\n\t\t},\n\n\t\tunmounted(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.unmounted) {\n\t\t\t\thooks.unmounted(el, normalizeBindingVue3(binding), vnode)\n\t\t\t}\n\n\t\t\t// Execute cleanup functions\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (state?.cleanup) {\n\t\t\t\tstate.cleanup.forEach(fn => fn())\n\t\t\t}\n\t\t\tdelete (el as any).__directix_state__\n\t\t},\n\t}\n\n\treturn directive\n}\n\n/**\n * Normalize Vue 3 binding to unified format\n */\nfunction normalizeBindingVue3<T>(binding: any): DirectiveBinding<T> {\n\treturn {\n\t\tvalue: binding.value,\n\t\toldValue: binding.oldValue ?? null,\n\t\targ: binding.arg,\n\t\tmodifiers: binding.modifiers || {},\n\t\tinstance: binding.instance,\n\t}\n}\n\n/**\n * Add cleanup function to element\n */\nexport function addCleanup(el: Element, fn: () => void): void {\n\tconst state = (el as any).__directix_state__\n\n\tif (state) {\n\t\tstate.cleanup.push(fn)\n\t}\n}\n","/**\n * Vue version type\n * - 2: Vue 2.6.x (requires @vue/composition-api for Composition API)\n * - 2.7: Vue 2.7.x (has built-in Composition API support)\n * - 3: Vue 3.x\n */\nexport type VueVersion = 2 | 2.7 | 3\n\n/**\n * Vue version detection\n */\nlet _vueVersion: VueVersion | null = null,\n\t_isVue2: boolean | null = null,\n\t_isVue27: boolean | null = null,\n\t_isVue3: boolean | null = null\n\n/**\n * Parse version string to VueVersion\n */\nfunction parseVersion(version: string): VueVersion | null {\n\tif (version.startsWith('2.7')) return 2.7\n\tif (version.startsWith('2')) return 2\n\tif (version.startsWith('3')) return 3\n\n\treturn null\n}\n\n/**\n * Get current Vue version\n */\nexport function getVueVersion(): VueVersion {\n\tif (_vueVersion !== null) return _vueVersion\n\n\t// Method 1: Check environment variable (highest priority)\n\tif (typeof process !== 'undefined') {\n\t\tconst envVersion = process.env.DIRECTIX_VUE_VERSION\n\n\t\tif (envVersion === '2.7') {\n\t\t\t_vueVersion = 2.7\n\n\t\t\treturn _vueVersion\n\t\t}\n\t\tif (envVersion === '2') {\n\t\t\t_vueVersion = 2\n\n\t\t\treturn _vueVersion\n\t\t}\n\t\tif (envVersion === '3') {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\t}\n\n\t// Method 2: Try require (CommonJS/Node.js)\n\ttry {\n\t\t// eslint-disable-next-line ts/no-require-imports\n\t\tconst vue = require('vue')\n\t\tconst version = parseVersion(vue?.version)\n\n\t\tif (version !== null) {\n\t\t\t_vueVersion = version\n\n\t\t\treturn _vueVersion\n\t\t}\n\t} catch {\n\t\t// require failed, continue to other methods\n\t}\n\n\t// Method 3: Check browser environment\n\tif (typeof window !== 'undefined') {\n\t\tconst win = window as any\n\t\tconst vue = win.Vue\n\n\t\t// Check version string\n\t\tif (vue?.version) {\n\t\t\tconst version = parseVersion(vue.version)\n\n\t\t\tif (version !== null) {\n\t\t\t\t_vueVersion = version\n\n\t\t\t\treturn _vueVersion\n\t\t\t}\n\t\t}\n\n\t\t// Check Vue 2 specific API\n\t\tif (typeof vue?.observable === 'function') {\n\t\t\t_vueVersion = 2\n\n\t\t\treturn _vueVersion\n\t\t}\n\n\t\t// Check Vue 3 specific API\n\t\tif (typeof vue?.createApp === 'function' && typeof vue?.observable !== 'function') {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\n\t\t// Check devtools hook\n\t\tconst devtools = win.__VUE_DEVTOOLS_GLOBAL_HOOK__\n\n\t\tif (devtools?.Vue?.version) {\n\t\t\tconst version = parseVersion(devtools.Vue.version)\n\n\t\t\tif (version !== null) {\n\t\t\t\t_vueVersion = version\n\n\t\t\t\treturn _vueVersion\n\t\t\t}\n\t\t}\n\t\tif (devtools?.apps?.length) {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\t}\n\n\t// Default to Vue 3 but warn\n\tif (_vueVersion === null) {\n\t\tif (typeof window !== 'undefined') {\n\t\t\tconsole.warn(\n\t\t\t\t'[Directix] Unable to detect Vue version, defaulting to Vue 3. '\n\t\t\t\t+ 'Set DIRECTIX_VUE_VERSION=2 or call setVueVersion(2) if using Vue 2.',\n\t\t\t)\n\t\t}\n\t\t_vueVersion = 3\n\t}\n\n\treturn _vueVersion\n}\n\n/**\n * Set Vue version explicitly (for cases where auto-detection fails)\n */\nexport function setVueVersion(version: VueVersion): void {\n\t_vueVersion = version\n\t_isVue2 = version === 2 || version === 2.7\n\t_isVue27 = version === 2.7\n\t_isVue3 = version === 3\n}\n\n/**\n * Reset Vue version (useful for testing)\n */\nexport function resetVueVersion(): void {\n\t_vueVersion = null\n\t_isVue2 = null\n\t_isVue27 = null\n\t_isVue3 = null\n}\n\n/**\n * Check if Vue 2 (includes 2.7)\n */\nexport function isVue2(): boolean {\n\tif (_isVue2 === null) {\n\t\tconst version = getVueVersion()\n\n\t\t_isVue2 = version === 2 || version === 2.7\n\t}\n\n\treturn _isVue2\n}\n\n/**\n * Check if Vue 2.7 (has built-in Composition API support)\n */\nexport function isVue27(): boolean {\n\tif (_isVue27 === null) {\n\t\t_isVue27 = getVueVersion() === 2.7\n\t}\n\n\treturn _isVue27\n}\n\n/**\n * Check if Vue 3\n */\nexport function isVue3(): boolean {\n\tif (_isVue3 === null) {\n\t\t_isVue3 = getVueVersion() === 3\n\t}\n\n\treturn _isVue3\n}\n\n/**\n * Check if browser environment\n */\nexport const isBrowser = (): boolean => {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\n/**\n * Check if server-side rendering\n */\nexport const isSSR = (): boolean => !isBrowser()\n\n/**\n * Check if passive event listening is supported\n */\nexport const supportsPassive = (): boolean => {\n\tif (!isBrowser()) return false\n\n\tlet supports = false\n\n\ttry {\n\t\tconst options = {\n\t\t\tget passive() {\n\t\t\t\tsupports = true\n\n\t\t\t\treturn false\n\t\t\t},\n\t\t}\n\n\t\twindow.addEventListener('test', null as any, options)\n\t\twindow.removeEventListener('test', null as any, options as any)\n\t} catch {\n\t\tsupports = false\n\t}\n\n\treturn supports\n}\n\n/**\n * Check if IntersectionObserver is supported\n */\nexport const supportsIntersectionObserver = (): boolean => {\n\treturn isBrowser() && 'IntersectionObserver' in window\n}\n\n/**\n * Check if ResizeObserver is supported\n */\nexport const supportsResizeObserver = (): boolean => {\n\treturn isBrowser() && 'ResizeObserver' in window\n}\n\n/**\n * Check if Clipboard API is supported\n */\nexport const supportsClipboard = (): boolean => {\n\treturn isBrowser() && 'clipboard' in navigator\n}\n\n/**\n * Check if MutationObserver is supported\n */\nexport const supportsMutationObserver = (): boolean => {\n\treturn isBrowser() && 'MutationObserver' in window\n}\n","import type { Directive } from 'vue'\nimport type { DirectiveBinding, DirectiveDefinition, DirectiveHooks } from './types'\nimport { createVue2Directive } from './adapter/vue2'\nimport { createVue3Directive } from './adapter/vue3'\nimport { getVueVersion, isSSR } from './env'\n\n/**\n * Define a cross-version compatible directive\n * @param definition The directive definition\n * @returns Vue directive object\n */\nexport function defineDirective<T = any, B extends Element = Element>(\n\tdefinition: DirectiveDefinition<T, B>,\n): Directive {\n\tconst { name, version, ssr, defaults, ...hooks } = definition\n\n\t// SSR check\n\tif (isSSR() && !ssr) {\n\t\tif (typeof process !== 'undefined' && process.env?.NODE_ENV !== 'test') {\n\t\t\tconsole.warn(\n\t\t\t\t`[Directix] Directive \"${name}\" is not compatible with SSR. `\n\t\t\t\t+ 'It will be a no-op on the server side.',\n\t\t\t)\n\t\t}\n\n\t\treturn createNoOpDirective()\n\t}\n\n\t// Wrap hooks with default values\n\tconst wrappedHooks: DirectiveHooks<T, B> = {\n\t\tmounted: hooks.mounted ? (el, binding, vnode) => {\n\t\t\thooks.mounted!(el, applyDefaults(binding, defaults), vnode)\n\t\t} : undefined,\n\n\t\tupdated: hooks.updated ? (el, binding, vnode, prevBinding, prevVnode) => {\n\t\t\thooks.updated!(el, applyDefaults(binding, defaults), vnode, prevBinding, prevVnode)\n\t\t} : undefined,\n\n\t\tunmounted: hooks.unmounted,\n\t}\n\n\t// Create a lazy directive that determines version at runtime\n\treturn createLazyDirective(wrappedHooks)\n}\n\n/**\n * Create a lazy directive that determines Vue version at first use\n */\nfunction createLazyDirective<T, B extends Element>(hooks: DirectiveHooks<T, B>): Directive {\n\tlet cachedDirective: any = null\n\n\t// Unified detection entry point\n\tfunction getDirective(): any {\n\t\tif (!cachedDirective) {\n\t\t\tcachedDirective = getVueVersion() === 2 ? createVue2Directive(hooks) : createVue3Directive(hooks)\n\t\t}\n\n\t\treturn cachedDirective\n\t}\n\n\t// Hook generator to reduce code duplication\n\tfunction createHook(hookName: string) {\n\t\treturn function (el: B, binding: any, vnode: any, prevVnode?: any) {\n\t\t\tgetDirective()[hookName]?.(el, binding, vnode, prevVnode)\n\t\t}\n\t}\n\n\treturn {\n\t\t// Vue 2 hooks\n\t\tbind: createHook('bind'),\n\t\tinserted: createHook('inserted'),\n\t\tupdate: createHook('update'),\n\t\tcomponentUpdated: createHook('componentUpdated'),\n\t\tunbind: createHook('unbind'),\n\t\t// Vue 3 hooks\n\t\tcreated: createHook('created'),\n\t\tbeforeMount: createHook('beforeMount'),\n\t\tmounted: createHook('mounted'),\n\t\tbeforeUpdate: createHook('beforeUpdate'),\n\t\tupdated: createHook('updated'),\n\t\tbeforeUnmount: createHook('beforeUnmount'),\n\t\tunmounted: createHook('unmounted'),\n\t} as Directive\n}\n\n/**\n * Apply default values to binding\n */\nfunction applyDefaults<T>(\n\tbinding: DirectiveBinding<T>,\n\tdefaults?: Partial<T>,\n): DirectiveBinding<T> {\n\tif (!defaults) return binding\n\n\tconst value\n\t\t= typeof binding.value === 'object' && binding.value !== null ? { ...defaults, ...binding.value } : binding.value\n\n\treturn { ...binding, value: value as T }\n}\n\n/**\n * Create a no-op directive (for SSR)\n */\nfunction createNoOpDirective(): Directive {\n\treturn {\n\t\tmounted: () => {},\n\t\tupdated: () => {},\n\t\tunmounted: () => {},\n\t}\n}\n\n/**\n * Define a directive group\n */\nexport function defineDirectiveGroup(\n\tname: string,\n\tdirectives: Record<string, any>,\n): { name: string, directives: Record<string, any>, install: (app: any) => void } {\n\treturn {\n\t\tname,\n\t\tdirectives,\n\t\tinstall(app: any, _options?: any) {\n\t\t\tObject.entries(directives).forEach(([directiveName, directive]) => {\n\t\t\t\tconst fullName = `${name}-${directiveName}`\n\n\t\t\t\tapp.directive(fullName, directive)\n\t\t\t})\n\t\t},\n\t}\n}\n","/**\n * Shared utilities for text transformation directives\n * (uppercase, lowercase, capitalcase, trim)\n */\n\n/**\n * Base options for text transform directives\n */\nexport interface TextTransformOptions {\n\t/**\n\t * Whether to transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Setup an input element with text transformation\n * Returns cleanup function\n */\nexport function setupTextTransformInput(\n\tel: HTMLInputElement | HTMLTextAreaElement,\n\toptions: TextTransformOptions,\n\ttransformFn: (text: string) => string,\n): () => void {\n\tif (!options.onInput) {\n\t\treturn () => {}\n\t}\n\n\tconst handler = (): void => {\n\t\tconst start = el.selectionStart\n\t\tconst end = el.selectionEnd\n\t\tconst originalValue = el.value\n\t\tconst transformed = transformFn(originalValue)\n\n\t\tif (originalValue !== transformed) {\n\t\t\tel.value = transformed\n\t\t\t// Restore cursor position\n\t\t\tif (start !== null && end !== null) {\n\t\t\t\tel.setSelectionRange(start, end)\n\t\t\t}\n\t\t\t// Trigger input event for v-model\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t}\n\t}\n\n\tel.addEventListener('input', handler)\n\n\t// Initial transform\n\tel.value = transformFn(el.value)\n\n\treturn () => {\n\t\tel.removeEventListener('input', handler)\n\t}\n}\n\n/**\n * Transform text content of a non-input element\n */\nexport function transformTextContent(el: HTMLElement, transformFn: (text: string) => string): void {\n\tconst text = el.textContent || ''\n\n\tel.textContent = transformFn(text)\n}\n\n/**\n * Check if element is an input or textarea\n */\nexport function isInputElement(el: HTMLElement): el is HTMLInputElement | HTMLTextAreaElement {\n\treturn el.tagName === 'INPUT' || el.tagName === 'TEXTAREA'\n}\n","import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Capitalcase directive options\n */\nexport interface CapitalcaseOptions {\n\t/**\n\t * Whether to capitalize each word or just the first word\n\t * @default true\n\t */\n\tevery?: boolean\n\n\t/**\n\t * Words to keep lowercase (articles, prepositions, etc.)\n\t * @default ['a', 'an', 'the', 'and', 'but', 'or', 'for', 'nor', 'on', 'at', 'to', 'from', 'by']\n\t */\n\tkeepLower?: string[]\n\n\t/**\n\t * Whether to transform on input (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type CapitalcaseBinding = boolean | CapitalcaseOptions\n\n/**\n * Default words to keep lowercase\n */\nconst DEFAULT_KEEP_LOWER = [\n\t'a', 'an', 'the',\n\t'and', 'but', 'or', 'for', 'nor',\n\t'on', 'at', 'to', 'from', 'by',\n\t'in', 'of', 'with', 'as',\n]\n\n/**\n * Capitalize text based on options\n */\nfunction capitalizeText(text: string, options: CapitalcaseOptions): string {\n\tif (!text) return text\n\n\tconst { every = true, keepLower = DEFAULT_KEEP_LOWER } = options\n\n\tif (every) {\n\t\t// Capitalize each word\n\t\tconst words = text.toLowerCase().split(/\\s+/)\n\n\t\treturn words\n\t\t\t.map((word, index) => {\n\t\t\t\t// Always capitalize first word\n\t\t\t\tif (index === 0) {\n\t\t\t\t\treturn capitalizeWord(word)\n\t\t\t\t}\n\t\t\t\t// Keep certain words lowercase\n\t\t\t\tif (keepLower.includes(word.toLowerCase())) {\n\t\t\t\t\treturn word.toLowerCase()\n\t\t\t\t}\n\n\t\t\t\treturn capitalizeWord(word)\n\t\t\t})\n\t\t\t.join(' ')\n\t} else {\n\t\t// Capitalize only the first word\n\t\treturn capitalizeWord(text)\n\t}\n}\n\n/**\n * Capitalize a single word\n */\nfunction capitalizeWord(word: string): string {\n\tif (!word) return word\n\n\treturn word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CapitalcaseBinding | undefined): CapitalcaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { every: true, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { every: false, onInput: false }\n\t}\n\n\treturn {\n\t\tevery: binding.every ?? true,\n\t\tkeepLower: binding.keepLower ?? DEFAULT_KEEP_LOWER,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-capitalcase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: capitalize each word -->\n * <input v-capitalcase v-model=\"title\" />\n *\n * <!-- Capitalize only first word -->\n * <span v-capitalcase=\"{ every: false }\">{{ text }}</span>\n *\n * <!-- With custom lowercase words -->\n * <input v-capitalcase=\"{ keepLower: ['a', 'the'] }\" v-model=\"title\" />\n * </template>\n * ```\n */\nexport const vCapitalcase = defineDirective<CapitalcaseBinding, HTMLElement>({\n\tname: 'capitalcase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => capitalizeText(text, options))\n\n\t\t\t;(el as any).__capitalcaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => capitalizeText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = capitalizeText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => capitalizeText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__capitalcaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__capitalcaseCleanup\n\t},\n})\n\nexport default vCapitalcase\n","/**\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","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","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, 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 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'\n\n/**\n * Focus directive options\n */\nexport interface FocusOptions {\n\t/**\n\t * Whether to auto focus\n\t * @default true\n\t */\n\tfocus?: boolean\n\n\t/**\n\t * Whether to refocus when binding value changes\n\t * @default false\n\t */\n\trefocus?: boolean\n\n\t/**\n\t * Callback when focused\n\t */\n\tonFocus?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when blurred\n\t */\n\tonBlur?: (el: HTMLElement) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type FocusBinding = boolean | FocusOptions\n\n/**\n * Element state storage\n */\ninterface FocusState {\n\toptions: FocusOptions\n\thandleFocus: () => void\n\thandleBlur: () => void\n\tlastValue: FocusBinding\n}\n\nconst FOCUSABLE_TAGS = new Set(['input', 'textarea', 'select', 'button'])\n\n/**\n * Compare two values for equality (supports primitive types and shallow object comparison)\n */\nfunction isEqual(a: unknown, b: unknown): boolean {\n\tif (a === b) return true\n\tif (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n\tconst objA = a as Record<string, unknown>\n\tconst objB = b as Record<string, unknown>\n\tconst keysA = Object.keys(objA)\n\tconst keysB = Object.keys(objB)\n\n\tif (keysA.length !== keysB.length) return false\n\n\treturn keysA.every(key => objA[key] === objB[key])\n}\n\n/**\n * v-focus directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-focus />\n * <input v-focus=\"{ focus: true, refocus: true }\" />\n * </template>\n * ```\n */\nexport const vFocus = defineDirective<FocusBinding, HTMLElement>({\n\tname: 'focus',\n\tssr: true, // SSR safe - will skip focus on server\n\tdefaults: {\n\t\tfocus: true,\n\t\trefocus: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!options.focus || !isFocusable(el)) {\n\t\t\tif (options.focus) {\n\t\t\t\tconsole.warn('[Directix] v-focus: Element is not focusable')\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tconst handleFocus = (): void => options.onFocus?.(el)\n\t\tconst handleBlur = (): void => options.onBlur?.(el)\n\n\t\tel.addEventListener('focus', handleFocus)\n\t\tel.addEventListener('blur', handleBlur)\n\n\t\t;(el as any).__focus = {\n\t\t\toptions,\n\t\t\thandleFocus,\n\t\t\thandleBlur,\n\t\t\tlastValue: binding.value,\n\t\t} as FocusState\n\n\t\tel.focus()\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: FocusState | undefined = (el as any).__focus\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Update event listeners only when callbacks change\n\t\tif (newOptions.onFocus !== state.options.onFocus) {\n\t\t\tel.removeEventListener('focus', state.handleFocus)\n\t\t\tstate.handleFocus = () => newOptions.onFocus?.(el)\n\t\t\tel.addEventListener('focus', state.handleFocus)\n\t\t}\n\n\t\tif (newOptions.onBlur !== state.options.onBlur) {\n\t\t\tel.removeEventListener('blur', state.handleBlur)\n\t\t\tstate.handleBlur = () => newOptions.onBlur?.(el)\n\t\t\tel.addEventListener('blur', state.handleBlur)\n\t\t}\n\n\t\t// Check if value actually changed\n\t\tconst valueChanged = !isEqual(binding.value, state.lastValue)\n\n\t\t// Refocus when value changes and refocus is enabled\n\t\tif (newOptions.refocus && newOptions.focus && valueChanged) {\n\t\t\tel.focus()\n\t\t}\n\n\t\tstate.options = newOptions\n\t\tstate.lastValue = binding.value\n\t},\n\n\tunmounted(el) {\n\t\tconst state: FocusState | undefined = (el as any).__focus\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('focus', state.handleFocus)\n\t\tel.removeEventListener('blur', state.handleBlur)\n\t\tdelete (el as any).__focus\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: FocusBinding | undefined): FocusOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { focus: binding, refocus: false }\n\t}\n\n\treturn {\n\t\tfocus: true,\n\t\trefocus: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if element is focusable\n */\nfunction isFocusable(el: HTMLElement): boolean {\n\tif (!isBrowser()) return false\n\n\tconst tagName = el.tagName.toLowerCase()\n\n\t// Form elements\n\tif (FOCUSABLE_TAGS.has(tagName)) {\n\t\treturn !(el as HTMLInputElement).disabled\n\t}\n\n\t// Contenteditable elements\n\tif (el.isContentEditable) return true\n\n\t// Elements with tabindex\n\tconst tabindex = el.getAttribute('tabindex')\n\n\tif (tabindex != null) return tabindex !== '-1'\n\n\t// Link elements\n\tif (tagName === 'a' || tagName === 'area') {\n\t\treturn el.hasAttribute('href')\n\t}\n\n\treturn false\n}\n\nexport default vFocus\n","import { defineDirective } from '@directix/core'\n\nexport type HotkeyHandler = (event: KeyboardEvent) => void\n\nexport type ModifierKey = 'ctrl' | 'alt' | 'shift' | 'meta'\n\nexport interface HotkeyDefinition {\n\tkey: string\n\tmodifiers?: ModifierKey[]\n\thandler: HotkeyHandler\n\tprevent?: boolean\n\tstop?: boolean\n\tdisabled?: boolean\n\tglobal?: boolean\n}\n\nexport type HotkeyBinding\n\t= | HotkeyHandler\n\t\t| HotkeyDefinition\n\t\t| HotkeyDefinition[]\n\t\t| Record<string, HotkeyHandler | HotkeyDefinition>\n\ninterface HotkeyEntry {\n\tkey: string\n\tmodifiers: Set<ModifierKey>\n\thandler: HotkeyHandler\n\tprevent: boolean\n\tstop: boolean\n\tdisabled: boolean\n}\n\ninterface HotkeyState {\n\tentries: HotkeyEntry[]\n\thandler: (event: KeyboardEvent) => void\n}\n\nconst KEY_ALIASES: Record<string, string> = {\n\tesc: 'escape',\n\tspace: ' ',\n\tup: 'arrowup',\n\tdown: 'arrowdown',\n\tleft: 'arrowleft',\n\tright: 'arrowright',\n\tenter: 'enter',\n\ttab: 'tab',\n\tdelete: 'delete',\n\tbackspace: 'backspace',\n\tinsert: 'insert',\n\thome: 'home',\n\tend: 'end',\n\tpagedown: 'pagedown',\n\tpageup: 'pageup',\n\tf1: 'f1',\n\tf2: 'f2',\n\tf3: 'f3',\n\tf4: 'f4',\n\tf5: 'f5',\n\tf6: 'f6',\n\tf7: 'f7',\n\tf8: 'f8',\n\tf9: 'f9',\n\tf10: 'f10',\n\tf11: 'f11',\n\tf12: 'f12',\n}\n\nconst MODIFIER_KEYS = new Set(['ctrl', 'alt', 'shift', 'meta'])\n\nfunction normalizeKey(key: string): string {\n\tconst lowerKey = key.toLowerCase()\n\treturn KEY_ALIASES[lowerKey] || lowerKey\n}\n\nfunction parseHotkeyString(hotkey: string): { key: string, modifiers: ModifierKey[] } {\n\tconst parts = hotkey.toLowerCase().split(/[+.]/)\n\tconst modifiers: ModifierKey[] = []\n\tlet key = ''\n\n\tfor (const part of parts) {\n\t\tif (MODIFIER_KEYS.has(part)) {\n\t\t\tmodifiers.push(part as ModifierKey)\n\t\t} else {\n\t\t\tkey = normalizeKey(part)\n\t\t}\n\t}\n\n\treturn { key, modifiers }\n}\n\nfunction matchesHotkey(event: KeyboardEvent, entry: HotkeyEntry): boolean {\n\tif (normalizeKey(event.key) !== entry.key) return false\n\n\tconst eventModifiers = new Set<ModifierKey>()\n\tif (event.ctrlKey) eventModifiers.add('ctrl')\n\tif (event.altKey) eventModifiers.add('alt')\n\tif (event.shiftKey) eventModifiers.add('shift')\n\tif (event.metaKey) eventModifiers.add('meta')\n\n\tif (eventModifiers.size !== entry.modifiers.size) return false\n\n\tfor (const mod of entry.modifiers) {\n\t\tif (!eventModifiers.has(mod)) return false\n\t}\n\n\treturn true\n}\n\nfunction createEntry(\n\tkey: string,\n\tmodifiers: ModifierKey[],\n\thandler: HotkeyHandler,\n\toptions: { prevent?: boolean, stop?: boolean, disabled?: boolean } = {},\n): HotkeyEntry {\n\treturn {\n\t\tkey: normalizeKey(key),\n\t\tmodifiers: new Set(modifiers),\n\t\thandler,\n\t\tprevent: options.prevent ?? true,\n\t\tstop: options.stop ?? true,\n\t\tdisabled: options.disabled ?? false,\n\t}\n}\n\nfunction normalizeBinding(\n\tbinding: HotkeyBinding,\n\targ: string | undefined,\n\tmodifiers: Record<string, boolean>,\n): HotkeyEntry[] {\n\t// Argument syntax: v-hotkey:ctrl.s=\"handler\" or v-hotkey:escape=\"handler\"\n\tif (arg) {\n\t\tconst argLower = arg.toLowerCase()\n\t\tconst argIsModifier = MODIFIER_KEYS.has(argLower)\n\n\t\tlet key: string\n\t\tconst parsedModifiers: ModifierKey[] = []\n\n\t\tif (argIsModifier) {\n\t\t\t// v-hotkey:ctrl.s -> arg is modifier, key in directive modifiers\n\t\t\tparsedModifiers.push(argLower as ModifierKey)\n\t\t\tfor (const mod of Object.keys(modifiers)) {\n\t\t\t\tconst modLower = mod.toLowerCase()\n\t\t\t\tif (MODIFIER_KEYS.has(modLower)) {\n\t\t\t\t\tparsedModifiers.push(modLower as ModifierKey)\n\t\t\t\t} else {\n\t\t\t\t\tkey = normalizeKey(mod)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// v-hotkey:escape -> arg is the key\n\t\t\tconst parsed = parseHotkeyString(arg)\n\t\t\tkey = parsed.key\n\t\t\tparsedModifiers.push(...parsed.modifiers)\n\t\t\tfor (const mod of Object.keys(modifiers)) {\n\t\t\t\tconst modLower = mod.toLowerCase()\n\t\t\t\tif (MODIFIER_KEYS.has(modLower)) {\n\t\t\t\t\tparsedModifiers.push(modLower as ModifierKey)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst handler = typeof binding === 'function' ? binding : (binding as HotkeyDefinition).handler\n\t\treturn [createEntry(key!, parsedModifiers, handler)]\n\t}\n\n\t// Function without arg - invalid\n\tif (typeof binding === 'function') {\n\t\tconsole.warn('[Directix] v-hotkey: hotkey definition required (use v-hotkey:ctrl.s=\"handler\")')\n\t\treturn []\n\t}\n\n\t// Array syntax: [{ key: 's', modifiers: ['ctrl'], handler }]\n\tif (Array.isArray(binding)) {\n\t\treturn binding.map(item =>\n\t\t\tcreateEntry(item.key, item.modifiers || [], item.handler, {\n\t\t\t\tprevent: item.prevent,\n\t\t\t\tstop: item.stop,\n\t\t\t\tdisabled: item.disabled,\n\t\t\t}),\n\t\t)\n\t}\n\n\t// Object syntax\n\tif (typeof binding === 'object' && binding !== null) {\n\t\t// Single HotkeyDefinition: { key: 's', handler }\n\t\tif ('handler' in binding && typeof binding.handler === 'function') {\n\t\t\tconst def = binding as HotkeyDefinition\n\t\t\treturn [createEntry(def.key, def.modifiers || [], def.handler, def)]\n\t\t}\n\n\t\t// Record syntax: { 'ctrl+s': handler }\n\t\tconst entries: HotkeyEntry[] = []\n\t\tfor (const [hotkeyStr, value] of Object.entries(binding)) {\n\t\t\tconst { key, modifiers: parsedModifiers } = parseHotkeyString(hotkeyStr)\n\t\t\tconst handler = typeof value === 'function' ? value : value.handler\n\t\t\tconst options = typeof value === 'object' ? value : {}\n\t\t\tentries.push(createEntry(key, parsedModifiers, handler, options))\n\t\t}\n\t\treturn entries\n\t}\n\n\treturn []\n}\n\nfunction createKeydownHandler(state: HotkeyState) {\n\treturn (event: KeyboardEvent) => {\n\t\tfor (const entry of state.entries) {\n\t\t\tif (entry.disabled) continue\n\t\t\tif (!matchesHotkey(event, entry)) continue\n\n\t\t\tif (entry.prevent) event.preventDefault()\n\t\t\tif (entry.stop) event.stopPropagation()\n\t\t\tentry.handler(event)\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunction setupState(el: HTMLElement, entries: HotkeyEntry[]): HotkeyState | null {\n\tif (entries.length === 0) return null\n\n\tconst state: HotkeyState = { entries, handler: null as any }\n\tstate.handler = createKeydownHandler(state)\n\n\tel.tabIndex = el.tabIndex || -1\n\tel.addEventListener('keydown', state.handler)\n\t;(el as any).__hotkey = state\n\n\treturn state\n}\n\nexport const vHotkey = defineDirective<HotkeyBinding, HTMLElement>({\n\tname: 'hotkey',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst entries = normalizeBinding(binding.value, binding.arg, binding.modifiers)\n\t\tsetupState(el, entries)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: HotkeyState | undefined = (el as any).__hotkey\n\t\tconst newEntries = normalizeBinding(binding.value, binding.arg, binding.modifiers)\n\n\t\tif (state) {\n\t\t\tstate.entries = newEntries\n\t\t} else {\n\t\t\tsetupState(el, newEntries)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: HotkeyState | undefined = (el as any).__hotkey\n\t\tif (!state) return\n\n\t\tel.removeEventListener('keydown', state.handler)\n\t\tdelete (el as any).__hotkey\n\t},\n})\n\nexport default vHotkey\n","/**\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 = '×'\n\t\tcloseBtn.setAttribute('aria-label', 'Close preview')\n\n\t\tObject.assign(closeBtn.style, {\n\t\t\tposition: 'fixed',\n\t\t\ttop: '16px',\n\t\t\tright: '16px',\n\t\t\twidth: '44px',\n\t\t\theight: '44px',\n\t\t\tborder: 'none',\n\t\t\tbackground: 'rgba(255, 255, 255, 0.15)',\n\t\t\tcolor: 'white',\n\t\t\tfontSize: '28px',\n\t\t\tcursor: 'pointer',\n\t\t\tborderRadius: '50%',\n\t\t\ttransition: 'background 0.2s, transform 0.2s',\n\t\t\tzIndex: String(zIndex + 1),\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t\tjustifyContent: 'center',\n\t\t\tbackdropFilter: 'blur(10px)',\n\t\t\tWebkitBackdropFilter: 'blur(10px)',\n\t\t})\n\n\t\tconst setBtnStyle = (bg: string, scale: string): void => {\n\t\t\tcloseBtn.style.background = bg\n\t\t\tcloseBtn.style.transform = scale\n\t\t}\n\n\t\tcloseBtn.addEventListener('mouseenter', () => setBtnStyle('rgba(255, 255, 255, 0.25)', 'scale(1.1)'))\n\t\tcloseBtn.addEventListener('mouseleave', () => setBtnStyle('rgba(255, 255, 255, 0.15)', 'scale(1)'))\n\t\tcloseBtn.addEventListener('touchstart', () => setBtnStyle('rgba(255, 255, 255, 0.35)', 'scale(1.15)'), { passive: true })\n\t\tcloseBtn.addEventListener('touchend', () => setBtnStyle('rgba(255, 255, 255, 0.15)', 'scale(1)'), { passive: true })\n\n\t\toverlay.appendChild(closeBtn)\n\t}\n\n\t// Zoom indicator\n\tif (options.showZoomIndicator !== false) {\n\t\tconst zoomIndicator = document.createElement('div')\n\t\tzoomIndicator.className = 'v-image-preview-zoom'\n\t\tzoomIndicator.textContent = '100%'\n\n\t\tObject.assign(zoomIndicator.style, {\n\t\t\tposition: 'fixed',\n\t\t\tbottom: '24px',\n\t\t\tleft: '50%',\n\t\t\ttransform: 'translateX(-50%)',\n\t\t\tbackground: 'rgba(0, 0, 0, 0.6)',\n\t\t\tcolor: 'white',\n\t\t\tpadding: '8px 16px',\n\t\t\tborderRadius: '20px',\n\t\t\tfontSize: '14px',\n\t\t\tfontWeight: '500',\n\t\t\topacity: '0',\n\t\t\ttransition: 'opacity 0.3s',\n\t\t\tzIndex: String(zIndex + 1),\n\t\t\tbackdropFilter: 'blur(10px)',\n\t\t\tWebkitBackdropFilter: 'blur(10px)',\n\t\t})\n\n\t\toverlay.appendChild(zoomIndicator)\n\t}\n\n\t// Hint\n\tconst hint = document.createElement('div')\n\thint.className = 'v-image-preview-hint'\n\thint.textContent = 'Pinch to zoom • Double tap • Swipe up to close'\n\n\tObject.assign(hint.style, {\n\t\tposition: 'fixed',\n\t\tbottom: '60px',\n\t\tleft: '50%',\n\t\ttransform: 'translateX(-50%)',\n\t\tcolor: 'rgba(255, 255, 255, 0.6)',\n\t\tfontSize: '12px',\n\t\topacity: '1',\n\t\ttransition: 'opacity 0.5s',\n\t\tzIndex: String(zIndex + 1),\n\t\tpointerEvents: 'none',\n\t})\n\n\toverlay.appendChild(hint)\n\tsetTimeout(() => (hint.style.opacity = '0'), DEFAULTS.hintDuration)\n\n\toverlay.appendChild(imageContainer)\n\n\treturn { overlay, imageContainer, image }\n}\n\n// ============================================================================\n// Transform Helpers\n// ============================================================================\n\ninterface TransformManager {\n\tupdateTransform: (animate?: boolean) => void\n\tresetTransform: () => void\n\tconstrainScale: (newScale: number) => number\n\tconstrainTranslate: (x: number, y: number) => { x: number, y: number }\n}\n\nfunction createTransformManager(state: PreviewState): TransformManager {\n\tconst updateTransform = (animate = false): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tconst { scale, translateX, translateY } = state.transform\n\t\tstate.imageContainer.style.transition = animate ? 'transform 0.2s ease-out' : 'none'\n\t\tstate.imageContainer.style.transform = `translate(${translateX}px, ${translateY}px) scale(${scale})`\n\n\t\t// Update zoom indicator\n\t\tconst zoomIndicator = state.overlay?.querySelector('.v-image-preview-zoom') as HTMLElement | null\n\t\tif (zoomIndicator) {\n\t\t\tzoomIndicator.textContent = `${Math.round(scale * 100)}%`\n\t\t\tzoomIndicator.style.opacity = '1'\n\n\t\t\tclearTimeout((zoomIndicator as any)._hideTimer)\n\t\t\t;(zoomIndicator as any)._hideTimer = setTimeout(() => {\n\t\t\t\tzoomIndicator.style.opacity = '0'\n\t\t\t}, DEFAULTS.zoomIndicatorDuration)\n\t\t}\n\t}\n\n\tconst resetTransform = (): void => {\n\t\tstate.transform = { scale: 1, translateX: 0, translateY: 0 }\n\t\tupdateTransform(true)\n\t}\n\n\tconst constrainScale = (newScale: number): number => {\n\t\tconst { minScale = DEFAULTS.minScale, maxScale = DEFAULTS.maxScale } = state.options\n\t\treturn clamp(newScale, minScale, maxScale)\n\t}\n\n\tconst constrainTranslate = (x: number, y: number): { x: number, y: number } => {\n\t\tconst { scale } = state.transform\n\t\tif (!state.image || scale <= 1) return { x: 0, y: 0 }\n\n\t\tconst rect = state.image.getBoundingClientRect()\n\t\tconst maxX = (rect.width * (scale - 1)) / 2\n\t\tconst maxY = (rect.height * (scale - 1)) / 2\n\n\t\treturn {\n\t\t\tx: clamp(x, -maxX, maxX),\n\t\t\ty: clamp(y, -maxY, maxY),\n\t\t}\n\t}\n\n\treturn { updateTransform, resetTransform, constrainScale, constrainTranslate }\n}\n\n// ============================================================================\n// Gesture Handlers\n// ============================================================================\n\ninterface GestureHandlers {\n\thandleTouchStart: (e: TouchEvent) => void\n\thandleTouchMove: (e: TouchEvent) => void\n\thandleTouchEnd: (e: TouchEvent) => void\n\thandleMouseDown: (e: MouseEvent) => void\n\thandleMouseMove: (e: MouseEvent) => void\n\thandleMouseUp: () => void\n\thandleWheel: (e: WheelEvent) => void\n}\n\nfunction createGestureHandlers(\n\tstate: PreviewState,\n\ttransformManager: TransformManager,\n\tclosePreview: () => void,\n): GestureHandlers {\n\tconst { updateTransform, resetTransform, constrainScale, constrainTranslate } = transformManager\n\n\tconst handleTouchStart = (e: TouchEvent): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tconst now = Date.now()\n\t\tconst { gesture, transform, options } = state\n\n\t\tif (e.touches.length === 1) {\n\t\t\t// Double tap detection\n\t\t\tif (options.enableDoubleTap !== false && now - gesture.lastTapTime < DEFAULTS.tapTimeout) {\n\t\t\t\te.preventDefault()\n\t\t\t\ttransform.scale = transform.scale > 1 ? 1 : constrainScale(DEFAULTS.doubleTapZoom)\n\t\t\t\tgesture.lastTapTime = 0\n\t\t\t\tupdateTransform(true)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tgesture.lastTapTime = now\n\t\t\tgesture.isDragging = true\n\t\t\tgesture.startX = e.touches[0].clientX - transform.translateX\n\t\t\tgesture.startY = e.touches[0].clientY - transform.translateY\n\t\t\tgesture.swipeStartY = e.touches[0].clientY\n\t\t} else if (e.touches.length === 2 && options.enablePinchZoom !== false) {\n\t\t\tgesture.isDragging = false\n\t\t\tgesture.startDistance = getDistance(\n\t\t\t\te.touches[0].clientX,\n\t\t\t\te.touches[0].clientY,\n\t\t\t\te.touches[1].clientX,\n\t\t\t\te.touches[1].clientY,\n\t\t\t)\n\t\t\tgesture.startScale = transform.scale\n\t\t}\n\t}\n\n\tconst handleTouchMove = (e: TouchEvent): void => {\n\t\tif (!state.imageContainer) return\n\t\te.preventDefault()\n\n\t\tconst { gesture, transform, options } = state\n\n\t\tif (e.touches.length === 1 && gesture.isDragging) {\n\t\t\tconst newX = e.touches[0].clientX - gesture.startX\n\t\t\tconst newY = e.touches[0].clientY - gesture.startY\n\t\t\tconst constrained = constrainTranslate(newX, newY)\n\n\t\t\ttransform.translateX = constrained.x\n\t\t\ttransform.translateY = constrained.y\n\t\t\tupdateTransform(false)\n\t\t} else if (e.touches.length === 2 && options.enablePinchZoom !== false) {\n\t\t\tconst currentDistance = getDistance(\n\t\t\t\te.touches[0].clientX,\n\t\t\t\te.touches[0].clientY,\n\t\t\t\te.touches[1].clientX,\n\t\t\t\te.touches[1].clientY,\n\t\t\t)\n\n\t\t\ttransform.scale = constrainScale(gesture.startScale * (currentDistance / gesture.startDistance))\n\t\t\tupdateTransform(false)\n\t\t}\n\t}\n\n\tconst handleTouchEnd = (e: TouchEvent): void => {\n\t\tconst { gesture, transform, options } = state\n\t\tgesture.isDragging = false\n\n\t\t// Swipe up to close\n\t\tif (options.enableSwipeClose !== false && e.changedTouches.length === 1 && transform.scale <= 1) {\n\t\t\tconst deltaY = e.changedTouches[0].clientY - gesture.swipeStartY\n\t\t\tif (deltaY < -DEFAULTS.swipeThreshold) {\n\t\t\t\tclosePreview()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\t// Snap back if scale < 1\n\t\tif (transform.scale < 1) {\n\t\t\tresetTransform()\n\t\t}\n\t}\n\n\tconst handleMouseDown = (e: MouseEvent): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tstate.gesture.isDragging = true\n\t\tstate.gesture.startX = e.clientX - state.transform.translateX\n\t\tstate.gesture.startY = e.clientY - state.transform.translateY\n\t\tstate.imageContainer.style.cursor = 'grabbing'\n\t}\n\n\tconst handleMouseMove = (e: MouseEvent): void => {\n\t\tif (!state.gesture.isDragging || !state.imageContainer) return\n\n\t\tconst newX = e.clientX - state.gesture.startX\n\t\tconst newY = e.clientY - state.gesture.startY\n\t\tconst constrained = constrainTranslate(newX, newY)\n\n\t\tstate.transform.translateX = constrained.x\n\t\tstate.transform.translateY = constrained.y\n\t\tupdateTransform(false)\n\t}\n\n\tconst handleMouseUp = (): void => {\n\t\tstate.gesture.isDragging = false\n\t\tif (state.imageContainer) {\n\t\t\tstate.imageContainer.style.cursor = 'grab'\n\t\t}\n\t}\n\n\tconst handleWheel = (e: WheelEvent): void => {\n\t\tif (!state.imageContainer || state.options.enablePinchZoom === false) return\n\t\te.preventDefault()\n\n\t\tconst delta = e.deltaY > 0 ? 0.9 : 1.1\n\t\tstate.transform.scale = constrainScale(state.transform.scale * delta)\n\t\tupdateTransform(false)\n\n\t\t// Reset if too small\n\t\tif (state.transform.scale < 0.8) {\n\t\t\tsetTimeout(resetTransform, 100)\n\t\t}\n\t}\n\n\treturn { handleTouchStart, handleTouchMove, handleTouchEnd, handleMouseDown, handleMouseMove, handleMouseUp, handleWheel }\n}\n\n// ============================================================================\n// Normalize Options\n// ============================================================================\n\nfunction normalizeOptions(binding: ImagePreviewBinding, el: HTMLElement): ImagePreviewOptions {\n\tconst elSrc = el.tagName === 'IMG' ? (el as HTMLImageElement).src : undefined\n\tconst elPreviewSrc = el.getAttribute('data-preview') || undefined\n\tconst elAlt = el.tagName === 'IMG' ? (el as HTMLImageElement).alt : el.getAttribute('alt') || undefined\n\n\tif (typeof binding === 'string') {\n\t\treturn {\n\t\t\tsrc: binding,\n\t\t\tpreviewSrc: elPreviewSrc,\n\t\t\talt: elAlt,\n\t\t\tenablePinchZoom: true,\n\t\t\tenableDoubleTap: true,\n\t\t\tenableSwipeClose: true,\n\t\t\tshowZoomIndicator: true,\n\t\t\tshowCloseButton: true,\n\t\t\tcloseOnClickOutside: true,\n\t\t\tcloseOnEsc: true,\n\t\t\tminScale: DEFAULTS.minScale,\n\t\t\tmaxScale: DEFAULTS.maxScale,\n\t\t}\n\t}\n\n\treturn {\n\t\tsrc: binding?.src || elSrc,\n\t\tpreviewSrc: binding?.previewSrc || elPreviewSrc,\n\t\talt: binding?.alt || elAlt,\n\t\tdisabled: binding?.disabled ?? false,\n\t\tcloseOnClickOutside: binding?.closeOnClickOutside ?? true,\n\t\tcloseOnEsc: binding?.closeOnEsc ?? true,\n\t\tshowCloseButton: binding?.showCloseButton ?? true,\n\t\tzIndex: binding?.zIndex,\n\t\tclass: binding?.class,\n\t\tenablePinchZoom: binding?.enablePinchZoom ?? true,\n\t\tenableDoubleTap: binding?.enableDoubleTap ?? true,\n\t\tenableSwipeClose: binding?.enableSwipeClose ?? true,\n\t\tshowZoomIndicator: binding?.showZoomIndicator ?? true,\n\t\tminScale: binding?.minScale ?? DEFAULTS.minScale,\n\t\tmaxScale: binding?.maxScale ?? DEFAULTS.maxScale,\n\t\tonOpen: binding?.onOpen,\n\t\tonClose: binding?.onClose,\n\t}\n}\n\n// ============================================================================\n// Directive\n// ============================================================================\n\n/**\n * v-image-preview directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage -->\n * <img v-image-preview src=\"thumbnail.jpg\" data-preview=\"full.jpg\" />\n *\n * <!-- With options -->\n * <img v-image-preview=\"{ src: 'thumbnail.jpg', previewSrc: 'full.jpg' }\" />\n *\n * <!-- On non-img element -->\n * <div v-image-preview=\"{ src: 'image.jpg' }\">Click to preview</div>\n * </template>\n * ```\n */\nexport const vImagePreview = defineDirective<ImagePreviewBinding, HTMLElement>({\n\tname: 'image-preview',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, el)\n\n\t\tconst state: PreviewState = {\n\t\t\toptions,\n\t\t\toverlay: null,\n\t\t\timageContainer: null,\n\t\t\timage: null,\n\t\t\tisOpen: false,\n\t\t\ttransform: { scale: 1, translateX: 0, translateY: 0 },\n\t\t\tgesture: {\n\t\t\t\tisDragging: false,\n\t\t\t\tstartX: 0,\n\t\t\t\tstartY: 0,\n\t\t\t\tstartDistance: 0,\n\t\t\t\tstartScale: 1,\n\t\t\t\tlastTapTime: 0,\n\t\t\t\tswipeStartY: 0,\n\t\t\t},\n\t\t\thandlers: {\n\t\t\t\tclick: () => {},\n\t\t\t\tesc: null,\n\t\t\t\ttouchStart: null,\n\t\t\t\ttouchMove: null,\n\t\t\t\ttouchEnd: null,\n\t\t\t\tmouseDown: null,\n\t\t\t\tmouseMove: null,\n\t\t\t\tmouseUp: null,\n\t\t\t\twheel: null,\n\t\t\t},\n\t\t}\n\n\t\t;(el as any).__imagePreview = state\n\n\t\tif (options.disabled) return\n\t\tel.style.cursor = 'zoom-in'\n\n\t\t// Transform manager\n\t\tconst transformManager = createTransformManager(state)\n\n\t\t// Close preview\n\t\tconst closePreview = (): void => {\n\t\t\tif (!state.isOpen || !state.overlay) return\n\n\t\t\tstate.overlay.style.opacity = '0'\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!state.overlay) return\n\n\t\t\t\tstate.overlay.remove()\n\t\t\t\tstate.overlay = null\n\t\t\t\tstate.imageContainer = null\n\t\t\t\tstate.image = null\n\t\t\t\tstate.isOpen = false\n\t\t\t\tstate.transform = { scale: 1, translateX: 0, translateY: 0 }\n\t\t\t\tdocument.body.style.overflow = ''\n\n\t\t\t\t// Cleanup handlers\n\t\t\t\tconst { handlers } = state\n\t\t\t\tif (handlers.esc) document.removeEventListener('keydown', handlers.esc)\n\t\t\t\tif (handlers.touchStart) document.removeEventListener('touchstart', handlers.touchStart)\n\t\t\t\tif (handlers.touchMove) document.removeEventListener('touchmove', handlers.touchMove)\n\t\t\t\tif (handlers.touchEnd) document.removeEventListener('touchend', handlers.touchEnd)\n\t\t\t\tif (handlers.mouseDown) document.removeEventListener('mousedown', handlers.mouseDown)\n\t\t\t\tif (handlers.mouseMove) document.removeEventListener('mousemove', handlers.mouseMove)\n\t\t\t\tif (handlers.mouseUp) document.removeEventListener('mouseup', handlers.mouseUp)\n\t\t\t\tif (handlers.wheel) document.removeEventListener('wheel', handlers.wheel)\n\n\t\t\t\tstate.options.onClose?.()\n\t\t\t}, DEFAULTS.animationDuration)\n\t\t}\n\n\t\t// Gesture handlers\n\t\tconst gestureHandlers = createGestureHandlers(state, transformManager, closePreview)\n\n\t\t// Open preview\n\t\tconst openPreview = (): void => {\n\t\t\tif (state.isOpen || state.options.disabled) return\n\n\t\t\tconst { overlay, imageContainer, image } = createOverlay(state.options)\n\t\t\tstate.overlay = overlay\n\t\t\tstate.imageContainer = imageContainer\n\t\t\tstate.image = image\n\t\t\tstate.isOpen = true\n\n\t\t\tdocument.body.appendChild(overlay)\n\t\t\tdocument.body.style.overflow = 'hidden'\n\n\t\t\trequestAnimationFrame(() => (overlay.style.opacity = '1'))\n\n\t\t\t// Store handlers\n\t\t\tstate.handlers.touchStart = gestureHandlers.handleTouchStart\n\t\t\tstate.handlers.touchMove = gestureHandlers.handleTouchMove\n\t\t\tstate.handlers.touchEnd = gestureHandlers.handleTouchEnd\n\t\t\tstate.handlers.mouseDown = gestureHandlers.handleMouseDown\n\t\t\tstate.handlers.mouseMove = gestureHandlers.handleMouseMove\n\t\t\tstate.handlers.mouseUp = gestureHandlers.handleMouseUp\n\t\t\tstate.handlers.wheel = gestureHandlers.handleWheel\n\n\t\t\t// Touch events\n\t\t\toverlay.addEventListener('touchstart', gestureHandlers.handleTouchStart, { passive: false })\n\t\t\toverlay.addEventListener('touchmove', gestureHandlers.handleTouchMove, { passive: false })\n\t\t\toverlay.addEventListener('touchend', gestureHandlers.handleTouchEnd, { passive: true })\n\n\t\t\t// Mouse events\n\t\t\timage.addEventListener('mousedown', gestureHandlers.handleMouseDown)\n\t\t\tdocument.addEventListener('mousemove', gestureHandlers.handleMouseMove)\n\t\t\tdocument.addEventListener('mouseup', gestureHandlers.handleMouseUp)\n\n\t\t\t// Wheel zoom\n\t\t\toverlay.addEventListener('wheel', gestureHandlers.handleWheel, { passive: false })\n\n\t\t\t// Close button\n\t\t\toverlay.querySelector('.v-image-preview-close')?.addEventListener('click', e => {\n\t\t\t\te.stopPropagation()\n\t\t\t\tclosePreview()\n\t\t\t})\n\n\t\t\t// Click outside\n\t\t\tif (state.options.closeOnClickOutside !== false) {\n\t\t\t\toverlay.addEventListener('click', () => {\n\t\t\t\t\tif (state.transform.scale <= 1) {\n\t\t\t\t\t\tclosePreview()\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttransformManager.resetTransform()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Escape key\n\t\t\tif (state.options.closeOnEsc !== false) {\n\t\t\t\tstate.handlers.esc = e => {\n\t\t\t\t\tif (e.key === 'Escape') {\n\t\t\t\t\t\tstate.transform.scale > 1 ? transformManager.resetTransform() : closePreview()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdocument.addEventListener('keydown', state.handlers.esc)\n\t\t\t}\n\n\t\t\tstate.options.onOpen?.()\n\t\t}\n\n\t\tstate.handlers.click = openPreview\n\t\tel.addEventListener('click', openPreview)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__imagePreview as PreviewState | undefined\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value, el)\n\t\tel.style.cursor = state.options.disabled ? '' : 'zoom-in'\n\t},\n\n\tunmounted(el) {\n\t\tconst state = (el as any).__imagePreview as PreviewState | undefined\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handlers.click)\n\n\t\tif (state.isOpen && state.overlay) {\n\t\t\tstate.overlay.remove()\n\t\t\tdocument.body.style.overflow = ''\n\t\t}\n\n\t\tif (state.handlers.esc) document.removeEventListener('keydown', state.handlers.esc)\n\t\tif (state.handlers.touchStart) document.removeEventListener('touchstart', state.handlers.touchStart)\n\t\tif (state.handlers.touchMove) document.removeEventListener('touchmove', state.handlers.touchMove)\n\t\tif (state.handlers.touchEnd) document.removeEventListener('touchend', state.handlers.touchEnd)\n\t\tif (state.handlers.mouseDown) document.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\tif (state.handlers.mouseMove) document.removeEventListener('mousemove', state.handlers.mouseMove)\n\t\tif (state.handlers.mouseUp) document.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\tif (state.handlers.wheel) document.removeEventListener('wheel', state.handlers.wheel)\n\n\t\tdelete (el as any).__imagePreview\n\t},\n})\n\nexport default vImagePreview\n","import { defineDirective, isBrowser, supportsIntersectionObserver } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\n/**\n * Infinite scroll handler\n */\nexport type InfiniteScrollHandler = () => void | Promise<void>\n\n/**\n * Infinite scroll directive options\n */\nexport interface InfiniteScrollOptions {\n\t/**\n\t * Handler to call when scrolling to bottom\n\t * @required\n\t */\n\thandler: InfiniteScrollHandler\n\n\t/**\n\t * Distance from bottom to trigger load (in pixels)\n\t * @default 0\n\t */\n\tdistance?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether currently loading\n\t * @default false\n\t */\n\tloading?: boolean\n\n\t/**\n\t * Whether to use IntersectionObserver (more efficient)\n\t * @default true\n\t */\n\tuseIntersection?: boolean\n\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 200\n\t */\n\tthrottle?: number\n\n\t/**\n\t * Custom scroll container\n\t */\n\tcontainer?: string | Element | null\n\n\t/**\n\t * Callback when load starts\n\t */\n\tonLoadStart?: () => void\n\n\t/**\n\t * Callback when load completes\n\t */\n\tonLoadEnd?: () => void\n\n\t/**\n\t * Callback on error\n\t */\n\tonError?: (error: Error) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type InfiniteScrollBinding = InfiniteScrollHandler | InfiniteScrollOptions\n\n/**\n * Element state storage\n */\ninterface InfiniteScrollState {\n\toptions: InfiniteScrollOptions\n\tscrollHandler: (e: Event) => void\n\tcontainer: Element | Window\n\tsentinel: HTMLDivElement | null\n\tobserver: IntersectionObserver | null\n\tthrottleTimer: ReturnType<typeof setTimeout> | null\n\tisLoading: boolean\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: InfiniteScrollBinding | undefined): InfiniteScrollOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, distance: 0, throttle: 200, useIntersection: true }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-infinite-scroll: handler is required')\n\t}\n\n\treturn {\n\t\tdistance: 0,\n\t\tdisabled: false,\n\t\tloading: false,\n\t\tuseIntersection: true,\n\t\tthrottle: 200,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-infinite-scroll directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-infinite-scroll=\"loadMore\" class=\"scroll-container\">\n * <div v-for=\"item in items\" :key=\"item.id\">{{ item.name }}</div>\n * </div>\n *\n * <div v-infinite-scroll=\"{ handler: loadMore, distance: 100, disabled: isLoading }\">\n * <div v-for=\"item in items\" :key=\"item.id\">{{ item.name }}</div>\n * </div>\n * </template>\n * ```\n */\nexport const vInfiniteScroll = defineDirective<InfiniteScrollBinding, HTMLElement>({\n\tname: 'infinite-scroll',\n\tssr: false,\n\tdefaults: {\n\t\tdistance: 0,\n\t\tdisabled: false,\n\t\tloading: false,\n\t\tuseIntersection: true,\n\t\tthrottle: 200,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Determine scroll container\n\t\tlet container: Element | Window\n\n\t\tif (options.container) {\n\t\t\tif (typeof options.container === 'string') {\n\t\t\t\tconst found = document.querySelector(options.container)\n\n\t\t\t\tcontainer = found || getScrollParent(el)\n\t\t\t} else {\n\t\t\t\tcontainer = options.container\n\t\t\t}\n\t\t} else {\n\t\t\tcontainer = getScrollParent(el)\n\t\t}\n\n\t\tconst state: InfiniteScrollState = {\n\t\t\toptions,\n\t\t\tcontainer,\n\t\t\tsentinel: null,\n\t\t\tobserver: null,\n\t\t\tthrottleTimer: null,\n\t\t\tisLoading: false,\n\t\t\tscrollHandler: async (_e: Event) => {\n\t\t\t\tif (state.isLoading || state.options.disabled || state.options.loading) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Throttle\n\t\t\t\tif (state.throttleTimer) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tstate.throttleTimer = setTimeout(() => {\n\t\t\t\t\tstate.throttleTimer = null\n\t\t\t\t}, options.throttle)\n\n\t\t\t\t// Check scroll position\n\t\t\t\tconst shouldLoad = checkShouldLoad(container, el, options.distance || 0)\n\n\t\t\t\tif (shouldLoad) {\n\t\t\t\t\tawait triggerLoad(state, el)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__infiniteScroll = state\n\n\t\t// Use IntersectionObserver if available and enabled\n\t\tif (options.useIntersection && supportsIntersectionObserver()) {\n\t\t\tsetupIntersectionObserver(el, state)\n\t\t} else {\n\t\t\t// Use scroll event listener\n\t\t\ton(container, 'scroll', state.scrollHandler, { passive: true })\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: InfiniteScrollState = (el as any).__infiniteScroll\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: InfiniteScrollState = (el as any).__infiniteScroll\n\n\t\tif (!state) return\n\n\t\t// Clear throttle timer\n\t\tif (state.throttleTimer) {\n\t\t\tclearTimeout(state.throttleTimer)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\t// Remove sentinel\n\t\tif (state.sentinel && state.sentinel.parentNode) {\n\t\t\tstate.sentinel.parentNode.removeChild(state.sentinel)\n\t\t}\n\n\t\t// Remove scroll listener\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\n\t\tdelete (el as any).__infiniteScroll\n\t},\n})\n\n/**\n * Check if should load more\n */\nfunction checkShouldLoad(container: Element | Window, _el: HTMLElement, distance: number): boolean {\n\tif (container === window) {\n\t\tconst scrollTop = window.scrollY || document.documentElement.scrollTop\n\t\tconst scrollHeight = document.documentElement.scrollHeight\n\t\tconst clientHeight = window.innerHeight\n\n\t\treturn scrollTop + clientHeight >= scrollHeight - distance\n\t}\n\n\tconst el = container as Element\n\tconst scrollTop = el.scrollTop\n\tconst scrollHeight = el.scrollHeight\n\tconst clientHeight = el.clientHeight\n\n\treturn scrollTop + clientHeight >= scrollHeight - distance\n}\n\n/**\n * Trigger load handler\n */\nasync function triggerLoad(state: InfiniteScrollState, el: HTMLElement): Promise<void> {\n\tstate.isLoading = true\n\tstate.options.onLoadStart?.()\n\n\tel.classList.add('v-infinite-scroll--loading')\n\n\ttry {\n\t\tawait state.options.handler()\n\t} catch (err) {\n\t\tstate.options.onError?.(err as Error)\n\t} finally {\n\t\tstate.isLoading = false\n\t\tstate.options.onLoadEnd?.()\n\t\tel.classList.remove('v-infinite-scroll--loading')\n\t}\n}\n\n/**\n * Setup IntersectionObserver\n */\nfunction setupIntersectionObserver(el: HTMLElement, state: InfiniteScrollState): void {\n\t// Create sentinel element\n\tconst sentinel = document.createElement('div')\n\n\tsentinel.className = 'v-infinite-scroll__sentinel'\n\tsentinel.style.cssText = `\n height: 1px;\n width: 100%;\n clear: both;\n `\n\n\tel.appendChild(sentinel)\n\tstate.sentinel = sentinel\n\n\t// Create observer\n\tstate.observer = new IntersectionObserver(\n\t\tasync entries => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tif (!state.isLoading && !state.options.disabled && !state.options.loading) {\n\t\t\t\t\t\tawait triggerLoad(state, el)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\troot: state.container === window ? null : (state.container as Element),\n\t\t\trootMargin: `${state.options.distance || 0}px`,\n\t\t\tthreshold: 0,\n\t\t},\n\t)\n\n\tstate.observer.observe(sentinel)\n}\n\nexport default vInfiniteScroll\n","import { defineDirective, isBrowser, supportsIntersectionObserver } from '@directix/core'\n\n/**\n * Intersect event handler\n */\nexport type IntersectHandler = (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\n/**\n * Intersect directive options\n */\nexport interface IntersectOptions {\n\t/** Callback when element intersects */\n\thandler?: IntersectHandler\n\t/** Callback when element enters viewport */\n\tonEnter?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\t/** Callback when element leaves viewport */\n\tonLeave?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\t/** Callback when element changes intersection */\n\tonChange?: (isIntersecting: boolean, entry: IntersectionObserverEntry) => void\n\t/** Root element for intersection @default null (viewport) */\n\troot?: Element | null\n\t/** Margin around the root @default '0px' */\n\trootMargin?: string\n\t/** Threshold(s) at which to trigger callback @default 0 */\n\tthreshold?: number | number[]\n\t/** Whether to disable @default false */\n\tdisabled?: boolean\n\t/** Whether to trigger only once @default false */\n\tonce?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type IntersectBinding = IntersectHandler | IntersectOptions\n\n/**\n * Element state storage\n */\ninterface IntersectState {\n\toptions: IntersectOptions\n\tobserver: IntersectionObserver | null\n\thasTriggeredOnce: boolean\n}\n\nconst STATE_KEY = '__intersect'\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: IntersectBinding | undefined): IntersectOptions {\n\tconst options: IntersectOptions = typeof binding === 'function' ? { handler: binding } : { ...binding }\n\n\t// Unref root if it's a ref object (for Vue Composition API)\n\tif (options.root !== null && typeof options.root === 'object' && 'value' in options.root) {\n\t\toptions.root = (options.root as { value: Element | null }).value\n\t}\n\n\treturn options\n}\n\n/**\n * Create observer callback\n */\nfunction createObserverCallback(\n\tel: HTMLElement,\n\tstate: IntersectState,\n\toptions: IntersectOptions,\n): (entries: IntersectionObserverEntry[]) => void {\n\treturn entries => {\n\t\tfor (const entry of entries) {\n\t\t\tif (options.once && state.hasTriggeredOnce) continue\n\n\t\t\tconst { isIntersecting } = entry\n\n\t\t\toptions.handler?.(entry, state.observer!)\n\t\t\toptions.onChange?.(isIntersecting, entry)\n\n\t\t\tif (isIntersecting) {\n\t\t\t\toptions.onEnter?.(entry, state.observer!)\n\t\t\t\tif (options.once) state.hasTriggeredOnce = true\n\t\t\t} else {\n\t\t\t\toptions.onLeave?.(entry, state.observer!)\n\t\t\t}\n\n\t\t\tel.dispatchEvent(new CustomEvent('intersect', { detail: { isIntersecting, entry } }))\n\t\t}\n\t}\n}\n\n/**\n * Create IntersectionObserver\n */\nfunction createObserver(\n\tel: HTMLElement,\n\tstate: IntersectState,\n\toptions: IntersectOptions,\n): IntersectionObserver {\n\treturn new IntersectionObserver(createObserverCallback(el, state, options), {\n\t\troot: options.root,\n\t\trootMargin: options.rootMargin,\n\t\tthreshold: options.threshold,\n\t})\n}\n\n/**\n * v-intersect directive\n *\n * @example\n * ```vue\n * <div v-intersect=\"handleIntersect\">Observe me</div>\n * <div v-intersect=\"{ onEnter: handleEnter, onLeave: handleLeave }\">Track visibility</div>\n * <div v-intersect=\"{ threshold: 0.5, once: true }\">Trigger once at 50%</div>\n * ```\n */\nexport const vIntersect = defineDirective<IntersectBinding, HTMLElement>({\n\tname: 'intersect',\n\tssr: false,\n\tdefaults: {\n\t\tdisabled: false,\n\t\tonce: false,\n\t\trootMargin: '0px',\n\t\tthreshold: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser() || !supportsIntersectionObserver()) {\n\t\t\tif (!supportsIntersectionObserver()) {\n\t\t\t\tconsole.warn('[Directix] v-intersect: IntersectionObserver not supported')\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tconst state: IntersectState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t\thasTriggeredOnce: false,\n\t\t}\n\n\t\tstate.observer = createObserver(el, state, options)\n\t\t;(el as any)[STATE_KEY] = state\n\t\tstate.observer.observe(el)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: IntersectState | undefined = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst observerOptionsChanged\n\t\t\t= newOptions.root !== state.options.root\n\t\t\t\t|| newOptions.rootMargin !== state.options.rootMargin\n\t\t\t\t|| newOptions.threshold !== state.options.threshold\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled !== state.options.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\tstate.observer?.disconnect()\n\t\t\t} else {\n\t\t\t\tstate.observer?.observe(el)\n\t\t\t}\n\t\t}\n\n\t\t// Recreate observer if options changed\n\t\tif (observerOptionsChanged) {\n\t\t\tstate.observer?.disconnect()\n\t\t\tstate.observer = createObserver(el, state, newOptions)\n\t\t\tstate.observer.observe(el)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: IntersectState | undefined = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tstate.observer?.disconnect()\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vIntersect\n","import { defineDirective, supportsIntersectionObserver } from '@directix/core'\n\n/**\n * Lazy loading state\n */\nexport type LazyState = 'pending' | 'loading' | 'loaded' | 'error'\n\n/**\n * Lazy directive options\n */\nexport interface LazyOptions {\n\t/**\n\t * Image source URL\n\t */\n\tsrc?: string\n\n\t/**\n\t * Placeholder image URL\n\t */\n\tplaceholder?: string\n\n\t/**\n\t * Error image URL (shown when loading fails)\n\t */\n\terror?: string\n\n\t/**\n\t * Preload distance in pixels\n\t * @default 0\n\t */\n\tpreload?: number\n\n\t/**\n\t * Callback when image loads successfully\n\t */\n\tonLoad?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when image fails to load\n\t */\n\tonError?: (el: HTMLElement, error: Error) => void\n\n\t/**\n\t * Number of retry attempts\n\t * @default 1\n\t */\n\tattempt?: number\n\n\t/**\n\t * Filter function, return false to skip loading\n\t */\n\tfilter?: (src: string) => boolean\n\n\t/**\n\t * Custom IntersectionObserver\n\t */\n\tobserver?: IntersectionObserver\n\n\t/**\n\t * Whether to disable lazy loading\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LazyBinding = string | LazyOptions\n\n/**\n * Element state storage\n */\ninterface LazyElementState {\n\toptions: LazyOptions\n\tattempt: number\n\tobserver?: IntersectionObserver\n}\n\n// Global observer instance\nlet globalObserver: IntersectionObserver | null = null\n\n/**\n * Get or create global IntersectionObserver\n */\nfunction getGlobalObserver(preload: number): IntersectionObserver {\n\tif (globalObserver) return globalObserver\n\n\tglobalObserver = new IntersectionObserver(\n\t\tentries => {\n\t\t\tentries.forEach(entry => {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tload(entry.target as HTMLElement)\n\t\t\t\t\tglobalObserver?.unobserve(entry.target)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\trootMargin: `${preload}px`,\n\t\t},\n\t)\n\n\treturn globalObserver\n}\n\n/**\n * Set image source on element\n */\nfunction setSrc(el: HTMLElement, src: string): void {\n\tif (el.tagName === 'IMG') {\n\t\t;(el as HTMLImageElement).src = src\n\t} else {\n\t\tel.style.backgroundImage = `url(\"${src}\")`\n\t}\n}\n\n/**\n * Set lazy state on element\n */\nfunction setLazyState(el: HTMLElement, state: LazyState): void {\n\tel.dataset.lazyState = state\n}\n\n/**\n * Get lazy state from element\n */\nfunction getLazyState(el: HTMLElement): LazyState {\n\treturn (el.dataset.lazyState as LazyState) || 'pending'\n}\n\n/**\n * Load image\n */\nfunction load(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state || !state.options.src) return\n\n\t// Filter check\n\tif (state.options.filter && !state.options.filter(state.options.src)) {\n\t\treturn\n\t}\n\n\tsetLazyState(el, 'loading')\n\tstate.attempt++\n\n\tel.classList.add('v-lazy--loading')\n\n\tconst img = new Image()\n\n\timg.onload = () => {\n\t\tsetSrc(el, state.options.src!)\n\t\tsetLazyState(el, 'loaded')\n\t\tel.classList.remove('v-lazy--loading')\n\t\tel.classList.add('v-lazy--loaded')\n\t\tstate.options.onLoad?.(el)\n\t}\n\n\timg.onerror = () => {\n\t\tel.classList.remove('v-lazy--loading')\n\n\t\t// Check if should retry\n\t\tif (state.attempt < (state.options.attempt || 1)) {\n\t\t\tsetTimeout(() => load(el), 1000 * state.attempt)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Show error image\n\t\tif (state.options.error) {\n\t\t\tsetSrc(el, state.options.error)\n\t\t}\n\n\t\tsetLazyState(el, 'error')\n\t\tel.classList.add('v-lazy--error')\n\t\tstate.options.onError?.(el, new Error('Failed to load image'))\n\t}\n\n\timg.src = state.options.src\n}\n\n/**\n * Observe element\n */\nfunction observe(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state) return\n\n\t// Check IntersectionObserver support\n\tif (!supportsIntersectionObserver()) {\n\t\t// Fallback: load directly\n\t\tload(el)\n\n\t\treturn\n\t}\n\n\t// Use custom observer or global observer\n\tif (state.options.observer) {\n\t\tstate.observer = state.options.observer\n\t\tstate.observer.observe(el)\n\t} else {\n\t\tconst observer = getGlobalObserver(state.options.preload || 0)\n\n\t\tstate.observer = observer\n\t\tobserver.observe(el)\n\t}\n}\n\n/**\n * Unobserve element\n */\nfunction unobserve(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state) return\n\n\tif (state.observer) {\n\t\tstate.observer.unobserve(el)\n\t} else if (globalObserver) {\n\t\tglobalObserver.unobserve(el)\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LazyBinding | undefined): LazyOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { src: binding }\n\t}\n\n\treturn binding || {}\n}\n\n/**\n * v-lazy directive\n *\n * @example\n * ```vue\n * <template>\n * <img v-lazy=\"imageUrl\" />\n * <img v-lazy=\"{ src: imageUrl, placeholder: 'placeholder.jpg' }\" />\n * <div v-lazy=\"backgroundImageUrl\"></div>\n * </template>\n * ```\n */\nexport const vLazy = defineDirective<LazyBinding, HTMLElement>({\n\tname: 'lazy',\n\tssr: false,\n\tdefaults: {\n\t\tpreload: 0,\n\t\tattempt: 1,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\tif (!options.src) {\n\t\t\tconsole.warn('[Directix] v-lazy: No source provided')\n\n\t\t\treturn\n\t\t}\n\n\t\t// Set initial state\n\t\tsetLazyState(el, 'pending')\n\n\t\t// Set placeholder\n\t\tif (options.placeholder) {\n\t\t\tsetSrc(el, options.placeholder)\n\t\t}\n\n\t\t// Add class\n\t\tel.classList.add('v-lazy')\n\n\t\t// Store state\n\t\tconst state: LazyElementState = {\n\t\t\toptions,\n\t\t\tattempt: 0,\n\t\t}\n\n\t\t;(el as any).__lazy = state\n\n\t\t// Start observing\n\t\tobserve(el)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LazyElementState = (el as any).__lazy\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (newOptions.disabled) {\n\t\t\tunobserve(el)\n\n\t\t\treturn\n\t\t}\n\n\t\tif (newOptions.src !== state.options.src) {\n\t\t\tstate.options = newOptions\n\t\t\tstate.attempt = 0\n\n\t\t\t// If already loaded, reload\n\t\t\tif (getLazyState(el) !== 'pending') {\n\t\t\t\tsetLazyState(el, 'pending')\n\t\t\t\tel.classList.remove('v-lazy--loaded', 'v-lazy--error')\n\n\t\t\t\tif (newOptions.placeholder) {\n\t\t\t\t\tsetSrc(el, newOptions.placeholder)\n\t\t\t\t}\n\n\t\t\t\tobserve(el)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tunobserve(el)\n\t\tdelete (el as any).__lazy\n\t},\n})\n\nexport default vLazy\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Loading directive options\n */\nexport interface LoadingOptions {\n\t/**\n\t * Loading state\n\t * @default true\n\t */\n\tvalue?: boolean\n\n\t/**\n\t * Loading text to display\n\t */\n\ttext?: string\n\n\t/**\n\t * CSS class for loading overlay\n\t * @default 'v-loading'\n\t */\n\tloadingClass?: string\n\n\t/**\n\t * CSS class for loading spinner\n\t * @default 'v-loading__spinner'\n\t */\n\tspinnerClass?: string\n\n\t/**\n\t * CSS class for loading text\n\t * @default 'v-loading__text'\n\t */\n\ttextClass?: string\n\n\t/**\n\t * Custom spinner HTML\n\t */\n\tspinner?: string\n\n\t/**\n\t * Background color\n\t * @default 'rgba(255, 255, 255, 0.9)'\n\t */\n\tbackground?: string\n\n\t/**\n\t * Whether to lock scroll while loading\n\t * @default false\n\t */\n\tlock?: boolean\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LoadingBinding = boolean | LoadingOptions\n\n/**\n * Element state storage\n */\ninterface LoadingState {\n\toptions: LoadingOptions\n\tloadingOverlay: HTMLDivElement | null\n\toriginalPosition: string\n\toriginalOverflow: string\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LoadingBinding | undefined): LoadingOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { value: binding }\n\t}\n\n\treturn {\n\t\tvalue: true,\n\t\tloadingClass: 'v-loading',\n\t\tspinnerClass: 'v-loading__spinner',\n\t\ttextClass: 'v-loading__text',\n\t\tbackground: 'rgba(255, 255, 255, 0.9)',\n\t\tlock: false,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Default spinner HTML\n */\nconst DEFAULT_SPINNER = `\n<svg class=\"v-loading__circular\" viewBox=\"25 25 50 50\">\n <circle class=\"v-loading__path\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-width=\"2\" stroke-miterlimit=\"10\"/>\n</svg>\n`\n\n/**\n * Create loading overlay element\n */\nfunction createLoadingOverlay(options: LoadingOptions): HTMLDivElement {\n\tconst overlay = document.createElement('div')\n\n\toverlay.className = options.loadingClass || 'v-loading'\n\toverlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1000;\n background: ${options.background || 'rgba(255, 255, 255, 0.9)'};\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `\n\n\t// Add spinner\n\tconst spinnerHtml = options.spinner || DEFAULT_SPINNER\n\tconst spinnerContainer = document.createElement('div')\n\n\tspinnerContainer.className = options.spinnerClass || 'v-loading__spinner'\n\tspinnerContainer.innerHTML = spinnerHtml\n\toverlay.appendChild(spinnerContainer)\n\n\t// Add text\n\tif (options.text) {\n\t\tconst textEl = document.createElement('div')\n\n\t\ttextEl.className = options.textClass || 'v-loading__text'\n\t\ttextEl.textContent = options.text\n\t\toverlay.appendChild(textEl)\n\t}\n\n\treturn overlay\n}\n\n/**\n * v-loading directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-loading=\"isLoading\">Content</div>\n * <div v-loading=\"{ value: isLoading, text: 'Loading...' }\">Content</div>\n * <div v-loading=\"{ value: isLoading, lock: true }\">Locked scroll while loading</div>\n * </template>\n * ```\n */\nexport const vLoading = defineDirective<LoadingBinding, HTMLElement>({\n\tname: 'loading',\n\tssr: true, // SSR safe - will skip DOM manipulation on server\n\tdefaults: {\n\t\tvalue: true,\n\t\tloadingClass: 'v-loading',\n\t\tspinnerClass: 'v-loading__spinner',\n\t\ttextClass: 'v-loading__text',\n\t\tbackground: 'rgba(255, 255, 255, 0.9)',\n\t\tlock: false,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Ensure element has relative positioning\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tconst originalPosition = el.style.position\n\t\tconst originalOverflow = el.style.overflow\n\n\t\tconst state: LoadingState = {\n\t\t\toptions,\n\t\t\tloadingOverlay: null,\n\t\t\toriginalPosition,\n\t\t\toriginalOverflow,\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__loading = state\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\t// Show loading if value is true\n\t\tif (options.value) {\n\t\t\tshowLoading(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LoadingState = (el as any).__loading\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (newOptions.disabled) {\n\t\t\thideLoading(el, state)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Handle loading state change\n\t\tif (newOptions.value && !state.options.value) {\n\t\t\tshowLoading(el, state)\n\t\t} else if (!newOptions.value && state.options.value) {\n\t\t\thideLoading(el, state)\n\t\t}\n\n\t\t// Update text if changed\n\t\tif (state.loadingOverlay && newOptions.text !== state.options.text) {\n\t\t\tconst textEl = state.loadingOverlay.querySelector(`.${state.options.textClass}`)\n\n\t\t\tif (textEl) {\n\t\t\t\ttextEl.textContent = newOptions.text || ''\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LoadingState = (el as any).__loading\n\n\t\tif (!state) return\n\n\t\thideLoading(el, state)\n\n\t\t// Restore original styles\n\t\tel.style.position = state.originalPosition\n\t\tel.style.overflow = state.originalOverflow\n\n\t\tdelete (el as any).__loading\n\t},\n})\n\n/**\n * Show loading overlay\n */\nfunction showLoading(el: HTMLElement, state: LoadingState): void {\n\tif (state.loadingOverlay) return\n\n\t// Create and append overlay\n\tstate.loadingOverlay = createLoadingOverlay(state.options)\n\tel.appendChild(state.loadingOverlay)\n\n\t// Lock scroll if needed\n\tif (state.options.lock) {\n\t\tel.style.overflow = 'hidden'\n\t}\n\n\t// Add class\n\tel.classList.add('v-loading--active')\n}\n\n/**\n * Hide loading overlay\n */\nfunction hideLoading(el: HTMLElement, state: LoadingState): void {\n\tif (!state.loadingOverlay) return\n\n\t// Remove overlay\n\tstate.loadingOverlay.remove()\n\tstate.loadingOverlay = null\n\n\t// Restore scroll\n\tif (state.options.lock) {\n\t\tel.style.overflow = state.originalOverflow\n\t}\n\n\t// Remove class\n\tel.classList.remove('v-loading--active')\n}\n\nexport default vLoading\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getEventPosition, off, on } from '@directix/shared'\n\n/**\n * Long press handler\n */\nexport type LongPressHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Long press directive options\n */\nexport interface LongPressOptions {\n\t/**\n\t * Callback when long press is triggered\n\t * @required\n\t */\n\thandler: LongPressHandler\n\n\t/**\n\t * Duration in milliseconds to trigger long press\n\t * @default 500\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Maximum movement distance before canceling\n\t * @default 10\n\t */\n\tdistance?: number\n\n\t/**\n\t * Callback when long press starts (on mousedown/touchstart)\n\t */\n\tonStart?: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Callback when long press is canceled\n\t */\n\tonCancel?: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Callback on each tick during long press\n\t */\n\tonTick?: (remaining: number) => void\n\n\t/**\n\t * Interval for onTick callback in milliseconds\n\t * @default 100\n\t */\n\ttickInterval?: number\n\n\t/**\n\t * Whether to prevent default behavior\n\t * @default true\n\t */\n\tprevent?: boolean\n\n\t/**\n\t * Whether to stop propagation\n\t * @default false\n\t */\n\tstop?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LongPressBinding = LongPressHandler | LongPressOptions\n\n/**\n * Element state storage\n */\ninterface LongPressState {\n\toptions: LongPressOptions\n\ttimerId: ReturnType<typeof setTimeout> | null\n\ttickTimerId: ReturnType<typeof setInterval> | null\n\tstartTime: number\n\tstartPos: { x: number, y: number }\n\tstartHandler: (e: Event) => void\n\tendHandler: (e: Event) => void\n\tmoveHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LongPressBinding | undefined): LongPressOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, duration: 500, distance: 10 }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-long-press: handler is required')\n\t}\n\n\treturn {\n\t\tduration: 500,\n\t\tdistance: 10,\n\t\tdisabled: false,\n\t\tprevent: true,\n\t\tstop: false,\n\t\ttickInterval: 100,\n\t\t...binding,\n\t}\n}\n\n/**\n * Calculate distance between two points\n */\nfunction getDistance(p1: { x: number, y: number }, p2: { x: number, y: number }): number {\n\treturn Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2)\n}\n\n/**\n * v-long-press directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-long-press=\"handleLongPress\">Long Press Me</button>\n * <button v-long-press=\"{ handler: handleLongPress, duration: 1000 }\">1 Second Press</button>\n * </template>\n * ```\n */\nexport const vLongPress = defineDirective<LongPressBinding, HTMLElement>({\n\tname: 'long-press',\n\tssr: false,\n\tdefaults: {\n\t\tduration: 500,\n\t\tdistance: 10,\n\t\tdisabled: false,\n\t\tprevent: true,\n\t\tstop: false,\n\t\ttickInterval: 100,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst state: LongPressState = {\n\t\t\toptions,\n\t\t\ttimerId: null,\n\t\t\ttickTimerId: null,\n\t\t\tstartTime: 0,\n\t\t\tstartPos: { x: 0, y: 0 },\n\t\t\tstartHandler: () => {},\n\t\t\tendHandler: () => {},\n\t\t\tmoveHandler: () => {},\n\t\t}\n\n\t\t// Start handler\n\t\tstate.startHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\n\t\t\t// Prevent context menu on long press\n\t\t\tif (options.prevent) {\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\n\t\t\tif (options.stop) {\n\t\t\t\tevent.stopPropagation()\n\t\t\t}\n\n\t\t\t// Clear any existing timer\n\t\t\tif (state.timerId) {\n\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\tstate.timerId = null\n\t\t\t}\n\n\t\t\tif (state.tickTimerId) {\n\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\tstate.tickTimerId = null\n\t\t\t}\n\n\t\t\t// Store start position\n\t\t\tconst pos = getEventPosition(event)\n\n\t\t\tstate.startPos = { x: pos.x, y: pos.y }\n\t\t\tstate.startTime = Date.now()\n\n\t\t\t// Trigger start callback\n\t\t\toptions.onStart?.(event)\n\n\t\t\t// Start tick timer\n\t\t\tif (options.onTick) {\n\t\t\t\tlet remaining = options.duration!\n\n\t\t\t\tstate.tickTimerId = setInterval(() => {\n\t\t\t\t\tremaining -= options.tickInterval!\n\t\t\t\t\toptions.onTick?.(Math.max(0, remaining))\n\t\t\t\t}, options.tickInterval)\n\t\t\t}\n\n\t\t\t// Start long press timer\n\t\t\tstate.timerId = setTimeout(() => {\n\t\t\t\tif (state.tickTimerId) {\n\t\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\t\tstate.tickTimerId = null\n\t\t\t\t}\n\t\t\t\toptions.handler(event)\n\t\t\t}, options.duration)\n\t\t}\n\n\t\t// End handler\n\t\tstate.endHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\n\t\t\tif (state.timerId) {\n\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\tstate.timerId = null\n\t\t\t}\n\n\t\t\tif (state.tickTimerId) {\n\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\tstate.tickTimerId = null\n\t\t\t}\n\n\t\t\t// Trigger cancel callback if was in progress\n\t\t\tif (state.startTime > 0) {\n\t\t\t\toptions.onCancel?.(event)\n\t\t\t}\n\n\t\t\tstate.startTime = 0\n\t\t}\n\n\t\t// Move handler - cancel if moved too far\n\t\tstate.moveHandler = (e: Event) => {\n\t\t\tif (!state.timerId) return\n\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\t\t\tconst pos = getEventPosition(event)\n\t\t\tconst distance = getDistance(state.startPos, { x: pos.x, y: pos.y })\n\n\t\t\tif (distance > (options.distance || 10)) {\n\t\t\t\tif (state.timerId) {\n\t\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\t\tstate.timerId = null\n\t\t\t\t}\n\n\t\t\t\tif (state.tickTimerId) {\n\t\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\t\tstate.tickTimerId = null\n\t\t\t\t}\n\n\t\t\t\toptions.onCancel?.(event)\n\t\t\t\tstate.startTime = 0\n\t\t\t}\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__longPress = state\n\n\t\t// Bind events - mouse\n\t\ton(el, 'mousedown', state.startHandler)\n\t\ton(el, 'mouseup', state.endHandler)\n\t\ton(el, 'mouseleave', state.endHandler)\n\t\ton(el, 'mousemove', state.moveHandler)\n\n\t\t// Bind events - touch\n\t\ton(el, 'touchstart', state.startHandler, { passive: !options.prevent })\n\t\ton(el, 'touchend', state.endHandler)\n\t\ton(el, 'touchcancel', state.endHandler)\n\t\ton(el, 'touchmove', state.moveHandler, { passive: true })\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LongPressState = (el as any).__longPress\n\n\t\tif (!state) {\n\t\t\t// Re-initialize if not exists\n\t\t\tconst options = normalizeOptions(binding.value)\n\n\t\t\tif (!options.disabled) {\n\t\t\t\t// Re-mount by clearing and re-setting\n\t\t\t\t;(el as any).__longPress = null\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LongPressState = (el as any).__longPress\n\n\t\tif (!state) return\n\n\t\t// Clear timers\n\t\tif (state.timerId) {\n\t\t\tclearTimeout(state.timerId)\n\t\t}\n\n\t\tif (state.tickTimerId) {\n\t\t\tclearInterval(state.tickTimerId)\n\t\t}\n\n\t\t// Unbind events - mouse\n\t\toff(el, 'mousedown', state.startHandler)\n\t\toff(el, 'mouseup', state.endHandler)\n\t\toff(el, 'mouseleave', state.endHandler)\n\t\toff(el, 'mousemove', state.moveHandler)\n\n\t\t// Unbind events - touch\n\t\toff(el, 'touchstart', state.startHandler)\n\t\toff(el, 'touchend', state.endHandler)\n\t\toff(el, 'touchcancel', state.endHandler)\n\t\toff(el, 'touchmove', state.moveHandler)\n\n\t\tdelete (el as any).__longPress\n\t},\n})\n\nexport default vLongPress\n","import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Lowercase directive options\n */\nexport interface LowercaseOptions {\n\t/**\n\t * Transform only the first character\n\t * @default false\n\t */\n\tfirst?: boolean\n\n\t/**\n\t * Transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LowercaseBinding = boolean | LowercaseOptions\n\n/**\n * Transform text to lowercase\n */\nfunction transformText(text: string, options: LowercaseOptions): string {\n\tif (!text) return text\n\n\tif (options.first) {\n\t\treturn text.charAt(0).toLowerCase() + text.slice(1)\n\t}\n\n\treturn text.toLowerCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LowercaseBinding | undefined): LowercaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { first: false, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { first: false, onInput: false }\n\t}\n\n\treturn {\n\t\tfirst: binding.first ?? false,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-lowercase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Transform all characters to lowercase -->\n * <input v-lowercase v-model=\"text\" />\n *\n * <!-- Transform only first character -->\n * <span v-lowercase=\"{ first: true }\">{{ text }}</span>\n * </template>\n * ```\n */\nexport const vLowercase = defineDirective<LowercaseBinding, HTMLElement>({\n\tname: 'lowercase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => transformText(text, options))\n\n\t\t\t;(el as any).__lowercaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = transformText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__lowercaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__lowercaseCleanup\n\t},\n})\n\nexport default vLowercase\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\nconst STATE_KEY = '__mask' as const\n\n/**\n * Mask directive options\n */\nexport interface MaskOptions {\n\t/** Mask pattern: # digit, A letter, N alphanumeric, X any, others as literals */\n\tmask: string\n\t/** Placeholder character @default '_' */\n\tplaceholder?: string\n\t/** Show mask placeholder on focus @default true */\n\tshowPlaceholder?: boolean\n\t/** Show mask on blur @default false */\n\tshowMaskOnBlur?: boolean\n\t/** Clear incomplete on blur @default false */\n\tclearIncomplete?: boolean\n\t/** Disable @default false */\n\tdisabled?: boolean\n\t/** Callback when value changes */\n\tonChange?: (value: string, rawValue: string) => void\n\t/** Callback when mask is complete */\n\tonComplete?: (value: string) => void\n}\n\nexport type MaskBinding = string | MaskOptions\n\ninterface MaskToken {\n\tpattern: RegExp\n\tplaceholder: string\n\tisLiteral: boolean\n}\n\ninterface MaskState {\n\toptions: MaskOptions\n\ttokens: MaskToken[]\n\tplaceholder: string\n\tinputHandler: (e: Event) => void\n\tfocusHandler: () => void\n\tblurHandler: () => void\n}\n\nconst TOKEN_PATTERNS: Record<string, RegExp> = {\n\t'#': /\\d/,\n\tA: /[A-Za-z]/,\n\tN: /[A-Za-z0-9]/,\n\tX: /./,\n}\n\nfunction parseMask(mask: string, placeholder: string): MaskToken[] {\n\treturn [...mask].map(char => {\n\t\tconst pattern = TOKEN_PATTERNS[char]\n\n\t\treturn pattern ? { pattern, placeholder, isLiteral: false } : { pattern: new RegExp(`\\\\${char}`), placeholder: char, isLiteral: true }\n\t})\n}\n\nfunction normalizeOptions(binding: MaskBinding | undefined): MaskOptions {\n\tif (typeof binding === 'string') return { mask: binding, placeholder: '_', showPlaceholder: true }\n\tif (!binding?.mask) throw new Error('[Directix] v-mask: mask is required')\n\n\treturn { placeholder: '_', showPlaceholder: true, showMaskOnBlur: false, clearIncomplete: false, disabled: false, ...binding }\n}\n\nfunction isInput(el: HTMLElement): el is HTMLInputElement | HTMLTextAreaElement {\n\treturn el.tagName === 'INPUT' || el.tagName === 'TEXTAREA'\n}\n\n/**\n * Format value with mask\n */\nfunction formatValue(value: string, tokens: MaskToken[], placeholder: string, showPlaceholder: boolean): string {\n\tlet result = '',\n\t\tvalueIndex = 0\n\n\tfor (const token of tokens) {\n\t\tif (valueIndex >= value.length) {\n\t\t\tresult += token.isLiteral ? token.placeholder : (showPlaceholder ? placeholder : '')\n\t\t\tcontinue\n\t\t}\n\n\t\tconst inputChar = value[valueIndex]\n\n\t\tif (token.isLiteral) {\n\t\t\tif (inputChar === token.placeholder) valueIndex++\n\t\t\tresult += token.placeholder\n\t\t} else if (token.pattern.test(inputChar)) {\n\t\t\tresult += inputChar\n\t\t\tvalueIndex++\n\t\t} else if (inputChar === placeholder) {\n\t\t\tresult += showPlaceholder ? placeholder : ''\n\t\t\tvalueIndex++\n\t\t} else {\n\t\t\tvalueIndex++\n\t\t\t// Re-check this token with next input char - need to decrement in loop\n\t\t}\n\t}\n\n\treturn result\n}\n\n/**\n * Get raw value (without mask literals)\n */\nfunction getRawValue(value: string, tokens: MaskToken[], placeholder: string): string {\n\tlet raw = ''\n\n\tfor (let i = 0; i < value.length && i < tokens.length; i++) {\n\t\tif (!tokens[i].isLiteral && value[i] !== placeholder) {\n\t\t\traw += value[i]\n\t\t}\n\t}\n\n\treturn raw\n}\n\n/**\n * Check if mask is complete\n */\nfunction isComplete(value: string, tokens: MaskToken[], placeholder: string): boolean {\n\tfor (let i = 0; i < tokens.length; i++) {\n\t\tif (!tokens[i].isLiteral && (i >= value.length || value[i] === placeholder)) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n/**\n * Calculate cursor position, skipping literals\n */\nfunction getCursorPos(tokens: MaskToken[], rawCursorPos: number): number {\n\tlet pos = rawCursorPos\n\n\twhile (pos < tokens.length && tokens[pos].isLiteral) {\n\t\tpos++\n\t}\n\n\treturn Math.min(pos, tokens.length)\n}\n\n/**\n * v-mask directive\n *\n * @example\n * ```vue\n * <input v-mask=\"'###-##-####'\" placeholder=\"SSN\" />\n * <input v-mask=\"'(###) ###-####'\" placeholder=\"Phone\" />\n * <input v-mask=\"{ mask: '##/##/####' }\" placeholder=\"Date\" />\n * ```\n */\nexport const vMask = defineDirective<MaskBinding, HTMLInputElement>({\n\tname: 'mask',\n\tssr: false,\n\tdefaults: { placeholder: '_', showPlaceholder: true, showMaskOnBlur: false, clearIncomplete: false, disabled: false },\n\n\tmounted(el, binding) {\n\t\tif (!isInput(el)) {\n\t\t\tconsole.warn('[Directix] v-mask: directive must be used on input or textarea elements')\n\n\t\t\treturn\n\t\t}\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst placeholder = options.placeholder || '_'\n\t\tconst tokens = parseMask(options.mask, placeholder)\n\n\t\tconst inputHandler = (e: Event): void => {\n\t\t\tconst target = e.target as HTMLInputElement\n\t\t\tconst rawValue = target.value\n\t\t\tconst cursorPos = target.selectionStart || 0\n\n\t\t\tconst formatted = formatValue(rawValue, tokens, placeholder, options.showPlaceholder ?? true)\n\n\t\t\tif (formatted !== rawValue) {\n\t\t\t\ttarget.value = formatted\n\t\t\t\ttarget.setSelectionRange(getCursorPos(tokens, cursorPos), getCursorPos(tokens, cursorPos))\n\t\t\t\ttarget.dispatchEvent(new Event('input', { bubbles: true }))\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\toptions.onChange?.(formatted, getRawValue(formatted, tokens, placeholder))\n\t\t\tif (isComplete(formatted, tokens, placeholder)) {\n\t\t\t\toptions.onComplete?.(formatted)\n\t\t\t}\n\t\t}\n\n\t\tconst focusHandler = (): void => {\n\t\t\tif (!el.value && options.showPlaceholder) {\n\t\t\t\tel.value = formatValue('', tokens, placeholder, true)\n\t\t\t}\n\t\t}\n\n\t\tconst blurHandler = (): void => {\n\t\t\tif (!options.showMaskOnBlur && !isComplete(el.value, tokens, placeholder) && options.clearIncomplete) {\n\t\t\t\tel.value = ''\n\t\t\t}\n\t\t}\n\n\t\ton(el, 'input', inputHandler)\n\t\ton(el, 'focus', focusHandler)\n\t\ton(el, 'blur', blurHandler)\n\n\t\t;(el as any)[STATE_KEY] = { options, tokens, placeholder, inputHandler, focusHandler, blurHandler }\n\n\t\tif (el.value) {\n\t\t\tel.value = formatValue(el.value, tokens, placeholder, options.showPlaceholder ?? true)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: MaskState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t\tstate.tokens = parseMask(state.options.mask, state.placeholder)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MaskState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\toff(el, 'input', state.inputHandler)\n\t\toff(el, 'focus', state.focusHandler)\n\t\toff(el, 'blur', state.blurHandler)\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vMask\n","/**\n * Shared utilities for number and money formatting directives\n */\n\n/**\n * Base options shared by number and money formatting\n */\nexport interface NumberFormatOptions {\n\t/** Number of decimal places */\n\tprecision?: number\n\t/** Thousands separator */\n\tseparator?: string\n\t/** Decimal separator */\n\tdecimal?: string\n\t/** Whether to allow negative numbers @default true */\n\tallowNegative?: boolean\n\t/** Minimum value */\n\tmin?: number\n\t/** Maximum value */\n\tmax?: number\n}\n\n/**\n * Format number to string with thousands separator\n */\nexport function formatNumber(value: number, options: NumberFormatOptions): string {\n\tconst { precision = 0, separator = ',', decimal = '.', prefix = '', suffix = '' } = options as any\n\n\tconst fixed = value.toFixed(precision)\n\tconst [intPart, decPart] = fixed.split('.')\n\n\t// Add thousands separator to integer part\n\tconst formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n\n\tlet result = formattedInt\n\n\tif (precision > 0 && decPart) {\n\t\tresult += decimal + decPart\n\t}\n\n\treturn prefix + result + suffix\n}\n\n/**\n * Parse string to number, removing non-numeric characters\n */\nexport function parseToNumber(value: string, decimal: string): number | null {\n\tconst cleaned = value.replace(/[^\\d.-]/g, '').replace(decimal, '.')\n\tconst num = Number.parseFloat(cleaned)\n\n\treturn isNaN(num) ? null : num\n}\n\n/**\n * Clamp value within min/max bounds\n */\nexport function clampValue(value: number, options: NumberFormatOptions): number {\n\tlet result = value\n\n\t// allowNegative defaults to true if not specified\n\tconst allowNegative = options.allowNegative ?? true\n\n\tif (!allowNegative && result < 0) {\n\t\tresult = Math.abs(result)\n\t}\n\tif (options.min !== undefined) result = Math.max(options.min, result)\n\tif (options.max !== undefined) result = Math.min(options.max, result)\n\n\treturn result\n}\n\n/**\n * Calculate cursor position after formatting\n * Preserves cursor position relative to digit count\n */\nexport function calculateCursorPosition(\n\trawValue: string,\n\tformatted: string,\n\tcursorPos: number,\n\tstartOffset: number = 0,\n): number {\n\t// Count digits before cursor in old value\n\tlet digitsBeforeCursor = 0,\n\t\t// Find position after same number of digits in new value\n\t\tdigitCount = 0\n\n\tfor (let i = 0; i < cursorPos && i < rawValue.length; i++) {\n\t\tif (/\\d/.test(rawValue[i])) {\n\t\t\tdigitsBeforeCursor++\n\t\t}\n\t}\n\n\tfor (let i = startOffset; i < formatted.length; i++) {\n\t\tif (/\\d/.test(formatted[i])) {\n\t\t\tdigitCount++\n\t\t}\n\t\tif (digitCount >= digitsBeforeCursor) {\n\t\t\treturn i + 1\n\t\t}\n\t}\n\n\t// Default to end of formatted string\n\treturn formatted.length\n}\n\n/**\n * Setup input element with live formatting\n */\nexport function setupNumberInput(\n\tel: HTMLInputElement | HTMLTextAreaElement,\n\toptions: NumberFormatOptions & { prefix?: string, suffix?: string },\n\tformatFn: (value: number, options: any) => string,\n): () => void {\n\tconst { decimal = '.', prefix = '' } = options\n\tlet isFormatting = false\n\n\tconst onInput = (): void => {\n\t\tif (isFormatting) return\n\n\t\tconst rawValue = el.value\n\t\tconst cursorPos = el.selectionStart || 0\n\n\t\t// Handle empty or just minus\n\t\tif (!rawValue || rawValue === '-') {\n\t\t\treturn\n\t\t}\n\n\t\t// Parse the number\n\t\tconst num = parseToNumber(rawValue, decimal)\n\n\t\tif (num === null) {\n\t\t\tisFormatting = true\n\t\t\tel.value = ''\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\n\t\t\treturn\n\t\t}\n\n\t\t// Format the number\n\t\tconst clamped = clampValue(num, options)\n\t\tconst formatted = formatFn(clamped, options)\n\n\t\tif (formatted !== rawValue) {\n\t\t\tisFormatting = true\n\n\t\t\t// Calculate new cursor position (start after prefix)\n\t\t\tconst startOffset = prefix.length\n\t\t\tconst newCursorPos = calculateCursorPosition(rawValue, formatted, cursorPos, startOffset)\n\n\t\t\tel.value = formatted\n\t\t\tel.setSelectionRange(newCursorPos, newCursorPos)\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\tconst onBlur = (): void => {\n\t\tif (!el.value || el.value === '-') return\n\n\t\tconst num = parseToNumber(el.value, decimal)\n\n\t\tif (num !== null) {\n\t\t\tconst clamped = clampValue(num, options)\n\t\t\tconst formatted = formatFn(clamped, options)\n\n\t\t\tisFormatting = true\n\t\t\tel.value = formatted\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\tel.addEventListener('input', onInput)\n\tel.addEventListener('blur', onBlur)\n\n\t// Initial format\n\tif (el.value) {\n\t\tconst num = parseToNumber(el.value, decimal)\n\n\t\tif (num !== null) {\n\t\t\tconst formatted = formatFn(clampValue(num, options), options)\n\n\t\t\tisFormatting = true\n\t\t\tel.value = formatted\n\t\t\t// Trigger input to sync with v-model\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\treturn () => {\n\t\tel.removeEventListener('input', onInput)\n\t\tel.removeEventListener('blur', onBlur)\n\t}\n}\n","import { defineDirective } from '@directix/core'\nimport { clampValue, type NumberFormatOptions, parseToNumber, setupNumberInput } from '../utils/number'\n\n/**\n * Money directive options\n */\nexport interface MoneyOptions extends NumberFormatOptions {\n\t/** Currency symbol @default '$' */\n\tsymbol?: string\n\t/** Symbol position @default 'before' */\n\tsymbolPosition?: 'before' | 'after'\n}\n\nexport type MoneyBinding = string | MoneyOptions\n\ninterface MoneyState {\n\toptions: MoneyOptions\n\tcleanup: () => void\n}\n\n/**\n * Format number to money string\n */\nfunction formatMoney(value: number, options: MoneyOptions): string {\n\tconst { precision = 2, separator = ',', decimal = '.', symbol = '$', symbolPosition = 'before' } = options\n\n\tconst fixed = value.toFixed(precision)\n\tconst [intPart, decPart] = fixed.split('.')\n\n\t// Add thousands separator\n\tconst formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n\n\tlet result = formattedInt\n\n\tif (precision > 0 && decPart) {\n\t\tresult += decimal + decPart\n\t}\n\n\treturn symbolPosition === 'before' ? symbol + result : result + symbol\n}\n\nexport const vMoney = defineDirective<MoneyBinding, HTMLElement>({\n\tname: 'money',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options: MoneyOptions = typeof binding.value === 'string' ? { symbol: binding.value } : (binding.value ?? {})\n\n\t\t// Set defaults for money\n\t\toptions.precision = options.precision ?? 2\n\n\t\tif (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {\n\t\t\tconst { symbol = '$', symbolPosition = 'before' } = options\n\t\t\t// For money, prefix is the symbol when positioned before\n\t\t\tconst prefix = symbolPosition === 'before' ? symbol : ''\n\t\t\tconst cleanup = setupNumberInput(el as HTMLInputElement, { ...options, prefix }, formatMoney)\n\n\t\t\t;(el as any).__money = { options, cleanup }\n\n\t\t\t// Format initial value after DOM is ready\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst inputEl = el as HTMLInputElement\n\n\t\t\t\tif (inputEl.value) {\n\t\t\t\t\tconst num = parseToNumber(inputEl.value, options.decimal || '.')\n\n\t\t\t\t\tif (num !== null) {\n\t\t\t\t\t\tconst formatted = formatMoney(clampValue(num, options), options)\n\n\t\t\t\t\t\tif (formatted !== inputEl.value) {\n\t\t\t\t\t\t\tinputEl.value = formatted\n\t\t\t\t\t\t\tinputEl.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\t// For non-input elements, format the text content\n\t\t\tlet value: number | null = null\n\n\t\t\tif (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t} else {\n\t\t\t\t// Try to parse from element's text content\n\t\t\t\tconst textContent = el.textContent?.trim()\n\n\t\t\t\tif (textContent) {\n\t\t\t\t\tvalue = parseToNumber(textContent, options.decimal || '.')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatMoney(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options: MoneyOptions = typeof binding.value === 'string' ? { symbol: binding.value } : (binding.value ?? {})\n\n\t\t// Set defaults for money\n\t\toptions.precision = options.precision ?? 2\n\n\t\tconst state: MoneyState | undefined = (el as any).__money\n\n\t\tif (state) {\n\t\t\tstate.options = options\n\t\t} else if (!(el.tagName === 'INPUT' || el.tagName === 'TEXTAREA')) {\n\t\t\t// Only format non-input elements on update\n\t\t\tlet value: number | null = null\n\n\t\t\tif (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatMoney(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MoneyState | undefined = (el as any).__money\n\n\t\tstate?.cleanup()\n\t\tdelete (el as any).__money\n\t},\n})\n\nexport default vMoney\n","import { defineDirective, isBrowser, supportsMutationObserver } from '@directix/core'\n\n/**\n * Mutation change handler\n */\nexport type MutationHandler = (mutations: MutationRecord[], observer: MutationObserver) => void\n\n/**\n * Mutation directive options\n */\nexport interface MutationOptions {\n\t/**\n\t * Callback when mutations occur\n\t * @required\n\t */\n\thandler: MutationHandler\n\n\t/**\n\t * Whether to observe attribute changes\n\t * @default false\n\t */\n\tattributes?: boolean\n\n\t/**\n\t * Specific attributes to observe\n\t */\n\tattributeFilter?: string[]\n\n\t/**\n\t * Whether to observe child node additions/removals\n\t * @default true\n\t */\n\tchildList?: boolean\n\n\t/**\n\t * Whether to observe all descendants, not just direct children\n\t * @default false\n\t */\n\tsubtree?: boolean\n\n\t/**\n\t * Whether to observe character data changes\n\t * @default false\n\t */\n\tcharacterData?: boolean\n\n\t/**\n\t * Whether to record old attribute values\n\t * @default false\n\t */\n\tattributeOldValue?: boolean\n\n\t/**\n\t * Whether to record old character data\n\t * @default false\n\t */\n\tcharacterDataOldValue?: boolean\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type MutationBinding = MutationHandler | MutationOptions\n\n/**\n * Element state storage\n */\ninterface MutationState {\n\toptions: MutationOptions\n\tobserver: MutationObserver | null\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: MutationBinding | undefined): MutationOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, childList: true }\n\t}\n\n\tif (!binding || !binding.handler) {\n\t\tthrow new Error('[Directix] v-mutation: handler is required')\n\t}\n\n\treturn {\n\t\tattributes: false,\n\t\tchildList: true,\n\t\tsubtree: false,\n\t\tcharacterData: false,\n\t\tattributeOldValue: false,\n\t\tcharacterDataOldValue: false,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-mutation directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-mutation=\"handleMutation\">Observe my changes</div>\n * <div v-mutation=\"{ handler: handleMutation, attributes: true, subtree: true }\">\n * Observe attributes and subtree\n * </div>\n * </template>\n *\n * <script setup>\n * function handleMutation(mutations: MutationRecord[], observer: MutationObserver) {\n * mutations.forEach(mutation => {\n * console.log('Type:', mutation.type)\n * console.log('Target:', mutation.target)\n * })\n * }\n * </script>\n * ```\n */\nexport const vMutation = defineDirective<MutationBinding, HTMLElement>({\n\tname: 'mutation',\n\tssr: false,\n\tdefaults: {\n\t\tattributes: false,\n\t\tchildList: true,\n\t\tsubtree: false,\n\t\tcharacterData: false,\n\t\tattributeOldValue: false,\n\t\tcharacterDataOldValue: false,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Check MutationObserver support\n\t\tif (!supportsMutationObserver()) {\n\t\t\tconsole.warn('[Directix] v-mutation: MutationObserver not supported')\n\n\t\t\treturn\n\t\t}\n\n\t\tconst state: MutationState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t}\n\n\t\t// Create observer\n\t\tstate.observer = new MutationObserver((mutations, observer) => {\n\t\t\toptions.handler(mutations, observer)\n\t\t})\n\n\t\t// Start observing\n\t\tstate.observer.observe(el, {\n\t\t\tattributes: options.attributes,\n\t\t\tattributeFilter: options.attributeFilter,\n\t\t\tchildList: options.childList,\n\t\t\tsubtree: options.subtree,\n\t\t\tcharacterData: options.characterData,\n\t\t\tattributeOldValue: options.attributeOldValue,\n\t\t\tcharacterDataOldValue: options.characterDataOldValue,\n\t\t})\n\n\t\t// Store state\n\t\t;(el as any).__mutation = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: MutationState = (el as any).__mutation\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disconnect if was enabled\n\t\t\tif (state.observer) {\n\t\t\t\tstate.observer.disconnect()\n\t\t\t}\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Re-observe if was disabled\n\t\t\tif (state.observer) {\n\t\t\t\tstate.observer.observe(el, {\n\t\t\t\t\tattributes: newOptions.attributes,\n\t\t\t\t\tattributeFilter: newOptions.attributeFilter,\n\t\t\t\t\tchildList: newOptions.childList,\n\t\t\t\t\tsubtree: newOptions.subtree,\n\t\t\t\t\tcharacterData: newOptions.characterData,\n\t\t\t\t\tattributeOldValue: newOptions.attributeOldValue,\n\t\t\t\t\tcharacterDataOldValue: newOptions.characterDataOldValue,\n\t\t\t\t})\n\t\t\t}\n\t\t} else if (!newOptions.disabled) {\n\t\t\t// If options changed, reconnect with new options\n\t\t\tif (\n\t\t\t\tnewOptions.attributes !== state.options.attributes\n\t\t\t\t|| newOptions.childList !== state.options.childList\n\t\t\t\t|| newOptions.subtree !== state.options.subtree\n\t\t\t\t|| newOptions.characterData !== state.options.characterData\n\t\t\t) {\n\t\t\t\tif (state.observer) {\n\t\t\t\t\tstate.observer.disconnect()\n\t\t\t\t\tstate.observer.observe(el, {\n\t\t\t\t\t\tattributes: newOptions.attributes,\n\t\t\t\t\t\tattributeFilter: newOptions.attributeFilter,\n\t\t\t\t\t\tchildList: newOptions.childList,\n\t\t\t\t\t\tsubtree: newOptions.subtree,\n\t\t\t\t\t\tcharacterData: newOptions.characterData,\n\t\t\t\t\t\tattributeOldValue: newOptions.attributeOldValue,\n\t\t\t\t\t\tcharacterDataOldValue: newOptions.characterDataOldValue,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MutationState = (el as any).__mutation\n\n\t\tif (!state) return\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\tdelete (el as any).__mutation\n\t},\n})\n\nexport default vMutation\n","import { defineDirective } from '@directix/core'\nimport { clampValue, formatNumber, type NumberFormatOptions, parseToNumber, setupNumberInput } from '../utils/number'\n\n/**\n * Number directive options\n */\nexport interface NumberOptions extends NumberFormatOptions {\n\t/** Prefix string (e.g., '$') */\n\tprefix?: string\n\t/** Suffix string (e.g., '%') */\n\tsuffix?: string\n}\n\nexport type NumberBinding = number | NumberOptions\n\ninterface NumberState {\n\toptions: NumberOptions\n\tcleanup: () => void\n}\n\nexport const vNumber = defineDirective<NumberBinding, HTMLElement>({\n\tname: 'number',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options: NumberOptions = typeof binding.value === 'number' ? { precision: binding.value } : (binding.value ?? {})\n\n\t\tif (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {\n\t\t\tconst cleanup = setupNumberInput(el as HTMLInputElement, options, formatNumber)\n\n\t\t\t;(el as any).__number = { options, cleanup }\n\n\t\t\t// Format initial value after DOM is ready\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst inputEl = el as HTMLInputElement\n\n\t\t\t\tif (inputEl.value) {\n\t\t\t\t\tconst num = parseToNumber(inputEl.value, options.decimal || '.')\n\n\t\t\t\t\tif (num !== null) {\n\t\t\t\t\t\tconst formatted = formatNumber(clampValue(num, options), options)\n\n\t\t\t\t\t\tif (formatted !== inputEl.value) {\n\t\t\t\t\t\t\tinputEl.value = formatted\n\t\t\t\t\t\t\tinputEl.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\t// For non-input elements, format the text content\n\t\t\tlet value: number | null = null\n\n\t\t\tif (typeof binding.value === 'number') {\n\t\t\t\tvalue = binding.value\n\t\t\t} else if (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t} else {\n\t\t\t\t// Try to parse from element's text content\n\t\t\t\tconst textContent = el.textContent?.trim()\n\n\t\t\t\tif (textContent) {\n\t\t\t\t\tvalue = parseToNumber(textContent, options.decimal || '.')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatNumber(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options: NumberOptions = typeof binding.value === 'number' ? { precision: binding.value } : (binding.value ?? {})\n\n\t\tconst state: NumberState | undefined = (el as any).__number\n\n\t\tif (state) {\n\t\t\tstate.options = options\n\t\t} else if (!(el.tagName === 'INPUT' || el.tagName === 'TEXTAREA')) {\n\t\t\t// Only format non-input elements on update\n\t\t\tlet value: number | null = null\n\n\t\t\tif (typeof binding.value === 'number') {\n\t\t\t\tvalue = binding.value\n\t\t\t} else if (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatNumber(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: NumberState | undefined = (el as any).__number\n\n\t\tstate?.cleanup()\n\t\tdelete (el as any).__number\n\t},\n})\n\nexport default vNumber\n","import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\n\n// ============ Types ============\n\n/**\n * Permission action mode\n */\nexport type PermissionAction = 'remove' | 'disable' | 'hide'\n\n/**\n * Permission check mode\n */\nexport type PermissionMode = 'some' | 'every'\n\n/**\n * Permission directive options\n */\nexport interface PermissionOptions {\n\t/** Permission value(s) to check */\n\tvalue: string | string[]\n\t/** Logic for multiple permissions: 'some' (OR) or 'every' (AND). Default: 'some' */\n\tmode?: PermissionMode\n\t/** Action when permission denied. Default: 'remove' */\n\taction?: PermissionAction\n\t/** Custom permission check function */\n\tcheck?: (permission: string | string[], mode: PermissionMode) => boolean\n\t/** Callback when permission state changes */\n\tonChange?: (hasPermission: boolean) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type PermissionBinding = string | string[] | PermissionOptions\n\n/**\n * Permission configuration\n */\nexport interface PermissionConfig {\n\t/** Get current user's permissions */\n\tgetPermissions: () => string[]\n\t/** Get current user's roles */\n\tgetRoles?: () => string[]\n\t/** Role to permission mapping */\n\troleMap?: Record<string, string[]>\n}\n\n// ============ Constants ============\n\nconst STATE_KEY = '__permission' as const\nconst WILDCARD = '*' as const\n\n// ============ State ============\n\ninterface ElementState {\n\toptions: PermissionOptions\n\toriginalDisplay: string\n\toriginalDisabled: boolean | string\n\tparentNode: Node | null\n\tplaceholder: Comment | null\n}\n\n// Global configuration\nlet globalConfig: PermissionConfig | null = null\n\n// ============ Configuration ============\n\n/**\n * Configure permission directive\n */\nexport function configurePermission(config: PermissionConfig): void {\n\tglobalConfig = config\n}\n\n/**\n * Get current configuration\n */\nexport function getPermissionConfig(): PermissionConfig | null {\n\treturn globalConfig\n}\n\n// ============ Helpers ============\n\n/**\n * Normalize binding value to options object\n */\nfunction normalizeOptions(binding: PermissionBinding | undefined): PermissionOptions {\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-permission: permission value is required')\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { value: binding }\n\t}\n\n\tif (Array.isArray(binding)) {\n\t\treturn { value: binding }\n\t}\n\n\treturn binding\n}\n\n/**\n * Check if a permission is granted (supports wildcard)\n */\nfunction hasPermission(required: string, permissions: string[]): boolean {\n\treturn permissions.includes(WILDCARD) || permissions.includes(required)\n}\n\n/**\n * Verify permission against configuration\n */\nfunction verifyPermission(options: PermissionOptions): boolean {\n\t// Custom check function takes priority\n\tif (options.check) {\n\t\treturn options.check(options.value, options.mode || 'some')\n\t}\n\n\t// Require global configuration\n\tif (!globalConfig) {\n\t\tconsole.warn('[Directix] v-permission: No permission config provided')\n\n\t\treturn true\n\t}\n\n\tconst permissions = globalConfig.getPermissions()\n\tconst roles = globalConfig.getRoles?.() || []\n\tconst roleMap = globalConfig.roleMap || {}\n\tconst required = Array.isArray(options.value) ? options.value : [options.value]\n\tconst mode = options.mode || 'some'\n\n\t/**\n\t * Check a single value - can be a role name or permission\n\t */\n\tfunction checkSingle(value: string): boolean {\n\t\t// If value is a role name in roleMap, check if user has that role\n\t\tif (value in roleMap) {\n\t\t\treturn roles.includes(value)\n\t\t}\n\n\t\t// Check direct permission\n\t\tif (hasPermission(value, permissions)) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Check if any of user's roles grant this permission\n\t\tfor (const role of roles) {\n\t\t\tconst rolePermissions = roleMap[role] || []\n\n\t\t\tif (hasPermission(value, rolePermissions)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\treturn mode === 'every' ? required.every(checkSingle) : required.some(checkSingle)\n}\n\n/**\n * Handle element when permission is denied\n */\nfunction handleDenied(el: HTMLElement, action: PermissionAction, state: ElementState): void {\n\tswitch (action) {\n\t\tcase 'remove':\n\t\t\tstate.parentNode = el.parentNode\n\t\t\tstate.placeholder = document.createComment('v-permission')\n\t\t\tel.parentNode?.insertBefore(state.placeholder, el)\n\t\t\tel.parentNode?.removeChild(el)\n\t\t\tbreak\n\t\tcase 'disable':\n\t\t\tstate.originalDisabled = el.getAttribute('disabled') || false\n\t\t\tel.setAttribute('disabled', 'true')\n\t\t\tel.classList.add('v-permission--disabled')\n\t\t\tbreak\n\t\tcase 'hide':\n\t\t\tstate.originalDisplay = el.style.display\n\t\t\tel.style.display = 'none'\n\t\t\tel.classList.add('v-permission--hidden')\n\t\t\tbreak\n\t}\n}\n\n/**\n * Restore element when permission is granted\n */\nfunction handleGranted(el: HTMLElement, action: PermissionAction, state: ElementState): void {\n\tswitch (action) {\n\t\tcase 'remove':\n\t\t\tif (state.placeholder && state.parentNode) {\n\t\t\t\tstate.parentNode.insertBefore(el, state.placeholder)\n\t\t\t\tstate.parentNode.removeChild(state.placeholder)\n\t\t\t\tstate.placeholder = null\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'disable':\n\t\t\tif (state.originalDisabled === false) {\n\t\t\t\tel.removeAttribute('disabled')\n\t\t\t} else if (state.originalDisabled) {\n\t\t\t\tel.setAttribute('disabled', state.originalDisabled as string)\n\t\t\t}\n\t\t\tel.classList.remove('v-permission--disabled')\n\t\t\tbreak\n\t\tcase 'hide':\n\t\t\tel.style.display = state.originalDisplay || ''\n\t\t\tel.classList.remove('v-permission--hidden')\n\t\t\tbreak\n\t}\n}\n\n/**\n * Get or create element state\n */\nfunction getState(el: HTMLElement): ElementState {\n\tif (!(el as any)[STATE_KEY]) {\n\t\t;(el as any)[STATE_KEY] = {\n\t\t\toptions: { value: '' },\n\t\t\toriginalDisplay: '',\n\t\t\toriginalDisabled: false,\n\t\t\tparentNode: null,\n\t\t\tplaceholder: null,\n\t\t} as ElementState\n\t}\n\n\treturn (el as any)[STATE_KEY]\n}\n\n/**\n * Check permission and update element state\n */\nfunction checkPermission(el: HTMLElement, binding: DirectiveBinding<PermissionBinding>): void {\n\tconst state = getState(el)\n\n\tstate.options = normalizeOptions(binding.value)\n\n\tconst granted = verifyPermission(state.options)\n\n\t// Trigger change callback\n\tstate.options.onChange?.(granted)\n\n\tconst action = state.options.action || 'remove'\n\n\tif (granted) {\n\t\thandleGranted(el, action, state)\n\t} else {\n\t\thandleDenied(el, action, state)\n\t}\n}\n\n/**\n * Cleanup element state\n */\nfunction cleanup(el: HTMLElement): void {\n\tconst state: ElementState = (el as any)[STATE_KEY]\n\n\tif (state?.placeholder && state.parentNode) {\n\t\tstate.parentNode.removeChild(state.placeholder)\n\t}\n\n\tdelete (el as any)[STATE_KEY]\n}\n\n// ============ Directive ============\n\n/**\n * v-permission directive\n *\n * Controls element visibility and state based on user permissions.\n * Supports role-based and permission-based access control with wildcard support.\n *\n * @example\n * ```vue\n * <template>\n * <button v-permission=\"'admin'\">Admin Only</button>\n * <button v-permission=\"['admin', 'editor']\">Admin or Editor</button>\n * <button v-permission=\"{ value: ['read', 'write'], mode: 'every' }\">Read & Write</button>\n * <button v-permission=\"{ value: 'admin', action: 'disable' }\">Disabled for non-admin</button>\n * </template>\n *\n * <script setup>\n * import { configurePermission } from 'directix'\n *\n * configurePermission({\n * getPermissions: () => store.getters.permissions,\n * getRoles: () => store.getters.roles,\n * roleMap: { admin: ['*'], editor: ['read', 'write'] }\n * })\n * </script>\n * ```\n */\nexport const vPermission = defineDirective<PermissionBinding, HTMLElement>({\n\tname: 'permission',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tcheckPermission(el, binding)\n\t},\n\n\tupdated(el, binding) {\n\t\tcheckPermission(el, binding)\n\t},\n\n\tunmounted(el) {\n\t\tcleanup(el)\n\t},\n})\n\nexport default vPermission\n","import { defineDirective } from '@directix/core'\n\n/**\n * Print complete callback\n */\nexport type PrintCompleteCallback = () => void\n\n/**\n * Print before callback\n */\nexport type PrintBeforeCallback = () => boolean | void\n\n/**\n * Print directive options\n */\nexport interface PrintOptions {\n\t/**\n\t * Title for the printed document\n\t */\n\ttitle?: string\n\n\t/**\n\t * Additional CSS styles to inject\n\t */\n\tstyles?: string | string[]\n\n\t/**\n\t * Additional CSS URLs to include\n\t */\n\tcssUrls?: string[]\n\n\t/**\n\t * Callback before printing\n\t * Return false to cancel printing\n\t */\n\tonBeforePrint?: PrintBeforeCallback\n\n\t/**\n\t * Callback after printing\n\t */\n\tonAfterPrint?: PrintCompleteCallback\n\n\t/**\n\t * Whether to print immediately on mount\n\t * @default false\n\t */\n\timmediate?: boolean\n\n\t/**\n\t * Print target selector\n\t * If not specified, prints the element itself\n\t */\n\ttarget?: string\n\n\t/**\n\t * Whether to print in a new window\n\t * @default false\n\t */\n\tnewWindow?: boolean\n\n\t/**\n\t * Custom class for print container\n\t */\n\tprintClass?: string\n}\n\n/**\n * Directive binding value type\n */\nexport type PrintBinding = PrintOptions | boolean\n\n/**\n * Element state storage\n */\ninterface PrintState {\n\toptions: PrintOptions\n\tclickHandler: (() => void) | null\n}\n\n/**\n * v-print directive\n *\n * Prints the element content when clicked or immediately.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Print on click -->\n * <button v-print>Print Page</button>\n *\n * <!-- Print specific element -->\n * <button v-print=\"{ target: '#content' }\">Print Content</button>\n *\n * <!-- Print with custom title -->\n * <button v-print=\"{ title: 'My Document', styles: 'body { font-size: 12px }' }\">\n * Print\n * </button>\n *\n * <!-- Print immediately on mount -->\n * <div v-print=\"{ immediate: true }\">Auto print</div>\n * </template>\n * ```\n */\nexport const vPrint = defineDirective<PrintBinding, HTMLElement>({\n\tname: 'print',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: PrintState = {\n\t\t\toptions,\n\t\t\tclickHandler: null,\n\t\t}\n\n\t\t;(el as any).__print = state\n\n\t\t// Print immediately if specified\n\t\tif (options.immediate) {\n\t\t\tsetTimeout(() => printElement(el, options), 100)\n\t\t\treturn\n\t\t}\n\n\t\t// Add click handler\n\t\tconst clickHandler = (): void => {\n\t\t\tprintElement(el, state.options)\n\t\t}\n\n\t\tel.addEventListener('click', clickHandler)\n\t\tstate.clickHandler = clickHandler\n\n\t\t// Add cursor style\n\t\tel.style.cursor = 'pointer'\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: PrintState = (el as any).__print\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: PrintState | undefined = (el as any).__print\n\n\t\tif (!state) return\n\n\t\tif (state.clickHandler) {\n\t\t\tel.removeEventListener('click', state.clickHandler)\n\t\t}\n\n\t\tel.style.cursor = ''\n\n\t\tdelete (el as any).__print\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: PrintBinding | undefined): PrintOptions {\n\tif (binding === true) {\n\t\treturn { immediate: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn {}\n\t}\n\n\treturn binding || {}\n}\n\n/**\n * Print element\n */\nasync function printElement(triggerEl: HTMLElement, options: PrintOptions): Promise<void> {\n\t// Call before callback\n\tif (options.onBeforePrint) {\n\t\tconst result = options.onBeforePrint()\n\t\tif (result === false) return\n\t}\n\n\t// Get target element\n\tconst targetEl = options.target ? document.querySelector(options.target) : triggerEl\n\n\tif (!targetEl) {\n\t\tconsole.warn('[Directix] v-print: Target element not found')\n\t\treturn\n\t}\n\n\t// Create print window/iframe\n\tif (options.newWindow) {\n\t\tawait printInNewWindow(targetEl as HTMLElement, options)\n\t} else {\n\t\tawait printInIframe(targetEl as HTMLElement, options)\n\t}\n\n\t// Call after callback\n\tif (options.onAfterPrint) {\n\t\toptions.onAfterPrint()\n\t}\n}\n\n/**\n * Print using iframe\n */\nasync function printInIframe(el: HTMLElement, options: PrintOptions): Promise<void> {\n\t// Create iframe\n\tconst iframe = document.createElement('iframe')\n\tiframe.style.cssText = 'position: absolute; top: -10000px; left: -10000px; width: 0; height: 0; border: none;'\n\tdocument.body.appendChild(iframe)\n\n\tconst iframeDoc = iframe.contentDocument || iframe.contentWindow?.document\n\n\tif (!iframeDoc) {\n\t\tconsole.warn('[Directix] v-print: Could not access iframe document')\n\t\tdocument.body.removeChild(iframe)\n\t\treturn\n\t}\n\n\t// Build document content\n\tconst content = buildPrintContent(el, options)\n\n\tiframeDoc.open()\n\tiframeDoc.write(content)\n\tiframeDoc.close()\n\n\t// Wait for images to load\n\tawait waitForImages(iframeDoc)\n\n\t// Print\n\ttry {\n\t\tiframe.contentWindow?.focus()\n\t\tiframe.contentWindow?.print()\n\t} catch (err) {\n\t\tconsole.error('[Directix] v-print: Print failed', err)\n\t}\n\n\t// Cleanup after print\n\tsetTimeout(() => {\n\t\tdocument.body.removeChild(iframe)\n\t}, 1000)\n}\n\n/**\n * Print in new window\n */\nasync function printInNewWindow(el: HTMLElement, options: PrintOptions): Promise<void> {\n\tconst printWindow = window.open('', '_blank')\n\n\tif (!printWindow) {\n\t\tconsole.warn('[Directix] v-print: Could not open print window')\n\t\treturn\n\t}\n\n\tconst content = buildPrintContent(el, options)\n\n\tprintWindow.document.open()\n\tprintWindow.document.write(content)\n\tprintWindow.document.close()\n\n\t// Wait for images to load\n\tawait waitForImages(printWindow.document)\n\n\t// Print\n\tprintWindow.focus()\n\tprintWindow.print()\n\n\t// Close after print\n\tsetTimeout(() => {\n\t\tprintWindow.close()\n\t}, 1000)\n}\n\n/**\n * Build print content HTML\n */\nfunction buildPrintContent(el: HTMLElement, options: PrintOptions): string {\n\t// Get all stylesheets\n\tlet styles = ''\n\n\t// Include existing stylesheets\n\tdocument.querySelectorAll('style, link[rel=\"stylesheet\"]').forEach(styleEl => {\n\t\tif (styleEl.tagName === 'STYLE') {\n\t\t\tstyles += `<style>${styleEl.textContent}</style>`\n\t\t} else if (styleEl.tagName === 'LINK') {\n\t\t\tconst href = (styleEl as HTMLLinkElement).href\n\t\t\tstyles += `<link rel=\"stylesheet\" href=\"${href}\">`\n\t\t}\n\t})\n\n\t// Add custom CSS URLs\n\tif (options.cssUrls) {\n\t\toptions.cssUrls.forEach(url => {\n\t\t\tstyles += `<link rel=\"stylesheet\" href=\"${url}\">`\n\t\t})\n\t}\n\n\t// Add custom styles\n\tif (options.styles) {\n\t\tconst customStyles = Array.isArray(options.styles) ? options.styles.join('\\n') : options.styles\n\t\tstyles += `<style>${customStyles}</style>`\n\t}\n\n\t// Add print-specific styles\n\tstyles += `\n\t\t<style>\n\t\t\t@media print {\n\t\t\t\tbody { margin: 0; padding: 20px; }\n\t\t\t\t${options.printClass ? `.${options.printClass} { page-break-inside: avoid; }` : ''}\n\t\t\t}\n\t\t</style>\n\t`\n\n\t// Build HTML\n\tconst title = options.title || document.title || 'Print'\n\tconst content = el.outerHTML\n\n\treturn `<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>${title}</title>\n\t${styles}\n</head>\n<body>\n\t${content}\n</body>\n</html>`\n}\n\n/**\n * Wait for images to load\n */\nfunction waitForImages(doc: Document): Promise<void[]> {\n\tconst images = doc.querySelectorAll('img')\n\tconst promises: Promise<void>[] = []\n\n\timages.forEach(img => {\n\t\tif (!img.complete) {\n\t\t\tpromises.push(\n\t\t\t\tnew Promise(resolve => {\n\t\t\t\t\timg.onload = () => resolve()\n\t\t\t\t\timg.onerror = () => resolve()\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t})\n\n\treturn Promise.all(promises)\n}\n\nexport default vPrint\n","import { defineDirective } from '@directix/core'\n\nexport type PullRefreshHandler = () => Promise<void> | void\n\nexport type PullRefreshState = 'idle' | 'pulling' | 'ready' | 'loading' | 'success' | 'error'\n\nexport interface PullRefreshOptions {\n\thandler: PullRefreshHandler\n\tdistance?: number\n\tmaxDistance?: number\n\tdisabled?: boolean\n\tindicator?: {\n\t\tidle?: string\n\t\tpulling?: string\n\t\tready?: string\n\t\tloading?: string\n\t\tsuccess?: string\n\t\terror?: string\n\t}\n\tsuccessDuration?: number\n\terrorDuration?: number\n\tonStateChange?: (state: PullRefreshState) => void\n}\n\nexport type PullRefreshBinding = PullRefreshHandler | PullRefreshOptions\n\ninterface PullRefreshInternalState {\n\toptions: PullRefreshOptions\n\tstate: PullRefreshState\n\tstartY: number\n\tcurrentY: number\n\tpulling: boolean\n\tindicatorEl: HTMLDivElement\n\tcontentEl: HTMLElement\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: () => void\n\t}\n}\n\nconst DEFAULT_DISTANCE = 60\nconst DEFAULT_MAX_DISTANCE = 100\nconst DEFAULT_SUCCESS_DURATION = 500\nconst DEFAULT_ERROR_DURATION = 1000\n\nconst DEFAULT_INDICATORS: Record<PullRefreshState, string> = {\n\tidle: '↓',\n\tpulling: '↓ Pull',\n\tready: '↓ Release',\n\tloading: '⟳ Loading...',\n\tsuccess: '✓ Done',\n\terror: '✗ Failed',\n}\n\nfunction normalizeOptions(binding: PullRefreshBinding): PullRefreshOptions {\n\tif (typeof binding === 'function') return { handler: binding }\n\n\treturn {\n\t\thandler: binding.handler,\n\t\tdistance: binding.distance ?? DEFAULT_DISTANCE,\n\t\tmaxDistance: binding.maxDistance ?? DEFAULT_MAX_DISTANCE,\n\t\tdisabled: binding.disabled ?? false,\n\t\tindicator: binding.indicator,\n\t\tsuccessDuration: binding.successDuration ?? DEFAULT_SUCCESS_DURATION,\n\t\terrorDuration: binding.errorDuration ?? DEFAULT_ERROR_DURATION,\n\t\tonStateChange: binding.onStateChange,\n\t}\n}\n\nfunction createIndicator(): HTMLDivElement {\n\tconst el = document.createElement('div')\n\tel.className = 'v-pull-refresh__indicator'\n\tel.style.cssText = `\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tright: 0;\n\t\theight: 60px;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tbackground: #f5f5f5;\n\t\tfont-size: 14px;\n\t\tcolor: #666;\n\t\tz-index: 10;\n\t\tpointer-events: none;\n\t\topacity: 0;\n\t\ttransition: opacity 0.2s ease;\n\t`\n\treturn el\n}\n\nfunction updateIndicator(el: HTMLDivElement, state: PullRefreshState, options: PullRefreshOptions): void {\n\tconst customIndicator = options.indicator?.[state]\n\tel.textContent = customIndicator || DEFAULT_INDICATORS[state]\n}\n\nfunction setState(internal: PullRefreshInternalState, newState: PullRefreshState): void {\n\tif (internal.state === newState) return\n\n\tinternal.state = newState\n\tupdateIndicator(internal.indicatorEl, newState, internal.options)\n\tinternal.options.onStateChange?.(newState)\n}\n\nfunction applyTransform(internal: PullRefreshInternalState, distance: number, showIndicator: boolean): void {\n\tinternal.contentEl.style.transform = `translateY(${distance}px)`\n\tinternal.indicatorEl.style.opacity = showIndicator ? '1' : '0'\n\tinternal.indicatorEl.style.transform = `translateY(${distance}px)`\n}\n\nfunction resetPosition(internal: PullRefreshInternalState): void {\n\tinternal.contentEl.style.transform = ''\n\tinternal.indicatorEl.style.opacity = '0'\n\tsetState(internal, 'idle')\n}\n\nasync function triggerRefresh(internal: PullRefreshInternalState): Promise<void> {\n\tsetState(internal, 'loading')\n\n\tconst distance = internal.options.distance!\n\tapplyTransform(internal, distance, true)\n\n\ttry {\n\t\tawait internal.options.handler()\n\t\tsetState(internal, 'success')\n\t\tawait sleep(internal.options.successDuration!)\n\t} catch {\n\t\tsetState(internal, 'error')\n\t\tawait sleep(internal.options.errorDuration!)\n\t} finally {\n\t\tresetPosition(internal)\n\t}\n}\n\nfunction sleep(ms: number): Promise<void> {\n\treturn new Promise(resolve => setTimeout(resolve, ms))\n}\n\nfunction createHandlers(internal: PullRefreshInternalState): PullRefreshInternalState['handlers'] {\n\tconst { contentEl, options } = internal\n\n\treturn {\n\t\ttouchStart: (e: TouchEvent) => {\n\t\t\tif (options.disabled || internal.state === 'loading') return\n\t\t\tif (contentEl.scrollTop > 0) return\n\n\t\t\tinternal.pulling = true\n\t\t\tinternal.startY = e.touches[0].clientY\n\t\t\tinternal.currentY = internal.startY\n\t\t\tsetState(internal, 'idle')\n\t\t},\n\n\t\ttouchMove: (e: TouchEvent) => {\n\t\t\tif (!internal.pulling || options.disabled || internal.state === 'loading') return\n\n\t\t\tinternal.currentY = e.touches[0].clientY\n\t\t\tconst diff = internal.currentY - internal.startY\n\n\t\t\t// Handle upward swipe - reset\n\t\t\tif (diff <= 0) {\n\t\t\t\tif (contentEl.style.transform) {\n\t\t\t\t\tcontentEl.style.transition = ''\n\t\t\t\t\tresetPosition(internal)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Prevent page scroll\n\t\t\te.preventDefault()\n\n\t\t\tconst distance = Math.min(diff * 0.5, options.maxDistance!)\n\t\t\tconst progress = distance / options.distance!\n\n\t\t\tcontentEl.style.transition = 'none'\n\t\t\tapplyTransform(internal, distance, true)\n\t\t\tsetState(internal, progress >= 1 ? 'ready' : 'pulling')\n\t\t},\n\n\t\ttouchEnd: () => {\n\t\t\tif (!internal.pulling || options.disabled) return\n\n\t\t\tinternal.pulling = false\n\t\t\tconst diff = internal.currentY - internal.startY\n\t\t\tconst distance = Math.min(diff * 0.5, options.maxDistance!)\n\n\t\t\tcontentEl.style.transition = ''\n\n\t\t\tif (internal.state === 'ready' && distance >= options.distance!) {\n\t\t\t\ttriggerRefresh(internal)\n\t\t\t} else {\n\t\t\t\tresetPosition(internal)\n\t\t\t}\n\t\t},\n\t}\n}\n\nfunction bindEvents(el: HTMLElement, handlers: PullRefreshInternalState['handlers']): void {\n\tel.addEventListener('touchstart', handlers.touchStart, { passive: false })\n\tel.addEventListener('touchmove', handlers.touchMove, { passive: false })\n\tel.addEventListener('touchend', handlers.touchEnd, { passive: true })\n}\n\nfunction unbindEvents(el: HTMLElement, handlers: PullRefreshInternalState['handlers']): void {\n\tel.removeEventListener('touchstart', handlers.touchStart)\n\tel.removeEventListener('touchmove', handlers.touchMove)\n\tel.removeEventListener('touchend', handlers.touchEnd)\n}\n\nexport const vPullRefresh = defineDirective<PullRefreshBinding, HTMLElement>({\n\tname: 'pull-refresh',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Setup container\n\t\tel.style.position = 'relative'\n\t\tel.style.overflow = 'hidden'\n\t\tel.classList.add('v-pull-refresh')\n\n\t\t// Create content wrapper\n\t\tconst contentEl = document.createElement('div')\n\t\tcontentEl.className = 'v-pull-refresh__content'\n\t\tcontentEl.style.cssText = 'position: relative; height: 100%; overflow-y: auto;'\n\n\t\t// Move children to wrapper\n\t\twhile (el.firstChild) {\n\t\t\tcontentEl.appendChild(el.firstChild)\n\t\t}\n\t\tel.appendChild(contentEl)\n\n\t\t// Create indicator\n\t\tconst indicatorEl = createIndicator()\n\t\tel.insertBefore(indicatorEl, contentEl)\n\n\t\t// Initialize state\n\t\tconst internal: PullRefreshInternalState = {\n\t\t\toptions,\n\t\t\tstate: 'idle',\n\t\t\tstartY: 0,\n\t\t\tcurrentY: 0,\n\t\t\tpulling: false,\n\t\t\tindicatorEl,\n\t\t\tcontentEl,\n\t\t\thandlers: null as any,\n\t\t}\n\n\t\tinternal.handlers = createHandlers(internal)\n\t\t;(el as any).__pullRefresh = internal\n\n\t\tif (!options.disabled) {\n\t\t\tbindEvents(el, internal.handlers)\n\t\t}\n\n\t\tupdateIndicator(indicatorEl, 'idle', options)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst internal: PullRefreshInternalState = (el as any).__pullRefresh\n\t\tif (!internal) return\n\n\t\tconst wasDisabled = internal.options.disabled\n\t\tinternal.options = normalizeOptions(binding.value)\n\n\t\tupdateIndicator(internal.indicatorEl, internal.state, internal.options)\n\n\t\tif (internal.options.disabled && !wasDisabled) {\n\t\t\tunbindEvents(el, internal.handlers)\n\t\t} else if (!internal.options.disabled && wasDisabled) {\n\t\t\tbindEvents(el, internal.handlers)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst internal: PullRefreshInternalState = (el as any).__pullRefresh\n\t\tif (!internal) return\n\n\t\tunbindEvents(el, internal.handlers)\n\t\tdelete (el as any).__pullRefresh\n\t},\n})\n\nexport default vPullRefresh\n","import { defineDirective, isBrowser, supportsResizeObserver } from '@directix/core'\n\n/**\n * Resize event handler\n */\nexport type ResizeHandler = (entry: ResizeObserverEntry) => void\n\n/**\n * Resize information\n */\nexport interface ResizeInfo {\n\t/** New width */\n\twidth: number\n\t/** New height */\n\theight: number\n\t/** Content rect */\n\tcontentRect: DOMRectReadOnly\n\t/** Border box size */\n\tborderBoxSize: ReadonlyArray<ResizeObserverSize>\n\t/** Content box size */\n\tcontentBoxSize: ReadonlyArray<ResizeObserverSize>\n\t/** Device pixel content box size */\n\tdevicePixelContentBoxSize: ReadonlyArray<ResizeObserverSize>\n}\n\n/**\n * Resize directive options\n */\nexport interface ResizeOptions {\n\t/**\n\t * Resize event handler\n\t * @required\n\t */\n\thandler: ResizeHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to use box model\n\t * - 'content-box': size of content area\n\t * - 'border-box': size of border box\n\t * - 'device-pixel-content-box': size in device pixels\n\t * @default 'content-box'\n\t */\n\tbox?: 'content-box' | 'border-box' | 'device-pixel-content-box'\n\n\t/**\n\t * Debounce time in milliseconds\n\t * @default 0 (no debounce)\n\t */\n\tdebounce?: number\n\n\t/**\n\t * Callback for browsers without ResizeObserver (uses object fallback)\n\t */\n\tonFallback?: (info: ResizeInfo) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type ResizeBinding = ResizeHandler | ResizeOptions\n\n/**\n * Element state storage\n */\ninterface ResizeState {\n\toptions: ResizeOptions\n\tobserver: ResizeObserver | null\n\thandler: (entry: ResizeObserverEntry) => void\n\tdebounceTimer: ReturnType<typeof setTimeout> | null\n\tpendingEntry: ResizeObserverEntry | null\n\tfallbackIframe: HTMLIFrameElement | null\n}\n\n/**\n * Get resize info from entry\n */\nfunction getResizeInfo(entry: ResizeObserverEntry): ResizeInfo {\n\treturn {\n\t\twidth: entry.contentRect.width,\n\t\theight: entry.contentRect.height,\n\t\tcontentRect: entry.contentRect,\n\t\tborderBoxSize: entry.borderBoxSize,\n\t\tcontentBoxSize: entry.contentBoxSize,\n\t\tdevicePixelContentBoxSize: entry.devicePixelContentBoxSize,\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ResizeBinding | undefined): ResizeOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-resize: handler is required')\n\t}\n\n\treturn {\n\t\tdisabled: false,\n\t\tbox: 'content-box',\n\t\tdebounce: 0,\n\t\t...binding,\n\t}\n}\n\n/**\n * Create fallback resize detection using object\n */\nfunction createFallbackResize(\n\tel: HTMLElement,\n\tcallback: () => void,\n): { iframe: HTMLIFrameElement, cleanup: () => void } {\n\t// Create an invisible iframe for resize detection\n\tconst iframe = document.createElement('iframe')\n\n\tiframe.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: none;\n pointer-events: none;\n opacity: 0;\n `\n\n\tel.appendChild(iframe)\n\n\tconst iWindow = iframe.contentWindow\n\n\tif (iWindow) {\n\t\tiWindow.addEventListener('resize', callback)\n\t}\n\n\treturn {\n\t\tiframe,\n\t\tcleanup: () => {\n\t\t\tif (iWindow) {\n\t\t\t\tiWindow.removeEventListener('resize', callback)\n\t\t\t}\n\n\t\t\tiframe.remove()\n\t\t},\n\t}\n}\n\n/**\n * v-resize directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-resize=\"handleResize\">Resize me</div>\n * <div v-resize=\"{ handler: handleResize, debounce: 200 }\">Debounced resize</div>\n * </template>\n * ```\n */\nexport const vResize = defineDirective<ResizeBinding, HTMLElement>({\n\tname: 'resize',\n\tssr: false,\n\tdefaults: {\n\t\tdisabled: false,\n\t\tbox: 'content-box',\n\t\tdebounce: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Ensure element has relative or absolute positioning for fallback\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\tconst state: ResizeState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t\tdebounceTimer: null,\n\t\t\tpendingEntry: null,\n\t\t\tfallbackIframe: null,\n\t\t\thandler: (entry: ResizeObserverEntry) => {\n\t\t\t\t// Handle debounce\n\t\t\t\tif (options.debounce && options.debounce > 0) {\n\t\t\t\t\tstate.pendingEntry = entry\n\n\t\t\t\t\tif (!state.debounceTimer) {\n\t\t\t\t\t\tstate.debounceTimer = setTimeout(() => {\n\t\t\t\t\t\t\tif (state.pendingEntry) {\n\t\t\t\t\t\t\t\toptions.handler(state.pendingEntry)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate.debounceTimer = null\n\t\t\t\t\t\t\tstate.pendingEntry = null\n\t\t\t\t\t\t}, options.debounce)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\toptions.handler(entry)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__resize = state\n\n\t\t// Use ResizeObserver if available\n\t\tif (supportsResizeObserver()) {\n\t\t\tstate.observer = new ResizeObserver(entries => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tstate.handler(entry)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate.observer.observe(el, { box: options.box })\n\t\t} else {\n\t\t\t// Fallback using iframe\n\t\t\tconsole.warn('[Directix] v-resize: ResizeObserver not supported, using fallback')\n\n\t\t\tconst { iframe, cleanup } = createFallbackResize(el, () => {\n\t\t\t\tconst rect = el.getBoundingClientRect()\n\t\t\t\tconst entry = {\n\t\t\t\t\ttarget: el,\n\t\t\t\t\tcontentRect: rect as DOMRectReadOnly,\n\t\t\t\t\tborderBoxSize: [] as any,\n\t\t\t\t\tcontentBoxSize: [] as any,\n\t\t\t\t\tdevicePixelContentBoxSize: [] as any,\n\t\t\t\t}\n\n\t\t\t\tstate.handler(entry as ResizeObserverEntry)\n\n\t\t\t\tif (options.onFallback) {\n\t\t\t\t\toptions.onFallback(getResizeInfo(entry as ResizeObserverEntry))\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate.fallbackIframe = iframe\n\t\t\t;(el as any).__resizeCleanup = cleanup\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ResizeState = (el as any).__resize\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ResizeState = (el as any).__resize\n\n\t\tif (!state) return\n\n\t\t// Clear debounce timer\n\t\tif (state.debounceTimer) {\n\t\t\tclearTimeout(state.debounceTimer)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\t// Cleanup fallback\n\t\tconst cleanup = (el as any).__resizeCleanup\n\n\t\tif (cleanup) {\n\t\t\tcleanup()\n\t\t}\n\n\t\tdelete (el as any).__resize\n\t\tdelete (el as any).__resizeCleanup\n\t},\n})\n\nexport default vResize\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Ripple directive options\n */\nexport interface RippleOptions {\n\t/**\n\t * Ripple color\n\t * @default 'currentColor'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Ripple duration in milliseconds\n\t * @default 600\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to disable ripple\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Initial scale of ripple\n\t * @default 0\n\t */\n\tinitialScale?: number\n\n\t/**\n\t * Final scale of ripple\n\t * @default 2\n\t */\n\tfinalScale?: number\n}\n\n/**\n * Directive binding value type\n */\nexport type RippleBinding = boolean | string | RippleOptions\n\n/**\n * Element state storage\n */\ninterface RippleState {\n\toptions: RippleOptions\n\tclickHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: RippleBinding | undefined): RippleOptions {\n\tif (binding === false) {\n\t\treturn { disabled: true, color: 'currentColor', duration: 600 }\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { color: binding, duration: 600 }\n\t}\n\n\tconst base: RippleOptions = {\n\t\tcolor: 'currentColor',\n\t\tduration: 600,\n\t\tdisabled: false,\n\t\tinitialScale: 0,\n\t\tfinalScale: 2,\n\t}\n\n\treturn binding && typeof binding === 'object' ? { ...base, ...binding } : base\n}\n\n/**\n * Create ripple element\n */\nfunction createRipple(\n\tevent: MouseEvent,\n\tel: HTMLElement,\n\toptions: RippleOptions,\n): HTMLSpanElement | null {\n\t// Get element dimensions\n\tconst rect = el.getBoundingClientRect()\n\n\t// Calculate ripple position\n\tconst x = event.clientX - rect.left\n\tconst y = event.clientY - rect.top\n\n\t// Calculate ripple size (use diagonal for full coverage)\n\tconst size = Math.max(rect.width, rect.height) * 2\n\n\t// Create ripple element\n\tconst ripple = document.createElement('span')\n\n\tripple.className = 'v-ripple__wave'\n\tripple.style.cssText = `\n position: absolute;\n border-radius: 50%;\n pointer-events: none;\n background-color: ${options.color};\n width: ${size}px;\n height: ${size}px;\n left: ${x - size / 2}px;\n top: ${y - size / 2}px;\n transform: scale(${options.initialScale});\n opacity: 0.3;\n z-index: 0;\n `\n\n\treturn ripple\n}\n\n/**\n * Animate ripple\n */\nfunction animateRipple(ripple: HTMLElement, options: RippleOptions): void {\n\tconst duration = options.duration || 600\n\tconst initialScale = options.initialScale || 0\n\tconst finalScale = options.finalScale || 2\n\n\t// Use Web Animations API if available\n\tif (typeof ripple.animate === 'function') {\n\t\tripple.animate(\n\t\t\t[\n\t\t\t\t{ transform: `scale(${initialScale})`, opacity: 0.3 },\n\t\t\t\t{ transform: `scale(${finalScale})`, opacity: 0 },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration,\n\t\t\t\teasing: 'ease-out',\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t).onfinish = () => {\n\t\t\tripple.remove()\n\t\t}\n\t} else {\n\t\t// Fallback for older browsers\n\t\tripple.style.transition = `transform ${duration}ms ease-out, opacity ${duration}ms ease-out`\n\n\t\t// Force reflow\n\t\tString(ripple.offsetHeight)\n\n\t\tripple.style.transform = `scale(${finalScale})`\n\t\tripple.style.opacity = '0'\n\n\t\tsetTimeout(() => {\n\t\t\tripple.remove()\n\t\t}, duration)\n\t}\n}\n\n/**\n * v-ripple directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-ripple>Click me</button>\n * <button v-ripple=\"'rgba(255, 255, 255, 0.3)'\">Custom color</button>\n * <button v-ripple=\"{ color: 'red', duration: 800 }\">Custom options</button>\n * </template>\n * ```\n */\nexport const vRipple = defineDirective<RippleBinding, HTMLElement>({\n\tname: 'ripple',\n\tssr: false,\n\tdefaults: {\n\t\tcolor: 'currentColor',\n\t\tduration: 600,\n\t\tdisabled: false,\n\t\tinitialScale: 0,\n\t\tfinalScale: 2,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Ensure element has proper positioning\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\t// Ensure overflow is hidden to contain ripple\n\t\tif (computedStyle.overflow === 'visible') {\n\t\t\tel.style.overflow = 'hidden'\n\t\t}\n\n\t\t// Add base class\n\t\tel.classList.add('v-ripple')\n\n\t\tconst state: RippleState = {\n\t\t\toptions,\n\t\t\tclickHandler: (e: Event) => {\n\t\t\t\t// Ignore if disabled\n\t\t\t\tif (state.options.disabled) return\n\n\t\t\t\tconst mouseEvent = e as MouseEvent\n\n\t\t\t\t// Create and append ripple\n\t\t\t\tconst ripple = createRipple(mouseEvent, el, state.options)\n\n\t\t\t\tif (ripple) {\n\t\t\t\t\tel.appendChild(ripple)\n\t\t\t\t\tanimateRipple(ripple, state.options)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__ripple = state\n\n\t\t// Bind click event\n\t\ton(el, 'click', state.clickHandler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: RippleState = (el as any).__ripple\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: RippleState = (el as any).__ripple\n\n\t\tif (!state) return\n\n\t\t// Unbind event\n\t\toff(el, 'click', state.clickHandler)\n\n\t\t// Remove class\n\t\tel.classList.remove('v-ripple')\n\n\t\tdelete (el as any).__ripple\n\t},\n})\n\nexport default vRipple\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Sanitize handler\n */\nexport type SanitizeHandler = (value: string) => string\n\n/**\n * Sanitize directive options\n */\nexport interface SanitizeOptions {\n\t/**\n\t * Tags to allow (whitelist)\n\t * @default []\n\t */\n\tallowedTags?: string[]\n\n\t/**\n\t * Attributes to allow (whitelist)\n\t * @default []\n\t */\n\tallowedAttributes?: string[]\n\n\t/**\n\t * Whether to allow data URLs\n\t * @default false\n\t */\n\tallowDataUrls?: boolean\n\n\t/**\n\t * Whether to allow inline styles\n\t * @default false\n\t */\n\tallowStyles?: boolean\n\n\t/**\n\t * Whether to allow class attribute\n\t * @default false\n\t */\n\tallowClass?: boolean\n\n\t/**\n\t * Whether to allow id attribute\n\t * @default false\n\t */\n\tallowId?: boolean\n\n\t/**\n\t * Custom sanitize function\n\t */\n\thandler?: SanitizeHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to sanitize on update\n\t * @default true\n\t */\n\tsanitizeOnUpdate?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type SanitizeBinding = boolean | SanitizeOptions\n\n/**\n * Default allowed tags (safe subset)\n */\nconst DEFAULT_ALLOWED_TAGS = ['b', 'i', 'u', 'strong', 'em', 'br', 'p', 'span', 'div']\n\n/**\n * Default allowed attributes\n */\nconst DEFAULT_ALLOWED_ATTRIBUTES = ['title', 'alt', 'href', 'src']\n\n/**\n * Dangerous tags that should always be removed\n */\nconst DANGEROUS_TAGS = ['script', 'iframe', 'object', 'embed', 'form', 'input', 'style', 'link', 'meta', 'base']\n\n/**\n * Dangerous attributes that should always be removed\n */\nconst DANGEROUS_ATTRIBUTES = ['onclick', 'onerror', 'onload', 'onmouseover', 'onfocus', 'onblur', 'onchange', 'onsubmit']\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: SanitizeBinding | undefined): SanitizeOptions {\n\tif (binding === false) {\n\t\treturn { disabled: true }\n\t}\n\n\tif (binding === true) {\n\t\treturn {\n\t\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\t}\n\t}\n\n\treturn {\n\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\tallowDataUrls: false,\n\t\tallowStyles: false,\n\t\tallowClass: false,\n\t\tallowId: false,\n\t\tdisabled: false,\n\t\tsanitizeOnUpdate: true,\n\t\t...binding,\n\t}\n}\n\n/**\n * Basic HTML sanitizer\n */\nfunction sanitizeHtml(html: string, options: SanitizeOptions): string {\n\t// Use custom handler if provided\n\tif (options.handler) {\n\t\treturn options.handler(html)\n\t}\n\n\t// Create a temporary element for parsing\n\tconst temp = document.createElement('div')\n\n\ttemp.innerHTML = html\n\n\t// Remove dangerous tags\n\tfor (const tag of DANGEROUS_TAGS) {\n\t\tconst elements = temp.getElementsByTagName(tag)\n\n\t\twhile (elements.length > 0) {\n\t\t\telements[0].parentNode?.removeChild(elements[0])\n\t\t}\n\t}\n\n\t// Process all elements\n\tconst processElement = (el: Element): void => {\n\t\t// Check if tag is allowed\n\t\tconst tagName = el.tagName.toLowerCase()\n\n\t\tif (options.allowedTags && !options.allowedTags.includes(tagName)) {\n\t\t\t// Replace with text content\n\t\t\tconst text = document.createTextNode(el.textContent || '')\n\n\t\t\tel.parentNode?.replaceChild(text, el)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Remove dangerous attributes\n\t\tfor (const attr of DANGEROUS_ATTRIBUTES) {\n\t\t\tel.removeAttribute(attr)\n\t\t}\n\n\t\t// Remove javascript: URLs\n\t\tconst href = el.getAttribute('href')\n\n\t\tif (href && href.toLowerCase().startsWith('javascript:')) {\n\t\t\tel.removeAttribute('href')\n\t\t}\n\n\t\t// Remove data: URLs if not allowed\n\t\tif (!options.allowDataUrls) {\n\t\t\tconst src = el.getAttribute('src')\n\n\t\t\tif (src && src.toLowerCase().startsWith('data:')) {\n\t\t\t\tel.removeAttribute('src')\n\t\t\t}\n\t\t}\n\n\t\t// Filter attributes\n\t\tif (options.allowedAttributes) {\n\t\t\tconst attrs = Array.from(el.attributes)\n\n\t\t\tfor (const attr of attrs) {\n\t\t\t\tconst isAllowed = options.allowedAttributes.includes(attr.name.toLowerCase())\n\t\t\t\tconst isClass = attr.name === 'class' && options.allowClass\n\t\t\t\tconst isId = attr.name === 'id' && options.allowId\n\t\t\t\tconst isStyle = attr.name === 'style' && options.allowStyles\n\n\t\t\t\tif (!isAllowed && !isClass && !isId && !isStyle) {\n\t\t\t\t\tel.removeAttribute(attr.name)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Process children\n\t\tfor (const child of Array.from(el.children)) {\n\t\t\tprocessElement(child)\n\t\t}\n\t}\n\n\t// Process all child elements\n\tfor (const child of Array.from(temp.children)) {\n\t\tprocessElement(child)\n\t}\n\n\treturn temp.innerHTML\n}\n\n/**\n * v-sanitize directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-sanitize v-html=\"userContent\"></div>\n * <div v-sanitize=\"{ allowedTags: ['b', 'i', 'p'] }\" v-html=\"userContent\"></div>\n * <div v-sanitize=\"{ handler: customSanitizer }\" v-html=\"userContent\"></div>\n * </template>\n * ```\n */\nexport const vSanitize = defineDirective<SanitizeBinding, HTMLElement>({\n\tname: 'sanitize',\n\tssr: true,\n\tdefaults: {\n\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\tallowDataUrls: false,\n\t\tallowStyles: false,\n\t\tallowClass: false,\n\t\tallowId: false,\n\t\tdisabled: false,\n\t\tsanitizeOnUpdate: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Store options\n\t\t;(el as any).__sanitize = { options }\n\n\t\t// Sanitize initial content\n\t\tconst content = el.innerHTML\n\n\t\tif (content) {\n\t\t\tel.innerHTML = sanitizeHtml(content, options)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__sanitize\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\tif (state.options.disabled || !state.options.sanitizeOnUpdate) return\n\n\t\t// Sanitize updated content\n\t\tconst content = el.innerHTML\n\n\t\tif (content) {\n\t\t\tel.innerHTML = sanitizeHtml(content, state.options)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tdelete (el as any).__sanitize\n\t},\n})\n\nexport default vSanitize\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\n/**\n * Scroll event handler\n */\nexport type ScrollHandler = (event: Event, info: ScrollInfo) => void\n\n/**\n * Scroll information\n */\nexport interface ScrollInfo {\n\t/** Current scroll left position */\n\tscrollLeft: number\n\t/** Current scroll top position */\n\tscrollTop: number\n\t/** Maximum scroll left */\n\tscrollLeftMax: number\n\t/** Maximum scroll top */\n\tscrollTopMax: number\n\t/** Horizontal scroll progress (0-1) */\n\tprogressX: number\n\t/** Vertical scroll progress (0-1) */\n\tprogressY: number\n\t/** Direction of horizontal scroll (-1: left, 1: right, 0: none) */\n\tdirectionX: -1 | 0 | 1\n\t/** Direction of vertical scroll (-1: up, 1: down, 0: none) */\n\tdirectionY: -1 | 0 | 1\n\t/** Scroll container element or window */\n\tcontainer: Element | Window\n}\n\n/**\n * Scroll directive options\n */\nexport interface ScrollOptions {\n\t/**\n\t * Scroll event handler\n\t * @required\n\t */\n\thandler: ScrollHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to use passive event listener\n\t * @default true\n\t */\n\tpassive?: boolean\n\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 0 (no throttle)\n\t */\n\tthrottle?: number\n\n\t/**\n\t * Custom scroll container selector or element\n\t */\n\tcontainer?: string | Element | Window | null\n}\n\n/**\n * Directive binding value type\n */\nexport type ScrollBinding = ScrollHandler | ScrollOptions\n\n/**\n * Element state storage\n */\ninterface ScrollState {\n\toptions: ScrollOptions\n\tscrollHandler: (e: Event) => void\n\tcontainer: Element | Window\n\tlastScrollLeft: number\n\tlastScrollTop: number\n\tthrottleTimer: ReturnType<typeof setTimeout> | null\n\tpendingEvent: Event | null\n}\n\n/**\n * Get scroll info\n */\nfunction getScrollInfo(container: Element | Window, lastScrollLeft: number, lastScrollTop: number): ScrollInfo {\n\tlet scrollLeft = 0,\n\t\tscrollTop = 0,\n\t\tscrollLeftMax = 0,\n\t\tscrollTopMax = 0\n\n\tif (container === window) {\n\t\tscrollLeft = window.scrollX || document.documentElement.scrollLeft\n\t\tscrollTop = window.scrollY || document.documentElement.scrollTop\n\t\tscrollLeftMax = document.documentElement.scrollWidth - window.innerWidth\n\t\tscrollTopMax = document.documentElement.scrollHeight - window.innerHeight\n\t} else {\n\t\tconst el = container as Element\n\n\t\tscrollLeft = el.scrollLeft\n\t\tscrollTop = el.scrollTop\n\t\tscrollLeftMax = el.scrollWidth - el.clientWidth\n\t\tscrollTopMax = el.scrollHeight - el.clientHeight\n\t}\n\n\tconst progressX = scrollLeftMax > 0 ? scrollLeft / scrollLeftMax : 0\n\tconst progressY = scrollTopMax > 0 ? scrollTop / scrollTopMax : 0\n\n\t// Calculate direction\n\tconst directionX: -1 | 0 | 1 = scrollLeft !== lastScrollLeft ? (scrollLeft > lastScrollLeft ? 1 : -1) : 0\n\tconst directionY: -1 | 0 | 1 = scrollTop !== lastScrollTop ? (scrollTop > lastScrollTop ? 1 : -1) : 0\n\n\treturn {\n\t\tscrollLeft,\n\t\tscrollTop,\n\t\tscrollLeftMax,\n\t\tscrollTopMax,\n\t\tprogressX,\n\t\tprogressY,\n\t\tdirectionX,\n\t\tdirectionY,\n\t\tcontainer,\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ScrollBinding | undefined): ScrollOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, passive: true }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-scroll: handler is required')\n\t}\n\n\treturn {\n\t\tpassive: true,\n\t\tthrottle: 0,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-scroll directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-scroll=\"handleScroll\">Scroll container</div>\n * <div v-scroll=\"{ handler: handleScroll, throttle: 100 }\">Throttled scroll</div>\n * </template>\n * ```\n */\nexport const vScroll = defineDirective<ScrollBinding, HTMLElement>({\n\tname: 'scroll',\n\tssr: false,\n\tdefaults: {\n\t\tpassive: true,\n\t\tthrottle: 0,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Determine scroll container\n\t\tlet container: Element | Window\n\n\t\tif (options.container) {\n\t\t\tif (options.container === window) {\n\t\t\t\tcontainer = window\n\t\t\t} else if (typeof options.container === 'string') {\n\t\t\t\tconst found = document.querySelector(options.container)\n\n\t\t\t\tcontainer = found || getScrollParent(el)\n\t\t\t} else {\n\t\t\t\tcontainer = options.container\n\t\t\t}\n\t\t} else {\n\t\t\t// Check if element itself is scrollable\n\t\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(el)\n\t\t\tconst isSelfScrollable = /(auto|scroll)/.test(overflow + overflowX + overflowY)\n\n\t\t\tcontainer = isSelfScrollable ? el : getScrollParent(el)\n\t\t}\n\n\t\tconst state: ScrollState = {\n\t\t\toptions,\n\t\t\tcontainer,\n\t\t\tlastScrollLeft: 0,\n\t\t\tlastScrollTop: 0,\n\t\t\tthrottleTimer: null,\n\t\t\tpendingEvent: null,\n\t\t\tscrollHandler: (e: Event) => {\n\t\t\t\t// Handle throttle\n\t\t\t\tif (options.throttle && options.throttle > 0) {\n\t\t\t\t\tstate.pendingEvent = e\n\n\t\t\t\t\tif (!state.throttleTimer) {\n\t\t\t\t\t\tstate.throttleTimer = setTimeout(() => {\n\t\t\t\t\t\t\tif (state.pendingEvent) {\n\t\t\t\t\t\t\t\tconst info = getScrollInfo(container, state.lastScrollLeft, state.lastScrollTop)\n\n\t\t\t\t\t\t\t\tstate.lastScrollLeft = info.scrollLeft\n\t\t\t\t\t\t\t\tstate.lastScrollTop = info.scrollTop\n\t\t\t\t\t\t\t\toptions.handler(state.pendingEvent, info)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate.throttleTimer = null\n\t\t\t\t\t\t\tstate.pendingEvent = null\n\t\t\t\t\t\t}, options.throttle)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst info = getScrollInfo(container, state.lastScrollLeft, state.lastScrollTop)\n\n\t\t\t\t\tstate.lastScrollLeft = info.scrollLeft\n\t\t\t\t\tstate.lastScrollTop = info.scrollTop\n\t\t\t\t\toptions.handler(e, info)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Initialize last scroll position\n\t\tconst initialInfo = getScrollInfo(container, 0, 0)\n\n\t\tstate.lastScrollLeft = initialInfo.scrollLeft\n\t\tstate.lastScrollTop = initialInfo.scrollTop\n\n\t\t// Store state\n\t\t;(el as any).__scroll = state\n\n\t\t// Bind scroll event\n\t\ton(container, 'scroll', state.scrollHandler, { passive: options.passive })\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ScrollState = (el as any).__scroll\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ScrollState = (el as any).__scroll\n\n\t\tif (!state) return\n\n\t\t// Clear throttle timer\n\t\tif (state.throttleTimer) {\n\t\t\tclearTimeout(state.throttleTimer)\n\t\t}\n\n\t\t// Unbind scroll event\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\n\t\tdelete (el as any).__scroll\n\t},\n})\n\nexport default vScroll\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\nconst STATE_KEY = '__sticky' as const\n\n/**\n * Sticky directive options\n */\nexport interface StickyOptions {\n\t/** Top offset when sticky @default 0 */\n\ttop?: number | string\n\t/** Bottom offset when sticky */\n\tbottom?: number | string\n\t/** Z-index when sticky @default 100 */\n\tzIndex?: number\n\t/** CSS class to add when sticky @default 'v-sticky--fixed' */\n\tstickyClass?: string\n\t/** Whether to disable @default false */\n\tdisabled?: boolean\n\t/** Callback when sticky state changes */\n\tonChange?: (isSticky: boolean) => void\n\t/** Custom scroll container */\n\tcontainer?: string | Element | null\n}\n\nexport type StickyBinding = boolean | number | StickyOptions\n\ninterface StickyState {\n\toptions: StickyOptions\n\tplaceholder: HTMLDivElement | null\n\toriginalStyles: { position: string, top: string, bottom: string, zIndex: string, width: string }\n\tisSticky: boolean\n\tscrollHandler: () => void\n\tresizeHandler: () => void\n\tcontainer: Element | Window\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: StickyBinding | undefined): StickyOptions {\n\tif (binding === false) return { disabled: true, top: 0, zIndex: 100 }\n\tif (typeof binding === 'number') return { top: binding, zIndex: 100 }\n\n\treturn {\n\t\ttop: 0,\n\t\tzIndex: 100,\n\t\tstickyClass: 'v-sticky--fixed',\n\t\tdisabled: false,\n\t\t...(binding && typeof binding === 'object' ? binding : {}),\n\t}\n}\n\n/**\n * Parse offset value to CSS string\n */\nfunction parseOffset(value: number | string | undefined): string {\n\tif (value === undefined) return '0'\n\n\treturn typeof value === 'number' ? `${value}px` : value\n}\n\n/**\n * Get scroll container for element\n */\nfunction getScrollContainer(el: HTMLElement, customContainer?: string | Element | null): Element | Window {\n\tif (customContainer) {\n\t\tif (typeof customContainer === 'string') {\n\t\t\treturn document.querySelector(customContainer) || getScrollParent(el)\n\t\t}\n\n\t\treturn customContainer\n\t}\n\n\t// Check if parent element is scrollable\n\tconst parent = el.parentElement\n\n\tif (parent) {\n\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent)\n\n\t\tif (/(auto|scroll)/.test(overflow + overflowX + overflowY)) {\n\t\t\treturn parent\n\t\t}\n\t}\n\n\treturn getScrollParent(el)\n}\n\n/**\n * Check and update sticky state\n */\nfunction checkSticky(el: HTMLElement, state: StickyState): void {\n\tif (state.options.disabled) {\n\t\tunsetSticky(el, state)\n\n\t\treturn\n\t}\n\n\tconst topOffset = parseFloat(parseOffset(state.options.top))\n\tconst containerRect = state.container === window ? { top: 0 } : (state.container as Element).getBoundingClientRect()\n\n\t// Use placeholder position when sticky, otherwise use element position\n\tconst referenceEl = state.placeholder || el\n\tconst rect = referenceEl.getBoundingClientRect()\n\tconst elementTopRelativeToContainer = rect.top - containerRect.top\n\n\tconst shouldSticky = elementTopRelativeToContainer <= topOffset\n\n\tif (shouldSticky && !state.isSticky) {\n\t\tsetSticky(el, state, topOffset, containerRect.top)\n\t} else if (!shouldSticky && state.isSticky) {\n\t\tunsetSticky(el, state)\n\t}\n}\n\n/**\n * Set element as sticky\n */\nfunction setSticky(el: HTMLElement, state: StickyState, topOffset: number, containerTop: number): void {\n\tstate.isSticky = true\n\n\t// Create placeholder to maintain layout\n\tconst placeholder = document.createElement('div')\n\n\tplaceholder.style.cssText = `width:${el.offsetWidth}px;height:${el.offsetHeight}px`\n\tel.parentNode?.insertBefore(placeholder, el)\n\tstate.placeholder = placeholder\n\n\t// Calculate fixed top position relative to viewport\n\tconst fixedTop = state.container === window ? topOffset : containerTop + topOffset\n\n\t// Apply sticky styles\n\tel.style.position = 'fixed'\n\tel.style.top = `${fixedTop}px`\n\tel.style.zIndex = String(state.options.zIndex || 100)\n\tel.style.width = `${el.offsetWidth}px`\n\n\tif (state.options.bottom !== undefined) {\n\t\tel.style.bottom = parseOffset(state.options.bottom)\n\t}\n\n\tstate.options.stickyClass && el.classList.add(state.options.stickyClass)\n\tel.dispatchEvent(new CustomEvent('sticky:change', { detail: { isSticky: true } }))\n\tstate.options.onChange?.(true)\n}\n\n/**\n * Unset element as sticky\n */\nfunction unsetSticky(el: HTMLElement, state: StickyState): void {\n\tif (!state.isSticky) return\n\n\tstate.isSticky = false\n\n\t// Remove placeholder\n\tstate.placeholder?.parentNode?.removeChild(state.placeholder)\n\tstate.placeholder = null\n\n\t// Restore original styles\n\tObject.assign(el.style, state.originalStyles)\n\n\tstate.options.stickyClass && el.classList.remove(state.options.stickyClass)\n\tel.dispatchEvent(new CustomEvent('sticky:change', { detail: { isSticky: false } }))\n\tstate.options.onChange?.(false)\n}\n\n/**\n * v-sticky directive\n *\n * @example\n * ```vue\n * <div v-sticky>Sticky header</div>\n * <div v-sticky=\"50\">Sticky with 50px top offset</div>\n * <div v-sticky=\"{ top: 60, zIndex: 1000 }\">Custom sticky</div>\n * ```\n */\nexport const vSticky = defineDirective<StickyBinding, HTMLElement>({\n\tname: 'sticky',\n\tssr: false,\n\tdefaults: { top: 0, zIndex: 100, stickyClass: 'v-sticky--fixed', disabled: false },\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst container = getScrollContainer(el, options.container)\n\n\t\tconst state: StickyState = {\n\t\t\toptions,\n\t\t\tplaceholder: null,\n\t\t\toriginalStyles: {\n\t\t\t\tposition: el.style.position,\n\t\t\t\ttop: el.style.top,\n\t\t\t\tbottom: el.style.bottom,\n\t\t\t\tzIndex: el.style.zIndex,\n\t\t\t\twidth: el.style.width,\n\t\t\t},\n\t\t\tisSticky: false,\n\t\t\tcontainer,\n\t\t\tscrollHandler: () => checkSticky(el, state),\n\t\t\tresizeHandler: () => checkSticky(el, state),\n\t\t}\n\n\t\tel.classList.add('v-sticky')\n\t\t;(el as any)[STATE_KEY] = state\n\n\t\ton(container, 'scroll', state.scrollHandler, { passive: true })\n\t\ton(window, 'resize', state.resizeHandler, { passive: true })\n\t\tcheckSticky(el, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: StickyState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t\tcheckSticky(el, state)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: StickyState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tstate.placeholder?.parentNode?.removeChild(state.placeholder)\n\n\t\tObject.assign(el.style, state.originalStyles)\n\t\tel.classList.remove('v-sticky', state.options.stickyClass || 'v-sticky--fixed')\n\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\t\toff(window, 'resize', state.resizeHandler)\n\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vSticky\n","import { defineDirective } from '@directix/core'\n\nexport type SwipeDirection = 'left' | 'right' | 'up' | 'down'\n\nexport type SwipeHandler = (direction: SwipeDirection, event: Event) => void\n\nexport interface SwipeOptions {\n\thandler?: SwipeHandler\n\tthreshold?: number\n\tmaxTime?: number\n\tdirections?: SwipeDirection[]\n\tpreventScrollOnSwipe?: boolean\n\tdisabled?: boolean\n\tmouse?: boolean\n\tonLeft?: () => void\n\tonRight?: () => void\n\tonUp?: () => void\n\tonDown?: () => void\n}\n\nexport type SwipeBinding = SwipeHandler | SwipeOptions\n\ninterface SwipeState {\n\toptions: SwipeOptions\n\tstartX: number\n\tstartY: number\n\tstartTime: number\n\tisActive: boolean\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: (e: TouchEvent) => void\n\t\tmouseDown: (e: MouseEvent) => void\n\t\tmouseUp: (e: MouseEvent) => void\n\t}\n}\n\nconst DEFAULT_THRESHOLD = 30\nconst DEFAULT_MAX_TIME = 500\nconst DEFAULT_DIRECTIONS: SwipeDirection[] = ['left', 'right', 'up', 'down']\n\nfunction getSwipeDirection(\n\tdeltaX: number,\n\tdeltaY: number,\n\tallowedDirections: SwipeDirection[],\n): SwipeDirection | null {\n\tconst absX = Math.abs(deltaX)\n\tconst absY = Math.abs(deltaY)\n\n\tif (absX > absY) {\n\t\tconst direction = deltaX > 0 ? 'right' : 'left'\n\t\treturn allowedDirections.includes(direction) ? direction : null\n\t} else {\n\t\tconst direction = deltaY > 0 ? 'down' : 'up'\n\t\treturn allowedDirections.includes(direction) ? direction : null\n\t}\n}\n\nfunction normalizeOptions(binding: SwipeBinding): SwipeOptions {\n\tif (typeof binding === 'function') return { handler: binding }\n\n\treturn {\n\t\thandler: binding.handler,\n\t\tthreshold: binding.threshold ?? DEFAULT_THRESHOLD,\n\t\tmaxTime: binding.maxTime ?? DEFAULT_MAX_TIME,\n\t\tdirections: binding.directions ?? [...DEFAULT_DIRECTIONS],\n\t\tpreventScrollOnSwipe: binding.preventScrollOnSwipe ?? true,\n\t\tdisabled: binding.disabled ?? false,\n\t\tmouse: binding.mouse ?? true,\n\t\tonLeft: binding.onLeft,\n\t\tonRight: binding.onRight,\n\t\tonUp: binding.onUp,\n\t\tonDown: binding.onDown,\n\t}\n}\n\nfunction triggerSwipe(\n\tstate: SwipeState,\n\tdeltaX: number,\n\tdeltaY: number,\n\tdeltaTime: number,\n\tevent: Event,\n\tel: HTMLElement,\n): void {\n\tconst { options } = state\n\n\t// Check time\n\tif (deltaTime > (options.maxTime ?? DEFAULT_MAX_TIME)) return\n\n\t// Check distance\n\tconst distance = Math.max(Math.abs(deltaX), Math.abs(deltaY))\n\tif (distance < (options.threshold ?? DEFAULT_THRESHOLD)) return\n\n\t// Get direction\n\tconst direction = getSwipeDirection(deltaX, deltaY, options.directions ?? DEFAULT_DIRECTIONS)\n\tif (!direction) return\n\n\t// Prevent scroll\n\tif (options.preventScrollOnSwipe && event.cancelable) {\n\t\tevent.preventDefault()\n\t}\n\n\t// Call handlers\n\toptions.handler?.(direction, event)\n\n\t// Direction-specific callbacks\n\tconst callbacks: Record<SwipeDirection, (() => void) | undefined> = {\n\t\tleft: options.onLeft,\n\t\tright: options.onRight,\n\t\tup: options.onUp,\n\t\tdown: options.onDown,\n\t}\n\tcallbacks[direction]?.()\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('swipe', { detail: { direction, deltaX, deltaY, deltaTime } }))\n}\n\nfunction createSwipeHandler(\n\tel: HTMLElement,\n\tstate: SwipeState,\n): (clientX: number, clientY: number, event: Event) => void {\n\treturn (clientX, clientY, event) => {\n\t\tconst deltaX = clientX - state.startX\n\t\tconst deltaY = clientY - state.startY\n\t\tconst deltaTime = Date.now() - state.startTime\n\t\ttriggerSwipe(state, deltaX, deltaY, deltaTime, event, el)\n\t}\n}\n\nfunction setupState(el: HTMLElement, options: SwipeOptions): SwipeState | null {\n\tif (options.disabled) return null\n\n\tel.style.touchAction = 'none'\n\tel.style.userSelect = 'none'\n\n\tconst state: SwipeState = {\n\t\toptions,\n\t\tstartX: 0,\n\t\tstartY: 0,\n\t\tstartTime: 0,\n\t\tisActive: false,\n\t\thandlers: null as any,\n\t}\n\n\tconst handleSwipe = createSwipeHandler(el, state)\n\n\tstate.handlers = {\n\t\ttouchStart: (e: TouchEvent) => {\n\t\t\tif (state.options.disabled) return\n\t\t\tstate.startX = e.touches[0].clientX\n\t\t\tstate.startY = e.touches[0].clientY\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isActive = true\n\t\t},\n\n\t\ttouchMove: (e: TouchEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tif (state.options.preventScrollOnSwipe) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\t\t},\n\n\t\ttouchEnd: (e: TouchEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tstate.isActive = false\n\t\t\tconst touch = e.changedTouches[0]\n\t\t\thandleSwipe(touch.clientX, touch.clientY, e)\n\t\t},\n\n\t\tmouseDown: (e: MouseEvent) => {\n\t\t\tif (state.options.disabled) return\n\t\t\tstate.startX = e.clientX\n\t\t\tstate.startY = e.clientY\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isActive = true\n\t\t},\n\n\t\tmouseUp: (e: MouseEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tstate.isActive = false\n\t\t\thandleSwipe(e.clientX, e.clientY, e)\n\t\t},\n\t}\n\n\treturn state\n}\n\nfunction bindEvents(el: HTMLElement, state: SwipeState): void {\n\tconst { handlers } = state\n\tconst enableMouse = state.options.mouse ?? true\n\n\tel.addEventListener('touchstart', handlers.touchStart, { passive: true })\n\tel.addEventListener('touchmove', handlers.touchMove, { passive: false })\n\tel.addEventListener('touchend', handlers.touchEnd)\n\tel.addEventListener('touchcancel', handlers.touchEnd)\n\n\tif (enableMouse) {\n\t\tel.addEventListener('mousedown', handlers.mouseDown)\n\t\tel.addEventListener('mouseup', handlers.mouseUp)\n\t\tel.addEventListener('mouseleave', handlers.mouseUp)\n\t}\n}\n\nfunction unbindEvents(el: HTMLElement, state: SwipeState): void {\n\tconst { handlers } = state\n\tconst enableMouse = state.options.mouse ?? true\n\n\tel.removeEventListener('touchstart', handlers.touchStart)\n\tel.removeEventListener('touchmove', handlers.touchMove)\n\tel.removeEventListener('touchend', handlers.touchEnd)\n\tel.removeEventListener('touchcancel', handlers.touchEnd)\n\n\tif (enableMouse) {\n\t\tel.removeEventListener('mousedown', handlers.mouseDown)\n\t\tel.removeEventListener('mouseup', handlers.mouseUp)\n\t\tel.removeEventListener('mouseleave', handlers.mouseUp)\n\t}\n}\n\nexport const vSwipe = defineDirective<SwipeBinding, HTMLElement>({\n\tname: 'swipe',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state = setupState(el, options)\n\t\tif (!state) return\n\n\t\t;(el as any).__swipe = state\n\t\tbindEvents(el, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: SwipeState | undefined = (el as any).__swipe\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (!state) {\n\t\t\tconst newState = setupState(el, newOptions)\n\t\t\tif (newState) {\n\t\t\t\t;(el as any).__swipe = newState\n\t\t\t\tbindEvents(el, newState)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst wasDisabled = state.options.disabled\n\t\tconst wasMouseEnabled = state.options.mouse ?? true\n\t\tconst nowMouseEnabled = newOptions.mouse ?? true\n\n\t\tstate.options = newOptions\n\n\t\tif (newOptions.disabled && !wasDisabled) {\n\t\t\tunbindEvents(el, state)\n\t\t} else if (!newOptions.disabled && wasDisabled) {\n\t\t\tbindEvents(el, state)\n\t\t} else if (wasMouseEnabled !== nowMouseEnabled) {\n\t\t\tif (wasMouseEnabled) {\n\t\t\t\tel.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\t\t\tel.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\t\t\tel.removeEventListener('mouseleave', state.handlers.mouseUp)\n\t\t\t}\n\t\t\tif (nowMouseEnabled) {\n\t\t\t\tel.addEventListener('mousedown', state.handlers.mouseDown)\n\t\t\t\tel.addEventListener('mouseup', state.handlers.mouseUp)\n\t\t\t\tel.addEventListener('mouseleave', state.handlers.mouseUp)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: SwipeState | undefined = (el as any).__swipe\n\t\tif (!state) return\n\n\t\tunbindEvents(el, state)\n\t\tdelete (el as any).__swipe\n\t},\n})\n\nexport default vSwipe\n","import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\nimport { 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\tif (!tooltipContainer && typeof document !== 'undefined') {\n\t\ttooltipContainer = document.createElement('div')\n\t\ttooltipContainer.id = 'directix-tooltip-container'\n\t\ttooltipContainer.style.cssText = 'position: fixed; top: 0; left: 0; pointer-events: none; z-index: 9999;'\n\t\tdocument.body.appendChild(tooltipContainer)\n\t}\n\n\treturn tooltipContainer!\n}\n\nfunction createTooltip(options: TooltipOptions): HTMLElement {\n\tconst tooltip = document.createElement('div')\n\n\ttooltip.className = `v-tooltip v-tooltip--${options.placement || 'top'}`\n\tif (options.class) tooltip.classList.add(options.class)\n\n\tconst maxWidth = options.maxWidth ? typeof options.maxWidth === 'number' ? `${options.maxWidth}px` : options.maxWidth : TOOLTIP_STYLES.maxWidth\n\n\ttooltip.style.cssText = [\n\t\t'position: absolute',\n\t\t`padding: ${TOOLTIP_STYLES.padding}`,\n\t\t`background: ${TOOLTIP_STYLES.background}`,\n\t\t`color: ${TOOLTIP_STYLES.color}`,\n\t\t`border-radius: ${TOOLTIP_STYLES.borderRadius}`,\n\t\t`font-size: ${TOOLTIP_STYLES.fontSize}`,\n\t\t`line-height: ${TOOLTIP_STYLES.lineHeight}`,\n\t\t`min-width: ${TOOLTIP_STYLES.minWidth}`,\n\t\t`max-width: ${maxWidth}`,\n\t\t'word-wrap: break-word',\n\t\t`box-shadow: ${TOOLTIP_STYLES.boxShadow}`,\n\t\t'pointer-events: none',\n\t\t'opacity: 0',\n\t\t'transition: opacity 0.2s ease',\n\t\t`z-index: ${options.zIndex || 9999}`,\n\t].join(';')\n\n\t// Add arrow\n\tif (options.arrow !== false) {\n\t\tconst arrow = document.createElement('div')\n\n\t\tarrow.className = 'v-tooltip__arrow'\n\t\tarrow.style.cssText = 'position: absolute; width: 8px; height: 8px; background: #333; transform: rotate(45deg);'\n\t\ttooltip.appendChild(arrow)\n\t}\n\n\t// Add content\n\tconst content = document.createElement('div')\n\n\tcontent.className = 'v-tooltip__content'\n\tcontent.textContent = options.content\n\ttooltip.appendChild(content)\n\n\treturn tooltip\n}\n\nfunction positionTooltip(\n\ttooltip: HTMLElement,\n\tel: HTMLElement,\n\tplacement: TooltipPlacement,\n\toffset: number,\n): void {\n\tconst elRect = el.getBoundingClientRect()\n\tconst tooltipRect = tooltip.getBoundingClientRect()\n\n\tlet top = 0,\n\t\tleft = 0\n\n\tswitch (placement) {\n\t\tcase 'top':\n\t\t\ttop = elRect.top - tooltipRect.height - offset\n\t\t\tleft = elRect.left + (elRect.width - tooltipRect.width) / 2\n\t\t\tbreak\n\t\tcase 'bottom':\n\t\t\ttop = elRect.bottom + offset\n\t\t\tleft = elRect.left + (elRect.width - tooltipRect.width) / 2\n\t\t\tbreak\n\t\tcase 'left':\n\t\t\ttop = elRect.top + (elRect.height - tooltipRect.height) / 2\n\t\t\tleft = elRect.left - tooltipRect.width - offset\n\t\t\tbreak\n\t\tcase 'right':\n\t\t\ttop = elRect.top + (elRect.height - tooltipRect.height) / 2\n\t\t\tleft = elRect.right + offset\n\t\t\tbreak\n\t}\n\n\t// Keep within viewport\n\tconst viewportWidth = window.innerWidth\n\tconst viewportHeight = window.innerHeight\n\n\tif (left < 0) left = 8\n\tif (left + tooltipRect.width > viewportWidth) left = viewportWidth - tooltipRect.width - 8\n\tif (top < 0) top = 8\n\tif (top + tooltipRect.height > viewportHeight) top = viewportHeight - tooltipRect.height - 8\n\n\ttooltip.style.top = `${top}px`\n\ttooltip.style.left = `${left}px`\n\n\t// Position arrow\n\tconst arrow = tooltip.querySelector('.v-tooltip__arrow') as HTMLElement\n\n\tif (arrow) {\n\t\tconst halfArrow = 4\n\n\t\tswitch (placement) {\n\t\t\tcase 'top':\n\t\t\t\tObject.assign(arrow.style, { bottom: `-${halfArrow}px`, left: '50%', transform: 'translateX(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'bottom':\n\t\t\t\tObject.assign(arrow.style, { top: `-${halfArrow}px`, left: '50%', transform: 'translateX(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'left':\n\t\t\t\tObject.assign(arrow.style, { right: `-${halfArrow}px`, top: '50%', transform: 'translateY(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'right':\n\t\t\t\tObject.assign(arrow.style, { left: `-${halfArrow}px`, top: '50%', transform: 'translateY(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunction showTooltip(el: HTMLElement, state: TooltipState): void {\n\tif (state.isVisible || state.options.disabled) return\n\n\tif (state.hideTimeout) {\n\t\tclearTimeout(state.hideTimeout)\n\t\tstate.hideTimeout = null\n\t}\n\n\tconst doShow = (): void => {\n\t\tconst tooltip = createTooltip(state.options)\n\n\t\tstate.tooltip = tooltip\n\t\tgetTooltipContainer().appendChild(tooltip)\n\n\t\trequestAnimationFrame(() => {\n\t\t\tpositionTooltip(tooltip, el, state.options.placement || 'top', state.options.offset || 8)\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\ttooltip.style.opacity = '1'\n\t\t\t})\n\t\t})\n\n\t\tstate.isVisible = true\n\t\tstate.options.onShow?.()\n\t}\n\n\tif (state.options.delay && state.options.delay > 0) {\n\t\tstate.showTimeout = setTimeout(doShow, state.options.delay)\n\t} else {\n\t\tdoShow()\n\t}\n}\n\nfunction hideTooltip(state: TooltipState): void {\n\tif (!state.isVisible) return\n\n\tif (state.showTimeout) {\n\t\tclearTimeout(state.showTimeout)\n\t\tstate.showTimeout = null\n\t}\n\n\tconst doHide = (): void => {\n\t\tif (state.tooltip) {\n\t\t\tstate.tooltip.style.opacity = '0'\n\t\t\tsetTimeout(() => {\n\t\t\t\tstate.tooltip?.remove()\n\t\t\t\tstate.tooltip = null\n\t\t\t}, 200)\n\t\t}\n\n\t\tstate.isVisible = false\n\t\tstate.options.onHide?.()\n\t}\n\n\tif (state.options.hideDelay && state.options.hideDelay > 0) {\n\t\tstate.hideTimeout = setTimeout(doHide, state.options.hideDelay)\n\t} else {\n\t\tdoHide()\n\t}\n}\n\nfunction setupTriggerHandlers(el: HTMLElement, state: TooltipState): void {\n\tconst { trigger = 'hover' } = state.options\n\n\tconst show = (): void => showTooltip(el, state)\n\tconst hide = (): void => hideTooltip(state)\n\tconst toggle = (): void => (state.isVisible ? hide() : show())\n\n\tstate.handlers = { show, hide, toggle }\n\n\tswitch (trigger) {\n\t\tcase 'hover':\n\t\t\tel.addEventListener('mouseenter', show)\n\t\t\tel.addEventListener('mouseleave', hide)\n\t\t\tbreak\n\t\tcase 'click':\n\t\t\tel.addEventListener('click', toggle)\n\t\t\tdocument.addEventListener('click', state.handlers.docHide = (e: Event) => {\n\t\t\t\tif (state.isVisible && !el.contains(e.target as Node)) hide()\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'focus':\n\t\t\tel.addEventListener('focus', show)\n\t\t\tel.addEventListener('blur', hide)\n\t\t\tbreak\n\t\t// 'manual' - no automatic handlers\n\t}\n}\n\nfunction removeTriggerHandlers(el: HTMLElement, state: TooltipState): void {\n\tconst { show, hide, toggle, docHide } = state.handlers\n\n\tif (show) {\n\t\tel.removeEventListener('mouseenter', show)\n\t\tel.removeEventListener('focus', show)\n\t}\n\tif (hide) {\n\t\tel.removeEventListener('mouseleave', hide)\n\t\tel.removeEventListener('blur', hide)\n\t}\n\tif (toggle) {\n\t\tel.removeEventListener('click', toggle)\n\t}\n\tif (docHide) {\n\t\tdocument.removeEventListener('click', docHide)\n\t}\n}\n\nfunction normalizeOptions(binding: TooltipBinding | undefined): TooltipOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { content: binding, placement: 'top', trigger: 'hover' }\n\t}\n\n\tif (!binding) {\n\t\treturn { content: '', placement: 'top', trigger: 'hover' }\n\t}\n\n\treturn {\n\t\tcontent: binding.content,\n\t\tplacement: binding.placement ?? 'top',\n\t\ttrigger: binding.trigger ?? 'hover',\n\t\tdelay: binding.delay ?? 0,\n\t\thideDelay: binding.hideDelay ?? 0,\n\t\toffset: binding.offset ?? 8,\n\t\tclass: binding.class,\n\t\tarrow: binding.arrow ?? true,\n\t\tdisabled: binding.disabled ?? false,\n\t\tmaxWidth: binding.maxWidth,\n\t\tzIndex: binding.zIndex ?? 9999,\n\t\tonShow: binding.onShow,\n\t\tonHide: binding.onHide,\n\t}\n}\n\nfunction createState(options: TooltipOptions): TooltipState {\n\treturn {\n\t\toptions,\n\t\ttooltip: null,\n\t\tshowTimeout: null,\n\t\thideTimeout: null,\n\t\tisVisible: false,\n\t\thandlers: {},\n\t}\n}\n\nexport const vTooltip = defineDirective<TooltipBinding, HTMLElement>({\n\tname: 'tooltip',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !options.content) return\n\n\t\tconst state = createState(options)\n\n\t\t;(el as any).__tooltip = state\n\t\tsetupTriggerHandlers(el, state)\n\t\tel.setAttribute('aria-describedby', 'v-tooltip')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: TooltipState | undefined = (el as any).__tooltip\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// No state exists - create if needed\n\t\tif (!state) {\n\t\t\tif (!newOptions.disabled && newOptions.content) {\n\t\t\t\tconst newState = createState(newOptions)\n\n\t\t\t\t;(el as any).__tooltip = newState\n\t\t\t\tsetupTriggerHandlers(el, newState)\n\n\t\t\t\tif (newOptions.trigger === 'manual') {\n\t\t\t\t\tshowTooltip(el, newState)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\t// Handle manual trigger\n\t\tif (newOptions.trigger === 'manual') {\n\t\t\tconst oldDisabled = state.options.disabled\n\n\t\t\tstate.options = newOptions\n\n\t\t\tif (newOptions.disabled && !oldDisabled) {\n\t\t\t\thideTooltip(state)\n\t\t\t} else if (!newOptions.disabled && oldDisabled) {\n\t\t\t\tshowTooltip(el, state)\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\t// Update visible tooltip content\n\t\tif (state.tooltip && state.isVisible) {\n\t\t\tconst content = state.tooltip.querySelector('.v-tooltip__content')\n\n\t\t\tif (content) content.textContent = newOptions.content\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: TooltipState | undefined = (el as any).__tooltip\n\n\t\tif (!state) return\n\n\t\tif (state.showTimeout) clearTimeout(state.showTimeout)\n\t\tif (state.hideTimeout) clearTimeout(state.hideTimeout)\n\t\tstate.tooltip?.remove()\n\t\tremoveTriggerHandlers(el, state)\n\t\tdelete (el as any).__tooltip\n\t},\n})\n\nexport default vTooltip\n","import { defineDirective } from '@directix/core'\n\n/**\n * Swipe direction\n */\nexport type SwipeDirection = 'left' | 'right' | 'up' | 'down'\n\n/**\n * Touch gesture options\n */\nexport interface TouchOptions {\n\t/** Minimum swipe distance in pixels @default 30 */\n\tswipeThreshold?: number\n\t/** Maximum time for a swipe in milliseconds @default 500 */\n\tswipeTimeout?: number\n\t/** Minimum pinch scale change @default 0.1 */\n\tpinchThreshold?: number\n\t/** Enable swipe detection @default true */\n\tenableSwipe?: boolean\n\t/** Enable pinch detection @default true */\n\tenablePinch?: boolean\n\t/** Enable rotate detection @default true */\n\tenableRotate?: boolean\n\t/** Enable tap detection @default true */\n\tenableTap?: boolean\n\t/** Maximum time for a tap in milliseconds @default 250 */\n\ttapTimeout?: number\n\t/** Maximum movement for a tap in pixels @default 10 */\n\ttapThreshold?: number\n\t/** Enable long press detection @default true */\n\tenableLongPress?: boolean\n\t/** Long press timeout in milliseconds @default 500 */\n\tlongPressTimeout?: number\n\t/** Enable mouse event simulation for desktop @default true */\n\tenableMouse?: boolean\n\n\tonSwipe?: (direction: SwipeDirection, event: TouchEvent | MouseEvent) => void\n\tonSwipeLeft?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeRight?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeUp?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeDown?: (event: TouchEvent | MouseEvent) => void\n\tonPinch?: (scale: number, event: TouchEvent) => void\n\tonRotate?: (angle: number, event: TouchEvent) => void\n\tonTap?: (event: TouchEvent | MouseEvent) => void\n\tonLongPress?: (event: TouchEvent | MouseEvent) => void\n\tonTouchStart?: (event: TouchEvent | MouseEvent) => void\n\tonTouchMove?: (event: TouchEvent | MouseEvent) => void\n\tonTouchEnd?: (event: TouchEvent | MouseEvent) => void\n}\n\ninterface TouchState {\n\toptions: TouchOptions\n\tstartX: number\n\tstartY: number\n\tstartTime: number\n\tstartDistance: number\n\tstartAngle: number\n\tlastScale: number\n\tlastAngle: number\n\tlongPressTimer: ReturnType<typeof setTimeout> | null\n\tisLongPress: boolean\n\tisMouseDown: boolean\n\tlastTouchEndTime: number\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: (e: TouchEvent) => void\n\t\tmouseDown?: (e: MouseEvent) => void\n\t\tmouseMove?: (e: MouseEvent) => void\n\t\tmouseUp?: (e: MouseEvent) => void\n\t}\n}\n\nconst getDistance = (x1: number, y1: number, x2: number, y2: number): number =>\n\tMath.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)\n\nconst getAngle = (x1: number, y1: number, x2: number, y2: number): number =>\n\t(Math.atan2(y2 - y1, x2 - x1) * 180) / Math.PI\n\nconst MOUSE_IGNORE_DURATION = 400\n\nexport const vTouch = defineDirective<TouchOptions, HTMLElement>({\n\tname: 'touch',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: TouchState = {\n\t\t\toptions,\n\t\t\tstartX: 0,\n\t\t\tstartY: 0,\n\t\t\tstartTime: 0,\n\t\t\tstartDistance: 0,\n\t\t\tstartAngle: 0,\n\t\t\tlastScale: 1,\n\t\t\tlastAngle: 0,\n\t\t\tlongPressTimer: null,\n\t\t\tisLongPress: false,\n\t\t\tisMouseDown: false,\n\t\t\tlastTouchEndTime: 0,\n\t\t\thandlers: { touchStart: () => {}, touchMove: () => {}, touchEnd: () => {} },\n\t\t}\n\n\t\t;(el as any).__touch = state\n\n\t\tconst clearLongPressTimer = (): void => {\n\t\t\tif (state.longPressTimer) {\n\t\t\t\tclearTimeout(state.longPressTimer)\n\t\t\t\tstate.longPressTimer = null\n\t\t\t}\n\t\t}\n\n\t\tconst startLongPressTimer = (event: TouchEvent | MouseEvent): void => {\n\t\t\tclearLongPressTimer()\n\t\t\tif (state.options.enableLongPress && state.options.onLongPress) {\n\t\t\t\tstate.longPressTimer = setTimeout(() => {\n\t\t\t\t\tstate.isLongPress = true\n\t\t\t\t\tstate.options.onLongPress!(event)\n\t\t\t\t}, state.options.longPressTimeout || 500)\n\t\t\t}\n\t\t}\n\n\t\tconst exceedsThreshold = (x: number, y: number): boolean => {\n\t\t\tconst threshold = state.options.tapThreshold || 10\n\t\t\treturn Math.abs(x - state.startX) > threshold || Math.abs(y - state.startY) > threshold\n\t\t}\n\n\t\tconst handleGestureEnd = (endX: number, endY: number, event: TouchEvent | MouseEvent): void => {\n\t\t\tif (state.isLongPress) return\n\n\t\t\tconst duration = Date.now() - state.startTime\n\t\t\tconst deltaX = endX - state.startX\n\t\t\tconst deltaY = endY - state.startY\n\t\t\tconst distance = Math.sqrt(deltaX ** 2 + deltaY ** 2)\n\n\t\t\t// Swipe detection\n\t\t\tif (\n\t\t\t\tstate.options.enableSwipe\n\t\t\t\t&& distance >= (state.options.swipeThreshold || 30)\n\t\t\t\t&& duration <= (state.options.swipeTimeout || 500)\n\t\t\t) {\n\t\t\t\tconst direction: SwipeDirection = Math.abs(deltaX) > Math.abs(deltaY) ? (deltaX > 0 ? 'right' : 'left') : (deltaY > 0 ? 'down' : 'up')\n\n\t\t\t\tstate.options.onSwipe?.(direction, event)\n\t\t\t\tif (direction === 'left') state.options.onSwipeLeft?.(event)\n\t\t\t\telse if (direction === 'right') state.options.onSwipeRight?.(event)\n\t\t\t\telse if (direction === 'up') state.options.onSwipeUp?.(event)\n\t\t\t\telse state.options.onSwipeDown?.(event)\n\t\t\t} else if (\n\t\t\t\tstate.options.enableTap\n\t\t\t\t&& distance < (state.options.tapThreshold || 10)\n\t\t\t\t&& duration < (state.options.tapTimeout || 250)\n\t\t\t) {\n\t\t\t\tstate.options.onTap?.(event)\n\t\t\t}\n\t\t}\n\n\t\t// Touch handlers\n\t\tconst handleTouchStart = (e: TouchEvent): void => {\n\t\t\t// Prevent page zoom on multi-touch\n\t\t\tif (e.touches.length > 1) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isLongPress = false\n\n\t\t\tif (e.touches.length === 1) {\n\t\t\t\tstate.startX = e.touches[0].clientX\n\t\t\t\tstate.startY = e.touches[0].clientY\n\t\t\t\tstartLongPressTimer(e)\n\t\t\t} else if (e.touches.length === 2) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t\tconst [t1, t2] = e.touches\n\t\t\t\tstate.startDistance = getDistance(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tstate.startAngle = getAngle(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tstate.lastScale = 1\n\t\t\t\tstate.lastAngle = 0\n\t\t\t}\n\n\t\t\tstate.options.onTouchStart?.(e)\n\t\t}\n\n\t\tconst handleTouchMove = (e: TouchEvent): void => {\n\t\t\t// Prevent page scroll and zoom during gesture\n\t\t\tif (e.touches.length >= 1) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\n\t\t\tif (state.longPressTimer && e.touches.length === 1 && exceedsThreshold(e.touches[0].clientX, e.touches[0].clientY)) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t}\n\n\t\t\tif (e.touches.length === 2) {\n\t\t\t\tconst [t1, t2] = e.touches\n\t\t\t\tconst currentDistance = getDistance(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tconst currentAngle = getAngle(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\n\t\t\t\tif (state.options.enablePinch && state.options.onPinch) {\n\t\t\t\t\tconst scale = currentDistance / state.startDistance\n\t\t\t\t\tif (Math.abs(scale - state.lastScale) >= (state.options.pinchThreshold || 0.1)) {\n\t\t\t\t\t\tstate.options.onPinch(scale, e)\n\t\t\t\t\t\tstate.lastScale = scale\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (state.options.enableRotate && state.options.onRotate) {\n\t\t\t\t\tconst angleDiff = currentAngle - state.startAngle\n\t\t\t\t\tif (Math.abs(angleDiff - state.lastAngle) > 5) {\n\t\t\t\t\t\tstate.options.onRotate(angleDiff, e)\n\t\t\t\t\t\tstate.lastAngle = angleDiff\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstate.options.onTouchMove?.(e)\n\t\t}\n\n\t\tconst handleTouchEnd = (e: TouchEvent): void => {\n\t\t\tclearLongPressTimer()\n\n\t\t\tif (e.touches.length === 0) {\n\t\t\t\tstate.lastTouchEndTime = Date.now()\n\t\t\t\tconst touch = e.changedTouches[0]\n\t\t\t\thandleGestureEnd(touch.clientX, touch.clientY, e)\n\t\t\t}\n\n\t\t\tstate.options.onTouchEnd?.(e)\n\t\t}\n\n\t\t// Mouse handlers for desktop\n\t\tconst handleMouseDown = (e: MouseEvent): void => {\n\t\t\tif (!state.options.enableMouse) return\n\t\t\t// Ignore simulated mouse events after touch\n\t\t\tif (Date.now() - state.lastTouchEndTime < MOUSE_IGNORE_DURATION) return\n\n\t\t\te.preventDefault()\n\t\t\tstate.isMouseDown = true\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.startX = e.clientX\n\t\t\tstate.startY = e.clientY\n\t\t\tstate.isLongPress = false\n\t\t\tstartLongPressTimer(e)\n\n\t\t\tstate.options.onTouchStart?.(e)\n\t\t}\n\n\t\tconst handleMouseMove = (e: MouseEvent): void => {\n\t\t\tif (!state.isMouseDown || !state.options.enableMouse) return\n\t\t\tif (state.longPressTimer && exceedsThreshold(e.clientX, e.clientY)) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t}\n\t\t\tstate.options.onTouchMove?.(e)\n\t\t}\n\n\t\tconst handleMouseUp = (e: MouseEvent): void => {\n\t\t\tif (!state.isMouseDown || !state.options.enableMouse) return\n\n\t\t\tstate.isMouseDown = false\n\t\t\tclearLongPressTimer()\n\n\t\t\tif (!state.isLongPress) {\n\t\t\t\thandleGestureEnd(e.clientX, e.clientY, e)\n\t\t\t}\n\n\t\t\tstate.options.onTouchEnd?.(e)\n\t\t}\n\n\t\tstate.handlers = { touchStart: handleTouchStart, touchMove: handleTouchMove, touchEnd: handleTouchEnd, mouseDown: handleMouseDown, mouseMove: handleMouseMove, mouseUp: handleMouseUp }\n\n\t\tel.addEventListener('touchstart', handleTouchStart, { passive: false })\n\t\tel.addEventListener('touchmove', handleTouchMove, { passive: false })\n\t\tel.addEventListener('touchend', handleTouchEnd)\n\t\tel.addEventListener('touchcancel', handleTouchEnd)\n\n\t\tif (options.enableMouse) {\n\t\t\tel.addEventListener('mousedown', handleMouseDown)\n\t\t\tdocument.addEventListener('mousemove', handleMouseMove)\n\t\t\tdocument.addEventListener('mouseup', handleMouseUp)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__touch as TouchState | undefined\n\t\tif (state) state.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state = (el as any).__touch as TouchState | undefined\n\n\t\tif (state?.longPressTimer) clearTimeout(state.longPressTimer)\n\n\t\tif (state?.handlers) {\n\t\t\tel.removeEventListener('touchstart', state.handlers.touchStart)\n\t\t\tel.removeEventListener('touchmove', state.handlers.touchMove)\n\t\t\tel.removeEventListener('touchend', state.handlers.touchEnd)\n\t\t\tel.removeEventListener('touchcancel', state.handlers.touchEnd)\n\t\t\tif (state.handlers.mouseDown) el.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\t\tif (state.handlers.mouseMove) document.removeEventListener('mousemove', state.handlers.mouseMove)\n\t\t\tif (state.handlers.mouseUp) document.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\t}\n\n\t\tdelete (el as any).__touch\n\t},\n})\n\nfunction normalizeOptions(binding: TouchOptions | undefined): TouchOptions {\n\treturn {\n\t\tswipeThreshold: binding?.swipeThreshold ?? 30,\n\t\tswipeTimeout: binding?.swipeTimeout ?? 500,\n\t\tpinchThreshold: binding?.pinchThreshold ?? 0.1,\n\t\tenableSwipe: binding?.enableSwipe ?? true,\n\t\tenablePinch: binding?.enablePinch ?? true,\n\t\tenableRotate: binding?.enableRotate ?? true,\n\t\tenableTap: binding?.enableTap ?? true,\n\t\ttapTimeout: binding?.tapTimeout ?? 250,\n\t\ttapThreshold: binding?.tapThreshold ?? 10,\n\t\tenableLongPress: binding?.enableLongPress ?? true,\n\t\tlongPressTimeout: binding?.longPressTimeout ?? 500,\n\t\tenableMouse: binding?.enableMouse ?? true,\n\t\tonSwipe: binding?.onSwipe,\n\t\tonSwipeLeft: binding?.onSwipeLeft,\n\t\tonSwipeRight: binding?.onSwipeRight,\n\t\tonSwipeUp: binding?.onSwipeUp,\n\t\tonSwipeDown: binding?.onSwipeDown,\n\t\tonPinch: binding?.onPinch,\n\t\tonRotate: binding?.onRotate,\n\t\tonTap: binding?.onTap,\n\t\tonLongPress: binding?.onLongPress,\n\t\tonTouchStart: binding?.onTouchStart,\n\t\tonTouchMove: binding?.onTouchMove,\n\t\tonTouchEnd: binding?.onTouchEnd,\n\t}\n}\n\nexport default vTouch\n","import { defineDirective } from '@directix/core'\n\n/**\n * Trim position\n */\nexport type TrimPosition = 'start' | 'end' | 'both'\n\n/**\n * Trim directive options\n */\nexport interface TrimOptions {\n\t/**\n\t * Trim position\n\t * @default 'both'\n\t */\n\tposition?: TrimPosition\n\n\t/**\n\t * Whether to trim on input (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n\n\t/**\n\t * Whether to trim on blur\n\t * @default true\n\t */\n\tonBlur?: boolean\n\n\t/**\n\t * Custom characters to trim (in addition to whitespace)\n\t */\n\tchars?: string\n}\n\n/**\n * Directive binding value type\n */\nexport type TrimBinding = boolean | TrimPosition | TrimOptions\n\n/**\n * Element state storage\n */\ninterface TrimState {\n\toptions: TrimOptions\n\tinputHandler?: () => void\n\tblurHandler?: () => void\n}\n\n/**\n * Trim text based on options\n */\nfunction trimText(text: string, options: TrimOptions): string {\n\tconst { position = 'both', chars } = options\n\n\t// Build regex pattern for custom chars\n\tconst charPattern = chars ? `[\\\\s${escapeRegex(chars)}]` : '\\\\s'\n\n\tswitch (position) {\n\t\tcase 'start':\n\t\t\treturn text.replace(new RegExp(`^${charPattern}+`, 'g'), '')\n\n\t\tcase 'end':\n\t\t\treturn text.replace(new RegExp(`${charPattern}+$`, 'g'), '')\n\n\t\tcase 'both':\n\t\tdefault:\n\t\t\treturn text.replace(new RegExp(`^${charPattern}+|${charPattern}+$`, 'g'), '')\n\t}\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegex(str: string): string {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * v-trim directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: trim both sides -->\n * <input v-trim v-model=\"text\" />\n *\n * <!-- Trim only start -->\n * <input v-trim=\"'start'\" v-model=\"text\" />\n *\n * <!-- Trim only end -->\n * <input v-trim=\"'end'\" v-model=\"text\" />\n *\n * <!-- With options -->\n * <input v-trim=\"{ position: 'both', onBlur: true }\" v-model=\"text\" />\n *\n * <!-- For display only -->\n * <span v-trim> Text with spaces </span>\n * </template>\n * ```\n */\nexport const vTrim = defineDirective<TrimBinding, HTMLElement>({\n\tname: 'trim',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {\n\t\t\tsetupInputElement(el as HTMLInputElement | HTMLTextAreaElement, options)\n\t\t} else {\n\t\t\t// For non-input elements, trim text content\n\t\t\tconst text = el.textContent || ''\n\n\t\t\tel.textContent = trimText(text, options)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state: TrimState | undefined = (el as any).__trim\n\n\t\tif (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {\n\t\t\t// For input elements, trimming happens on blur/input events\n\t\t\tif (state) {\n\t\t\t\tstate.options = options\n\t\t\t}\n\t\t} else {\n\t\t\t// For non-input elements, trim text content\n\t\t\tconst text = el.textContent || ''\n\n\t\t\tel.textContent = trimText(text, options)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: TrimState | undefined = (el as any).__trim\n\n\t\tif (state?.inputHandler) {\n\t\t\tel.removeEventListener('input', state.inputHandler)\n\t\t}\n\t\tif (state?.blurHandler) {\n\t\t\tel.removeEventListener('blur', state.blurHandler)\n\t\t}\n\n\t\tdelete (el as any).__trim\n\t},\n})\n\n/**\n * Setup input element\n */\nfunction setupInputElement(el: HTMLInputElement | HTMLTextAreaElement, options: TrimOptions): void {\n\tconst state: TrimState = { options }\n\n\t;(el as any).__trim = state\n\n\tconst performTrim = (): void => {\n\t\tconst originalValue = el.value\n\t\tconst trimmed = trimText(originalValue, options)\n\n\t\tif (originalValue !== trimmed) {\n\t\t\tel.value = trimmed\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t}\n\t}\n\n\t// Create handlers based on options\n\tif (options.onInput) {\n\t\tconst inputHandler = (): void => {\n\t\t\t// For real-time trimming, we need to be careful about cursor position\n\t\t\t// We'll only trim on blur for better UX, or trim end on input\n\t\t\tconst originalValue = el.value\n\t\t\tconst cursorPos = el.selectionStart\n\n\t\t\t// Trim end while typing\n\t\t\tconst trimmed = originalValue.replace(/\\s+$/g, '')\n\n\t\t\tif (originalValue !== trimmed) {\n\t\t\t\tel.value = trimmed\n\t\t\t\t// Adjust cursor position\n\t\t\t\tif (cursorPos !== null) {\n\t\t\t\t\tconst newCursorPos = Math.min(cursorPos, trimmed.length)\n\n\t\t\t\t\tel.setSelectionRange(newCursorPos, newCursorPos)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tel.addEventListener('input', inputHandler)\n\t\tstate.inputHandler = inputHandler\n\t}\n\n\tif (options.onBlur) {\n\t\tconst blurHandler = (): void => performTrim()\n\n\t\tel.addEventListener('blur', blurHandler)\n\t\tstate.blurHandler = blurHandler\n\t}\n\n\t// Initial trim\n\tif (el.value) {\n\t\tperformTrim()\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: TrimBinding | undefined): TrimOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { position: 'both', onInput: true, onBlur: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { position: 'both', onInput: false, onBlur: false }\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { position: binding, onInput: true, onBlur: true }\n\t}\n\n\treturn {\n\t\tposition: binding.position ?? 'both',\n\t\tonInput: binding.onInput ?? true,\n\t\tonBlur: binding.onBlur ?? true,\n\t\tchars: binding.chars,\n\t}\n}\n\nexport default vTrim\n","import { defineDirective } from '@directix/core'\n\n/**\n * Truncate position\n */\nexport type TruncatePosition = 'start' | 'middle' | 'end'\n\n/**\n * Truncate directive options\n */\nexport interface TruncateOptions {\n\t/**\n\t * Maximum length of text\n\t * @default 100\n\t */\n\tlength?: number\n\n\t/**\n\t * Truncation position\n\t * @default 'end'\n\t */\n\tposition?: TruncatePosition\n\n\t/**\n\t * Ellipsis string\n\t * @default '...'\n\t */\n\tellipsis?: string\n\n\t/**\n\t * Whether to use CSS truncation (use text-overflow: ellipsis)\n\t * When true, length and position options are ignored\n\t * @default false\n\t */\n\tuseCss?: boolean\n\n\t/**\n\t * Show full text on hover (as title attribute)\n\t * @default true\n\t */\n\tshowTitle?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type TruncateBinding = number | TruncateOptions\n\n/**\n * Element state storage\n */\ninterface TruncateState {\n\toriginalText: string\n\toptions: TruncateOptions\n}\n\n/**\n * Truncate text based on options\n */\nfunction truncateText(text: string, options: TruncateOptions): string {\n\tconst { length = 100, position = 'end', ellipsis = '...' } = options\n\n\tif (text.length <= length) {\n\t\treturn text\n\t}\n\n\tswitch (position) {\n\t\tcase 'start':\n\t\t\treturn ellipsis + text.slice(-(length - ellipsis.length))\n\n\t\tcase 'middle': {\n\t\t\tconst startLen = Math.ceil((length - ellipsis.length) / 2)\n\t\t\tconst endLen = Math.floor((length - ellipsis.length) / 2)\n\n\t\t\treturn text.slice(0, startLen) + ellipsis + text.slice(-endLen)\n\t\t}\n\n\t\tcase 'end':\n\t\tdefault:\n\t\t\treturn text.slice(0, length - ellipsis.length) + ellipsis\n\t}\n}\n\n/**\n * v-truncate directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: truncate to 50 characters -->\n * <p v-truncate=\"50\">Long text here...</p>\n *\n * <!-- With options -->\n * <p v-truncate=\"{ length: 100, position: 'middle' }\">Long text here...</p>\n *\n * <!-- CSS truncation -->\n * <p v-truncate=\"{ useCss: true }\">Long text here...</p>\n * </template>\n * ```\n */\nexport const vTruncate = defineDirective<TruncateBinding, HTMLElement>({\n\tname: 'truncate',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst text = el.textContent || ''\n\n\t\t// Store original text\n\t\tconst state: TruncateState = {\n\t\t\toriginalText: text,\n\t\t\toptions,\n\t\t}\n\n\t\t;(el as any).__truncate = state\n\n\t\tapplyTruncation(el, text, options)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: TruncateState | undefined = (el as any).__truncate\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (state) {\n\t\t\t// Always use original text for re-truncation\n\t\t\tconst originalText = state.originalText\n\n\t\t\t// Check if options changed\n\t\t\tif (JSON.stringify(newOptions) !== JSON.stringify(state.options)) {\n\t\t\t\tstate.options = newOptions\n\t\t\t\tapplyTruncation(el, originalText, newOptions)\n\t\t\t}\n\t\t} else {\n\t\t\tconst text = el.textContent || ''\n\n\t\t\t;(el as any).__truncate = {\n\t\t\t\toriginalText: text,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t\tapplyTruncation(el, text, newOptions)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tdelete (el as any).__truncate\n\t},\n})\n\n/**\n * Apply truncation to element\n */\nfunction applyTruncation(el: HTMLElement, text: string, options: TruncateOptions): void {\n\tconst { useCss, showTitle = true } = options\n\n\tif (useCss) {\n\t\t// Use CSS truncation\n\t\tel.style.overflow = 'hidden'\n\t\tel.style.textOverflow = 'ellipsis'\n\t\tel.style.whiteSpace = 'nowrap'\n\n\t\tif (showTitle && text) {\n\t\t\tel.setAttribute('title', text)\n\t\t}\n\t} else {\n\t\t// Use JavaScript truncation\n\t\tconst truncated = truncateText(text, options)\n\n\t\tel.textContent = truncated\n\n\t\tif (showTitle && text && text !== truncated) {\n\t\t\tel.setAttribute('title', text)\n\t\t}\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: TruncateBinding | undefined): TruncateOptions {\n\tif (typeof binding === 'number') {\n\t\treturn {\n\t\t\tlength: binding,\n\t\t\tposition: 'end',\n\t\t\tellipsis: '...',\n\t\t\tuseCss: false,\n\t\t\tshowTitle: true,\n\t\t}\n\t}\n\n\treturn {\n\t\tlength: binding?.length ?? 100,\n\t\tposition: binding?.position ?? 'end',\n\t\tellipsis: binding?.ellipsis ?? '...',\n\t\tuseCss: binding?.useCss ?? false,\n\t\tshowTitle: binding?.showTitle ?? true,\n\t}\n}\n\nexport default vTruncate\n","import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Uppercase directive options\n */\nexport interface UppercaseOptions {\n\t/**\n\t * Transform only the first character\n\t * @default false\n\t */\n\tfirst?: boolean\n\n\t/**\n\t * Transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type UppercaseBinding = boolean | UppercaseOptions\n\n/**\n * Transform text to uppercase\n */\nfunction transformText(text: string, options: UppercaseOptions): string {\n\tif (!text) return text\n\n\tif (options.first) {\n\t\treturn text.charAt(0).toUpperCase() + text.slice(1)\n\t}\n\n\treturn text.toUpperCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: UppercaseBinding | undefined): UppercaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { first: false, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { first: false, onInput: false }\n\t}\n\n\treturn {\n\t\tfirst: binding.first ?? false,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-uppercase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Transform all characters to uppercase -->\n * <input v-uppercase v-model=\"text\" />\n *\n * <!-- Transform only first character -->\n * <span v-uppercase=\"{ first: true }\">{{ text }}</span>\n * </template>\n * ```\n */\nexport const vUppercase = defineDirective<UppercaseBinding, HTMLElement>({\n\tname: 'uppercase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => transformText(text, options))\n\n\t\t\t;(el as any).__uppercaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = transformText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__uppercaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__uppercaseCleanup\n\t},\n})\n\nexport default vUppercase\n","import { defineDirective } from '@directix/core'\n\n/**\n * Virtual list item size function\n */\nexport type ItemSizeFunction = (index: number) => number\n\n/**\n * Virtual list render function\n */\nexport type VirtualListRenderFunction = (item: any, index: number) => string\n\n/**\n * Virtual list directive options\n */\nexport interface VirtualListOptions<T = any> {\n\t/**\n\t * Array of items to render\n\t * @required\n\t */\n\titems: T[]\n\n\t/**\n\t * Height of each item (in pixels)\n\t * Can be a fixed number or a function\n\t * @default 50\n\t */\n\titemSize?: number | ItemSizeFunction\n\n\t/**\n\t * Height of the container (in pixels)\n\t * @default 400\n\t */\n\theight?: number | string\n\n\t/**\n\t * Number of extra items to render above/below visible area\n\t * @default 3\n\t */\n\toverscan?: number\n\n\t/**\n\t * Custom render function\n\t */\n\trender?: VirtualListRenderFunction\n\n\t/**\n\t * Key field name for items\n\t * @default 'id'\n\t */\n\tkeyField?: string\n\n\t/**\n\t * Callback when scroll position changes\n\t */\n\tonScroll?: (scrollTop: number) => void\n\n\t/**\n\t * Callback when visible range changes\n\t */\n\tonVisibleChange?: (startIndex: number, endIndex: number) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type VirtualListBinding<T = any> = VirtualListOptions<T> | T[]\n\n/**\n * Element state storage\n */\ninterface VirtualListState {\n\toptions: VirtualListOptions\n\tcontainerEl: HTMLElement | null\n\tcontentEl: HTMLElement | null\n\tscrollHandler: ((event: Event) => void) | null\n\tresizeObserver: ResizeObserver | null\n\tstartIndex: number\n\tendIndex: number\n\tvisibleItems: any[]\n}\n\n/**\n * Get item height\n */\nfunction getItemSize(options: VirtualListOptions, index: number): number {\n\tif (typeof options.itemSize === 'function') {\n\t\treturn options.itemSize(index)\n\t}\n\treturn options.itemSize || 50\n}\n\n/**\n * Calculate total height\n */\nfunction calculateTotalHeight(options: VirtualListOptions): number {\n\tif (typeof options.itemSize === 'function') {\n\t\tlet total = 0\n\t\tfor (let i = 0; i < options.items.length; i++) {\n\t\t\ttotal += options.itemSize(i)\n\t\t}\n\t\treturn total\n\t}\n\treturn (options.itemSize || 50) * options.items.length\n}\n\n/**\n * Calculate visible range\n */\nfunction calculateVisibleRange(\n\tscrollTop: number,\n\tcontainerHeight: number,\n\toptions: VirtualListOptions,\n): { startIndex: number, endIndex: number, offsetY: number } {\n\tconst items = options.items\n\tconst itemSize = options.itemSize || 50\n\tconst overscan = options.overscan || 3\n\n\tlet startIndex = 0,\n\t\tendIndex = 0,\n\t\toffsetY = 0\n\n\tif (typeof itemSize === 'function') {\n\t\t// Variable size items\n\t\tlet currentOffset = 0\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst size = itemSize(i)\n\t\t\tif (currentOffset + size > scrollTop) {\n\t\t\t\tstartIndex = i\n\t\t\t\toffsetY = currentOffset\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcurrentOffset += size\n\t\t}\n\n\t\t// Find end index\n\t\tendIndex = startIndex\n\t\tcurrentOffset = offsetY\n\t\twhile (endIndex < items.length && currentOffset < scrollTop + containerHeight) {\n\t\t\tcurrentOffset += itemSize(endIndex)\n\t\t\tendIndex++\n\t\t}\n\n\t\t// Add overscan\n\t\tstartIndex = Math.max(0, startIndex - overscan)\n\t\tendIndex = Math.min(items.length, endIndex + overscan)\n\n\t\t// Recalculate offset for overscan\n\t\tcurrentOffset = 0\n\t\tfor (let i = 0; i < startIndex; i++) {\n\t\t\tcurrentOffset += itemSize(i)\n\t\t}\n\t\toffsetY = currentOffset\n\n\t\treturn { startIndex, endIndex, offsetY }\n\t}\n\n\t// Fixed size items\n\tstartIndex = Math.max(0, Math.floor(scrollTop / itemSize) - overscan)\n\tendIndex = Math.min(items.length, Math.ceil((scrollTop + containerHeight) / itemSize) + overscan)\n\toffsetY = startIndex * itemSize\n\n\treturn { startIndex, endIndex, offsetY }\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions<T>(binding: VirtualListBinding<T>): VirtualListOptions<T> {\n\tif (Array.isArray(binding)) {\n\t\treturn {\n\t\t\titems: binding,\n\t\t\titemSize: 50,\n\t\t\theight: 400,\n\t\t\toverscan: 3,\n\t\t\tkeyField: 'id',\n\t\t}\n\t}\n\n\treturn {\n\t\titems: binding.items,\n\t\titemSize: binding.itemSize ?? 50,\n\t\theight: binding.height ?? 400,\n\t\toverscan: binding.overscan ?? 3,\n\t\trender: binding.render,\n\t\tkeyField: binding.keyField ?? 'id',\n\t\tonScroll: binding.onScroll,\n\t\tonVisibleChange: binding.onVisibleChange,\n\t}\n}\n\n/**\n * Create item element\n */\nfunction createItemElement(\n\titem: any,\n\tindex: number,\n\toptions: VirtualListOptions,\n): HTMLElement {\n\tconst el = document.createElement('div')\n\tel.className = 'v-virtual-list__item'\n\tel.dataset.index = String(index)\n\n\t// Get item key\n\tconst keyField = options.keyField || 'id'\n\tif (typeof item === 'object' && item !== null && keyField in item) {\n\t\tel.dataset.key = String(item[keyField])\n\t}\n\n\t// Set height\n\tconst height = getItemSize(options, index)\n\tel.style.height = `${height}px`\n\tel.style.boxSizing = 'border-box'\n\n\t// Render content\n\tif (options.render) {\n\t\tel.innerHTML = options.render(item, index)\n\t} else {\n\t\tel.textContent = typeof item === 'object' ? JSON.stringify(item) : String(item)\n\t}\n\n\treturn el\n}\n\n/**\n * v-virtual-list directive\n *\n * Renders a large list efficiently using virtualization.\n *\n * @example\n * ```vue\n * <template>\n * <div v-virtual-list=\"{ items: largeList, itemSize: 50 }\"></div>\n *\n * <div v-virtual-list=\"{\n * items: largeList,\n * itemSize: (index) => index % 10 === 0 ? 100 : 50,\n * height: 600,\n * overscan: 5,\n * render: (item, index) => `<div class=\"item\">${item.name}</div>`\n * }\"></div>\n * </template>\n * ```\n */\nexport const vVirtualList = defineDirective<VirtualListBinding, HTMLElement>({\n\tname: 'virtual-list',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Setup container\n\t\tel.classList.add('v-virtual-list')\n\t\tel.style.height = typeof options.height === 'number' ? `${options.height}px` : options.height as string\n\t\tel.style.overflow = 'auto'\n\t\tel.style.position = 'relative'\n\n\t\t// Create content wrapper\n\t\tconst contentEl = document.createElement('div')\n\t\tcontentEl.className = 'v-virtual-list__content'\n\t\tcontentEl.style.position = 'relative'\n\t\tcontentEl.style.height = `${calculateTotalHeight(options)}px`\n\t\tel.appendChild(contentEl)\n\n\t\t// Create visible items wrapper\n\t\tconst visibleEl = document.createElement('div')\n\t\tvisibleEl.className = 'v-virtual-list__visible'\n\t\tvisibleEl.style.position = 'absolute'\n\t\tvisibleEl.style.top = '0'\n\t\tvisibleEl.style.left = '0'\n\t\tvisibleEl.style.right = '0'\n\t\tcontentEl.appendChild(visibleEl)\n\n\t\tconst state: VirtualListState = {\n\t\t\toptions,\n\t\t\tcontainerEl: el,\n\t\t\tcontentEl,\n\t\t\tscrollHandler: null,\n\t\t\tresizeObserver: null,\n\t\t\tstartIndex: 0,\n\t\t\tendIndex: 0,\n\t\t\tvisibleItems: [],\n\t\t}\n\n\t\t;(el as any).__virtualList = state\n\n\t\t// Create scroll handler\n\t\tconst scrollHandler = (_event: Event): void => {\n\t\t\tconst scrollTop = el.scrollTop\n\t\t\tconst containerHeight = el.clientHeight\n\n\t\t\t// Calculate visible range\n\t\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(\n\t\t\t\tscrollTop,\n\t\t\t\tcontainerHeight,\n\t\t\t\tstate.options,\n\t\t\t)\n\n\t\t\t// Check if range changed\n\t\t\tif (startIndex !== state.startIndex || endIndex !== state.endIndex) {\n\t\t\t\tstate.startIndex = startIndex\n\t\t\t\tstate.endIndex = endIndex\n\n\t\t\t\t// Render visible items\n\t\t\t\trenderVisibleItems(visibleEl, state, offsetY)\n\n\t\t\t\t// Callback\n\t\t\t\tif (state.options.onVisibleChange) {\n\t\t\t\t\tstate.options.onVisibleChange(startIndex, endIndex)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Scroll callback\n\t\t\tif (state.options.onScroll) {\n\t\t\t\tstate.options.onScroll(scrollTop)\n\t\t\t}\n\t\t}\n\n\t\tstate.scrollHandler = scrollHandler\n\t\tel.addEventListener('scroll', scrollHandler, { passive: true })\n\n\t\t// Initial render\n\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(0, el.clientHeight, options)\n\t\tstate.startIndex = startIndex\n\t\tstate.endIndex = endIndex\n\t\trenderVisibleItems(visibleEl, state, offsetY)\n\n\t\t// Setup resize observer\n\t\tif (typeof ResizeObserver !== 'undefined') {\n\t\t\tconst resizeObserver = new ResizeObserver(() => {\n\t\t\t\t// Recalculate on resize\n\t\t\t\tscrollHandler(new Event('scroll'))\n\t\t\t})\n\t\t\tresizeObserver.observe(el)\n\t\t\tstate.resizeObserver = resizeObserver\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: VirtualListState = (el as any).__virtualList\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tstate.options = newOptions\n\n\t\t// Update content height\n\t\tif (state.contentEl) {\n\t\t\tstate.contentEl.style.height = `${calculateTotalHeight(newOptions)}px`\n\t\t}\n\n\t\t// Force re-render\n\t\tconst scrollTop = el.scrollTop\n\t\tconst containerHeight = el.clientHeight\n\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(\n\t\t\tscrollTop,\n\t\t\tcontainerHeight,\n\t\t\tnewOptions,\n\t\t)\n\t\tstate.startIndex = startIndex\n\t\tstate.endIndex = endIndex\n\n\t\tconst visibleEl = state.contentEl?.querySelector('.v-virtual-list__visible') as HTMLElement\n\t\tif (visibleEl) {\n\t\t\trenderVisibleItems(visibleEl, state, offsetY)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: VirtualListState | undefined = (el as any).__virtualList\n\n\t\tif (!state) return\n\n\t\tif (state.scrollHandler) {\n\t\t\tel.removeEventListener('scroll', state.scrollHandler)\n\t\t}\n\n\t\tif (state.resizeObserver) {\n\t\t\tstate.resizeObserver.disconnect()\n\t\t}\n\n\t\tdelete (el as any).__virtualList\n\t},\n})\n\n/**\n * Render visible items\n */\nfunction renderVisibleItems(\n\tvisibleEl: HTMLElement,\n\tstate: VirtualListState,\n\toffsetY: number,\n): void {\n\tconst { options, startIndex, endIndex } = state\n\n\t// Set transform\n\tvisibleEl.style.transform = `translateY(${offsetY}px)`\n\n\t// Clear existing items\n\tvisibleEl.innerHTML = ''\n\n\t// Render items\n\tfor (let i = startIndex; i < endIndex; i++) {\n\t\tconst item = options.items[i]\n\t\tif (item !== undefined) {\n\t\t\tconst itemEl = createItemElement(item, i, options)\n\t\t\tvisibleEl.appendChild(itemEl)\n\t\t}\n\t}\n}\n\nexport default vVirtualList\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Visible change handler\n */\nexport type VisibleHandler = (isVisible: boolean) => void\n\n/**\n * Visible directive options\n */\nexport interface VisibleOptions {\n\t/**\n\t * Callback when visibility changes\n\t */\n\thandler?: VisibleHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to set visibility: hidden instead of display: none\n\t * @default false\n\t */\n\tuseHidden?: boolean\n\n\t/**\n\t * Initial visibility\n\t * @default true\n\t */\n\tinitial?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type VisibleBinding = boolean | VisibleOptions\n\n/**\n * Element state storage\n */\ninterface VisibleState {\n\toptions: VisibleOptions\n\tisVisible: boolean\n\toriginalDisplay: string\n\toriginalVisibility: string\n\ttransitionEndHandler: (e: TransitionEvent) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: VisibleBinding | undefined): VisibleOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { initial: binding }\n\t}\n\n\treturn {\n\t\tinitial: true,\n\t\tdisabled: false,\n\t\tuseHidden: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-visible directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-visible=\"showElement\">Show/Hide</div>\n * <div v-visible=\"{ handler: onVisibleChange }\">Track visibility</div>\n * <div v-visible=\"{ useHidden: true, initial: false }\">Uses visibility: hidden</div>\n * </template>\n * ```\n */\nexport const vVisible = defineDirective<VisibleBinding, HTMLElement>({\n\tname: 'visible',\n\tssr: true, // SSR safe - will set initial visibility on server\n\tdefaults: {\n\t\tinitial: true,\n\t\tdisabled: false,\n\t\tuseHidden: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Store original styles\n\t\tconst originalDisplay = el.style.display\n\t\tconst originalVisibility = el.style.visibility\n\n\t\tconst state: VisibleState = {\n\t\t\toptions,\n\t\t\tisVisible: options.initial ?? true,\n\t\t\toriginalDisplay,\n\t\t\toriginalVisibility,\n\t\t\ttransitionEndHandler: (e: TransitionEvent) => {\n\t\t\t\t// Handle transition end for animations\n\t\t\t\tif (e.propertyName === 'opacity' || e.propertyName === 'visibility') {\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('visible:transition-end', {\n\t\t\t\t\t\tdetail: { isVisible: state.isVisible },\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__visible = state\n\n\t\t// Add transition listener\n\t\ton(el, 'transitionend', state.transitionEndHandler as (e: Event) => void)\n\n\t\t// Apply initial visibility\n\t\tapplyVisibility(el, state, options.initial ?? true)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: VisibleState = (el as any).__visible\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Determine new visibility\n\t\tlet newVisibility: boolean\n\n\t\tif (typeof binding.value === 'boolean') {\n\t\t\tnewVisibility = binding.value\n\t\t} else {\n\t\t\tnewVisibility = newOptions.initial ?? true\n\t\t}\n\n\t\t// Update if changed\n\t\tif (state.isVisible !== newVisibility) {\n\t\t\tapplyVisibility(el, state, newVisibility)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: VisibleState = (el as any).__visible\n\n\t\tif (!state) return\n\n\t\t// Remove transition listener\n\t\toff(el, 'transitionend', state.transitionEndHandler as (e: Event) => void)\n\n\t\t// Restore original styles\n\t\tel.style.display = state.originalDisplay\n\t\tel.style.visibility = state.originalVisibility\n\n\t\tdelete (el as any).__visible\n\t},\n})\n\n/**\n * Apply visibility to element\n */\nfunction applyVisibility(el: HTMLElement, state: VisibleState, isVisible: boolean): void {\n\tconst previousVisibility = state.isVisible\n\n\tstate.isVisible = isVisible\n\n\t// Add/remove class first (for CSS transitions)\n\tif (isVisible) {\n\t\tel.classList.remove('v-hidden')\n\t\tel.classList.add('v-visible')\n\t} else {\n\t\tel.classList.remove('v-visible')\n\t\tel.classList.add('v-hidden')\n\t}\n\n\tif (state.options.useHidden) {\n\t\t// Use visibility: hidden with animation support\n\t\tif (isVisible) {\n\t\t\t// Show: set visibility first, then animate\n\t\t\tel.style.visibility = state.originalVisibility || 'visible'\n\t\t} else {\n\t\t\t// Hide: wait for transition, then set hidden\n\t\t\tconst computedStyle = getComputedStyle(el)\n\t\t\tconst hasTransition = computedStyle.transitionDuration !== '0s'\n\n\t\t\tif (hasTransition) {\n\t\t\t\t// Wait for transition to complete\n\t\t\t\tconst handleTransitionEnd = (e: TransitionEvent): void => {\n\t\t\t\t\tif (e.target === el && (e.propertyName === 'opacity' || e.propertyName === 'transform')) {\n\t\t\t\t\t\tif (!state.isVisible) {\n\t\t\t\t\t\t\tel.style.visibility = 'hidden'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tel.removeEventListener('transitionend', handleTransitionEnd)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tel.addEventListener('transitionend', handleTransitionEnd)\n\t\t\t} else {\n\t\t\t\tel.style.visibility = 'hidden'\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Use display: none (no animation support)\n\t\tel.style.display = isVisible ? state.originalDisplay : 'none'\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('visible:change', {\n\t\tdetail: { isVisible, previousVisibility },\n\t}))\n\n\t// Trigger handler\n\tif (state.options.handler && previousVisibility !== isVisible) {\n\t\tstate.options.handler(isVisible)\n\t}\n}\n\nexport default vVisible\n","import { defineDirective } from '@directix/core'\n\n/**\n * Watermark options\n */\nexport interface WatermarkOptions {\n\t/**\n\t * Watermark text content\n\t * @required\n\t */\n\tcontent: string | string[]\n\n\t/**\n\t * Width of watermark canvas\n\t * @default 300\n\t */\n\twidth?: number\n\n\t/**\n\t * Height of watermark canvas\n\t * @default 200\n\t */\n\theight?: number\n\n\t/**\n\t * Rotation angle in degrees\n\t * @default -22\n\t */\n\trotate?: number\n\n\t/**\n\t * Font size in pixels\n\t * @default 16\n\t */\n\tfontSize?: number\n\n\t/**\n\t * Font family\n\t * @default 'sans-serif'\n\t */\n\tfontFamily?: string\n\n\t/**\n\t * Font weight\n\t * @default 'normal'\n\t */\n\tfontWeight?: string | number\n\n\t/**\n\t * Font color\n\t * @default 'rgba(128, 128, 128, 0.15)'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Gap between watermarks in pixels\n\t * @default [100, 100]\n\t */\n\tgap?: [number, number] | number\n\n\t/**\n\t * Z-index of watermark layer\n\t * @default 9999\n\t */\n\tzIndex?: number\n\n\t/**\n\t * Whether to disable watermark (for dynamic control)\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to prevent removal attempts\n\t * @default true\n\t */\n\tprotect?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type WatermarkBinding = string | WatermarkOptions\n\n/**\n * Element state storage\n */\ninterface WatermarkState {\n\toptions: WatermarkOptions\n\twatermarkEl: HTMLDivElement | null\n\tobserver: MutationObserver | null\n\tcanvas: HTMLCanvasElement | null\n}\n\n/**\n * Create watermark canvas\n */\nfunction createWatermarkCanvas(options: WatermarkOptions): HTMLCanvasElement {\n\tconst canvas = document.createElement('canvas')\n\tconst ctx = canvas.getContext('2d')\n\n\tif (!ctx) {\n\t\tthrow new Error('[Directix] v-watermark: Could not get canvas context')\n\t}\n\n\tconst width = options.width || 300\n\tconst height = options.height || 200\n\tconst fontSize = options.fontSize || 16\n\tconst fontFamily = options.fontFamily || 'sans-serif'\n\tconst fontWeight = options.fontWeight || 'normal'\n\tconst color = options.color || 'rgba(128, 128, 128, 0.15)'\n\tconst rotate = options.rotate ?? -22\n\n\tcanvas.width = width\n\tcanvas.height = height\n\n\tctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`\n\tctx.fillStyle = color\n\tctx.textAlign = 'center'\n\tctx.textBaseline = 'middle'\n\n\t// Rotate canvas\n\tctx.translate(width / 2, height / 2)\n\tctx.rotate((rotate * Math.PI) / 180)\n\n\t// Draw text\n\tconst content = Array.isArray(options.content) ? options.content : [options.content]\n\tconst lineHeight = fontSize * 1.5\n\tconst startY = -((content.length - 1) * lineHeight) / 2\n\n\tcontent.forEach((text, index) => {\n\t\tctx.fillText(text, 0, startY + index * lineHeight)\n\t})\n\n\treturn canvas\n}\n\n/**\n * Create watermark element\n */\nfunction createWatermarkElement(canvas: HTMLCanvasElement, options: WatermarkOptions): HTMLDivElement {\n\tconst gap = Array.isArray(options.gap) ? options.gap : [options.gap || 100, options.gap || 100]\n\tconst zIndex = options.zIndex ?? 9999\n\n\tconst el = document.createElement('div')\n\tel.className = 'v-watermark'\n\tel.style.cssText = `\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tpointer-events: none;\n\t\tz-index: ${zIndex};\n\t\tbackground-image: url(\"${canvas.toDataURL()}\");\n\t\tbackground-repeat: repeat;\n\t\tbackground-position: ${gap[0] / 2}px ${gap[1] / 2}px;\n\t\tbackground-size: ${canvas.width + gap[0]}px ${canvas.height + gap[1]}px;\n\t`\n\n\treturn el\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: WatermarkBinding): WatermarkOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { content: binding }\n\t}\n\n\treturn {\n\t\tcontent: binding.content,\n\t\twidth: binding.width ?? 300,\n\t\theight: binding.height ?? 200,\n\t\trotate: binding.rotate ?? -22,\n\t\tfontSize: binding.fontSize ?? 16,\n\t\tfontFamily: binding.fontFamily ?? 'sans-serif',\n\t\tfontWeight: binding.fontWeight ?? 'normal',\n\t\tcolor: binding.color ?? 'rgba(128, 128, 128, 0.15)',\n\t\tgap: binding.gap ?? [100, 100],\n\t\tzIndex: binding.zIndex ?? 9999,\n\t\tdisabled: binding.disabled ?? false,\n\t\tprotect: binding.protect ?? true,\n\t}\n}\n\n/**\n * v-watermark directive\n *\n * Adds a watermark layer to an element.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple watermark -->\n * <div v-watermark=\"'Confidential'\">Protected content</div>\n *\n * <!-- Multi-line watermark -->\n * <div v-watermark=\"{ content: ['Company Name', 'User: John'] }\">\n * Protected content\n * </div>\n *\n * <!-- Customized watermark -->\n * <div v-watermark=\"{\n * content: 'DRAFT',\n * fontSize: 24,\n * color: 'rgba(255, 0, 0, 0.2)',\n * rotate: -30,\n * gap: 50\n * }\">\n * Draft document\n * </div>\n * </template>\n * ```\n */\nexport const vWatermark = defineDirective<WatermarkBinding, HTMLElement>({\n\tname: 'watermark',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Make sure element has position\n\t\tconst computedStyle = getComputedStyle(el)\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\tconst state: WatermarkState = {\n\t\t\toptions,\n\t\t\twatermarkEl: null,\n\t\t\tobserver: null,\n\t\t\tcanvas: null,\n\t\t}\n\n\t\t;(el as any).__watermark = state\n\n\t\tif (!options.disabled) {\n\t\t\tapplyWatermark(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: WatermarkState = (el as any).__watermark\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Check if disabled state changed\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disable: remove watermark\n\t\t\tremoveWatermark(state)\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Enable: add watermark\n\t\t\tstate.options = newOptions\n\t\t\tapplyWatermark(el, state)\n\t\t} else if (!newOptions.disabled) {\n\t\t\t// Update watermark\n\t\t\tstate.options = newOptions\n\t\t\tremoveWatermark(state)\n\t\t\tapplyWatermark(el, state)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: WatermarkState | undefined = (el as any).__watermark\n\n\t\tif (!state) return\n\n\t\tremoveWatermark(state)\n\n\t\tdelete (el as any).__watermark\n\t},\n})\n\n/**\n * Apply watermark to element\n */\nfunction applyWatermark(el: HTMLElement, state: WatermarkState): void {\n\tconst options = state.options\n\n\t// Create canvas\n\tstate.canvas = createWatermarkCanvas(options)\n\n\t// Create watermark element\n\tstate.watermarkEl = createWatermarkElement(state.canvas, options)\n\n\t// Append to element\n\tel.appendChild(state.watermarkEl)\n\n\t// Set up protection observer if enabled\n\tif (options.protect) {\n\t\tsetupProtection(el, state)\n\t}\n}\n\n/**\n * Remove watermark\n */\nfunction removeWatermark(state: WatermarkState): void {\n\t// Disconnect observer\n\tif (state.observer) {\n\t\tstate.observer.disconnect()\n\t\tstate.observer = null\n\t}\n\n\t// Remove watermark element\n\tif (state.watermarkEl && state.watermarkEl.parentNode) {\n\t\tstate.watermarkEl.parentNode.removeChild(state.watermarkEl)\n\t}\n\n\tstate.watermarkEl = null\n\tstate.canvas = null\n}\n\n/**\n * Set up protection against removal\n */\nfunction setupProtection(el: HTMLElement, state: WatermarkState): void {\n\tif (typeof MutationObserver === 'undefined') return\n\n\tstate.observer = new MutationObserver(mutations => {\n\t\t// Check if watermark was removed\n\t\tif (!state.watermarkEl || !el.contains(state.watermarkEl)) {\n\t\t\t// Re-add watermark\n\t\t\tif (!state.options.disabled) {\n\t\t\t\tstate.canvas = createWatermarkCanvas(state.options)\n\t\t\t\tstate.watermarkEl = createWatermarkElement(state.canvas, state.options)\n\t\t\t\tel.appendChild(state.watermarkEl)\n\t\t\t}\n\t\t}\n\n\t\t// Check if watermark styles were modified\n\t\tfor (const mutation of mutations) {\n\t\t\tif (mutation.type === 'attributes' && mutation.target === state.watermarkEl) {\n\t\t\t\t// Restore styles\n\t\t\t\tconst gap = Array.isArray(state.options.gap) ? state.options.gap : [state.options.gap || 100, state.options.gap || 100]\n\n\t\t\t\tstate.watermarkEl.style.display = 'block'\n\t\t\t\tstate.watermarkEl.style.visibility = 'visible'\n\t\t\t\tstate.watermarkEl.style.opacity = '1'\n\t\t\t\tif (state.canvas) {\n\t\t\t\t\tstate.watermarkEl.style.backgroundImage = `url(\"${state.canvas.toDataURL()}\")`\n\t\t\t\t}\n\t\t\t\tstate.watermarkEl.style.backgroundSize = `${state.canvas!.width + gap[0]}px ${state.canvas!.height + gap[1]}px`\n\t\t\t}\n\t\t}\n\t})\n\n\tstate.observer.observe(el, {\n\t\tchildList: true,\n\t\tsubtree: true,\n\t\tattributes: true,\n\t\tattributeFilter: ['style', 'class', 'hidden'],\n\t})\n}\n\nexport default vWatermark\n","import { ref, type Ref, unref, watch } from 'vue'\n\n/**\n * Options for useCapitalcase composable\n */\nexport interface UseCapitalcaseOptions {\n\t/**\n\t * The text to capitalize\n\t */\n\ttext: string | Ref<string>\n\n\t/**\n\t * Whether to capitalize each word or just the first word\n\t * @default true\n\t */\n\tevery?: boolean | Ref<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[] | Ref<string[]>\n}\n\n/**\n * Return type for useCapitalcase composable\n */\nexport interface UseCapitalcaseReturn {\n\t/**\n\t * The capitalized text\n\t */\n\tcapitalized: Ref<string>\n\n\t/**\n\t * Original text\n\t */\n\toriginal: Ref<string>\n}\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 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 * Capitalize text based on options\n */\nfunction capitalizeText(\n\ttext: string,\n\toptions: { every?: boolean, keepLower?: string[] } = {},\n): 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 * Composable for capitalizing text\n *\n * @param options - Configuration options\n * @returns Capitalized text utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useCapitalcase } from 'directix'\n *\n * const title = ref('the quick brown fox')\n *\n * const { capitalized } = useCapitalcase({\n * text: title,\n * every: true\n * })\n * // capitalized.value = 'The Quick Brown Fox'\n * </script>\n *\n * <template>\n * <h1>{{ capitalized }}</h1>\n * </template>\n * ```\n */\nexport function useCapitalcase(options: UseCapitalcaseOptions): UseCapitalcaseReturn {\n\tconst {\n\t\ttext,\n\t\tevery = true,\n\t\tkeepLower = DEFAULT_KEEP_LOWER,\n\t} = options\n\n\t// State\n\tconst original = ref(unref(text))\n\tconst capitalized = ref('')\n\n\t/**\n\t * Calculate capitalized text\n\t */\n\tfunction calculate(): void {\n\t\tconst textValue = unref(text)\n\t\tconst everyValue = unref(every)\n\t\tconst keepLowerValue = unref(keepLower)\n\n\t\toriginal.value = textValue\n\t\tcapitalized.value = capitalizeText(textValue, {\n\t\t\tevery: everyValue,\n\t\t\tkeepLower: keepLowerValue,\n\t\t})\n\t}\n\n\t// Watch for changes\n\twatch(\n\t\t() => [unref(text), unref(every), unref(keepLower)],\n\t\t() => calculate(),\n\t\t{ immediate: true },\n\t)\n\n\treturn {\n\t\tcapitalized,\n\t\toriginal,\n\t}\n}\n\n/**\n * Utility function to capitalize text\n *\n * @param text - Text to capitalize\n * @param every - Whether to capitalize each word\n * @param keepLower - Words to keep lowercase\n * @returns Capitalized text\n *\n * @example\n * ```ts\n * import { capitalizeText } from 'directix'\n *\n * const title = capitalizeText('the quick brown fox')\n * // 'The Quick Brown Fox'\n *\n * const sentence = capitalizeText('the quick brown fox', false)\n * // 'The quick brown fox'\n * ```\n */\nexport { capitalizeText, capitalizeWord }\n\n/**\n * Create a capitalizing function with preset options\n *\n * @param options - Capitalization options\n * @returns Capitalization function\n *\n * @example\n * ```ts\n * import { createCapitalizer } from 'directix'\n *\n * const titleCase = createCapitalizer({ every: true })\n * const sentenceCase = createCapitalizer({ every: false })\n *\n * titleCase('the quick brown fox') // 'The Quick Brown Fox'\n * sentenceCase('the quick brown fox') // 'The quick brown fox'\n * ```\n */\nexport function createCapitalizer(\n\toptions: { every?: boolean, keepLower?: string[] } = {},\n): (text: string) => string {\n\treturn (text: string) => capitalizeText(text, options)\n}\n","import { onUnmounted, ref, type Ref, unref } from 'vue'\n\n/**\n * Click delay handler\n */\nexport type ClickDelayHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Options for useClickDelay composable\n */\nexport interface UseClickDelayOptions {\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 | Ref<number>\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean | Ref<boolean>\n}\n\n/**\n * Return type for useClickDelay composable\n */\nexport interface UseClickDelayReturn {\n\t/**\n\t * Whether a click is pending\n\t */\n\tisPending: Ref<boolean>\n\n\t/**\n\t * Trigger the click handler with delay protection\n\t */\n\tclick: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Manually reset the pending state\n\t */\n\treset: () => void\n\n\t/**\n\t * Cancel any pending timeout\n\t */\n\tcancel: () => void\n}\n\n/**\n * Composable for preventing repeated clicks within a delay period\n *\n * @param options - Configuration options\n * @returns Click delay utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { useClickDelay } from 'directix'\n *\n * const { click, isPending } = useClickDelay({\n * handler: async (event) => {\n * await submitForm()\n * },\n * delay: 500\n * })\n * </script>\n *\n * <template>\n * <button @click=\"click\" :disabled=\"isPending\">\n * {{ isPending ? 'Processing...' : 'Submit' }}\n * </button>\n * </template>\n * ```\n */\nexport function useClickDelay(options: UseClickDelayOptions): UseClickDelayReturn {\n\tconst {\n\t\thandler,\n\t\tdelay = 300,\n\t\tdisabled = false,\n\t} = options\n\n\t// State\n\tconst isPending = ref(false)\n\n\t// Internal state\n\tlet timeoutId: ReturnType<typeof setTimeout> | null = null\n\n\tconst getDelay = (): number => unref(delay)\n\tconst getDisabled = (): boolean => unref(disabled)\n\n\t/**\n\t * Trigger the click handler\n\t */\n\tfunction click(event: MouseEvent | TouchEvent): void {\n\t\tif (getDisabled() || isPending.value) {\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\tisPending.value = true\n\n\t\t// Call handler\n\t\thandler(event)\n\n\t\t// Set timeout to reset pending state\n\t\ttimeoutId = setTimeout(() => {\n\t\t\tisPending.value = false\n\t\t\ttimeoutId = null\n\t\t}, getDelay())\n\t}\n\n\t/**\n\t * Reset the pending state immediately\n\t */\n\tfunction reset(): void {\n\t\tif (timeoutId) {\n\t\t\tclearTimeout(timeoutId)\n\t\t\ttimeoutId = null\n\t\t}\n\t\tisPending.value = false\n\t}\n\n\t/**\n\t * Cancel any pending timeout without resetting state\n\t */\n\tfunction cancel(): void {\n\t\tif (timeoutId) {\n\t\t\tclearTimeout(timeoutId)\n\t\t\ttimeoutId = null\n\t\t}\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tcancel()\n\t})\n\n\treturn {\n\t\tisPending,\n\t\tclick,\n\t\treset,\n\t\tcancel,\n\t}\n}\n\n/**\n * Create a debounced click handler\n *\n * @param handler - Click handler\n * @param delay - Delay in milliseconds\n * @returns Debounced click handler\n *\n * @example\n * ```ts\n * import { createDelayedClick } from 'directix'\n *\n * const delayedSubmit = createDelayedClick(submitForm, 1000)\n *\n * // Use in event handler\n * button.onclick = delayedSubmit\n * ```\n */\nexport function createDelayedClick(\n\thandler: ClickDelayHandler,\n\tdelay: number = 300,\n): (event: MouseEvent | TouchEvent) => void {\n\tlet isPending = false\n\n\treturn (event: MouseEvent | TouchEvent) => {\n\t\tif (isPending) {\n\t\t\tevent.preventDefault()\n\t\t\tevent.stopPropagation()\n\t\t\treturn\n\t\t}\n\n\t\tisPending = true\n\t\thandler(event)\n\n\t\tsetTimeout(() => {\n\t\t\tisPending = false\n\t\t}, delay)\n\t}\n}\n","import { isBrowser } from '@directix/core'\nimport { getElement } from '@directix/shared'\nimport { onUnmounted, type Ref, unref } from 'vue'\n\n/**\n * Click outside handler\n */\nexport type ClickOutsideHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Options for useClickOutside composable\n */\nexport interface UseClickOutsideOptions {\n\t/**\n\t * Callback when clicking outside\n\t */\n\thandler: ClickOutsideHandler\n\n\t/**\n\t * Excluded element selectors or element references\n\t */\n\texclude?: (string | HTMLElement | (() => HTMLElement | null) | Ref<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 * 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 * Return type for useClickOutside composable\n */\nexport interface UseClickOutsideReturn {\n\t/**\n\t * Bind click outside detection to an element\n\t */\n\tbind: (element: HTMLElement) => () => void\n}\n\n/**\n * Check if click is valid (outside the element)\n */\nfunction isValidClick(\n\tel: HTMLElement,\n\tevent: Event,\n\texclude: UseClickOutsideOptions['exclude'],\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 (exclude?.length) {\n\t\tfor (const item of exclude) {\n\t\t\tconst excludeEl = typeof item === 'function' ? item() : unref(item)\n\t\t\tconst resolved = typeof excludeEl === 'string' ? getElement(excludeEl) : excludeEl\n\n\t\t\tif (resolved && (resolved === target || resolved.contains(target))) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true\n}\n\n/**\n * Composable for detecting clicks outside an element\n *\n * @param options - Configuration options\n * @returns Click outside utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useClickOutside } from 'directix'\n *\n * const dropdown = ref(null)\n * const show = ref(false)\n *\n * const { bind } = useClickOutside({\n * handler: () => show.value = false,\n * exclude: [() => triggerRef.value]\n * })\n *\n * onMounted(() => bind(dropdown.value))\n * </script>\n * ```\n */\nexport function useClickOutside(options: UseClickOutsideOptions): UseClickOutsideReturn {\n\tconst {\n\t\thandler,\n\t\texclude = [],\n\t\tcapture = true,\n\t\tevents = ['click'],\n\t\tstop = false,\n\t\tprevent = false,\n\t} = options\n\n\tlet currentElement: HTMLElement | null = null\n\tconst handlers = new Map<string, (event: Event) => void>()\n\n\tfunction createEventHandler(_eventType: string): (event: Event) => void {\n\t\treturn (event: Event) => {\n\t\t\tif (!currentElement) return\n\n\t\t\t// Check event target\n\t\t\tif (!isValidClick(currentElement, event, exclude)) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Stop propagation\n\t\t\tif (stop) {\n\t\t\t\tevent.stopPropagation()\n\t\t\t}\n\n\t\t\t// Prevent default behavior\n\t\t\tif (prevent) {\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\n\t\t\t// Call handler\n\t\t\thandler(event as MouseEvent | TouchEvent)\n\t\t}\n\t}\n\n\tfunction bind(element: HTMLElement): () => void {\n\t\tif (!isBrowser()) return () => {}\n\n\t\t// Cleanup previous binding\n\t\tunbind()\n\n\t\tcurrentElement = element\n\n\t\t// Bind events\n\t\tevents.forEach(eventType => {\n\t\t\tconst eventHandler = createEventHandler(eventType)\n\t\t\thandlers.set(eventType, eventHandler)\n\n\t\t\tdocument.addEventListener(eventType, eventHandler, {\n\t\t\t\tcapture,\n\t\t\t\tpassive: !prevent,\n\t\t\t})\n\t\t})\n\n\t\t// Return unbind function\n\t\treturn unbind\n\t}\n\n\tfunction unbind(): void {\n\t\thandlers.forEach((eventHandler, eventType) => {\n\t\t\tdocument.removeEventListener(eventType, eventHandler, { capture })\n\t\t})\n\t\thandlers.clear()\n\t\tcurrentElement = null\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tunbind()\n\t})\n\n\treturn {\n\t\tbind,\n\t}\n}\n","import { isBrowser, supportsClipboard } from '@directix/core'\nimport { readonly, ref, type Ref, unref } from 'vue'\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\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\tif (!isBrowser()) return false\n\n\t// Create temporary textarea\n\tconst textarea = document.createElement('textarea')\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\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 * Options for useCopy composable\n */\nexport interface UseCopyOptions {\n\t/**\n\t * Source text to copy (can be reactive)\n\t */\n\tsource?: string | Ref<string>\n\n\t/**\n\t * Callback on copy success\n\t */\n\tonSuccess?: (text: string) => void\n\n\t/**\n\t * Callback on copy error\n\t */\n\tonError?: (error: Error) => void\n\n\t/**\n\t * Time in ms to reset copied state\n\t * @default 1500\n\t */\n\tcopiedTimeout?: number\n}\n\n/**\n * Return type for useCopy composable\n */\nexport interface UseCopyReturn {\n\t/**\n\t * Copy function\n\t * @param text - Optional text to copy (overrides source)\n\t */\n\tcopy: (text?: string) => Promise<boolean>\n\n\t/**\n\t * Whether the last copy was successful\n\t */\n\tcopied: Readonly<Ref<boolean>>\n\n\t/**\n\t * Error from the last copy attempt\n\t */\n\terror: Readonly<Ref<Error | null>>\n\n\t/**\n\t * Whether clipboard API is supported\n\t */\n\tisSupported: boolean\n}\n\n/**\n * Composable for copying text to clipboard\n *\n * @param options - Configuration options\n * @returns Copy utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { useCopy } from 'directix'\n *\n * const text = ref('Hello World')\n * const { copy, copied, isSupported } = useCopy({ source: text })\n *\n * // Or use with inline text\n * const { copy } = useCopy()\n *\n * async function handleCopy() {\n * await copy('Custom text')\n * }\n * </script>\n *\n * <template>\n * <button @click=\"copy()\" :disabled=\"!isSupported\">\n * {{ copied ? 'Copied!' : 'Copy' }}\n * </button>\n * </template>\n * ```\n */\nexport function useCopy(options: UseCopyOptions = {}): UseCopyReturn {\n\tconst {\n\t\tsource,\n\t\tonSuccess,\n\t\tonError,\n\t\tcopiedTimeout = 1500,\n\t} = options\n\n\tconst copied = ref(false)\n\tconst error = ref<Error | null>(null)\n\tconst isSupported = supportsClipboard() || isBrowser()\n\n\tlet timeoutId: ReturnType<typeof setTimeout> | null = null\n\n\tasync function copy(text?: string): Promise<boolean> {\n\t\t// Get the value to copy\n\t\tconst value = text ?? unref(source)\n\n\t\tif (!value) {\n\t\t\tconsole.warn('[Directix] useCopy: No text to copy')\n\t\t\treturn false\n\t\t}\n\n\t\t// Clear previous timeout\n\t\tif (timeoutId) {\n\t\t\tclearTimeout(timeoutId)\n\t\t\ttimeoutId = null\n\t\t}\n\n\t\terror.value = null\n\n\t\ttry {\n\t\t\tconst success = await copyToClipboard(value)\n\n\t\t\tif (success) {\n\t\t\t\tcopied.value = true\n\t\t\t\tonSuccess?.(value)\n\n\t\t\t\t// Auto-reset copied state\n\t\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\t\tcopied.value = false\n\t\t\t\t\ttimeoutId = null\n\t\t\t\t}, copiedTimeout)\n\n\t\t\t\treturn true\n\t\t\t} else {\n\t\t\t\tthrow new Error('Copy failed')\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst copyError = err as Error\n\t\t\terror.value = copyError\n\t\t\tcopied.value = false\n\t\t\tonError?.(copyError)\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn {\n\t\tcopy,\n\t\tcopied: readonly(copied),\n\t\terror: readonly(error),\n\t\tisSupported,\n\t}\n}\n","import { onUnmounted, ref, type Ref, unref, watch } from 'vue'\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 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 * Options for useCountdown composable\n */\nexport interface UseCountdownOptions {\n\t/**\n\t * Target time (Date object, timestamp, or ISO string)\n\t * @required\n\t */\n\ttarget: Date | number | string | Ref<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 | Ref<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 | Ref<number>\n\n\t/**\n\t * Whether to show milliseconds\n\t * @default false\n\t */\n\tshowMilliseconds?: boolean | Ref<boolean>\n\n\t/**\n\t * Whether to auto-start\n\t * @default true\n\t */\n\tautoStart?: boolean | Ref<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 * Return type for useCountdown composable\n */\nexport interface UseCountdownReturn {\n\t/**\n\t * Current countdown time\n\t */\n\ttime: Ref<CountdownTime>\n\n\t/**\n\t * Formatted time string\n\t */\n\tformatted: Ref<string>\n\n\t/**\n\t * Whether countdown is running\n\t */\n\trunning: Ref<boolean>\n\n\t/**\n\t * Whether countdown is paused\n\t */\n\tpaused: Ref<boolean>\n\n\t/**\n\t * Whether countdown has completed\n\t */\n\tcompleted: Ref<boolean>\n\n\t/**\n\t * Start the countdown\n\t */\n\tstart: () => void\n\n\t/**\n\t * Pause the countdown\n\t */\n\tpause: () => void\n\n\t/**\n\t * Resume the countdown\n\t */\n\tresume: () => void\n\n\t/**\n\t * Reset the countdown\n\t */\n\treset: () => void\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 * Composable for countdown timer functionality\n *\n * @param options - Configuration options\n * @returns Countdown utilities and state\n *\n * @example\n * ```vue\n * <script setup>\n * import { useCountdown } from 'directix'\n *\n * const targetDate = new Date(Date.now() + 60 * 60 * 1000) // 1 hour from now\n *\n * const { formatted, running, completed, pause, resume } = useCountdown({\n * target: targetDate,\n * format: 'hh:mm:ss',\n * onComplete: () => console.log('Done!')\n * })\n * </script>\n *\n * <template>\n * <div>\n * <p>{{ formatted }}</p>\n * <button @click=\"pause\" v-if=\"running\">Pause</button>\n * <button @click=\"resume\" v-if=\"!running && !completed\">Resume</button>\n * </div>\n * </template>\n * ```\n */\nexport function useCountdown(options: UseCountdownOptions): UseCountdownReturn {\n\tconst {\n\t\ttarget,\n\t\tformat = 'hh:mm:ss',\n\t\tonComplete,\n\t\tonTick,\n\t\tinterval = 1000,\n\t\tautoStart = true,\n\t} = options\n\n\t// State\n\tconst time = ref<CountdownTime>(calculateTime(0))\n\tconst formatted = ref<string>('')\n\tconst running = ref(false)\n\tconst paused = ref(false)\n\tconst completed = ref(false)\n\n\t// Internal state\n\tlet intervalId: ReturnType<typeof setInterval> | null = null,\n\t\ttargetTime = 0,\n\t\tremainingWhenPaused = 0\n\n\tconst getInterval = (): number => unref(interval)\n\tconst getFormat = (): string | CountdownFormatFunction => unref(format)\n\n\t/**\n\t * Update the countdown display\n\t */\n\tfunction update(): void {\n\t\tconst now = Date.now()\n\t\tconst remaining = targetTime - now\n\n\t\tif (remaining <= 0) {\n\t\t\ttime.value = calculateTime(0)\n\t\t\tformatted.value = formatTime(time.value, getFormat())\n\t\t\tcompleted.value = true\n\t\t\trunning.value = false\n\t\t\tstop()\n\n\t\t\tif (onComplete) {\n\t\t\t\tonComplete()\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\ttime.value = calculateTime(remaining)\n\t\tformatted.value = formatTime(time.value, getFormat())\n\n\t\tif (onTick) {\n\t\t\tonTick(time.value)\n\t\t}\n\t}\n\n\t/**\n\t * Start the countdown\n\t */\n\tfunction start(): void {\n\t\tif (running.value) return\n\n\t\t// Update target time from ref\n\t\ttargetTime = parseTargetTime(unref(target))\n\t\trunning.value = true\n\t\tpaused.value = false\n\t\tcompleted.value = false\n\n\t\t// Initial update\n\t\tupdate()\n\n\t\t// Start interval\n\t\tintervalId = setInterval(update, getInterval())\n\t}\n\n\t/**\n\t * Stop the countdown\n\t */\n\tfunction stop(): void {\n\t\tif (intervalId) {\n\t\t\tclearInterval(intervalId)\n\t\t\tintervalId = null\n\t\t}\n\t\trunning.value = false\n\t}\n\n\t/**\n\t * Pause the countdown\n\t */\n\tfunction pause(): void {\n\t\tif (!running.value) return\n\n\t\tremainingWhenPaused = targetTime - Date.now()\n\t\tstop()\n\t\tpaused.value = true\n\t}\n\n\t/**\n\t * Resume the countdown\n\t */\n\tfunction resume(): void {\n\t\tif (running.value || !paused.value) return\n\n\t\t// Recalculate target time from remaining time\n\t\ttargetTime = Date.now() + remainingWhenPaused\n\t\trunning.value = true\n\t\tpaused.value = false\n\n\t\t// Initial update\n\t\tupdate()\n\n\t\t// Start interval\n\t\tintervalId = setInterval(update, getInterval())\n\t}\n\n\t/**\n\t * Reset the countdown\n\t */\n\tfunction reset(): void {\n\t\tstop()\n\t\tpaused.value = false\n\t\tcompleted.value = false\n\t\tremainingWhenPaused = 0\n\t\ttime.value = calculateTime(0)\n\t\tformatted.value = formatTime(time.value, getFormat())\n\t}\n\n\t// Watch for target changes\n\twatch(\n\t\t() => unref(target),\n\t\tnewTarget => {\n\t\t\tif (running.value) {\n\t\t\t\ttargetTime = parseTargetTime(newTarget)\n\t\t\t}\n\t\t},\n\t)\n\n\t// Auto-start if enabled\n\tif (unref(autoStart)) {\n\t\tstart()\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tstop()\n\t})\n\n\treturn {\n\t\ttime,\n\t\tformatted,\n\t\trunning,\n\t\tpaused,\n\t\tcompleted,\n\t\tstart,\n\t\tpause,\n\t\tresume,\n\t\treset,\n\t}\n}\n\nexport { calculateTime, formatTime, parseTargetTime }\n","import { debounce } from '@directix/shared'\nimport { onUnmounted, type Ref, unref } from 'vue'\n\n/**\n * Options for useDebounce composable\n */\nexport interface UseDebounceOptions<T extends (...args: 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 | Ref<number>\n\n\t/**\n\t * Whether to invoke immediately before delay starts\n\t * @default false\n\t */\n\tleading?: boolean | Ref<boolean>\n\n\t/**\n\t * Whether to invoke after delay ends\n\t * @default true\n\t */\n\ttrailing?: boolean | Ref<boolean>\n}\n\n/**\n * Debounced function type for composables\n */\nexport interface ComposableDebouncedFunction<T extends (...args: any[]) => any> {\n\t/**\n\t * Call the debounced function\n\t */\n\t(...args: Parameters<T>): void\n\n\t/**\n\t * Cancel any pending execution\n\t */\n\tcancel: () => void\n\n\t/**\n\t * Immediately invoke if pending\n\t */\n\tflush: () => void\n\n\t/**\n\t * Check if there is a pending execution\n\t */\n\tpending: () => boolean\n}\n\n/**\n * Return type for useDebounce composable\n */\nexport interface UseDebounceReturn<T extends (...args: any[]) => any> {\n\t/**\n\t * Debounced function\n\t */\n\trun: (...args: Parameters<T>) => void\n\n\t/**\n\t * Cancel any pending execution\n\t */\n\tcancel: () => void\n\n\t/**\n\t * Immediately invoke if pending\n\t */\n\tflush: () => void\n\n\t/**\n\t * Check if there is a pending execution\n\t */\n\tpending: () => boolean\n}\n\n/**\n * Composable for debouncing function calls\n *\n * @param options - Configuration options\n * @returns Debounced function utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useDebounce } from 'directix'\n *\n * const searchQuery = ref('')\n *\n * const { run: debouncedSearch } = useDebounce({\n * handler: (query: string) => {\n * console.log('Searching:', query)\n * },\n * wait: 500\n * })\n *\n * // Watch and debounce\n * watch(searchQuery, (query) => {\n * debouncedSearch(query)\n * })\n * </script>\n * ```\n */\nexport function useDebounce<T extends (...args: any[]) => any>(\n\toptions: UseDebounceOptions<T>,\n): UseDebounceReturn<T> {\n\tconst {\n\t\thandler,\n\t\twait = 300,\n\t\tleading = false,\n\t\ttrailing = true,\n\t} = options\n\n\t// Internal state\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\thandler.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst getWait = (): number => unref(wait)\n\tconst getLeading = (): boolean => unref(leading)\n\tconst getTrailing = (): boolean => unref(trailing)\n\n\tfunction run(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 (getLeading() && !timerId) {\n\t\t\tinvokeFunc()\n\t\t}\n\n\t\ttimerId = setTimeout(() => {\n\t\t\tif (getTrailing()) {\n\t\t\t\tinvokeFunc()\n\t\t\t}\n\t\t\ttimerId = null\n\t\t}, getWait())\n\t}\n\n\tfunction cancel(): void {\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\tfunction flush(): void {\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\tfunction pending(): boolean {\n\t\treturn timerId !== null\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tcancel()\n\t})\n\n\treturn {\n\t\trun,\n\t\tcancel,\n\t\tflush,\n\t\tpending,\n\t}\n}\n\n/**\n * Simple debounce function wrapper\n *\n * @param fn - Function to debounce\n * @param wait - Delay in milliseconds\n * @returns Debounced function with cancel method\n *\n * @example\n * ```ts\n * import { debounceFn } from 'directix'\n *\n * const debouncedSave = debounceFn(saveData, 1000)\n *\n * // Call multiple times, only executes once after 1s\n * debouncedSave(data)\n * debouncedSave(newData)\n *\n * // Cancel pending execution\n * debouncedSave.cancel()\n * ```\n */\nexport function debounceFn<T extends (...args: any[]) => any>(\n\tfn: T,\n\twait: number = 300,\n\toptions?: {\n\t\tleading?: boolean\n\t\ttrailing?: boolean\n\t},\n): ComposableDebouncedFunction<T> {\n\treturn debounce(fn, wait, options) as ComposableDebouncedFunction<T>\n}\n","import { isBrowser } from '@directix/core'\nimport { onUnmounted, readonly, ref, type Ref, unref } from 'vue'\n\n/**\n * Draggable axis\n */\nexport type DraggableAxis = 'x' | 'y' | 'both'\n\n/**\n * Position type\n */\nexport interface Position {\n\tx: number\n\ty: number\n}\n\n/**\n * Options for useDraggable composable\n */\nexport interface UseDraggableOptions {\n\t/**\n\t * Drag axis\n\t * @default 'both'\n\t */\n\taxis?: DraggableAxis | Ref<DraggableAxis>\n\n\t/**\n\t * Constrain to parent element\n\t * @default false\n\t */\n\tconstrain?: boolean | Ref<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 * Grid snapping [x, y]\n\t */\n\tgrid?: [number, number] | Ref<[number, number]>\n\n\t/**\n\t * Whether dragging is disabled\n\t * @default false\n\t */\n\tdisabled?: boolean | Ref<boolean>\n\n\t/**\n\t * Start drag callback\n\t */\n\tonStart?: (position: Position, event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Drag callback\n\t */\n\tonDrag?: (position: Position, event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * End drag callback\n\t */\n\tonEnd?: (position: Position, event: MouseEvent | TouchEvent) => void\n}\n\n/**\n * Return type for useDraggable composable\n */\nexport interface UseDraggableReturn {\n\t/** Current position */\n\tposition: Readonly<Ref<Position>>\n\n\t/** Whether the element is being dragged */\n\tisDragging: Readonly<Ref<boolean>>\n\n\t/** Reset position to origin */\n\treset: () => void\n\n\t/** Bind draggable behavior to an element */\n\tbind: (element: HTMLElement) => () => void\n}\n\n/**\n * Get element boundary\n */\nfunction getBoundary(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 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] || (e as TouchEvent).changedTouches[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): Position {\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 * Composable for making elements draggable\n *\n * @param options - Configuration options\n * @returns Draggable utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useDraggable } from 'directix'\n *\n * const target = ref(null)\n * const { position, isDragging, bind } = useDraggable({\n * constrain: true,\n * onEnd: (pos) => console.log('Dropped at:', pos)\n * })\n *\n * onMounted(() => bind(target.value))\n * </script>\n *\n * <template>\n * <div ref=\"target\" :class=\"{ dragging: isDragging }\">\n * Drag me!\n * </div>\n * </template>\n * ```\n */\nexport function useDraggable(options: UseDraggableOptions = {}): UseDraggableReturn {\n\tconst {\n\t\taxis = 'both',\n\t\tconstrain = false,\n\t\tboundary,\n\t\thandle,\n\t\tgrid,\n\t\tdisabled = false,\n\t\tonStart,\n\t\tonDrag,\n\t\tonEnd,\n\t} = options\n\n\tconst position = ref<Position>({ x: 0, y: 0 })\n\tconst isDragging = ref(false)\n\n\tlet currentElement: HTMLElement | null = null,\n\t\thandleEl: HTMLElement | null = null,\n\t\tstartX = 0,\n\t\tstartY = 0,\n\t\toffsetX = 0,\n\t\toffsetY = 0,\n\t\tinitialLeft = 0,\n\t\tinitialTop = 0,\n\t\tboundaryWidth = 0,\n\t\tboundaryHeight = 0,\n\t\telWidth = 0,\n\t\telHeight = 0\n\n\tfunction startDrag(e: MouseEvent | TouchEvent): void {\n\t\tif (unref(disabled)) return\n\n\t\te.preventDefault()\n\n\t\tconst { clientX, clientY } = getClientCoords(e)\n\t\tisDragging.value = true\n\t\tstartX = clientX\n\t\tstartY = clientY\n\n\t\t// Get current transform offset\n\t\tconst { x, y } = parseTranslate(currentElement!.style.transform)\n\t\toffsetX = x\n\t\toffsetY = y\n\n\t\t// Store boundary info\n\t\tif (unref(constrain) || boundary) {\n\t\t\tconst boundaryRect = boundary ? getBoundary(boundary) : currentElement!.parentElement?.getBoundingClientRect()\n\n\t\t\tif (boundaryRect) {\n\t\t\t\tconst elRect = currentElement!.getBoundingClientRect()\n\t\t\t\tinitialLeft = elRect.left - boundaryRect.left\n\t\t\t\tinitialTop = elRect.top - boundaryRect.top\n\t\t\t\tboundaryWidth = boundaryRect.width\n\t\t\t\tboundaryHeight = boundaryRect.height\n\t\t\t\telWidth = elRect.width\n\t\t\t\telHeight = elRect.height\n\t\t\t}\n\t\t}\n\n\t\tcurrentElement!.classList.add('v-draggable--dragging')\n\n\t\tdocument.addEventListener('mousemove', handleDrag)\n\t\tdocument.addEventListener('mouseup', endDrag)\n\t\tdocument.addEventListener('touchmove', handleDrag, { passive: false })\n\t\tdocument.addEventListener('touchend', endDrag)\n\n\t\tonStart?.({ x: offsetX, y: offsetY }, e)\n\t}\n\n\tfunction handleDrag(e: MouseEvent | TouchEvent): void {\n\t\tif (!isDragging.value || unref(disabled)) return\n\n\t\te.preventDefault()\n\n\t\tconst { clientX, clientY } = getClientCoords(e)\n\t\tlet deltaX = clientX - startX,\n\t\t\tdeltaY = clientY - startY,\n\t\t\tnewX = offsetX + deltaX,\n\t\t\tnewY = offsetY + deltaY\n\n\t\t// Apply axis constraint\n\t\tconst currentAxis = unref(axis)\n\t\tif (currentAxis === 'x') {\n\t\t\tdeltaY = 0\n\t\t} else if (currentAxis === 'y') {\n\t\t\tdeltaX = 0\n\t\t}\n\n\t\t// Apply grid snapping\n\t\tconst currentGrid = unref(grid)\n\t\tif (currentGrid) {\n\t\t\tdeltaX = Math.round(deltaX / currentGrid[0]) * currentGrid[0]\n\t\t\tdeltaY = Math.round(deltaY / currentGrid[1]) * currentGrid[1]\n\t\t}\n\n\t\t// Apply boundary constraints\n\t\tif (unref(constrain) || boundary) {\n\t\t\tconst newLeft = initialLeft + deltaX\n\t\t\tconst newTop = initialTop + deltaY\n\t\t\tconst maxLeft = boundaryWidth - elWidth\n\t\t\tconst maxTop = boundaryHeight - elHeight\n\n\t\t\tconst constrainedLeft = Math.max(0, Math.min(newLeft, maxLeft))\n\t\t\tconst constrainedTop = Math.max(0, Math.min(newTop, maxTop))\n\n\t\t\tnewX = offsetX + (constrainedLeft - initialLeft)\n\t\t\tnewY = offsetY + (constrainedTop - initialTop)\n\t\t}\n\n\t\tcurrentElement!.style.transform = `translate(${newX}px, ${newY}px)`\n\t\tposition.value = { x: newX, y: newY }\n\n\t\tonDrag?.({ x: newX, y: newY }, e)\n\t}\n\n\tfunction endDrag(e: MouseEvent | TouchEvent): void {\n\t\tif (!isDragging.value) return\n\n\t\tisDragging.value = false\n\t\tcurrentElement?.classList.remove('v-draggable--dragging')\n\n\t\tdocument.removeEventListener('mousemove', handleDrag)\n\t\tdocument.removeEventListener('mouseup', endDrag)\n\t\tdocument.removeEventListener('touchmove', handleDrag)\n\t\tdocument.removeEventListener('touchend', endDrag)\n\n\t\tonEnd?.({ ...position.value }, e)\n\t}\n\n\tfunction reset(): void {\n\t\tif (currentElement) {\n\t\t\tcurrentElement.style.transform = 'translate(0px, 0px)'\n\t\t\tposition.value = { x: 0, y: 0 }\n\t\t}\n\t}\n\n\tfunction bind(element: HTMLElement): () => void {\n\t\tif (!isBrowser()) return () => {}\n\n\t\t// Cleanup previous\n\t\tunbind()\n\n\t\tcurrentElement = element\n\n\t\t// Make element positionable\n\t\tif (getComputedStyle(element).position === 'static') {\n\t\t\telement.style.position = 'absolute'\n\t\t}\n\n\t\t// Get handle element\n\t\thandleEl = handle ? element.querySelector(handle) : null\n\t\tconst target = handleEl || element\n\n\t\ttarget.addEventListener('mousedown', startDrag)\n\t\ttarget.addEventListener('touchstart', startDrag, { passive: false })\n\n\t\treturn unbind\n\t}\n\n\tfunction unbind(): void {\n\t\tif (currentElement) {\n\t\t\tconst target = handleEl || currentElement\n\t\t\ttarget.removeEventListener('mousedown', startDrag)\n\t\t\ttarget.removeEventListener('touchstart', startDrag)\n\t\t}\n\t\tcurrentElement = null\n\t\thandleEl = null\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tunbind()\n\t})\n\n\treturn {\n\t\tposition: readonly(position),\n\t\tisDragging: readonly(isDragging),\n\t\treset,\n\t\tbind,\n\t}\n}\n","import { onUnmounted, ref, type Ref, unref, watch } from 'vue'\n\n/**\n * Options for useEllipsis composable\n */\nexport interface UseEllipsisOptions {\n\t/**\n\t * The text to potentially truncate\n\t */\n\ttext: string | Ref<string>\n\n\t/**\n\t * Number of lines to show before truncating\n\t * @default 1\n\t */\n\tlines?: number | Ref<number>\n\n\t/**\n\t * Custom ellipsis string\n\t * @default '...'\n\t */\n\tellipsis?: string | Ref<string>\n\n\t/**\n\t * Maximum width in pixels (0 = no limit)\n\t * @default 0\n\t */\n\tmaxWidth?: number | Ref<number>\n}\n\n/**\n * Return type for useEllipsis composable\n */\nexport interface UseEllipsisReturn {\n\t/**\n\t * The truncated text\n\t */\n\ttruncated: Ref<string>\n\n\t/**\n\t * Whether the text is truncated\n\t */\n\tisTruncated: Ref<boolean>\n\n\t/**\n\t * Original text\n\t */\n\toriginal: Ref<string>\n\n\t/**\n\t * Calculate truncation for a given width\n\t */\n\tcalculateForWidth: (width: number) => string\n\n\t/**\n\t * Check if text would be truncated at given width\n\t */\n\twouldTruncate: (width: number) => boolean\n}\n\n/**\n * Measure text width using canvas\n */\nfunction measureTextWidth(text: string, fontSize: number = 14, fontFamily: string = 'sans-serif'): number {\n\tif (typeof document === 'undefined') return text.length * 8 // Fallback for SSR\n\n\tconst canvas = document.createElement('canvas')\n\tconst ctx = canvas.getContext('2d')\n\n\tif (!ctx) return text.length * 8\n\n\tctx.font = `${fontSize}px ${fontFamily}`\n\treturn ctx.measureText(text).width\n}\n\n/**\n * Truncate text to fit within a given width\n */\nfunction truncateToWidth(\n\ttext: string,\n\tmaxWidth: number,\n\tellipsis: string = '...',\n\tfontSize: number = 14,\n\tfontFamily: string = 'sans-serif',\n): string {\n\tif (maxWidth <= 0) return text\n\n\tconst textWidth = measureTextWidth(text, fontSize, fontFamily)\n\n\tif (textWidth <= maxWidth) return text\n\n\tconst ellipsisWidth = measureTextWidth(ellipsis, fontSize, fontFamily)\n\tconst availableWidth = maxWidth - ellipsisWidth\n\n\tif (availableWidth <= 0) return ellipsis\n\n\t// Binary search for the right length\n\tlet low = 0,\n\t\thigh = text.length\n\n\twhile (low < high) {\n\t\tconst mid = Math.floor((low + high + 1) / 2)\n\t\tconst truncatedText = text.slice(0, mid)\n\t\tconst truncatedWidth = measureTextWidth(truncatedText, fontSize, fontFamily)\n\n\t\tif (truncatedWidth <= availableWidth) {\n\t\t\tlow = mid\n\t\t} else {\n\t\t\thigh = mid - 1\n\t\t}\n\t}\n\n\treturn text.slice(0, low) + ellipsis\n}\n\n/**\n * Truncate text to specified number of lines\n * Note: This is an approximation; actual line breaks depend on container width\n */\nfunction truncateToLines(\n\ttext: string,\n\tlines: number,\n\tellipsis: string = '...',\n): string {\n\tif (lines <= 0) return ''\n\n\t// For multi-line truncation, we approximate by character count\n\t// In practice, this would need a DOM element for accurate measurement\n\tconst avgCharsPerLine = 80 // Approximate\n\tconst maxChars = lines * avgCharsPerLine\n\n\tif (text.length <= maxChars) return text\n\n\treturn text.slice(0, maxChars - ellipsis.length) + ellipsis\n}\n\n/**\n * Composable for text truncation with ellipsis\n *\n * @param options - Configuration options\n * @returns Truncated text utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useEllipsis } from 'directix'\n *\n * const longText = ref('This is a very long text that needs to be truncated')\n *\n * const { truncated, isTruncated } = useEllipsis({\n * text: longText,\n * maxWidth: 200,\n * lines: 1\n * })\n * </script>\n *\n * <template>\n * <span :title=\"isTruncated ? longText : ''\">\n * {{ truncated }}\n * </span>\n * </template>\n * ```\n */\nexport function useEllipsis(options: UseEllipsisOptions): UseEllipsisReturn {\n\tconst {\n\t\ttext,\n\t\tlines = 1,\n\t\tellipsis = '...',\n\t\tmaxWidth = 0,\n\t} = options\n\n\t// State\n\tconst original = ref(unref(text))\n\tconst truncated = ref('')\n\tconst isTruncated = ref(false)\n\n\t/**\n\t * Calculate truncation\n\t */\n\tfunction calculate(): void {\n\t\tconst textValue = unref(text)\n\t\tconst linesValue = unref(lines)\n\t\tconst ellipsisValue = unref(ellipsis)\n\t\tconst maxWidthValue = unref(maxWidth)\n\n\t\toriginal.value = textValue\n\n\t\tif (!textValue) {\n\t\t\ttruncated.value = ''\n\t\t\tisTruncated.value = false\n\t\t\treturn\n\t\t}\n\n\t\tif (maxWidthValue > 0) {\n\t\t\t// Truncate by width\n\t\t\tconst result = truncateToWidth(textValue, maxWidthValue, ellipsisValue)\n\t\t\ttruncated.value = result\n\t\t\tisTruncated.value = result !== textValue\n\t\t} else if (linesValue > 1) {\n\t\t\t// Truncate by lines\n\t\t\tconst result = truncateToLines(textValue, linesValue, ellipsisValue)\n\t\t\ttruncated.value = result\n\t\t\tisTruncated.value = result !== textValue\n\t\t} else {\n\t\t\t// Single line truncation (CSS should handle this)\n\t\t\ttruncated.value = textValue\n\t\t\tisTruncated.value = false\n\t\t}\n\t}\n\n\t/**\n\t * Calculate truncation for a given width\n\t */\n\tfunction calculateForWidth(width: number): string {\n\t\tconst textValue = unref(text)\n\t\tconst ellipsisValue = unref(ellipsis)\n\n\t\tif (!textValue || width <= 0) return textValue || ''\n\n\t\treturn truncateToWidth(textValue, width, ellipsisValue)\n\t}\n\n\t/**\n\t * Check if text would be truncated at given width\n\t */\n\tfunction wouldTruncate(width: number): boolean {\n\t\tconst textValue = unref(text)\n\n\t\tif (!textValue || width <= 0) return false\n\n\t\tconst textWidth = measureTextWidth(textValue)\n\t\treturn textWidth > width\n\t}\n\n\t// Watch for changes\n\twatch(\n\t\t() => [unref(text), unref(lines), unref(ellipsis), unref(maxWidth)],\n\t\t() => calculate(),\n\t\t{ immediate: true },\n\t)\n\n\t// Cleanup\n\tonUnmounted(() => {\n\t\t// Nothing to clean up\n\t})\n\n\treturn {\n\t\ttruncated,\n\t\tisTruncated,\n\t\toriginal,\n\t\tcalculateForWidth,\n\t\twouldTruncate,\n\t}\n}\n\n/**\n * Utility function to truncate text to a specified length\n *\n * @param text - Text to truncate\n * @param maxLength - Maximum length\n * @param ellipsis - Ellipsis string\n * @returns Truncated text\n *\n * @example\n * ```ts\n * import { truncateText } from 'directix'\n *\n * const short = truncateText('Very long text here', 10)\n * // 'Very l...'\n * ```\n */\nexport function truncateText(\n\ttext: string,\n\tmaxLength: number,\n\tellipsis: string = '...',\n): string {\n\tif (!text || text.length <= maxLength) return text\n\n\treturn text.slice(0, maxLength - ellipsis.length) + ellipsis\n}\n\n/**\n * Utility function to check if text would be truncated in a container\n *\n * @param text - Text to check\n * @param containerWidth - Container width in pixels\n * @param fontSize - Font size in pixels\n * @returns Whether text would be truncated\n */\nexport function wouldTextTruncate(\n\ttext: string,\n\tcontainerWidth: number,\n\tfontSize: number = 14,\n): boolean {\n\treturn measureTextWidth(text, fontSize) > containerWidth\n}\n","import { isBrowser } from '@directix/core'\nimport { onUnmounted, readonly, ref, type Ref } from 'vue'\n\n/**\n * Options for useFocus composable\n */\nexport interface UseFocusOptions {\n\t/**\n\t * Callback when element is focused\n\t */\n\tonFocus?: (event: FocusEvent) => void\n\n\t/**\n\t * Callback when element loses focus\n\t */\n\tonBlur?: (event: FocusEvent) => void\n}\n\n/**\n * Return type for useFocus composable\n */\nexport interface UseFocusReturn {\n\t/** Whether the element is currently focused */\n\tisFocused: Readonly<Ref<boolean>>\n\n\t/** Focus the element */\n\tfocus: () => void\n\n\t/** Blur the element */\n\tblur: () => void\n\n\t/** Bind focus tracking to an element */\n\tbind: (element: HTMLElement) => () => void\n}\n\nconst FOCUSABLE_TAGS = new Set(['input', 'textarea', 'select', 'button'])\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\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\n/**\n * Composable for managing element focus\n *\n * @param options - Configuration options\n * @returns Focus utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useFocus } from 'directix'\n *\n * const input = ref(null)\n * const { isFocused, focus, bind } = useFocus({\n * onBlur: () => validate()\n * })\n *\n * onMounted(() => bind(input.value))\n *\n * // Programmatically focus\n * function handleButtonClick() {\n * focus()\n * }\n * </script>\n *\n * <template>\n * <input ref=\"input\" />\n * <button @click=\"focus\">Focus Input</button>\n * </template>\n * ```\n */\nexport function useFocus(options: UseFocusOptions = {}): UseFocusReturn {\n\tconst { onFocus, onBlur } = options\n\n\tconst isFocused = ref(false)\n\n\tlet currentElement: HTMLElement | null = null,\n\t\tfocusHandler: ((e: FocusEvent) => void) | null = null,\n\t\tblurHandler: ((e: FocusEvent) => void) | null = null\n\n\tfunction focus(): void {\n\t\tif (currentElement && isFocusable(currentElement)) {\n\t\t\tcurrentElement.focus()\n\t\t}\n\t}\n\n\tfunction blur(): void {\n\t\tif (currentElement) {\n\t\t\tcurrentElement.blur()\n\t\t}\n\t}\n\n\tfunction bind(element: HTMLElement): () => void {\n\t\tif (!isBrowser()) return () => {}\n\n\t\t// Cleanup previous\n\t\tunbind()\n\n\t\tcurrentElement = element\n\n\t\tfocusHandler = (e: FocusEvent) => {\n\t\t\tisFocused.value = true\n\t\t\tonFocus?.(e)\n\t\t}\n\n\t\tblurHandler = (e: FocusEvent) => {\n\t\t\tisFocused.value = false\n\t\t\tonBlur?.(e)\n\t\t}\n\n\t\telement.addEventListener('focus', focusHandler)\n\t\telement.addEventListener('blur', blurHandler)\n\n\t\t// Check initial state\n\t\tisFocused.value = document.activeElement === element\n\n\t\treturn unbind\n\t}\n\n\tfunction unbind(): void {\n\t\tif (currentElement) {\n\t\t\tif (focusHandler) {\n\t\t\t\tcurrentElement.removeEventListener('focus', focusHandler)\n\t\t\t}\n\t\t\tif (blurHandler) {\n\t\t\t\tcurrentElement.removeEventListener('blur', blurHandler)\n\t\t\t}\n\t\t}\n\t\tcurrentElement = null\n\t\tfocusHandler = null\n\t\tblurHandler = null\n\t\tisFocused.value = false\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tunbind()\n\t})\n\n\treturn {\n\t\tisFocused: readonly(isFocused),\n\t\tfocus,\n\t\tblur,\n\t\tbind,\n\t}\n}\n","import { isBrowser } from '@directix/core'\nimport { onUnmounted, ref, type Ref, unref, watch } from 'vue'\n\n/**\n * Key alias map\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\tbackspace: 'Backspace',\n\tdelete: 'Delete',\n\tinsert: 'Insert',\n\thome: 'Home',\n\tend: 'End',\n\tpageup: 'PageUp',\n\tpagedown: 'PageDown',\n\tplus: '+',\n\tminus: '-',\n}\n\n/**\n * Modifier keys\n */\nconst MODIFIERS = new Set(['ctrl', 'alt', 'shift', 'meta'])\n\n/**\n * Hotkey definition\n */\nexport interface HotkeyDefinition {\n\t/**\n\t * Key combination (e.g., 'ctrl+s', 'alt+shift+a')\n\t */\n\tkey: string\n\n\t/**\n\t * Handler function\n\t */\n\thandler: (event: KeyboardEvent) => void\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\t/**\n\t * Whether to trigger on keyup instead of keydown\n\t * @default false\n\t */\n\tkeyup?: boolean\n\n\t/**\n\t * Whether the hotkey is disabled\n\t * @default false\n\t */\n\tdisabled?: boolean | Ref<boolean>\n}\n\n/**\n * Options for useHotkey composable\n */\nexport interface UseHotkeyOptions {\n\t/**\n\t * Single hotkey definition\n\t */\n\thotkey?: HotkeyDefinition\n\n\t/**\n\t * Multiple hotkey definitions\n\t */\n\thotkeys?: HotkeyDefinition[]\n\n\t/**\n\t * Target element to bind events (defaults to document)\n\t */\n\ttarget?: HTMLElement | Ref<HTMLElement | null>\n\n\t/**\n\t * Whether to enable the hotkey(s)\n\t * @default true\n\t */\n\tenabled?: boolean | Ref<boolean>\n}\n\n/**\n * Return type for useHotkey composable\n */\nexport interface UseHotkeyReturn {\n\t/**\n\t * Whether the hotkey is currently enabled\n\t */\n\tenabled: Ref<boolean>\n\n\t/**\n\t * Enable the hotkey\n\t */\n\tenable: () => void\n\n\t/**\n\t * Disable the hotkey\n\t */\n\tdisable: () => void\n\n\t/**\n\t * Toggle the hotkey\n\t */\n\ttoggle: () => void\n\n\t/**\n\t * Add a hotkey\n\t */\n\tadd: (hotkey: HotkeyDefinition) => void\n\n\t/**\n\t * Remove a hotkey by key\n\t */\n\tremove: (key: string) => void\n\n\t/**\n\t * Remove all hotkeys\n\t */\n\tclear: () => void\n}\n\n/**\n * Parse hotkey string into modifiers and key\n */\nfunction parseHotkey(hotkey: string): { modifiers: Set<string>, key: string } {\n\tconst parts = hotkey.toLowerCase().split('+').map(p => p.trim())\n\tconst modifiers = new Set<string>()\n\tlet key = ''\n\n\tfor (const part of parts) {\n\t\tif (MODIFIERS.has(part)) {\n\t\t\tmodifiers.add(part)\n\t\t} else {\n\t\t\tkey = KEY_ALIASES[part] || part\n\t\t}\n\t}\n\n\treturn { key, modifiers }\n}\n\n/**\n * Check if event matches hotkey\n */\nfunction matchesHotkey(event: KeyboardEvent, definition: { modifiers: Set<string>, key: string }): boolean {\n\t// Check modifiers\n\tif (definition.modifiers.has('ctrl') !== (event.ctrlKey || event.metaKey)) return false\n\tif (definition.modifiers.has('alt') !== event.altKey) return false\n\tif (definition.modifiers.has('shift') !== event.shiftKey) return false\n\tif (definition.modifiers.has('meta') !== event.metaKey) return false\n\n\t// Check key (case-insensitive)\n\tconst eventKey = event.key\n\tconst targetKey = definition.key\n\n\treturn eventKey.toLowerCase() === targetKey.toLowerCase()\n}\n\n/**\n * Composable for handling keyboard shortcuts\n *\n * @param options - Configuration options\n * @returns Hotkey utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { useHotkey } from 'directix'\n *\n * const { enable, disable, add, remove } = useHotkey({\n * hotkeys: [\n * { key: 'ctrl+s', handler: (e) => save() },\n * { key: 'ctrl+z', handler: (e) => undo() },\n * ]\n * })\n *\n * // Add dynamic hotkey\n * add({ key: 'esc', handler: (e) => closeModal() })\n * </script>\n * ```\n */\nexport function useHotkey(options: UseHotkeyOptions = {}): UseHotkeyReturn {\n\tconst {\n\t\thotkey,\n\t\thotkeys = [],\n\t\ttarget,\n\t\tenabled: initialEnabled = true,\n\t} = options\n\n\tconst enabled = ref(unref(initialEnabled))\n\tconst hotkeyMap = new Map<string, HotkeyDefinition[]>()\n\n\tlet currentTarget: HTMLElement | Document | null = null,\n\t\tkeydownHandler: ((e: KeyboardEvent) => void) | null = null,\n\t\tkeyupHandler: ((e: KeyboardEvent) => void) | null = null\n\n\t// Initialize hotkeys\n\tif (hotkey) {\n\t\taddHotkey(hotkey)\n\t}\n\thotkeys.forEach(addHotkey)\n\n\tfunction addHotkey(def: HotkeyDefinition): void {\n\t\t// Parse the hotkey to get the actual key (without modifiers)\n\t\tconst parsed = parseHotkey(def.key)\n\t\tconst key = parsed.key.toLowerCase()\n\t\tif (!hotkeyMap.has(key)) {\n\t\t\thotkeyMap.set(key, [])\n\t\t}\n\t\thotkeyMap.get(key)!.push(def)\n\t}\n\n\tfunction removeHotkey(key: string): void {\n\t\thotkeyMap.delete(key.toLowerCase())\n\t}\n\n\tfunction clearHotkeys(): void {\n\t\thotkeyMap.clear()\n\t}\n\n\tfunction handleKeyEvent(event: KeyboardEvent, isKeyup: boolean): void {\n\t\tif (!enabled.value) return\n\n\t\tconst key = event.key.toLowerCase()\n\t\tconst definitions = hotkeyMap.get(key)\n\n\t\tif (!definitions) return\n\n\t\tfor (const def of definitions) {\n\t\t\t// Check disabled\n\t\t\tif (unref(def.disabled)) continue\n\n\t\t\t// Check keyup/keydown\n\t\t\tif (!!def.keyup !== isKeyup) continue\n\n\t\t\t// Parse and match\n\t\t\tconst parsed = parseHotkey(def.key)\n\t\t\tif (matchesHotkey(event, parsed)) {\n\t\t\t\tif (def.prevent !== false) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t}\n\t\t\t\tif (def.stop) {\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t}\n\t\t\t\tdef.handler(event)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction bind(): void {\n\t\tif (!isBrowser()) return\n\n\t\tunbind()\n\n\t\tcurrentTarget = target ? unref(target) : document\n\n\t\tkeydownHandler = (e: KeyboardEvent) => handleKeyEvent(e, false)\n\t\tkeyupHandler = (e: KeyboardEvent) => handleKeyEvent(e, true)\n\n\t\tcurrentTarget?.addEventListener('keydown', keydownHandler as (e: Event) => void)\n\t\tcurrentTarget?.addEventListener('keyup', keyupHandler as (e: Event) => void)\n\t}\n\n\tfunction unbind(): void {\n\t\tif (currentTarget) {\n\t\t\tif (keydownHandler) {\n\t\t\t\tcurrentTarget.removeEventListener('keydown', keydownHandler as (e: Event) => void)\n\t\t\t}\n\t\t\tif (keyupHandler) {\n\t\t\t\tcurrentTarget.removeEventListener('keyup', keyupHandler as (e: Event) => void)\n\t\t\t}\n\t\t}\n\t\tcurrentTarget = null\n\t\tkeydownHandler = null\n\t\tkeyupHandler = null\n\t}\n\n\tfunction enable(): void {\n\t\tenabled.value = true\n\t}\n\n\tfunction disable(): void {\n\t\tenabled.value = false\n\t}\n\n\tfunction toggle(): void {\n\t\tenabled.value = !enabled.value\n\t}\n\n\t// Watch for enabled changes\n\twatch(enabled, newEnabled => {\n\t\tif (newEnabled) {\n\t\t\tbind()\n\t\t} else {\n\t\t\tunbind()\n\t\t}\n\t})\n\n\t// Watch for target changes\n\tif (target && typeof target === 'object' && 'value' in target) {\n\t\twatch(target, () => {\n\t\t\tif (enabled.value) {\n\t\t\t\tbind()\n\t\t\t}\n\t\t})\n\t}\n\n\t// Initial bind\n\tif (enabled.value) {\n\t\tbind()\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tunbind()\n\t})\n\n\treturn {\n\t\tenabled,\n\t\tenable,\n\t\tdisable,\n\t\ttoggle,\n\t\tadd: addHotkey,\n\t\tremove: removeHotkey,\n\t\tclear: clearHotkeys,\n\t}\n}\n","import { isBrowser } from '@directix/core'\nimport { onUnmounted, ref, type Ref, unref } from 'vue'\n\n/**\n * Options for useHover composable\n */\nexport interface UseHoverOptions {\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 */\n\tclass?: string\n\n\t/**\n\t * Delay in milliseconds before triggering enter\n\t * @default 0\n\t */\n\tenterDelay?: number | Ref<number>\n\n\t/**\n\t * Delay in milliseconds before triggering leave\n\t * @default 0\n\t */\n\tleaveDelay?: number | Ref<number>\n}\n\n/**\n * Return type for useHover composable\n */\nexport interface UseHoverReturn {\n\t/**\n\t * Whether the element is currently being hovered\n\t */\n\tisHovering: Readonly<Ref<boolean>>\n\n\t/**\n\t * Bind events to an element\n\t */\n\tbind: (element: HTMLElement) => () => void\n}\n\n/**\n * Composable for tracking hover state\n *\n * @param options - Configuration options\n * @returns Hover utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useHover } from 'directix'\n *\n * const buttonRef = ref()\n * const { isHovering, bind } = useHover({\n * onEnter: () => console.log('Mouse entered'),\n * onLeave: () => console.log('Mouse left'),\n * enterDelay: 100\n * })\n *\n * onMounted(() => {\n * const unbind = bind(buttonRef.value)\n * onUnmounted(unbind)\n * })\n * </script>\n *\n * <template>\n * <button ref=\"buttonRef\" :class=\"{ 'is-hovering': isHovering }\">\n * Hover Me\n * </button>\n * </template>\n * ```\n */\nexport function useHover(options: UseHoverOptions = {}): UseHoverReturn {\n\tconst {\n\t\tonEnter,\n\t\tonLeave,\n\t\tclass: hoverClass,\n\t\tenterDelay = 0,\n\t\tleaveDelay = 0,\n\t} = options\n\n\tconst isHovering = ref(false)\n\n\tlet enterTimerId: ReturnType<typeof setTimeout> | null = null,\n\t\tleaveTimerId: ReturnType<typeof setTimeout> | null = null,\n\t\tcurrentElement: HTMLElement | null = null\n\n\tfunction clearTimers(): void {\n\t\tif (enterTimerId) {\n\t\t\tclearTimeout(enterTimerId)\n\t\t\tenterTimerId = null\n\t\t}\n\t\tif (leaveTimerId) {\n\t\t\tclearTimeout(leaveTimerId)\n\t\t\tleaveTimerId = null\n\t\t}\n\t}\n\n\tfunction handleMouseEnter(event: MouseEvent): void {\n\t\t// Clear leave timer if exists\n\t\tif (leaveTimerId) {\n\t\t\tclearTimeout(leaveTimerId)\n\t\t\tleaveTimerId = null\n\t\t}\n\n\t\t// If already hovering, do nothing\n\t\tif (isHovering.value) return\n\n\t\t// Handle enter delay\n\t\tconst delay = unref(enterDelay)\n\t\tif (delay && delay > 0) {\n\t\t\tenterTimerId = setTimeout(() => {\n\t\t\t\tisHovering.value = true\n\t\t\t\tapplyHoverState()\n\t\t\t\tonEnter?.(event)\n\t\t\t\tenterTimerId = null\n\t\t\t}, delay)\n\t\t} else {\n\t\t\tisHovering.value = true\n\t\t\tapplyHoverState()\n\t\t\tonEnter?.(event)\n\t\t}\n\t}\n\n\tfunction handleMouseLeave(event: MouseEvent): void {\n\t\t// Clear enter timer if exists\n\t\tif (enterTimerId) {\n\t\t\tclearTimeout(enterTimerId)\n\t\t\tenterTimerId = null\n\t\t}\n\n\t\t// If not hovering, do nothing\n\t\tif (!isHovering.value) return\n\n\t\t// Handle leave delay\n\t\tconst delay = unref(leaveDelay)\n\t\tif (delay && delay > 0) {\n\t\t\tleaveTimerId = setTimeout(() => {\n\t\t\t\tisHovering.value = false\n\t\t\t\tremoveHoverState()\n\t\t\t\tonLeave?.(event)\n\t\t\t\tleaveTimerId = null\n\t\t\t}, delay)\n\t\t} else {\n\t\t\tisHovering.value = false\n\t\t\tremoveHoverState()\n\t\t\tonLeave?.(event)\n\t\t}\n\t}\n\n\tfunction applyHoverState(): void {\n\t\tif (currentElement && hoverClass) {\n\t\t\tcurrentElement.classList.add(hoverClass)\n\t\t}\n\t}\n\n\tfunction removeHoverState(): void {\n\t\tif (currentElement && hoverClass) {\n\t\t\tcurrentElement.classList.remove(hoverClass)\n\t\t}\n\t}\n\n\tfunction bind(element: HTMLElement): () => void {\n\t\tif (!isBrowser()) return () => {}\n\n\t\tcurrentElement = element\n\n\t\telement.addEventListener('mouseenter', handleMouseEnter)\n\t\telement.addEventListener('mouseleave', handleMouseLeave)\n\n\t\t// Return unbind function\n\t\treturn () => {\n\t\t\telement.removeEventListener('mouseenter', handleMouseEnter)\n\t\t\telement.removeEventListener('mouseleave', handleMouseLeave)\n\t\t\tclearTimers()\n\t\t\tremoveHoverState()\n\t\t\tcurrentElement = null\n\t\t}\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tclearTimers()\n\t\tremoveHoverState()\n\t})\n\n\treturn {\n\t\tisHovering,\n\t\tbind,\n\t}\n}\n","import { isBrowser } from '@directix/core'\nimport { onUnmounted, readonly, ref, type Ref } from 'vue'\n\n/**\n * Options for useImagePreview composable\n */\nexport interface UseImagePreviewOptions {\n\t/**\n\t * Initial image URL to preview\n\t */\n\tsrc?: string | Ref<string>\n\n\t/**\n\t * Close on click outside\n\t * @default true\n\t */\n\tcloseOnClickOutside?: boolean\n\n\t/**\n\t * Close on escape key\n\t * @default true\n\t */\n\tcloseOnEsc?: boolean\n\n\t/**\n\t * Show close button\n\t * @default true\n\t */\n\tshowCloseButton?: boolean\n\n\t/**\n\t * Callback when preview opens\n\t */\n\tonOpen?: () => void\n\n\t/**\n\t * Callback when preview closes\n\t */\n\tonClose?: () => void\n}\n\n/**\n * Return type for useImagePreview composable\n */\nexport interface UseImagePreviewReturn {\n\t/** Whether the preview is open */\n\tisOpen: Readonly<Ref<boolean>>\n\n\t/** Current image URL */\n\tcurrentSrc: Readonly<Ref<string>>\n\n\t/** Open preview with an image */\n\topen: (src?: string) => void\n\n\t/** Close preview */\n\tclose: () => void\n\n\t/** Bind click-to-preview to an image element */\n\tbind: (element: HTMLImageElement) => () => void\n}\n\n/**\n * Composable for image preview functionality\n *\n * @param options - Configuration options\n * @returns Image preview utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useImagePreview } from 'directix'\n *\n * const imageRef = ref(null)\n * const { isOpen, bind, open, close } = useImagePreview()\n *\n * onMounted(() => bind(imageRef.value))\n *\n * function openCustomImage() {\n * open('https://example.com/high-res.jpg')\n * }\n * </script>\n *\n * <template>\n * <img ref=\"imageRef\" src=\"thumbnail.jpg\" />\n * </template>\n * ```\n */\nexport function useImagePreview(options: UseImagePreviewOptions = {}): UseImagePreviewReturn {\n\tconst {\n\t\tsrc: initialSrc,\n\t\tcloseOnClickOutside = true,\n\t\tcloseOnEsc = true,\n\t\tshowCloseButton = true,\n\t\tonOpen,\n\t\tonClose,\n\t} = options\n\n\tconst isOpen = ref(false)\n\tconst currentSrc = ref('')\n\n\tlet currentElement: HTMLImageElement | null = null,\n\t\toverlay: HTMLDivElement | null = null,\n\t\tclickHandler: (() => void) | null = null,\n\t\tkeydownHandler: ((e: KeyboardEvent) => void) | null = null\n\n\tfunction createOverlay(): HTMLDivElement {\n\t\tconst div = document.createElement('div')\n\n\t\tdiv.className = 'v-image-preview'\n\t\tdiv.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 9999;\n background: rgba(0, 0, 0, 0.9);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: zoom-out;\n `\n\n\t\treturn div\n\t}\n\n\tfunction open(src?: string): void {\n\t\tif (!isBrowser()) return\n\n\t\tconst imageSrc = src || (initialSrc && typeof initialSrc === 'object' ? initialSrc.value : initialSrc)\n\t\tif (!imageSrc && !currentElement) return\n\n\t\tconst finalSrc = imageSrc || currentElement!.src\n\t\tcurrentSrc.value = finalSrc\n\n\t\t// Create overlay\n\t\toverlay = createOverlay()\n\n\t\t// Create image\n\t\tconst img = document.createElement('img')\n\t\timg.src = finalSrc\n\t\timg.style.cssText = `\n max-width: 90%;\n max-height: 90%;\n object-fit: contain;\n cursor: default;\n `\n\n\t\t// Create close button\n\t\tif (showCloseButton) {\n\t\t\tconst closeBtn = document.createElement('button')\n\t\t\tcloseBtn.className = 'v-image-preview__close'\n\t\t\tcloseBtn.innerHTML = '&times;'\n\t\t\tcloseBtn.style.cssText = `\n position: absolute;\n top: 20px;\n right: 20px;\n width: 40px;\n height: 40px;\n border: none;\n background: rgba(255, 255, 255, 0.2);\n color: white;\n font-size: 24px;\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n `\n\t\t\tcloseBtn.addEventListener('click', e => {\n\t\t\t\te.stopPropagation()\n\t\t\t\tclose()\n\t\t\t})\n\t\t\toverlay.appendChild(closeBtn)\n\t\t}\n\n\t\toverlay.appendChild(img)\n\t\tdocument.body.appendChild(overlay)\n\n\t\t// Click outside to close\n\t\tif (closeOnClickOutside) {\n\t\t\tclickHandler = close\n\t\t\toverlay.addEventListener('click', clickHandler)\n\t\t}\n\n\t\t// Escape to close\n\t\tif (closeOnEsc) {\n\t\t\tkeydownHandler = (e: KeyboardEvent) => {\n\t\t\t\tif (e.key === 'Escape') {\n\t\t\t\t\tclose()\n\t\t\t\t}\n\t\t\t}\n\t\t\tdocument.addEventListener('keydown', keydownHandler)\n\t\t}\n\n\t\tisOpen.value = true\n\t\tonOpen?.()\n\t}\n\n\tfunction close(): void {\n\t\tif (overlay) {\n\t\t\toverlay.remove()\n\t\t\toverlay = null\n\t\t}\n\n\t\tif (clickHandler) {\n\t\t\tdocument.removeEventListener('click', clickHandler)\n\t\t\tclickHandler = null\n\t\t}\n\n\t\tif (keydownHandler) {\n\t\t\tdocument.removeEventListener('keydown', keydownHandler)\n\t\t\tkeydownHandler = null\n\t\t}\n\n\t\tisOpen.value = false\n\t\tcurrentSrc.value = ''\n\t\tonClose?.()\n\t}\n\n\tfunction handleElementClick(): void {\n\t\tif (currentElement) {\n\t\t\topen(currentElement.src)\n\t\t}\n\t}\n\n\tfunction bind(element: HTMLImageElement): () => void {\n\t\tif (!isBrowser()) return () => {}\n\n\t\t// Cleanup previous\n\t\tunbind()\n\n\t\tcurrentElement = element\n\t\telement.style.cursor = 'zoom-in'\n\t\telement.addEventListener('click', handleElementClick)\n\n\t\treturn unbind\n\t}\n\n\tfunction unbind(): void {\n\t\tif (currentElement) {\n\t\t\tcurrentElement.style.cursor = ''\n\t\t\tcurrentElement.removeEventListener('click', handleElementClick)\n\t\t}\n\t\tcurrentElement = null\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tunbind()\n\t\tclose()\n\t})\n\n\treturn {\n\t\tisOpen: readonly(isOpen),\n\t\tcurrentSrc: readonly(currentSrc),\n\t\topen,\n\t\tclose,\n\t\tbind,\n\t}\n}\n","import { isBrowser, supportsIntersectionObserver } from '@directix/core'\nimport { onUnmounted, readonly, ref, type Ref, unref } from 'vue'\n\n/**\n * Intersect event handler\n */\nexport type IntersectHandler = (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\n/**\n * Options for useIntersect composable\n */\nexport interface UseIntersectOptions {\n\t/**\n\t * Callback when element intersects\n\t */\n\thandler?: IntersectHandler\n\n\t/**\n\t * Callback when element enters viewport\n\t */\n\tonEnter?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\n\t/**\n\t * Callback when element leaves viewport\n\t */\n\tonLeave?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\n\t/**\n\t * Callback when element changes intersection\n\t */\n\tonChange?: (isIntersecting: boolean, entry: IntersectionObserverEntry) => void\n\n\t/**\n\t * Root element for intersection\n\t * @default null (viewport)\n\t */\n\troot?: Element | null | Ref<Element | null>\n\n\t/**\n\t * Margin around the root\n\t * @default '0px'\n\t */\n\trootMargin?: string\n\n\t/**\n\t * Threshold(s) at which to trigger callback\n\t * @default 0\n\t */\n\tthreshold?: number | number[]\n\n\t/**\n\t * Whether to trigger only once\n\t * @default false\n\t */\n\tonce?: boolean\n}\n\n/**\n * Return type for useIntersect composable\n */\nexport interface UseIntersectReturn {\n\t/**\n\t * Whether the element is currently intersecting\n\t */\n\tisIntersecting: Readonly<Ref<boolean>>\n\n\t/**\n\t * Current intersection ratio\n\t */\n\tratio: Readonly<Ref<number>>\n\n\t/**\n\t * Bind intersection observer to an element\n\t */\n\tbind: (element: HTMLElement) => () => void\n\n\t/**\n\t * Stop observing\n\t */\n\tstop: () => void\n}\n\n/**\n * Composable for detecting element intersection with viewport\n *\n * @param options - Configuration options\n * @returns Intersection utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useIntersect } from 'directix'\n *\n * const target = ref(null)\n * const { isIntersecting, bind } = useIntersect({\n * threshold: 0.5,\n * onEnter: () => console.log('Entered'),\n * onLeave: () => console.log('Left')\n * })\n *\n * onMounted(() => bind(target.value))\n * </script>\n *\n * <template>\n * <div ref=\"target\" :class=\"{ visible: isIntersecting }\">\n * I'm visible!\n * </div>\n * </template>\n * ```\n */\nexport function useIntersect(options: UseIntersectOptions = {}): UseIntersectReturn {\n\tconst {\n\t\thandler,\n\t\tonEnter,\n\t\tonLeave,\n\t\tonChange,\n\t\troot = null,\n\t\trootMargin = '0px',\n\t\tthreshold = 0,\n\t\tonce = false,\n\t} = options\n\n\tconst isIntersecting = ref(false)\n\tconst ratio = ref(0)\n\n\tlet observer: IntersectionObserver | null = null,\n\t\thasTriggeredOnce = false\n\n\tfunction createObserver(): IntersectionObserver | null {\n\t\tif (!isBrowser() || !supportsIntersectionObserver()) {\n\t\t\tconsole.warn('[Directix] useIntersect: IntersectionObserver not supported')\n\t\t\treturn null\n\t\t}\n\n\t\treturn new IntersectionObserver(\n\t\t\tentries => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tif (once && hasTriggeredOnce) continue\n\n\t\t\t\t\tconst intersecting = entry.isIntersecting\n\n\t\t\t\t\tisIntersecting.value = intersecting\n\t\t\t\t\tratio.value = entry.intersectionRatio\n\n\t\t\t\t\thandler?.(entry, observer!)\n\t\t\t\t\tonChange?.(intersecting, entry)\n\n\t\t\t\t\tif (intersecting) {\n\t\t\t\t\t\tonEnter?.(entry, observer!)\n\t\t\t\t\t\tif (once) hasTriggeredOnce = true\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonLeave?.(entry, observer!)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\troot: unref(root),\n\t\t\t\trootMargin,\n\t\t\t\tthreshold,\n\t\t\t},\n\t\t)\n\t}\n\n\tfunction bind(element: HTMLElement): () => void {\n\t\tif (!isBrowser()) return () => {}\n\n\t\t// Cleanup previous\n\t\tstop()\n\n\t\tobserver = createObserver()\n\n\t\tif (observer) {\n\t\t\tobserver.observe(element)\n\t\t}\n\n\t\treturn stop\n\t}\n\n\tfunction stop(): void {\n\t\tif (observer) {\n\t\t\tobserver.disconnect()\n\t\t\tobserver = null\n\t\t}\n\t\tisIntersecting.value = false\n\t\tratio.value = 0\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tstop()\n\t})\n\n\treturn {\n\t\tisIntersecting: readonly(isIntersecting),\n\t\tratio: readonly(ratio),\n\t\tbind,\n\t\tstop,\n\t}\n}\n","import { isBrowser } from '@directix/core'\nimport { onUnmounted, ref, type Ref, unref } from 'vue'\n\n/**\n * Options for useLongPress composable\n */\nexport interface UseLongPressOptions {\n\t/**\n\t * Duration in milliseconds to trigger long press\n\t * @default 500\n\t */\n\tduration?: number | Ref<number>\n\n\t/**\n\t * Maximum movement distance before canceling\n\t * @default 10\n\t */\n\tdistance?: number | Ref<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 triggered\n\t */\n\tonTrigger?: (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\n/**\n * Return type for useLongPress composable\n */\nexport interface UseLongPressReturn {\n\t/**\n\t * Whether a long press is currently in progress\n\t */\n\tisPressing: Readonly<Ref<boolean>>\n\n\t/**\n\t * Start long press detection\n\t */\n\tstart: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Stop long press detection\n\t */\n\tstop: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Bind events to an element\n\t */\n\tbind: (element: HTMLElement) => () => void\n}\n\n/**\n * Get position from mouse/touch event\n */\nfunction getEventPosition(e: MouseEvent | TouchEvent): { x: number, y: number } {\n\tif ('touches' in e && e.touches.length > 0) {\n\t\treturn {\n\t\t\tx: e.touches[0].clientX,\n\t\t\ty: e.touches[0].clientY,\n\t\t}\n\t}\n\tif ('clientX' in e) {\n\t\treturn {\n\t\t\tx: e.clientX,\n\t\t\ty: e.clientY,\n\t\t}\n\t}\n\treturn { x: 0, y: 0 }\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 * Composable for detecting long press gestures\n *\n * @param options - Configuration options\n * @returns Long press utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { useLongPress } from 'directix'\n *\n * const { bind, isPressing } = useLongPress({\n * onTrigger: (event) => {\n * console.log('Long press triggered!')\n * },\n * duration: 800\n * })\n *\n * // Bind to element\n * const buttonRef = ref()\n * onMounted(() => {\n * const unbind = bind(buttonRef.value)\n * onUnmounted(unbind)\n * })\n * </script>\n *\n * <template>\n * <button ref=\"buttonRef\">Long Press Me</button>\n * </template>\n * ```\n */\nexport function useLongPress(options: UseLongPressOptions = {}): UseLongPressReturn {\n\tconst {\n\t\tduration = 500,\n\t\tdistance = 10,\n\t\tonStart,\n\t\tonTrigger,\n\t\tonCancel,\n\t\tonTick,\n\t\ttickInterval = 100,\n\t\tprevent = true,\n\t} = options\n\n\tconst isPressing = ref(false)\n\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\ttickTimerId: ReturnType<typeof setInterval> | null = null,\n\t\tstartPos = { x: 0, y: 0 },\n\t\tstartPosSet = false\n\n\tfunction start(event: MouseEvent | TouchEvent): void {\n\t\tif (!isBrowser()) return\n\n\t\t// Prevent default\n\t\tif (prevent) {\n\t\t\tevent.preventDefault()\n\t\t}\n\n\t\t// Clear any existing timers\n\t\tclearTimers()\n\n\t\t// Store start position\n\t\tstartPos = getEventPosition(event)\n\t\tstartPosSet = true\n\t\tisPressing.value = true\n\n\t\t// Trigger start callback\n\t\tonStart?.(event)\n\n\t\t// Start tick timer\n\t\tif (onTick) {\n\t\t\tlet remaining = unref(duration)\n\t\t\ttickTimerId = setInterval(() => {\n\t\t\t\tremaining -= tickInterval\n\t\t\t\tonTick?.(Math.max(0, remaining))\n\t\t\t}, tickInterval)\n\t\t}\n\n\t\t// Start long press timer\n\t\ttimerId = setTimeout(() => {\n\t\t\tclearTimers()\n\t\t\tisPressing.value = false\n\t\t\tonTrigger?.(event)\n\t\t}, unref(duration))\n\t}\n\n\tfunction stop(event: MouseEvent | TouchEvent): void {\n\t\tif (!isPressing.value) return\n\n\t\tclearTimers()\n\t\tstartPosSet = false\n\t\tisPressing.value = false\n\t\tonCancel?.(event)\n\t}\n\n\tfunction handleMove(event: MouseEvent | TouchEvent): void {\n\t\tif (!isPressing.value || !startPosSet) return\n\n\t\tconst pos = getEventPosition(event)\n\t\tconst dist = getDistance(startPos, pos)\n\n\t\tif (dist > unref(distance)) {\n\t\t\tstop(event)\n\t\t}\n\t}\n\n\tfunction clearTimers(): void {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tif (tickTimerId) {\n\t\t\tclearInterval(tickTimerId)\n\t\t\ttickTimerId = null\n\t\t}\n\t}\n\n\tfunction bind(element: HTMLElement): () => void {\n\t\t// Mouse events\n\t\telement.addEventListener('mousedown', start)\n\t\telement.addEventListener('mouseup', stop)\n\t\telement.addEventListener('mouseleave', stop)\n\t\telement.addEventListener('mousemove', handleMove)\n\n\t\t// Touch events\n\t\telement.addEventListener('touchstart', start, { passive: !prevent })\n\t\telement.addEventListener('touchend', stop)\n\t\telement.addEventListener('touchcancel', stop)\n\t\telement.addEventListener('touchmove', handleMove, { passive: true })\n\n\t\t// Return unbind function\n\t\treturn () => {\n\t\t\telement.removeEventListener('mousedown', start)\n\t\t\telement.removeEventListener('mouseup', stop)\n\t\t\telement.removeEventListener('mouseleave', stop)\n\t\t\telement.removeEventListener('mousemove', handleMove)\n\t\t\telement.removeEventListener('touchstart', start)\n\t\t\telement.removeEventListener('touchend', stop)\n\t\t\telement.removeEventListener('touchcancel', stop)\n\t\t\telement.removeEventListener('touchmove', handleMove)\n\t\t\tclearTimers()\n\t\t}\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tclearTimers()\n\t})\n\n\treturn {\n\t\tisPressing,\n\t\tstart,\n\t\tstop,\n\t\tbind,\n\t}\n}\n","import { ref, type Ref, unref, watch } from 'vue'\n\n/**\n * Options for useLowercase composable\n */\nexport interface UseLowercaseOptions {\n\t/**\n\t * The text to transform\n\t */\n\ttext: string | Ref<string>\n\n\t/**\n\t * Transform only the first character\n\t * @default false\n\t */\n\tfirst?: boolean | Ref<boolean>\n}\n\n/**\n * Return type for useLowercase composable\n */\nexport interface UseLowercaseReturn {\n\t/**\n\t * The transformed text\n\t */\n\ttransformed: Ref<string>\n\n\t/**\n\t * Original text\n\t */\n\toriginal: Ref<string>\n}\n\n/**\n * Transform text to lowercase\n */\nfunction lowercaseText(text: string, firstOnly = false): string {\n\tif (!text) return text\n\n\tif (firstOnly) {\n\t\treturn text.charAt(0).toLowerCase() + text.slice(1)\n\t}\n\n\treturn text.toLowerCase()\n}\n\n/**\n * Composable for transforming text to lowercase\n *\n * @param options - Configuration options\n * @returns Lowercase text utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useLowercase } from 'directix'\n *\n * const text = ref('HELLO WORLD')\n *\n * const { transformed } = useLowercase({ text })\n * // transformed.value = 'hello world'\n * </script>\n *\n * <template>\n * <p>{{ transformed }}</p>\n * </template>\n * ```\n */\nexport function useLowercase(options: UseLowercaseOptions): UseLowercaseReturn {\n\tconst {\n\t\ttext,\n\t\tfirst = false,\n\t} = options\n\n\t// State\n\tconst original = ref(unref(text))\n\tconst transformed = ref('')\n\n\t/**\n\t * Calculate transformed text\n\t */\n\tfunction calculate(): void {\n\t\tconst textValue = unref(text)\n\t\tconst firstValue = unref(first)\n\n\t\toriginal.value = textValue\n\t\ttransformed.value = lowercaseText(textValue, firstValue)\n\t}\n\n\t// Watch for changes\n\twatch(\n\t\t() => [unref(text), unref(first)],\n\t\t() => calculate(),\n\t\t{ immediate: true },\n\t)\n\n\treturn {\n\t\ttransformed,\n\t\toriginal,\n\t}\n}\n\n/**\n * Utility function to transform text to lowercase\n *\n * @param text - Text to transform\n * @param first - Whether to transform only the first character\n * @returns Lowercase text\n *\n * @example\n * ```ts\n * import { lowercaseText } from 'directix'\n *\n * lowercaseText('HELLO WORLD') // 'hello world'\n * lowercaseText('HELLO WORLD', true) // 'hELLO WORLD'\n * ```\n */\nexport { lowercaseText }\n\n/**\n * Create a lowercase transformation function\n *\n * @param first - Whether to transform only the first character\n * @returns Lowercase transformation function\n *\n * @example\n * ```ts\n * import { createLowercaser } from 'directix'\n *\n * const toLower = createLowercaser()\n * toLower('HELLO') // 'hello'\n *\n * const firstToLower = createLowercaser(true)\n * firstToLower('HELLO') // 'hELLO'\n * ```\n */\nexport function createLowercaser(first = false): (text: string) => string {\n\treturn (text: string) => lowercaseText(text, first)\n}\n","import { computed, ref, type Ref, unref, watch } from 'vue'\n\n/**\n * Options for useMoney composable\n */\nexport interface UseMoneyOptions {\n\t/**\n\t * The numeric value\n\t */\n\tvalue: number | Ref<number>\n\n\t/**\n\t * Currency symbol\n\t * @default '$'\n\t */\n\tsymbol?: string | Ref<string>\n\n\t/**\n\t * Symbol position\n\t * @default 'before'\n\t */\n\tsymbolPosition?: 'before' | 'after' | Ref<'before' | 'after'>\n\n\t/**\n\t * Number of decimal places\n\t * @default 2\n\t */\n\tprecision?: number | Ref<number>\n\n\t/**\n\t * Thousands separator\n\t * @default ','\n\t */\n\tseparator?: string | Ref<string>\n\n\t/**\n\t * Decimal separator\n\t * @default '.'\n\t */\n\tdecimal?: string | Ref<string>\n}\n\n/**\n * Return type for useMoney composable\n */\nexport interface UseMoneyReturn {\n\t/**\n\t * The formatted money string\n\t */\n\tformatted: Ref<string>\n\n\t/**\n\t * The numeric value\n\t */\n\tvalue: Ref<number>\n\n\t/**\n\t * Parse a formatted string back to number\n\t */\n\tparse: (formatted: string) => number\n}\n\n/**\n * Format number to money string\n */\nfunction formatMoney(\n\tvalue: number,\n\toptions: {\n\t\tprecision?: number\n\t\tseparator?: string\n\t\tdecimal?: string\n\t\tsymbol?: string\n\t\tsymbolPosition?: 'before' | 'after'\n\t} = {},\n): string {\n\tconst {\n\t\tprecision = 2,\n\t\tseparator = ',',\n\t\tdecimal = '.',\n\t\tsymbol = '$',\n\t\tsymbolPosition = 'before',\n\t} = 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\n/**\n * Parse formatted money string to number\n */\nfunction parseMoney(\n\tformatted: string,\n\toptions: {\n\t\tdecimal?: string\n\t\tsymbol?: string\n\t} = {},\n): number {\n\tconst { decimal = '.', symbol = '$' } = options\n\n\t// Remove symbol and whitespace\n\tlet cleaned = formatted.replace(new RegExp(`[${symbol}\\\\s]`, 'g'), '')\n\n\t// Handle different decimal separators\n\tif (decimal !== '.') {\n\t\t// Remove thousands separators (usually ',')\n\t\tcleaned = cleaned.replace(/,/g, '')\n\t\t// Replace decimal separator with '.'\n\t\tcleaned = cleaned.replace(new RegExp(`\\\\${decimal}`, 'g'), '.')\n\t} else {\n\t\t// Remove thousands separators\n\t\tcleaned = cleaned.replace(/,/g, '')\n\t}\n\n\treturn parseFloat(cleaned) || 0\n}\n\n/**\n * Composable for formatting numbers as money\n *\n * @param options - Configuration options\n * @returns Money formatting utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useMoney } from 'directix'\n *\n * const price = ref(1234.56)\n *\n * const { formatted } = useMoney({\n * value: price,\n * symbol: '€',\n * symbolPosition: 'after'\n * })\n * // formatted.value = '1,234.56€'\n * </script>\n *\n * <template>\n * <span>{{ formatted }}</span>\n * </template>\n * ```\n */\nexport function useMoney(options: UseMoneyOptions): UseMoneyReturn {\n\tconst {\n\t\tvalue,\n\t\tsymbol = '$',\n\t\tsymbolPosition = 'before',\n\t\tprecision = 2,\n\t\tseparator = ',',\n\t\tdecimal = '.',\n\t} = options\n\n\t// State\n\tconst valueRef = ref(unref(value))\n\n\t/**\n\t * Get format options\n\t */\n\tfunction getFormatOptions(): {\n\t\tprecision: number\n\t\tseparator: string\n\t\tdecimal: string\n\t\tsymbol: string\n\t\tsymbolPosition: 'before' | 'after'\n\t} {\n\t\treturn {\n\t\t\tprecision: unref(precision),\n\t\t\tseparator: unref(separator),\n\t\t\tdecimal: unref(decimal),\n\t\t\tsymbol: unref(symbol),\n\t\t\tsymbolPosition: unref(symbolPosition),\n\t\t}\n\t}\n\n\t/**\n\t * Formatted money string\n\t */\n\tconst formatted = computed(() => {\n\t\treturn formatMoney(valueRef.value, getFormatOptions())\n\t})\n\n\t/**\n\t * Parse formatted string to number\n\t */\n\tfunction parse(formattedString: string): number {\n\t\treturn parseMoney(formattedString, {\n\t\t\tdecimal: unref(decimal),\n\t\t\tsymbol: unref(symbol),\n\t\t})\n\t}\n\n\t// Watch for value changes\n\twatch(\n\t\t() => unref(value),\n\t\tnewValue => {\n\t\t\tvalueRef.value = newValue\n\t\t},\n\t)\n\n\treturn {\n\t\tvalue: valueRef,\n\t\tformatted,\n\t\tparse,\n\t}\n}\n\n/**\n * Utility function to format number as money\n *\n * @param value - Numeric value\n * @param options - Format options\n * @returns Formatted money string\n *\n * @example\n * ```ts\n * import { formatMoney } from 'directix'\n *\n * formatMoney(1234.56) // '$1,234.56'\n * formatMoney(1234.56, { symbol: '€', symbolPosition: 'after' }) // '1,234.56€'\n * ```\n */\nexport { formatMoney, parseMoney }\n\n/**\n * Create a money formatter with preset options\n *\n * @param options - Format options\n * @returns Money formatter function\n *\n * @example\n * ```ts\n * import { createMoneyFormatter } from 'directix'\n *\n * const formatEuro = createMoneyFormatter({ symbol: '€', symbolPosition: 'after' })\n * formatEuro(1234.56) // '1,234.56€'\n * ```\n */\nexport function createMoneyFormatter(\n\toptions: {\n\t\tsymbol?: string\n\t\tsymbolPosition?: 'before' | 'after'\n\t\tprecision?: number\n\t\tseparator?: string\n\t\tdecimal?: string\n\t} = {},\n): (value: number) => string {\n\treturn (value: number) => formatMoney(value, options)\n}\n","import { computed, ref, type Ref, unref, watch } from 'vue'\n\n/**\n * Options for useNumber composable\n */\nexport interface UseNumberOptions {\n\t/**\n\t * The numeric value\n\t */\n\tvalue: number | Ref<number>\n\n\t/**\n\t * Number of decimal places\n\t * @default 0\n\t */\n\tprecision?: number | Ref<number>\n\n\t/**\n\t * Thousands separator\n\t * @default ','\n\t */\n\tseparator?: string | Ref<string>\n\n\t/**\n\t * Decimal separator\n\t * @default '.'\n\t */\n\tdecimal?: string | Ref<string>\n\n\t/**\n\t * Prefix string (e.g., '$')\n\t */\n\tprefix?: string | Ref<string>\n\n\t/**\n\t * Suffix string (e.g., '%')\n\t */\n\tsuffix?: string | Ref<string>\n}\n\n/**\n * Return type for useNumber composable\n */\nexport interface UseNumberReturn {\n\t/**\n\t * The formatted number string\n\t */\n\tformatted: Ref<string>\n\n\t/**\n\t * The numeric value\n\t */\n\tvalue: Ref<number>\n\n\t/**\n\t * Parse a formatted string back to number\n\t */\n\tparse: (formatted: string) => number\n}\n\n/**\n * Format number with options\n */\nfunction formatNumber(\n\tvalue: number,\n\toptions: {\n\t\tprecision?: number\n\t\tseparator?: string\n\t\tdecimal?: string\n\t\tprefix?: string\n\t\tsuffix?: string\n\t} = {},\n): string {\n\tconst {\n\t\tprecision = 0,\n\t\tseparator = ',',\n\t\tdecimal = '.',\n\t\tprefix = '',\n\t\tsuffix = '',\n\t} = 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 prefix + result + suffix\n}\n\n/**\n * Parse formatted number string to number\n */\nfunction parseNumber(\n\tformatted: string,\n\toptions: {\n\t\tdecimal?: string\n\t\tprefix?: string\n\t\tsuffix?: string\n\t} = {},\n): number {\n\tconst { decimal = '.', prefix = '', suffix = '' } = options\n\n\t// Remove prefix, suffix, and whitespace\n\tlet cleaned = formatted\n\t\t.replace(new RegExp(`^${escapeRegex(prefix)}`), '')\n\t\t.replace(new RegExp(`${escapeRegex(suffix)}$`), '')\n\t\t.replace(/\\s/g, '')\n\n\t// Handle different decimal separators\n\tif (decimal !== '.') {\n\t\t// Remove thousands separators (usually ',')\n\t\tcleaned = cleaned.replace(/,/g, '')\n\t\t// Replace decimal separator with '.'\n\t\tcleaned = cleaned.replace(new RegExp(`\\\\${decimal}`, 'g'), '.')\n\t} else {\n\t\t// Remove thousands separators\n\t\tcleaned = cleaned.replace(/,/g, '')\n\t}\n\n\treturn parseFloat(cleaned) || 0\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegex(str: string): string {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * Composable for formatting numbers\n *\n * @param options - Configuration options\n * @returns Number formatting utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useNumber } from 'directix'\n *\n * const count = ref(1234567)\n *\n * const { formatted } = useNumber({\n * value: count,\n * precision: 2,\n * suffix: ' items'\n * })\n * // formatted.value = '1,234,567.00 items'\n * </script>\n *\n * <template>\n * <span>{{ formatted }}</span>\n * </template>\n * ```\n */\nexport function useNumber(options: UseNumberOptions): UseNumberReturn {\n\tconst {\n\t\tvalue,\n\t\tprecision = 0,\n\t\tseparator = ',',\n\t\tdecimal = '.',\n\t\tprefix = '',\n\t\tsuffix = '',\n\t} = options\n\n\t// State\n\tconst valueRef = ref(unref(value))\n\n\t/**\n\t * Get format options\n\t */\n\tfunction getFormatOptions(): {\n\t\tprecision: number\n\t\tseparator: string\n\t\tdecimal: string\n\t\tprefix: string\n\t\tsuffix: string\n\t} {\n\t\treturn {\n\t\t\tprecision: unref(precision),\n\t\t\tseparator: unref(separator),\n\t\t\tdecimal: unref(decimal),\n\t\t\tprefix: unref(prefix),\n\t\t\tsuffix: unref(suffix),\n\t\t}\n\t}\n\n\t/**\n\t * Formatted number string\n\t */\n\tconst formatted = computed(() => {\n\t\treturn formatNumber(valueRef.value, getFormatOptions())\n\t})\n\n\t/**\n\t * Parse formatted string to number\n\t */\n\tfunction parse(formattedString: string): number {\n\t\treturn parseNumber(formattedString, {\n\t\t\tdecimal: unref(decimal),\n\t\t\tprefix: unref(prefix),\n\t\t\tsuffix: unref(suffix),\n\t\t})\n\t}\n\n\t// Watch for value changes\n\twatch(\n\t\t() => unref(value),\n\t\tnewValue => {\n\t\t\tvalueRef.value = newValue\n\t\t},\n\t)\n\n\treturn {\n\t\tvalue: valueRef,\n\t\tformatted,\n\t\tparse,\n\t}\n}\n\n/**\n * Utility function to format number\n *\n * @param value - Numeric value\n * @param options - Format options\n * @returns Formatted number string\n *\n * @example\n * ```ts\n * import { formatNumber } from 'directix'\n *\n * formatNumber(1234567) // '1,234,567'\n * formatNumber(1234.56, { precision: 2, suffix: '%' }) // '1,234.56%'\n * ```\n */\nexport { formatNumber, parseNumber }\n\n/**\n * Create a number formatter with preset options\n *\n * @param options - Format options\n * @returns Number formatter function\n *\n * @example\n * ```ts\n * import { createNumberFormatter } from 'directix'\n *\n * const formatPercent = createNumberFormatter({ suffix: '%', precision: 1 })\n * formatPercent(85.5) // '85.5%'\n * ```\n */\nexport function createNumberFormatter(\n\toptions: {\n\t\tprecision?: number\n\t\tseparator?: string\n\t\tdecimal?: string\n\t\tprefix?: string\n\t\tsuffix?: string\n\t} = {},\n): (value: number) => string {\n\treturn (value: number) => formatNumber(value, options)\n}\n","import { readonly, ref, type Ref, unref, watch } from 'vue'\n\n/**\n * Permission check mode\n */\nexport type PermissionMode = 'some' | 'every'\n\n/**\n * Options for usePermission composable\n */\nexport interface UsePermissionOptions {\n\t/**\n\t * Permission value(s) to check\n\t */\n\tvalue: string | string[] | Ref<string | string[]>\n\n\t/**\n\t * Logic for multiple permissions: 'some' (OR) or 'every' (AND)\n\t * @default 'some'\n\t */\n\tmode?: PermissionMode | Ref<PermissionMode>\n\n\t/**\n\t * Custom permission check function\n\t */\n\tcheck?: (permission: string | string[], mode: PermissionMode) => boolean\n\n\t/**\n\t * Get current user's permissions\n\t */\n\tgetPermissions?: () => string[]\n\n\t/**\n\t * Get current user's roles\n\t */\n\tgetRoles?: () => string[]\n\n\t/**\n\t * Role to permission mapping\n\t */\n\troleMap?: Record<string, string[]>\n}\n\n/**\n * Return type for usePermission composable\n */\nexport interface UsePermissionReturn {\n\t/** Whether the permission is granted */\n\tgranted: Readonly<Ref<boolean>>\n\n\t/** Re-check permission */\n\trecheck: () => void\n}\n\nconst WILDCARD = '*'\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 * Composable for checking user permissions\n *\n * @param options - Configuration options\n * @returns Permission utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { usePermission } from 'directix'\n *\n * const { granted } = usePermission({\n * value: 'admin',\n * getPermissions: () => store.getters.permissions,\n * getRoles: () => store.getters.roles,\n * roleMap: { admin: ['*'], editor: ['read', 'write'] }\n * })\n * </script>\n *\n * <template>\n * <button v-if=\"granted\">Admin Only Action</button>\n * </template>\n * ```\n */\nexport function usePermission(options: UsePermissionOptions): UsePermissionReturn {\n\tconst {\n\t\tvalue,\n\t\tmode = 'some',\n\t\tcheck,\n\t\tgetPermissions,\n\t\tgetRoles,\n\t\troleMap = {},\n\t} = options\n\n\tconst granted = ref(false)\n\n\tfunction verifyPermission(): boolean {\n\t\t// Custom check function takes priority\n\t\tif (check) {\n\t\t\treturn check(unref(value), unref(mode))\n\t\t}\n\n\t\t// Require getPermissions function\n\t\tif (!getPermissions) {\n\t\t\tconsole.warn('[Directix] usePermission: getPermissions function is required')\n\t\t\treturn true\n\t\t}\n\n\t\tconst permissions = getPermissions()\n\t\tconst roles = getRoles?.() || []\n\t\tconst required = (Array.isArray(unref(value)) ? unref(value) : [unref(value)]) as string[]\n\t\tconst currentMode = unref(mode)\n\n\t\tfunction checkSingle(perm: string): boolean {\n\t\t\t// If perm is a role name in roleMap, check if user has that role\n\t\t\tif (perm in roleMap) {\n\t\t\t\treturn roles.includes(perm)\n\t\t\t}\n\n\t\t\t// Check direct permission\n\t\t\tif (hasPermission(perm, permissions)) {\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\t// Check if any of user's roles grant this permission\n\t\t\tfor (const role of roles) {\n\t\t\t\tconst rolePermissions = roleMap[role] || []\n\t\t\t\tif (hasPermission(perm, rolePermissions)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false\n\t\t}\n\n\t\treturn currentMode === 'every' ? required.every(checkSingle) : required.some(checkSingle)\n\t}\n\n\tfunction recheck(): void {\n\t\tgranted.value = verifyPermission()\n\t}\n\n\t// Watch for value changes\n\twatch(\n\t\t() => unref(value),\n\t\t() => recheck(),\n\t\t{ immediate: true },\n\t)\n\n\t// Watch for mode changes\n\tif (typeof mode === 'object' && 'value' in mode) {\n\t\twatch(mode, () => recheck())\n\t}\n\n\treturn {\n\t\tgranted: readonly(granted),\n\t\trecheck,\n\t}\n}\n\n/**\n * Create a permission checker with shared configuration\n *\n * @param config - Shared configuration\n * @returns Permission checker function\n *\n * @example\n * ```ts\n * import { createPermissionChecker } from 'directix'\n *\n * const checkPermission = createPermissionChecker({\n * getPermissions: () => store.getters.permissions,\n * getRoles: () => store.getters.roles,\n * roleMap: { admin: ['*'], editor: ['read', 'write'] }\n * })\n *\n * // Usage\n * const isAdmin = checkPermission('admin')\n * const canEdit = checkPermission(['read', 'write'], 'every')\n * ```\n */\nexport function createPermissionChecker(config: {\n\tgetPermissions: () => string[]\n\tgetRoles?: () => string[]\n\troleMap?: Record<string, string[]>\n}): (value: string | string[], mode?: PermissionMode) => boolean {\n\tconst { getPermissions, getRoles, roleMap = {} } = config\n\n\treturn (value: string | string[], mode: PermissionMode = 'some'): boolean => {\n\t\tconst permissions = getPermissions()\n\t\tconst roles = getRoles?.() || []\n\t\tconst required = Array.isArray(value) ? value : [value]\n\n\t\tfunction checkSingle(perm: string): boolean {\n\t\t\tif (perm in roleMap) {\n\t\t\t\treturn roles.includes(perm)\n\t\t\t}\n\n\t\t\tif (hasPermission(perm, permissions)) {\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tfor (const role of roles) {\n\t\t\t\tconst rolePermissions = roleMap[role] || []\n\t\t\t\tif (hasPermission(perm, rolePermissions)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false\n\t\t}\n\n\t\treturn mode === 'every' ? required.every(checkSingle) : required.some(checkSingle)\n\t}\n}\n","import { onUnmounted, ref, type Ref, unref } from 'vue'\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 * Options for usePrint composable\n */\nexport interface UsePrintOptions {\n\t/**\n\t * Title for the printed document\n\t */\n\ttitle?: string | Ref<string>\n\n\t/**\n\t * Additional CSS styles to inject\n\t */\n\tstyles?: string | string[] | Ref<string | string[]>\n\n\t/**\n\t * Additional CSS URLs to include\n\t */\n\tcssUrls?: string[] | Ref<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 in a new window\n\t * @default false\n\t */\n\tnewWindow?: boolean | Ref<boolean>\n\n\t/**\n\t * Custom class for print container\n\t */\n\tprintClass?: string | Ref<string>\n}\n\n/**\n * Return type for usePrint composable\n */\nexport interface UsePrintReturn {\n\t/**\n\t * Whether printing is in progress\n\t */\n\tisPrinting: Ref<boolean>\n\n\t/**\n\t * Print the specified element or selector\n\t */\n\tprint: (target?: string | HTMLElement) => Promise<void>\n\n\t/**\n\t * Print the current page\n\t */\n\tprintPage: () => Promise<void>\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\n/**\n * Build print content HTML\n */\nfunction buildPrintContent(\n\tel: HTMLElement,\n\toptions: {\n\t\ttitle: string\n\t\tstyles: string\n\t\tcssUrls: string[]\n\t\tprintClass?: string\n\t},\n): string {\n\t// Get all stylesheets\n\tlet styles = ''\n\n\t// Include existing stylesheets\n\tif (typeof document !== 'undefined') {\n\t\tdocument.querySelectorAll('style, link[rel=\"stylesheet\"]').forEach(styleEl => {\n\t\t\tif (styleEl.tagName === 'STYLE') {\n\t\t\t\tstyles += `<style>${styleEl.textContent}</style>`\n\t\t\t} else if (styleEl.tagName === 'LINK') {\n\t\t\t\tconst href = (styleEl as HTMLLinkElement).href\n\t\t\t\tstyles += `<link rel=\"stylesheet\" href=\"${href}\">`\n\t\t\t}\n\t\t})\n\t}\n\n\t// Add custom CSS URLs\n\toptions.cssUrls.forEach(url => {\n\t\tstyles += `<link rel=\"stylesheet\" href=\"${url}\">`\n\t})\n\n\t// Add custom styles\n\tif (options.styles) {\n\t\tstyles += `<style>${options.styles}</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 || (typeof document !== 'undefined' ? 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 * Print using iframe\n */\nasync function printInIframe(\n\tel: HTMLElement,\n\toptions: {\n\t\ttitle: string\n\t\tstyles: string\n\t\tcssUrls: string[]\n\t\tprintClass?: string\n\t},\n): 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] usePrint: 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] usePrint: 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(\n\tel: HTMLElement,\n\toptions: {\n\t\ttitle: string\n\t\tstyles: string\n\t\tcssUrls: string[]\n\t\tprintClass?: string\n\t},\n): Promise<void> {\n\tconst printWindow = window.open('', '_blank')\n\n\tif (!printWindow) {\n\t\tconsole.warn('[Directix] usePrint: 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 * Composable for printing functionality\n *\n * @param options - Configuration options\n * @returns Print utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { usePrint } from 'directix'\n *\n * const { isPrinting, print } = usePrint({\n * title: 'My Document',\n * onBeforePrint: () => {\n * console.log('About to print...')\n * return true\n * },\n * onAfterPrint: () => {\n * console.log('Print complete!')\n * }\n * })\n *\n * async function handlePrint() {\n * await print('#content')\n * }\n * </script>\n *\n * <template>\n * <div>\n * <button @click=\"handlePrint\" :disabled=\"isPrinting\">\n * {{ isPrinting ? 'Printing...' : 'Print' }}\n * </button>\n * <div id=\"content\">Content to print</div>\n * </div>\n * </template>\n * ```\n */\nexport function usePrint(options: UsePrintOptions = {}): UsePrintReturn {\n\tconst {\n\t\ttitle,\n\t\tstyles,\n\t\tcssUrls = [],\n\t\tonBeforePrint,\n\t\tonAfterPrint,\n\t\tnewWindow = false,\n\t\tprintClass,\n\t} = options\n\n\t// State\n\tconst isPrinting = ref(false)\n\n\t/**\n\t * Print the specified element or selector\n\t */\n\tasync function print(target?: string | HTMLElement): Promise<void> {\n\t\t// Call before callback\n\t\tif (onBeforePrint) {\n\t\t\tconst result = onBeforePrint()\n\t\t\tif (result === false) return\n\t\t}\n\n\t\tisPrinting.value = true\n\n\t\ttry {\n\t\t\t// Get target element\n\t\t\tlet targetEl: HTMLElement | null = null\n\n\t\t\tif (typeof target === 'string') {\n\t\t\t\ttargetEl = document.querySelector(target)\n\t\t\t} else if (target instanceof HTMLElement) {\n\t\t\t\ttargetEl = target\n\t\t\t} else {\n\t\t\t\t// Default to body\n\t\t\t\ttargetEl = document.body\n\t\t\t}\n\n\t\t\tif (!targetEl) {\n\t\t\t\tconsole.warn('[Directix] usePrint: Target element not found')\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst printOptions = {\n\t\t\t\ttitle: unref(title) || '',\n\t\t\t\tstyles: (Array.isArray(unref(styles)) ? (unref(styles) as string[]).join('\\n') : (unref(styles) || '')) as string,\n\t\t\t\tcssUrls: unref(cssUrls) || [],\n\t\t\t\tprintClass: unref(printClass),\n\t\t\t}\n\n\t\t\t// Create print window/iframe\n\t\t\tif (unref(newWindow)) {\n\t\t\t\tawait printInNewWindow(targetEl, printOptions)\n\t\t\t} else {\n\t\t\t\tawait printInIframe(targetEl, printOptions)\n\t\t\t}\n\n\t\t\t// Call after callback\n\t\t\tif (onAfterPrint) {\n\t\t\t\tonAfterPrint()\n\t\t\t}\n\t\t} finally {\n\t\t\tisPrinting.value = false\n\t\t}\n\t}\n\n\t/**\n\t * Print the current page\n\t */\n\tasync function printPage(): Promise<void> {\n\t\tawait print()\n\t}\n\n\t// Cleanup\n\tonUnmounted(() => {\n\t\t// Nothing to clean up\n\t})\n\n\treturn {\n\t\tisPrinting,\n\t\tprint,\n\t\tprintPage,\n\t}\n}\n\n/**\n * Quick print function\n *\n * @param target - Element or selector to print\n * @param options - Print options\n *\n * @example\n * ```ts\n * import { quickPrint } from 'directix'\n *\n * // Print element by selector\n * quickPrint('#content', { title: 'My Document' })\n *\n * // Print element directly\n * const el = document.getElementById('content')\n * quickPrint(el)\n * ```\n */\nexport async function quickPrint(\n\ttarget: string | HTMLElement,\n\toptions: UsePrintOptions = {},\n): Promise<void> {\n\tconst { print } = usePrint(options)\n\tawait print(target)\n}\n","import { onUnmounted, ref, type Ref, unref } from 'vue'\n\n/**\n * Pull refresh handler\n */\nexport type PullRefreshHandler = () => Promise<void> | void\n\n/**\n * Pull refresh state\n */\nexport type PullRefreshState = 'idle' | 'pulling' | 'ready' | 'loading' | 'success' | 'error'\n\n/**\n * Options for usePullRefresh composable\n */\nexport interface UsePullRefreshOptions {\n\t/**\n\t * Refresh handler\n\t * @required\n\t */\n\thandler: PullRefreshHandler\n\n\t/**\n\t * Distance threshold to trigger refresh\n\t * @default 60\n\t */\n\tdistance?: number | Ref<number>\n\n\t/**\n\t * Maximum pull distance\n\t * @default 100\n\t */\n\tmaxDistance?: number | Ref<number>\n\n\t/**\n\t * Whether to disable pull to refresh\n\t * @default false\n\t */\n\tdisabled?: boolean | Ref<boolean>\n\n\t/**\n\t * Duration to show success indicator\n\t * @default 500\n\t */\n\tsuccessDuration?: number | Ref<number>\n\n\t/**\n\t * Duration to show error indicator\n\t * @default 1000\n\t */\n\terrorDuration?: number | Ref<number>\n}\n\n/**\n * Return type for usePullRefresh composable\n */\nexport interface UsePullRefreshReturn {\n\t/**\n\t * Current pull refresh state\n\t */\n\tstate: Ref<PullRefreshState>\n\n\t/**\n\t * Current pull distance\n\t */\n\tdistance: Ref<number>\n\n\t/**\n\t * Whether pull to refresh is currently active\n\t */\n\tisPulling: Ref<boolean>\n\n\t/**\n\t * Event handlers to bind to the container element\n\t */\n\tevents: {\n\t\ttouchstart: (e: TouchEvent) => void\n\t\ttouchmove: (e: TouchEvent) => void\n\t\ttouchend: () => void\n\t}\n\n\t/**\n\t * Container ref to bind to the scroll container\n\t */\n\tcontainerRef: Ref<HTMLElement | null>\n\n\t/**\n\t * Manually trigger refresh\n\t */\n\trefresh: () => Promise<void>\n}\n\n/**\n * Sleep utility\n */\nfunction sleep(ms: number): Promise<void> {\n\treturn new Promise(resolve => setTimeout(resolve, ms))\n}\n\n/**\n * Composable for pull to refresh functionality\n *\n * @param options - Configuration options\n * @returns Pull refresh utilities and state\n *\n * @example\n * ```vue\n * <script setup>\n * import { usePullRefresh } from 'directix'\n *\n * const { state, distance, events, containerRef } = usePullRefresh({\n * handler: async () => {\n * await fetchData()\n * },\n * distance: 80\n * })\n * </script>\n *\n * <template>\n * <div\n * ref=\"containerRef\"\n * @touchstart=\"events.touchstart\"\n * @touchmove=\"events.touchmove\"\n * @touchend=\"events.touchend\"\n * >\n * <div class=\"indicator\" :style=\"{ transform: `translateY(${distance}px)` }\">\n * {{ state }}\n * </div>\n * <slot></slot>\n * </div>\n * </template>\n * ```\n */\nexport function usePullRefresh(options: UsePullRefreshOptions): UsePullRefreshReturn {\n\tconst {\n\t\thandler,\n\t\tdistance = 60,\n\t\tmaxDistance = 100,\n\t\tdisabled = false,\n\t\tsuccessDuration = 500,\n\t\terrorDuration = 1000,\n\t} = options\n\n\t// State\n\tconst state = ref<PullRefreshState>('idle')\n\tconst distanceValue = ref(0)\n\tconst isPulling = ref(false)\n\tconst containerRef = ref<HTMLElement | null>(null)\n\n\t// Internal state\n\tlet startY = 0,\n\t\tcurrentY = 0\n\n\tconst getDistance = (): number => unref(distance)\n\tconst getMaxDistance = (): number => unref(maxDistance)\n\tconst getDisabled = (): boolean => unref(disabled)\n\tconst getSuccessDuration = (): number => unref(successDuration)\n\tconst getErrorDuration = (): number => unref(errorDuration)\n\n\t/**\n\t * Reset state\n\t */\n\tfunction reset(): void {\n\t\tstate.value = 'idle'\n\t\tdistanceValue.value = 0\n\t\tisPulling.value = false\n\t}\n\n\t/**\n\t * Trigger refresh\n\t */\n\tasync function refresh(): Promise<void> {\n\t\tstate.value = 'loading'\n\n\t\ttry {\n\t\t\tawait handler()\n\t\t\tstate.value = 'success'\n\t\t\tawait sleep(getSuccessDuration())\n\t\t} catch {\n\t\t\tstate.value = 'error'\n\t\t\tawait sleep(getErrorDuration())\n\t\t} finally {\n\t\t\treset()\n\t\t}\n\t}\n\n\t/**\n\t * Handle touch start\n\t */\n\tfunction touchstart(e: TouchEvent): void {\n\t\tif (getDisabled() || state.value === 'loading') return\n\n\t\tconst container = containerRef.value\n\t\tif (container && container.scrollTop > 0) return\n\n\t\tisPulling.value = true\n\t\tstartY = e.touches[0].clientY\n\t\tcurrentY = startY\n\t\tstate.value = 'idle'\n\t}\n\n\t/**\n\t * Handle touch move\n\t */\n\tfunction touchmove(e: TouchEvent): void {\n\t\tif (!isPulling.value || getDisabled() || state.value === 'loading') return\n\n\t\tcurrentY = e.touches[0].clientY\n\t\tconst diff = currentY - startY\n\n\t\t// Handle upward swipe - reset\n\t\tif (diff <= 0) {\n\t\t\tdistanceValue.value = 0\n\t\t\tstate.value = 'idle'\n\t\t\treturn\n\t\t}\n\n\t\t// Prevent page scroll\n\t\te.preventDefault()\n\n\t\tconst calculatedDistance = Math.min(diff * 0.5, getMaxDistance())\n\t\tdistanceValue.value = calculatedDistance\n\n\t\tconst progress = calculatedDistance / getDistance()\n\t\tstate.value = progress >= 1 ? 'ready' : 'pulling'\n\t}\n\n\t/**\n\t * Handle touch end\n\t */\n\tfunction touchend(): void {\n\t\tif (!isPulling.value || getDisabled()) return\n\n\t\tisPulling.value = false\n\n\t\tif (state.value === 'ready' && distanceValue.value >= getDistance()) {\n\t\t\trefresh()\n\t\t} else {\n\t\t\tdistanceValue.value = 0\n\t\t\treset()\n\t\t}\n\t}\n\n\t// Cleanup\n\tonUnmounted(() => {\n\t\treset()\n\t})\n\n\treturn {\n\t\tstate,\n\t\tdistance: distanceValue,\n\t\tisPulling,\n\t\tevents: {\n\t\t\ttouchstart,\n\t\t\ttouchmove,\n\t\t\ttouchend,\n\t\t},\n\t\tcontainerRef,\n\t\trefresh,\n\t}\n}\n","import { isBrowser, supportsResizeObserver } from '@directix/core'\nimport { onUnmounted, readonly, ref, type Ref, unref } from 'vue'\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}\n\n/**\n * Options for useResize composable\n */\nexport interface UseResizeOptions {\n\t/**\n\t * Debounce time in milliseconds\n\t * @default 0 (no debounce)\n\t */\n\tdebounce?: number | Ref<number>\n\n\t/**\n\t * Box model to observe\n\t * @default 'content-box'\n\t */\n\tbox?: 'content-box' | 'border-box' | 'device-pixel-content-box'\n\n\t/**\n\t * Callback when resize occurs\n\t */\n\tonResize?: (info: ResizeInfo) => void\n}\n\n/**\n * Return type for useResize composable\n */\nexport interface UseResizeReturn {\n\t/** Current width */\n\twidth: Readonly<Ref<number>>\n\n\t/** Current height */\n\theight: Readonly<Ref<number>>\n\n\t/** Bind resize observer to an element */\n\tbind: (element: HTMLElement) => () => void\n\n\t/** Stop observing */\n\tstop: () => void\n}\n\n/**\n * Composable for tracking element resize\n *\n * @param options - Configuration options\n * @returns Resize utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useResize } from 'directix'\n *\n * const target = ref(null)\n * const { width, height, bind } = useResize({\n * debounce: 100,\n * onResize: (info) => console.log('Resized:', info.width, info.height)\n * })\n *\n * onMounted(() => bind(target.value))\n * </script>\n *\n * <template>\n * <div ref=\"target\">\n * Size: {{ width }} x {{ height }}\n * </div>\n * </template>\n * ```\n */\nexport function useResize(options: UseResizeOptions = {}): UseResizeReturn {\n\tconst {\n\t\tdebounce = 0,\n\t\tbox = 'content-box',\n\t\tonResize,\n\t} = options\n\n\tconst width = ref(0)\n\tconst height = ref(0)\n\n\tlet observer: ResizeObserver | null = null,\n\t\tdebounceTimer: ReturnType<typeof setTimeout> | null = null,\n\t\tfallbackIframe: HTMLIFrameElement | null = null\n\n\tfunction handleResize(entry: ResizeObserverEntry): void {\n\t\tconst currentDebounce = unref(debounce)\n\n\t\tfunction doUpdate(): void {\n\t\t\twidth.value = entry.contentRect.width\n\t\t\theight.value = entry.contentRect.height\n\t\t\tonResize?.({\n\t\t\t\twidth: entry.contentRect.width,\n\t\t\t\theight: entry.contentRect.height,\n\t\t\t\tcontentRect: entry.contentRect,\n\t\t\t})\n\t\t}\n\n\t\tif (currentDebounce && currentDebounce > 0) {\n\t\t\tif (debounceTimer) {\n\t\t\t\tclearTimeout(debounceTimer)\n\t\t\t}\n\t\t\tdebounceTimer = setTimeout(doUpdate, currentDebounce)\n\t\t} else {\n\t\t\tdoUpdate()\n\t\t}\n\t}\n\n\tfunction createObserver(): void {\n\t\tif (!isBrowser()) return\n\n\t\tif (supportsResizeObserver()) {\n\t\t\tobserver = new ResizeObserver(entries => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\thandleResize(entry)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tfunction bind(element: HTMLElement): () => void {\n\t\tif (!isBrowser()) return () => {}\n\n\t\t// Cleanup previous\n\t\tstop()\n\n\t\t// Initialize with current size\n\t\tconst rect = element.getBoundingClientRect()\n\t\twidth.value = rect.width\n\t\theight.value = rect.height\n\n\t\tif (supportsResizeObserver()) {\n\t\t\tcreateObserver()\n\t\t\tobserver?.observe(element, { box })\n\t\t} else {\n\t\t\t// Fallback using iframe\n\t\t\tfallbackIframe = document.createElement('iframe')\n\t\t\tfallbackIframe.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\t\t\t// Ensure parent has position\n\t\t\tconst computedStyle = getComputedStyle(element)\n\t\t\tif (computedStyle.position === 'static') {\n\t\t\t\telement.style.position = 'relative'\n\t\t\t}\n\n\t\t\telement.appendChild(fallbackIframe)\n\n\t\t\tconst iWindow = fallbackIframe.contentWindow\n\t\t\tif (iWindow) {\n\t\t\t\tiWindow.addEventListener('resize', () => {\n\t\t\t\t\tconst rect = element.getBoundingClientRect()\n\t\t\t\t\thandleResize({\n\t\t\t\t\t\ttarget: element,\n\t\t\t\t\t\tcontentRect: rect as DOMRectReadOnly,\n\t\t\t\t\t\tborderBoxSize: [] as any,\n\t\t\t\t\t\tcontentBoxSize: [] as any,\n\t\t\t\t\t\tdevicePixelContentBoxSize: [] as any,\n\t\t\t\t\t} as ResizeObserverEntry)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn stop\n\t}\n\n\tfunction stop(): void {\n\t\tif (observer) {\n\t\t\tobserver.disconnect()\n\t\t\tobserver = null\n\t\t}\n\t\tif (fallbackIframe) {\n\t\t\tfallbackIframe.remove()\n\t\t\tfallbackIframe = null\n\t\t}\n\t\tif (debounceTimer) {\n\t\t\tclearTimeout(debounceTimer)\n\t\t\tdebounceTimer = null\n\t\t}\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tstop()\n\t})\n\n\treturn {\n\t\twidth: readonly(width),\n\t\theight: readonly(height),\n\t\tbind,\n\t\tstop,\n\t}\n}\n","import { isBrowser } from '@directix/core'\nimport { computed, onUnmounted, readonly, ref, type Ref, unref } from 'vue'\n\n/**\n * Scroll direction\n */\nexport type ScrollDirection = -1 | 0 | 1\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: ScrollDirection\n\t/** Direction of vertical scroll (-1: up, 1: down, 0: none) */\n\tdirectionY: ScrollDirection\n}\n\n/**\n * Options for useScroll composable\n */\nexport interface UseScrollOptions {\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 0 (no throttle)\n\t */\n\tthrottle?: number | Ref<number>\n\n\t/**\n\t * Whether to use passive event listener\n\t * @default true\n\t */\n\tpassive?: boolean\n}\n\n/**\n * Return type for useScroll composable\n */\nexport interface UseScrollReturn {\n\t/** Current scroll left position */\n\tscrollLeft: Readonly<Ref<number>>\n\n\t/** Current scroll top position */\n\tscrollTop: Readonly<Ref<number>>\n\n\t/** Horizontal scroll progress (0-1) */\n\tprogressX: Readonly<Ref<number>>\n\n\t/** Vertical scroll progress (0-1) */\n\tprogressY: Readonly<Ref<number>>\n\n\t/** Direction of horizontal scroll */\n\tdirectionX: Readonly<Ref<ScrollDirection>>\n\n\t/** Direction of vertical scroll */\n\tdirectionY: Readonly<Ref<ScrollDirection>>\n\n\t/** Whether the user is scrolling */\n\tisScrolling: Readonly<Ref<boolean>>\n\n\t/** Scroll info object (reactive) */\n\tinfo: Readonly<Ref<ScrollInfo>>\n\n\t/** Bind scroll listener to an element */\n\tbind: (element?: HTMLElement | Window) => () => void\n\n\t/** Stop listening */\n\tstop: () => void\n\n\t/** Scroll to a position */\n\tscrollTo: (options: { top?: number, left?: number, behavior?: 'auto' | 'smooth' }) => void\n}\n\n/**\n * Get scroll info from container\n */\nfunction getScrollInfoFromContainer(\n\tcontainer: Element | Window,\n\tlastScrollLeft: number,\n\tlastScrollTop: number,\n): 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\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\tconst directionX: ScrollDirection = scrollLeft !== lastScrollLeft ? (scrollLeft > lastScrollLeft ? 1 : -1) : 0\n\tconst directionY: ScrollDirection = 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}\n}\n\n/**\n * Composable for tracking scroll position\n *\n * @param options - Configuration options\n * @returns Scroll utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useScroll } from 'directix'\n *\n * const container = ref(null)\n * const { scrollTop, progressY, directionY, bind } = useScroll()\n *\n * onMounted(() => bind(container.value))\n * </script>\n *\n * <template>\n * <div ref=\"container\" class=\"scroll-container\">\n * <div class=\"progress\" :style=\"{ width: `${progressY * 100}%` }\" />\n * </div>\n * </template>\n * ```\n */\nexport function useScroll(options: UseScrollOptions = {}): UseScrollReturn {\n\tconst { throttle = 0, passive = true } = options\n\n\tconst scrollLeft = ref(0)\n\tconst scrollTop = ref(0)\n\tconst progressX = ref(0)\n\tconst progressY = ref(0)\n\tconst directionX = ref<ScrollDirection>(0)\n\tconst directionY = ref<ScrollDirection>(0)\n\tconst isScrolling = ref(false)\n\n\tlet container: Element | Window | null = null,\n\t\tlastScrollLeft = 0,\n\t\tlastScrollTop = 0,\n\t\tscrollHandler: ((e: Event) => void) | null = null,\n\t\tthrottleTimer: ReturnType<typeof setTimeout> | null = null,\n\t\tscrollTimeout: ReturnType<typeof setTimeout> | null = null\n\n\tconst info = computed<ScrollInfo>(() => ({\n\t\tscrollLeft: scrollLeft.value,\n\t\tscrollTop: scrollTop.value,\n\t\tscrollLeftMax: 0,\n\t\tscrollTopMax: 0,\n\t\tprogressX: progressX.value,\n\t\tprogressY: progressY.value,\n\t\tdirectionX: directionX.value,\n\t\tdirectionY: directionY.value,\n\t}))\n\n\tfunction updateScrollInfo(_e: Event): void {\n\t\tif (!container) return\n\n\t\tconst currentThrottle = unref(throttle)\n\n\t\tfunction doUpdate(): void {\n\t\t\tconst scrollInfo = getScrollInfoFromContainer(container!, lastScrollLeft, lastScrollTop)\n\n\t\t\tscrollLeft.value = scrollInfo.scrollLeft\n\t\t\tscrollTop.value = scrollInfo.scrollTop\n\t\t\tprogressX.value = scrollInfo.progressX\n\t\t\tprogressY.value = scrollInfo.progressY\n\t\t\tdirectionX.value = scrollInfo.directionX\n\t\t\tdirectionY.value = scrollInfo.directionY\n\n\t\t\tlastScrollLeft = scrollInfo.scrollLeft\n\t\t\tlastScrollTop = scrollInfo.scrollTop\n\n\t\t\tisScrolling.value = true\n\n\t\t\t// Reset isScrolling after 150ms\n\t\t\tif (scrollTimeout) {\n\t\t\t\tclearTimeout(scrollTimeout)\n\t\t\t}\n\t\t\tscrollTimeout = setTimeout(() => {\n\t\t\t\tisScrolling.value = false\n\t\t\t}, 150)\n\t\t}\n\n\t\tif (currentThrottle && currentThrottle > 0) {\n\t\t\tif (!throttleTimer) {\n\t\t\t\tthrottleTimer = setTimeout(() => {\n\t\t\t\t\tdoUpdate()\n\t\t\t\t\tthrottleTimer = null\n\t\t\t\t}, currentThrottle)\n\t\t\t}\n\t\t} else {\n\t\t\tdoUpdate()\n\t\t}\n\t}\n\n\tfunction bind(element?: HTMLElement | Window): () => void {\n\t\tif (!isBrowser()) return () => {}\n\n\t\t// Cleanup previous\n\t\tstop()\n\n\t\tif (element) {\n\t\t\tcontainer = element\n\t\t} else {\n\t\t\tcontainer = window\n\t\t}\n\n\t\t// Initialize values\n\t\tconst initialInfo = getScrollInfoFromContainer(container, 0, 0)\n\t\tscrollLeft.value = initialInfo.scrollLeft\n\t\tscrollTop.value = initialInfo.scrollTop\n\t\tprogressX.value = initialInfo.progressX\n\t\tprogressY.value = initialInfo.progressY\n\t\tlastScrollLeft = initialInfo.scrollLeft\n\t\tlastScrollTop = initialInfo.scrollTop\n\n\t\tscrollHandler = updateScrollInfo\n\t\tcontainer.addEventListener('scroll', scrollHandler, { passive })\n\n\t\treturn stop\n\t}\n\n\tfunction stop(): void {\n\t\tif (container && scrollHandler) {\n\t\t\tcontainer.removeEventListener('scroll', scrollHandler)\n\t\t}\n\t\tif (throttleTimer) {\n\t\t\tclearTimeout(throttleTimer)\n\t\t\tthrottleTimer = null\n\t\t}\n\t\tif (scrollTimeout) {\n\t\t\tclearTimeout(scrollTimeout)\n\t\t\tscrollTimeout = null\n\t\t}\n\t\tcontainer = null\n\t\tscrollHandler = null\n\t}\n\n\tfunction scrollTo(opts: { top?: number, left?: number, behavior?: 'auto' | 'smooth' }): void {\n\t\tif (!container) return\n\n\t\tconst { top, left, behavior = 'smooth' } = opts\n\n\t\tif (container === window) {\n\t\t\twindow.scrollTo({\n\t\t\t\ttop,\n\t\t\t\tleft,\n\t\t\t\tbehavior,\n\t\t\t})\n\t\t} else {\n\t\t\tconst el = container as Element\n\t\t\tif (top !== undefined) el.scrollTop = top\n\t\t\tif (left !== undefined) el.scrollLeft = left\n\t\t}\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tstop()\n\t})\n\n\treturn {\n\t\tscrollLeft: readonly(scrollLeft),\n\t\tscrollTop: readonly(scrollTop),\n\t\tprogressX: readonly(progressX),\n\t\tprogressY: readonly(progressY),\n\t\tdirectionX: readonly(directionX),\n\t\tdirectionY: readonly(directionY),\n\t\tisScrolling: readonly(isScrolling),\n\t\tinfo: readonly(info),\n\t\tbind,\n\t\tstop,\n\t\tscrollTo,\n\t}\n}\n","import { isBrowser } from '@directix/core'\nimport { onUnmounted, readonly, ref, type Ref, unref } from 'vue'\n\n/**\n * Swipe direction\n */\nexport type SwipeDirection = 'left' | 'right' | 'up' | 'down'\n\n/**\n * Swipe handler type\n */\nexport type SwipeHandler = (direction: SwipeDirection, event: Event) => void\n\n/**\n * Options for useSwipe composable\n */\nexport interface UseSwipeOptions {\n\t/**\n\t * Swipe handler\n\t */\n\thandler?: SwipeHandler\n\n\t/**\n\t * Minimum distance to trigger swipe\n\t * @default 30\n\t */\n\tthreshold?: number | Ref<number>\n\n\t/**\n\t * Maximum time for swipe\n\t * @default 500\n\t */\n\tmaxTime?: number | Ref<number>\n\n\t/**\n\t * Allowed directions\n\t * @default ['left', 'right', 'up', 'down']\n\t */\n\tdirections?: SwipeDirection[]\n\n\t/**\n\t * Whether to prevent scroll on swipe\n\t * @default true\n\t */\n\tpreventScrollOnSwipe?: boolean\n\n\t/**\n\t * Whether to enable mouse events\n\t * @default true\n\t */\n\tmouse?: boolean\n\n\t/**\n\t * Callback for left swipe\n\t */\n\tonLeft?: () => void\n\n\t/**\n\t * Callback for right swipe\n\t */\n\tonRight?: () => void\n\n\t/**\n\t * Callback for up swipe\n\t */\n\tonUp?: () => void\n\n\t/**\n\t * Callback for down swipe\n\t */\n\tonDown?: () => void\n}\n\n/**\n * Return type for useSwipe composable\n */\nexport interface UseSwipeReturn {\n\t/** Current swipe direction */\n\tdirection: Readonly<Ref<SwipeDirection | null>>\n\n\t/** Length of the swipe */\n\tlengthX: Readonly<Ref<number>>\n\n\t/** Length of the swipe */\n\tlengthY: Readonly<Ref<number>>\n\n\t/** Whether a swipe is being performed */\n\tisSwiping: Readonly<Ref<boolean>>\n\n\t/** Bind swipe detection to an element */\n\tbind: (element: HTMLElement) => () => void\n}\n\nconst DEFAULT_DIRECTIONS: SwipeDirection[] = ['left', 'right', 'up', 'down']\n\n/**\n * Get swipe direction from delta\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\n/**\n * Composable for detecting swipe gestures\n *\n * @param options - Configuration options\n * @returns Swipe utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useSwipe } from 'directix'\n *\n * const container = ref(null)\n * const { direction, bind } = useSwipe({\n * onLeft: () => nextSlide(),\n * onRight: () => prevSlide()\n * })\n *\n * onMounted(() => bind(container.value))\n * </script>\n *\n * <template>\n * <div ref=\"container\">\n * Swipe me!\n * </div>\n * </template>\n * ```\n */\nexport function useSwipe(options: UseSwipeOptions = {}): UseSwipeReturn {\n\tconst {\n\t\thandler,\n\t\tthreshold = 30,\n\t\tmaxTime = 500,\n\t\tdirections = DEFAULT_DIRECTIONS,\n\t\tpreventScrollOnSwipe = true,\n\t\tmouse = true,\n\t\tonLeft,\n\t\tonRight,\n\t\tonUp,\n\t\tonDown,\n\t} = options\n\n\tconst direction = ref<SwipeDirection | null>(null)\n\tconst lengthX = ref(0)\n\tconst lengthY = ref(0)\n\tconst isSwiping = ref(false)\n\n\tlet currentElement: HTMLElement | null = null,\n\t\tstartX = 0,\n\t\tstartY = 0,\n\t\tstartTime = 0\n\n\tfunction triggerSwipe(deltaX: number, deltaY: number, deltaTime: number, event: Event): void {\n\t\tconst currentThreshold = unref(threshold)\n\t\tconst currentMaxTime = unref(maxTime)\n\n\t\t// Check time\n\t\tif (deltaTime > currentMaxTime) return\n\n\t\t// Check distance\n\t\tconst distance = Math.max(Math.abs(deltaX), Math.abs(deltaY))\n\t\tif (distance < currentThreshold) return\n\n\t\t// Get direction\n\t\tconst swipeDirection = getSwipeDirection(deltaX, deltaY, directions)\n\t\tif (!swipeDirection) return\n\n\t\tdirection.value = swipeDirection\n\t\tlengthX.value = deltaX\n\t\tlengthY.value = deltaY\n\n\t\t// Prevent scroll\n\t\tif (preventScrollOnSwipe && event.cancelable) {\n\t\t\tevent.preventDefault()\n\t\t}\n\n\t\t// Call handler\n\t\thandler?.(swipeDirection, event)\n\n\t\t// Direction-specific callbacks\n\t\tconst callbacks: Record<SwipeDirection, (() => void) | undefined> = {\n\t\t\tleft: onLeft,\n\t\t\tright: onRight,\n\t\t\tup: onUp,\n\t\t\tdown: onDown,\n\t\t}\n\t\tcallbacks[swipeDirection]?.()\n\n\t\t// Dispatch custom event\n\t\tcurrentElement?.dispatchEvent(new CustomEvent('swipe', {\n\t\t\tdetail: { direction: swipeDirection, deltaX, deltaY, deltaTime },\n\t\t}))\n\t}\n\n\tfunction handleStart(clientX: number, clientY: number): void {\n\t\tstartX = clientX\n\t\tstartY = clientY\n\t\tstartTime = Date.now()\n\t\tisSwiping.value = true\n\t\tdirection.value = null\n\t\tlengthX.value = 0\n\t\tlengthY.value = 0\n\t}\n\n\tfunction handleEnd(clientX: number, clientY: number, event: Event): void {\n\t\tif (!isSwiping.value) return\n\n\t\tisSwiping.value = false\n\t\tconst deltaX = clientX - startX\n\t\tconst deltaY = clientY - startY\n\t\tconst deltaTime = Date.now() - startTime\n\n\t\ttriggerSwipe(deltaX, deltaY, deltaTime, event)\n\t}\n\n\tfunction touchStart(e: TouchEvent): void {\n\t\thandleStart(e.touches[0].clientX, e.touches[0].clientY)\n\t}\n\n\tfunction touchMove(e: TouchEvent): void {\n\t\tif (!isSwiping.value || !preventScrollOnSwipe) return\n\t\te.preventDefault()\n\t}\n\n\tfunction touchEnd(e: TouchEvent): void {\n\t\tconst touch = e.changedTouches[0]\n\t\thandleEnd(touch.clientX, touch.clientY, e)\n\t}\n\n\tfunction mouseDown(e: MouseEvent): void {\n\t\thandleStart(e.clientX, e.clientY)\n\t}\n\n\tfunction mouseUp(e: MouseEvent): void {\n\t\thandleEnd(e.clientX, e.clientY, e)\n\t}\n\n\tfunction mouseLeave(e: MouseEvent): void {\n\t\tif (isSwiping.value) {\n\t\t\thandleEnd(e.clientX, e.clientY, e)\n\t\t}\n\t}\n\n\tfunction bind(element: HTMLElement): () => void {\n\t\tif (!isBrowser()) return () => {}\n\n\t\t// Cleanup previous\n\t\tunbind()\n\n\t\tcurrentElement = element\n\n\t\telement.style.touchAction = 'none'\n\t\telement.style.userSelect = 'none'\n\n\t\telement.addEventListener('touchstart', touchStart, { passive: true })\n\t\telement.addEventListener('touchmove', touchMove, { passive: false })\n\t\telement.addEventListener('touchend', touchEnd)\n\t\telement.addEventListener('touchcancel', touchEnd)\n\n\t\tif (unref(mouse)) {\n\t\t\telement.addEventListener('mousedown', mouseDown)\n\t\t\telement.addEventListener('mouseup', mouseUp)\n\t\t\telement.addEventListener('mouseleave', mouseLeave)\n\t\t}\n\n\t\treturn unbind\n\t}\n\n\tfunction unbind(): void {\n\t\tif (!currentElement) return\n\n\t\tcurrentElement.removeEventListener('touchstart', touchStart)\n\t\tcurrentElement.removeEventListener('touchmove', touchMove)\n\t\tcurrentElement.removeEventListener('touchend', touchEnd)\n\t\tcurrentElement.removeEventListener('touchcancel', touchEnd)\n\n\t\tif (unref(mouse)) {\n\t\t\tcurrentElement.removeEventListener('mousedown', mouseDown)\n\t\t\tcurrentElement.removeEventListener('mouseup', mouseUp)\n\t\t\tcurrentElement.removeEventListener('mouseleave', mouseLeave)\n\t\t}\n\n\t\tcurrentElement = null\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tunbind()\n\t})\n\n\treturn {\n\t\tdirection: readonly(direction),\n\t\tlengthX: readonly(lengthX),\n\t\tlengthY: readonly(lengthY),\n\t\tisSwiping: readonly(isSwiping),\n\t\tbind,\n\t}\n}\n","import { throttle } from '@directix/shared'\nimport { onUnmounted, type Ref, unref } from 'vue'\n\n/**\n * Options for useThrottle composable\n */\nexport interface UseThrottleOptions<T extends (...args: 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 | Ref<number>\n\n\t/**\n\t * Whether to invoke immediately before delay starts\n\t * @default true\n\t */\n\tleading?: boolean | Ref<boolean>\n\n\t/**\n\t * Whether to invoke after delay ends\n\t * @default true\n\t */\n\ttrailing?: boolean | Ref<boolean>\n}\n\n/**\n * Throttled function type for composables\n */\nexport interface ComposableThrottledFunction<T extends (...args: any[]) => any> {\n\t/**\n\t * Call the throttled function\n\t */\n\t(...args: Parameters<T>): void\n\n\t/**\n\t * Cancel any pending execution\n\t */\n\tcancel: () => void\n}\n\n/**\n * Return type for useThrottle composable\n */\nexport interface UseThrottleReturn<T extends (...args: any[]) => any> {\n\t/**\n\t * Throttled function\n\t */\n\trun: (...args: Parameters<T>) => void\n\n\t/**\n\t * Cancel any pending execution\n\t */\n\tcancel: () => void\n}\n\n/**\n * Composable for throttling function calls\n *\n * @param options - Configuration options\n * @returns Throttled function utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useThrottle } from 'directix'\n *\n * const { run: throttledScroll } = useThrottle({\n * handler: (event) => {\n * console.log('Scroll position:', event.target.scrollTop)\n * },\n * wait: 100\n * })\n *\n * // Use in template\n * // <div @scroll=\"throttledScroll($event)\">...</div>\n * </script>\n * ```\n */\nexport function useThrottle<T extends (...args: any[]) => any>(\n\toptions: UseThrottleOptions<T>,\n): UseThrottleReturn<T> {\n\tconst {\n\t\thandler,\n\t\twait = 300,\n\t\tleading = true,\n\t\ttrailing = true,\n\t} = options\n\n\t// Internal state\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 getWait = (): number => unref(wait)\n\tconst getLeading = (): boolean => unref(leading)\n\tconst getTrailing = (): boolean => unref(trailing)\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\thandler.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tfunction run(this: any, ...args: Parameters<T>): void {\n\t\tconst now = Date.now()\n\t\tconst currentWait = getWait()\n\n\t\tif (!lastCallTime && !getLeading()) {\n\t\t\tlastCallTime = now\n\t\t}\n\n\t\tconst remaining = currentWait - (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 > currentWait) {\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 && getTrailing()) {\n\t\t\ttimerId = setTimeout(() => {\n\t\t\t\tlastCallTime = getLeading() ? Date.now() : 0\n\t\t\t\ttimerId = null\n\t\t\t\tinvokeFunc()\n\t\t\t}, remaining)\n\t\t}\n\t}\n\n\tfunction cancel(): void {\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\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tcancel()\n\t})\n\n\treturn {\n\t\trun,\n\t\tcancel,\n\t}\n}\n\n/**\n * Simple throttle function wrapper\n *\n * @param fn - Function to throttle\n * @param wait - Delay in milliseconds\n * @returns Throttled function with cancel method\n *\n * @example\n * ```ts\n * import { throttleFn } from 'directix'\n *\n * const throttledUpdate = throttleFn(updateData, 1000)\n *\n * // Call multiple times, only executes once per second\n * throttledUpdate(data)\n * throttledUpdate(newData)\n *\n * // Cancel pending execution\n * throttledUpdate.cancel()\n * ```\n */\nexport function throttleFn<T extends (...args: any[]) => any>(\n\tfn: T,\n\twait: number = 300,\n\toptions?: {\n\t\tleading?: boolean\n\t\ttrailing?: boolean\n\t},\n): ComposableThrottledFunction<T> {\n\treturn throttle(fn, wait, options) as ComposableThrottledFunction<T>\n}\n","import { isBrowser } from '@directix/core'\nimport { onUnmounted, readonly, ref, type Ref, unref } from 'vue'\n\n/**\n * Touch gesture type\n */\nexport type TouchGesture = 'swipe' | 'pinch' | 'rotate' | 'tap' | 'longPress'\n\n/**\n * Touch gesture event\n */\nexport interface TouchGestureEvent {\n\ttype: TouchGesture\n\tdirection?: 'left' | 'right' | 'up' | 'down'\n\tdistance?: number\n\tangle?: number\n\tscale?: number\n\trotation?: number\n\tcenter?: { x: number, y: number }\n\tevent: TouchEvent\n}\n\n/**\n * Options for useTouch composable\n */\nexport interface UseTouchOptions {\n\t/**\n\t * Callback for swipe gesture\n\t */\n\tonSwipe?: (event: TouchGestureEvent) => void\n\n\t/**\n\t * Callback for swipe left\n\t */\n\tonSwipeLeft?: (event: TouchGestureEvent) => void\n\n\t/**\n\t * Callback for swipe right\n\t */\n\tonSwipeRight?: (event: TouchGestureEvent) => void\n\n\t/**\n\t * Callback for swipe up\n\t */\n\tonSwipeUp?: (event: TouchGestureEvent) => void\n\n\t/**\n\t * Callback for swipe down\n\t */\n\tonSwipeDown?: (event: TouchGestureEvent) => void\n\n\t/**\n\t * Callback for pinch gesture\n\t */\n\tonPinch?: (event: TouchGestureEvent) => void\n\n\t/**\n\t * Callback for rotate gesture\n\t */\n\tonRotate?: (event: TouchGestureEvent) => void\n\n\t/**\n\t * Callback for tap gesture\n\t */\n\tonTap?: (event: TouchGestureEvent) => void\n\n\t/**\n\t * Callback for long press gesture\n\t */\n\tonLongPress?: (event: TouchGestureEvent) => void\n\n\t/**\n\t * Swipe threshold distance in pixels\n\t * @default 30\n\t */\n\tswipeThreshold?: number\n\n\t/**\n\t * Long press duration in milliseconds\n\t * @default 500\n\t */\n\tlongPressDuration?: number\n\n\t/**\n\t * Tap max duration in milliseconds\n\t * @default 250\n\t */\n\ttapDuration?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean | Ref<boolean>\n}\n\n/**\n * Return type for useTouch composable\n */\nexport interface UseTouchReturn {\n\t/** Current gesture being performed */\n\tgesture: Readonly<Ref<TouchGesture | null>>\n\n\t/** Bind touch events to an element */\n\tbind: (element: HTMLElement) => () => void\n}\n\n/**\n * Composable for touch gesture detection\n *\n * @param options - Configuration options\n * @returns Touch gesture utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useTouch } from 'directix'\n *\n * const containerRef = ref(null)\n * const { gesture, bind } = useTouch({\n * onSwipeLeft: () => nextSlide(),\n * onSwipeRight: () => prevSlide()\n * })\n *\n * onMounted(() => bind(containerRef.value))\n * </script>\n *\n * <template>\n * <div ref=\"containerRef\">\n * Swipe me!\n * </div>\n * </template>\n * ```\n */\nexport function useTouch(options: UseTouchOptions = {}): UseTouchReturn {\n\tconst {\n\t\tonSwipe,\n\t\tonSwipeLeft,\n\t\tonSwipeRight,\n\t\tonSwipeUp,\n\t\tonSwipeDown,\n\t\tonPinch,\n\t\tonRotate,\n\t\tonTap,\n\t\tonLongPress,\n\t\tswipeThreshold = 30,\n\t\tlongPressDuration = 500,\n\t\ttapDuration = 250,\n\t\tdisabled = false,\n\t} = options\n\n\tconst gesture = ref<TouchGesture | null>(null)\n\n\tlet currentElement: HTMLElement | null = null,\n\t\tstartX = 0,\n\t\tstartY = 0,\n\t\tstartTime = 0,\n\t\tlongPressTimer: ReturnType<typeof setTimeout> | null = null,\n\t\tinitialPinchDistance = 0,\n\t\tinitialAngle = 0\n\n\tfunction getTouchCenter(touches: TouchList): { x: number, y: number } {\n\t\tlet x = 0,\n\t\t\ty = 0\n\t\tfor (let i = 0; i < touches.length; i++) {\n\t\t\tx += touches[i].clientX\n\t\t\ty += touches[i].clientY\n\t\t}\n\t\treturn { x: x / touches.length, y: y / touches.length }\n\t}\n\n\tfunction getDistance(touch1: Touch, touch2: Touch): number {\n\t\tconst dx = touch1.clientX - touch2.clientX\n\t\tconst dy = touch1.clientY - touch2.clientY\n\t\treturn Math.sqrt(dx * dx + dy * dy)\n\t}\n\n\tfunction getAngle(touch1: Touch, touch2: Touch): number {\n\t\treturn Math.atan2(touch2.clientY - touch1.clientY, touch2.clientX - touch1.clientX) * (180 / Math.PI)\n\t}\n\n\tfunction handleTouchStart(e: TouchEvent): void {\n\t\tif (unref(disabled)) return\n\n\t\tstartTime = Date.now()\n\t\tgesture.value = null\n\n\t\tif (e.touches.length === 1) {\n\t\t\tstartX = e.touches[0].clientX\n\t\t\tstartY = e.touches[0].clientY\n\n\t\t\t// Start long press timer\n\t\t\tif (onLongPress) {\n\t\t\t\tlongPressTimer = setTimeout(() => {\n\t\t\t\t\tgesture.value = 'longPress'\n\t\t\t\t\tonLongPress({\n\t\t\t\t\t\ttype: 'longPress',\n\t\t\t\t\t\tcenter: { x: startX, y: startY },\n\t\t\t\t\t\tevent: e,\n\t\t\t\t\t})\n\t\t\t\t}, longPressDuration)\n\t\t\t}\n\t\t} else if (e.touches.length === 2) {\n\t\t\t// Pinch/Rotate gesture start\n\t\t\tinitialPinchDistance = getDistance(e.touches[0], e.touches[1])\n\t\t\tinitialAngle = getAngle(e.touches[0], e.touches[1])\n\t\t}\n\t}\n\n\tfunction handleTouchMove(e: TouchEvent): void {\n\t\tif (unref(disabled)) return\n\n\t\t// Cancel long press if moved\n\t\tif (longPressTimer) {\n\t\t\tclearTimeout(longPressTimer)\n\t\t\tlongPressTimer = null\n\t\t}\n\n\t\tif (e.touches.length === 2 && (onPinch || onRotate)) {\n\t\t\tconst currentDistance = getDistance(e.touches[0], e.touches[1])\n\t\t\tconst currentAngle = getAngle(e.touches[0], e.touches[1])\n\n\t\t\tif (onPinch && initialPinchDistance > 0) {\n\t\t\t\tconst scale = currentDistance / initialPinchDistance\n\t\t\t\tgesture.value = 'pinch'\n\t\t\t\tonPinch({\n\t\t\t\t\ttype: 'pinch',\n\t\t\t\t\tscale,\n\t\t\t\t\tcenter: getTouchCenter(e.touches),\n\t\t\t\t\tevent: e,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (onRotate) {\n\t\t\t\tconst rotation = currentAngle - initialAngle\n\t\t\t\tgesture.value = 'rotate'\n\t\t\t\tonRotate({\n\t\t\t\t\ttype: 'rotate',\n\t\t\t\t\trotation,\n\t\t\t\t\tcenter: getTouchCenter(e.touches),\n\t\t\t\t\tevent: e,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction handleTouchEnd(e: TouchEvent): void {\n\t\tif (unref(disabled)) return\n\n\t\t// Cancel long press timer\n\t\tif (longPressTimer) {\n\t\t\tclearTimeout(longPressTimer)\n\t\t\tlongPressTimer = null\n\t\t}\n\n\t\tconst duration = Date.now() - startTime\n\n\t\tif (e.changedTouches.length === 1) {\n\t\t\tconst endX = e.changedTouches[0].clientX\n\t\t\tconst endY = e.changedTouches[0].clientY\n\t\t\tconst deltaX = endX - startX\n\t\t\tconst deltaY = endY - startY\n\t\t\tconst distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY)\n\n\t\t\t// Check for swipe\n\t\t\tif (distance >= swipeThreshold) {\n\t\t\t\tgesture.value = 'swipe'\n\t\t\t\tlet direction: 'left' | 'right' | 'up' | 'down'\n\n\t\t\t\tif (Math.abs(deltaX) > Math.abs(deltaY)) {\n\t\t\t\t\tdirection = deltaX > 0 ? 'right' : 'left'\n\t\t\t\t} else {\n\t\t\t\t\tdirection = deltaY > 0 ? 'down' : 'up'\n\t\t\t\t}\n\n\t\t\t\tconst event: TouchGestureEvent = {\n\t\t\t\t\ttype: 'swipe',\n\t\t\t\t\tdirection,\n\t\t\t\t\tdistance,\n\t\t\t\t\tangle: Math.atan2(deltaY, deltaX) * (180 / Math.PI),\n\t\t\t\t\tcenter: { x: endX, y: endY },\n\t\t\t\t\tevent: e,\n\t\t\t\t}\n\n\t\t\t\tonSwipe?.(event)\n\n\t\t\t\tswitch (direction) {\n\t\t\t\t\tcase 'left':\n\t\t\t\t\t\tonSwipeLeft?.(event)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'right':\n\t\t\t\t\t\tonSwipeRight?.(event)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'up':\n\t\t\t\t\t\tonSwipeUp?.(event)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'down':\n\t\t\t\t\t\tonSwipeDown?.(event)\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} else if (distance < 10 && duration < tapDuration && onTap) {\n\t\t\t\tgesture.value = 'tap'\n\t\t\t\tonTap({\n\t\t\t\t\ttype: 'tap',\n\t\t\t\t\tcenter: { x: endX, y: endY },\n\t\t\t\t\tevent: e,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tgesture.value = null\n\t}\n\n\tfunction bind(element: HTMLElement): () => void {\n\t\tif (!isBrowser()) return () => {}\n\n\t\t// Cleanup previous\n\t\tunbind()\n\n\t\tcurrentElement = element\n\n\t\telement.addEventListener('touchstart', handleTouchStart, { passive: true })\n\t\telement.addEventListener('touchmove', handleTouchMove, { passive: true })\n\t\telement.addEventListener('touchend', handleTouchEnd)\n\t\telement.addEventListener('touchcancel', handleTouchEnd)\n\n\t\treturn unbind\n\t}\n\n\tfunction unbind(): void {\n\t\tif (currentElement) {\n\t\t\tcurrentElement.removeEventListener('touchstart', handleTouchStart)\n\t\t\tcurrentElement.removeEventListener('touchmove', handleTouchMove)\n\t\t\tcurrentElement.removeEventListener('touchend', handleTouchEnd)\n\t\t\tcurrentElement.removeEventListener('touchcancel', handleTouchEnd)\n\t\t}\n\n\t\tif (longPressTimer) {\n\t\t\tclearTimeout(longPressTimer)\n\t\t\tlongPressTimer = null\n\t\t}\n\n\t\tcurrentElement = null\n\t\tgesture.value = null\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tunbind()\n\t})\n\n\treturn {\n\t\tgesture: readonly(gesture),\n\t\tbind,\n\t}\n}\n","import { ref, type Ref, unref, watch } from 'vue'\n\n/**\n * Trim position\n */\nexport type TrimPosition = 'start' | 'end' | 'both'\n\n/**\n * Options for useTrim composable\n */\nexport interface UseTrimOptions {\n\t/**\n\t * The text to trim\n\t */\n\ttext: string | Ref<string>\n\n\t/**\n\t * Trim position\n\t * @default 'both'\n\t */\n\tposition?: TrimPosition | Ref<TrimPosition>\n\n\t/**\n\t * Custom characters to trim (in addition to whitespace)\n\t */\n\tchars?: string | Ref<string>\n}\n\n/**\n * Return type for useTrim composable\n */\nexport interface UseTrimReturn {\n\t/**\n\t * The trimmed text\n\t */\n\ttrimmed: Ref<string>\n\n\t/**\n\t * Original text\n\t */\n\toriginal: Ref<string>\n\n\t/**\n\t * Whether the text was trimmed\n\t */\n\twasTrimmed: Ref<boolean>\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegex(str: string): string {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * Trim text based on options\n */\nfunction trimText(\n\ttext: string,\n\tposition: TrimPosition = 'both',\n\tchars?: string,\n): string {\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 * Composable for trimming text\n *\n * @param options - Configuration options\n * @returns Trimmed text utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useTrim } from 'directix'\n *\n * const text = ref(' hello world ')\n *\n * const { trimmed, wasTrimmed } = useTrim({ text })\n * // trimmed.value = 'hello world'\n * // wasTrimmed.value = true\n * </script>\n *\n * <template>\n * <p>{{ trimmed }}</p>\n * </template>\n * ```\n */\nexport function useTrim(options: UseTrimOptions): UseTrimReturn {\n\tconst {\n\t\ttext,\n\t\tposition = 'both',\n\t\tchars,\n\t} = options\n\n\t// State\n\tconst original = ref(unref(text))\n\tconst trimmed = ref('')\n\tconst wasTrimmed = ref(false)\n\n\t/**\n\t * Calculate trimmed text\n\t */\n\tfunction calculate(): void {\n\t\tconst textValue = unref(text)\n\t\tconst positionValue = unref(position)\n\t\tconst charsValue = unref(chars)\n\n\t\toriginal.value = textValue\n\t\ttrimmed.value = trimText(textValue, positionValue, charsValue)\n\t\twasTrimmed.value = trimmed.value !== textValue\n\t}\n\n\t// Watch for changes\n\twatch(\n\t\t() => [unref(text), unref(position), unref(chars)],\n\t\t() => calculate(),\n\t\t{ immediate: true },\n\t)\n\n\treturn {\n\t\ttrimmed,\n\t\toriginal,\n\t\twasTrimmed,\n\t}\n}\n\n/**\n * Utility function to trim text\n *\n * @param text - Text to trim\n * @param position - Trim position\n * @param chars - Custom characters to trim\n * @returns Trimmed text\n *\n * @example\n * ```ts\n * import { trimText } from 'directix'\n *\n * trimText(' hello ') // 'hello'\n * trimText(' hello ', 'start') // 'hello '\n * trimText('**hello**', 'both', '*') // 'hello'\n * ```\n */\nexport { trimText }\n\n/**\n * Create a trim function with preset options\n *\n * @param position - Trim position\n * @param chars - Custom characters to trim\n * @returns Trim function\n *\n * @example\n * ```ts\n * import { createTrimmer } from 'directix'\n *\n * const trimStart = createTrimmer('start')\n * trimStart(' hello ') // 'hello '\n *\n * const trimAsterisks = createTrimmer('both', '*')\n * trimAsterisks('**hello**') // 'hello'\n * ```\n */\nexport function createTrimmer(\n\tposition: TrimPosition = 'both',\n\tchars?: string,\n): (text: string) => string {\n\treturn (text: string) => trimText(text, position, chars)\n}\n","import { ref, type Ref, unref, watch } from 'vue'\n\n/**\n * Options for useUppercase composable\n */\nexport interface UseUppercaseOptions {\n\t/**\n\t * The text to transform\n\t */\n\ttext: string | Ref<string>\n\n\t/**\n\t * Transform only the first character\n\t * @default false\n\t */\n\tfirst?: boolean | Ref<boolean>\n}\n\n/**\n * Return type for useUppercase composable\n */\nexport interface UseUppercaseReturn {\n\t/**\n\t * The transformed text\n\t */\n\ttransformed: Ref<string>\n\n\t/**\n\t * Original text\n\t */\n\toriginal: Ref<string>\n}\n\n/**\n * Transform text to uppercase\n */\nfunction uppercaseText(text: string, firstOnly = false): string {\n\tif (!text) return text\n\n\tif (firstOnly) {\n\t\treturn text.charAt(0).toUpperCase() + text.slice(1)\n\t}\n\n\treturn text.toUpperCase()\n}\n\n/**\n * Composable for transforming text to uppercase\n *\n * @param options - Configuration options\n * @returns Uppercase text utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useUppercase } from 'directix'\n *\n * const text = ref('hello world')\n *\n * const { transformed } = useUppercase({ text })\n * // transformed.value = 'HELLO WORLD'\n * </script>\n *\n * <template>\n * <p>{{ transformed }}</p>\n * </template>\n * ```\n */\nexport function useUppercase(options: UseUppercaseOptions): UseUppercaseReturn {\n\tconst {\n\t\ttext,\n\t\tfirst = false,\n\t} = options\n\n\t// State\n\tconst original = ref(unref(text))\n\tconst transformed = ref('')\n\n\t/**\n\t * Calculate transformed text\n\t */\n\tfunction calculate(): void {\n\t\tconst textValue = unref(text)\n\t\tconst firstValue = unref(first)\n\n\t\toriginal.value = textValue\n\t\ttransformed.value = uppercaseText(textValue, firstValue)\n\t}\n\n\t// Watch for changes\n\twatch(\n\t\t() => [unref(text), unref(first)],\n\t\t() => calculate(),\n\t\t{ immediate: true },\n\t)\n\n\treturn {\n\t\ttransformed,\n\t\toriginal,\n\t}\n}\n\n/**\n * Utility function to transform text to uppercase\n *\n * @param text - Text to transform\n * @param first - Whether to transform only the first character\n * @returns Uppercase text\n *\n * @example\n * ```ts\n * import { uppercaseText } from 'directix'\n *\n * uppercaseText('hello world') // 'HELLO WORLD'\n * uppercaseText('hello world', true) // 'Hello world'\n * ```\n */\nexport { uppercaseText }\n\n/**\n * Create an uppercase transformation function\n *\n * @param first - Whether to transform only the first character\n * @returns Uppercase transformation function\n *\n * @example\n * ```ts\n * import { createUppercaser } from 'directix'\n *\n * const toUpper = createUppercaser()\n * toUpper('hello') // 'HELLO'\n *\n * const firstToUpper = createUppercaser(true)\n * firstToUpper('hello') // 'Hello'\n * ```\n */\nexport function createUppercaser(first = false): (text: string) => string {\n\treturn (text: string) => uppercaseText(text, first)\n}\n","import { computed, onMounted, onUnmounted, ref, type Ref, unref } from 'vue'\n\n/**\n * Virtual list item size function\n */\nexport type ItemSizeFunction = (index: number) => number\n\n/**\n * Options for useVirtualList composable\n */\nexport interface UseVirtualListOptions<T = any> {\n\t/**\n\t * Array of items to render\n\t * @required\n\t */\n\titems: Ref<T[]> | 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 | Ref<number | ItemSizeFunction>\n\n\t/**\n\t * Height of the container (in pixels)\n\t * @default 400\n\t */\n\theight?: number | Ref<number>\n\n\t/**\n\t * Number of extra items to render above/below visible area\n\t * @default 3\n\t */\n\toverscan?: number | Ref<number>\n\n\t/**\n\t * Key field name for items\n\t * @default 'id'\n\t */\n\tkeyField?: string\n}\n\n/**\n * Virtual list item info\n */\nexport interface VirtualListItem<T = any> {\n\t/**\n\t * The item data\n\t */\n\titem: T\n\n\t/**\n\t * Index in the original list\n\t */\n\tindex: number\n\n\t/**\n\t * Computed style for positioning\n\t */\n\tstyle: {\n\t\tposition: string\n\t\ttop: string\n\t\theight: string\n\t\twidth: string\n\t}\n}\n\n/**\n * Return type for useVirtualList composable\n */\nexport interface UseVirtualListReturn<T = any> {\n\t/**\n\t * Currently visible items\n\t */\n\tvisibleItems: Ref<VirtualListItem<T>[]>\n\n\t/**\n\t * Total height of the list\n\t */\n\ttotalHeight: Ref<number>\n\n\t/**\n\t * Current scroll position\n\t */\n\tscrollTop: Ref<number>\n\n\t/**\n\t * Start index of visible items\n\t */\n\tstartIndex: Ref<number>\n\n\t/**\n\t * End index of visible items\n\t */\n\tendIndex: Ref<number>\n\n\t/**\n\t * Scroll to a specific index\n\t */\n\tscrollToIndex: (index: number) => void\n\n\t/**\n\t * Scroll to a specific position\n\t */\n\tscrollTo: (scrollTop: number) => void\n\n\t/**\n\t * Container ref to bind to the scroll container\n\t */\n\tcontainerRef: Ref<HTMLElement | null>\n\n\t/**\n\t * List style for the wrapper element\n\t */\n\tlistStyle: Ref<{ height: string, overflow: string, position: string }>\n}\n\n/**\n * Composable for virtual list rendering\n *\n * @param options - Configuration options\n * @returns Virtual list utilities and state\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useVirtualList } from 'directix'\n *\n * const items = ref(Array.from({ length: 10000 }, (_, i) => ({ id: i, name: `Item ${i}` })))\n *\n * const {\n * visibleItems,\n * totalHeight,\n * containerRef,\n * listStyle,\n * scrollToIndex\n * } = useVirtualList({\n * items,\n * itemSize: 50,\n * height: 600\n * })\n * </script>\n *\n * <template>\n * <div ref=\"containerRef\" :style=\"listStyle\">\n * <div :style=\"{ height: totalHeight + 'px', position: 'relative' }\">\n * <div\n * v-for=\"{ item, index, style } in visibleItems\"\n * :key=\"item.id\"\n * :style=\"style\"\n * >\n * {{ item.name }}\n * </div>\n * </div>\n * </div>\n * </template>\n * ```\n */\nexport function useVirtualList<T = any>(\n\toptions: UseVirtualListOptions<T>,\n): UseVirtualListReturn<T> {\n\tconst {\n\t\titems,\n\t\titemSize = 50,\n\t\theight = 400,\n\t\toverscan = 3,\n\t\tkeyField: _keyField = 'id',\n\t} = options\n\n\t// State\n\tconst containerRef = ref<HTMLElement | null>(null)\n\tconst scrollTop = ref(0)\n\tconst startIndex = ref(0)\n\tconst endIndex = ref(0)\n\n\t// Getters\n\tconst getItems = (): T[] => unref(items)\n\tconst getItemSizeValue = (): number | ItemSizeFunction => unref(itemSize)\n\tconst getHeight = (): number => unref(height)\n\tconst getOverscan = (): number => unref(overscan)\n\n\t/**\n\t * Calculate total height of all items\n\t */\n\tconst totalHeight = computed(() => {\n\t\tconst itemsList = getItems()\n\t\tconst size = getItemSizeValue()\n\n\t\tif (typeof size === 'function') {\n\t\t\tlet total = 0\n\t\t\tfor (let i = 0; i < itemsList.length; i++) {\n\t\t\t\ttotal += size(i)\n\t\t\t}\n\t\t\treturn total\n\t\t}\n\n\t\treturn size * itemsList.length\n\t})\n\n\t/**\n\t * Calculate visible range based on scroll position\n\t */\n\tfunction calculateVisibleRange(): { start: number, end: number, offsetY: number } {\n\t\tconst itemsList = getItems()\n\t\tconst size = getItemSizeValue()\n\t\tconst containerHeight = getHeight()\n\t\tconst overscanValue = getOverscan()\n\t\tconst currentScrollTop = scrollTop.value\n\n\t\tlet start = 0,\n\t\t\tend = 0,\n\t\t\toffsetY = 0\n\n\t\tif (typeof size === 'function') {\n\t\t\t// Variable size items\n\t\t\tlet currentOffset = 0\n\t\t\tfor (let i = 0; i < itemsList.length; i++) {\n\t\t\t\tconst itemHeight = size(i)\n\t\t\t\tif (currentOffset + itemHeight > currentScrollTop) {\n\t\t\t\t\tstart = i\n\t\t\t\t\toffsetY = currentOffset\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcurrentOffset += itemHeight\n\t\t\t}\n\n\t\t\t// Find end index\n\t\t\tend = start\n\t\t\tcurrentOffset = offsetY\n\t\t\twhile (end < itemsList.length && currentOffset < currentScrollTop + containerHeight) {\n\t\t\t\tcurrentOffset += size(end)\n\t\t\t\tend++\n\t\t\t}\n\n\t\t\t// Add overscan\n\t\t\tstart = Math.max(0, start - overscanValue)\n\t\t\tend = Math.min(itemsList.length, end + overscanValue)\n\n\t\t\t// Recalculate offset for overscan\n\t\t\tcurrentOffset = 0\n\t\t\tfor (let i = 0; i < start; i++) {\n\t\t\t\tcurrentOffset += size(i)\n\t\t\t}\n\t\t\toffsetY = currentOffset\n\t\t} else {\n\t\t\t// Fixed size items\n\t\t\tstart = Math.max(0, Math.floor(currentScrollTop / size) - overscanValue)\n\t\t\tend = Math.min(itemsList.length, Math.ceil((currentScrollTop + containerHeight) / size) + overscanValue)\n\t\t\toffsetY = start * size\n\t\t}\n\n\t\treturn { start, end, offsetY }\n\t}\n\n\t/**\n\t * Get visible items with positioning\n\t */\n\tconst visibleItems = computed(() => {\n\t\tconst itemsList = getItems()\n\t\tconst size = getItemSizeValue()\n\t\tconst { start, end, offsetY } = calculateVisibleRange()\n\n\t\tstartIndex.value = start\n\t\tendIndex.value = end\n\n\t\tconst result: VirtualListItem<T>[] = []\n\n\t\tlet currentOffset = offsetY\n\t\tfor (let i = start; i < end; i++) {\n\t\t\tconst item = itemsList[i]\n\t\t\tif (item !== undefined) {\n\t\t\t\tconst itemHeight = typeof size === 'function' ? size(i) : size\n\n\t\t\t\tresult.push({\n\t\t\t\t\titem,\n\t\t\t\t\tindex: i,\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: `${currentOffset}px`,\n\t\t\t\t\t\theight: `${itemHeight}px`,\n\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tcurrentOffset += itemHeight\n\t\t\t}\n\t\t}\n\n\t\treturn result\n\t})\n\n\t/**\n\t * Container style\n\t */\n\tconst listStyle = computed(() => ({\n\t\theight: `${getHeight()}px`,\n\t\toverflow: 'auto' as const,\n\t\tposition: 'relative' as const,\n\t}))\n\n\t/**\n\t * Handle scroll event\n\t */\n\tfunction handleScroll(event: Event): void {\n\t\tconst target = event.target as HTMLElement\n\t\tscrollTop.value = target.scrollTop\n\t}\n\n\t/**\n\t * Scroll to a specific index\n\t */\n\tfunction scrollToIndex(index: number): void {\n\t\tif (!containerRef.value) return\n\n\t\tconst size = getItemSizeValue()\n\t\tconst itemsList = getItems()\n\n\t\tif (typeof size === 'function') {\n\t\t\t// Calculate offset for variable size\n\t\t\tlet offset = 0\n\t\t\tfor (let i = 0; i < Math.min(index, itemsList.length); i++) {\n\t\t\t\toffset += size(i)\n\t\t\t}\n\t\t\tcontainerRef.value.scrollTop = offset\n\t\t} else {\n\t\t\tcontainerRef.value.scrollTop = index * size\n\t\t}\n\t}\n\n\t/**\n\t * Scroll to a specific position\n\t */\n\tfunction scrollTo(position: number): void {\n\t\tif (!containerRef.value) return\n\t\tcontainerRef.value.scrollTop = position\n\t}\n\n\t// Setup scroll listener\n\tonMounted(() => {\n\t\tif (containerRef.value) {\n\t\t\tcontainerRef.value.addEventListener('scroll', handleScroll, { passive: true })\n\t\t}\n\t})\n\n\t// Cleanup\n\tonUnmounted(() => {\n\t\tif (containerRef.value) {\n\t\t\tcontainerRef.value.removeEventListener('scroll', handleScroll)\n\t\t}\n\t})\n\n\treturn {\n\t\tvisibleItems,\n\t\ttotalHeight,\n\t\tscrollTop,\n\t\tstartIndex,\n\t\tendIndex,\n\t\tscrollToIndex,\n\t\tscrollTo,\n\t\tcontainerRef,\n\t\tlistStyle,\n\t}\n}\n","import { isBrowser } from '@directix/core'\nimport { onUnmounted, ref, type Ref, unref, watch } from 'vue'\n\n/**\n * Options for useVisible composable\n */\nexport interface UseVisibleOptions {\n\t/**\n\t * Initial visibility\n\t * @default true\n\t */\n\tinitial?: boolean | Ref<boolean>\n\n\t/**\n\t * Whether to use visibility: hidden instead of display: none\n\t * @default false\n\t */\n\tuseHidden?: boolean\n\n\t/**\n\t * Callback when visibility changes\n\t */\n\tonChange?: (isVisible: boolean) => void\n}\n\n/**\n * Return type for useVisible composable\n */\nexport interface UseVisibleReturn {\n\t/** Current visibility state */\n\tvisible: Ref<boolean>\n\n\t/** Show the element */\n\tshow: () => void\n\n\t/** Hide the element */\n\thide: () => void\n\n\t/** Toggle visibility */\n\ttoggle: () => void\n\n\t/** Bind visibility control to an element */\n\tbind: (element: HTMLElement) => () => void\n}\n\n/**\n * Composable for controlling element visibility\n *\n * @param options - Configuration options\n * @returns Visibility utilities\n *\n * @example\n * ```vue\n * <script setup>\n * import { ref } from 'vue'\n * import { useVisible } from 'directix'\n *\n * const modal = ref(null)\n * const { visible, show, hide, toggle, bind } = useVisible({\n * initial: false,\n * onChange: (v) => console.log('Visible:', v)\n * })\n *\n * onMounted(() => bind(modal.value))\n * </script>\n *\n * <template>\n * <button @click=\"toggle\">Toggle Modal</button>\n * <div ref=\"modal\" v-show=\"visible\">Modal Content</div>\n * </template>\n * ```\n */\nexport function useVisible(options: UseVisibleOptions = {}): UseVisibleReturn {\n\tconst {\n\t\tinitial = true,\n\t\tuseHidden = false,\n\t\tonChange,\n\t} = options\n\n\tconst visible = ref(unref(initial))\n\n\tlet currentElement: HTMLElement | null = null,\n\t\toriginalDisplay = '',\n\t\toriginalVisibility = ''\n\n\tfunction show(): void {\n\t\tvisible.value = true\n\t}\n\n\tfunction hide(): void {\n\t\tvisible.value = false\n\t}\n\n\tfunction toggle(): void {\n\t\tvisible.value = !visible.value\n\t}\n\n\tfunction applyVisibility(isVisible: boolean): void {\n\t\tif (!currentElement) return\n\n\t\tif (isVisible) {\n\t\t\tcurrentElement.classList.remove('v-hidden')\n\t\t\tcurrentElement.classList.add('v-visible')\n\n\t\t\tif (useHidden) {\n\t\t\t\tcurrentElement.style.visibility = originalVisibility || 'visible'\n\t\t\t} else {\n\t\t\t\tcurrentElement.style.display = originalDisplay\n\t\t\t}\n\t\t} else {\n\t\t\tcurrentElement.classList.remove('v-visible')\n\t\t\tcurrentElement.classList.add('v-hidden')\n\n\t\t\tif (useHidden) {\n\t\t\t\tcurrentElement.style.visibility = 'hidden'\n\t\t\t} else {\n\t\t\t\tcurrentElement.style.display = 'none'\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction bind(element: HTMLElement): () => void {\n\t\tif (!isBrowser()) return () => {}\n\n\t\t// Cleanup previous\n\t\tunbind()\n\n\t\tcurrentElement = element\n\n\t\t// Store original styles\n\t\toriginalDisplay = element.style.display\n\t\toriginalVisibility = element.style.visibility\n\n\t\t// Apply initial visibility\n\t\tapplyVisibility(visible.value)\n\n\t\treturn unbind\n\t}\n\n\tfunction unbind(): void {\n\t\tif (currentElement) {\n\t\t\t// Restore original styles\n\t\t\tcurrentElement.style.display = originalDisplay\n\t\t\tcurrentElement.style.visibility = originalVisibility\n\t\t\tcurrentElement.classList.remove('v-hidden', 'v-visible')\n\t\t}\n\t\tcurrentElement = null\n\t}\n\n\t// Watch for visibility changes\n\twatch(visible, (newValue, oldValue) => {\n\t\tif (newValue !== oldValue) {\n\t\t\tapplyVisibility(newValue)\n\t\t\tonChange?.(newValue)\n\t\t}\n\t})\n\n\t// Watch for initial ref changes\n\tif (typeof initial === 'object' && 'value' in initial) {\n\t\twatch(initial, newValue => {\n\t\t\tvisible.value = newValue\n\t\t})\n\t}\n\n\t// Cleanup on unmount\n\tonUnmounted(() => {\n\t\tunbind()\n\t})\n\n\treturn {\n\t\tvisible,\n\t\tshow,\n\t\thide,\n\t\ttoggle,\n\t\tbind,\n\t}\n}\n","import { onUnmounted, ref, type Ref, unref, watch } from 'vue'\n\n/**\n * Options for useWatermark composable\n */\nexport interface UseWatermarkOptions {\n\t/**\n\t * Watermark text content\n\t * @required\n\t */\n\tcontent: string | string[] | Ref<string | string[]>\n\n\t/**\n\t * Width of watermark canvas\n\t * @default 300\n\t */\n\twidth?: number | Ref<number>\n\n\t/**\n\t * Height of watermark canvas\n\t * @default 200\n\t */\n\theight?: number | Ref<number>\n\n\t/**\n\t * Rotation angle in degrees\n\t * @default -22\n\t */\n\trotate?: number | Ref<number>\n\n\t/**\n\t * Font size in pixels\n\t * @default 16\n\t */\n\tfontSize?: number | Ref<number>\n\n\t/**\n\t * Font family\n\t * @default 'sans-serif'\n\t */\n\tfontFamily?: string | Ref<string>\n\n\t/**\n\t * Font weight\n\t * @default 'normal'\n\t */\n\tfontWeight?: string | number | Ref<string | number>\n\n\t/**\n\t * Font color\n\t * @default 'rgba(128, 128, 128, 0.15)'\n\t */\n\tcolor?: string | Ref<string>\n\n\t/**\n\t * Gap between watermarks in pixels\n\t * @default [100, 100]\n\t */\n\tgap?: [number, number] | number | Ref<[number, number] | number>\n\n\t/**\n\t * Z-index of watermark layer\n\t * @default 9999\n\t */\n\tzIndex?: number | Ref<number>\n\n\t/**\n\t * Whether to disable watermark\n\t * @default false\n\t */\n\tdisabled?: boolean | Ref<boolean>\n\n\t/**\n\t * Whether to prevent removal attempts\n\t * @default true\n\t */\n\tprotect?: boolean | Ref<boolean>\n}\n\n/**\n * Return type for useWatermark composable\n */\nexport interface UseWatermarkReturn {\n\t/**\n\t * Watermark canvas element\n\t */\n\tcanvas: Ref<HTMLCanvasElement | null>\n\n\t/**\n\t * Watermark data URL\n\t */\n\tdataUrl: Ref<string>\n\n\t/**\n\t * Watermark CSS style object\n\t */\n\tstyle: Ref<{\n\t\tposition: string\n\t\ttop: string\n\t\tleft: string\n\t\twidth: string\n\t\theight: string\n\t\tpointerEvents: string\n\t\tzIndex: number\n\t\tbackgroundImage: string\n\t\tbackgroundRepeat: string\n\t\tbackgroundPosition: string\n\t\tbackgroundSize: string\n\t\tdisplay?: string\n\t}>\n\n\t/**\n\t * Whether watermark is disabled\n\t */\n\tdisabled: Ref<boolean>\n\n\t/**\n\t * Update watermark options\n\t */\n\tupdate: (options: Partial<UseWatermarkOptions>) => void\n\n\t/**\n\t * Enable watermark\n\t */\n\tenable: () => void\n\n\t/**\n\t * Disable watermark\n\t */\n\tdisable: () => void\n}\n\n/**\n * Create watermark canvas\n */\nfunction createWatermarkCanvas(options: {\n\tcontent: string | string[]\n\twidth: number\n\theight: number\n\tfontSize: number\n\tfontFamily: string\n\tfontWeight: string | number\n\tcolor: string\n\trotate: number\n}): HTMLCanvasElement {\n\tconst canvas = document.createElement('canvas')\n\tconst ctx = canvas.getContext('2d')\n\n\tif (!ctx) {\n\t\tthrow new Error('[Directix] useWatermark: Could not get canvas context')\n\t}\n\n\tconst {\n\t\tcontent,\n\t\twidth,\n\t\theight,\n\t\tfontSize,\n\t\tfontFamily,\n\t\tfontWeight,\n\t\tcolor,\n\t\trotate,\n\t} = options\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 contentArray = Array.isArray(content) ? content : [content]\n\tconst lineHeight = fontSize * 1.5\n\tconst startY = -((contentArray.length - 1) * lineHeight) / 2\n\n\tcontentArray.forEach((text, index) => {\n\t\tctx.fillText(text, 0, startY + index * lineHeight)\n\t})\n\n\treturn canvas\n}\n\n/**\n * Composable for creating watermark overlays\n *\n * @param options - Configuration options\n * @returns Watermark utilities and state\n *\n * @example\n * ```vue\n * <script setup>\n * import { useWatermark } from 'directix'\n *\n * const { dataUrl, style, disable, enable } = useWatermark({\n * content: 'Confidential',\n * fontSize: 20,\n * color: 'rgba(255, 0, 0, 0.2)'\n * })\n * </script>\n *\n * <template>\n * <div class=\"container\">\n * <div :style=\"style\"></div>\n * <slot></slot>\n * </div>\n * </template>\n * ```\n */\nexport function useWatermark(options: UseWatermarkOptions): UseWatermarkReturn {\n\tconst {\n\t\tcontent,\n\t\twidth = 300,\n\t\theight = 200,\n\t\trotate = -22,\n\t\tfontSize = 16,\n\t\tfontFamily = 'sans-serif',\n\t\tfontWeight = 'normal',\n\t\tcolor = 'rgba(128, 128, 128, 0.15)',\n\t\tgap = [100, 100],\n\t\tzIndex = 9999,\n\t\tdisabled = false,\n\t\tprotect: _protect = true,\n\t} = options\n\n\t// State\n\tconst canvas = ref<HTMLCanvasElement | null>(null)\n\tconst dataUrl = ref('')\n\tconst disabledRef = ref(unref(disabled))\n\n\t/**\n\t * Generate watermark\n\t */\n\tfunction generate(): void {\n\t\tconst contentValue = unref(content)\n\t\tconst widthValue = unref(width)\n\t\tconst heightValue = unref(height)\n\t\tconst rotateValue = unref(rotate)\n\t\tconst fontSizeValue = unref(fontSize)\n\t\tconst fontFamilyValue = unref(fontFamily)\n\t\tconst fontWeightValue = unref(fontWeight)\n\t\tconst colorValue = unref(color)\n\n\t\tcanvas.value = createWatermarkCanvas({\n\t\t\tcontent: contentValue,\n\t\t\twidth: widthValue,\n\t\t\theight: heightValue,\n\t\t\tfontSize: fontSizeValue,\n\t\t\tfontFamily: fontFamilyValue,\n\t\t\tfontWeight: fontWeightValue,\n\t\t\tcolor: colorValue,\n\t\t\trotate: rotateValue,\n\t\t})\n\n\t\tdataUrl.value = canvas.value.toDataURL()\n\t}\n\n\t/**\n\t * Get style object\n\t */\n\tconst style = ref<{\n\t\tposition: string\n\t\ttop: string\n\t\tleft: string\n\t\twidth: string\n\t\theight: string\n\t\tpointerEvents: string\n\t\tzIndex: number\n\t\tbackgroundImage: string\n\t\tbackgroundRepeat: string\n\t\tbackgroundPosition: string\n\t\tbackgroundSize: string\n\t\tdisplay?: string\n\t}>({\n\t\tposition: 'absolute',\n\t\ttop: '0',\n\t\tleft: '0',\n\t\twidth: '100%',\n\t\theight: '100%',\n\t\tpointerEvents: 'none',\n\t\tzIndex: unref(zIndex),\n\t\tbackgroundImage: '',\n\t\tbackgroundRepeat: 'repeat',\n\t\tbackgroundPosition: '0 0',\n\t\tbackgroundSize: '',\n\t})\n\n\t/**\n\t * Update style based on current options\n\t */\n\tfunction updateStyle(): void {\n\t\tconst gapValue = unref(gap)\n\t\tconst zIndexValue = unref(zIndex)\n\t\tconst gapArray = Array.isArray(gapValue) ? gapValue : [gapValue, gapValue]\n\t\tconst widthValue = unref(width)\n\t\tconst heightValue = unref(height)\n\n\t\tstyle.value = {\n\t\t\t...style.value,\n\t\t\tzIndex: zIndexValue,\n\t\t\tbackgroundImage: `url(\"${dataUrl.value}\")`,\n\t\t\tbackgroundPosition: `${gapArray[0] / 2}px ${gapArray[1] / 2}px`,\n\t\t\tbackgroundSize: `${widthValue + gapArray[0]}px ${heightValue + gapArray[1]}px`,\n\t\t}\n\t}\n\n\t/**\n\t * Update watermark options\n\t */\n\tfunction update(newOptions: Partial<UseWatermarkOptions>): void {\n\t\tObject.assign(options, newOptions)\n\t\tgenerate()\n\t\tupdateStyle()\n\t}\n\n\t/**\n\t * Enable watermark\n\t */\n\tfunction enable(): void {\n\t\tdisabledRef.value = false\n\t}\n\n\t/**\n\t * Disable watermark\n\t */\n\tfunction disable(): void {\n\t\tdisabledRef.value = true\n\t}\n\n\t// Watch for changes\n\twatch(\n\t\t() => [\n\t\t\tunref(content),\n\t\t\tunref(width),\n\t\t\tunref(height),\n\t\t\tunref(rotate),\n\t\t\tunref(fontSize),\n\t\t\tunref(fontFamily),\n\t\t\tunref(fontWeight),\n\t\t\tunref(color),\n\t\t\tunref(gap),\n\t\t\tunref(zIndex),\n\t\t],\n\t\t() => {\n\t\t\tgenerate()\n\t\t\tupdateStyle()\n\t\t},\n\t\t{ immediate: true },\n\t)\n\n\t// Watch disabled state\n\twatch(disabledRef, isDisabled => {\n\t\tstyle.value.display = isDisabled ? 'none' : 'block'\n\t})\n\n\t// Initial state\n\tif (unref(disabled)) {\n\t\tstyle.value.display = 'none'\n\t}\n\n\t// Cleanup\n\tonUnmounted(() => {\n\t\t// Observer cleanup if needed\n\t})\n\n\treturn {\n\t\tcanvas,\n\t\tdataUrl,\n\t\tstyle,\n\t\tdisabled: disabledRef,\n\t\tupdate,\n\t\tenable,\n\t\tdisable,\n\t}\n}\n\n/**\n * Create a simple watermark data URL\n *\n * @param content - Watermark text\n * @param options - Additional options\n * @returns Data URL string\n *\n * @example\n * ```ts\n * import { createWatermarkUrl } from 'directix'\n *\n * const url = createWatermarkUrl('Confidential', { fontSize: 20 })\n * // Use as background-image: url(dataUrl)\n * ```\n */\nexport function createWatermarkUrl(\n\tcontent: string | string[],\n\toptions: {\n\t\twidth?: number\n\t\theight?: number\n\t\tfontSize?: number\n\t\tcolor?: string\n\t\trotate?: number\n\t} = {},\n): string {\n\tconst canvas = createWatermarkCanvas({\n\t\tcontent,\n\t\twidth: options.width ?? 300,\n\t\theight: options.height ?? 200,\n\t\tfontSize: options.fontSize ?? 16,\n\t\tfontFamily: 'sans-serif',\n\t\tfontWeight: 'normal',\n\t\tcolor: options.color ?? 'rgba(128, 128, 128, 0.15)',\n\t\trotate: options.rotate ?? -22,\n\t})\n\n\treturn canvas.toDataURL()\n}\n","import type { DirectiveInstallOptions } from '@directix/core'\nimport type { App, Directive, Plugin } from 'vue'\nimport { setVueVersion } from '@directix/core'\nimport {\n\tvCapitalcase,\n\tvClickDelay,\n\tvClickOutside,\n\tvCopy,\n\tvCountdown,\n\tvDebounce,\n\tvDraggable,\n\tvEllipsis,\n\tvFocus,\n\tvHotkey,\n\tvHover,\n\tvImagePreview,\n\tvInfiniteScroll,\n\tvIntersect,\n\tvLazy,\n\tvLoading,\n\tvLongPress,\n\tvLowercase,\n\tvMask,\n\tvMoney,\n\tvMutation,\n\tvNumber,\n\tvPermission,\n\tvPrint,\n\tvPullRefresh,\n\tvResize,\n\tvRipple,\n\tvSanitize,\n\tvScroll,\n\tvSticky,\n\tvSwipe,\n\tvThrottle,\n\tvTooltip,\n\tvTouch,\n\tvTrim,\n\tvTruncate,\n\tvUppercase,\n\tvVirtualList,\n\tvVisible,\n\tvWatermark,\n} from './directives'\n\n// Export composables\nexport * from './composables'\n\n// Export all directives\n// Export directives (types are exported from composables to avoid duplicates)\nexport {\n\tvCapitalcase,\n\tvClickDelay,\n\tvClickOutside,\n\tvCopy,\n\tvCountdown,\n\tvDebounce,\n\tvDraggable,\n\tvEllipsis,\n\tvFocus,\n\tvHotkey,\n\tvHover,\n\tvImagePreview,\n\tvInfiniteScroll,\n\tvIntersect,\n\tvLazy,\n\tvLoading,\n\tvLongPress,\n\tvLowercase,\n\tvMask,\n\tvMoney,\n\tvMutation,\n\tvNumber,\n\tvPermission,\n\tvPrint,\n\tvPullRefresh,\n\tvResize,\n\tvRipple,\n\tvSanitize,\n\tvScroll,\n\tvSticky,\n\tvSwipe,\n\tvThrottle,\n\tvTooltip,\n\tvTouch,\n\tvTrim,\n\tvTruncate,\n\tvUppercase,\n\tvVirtualList,\n\tvVisible,\n\tvWatermark,\n} from './directives'\n\n// Export core utilities\nexport * from '@directix/core'\n\n// Export shared utilities (excluding tools with the same name as directives)\nexport {\n\tdeepClone,\n\tdeepMerge,\n\tgenerateId,\n\tget,\n\tisArray,\n\tisBoolean,\n\tisEmpty,\n\tisFunction,\n\tisNumber,\n\tisObject,\n\tisPromise,\n\tisString,\n\tparseTime,\n\tset,\n} from '@directix/shared'\n\n// All directives list\nconst allDirectives: Record<string, Directive> = {\n\t'click-outside': vClickOutside,\n\t'click-delay': vClickDelay,\n\tcopy: vCopy,\n\tdebounce: vDebounce,\n\tthrottle: vThrottle,\n\tfocus: vFocus,\n\thotkey: vHotkey,\n\tlazy: vLazy,\n\tintersect: vIntersect,\n\tvisible: vVisible,\n\tloading: vLoading,\n\tscroll: vScroll,\n\t'infinite-scroll': vInfiniteScroll,\n\tsticky: vSticky,\n\t'long-press': vLongPress,\n\thover: vHover,\n\tripple: vRipple,\n\tmask: vMask,\n\tpermission: vPermission,\n\tsanitize: vSanitize,\n\tresize: vResize,\n\tmutation: vMutation,\n\ttruncate: vTruncate,\n\tellipsis: vEllipsis,\n\tuppercase: vUppercase,\n\tlowercase: vLowercase,\n\tcapitalcase: vCapitalcase,\n\tnumber: vNumber,\n\tmoney: vMoney,\n\ttrim: vTrim,\n\ttooltip: vTooltip,\n\tdraggable: vDraggable,\n\ttouch: vTouch,\n\tswipe: vSwipe,\n\t'image-preview': vImagePreview,\n\tcountdown: vCountdown,\n\twatermark: vWatermark,\n\tprint: vPrint,\n\t'virtual-list': vVirtualList,\n\t'pull-refresh': vPullRefresh,\n}\n\n/**\n * Install all directives\n */\nconst install = (app: App | any, options: DirectiveInstallOptions = {}): void => {\n\t// Detect Vue version from app instance\n\t// Vue 2: app is the Vue constructor (has version static property, has directive static method)\n\t// Vue 3: app is an app instance (has config property, version on app.constructor or as _context)\n\n\tlet vueVersion: 2 | 3 | null = null\n\n\t// Check if it's Vue 2 constructor\n\tif (typeof app === 'function' && app.version?.startsWith('2')) {\n\t\tvueVersion = 2\n\t} else if (app?.config && app?.version?.startsWith('3')) {\n\t\t// Check if it's Vue 3 app instance\n\t\tvueVersion = 3\n\t} else if (typeof app?.directive === 'function' && typeof app?.mixin === 'function' && app.version?.startsWith('2')) {\n\t\t// Check for Vue 2 static methods (directive, component, mixin, etc.)\n\t\tvueVersion = 2\n\t} else if (typeof window !== 'undefined') {\n\t\t// Fallback: check global Vue\n\t\tconst win = window as any\n\n\t\tif (win.Vue?.version?.startsWith('2')) {\n\t\t\tvueVersion = 2\n\t\t} else if (win.Vue?.version?.startsWith('3')) {\n\t\t\tvueVersion = 3\n\t\t}\n\t}\n\n\t// Set the detected version\n\tif (vueVersion) {\n\t\tsetVueVersion(vueVersion)\n\t}\n\n\tconst { directives, all = false } = options\n\n\tif (all || !directives) {\n\t\t// Register all directives\n\t\tObject.entries(allDirectives).forEach(([name, directive]) => {\n\t\t\tapp.directive(name, directive)\n\t\t})\n\t} else {\n\t\t// Register specified directives\n\t\tdirectives.forEach(name => {\n\t\t\tconst directive = allDirectives[name]\n\n\t\t\tif (directive) {\n\t\t\t\tapp.directive(name, directive)\n\t\t\t} else {\n\t\t\t\tconsole.warn(`[Directix] Unknown directive: ${name}`)\n\t\t\t}\n\t\t})\n\t}\n}\n\n/**\n * Directix plugin\n */\nexport const Directix: Plugin = {\n\tinstall,\n}\n"],"names":["normalizeBinding","addCleanup","DEFAULT_KEEP_LOWER","capitalizeText","capitalizeWord","normalizeOptions","cleanup","setState","getState","getEventPosition","bindEvents","STATE_KEY","isValidClick","copyToClipboard","copyWithExecCommand","parseTargetTime","calculateTime","formatTime","getBoundary","getClientCoords","parseTranslate","_b","_a","FOCUSABLE_TAGS","isFocusable","KEY_ALIASES","matchesHotkey","setupState","getDistance","scrollTop","scrollHeight","clientHeight","transformText","formatNumber","formatMoney","printInNewWindow","printInIframe","buildPrintContent","waitForImages","sleep","unbindEvents","DEFAULT_DIRECTIONS","getSwipeDirection","trimText","escapeRegex","truncateText","startIndex","endIndex","offsetY","createWatermarkCanvas","applyHoverState","createOverlay","createObserver","verifyPermission","debounce","rect","throttle","triggerSwipe","getAngle","calculateVisibleRange","applyVisibility"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBO,SAAS,oBACf,OACsB;AACtB,QAAM,YAAY;AAAA,IACjB,KAAK,IAAO,SAAc,OAAc;AAEvC,YAAM,QAAsB;AAAA,QAC3B,OAAO,QAAQ;AAAA,QACf;AAAA,QACA,SAAS,CAAA;AAAA,MAAC;AAGN,SAAW,qBAAqB;AAAA,IACtC;AAAA,IAEA,SAAS,IAAO,SAAc,OAAc;AAG3C,UAAI,MAAM,SAAS;AAClB,cAAM,QAAQ,IAAIA,mBAAiB,OAAO,GAAG,KAAK;AAAA,MACnD;AAAA,IACD;AAAA,IAEA,OAAO,IAAO,SAAc,OAAc,UAAiB;AAC1D,YAAM,QAAS,GAAW;AAE1B,UAAI,MAAM,SAAS;AAClB,cAAM;AAAA,UACL;AAAA,UACAA,mBAAiB,OAAO;AAAA,UACxB;AAAA,UACAA,mBAAiB,iCAAK,UAAL,EAAc,OAAO,QAAQ,WAAU;AAAA,UACxD;AAAA,QAAA;AAAA,MAEF;AAGA,UAAI,OAAO;AACV,cAAM,QAAQ,QAAQ;AACtB,cAAM,QAAQ;AAAA,MACf;AAAA,IACD;AAAA,IAEA,iBAAiB,KAAQ,UAAe,QAAe,WAAkB;AAAA,IAGzE;AAAA,IAEA,OAAO,IAAO,SAAc,OAAc;AACzC,UAAI,MAAM,WAAW;AACpB,cAAM,UAAU,IAAIA,mBAAiB,OAAO,GAAG,KAAK;AAAA,MACrD;AAGA,YAAM,QAAuB,GAAW;AAExC,UAAI,+BAAO,SAAS;AACnB,cAAM,QAAQ,QAAQ,CAAA,OAAM,GAAA,CAAI;AAAA,MACjC;AACA,aAAQ,GAAW;AAAA,IACpB;AAAA,EAAA;AAGD,SAAO;AACR;AAKA,SAASA,mBAAoB,SAAmC;;AAC/D,SAAO;AAAA,IACN,OAAO,QAAQ;AAAA,IACf,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ,aAAa,CAAA;AAAA,IAChC,UAAU,QAAQ,YAAY;AAAA,EAAA;AAEhC;AAKO,SAASC,aAAW,IAAa,IAAsB;AAC7D,QAAM,QAAS,GAAW;AAE1B,MAAI,OAAO;AACV,UAAM,QAAQ,KAAK,EAAE;AAAA,EACtB;AACD;ACxFO,SAAS,oBACf,OACsB;AACtB,QAAM,YAAY;AAAA,IACjB,QAAQ,IAAO,SAAc,OAAc;AAG1C,YAAM,QAAsB;AAAA,QAC3B,OAAO,QAAQ;AAAA,QACf;AAAA,QACA,SAAS,CAAA;AAAA,MAAC;AAGN,SAAW,qBAAqB;AAAA,IACtC;AAAA,IAEA,YAAY,KAAQ,UAAe,QAAe;AAAA,IAElD;AAAA,IAEA,QAAQ,IAAO,SAAc,OAAc;AAC1C,UAAI,MAAM,SAAS;AAClB,cAAM,QAAQ,IAAI,qBAAqB,OAAO,GAAG,KAAK;AAAA,MACvD;AAAA,IACD;AAAA,IAEA,aAAa,KAAQ,UAAe,QAAe,YAAmB;AAAA,IAEtE;AAAA,IAEA,QAAQ,IAAO,SAAc,OAAc,WAAkB;AAC5D,YAAM,QAAuB,GAAW;AAExC,UAAI,MAAM,SAAS;AAClB,cAAM;AAAA,UACL;AAAA,UACA,qBAAqB,OAAO;AAAA,UAC5B;AAAA,UACA,qBAAqB,iCAAK,UAAL,EAAc,OAAO,QAAQ,WAAU;AAAA,UAC5D;AAAA,QAAA;AAAA,MAEF;AAGA,UAAI,OAAO;AACV,cAAM,QAAQ,QAAQ;AACtB,cAAM,QAAQ;AAAA,MACf;AAAA,IACD;AAAA,IAEA,cAAc,KAAQ,UAAe,QAAe;AAAA,IAEpD;AAAA,IAEA,UAAU,IAAO,SAAc,OAAc;AAC5C,UAAI,MAAM,WAAW;AACpB,cAAM,UAAU,IAAI,qBAAqB,OAAO,GAAG,KAAK;AAAA,MACzD;AAGA,YAAM,QAAuB,GAAW;AAExC,UAAI,+BAAO,SAAS;AACnB,cAAM,QAAQ,QAAQ,CAAA,OAAM,GAAA,CAAI;AAAA,MACjC;AACA,aAAQ,GAAW;AAAA,IACpB;AAAA,EAAA;AAGD,SAAO;AACR;AAKA,SAAS,qBAAwB,SAAmC;;AACnE,SAAO;AAAA,IACN,OAAO,QAAQ;AAAA,IACf,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ,aAAa,CAAA;AAAA,IAChC,UAAU,QAAQ;AAAA,EAAA;AAEpB;AAKO,SAAS,WAAW,IAAa,IAAsB;AAC7D,QAAM,QAAS,GAAW;AAE1B,MAAI,OAAO;AACV,UAAM,QAAQ,KAAK,EAAE;AAAA,EACtB;AACD;ACnGA,IAAI,cAAiC,MACpC,UAA0B,MAC1B,WAA2B,MAC3B,UAA0B;AAK3B,SAAS,aAAa,SAAoC;AACzD,MAAI,QAAQ,WAAW,KAAK,EAAG,QAAO;AACtC,MAAI,QAAQ,WAAW,GAAG,EAAG,QAAO;AACpC,MAAI,QAAQ,WAAW,GAAG,EAAG,QAAO;AAEpC,SAAO;AACR;AAKO,SAAS,gBAA4B;;AAC3C,MAAI,gBAAgB,KAAM,QAAO;AAGjC,MAAI,OAAO,YAAY,aAAa;AACnC,UAAM,aAAa,QAAQ,IAAI;AAE/B,QAAI,eAAe,OAAO;AACzB,oBAAc;AAEd,aAAO;AAAA,IACR;AACA,QAAI,eAAe,KAAK;AACvB,oBAAc;AAEd,aAAO;AAAA,IACR;AACA,QAAI,eAAe,KAAK;AACvB,oBAAc;AAEd,aAAO;AAAA,IACR;AAAA,EACD;AAGA,MAAI;AAEH,UAAM,MAAM,QAAQ,KAAK;AACzB,UAAM,UAAU,aAAa,2BAAK,OAAO;AAEzC,QAAI,YAAY,MAAM;AACrB,oBAAc;AAEd,aAAO;AAAA,IACR;AAAA,EACD,SAAQ;AAAA,EAER;AAGA,MAAI,OAAO,WAAW,aAAa;AAClC,UAAM,MAAM;AACZ,UAAM,MAAM,IAAI;AAGhB,QAAI,2BAAK,SAAS;AACjB,YAAM,UAAU,aAAa,IAAI,OAAO;AAExC,UAAI,YAAY,MAAM;AACrB,sBAAc;AAEd,eAAO;AAAA,MACR;AAAA,IACD;AAGA,QAAI,QAAO,2BAAK,gBAAe,YAAY;AAC1C,oBAAc;AAEd,aAAO;AAAA,IACR;AAGA,QAAI,QAAO,2BAAK,eAAc,cAAc,QAAO,2BAAK,gBAAe,YAAY;AAClF,oBAAc;AAEd,aAAO;AAAA,IACR;AAGA,UAAM,WAAW,IAAI;AAErB,SAAI,0CAAU,QAAV,mBAAe,SAAS;AAC3B,YAAM,UAAU,aAAa,SAAS,IAAI,OAAO;AAEjD,UAAI,YAAY,MAAM;AACrB,sBAAc;AAEd,eAAO;AAAA,MACR;AAAA,IACD;AACA,SAAI,0CAAU,SAAV,mBAAgB,QAAQ;AAC3B,oBAAc;AAEd,aAAO;AAAA,IACR;AAAA,EACD;AAGA,MAAI,gBAAgB,MAAM;AACzB,QAAI,OAAO,WAAW,aAAa;AAClC,cAAQ;AAAA,QACP;AAAA,MAAA;AAAA,IAGF;AACA,kBAAc;AAAA,EACf;AAEA,SAAO;AACR;AAKO,SAAS,cAAc,SAA2B;AACxD,gBAAc;AACd,YAAU,YAAY,KAAK,YAAY;AACvC,aAAW,YAAY;AACvB,YAAU,YAAY;AACvB;AAKO,SAAS,kBAAwB;AACvC,gBAAc;AACd,YAAU;AACV,aAAW;AACX,YAAU;AACX;AAKO,SAAS,SAAkB;AACjC,MAAI,YAAY,MAAM;AACrB,UAAM,UAAU,cAAA;AAEhB,cAAU,YAAY,KAAK,YAAY;AAAA,EACxC;AAEA,SAAO;AACR;AAKO,SAAS,UAAmB;AAClC,MAAI,aAAa,MAAM;AACtB,eAAW,oBAAoB;AAAA,EAChC;AAEA,SAAO;AACR;AAKO,SAAS,SAAkB;AACjC,MAAI,YAAY,MAAM;AACrB,cAAU,oBAAoB;AAAA,EAC/B;AAEA,SAAO;AACR;AAKO,MAAM,YAAY,MAAe;AACvC,SAAO,OAAO,WAAW,eAAe,OAAO,aAAa;AAC7D;AAKO,MAAM,QAAQ,MAAe,CAAC,UAAA;AAK9B,MAAM,kBAAkB,MAAe;AAC7C,MAAI,CAAC,UAAA,EAAa,QAAO;AAEzB,MAAI,WAAW;AAEf,MAAI;AACH,UAAM,UAAU;AAAA,MACf,IAAI,UAAU;AACb,mBAAW;AAEX,eAAO;AAAA,MACR;AAAA,IAAA;AAGD,WAAO,iBAAiB,QAAQ,MAAa,OAAO;AACpD,WAAO,oBAAoB,QAAQ,MAAa,OAAc;AAAA,EAC/D,SAAQ;AACP,eAAW;AAAA,EACZ;AAEA,SAAO;AACR;AAKO,MAAM,+BAA+B,MAAe;AAC1D,SAAO,UAAA,KAAe,0BAA0B;AACjD;AAKO,MAAM,yBAAyB,MAAe;AACpD,SAAO,UAAA,KAAe,oBAAoB;AAC3C;AAKO,MAAM,oBAAoB,MAAe;AAC/C,SAAO,UAAA,KAAe,eAAe;AACtC;AAKO,MAAM,2BAA2B,MAAe;AACtD,SAAO,UAAA,KAAe,sBAAsB;AAC7C;AChPO,SAAS,gBACf,YACY;;AACZ,QAAmD,iBAA3C,QAAM,SAAS,KAAK,aAAuB,IAAV,kBAAU,IAAV,CAAjC,QAAM,WAAS,OAAK;AAG5B,MAAI,MAAA,KAAW,CAAC,KAAK;AACpB,QAAI,OAAO,YAAY,iBAAe,aAAQ,QAAR,mBAAa,cAAa,QAAQ;AACvE,cAAQ;AAAA,QACP,yBAAyB,IAAI;AAAA,MAAA;AAAA,IAG/B;AAEA,WAAO,oBAAA;AAAA,EACR;AAGA,QAAM,eAAqC;AAAA,IAC1C,SAAS,MAAM,UAAU,CAAC,IAAI,SAAS,UAAU;AAChD,YAAM,QAAS,IAAI,cAAc,SAAS,QAAQ,GAAG,KAAK;AAAA,IAC3D,IAAI;AAAA,IAEJ,SAAS,MAAM,UAAU,CAAC,IAAI,SAAS,OAAO,aAAa,cAAc;AACxE,YAAM,QAAS,IAAI,cAAc,SAAS,QAAQ,GAAG,OAAO,aAAa,SAAS;AAAA,IACnF,IAAI;AAAA,IAEJ,WAAW,MAAM;AAAA,EAAA;AAIlB,SAAO,oBAAoB,YAAY;AACxC;AAKA,SAAS,oBAA0C,OAAwC;AAC1F,MAAI,kBAAuB;AAG3B,WAAS,eAAoB;AAC5B,QAAI,CAAC,iBAAiB;AACrB,wBAAkB,oBAAoB,IAAI,oBAAoB,KAAK,IAAI,oBAAoB,KAAK;AAAA,IACjG;AAEA,WAAO;AAAA,EACR;AAGA,WAAS,WAAW,UAAkB;AACrC,WAAO,SAAU,IAAO,SAAc,OAAY,WAAiB;;AAClE,+BAAA,GAAe,cAAf,4BAA2B,IAAI,SAAS,OAAO;AAAA,IAChD;AAAA,EACD;AAEA,SAAO;AAAA;AAAA,IAEN,MAAM,WAAW,MAAM;AAAA,IACvB,UAAU,WAAW,UAAU;AAAA,IAC/B,QAAQ,WAAW,QAAQ;AAAA,IAC3B,kBAAkB,WAAW,kBAAkB;AAAA,IAC/C,QAAQ,WAAW,QAAQ;AAAA;AAAA,IAE3B,SAAS,WAAW,SAAS;AAAA,IAC7B,aAAa,WAAW,aAAa;AAAA,IACrC,SAAS,WAAW,SAAS;AAAA,IAC7B,cAAc,WAAW,cAAc;AAAA,IACvC,SAAS,WAAW,SAAS;AAAA,IAC7B,eAAe,WAAW,eAAe;AAAA,IACzC,WAAW,WAAW,WAAW;AAAA,EAAA;AAEnC;AAKA,SAAS,cACR,SACA,UACsB;AACtB,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,QACH,OAAO,QAAQ,UAAU,YAAY,QAAQ,UAAU,OAAO,kCAAK,WAAa,QAAQ,SAAU,QAAQ;AAE7G,SAAO,iCAAK,UAAL,EAAc,MAAA;AACtB;AAKA,SAAS,sBAAiC;AACzC,SAAO;AAAA,IACN,SAAS,MAAM;AAAA,IAAC;AAAA,IAChB,SAAS,MAAM;AAAA,IAAC;AAAA,IAChB,WAAW,MAAM;AAAA,IAAC;AAAA,EAAA;AAEpB;AAKO,SAAS,qBACf,MACA,YACiF;AACjF,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,QAAQ,KAAU,UAAgB;AACjC,aAAO,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,eAAe,SAAS,MAAM;AAClE,cAAM,WAAW,GAAG,IAAI,IAAI,aAAa;AAEzC,YAAI,UAAU,UAAU,SAAS;AAAA,MAClC,CAAC;AAAA,IACF;AAAA,EAAA;AAEF;AC7GO,SAAS,wBACf,IACA,SACA,aACa;AACb,MAAI,CAAC,QAAQ,SAAS;AACrB,WAAO,MAAM;AAAA,IAAC;AAAA,EACf;AAEA,QAAM,UAAU,MAAY;AAC3B,UAAM,QAAQ,GAAG;AACjB,UAAM,MAAM,GAAG;AACf,UAAM,gBAAgB,GAAG;AACzB,UAAM,cAAc,YAAY,aAAa;AAE7C,QAAI,kBAAkB,aAAa;AAClC,SAAG,QAAQ;AAEX,UAAI,UAAU,QAAQ,QAAQ,MAAM;AACnC,WAAG,kBAAkB,OAAO,GAAG;AAAA,MAChC;AAEA,SAAG,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAA,CAAM,CAAC;AAAA,IACvD;AAAA,EACD;AAEA,KAAG,iBAAiB,SAAS,OAAO;AAGpC,KAAG,QAAQ,YAAY,GAAG,KAAK;AAE/B,SAAO,MAAM;AACZ,OAAG,oBAAoB,SAAS,OAAO;AAAA,EACxC;AACD;AAKO,SAAS,qBAAqB,IAAiB,aAA6C;AAClG,QAAM,OAAO,GAAG,eAAe;AAE/B,KAAG,cAAc,YAAY,IAAI;AAClC;AAKO,SAAS,eAAe,IAA+D;AAC7F,SAAO,GAAG,YAAY,WAAW,GAAG,YAAY;AACjD;ACpCA,MAAMC,uBAAqB;AAAA,EAC1B;AAAA,EAAK;AAAA,EAAM;AAAA,EACX;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAO;AAAA,EAC3B;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAQ;AAAA,EAC1B;AAAA,EAAM;AAAA,EAAM;AAAA,EAAQ;AACrB;AAKA,SAASC,iBAAe,MAAc,SAAqC;AAC1E,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,EAAE,QAAQ,MAAM,YAAYD,yBAAuB;AAEzD,MAAI,OAAO;AAEV,UAAM,QAAQ,KAAK,YAAA,EAAc,MAAM,KAAK;AAE5C,WAAO,MACL,IAAI,CAAC,MAAM,UAAU;AAErB,UAAI,UAAU,GAAG;AAChB,eAAOE,iBAAe,IAAI;AAAA,MAC3B;AAEA,UAAI,UAAU,SAAS,KAAK,YAAA,CAAa,GAAG;AAC3C,eAAO,KAAK,YAAA;AAAA,MACb;AAEA,aAAOA,iBAAe,IAAI;AAAA,IAC3B,CAAC,EACA,KAAK,GAAG;AAAA,EACX,OAAO;AAEN,WAAOA,iBAAe,IAAI;AAAA,EAC3B;AACD;AAKA,SAASA,iBAAe,MAAsB;AAC7C,MAAI,CAAC,KAAM,QAAO;AAElB,SAAO,KAAK,OAAO,CAAC,EAAE,gBAAgB,KAAK,MAAM,CAAC,EAAE,YAAA;AACrD;AAKA,SAASC,mBAAiB,SAA6D;;AACtF,MAAI,YAAY,UAAa,YAAY,MAAM;AAC9C,WAAO,EAAE,OAAO,MAAM,SAAS,KAAA;AAAA,EAChC;AAEA,MAAI,YAAY,OAAO;AACtB,WAAO,EAAE,OAAO,OAAO,SAAS,MAAA;AAAA,EACjC;AAEA,SAAO;AAAA,IACN,QAAO,aAAQ,UAAR,YAAiB;AAAA,IACxB,YAAW,aAAQ,cAAR,YAAqBH;AAAAA,IAChC,UAAS,aAAQ,YAAR,YAAmB;AAAA,EAAA;AAE9B;AAmBO,MAAM,eAAe,gBAAiD;AAAA,EAC5E,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUG,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,eAAe,EAAE,GAAG;AACvB,YAAMC,WAAU,wBAAwB,IAAI,SAAS,UAAQH,iBAAe,MAAM,OAAO,CAAC;AAExF,SAAW,uBAAuBG;AAAA,IACrC,OAAO;AACN,2BAAqB,IAAI,CAAA,SAAQH,iBAAe,MAAM,OAAO,CAAC;AAAA,IAC/D;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUE,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,eAAe,EAAE,GAAG;AACvB,UAAI,QAAQ,SAAS;AACpB,WAAG,QAAQF,iBAAe,GAAG,OAAO,OAAO;AAAA,MAC5C;AAAA,IACD,OAAO;AACN,2BAAqB,IAAI,CAAA,SAAQA,iBAAe,MAAM,OAAO,CAAC;AAAA,IAC/D;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAMG,WAAqC,GAAW;AAEtD,IAAAA,YAAA,gBAAAA;AACA,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AC7ID,MAAM,eAAe;AAQd,SAASC,WAA+B,IAAO,KAAa,OAAgB;AAChF,KAAW,eAAe,GAAG,IAAI;AACpC;AAQO,SAASC,WAA+B,IAAO,KAA4B;AACjF,SAAQ,GAAW,eAAe,GAAG;AACtC;AAOO,SAAS,YAA+B,IAAO,KAAmB;AACxE,SAAQ,GAAW,eAAe,GAAG;AACtC;ACnCO,SAAS,UAAU,OAAkC;AAC3D,SAAO,iBAAiB;AACzB;AAYO,SAAS,WAAW,QAA6D;AACvF,MAAI,CAAC,OAAQ,QAAO;AAEpB,MAAI,OAAO,WAAW,UAAU;AAC/B,QAAI,CAAC,UAAA,EAAa,QAAO;AAEzB,WAAO,SAAS,cAAc,MAAM;AAAA,EACrC;AAEA,SAAO,UAAU,MAAM,IAAI,SAAS;AACrC;AA2GO,SAAS,gBAAgB,IAA+B;AAC9D,MAAI,CAAC,UAAA,EAAa,QAAO;AAEzB,MAAI,SAAyB,GAAG;AAEhC,SAAO,QAAQ;AACd,UAAM,EAAE,UAAU,WAAW,UAAA,IAAc,iBAAiB,MAAM;AAElE,QAAI,gBAAgB,KAAK,WAAW,YAAY,SAAS,GAAG;AAC3D,aAAO;AAAA,IACR;AAEA,aAAS,OAAO;AAAA,EACjB;AAEA,SAAO;AACR;AC7IO,SAAS,GACf,QACA,OACA,SACA,UAAkC,OAC3B;AACP,MAAI,CAAC,YAAa;AAClB,QAAM,OAAOH,mBAAiB,OAAO;AAErC,SAAO,iBAAiB,OAAO,SAAS,IAAI;AAC7C;AAKO,SAAS,IACf,QACA,OACA,SACA,UAAkC,OAC3B;AACP,MAAI,CAAC,YAAa;AAClB,QAAM,OAAOA,mBAAiB,OAAO;AAErC,SAAO,oBAAoB,OAAO,SAAS,IAAI;AAChD;AAcA,SAASA,mBAAiB,SAAkG;AAC3H,MAAI,OAAO,YAAY,WAAW;AACjC,WAAO;AAAA,EACR;AAEA,QAAM,EAAE,UAAU,OAAO,UAAU,OAAO,OAAO,UAAU;AAE3D,MAAI,mBAAmB;AACtB,WAAO,EAAE,SAAS,SAAS,KAAA;AAAA,EAC5B;AAEA,SAAO;AACR;AAiEO,SAASI,mBACf,GAC6D;AAC7D,MAAI,UAAU,GACb,UAAU;AAEX,MAAI,aAAa,KAAK,EAAE,QAAQ,SAAS,GAAG;AAC3C,cAAU,EAAE,QAAQ,CAAC,EAAE;AACvB,cAAU,EAAE,QAAQ,CAAC,EAAE;AAAA,EACxB,WAAW,aAAa,GAAG;AAC1B,cAAU,EAAE;AACZ,cAAU,EAAE;AAAA,EACb;AAEA,SAAO;AAAA,IACN,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EAAA;AAEF;AA0BO,SAASC,aACf,QACA,QACA,UAAkC,OACrB;AACb,SAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,OAAO,OAAO,MAAM;AACpD,WAAO,iBAAiB,OAAO,SAAS,OAAO,YAAY,YAAY,UAAU,uBAAuB,OAAO,CAAC;AAAA,EACjH,CAAC;AAED,SAAO,MAAM;AACZ,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,OAAO,OAAO,MAAM;AACpD,aAAO,oBAAoB,OAAO,SAAS,OAAO,YAAY,YAAY,UAAU,uBAAuB,OAAO,CAAC;AAAA,IACpH,CAAC;AAAA,EACF;AACD;AAKA,SAAS,uBAAuB,SAAwF;AACvH,QAAM,EAAE,UAAU,OAAO,UAAU,OAAO,OAAO,UAAU;AAE3D,MAAI,mBAAmB;AACtB,WAAO,EAAE,SAAS,SAAS,KAAA;AAAA,EAC5B;AAEA,SAAO;AACR;ACjMO,MAAM,kBAAkB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAgBO,SAAS,0BAA0B,WAAmD;AAC5F,aAAW,YAAY,iBAAiB;AACvC,QAAI,UAAU,QAAQ,GAAG;AACxB,aAAO;AAAA,IACR;AAAA,EACD;AAEA,SAAO;AACR;AAOO,SAAS,oBAAoB,IAAyB;AAC5D,QAAM,UAAU,GAAG,QAAQ,YAAA;AAE3B,MAAI,YAAY,WAAW,YAAY,YAAY;AAClD,WAAO;AAAA,EACR;AAEA,SAAO;AACR;AC9DO,SAAS,SAAS,OAAiC;AACzD,SAAO,OAAO,UAAU;AACzB;AAKO,SAAS,SAAS,OAAiC;AACzD,SAAO,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK;AACjD;AAKO,SAAS,UAAU,OAAkC;AAC3D,SAAO,OAAO,UAAU;AACzB;AAKO,SAAS,WAAW,OAAkD;AAC5E,SAAO,OAAO,UAAU;AACzB;AAKO,SAAS,SAAS,OAA8C;AACtE,SAAO,OAAO,UAAU,YAAY,UAAU;AAC/C;AAKO,SAAS,QAAQ,OAAgC;AACvD,SAAO,MAAM,QAAQ,KAAK;AAC3B;AAKO,SAAS,QAAQ,OAAyB;AAChD,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,SAAS,KAAK,KAAK,QAAQ,KAAK,EAAG,QAAO,MAAM,WAAW;AAC/D,MAAI,SAAS,KAAK,EAAG,QAAO,OAAO,KAAK,KAAK,EAAE,WAAW;AAE1D,SAAO;AACR;AAKO,SAAS,UAAmB,OAAqC;AACvE,SAAO,SAAS,KAAK,KAAK,WAAY,MAAc,IAAI;AACzD;AAKO,SAAS,UAAa,KAAW;AACvC,MAAI,QAAQ,QAAQ,OAAO,QAAQ,UAAU;AAC5C,WAAO;AAAA,EACR;AAEA,MAAI,MAAM,QAAQ,GAAG,GAAG;AACvB,WAAO,IAAI,IAAI,CAAA,SAAQ,UAAU,IAAI,CAAC;AAAA,EACvC;AAEA,QAAM,SAAS,CAAA;AAEf,aAAW,OAAO,KAAK;AACtB,QAAI,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG,GAAG;AACnD,aAAO,GAAG,IAAI,UAAU,IAAI,GAAG,CAAC;AAAA,IACjC;AAAA,EACD;AAEA,SAAO;AACR;AAKO,SAAS,UACf,WACG,SACC;AACJ,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,QAAM,SAAS,QAAQ,MAAA;AAEvB,MAAI,SAAS,MAAM,KAAK,SAAS,MAAM,GAAG;AACzC,eAAW,OAAO,QAAQ;AACzB,UAAI,SAAS,OAAO,GAAG,CAAC,GAAG;AAC1B,YAAI,CAAC,OAAO,GAAG,GAAG;AACjB,iBAAO,OAAO,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAA,GAAI;AAAA,QACpC;AACA;AAAA,UACC,OAAO,GAAG;AAAA,UACV,OAAO,GAAG;AAAA,QAAA;AAAA,MAEZ,OAAO;AACN,eAAO,OAAO,QAAQ,EAAE,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG;AAAA,MAC7C;AAAA,IACD;AAAA,EACD;AAEA,SAAO,UAAU,QAAQ,GAAG,OAAO;AACpC;AAKO,SAAS,IACf,KACA,MACA,cACI;AACJ,QAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,MAAI,SAAc;AAElB,aAAW,OAAO,MAAM;AACvB,QAAI,WAAW,QAAQ,WAAW,QAAW;AAC5C,aAAO;AAAA,IACR;AACA,aAAS,OAAO,GAAG;AAAA,EACpB;AAEA,SAAQ,WAAW,SAAY,eAAe;AAC/C;AAKO,SAAS,IAAI,KAA0B,MAAc,OAAkB;AAC7E,QAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,QAAM,UAAU,KAAK,IAAA;AACrB,MAAI,UAAU;AAEd,aAAW,OAAO,MAAM;AACvB,QAAI,QAAQ,GAAG,MAAM,QAAW;AAC/B,cAAQ,GAAG,IAAI,CAAA;AAAA,IAChB;AACA,cAAU,QAAQ,GAAG;AAAA,EACtB;AAEA,UAAQ,OAAO,IAAI;AACpB;AAKO,SAAS,SACf,MACA,OAAe,KACf,UAAqD,CAAA,GAC4B;AACjF,MAAI,UAAgD,MACnD,WAAiC,MACjC,WAAgB;AAEjB,QAAM,EAAE,UAAU,OAAO,WAAW,SAAS;AAE7C,QAAM,aAAa,MAAY;AAC9B,QAAI,UAAU;AACb,WAAK,MAAM,UAAU,QAAQ;AAC7B,iBAAW;AACX,iBAAW;AAAA,IACZ;AAAA,EACD;AAEA,QAAM,YAAY,YAAwB,MAA2B;AACpE,eAAW;AAEX,eAAW;AAEX,QAAI,SAAS;AACZ,mBAAa,OAAO;AAAA,IACrB;AAEA,QAAI,WAAW,CAAC,SAAS;AACxB,iBAAA;AAAA,IACD;AAEA,cAAU,WAAW,MAAM;AAC1B,UAAI,UAAU;AACb,mBAAA;AAAA,MACD;AACA,gBAAU;AAAA,IACX,GAAG,IAAI;AAAA,EACR;AAEA,YAAU,SAAS,MAAM;AACxB,QAAI,SAAS;AACZ,mBAAa,OAAO;AACpB,gBAAU;AAAA,IACX;AACA,eAAW;AACX,eAAW;AAAA,EACZ;AAEA,YAAU,QAAQ,MAAM;AACvB,QAAI,SAAS;AACZ,mBAAa,OAAO;AACpB,iBAAA;AACA,gBAAU;AAAA,IACX;AAAA,EACD;AAEA,SAAO;AACR;AAKO,SAAS,SACf,MACA,OAAe,KACf,UAAqD,CAAA,GACS;AAC9D,MAAI,UAAgD,MACnD,WAAiC,MACjC,WAAgB,MAChB,eAAe;AAEhB,QAAM,EAAE,UAAU,MAAM,WAAW,SAAS;AAE5C,QAAM,aAAa,MAAY;AAC9B,QAAI,UAAU;AACb,WAAK,MAAM,UAAU,QAAQ;AAC7B,iBAAW;AACX,iBAAW;AAAA,IACZ;AAAA,EACD;AAEA,QAAM,YAAY,YAAwB,MAA2B;AACpE,UAAM,MAAM,KAAK,IAAA;AAEjB,QAAI,CAAC,gBAAgB,CAAC,SAAS;AAC9B,qBAAe;AAAA,IAChB;AAEA,UAAM,YAAY,QAAQ,MAAM;AAEhC,eAAW;AAEX,eAAW;AAEX,QAAI,aAAa,KAAK,YAAY,MAAM;AACvC,UAAI,SAAS;AACZ,qBAAa,OAAO;AACpB,kBAAU;AAAA,MACX;AACA,qBAAe;AACf,iBAAA;AAAA,IACD,WAAW,CAAC,WAAW,UAAU;AAChC,gBAAU,WAAW,MAAM;AAC1B,uBAAe,UAAU,KAAK,IAAA,IAAQ;AACtC,kBAAU;AACV,mBAAA;AAAA,MACD,GAAG,SAAS;AAAA,IACb;AAAA,EACD;AAEA,YAAU,SAAS,MAAM;AACxB,QAAI,SAAS;AACZ,mBAAa,OAAO;AACpB,gBAAU;AAAA,IACX;AACA,mBAAe;AACf,eAAW;AACX,eAAW;AAAA,EACZ;AAEA,SAAO;AACR;AAMO,SAAS,UAAU,KAA6B;AACtD,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI,IAAI,SAAS,IAAI,GAAG;AACvB,WAAO,SAAS,KAAK,EAAE;AAAA,EACxB;AAEA,MAAI,IAAI,SAAS,GAAG,GAAG;AACtB,WAAO,WAAW,GAAG,IAAI;AAAA,EAC1B;AAEA,QAAM,MAAM,SAAS,KAAK,EAAE;AAE5B,SAAO,MAAM,GAAG,IAAI,OAAO;AAC5B;AAKO,SAAS,WAAW,SAAiB,IAAY;AACvD,SAAO,GAAG,MAAM,GAAG,KAAK,MAAM,SAAS,EAAE,CAAC,GAAG,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACpF;ACtPA,MAAMC,cAAY;AAKlB,SAAS,mBAAmB,IAAiB,SAAkC;AAC9E,MAAI,QAAQ,YAAY,QAAQ,cAAc;AAC7C,OAAG,UAAU,OAAO,QAAQ,YAAY;AAAA,EACzC;AACD;AAKA,SAAS,mBACR,IACA,SACyB;AACzB,SAAO,CAAC,UAAiB;AACxB,UAAM,QAAQH,WAAuC,IAAIG,WAAS;AAElE,QAAI,CAAC,SAAS,MAAM,WAAW;AAC9B,YAAM,eAAA;AACN,YAAM,gBAAA;AACN;AAAA,IACD;AAGA,UAAM,YAAY;AAGlB,QAAI,QAAQ,YAAY,QAAQ,cAAc;AAC7C,SAAG,UAAU,IAAI,QAAQ,YAAY;AAAA,IACtC;AAGA,YAAQ,QAAQ,KAAgC;AAGhD,UAAM,YAAY,WAAW,MAAM;AAClC,YAAM,YAAY;AAClB,YAAM,YAAY;AAClB,yBAAmB,IAAI,OAAO;AAAA,IAC/B,GAAG,QAAQ,KAAK;AAAA,EACjB;AACD;AAKA,SAASN,mBACR,SACA,kBACoB;;AACpB,QAAM,QAAQ,UAAU,iBAAiB,GAAG,KAAK;AAEjD,MAAI,OAAO,YAAY,YAAY;AAClC,WAAO;AAAA,MACN,SAAS;AAAA,MACT;AAAA,MACA,UAAU;AAAA,MACV,cAAc;AAAA,MACd,UAAU;AAAA,IAAA;AAAA,EAEZ;AAEA,MAAI,CAAC,SAAS;AACb,UAAM,IAAI,MAAM,+CAA+C;AAAA,EAChE;AAEA,SAAO;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,QAAO,aAAQ,UAAR,YAAiB;AAAA,IACxB,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,eAAc,aAAQ,iBAAR,YAAwB;AAAA,IACtC,WAAU,aAAQ,aAAR,YAAoB;AAAA,EAAA;AAEhC;AAuBO,MAAM,cAAc,gBAAgD;AAAA,EAC1E,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,IACd,UAAU;AAAA,EAAA;AAAA,EAGX,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,OAAO,OAAO;AAEvD,QAAI,QAAQ,SAAU;AAEtB,UAAM,QAAyB;AAAA,MAC9B;AAAA,MACA,SAAS,mBAAmB,IAAI,OAAO;AAAA,MACvC,WAAW;AAAA,MACX,WAAW;AAAA,IAAA;AAGZE,eAAS,IAAII,aAAW,KAAK;AAG7B,OAAG,iBAAiB,SAAS,MAAM,OAAO;AAC1C,OAAG,iBAAiB,YAAY,MAAM,OAAO;AAAA,EAC9C;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAQH,WAAuC,IAAIG,WAAS;AAElE,QAAI,CAAC,OAAO;AAEX,YAAM,UAAUN,mBAAiB,QAAQ,OAAO,OAAO;AACvD,UAAI,CAAC,QAAQ,UAAU;AACtB,cAAM,WAA4B;AAAA,UACjC;AAAA,UACA,SAAS,mBAAmB,IAAI,OAAO;AAAA,UACvC,WAAW;AAAA,UACX,WAAW;AAAA,QAAA;AAEZE,mBAAS,IAAII,aAAW,QAAQ;AAChC,WAAG,iBAAiB,SAAS,SAAS,OAAO;AAC7C,WAAG,iBAAiB,YAAY,SAAS,OAAO;AAAA,MACjD;AACA;AAAA,IACD;AAEA,UAAM,aAAaN,mBAAiB,QAAQ,OAAO,OAAO;AAG1D,QAAI,WAAW,YAAY,CAAC,MAAM,QAAQ,UAAU;AAEnD,SAAG,oBAAoB,SAAS,MAAM,OAAO;AAC7C,SAAG,oBAAoB,YAAY,MAAM,OAAO;AAChD,UAAI,MAAM,WAAW;AACpB,qBAAa,MAAM,SAAS;AAAA,MAC7B;AACA,yBAAmB,IAAI,MAAM,OAAO;AACpC,kBAAY,IAAIM,WAAS;AAAA,IAC1B,WAAW,CAAC,WAAW,YAAY,MAAM,QAAQ,UAAU;AAE1D,YAAM,UAAU,mBAAmB,IAAI,UAAU;AACjD,YAAM,YAAY;AAClB,YAAM,YAAY;AAClB,SAAG,iBAAiB,SAAS,MAAM,OAAO;AAC1C,SAAG,iBAAiB,YAAY,MAAM,OAAO;AAAA,IAC9C;AAEA,UAAM,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAQH,WAAuC,IAAIG,WAAS;AAElE,QAAI,CAAC,MAAO;AAEZ,OAAG,oBAAoB,SAAS,MAAM,OAAO;AAC7C,OAAG,oBAAoB,YAAY,MAAM,OAAO;AAEhD,QAAI,MAAM,WAAW;AACpB,mBAAa,MAAM,SAAS;AAAA,IAC7B;AAEA,uBAAmB,IAAI,MAAM,OAAO;AACpC,gBAAY,IAAIA,WAAS;AAAA,EAC1B;AACD,CAAC;ACxKM,MAAM,gBAAgB,gBAAkD;AAAA,EAC9E,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,IACT,SAAS;AAAA,IACT,QAAQ,CAAC,OAAO;AAAA,IAChB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,EAAA;AAAA,EAGV,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUN,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,SAAU;AAEtB,UAAM,QAA2B;AAAA,MAChC;AAAA,MACA,8BAAc,IAAA;AAAA,IAAI;AAGf,OAAW,iBAAiB;AAGhC,UAAM,gBAAgB,CAAC,eAAuB;AAC7C,aAAO,CAAC,UAAiB;AAExB,YAAI,CAACO,eAAa,IAAI,OAAO,OAAO,GAAG;AACtC;AAAA,QACD;AAGA,YAAI,QAAQ,MAAM;AACjB,gBAAM,gBAAA;AAAA,QACP;AAGA,YAAI,QAAQ,SAAS;AACpB,gBAAM,eAAA;AAAA,QACP;AAGA,gBAAQ,QAAQ,KAAgC;AAAA,MACjD;AAAA,IACD;AAGA,YAAQ,OAAQ,QAAQ,CAAA,cAAa;AACpC,YAAM,UAAU,cAAuB;AAEvC,YAAM,SAAS,IAAI,WAAW,OAAO;AAErC,YAAM,kBAAkB;AAAA,QACvB,SAAS,QAAQ;AAAA,QACjB,SAAS,CAAC,QAAQ;AAAA,MAAA;AAGnB,SAAG,UAAU,WAAW,SAAS,eAAe;AAAA,IACjD,CAAC;AAAA,EACF;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAA4B,GAAW;AAE7C,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAa,MAAM;AACzB,UAAM,aAAaP,mBAAiB,QAAQ,KAAK;AAGjD,QAAI,WAAW,aAAa,WAAW,UAAU;AAChD,UAAI,WAAW,UAAU;AAExB,cAAM,SAAS,QAAQ,CAAC,SAAS,cAAc;AAC9C,cAAI,UAAU,WAAW,SAAS,EAAE,SAAS,WAAW,SAAS;AAAA,QAClE,CAAC;AACD,cAAM,SAAS,MAAA;AAAA,MAChB,OAAO;AAEN,cAAM,gBAAgB,CAAC,eAAuB;AAC7C,iBAAO,CAAC,UAAiB;AACxB,gBAAI,CAACO,eAAa,IAAI,OAAO,UAAU,EAAG;AAC1C,gBAAI,WAAW,KAAM,OAAM,gBAAA;AAC3B,gBAAI,WAAW,QAAS,OAAM,eAAA;AAC9B,uBAAW,QAAQ,KAAgC;AAAA,UACpD;AAAA,QACD;AAEA,mBAAW,OAAQ,QAAQ,CAAA,cAAa;AACvC,gBAAM,UAAU,cAAuB;AAEvC,gBAAM,SAAS,IAAI,WAAW,OAAO;AACrC,aAAG,UAAU,WAAW,SAAS;AAAA,YAChC,SAAS,WAAW;AAAA,YACpB,SAAS,CAAC,WAAW;AAAA,UAAA,CACrB;AAAA,QACF,CAAC;AAAA,MACF;AAAA,IACD;AAEA,UAAM,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAA4B,GAAW;AAE7C,QAAI,CAAC,MAAO;AAGZ,UAAM,SAAS,QAAQ,CAAC,SAAS,cAAc;AAC9C,UAAI,UAAU,WAAW,SAAS,EAAE,SAAS,MAAM,QAAQ,SAAS;AAAA,IACrE,CAAC;AAED,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AAKD,SAASP,mBAAiB,SAA+D;;AACxF,MAAI,OAAO,YAAY,YAAY;AAClC,WAAO;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ,CAAC,OAAO;AAAA,MAChB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IAAA;AAAA,EAEX;AAEA,MAAI,CAAC,SAAS;AACb,UAAM,IAAI,MAAM,iDAAiD;AAAA,EAClE;AAEA,SAAO;AAAA,IACN,UAAS,aAAQ,YAAR,YAAmB;AAAA,IAC5B,SAAQ,aAAQ,WAAR,YAAkB,CAAC,OAAO;AAAA,IAClC,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,OAAM,aAAQ,SAAR,YAAgB;AAAA,IACtB,UAAS,aAAQ,YAAR,YAAmB;AAAA,KACzB;AAEL;AAKA,SAASO,eACR,IACA,OACA,SACU;;AACV,QAAM,SAAS,MAAM;AAGrB,MAAI,GAAG,SAAS,MAAM,GAAG;AACxB,WAAO;AAAA,EACR;AAGA,OAAI,aAAQ,YAAR,mBAAiB,QAAQ;AAC5B,eAAW,WAAW,QAAQ,SAAS;AACtC,YAAM,YAAY,OAAO,YAAY,aAAa,QAAA,IAAY,WAAW,OAAO;AAEhF,UAAI,cAAc,cAAc,UAAU,UAAU,SAAS,MAAM,IAAI;AACtE,eAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AAEA,SAAO;AACR;AC/LA,SAAeC,kBAAgB,MAAgC;AAAA;AAE9D,QAAI,qBAAqB;AACxB,UAAI;AACH,cAAM,UAAU,UAAU,UAAU,IAAI;AAExC,eAAO;AAAA,MACR,SAAQ;AAEP,gBAAQ,KAAK,8DAA8D;AAAA,MAC5E;AAAA,IACD;AAGA,WAAOC,sBAAoB,IAAI;AAAA,EAChC;AAAA;AAKA,SAASA,sBAAoB,MAAuB;AAEnD,QAAM,WAAW,SAAS,cAAc,UAAU;AAElD,WAAS,QAAQ;AAGjB,WAAS,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQzB,WAAS,KAAK,YAAY,QAAQ;AAElC,MAAI;AAEH,aAAS,OAAA;AACT,aAAS,kBAAkB,GAAG,SAAS,MAAM,MAAM;AAEnD,WAAO,SAAS,YAAY,MAAM;AAAA,EACnC,SAAQ;AACP,WAAO;AAAA,EACR,UAAA;AAEC,aAAS,KAAK,YAAY,QAAQ;AAAA,EACnC;AACD;AAYO,MAAM,QAAQ,gBAA0C;AAAA,EAC9D,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUT,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,SAAU;AAGtB,QAAI,QAAQ,OAAO;AAClB,SAAG,aAAa,SAAS,QAAQ,KAAK;AAAA,IACvC;AAGA,UAAM,QAAmB;AAAA,MACxB,SAAS;AAAA,MACT;AAAA,IAAA;AAID,UAAM,UAAU,MAAY;;AAC3B,YAAM,OAAO,MAAM,QAAQ;AAE3B,UAAI,CAAC,MAAM;AACV,gBAAQ,KAAK,oCAAoC;AAEjD;AAAA,MACD;AAEA,UAAI;AACH,cAAM,UAAU,MAAMQ,kBAAgB,IAAI;AAE1C,YAAI,SAAS;AACZ,4BAAM,SAAQ,cAAd,4BAA0B;AAC1B,aAAG,cAAc,IAAI,YAAY,gBAAgB,EAAE,QAAQ,EAAE,KAAA,EAAK,CAAG,CAAC;AAAA,QACvE,OAAO;AACN,gBAAM,IAAI,MAAM,aAAa;AAAA,QAC9B;AAAA,MACD,SAAS,KAAK;AACb,cAAM,QAAQ;AAEd,0BAAM,SAAQ,YAAd,4BAAwB;AACxB,WAAG,cAAc,IAAI,YAAY,cAAc,EAAE,QAAQ,EAAE,MAAA,EAAM,CAAG,CAAC;AAAA,MACtE;AAAA,IACD;AAEA,OAAG,iBAAiB,SAAS,MAAM,OAAO;AACxC,OAAW,SAAS;AAAA,EACvB;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAoB,GAAW;AAErC,QAAI,CAAC,MAAO;AAEZ,UAAM,UAAUR,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,MAAM,QAAQ,OAAO;AACxB,SAAG,aAAa,SAAS,MAAM,QAAQ,KAAK;AAAA,IAC7C;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAoB,GAAW;AAErC,QAAI,CAAC,MAAO;AAEZ,OAAG,oBAAoB,SAAS,MAAM,OAAO;AAC7C,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AAKD,SAASA,mBAAiB,SAAmC;AAC5D,MAAI,OAAO,YAAY,UAAU;AAChC,WAAO,EAAE,OAAO,QAAA;AAAA,EACjB;AAEA,SAAO;AACR;AChGA,SAASU,kBAAgB,QAAwC;AAChE,MAAI,kBAAkB,MAAM;AAC3B,WAAO,OAAO,QAAA;AAAA,EACf;AAEA,MAAI,OAAO,WAAW,UAAU;AAC/B,WAAO;AAAA,EACR;AAEA,SAAO,IAAI,KAAK,MAAM,EAAE,QAAA;AACzB;AAKA,SAASC,gBAAc,WAAkC;AACxD,QAAM,QAAQ,KAAK,IAAI,GAAG,SAAS;AAEnC,SAAO;AAAA,IACN,MAAM,KAAK,MAAM,SAAS,MAAO,KAAK,KAAK,GAAG;AAAA,IAC9C,OAAO,KAAK,MAAO,SAAS,MAAO,KAAK,KAAK,OAAQ,MAAO,KAAK,GAAG;AAAA,IACpE,SAAS,KAAK,MAAO,SAAS,MAAO,KAAK,OAAQ,MAAO,GAAG;AAAA,IAC5D,SAAS,KAAK,MAAO,SAAS,MAAO,MAAO,GAAI;AAAA,IAChD,cAAc,QAAQ;AAAA,IACtB;AAAA,EAAA;AAEF;AAKA,SAASC,aAAW,MAAqB,QAAkD;AAC1F,MAAI,OAAO,WAAW,YAAY;AACjC,WAAO,OAAO,IAAI;AAAA,EACnB;AAEA,QAAM,MAAM,CAAC,GAAW,MAAM,MAAc,OAAO,CAAC,EAAE,SAAS,KAAK,GAAG;AAGvE,QAAM,SAAS,OACb,QAAQ,QAAQ,IAAI,KAAK,IAAI,CAAC,EAC9B,QAAQ,QAAQ,IAAI,KAAK,KAAK,CAAC,EAC/B,QAAQ,QAAQ,IAAI,KAAK,OAAO,CAAC,EACjC,QAAQ,QAAQ,IAAI,KAAK,OAAO,CAAC,EACjC,QAAQ,UAAU,IAAI,KAAK,cAAc,CAAC,CAAC,EAC3C,QAAQ,QAAQ,IAAI,KAAK,MAAM,KAAK,eAAe,EAAE,CAAC,CAAC,EACvD,QAAQ,OAAO,OAAO,KAAK,MAAM,KAAK,eAAe,GAAG,CAAC,CAAC;AAE5D,SAAO;AACR;AAKA,SAASZ,mBAAiB,SAA6C;;AACtE,MAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,YAAY,SAAS;AAC3E,WAAO;AAAA,MACN,QAAQ,QAAQ;AAAA,MAChB,SAAQ,aAAQ,WAAR,YAAkB;AAAA,MAC1B,YAAY,QAAQ;AAAA,MACpB,QAAQ,QAAQ;AAAA,MAChB,WAAU,aAAQ,aAAR,YAAoB;AAAA,MAC9B,mBAAkB,aAAQ,qBAAR,YAA4B;AAAA,MAC9C,YAAW,aAAQ,cAAR,YAAqB;AAAA,MAChC,QAAQ,QAAQ;AAAA,IAAA;AAAA,EAElB;AAGA,SAAO;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,WAAW;AAAA,EAAA;AAEb;AA+BO,MAAM,aAAa,gBAA+C;AAAA,EACxE,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAC9C,UAAM,aAAaU,kBAAgB,QAAQ,MAAM;AAEjD,UAAM,QAAwB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,WAAW;AAAA,IAAA;AAGV,OAAW,cAAc;AAE3B,QAAI,QAAQ,cAAc,OAAO;AAChC,qBAAe,IAAI,KAAK;AAAA,IACzB,OAAO;AAEN,oBAAc,IAAI,KAAK;AAAA,IACxB;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAyB,GAAW;AAC1C,UAAM,aAAaV,mBAAiB,QAAQ,KAAK;AACjD,UAAM,gBAAgBU,kBAAgB,WAAW,MAAM;AAGvD,QAAI,kBAAkB,MAAM,YAAY;AACvC,YAAM,aAAa;AACnB,YAAM,UAAU;AAGhB,UAAI,MAAM,YAAY;AACrB,sBAAc,MAAM,UAAU;AAC9B,cAAM,aAAa;AAAA,MACpB;AAGA,UAAI,CAAC,MAAM,QAAQ;AAClB,uBAAe,IAAI,KAAK;AAAA,MACzB;AAAA,IACD,OAAO;AACN,YAAM,UAAU;AAAA,IACjB;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAqC,GAAW;AAEtD,QAAI,+BAAO,YAAY;AACtB,oBAAc,MAAM,UAAU;AAAA,IAC/B;AAEA,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AAKD,SAAS,eAAe,IAAiB,OAA6B;AACrE,QAAM,OAAO,MAAY;AACxB,UAAM,MAAM,KAAK,IAAA;AACjB,UAAM,YAAY,MAAM,aAAa;AAErC,QAAI,MAAM,aAAa,GAAG;AACzB,YAAM,YAAY;AAClB,oBAAc,IAAI,KAAK;AACvB,oBAAc,KAAK;AAGnB,UAAI,MAAM,QAAQ,YAAY;AAC7B,cAAM,QAAQ,WAAA;AAAA,MACf;AAGA,SAAG,cAAc,IAAI,YAAY,oBAAoB,CAAC;AACtD;AAAA,IACD;AAEA,kBAAc,IAAI,KAAK;AAGvB,QAAI,MAAM,QAAQ,QAAQ;AACzB,YAAM,OAAOC,gBAAc,MAAM,SAAS;AAC1C,YAAM,QAAQ,OAAO,IAAI;AAAA,IAC1B;AAAA,EACD;AAGA,OAAA;AAGA,QAAM,aAAa,YAAY,MAAM,MAAM,QAAQ,YAAY,GAAI;AACpE;AAKA,SAAS,cAAc,OAA6B;AACnD,MAAI,MAAM,YAAY;AACrB,kBAAc,MAAM,UAAU;AAC9B,UAAM,aAAa;AAAA,EACpB;AACD;AAKA,SAAS,cAAc,IAAiB,OAA6B;AACpE,QAAM,OAAOA,gBAAc,MAAM,SAAS;AAC1C,QAAM,UAAUC,aAAW,MAAM,MAAM,QAAQ,UAAU,UAAU;AACnE,KAAG,cAAc;AAClB;ACjRA,SAASZ,mBACR,SACA,kBACkB;AAClB,QAAM,OAAO,UAAU,iBAAiB,GAAG,KAAK;AAEhD,MAAI,OAAO,YAAY,YAAY;AAClC,WAAO,EAAE,SAAS,SAAS,KAAA;AAAA,EAC5B;AAEA,SAAO,iCAAK,UAAL,EAAc,MAAM,QAAQ,QAAQ,KAAA;AAC5C;AAgBO,MAAM,YAAY,gBAA8C;AAAA,EACtE,MAAM;AAAA,EACN,KAAK;AAAA;AAAA,EACL,UAAU;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAAA,EAGX,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,OAAO,OAAO;AAEvD,UAAM,YAAY,0BAA0B,QAAQ,SAAS,KAAK,oBAAoB,EAAE;AAGxF,UAAM,cAAc,SAAS,QAAQ,SAAS,QAAQ,MAAM;AAAA,MAC3D,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,IAAA,CAClB;AAGD,OAAG,iBAAiB,WAAW,WAAkB;AAE/C,OAAW,aAAa;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEF;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAwB,GAAW;AAEzC,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAaA,mBAAiB,QAAQ,OAAO,OAAO;AAG1D,QACC,WAAW,SAAS,MAAM,QAAQ,QAC/B,WAAW,YAAY,MAAM,QAAQ,WACrC,WAAW,aAAa,MAAM,QAAQ,UACxC;AAED,YAAM,YAAY,OAAA;AAGlB,YAAM,cAAc,SAAS,WAAW,SAAS,WAAW,MAAM;AAAA,QACjE,SAAS,WAAW;AAAA,QACpB,UAAU,WAAW;AAAA,MAAA,CACrB;AAED,SAAG,oBAAoB,MAAM,WAAW,MAAM,WAAkB;AAChE,SAAG,iBAAiB,MAAM,WAAW,WAAkB;AAErD,SAAW,aAAa;AAAA,QACzB;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,SAAS;AAAA,MAAA;AAAA,IAEX,WAAW,WAAW,YAAY,MAAM,QAAQ,SAAS;AAExD,YAAM,QAAQ,UAAU,WAAW;AAAA,IACpC;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAwB,GAAW;AAEzC,QAAI,CAAC,MAAO;AAEZ,UAAM,YAAY,OAAA;AAClB,OAAG,oBAAoB,MAAM,WAAW,MAAM,WAAkB;AAChE,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;ACzED,SAASa,cAAY,KAAkB,UAA8E;;AACpH,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,OAAO,aAAa,YAAY;AACnC,UAAM,aAAa,SAAA;AACnB,YAAO,8CAAY,4BAAZ,YAAuC;AAAA,EAC/C;AAEA,MAAI,OAAO,aAAa,UAAU;AACjC,UAAM,aAAa,SAAS,cAAc,QAAQ;AAClD,YAAO,8CAAY,4BAAZ,YAAuC;AAAA,EAC/C;AAEA,SAAO,SAAS,sBAAA;AACjB;AAKA,SAASC,kBAAgB,GAAkE;AAC1F,MAAI,EAAE,KAAK,WAAW,OAAO,GAAG;AAC/B,UAAM,QAAS,EAAiB,QAAQ,CAAC;AACzC,WAAO,EAAE,SAAS,MAAM,SAAS,SAAS,MAAM,QAAA;AAAA,EACjD;AACA,QAAM,aAAa;AACnB,SAAO,EAAE,SAAS,WAAW,SAAS,SAAS,WAAW,QAAA;AAC3D;AAKA,SAASC,iBAAe,WAA6C;AACpE,QAAM,QAAQ,UAAU,MAAM,yCAAyC;AACvE,MAAI,OAAO;AACV,WAAO,EAAE,GAAG,WAAW,MAAM,CAAC,CAAC,GAAG,GAAG,WAAW,MAAM,CAAC,CAAC,EAAA;AAAA,EACzD;AACA,SAAO,EAAE,GAAG,GAAG,GAAG,EAAA;AACnB;AAKA,SAASf,mBAAiB,SAA6C;;AACtE,MAAI,YAAY,UAAa,YAAY,MAAM;AAC9C,WAAO,EAAE,MAAM,QAAQ,WAAW,OAAO,UAAU,MAAA;AAAA,EACpD;AAEA,MAAI,YAAY,OAAO;AACtB,WAAO,EAAE,MAAM,QAAQ,WAAW,OAAO,UAAU,KAAA;AAAA,EACpD;AAEA,SAAO;AAAA,IACN,OAAM,aAAQ,SAAR,YAAgB;AAAA,IACtB,YAAW,aAAQ,cAAR,YAAqB;AAAA,IAChC,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ;AAAA,IAChB,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,MAAM,QAAQ;AAAA,IACd,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,EAAA;AAEjB;AAyBO,MAAM,aAAa,gBAA+C;AAAA,EACxE,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAC9C,QAAI,QAAQ,SAAU;AAGtB,QAAI,iBAAiB,EAAE,EAAE,aAAa,UAAU;AAC/C,SAAG,MAAM,WAAW;AAAA,IACrB;AAEA,UAAM,QAAwB;AAAA,MAC7B;AAAA,MACA,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,MACT,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU,QAAQ,SAAS,GAAG,cAAc,QAAQ,MAAM,IAAI;AAAA,MAC9D,aAAa;AAAA,MACb,YAAY;AAAA,IAAA;AAGX,OAAW,cAAc;AAG3B,UAAM,WAAW,MAAM,YAAY;AACnC,aAAS,iBAAiB,aAAa,SAAS;AAChD,aAAS,iBAAiB,cAAc,WAAW,EAAE,SAAS,OAAO;AAErE,aAAS,UAAU,GAAkC;;AACpD,UAAI,MAAM,QAAQ,SAAU;AAG5B,UAAI,EAAE,SAAS,cAAc;AAC5B,UAAE,eAAA;AAAA,MACH;AAEA,YAAM,EAAE,SAAS,YAAYc,kBAAgB,CAAC;AAC9C,YAAM,aAAa;AACnB,YAAM,SAAS;AACf,YAAM,SAAS;AAGf,YAAM,EAAE,GAAG,EAAA,IAAMC,iBAAe,GAAG,MAAM,SAAS;AAClD,YAAM,UAAU;AAChB,YAAM,UAAU;AAGhB,UAAI,MAAM,QAAQ,aAAa,MAAM,QAAQ,UAAU;AACtD,cAAM,WAAW,MAAM,QAAQ,WAAWF,cAAY,IAAI,MAAM,QAAQ,QAAQ,KAAI,QAAG,kBAAH,mBAAkB;AAEtG,YAAI,UAAU;AACb,gBAAM,SAAS,GAAG,sBAAA;AAClB,gBAAM,cAAc,OAAO,OAAO,SAAS;AAC3C,gBAAM,aAAa,OAAO,MAAM,SAAS;AACzC,gBAAM,gBAAgB,SAAS;AAC/B,gBAAM,iBAAiB,SAAS;AAChC,gBAAM,UAAU,OAAO;AACvB,gBAAM,WAAW,OAAO;AAAA,QACzB;AAAA,MACD;AAGA,SAAG,UAAU,IAAI,uBAAuB;AAGxC,YAAM,cAAc,CAAC,cAAuC;;AAC3D,YAAI,CAAC,MAAM,WAAY;AAEvB,cAAM,EAAE,SAAS,OAAO,SAAS,MAAA,IAAUC,kBAAgB,SAAS;AACpE,YAAI,SAAS,QAAQ,MAAM,QAC1B,SAAS,QAAQ,MAAM;AAGxB,YAAI,MAAM,QAAQ,SAAS,KAAK;AAC/B,mBAAS;AAAA,QACV,WAAW,MAAM,QAAQ,SAAS,KAAK;AACtC,mBAAS;AAAA,QACV;AAGA,YAAI,MAAM,QAAQ,MAAM;AACvB,mBAAS,KAAK,MAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,QAAQ,KAAK,CAAC;AAC1E,mBAAS,KAAK,MAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,QAAQ,KAAK,CAAC;AAAA,QAC3E;AAGA,YAAI,OAAO,MAAM,UAAU,QAC1B,OAAO,MAAM,UAAU;AAGxB,YAAI,MAAM,QAAQ,aAAa,MAAM,QAAQ,UAAU;AACtD,gBAAM,UAAU,MAAM,cAAc;AACpC,gBAAM,SAAS,MAAM,aAAa;AAClC,gBAAM,UAAU,MAAM,gBAAgB,MAAM;AAC5C,gBAAM,SAAS,MAAM,iBAAiB,MAAM;AAE5C,gBAAM,kBAAkB,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,OAAO,CAAC;AAC9D,gBAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,MAAM,CAAC;AAE3D,iBAAO,MAAM,WAAW,kBAAkB,MAAM;AAChD,iBAAO,MAAM,WAAW,iBAAiB,MAAM;AAAA,QAChD;AAGA,WAAG,MAAM,YAAY,aAAa,IAAI,OAAO,IAAI;AAGjD,SAAAE,OAAAC,MAAA,MAAM,SAAQ,WAAd,gBAAAD,IAAA,KAAAC,KAAuB,EAAE,GAAG,MAAM,GAAG,KAAA,GAAQ;AAAA,MAC9C;AAEA,YAAM,aAAa,MAAM;;AACxB,YAAI,CAAC,MAAM,WAAY;AAEvB,cAAM,aAAa;AACnB,WAAG,UAAU,OAAO,uBAAuB;AAG3C,YAAI,MAAM,aAAa;AACtB,mBAAS,oBAAoB,aAAa,MAAM,WAAW;AAC3D,mBAAS,oBAAoB,aAAa,MAAM,WAAW;AAAA,QAC5D;AACA,YAAI,MAAM,YAAY;AACrB,mBAAS,oBAAoB,WAAW,MAAM,UAAU;AACxD,mBAAS,oBAAoB,YAAY,MAAM,UAAU;AAAA,QAC1D;AAGA,cAAM,EAAE,GAAG,QAAQ,GAAG,WAAWF,iBAAe,GAAG,MAAM,SAAS;AAClE,SAAAC,OAAAC,MAAA,MAAM,SAAQ,UAAd,gBAAAD,IAAA,KAAAC,KAAsB,EAAE,GAAG,QAAQ,GAAG,OAAA,GAAU,IAAI,WAAW,SAAS;AAAA,MACzE;AAGA,eAAS,iBAAiB,aAAa,MAAM,WAAW;AACxD,eAAS,iBAAiB,aAAa,MAAM,aAAa,EAAE,SAAS,OAAO;AAC5E,eAAS,iBAAiB,WAAW,MAAM,UAAU;AACrD,eAAS,iBAAiB,YAAY,MAAM,UAAU;AAGtD,wBAAM,SAAQ,YAAd,4BAAwB,EAAE,GAAG,MAAM,SAAS,GAAG,MAAM,QAAA,GAAW;AAAA,IACjE;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAqC,GAAW;AACtD,QAAI,CAAC,MAAO;AAEZ,UAAM,UAAUjB,mBAAiB,QAAQ,KAAK;AAG9C,QAAI,MAAM,QAAQ,QAAQ;AACzB,YAAM,WAAW,GAAG,cAAc,MAAM,QAAQ,MAAM;AAAA,IACvD;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAqC,GAAW;AACtD,QAAI,CAAC,MAAO;AAGZ,QAAI,MAAM,aAAa;AACtB,eAAS,oBAAoB,aAAa,MAAM,WAAW;AAC3D,eAAS,oBAAoB,aAAa,MAAM,WAAW;AAAA,IAC5D;AACA,QAAI,MAAM,YAAY;AACrB,eAAS,oBAAoB,WAAW,MAAM,UAAU;AACxD,eAAS,oBAAoB,YAAY,MAAM,UAAU;AAAA,IAC1D;AAEA,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AC9RM,MAAM,YAAY,gBAA8C;AAAA,EACtE,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAe;AAAA,EAAA;AAAA,EAGhB,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,kBAAc,IAAI,OAAO;AAEzB,UAAM,QAAuB;AAAA,MAC5B;AAAA,MACA,cAAc,GAAG,eAAe;AAAA,MAChC,cAAc;AAAA,MACd,UAAU;AAAA,IAAA;AAIX,QAAI,QAAQ,YAAY;AACvB,YAAM,UAAU,MAAY;AAC3B,YAAI,MAAM,UAAU;AAEnB,wBAAc,IAAI,OAAO;AACzB,gBAAM,WAAW;AAAA,QAClB,OAAO;AAEN,aAAG,cAAc,MAAM;AACvB,aAAG,MAAM,kBAAkB;AAC3B,aAAG,MAAM,UAAU;AACnB,aAAG,MAAM,WAAW;AACpB,aAAG,MAAM,SAAS;AAClB,gBAAM,WAAW;AAAA,QAClB;AAAA,MACD;AAEA,SAAG,iBAAiB,SAAS,OAAO;AACpC,SAAG,MAAM,SAAS;AAClB,YAAM,eAAe;AAAA,IACtB;AAGA,QAAI,QAAQ,kBAAkB,UAAU;AACvC,SAAG,QAAQ,MAAM;AAAA,IAClB,WAAW,QAAQ,kBAAkB,QAAQ;AAE5C,UAAI,gBAAgB,EAAE,GAAG;AACxB,WAAG,QAAQ,MAAM;AAAA,MAClB;AAAA,IACD;AAEE,OAAW,aAAa;AAAA,EAC3B;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAwB,GAAW;AAEzC,QAAI,CAAC,OAAO;AACX,YAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAC9C,oBAAc,IAAI,OAAO;AACzB;AAAA,IACD;AAEA,UAAM,aAAaA,mBAAiB,QAAQ,KAAK;AACjD,UAAM,cAAc,GAAG,gBAAgB,MAAM;AAE7C,QAAI,aAAa;AAChB,YAAM,eAAe,GAAG,eAAe;AACvC,YAAM,WAAW;AAAA,IAClB;AAGA,QAAI,MAAM,QAAQ,eAAe,WAAW,YAAY;AACvD,UAAI,MAAM,cAAc;AACvB,WAAG,oBAAoB,SAAS,MAAM,YAAY;AAClD,cAAM,eAAe;AAAA,MACtB;AAEA,UAAI,WAAW,YAAY;AAC1B,cAAM,UAAU,MAAY;AAC3B,cAAI,MAAM,UAAU;AACnB,0BAAc,IAAI,UAAU;AAC5B,kBAAM,WAAW;AAAA,UAClB,OAAO;AACN,eAAG,cAAc,MAAM;AACvB,eAAG,MAAM,kBAAkB;AAC3B,eAAG,MAAM,UAAU;AACnB,eAAG,MAAM,WAAW;AACpB,kBAAM,WAAW;AAAA,UAClB;AAAA,QACD;AAEA,WAAG,iBAAiB,SAAS,OAAO;AACpC,WAAG,MAAM,SAAS;AAClB,cAAM,eAAe;AAAA,MACtB,OAAO;AACN,WAAG,MAAM,SAAS;AAAA,MACnB;AAAA,IACD;AAEA,UAAM,UAAU;AAGhB,QAAI,CAAC,MAAM,UAAU;AACpB,oBAAc,IAAI,UAAU;AAAA,IAC7B;AAGA,QAAI,WAAW,kBAAkB,UAAU;AAC1C,SAAG,QAAQ,MAAM;AAAA,IAClB,WAAW,WAAW,kBAAkB,QAAQ;AAC/C,SAAG,QAAQ,gBAAgB,EAAE,IAAI,MAAM,eAAe;AAAA,IACvD,OAAO;AACN,SAAG,gBAAgB,OAAO;AAAA,IAC3B;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAoC,GAAW;AAErD,QAAI,CAAC,MAAO;AAEZ,QAAI,MAAM,cAAc;AACvB,SAAG,oBAAoB,SAAS,MAAM,YAAY;AAAA,IACnD;AAGA,OAAG,MAAM,eAAe,oBAAoB;AAC5C,OAAG,MAAM,eAAe,oBAAoB;AAC5C,OAAG,MAAM,eAAe,SAAS;AACjC,OAAG,MAAM,eAAe,UAAU;AAClC,OAAG,MAAM,eAAe,eAAe;AACvC,OAAG,MAAM,eAAe,aAAa;AACrC,OAAG,MAAM,eAAe,QAAQ;AAEhC,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AAKD,SAAS,cAAc,IAAiB,SAAgC;AACvE,QAAM,QAAQ,QAAQ,SAAS;AAE/B,MAAI,UAAU,GAAG;AAEhB,OAAG,MAAM,WAAW;AACpB,OAAG,MAAM,eAAe;AACxB,OAAG,MAAM,aAAa;AAAA,EACvB,OAAO;AAEN,OAAG,MAAM,UAAU;AACnB,OAAG,MAAM,WAAW;AACpB,OAAG,MAAM,kBAAkB;AAC3B,OAAG,MAAM,kBAAkB,OAAO,KAAK;AAAA,EACxC;AACD;AAKA,SAAS,gBAAgB,IAA0B;AAClD,SAAO,GAAG,cAAc,GAAG,eAAe,GAAG,eAAe,GAAG;AAChE;AAKA,SAASA,mBAAiB,SAAuD;;AAChF,MAAI,OAAO,YAAY,UAAU;AAChC,WAAO;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,IAAA;AAAA,EAEjB;AAEA,SAAO;AAAA,IACN,QAAO,wCAAS,UAAT,YAAkB;AAAA,IACzB,WAAU,wCAAS,aAAT,YAAqB;AAAA,IAC/B,aAAY,wCAAS,eAAT,YAAuB;AAAA,IACnC,gBAAe,wCAAS,kBAAT,YAA0B;AAAA,EAAA;AAE3C;ACvNA,MAAMkB,uCAAqB,IAAI,CAAC,SAAS,YAAY,UAAU,QAAQ,CAAC;AAKxE,SAAS,QAAQ,GAAY,GAAqB;AACjD,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,YAAY,MAAM,QAAQ,MAAM,KAAM,QAAO;AACvF,QAAM,OAAO;AACb,QAAM,OAAO;AACb,QAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,QAAM,QAAQ,OAAO,KAAK,IAAI;AAE9B,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAE1C,SAAO,MAAM,MAAM,CAAA,QAAO,KAAK,GAAG,MAAM,KAAK,GAAG,CAAC;AAClD;AAaO,MAAM,SAAS,gBAA2C;AAAA,EAChE,MAAM;AAAA,EACN,KAAK;AAAA;AAAA,EACL,UAAU;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,EAAA;AAAA,EAGV,QAAQ,IAAI,SAAS;AACpB,QAAI,CAAC,YAAa;AAElB,UAAM,UAAUlB,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,CAAC,QAAQ,SAAS,CAACmB,cAAY,EAAE,GAAG;AACvC,UAAI,QAAQ,OAAO;AAClB,gBAAQ,KAAK,8CAA8C;AAAA,MAC5D;AAEA;AAAA,IACD;AAEA,UAAM,cAAc,MAAA;;AAAY,2BAAQ,YAAR,iCAAkB;AAAA;AAClD,UAAM,aAAa,MAAA;;AAAY,2BAAQ,WAAR,iCAAiB;AAAA;AAEhD,OAAG,iBAAiB,SAAS,WAAW;AACxC,OAAG,iBAAiB,QAAQ,UAAU;AAEpC,OAAW,UAAU;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,QAAQ;AAAA,IAAA;AAGpB,OAAG,MAAA;AAAA,EACJ;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAiC,GAAW;AAElD,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAanB,mBAAiB,QAAQ,KAAK;AAGjD,QAAI,WAAW,YAAY,MAAM,QAAQ,SAAS;AACjD,SAAG,oBAAoB,SAAS,MAAM,WAAW;AACjD,YAAM,cAAc,MAAA;;AAAM,gCAAW,YAAX,oCAAqB;AAAA;AAC/C,SAAG,iBAAiB,SAAS,MAAM,WAAW;AAAA,IAC/C;AAEA,QAAI,WAAW,WAAW,MAAM,QAAQ,QAAQ;AAC/C,SAAG,oBAAoB,QAAQ,MAAM,UAAU;AAC/C,YAAM,aAAa,MAAA;;AAAM,gCAAW,WAAX,oCAAoB;AAAA;AAC7C,SAAG,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAC7C;AAGA,UAAM,eAAe,CAAC,QAAQ,QAAQ,OAAO,MAAM,SAAS;AAG5D,QAAI,WAAW,WAAW,WAAW,SAAS,cAAc;AAC3D,SAAG,MAAA;AAAA,IACJ;AAEA,UAAM,UAAU;AAChB,UAAM,YAAY,QAAQ;AAAA,EAC3B;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAiC,GAAW;AAElD,QAAI,CAAC,MAAO;AAEZ,OAAG,oBAAoB,SAAS,MAAM,WAAW;AACjD,OAAG,oBAAoB,QAAQ,MAAM,UAAU;AAC/C,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AAKD,SAASA,mBAAiB,SAAiD;AAC1E,MAAI,OAAO,YAAY,WAAW;AACjC,WAAO,EAAE,OAAO,SAAS,SAAS,MAAA;AAAA,EACnC;AAEA,SAAO;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,KACN;AAEL;AAKA,SAASmB,cAAY,IAA0B;AAC9C,MAAI,CAAC,UAAA,EAAa,QAAO;AAEzB,QAAM,UAAU,GAAG,QAAQ,YAAA;AAG3B,MAAID,iBAAe,IAAI,OAAO,GAAG;AAChC,WAAO,CAAE,GAAwB;AAAA,EAClC;AAGA,MAAI,GAAG,kBAAmB,QAAO;AAGjC,QAAM,WAAW,GAAG,aAAa,UAAU;AAE3C,MAAI,YAAY,KAAM,QAAO,aAAa;AAG1C,MAAI,YAAY,OAAO,YAAY,QAAQ;AAC1C,WAAO,GAAG,aAAa,MAAM;AAAA,EAC9B;AAEA,SAAO;AACR;AC/JA,MAAME,gBAAsC;AAAA,EAC3C,KAAK;AAAA,EACL,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACN;AAEA,MAAM,oCAAoB,IAAI,CAAC,QAAQ,OAAO,SAAS,MAAM,CAAC;AAE9D,SAAS,aAAa,KAAqB;AAC1C,QAAM,WAAW,IAAI,YAAA;AACrB,SAAOA,cAAY,QAAQ,KAAK;AACjC;AAEA,SAAS,kBAAkB,QAA2D;AACrF,QAAM,QAAQ,OAAO,YAAA,EAAc,MAAM,MAAM;AAC/C,QAAM,YAA2B,CAAA;AACjC,MAAI,MAAM;AAEV,aAAW,QAAQ,OAAO;AACzB,QAAI,cAAc,IAAI,IAAI,GAAG;AAC5B,gBAAU,KAAK,IAAmB;AAAA,IACnC,OAAO;AACN,YAAM,aAAa,IAAI;AAAA,IACxB;AAAA,EACD;AAEA,SAAO,EAAE,KAAK,UAAA;AACf;AAEA,SAASC,gBAAc,OAAsB,OAA6B;AACzE,MAAI,aAAa,MAAM,GAAG,MAAM,MAAM,IAAK,QAAO;AAElD,QAAM,qCAAqB,IAAA;AAC3B,MAAI,MAAM,QAAS,gBAAe,IAAI,MAAM;AAC5C,MAAI,MAAM,OAAQ,gBAAe,IAAI,KAAK;AAC1C,MAAI,MAAM,SAAU,gBAAe,IAAI,OAAO;AAC9C,MAAI,MAAM,QAAS,gBAAe,IAAI,MAAM;AAE5C,MAAI,eAAe,SAAS,MAAM,UAAU,KAAM,QAAO;AAEzD,aAAW,OAAO,MAAM,WAAW;AAClC,QAAI,CAAC,eAAe,IAAI,GAAG,EAAG,QAAO;AAAA,EACtC;AAEA,SAAO;AACR;AAEA,SAAS,YACR,KACA,WACA,SACA,UAAqE,CAAA,GACvD;;AACd,SAAO;AAAA,IACN,KAAK,aAAa,GAAG;AAAA,IACrB,WAAW,IAAI,IAAI,SAAS;AAAA,IAC5B;AAAA,IACA,UAAS,aAAQ,YAAR,YAAmB;AAAA,IAC5B,OAAM,aAAQ,SAAR,YAAgB;AAAA,IACtB,WAAU,aAAQ,aAAR,YAAoB;AAAA,EAAA;AAEhC;AAEA,SAAS,iBACR,SACA,KACA,WACgB;AAEhB,MAAI,KAAK;AACR,UAAM,WAAW,IAAI,YAAA;AACrB,UAAM,gBAAgB,cAAc,IAAI,QAAQ;AAEhD,QAAI;AACJ,UAAM,kBAAiC,CAAA;AAEvC,QAAI,eAAe;AAElB,sBAAgB,KAAK,QAAuB;AAC5C,iBAAW,OAAO,OAAO,KAAK,SAAS,GAAG;AACzC,cAAM,WAAW,IAAI,YAAA;AACrB,YAAI,cAAc,IAAI,QAAQ,GAAG;AAChC,0BAAgB,KAAK,QAAuB;AAAA,QAC7C,OAAO;AACN,gBAAM,aAAa,GAAG;AAAA,QACvB;AAAA,MACD;AAAA,IACD,OAAO;AAEN,YAAM,SAAS,kBAAkB,GAAG;AACpC,YAAM,OAAO;AACb,sBAAgB,KAAK,GAAG,OAAO,SAAS;AACxC,iBAAW,OAAO,OAAO,KAAK,SAAS,GAAG;AACzC,cAAM,WAAW,IAAI,YAAA;AACrB,YAAI,cAAc,IAAI,QAAQ,GAAG;AAChC,0BAAgB,KAAK,QAAuB;AAAA,QAC7C;AAAA,MACD;AAAA,IACD;AAEA,UAAM,UAAU,OAAO,YAAY,aAAa,UAAW,QAA6B;AACxF,WAAO,CAAC,YAAY,KAAM,iBAAiB,OAAO,CAAC;AAAA,EACpD;AAGA,MAAI,OAAO,YAAY,YAAY;AAClC,YAAQ,KAAK,iFAAiF;AAC9F,WAAO,CAAA;AAAA,EACR;AAGA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO,QAAQ;AAAA,MAAI,CAAA,SAClB,YAAY,KAAK,KAAK,KAAK,aAAa,CAAA,GAAI,KAAK,SAAS;AAAA,QACzD,SAAS,KAAK;AAAA,QACd,MAAM,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,MAAA,CACf;AAAA,IAAA;AAAA,EAEH;AAGA,MAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AAEpD,QAAI,aAAa,WAAW,OAAO,QAAQ,YAAY,YAAY;AAClE,YAAM,MAAM;AACZ,aAAO,CAAC,YAAY,IAAI,KAAK,IAAI,aAAa,CAAA,GAAI,IAAI,SAAS,GAAG,CAAC;AAAA,IACpE;AAGA,UAAM,UAAyB,CAAA;AAC/B,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACzD,YAAM,EAAE,KAAK,WAAW,gBAAA,IAAoB,kBAAkB,SAAS;AACvE,YAAM,UAAU,OAAO,UAAU,aAAa,QAAQ,MAAM;AAC5D,YAAM,UAAU,OAAO,UAAU,WAAW,QAAQ,CAAA;AACpD,cAAQ,KAAK,YAAY,KAAK,iBAAiB,SAAS,OAAO,CAAC;AAAA,IACjE;AACA,WAAO;AAAA,EACR;AAEA,SAAO,CAAA;AACR;AAEA,SAAS,qBAAqB,OAAoB;AACjD,SAAO,CAAC,UAAyB;AAChC,eAAW,SAAS,MAAM,SAAS;AAClC,UAAI,MAAM,SAAU;AACpB,UAAI,CAACA,gBAAc,OAAO,KAAK,EAAG;AAElC,UAAI,MAAM,QAAS,OAAM,eAAA;AACzB,UAAI,MAAM,KAAM,OAAM,gBAAA;AACtB,YAAM,QAAQ,KAAK;AACnB;AAAA,IACD;AAAA,EACD;AACD;AAEA,SAASC,aAAW,IAAiB,SAA4C;AAChF,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,QAAqB,EAAE,SAAS,SAAS,KAAA;AAC/C,QAAM,UAAU,qBAAqB,KAAK;AAE1C,KAAG,WAAW,GAAG,YAAY;AAC7B,KAAG,iBAAiB,WAAW,MAAM,OAAO;AAC1C,KAAW,WAAW;AAExB,SAAO;AACR;AAEO,MAAM,UAAU,gBAA4C;AAAA,EAClE,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAU,iBAAiB,QAAQ,OAAO,QAAQ,KAAK,QAAQ,SAAS;AAC9EA,iBAAW,IAAI,OAAO;AAAA,EACvB;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAkC,GAAW;AACnD,UAAM,aAAa,iBAAiB,QAAQ,OAAO,QAAQ,KAAK,QAAQ,SAAS;AAEjF,QAAI,OAAO;AACV,YAAM,UAAU;AAAA,IACjB,OAAO;AACNA,mBAAW,IAAI,UAAU;AAAA,IAC1B;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAkC,GAAW;AACnD,QAAI,CAAC,MAAO;AAEZ,OAAG,oBAAoB,WAAW,MAAM,OAAO;AAC/C,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;ACjFM,SAAS,WAAyB;AACxC,QAAM,+BAAe,IAAA;AACrB,QAAM,gCAAgB,IAAA;AAEtB,SAAO;AAAA;AAAA;AAAA;AAAA,IAIN,WAAW,IAAgB,OAA8C;AACxE,YAAM,KAAK,WAAW,MAAM;AAC3B,iBAAS,OAAO,EAAE;AAClB,WAAA;AAAA,MACD,GAAG,KAAK;AACR,eAAS,IAAI,EAAE;AACf,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA,IAKA,aAAa,IAAyC;AACrD,mBAAa,EAAE;AACf,eAAS,OAAO,EAAE;AAAA,IACnB;AAAA;AAAA;AAAA;AAAA,IAKA,YAAY,IAAgB,OAA+C;AAC1E,YAAM,KAAK,YAAY,IAAI,KAAK;AAChC,gBAAU,IAAI,EAAE;AAChB,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA,IAKA,cAAc,IAA0C;AACvD,oBAAc,EAAE;AAChB,gBAAU,OAAO,EAAE;AAAA,IACpB;AAAA;AAAA;AAAA;AAAA,IAKA,WAAiB;AAChB,eAAS,QAAQ,CAAA,OAAM,aAAa,EAAE,CAAC;AACvC,gBAAU,QAAQ,CAAA,OAAM,cAAc,EAAE,CAAC;AACzC,eAAS,MAAA;AACT,gBAAU,MAAA;AAAA,IACX;AAAA;AAAA;AAAA;AAAA,IAKA,YAAqB;AACpB,aAAO,SAAS,OAAO,KAAK,UAAU,OAAO;AAAA,IAC9C;AAAA,EAAA;AAEF;ACvKA,MAAMhB,cAAY;AAKlB,SAASN,mBAAiB,SAAiD;AAC1E,MAAI,OAAO,YAAY,YAAY;AAClC,WAAO,EAAE,SAAS,SAAS,OAAO,UAAA;AAAA,EACnC;AAEA,SAAO;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,KACT;AAEL;AAKA,SAAS,gBAAgB,IAAiB,OAAmB,GAAqB;;AACjF,QAAM,EAAE,YAAY;AAGpB,MAAI,QAAQ,OAAO;AAClB,OAAG,UAAU,IAAI,QAAQ,KAAK;AAAA,EAC/B;AAGA,KAAG,cAAc,IAAI,YAAY,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAA,EAAE,CAAG,CAAC;AAGzE,gBAAQ,YAAR,iCAAkB;AAClB,gBAAQ,YAAR,iCAAkB,MAAM;AACzB;AAKA,SAAS,gBAAgB,IAAiB,OAAmB,GAAqB;;AACjF,QAAM,EAAE,YAAY;AAGpB,MAAI,QAAQ,OAAO;AAClB,OAAG,UAAU,OAAO,QAAQ,KAAK;AAAA,EAClC;AAGA,KAAG,cAAc,IAAI,YAAY,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAA,EAAE,CAAG,CAAC;AAGzE,gBAAQ,YAAR,iCAAkB;AAClB,gBAAQ,YAAR,iCAAkB,OAAO;AAC1B;AAaO,MAAM,SAAS,gBAA2C;AAAA,EAChE,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,EAAA;AAAA,EAGb,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,YAAY,CAAC,YAAa;AAEtC,UAAM,QAAQ,SAAA;AACd,QAAI,aAAa;AAEjB,UAAM,QAAoB;AAAA,MACzB;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,MACA,SAAS;AAAA,IAAA;AAIV,UAAM,eAAe,CAAC,MAAmB;AACxC,YAAM,QAAQ;AAGd,YAAM,SAAA;AAGN,UAAI,WAAY;AAGhB,UAAI,QAAQ,cAAc,QAAQ,aAAa,GAAG;AACjD,cAAM,WAAW,MAAM;AACtB,uBAAa;AACb,gBAAM,aAAa;AACnB,0BAAgB,IAAI,OAAO,KAAK;AAAA,QACjC,GAAG,QAAQ,UAAU;AAAA,MACtB,OAAO;AACN,qBAAa;AACb,cAAM,aAAa;AACnB,wBAAgB,IAAI,OAAO,KAAK;AAAA,MACjC;AAAA,IACD;AAGA,UAAM,eAAe,CAAC,MAAmB;AACxC,YAAM,QAAQ;AAGd,YAAM,SAAA;AAGN,UAAI,CAAC,WAAY;AAGjB,UAAI,QAAQ,cAAc,QAAQ,aAAa,GAAG;AACjD,cAAM,WAAW,MAAM;AACtB,uBAAa;AACb,gBAAM,aAAa;AACnB,0BAAgB,IAAI,OAAO,KAAK;AAAA,QACjC,GAAG,QAAQ,UAAU;AAAA,MACtB,OAAO;AACN,qBAAa;AACb,cAAM,aAAa;AACnB,wBAAgB,IAAI,OAAO,KAAK;AAAA,MACjC;AAAA,IACD;AAGA,UAAM,UAAUK,aAAW,IAAI;AAAA,MAC9B,YAAY;AAAA,MACZ,YAAY;AAAA,IAAA,CACZ;AAEDH,eAAS,IAAII,aAAW,KAAK;AAAA,EAC9B;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAQH,WAAkC,IAAIG,WAAS;AAE7D,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAaN,mBAAiB,QAAQ,KAAK;AAGjD,QAAI,WAAW,YAAY,CAAC,MAAM,QAAQ,UAAU;AAEnD,SAAG,UAAU,OAAO,MAAM,QAAQ,SAAS,SAAS;AAAA,IACrD,WAAW,CAAC,WAAW,YAAY,MAAM,QAAQ,SAAU;AAI3D,UAAM,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU,IAAI;;AACb,UAAM,QAAQG,WAAkC,IAAIG,WAAS;AAE7D,QAAI,CAAC,MAAO;AAGZ,UAAM,MAAM,SAAA;AAGZ,gBAAM,YAAN;AAGA,OAAG,UAAU,OAAO,MAAM,QAAQ,SAAS,SAAS;AAEpD,gBAAY,IAAIA,WAAS;AAAA,EAC1B;AACD,CAAC;ACnKD,MAAM,WAAW;AAAA,EAChB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,eAAe;AAAA,EAEf,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,uBAAuB;AACxB;AAEA,IAAI,eAAe;AAMnB,SAASiB,cAAY,IAAY,IAAY,IAAY,IAAoB;AAC5E,SAAO,KAAK,KAAM,WAAK,IAAO,KAAK,WAAK,IAAO,EAAC;AACjD;AAEA,SAAS,MAAM,OAAe,KAAa,KAAqB;AAC/D,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC1C;AAMA,SAAS,cAAc,SAIrB;;AACD,QAAM,UAAS,aAAQ,WAAR,YAAkB,EAAE;AAGnC,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,MAAI,QAAQ,MAAO,SAAQ,UAAU,IAAI,QAAQ,KAAK;AAEtD,SAAO,OAAO,QAAQ,OAAO;AAAA,IAC5B,UAAU;AAAA,IACV,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,QAAQ,OAAO,MAAM;AAAA,IACrB,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,UAAU;AAAA,EAAA,CACV;AAGD,QAAM,iBAAiB,SAAS,cAAc,KAAK;AACnD,SAAO,OAAO,eAAe,OAAO;AAAA,IACnC,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,YAAY;AAAA,EAAA,CACZ;AAGD,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,MAAM,QAAQ,cAAc,QAAQ,OAAO;AACjD,QAAM,MAAM,QAAQ,OAAO;AAC3B,SAAO,OAAO,MAAM,OAAO;AAAA,IAC1B,UAAU;AAAA,IACV,WAAW;AAAA,IACX,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAAA,CAChB;AACD,QAAM,iBAAiB,aAAa,CAAA,MAAK,EAAE,gBAAgB;AAE3D,iBAAe,YAAY,KAAK;AAGhC,MAAI,QAAQ,oBAAoB,OAAO;AACtC,UAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,aAAS,YAAY;AACrB,aAAS,YAAY;AACrB,aAAS,aAAa,cAAc,eAAe;AAEnD,WAAO,OAAO,SAAS,OAAO;AAAA,MAC7B,UAAU;AAAA,MACV,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,QAAQ,OAAO,SAAS,CAAC;AAAA,MACzB,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,IAAA,CACtB;AAED,UAAM,cAAc,CAAC,IAAY,UAAwB;AACxD,eAAS,MAAM,aAAa;AAC5B,eAAS,MAAM,YAAY;AAAA,IAC5B;AAEA,aAAS,iBAAiB,cAAc,MAAM,YAAY,6BAA6B,YAAY,CAAC;AACpG,aAAS,iBAAiB,cAAc,MAAM,YAAY,6BAA6B,UAAU,CAAC;AAClG,aAAS,iBAAiB,cAAc,MAAM,YAAY,6BAA6B,aAAa,GAAG,EAAE,SAAS,MAAM;AACxH,aAAS,iBAAiB,YAAY,MAAM,YAAY,6BAA6B,UAAU,GAAG,EAAE,SAAS,MAAM;AAEnH,YAAQ,YAAY,QAAQ;AAAA,EAC7B;AAGA,MAAI,QAAQ,sBAAsB,OAAO;AACxC,UAAM,gBAAgB,SAAS,cAAc,KAAK;AAClD,kBAAc,YAAY;AAC1B,kBAAc,cAAc;AAE5B,WAAO,OAAO,cAAc,OAAO;AAAA,MAClC,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,QAAQ,OAAO,SAAS,CAAC;AAAA,MACzB,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,IAAA,CACtB;AAED,YAAQ,YAAY,aAAa;AAAA,EAClC;AAGA,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,OAAK,cAAc;AAEnB,SAAO,OAAO,KAAK,OAAO;AAAA,IACzB,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ,OAAO,SAAS,CAAC;AAAA,IACzB,eAAe;AAAA,EAAA,CACf;AAED,UAAQ,YAAY,IAAI;AACxB,aAAW,MAAO,KAAK,MAAM,UAAU,KAAM,SAAS,YAAY;AAElE,UAAQ,YAAY,cAAc;AAElC,SAAO,EAAE,SAAS,gBAAgB,MAAA;AACnC;AAaA,SAAS,uBAAuB,OAAuC;AACtE,QAAM,kBAAkB,CAAC,UAAU,UAAgB;;AAClD,QAAI,CAAC,MAAM,eAAgB;AAE3B,UAAM,EAAE,OAAO,YAAY,WAAA,IAAe,MAAM;AAChD,UAAM,eAAe,MAAM,aAAa,UAAU,4BAA4B;AAC9E,UAAM,eAAe,MAAM,YAAY,aAAa,UAAU,OAAO,UAAU,aAAa,KAAK;AAGjG,UAAM,iBAAgB,WAAM,YAAN,mBAAe,cAAc;AACnD,QAAI,eAAe;AAClB,oBAAc,cAAc,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC;AACtD,oBAAc,MAAM,UAAU;AAE9B,mBAAc,cAAsB,UAAU;AAC5C,oBAAsB,aAAa,WAAW,MAAM;AACrD,sBAAc,MAAM,UAAU;AAAA,MAC/B,GAAG,SAAS,qBAAqB;AAAA,IAClC;AAAA,EACD;AAEA,QAAM,iBAAiB,MAAY;AAClC,UAAM,YAAY,EAAE,OAAO,GAAG,YAAY,GAAG,YAAY,EAAA;AACzD,oBAAgB,IAAI;AAAA,EACrB;AAEA,QAAM,iBAAiB,CAAC,aAA6B;AACpD,UAAM,EAAE,WAAW,SAAS,UAAU,WAAW,SAAS,aAAa,MAAM;AAC7E,WAAO,MAAM,UAAU,UAAU,QAAQ;AAAA,EAC1C;AAEA,QAAM,qBAAqB,CAAC,GAAW,MAAwC;AAC9E,UAAM,EAAE,UAAU,MAAM;AACxB,QAAI,CAAC,MAAM,SAAS,SAAS,UAAU,EAAE,GAAG,GAAG,GAAG,EAAA;AAElD,UAAM,OAAO,MAAM,MAAM,sBAAA;AACzB,UAAM,OAAQ,KAAK,SAAS,QAAQ,KAAM;AAC1C,UAAM,OAAQ,KAAK,UAAU,QAAQ,KAAM;AAE3C,WAAO;AAAA,MACN,GAAG,MAAM,GAAG,CAAC,MAAM,IAAI;AAAA,MACvB,GAAG,MAAM,GAAG,CAAC,MAAM,IAAI;AAAA,IAAA;AAAA,EAEzB;AAEA,SAAO,EAAE,iBAAiB,gBAAgB,gBAAgB,mBAAA;AAC3D;AAgBA,SAAS,sBACR,OACA,kBACA,cACkB;AAClB,QAAM,EAAE,iBAAiB,gBAAgB,gBAAgB,uBAAuB;AAEhF,QAAM,mBAAmB,CAAC,MAAwB;AACjD,QAAI,CAAC,MAAM,eAAgB;AAE3B,UAAM,MAAM,KAAK,IAAA;AACjB,UAAM,EAAE,SAAS,WAAW,QAAA,IAAY;AAExC,QAAI,EAAE,QAAQ,WAAW,GAAG;AAE3B,UAAI,QAAQ,oBAAoB,SAAS,MAAM,QAAQ,cAAc,SAAS,YAAY;AACzF,UAAE,eAAA;AACF,kBAAU,QAAQ,UAAU,QAAQ,IAAI,IAAI,eAAe,SAAS,aAAa;AACjF,gBAAQ,cAAc;AACtB,wBAAgB,IAAI;AACpB;AAAA,MACD;AAEA,cAAQ,cAAc;AACtB,cAAQ,aAAa;AACrB,cAAQ,SAAS,EAAE,QAAQ,CAAC,EAAE,UAAU,UAAU;AAClD,cAAQ,SAAS,EAAE,QAAQ,CAAC,EAAE,UAAU,UAAU;AAClD,cAAQ,cAAc,EAAE,QAAQ,CAAC,EAAE;AAAA,IACpC,WAAW,EAAE,QAAQ,WAAW,KAAK,QAAQ,oBAAoB,OAAO;AACvE,cAAQ,aAAa;AACrB,cAAQ,gBAAgBA;AAAAA,QACvB,EAAE,QAAQ,CAAC,EAAE;AAAA,QACb,EAAE,QAAQ,CAAC,EAAE;AAAA,QACb,EAAE,QAAQ,CAAC,EAAE;AAAA,QACb,EAAE,QAAQ,CAAC,EAAE;AAAA,MAAA;AAEd,cAAQ,aAAa,UAAU;AAAA,IAChC;AAAA,EACD;AAEA,QAAM,kBAAkB,CAAC,MAAwB;AAChD,QAAI,CAAC,MAAM,eAAgB;AAC3B,MAAE,eAAA;AAEF,UAAM,EAAE,SAAS,WAAW,QAAA,IAAY;AAExC,QAAI,EAAE,QAAQ,WAAW,KAAK,QAAQ,YAAY;AACjD,YAAM,OAAO,EAAE,QAAQ,CAAC,EAAE,UAAU,QAAQ;AAC5C,YAAM,OAAO,EAAE,QAAQ,CAAC,EAAE,UAAU,QAAQ;AAC5C,YAAM,cAAc,mBAAmB,MAAM,IAAI;AAEjD,gBAAU,aAAa,YAAY;AACnC,gBAAU,aAAa,YAAY;AACnC,sBAAgB,KAAK;AAAA,IACtB,WAAW,EAAE,QAAQ,WAAW,KAAK,QAAQ,oBAAoB,OAAO;AACvE,YAAM,kBAAkBA;AAAAA,QACvB,EAAE,QAAQ,CAAC,EAAE;AAAA,QACb,EAAE,QAAQ,CAAC,EAAE;AAAA,QACb,EAAE,QAAQ,CAAC,EAAE;AAAA,QACb,EAAE,QAAQ,CAAC,EAAE;AAAA,MAAA;AAGd,gBAAU,QAAQ,eAAe,QAAQ,cAAc,kBAAkB,QAAQ,cAAc;AAC/F,sBAAgB,KAAK;AAAA,IACtB;AAAA,EACD;AAEA,QAAM,iBAAiB,CAAC,MAAwB;AAC/C,UAAM,EAAE,SAAS,WAAW,QAAA,IAAY;AACxC,YAAQ,aAAa;AAGrB,QAAI,QAAQ,qBAAqB,SAAS,EAAE,eAAe,WAAW,KAAK,UAAU,SAAS,GAAG;AAChG,YAAM,SAAS,EAAE,eAAe,CAAC,EAAE,UAAU,QAAQ;AACrD,UAAI,SAAS,MAA0B;AACtC,qBAAA;AACA;AAAA,MACD;AAAA,IACD;AAGA,QAAI,UAAU,QAAQ,GAAG;AACxB,qBAAA;AAAA,IACD;AAAA,EACD;AAEA,QAAM,kBAAkB,CAAC,MAAwB;AAChD,QAAI,CAAC,MAAM,eAAgB;AAE3B,UAAM,QAAQ,aAAa;AAC3B,UAAM,QAAQ,SAAS,EAAE,UAAU,MAAM,UAAU;AACnD,UAAM,QAAQ,SAAS,EAAE,UAAU,MAAM,UAAU;AACnD,UAAM,eAAe,MAAM,SAAS;AAAA,EACrC;AAEA,QAAM,kBAAkB,CAAC,MAAwB;AAChD,QAAI,CAAC,MAAM,QAAQ,cAAc,CAAC,MAAM,eAAgB;AAExD,UAAM,OAAO,EAAE,UAAU,MAAM,QAAQ;AACvC,UAAM,OAAO,EAAE,UAAU,MAAM,QAAQ;AACvC,UAAM,cAAc,mBAAmB,MAAM,IAAI;AAEjD,UAAM,UAAU,aAAa,YAAY;AACzC,UAAM,UAAU,aAAa,YAAY;AACzC,oBAAgB,KAAK;AAAA,EACtB;AAEA,QAAM,gBAAgB,MAAY;AACjC,UAAM,QAAQ,aAAa;AAC3B,QAAI,MAAM,gBAAgB;AACzB,YAAM,eAAe,MAAM,SAAS;AAAA,IACrC;AAAA,EACD;AAEA,QAAM,cAAc,CAAC,MAAwB;AAC5C,QAAI,CAAC,MAAM,kBAAkB,MAAM,QAAQ,oBAAoB,MAAO;AACtE,MAAE,eAAA;AAEF,UAAM,QAAQ,EAAE,SAAS,IAAI,MAAM;AACnC,UAAM,UAAU,QAAQ,eAAe,MAAM,UAAU,QAAQ,KAAK;AACpE,oBAAgB,KAAK;AAGrB,QAAI,MAAM,UAAU,QAAQ,KAAK;AAChC,iBAAW,gBAAgB,GAAG;AAAA,IAC/B;AAAA,EACD;AAEA,SAAO,EAAE,kBAAkB,iBAAiB,gBAAgB,iBAAiB,iBAAiB,eAAe,YAAA;AAC9G;AAMA,SAASvB,mBAAiB,SAA8B,IAAsC;;AAC7F,QAAM,QAAQ,GAAG,YAAY,QAAS,GAAwB,MAAM;AACpE,QAAM,eAAe,GAAG,aAAa,cAAc,KAAK;AACxD,QAAM,QAAQ,GAAG,YAAY,QAAS,GAAwB,MAAM,GAAG,aAAa,KAAK,KAAK;AAE9F,MAAI,OAAO,YAAY,UAAU;AAChC,WAAO;AAAA,MACN,KAAK;AAAA,MACL,YAAY;AAAA,MACZ,KAAK;AAAA,MACL,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,MACrB,YAAY;AAAA,MACZ,UAAU,SAAS;AAAA,MACnB,UAAU,SAAS;AAAA,IAAA;AAAA,EAErB;AAEA,SAAO;AAAA,IACN,MAAK,mCAAS,QAAO;AAAA,IACrB,aAAY,mCAAS,eAAc;AAAA,IACnC,MAAK,mCAAS,QAAO;AAAA,IACrB,WAAU,wCAAS,aAAT,YAAqB;AAAA,IAC/B,sBAAqB,wCAAS,wBAAT,YAAgC;AAAA,IACrD,aAAY,wCAAS,eAAT,YAAuB;AAAA,IACnC,kBAAiB,wCAAS,oBAAT,YAA4B;AAAA,IAC7C,QAAQ,mCAAS;AAAA,IACjB,OAAO,mCAAS;AAAA,IAChB,kBAAiB,wCAAS,oBAAT,YAA4B;AAAA,IAC7C,kBAAiB,wCAAS,oBAAT,YAA4B;AAAA,IAC7C,mBAAkB,wCAAS,qBAAT,YAA6B;AAAA,IAC/C,oBAAmB,wCAAS,sBAAT,YAA8B;AAAA,IACjD,WAAU,wCAAS,aAAT,YAAqB,SAAS;AAAA,IACxC,WAAU,wCAAS,aAAT,YAAqB,SAAS;AAAA,IACxC,QAAQ,mCAAS;AAAA,IACjB,SAAS,mCAAS;AAAA,EAAA;AAEpB;AAuBO,MAAM,gBAAgB,gBAAkD;AAAA,EAC9E,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,OAAO,EAAE;AAElD,UAAM,QAAsB;AAAA,MAC3B;AAAA,MACA,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,EAAE,OAAO,GAAG,YAAY,GAAG,YAAY,EAAA;AAAA,MAClD,SAAS;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,aAAa;AAAA,MAAA;AAAA,MAEd,UAAU;AAAA,QACT,OAAO,MAAM;AAAA,QAAC;AAAA,QACd,KAAK;AAAA,QACL,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAU;AAAA,QACV,WAAW;AAAA,QACX,WAAW;AAAA,QACX,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,IACR;AAGC,OAAW,iBAAiB;AAE9B,QAAI,QAAQ,SAAU;AACtB,OAAG,MAAM,SAAS;AAGlB,UAAM,mBAAmB,uBAAuB,KAAK;AAGrD,UAAM,eAAe,MAAY;AAChC,UAAI,CAAC,MAAM,UAAU,CAAC,MAAM,QAAS;AAErC,YAAM,QAAQ,MAAM,UAAU;AAE9B,iBAAW,MAAM;;AAChB,YAAI,CAAC,MAAM,QAAS;AAEpB,cAAM,QAAQ,OAAA;AACd,cAAM,UAAU;AAChB,cAAM,iBAAiB;AACvB,cAAM,QAAQ;AACd,cAAM,SAAS;AACf,cAAM,YAAY,EAAE,OAAO,GAAG,YAAY,GAAG,YAAY,EAAA;AACzD,iBAAS,KAAK,MAAM,WAAW;AAG/B,cAAM,EAAE,aAAa;AACrB,YAAI,SAAS,IAAK,UAAS,oBAAoB,WAAW,SAAS,GAAG;AACtE,YAAI,SAAS,WAAY,UAAS,oBAAoB,cAAc,SAAS,UAAU;AACvF,YAAI,SAAS,UAAW,UAAS,oBAAoB,aAAa,SAAS,SAAS;AACpF,YAAI,SAAS,SAAU,UAAS,oBAAoB,YAAY,SAAS,QAAQ;AACjF,YAAI,SAAS,UAAW,UAAS,oBAAoB,aAAa,SAAS,SAAS;AACpF,YAAI,SAAS,UAAW,UAAS,oBAAoB,aAAa,SAAS,SAAS;AACpF,YAAI,SAAS,QAAS,UAAS,oBAAoB,WAAW,SAAS,OAAO;AAC9E,YAAI,SAAS,MAAO,UAAS,oBAAoB,SAAS,SAAS,KAAK;AAExE,0BAAM,SAAQ,YAAd;AAAA,MACD,GAAG,SAAS,iBAAiB;AAAA,IAC9B;AAGA,UAAM,kBAAkB,sBAAsB,OAAO,kBAAkB,YAAY;AAGnF,UAAM,cAAc,MAAY;;AAC/B,UAAI,MAAM,UAAU,MAAM,QAAQ,SAAU;AAE5C,YAAM,EAAE,SAAS,gBAAgB,UAAU,cAAc,MAAM,OAAO;AACtE,YAAM,UAAU;AAChB,YAAM,iBAAiB;AACvB,YAAM,QAAQ;AACd,YAAM,SAAS;AAEf,eAAS,KAAK,YAAY,OAAO;AACjC,eAAS,KAAK,MAAM,WAAW;AAE/B,4BAAsB,MAAO,QAAQ,MAAM,UAAU,GAAI;AAGzD,YAAM,SAAS,aAAa,gBAAgB;AAC5C,YAAM,SAAS,YAAY,gBAAgB;AAC3C,YAAM,SAAS,WAAW,gBAAgB;AAC1C,YAAM,SAAS,YAAY,gBAAgB;AAC3C,YAAM,SAAS,YAAY,gBAAgB;AAC3C,YAAM,SAAS,UAAU,gBAAgB;AACzC,YAAM,SAAS,QAAQ,gBAAgB;AAGvC,cAAQ,iBAAiB,cAAc,gBAAgB,kBAAkB,EAAE,SAAS,OAAO;AAC3F,cAAQ,iBAAiB,aAAa,gBAAgB,iBAAiB,EAAE,SAAS,OAAO;AACzF,cAAQ,iBAAiB,YAAY,gBAAgB,gBAAgB,EAAE,SAAS,MAAM;AAGtF,YAAM,iBAAiB,aAAa,gBAAgB,eAAe;AACnE,eAAS,iBAAiB,aAAa,gBAAgB,eAAe;AACtE,eAAS,iBAAiB,WAAW,gBAAgB,aAAa;AAGlE,cAAQ,iBAAiB,SAAS,gBAAgB,aAAa,EAAE,SAAS,OAAO;AAGjF,oBAAQ,cAAc,wBAAwB,MAA9C,mBAAiD,iBAAiB,SAAS,CAAA,MAAK;AAC/E,UAAE,gBAAA;AACF,qBAAA;AAAA,MACD;AAGA,UAAI,MAAM,QAAQ,wBAAwB,OAAO;AAChD,gBAAQ,iBAAiB,SAAS,MAAM;AACvC,cAAI,MAAM,UAAU,SAAS,GAAG;AAC/B,yBAAA;AAAA,UACD,OAAO;AACN,6BAAiB,eAAA;AAAA,UAClB;AAAA,QACD,CAAC;AAAA,MACF;AAGA,UAAI,MAAM,QAAQ,eAAe,OAAO;AACvC,cAAM,SAAS,MAAM,CAAA,MAAK;AACzB,cAAI,EAAE,QAAQ,UAAU;AACvB,kBAAM,UAAU,QAAQ,IAAI,iBAAiB,eAAA,IAAmB,aAAA;AAAA,UACjE;AAAA,QACD;AACA,iBAAS,iBAAiB,WAAW,MAAM,SAAS,GAAG;AAAA,MACxD;AAEA,wBAAM,SAAQ,WAAd;AAAA,IACD;AAEA,UAAM,SAAS,QAAQ;AACvB,OAAG,iBAAiB,SAAS,WAAW;AAAA,EACzC;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAS,GAAW;AAC1B,QAAI,CAAC,MAAO;AAEZ,UAAM,UAAUA,mBAAiB,QAAQ,OAAO,EAAE;AAClD,OAAG,MAAM,SAAS,MAAM,QAAQ,WAAW,KAAK;AAAA,EACjD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAS,GAAW;AAC1B,QAAI,CAAC,MAAO;AAEZ,OAAG,oBAAoB,SAAS,MAAM,SAAS,KAAK;AAEpD,QAAI,MAAM,UAAU,MAAM,SAAS;AAClC,YAAM,QAAQ,OAAA;AACd,eAAS,KAAK,MAAM,WAAW;AAAA,IAChC;AAEA,QAAI,MAAM,SAAS,IAAK,UAAS,oBAAoB,WAAW,MAAM,SAAS,GAAG;AAClF,QAAI,MAAM,SAAS,WAAY,UAAS,oBAAoB,cAAc,MAAM,SAAS,UAAU;AACnG,QAAI,MAAM,SAAS,UAAW,UAAS,oBAAoB,aAAa,MAAM,SAAS,SAAS;AAChG,QAAI,MAAM,SAAS,SAAU,UAAS,oBAAoB,YAAY,MAAM,SAAS,QAAQ;AAC7F,QAAI,MAAM,SAAS,UAAW,UAAS,oBAAoB,aAAa,MAAM,SAAS,SAAS;AAChG,QAAI,MAAM,SAAS,UAAW,UAAS,oBAAoB,aAAa,MAAM,SAAS,SAAS;AAChG,QAAI,MAAM,SAAS,QAAS,UAAS,oBAAoB,WAAW,MAAM,SAAS,OAAO;AAC1F,QAAI,MAAM,SAAS,MAAO,UAAS,oBAAoB,SAAS,MAAM,SAAS,KAAK;AAEpF,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AClnBD,SAASA,mBAAiB,SAAmE;AAC5F,MAAI,OAAO,YAAY,YAAY;AAClC,WAAO,EAAE,SAAS,SAAS,UAAU,GAAG,UAAU,KAAK,iBAAiB,KAAA;AAAA,EACzE;AAEA,MAAI,CAAC,SAAS;AACb,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACpE;AAEA,SAAO;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,UAAU;AAAA,KACP;AAEL;AAkBO,MAAM,kBAAkB,gBAAoD;AAAA,EAClF,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,UAAU;AAAA,EAAA;AAAA,EAGX,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,YAAY,CAAC,YAAa;AAGtC,QAAI;AAEJ,QAAI,QAAQ,WAAW;AACtB,UAAI,OAAO,QAAQ,cAAc,UAAU;AAC1C,cAAM,QAAQ,SAAS,cAAc,QAAQ,SAAS;AAEtD,oBAAY,SAAS,gBAAgB,EAAE;AAAA,MACxC,OAAO;AACN,oBAAY,QAAQ;AAAA,MACrB;AAAA,IACD,OAAO;AACN,kBAAY,gBAAgB,EAAE;AAAA,IAC/B;AAEA,UAAM,QAA6B;AAAA,MAClC;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,eAAe;AAAA,MACf,WAAW;AAAA,MACX,eAAe,CAAO,OAAc;AACnC,YAAI,MAAM,aAAa,MAAM,QAAQ,YAAY,MAAM,QAAQ,SAAS;AACvE;AAAA,QACD;AAGA,YAAI,MAAM,eAAe;AACxB;AAAA,QACD;AAEA,cAAM,gBAAgB,WAAW,MAAM;AACtC,gBAAM,gBAAgB;AAAA,QACvB,GAAG,QAAQ,QAAQ;AAGnB,cAAM,aAAa,gBAAgB,WAAW,IAAI,QAAQ,YAAY,CAAC;AAEvE,YAAI,YAAY;AACf,gBAAM,YAAY,OAAO,EAAE;AAAA,QAC5B;AAAA,MACD;AAAA,IAAA;AAIC,OAAW,mBAAmB;AAGhC,QAAI,QAAQ,mBAAmB,gCAAgC;AAC9D,gCAA0B,IAAI,KAAK;AAAA,IACpC,OAAO;AAEN,SAAG,WAAW,UAAU,MAAM,eAAe,EAAE,SAAS,MAAM;AAAA,IAC/D;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAA8B,GAAW;AAE/C,QAAI,CAAC,MAAO;AAEZ,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAAA,EAC/C;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAA8B,GAAW;AAE/C,QAAI,CAAC,MAAO;AAGZ,QAAI,MAAM,eAAe;AACxB,mBAAa,MAAM,aAAa;AAAA,IACjC;AAGA,QAAI,MAAM,UAAU;AACnB,YAAM,SAAS,WAAA;AAAA,IAChB;AAGA,QAAI,MAAM,YAAY,MAAM,SAAS,YAAY;AAChD,YAAM,SAAS,WAAW,YAAY,MAAM,QAAQ;AAAA,IACrD;AAGA,QAAI,MAAM,WAAW,UAAU,MAAM,aAAa;AAElD,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AAKD,SAAS,gBAAgB,WAA6B,KAAkB,UAA2B;AAClG,MAAI,cAAc,QAAQ;AACzB,UAAMwB,aAAY,OAAO,WAAW,SAAS,gBAAgB;AAC7D,UAAMC,gBAAe,SAAS,gBAAgB;AAC9C,UAAMC,gBAAe,OAAO;AAE5B,WAAOF,aAAYE,iBAAgBD,gBAAe;AAAA,EACnD;AAEA,QAAM,KAAK;AACX,QAAM,YAAY,GAAG;AACrB,QAAM,eAAe,GAAG;AACxB,QAAM,eAAe,GAAG;AAExB,SAAO,YAAY,gBAAgB,eAAe;AACnD;AAKA,SAAe,YAAY,OAA4B,IAAgC;AAAA;;AACtF,UAAM,YAAY;AAClB,sBAAM,SAAQ,gBAAd;AAEA,OAAG,UAAU,IAAI,4BAA4B;AAE7C,QAAI;AACH,YAAM,MAAM,QAAQ,QAAA;AAAA,IACrB,SAAS,KAAK;AACb,wBAAM,SAAQ,YAAd,4BAAwB;AAAA,IACzB,UAAA;AACC,YAAM,YAAY;AAClB,wBAAM,SAAQ,cAAd;AACA,SAAG,UAAU,OAAO,4BAA4B;AAAA,IACjD;AAAA,EACD;AAAA;AAKA,SAAS,0BAA0B,IAAiB,OAAkC;AAErF,QAAM,WAAW,SAAS,cAAc,KAAK;AAE7C,WAAS,YAAY;AACrB,WAAS,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAMzB,KAAG,YAAY,QAAQ;AACvB,QAAM,WAAW;AAGjB,QAAM,WAAW,IAAI;AAAA,IACpB,CAAM,YAAW;AAChB,iBAAW,SAAS,SAAS;AAC5B,YAAI,MAAM,gBAAgB;AACzB,cAAI,CAAC,MAAM,aAAa,CAAC,MAAM,QAAQ,YAAY,CAAC,MAAM,QAAQ,SAAS;AAC1E,kBAAM,YAAY,OAAO,EAAE;AAAA,UAC5B;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,IACA;AAAA,MACC,MAAM,MAAM,cAAc,SAAS,OAAQ,MAAM;AAAA,MACjD,YAAY,GAAG,MAAM,QAAQ,YAAY,CAAC;AAAA,MAC1C,WAAW;AAAA,IAAA;AAAA,EACZ;AAGD,QAAM,SAAS,QAAQ,QAAQ;AAChC;ACxQA,MAAMnB,cAAY;AAKlB,SAASN,mBAAiB,SAAyD;AAClF,QAAM,UAA4B,OAAO,YAAY,aAAa,EAAE,SAAS,QAAA,IAAY,mBAAK;AAG9F,MAAI,QAAQ,SAAS,QAAQ,OAAO,QAAQ,SAAS,YAAY,WAAW,QAAQ,MAAM;AACzF,YAAQ,OAAQ,QAAQ,KAAmC;AAAA,EAC5D;AAEA,SAAO;AACR;AAKA,SAAS,uBACR,IACA,OACA,SACiD;AACjD,SAAO,CAAA,YAAW;;AACjB,eAAW,SAAS,SAAS;AAC5B,UAAI,QAAQ,QAAQ,MAAM,iBAAkB;AAE5C,YAAM,EAAE,mBAAmB;AAE3B,oBAAQ,YAAR,iCAAkB,OAAO,MAAM;AAC/B,oBAAQ,aAAR,iCAAmB,gBAAgB;AAEnC,UAAI,gBAAgB;AACnB,sBAAQ,YAAR,iCAAkB,OAAO,MAAM;AAC/B,YAAI,QAAQ,KAAM,OAAM,mBAAmB;AAAA,MAC5C,OAAO;AACN,sBAAQ,YAAR,iCAAkB,OAAO,MAAM;AAAA,MAChC;AAEA,SAAG,cAAc,IAAI,YAAY,aAAa,EAAE,QAAQ,EAAE,gBAAgB,MAAA,EAAM,CAAG,CAAC;AAAA,IACrF;AAAA,EACD;AACD;AAKA,SAAS,eACR,IACA,OACA,SACuB;AACvB,SAAO,IAAI,qBAAqB,uBAAuB,IAAI,OAAO,OAAO,GAAG;AAAA,IAC3E,MAAM,QAAQ;AAAA,IACd,YAAY,QAAQ;AAAA,IACpB,WAAW,QAAQ;AAAA,EAAA,CACnB;AACF;AAYO,MAAM,aAAa,gBAA+C;AAAA,EACxE,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,IACT,UAAU;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,EAAA;AAAA,EAGZ,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,YAAY,CAAC,eAAe,CAAC,gCAAgC;AACxE,UAAI,CAAC,gCAAgC;AACpC,gBAAQ,KAAK,4DAA4D;AAAA,MAC1E;AAEA;AAAA,IACD;AAEA,UAAM,QAAwB;AAAA,MAC7B;AAAA,MACA,UAAU;AAAA,MACV,kBAAkB;AAAA,IAAA;AAGnB,UAAM,WAAW,eAAe,IAAI,OAAO,OAAO;AAChD,OAAWM,WAAS,IAAI;AAC1B,UAAM,SAAS,QAAQ,EAAE;AAAA,EAC1B;AAAA,EAEA,QAAQ,IAAI,SAAS;;AACpB,UAAM,QAAqC,GAAWA,WAAS;AAE/D,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAaN,mBAAiB,QAAQ,KAAK;AACjD,UAAM,yBACH,WAAW,SAAS,MAAM,QAAQ,QAChC,WAAW,eAAe,MAAM,QAAQ,cACxC,WAAW,cAAc,MAAM,QAAQ;AAG5C,QAAI,WAAW,aAAa,MAAM,QAAQ,UAAU;AACnD,UAAI,WAAW,UAAU;AACxB,oBAAM,aAAN,mBAAgB;AAAA,MACjB,OAAO;AACN,oBAAM,aAAN,mBAAgB,QAAQ;AAAA,MACzB;AAAA,IACD;AAGA,QAAI,wBAAwB;AAC3B,kBAAM,aAAN,mBAAgB;AAChB,YAAM,WAAW,eAAe,IAAI,OAAO,UAAU;AACrD,YAAM,SAAS,QAAQ,EAAE;AAAA,IAC1B;AAEA,UAAM,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU,IAAI;;AACb,UAAM,QAAqC,GAAWM,WAAS;AAE/D,QAAI,CAAC,MAAO;AAEZ,gBAAM,aAAN,mBAAgB;AAChB,WAAQ,GAAWA,WAAS;AAAA,EAC7B;AACD,CAAC;ACzGD,IAAI,iBAA8C;AAKlD,SAAS,kBAAkB,SAAuC;AACjE,MAAI,eAAgB,QAAO;AAE3B,mBAAiB,IAAI;AAAA,IACpB,CAAA,YAAW;AACV,cAAQ,QAAQ,CAAA,UAAS;AACxB,YAAI,MAAM,gBAAgB;AACzB,eAAK,MAAM,MAAqB;AAChC,2DAAgB,UAAU,MAAM;AAAA,QACjC;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IACA;AAAA,MACC,YAAY,GAAG,OAAO;AAAA,IAAA;AAAA,EACvB;AAGD,SAAO;AACR;AAKA,SAAS,OAAO,IAAiB,KAAmB;AACnD,MAAI,GAAG,YAAY,OAAO;AACvB,OAAwB,MAAM;AAAA,EACjC,OAAO;AACN,OAAG,MAAM,kBAAkB,QAAQ,GAAG;AAAA,EACvC;AACD;AAKA,SAAS,aAAa,IAAiB,OAAwB;AAC9D,KAAG,QAAQ,YAAY;AACxB;AAKA,SAAS,aAAa,IAA4B;AACjD,SAAQ,GAAG,QAAQ,aAA2B;AAC/C;AAKA,SAAS,KAAK,IAAuB;AACpC,QAAM,QAA2B,GAAW;AAE5C,MAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,IAAK;AAGlC,MAAI,MAAM,QAAQ,UAAU,CAAC,MAAM,QAAQ,OAAO,MAAM,QAAQ,GAAG,GAAG;AACrE;AAAA,EACD;AAEA,eAAa,IAAI,SAAS;AAC1B,QAAM;AAEN,KAAG,UAAU,IAAI,iBAAiB;AAElC,QAAM,MAAM,IAAI,MAAA;AAEhB,MAAI,SAAS,MAAM;;AAClB,WAAO,IAAI,MAAM,QAAQ,GAAI;AAC7B,iBAAa,IAAI,QAAQ;AACzB,OAAG,UAAU,OAAO,iBAAiB;AACrC,OAAG,UAAU,IAAI,gBAAgB;AACjC,sBAAM,SAAQ,WAAd,4BAAuB;AAAA,EACxB;AAEA,MAAI,UAAU,MAAM;;AACnB,OAAG,UAAU,OAAO,iBAAiB;AAGrC,QAAI,MAAM,WAAW,MAAM,QAAQ,WAAW,IAAI;AACjD,iBAAW,MAAM,KAAK,EAAE,GAAG,MAAO,MAAM,OAAO;AAE/C;AAAA,IACD;AAGA,QAAI,MAAM,QAAQ,OAAO;AACxB,aAAO,IAAI,MAAM,QAAQ,KAAK;AAAA,IAC/B;AAEA,iBAAa,IAAI,OAAO;AACxB,OAAG,UAAU,IAAI,eAAe;AAChC,sBAAM,SAAQ,YAAd,4BAAwB,IAAI,IAAI,MAAM,sBAAsB;AAAA,EAC7D;AAEA,MAAI,MAAM,MAAM,QAAQ;AACzB;AAKA,SAAS,QAAQ,IAAuB;AACvC,QAAM,QAA2B,GAAW;AAE5C,MAAI,CAAC,MAAO;AAGZ,MAAI,CAAC,gCAAgC;AAEpC,SAAK,EAAE;AAEP;AAAA,EACD;AAGA,MAAI,MAAM,QAAQ,UAAU;AAC3B,UAAM,WAAW,MAAM,QAAQ;AAC/B,UAAM,SAAS,QAAQ,EAAE;AAAA,EAC1B,OAAO;AACN,UAAM,WAAW,kBAAkB,MAAM,QAAQ,WAAW,CAAC;AAE7D,UAAM,WAAW;AACjB,aAAS,QAAQ,EAAE;AAAA,EACpB;AACD;AAKA,SAAS,UAAU,IAAuB;AACzC,QAAM,QAA2B,GAAW;AAE5C,MAAI,CAAC,MAAO;AAEZ,MAAI,MAAM,UAAU;AACnB,UAAM,SAAS,UAAU,EAAE;AAAA,EAC5B,WAAW,gBAAgB;AAC1B,mBAAe,UAAU,EAAE;AAAA,EAC5B;AACD;AAKA,SAASN,mBAAiB,SAA+C;AACxE,MAAI,OAAO,YAAY,UAAU;AAChC,WAAO,EAAE,KAAK,QAAA;AAAA,EACf;AAEA,SAAO,WAAW,CAAA;AACnB;AAcO,MAAM,QAAQ,gBAA0C;AAAA,EAC9D,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAAA,EAGX,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,SAAU;AAEtB,QAAI,CAAC,QAAQ,KAAK;AACjB,cAAQ,KAAK,uCAAuC;AAEpD;AAAA,IACD;AAGA,iBAAa,IAAI,SAAS;AAG1B,QAAI,QAAQ,aAAa;AACxB,aAAO,IAAI,QAAQ,WAAW;AAAA,IAC/B;AAGA,OAAG,UAAU,IAAI,QAAQ;AAGzB,UAAM,QAA0B;AAAA,MAC/B;AAAA,MACA,SAAS;AAAA,IAAA;AAGR,OAAW,SAAS;AAGtB,YAAQ,EAAE;AAAA,EACX;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAA2B,GAAW;AAE5C,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAaA,mBAAiB,QAAQ,KAAK;AAEjD,QAAI,WAAW,UAAU;AACxB,gBAAU,EAAE;AAEZ;AAAA,IACD;AAEA,QAAI,WAAW,QAAQ,MAAM,QAAQ,KAAK;AACzC,YAAM,UAAU;AAChB,YAAM,UAAU;AAGhB,UAAI,aAAa,EAAE,MAAM,WAAW;AACnC,qBAAa,IAAI,SAAS;AAC1B,WAAG,UAAU,OAAO,kBAAkB,eAAe;AAErD,YAAI,WAAW,aAAa;AAC3B,iBAAO,IAAI,WAAW,WAAW;AAAA,QAClC;AAEA,gBAAQ,EAAE;AAAA,MACX;AAAA,IACD;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,cAAU,EAAE;AACZ,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;ACxPD,SAASA,mBAAiB,SAAqD;AAC9E,MAAI,OAAO,YAAY,WAAW;AACjC,WAAO,EAAE,OAAO,QAAA;AAAA,EACjB;AAEA,SAAO;AAAA,IACN,OAAO;AAAA,IACP,cAAc;AAAA,IACd,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,UAAU;AAAA,KACP;AAEL;AAKA,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AASxB,SAAS,qBAAqB,SAAyC;AACtE,QAAM,UAAU,SAAS,cAAc,KAAK;AAE5C,UAAQ,YAAY,QAAQ,gBAAgB;AAC5C,UAAQ,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAOP,QAAQ,cAAc,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAQjE,QAAM,cAAc,QAAQ,WAAW;AACvC,QAAM,mBAAmB,SAAS,cAAc,KAAK;AAErD,mBAAiB,YAAY,QAAQ,gBAAgB;AACrD,mBAAiB,YAAY;AAC7B,UAAQ,YAAY,gBAAgB;AAGpC,MAAI,QAAQ,MAAM;AACjB,UAAM,SAAS,SAAS,cAAc,KAAK;AAE3C,WAAO,YAAY,QAAQ,aAAa;AACxC,WAAO,cAAc,QAAQ;AAC7B,YAAQ,YAAY,MAAM;AAAA,EAC3B;AAEA,SAAO;AACR;AAcO,MAAM,WAAW,gBAA6C;AAAA,EACpE,MAAM;AAAA,EACN,KAAK;AAAA;AAAA,EACL,UAAU;AAAA,IACT,OAAO;AAAA,IACP,cAAc;AAAA,IACd,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,UAAU;AAAA,EAAA;AAAA,EAGX,QAAQ,IAAI,SAAS;AACpB,QAAI,CAAC,YAAa;AAElB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,SAAU;AAGtB,UAAM,gBAAgB,iBAAiB,EAAE;AAEzC,UAAM,mBAAmB,GAAG,MAAM;AAClC,UAAM,mBAAmB,GAAG,MAAM;AAElC,UAAM,QAAsB;AAAA,MAC3B;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,IAAA;AAIC,OAAW,YAAY;AAEzB,QAAI,cAAc,aAAa,UAAU;AACxC,SAAG,MAAM,WAAW;AAAA,IACrB;AAGA,QAAI,QAAQ,OAAO;AAClB,kBAAY,IAAI,KAAK;AAAA,IACtB;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAuB,GAAW;AAExC,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAaA,mBAAiB,QAAQ,KAAK;AAEjD,QAAI,WAAW,UAAU;AACxB,kBAAY,IAAI,KAAK;AAErB;AAAA,IACD;AAGA,QAAI,WAAW,SAAS,CAAC,MAAM,QAAQ,OAAO;AAC7C,kBAAY,IAAI,KAAK;AAAA,IACtB,WAAW,CAAC,WAAW,SAAS,MAAM,QAAQ,OAAO;AACpD,kBAAY,IAAI,KAAK;AAAA,IACtB;AAGA,QAAI,MAAM,kBAAkB,WAAW,SAAS,MAAM,QAAQ,MAAM;AACnE,YAAM,SAAS,MAAM,eAAe,cAAc,IAAI,MAAM,QAAQ,SAAS,EAAE;AAE/E,UAAI,QAAQ;AACX,eAAO,cAAc,WAAW,QAAQ;AAAA,MACzC;AAAA,IACD;AAEA,UAAM,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAuB,GAAW;AAExC,QAAI,CAAC,MAAO;AAEZ,gBAAY,IAAI,KAAK;AAGrB,OAAG,MAAM,WAAW,MAAM;AAC1B,OAAG,MAAM,WAAW,MAAM;AAE1B,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AAKD,SAAS,YAAY,IAAiB,OAA2B;AAChE,MAAI,MAAM,eAAgB;AAG1B,QAAM,iBAAiB,qBAAqB,MAAM,OAAO;AACzD,KAAG,YAAY,MAAM,cAAc;AAGnC,MAAI,MAAM,QAAQ,MAAM;AACvB,OAAG,MAAM,WAAW;AAAA,EACrB;AAGA,KAAG,UAAU,IAAI,mBAAmB;AACrC;AAKA,SAAS,YAAY,IAAiB,OAA2B;AAChE,MAAI,CAAC,MAAM,eAAgB;AAG3B,QAAM,eAAe,OAAA;AACrB,QAAM,iBAAiB;AAGvB,MAAI,MAAM,QAAQ,MAAM;AACvB,OAAG,MAAM,WAAW,MAAM;AAAA,EAC3B;AAGA,KAAG,UAAU,OAAO,mBAAmB;AACxC;ACjMA,SAASA,mBAAiB,SAAyD;AAClF,MAAI,OAAO,YAAY,YAAY;AAClC,WAAO,EAAE,SAAS,SAAS,UAAU,KAAK,UAAU,GAAA;AAAA,EACrD;AAEA,MAAI,CAAC,SAAS;AACb,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAC/D;AAEA,SAAO;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,cAAc;AAAA,KACX;AAEL;AAKA,SAASuB,cAAY,IAA8B,IAAsC;AACxF,SAAO,KAAK,KAAM,SAAG,IAAI,GAAG,GAAM,KAAK,SAAG,IAAI,GAAG,GAAM,EAAC;AACzD;AAaO,MAAM,aAAa,gBAA+C;AAAA,EACxE,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,cAAc;AAAA,EAAA;AAAA,EAGf,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUvB,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,YAAY,CAAC,YAAa;AAEtC,UAAM,QAAwB;AAAA,MAC7B;AAAA,MACA,SAAS;AAAA,MACT,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,MACrB,cAAc,MAAM;AAAA,MAAC;AAAA,MACrB,YAAY,MAAM;AAAA,MAAC;AAAA,MACnB,aAAa,MAAM;AAAA,MAAC;AAAA,IAAA;AAIrB,UAAM,eAAe,CAAC,MAAa;;AAClC,YAAM,QAAQ;AAGd,UAAI,QAAQ,SAAS;AACpB,cAAM,eAAA;AAAA,MACP;AAEA,UAAI,QAAQ,MAAM;AACjB,cAAM,gBAAA;AAAA,MACP;AAGA,UAAI,MAAM,SAAS;AAClB,qBAAa,MAAM,OAAO;AAC1B,cAAM,UAAU;AAAA,MACjB;AAEA,UAAI,MAAM,aAAa;AACtB,sBAAc,MAAM,WAAW;AAC/B,cAAM,cAAc;AAAA,MACrB;AAGA,YAAM,MAAMI,mBAAiB,KAAK;AAElC,YAAM,WAAW,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,EAAA;AACpC,YAAM,YAAY,KAAK,IAAA;AAGvB,oBAAQ,YAAR,iCAAkB;AAGlB,UAAI,QAAQ,QAAQ;AACnB,YAAI,YAAY,QAAQ;AAExB,cAAM,cAAc,YAAY,MAAM;;AACrC,uBAAa,QAAQ;AACrB,WAAAa,MAAA,QAAQ,WAAR,gBAAAA,IAAA,cAAiB,KAAK,IAAI,GAAG,SAAS;AAAA,QACvC,GAAG,QAAQ,YAAY;AAAA,MACxB;AAGA,YAAM,UAAU,WAAW,MAAM;AAChC,YAAI,MAAM,aAAa;AACtB,wBAAc,MAAM,WAAW;AAC/B,gBAAM,cAAc;AAAA,QACrB;AACA,gBAAQ,QAAQ,KAAK;AAAA,MACtB,GAAG,QAAQ,QAAQ;AAAA,IACpB;AAGA,UAAM,aAAa,CAAC,MAAa;;AAChC,YAAM,QAAQ;AAEd,UAAI,MAAM,SAAS;AAClB,qBAAa,MAAM,OAAO;AAC1B,cAAM,UAAU;AAAA,MACjB;AAEA,UAAI,MAAM,aAAa;AACtB,sBAAc,MAAM,WAAW;AAC/B,cAAM,cAAc;AAAA,MACrB;AAGA,UAAI,MAAM,YAAY,GAAG;AACxB,sBAAQ,aAAR,iCAAmB;AAAA,MACpB;AAEA,YAAM,YAAY;AAAA,IACnB;AAGA,UAAM,cAAc,CAAC,MAAa;;AACjC,UAAI,CAAC,MAAM,QAAS;AAEpB,YAAM,QAAQ;AACd,YAAM,MAAMb,mBAAiB,KAAK;AAClC,YAAM,WAAWmB,cAAY,MAAM,UAAU,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,EAAA,CAAG;AAEnE,UAAI,YAAY,QAAQ,YAAY,KAAK;AACxC,YAAI,MAAM,SAAS;AAClB,uBAAa,MAAM,OAAO;AAC1B,gBAAM,UAAU;AAAA,QACjB;AAEA,YAAI,MAAM,aAAa;AACtB,wBAAc,MAAM,WAAW;AAC/B,gBAAM,cAAc;AAAA,QACrB;AAEA,sBAAQ,aAAR,iCAAmB;AACnB,cAAM,YAAY;AAAA,MACnB;AAAA,IACD;AAGE,OAAW,cAAc;AAG3B,OAAG,IAAI,aAAa,MAAM,YAAY;AACtC,OAAG,IAAI,WAAW,MAAM,UAAU;AAClC,OAAG,IAAI,cAAc,MAAM,UAAU;AACrC,OAAG,IAAI,aAAa,MAAM,WAAW;AAGrC,OAAG,IAAI,cAAc,MAAM,cAAc,EAAE,SAAS,CAAC,QAAQ,SAAS;AACtE,OAAG,IAAI,YAAY,MAAM,UAAU;AACnC,OAAG,IAAI,eAAe,MAAM,UAAU;AACtC,OAAG,IAAI,aAAa,MAAM,aAAa,EAAE,SAAS,MAAM;AAAA,EACzD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAyB,GAAW;AAE1C,QAAI,CAAC,OAAO;AAEX,YAAM,UAAUvB,mBAAiB,QAAQ,KAAK;AAE9C,UAAI,CAAC,QAAQ,UAAU;AAEpB,WAAW,cAAc;AAAA,MAC5B;AAEA;AAAA,IACD;AAEA,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAAA,EAC/C;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAyB,GAAW;AAE1C,QAAI,CAAC,MAAO;AAGZ,QAAI,MAAM,SAAS;AAClB,mBAAa,MAAM,OAAO;AAAA,IAC3B;AAEA,QAAI,MAAM,aAAa;AACtB,oBAAc,MAAM,WAAW;AAAA,IAChC;AAGA,QAAI,IAAI,aAAa,MAAM,YAAY;AACvC,QAAI,IAAI,WAAW,MAAM,UAAU;AACnC,QAAI,IAAI,cAAc,MAAM,UAAU;AACtC,QAAI,IAAI,aAAa,MAAM,WAAW;AAGtC,QAAI,IAAI,cAAc,MAAM,YAAY;AACxC,QAAI,IAAI,YAAY,MAAM,UAAU;AACpC,QAAI,IAAI,eAAe,MAAM,UAAU;AACvC,QAAI,IAAI,aAAa,MAAM,WAAW;AAEtC,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;ACnSD,SAAS2B,gBAAc,MAAc,SAAmC;AACvE,MAAI,CAAC,KAAM,QAAO;AAElB,MAAI,QAAQ,OAAO;AAClB,WAAO,KAAK,OAAO,CAAC,EAAE,gBAAgB,KAAK,MAAM,CAAC;AAAA,EACnD;AAEA,SAAO,KAAK,YAAA;AACb;AAKA,SAAS3B,mBAAiB,SAAyD;;AAClF,MAAI,YAAY,UAAa,YAAY,MAAM;AAC9C,WAAO,EAAE,OAAO,OAAO,SAAS,KAAA;AAAA,EACjC;AAEA,MAAI,YAAY,OAAO;AACtB,WAAO,EAAE,OAAO,OAAO,SAAS,MAAA;AAAA,EACjC;AAEA,SAAO;AAAA,IACN,QAAO,aAAQ,UAAR,YAAiB;AAAA,IACxB,UAAS,aAAQ,YAAR,YAAmB;AAAA,EAAA;AAE9B;AAgBO,MAAM,aAAa,gBAA+C;AAAA,EACxE,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,eAAe,EAAE,GAAG;AACvB,YAAMC,WAAU,wBAAwB,IAAI,SAAS,UAAQ0B,gBAAc,MAAM,OAAO,CAAC;AAEvF,SAAW,qBAAqB1B;AAAA,IACnC,OAAO;AACN,2BAAqB,IAAI,CAAA,SAAQ0B,gBAAc,MAAM,OAAO,CAAC;AAAA,IAC9D;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAU3B,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,eAAe,EAAE,GAAG;AACvB,UAAI,QAAQ,SAAS;AACpB,WAAG,QAAQ2B,gBAAc,GAAG,OAAO,OAAO;AAAA,MAC3C;AAAA,IACD,OAAO;AACN,2BAAqB,IAAI,CAAA,SAAQA,gBAAc,MAAM,OAAO,CAAC;AAAA,IAC9D;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM1B,WAAqC,GAAW;AAEtD,IAAAA,YAAA,gBAAAA;AACA,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;ACrGD,MAAMK,cAAY;AAyClB,MAAM,iBAAyC;AAAA,EAC9C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACJ;AAEA,SAAS,UAAU,MAAc,aAAkC;AAClE,SAAO,CAAC,GAAG,IAAI,EAAE,IAAI,CAAA,SAAQ;AAC5B,UAAM,UAAU,eAAe,IAAI;AAEnC,WAAO,UAAU,EAAE,SAAS,aAAa,WAAW,MAAA,IAAU,EAAE,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE,GAAG,aAAa,MAAM,WAAW,KAAA;AAAA,EACjI,CAAC;AACF;AAEA,SAASN,mBAAiB,SAA+C;AACxE,MAAI,OAAO,YAAY,SAAU,QAAO,EAAE,MAAM,SAAS,aAAa,KAAK,iBAAiB,KAAA;AAC5F,MAAI,EAAC,mCAAS,MAAM,OAAM,IAAI,MAAM,qCAAqC;AAEzE,SAAO,iBAAE,aAAa,KAAK,iBAAiB,MAAM,gBAAgB,OAAO,iBAAiB,OAAO,UAAU,SAAU;AACtH;AAEA,SAAS,QAAQ,IAA+D;AAC/E,SAAO,GAAG,YAAY,WAAW,GAAG,YAAY;AACjD;AAKA,SAAS,YAAY,OAAe,QAAqB,aAAqB,iBAAkC;AAC/G,MAAI,SAAS,IACZ,aAAa;AAEd,aAAW,SAAS,QAAQ;AAC3B,QAAI,cAAc,MAAM,QAAQ;AAC/B,gBAAU,MAAM,YAAY,MAAM,cAAe,kBAAkB,cAAc;AACjF;AAAA,IACD;AAEA,UAAM,YAAY,MAAM,UAAU;AAElC,QAAI,MAAM,WAAW;AACpB,UAAI,cAAc,MAAM,YAAa;AACrC,gBAAU,MAAM;AAAA,IACjB,WAAW,MAAM,QAAQ,KAAK,SAAS,GAAG;AACzC,gBAAU;AACV;AAAA,IACD,WAAW,cAAc,aAAa;AACrC,gBAAU,kBAAkB,cAAc;AAC1C;AAAA,IACD,OAAO;AACN;AAAA,IAED;AAAA,EACD;AAEA,SAAO;AACR;AAKA,SAAS,YAAY,OAAe,QAAqB,aAA6B;AACrF,MAAI,MAAM;AAEV,WAAS,IAAI,GAAG,IAAI,MAAM,UAAU,IAAI,OAAO,QAAQ,KAAK;AAC3D,QAAI,CAAC,OAAO,CAAC,EAAE,aAAa,MAAM,CAAC,MAAM,aAAa;AACrD,aAAO,MAAM,CAAC;AAAA,IACf;AAAA,EACD;AAEA,SAAO;AACR;AAKA,SAAS,WAAW,OAAe,QAAqB,aAA8B;AACrF,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACvC,QAAI,CAAC,OAAO,CAAC,EAAE,cAAc,KAAK,MAAM,UAAU,MAAM,CAAC,MAAM,cAAc;AAC5E,aAAO;AAAA,IACR;AAAA,EACD;AAEA,SAAO;AACR;AAKA,SAAS,aAAa,QAAqB,cAA8B;AACxE,MAAI,MAAM;AAEV,SAAO,MAAM,OAAO,UAAU,OAAO,GAAG,EAAE,WAAW;AACpD;AAAA,EACD;AAEA,SAAO,KAAK,IAAI,KAAK,OAAO,MAAM;AACnC;AAYO,MAAM,QAAQ,gBAA+C;AAAA,EACnE,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU,EAAE,aAAa,KAAK,iBAAiB,MAAM,gBAAgB,OAAO,iBAAiB,OAAO,UAAU,MAAA;AAAA,EAE9G,QAAQ,IAAI,SAAS;;AACpB,QAAI,CAAC,QAAQ,EAAE,GAAG;AACjB,cAAQ,KAAK,yEAAyE;AAEtF;AAAA,IACD;AAEA,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,YAAY,CAAC,YAAa;AAEtC,UAAM,cAAc,QAAQ,eAAe;AAC3C,UAAM,SAAS,UAAU,QAAQ,MAAM,WAAW;AAElD,UAAM,eAAe,CAAC,MAAmB;;AACxC,YAAM,SAAS,EAAE;AACjB,YAAM,WAAW,OAAO;AACxB,YAAM,YAAY,OAAO,kBAAkB;AAE3C,YAAM,YAAY,YAAY,UAAU,QAAQ,cAAaiB,MAAA,QAAQ,oBAAR,OAAAA,MAA2B,IAAI;AAE5F,UAAI,cAAc,UAAU;AAC3B,eAAO,QAAQ;AACf,eAAO,kBAAkB,aAAa,QAAQ,SAAS,GAAG,aAAa,QAAQ,SAAS,CAAC;AACzF,eAAO,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAA,CAAM,CAAC;AAE1D;AAAA,MACD;AAEA,oBAAQ,aAAR,iCAAmB,WAAW,YAAY,WAAW,QAAQ,WAAW;AACxE,UAAI,WAAW,WAAW,QAAQ,WAAW,GAAG;AAC/C,sBAAQ,eAAR,iCAAqB;AAAA,MACtB;AAAA,IACD;AAEA,UAAM,eAAe,MAAY;AAChC,UAAI,CAAC,GAAG,SAAS,QAAQ,iBAAiB;AACzC,WAAG,QAAQ,YAAY,IAAI,QAAQ,aAAa,IAAI;AAAA,MACrD;AAAA,IACD;AAEA,UAAM,cAAc,MAAY;AAC/B,UAAI,CAAC,QAAQ,kBAAkB,CAAC,WAAW,GAAG,OAAO,QAAQ,WAAW,KAAK,QAAQ,iBAAiB;AACrG,WAAG,QAAQ;AAAA,MACZ;AAAA,IACD;AAEA,OAAG,IAAI,SAAS,YAAY;AAC5B,OAAG,IAAI,SAAS,YAAY;AAC5B,OAAG,IAAI,QAAQ,WAAW;AAExB,OAAWX,WAAS,IAAI,EAAE,SAAS,QAAQ,aAAa,cAAc,cAAc,YAAA;AAEtF,QAAI,GAAG,OAAO;AACb,SAAG,QAAQ,YAAY,GAAG,OAAO,QAAQ,cAAa,aAAQ,oBAAR,YAA2B,IAAI;AAAA,IACtF;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAoB,GAAWA,WAAS;AAE9C,QAAI,CAAC,MAAO;AACZ,UAAM,UAAUN,mBAAiB,QAAQ,KAAK;AAC9C,UAAM,SAAS,UAAU,MAAM,QAAQ,MAAM,MAAM,WAAW;AAAA,EAC/D;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAoB,GAAWM,WAAS;AAE9C,QAAI,CAAC,MAAO;AACZ,QAAI,IAAI,SAAS,MAAM,YAAY;AACnC,QAAI,IAAI,SAAS,MAAM,YAAY;AACnC,QAAI,IAAI,QAAQ,MAAM,WAAW;AACjC,WAAQ,GAAWA,WAAS;AAAA,EAC7B;AACD,CAAC;ACjNM,SAASsB,eAAa,OAAe,SAAsC;AACjF,QAAM,EAAE,YAAY,GAAG,YAAY,KAAK,UAAU,KAAK,SAAS,IAAI,SAAS,GAAA,IAAO;AAEpF,QAAM,QAAQ,MAAM,QAAQ,SAAS;AACrC,QAAM,CAAC,SAAS,OAAO,IAAI,MAAM,MAAM,GAAG;AAG1C,QAAM,eAAe,QAAQ,QAAQ,yBAAyB,SAAS;AAEvE,MAAI,SAAS;AAEb,MAAI,YAAY,KAAK,SAAS;AAC7B,cAAU,UAAU;AAAA,EACrB;AAEA,SAAO,SAAS,SAAS;AAC1B;AAKO,SAAS,cAAc,OAAe,SAAgC;AAC5E,QAAM,UAAU,MAAM,QAAQ,YAAY,EAAE,EAAE,QAAQ,SAAS,GAAG;AAClE,QAAM,MAAM,OAAO,WAAW,OAAO;AAErC,SAAO,MAAM,GAAG,IAAI,OAAO;AAC5B;AAKO,SAAS,WAAW,OAAe,SAAsC;;AAC/E,MAAI,SAAS;AAGb,QAAM,iBAAgB,aAAQ,kBAAR,YAAyB;AAE/C,MAAI,CAAC,iBAAiB,SAAS,GAAG;AACjC,aAAS,KAAK,IAAI,MAAM;AAAA,EACzB;AACA,MAAI,QAAQ,QAAQ,OAAW,UAAS,KAAK,IAAI,QAAQ,KAAK,MAAM;AACpE,MAAI,QAAQ,QAAQ,OAAW,UAAS,KAAK,IAAI,QAAQ,KAAK,MAAM;AAEpE,SAAO;AACR;AAMO,SAAS,wBACf,UACA,WACA,WACA,cAAsB,GACb;AAET,MAAI,qBAAqB,GAExB,aAAa;AAEd,WAAS,IAAI,GAAG,IAAI,aAAa,IAAI,SAAS,QAAQ,KAAK;AAC1D,QAAI,KAAK,KAAK,SAAS,CAAC,CAAC,GAAG;AAC3B;AAAA,IACD;AAAA,EACD;AAEA,WAAS,IAAI,aAAa,IAAI,UAAU,QAAQ,KAAK;AACpD,QAAI,KAAK,KAAK,UAAU,CAAC,CAAC,GAAG;AAC5B;AAAA,IACD;AACA,QAAI,cAAc,oBAAoB;AACrC,aAAO,IAAI;AAAA,IACZ;AAAA,EACD;AAGA,SAAO,UAAU;AAClB;AAKO,SAAS,iBACf,IACA,SACA,UACa;AACb,QAAM,EAAE,UAAU,KAAK,SAAS,OAAO;AACvC,MAAI,eAAe;AAEnB,QAAM,UAAU,MAAY;AAC3B,QAAI,aAAc;AAElB,UAAM,WAAW,GAAG;AACpB,UAAM,YAAY,GAAG,kBAAkB;AAGvC,QAAI,CAAC,YAAY,aAAa,KAAK;AAClC;AAAA,IACD;AAGA,UAAM,MAAM,cAAc,UAAU,OAAO;AAE3C,QAAI,QAAQ,MAAM;AACjB,qBAAe;AACf,SAAG,QAAQ;AACX,SAAG,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAA,CAAM,CAAC;AACtD,qBAAe;AAEf;AAAA,IACD;AAGA,UAAM,UAAU,WAAW,KAAK,OAAO;AACvC,UAAM,YAAY,SAAS,SAAS,OAAO;AAE3C,QAAI,cAAc,UAAU;AAC3B,qBAAe;AAGf,YAAM,cAAc,OAAO;AAC3B,YAAM,eAAe,wBAAwB,UAAU,WAAW,WAAW,WAAW;AAExF,SAAG,QAAQ;AACX,SAAG,kBAAkB,cAAc,YAAY;AAC/C,SAAG,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAA,CAAM,CAAC;AAEtD,qBAAe;AAAA,IAChB;AAAA,EACD;AAEA,QAAM,SAAS,MAAY;AAC1B,QAAI,CAAC,GAAG,SAAS,GAAG,UAAU,IAAK;AAEnC,UAAM,MAAM,cAAc,GAAG,OAAO,OAAO;AAE3C,QAAI,QAAQ,MAAM;AACjB,YAAM,UAAU,WAAW,KAAK,OAAO;AACvC,YAAM,YAAY,SAAS,SAAS,OAAO;AAE3C,qBAAe;AACf,SAAG,QAAQ;AACX,SAAG,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAA,CAAM,CAAC;AACtD,qBAAe;AAAA,IAChB;AAAA,EACD;AAEA,KAAG,iBAAiB,SAAS,OAAO;AACpC,KAAG,iBAAiB,QAAQ,MAAM;AAGlC,MAAI,GAAG,OAAO;AACb,UAAM,MAAM,cAAc,GAAG,OAAO,OAAO;AAE3C,QAAI,QAAQ,MAAM;AACjB,YAAM,YAAY,SAAS,WAAW,KAAK,OAAO,GAAG,OAAO;AAE5D,qBAAe;AACf,SAAG,QAAQ;AAEX,SAAG,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAA,CAAM,CAAC;AACtD,qBAAe;AAAA,IAChB;AAAA,EACD;AAEA,SAAO,MAAM;AACZ,OAAG,oBAAoB,SAAS,OAAO;AACvC,OAAG,oBAAoB,QAAQ,MAAM;AAAA,EACtC;AACD;AC7KA,SAASC,cAAY,OAAe,SAA+B;AAClE,QAAM,EAAE,YAAY,GAAG,YAAY,KAAK,UAAU,KAAK,SAAS,KAAK,iBAAiB,SAAA,IAAa;AAEnG,QAAM,QAAQ,MAAM,QAAQ,SAAS;AACrC,QAAM,CAAC,SAAS,OAAO,IAAI,MAAM,MAAM,GAAG;AAG1C,QAAM,eAAe,QAAQ,QAAQ,yBAAyB,SAAS;AAEvE,MAAI,SAAS;AAEb,MAAI,YAAY,KAAK,SAAS;AAC7B,cAAU,UAAU;AAAA,EACrB;AAEA,SAAO,mBAAmB,WAAW,SAAS,SAAS,SAAS;AACjE;AAEO,MAAM,SAAS,gBAA2C;AAAA,EAChE,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;;AACpB,UAAM,UAAwB,OAAO,QAAQ,UAAU,WAAW,EAAE,QAAQ,QAAQ,MAAA,KAAW,aAAQ,UAAR,YAAiB,CAAA;AAGhH,YAAQ,aAAY,aAAQ,cAAR,YAAqB;AAEzC,QAAI,GAAG,YAAY,WAAW,GAAG,YAAY,YAAY;AACxD,YAAM,EAAE,SAAS,KAAK,iBAAiB,aAAa;AAEpD,YAAM,SAAS,mBAAmB,WAAW,SAAS;AACtD,YAAM5B,WAAU,iBAAiB,IAAwB,iCAAK,UAAL,EAAc,OAAA,IAAU4B,aAAW;AAE1F,SAAW,UAAU,EAAE,SAAS,SAAA5B,SAAA;AAGlC,4BAAsB,MAAM;AAC3B,cAAM,UAAU;AAEhB,YAAI,QAAQ,OAAO;AAClB,gBAAM,MAAM,cAAc,QAAQ,OAAO,QAAQ,WAAW,GAAG;AAE/D,cAAI,QAAQ,MAAM;AACjB,kBAAM,YAAY4B,cAAY,WAAW,KAAK,OAAO,GAAG,OAAO;AAE/D,gBAAI,cAAc,QAAQ,OAAO;AAChC,sBAAQ,QAAQ;AAChB,sBAAQ,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAA,CAAM,CAAC;AAAA,YAC5D;AAAA,UACD;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF,OAAO;AAEN,UAAI,QAAuB;AAE3B,UAAI,QAAQ,SAAS,OAAO,QAAQ,UAAU,YAAY,WAAW,QAAQ,OAAO;AACnF,gBAAS,QAAQ,MAAc;AAAA,MAChC,OAAO;AAEN,cAAM,eAAc,QAAG,gBAAH,mBAAgB;AAEpC,YAAI,aAAa;AAChB,kBAAQ,cAAc,aAAa,QAAQ,WAAW,GAAG;AAAA,QAC1D;AAAA,MACD;AAEA,UAAI,UAAU,MAAM;AACnB,WAAG,cAAcA,cAAY,WAAW,OAAO,OAAO,GAAG,OAAO;AAAA,MACjE;AAAA,IACD;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;;AACpB,UAAM,UAAwB,OAAO,QAAQ,UAAU,WAAW,EAAE,QAAQ,QAAQ,MAAA,KAAW,aAAQ,UAAR,YAAiB,CAAA;AAGhH,YAAQ,aAAY,aAAQ,cAAR,YAAqB;AAEzC,UAAM,QAAiC,GAAW;AAElD,QAAI,OAAO;AACV,YAAM,UAAU;AAAA,IACjB,WAAW,EAAE,GAAG,YAAY,WAAW,GAAG,YAAY,aAAa;AAElE,UAAI,QAAuB;AAE3B,UAAI,QAAQ,SAAS,OAAO,QAAQ,UAAU,YAAY,WAAW,QAAQ,OAAO;AACnF,gBAAS,QAAQ,MAAc;AAAA,MAChC;AAEA,UAAI,UAAU,MAAM;AACnB,WAAG,cAAcA,cAAY,WAAW,OAAO,OAAO,GAAG,OAAO;AAAA,MACjE;AAAA,IACD;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAiC,GAAW;AAElD,mCAAO;AACP,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AC9CD,SAAS7B,mBAAiB,SAAuD;AAChF,MAAI,OAAO,YAAY,YAAY;AAClC,WAAO,EAAE,SAAS,SAAS,WAAW,KAAA;AAAA,EACvC;AAEA,MAAI,CAAC,WAAW,CAAC,QAAQ,SAAS;AACjC,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC7D;AAEA,SAAO;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,UAAU;AAAA,KACP;AAEL;AAwBO,MAAM,YAAY,gBAA8C;AAAA,EACtE,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,UAAU;AAAA,EAAA;AAAA,EAGX,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,YAAY,CAAC,YAAa;AAGtC,QAAI,CAAC,4BAA4B;AAChC,cAAQ,KAAK,uDAAuD;AAEpE;AAAA,IACD;AAEA,UAAM,QAAuB;AAAA,MAC5B;AAAA,MACA,UAAU;AAAA,IAAA;AAIX,UAAM,WAAW,IAAI,iBAAiB,CAAC,WAAW,aAAa;AAC9D,cAAQ,QAAQ,WAAW,QAAQ;AAAA,IACpC,CAAC;AAGD,UAAM,SAAS,QAAQ,IAAI;AAAA,MAC1B,YAAY,QAAQ;AAAA,MACpB,iBAAiB,QAAQ;AAAA,MACzB,WAAW,QAAQ;AAAA,MACnB,SAAS,QAAQ;AAAA,MACjB,eAAe,QAAQ;AAAA,MACvB,mBAAmB,QAAQ;AAAA,MAC3B,uBAAuB,QAAQ;AAAA,IAAA,CAC/B;AAGC,OAAW,aAAa;AAAA,EAC3B;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAwB,GAAW;AAEzC,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAaA,mBAAiB,QAAQ,KAAK;AAGjD,QAAI,WAAW,YAAY,CAAC,MAAM,QAAQ,UAAU;AAEnD,UAAI,MAAM,UAAU;AACnB,cAAM,SAAS,WAAA;AAAA,MAChB;AAAA,IACD,WAAW,CAAC,WAAW,YAAY,MAAM,QAAQ,UAAU;AAE1D,UAAI,MAAM,UAAU;AACnB,cAAM,SAAS,QAAQ,IAAI;AAAA,UAC1B,YAAY,WAAW;AAAA,UACvB,iBAAiB,WAAW;AAAA,UAC5B,WAAW,WAAW;AAAA,UACtB,SAAS,WAAW;AAAA,UACpB,eAAe,WAAW;AAAA,UAC1B,mBAAmB,WAAW;AAAA,UAC9B,uBAAuB,WAAW;AAAA,QAAA,CAClC;AAAA,MACF;AAAA,IACD,WAAW,CAAC,WAAW,UAAU;AAEhC,UACC,WAAW,eAAe,MAAM,QAAQ,cACrC,WAAW,cAAc,MAAM,QAAQ,aACvC,WAAW,YAAY,MAAM,QAAQ,WACrC,WAAW,kBAAkB,MAAM,QAAQ,eAC7C;AACD,YAAI,MAAM,UAAU;AACnB,gBAAM,SAAS,WAAA;AACf,gBAAM,SAAS,QAAQ,IAAI;AAAA,YAC1B,YAAY,WAAW;AAAA,YACvB,iBAAiB,WAAW;AAAA,YAC5B,WAAW,WAAW;AAAA,YACtB,SAAS,WAAW;AAAA,YACpB,eAAe,WAAW;AAAA,YAC1B,mBAAmB,WAAW;AAAA,YAC9B,uBAAuB,WAAW;AAAA,UAAA,CAClC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAEA,UAAM,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAwB,GAAW;AAEzC,QAAI,CAAC,MAAO;AAGZ,QAAI,MAAM,UAAU;AACnB,YAAM,SAAS,WAAA;AAAA,IAChB;AAEA,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AC1NM,MAAM,UAAU,gBAA4C;AAAA,EAClE,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;;AACpB,UAAM,UAAyB,OAAO,QAAQ,UAAU,WAAW,EAAE,WAAW,QAAQ,MAAA,KAAW,aAAQ,UAAR,YAAiB,CAAA;AAEpH,QAAI,GAAG,YAAY,WAAW,GAAG,YAAY,YAAY;AACxD,YAAMC,WAAU,iBAAiB,IAAwB,SAAS2B,cAAY;AAE5E,SAAW,WAAW,EAAE,SAAS,SAAA3B,SAAA;AAGnC,4BAAsB,MAAM;AAC3B,cAAM,UAAU;AAEhB,YAAI,QAAQ,OAAO;AAClB,gBAAM,MAAM,cAAc,QAAQ,OAAO,QAAQ,WAAW,GAAG;AAE/D,cAAI,QAAQ,MAAM;AACjB,kBAAM,YAAY2B,eAAa,WAAW,KAAK,OAAO,GAAG,OAAO;AAEhE,gBAAI,cAAc,QAAQ,OAAO;AAChC,sBAAQ,QAAQ;AAChB,sBAAQ,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAA,CAAM,CAAC;AAAA,YAC5D;AAAA,UACD;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF,OAAO;AAEN,UAAI,QAAuB;AAE3B,UAAI,OAAO,QAAQ,UAAU,UAAU;AACtC,gBAAQ,QAAQ;AAAA,MACjB,WAAW,QAAQ,SAAS,OAAO,QAAQ,UAAU,YAAY,WAAW,QAAQ,OAAO;AAC1F,gBAAS,QAAQ,MAAc;AAAA,MAChC,OAAO;AAEN,cAAM,eAAc,QAAG,gBAAH,mBAAgB;AAEpC,YAAI,aAAa;AAChB,kBAAQ,cAAc,aAAa,QAAQ,WAAW,GAAG;AAAA,QAC1D;AAAA,MACD;AAEA,UAAI,UAAU,MAAM;AACnB,WAAG,cAAcA,eAAa,WAAW,OAAO,OAAO,GAAG,OAAO;AAAA,MAClE;AAAA,IACD;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;;AACpB,UAAM,UAAyB,OAAO,QAAQ,UAAU,WAAW,EAAE,WAAW,QAAQ,MAAA,KAAW,aAAQ,UAAR,YAAiB,CAAA;AAEpH,UAAM,QAAkC,GAAW;AAEnD,QAAI,OAAO;AACV,YAAM,UAAU;AAAA,IACjB,WAAW,EAAE,GAAG,YAAY,WAAW,GAAG,YAAY,aAAa;AAElE,UAAI,QAAuB;AAE3B,UAAI,OAAO,QAAQ,UAAU,UAAU;AACtC,gBAAQ,QAAQ;AAAA,MACjB,WAAW,QAAQ,SAAS,OAAO,QAAQ,UAAU,YAAY,WAAW,QAAQ,OAAO;AAC1F,gBAAS,QAAQ,MAAc;AAAA,MAChC;AAEA,UAAI,UAAU,MAAM;AACnB,WAAG,cAAcA,eAAa,WAAW,OAAO,OAAO,GAAG,OAAO;AAAA,MAClE;AAAA,IACD;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAkC,GAAW;AAEnD,mCAAO;AACP,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;ACnDD,MAAMtB,cAAY;AAqClB,SAASN,mBAAiB,SAA2D;AACpF,MAAI,CAAC,SAAS;AACb,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACxE;AAEA,MAAI,OAAO,YAAY,UAAU;AAChC,WAAO,EAAE,OAAO,QAAA;AAAA,EACjB;AAEA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO,EAAE,OAAO,QAAA;AAAA,EACjB;AAEA,SAAO;AACR;AAYA,SAAS,iBAAiB,SAAqC;AAE9D,MAAI,QAAQ,OAAO;AAClB,WAAO,QAAQ,MAAM,QAAQ,OAAO,QAAQ,QAAQ,MAAM;AAAA,EAC3D;AAGmB;AAClB,YAAQ,KAAK,wDAAwD;AAErE,WAAO;AAAA,EACR;AAmCD;AAKA,SAAS,aAAa,IAAiB,QAA0B,OAA2B;;AAC3F,UAAQ,QAAA;AAAA,IACP,KAAK;AACJ,YAAM,aAAa,GAAG;AACtB,YAAM,cAAc,SAAS,cAAc,cAAc;AACzD,eAAG,eAAH,mBAAe,aAAa,MAAM,aAAa;AAC/C,eAAG,eAAH,mBAAe,YAAY;AAC3B;AAAA,IACD,KAAK;AACJ,YAAM,mBAAmB,GAAG,aAAa,UAAU,KAAK;AACxD,SAAG,aAAa,YAAY,MAAM;AAClC,SAAG,UAAU,IAAI,wBAAwB;AACzC;AAAA,IACD,KAAK;AACJ,YAAM,kBAAkB,GAAG,MAAM;AACjC,SAAG,MAAM,UAAU;AACnB,SAAG,UAAU,IAAI,sBAAsB;AACvC;AAAA,EAAA;AAEH;AAKA,SAAS,cAAc,IAAiB,QAA0B,OAA2B;AAC5F,UAAQ,QAAA;AAAA,IACP,KAAK;AACJ,UAAI,MAAM,eAAe,MAAM,YAAY;AAC1C,cAAM,WAAW,aAAa,IAAI,MAAM,WAAW;AACnD,cAAM,WAAW,YAAY,MAAM,WAAW;AAC9C,cAAM,cAAc;AAAA,MACrB;AACA;AAAA,IACD,KAAK;AACJ,UAAI,MAAM,qBAAqB,OAAO;AACrC,WAAG,gBAAgB,UAAU;AAAA,MAC9B,WAAW,MAAM,kBAAkB;AAClC,WAAG,aAAa,YAAY,MAAM,gBAA0B;AAAA,MAC7D;AACA,SAAG,UAAU,OAAO,wBAAwB;AAC5C;AAAA,IACD,KAAK;AACJ,SAAG,MAAM,UAAU,MAAM,mBAAmB;AAC5C,SAAG,UAAU,OAAO,sBAAsB;AAC1C;AAAA,EAAA;AAEH;AAKA,SAAS,SAAS,IAA+B;AAChD,MAAI,CAAE,GAAWM,WAAS,GAAG;AAC1B,OAAWA,WAAS,IAAI;AAAA,MACzB,SAAS,EAAE,OAAO,GAAA;AAAA,MAClB,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,EAEf;AAEA,SAAQ,GAAWA,WAAS;AAC7B;AAKA,SAAS,gBAAgB,IAAiB,SAAoD;;AAC7F,QAAM,QAAQ,SAAS,EAAE;AAEzB,QAAM,UAAUN,mBAAiB,QAAQ,KAAK;AAE9C,QAAM,UAAU,iBAAiB,MAAM,OAAO;AAG9C,oBAAM,SAAQ,aAAd,4BAAyB;AAEzB,QAAM,SAAS,MAAM,QAAQ,UAAU;AAEvC,MAAI,SAAS;AACZ,kBAAc,IAAI,QAAQ,KAAK;AAAA,EAChC,OAAO;AACN,iBAAa,IAAI,QAAQ,KAAK;AAAA,EAC/B;AACD;AAKA,SAAS,QAAQ,IAAuB;AACvC,QAAM,QAAuB,GAAWM,WAAS;AAEjD,OAAI,+BAAO,gBAAe,MAAM,YAAY;AAC3C,UAAM,WAAW,YAAY,MAAM,WAAW;AAAA,EAC/C;AAEA,SAAQ,GAAWA,WAAS;AAC7B;AA8BO,MAAM,cAAc,gBAAgD;AAAA,EAC1E,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,oBAAgB,IAAI,OAAO;AAAA,EAC5B;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,oBAAgB,IAAI,OAAO;AAAA,EAC5B;AAAA,EAEA,UAAU,IAAI;AACb,YAAQ,EAAE;AAAA,EACX;AACD,CAAC;AC5MM,MAAM,SAAS,gBAA2C;AAAA,EAChE,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUN,mBAAiB,QAAQ,KAAK;AAE9C,UAAM,QAAoB;AAAA,MACzB;AAAA,MACA,cAAc;AAAA,IAAA;AAGb,OAAW,UAAU;AAGvB,QAAI,QAAQ,WAAW;AACtB,iBAAW,MAAM,aAAa,IAAI,OAAO,GAAG,GAAG;AAC/C;AAAA,IACD;AAGA,UAAM,eAAe,MAAY;AAChC,mBAAa,IAAI,MAAM,OAAO;AAAA,IAC/B;AAEA,OAAG,iBAAiB,SAAS,YAAY;AACzC,UAAM,eAAe;AAGrB,OAAG,MAAM,SAAS;AAAA,EACnB;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAqB,GAAW;AAEtC,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAaA,mBAAiB,QAAQ,KAAK;AACjD,UAAM,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAiC,GAAW;AAElD,QAAI,CAAC,MAAO;AAEZ,QAAI,MAAM,cAAc;AACvB,SAAG,oBAAoB,SAAS,MAAM,YAAY;AAAA,IACnD;AAEA,OAAG,MAAM,SAAS;AAElB,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AAKD,SAASA,mBAAiB,SAAiD;AAC1E,MAAI,YAAY,MAAM;AACrB,WAAO,EAAE,WAAW,KAAA;AAAA,EACrB;AAEA,MAAI,YAAY,OAAO;AACtB,WAAO,CAAA;AAAA,EACR;AAEA,SAAO,WAAW,CAAA;AACnB;AAKA,SAAe,aAAa,WAAwB,SAAsC;AAAA;AAEzF,QAAI,QAAQ,eAAe;AAC1B,YAAM,SAAS,QAAQ,cAAA;AACvB,UAAI,WAAW,MAAO;AAAA,IACvB;AAGA,UAAM,WAAW,QAAQ,SAAS,SAAS,cAAc,QAAQ,MAAM,IAAI;AAE3E,QAAI,CAAC,UAAU;AACd,cAAQ,KAAK,8CAA8C;AAC3D;AAAA,IACD;AAGA,QAAI,QAAQ,WAAW;AACtB,YAAM8B,mBAAiB,UAAyB,OAAO;AAAA,IACxD,OAAO;AACN,YAAMC,gBAAc,UAAyB,OAAO;AAAA,IACrD;AAGA,QAAI,QAAQ,cAAc;AACzB,cAAQ,aAAA;AAAA,IACT;AAAA,EACD;AAAA;AAKA,SAAeA,gBAAc,IAAiB,SAAsC;AAAA;;AAEnF,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,MAAM,UAAU;AACvB,aAAS,KAAK,YAAY,MAAM;AAEhC,UAAM,YAAY,OAAO,qBAAmB,YAAO,kBAAP,mBAAsB;AAElE,QAAI,CAAC,WAAW;AACf,cAAQ,KAAK,sDAAsD;AACnE,eAAS,KAAK,YAAY,MAAM;AAChC;AAAA,IACD;AAGA,UAAM,UAAUC,oBAAkB,IAAI,OAAO;AAE7C,cAAU,KAAA;AACV,cAAU,MAAM,OAAO;AACvB,cAAU,MAAA;AAGV,UAAMC,gBAAc,SAAS;AAG7B,QAAI;AACH,mBAAO,kBAAP,mBAAsB;AACtB,mBAAO,kBAAP,mBAAsB;AAAA,IACvB,SAAS,KAAK;AACb,cAAQ,MAAM,oCAAoC,GAAG;AAAA,IACtD;AAGA,eAAW,MAAM;AAChB,eAAS,KAAK,YAAY,MAAM;AAAA,IACjC,GAAG,GAAI;AAAA,EACR;AAAA;AAKA,SAAeH,mBAAiB,IAAiB,SAAsC;AAAA;AACtF,UAAM,cAAc,OAAO,KAAK,IAAI,QAAQ;AAE5C,QAAI,CAAC,aAAa;AACjB,cAAQ,KAAK,iDAAiD;AAC9D;AAAA,IACD;AAEA,UAAM,UAAUE,oBAAkB,IAAI,OAAO;AAE7C,gBAAY,SAAS,KAAA;AACrB,gBAAY,SAAS,MAAM,OAAO;AAClC,gBAAY,SAAS,MAAA;AAGrB,UAAMC,gBAAc,YAAY,QAAQ;AAGxC,gBAAY,MAAA;AACZ,gBAAY,MAAA;AAGZ,eAAW,MAAM;AAChB,kBAAY,MAAA;AAAA,IACb,GAAG,GAAI;AAAA,EACR;AAAA;AAKA,SAASD,oBAAkB,IAAiB,SAA+B;AAE1E,MAAI,SAAS;AAGb,WAAS,iBAAiB,+BAA+B,EAAE,QAAQ,CAAA,YAAW;AAC7E,QAAI,QAAQ,YAAY,SAAS;AAChC,gBAAU,UAAU,QAAQ,WAAW;AAAA,IACxC,WAAW,QAAQ,YAAY,QAAQ;AACtC,YAAM,OAAQ,QAA4B;AAC1C,gBAAU,gCAAgC,IAAI;AAAA,IAC/C;AAAA,EACD,CAAC;AAGD,MAAI,QAAQ,SAAS;AACpB,YAAQ,QAAQ,QAAQ,CAAA,QAAO;AAC9B,gBAAU,gCAAgC,GAAG;AAAA,IAC9C,CAAC;AAAA,EACF;AAGA,MAAI,QAAQ,QAAQ;AACnB,UAAM,eAAe,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,OAAO,KAAK,IAAI,IAAI,QAAQ;AACzF,cAAU,UAAU,YAAY;AAAA,EACjC;AAGA,YAAU;AAAA;AAAA;AAAA;AAAA,MAIL,QAAQ,aAAa,IAAI,QAAQ,UAAU,mCAAmC,EAAE;AAAA;AAAA;AAAA;AAMrF,QAAM,QAAQ,QAAQ,SAAS,SAAS,SAAS;AACjD,QAAM,UAAU,GAAG;AAEnB,SAAO;AAAA;AAAA;AAAA;AAAA,UAIE,KAAK;AAAA,GACZ,MAAM;AAAA;AAAA;AAAA,GAGN,OAAO;AAAA;AAAA;AAGV;AAKA,SAASC,gBAAc,KAAgC;AACtD,QAAM,SAAS,IAAI,iBAAiB,KAAK;AACzC,QAAM,WAA4B,CAAA;AAElC,SAAO,QAAQ,CAAA,QAAO;AACrB,QAAI,CAAC,IAAI,UAAU;AAClB,eAAS;AAAA,QACR,IAAI,QAAQ,CAAA,YAAW;AACtB,cAAI,SAAS,MAAM,QAAA;AACnB,cAAI,UAAU,MAAM,QAAA;AAAA,QACrB,CAAC;AAAA,MAAA;AAAA,IAEH;AAAA,EACD,CAAC;AAED,SAAO,QAAQ,IAAI,QAAQ;AAC5B;ACvTA,MAAM,mBAAmB;AACzB,MAAM,uBAAuB;AAC7B,MAAM,2BAA2B;AACjC,MAAM,yBAAyB;AAE/B,MAAM,qBAAuD;AAAA,EAC5D,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AACR;AAEA,SAASjC,mBAAiB,SAAiD;;AAC1E,MAAI,OAAO,YAAY,WAAY,QAAO,EAAE,SAAS,QAAA;AAErD,SAAO;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,cAAa,aAAQ,gBAAR,YAAuB;AAAA,IACpC,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,WAAW,QAAQ;AAAA,IACnB,kBAAiB,aAAQ,oBAAR,YAA2B;AAAA,IAC5C,gBAAe,aAAQ,kBAAR,YAAyB;AAAA,IACxC,eAAe,QAAQ;AAAA,EAAA;AAEzB;AAEA,SAAS,kBAAkC;AAC1C,QAAM,KAAK,SAAS,cAAc,KAAK;AACvC,KAAG,YAAY;AACf,KAAG,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBnB,SAAO;AACR;AAEA,SAAS,gBAAgB,IAAoB,OAAyB,SAAmC;;AACxG,QAAM,mBAAkB,aAAQ,cAAR,mBAAoB;AAC5C,KAAG,cAAc,mBAAmB,mBAAmB,KAAK;AAC7D;AAEA,SAAS,SAAS,UAAoC,UAAkC;;AACvF,MAAI,SAAS,UAAU,SAAU;AAEjC,WAAS,QAAQ;AACjB,kBAAgB,SAAS,aAAa,UAAU,SAAS,OAAO;AAChE,uBAAS,SAAQ,kBAAjB,4BAAiC;AAClC;AAEA,SAAS,eAAe,UAAoC,UAAkB,eAA8B;AAC3G,WAAS,UAAU,MAAM,YAAY,cAAc,QAAQ;AAC3D,WAAS,YAAY,MAAM,UAA0B;AACrD,WAAS,YAAY,MAAM,YAAY,cAAc,QAAQ;AAC9D;AAEA,SAAS,cAAc,UAA0C;AAChE,WAAS,UAAU,MAAM,YAAY;AACrC,WAAS,YAAY,MAAM,UAAU;AACrC,WAAS,UAAU,MAAM;AAC1B;AAEA,SAAe,eAAe,UAAmD;AAAA;AAChF,aAAS,UAAU,SAAS;AAE5B,UAAM,WAAW,SAAS,QAAQ;AAClC,mBAAe,UAAU,QAAc;AAEvC,QAAI;AACH,YAAM,SAAS,QAAQ,QAAA;AACvB,eAAS,UAAU,SAAS;AAC5B,YAAMkC,QAAM,SAAS,QAAQ,eAAgB;AAAA,IAC9C,SAAQ;AACP,eAAS,UAAU,OAAO;AAC1B,YAAMA,QAAM,SAAS,QAAQ,aAAc;AAAA,IAC5C,UAAA;AACC,oBAAc,QAAQ;AAAA,IACvB;AAAA,EACD;AAAA;AAEA,SAASA,QAAM,IAA2B;AACzC,SAAO,IAAI,QAAQ,CAAA,YAAW,WAAW,SAAS,EAAE,CAAC;AACtD;AAEA,SAAS,eAAe,UAA0E;AACjG,QAAM,EAAE,WAAW,QAAA,IAAY;AAE/B,SAAO;AAAA,IACN,YAAY,CAAC,MAAkB;AAC9B,UAAI,QAAQ,YAAY,SAAS,UAAU,UAAW;AACtD,UAAI,UAAU,YAAY,EAAG;AAE7B,eAAS,UAAU;AACnB,eAAS,SAAS,EAAE,QAAQ,CAAC,EAAE;AAC/B,eAAS,WAAW,SAAS;AAC7B,eAAS,UAAU,MAAM;AAAA,IAC1B;AAAA,IAEA,WAAW,CAAC,MAAkB;AAC7B,UAAI,CAAC,SAAS,WAAW,QAAQ,YAAY,SAAS,UAAU,UAAW;AAE3E,eAAS,WAAW,EAAE,QAAQ,CAAC,EAAE;AACjC,YAAM,OAAO,SAAS,WAAW,SAAS;AAG1C,UAAI,QAAQ,GAAG;AACd,YAAI,UAAU,MAAM,WAAW;AAC9B,oBAAU,MAAM,aAAa;AAC7B,wBAAc,QAAQ;AAAA,QACvB;AACA;AAAA,MACD;AAGA,QAAE,eAAA;AAEF,YAAM,WAAW,KAAK,IAAI,OAAO,KAAK,QAAQ,WAAY;AAC1D,YAAM,WAAW,WAAW,QAAQ;AAEpC,gBAAU,MAAM,aAAa;AAC7B,qBAAe,UAAU,QAAc;AACvC,eAAS,UAAU,YAAY,IAAI,UAAU,SAAS;AAAA,IACvD;AAAA,IAEA,UAAU,MAAM;AACf,UAAI,CAAC,SAAS,WAAW,QAAQ,SAAU;AAE3C,eAAS,UAAU;AACnB,YAAM,OAAO,SAAS,WAAW,SAAS;AAC1C,YAAM,WAAW,KAAK,IAAI,OAAO,KAAK,QAAQ,WAAY;AAE1D,gBAAU,MAAM,aAAa;AAE7B,UAAI,SAAS,UAAU,WAAW,YAAY,QAAQ,UAAW;AAChE,uBAAe,QAAQ;AAAA,MACxB,OAAO;AACN,sBAAc,QAAQ;AAAA,MACvB;AAAA,IACD;AAAA,EAAA;AAEF;AAEA,SAAS7B,aAAW,IAAiB,UAAsD;AAC1F,KAAG,iBAAiB,cAAc,SAAS,YAAY,EAAE,SAAS,OAAO;AACzE,KAAG,iBAAiB,aAAa,SAAS,WAAW,EAAE,SAAS,OAAO;AACvE,KAAG,iBAAiB,YAAY,SAAS,UAAU,EAAE,SAAS,MAAM;AACrE;AAEA,SAAS8B,eAAa,IAAiB,UAAsD;AAC5F,KAAG,oBAAoB,cAAc,SAAS,UAAU;AACxD,KAAG,oBAAoB,aAAa,SAAS,SAAS;AACtD,KAAG,oBAAoB,YAAY,SAAS,QAAQ;AACrD;AAEO,MAAM,eAAe,gBAAiD;AAAA,EAC5E,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUnC,mBAAiB,QAAQ,KAAK;AAG9C,OAAG,MAAM,WAAW;AACpB,OAAG,MAAM,WAAW;AACpB,OAAG,UAAU,IAAI,gBAAgB;AAGjC,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,YAAY;AACtB,cAAU,MAAM,UAAU;AAG1B,WAAO,GAAG,YAAY;AACrB,gBAAU,YAAY,GAAG,UAAU;AAAA,IACpC;AACA,OAAG,YAAY,SAAS;AAGxB,UAAM,cAAc,gBAAA;AACpB,OAAG,aAAa,aAAa,SAAS;AAGtC,UAAM,WAAqC;AAAA,MAC1C;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,UAAU;AAAA,IAAA;AAGX,aAAS,WAAW,eAAe,QAAQ;AACzC,OAAW,gBAAgB;AAE7B,QAAI,CAAC,QAAQ,UAAU;AACtBK,mBAAW,IAAI,SAAS,QAAQ;AAAA,IACjC;AAEA,oBAAgB,aAAa,QAAQ,OAAO;AAAA,EAC7C;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,WAAsC,GAAW;AACvD,QAAI,CAAC,SAAU;AAEf,UAAM,cAAc,SAAS,QAAQ;AACrC,aAAS,UAAUL,mBAAiB,QAAQ,KAAK;AAEjD,oBAAgB,SAAS,aAAa,SAAS,OAAO,SAAS,OAAO;AAEtE,QAAI,SAAS,QAAQ,YAAY,CAAC,aAAa;AAC9CmC,qBAAa,IAAI,SAAS,QAAQ;AAAA,IACnC,WAAW,CAAC,SAAS,QAAQ,YAAY,aAAa;AACrD9B,mBAAW,IAAI,SAAS,QAAQ;AAAA,IACjC;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,WAAsC,GAAW;AACvD,QAAI,CAAC,SAAU;AAEf8B,mBAAa,IAAI,SAAS,QAAQ;AAClC,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;ACxMD,SAAS,cAAc,OAAwC;AAC9D,SAAO;AAAA,IACN,OAAO,MAAM,YAAY;AAAA,IACzB,QAAQ,MAAM,YAAY;AAAA,IAC1B,aAAa,MAAM;AAAA,IACnB,eAAe,MAAM;AAAA,IACrB,gBAAgB,MAAM;AAAA,IACtB,2BAA2B,MAAM;AAAA,EAAA;AAEnC;AAKA,SAASnC,mBAAiB,SAAmD;AAC5E,MAAI,OAAO,YAAY,YAAY;AAClC,WAAO,EAAE,SAAS,QAAA;AAAA,EACnB;AAEA,MAAI,CAAC,SAAS;AACb,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC3D;AAEA,SAAO;AAAA,IACN,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,KACP;AAEL;AAKA,SAAS,qBACR,IACA,UACqD;AAErD,QAAM,SAAS,SAAS,cAAc,QAAQ;AAE9C,SAAO,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWvB,KAAG,YAAY,MAAM;AAErB,QAAM,UAAU,OAAO;AAEvB,MAAI,SAAS;AACZ,YAAQ,iBAAiB,UAAU,QAAQ;AAAA,EAC5C;AAEA,SAAO;AAAA,IACN;AAAA,IACA,SAAS,MAAM;AACd,UAAI,SAAS;AACZ,gBAAQ,oBAAoB,UAAU,QAAQ;AAAA,MAC/C;AAEA,aAAO,OAAA;AAAA,IACR;AAAA,EAAA;AAEF;AAaO,MAAM,UAAU,gBAA4C;AAAA,EAClE,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,IACT,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EAAA;AAAA,EAGX,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,YAAY,CAAC,YAAa;AAGtC,UAAM,gBAAgB,iBAAiB,EAAE;AAEzC,QAAI,cAAc,aAAa,UAAU;AACxC,SAAG,MAAM,WAAW;AAAA,IACrB;AAEA,UAAM,QAAqB;AAAA,MAC1B;AAAA,MACA,UAAU;AAAA,MACV,eAAe;AAAA,MACf,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,SAAS,CAAC,UAA+B;AAExC,YAAI,QAAQ,YAAY,QAAQ,WAAW,GAAG;AAC7C,gBAAM,eAAe;AAErB,cAAI,CAAC,MAAM,eAAe;AACzB,kBAAM,gBAAgB,WAAW,MAAM;AACtC,kBAAI,MAAM,cAAc;AACvB,wBAAQ,QAAQ,MAAM,YAAY;AAAA,cACnC;AACA,oBAAM,gBAAgB;AACtB,oBAAM,eAAe;AAAA,YACtB,GAAG,QAAQ,QAAQ;AAAA,UACpB;AAAA,QACD,OAAO;AACN,kBAAQ,QAAQ,KAAK;AAAA,QACtB;AAAA,MACD;AAAA,IAAA;AAIC,OAAW,WAAW;AAGxB,QAAI,0BAA0B;AAC7B,YAAM,WAAW,IAAI,eAAe,CAAA,YAAW;AAC9C,mBAAW,SAAS,SAAS;AAC5B,gBAAM,QAAQ,KAAK;AAAA,QACpB;AAAA,MACD,CAAC;AAED,YAAM,SAAS,QAAQ,IAAI,EAAE,KAAK,QAAQ,KAAK;AAAA,IAChD,OAAO;AAEN,cAAQ,KAAK,mEAAmE;AAEhF,YAAM,EAAE,QAAQ,SAAAC,SAAA,IAAY,qBAAqB,IAAI,MAAM;AAC1D,cAAM,OAAO,GAAG,sBAAA;AAChB,cAAM,QAAQ;AAAA,UACb,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,eAAe,CAAA;AAAA,UACf,gBAAgB,CAAA;AAAA,UAChB,2BAA2B,CAAA;AAAA,QAAC;AAG7B,cAAM,QAAQ,KAA4B;AAE1C,YAAI,QAAQ,YAAY;AACvB,kBAAQ,WAAW,cAAc,KAA4B,CAAC;AAAA,QAC/D;AAAA,MACD,CAAC;AAED,YAAM,iBAAiB;AACrB,SAAW,kBAAkBA;AAAA,IAChC;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAsB,GAAW;AAEvC,QAAI,CAAC,MAAO;AAEZ,UAAM,UAAUD,mBAAiB,QAAQ,KAAK;AAAA,EAC/C;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAsB,GAAW;AAEvC,QAAI,CAAC,MAAO;AAGZ,QAAI,MAAM,eAAe;AACxB,mBAAa,MAAM,aAAa;AAAA,IACjC;AAGA,QAAI,MAAM,UAAU;AACnB,YAAM,SAAS,WAAA;AAAA,IAChB;AAGA,UAAMC,WAAW,GAAW;AAE5B,QAAIA,UAAS;AACZ,MAAAA,SAAA;AAAA,IACD;AAEA,WAAQ,GAAW;AACnB,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;ACrOD,SAASD,mBAAiB,SAAmD;AAC5E,MAAI,YAAY,OAAO;AACtB,WAAO,EAAE,UAAU,MAAM,OAAO,gBAAgB,UAAU,IAAA;AAAA,EAC3D;AAEA,MAAI,OAAO,YAAY,UAAU;AAChC,WAAO,EAAE,OAAO,SAAS,UAAU,IAAA;AAAA,EACpC;AAEA,QAAM,OAAsB;AAAA,IAC3B,OAAO;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,cAAc;AAAA,IACd,YAAY;AAAA,EAAA;AAGb,SAAO,WAAW,OAAO,YAAY,WAAW,kCAAK,OAAS,WAAY;AAC3E;AAKA,SAAS,aACR,OACA,IACA,SACyB;AAEzB,QAAM,OAAO,GAAG,sBAAA;AAGhB,QAAM,IAAI,MAAM,UAAU,KAAK;AAC/B,QAAM,IAAI,MAAM,UAAU,KAAK;AAG/B,QAAM,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,MAAM,IAAI;AAGjD,QAAM,SAAS,SAAS,cAAc,MAAM;AAE5C,SAAO,YAAY;AACnB,SAAO,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA,wBAIA,QAAQ,KAAK;AAAA,aACxB,IAAI;AAAA,cACH,IAAI;AAAA,YACN,IAAI,OAAO,CAAC;AAAA,WACb,IAAI,OAAO,CAAC;AAAA,uBACA,QAAQ,YAAY;AAAA;AAAA;AAAA;AAK1C,SAAO;AACR;AAKA,SAAS,cAAc,QAAqB,SAA8B;AACzE,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,aAAa,QAAQ,cAAc;AAGzC,MAAI,OAAO,OAAO,YAAY,YAAY;AACzC,WAAO;AAAA,MACN;AAAA,QACC,EAAE,WAAW,SAAS,YAAY,KAAK,SAAS,IAAA;AAAA,QAChD,EAAE,WAAW,SAAS,UAAU,KAAK,SAAS,EAAA;AAAA,MAAE;AAAA,MAEjD;AAAA,QACC;AAAA,QACA,QAAQ;AAAA,QACR,MAAM;AAAA,MAAA;AAAA,IACP,EACC,WAAW,MAAM;AAClB,aAAO,OAAA;AAAA,IACR;AAAA,EACD,OAAO;AAEN,WAAO,MAAM,aAAa,aAAa,QAAQ,wBAAwB,QAAQ;AAG/E,WAAO,OAAO,YAAY;AAE1B,WAAO,MAAM,YAAY,SAAS,UAAU;AAC5C,WAAO,MAAM,UAAU;AAEvB,eAAW,MAAM;AAChB,aAAO,OAAA;AAAA,IACR,GAAG,QAAQ;AAAA,EACZ;AACD;AAcO,MAAM,UAAU,gBAA4C;AAAA,EAClE,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,cAAc;AAAA,IACd,YAAY;AAAA,EAAA;AAAA,EAGb,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,YAAY,CAAC,YAAa;AAGtC,UAAM,gBAAgB,iBAAiB,EAAE;AAEzC,QAAI,cAAc,aAAa,UAAU;AACxC,SAAG,MAAM,WAAW;AAAA,IACrB;AAGA,QAAI,cAAc,aAAa,WAAW;AACzC,SAAG,MAAM,WAAW;AAAA,IACrB;AAGA,OAAG,UAAU,IAAI,UAAU;AAE3B,UAAM,QAAqB;AAAA,MAC1B;AAAA,MACA,cAAc,CAAC,MAAa;AAE3B,YAAI,MAAM,QAAQ,SAAU;AAE5B,cAAM,aAAa;AAGnB,cAAM,SAAS,aAAa,YAAY,IAAI,MAAM,OAAO;AAEzD,YAAI,QAAQ;AACX,aAAG,YAAY,MAAM;AACrB,wBAAc,QAAQ,MAAM,OAAO;AAAA,QACpC;AAAA,MACD;AAAA,IAAA;AAIC,OAAW,WAAW;AAGxB,OAAG,IAAI,SAAS,MAAM,YAAY;AAAA,EACnC;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAsB,GAAW;AAEvC,QAAI,CAAC,MAAO;AAEZ,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAAA,EAC/C;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAsB,GAAW;AAEvC,QAAI,CAAC,MAAO;AAGZ,QAAI,IAAI,SAAS,MAAM,YAAY;AAGnC,OAAG,UAAU,OAAO,UAAU;AAE9B,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;ACxKD,MAAM,uBAAuB,CAAC,KAAK,KAAK,KAAK,UAAU,MAAM,MAAM,KAAK,QAAQ,KAAK;AAKrF,MAAM,6BAA6B,CAAC,SAAS,OAAO,QAAQ,KAAK;AAKjE,MAAM,iBAAiB,CAAC,UAAU,UAAU,UAAU,SAAS,QAAQ,SAAS,SAAS,QAAQ,QAAQ,MAAM;AAK/G,MAAM,uBAAuB,CAAC,WAAW,WAAW,UAAU,eAAe,WAAW,UAAU,YAAY,UAAU;AAKxH,SAASA,mBAAiB,SAAuD;AAChF,MAAI,YAAY,OAAO;AACtB,WAAO,EAAE,UAAU,KAAA;AAAA,EACpB;AAEA,MAAI,YAAY,MAAM;AACrB,WAAO;AAAA,MACN,aAAa;AAAA,MACb,mBAAmB;AAAA,IAAA;AAAA,EAErB;AAEA,SAAO;AAAA,IACN,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,UAAU;AAAA,IACV,kBAAkB;AAAA,KACf;AAEL;AAKA,SAAS,aAAa,MAAc,SAAkC;;AAErE,MAAI,QAAQ,SAAS;AACpB,WAAO,QAAQ,QAAQ,IAAI;AAAA,EAC5B;AAGA,QAAM,OAAO,SAAS,cAAc,KAAK;AAEzC,OAAK,YAAY;AAGjB,aAAW,OAAO,gBAAgB;AACjC,UAAM,WAAW,KAAK,qBAAqB,GAAG;AAE9C,WAAO,SAAS,SAAS,GAAG;AAC3B,qBAAS,CAAC,EAAE,eAAZ,mBAAwB,YAAY,SAAS,CAAC;AAAA,IAC/C;AAAA,EACD;AAGA,QAAM,iBAAiB,CAAC,OAAsB;;AAE7C,UAAM,UAAU,GAAG,QAAQ,YAAA;AAE3B,QAAI,QAAQ,eAAe,CAAC,QAAQ,YAAY,SAAS,OAAO,GAAG;AAElE,YAAM,OAAO,SAAS,eAAe,GAAG,eAAe,EAAE;AAEzD,OAAAiB,MAAA,GAAG,eAAH,gBAAAA,IAAe,aAAa,MAAM;AAElC;AAAA,IACD;AAGA,eAAW,QAAQ,sBAAsB;AACxC,SAAG,gBAAgB,IAAI;AAAA,IACxB;AAGA,UAAM,OAAO,GAAG,aAAa,MAAM;AAEnC,QAAI,QAAQ,KAAK,YAAA,EAAc,WAAW,aAAa,GAAG;AACzD,SAAG,gBAAgB,MAAM;AAAA,IAC1B;AAGA,QAAI,CAAC,QAAQ,eAAe;AAC3B,YAAM,MAAM,GAAG,aAAa,KAAK;AAEjC,UAAI,OAAO,IAAI,YAAA,EAAc,WAAW,OAAO,GAAG;AACjD,WAAG,gBAAgB,KAAK;AAAA,MACzB;AAAA,IACD;AAGA,QAAI,QAAQ,mBAAmB;AAC9B,YAAM,QAAQ,MAAM,KAAK,GAAG,UAAU;AAEtC,iBAAW,QAAQ,OAAO;AACzB,cAAM,YAAY,QAAQ,kBAAkB,SAAS,KAAK,KAAK,aAAa;AAC5E,cAAM,UAAU,KAAK,SAAS,WAAW,QAAQ;AACjD,cAAM,OAAO,KAAK,SAAS,QAAQ,QAAQ;AAC3C,cAAM,UAAU,KAAK,SAAS,WAAW,QAAQ;AAEjD,YAAI,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS;AAChD,aAAG,gBAAgB,KAAK,IAAI;AAAA,QAC7B;AAAA,MACD;AAAA,IACD;AAGA,eAAW,SAAS,MAAM,KAAK,GAAG,QAAQ,GAAG;AAC5C,qBAAe,KAAK;AAAA,IACrB;AAAA,EACD;AAGA,aAAW,SAAS,MAAM,KAAK,KAAK,QAAQ,GAAG;AAC9C,mBAAe,KAAK;AAAA,EACrB;AAEA,SAAO,KAAK;AACb;AAcO,MAAM,YAAY,gBAA8C;AAAA,EACtE,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,IACT,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,UAAU;AAAA,IACV,kBAAkB;AAAA,EAAA;AAAA,EAGnB,QAAQ,IAAI,SAAS;AACpB,QAAI,CAAC,YAAa;AAElB,UAAM,UAAUjB,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,SAAU;AAGpB,OAAW,aAAa,EAAE,QAAA;AAG5B,UAAM,UAAU,GAAG;AAEnB,QAAI,SAAS;AACZ,SAAG,YAAY,aAAa,SAAS,OAAO;AAAA,IAC7C;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAS,GAAW;AAE1B,QAAI,CAAC,MAAO;AAEZ,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,MAAM,QAAQ,YAAY,CAAC,MAAM,QAAQ,iBAAkB;AAG/D,UAAM,UAAU,GAAG;AAEnB,QAAI,SAAS;AACZ,SAAG,YAAY,aAAa,SAAS,MAAM,OAAO;AAAA,IACnD;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;ACvLD,SAAS,cAAc,WAA6B,gBAAwB,eAAmC;AAC9G,MAAI,aAAa,GAChB,YAAY,GACZ,gBAAgB,GAChB,eAAe;AAEhB,MAAI,cAAc,QAAQ;AACzB,iBAAa,OAAO,WAAW,SAAS,gBAAgB;AACxD,gBAAY,OAAO,WAAW,SAAS,gBAAgB;AACvD,oBAAgB,SAAS,gBAAgB,cAAc,OAAO;AAC9D,mBAAe,SAAS,gBAAgB,eAAe,OAAO;AAAA,EAC/D,OAAO;AACN,UAAM,KAAK;AAEX,iBAAa,GAAG;AAChB,gBAAY,GAAG;AACf,oBAAgB,GAAG,cAAc,GAAG;AACpC,mBAAe,GAAG,eAAe,GAAG;AAAA,EACrC;AAEA,QAAM,YAAY,gBAAgB,IAAI,aAAa,gBAAgB;AACnE,QAAM,YAAY,eAAe,IAAI,YAAY,eAAe;AAGhE,QAAM,aAAyB,eAAe,iBAAkB,aAAa,iBAAiB,IAAI,KAAM;AACxG,QAAM,aAAyB,cAAc,gBAAiB,YAAY,gBAAgB,IAAI,KAAM;AAEpG,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;AAKA,SAASA,mBAAiB,SAAmD;AAC5E,MAAI,OAAO,YAAY,YAAY;AAClC,WAAO,EAAE,SAAS,SAAS,SAAS,KAAA;AAAA,EACrC;AAEA,MAAI,CAAC,SAAS;AACb,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC3D;AAEA,SAAO;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,KACP;AAEL;AAaO,MAAM,UAAU,gBAA4C;AAAA,EAClE,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EAAA;AAAA,EAGX,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,YAAY,CAAC,YAAa;AAGtC,QAAI;AAEJ,QAAI,QAAQ,WAAW;AACtB,UAAI,QAAQ,cAAc,QAAQ;AACjC,oBAAY;AAAA,MACb,WAAW,OAAO,QAAQ,cAAc,UAAU;AACjD,cAAM,QAAQ,SAAS,cAAc,QAAQ,SAAS;AAEtD,oBAAY,SAAS,gBAAgB,EAAE;AAAA,MACxC,OAAO;AACN,oBAAY,QAAQ;AAAA,MACrB;AAAA,IACD,OAAO;AAEN,YAAM,EAAE,UAAU,WAAW,UAAA,IAAc,iBAAiB,EAAE;AAC9D,YAAM,mBAAmB,gBAAgB,KAAK,WAAW,YAAY,SAAS;AAE9E,kBAAY,mBAAmB,KAAK,gBAAgB,EAAE;AAAA,IACvD;AAEA,UAAM,QAAqB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,eAAe;AAAA,MACf,cAAc;AAAA,MACd,eAAe,CAAC,MAAa;AAE5B,YAAI,QAAQ,YAAY,QAAQ,WAAW,GAAG;AAC7C,gBAAM,eAAe;AAErB,cAAI,CAAC,MAAM,eAAe;AACzB,kBAAM,gBAAgB,WAAW,MAAM;AACtC,kBAAI,MAAM,cAAc;AACvB,sBAAM,OAAO,cAAc,WAAW,MAAM,gBAAgB,MAAM,aAAa;AAE/E,sBAAM,iBAAiB,KAAK;AAC5B,sBAAM,gBAAgB,KAAK;AAC3B,wBAAQ,QAAQ,MAAM,cAAc,IAAI;AAAA,cACzC;AACA,oBAAM,gBAAgB;AACtB,oBAAM,eAAe;AAAA,YACtB,GAAG,QAAQ,QAAQ;AAAA,UACpB;AAAA,QACD,OAAO;AACN,gBAAM,OAAO,cAAc,WAAW,MAAM,gBAAgB,MAAM,aAAa;AAE/E,gBAAM,iBAAiB,KAAK;AAC5B,gBAAM,gBAAgB,KAAK;AAC3B,kBAAQ,QAAQ,GAAG,IAAI;AAAA,QACxB;AAAA,MACD;AAAA,IAAA;AAID,UAAM,cAAc,cAAc,WAAW,GAAG,CAAC;AAEjD,UAAM,iBAAiB,YAAY;AACnC,UAAM,gBAAgB,YAAY;AAGhC,OAAW,WAAW;AAGxB,OAAG,WAAW,UAAU,MAAM,eAAe,EAAE,SAAS,QAAQ,SAAS;AAAA,EAC1E;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAsB,GAAW;AAEvC,QAAI,CAAC,MAAO;AAEZ,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAAA,EAC/C;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAsB,GAAW;AAEvC,QAAI,CAAC,MAAO;AAGZ,QAAI,MAAM,eAAe;AACxB,mBAAa,MAAM,aAAa;AAAA,IACjC;AAGA,QAAI,MAAM,WAAW,UAAU,MAAM,aAAa;AAElD,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;ACrQD,MAAM,YAAY;AAqClB,SAASA,mBAAiB,SAAmD;AAC5E,MAAI,YAAY,MAAO,QAAO,EAAE,UAAU,MAAM,KAAK,GAAG,QAAQ,IAAA;AAChE,MAAI,OAAO,YAAY,SAAU,QAAO,EAAE,KAAK,SAAS,QAAQ,IAAA;AAEhE,SAAO;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,UAAU;AAAA,KACN,WAAW,OAAO,YAAY,WAAW,UAAU,CAAA;AAEzD;AAKA,SAAS,YAAY,OAA4C;AAChE,MAAI,UAAU,OAAW,QAAO;AAEhC,SAAO,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AACnD;AAKA,SAAS,mBAAmB,IAAiB,iBAA6D;AACzG,MAAI,iBAAiB;AACpB,QAAI,OAAO,oBAAoB,UAAU;AACxC,aAAO,SAAS,cAAc,eAAe,KAAK,gBAAgB,EAAE;AAAA,IACrE;AAEA,WAAO;AAAA,EACR;AAGA,QAAM,SAAS,GAAG;AAElB,MAAI,QAAQ;AACX,UAAM,EAAE,UAAU,WAAW,UAAA,IAAc,iBAAiB,MAAM;AAElE,QAAI,gBAAgB,KAAK,WAAW,YAAY,SAAS,GAAG;AAC3D,aAAO;AAAA,IACR;AAAA,EACD;AAEA,SAAO,gBAAgB,EAAE;AAC1B;AAKA,SAAS,YAAY,IAAiB,OAA0B;AAC/D,MAAI,MAAM,QAAQ,UAAU;AAC3B,gBAAY,IAAI,KAAK;AAErB;AAAA,EACD;AAEA,QAAM,YAAY,WAAW,YAAY,MAAM,QAAQ,GAAG,CAAC;AAC3D,QAAM,gBAAgB,MAAM,cAAc,SAAS,EAAE,KAAK,MAAO,MAAM,UAAsB,sBAAA;AAG7F,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,OAAO,YAAY,sBAAA;AACzB,QAAM,gCAAgC,KAAK,MAAM,cAAc;AAE/D,QAAM,eAAe,iCAAiC;AAEtD,MAAI,gBAAgB,CAAC,MAAM,UAAU;AACpC,cAAU,IAAI,OAAO,WAAW,cAAc,GAAG;AAAA,EAClD,WAAW,CAAC,gBAAgB,MAAM,UAAU;AAC3C,gBAAY,IAAI,KAAK;AAAA,EACtB;AACD;AAKA,SAAS,UAAU,IAAiB,OAAoB,WAAmB,cAA4B;;AACtG,QAAM,WAAW;AAGjB,QAAM,cAAc,SAAS,cAAc,KAAK;AAEhD,cAAY,MAAM,UAAU,SAAS,GAAG,WAAW,aAAa,GAAG,YAAY;AAC/E,WAAG,eAAH,mBAAe,aAAa,aAAa;AACzC,QAAM,cAAc;AAGpB,QAAM,WAAW,MAAM,cAAc,SAAS,YAAY,eAAe;AAGzE,KAAG,MAAM,WAAW;AACpB,KAAG,MAAM,MAAM,GAAG,QAAQ;AAC1B,KAAG,MAAM,SAAS,OAAO,MAAM,QAAQ,UAAU,GAAG;AACpD,KAAG,MAAM,QAAQ,GAAG,GAAG,WAAW;AAElC,MAAI,MAAM,QAAQ,WAAW,QAAW;AACvC,OAAG,MAAM,SAAS,YAAY,MAAM,QAAQ,MAAM;AAAA,EACnD;AAEA,QAAM,QAAQ,eAAe,GAAG,UAAU,IAAI,MAAM,QAAQ,WAAW;AACvE,KAAG,cAAc,IAAI,YAAY,iBAAiB,EAAE,QAAQ,EAAE,UAAU,KAAA,EAAK,CAAG,CAAC;AACjF,oBAAM,SAAQ,aAAd,4BAAyB;AAC1B;AAKA,SAAS,YAAY,IAAiB,OAA0B;;AAC/D,MAAI,CAAC,MAAM,SAAU;AAErB,QAAM,WAAW;AAGjB,oBAAM,gBAAN,mBAAmB,eAAnB,mBAA+B,YAAY,MAAM;AACjD,QAAM,cAAc;AAGpB,SAAO,OAAO,GAAG,OAAO,MAAM,cAAc;AAE5C,QAAM,QAAQ,eAAe,GAAG,UAAU,OAAO,MAAM,QAAQ,WAAW;AAC1E,KAAG,cAAc,IAAI,YAAY,iBAAiB,EAAE,QAAQ,EAAE,UAAU,MAAA,EAAM,CAAG,CAAC;AAClF,oBAAM,SAAQ,aAAd,4BAAyB;AAC1B;AAYO,MAAM,UAAU,gBAA4C;AAAA,EAClE,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU,EAAE,KAAK,GAAG,QAAQ,KAAK,aAAa,mBAAmB,UAAU,MAAA;AAAA,EAE3E,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,YAAY,CAAC,YAAa;AAEtC,UAAM,YAAY,mBAAmB,IAAI,QAAQ,SAAS;AAE1D,UAAM,QAAqB;AAAA,MAC1B;AAAA,MACA,aAAa;AAAA,MACb,gBAAgB;AAAA,QACf,UAAU,GAAG,MAAM;AAAA,QACnB,KAAK,GAAG,MAAM;AAAA,QACd,QAAQ,GAAG,MAAM;AAAA,QACjB,QAAQ,GAAG,MAAM;AAAA,QACjB,OAAO,GAAG,MAAM;AAAA,MAAA;AAAA,MAEjB,UAAU;AAAA,MACV;AAAA,MACA,eAAe,MAAM,YAAY,IAAI,KAAK;AAAA,MAC1C,eAAe,MAAM,YAAY,IAAI,KAAK;AAAA,IAAA;AAG3C,OAAG,UAAU,IAAI,UAAU;AACzB,OAAW,SAAS,IAAI;AAE1B,OAAG,WAAW,UAAU,MAAM,eAAe,EAAE,SAAS,MAAM;AAC9D,OAAG,QAAQ,UAAU,MAAM,eAAe,EAAE,SAAS,MAAM;AAC3D,gBAAY,IAAI,KAAK;AAAA,EACtB;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAsB,GAAW,SAAS;AAEhD,QAAI,CAAC,MAAO;AACZ,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAC9C,gBAAY,IAAI,KAAK;AAAA,EACtB;AAAA,EAEA,UAAU,IAAI;;AACb,UAAM,QAAsB,GAAW,SAAS;AAEhD,QAAI,CAAC,MAAO;AAEZ,sBAAM,gBAAN,mBAAmB,eAAnB,mBAA+B,YAAY,MAAM;AAEjD,WAAO,OAAO,GAAG,OAAO,MAAM,cAAc;AAC5C,OAAG,UAAU,OAAO,YAAY,MAAM,QAAQ,eAAe,iBAAiB;AAE9E,QAAI,MAAM,WAAW,UAAU,MAAM,aAAa;AAClD,QAAI,QAAQ,UAAU,MAAM,aAAa;AAEzC,WAAQ,GAAW,SAAS;AAAA,EAC7B;AACD,CAAC;ACtMD,MAAM,oBAAoB;AAC1B,MAAM,mBAAmB;AACzB,MAAMoC,uBAAuC,CAAC,QAAQ,SAAS,MAAM,MAAM;AAE3E,SAASC,oBACR,QACA,QACA,mBACwB;AACxB,QAAM,OAAO,KAAK,IAAI,MAAM;AAC5B,QAAM,OAAO,KAAK,IAAI,MAAM;AAE5B,MAAI,OAAO,MAAM;AAChB,UAAM,YAAY,SAAS,IAAI,UAAU;AACzC,WAAO,kBAAkB,SAAS,SAAS,IAAI,YAAY;AAAA,EAC5D,OAAO;AACN,UAAM,YAAY,SAAS,IAAI,SAAS;AACxC,WAAO,kBAAkB,SAAS,SAAS,IAAI,YAAY;AAAA,EAC5D;AACD;AAEA,SAASrC,mBAAiB,SAAqC;;AAC9D,MAAI,OAAO,YAAY,WAAY,QAAO,EAAE,SAAS,QAAA;AAErD,SAAO;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,YAAW,aAAQ,cAAR,YAAqB;AAAA,IAChC,UAAS,aAAQ,YAAR,YAAmB;AAAA,IAC5B,aAAY,aAAQ,eAAR,YAAsB,CAAC,GAAGoC,oBAAkB;AAAA,IACxD,uBAAsB,aAAQ,yBAAR,YAAgC;AAAA,IACtD,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,QAAO,aAAQ,UAAR,YAAiB;AAAA,IACxB,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,EAAA;AAElB;AAEA,SAAS,aACR,OACA,QACA,QACA,WACA,OACA,IACO;;AACP,QAAM,EAAE,YAAY;AAGpB,MAAI,cAAa,aAAQ,YAAR,YAAmB,kBAAmB;AAGvD,QAAM,WAAW,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI,MAAM,CAAC;AAC5D,MAAI,aAAY,aAAQ,cAAR,YAAqB,mBAAoB;AAGzD,QAAM,YAAYC,oBAAkB,QAAQ,SAAQ,aAAQ,eAAR,YAAsBD,oBAAkB;AAC5F,MAAI,CAAC,UAAW;AAGhB,MAAI,QAAQ,wBAAwB,MAAM,YAAY;AACrD,UAAM,eAAA;AAAA,EACP;AAGA,gBAAQ,YAAR,iCAAkB,WAAW;AAG7B,QAAM,YAA8D;AAAA,IACnE,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ;AAAA,IACf,IAAI,QAAQ;AAAA,IACZ,MAAM,QAAQ;AAAA,EAAA;AAEf,kBAAU,eAAV;AAGA,KAAG,cAAc,IAAI,YAAY,SAAS,EAAE,QAAQ,EAAE,WAAW,QAAQ,QAAQ,UAAA,EAAU,CAAG,CAAC;AAChG;AAEA,SAAS,mBACR,IACA,OAC2D;AAC3D,SAAO,CAAC,SAAS,SAAS,UAAU;AACnC,UAAM,SAAS,UAAU,MAAM;AAC/B,UAAM,SAAS,UAAU,MAAM;AAC/B,UAAM,YAAY,KAAK,IAAA,IAAQ,MAAM;AACrC,iBAAa,OAAO,QAAQ,QAAQ,WAAW,OAAO,EAAE;AAAA,EACzD;AACD;AAEA,SAAS,WAAW,IAAiB,SAA0C;AAC9E,MAAI,QAAQ,SAAU,QAAO;AAE7B,KAAG,MAAM,cAAc;AACvB,KAAG,MAAM,aAAa;AAEtB,QAAM,QAAoB;AAAA,IACzB;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,EAAA;AAGX,QAAM,cAAc,mBAAmB,IAAI,KAAK;AAEhD,QAAM,WAAW;AAAA,IAChB,YAAY,CAAC,MAAkB;AAC9B,UAAI,MAAM,QAAQ,SAAU;AAC5B,YAAM,SAAS,EAAE,QAAQ,CAAC,EAAE;AAC5B,YAAM,SAAS,EAAE,QAAQ,CAAC,EAAE;AAC5B,YAAM,YAAY,KAAK,IAAA;AACvB,YAAM,WAAW;AAAA,IAClB;AAAA,IAEA,WAAW,CAAC,MAAkB;AAC7B,UAAI,CAAC,MAAM,YAAY,MAAM,QAAQ,SAAU;AAC/C,UAAI,MAAM,QAAQ,sBAAsB;AACvC,UAAE,eAAA;AAAA,MACH;AAAA,IACD;AAAA,IAEA,UAAU,CAAC,MAAkB;AAC5B,UAAI,CAAC,MAAM,YAAY,MAAM,QAAQ,SAAU;AAC/C,YAAM,WAAW;AACjB,YAAM,QAAQ,EAAE,eAAe,CAAC;AAChC,kBAAY,MAAM,SAAS,MAAM,SAAS,CAAC;AAAA,IAC5C;AAAA,IAEA,WAAW,CAAC,MAAkB;AAC7B,UAAI,MAAM,QAAQ,SAAU;AAC5B,YAAM,SAAS,EAAE;AACjB,YAAM,SAAS,EAAE;AACjB,YAAM,YAAY,KAAK,IAAA;AACvB,YAAM,WAAW;AAAA,IAClB;AAAA,IAEA,SAAS,CAAC,MAAkB;AAC3B,UAAI,CAAC,MAAM,YAAY,MAAM,QAAQ,SAAU;AAC/C,YAAM,WAAW;AACjB,kBAAY,EAAE,SAAS,EAAE,SAAS,CAAC;AAAA,IACpC;AAAA,EAAA;AAGD,SAAO;AACR;AAEA,SAAS,WAAW,IAAiB,OAAyB;;AAC7D,QAAM,EAAE,aAAa;AACrB,QAAM,eAAc,WAAM,QAAQ,UAAd,YAAuB;AAE3C,KAAG,iBAAiB,cAAc,SAAS,YAAY,EAAE,SAAS,MAAM;AACxE,KAAG,iBAAiB,aAAa,SAAS,WAAW,EAAE,SAAS,OAAO;AACvE,KAAG,iBAAiB,YAAY,SAAS,QAAQ;AACjD,KAAG,iBAAiB,eAAe,SAAS,QAAQ;AAEpD,MAAI,aAAa;AAChB,OAAG,iBAAiB,aAAa,SAAS,SAAS;AACnD,OAAG,iBAAiB,WAAW,SAAS,OAAO;AAC/C,OAAG,iBAAiB,cAAc,SAAS,OAAO;AAAA,EACnD;AACD;AAEA,SAAS,aAAa,IAAiB,OAAyB;;AAC/D,QAAM,EAAE,aAAa;AACrB,QAAM,eAAc,WAAM,QAAQ,UAAd,YAAuB;AAE3C,KAAG,oBAAoB,cAAc,SAAS,UAAU;AACxD,KAAG,oBAAoB,aAAa,SAAS,SAAS;AACtD,KAAG,oBAAoB,YAAY,SAAS,QAAQ;AACpD,KAAG,oBAAoB,eAAe,SAAS,QAAQ;AAEvD,MAAI,aAAa;AAChB,OAAG,oBAAoB,aAAa,SAAS,SAAS;AACtD,OAAG,oBAAoB,WAAW,SAAS,OAAO;AAClD,OAAG,oBAAoB,cAAc,SAAS,OAAO;AAAA,EACtD;AACD;AAEO,MAAM,SAAS,gBAA2C;AAAA,EAChE,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUpC,mBAAiB,QAAQ,KAAK;AAC9C,UAAM,QAAQ,WAAW,IAAI,OAAO;AACpC,QAAI,CAAC,MAAO;AAEV,OAAW,UAAU;AACvB,eAAW,IAAI,KAAK;AAAA,EACrB;AAAA,EAEA,QAAQ,IAAI,SAAS;;AACpB,UAAM,QAAiC,GAAW;AAClD,UAAM,aAAaA,mBAAiB,QAAQ,KAAK;AAEjD,QAAI,CAAC,OAAO;AACX,YAAM,WAAW,WAAW,IAAI,UAAU;AAC1C,UAAI,UAAU;AACX,WAAW,UAAU;AACvB,mBAAW,IAAI,QAAQ;AAAA,MACxB;AACA;AAAA,IACD;AAEA,UAAM,cAAc,MAAM,QAAQ;AAClC,UAAM,mBAAkB,WAAM,QAAQ,UAAd,YAAuB;AAC/C,UAAM,mBAAkB,gBAAW,UAAX,YAAoB;AAE5C,UAAM,UAAU;AAEhB,QAAI,WAAW,YAAY,CAAC,aAAa;AACxC,mBAAa,IAAI,KAAK;AAAA,IACvB,WAAW,CAAC,WAAW,YAAY,aAAa;AAC/C,iBAAW,IAAI,KAAK;AAAA,IACrB,WAAW,oBAAoB,iBAAiB;AAC/C,UAAI,iBAAiB;AACpB,WAAG,oBAAoB,aAAa,MAAM,SAAS,SAAS;AAC5D,WAAG,oBAAoB,WAAW,MAAM,SAAS,OAAO;AACxD,WAAG,oBAAoB,cAAc,MAAM,SAAS,OAAO;AAAA,MAC5D;AACA,UAAI,iBAAiB;AACpB,WAAG,iBAAiB,aAAa,MAAM,SAAS,SAAS;AACzD,WAAG,iBAAiB,WAAW,MAAM,SAAS,OAAO;AACrD,WAAG,iBAAiB,cAAc,MAAM,SAAS,OAAO;AAAA,MACzD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAiC,GAAW;AAClD,QAAI,CAAC,MAAO;AAEZ,iBAAa,IAAI,KAAK;AACtB,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AC1ND,SAASA,mBACR,SACA,kBACkB;AAClB,QAAM,OAAO,UAAU,iBAAiB,GAAG,KAAK;AAEhD,MAAI,OAAO,YAAY,YAAY;AAClC,WAAO,EAAE,SAAS,SAAS,KAAA;AAAA,EAC5B;AAEA,SAAO,iCAAK,UAAL,EAAc,MAAM,QAAQ,QAAQ,KAAA;AAC5C;AAeO,MAAM,YAAY,gBAA8C;AAAA,EACtE,MAAM;AAAA,EACN,KAAK;AAAA;AAAA,EACL,UAAU;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAAA,EAGX,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,OAAO,OAAO;AAEvD,UAAM,YAAY,0BAA0B,QAAQ,SAAS,KAAK,oBAAoB,EAAE;AAGxF,UAAM,cAAc,SAAS,QAAQ,SAAS,QAAQ,MAAM;AAAA,MAC3D,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,IAAA,CAClB;AAGD,OAAG,iBAAiB,WAAW,WAAkB;AAE/C,OAAW,aAAa;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEF;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAwB,GAAW;AAEzC,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAaA,mBAAiB,QAAQ,OAAO,OAAO;AAG1D,QACC,WAAW,SAAS,MAAM,QAAQ,QAC/B,WAAW,YAAY,MAAM,QAAQ,WACrC,WAAW,aAAa,MAAM,QAAQ,UACxC;AAED,YAAM,YAAY,OAAA;AAGlB,YAAM,cAAc,SAAS,WAAW,SAAS,WAAW,MAAM;AAAA,QACjE,SAAS,WAAW;AAAA,QACpB,UAAU,WAAW;AAAA,MAAA,CACrB;AAED,SAAG,oBAAoB,MAAM,WAAW,MAAM,WAAkB;AAChE,SAAG,iBAAiB,MAAM,WAAW,WAAkB;AAErD,SAAW,aAAa;AAAA,QACzB;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,SAAS;AAAA,MAAA;AAAA,IAEX,WAAW,WAAW,YAAY,MAAM,QAAQ,SAAS;AAExD,YAAM,QAAQ,UAAU,WAAW;AAAA,IACpC;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAwB,GAAW;AAEzC,QAAI,CAAC,MAAO;AAEZ,UAAM,YAAY,OAAA;AAClB,OAAG,oBAAoB,MAAM,WAAW,MAAM,WAAkB;AAChE,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;ACnGD,MAAM,iBAAiB;AAAA,EACtB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,cAAc;AAAA,EACd,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AACZ;AAGA,IAAI,mBAAuC;AAE3C,SAAS,sBAAmC;AAC3C,MAAI,CAAC,oBAAoB,OAAO,aAAa,aAAa;AACzD,uBAAmB,SAAS,cAAc,KAAK;AAC/C,qBAAiB,KAAK;AACtB,qBAAiB,MAAM,UAAU;AACjC,aAAS,KAAK,YAAY,gBAAgB;AAAA,EAC3C;AAEA,SAAO;AACR;AAEA,SAAS,cAAc,SAAsC;AAC5D,QAAM,UAAU,SAAS,cAAc,KAAK;AAE5C,UAAQ,YAAY,wBAAwB,QAAQ,aAAa,KAAK;AACtE,MAAI,QAAQ,MAAO,SAAQ,UAAU,IAAI,QAAQ,KAAK;AAEtD,QAAM,WAAW,QAAQ,WAAW,OAAO,QAAQ,aAAa,WAAW,GAAG,QAAQ,QAAQ,OAAO,QAAQ,WAAW,eAAe;AAEvI,UAAQ,MAAM,UAAU;AAAA,IACvB;AAAA,IACA,YAAY,eAAe,OAAO;AAAA,IAClC,eAAe,eAAe,UAAU;AAAA,IACxC,UAAU,eAAe,KAAK;AAAA,IAC9B,kBAAkB,eAAe,YAAY;AAAA,IAC7C,cAAc,eAAe,QAAQ;AAAA,IACrC,gBAAgB,eAAe,UAAU;AAAA,IACzC,cAAc,eAAe,QAAQ;AAAA,IACrC,cAAc,QAAQ;AAAA,IACtB;AAAA,IACA,eAAe,eAAe,SAAS;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,QAAQ,UAAU,IAAI;AAAA,EAAA,EACjC,KAAK,GAAG;AAGV,MAAI,QAAQ,UAAU,OAAO;AAC5B,UAAM,QAAQ,SAAS,cAAc,KAAK;AAE1C,UAAM,YAAY;AAClB,UAAM,MAAM,UAAU;AACtB,YAAQ,YAAY,KAAK;AAAA,EAC1B;AAGA,QAAM,UAAU,SAAS,cAAc,KAAK;AAE5C,UAAQ,YAAY;AACpB,UAAQ,cAAc,QAAQ;AAC9B,UAAQ,YAAY,OAAO;AAE3B,SAAO;AACR;AAEA,SAAS,gBACR,SACA,IACA,WACA,QACO;AACP,QAAM,SAAS,GAAG,sBAAA;AAClB,QAAM,cAAc,QAAQ,sBAAA;AAE5B,MAAI,MAAM,GACT,OAAO;AAER,UAAQ,WAAA;AAAA,IACP,KAAK;AACJ,YAAM,OAAO,MAAM,YAAY,SAAS;AACxC,aAAO,OAAO,QAAQ,OAAO,QAAQ,YAAY,SAAS;AAC1D;AAAA,IACD,KAAK;AACJ,YAAM,OAAO,SAAS;AACtB,aAAO,OAAO,QAAQ,OAAO,QAAQ,YAAY,SAAS;AAC1D;AAAA,IACD,KAAK;AACJ,YAAM,OAAO,OAAO,OAAO,SAAS,YAAY,UAAU;AAC1D,aAAO,OAAO,OAAO,YAAY,QAAQ;AACzC;AAAA,IACD,KAAK;AACJ,YAAM,OAAO,OAAO,OAAO,SAAS,YAAY,UAAU;AAC1D,aAAO,OAAO,QAAQ;AACtB;AAAA,EAAA;AAIF,QAAM,gBAAgB,OAAO;AAC7B,QAAM,iBAAiB,OAAO;AAE9B,MAAI,OAAO,EAAG,QAAO;AACrB,MAAI,OAAO,YAAY,QAAQ,cAAe,QAAO,gBAAgB,YAAY,QAAQ;AACzF,MAAI,MAAM,EAAG,OAAM;AACnB,MAAI,MAAM,YAAY,SAAS,eAAgB,OAAM,iBAAiB,YAAY,SAAS;AAE3F,UAAQ,MAAM,MAAM,GAAG,GAAG;AAC1B,UAAQ,MAAM,OAAO,GAAG,IAAI;AAG5B,QAAM,QAAQ,QAAQ,cAAc,mBAAmB;AAEvD,MAAI,OAAO;AACV,UAAM,YAAY;AAElB,YAAQ,WAAA;AAAA,MACP,KAAK;AACJ,eAAO,OAAO,MAAM,OAAO,EAAE,QAAQ,IAAI,SAAS,MAAM,MAAM,OAAO,WAAW,iCAAA,CAAkC;AAClH;AAAA,MACD,KAAK;AACJ,eAAO,OAAO,MAAM,OAAO,EAAE,KAAK,IAAI,SAAS,MAAM,MAAM,OAAO,WAAW,iCAAA,CAAkC;AAC/G;AAAA,MACD,KAAK;AACJ,eAAO,OAAO,MAAM,OAAO,EAAE,OAAO,IAAI,SAAS,MAAM,KAAK,OAAO,WAAW,iCAAA,CAAkC;AAChH;AAAA,MACD,KAAK;AACJ,eAAO,OAAO,MAAM,OAAO,EAAE,MAAM,IAAI,SAAS,MAAM,KAAK,OAAO,WAAW,iCAAA,CAAkC;AAC/G;AAAA,IAAA;AAAA,EAEH;AACD;AAEA,SAAS,YAAY,IAAiB,OAA2B;AAChE,MAAI,MAAM,aAAa,MAAM,QAAQ,SAAU;AAE/C,MAAI,MAAM,aAAa;AACtB,iBAAa,MAAM,WAAW;AAC9B,UAAM,cAAc;AAAA,EACrB;AAEA,QAAM,SAAS,MAAY;;AAC1B,UAAM,UAAU,cAAc,MAAM,OAAO;AAE3C,UAAM,UAAU;AAChB,wBAAA,EAAsB,YAAY,OAAO;AAEzC,0BAAsB,MAAM;AAC3B,sBAAgB,SAAS,IAAI,MAAM,QAAQ,aAAa,OAAO,MAAM,QAAQ,UAAU,CAAC;AACxF,4BAAsB,MAAM;AAC3B,gBAAQ,MAAM,UAAU;AAAA,MACzB,CAAC;AAAA,IACF,CAAC;AAED,UAAM,YAAY;AAClB,sBAAM,SAAQ,WAAd;AAAA,EACD;AAEA,MAAI,MAAM,QAAQ,SAAS,MAAM,QAAQ,QAAQ,GAAG;AACnD,UAAM,cAAc,WAAW,QAAQ,MAAM,QAAQ,KAAK;AAAA,EAC3D,OAAO;AACN,WAAA;AAAA,EACD;AACD;AAEA,SAAS,YAAY,OAA2B;AAC/C,MAAI,CAAC,MAAM,UAAW;AAEtB,MAAI,MAAM,aAAa;AACtB,iBAAa,MAAM,WAAW;AAC9B,UAAM,cAAc;AAAA,EACrB;AAEA,QAAM,SAAS,MAAY;;AAC1B,QAAI,MAAM,SAAS;AAClB,YAAM,QAAQ,MAAM,UAAU;AAC9B,iBAAW,MAAM;;AAChB,SAAAiB,MAAA,MAAM,YAAN,gBAAAA,IAAe;AACf,cAAM,UAAU;AAAA,MACjB,GAAG,GAAG;AAAA,IACP;AAEA,UAAM,YAAY;AAClB,sBAAM,SAAQ,WAAd;AAAA,EACD;AAEA,MAAI,MAAM,QAAQ,aAAa,MAAM,QAAQ,YAAY,GAAG;AAC3D,UAAM,cAAc,WAAW,QAAQ,MAAM,QAAQ,SAAS;AAAA,EAC/D,OAAO;AACN,WAAA;AAAA,EACD;AACD;AAEA,SAAS,qBAAqB,IAAiB,OAA2B;AACzE,QAAM,EAAE,UAAU,QAAA,IAAY,MAAM;AAEpC,QAAM,OAAO,MAAY,YAAY,IAAI,KAAK;AAC9C,QAAM,OAAO,MAAY,YAAY,KAAK;AAC1C,QAAM,SAAS,MAAa,MAAM,YAAY,KAAA,IAAS,KAAA;AAEvD,QAAM,WAAW,EAAE,MAAM,MAAM,OAAA;AAE/B,UAAQ,SAAA;AAAA,IACP,KAAK;AACJ,SAAG,iBAAiB,cAAc,IAAI;AACtC,SAAG,iBAAiB,cAAc,IAAI;AACtC;AAAA,IACD,KAAK;AACJ,SAAG,iBAAiB,SAAS,MAAM;AACnC,eAAS,iBAAiB,SAAS,MAAM,SAAS,UAAU,CAAC,MAAa;AACzE,YAAI,MAAM,aAAa,CAAC,GAAG,SAAS,EAAE,MAAc,EAAG,MAAA;AAAA,MACxD,CAAC;AACD;AAAA,IACD,KAAK;AACJ,SAAG,iBAAiB,SAAS,IAAI;AACjC,SAAG,iBAAiB,QAAQ,IAAI;AAChC;AAAA,EAAA;AAGH;AAEA,SAAS,sBAAsB,IAAiB,OAA2B;AAC1E,QAAM,EAAE,MAAM,MAAM,QAAQ,QAAA,IAAY,MAAM;AAE9C,MAAI,MAAM;AACT,OAAG,oBAAoB,cAAc,IAAI;AACzC,OAAG,oBAAoB,SAAS,IAAI;AAAA,EACrC;AACA,MAAI,MAAM;AACT,OAAG,oBAAoB,cAAc,IAAI;AACzC,OAAG,oBAAoB,QAAQ,IAAI;AAAA,EACpC;AACA,MAAI,QAAQ;AACX,OAAG,oBAAoB,SAAS,MAAM;AAAA,EACvC;AACA,MAAI,SAAS;AACZ,aAAS,oBAAoB,SAAS,OAAO;AAAA,EAC9C;AACD;AAEA,SAASjB,mBAAiB,SAAqD;;AAC9E,MAAI,OAAO,YAAY,UAAU;AAChC,WAAO,EAAE,SAAS,SAAS,WAAW,OAAO,SAAS,QAAA;AAAA,EACvD;AAEA,MAAI,CAAC,SAAS;AACb,WAAO,EAAE,SAAS,IAAI,WAAW,OAAO,SAAS,QAAA;AAAA,EAClD;AAEA,SAAO;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,YAAW,aAAQ,cAAR,YAAqB;AAAA,IAChC,UAAS,aAAQ,YAAR,YAAmB;AAAA,IAC5B,QAAO,aAAQ,UAAR,YAAiB;AAAA,IACxB,YAAW,aAAQ,cAAR,YAAqB;AAAA,IAChC,SAAQ,aAAQ,WAAR,YAAkB;AAAA,IAC1B,OAAO,QAAQ;AAAA,IACf,QAAO,aAAQ,UAAR,YAAiB;AAAA,IACxB,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,UAAU,QAAQ;AAAA,IAClB,SAAQ,aAAQ,WAAR,YAAkB;AAAA,IAC1B,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,EAAA;AAElB;AAEA,SAAS,YAAY,SAAuC;AAC3D,SAAO;AAAA,IACN;AAAA,IACA,SAAS;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAW;AAAA,IACX,UAAU,CAAA;AAAA,EAAC;AAEb;AAEO,MAAM,WAAW,gBAA6C;AAAA,EACpE,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,QAAQ,YAAY,CAAC,QAAQ,QAAS;AAE1C,UAAM,QAAQ,YAAY,OAAO;AAE/B,OAAW,YAAY;AACzB,yBAAqB,IAAI,KAAK;AAC9B,OAAG,aAAa,oBAAoB,WAAW;AAAA,EAChD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAmC,GAAW;AACpD,UAAM,aAAaA,mBAAiB,QAAQ,KAAK;AAGjD,QAAI,CAAC,OAAO;AACX,UAAI,CAAC,WAAW,YAAY,WAAW,SAAS;AAC/C,cAAM,WAAW,YAAY,UAAU;AAErC,WAAW,YAAY;AACzB,6BAAqB,IAAI,QAAQ;AAEjC,YAAI,WAAW,YAAY,UAAU;AACpC,sBAAY,IAAI,QAAQ;AAAA,QACzB;AAAA,MACD;AAEA;AAAA,IACD;AAGA,QAAI,WAAW,YAAY,UAAU;AACpC,YAAM,cAAc,MAAM,QAAQ;AAElC,YAAM,UAAU;AAEhB,UAAI,WAAW,YAAY,CAAC,aAAa;AACxC,oBAAY,KAAK;AAAA,MAClB,WAAW,CAAC,WAAW,YAAY,aAAa;AAC/C,oBAAY,IAAI,KAAK;AAAA,MACtB;AAEA;AAAA,IACD;AAGA,QAAI,MAAM,WAAW,MAAM,WAAW;AACrC,YAAM,UAAU,MAAM,QAAQ,cAAc,qBAAqB;AAEjE,UAAI,QAAS,SAAQ,cAAc,WAAW;AAAA,IAC/C;AAEA,UAAM,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU,IAAI;;AACb,UAAM,QAAmC,GAAW;AAEpD,QAAI,CAAC,MAAO;AAEZ,QAAI,MAAM,YAAa,cAAa,MAAM,WAAW;AACrD,QAAI,MAAM,YAAa,cAAa,MAAM,WAAW;AACrD,gBAAM,YAAN,mBAAe;AACf,0BAAsB,IAAI,KAAK;AAC/B,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;ACrVD,MAAMuB,gBAAc,CAAC,IAAY,IAAY,IAAY,OACxD,KAAK,KAAM,WAAK,IAAO,KAAK,WAAK,IAAO,EAAC;AAE1C,MAAM,WAAW,CAAC,IAAY,IAAY,IAAY,OACpD,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,IAAI,MAAO,KAAK;AAE7C,MAAM,wBAAwB;AAEvB,MAAM,SAAS,gBAA2C;AAAA,EAChE,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUvB,mBAAiB,QAAQ,KAAK;AAE9C,UAAM,QAAoB;AAAA,MACzB;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,UAAU,EAAE,YAAY,MAAM;AAAA,MAAC,GAAG,WAAW,MAAM;AAAA,MAAC,GAAG,UAAU,MAAM;AAAA,MAAC,EAAA;AAAA,IAAE;AAGzE,OAAW,UAAU;AAEvB,UAAM,sBAAsB,MAAY;AACvC,UAAI,MAAM,gBAAgB;AACzB,qBAAa,MAAM,cAAc;AACjC,cAAM,iBAAiB;AAAA,MACxB;AAAA,IACD;AAEA,UAAM,sBAAsB,CAAC,UAAyC;AACrE,0BAAA;AACA,UAAI,MAAM,QAAQ,mBAAmB,MAAM,QAAQ,aAAa;AAC/D,cAAM,iBAAiB,WAAW,MAAM;AACvC,gBAAM,cAAc;AACpB,gBAAM,QAAQ,YAAa,KAAK;AAAA,QACjC,GAAG,MAAM,QAAQ,oBAAoB,GAAG;AAAA,MACzC;AAAA,IACD;AAEA,UAAM,mBAAmB,CAAC,GAAW,MAAuB;AAC3D,YAAM,YAAY,MAAM,QAAQ,gBAAgB;AAChD,aAAO,KAAK,IAAI,IAAI,MAAM,MAAM,IAAI,aAAa,KAAK,IAAI,IAAI,MAAM,MAAM,IAAI;AAAA,IAC/E;AAEA,UAAM,mBAAmB,CAAC,MAAc,MAAc,UAAyC;;AAC9F,UAAI,MAAM,YAAa;AAEvB,YAAM,WAAW,KAAK,IAAA,IAAQ,MAAM;AACpC,YAAM,SAAS,OAAO,MAAM;AAC5B,YAAM,SAAS,OAAO,MAAM;AAC5B,YAAM,WAAW,KAAK,KAAK,cAAU,KAAI,cAAU,EAAC;AAGpD,UACC,MAAM,QAAQ,eACX,aAAa,MAAM,QAAQ,kBAAkB,OAC7C,aAAa,MAAM,QAAQ,gBAAgB,MAC7C;AACD,cAAM,YAA4B,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,IAAK,SAAS,IAAI,UAAU,SAAW,SAAS,IAAI,SAAS;AAEjI,0BAAM,SAAQ,YAAd,4BAAwB,WAAW;AACnC,YAAI,cAAc,OAAQ,mBAAM,SAAQ,gBAAd,4BAA4B;AAAA,iBAC7C,cAAc,QAAS,mBAAM,SAAQ,iBAAd,4BAA6B;AAAA,iBACpD,cAAc,KAAM,mBAAM,SAAQ,cAAd,4BAA0B;AAAA,YAClD,mBAAM,SAAQ,gBAAd,4BAA4B;AAAA,MAClC,WACC,MAAM,QAAQ,aACX,YAAY,MAAM,QAAQ,gBAAgB,OAC1C,YAAY,MAAM,QAAQ,cAAc,MAC1C;AACD,0BAAM,SAAQ,UAAd,4BAAsB;AAAA,MACvB;AAAA,IACD;AAGA,UAAM,mBAAmB,CAAC,MAAwB;;AAEjD,UAAI,EAAE,QAAQ,SAAS,GAAG;AACzB,UAAE,eAAA;AAAA,MACH;AAEA,YAAM,YAAY,KAAK,IAAA;AACvB,YAAM,cAAc;AAEpB,UAAI,EAAE,QAAQ,WAAW,GAAG;AAC3B,cAAM,SAAS,EAAE,QAAQ,CAAC,EAAE;AAC5B,cAAM,SAAS,EAAE,QAAQ,CAAC,EAAE;AAC5B,4BAAoB,CAAC;AAAA,MACtB,WAAW,EAAE,QAAQ,WAAW,GAAG;AAClC,4BAAA;AACA,cAAM,CAAC,IAAI,EAAE,IAAI,EAAE;AACnB,cAAM,gBAAgBuB,cAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO;AAChF,cAAM,aAAa,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO;AAC1E,cAAM,YAAY;AAClB,cAAM,YAAY;AAAA,MACnB;AAEA,wBAAM,SAAQ,iBAAd,4BAA6B;AAAA,IAC9B;AAEA,UAAM,kBAAkB,CAAC,MAAwB;;AAEhD,UAAI,EAAE,QAAQ,UAAU,GAAG;AAC1B,UAAE,eAAA;AAAA,MACH;AAEA,UAAI,MAAM,kBAAkB,EAAE,QAAQ,WAAW,KAAK,iBAAiB,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG;AACnH,4BAAA;AAAA,MACD;AAEA,UAAI,EAAE,QAAQ,WAAW,GAAG;AAC3B,cAAM,CAAC,IAAI,EAAE,IAAI,EAAE;AACnB,cAAM,kBAAkBA,cAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO;AAClF,cAAM,eAAe,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO;AAE5E,YAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,SAAS;AACvD,gBAAM,QAAQ,kBAAkB,MAAM;AACtC,cAAI,KAAK,IAAI,QAAQ,MAAM,SAAS,MAAM,MAAM,QAAQ,kBAAkB,MAAM;AAC/E,kBAAM,QAAQ,QAAQ,OAAO,CAAC;AAC9B,kBAAM,YAAY;AAAA,UACnB;AAAA,QACD;AAEA,YAAI,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,UAAU;AACzD,gBAAM,YAAY,eAAe,MAAM;AACvC,cAAI,KAAK,IAAI,YAAY,MAAM,SAAS,IAAI,GAAG;AAC9C,kBAAM,QAAQ,SAAS,WAAW,CAAC;AACnC,kBAAM,YAAY;AAAA,UACnB;AAAA,QACD;AAAA,MACD;AAEA,wBAAM,SAAQ,gBAAd,4BAA4B;AAAA,IAC7B;AAEA,UAAM,iBAAiB,CAAC,MAAwB;;AAC/C,0BAAA;AAEA,UAAI,EAAE,QAAQ,WAAW,GAAG;AAC3B,cAAM,mBAAmB,KAAK,IAAA;AAC9B,cAAM,QAAQ,EAAE,eAAe,CAAC;AAChC,yBAAiB,MAAM,SAAS,MAAM,SAAS,CAAC;AAAA,MACjD;AAEA,wBAAM,SAAQ,eAAd,4BAA2B;AAAA,IAC5B;AAGA,UAAM,kBAAkB,CAAC,MAAwB;;AAChD,UAAI,CAAC,MAAM,QAAQ,YAAa;AAEhC,UAAI,KAAK,IAAA,IAAQ,MAAM,mBAAmB,sBAAuB;AAEjE,QAAE,eAAA;AACF,YAAM,cAAc;AACpB,YAAM,YAAY,KAAK,IAAA;AACvB,YAAM,SAAS,EAAE;AACjB,YAAM,SAAS,EAAE;AACjB,YAAM,cAAc;AACpB,0BAAoB,CAAC;AAErB,wBAAM,SAAQ,iBAAd,4BAA6B;AAAA,IAC9B;AAEA,UAAM,kBAAkB,CAAC,MAAwB;;AAChD,UAAI,CAAC,MAAM,eAAe,CAAC,MAAM,QAAQ,YAAa;AACtD,UAAI,MAAM,kBAAkB,iBAAiB,EAAE,SAAS,EAAE,OAAO,GAAG;AACnE,4BAAA;AAAA,MACD;AACA,wBAAM,SAAQ,gBAAd,4BAA4B;AAAA,IAC7B;AAEA,UAAM,gBAAgB,CAAC,MAAwB;;AAC9C,UAAI,CAAC,MAAM,eAAe,CAAC,MAAM,QAAQ,YAAa;AAEtD,YAAM,cAAc;AACpB,0BAAA;AAEA,UAAI,CAAC,MAAM,aAAa;AACvB,yBAAiB,EAAE,SAAS,EAAE,SAAS,CAAC;AAAA,MACzC;AAEA,wBAAM,SAAQ,eAAd,4BAA2B;AAAA,IAC5B;AAEA,UAAM,WAAW,EAAE,YAAY,kBAAkB,WAAW,iBAAiB,UAAU,gBAAgB,WAAW,iBAAiB,WAAW,iBAAiB,SAAS,cAAA;AAExK,OAAG,iBAAiB,cAAc,kBAAkB,EAAE,SAAS,OAAO;AACtE,OAAG,iBAAiB,aAAa,iBAAiB,EAAE,SAAS,OAAO;AACpE,OAAG,iBAAiB,YAAY,cAAc;AAC9C,OAAG,iBAAiB,eAAe,cAAc;AAEjD,QAAI,QAAQ,aAAa;AACxB,SAAG,iBAAiB,aAAa,eAAe;AAChD,eAAS,iBAAiB,aAAa,eAAe;AACtD,eAAS,iBAAiB,WAAW,aAAa;AAAA,IACnD;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAS,GAAW;AAC1B,QAAI,MAAO,OAAM,UAAUvB,mBAAiB,QAAQ,KAAK;AAAA,EAC1D;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAS,GAAW;AAE1B,QAAI,+BAAO,eAAgB,cAAa,MAAM,cAAc;AAE5D,QAAI,+BAAO,UAAU;AACpB,SAAG,oBAAoB,cAAc,MAAM,SAAS,UAAU;AAC9D,SAAG,oBAAoB,aAAa,MAAM,SAAS,SAAS;AAC5D,SAAG,oBAAoB,YAAY,MAAM,SAAS,QAAQ;AAC1D,SAAG,oBAAoB,eAAe,MAAM,SAAS,QAAQ;AAC7D,UAAI,MAAM,SAAS,UAAW,IAAG,oBAAoB,aAAa,MAAM,SAAS,SAAS;AAC1F,UAAI,MAAM,SAAS,UAAW,UAAS,oBAAoB,aAAa,MAAM,SAAS,SAAS;AAChG,UAAI,MAAM,SAAS,QAAS,UAAS,oBAAoB,WAAW,MAAM,SAAS,OAAO;AAAA,IAC3F;AAEA,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AAED,SAASA,mBAAiB,SAAiD;;AAC1E,SAAO;AAAA,IACN,iBAAgB,wCAAS,mBAAT,YAA2B;AAAA,IAC3C,eAAc,wCAAS,iBAAT,YAAyB;AAAA,IACvC,iBAAgB,wCAAS,mBAAT,YAA2B;AAAA,IAC3C,cAAa,wCAAS,gBAAT,YAAwB;AAAA,IACrC,cAAa,wCAAS,gBAAT,YAAwB;AAAA,IACrC,eAAc,wCAAS,iBAAT,YAAyB;AAAA,IACvC,YAAW,wCAAS,cAAT,YAAsB;AAAA,IACjC,aAAY,wCAAS,eAAT,YAAuB;AAAA,IACnC,eAAc,wCAAS,iBAAT,YAAyB;AAAA,IACvC,kBAAiB,wCAAS,oBAAT,YAA4B;AAAA,IAC7C,mBAAkB,wCAAS,qBAAT,YAA6B;AAAA,IAC/C,cAAa,wCAAS,gBAAT,YAAwB;AAAA,IACrC,SAAS,mCAAS;AAAA,IAClB,aAAa,mCAAS;AAAA,IACtB,cAAc,mCAAS;AAAA,IACvB,WAAW,mCAAS;AAAA,IACpB,aAAa,mCAAS;AAAA,IACtB,SAAS,mCAAS;AAAA,IAClB,UAAU,mCAAS;AAAA,IACnB,OAAO,mCAAS;AAAA,IAChB,aAAa,mCAAS;AAAA,IACtB,cAAc,mCAAS;AAAA,IACvB,aAAa,mCAAS;AAAA,IACtB,YAAY,mCAAS;AAAA,EAAA;AAEvB;AC1RA,SAASsC,WAAS,MAAc,SAA8B;AAC7D,QAAM,EAAE,WAAW,QAAQ,MAAA,IAAU;AAGrC,QAAM,cAAc,QAAQ,OAAOC,cAAY,KAAK,CAAC,MAAM;AAE3D,UAAQ,UAAA;AAAA,IACP,KAAK;AACJ,aAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,WAAW,KAAK,GAAG,GAAG,EAAE;AAAA,IAE5D,KAAK;AACJ,aAAO,KAAK,QAAQ,IAAI,OAAO,GAAG,WAAW,MAAM,GAAG,GAAG,EAAE;AAAA,IAE5D,KAAK;AAAA,IACL;AACC,aAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,WAAW,KAAK,WAAW,MAAM,GAAG,GAAG,EAAE;AAAA,EAAA;AAE/E;AAKA,SAASA,cAAY,KAAqB;AACzC,SAAO,IAAI,QAAQ,uBAAuB,MAAM;AACjD;AAyBO,MAAM,QAAQ,gBAA0C;AAAA,EAC9D,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUvC,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,GAAG,YAAY,WAAW,GAAG,YAAY,YAAY;AACxD,wBAAkB,IAA8C,OAAO;AAAA,IACxE,OAAO;AAEN,YAAM,OAAO,GAAG,eAAe;AAE/B,SAAG,cAAcsC,WAAS,MAAM,OAAO;AAAA,IACxC;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUtC,mBAAiB,QAAQ,KAAK;AAC9C,UAAM,QAAgC,GAAW;AAEjD,QAAI,GAAG,YAAY,WAAW,GAAG,YAAY,YAAY;AAExD,UAAI,OAAO;AACV,cAAM,UAAU;AAAA,MACjB;AAAA,IACD,OAAO;AAEN,YAAM,OAAO,GAAG,eAAe;AAE/B,SAAG,cAAcsC,WAAS,MAAM,OAAO;AAAA,IACxC;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAgC,GAAW;AAEjD,QAAI,+BAAO,cAAc;AACxB,SAAG,oBAAoB,SAAS,MAAM,YAAY;AAAA,IACnD;AACA,QAAI,+BAAO,aAAa;AACvB,SAAG,oBAAoB,QAAQ,MAAM,WAAW;AAAA,IACjD;AAEA,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AAKD,SAAS,kBAAkB,IAA4C,SAA4B;AAClG,QAAM,QAAmB,EAAE,QAAA;AAEzB,KAAW,SAAS;AAEtB,QAAM,cAAc,MAAY;AAC/B,UAAM,gBAAgB,GAAG;AACzB,UAAM,UAAUA,WAAS,eAAe,OAAO;AAE/C,QAAI,kBAAkB,SAAS;AAC9B,SAAG,QAAQ;AACX,SAAG,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAA,CAAM,CAAC;AAAA,IACvD;AAAA,EACD;AAGA,MAAI,QAAQ,SAAS;AACpB,UAAM,eAAe,MAAY;AAGhC,YAAM,gBAAgB,GAAG;AACzB,YAAM,YAAY,GAAG;AAGrB,YAAM,UAAU,cAAc,QAAQ,SAAS,EAAE;AAEjD,UAAI,kBAAkB,SAAS;AAC9B,WAAG,QAAQ;AAEX,YAAI,cAAc,MAAM;AACvB,gBAAM,eAAe,KAAK,IAAI,WAAW,QAAQ,MAAM;AAEvD,aAAG,kBAAkB,cAAc,YAAY;AAAA,QAChD;AAAA,MACD;AAAA,IACD;AAEA,OAAG,iBAAiB,SAAS,YAAY;AACzC,UAAM,eAAe;AAAA,EACtB;AAEA,MAAI,QAAQ,QAAQ;AACnB,UAAM,cAAc,MAAY,YAAA;AAEhC,OAAG,iBAAiB,QAAQ,WAAW;AACvC,UAAM,cAAc;AAAA,EACrB;AAGA,MAAI,GAAG,OAAO;AACb,gBAAA;AAAA,EACD;AACD;AAKA,SAAStC,mBAAiB,SAA+C;;AACxE,MAAI,YAAY,UAAa,YAAY,MAAM;AAC9C,WAAO,EAAE,UAAU,QAAQ,SAAS,MAAM,QAAQ,KAAA;AAAA,EACnD;AAEA,MAAI,YAAY,OAAO;AACtB,WAAO,EAAE,UAAU,QAAQ,SAAS,OAAO,QAAQ,MAAA;AAAA,EACpD;AAEA,MAAI,OAAO,YAAY,UAAU;AAChC,WAAO,EAAE,UAAU,SAAS,SAAS,MAAM,QAAQ,KAAA;AAAA,EACpD;AAEA,SAAO;AAAA,IACN,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,UAAS,aAAQ,YAAR,YAAmB;AAAA,IAC5B,SAAQ,aAAQ,WAAR,YAAkB;AAAA,IAC1B,OAAO,QAAQ;AAAA,EAAA;AAEjB;ACzKA,SAASwC,eAAa,MAAc,SAAkC;AACrE,QAAM,EAAE,SAAS,KAAK,WAAW,OAAO,WAAW,UAAU;AAE7D,MAAI,KAAK,UAAU,QAAQ;AAC1B,WAAO;AAAA,EACR;AAEA,UAAQ,UAAA;AAAA,IACP,KAAK;AACJ,aAAO,WAAW,KAAK,MAAM,EAAE,SAAS,SAAS,OAAO;AAAA,IAEzD,KAAK,UAAU;AACd,YAAM,WAAW,KAAK,MAAM,SAAS,SAAS,UAAU,CAAC;AACzD,YAAM,SAAS,KAAK,OAAO,SAAS,SAAS,UAAU,CAAC;AAExD,aAAO,KAAK,MAAM,GAAG,QAAQ,IAAI,WAAW,KAAK,MAAM,CAAC,MAAM;AAAA,IAC/D;AAAA,IAEA,KAAK;AAAA,IACL;AACC,aAAO,KAAK,MAAM,GAAG,SAAS,SAAS,MAAM,IAAI;AAAA,EAAA;AAEpD;AAmBO,MAAM,YAAY,gBAA8C;AAAA,EACtE,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUxC,mBAAiB,QAAQ,KAAK;AAC9C,UAAM,OAAO,GAAG,eAAe;AAG/B,UAAM,QAAuB;AAAA,MAC5B,cAAc;AAAA,MACd;AAAA,IAAA;AAGC,OAAW,aAAa;AAE1B,oBAAgB,IAAI,MAAM,OAAO;AAAA,EAClC;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAoC,GAAW;AACrD,UAAM,aAAaA,mBAAiB,QAAQ,KAAK;AAEjD,QAAI,OAAO;AAEV,YAAM,eAAe,MAAM;AAG3B,UAAI,KAAK,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM,OAAO,GAAG;AACjE,cAAM,UAAU;AAChB,wBAAgB,IAAI,cAAc,UAAU;AAAA,MAC7C;AAAA,IACD,OAAO;AACN,YAAM,OAAO,GAAG,eAAe;AAE7B,SAAW,aAAa;AAAA,QACzB,cAAc;AAAA,QACd,SAAS;AAAA,MAAA;AAEV,sBAAgB,IAAI,MAAM,UAAU;AAAA,IACrC;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AAKD,SAAS,gBAAgB,IAAiB,MAAc,SAAgC;AACvF,QAAM,EAAE,QAAQ,YAAY,KAAA,IAAS;AAErC,MAAI,QAAQ;AAEX,OAAG,MAAM,WAAW;AACpB,OAAG,MAAM,eAAe;AACxB,OAAG,MAAM,aAAa;AAEtB,QAAI,aAAa,MAAM;AACtB,SAAG,aAAa,SAAS,IAAI;AAAA,IAC9B;AAAA,EACD,OAAO;AAEN,UAAM,YAAYwC,eAAa,MAAM,OAAO;AAE5C,OAAG,cAAc;AAEjB,QAAI,aAAa,QAAQ,SAAS,WAAW;AAC5C,SAAG,aAAa,SAAS,IAAI;AAAA,IAC9B;AAAA,EACD;AACD;AAKA,SAASxC,mBAAiB,SAAuD;;AAChF,MAAI,OAAO,YAAY,UAAU;AAChC,WAAO;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW;AAAA,IAAA;AAAA,EAEb;AAEA,SAAO;AAAA,IACN,SAAQ,wCAAS,WAAT,YAAmB;AAAA,IAC3B,WAAU,wCAAS,aAAT,YAAqB;AAAA,IAC/B,WAAU,wCAAS,aAAT,YAAqB;AAAA,IAC/B,SAAQ,wCAAS,WAAT,YAAmB;AAAA,IAC3B,YAAW,wCAAS,cAAT,YAAsB;AAAA,EAAA;AAEnC;ACxKA,SAAS,cAAc,MAAc,SAAmC;AACvE,MAAI,CAAC,KAAM,QAAO;AAElB,MAAI,QAAQ,OAAO;AAClB,WAAO,KAAK,OAAO,CAAC,EAAE,gBAAgB,KAAK,MAAM,CAAC;AAAA,EACnD;AAEA,SAAO,KAAK,YAAA;AACb;AAKA,SAASA,mBAAiB,SAAyD;;AAClF,MAAI,YAAY,UAAa,YAAY,MAAM;AAC9C,WAAO,EAAE,OAAO,OAAO,SAAS,KAAA;AAAA,EACjC;AAEA,MAAI,YAAY,OAAO;AACtB,WAAO,EAAE,OAAO,OAAO,SAAS,MAAA;AAAA,EACjC;AAEA,SAAO;AAAA,IACN,QAAO,aAAQ,UAAR,YAAiB;AAAA,IACxB,UAAS,aAAQ,YAAR,YAAmB;AAAA,EAAA;AAE9B;AAgBO,MAAM,aAAa,gBAA+C;AAAA,EACxE,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,eAAe,EAAE,GAAG;AACvB,YAAMC,WAAU,wBAAwB,IAAI,SAAS,UAAQ,cAAc,MAAM,OAAO,CAAC;AAEvF,SAAW,qBAAqBA;AAAA,IACnC,OAAO;AACN,2BAAqB,IAAI,CAAA,SAAQ,cAAc,MAAM,OAAO,CAAC;AAAA,IAC9D;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUD,mBAAiB,QAAQ,KAAK;AAE9C,QAAI,eAAe,EAAE,GAAG;AACvB,UAAI,QAAQ,SAAS;AACpB,WAAG,QAAQ,cAAc,GAAG,OAAO,OAAO;AAAA,MAC3C;AAAA,IACD,OAAO;AACN,2BAAqB,IAAI,CAAA,SAAQ,cAAc,MAAM,OAAO,CAAC;AAAA,IAC9D;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAMC,WAAqC,GAAW;AAEtD,IAAAA,YAAA,gBAAAA;AACA,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;ACnBD,SAAS,YAAY,SAA6B,OAAuB;AACxE,MAAI,OAAO,QAAQ,aAAa,YAAY;AAC3C,WAAO,QAAQ,SAAS,KAAK;AAAA,EAC9B;AACA,SAAO,QAAQ,YAAY;AAC5B;AAKA,SAAS,qBAAqB,SAAqC;AAClE,MAAI,OAAO,QAAQ,aAAa,YAAY;AAC3C,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,QAAQ,MAAM,QAAQ,KAAK;AAC9C,eAAS,QAAQ,SAAS,CAAC;AAAA,IAC5B;AACA,WAAO;AAAA,EACR;AACA,UAAQ,QAAQ,YAAY,MAAM,QAAQ,MAAM;AACjD;AAKA,SAAS,sBACR,WACA,iBACA,SAC4D;AAC5D,QAAM,QAAQ,QAAQ;AACtB,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,WAAW,QAAQ,YAAY;AAErC,MAAI,aAAa,GAChB,WAAW,GACX,UAAU;AAEX,MAAI,OAAO,aAAa,YAAY;AAEnC,QAAI,gBAAgB;AACpB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,YAAM,OAAO,SAAS,CAAC;AACvB,UAAI,gBAAgB,OAAO,WAAW;AACrC,qBAAa;AACb,kBAAU;AACV;AAAA,MACD;AACA,uBAAiB;AAAA,IAClB;AAGA,eAAW;AACX,oBAAgB;AAChB,WAAO,WAAW,MAAM,UAAU,gBAAgB,YAAY,iBAAiB;AAC9E,uBAAiB,SAAS,QAAQ;AAClC;AAAA,IACD;AAGA,iBAAa,KAAK,IAAI,GAAG,aAAa,QAAQ;AAC9C,eAAW,KAAK,IAAI,MAAM,QAAQ,WAAW,QAAQ;AAGrD,oBAAgB;AAChB,aAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACpC,uBAAiB,SAAS,CAAC;AAAA,IAC5B;AACA,cAAU;AAEV,WAAO,EAAE,YAAY,UAAU,QAAA;AAAA,EAChC;AAGA,eAAa,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,QAAQ,IAAI,QAAQ;AACpE,aAAW,KAAK,IAAI,MAAM,QAAQ,KAAK,MAAM,YAAY,mBAAmB,QAAQ,IAAI,QAAQ;AAChG,YAAU,aAAa;AAEvB,SAAO,EAAE,YAAY,UAAU,QAAA;AAChC;AAKA,SAASD,mBAAoB,SAAuD;;AACnF,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,IAAA;AAAA,EAEZ;AAEA,SAAO;AAAA,IACN,OAAO,QAAQ;AAAA,IACf,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,SAAQ,aAAQ,WAAR,YAAkB;AAAA,IAC1B,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,QAAQ,QAAQ;AAAA,IAChB,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,UAAU,QAAQ;AAAA,IAClB,iBAAiB,QAAQ;AAAA,EAAA;AAE3B;AAKA,SAAS,kBACR,MACA,OACA,SACc;AACd,QAAM,KAAK,SAAS,cAAc,KAAK;AACvC,KAAG,YAAY;AACf,KAAG,QAAQ,QAAQ,OAAO,KAAK;AAG/B,QAAM,WAAW,QAAQ,YAAY;AACrC,MAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,YAAY,MAAM;AAClE,OAAG,QAAQ,MAAM,OAAO,KAAK,QAAQ,CAAC;AAAA,EACvC;AAGA,QAAM,SAAS,YAAY,SAAS,KAAK;AACzC,KAAG,MAAM,SAAS,GAAG,MAAM;AAC3B,KAAG,MAAM,YAAY;AAGrB,MAAI,QAAQ,QAAQ;AACnB,OAAG,YAAY,QAAQ,OAAO,MAAM,KAAK;AAAA,EAC1C,OAAO;AACN,OAAG,cAAc,OAAO,SAAS,WAAW,KAAK,UAAU,IAAI,IAAI,OAAO,IAAI;AAAA,EAC/E;AAEA,SAAO;AACR;AAsBO,MAAM,eAAe,gBAAiD;AAAA,EAC5E,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAG9C,OAAG,UAAU,IAAI,gBAAgB;AACjC,OAAG,MAAM,SAAS,OAAO,QAAQ,WAAW,WAAW,GAAG,QAAQ,MAAM,OAAO,QAAQ;AACvF,OAAG,MAAM,WAAW;AACpB,OAAG,MAAM,WAAW;AAGpB,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,YAAY;AACtB,cAAU,MAAM,WAAW;AAC3B,cAAU,MAAM,SAAS,GAAG,qBAAqB,OAAO,CAAC;AACzD,OAAG,YAAY,SAAS;AAGxB,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,YAAY;AACtB,cAAU,MAAM,WAAW;AAC3B,cAAU,MAAM,MAAM;AACtB,cAAU,MAAM,OAAO;AACvB,cAAU,MAAM,QAAQ;AACxB,cAAU,YAAY,SAAS;AAE/B,UAAM,QAA0B;AAAA,MAC/B;AAAA,MACA,aAAa;AAAA,MACb;AAAA,MACA,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc,CAAA;AAAA,IAAC;AAGd,OAAW,gBAAgB;AAG7B,UAAM,gBAAgB,CAAC,WAAwB;AAC9C,YAAM,YAAY,GAAG;AACrB,YAAM,kBAAkB,GAAG;AAG3B,YAAM,EAAE,YAAAyC,aAAY,UAAAC,WAAU,SAAAC,aAAY;AAAA,QACzC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,MAAA;AAIP,UAAIF,gBAAe,MAAM,cAAcC,cAAa,MAAM,UAAU;AACnE,cAAM,aAAaD;AACnB,cAAM,WAAWC;AAGjB,2BAAmB,WAAW,OAAOC,QAAO;AAG5C,YAAI,MAAM,QAAQ,iBAAiB;AAClC,gBAAM,QAAQ,gBAAgBF,aAAYC,SAAQ;AAAA,QACnD;AAAA,MACD;AAGA,UAAI,MAAM,QAAQ,UAAU;AAC3B,cAAM,QAAQ,SAAS,SAAS;AAAA,MACjC;AAAA,IACD;AAEA,UAAM,gBAAgB;AACtB,OAAG,iBAAiB,UAAU,eAAe,EAAE,SAAS,MAAM;AAG9D,UAAM,EAAE,YAAY,UAAU,QAAA,IAAY,sBAAsB,GAAG,GAAG,cAAc,OAAO;AAC3F,UAAM,aAAa;AACnB,UAAM,WAAW;AACjB,uBAAmB,WAAW,OAAO,OAAO;AAG5C,QAAI,OAAO,mBAAmB,aAAa;AAC1C,YAAM,iBAAiB,IAAI,eAAe,MAAM;AAE/C,sBAAc,IAAI,MAAM,QAAQ,CAAC;AAAA,MAClC,CAAC;AACD,qBAAe,QAAQ,EAAE;AACzB,YAAM,iBAAiB;AAAA,IACxB;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;;AACpB,UAAM,QAA2B,GAAW;AAE5C,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAa1C,mBAAiB,QAAQ,KAAK;AACjD,UAAM,UAAU;AAGhB,QAAI,MAAM,WAAW;AACpB,YAAM,UAAU,MAAM,SAAS,GAAG,qBAAqB,UAAU,CAAC;AAAA,IACnE;AAGA,UAAM,YAAY,GAAG;AACrB,UAAM,kBAAkB,GAAG;AAC3B,UAAM,EAAE,YAAY,UAAU,QAAA,IAAY;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAED,UAAM,aAAa;AACnB,UAAM,WAAW;AAEjB,UAAM,aAAY,WAAM,cAAN,mBAAiB,cAAc;AACjD,QAAI,WAAW;AACd,yBAAmB,WAAW,OAAO,OAAO;AAAA,IAC7C;AAAA,EACD;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAuC,GAAW;AAExD,QAAI,CAAC,MAAO;AAEZ,QAAI,MAAM,eAAe;AACxB,SAAG,oBAAoB,UAAU,MAAM,aAAa;AAAA,IACrD;AAEA,QAAI,MAAM,gBAAgB;AACzB,YAAM,eAAe,WAAA;AAAA,IACtB;AAEA,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AAKD,SAAS,mBACR,WACA,OACA,SACO;AACP,QAAM,EAAE,SAAS,YAAY,SAAA,IAAa;AAG1C,YAAU,MAAM,YAAY,cAAc,OAAO;AAGjD,YAAU,YAAY;AAGtB,WAAS,IAAI,YAAY,IAAI,UAAU,KAAK;AAC3C,UAAM,OAAO,QAAQ,MAAM,CAAC;AAC5B,QAAI,SAAS,QAAW;AACvB,YAAM,SAAS,kBAAkB,MAAM,GAAG,OAAO;AACjD,gBAAU,YAAY,MAAM;AAAA,IAC7B;AAAA,EACD;AACD;AClWA,SAASA,mBAAiB,SAAqD;AAC9E,MAAI,OAAO,YAAY,WAAW;AACjC,WAAO,EAAE,SAAS,QAAA;AAAA,EACnB;AAEA,SAAO;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,WAAW;AAAA,KACR;AAEL;AAcO,MAAM,WAAW,gBAA6C;AAAA,EACpE,MAAM;AAAA,EACN,KAAK;AAAA;AAAA,EACL,UAAU;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,IACV,WAAW;AAAA,EAAA;AAAA,EAGZ,QAAQ,IAAI,SAAS;;AACpB,QAAI,CAAC,YAAa;AAElB,UAAM,UAAUA,mBAAiB,QAAQ,KAAK;AAG9C,UAAM,kBAAkB,GAAG,MAAM;AACjC,UAAM,qBAAqB,GAAG,MAAM;AAEpC,UAAM,QAAsB;AAAA,MAC3B;AAAA,MACA,YAAW,aAAQ,YAAR,YAAmB;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,sBAAsB,CAAC,MAAuB;AAE7C,YAAI,EAAE,iBAAiB,aAAa,EAAE,iBAAiB,cAAc;AACpE,aAAG,cAAc,IAAI,YAAY,0BAA0B;AAAA,YAC1D,QAAQ,EAAE,WAAW,MAAM,UAAA;AAAA,UAAU,CACrC,CAAC;AAAA,QACH;AAAA,MACD;AAAA,IAAA;AAIC,OAAW,YAAY;AAGzB,OAAG,IAAI,iBAAiB,MAAM,oBAA0C;AAGxE,oBAAgB,IAAI,QAAO,aAAQ,YAAR,YAAmB,IAAI;AAAA,EACnD;AAAA,EAEA,QAAQ,IAAI,SAAS;;AACpB,UAAM,QAAuB,GAAW;AAExC,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAaA,mBAAiB,QAAQ,KAAK;AAGjD,QAAI;AAEJ,QAAI,OAAO,QAAQ,UAAU,WAAW;AACvC,sBAAgB,QAAQ;AAAA,IACzB,OAAO;AACN,uBAAgB,gBAAW,YAAX,YAAsB;AAAA,IACvC;AAGA,QAAI,MAAM,cAAc,eAAe;AACtC,sBAAgB,IAAI,OAAO,aAAa;AAAA,IACzC;AAEA,UAAM,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAuB,GAAW;AAExC,QAAI,CAAC,MAAO;AAGZ,QAAI,IAAI,iBAAiB,MAAM,oBAA0C;AAGzE,OAAG,MAAM,UAAU,MAAM;AACzB,OAAG,MAAM,aAAa,MAAM;AAE5B,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AAKD,SAAS,gBAAgB,IAAiB,OAAqB,WAA0B;AACxF,QAAM,qBAAqB,MAAM;AAEjC,QAAM,YAAY;AAGlB,MAAI,WAAW;AACd,OAAG,UAAU,OAAO,UAAU;AAC9B,OAAG,UAAU,IAAI,WAAW;AAAA,EAC7B,OAAO;AACN,OAAG,UAAU,OAAO,WAAW;AAC/B,OAAG,UAAU,IAAI,UAAU;AAAA,EAC5B;AAEA,MAAI,MAAM,QAAQ,WAAW;AAE5B,QAAI,WAAW;AAEd,SAAG,MAAM,aAAa,MAAM,sBAAsB;AAAA,IACnD,OAAO;AAEN,YAAM,gBAAgB,iBAAiB,EAAE;AACzC,YAAM,gBAAgB,cAAc,uBAAuB;AAE3D,UAAI,eAAe;AAElB,cAAM,sBAAsB,CAAC,MAA6B;AACzD,cAAI,EAAE,WAAW,OAAO,EAAE,iBAAiB,aAAa,EAAE,iBAAiB,cAAc;AACxF,gBAAI,CAAC,MAAM,WAAW;AACrB,iBAAG,MAAM,aAAa;AAAA,YACvB;AACA,eAAG,oBAAoB,iBAAiB,mBAAmB;AAAA,UAC5D;AAAA,QACD;AAEA,WAAG,iBAAiB,iBAAiB,mBAAmB;AAAA,MACzD,OAAO;AACN,WAAG,MAAM,aAAa;AAAA,MACvB;AAAA,IACD;AAAA,EACD,OAAO;AAEN,OAAG,MAAM,UAAU,YAAY,MAAM,kBAAkB;AAAA,EACxD;AAGA,KAAG,cAAc,IAAI,YAAY,kBAAkB;AAAA,IAClD,QAAQ,EAAE,WAAW,mBAAA;AAAA,EAAmB,CACxC,CAAC;AAGF,MAAI,MAAM,QAAQ,WAAW,uBAAuB,WAAW;AAC9D,UAAM,QAAQ,QAAQ,SAAS;AAAA,EAChC;AACD;AC3HA,SAAS4C,wBAAsB,SAA8C;;AAC5E,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,QAAM,MAAM,OAAO,WAAW,IAAI;AAElC,MAAI,CAAC,KAAK;AACT,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACvE;AAEA,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,UAAS,aAAQ,WAAR,YAAkB;AAEjC,SAAO,QAAQ;AACf,SAAO,SAAS;AAEhB,MAAI,OAAO,GAAG,UAAU,IAAI,QAAQ,MAAM,UAAU;AACpD,MAAI,YAAY;AAChB,MAAI,YAAY;AAChB,MAAI,eAAe;AAGnB,MAAI,UAAU,QAAQ,GAAG,SAAS,CAAC;AACnC,MAAI,OAAQ,SAAS,KAAK,KAAM,GAAG;AAGnC,QAAM,UAAU,MAAM,QAAQ,QAAQ,OAAO,IAAI,QAAQ,UAAU,CAAC,QAAQ,OAAO;AACnF,QAAM,aAAa,WAAW;AAC9B,QAAM,SAAS,GAAG,QAAQ,SAAS,KAAK,cAAc;AAEtD,UAAQ,QAAQ,CAAC,MAAM,UAAU;AAChC,QAAI,SAAS,MAAM,GAAG,SAAS,QAAQ,UAAU;AAAA,EAClD,CAAC;AAED,SAAO;AACR;AAKA,SAAS,uBAAuB,QAA2B,SAA2C;;AACrG,QAAM,MAAM,MAAM,QAAQ,QAAQ,GAAG,IAAI,QAAQ,MAAM,CAAC,QAAQ,OAAO,KAAK,QAAQ,OAAO,GAAG;AAC9F,QAAM,UAAS,aAAQ,WAAR,YAAkB;AAEjC,QAAM,KAAK,SAAS,cAAc,KAAK;AACvC,KAAG,YAAY;AACf,KAAG,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAOP,MAAM;AAAA,2BACQ,OAAO,WAAW;AAAA;AAAA,yBAEpB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC;AAAA,qBAC9B,OAAO,QAAQ,IAAI,CAAC,CAAC,MAAM,OAAO,SAAS,IAAI,CAAC,CAAC;AAAA;AAGrE,SAAO;AACR;AAKA,SAAS,iBAAiB,SAA6C;;AACtE,MAAI,OAAO,YAAY,UAAU;AAChC,WAAO,EAAE,SAAS,QAAA;AAAA,EACnB;AAEA,SAAO;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,QAAO,aAAQ,UAAR,YAAiB;AAAA,IACxB,SAAQ,aAAQ,WAAR,YAAkB;AAAA,IAC1B,SAAQ,aAAQ,WAAR,YAAkB;AAAA,IAC1B,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,aAAY,aAAQ,eAAR,YAAsB;AAAA,IAClC,aAAY,aAAQ,eAAR,YAAsB;AAAA,IAClC,QAAO,aAAQ,UAAR,YAAiB;AAAA,IACxB,MAAK,aAAQ,QAAR,YAAe,CAAC,KAAK,GAAG;AAAA,IAC7B,SAAQ,aAAQ,WAAR,YAAkB;AAAA,IAC1B,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,UAAS,aAAQ,YAAR,YAAmB;AAAA,EAAA;AAE9B;AA+BO,MAAM,aAAa,gBAA+C;AAAA,EACxE,MAAM;AAAA,EACN,KAAK;AAAA,EAEL,QAAQ,IAAI,SAAS;AACpB,UAAM,UAAU,iBAAiB,QAAQ,KAAK;AAG9C,UAAM,gBAAgB,iBAAiB,EAAE;AACzC,QAAI,cAAc,aAAa,UAAU;AACxC,SAAG,MAAM,WAAW;AAAA,IACrB;AAEA,UAAM,QAAwB;AAAA,MAC7B;AAAA,MACA,aAAa;AAAA,MACb,UAAU;AAAA,MACV,QAAQ;AAAA,IAAA;AAGP,OAAW,cAAc;AAE3B,QAAI,CAAC,QAAQ,UAAU;AACtB,qBAAe,IAAI,KAAK;AAAA,IACzB;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,SAAS;AACpB,UAAM,QAAyB,GAAW;AAE1C,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAa,iBAAiB,QAAQ,KAAK;AAGjD,QAAI,WAAW,YAAY,CAAC,MAAM,QAAQ,UAAU;AAEnD,sBAAgB,KAAK;AAAA,IACtB,WAAW,CAAC,WAAW,YAAY,MAAM,QAAQ,UAAU;AAE1D,YAAM,UAAU;AAChB,qBAAe,IAAI,KAAK;AAAA,IACzB,WAAW,CAAC,WAAW,UAAU;AAEhC,YAAM,UAAU;AAChB,sBAAgB,KAAK;AACrB,qBAAe,IAAI,KAAK;AAAA,IACzB;AAEA,UAAM,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU,IAAI;AACb,UAAM,QAAqC,GAAW;AAEtD,QAAI,CAAC,MAAO;AAEZ,oBAAgB,KAAK;AAErB,WAAQ,GAAW;AAAA,EACpB;AACD,CAAC;AAKD,SAAS,eAAe,IAAiB,OAA6B;AACrE,QAAM,UAAU,MAAM;AAGtB,QAAM,SAASA,wBAAsB,OAAO;AAG5C,QAAM,cAAc,uBAAuB,MAAM,QAAQ,OAAO;AAGhE,KAAG,YAAY,MAAM,WAAW;AAGhC,MAAI,QAAQ,SAAS;AACpB,oBAAgB,IAAI,KAAK;AAAA,EAC1B;AACD;AAKA,SAAS,gBAAgB,OAA6B;AAErD,MAAI,MAAM,UAAU;AACnB,UAAM,SAAS,WAAA;AACf,UAAM,WAAW;AAAA,EAClB;AAGA,MAAI,MAAM,eAAe,MAAM,YAAY,YAAY;AACtD,UAAM,YAAY,WAAW,YAAY,MAAM,WAAW;AAAA,EAC3D;AAEA,QAAM,cAAc;AACpB,QAAM,SAAS;AAChB;AAKA,SAAS,gBAAgB,IAAiB,OAA6B;AACtE,MAAI,OAAO,qBAAqB,YAAa;AAE7C,QAAM,WAAW,IAAI,iBAAiB,CAAA,cAAa;AAElD,QAAI,CAAC,MAAM,eAAe,CAAC,GAAG,SAAS,MAAM,WAAW,GAAG;AAE1D,UAAI,CAAC,MAAM,QAAQ,UAAU;AAC5B,cAAM,SAASA,wBAAsB,MAAM,OAAO;AAClD,cAAM,cAAc,uBAAuB,MAAM,QAAQ,MAAM,OAAO;AACtE,WAAG,YAAY,MAAM,WAAW;AAAA,MACjC;AAAA,IACD;AAGA,eAAW,YAAY,WAAW;AACjC,UAAI,SAAS,SAAS,gBAAgB,SAAS,WAAW,MAAM,aAAa;AAE5E,cAAM,MAAM,MAAM,QAAQ,MAAM,QAAQ,GAAG,IAAI,MAAM,QAAQ,MAAM,CAAC,MAAM,QAAQ,OAAO,KAAK,MAAM,QAAQ,OAAO,GAAG;AAEtH,cAAM,YAAY,MAAM,UAAU;AAClC,cAAM,YAAY,MAAM,aAAa;AACrC,cAAM,YAAY,MAAM,UAAU;AAClC,YAAI,MAAM,QAAQ;AACjB,gBAAM,YAAY,MAAM,kBAAkB,QAAQ,MAAM,OAAO,WAAW;AAAA,QAC3E;AACA,cAAM,YAAY,MAAM,iBAAiB,GAAG,MAAM,OAAQ,QAAQ,IAAI,CAAC,CAAC,MAAM,MAAM,OAAQ,SAAS,IAAI,CAAC,CAAC;AAAA,MAC5G;AAAA,IACD;AAAA,EACD,CAAC;AAED,QAAM,SAAS,QAAQ,IAAI;AAAA,IAC1B,WAAW;AAAA,IACX,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,iBAAiB,CAAC,SAAS,SAAS,QAAQ;AAAA,EAAA,CAC5C;AACF;AC7TA,MAAM,qBAAqB;AAAA,EAC1B;AAAA,EAAK;AAAA,EAAM;AAAA,EACX;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAO;AAAA,EAC3B;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAQ;AAAA,EAC1B;AAAA,EAAM;AAAA,EAAM;AAAA,EAAQ;AACrB;AAKA,SAAS,eAAe,MAAsB;AAC7C,MAAI,CAAC,KAAM,QAAO;AAElB,SAAO,KAAK,OAAO,CAAC,EAAE,gBAAgB,KAAK,MAAM,CAAC,EAAE,YAAA;AACrD;AAKA,SAAS,eACR,MACA,UAAqD,IAC5C;AACT,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,EAAE,QAAQ,MAAM,YAAY,uBAAuB;AAEzD,MAAI,OAAO;AAEV,UAAM,QAAQ,KAAK,YAAA,EAAc,MAAM,KAAK;AAE5C,WAAO,MACL,IAAI,CAAC,MAAM,UAAU;AAErB,UAAI,UAAU,GAAG;AAChB,eAAO,eAAe,IAAI;AAAA,MAC3B;AAEA,UAAI,UAAU,SAAS,KAAK,YAAA,CAAa,GAAG;AAC3C,eAAO,KAAK,YAAA;AAAA,MACb;AAEA,aAAO,eAAe,IAAI;AAAA,IAC3B,CAAC,EACA,KAAK,GAAG;AAAA,EACX,OAAO;AAEN,WAAO,eAAe,IAAI;AAAA,EAC3B;AACD;AA4BO,SAAS,eAAe,SAAsD;AACpF,QAAM;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,YAAY;AAAA,EAAA,IACT;AAGJ,QAAM,WAAW,IAAI,MAAM,IAAI,CAAC;AAChC,QAAM,cAAc,IAAI,EAAE;AAK1B,WAAS,YAAkB;AAC1B,UAAM,YAAY,MAAM,IAAI;AAC5B,UAAM,aAAa,MAAM,KAAK;AAC9B,UAAM,iBAAiB,MAAM,SAAS;AAEtC,aAAS,QAAQ;AACjB,gBAAY,QAAQ,eAAe,WAAW;AAAA,MAC7C,OAAO;AAAA,MACP,WAAW;AAAA,IAAA,CACX;AAAA,EACF;AAGA;AAAA,IACC,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC;AAAA,IAClD,MAAM,UAAA;AAAA,IACN,EAAE,WAAW,KAAA;AAAA,EAAK;AAGnB,SAAO;AAAA,IACN;AAAA,IACA;AAAA,EAAA;AAEF;AAwCO,SAAS,kBACf,UAAqD,IAC1B;AAC3B,SAAO,CAAC,SAAiB,eAAe,MAAM,OAAO;AACtD;ACvHO,SAAS,cAAc,SAAoD;AACjF,QAAM;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,EAAA,IACR;AAGJ,QAAM,YAAY,IAAI,KAAK;AAG3B,MAAI,YAAkD;AAEtD,QAAM,WAAW,MAAc,MAAM,KAAK;AAC1C,QAAM,cAAc,MAAe,MAAM,QAAQ;AAKjD,WAAS,MAAM,OAAsC;AACpD,QAAI,YAAA,KAAiB,UAAU,OAAO;AACrC,YAAM,eAAA;AACN,YAAM,gBAAA;AACN;AAAA,IACD;AAGA,cAAU,QAAQ;AAGlB,YAAQ,KAAK;AAGb,gBAAY,WAAW,MAAM;AAC5B,gBAAU,QAAQ;AAClB,kBAAY;AAAA,IACb,GAAG,UAAU;AAAA,EACd;AAKA,WAAS,QAAc;AACtB,QAAI,WAAW;AACd,mBAAa,SAAS;AACtB,kBAAY;AAAA,IACb;AACA,cAAU,QAAQ;AAAA,EACnB;AAKA,WAAS,SAAe;AACvB,QAAI,WAAW;AACd,mBAAa,SAAS;AACtB,kBAAY;AAAA,IACb;AAAA,EACD;AAGA,cAAY,MAAM;AACjB,WAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;AAmBO,SAAS,mBACf,SACA,QAAgB,KAC2B;AAC3C,MAAI,YAAY;AAEhB,SAAO,CAAC,UAAmC;AAC1C,QAAI,WAAW;AACd,YAAM,eAAA;AACN,YAAM,gBAAA;AACN;AAAA,IACD;AAEA,gBAAY;AACZ,YAAQ,KAAK;AAEb,eAAW,MAAM;AAChB,kBAAY;AAAA,IACb,GAAG,KAAK;AAAA,EACT;AACD;AClIA,SAAS,aACR,IACA,OACA,SACU;AACV,QAAM,SAAS,MAAM;AAGrB,MAAI,GAAG,SAAS,MAAM,GAAG;AACxB,WAAO;AAAA,EACR;AAGA,MAAI,mCAAS,QAAQ;AACpB,eAAW,QAAQ,SAAS;AAC3B,YAAM,YAAY,OAAO,SAAS,aAAa,KAAA,IAAS,MAAM,IAAI;AAClE,YAAM,WAAW,OAAO,cAAc,WAAW,WAAW,SAAS,IAAI;AAEzE,UAAI,aAAa,aAAa,UAAU,SAAS,SAAS,MAAM,IAAI;AACnE,eAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AAEA,SAAO;AACR;AA0BO,SAAS,gBAAgB,SAAwD;AACvF,QAAM;AAAA,IACL;AAAA,IACA,UAAU,CAAA;AAAA,IACV,UAAU;AAAA,IACV,SAAS,CAAC,OAAO;AAAA,IACjB,OAAO;AAAA,IACP,UAAU;AAAA,EAAA,IACP;AAEJ,MAAI,iBAAqC;AACzC,QAAM,+BAAe,IAAA;AAErB,WAAS,mBAAmB,YAA4C;AACvE,WAAO,CAAC,UAAiB;AACxB,UAAI,CAAC,eAAgB;AAGrB,UAAI,CAAC,aAAa,gBAAgB,OAAO,OAAO,GAAG;AAClD;AAAA,MACD;AAGA,UAAI,MAAM;AACT,cAAM,gBAAA;AAAA,MACP;AAGA,UAAI,SAAS;AACZ,cAAM,eAAA;AAAA,MACP;AAGA,cAAQ,KAAgC;AAAA,IACzC;AAAA,EACD;AAEA,WAAS,KAAK,SAAkC;AAC/C,QAAI,CAAC,UAAA,EAAa,QAAO,MAAM;AAAA,IAAC;AAGhC,WAAA;AAEA,qBAAiB;AAGjB,WAAO,QAAQ,CAAA,cAAa;AAC3B,YAAM,eAAe,mBAA4B;AACjD,eAAS,IAAI,WAAW,YAAY;AAEpC,eAAS,iBAAiB,WAAW,cAAc;AAAA,QAClD;AAAA,QACA,SAAS,CAAC;AAAA,MAAA,CACV;AAAA,IACF,CAAC;AAGD,WAAO;AAAA,EACR;AAEA,WAAS,SAAe;AACvB,aAAS,QAAQ,CAAC,cAAc,cAAc;AAC7C,eAAS,oBAAoB,WAAW,cAAc,EAAE,SAAS;AAAA,IAClE,CAAC;AACD,aAAS,MAAA;AACT,qBAAiB;AAAA,EAClB;AAGA,cAAY,MAAM;AACjB,WAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN;AAAA,EAAA;AAEF;ACrLA,SAAe,gBAAgB,MAAgC;AAAA;AAE9D,QAAI,qBAAqB;AACxB,UAAI;AACH,cAAM,UAAU,UAAU,UAAU,IAAI;AACxC,eAAO;AAAA,MACR,SAAQ;AAEP,gBAAQ,KAAK,8DAA8D;AAAA,MAC5E;AAAA,IACD;AAGA,WAAO,oBAAoB,IAAI;AAAA,EAChC;AAAA;AAKA,SAAS,oBAAoB,MAAuB;AACnD,MAAI,CAAC,UAAA,EAAa,QAAO;AAGzB,QAAM,WAAW,SAAS,cAAc,UAAU;AAClD,WAAS,QAAQ;AAGjB,WAAS,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQzB,WAAS,KAAK,YAAY,QAAQ;AAElC,MAAI;AAEH,aAAS,OAAA;AACT,aAAS,kBAAkB,GAAG,SAAS,MAAM,MAAM;AACnD,WAAO,SAAS,YAAY,MAAM;AAAA,EACnC,SAAQ;AACP,WAAO;AAAA,EACR,UAAA;AAEC,aAAS,KAAK,YAAY,QAAQ;AAAA,EACnC;AACD;AAmFO,SAAS,QAAQ,UAA0B,IAAmB;AACpE,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,EAAA,IACb;AAEJ,QAAM,SAAS,IAAI,KAAK;AACxB,QAAM,QAAQ,IAAkB,IAAI;AACpC,QAAM,cAAc,kBAAA,KAAuB,UAAA;AAE3C,MAAI,YAAkD;AAEtD,WAAe,KAAK,MAAiC;AAAA;AAEpD,YAAM,QAAQ,sBAAQ,MAAM,MAAM;AAElC,UAAI,CAAC,OAAO;AACX,gBAAQ,KAAK,qCAAqC;AAClD,eAAO;AAAA,MACR;AAGA,UAAI,WAAW;AACd,qBAAa,SAAS;AACtB,oBAAY;AAAA,MACb;AAEA,YAAM,QAAQ;AAEd,UAAI;AACH,cAAM,UAAU,MAAM,gBAAgB,KAAK;AAE3C,YAAI,SAAS;AACZ,iBAAO,QAAQ;AACf,iDAAY;AAGZ,sBAAY,WAAW,MAAM;AAC5B,mBAAO,QAAQ;AACf,wBAAY;AAAA,UACb,GAAG,aAAa;AAEhB,iBAAO;AAAA,QACR,OAAO;AACN,gBAAM,IAAI,MAAM,aAAa;AAAA,QAC9B;AAAA,MACD,SAAS,KAAK;AACb,cAAM,YAAY;AAClB,cAAM,QAAQ;AACd,eAAO,QAAQ;AACf,2CAAU;AACV,eAAO;AAAA,MACR;AAAA,IACD;AAAA;AAEA,SAAO;AAAA,IACN;AAAA,IACA,QAAQ,SAAS,MAAM;AAAA,IACvB,OAAO,SAAS,KAAK;AAAA,IACrB;AAAA,EAAA;AAEF;AC3DA,SAAS,gBAAgB,QAAwC;AAChE,MAAI,kBAAkB,MAAM;AAC3B,WAAO,OAAO,QAAA;AAAA,EACf;AAEA,MAAI,OAAO,WAAW,UAAU;AAC/B,WAAO;AAAA,EACR;AAEA,SAAO,IAAI,KAAK,MAAM,EAAE,QAAA;AACzB;AAKA,SAAS,cAAc,WAAkC;AACxD,QAAM,QAAQ,KAAK,IAAI,GAAG,SAAS;AAEnC,SAAO;AAAA,IACN,MAAM,KAAK,MAAM,SAAS,MAAO,KAAK,KAAK,GAAG;AAAA,IAC9C,OAAO,KAAK,MAAO,SAAS,MAAO,KAAK,KAAK,OAAQ,MAAO,KAAK,GAAG;AAAA,IACpE,SAAS,KAAK,MAAO,SAAS,MAAO,KAAK,OAAQ,MAAO,GAAG;AAAA,IAC5D,SAAS,KAAK,MAAO,SAAS,MAAO,MAAO,GAAI;AAAA,IAChD,cAAc,QAAQ;AAAA,IACtB;AAAA,EAAA;AAEF;AAKA,SAAS,WAAW,MAAqB,QAAkD;AAC1F,MAAI,OAAO,WAAW,YAAY;AACjC,WAAO,OAAO,IAAI;AAAA,EACnB;AAEA,QAAM,MAAM,CAAC,GAAW,MAAM,MAAc,OAAO,CAAC,EAAE,SAAS,KAAK,GAAG;AAGvE,QAAM,SAAS,OACb,QAAQ,QAAQ,IAAI,KAAK,IAAI,CAAC,EAC9B,QAAQ,QAAQ,IAAI,KAAK,KAAK,CAAC,EAC/B,QAAQ,QAAQ,IAAI,KAAK,OAAO,CAAC,EACjC,QAAQ,QAAQ,IAAI,KAAK,OAAO,CAAC,EACjC,QAAQ,UAAU,IAAI,KAAK,cAAc,CAAC,CAAC,EAC3C,QAAQ,QAAQ,IAAI,KAAK,MAAM,KAAK,eAAe,EAAE,CAAC,CAAC,EACvD,QAAQ,OAAO,OAAO,KAAK,MAAM,KAAK,eAAe,GAAG,CAAC,CAAC;AAE5D,SAAO;AACR;AA+BO,SAAS,aAAa,SAAkD;AAC9E,QAAM;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,YAAY;AAAA,EAAA,IACT;AAGJ,QAAM,OAAO,IAAmB,cAAc,CAAC,CAAC;AAChD,QAAM,YAAY,IAAY,EAAE;AAChC,QAAM,UAAU,IAAI,KAAK;AACzB,QAAM,SAAS,IAAI,KAAK;AACxB,QAAM,YAAY,IAAI,KAAK;AAG3B,MAAI,aAAoD,MACvD,aAAa,GACb,sBAAsB;AAEvB,QAAM,cAAc,MAAc,MAAM,QAAQ;AAChD,QAAM,YAAY,MAAwC,MAAM,MAAM;AAKtE,WAAS,SAAe;AACvB,UAAM,MAAM,KAAK,IAAA;AACjB,UAAM,YAAY,aAAa;AAE/B,QAAI,aAAa,GAAG;AACnB,WAAK,QAAQ,cAAc,CAAC;AAC5B,gBAAU,QAAQ,WAAW,KAAK,OAAO,WAAW;AACpD,gBAAU,QAAQ;AAClB,cAAQ,QAAQ;AAChB,WAAA;AAEA,UAAI,YAAY;AACf,mBAAA;AAAA,MACD;AACA;AAAA,IACD;AAEA,SAAK,QAAQ,cAAc,SAAS;AACpC,cAAU,QAAQ,WAAW,KAAK,OAAO,WAAW;AAEpD,QAAI,QAAQ;AACX,aAAO,KAAK,KAAK;AAAA,IAClB;AAAA,EACD;AAKA,WAAS,QAAc;AACtB,QAAI,QAAQ,MAAO;AAGnB,iBAAa,gBAAgB,MAAM,MAAM,CAAC;AAC1C,YAAQ,QAAQ;AAChB,WAAO,QAAQ;AACf,cAAU,QAAQ;AAGlB,WAAA;AAGA,iBAAa,YAAY,QAAQ,aAAa;AAAA,EAC/C;AAKA,WAAS,OAAa;AACrB,QAAI,YAAY;AACf,oBAAc,UAAU;AACxB,mBAAa;AAAA,IACd;AACA,YAAQ,QAAQ;AAAA,EACjB;AAKA,WAAS,QAAc;AACtB,QAAI,CAAC,QAAQ,MAAO;AAEpB,0BAAsB,aAAa,KAAK,IAAA;AACxC,SAAA;AACA,WAAO,QAAQ;AAAA,EAChB;AAKA,WAAS,SAAe;AACvB,QAAI,QAAQ,SAAS,CAAC,OAAO,MAAO;AAGpC,iBAAa,KAAK,QAAQ;AAC1B,YAAQ,QAAQ;AAChB,WAAO,QAAQ;AAGf,WAAA;AAGA,iBAAa,YAAY,QAAQ,aAAa;AAAA,EAC/C;AAKA,WAAS,QAAc;AACtB,SAAA;AACA,WAAO,QAAQ;AACf,cAAU,QAAQ;AAClB,0BAAsB;AACtB,SAAK,QAAQ,cAAc,CAAC;AAC5B,cAAU,QAAQ,WAAW,KAAK,OAAO,WAAW;AAAA,EACrD;AAGA;AAAA,IACC,MAAM,MAAM,MAAM;AAAA,IAClB,CAAA,cAAa;AACZ,UAAI,QAAQ,OAAO;AAClB,qBAAa,gBAAgB,SAAS;AAAA,MACvC;AAAA,IACD;AAAA,EAAA;AAID,MAAI,MAAM,SAAS,GAAG;AACrB,UAAA;AAAA,EACD;AAGA,cAAY,MAAM;AACjB,SAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;AC5QO,SAAS,YACf,SACuB;AACvB,QAAM;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,EAAA,IACR;AAGJ,MAAI,UAAgD,MACnD,WAAiC,MACjC,WAAgB;AAEjB,QAAM,aAAa,MAAY;AAC9B,QAAI,UAAU;AACb,cAAQ,MAAM,UAAU,QAAQ;AAChC,iBAAW;AACX,iBAAW;AAAA,IACZ;AAAA,EACD;AAEA,QAAM,UAAU,MAAc,MAAM,IAAI;AACxC,QAAM,aAAa,MAAe,MAAM,OAAO;AAC/C,QAAM,cAAc,MAAe,MAAM,QAAQ;AAEjD,WAAS,OAAkB,MAA2B;AACrD,eAAW;AAEX,eAAW;AAEX,QAAI,SAAS;AACZ,mBAAa,OAAO;AAAA,IACrB;AAEA,QAAI,WAAA,KAAgB,CAAC,SAAS;AAC7B,iBAAA;AAAA,IACD;AAEA,cAAU,WAAW,MAAM;AAC1B,UAAI,eAAe;AAClB,mBAAA;AAAA,MACD;AACA,gBAAU;AAAA,IACX,GAAG,SAAS;AAAA,EACb;AAEA,WAAS,SAAe;AACvB,QAAI,SAAS;AACZ,mBAAa,OAAO;AACpB,gBAAU;AAAA,IACX;AACA,eAAW;AACX,eAAW;AAAA,EACZ;AAEA,WAAS,QAAc;AACtB,QAAI,SAAS;AACZ,mBAAa,OAAO;AACpB,iBAAA;AACA,gBAAU;AAAA,IACX;AAAA,EACD;AAEA,WAAS,UAAmB;AAC3B,WAAO,YAAY;AAAA,EACpB;AAGA,cAAY,MAAM;AACjB,WAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;AAuBO,SAAS,WACf,IACA,OAAe,KACf,SAIiC;AACjC,SAAO,SAAS,IAAI,MAAM,OAAO;AAClC;ACpIA,SAAS,YAAY,UAA8E;;AAClG,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,OAAO,aAAa,YAAY;AACnC,UAAM,aAAa,SAAA;AACnB,YAAO,8CAAY,4BAAZ,YAAuC;AAAA,EAC/C;AAEA,MAAI,OAAO,aAAa,UAAU;AACjC,UAAM,aAAa,SAAS,cAAc,QAAQ;AAClD,YAAO,8CAAY,4BAAZ,YAAuC;AAAA,EAC/C;AAEA,SAAO,SAAS,sBAAA;AACjB;AAKA,SAAS,gBAAgB,GAAkE;AAC1F,MAAI,EAAE,KAAK,WAAW,OAAO,GAAG;AAC/B,UAAM,QAAS,EAAiB,QAAQ,CAAC,KAAM,EAAiB,eAAe,CAAC;AAChF,WAAO,EAAE,SAAS,MAAM,SAAS,SAAS,MAAM,QAAA;AAAA,EACjD;AACA,QAAM,aAAa;AACnB,SAAO,EAAE,SAAS,WAAW,SAAS,SAAS,WAAW,QAAA;AAC3D;AAKA,SAAS,eAAe,WAA6B;AACpD,QAAM,QAAQ,UAAU,MAAM,yCAAyC;AACvE,MAAI,OAAO;AACV,WAAO,EAAE,GAAG,WAAW,MAAM,CAAC,CAAC,GAAG,GAAG,WAAW,MAAM,CAAC,CAAC,EAAA;AAAA,EACzD;AACA,SAAO,EAAE,GAAG,GAAG,GAAG,EAAA;AACnB;AA8BO,SAAS,aAAa,UAA+B,IAAwB;AACnF,QAAM;AAAA,IACL,OAAO;AAAA,IACP,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACG;AAEJ,QAAM,WAAW,IAAc,EAAE,GAAG,GAAG,GAAG,GAAG;AAC7C,QAAM,aAAa,IAAI,KAAK;AAE5B,MAAI,iBAAqC,MACxC,WAA+B,MAC/B,SAAS,GACT,SAAS,GACT,UAAU,GACV,UAAU,GACV,cAAc,GACd,aAAa,GACb,gBAAgB,GAChB,iBAAiB,GACjB,UAAU,GACV,WAAW;AAEZ,WAAS,UAAU,GAAkC;;AACpD,QAAI,MAAM,QAAQ,EAAG;AAErB,MAAE,eAAA;AAEF,UAAM,EAAE,SAAS,YAAY,gBAAgB,CAAC;AAC9C,eAAW,QAAQ;AACnB,aAAS;AACT,aAAS;AAGT,UAAM,EAAE,GAAG,EAAA,IAAM,eAAe,eAAgB,MAAM,SAAS;AAC/D,cAAU;AACV,cAAU;AAGV,QAAI,MAAM,SAAS,KAAK,UAAU;AACjC,YAAM,eAAe,WAAW,YAAY,QAAQ,KAAI,oBAAgB,kBAAhB,mBAA+B;AAEvF,UAAI,cAAc;AACjB,cAAM,SAAS,eAAgB,sBAAA;AAC/B,sBAAc,OAAO,OAAO,aAAa;AACzC,qBAAa,OAAO,MAAM,aAAa;AACvC,wBAAgB,aAAa;AAC7B,yBAAiB,aAAa;AAC9B,kBAAU,OAAO;AACjB,mBAAW,OAAO;AAAA,MACnB;AAAA,IACD;AAEA,mBAAgB,UAAU,IAAI,uBAAuB;AAErD,aAAS,iBAAiB,aAAa,UAAU;AACjD,aAAS,iBAAiB,WAAW,OAAO;AAC5C,aAAS,iBAAiB,aAAa,YAAY,EAAE,SAAS,OAAO;AACrE,aAAS,iBAAiB,YAAY,OAAO;AAE7C,uCAAU,EAAE,GAAG,SAAS,GAAG,QAAA,GAAW;AAAA,EACvC;AAEA,WAAS,WAAW,GAAkC;AACrD,QAAI,CAAC,WAAW,SAAS,MAAM,QAAQ,EAAG;AAE1C,MAAE,eAAA;AAEF,UAAM,EAAE,SAAS,YAAY,gBAAgB,CAAC;AAC9C,QAAI,SAAS,UAAU,QACtB,SAAS,UAAU,QACnB,OAAO,UAAU,QACjB,OAAO,UAAU;AAGlB,UAAM,cAAc,MAAM,IAAI;AAC9B,QAAI,gBAAgB,KAAK;AACxB,eAAS;AAAA,IACV,WAAW,gBAAgB,KAAK;AAC/B,eAAS;AAAA,IACV;AAGA,UAAM,cAAc,MAAM,IAAI;AAC9B,QAAI,aAAa;AAChB,eAAS,KAAK,MAAM,SAAS,YAAY,CAAC,CAAC,IAAI,YAAY,CAAC;AAC5D,eAAS,KAAK,MAAM,SAAS,YAAY,CAAC,CAAC,IAAI,YAAY,CAAC;AAAA,IAC7D;AAGA,QAAI,MAAM,SAAS,KAAK,UAAU;AACjC,YAAM,UAAU,cAAc;AAC9B,YAAM,SAAS,aAAa;AAC5B,YAAM,UAAU,gBAAgB;AAChC,YAAM,SAAS,iBAAiB;AAEhC,YAAM,kBAAkB,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,OAAO,CAAC;AAC9D,YAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,MAAM,CAAC;AAE3D,aAAO,WAAW,kBAAkB;AACpC,aAAO,WAAW,iBAAiB;AAAA,IACpC;AAEA,mBAAgB,MAAM,YAAY,aAAa,IAAI,OAAO,IAAI;AAC9D,aAAS,QAAQ,EAAE,GAAG,MAAM,GAAG,KAAA;AAE/B,qCAAS,EAAE,GAAG,MAAM,GAAG,KAAA,GAAQ;AAAA,EAChC;AAEA,WAAS,QAAQ,GAAkC;AAClD,QAAI,CAAC,WAAW,MAAO;AAEvB,eAAW,QAAQ;AACnB,qDAAgB,UAAU,OAAO;AAEjC,aAAS,oBAAoB,aAAa,UAAU;AACpD,aAAS,oBAAoB,WAAW,OAAO;AAC/C,aAAS,oBAAoB,aAAa,UAAU;AACpD,aAAS,oBAAoB,YAAY,OAAO;AAEhD,mCAAQ,mBAAK,SAAS,QAAS;AAAA,EAChC;AAEA,WAAS,QAAc;AACtB,QAAI,gBAAgB;AACnB,qBAAe,MAAM,YAAY;AACjC,eAAS,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,IAC7B;AAAA,EACD;AAEA,WAAS,KAAK,SAAkC;AAC/C,QAAI,CAAC,UAAA,EAAa,QAAO,MAAM;AAAA,IAAC;AAGhC,WAAA;AAEA,qBAAiB;AAGjB,QAAI,iBAAiB,OAAO,EAAE,aAAa,UAAU;AACpD,cAAQ,MAAM,WAAW;AAAA,IAC1B;AAGA,eAAW,SAAS,QAAQ,cAAc,MAAM,IAAI;AACpD,UAAM,SAAS,YAAY;AAE3B,WAAO,iBAAiB,aAAa,SAAS;AAC9C,WAAO,iBAAiB,cAAc,WAAW,EAAE,SAAS,OAAO;AAEnE,WAAO;AAAA,EACR;AAEA,WAAS,SAAe;AACvB,QAAI,gBAAgB;AACnB,YAAM,SAAS,YAAY;AAC3B,aAAO,oBAAoB,aAAa,SAAS;AACjD,aAAO,oBAAoB,cAAc,SAAS;AAAA,IACnD;AACA,qBAAiB;AACjB,eAAW;AAAA,EACZ;AAGA,cAAY,MAAM;AACjB,WAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN,UAAU,SAAS,QAAQ;AAAA,IAC3B,YAAY,SAAS,UAAU;AAAA,IAC/B;AAAA,IACA;AAAA,EAAA;AAEF;ACjRA,SAAS,iBAAiB,MAAc,WAAmB,IAAI,aAAqB,cAAsB;AACzG,MAAI,OAAO,aAAa,YAAa,QAAO,KAAK,SAAS;AAE1D,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,QAAM,MAAM,OAAO,WAAW,IAAI;AAElC,MAAI,CAAC,IAAK,QAAO,KAAK,SAAS;AAE/B,MAAI,OAAO,GAAG,QAAQ,MAAM,UAAU;AACtC,SAAO,IAAI,YAAY,IAAI,EAAE;AAC9B;AAKA,SAAS,gBACR,MACA,UACA,WAAmB,OACnB,WAAmB,IACnB,aAAqB,cACZ;AACT,MAAI,YAAY,EAAG,QAAO;AAE1B,QAAM,YAAY,iBAAiB,MAAM,UAAU,UAAU;AAE7D,MAAI,aAAa,SAAU,QAAO;AAElC,QAAM,gBAAgB,iBAAiB,UAAU,UAAU,UAAU;AACrE,QAAM,iBAAiB,WAAW;AAElC,MAAI,kBAAkB,EAAG,QAAO;AAGhC,MAAI,MAAM,GACT,OAAO,KAAK;AAEb,SAAO,MAAM,MAAM;AAClB,UAAM,MAAM,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAC3C,UAAM,gBAAgB,KAAK,MAAM,GAAG,GAAG;AACvC,UAAM,iBAAiB,iBAAiB,eAAe,UAAU,UAAU;AAE3E,QAAI,kBAAkB,gBAAgB;AACrC,YAAM;AAAA,IACP,OAAO;AACN,aAAO,MAAM;AAAA,IACd;AAAA,EACD;AAEA,SAAO,KAAK,MAAM,GAAG,GAAG,IAAI;AAC7B;AAMA,SAAS,gBACR,MACA,OACA,WAAmB,OACV;AACT,MAAI,SAAS,EAAG,QAAO;AAIvB,QAAM,kBAAkB;AACxB,QAAM,WAAW,QAAQ;AAEzB,MAAI,KAAK,UAAU,SAAU,QAAO;AAEpC,SAAO,KAAK,MAAM,GAAG,WAAW,SAAS,MAAM,IAAI;AACpD;AA8BO,SAAS,YAAY,SAAgD;AAC3E,QAAM;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,WAAW;AAAA,EAAA,IACR;AAGJ,QAAM,WAAW,IAAI,MAAM,IAAI,CAAC;AAChC,QAAM,YAAY,IAAI,EAAE;AACxB,QAAM,cAAc,IAAI,KAAK;AAK7B,WAAS,YAAkB;AAC1B,UAAM,YAAY,MAAM,IAAI;AAC5B,UAAM,aAAa,MAAM,KAAK;AAC9B,UAAM,gBAAgB,MAAM,QAAQ;AACpC,UAAM,gBAAgB,MAAM,QAAQ;AAEpC,aAAS,QAAQ;AAEjB,QAAI,CAAC,WAAW;AACf,gBAAU,QAAQ;AAClB,kBAAY,QAAQ;AACpB;AAAA,IACD;AAEA,QAAI,gBAAgB,GAAG;AAEtB,YAAM,SAAS,gBAAgB,WAAW,eAAe,aAAa;AACtE,gBAAU,QAAQ;AAClB,kBAAY,QAAQ,WAAW;AAAA,IAChC,WAAW,aAAa,GAAG;AAE1B,YAAM,SAAS,gBAAgB,WAAW,YAAY,aAAa;AACnE,gBAAU,QAAQ;AAClB,kBAAY,QAAQ,WAAW;AAAA,IAChC,OAAO;AAEN,gBAAU,QAAQ;AAClB,kBAAY,QAAQ;AAAA,IACrB;AAAA,EACD;AAKA,WAAS,kBAAkB,OAAuB;AACjD,UAAM,YAAY,MAAM,IAAI;AAC5B,UAAM,gBAAgB,MAAM,QAAQ;AAEpC,QAAI,CAAC,aAAa,SAAS,UAAU,aAAa;AAElD,WAAO,gBAAgB,WAAW,OAAO,aAAa;AAAA,EACvD;AAKA,WAAS,cAAc,OAAwB;AAC9C,UAAM,YAAY,MAAM,IAAI;AAE5B,QAAI,CAAC,aAAa,SAAS,EAAG,QAAO;AAErC,UAAM,YAAY,iBAAiB,SAAS;AAC5C,WAAO,YAAY;AAAA,EACpB;AAGA;AAAA,IACC,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,KAAK,GAAG,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC;AAAA,IAClE,MAAM,UAAA;AAAA,IACN,EAAE,WAAW,KAAA;AAAA,EAAK;AAInB,cAAY,MAAM;AAAA,EAElB,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;AAkBO,SAAS,aACf,MACA,WACA,WAAmB,OACV;AACT,MAAI,CAAC,QAAQ,KAAK,UAAU,UAAW,QAAO;AAE9C,SAAO,KAAK,MAAM,GAAG,YAAY,SAAS,MAAM,IAAI;AACrD;AAUO,SAAS,kBACf,MACA,gBACA,WAAmB,IACT;AACV,SAAO,iBAAiB,MAAM,QAAQ,IAAI;AAC3C;ACrQA,MAAM,qCAAqB,IAAI,CAAC,SAAS,YAAY,UAAU,QAAQ,CAAC;AAKxE,SAAS,YAAY,IAA0B;AAC9C,MAAI,CAAC,UAAA,EAAa,QAAO;AAEzB,QAAM,UAAU,GAAG,QAAQ,YAAA;AAG3B,MAAI,eAAe,IAAI,OAAO,GAAG;AAChC,WAAO,CAAE,GAAwB;AAAA,EAClC;AAGA,MAAI,GAAG,kBAAmB,QAAO;AAGjC,QAAM,WAAW,GAAG,aAAa,UAAU;AAC3C,MAAI,YAAY,KAAM,QAAO,aAAa;AAG1C,MAAI,YAAY,OAAO,YAAY,QAAQ;AAC1C,WAAO,GAAG,aAAa,MAAM;AAAA,EAC9B;AAEA,SAAO;AACR;AAiCO,SAAS,SAAS,UAA2B,IAAoB;AACvE,QAAM,EAAE,SAAS,OAAA,IAAW;AAE5B,QAAM,YAAY,IAAI,KAAK;AAE3B,MAAI,iBAAqC,MACxC,eAAiD,MACjD,cAAgD;AAEjD,WAAS,QAAc;AACtB,QAAI,kBAAkB,YAAY,cAAc,GAAG;AAClD,qBAAe,MAAA;AAAA,IAChB;AAAA,EACD;AAEA,WAAS,OAAa;AACrB,QAAI,gBAAgB;AACnB,qBAAe,KAAA;AAAA,IAChB;AAAA,EACD;AAEA,WAAS,KAAK,SAAkC;AAC/C,QAAI,CAAC,UAAA,EAAa,QAAO,MAAM;AAAA,IAAC;AAGhC,WAAA;AAEA,qBAAiB;AAEjB,mBAAe,CAAC,MAAkB;AACjC,gBAAU,QAAQ;AAClB,yCAAU;AAAA,IACX;AAEA,kBAAc,CAAC,MAAkB;AAChC,gBAAU,QAAQ;AAClB,uCAAS;AAAA,IACV;AAEA,YAAQ,iBAAiB,SAAS,YAAY;AAC9C,YAAQ,iBAAiB,QAAQ,WAAW;AAG5C,cAAU,QAAQ,SAAS,kBAAkB;AAE7C,WAAO;AAAA,EACR;AAEA,WAAS,SAAe;AACvB,QAAI,gBAAgB;AACnB,UAAI,cAAc;AACjB,uBAAe,oBAAoB,SAAS,YAAY;AAAA,MACzD;AACA,UAAI,aAAa;AAChB,uBAAe,oBAAoB,QAAQ,WAAW;AAAA,MACvD;AAAA,IACD;AACA,qBAAiB;AACjB,mBAAe;AACf,kBAAc;AACd,cAAU,QAAQ;AAAA,EACnB;AAGA,cAAY,MAAM;AACjB,WAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN,WAAW,SAAS,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;ACpKA,MAAM,cAAsC;AAAA,EAC3C,KAAK;AAAA,EACL,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AACR;AAKA,MAAM,gCAAgB,IAAI,CAAC,QAAQ,OAAO,SAAS,MAAM,CAAC;AA8G1D,SAAS,YAAY,QAAyD;AAC7E,QAAM,QAAQ,OAAO,YAAA,EAAc,MAAM,GAAG,EAAE,IAAI,CAAA,MAAK,EAAE,KAAA,CAAM;AAC/D,QAAM,gCAAgB,IAAA;AACtB,MAAI,MAAM;AAEV,aAAW,QAAQ,OAAO;AACzB,QAAI,UAAU,IAAI,IAAI,GAAG;AACxB,gBAAU,IAAI,IAAI;AAAA,IACnB,OAAO;AACN,YAAM,YAAY,IAAI,KAAK;AAAA,IAC5B;AAAA,EACD;AAEA,SAAO,EAAE,KAAK,UAAA;AACf;AAKA,SAAS,cAAc,OAAsB,YAA8D;AAE1G,MAAI,WAAW,UAAU,IAAI,MAAM,OAAO,MAAM,WAAW,MAAM,SAAU,QAAO;AAClF,MAAI,WAAW,UAAU,IAAI,KAAK,MAAM,MAAM,OAAQ,QAAO;AAC7D,MAAI,WAAW,UAAU,IAAI,OAAO,MAAM,MAAM,SAAU,QAAO;AACjE,MAAI,WAAW,UAAU,IAAI,MAAM,MAAM,MAAM,QAAS,QAAO;AAG/D,QAAM,WAAW,MAAM;AACvB,QAAM,YAAY,WAAW;AAE7B,SAAO,SAAS,kBAAkB,UAAU,YAAA;AAC7C;AAyBO,SAAS,UAAU,UAA4B,IAAqB;AAC1E,QAAM;AAAA,IACL;AAAA,IACA,UAAU,CAAA;AAAA,IACV;AAAA,IACA,SAAS,iBAAiB;AAAA,EAAA,IACvB;AAEJ,QAAM,UAAU,IAAI,MAAM,cAAc,CAAC;AACzC,QAAM,gCAAgB,IAAA;AAEtB,MAAI,gBAA+C,MAClD,iBAAsD,MACtD,eAAoD;AAGrD,MAAI,QAAQ;AACX,cAAU,MAAM;AAAA,EACjB;AACA,UAAQ,QAAQ,SAAS;AAEzB,WAAS,UAAU,KAA6B;AAE/C,UAAM,SAAS,YAAY,IAAI,GAAG;AAClC,UAAM,MAAM,OAAO,IAAI,YAAA;AACvB,QAAI,CAAC,UAAU,IAAI,GAAG,GAAG;AACxB,gBAAU,IAAI,KAAK,EAAE;AAAA,IACtB;AACA,cAAU,IAAI,GAAG,EAAG,KAAK,GAAG;AAAA,EAC7B;AAEA,WAAS,aAAa,KAAmB;AACxC,cAAU,OAAO,IAAI,aAAa;AAAA,EACnC;AAEA,WAAS,eAAqB;AAC7B,cAAU,MAAA;AAAA,EACX;AAEA,WAAS,eAAe,OAAsB,SAAwB;AACrE,QAAI,CAAC,QAAQ,MAAO;AAEpB,UAAM,MAAM,MAAM,IAAI,YAAA;AACtB,UAAM,cAAc,UAAU,IAAI,GAAG;AAErC,QAAI,CAAC,YAAa;AAElB,eAAW,OAAO,aAAa;AAE9B,UAAI,MAAM,IAAI,QAAQ,EAAG;AAGzB,UAAI,CAAC,CAAC,IAAI,UAAU,QAAS;AAG7B,YAAM,SAAS,YAAY,IAAI,GAAG;AAClC,UAAI,cAAc,OAAO,MAAM,GAAG;AACjC,YAAI,IAAI,YAAY,OAAO;AAC1B,gBAAM,eAAA;AAAA,QACP;AACA,YAAI,IAAI,MAAM;AACb,gBAAM,gBAAA;AAAA,QACP;AACA,YAAI,QAAQ,KAAK;AACjB;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,WAAS,OAAa;AACrB,QAAI,CAAC,YAAa;AAElB,WAAA;AAEA,oBAAgB,SAAS,MAAM,MAAM,IAAI;AAEzC,qBAAiB,CAAC,MAAqB,eAAe,GAAG,KAAK;AAC9D,mBAAe,CAAC,MAAqB,eAAe,GAAG,IAAI;AAE3D,mDAAe,iBAAiB,WAAW;AAC3C,mDAAe,iBAAiB,SAAS;AAAA,EAC1C;AAEA,WAAS,SAAe;AACvB,QAAI,eAAe;AAClB,UAAI,gBAAgB;AACnB,sBAAc,oBAAoB,WAAW,cAAoC;AAAA,MAClF;AACA,UAAI,cAAc;AACjB,sBAAc,oBAAoB,SAAS,YAAkC;AAAA,MAC9E;AAAA,IACD;AACA,oBAAgB;AAChB,qBAAiB;AACjB,mBAAe;AAAA,EAChB;AAEA,WAAS,SAAe;AACvB,YAAQ,QAAQ;AAAA,EACjB;AAEA,WAAS,UAAgB;AACxB,YAAQ,QAAQ;AAAA,EACjB;AAEA,WAAS,SAAe;AACvB,YAAQ,QAAQ,CAAC,QAAQ;AAAA,EAC1B;AAGA,QAAM,SAAS,CAAA,eAAc;AAC5B,QAAI,YAAY;AACf,WAAA;AAAA,IACD,OAAO;AACN,aAAA;AAAA,IACD;AAAA,EACD,CAAC;AAGD,MAAI,UAAU,OAAO,WAAW,YAAY,WAAW,QAAQ;AAC9D,UAAM,QAAQ,MAAM;AACnB,UAAI,QAAQ,OAAO;AAClB,aAAA;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAGA,MAAI,QAAQ,OAAO;AAClB,SAAA;AAAA,EACD;AAGA,cAAY,MAAM;AACjB,WAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,EAAA;AAET;ACnQO,SAAS,SAAS,UAA2B,IAAoB;AACvE,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,EAAA,IACV;AAEJ,QAAM,aAAa,IAAI,KAAK;AAE5B,MAAI,eAAqD,MACxD,eAAqD,MACrD,iBAAqC;AAEtC,WAAS,cAAoB;AAC5B,QAAI,cAAc;AACjB,mBAAa,YAAY;AACzB,qBAAe;AAAA,IAChB;AACA,QAAI,cAAc;AACjB,mBAAa,YAAY;AACzB,qBAAe;AAAA,IAChB;AAAA,EACD;AAEA,WAAS,iBAAiB,OAAyB;AAElD,QAAI,cAAc;AACjB,mBAAa,YAAY;AACzB,qBAAe;AAAA,IAChB;AAGA,QAAI,WAAW,MAAO;AAGtB,UAAM,QAAQ,MAAM,UAAU;AAC9B,QAAI,SAAS,QAAQ,GAAG;AACvB,qBAAe,WAAW,MAAM;AAC/B,mBAAW,QAAQ;AACnB,QAAAC,iBAAA;AACA,2CAAU;AACV,uBAAe;AAAA,MAChB,GAAG,KAAK;AAAA,IACT,OAAO;AACN,iBAAW,QAAQ;AACnB,MAAAA,iBAAA;AACA,yCAAU;AAAA,IACX;AAAA,EACD;AAEA,WAAS,iBAAiB,OAAyB;AAElD,QAAI,cAAc;AACjB,mBAAa,YAAY;AACzB,qBAAe;AAAA,IAChB;AAGA,QAAI,CAAC,WAAW,MAAO;AAGvB,UAAM,QAAQ,MAAM,UAAU;AAC9B,QAAI,SAAS,QAAQ,GAAG;AACvB,qBAAe,WAAW,MAAM;AAC/B,mBAAW,QAAQ;AACnB,yBAAA;AACA,2CAAU;AACV,uBAAe;AAAA,MAChB,GAAG,KAAK;AAAA,IACT,OAAO;AACN,iBAAW,QAAQ;AACnB,uBAAA;AACA,yCAAU;AAAA,IACX;AAAA,EACD;AAEA,WAASA,mBAAwB;AAChC,QAAI,kBAAkB,YAAY;AACjC,qBAAe,UAAU,IAAI,UAAU;AAAA,IACxC;AAAA,EACD;AAEA,WAAS,mBAAyB;AACjC,QAAI,kBAAkB,YAAY;AACjC,qBAAe,UAAU,OAAO,UAAU;AAAA,IAC3C;AAAA,EACD;AAEA,WAAS,KAAK,SAAkC;AAC/C,QAAI,CAAC,UAAA,EAAa,QAAO,MAAM;AAAA,IAAC;AAEhC,qBAAiB;AAEjB,YAAQ,iBAAiB,cAAc,gBAAgB;AACvD,YAAQ,iBAAiB,cAAc,gBAAgB;AAGvD,WAAO,MAAM;AACZ,cAAQ,oBAAoB,cAAc,gBAAgB;AAC1D,cAAQ,oBAAoB,cAAc,gBAAgB;AAC1D,kBAAA;AACA,uBAAA;AACA,uBAAiB;AAAA,IAClB;AAAA,EACD;AAGA,cAAY,MAAM;AACjB,gBAAA;AACA,qBAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA;AAAA,EAAA;AAEF;AChHO,SAAS,gBAAgB,UAAkC,IAA2B;AAC5F,QAAM;AAAA,IACL,KAAK;AAAA,IACL,sBAAsB;AAAA,IACtB,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,EAAA,IACG;AAEJ,QAAM,SAAS,IAAI,KAAK;AACxB,QAAM,aAAa,IAAI,EAAE;AAEzB,MAAI,iBAA0C,MAC7C,UAAiC,MACjC,eAAoC,MACpC,iBAAsD;AAEvD,WAASC,iBAAgC;AACxC,UAAM,MAAM,SAAS,cAAc,KAAK;AAExC,QAAI,YAAY;AAChB,QAAI,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcpB,WAAO;AAAA,EACR;AAEA,WAAS,KAAK,KAAoB;AACjC,QAAI,CAAC,YAAa;AAElB,UAAM,WAAW,QAAQ,cAAc,OAAO,eAAe,WAAW,WAAW,QAAQ;AAC3F,QAAI,CAAC,YAAY,CAAC,eAAgB;AAElC,UAAM,WAAW,YAAY,eAAgB;AAC7C,eAAW,QAAQ;AAGnB,cAAUA,eAAA;AAGV,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,MAAM;AACV,QAAI,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAQpB,QAAI,iBAAiB;AACpB,YAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,eAAS,YAAY;AACrB,eAAS,YAAY;AACrB,eAAS,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBzB,eAAS,iBAAiB,SAAS,CAAA,MAAK;AACvC,UAAE,gBAAA;AACF,cAAA;AAAA,MACD,CAAC;AACD,cAAQ,YAAY,QAAQ;AAAA,IAC7B;AAEA,YAAQ,YAAY,GAAG;AACvB,aAAS,KAAK,YAAY,OAAO;AAGjC,QAAI,qBAAqB;AACxB,qBAAe;AACf,cAAQ,iBAAiB,SAAS,YAAY;AAAA,IAC/C;AAGA,QAAI,YAAY;AACf,uBAAiB,CAAC,MAAqB;AACtC,YAAI,EAAE,QAAQ,UAAU;AACvB,gBAAA;AAAA,QACD;AAAA,MACD;AACA,eAAS,iBAAiB,WAAW,cAAc;AAAA,IACpD;AAEA,WAAO,QAAQ;AACf;AAAA,EACD;AAEA,WAAS,QAAc;AACtB,QAAI,SAAS;AACZ,cAAQ,OAAA;AACR,gBAAU;AAAA,IACX;AAEA,QAAI,cAAc;AACjB,eAAS,oBAAoB,SAAS,YAAY;AAClD,qBAAe;AAAA,IAChB;AAEA,QAAI,gBAAgB;AACnB,eAAS,oBAAoB,WAAW,cAAc;AACtD,uBAAiB;AAAA,IAClB;AAEA,WAAO,QAAQ;AACf,eAAW,QAAQ;AACnB;AAAA,EACD;AAEA,WAAS,qBAA2B;AACnC,QAAI,gBAAgB;AACnB,WAAK,eAAe,GAAG;AAAA,IACxB;AAAA,EACD;AAEA,WAAS,KAAK,SAAuC;AACpD,QAAI,CAAC,UAAA,EAAa,QAAO,MAAM;AAAA,IAAC;AAGhC,WAAA;AAEA,qBAAiB;AACjB,YAAQ,MAAM,SAAS;AACvB,YAAQ,iBAAiB,SAAS,kBAAkB;AAEpD,WAAO;AAAA,EACR;AAEA,WAAS,SAAe;AACvB,QAAI,gBAAgB;AACnB,qBAAe,MAAM,SAAS;AAC9B,qBAAe,oBAAoB,SAAS,kBAAkB;AAAA,IAC/D;AACA,qBAAiB;AAAA,EAClB;AAGA,cAAY,MAAM;AACjB,WAAA;AACA,UAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN,QAAQ,SAAS,MAAM;AAAA,IACvB,YAAY,SAAS,UAAU;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;ACtJO,SAAS,aAAa,UAA+B,IAAwB;AACnF,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,OAAO;AAAA,EAAA,IACJ;AAEJ,QAAM,iBAAiB,IAAI,KAAK;AAChC,QAAM,QAAQ,IAAI,CAAC;AAEnB,MAAI,WAAwC,MAC3C,mBAAmB;AAEpB,WAASC,kBAA8C;AACtD,QAAI,CAAC,UAAA,KAAe,CAAC,gCAAgC;AACpD,cAAQ,KAAK,6DAA6D;AAC1E,aAAO;AAAA,IACR;AAEA,WAAO,IAAI;AAAA,MACV,CAAA,YAAW;AACV,mBAAW,SAAS,SAAS;AAC5B,cAAI,QAAQ,iBAAkB;AAE9B,gBAAM,eAAe,MAAM;AAE3B,yBAAe,QAAQ;AACvB,gBAAM,QAAQ,MAAM;AAEpB,6CAAU,OAAO;AACjB,+CAAW,cAAc;AAEzB,cAAI,cAAc;AACjB,+CAAU,OAAO;AACjB,gBAAI,KAAM,oBAAmB;AAAA,UAC9B,OAAO;AACN,+CAAU,OAAO;AAAA,UAClB;AAAA,QACD;AAAA,MACD;AAAA,MACA;AAAA,QACC,MAAM,MAAM,IAAI;AAAA,QAChB;AAAA,QACA;AAAA,MAAA;AAAA,IACD;AAAA,EAEF;AAEA,WAAS,KAAK,SAAkC;AAC/C,QAAI,CAAC,UAAA,EAAa,QAAO,MAAM;AAAA,IAAC;AAGhC,SAAA;AAEA,eAAWA,gBAAA;AAEX,QAAI,UAAU;AACb,eAAS,QAAQ,OAAO;AAAA,IACzB;AAEA,WAAO;AAAA,EACR;AAEA,WAAS,OAAa;AACrB,QAAI,UAAU;AACb,eAAS,WAAA;AACT,iBAAW;AAAA,IACZ;AACA,mBAAe,QAAQ;AACvB,UAAM,QAAQ;AAAA,EACf;AAGA,cAAY,MAAM;AACjB,SAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN,gBAAgB,SAAS,cAAc;AAAA,IACvC,OAAO,SAAS,KAAK;AAAA,IACrB;AAAA,IACA;AAAA,EAAA;AAEF;ACvHA,SAAS,iBAAiB,GAAsD;AAC/E,MAAI,aAAa,KAAK,EAAE,QAAQ,SAAS,GAAG;AAC3C,WAAO;AAAA,MACN,GAAG,EAAE,QAAQ,CAAC,EAAE;AAAA,MAChB,GAAG,EAAE,QAAQ,CAAC,EAAE;AAAA,IAAA;AAAA,EAElB;AACA,MAAI,aAAa,GAAG;AACnB,WAAO;AAAA,MACN,GAAG,EAAE;AAAA,MACL,GAAG,EAAE;AAAA,IAAA;AAAA,EAEP;AACA,SAAO,EAAE,GAAG,GAAG,GAAG,EAAA;AACnB;AAKA,SAAS,YAAY,IAA8B,IAAsC;AACxF,SAAO,KAAK,KAAM,SAAG,IAAI,GAAG,GAAM,KAAK,SAAG,IAAI,GAAG,GAAM,EAAC;AACzD;AAiCO,SAAS,aAAa,UAA+B,IAAwB;AACnF,QAAM;AAAA,IACL,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,UAAU;AAAA,EAAA,IACP;AAEJ,QAAM,aAAa,IAAI,KAAK;AAE5B,MAAI,UAAgD,MACnD,cAAqD,MACrD,WAAW,EAAE,GAAG,GAAG,GAAG,EAAA,GACtB,cAAc;AAEf,WAAS,MAAM,OAAsC;AACpD,QAAI,CAAC,YAAa;AAGlB,QAAI,SAAS;AACZ,YAAM,eAAA;AAAA,IACP;AAGA,gBAAA;AAGA,eAAW,iBAAiB,KAAK;AACjC,kBAAc;AACd,eAAW,QAAQ;AAGnB,uCAAU;AAGV,QAAI,QAAQ;AACX,UAAI,YAAY,MAAM,QAAQ;AAC9B,oBAAc,YAAY,MAAM;AAC/B,qBAAa;AACb,yCAAS,KAAK,IAAI,GAAG,SAAS;AAAA,MAC/B,GAAG,YAAY;AAAA,IAChB;AAGA,cAAU,WAAW,MAAM;AAC1B,kBAAA;AACA,iBAAW,QAAQ;AACnB,6CAAY;AAAA,IACb,GAAG,MAAM,QAAQ,CAAC;AAAA,EACnB;AAEA,WAAS,KAAK,OAAsC;AACnD,QAAI,CAAC,WAAW,MAAO;AAEvB,gBAAA;AACA,kBAAc;AACd,eAAW,QAAQ;AACnB,yCAAW;AAAA,EACZ;AAEA,WAAS,WAAW,OAAsC;AACzD,QAAI,CAAC,WAAW,SAAS,CAAC,YAAa;AAEvC,UAAM,MAAM,iBAAiB,KAAK;AAClC,UAAM,OAAO,YAAY,UAAU,GAAG;AAEtC,QAAI,OAAO,MAAM,QAAQ,GAAG;AAC3B,WAAK,KAAK;AAAA,IACX;AAAA,EACD;AAEA,WAAS,cAAoB;AAC5B,QAAI,SAAS;AACZ,mBAAa,OAAO;AACpB,gBAAU;AAAA,IACX;AACA,QAAI,aAAa;AAChB,oBAAc,WAAW;AACzB,oBAAc;AAAA,IACf;AAAA,EACD;AAEA,WAAS,KAAK,SAAkC;AAE/C,YAAQ,iBAAiB,aAAa,KAAK;AAC3C,YAAQ,iBAAiB,WAAW,IAAI;AACxC,YAAQ,iBAAiB,cAAc,IAAI;AAC3C,YAAQ,iBAAiB,aAAa,UAAU;AAGhD,YAAQ,iBAAiB,cAAc,OAAO,EAAE,SAAS,CAAC,SAAS;AACnE,YAAQ,iBAAiB,YAAY,IAAI;AACzC,YAAQ,iBAAiB,eAAe,IAAI;AAC5C,YAAQ,iBAAiB,aAAa,YAAY,EAAE,SAAS,MAAM;AAGnE,WAAO,MAAM;AACZ,cAAQ,oBAAoB,aAAa,KAAK;AAC9C,cAAQ,oBAAoB,WAAW,IAAI;AAC3C,cAAQ,oBAAoB,cAAc,IAAI;AAC9C,cAAQ,oBAAoB,aAAa,UAAU;AACnD,cAAQ,oBAAoB,cAAc,KAAK;AAC/C,cAAQ,oBAAoB,YAAY,IAAI;AAC5C,cAAQ,oBAAoB,eAAe,IAAI;AAC/C,cAAQ,oBAAoB,aAAa,UAAU;AACnD,kBAAA;AAAA,IACD;AAAA,EACD;AAGA,cAAY,MAAM;AACjB,gBAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;AC9NA,SAAS,cAAc,MAAc,YAAY,OAAe;AAC/D,MAAI,CAAC,KAAM,QAAO;AAElB,MAAI,WAAW;AACd,WAAO,KAAK,OAAO,CAAC,EAAE,gBAAgB,KAAK,MAAM,CAAC;AAAA,EACnD;AAEA,SAAO,KAAK,YAAA;AACb;AAyBO,SAAS,aAAa,SAAkD;AAC9E,QAAM;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,EAAA,IACL;AAGJ,QAAM,WAAW,IAAI,MAAM,IAAI,CAAC;AAChC,QAAM,cAAc,IAAI,EAAE;AAK1B,WAAS,YAAkB;AAC1B,UAAM,YAAY,MAAM,IAAI;AAC5B,UAAM,aAAa,MAAM,KAAK;AAE9B,aAAS,QAAQ;AACjB,gBAAY,QAAQ,cAAc,WAAW,UAAU;AAAA,EACxD;AAGA;AAAA,IACC,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;AAAA,IAChC,MAAM,UAAA;AAAA,IACN,EAAE,WAAW,KAAA;AAAA,EAAK;AAGnB,SAAO;AAAA,IACN;AAAA,IACA;AAAA,EAAA;AAEF;AAoCO,SAAS,iBAAiB,QAAQ,OAAiC;AACzE,SAAO,CAAC,SAAiB,cAAc,MAAM,KAAK;AACnD;AC1EA,SAAS,YACR,OACA,UAMI,IACK;AACT,QAAM;AAAA,IACL,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,iBAAiB;AAAA,EAAA,IACd;AAEJ,QAAM,QAAQ,MAAM,QAAQ,SAAS;AACrC,QAAM,CAAC,SAAS,OAAO,IAAI,MAAM,MAAM,GAAG;AAG1C,QAAM,eAAe,QAAQ,QAAQ,yBAAyB,SAAS;AAEvE,MAAI,SAAS;AAEb,MAAI,YAAY,KAAK,SAAS;AAC7B,cAAU,UAAU;AAAA,EACrB;AAEA,SAAO,mBAAmB,WAAW,SAAS,SAAS,SAAS;AACjE;AAKA,SAAS,WACR,WACA,UAGI,IACK;AACT,QAAM,EAAE,UAAU,KAAK,SAAS,QAAQ;AAGxC,MAAI,UAAU,UAAU,QAAQ,IAAI,OAAO,IAAI,MAAM,QAAQ,GAAG,GAAG,EAAE;AAGrE,MAAI,YAAY,KAAK;AAEpB,cAAU,QAAQ,QAAQ,MAAM,EAAE;AAElC,cAAU,QAAQ,QAAQ,IAAI,OAAO,KAAK,OAAO,IAAI,GAAG,GAAG,GAAG;AAAA,EAC/D,OAAO;AAEN,cAAU,QAAQ,QAAQ,MAAM,EAAE;AAAA,EACnC;AAEA,SAAO,WAAW,OAAO,KAAK;AAC/B;AA6BO,SAAS,SAAS,SAA0C;AAClE,QAAM;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA,IACP;AAGJ,QAAM,WAAW,IAAI,MAAM,KAAK,CAAC;AAKjC,WAAS,mBAMP;AACD,WAAO;AAAA,MACN,WAAW,MAAM,SAAS;AAAA,MAC1B,WAAW,MAAM,SAAS;AAAA,MAC1B,SAAS,MAAM,OAAO;AAAA,MACtB,QAAQ,MAAM,MAAM;AAAA,MACpB,gBAAgB,MAAM,cAAc;AAAA,IAAA;AAAA,EAEtC;AAKA,QAAM,YAAY,SAAS,MAAM;AAChC,WAAO,YAAY,SAAS,OAAO,iBAAA,CAAkB;AAAA,EACtD,CAAC;AAKD,WAAS,MAAM,iBAAiC;AAC/C,WAAO,WAAW,iBAAiB;AAAA,MAClC,SAAS,MAAM,OAAO;AAAA,MACtB,QAAQ,MAAM,MAAM;AAAA,IAAA,CACpB;AAAA,EACF;AAGA;AAAA,IACC,MAAM,MAAM,KAAK;AAAA,IACjB,CAAA,aAAY;AACX,eAAS,QAAQ;AAAA,IAClB;AAAA,EAAA;AAGD,SAAO;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EAAA;AAEF;AAiCO,SAAS,qBACf,UAMI,IACwB;AAC5B,SAAO,CAAC,UAAkB,YAAY,OAAO,OAAO;AACrD;ACpMA,SAAS,aACR,OACA,UAMI,IACK;AACT,QAAM;AAAA,IACL,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,EAAA,IACN;AAEJ,QAAM,QAAQ,MAAM,QAAQ,SAAS;AACrC,QAAM,CAAC,SAAS,OAAO,IAAI,MAAM,MAAM,GAAG;AAG1C,QAAM,eAAe,QAAQ,QAAQ,yBAAyB,SAAS;AAEvE,MAAI,SAAS;AAEb,MAAI,YAAY,KAAK,SAAS;AAC7B,cAAU,UAAU;AAAA,EACrB;AAEA,SAAO,SAAS,SAAS;AAC1B;AAKA,SAAS,YACR,WACA,UAII,IACK;AACT,QAAM,EAAE,UAAU,KAAK,SAAS,IAAI,SAAS,OAAO;AAGpD,MAAI,UAAU,UACZ,QAAQ,IAAI,OAAO,IAAIR,cAAY,MAAM,CAAC,EAAE,GAAG,EAAE,EACjD,QAAQ,IAAI,OAAO,GAAGA,cAAY,MAAM,CAAC,GAAG,GAAG,EAAE,EACjD,QAAQ,OAAO,EAAE;AAGnB,MAAI,YAAY,KAAK;AAEpB,cAAU,QAAQ,QAAQ,MAAM,EAAE;AAElC,cAAU,QAAQ,QAAQ,IAAI,OAAO,KAAK,OAAO,IAAI,GAAG,GAAG,GAAG;AAAA,EAC/D,OAAO;AAEN,cAAU,QAAQ,QAAQ,MAAM,EAAE;AAAA,EACnC;AAEA,SAAO,WAAW,OAAO,KAAK;AAC/B;AAKA,SAASA,cAAY,KAAqB;AACzC,SAAO,IAAI,QAAQ,uBAAuB,MAAM;AACjD;AA6BO,SAAS,UAAU,SAA4C;AACrE,QAAM;AAAA,IACL;AAAA,IACA,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,EAAA,IACN;AAGJ,QAAM,WAAW,IAAI,MAAM,KAAK,CAAC;AAKjC,WAAS,mBAMP;AACD,WAAO;AAAA,MACN,WAAW,MAAM,SAAS;AAAA,MAC1B,WAAW,MAAM,SAAS;AAAA,MAC1B,SAAS,MAAM,OAAO;AAAA,MACtB,QAAQ,MAAM,MAAM;AAAA,MACpB,QAAQ,MAAM,MAAM;AAAA,IAAA;AAAA,EAEtB;AAKA,QAAM,YAAY,SAAS,MAAM;AAChC,WAAO,aAAa,SAAS,OAAO,iBAAA,CAAkB;AAAA,EACvD,CAAC;AAKD,WAAS,MAAM,iBAAiC;AAC/C,WAAO,YAAY,iBAAiB;AAAA,MACnC,SAAS,MAAM,OAAO;AAAA,MACtB,QAAQ,MAAM,MAAM;AAAA,MACpB,QAAQ,MAAM,MAAM;AAAA,IAAA,CACpB;AAAA,EACF;AAGA;AAAA,IACC,MAAM,MAAM,KAAK;AAAA,IACjB,CAAA,aAAY;AACX,eAAS,QAAQ;AAAA,IAClB;AAAA,EAAA;AAGD,SAAO;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EAAA;AAEF;AAiCO,SAAS,sBACf,UAMI,IACwB;AAC5B,SAAO,CAAC,UAAkB,aAAa,OAAO,OAAO;AACtD;ACvNA,MAAM,WAAW;AAKjB,SAAS,cAAc,UAAkB,aAAgC;AACxE,SAAO,YAAY,SAAS,QAAQ,KAAK,YAAY,SAAS,QAAQ;AACvE;AA0BO,SAAS,cAAc,SAAoD;AACjF,QAAM;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,CAAA;AAAA,EAAC,IACR;AAEJ,QAAM,UAAU,IAAI,KAAK;AAEzB,WAASS,oBAA4B;AAEpC,QAAI,OAAO;AACV,aAAO,MAAM,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC;AAAA,IACvC;AAGA,QAAI,CAAC,gBAAgB;AACpB,cAAQ,KAAK,+DAA+D;AAC5E,aAAO;AAAA,IACR;AAEA,UAAM,cAAc,eAAA;AACpB,UAAM,SAAQ,2CAAgB,CAAA;AAC9B,UAAM,WAAY,MAAM,QAAQ,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC;AAC5E,UAAM,cAAc,MAAM,IAAI;AAE9B,aAAS,YAAY,MAAuB;AAE3C,UAAI,QAAQ,SAAS;AACpB,eAAO,MAAM,SAAS,IAAI;AAAA,MAC3B;AAGA,UAAI,cAAc,MAAM,WAAW,GAAG;AACrC,eAAO;AAAA,MACR;AAGA,iBAAW,QAAQ,OAAO;AACzB,cAAM,kBAAkB,QAAQ,IAAI,KAAK,CAAA;AACzC,YAAI,cAAc,MAAM,eAAe,GAAG;AACzC,iBAAO;AAAA,QACR;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAEA,WAAO,gBAAgB,UAAU,SAAS,MAAM,WAAW,IAAI,SAAS,KAAK,WAAW;AAAA,EACzF;AAEA,WAAS,UAAgB;AACxB,YAAQ,QAAQA,kBAAA;AAAA,EACjB;AAGA;AAAA,IACC,MAAM,MAAM,KAAK;AAAA,IACjB,MAAM,QAAA;AAAA,IACN,EAAE,WAAW,KAAA;AAAA,EAAK;AAInB,MAAI,OAAO,SAAS,YAAY,WAAW,MAAM;AAChD,UAAM,MAAM,MAAM,SAAS;AAAA,EAC5B;AAEA,SAAO;AAAA,IACN,SAAS,SAAS,OAAO;AAAA,IACzB;AAAA,EAAA;AAEF;AAuBO,SAAS,wBAAwB,QAIyB;AAChE,QAAM,EAAE,gBAAgB,UAAU,UAAU,CAAA,MAAO;AAEnD,SAAO,CAAC,OAA0B,OAAuB,WAAoB;AAC5E,UAAM,cAAc,eAAA;AACpB,UAAM,SAAQ,2CAAgB,CAAA;AAC9B,UAAM,WAAW,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAEtD,aAAS,YAAY,MAAuB;AAC3C,UAAI,QAAQ,SAAS;AACpB,eAAO,MAAM,SAAS,IAAI;AAAA,MAC3B;AAEA,UAAI,cAAc,MAAM,WAAW,GAAG;AACrC,eAAO;AAAA,MACR;AAEA,iBAAW,QAAQ,OAAO;AACzB,cAAM,kBAAkB,QAAQ,IAAI,KAAK,CAAA;AACzC,YAAI,cAAc,MAAM,eAAe,GAAG;AACzC,iBAAO;AAAA,QACR;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAEA,WAAO,SAAS,UAAU,SAAS,MAAM,WAAW,IAAI,SAAS,KAAK,WAAW;AAAA,EAClF;AACD;AC5IA,SAAS,cAAc,KAAgC;AACtD,QAAM,SAAS,IAAI,iBAAiB,KAAK;AACzC,QAAM,WAA4B,CAAA;AAElC,SAAO,QAAQ,CAAA,QAAO;AACrB,QAAI,CAAC,IAAI,UAAU;AAClB,eAAS;AAAA,QACR,IAAI,QAAQ,CAAA,YAAW;AACtB,cAAI,SAAS,MAAM,QAAA;AACnB,cAAI,UAAU,MAAM,QAAA;AAAA,QACrB,CAAC;AAAA,MAAA;AAAA,IAEH;AAAA,EACD,CAAC;AAED,SAAO,QAAQ,IAAI,QAAQ;AAC5B;AAKA,SAAS,kBACR,IACA,SAMS;AAET,MAAI,SAAS;AAGb,MAAI,OAAO,aAAa,aAAa;AACpC,aAAS,iBAAiB,+BAA+B,EAAE,QAAQ,CAAA,YAAW;AAC7E,UAAI,QAAQ,YAAY,SAAS;AAChC,kBAAU,UAAU,QAAQ,WAAW;AAAA,MACxC,WAAW,QAAQ,YAAY,QAAQ;AACtC,cAAM,OAAQ,QAA4B;AAC1C,kBAAU,gCAAgC,IAAI;AAAA,MAC/C;AAAA,IACD,CAAC;AAAA,EACF;AAGA,UAAQ,QAAQ,QAAQ,CAAA,QAAO;AAC9B,cAAU,gCAAgC,GAAG;AAAA,EAC9C,CAAC;AAGD,MAAI,QAAQ,QAAQ;AACnB,cAAU,UAAU,QAAQ,MAAM;AAAA,EACnC;AAGA,YAAU;AAAA;AAAA;AAAA;AAAA,MAIL,QAAQ,aAAa,IAAI,QAAQ,UAAU,mCAAmC,EAAE;AAAA;AAAA;AAAA;AAMrF,QAAM,QAAQ,QAAQ,UAAU,OAAO,aAAa,cAAc,SAAS,QAAQ;AACnF,QAAM,UAAU,GAAG;AAEnB,SAAO;AAAA;AAAA;AAAA;AAAA,UAIE,KAAK;AAAA,GACZ,MAAM;AAAA;AAAA;AAAA,GAGN,OAAO;AAAA;AAAA;AAGV;AAKA,SAAe,cACd,IACA,SAMgB;AAAA;;AAEhB,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,MAAM,UAAU;AACvB,aAAS,KAAK,YAAY,MAAM;AAEhC,UAAM,YAAY,OAAO,qBAAmB,YAAO,kBAAP,mBAAsB;AAElE,QAAI,CAAC,WAAW;AACf,cAAQ,KAAK,uDAAuD;AACpE,eAAS,KAAK,YAAY,MAAM;AAChC;AAAA,IACD;AAGA,UAAM,UAAU,kBAAkB,IAAI,OAAO;AAE7C,cAAU,KAAA;AACV,cAAU,MAAM,OAAO;AACvB,cAAU,MAAA;AAGV,UAAM,cAAc,SAAS;AAG7B,QAAI;AACH,mBAAO,kBAAP,mBAAsB;AACtB,mBAAO,kBAAP,mBAAsB;AAAA,IACvB,SAAS,KAAK;AACb,cAAQ,MAAM,qCAAqC,GAAG;AAAA,IACvD;AAGA,eAAW,MAAM;AAChB,eAAS,KAAK,YAAY,MAAM;AAAA,IACjC,GAAG,GAAI;AAAA,EACR;AAAA;AAKA,SAAe,iBACd,IACA,SAMgB;AAAA;AAChB,UAAM,cAAc,OAAO,KAAK,IAAI,QAAQ;AAE5C,QAAI,CAAC,aAAa;AACjB,cAAQ,KAAK,kDAAkD;AAC/D;AAAA,IACD;AAEA,UAAM,UAAU,kBAAkB,IAAI,OAAO;AAE7C,gBAAY,SAAS,KAAA;AACrB,gBAAY,SAAS,MAAM,OAAO;AAClC,gBAAY,SAAS,MAAA;AAGrB,UAAM,cAAc,YAAY,QAAQ;AAGxC,gBAAY,MAAA;AACZ,gBAAY,MAAA;AAGZ,eAAW,MAAM;AAChB,kBAAY,MAAA;AAAA,IACb,GAAG,GAAI;AAAA,EACR;AAAA;AAuCO,SAAS,SAAS,UAA2B,IAAoB;AACvE,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,CAAA;AAAA,IACV;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,EAAA,IACG;AAGJ,QAAM,aAAa,IAAI,KAAK;AAK5B,WAAe,MAAM,QAA8C;AAAA;AAElE,UAAI,eAAe;AAClB,cAAM,SAAS,cAAA;AACf,YAAI,WAAW,MAAO;AAAA,MACvB;AAEA,iBAAW,QAAQ;AAEnB,UAAI;AAEH,YAAI,WAA+B;AAEnC,YAAI,OAAO,WAAW,UAAU;AAC/B,qBAAW,SAAS,cAAc,MAAM;AAAA,QACzC,WAAW,kBAAkB,aAAa;AACzC,qBAAW;AAAA,QACZ,OAAO;AAEN,qBAAW,SAAS;AAAA,QACrB;AAEA,YAAI,CAAC,UAAU;AACd,kBAAQ,KAAK,+CAA+C;AAC5D;AAAA,QACD;AAEA,cAAM,eAAe;AAAA,UACpB,OAAO,MAAM,KAAK,KAAK;AAAA,UACvB,QAAS,MAAM,QAAQ,MAAM,MAAM,CAAC,IAAK,MAAM,MAAM,EAAe,KAAK,IAAI,IAAK,MAAM,MAAM,KAAK;AAAA,UACnG,SAAS,MAAM,OAAO,KAAK,CAAA;AAAA,UAC3B,YAAY,MAAM,UAAU;AAAA,QAAA;AAI7B,YAAI,MAAM,SAAS,GAAG;AACrB,gBAAM,iBAAiB,UAAU,YAAY;AAAA,QAC9C,OAAO;AACN,gBAAM,cAAc,UAAU,YAAY;AAAA,QAC3C;AAGA,YAAI,cAAc;AACjB,uBAAA;AAAA,QACD;AAAA,MACD,UAAA;AACC,mBAAW,QAAQ;AAAA,MACpB;AAAA,IACD;AAAA;AAKA,WAAe,YAA2B;AAAA;AACzC,YAAM,MAAA;AAAA,IACP;AAAA;AAGA,cAAY,MAAM;AAAA,EAElB,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;AAoBA,SAAsB,WACrB,IAEgB;AAAA,6CAFhB,QACA,UAA2B,IACX;AAChB,UAAM,EAAE,MAAA,IAAU,SAAS,OAAO;AAClC,UAAM,MAAM,MAAM;AAAA,EACnB;AAAA;AC1SA,SAAS,MAAM,IAA2B;AACzC,SAAO,IAAI,QAAQ,CAAA,YAAW,WAAW,SAAS,EAAE,CAAC;AACtD;AAoCO,SAAS,eAAe,SAAsD;AACpF,QAAM;AAAA,IACL;AAAA,IACA,WAAW;AAAA,IACX,cAAc;AAAA,IACd,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,EAAA,IACb;AAGJ,QAAM,QAAQ,IAAsB,MAAM;AAC1C,QAAM,gBAAgB,IAAI,CAAC;AAC3B,QAAM,YAAY,IAAI,KAAK;AAC3B,QAAM,eAAe,IAAwB,IAAI;AAGjD,MAAI,SAAS,GACZ,WAAW;AAEZ,QAAMzB,eAAc,MAAc,MAAM,QAAQ;AAChD,QAAM,iBAAiB,MAAc,MAAM,WAAW;AACtD,QAAM,cAAc,MAAe,MAAM,QAAQ;AACjD,QAAM,qBAAqB,MAAc,MAAM,eAAe;AAC9D,QAAM,mBAAmB,MAAc,MAAM,aAAa;AAK1D,WAAS,QAAc;AACtB,UAAM,QAAQ;AACd,kBAAc,QAAQ;AACtB,cAAU,QAAQ;AAAA,EACnB;AAKA,WAAe,UAAyB;AAAA;AACvC,YAAM,QAAQ;AAEd,UAAI;AACH,cAAM,QAAA;AACN,cAAM,QAAQ;AACd,cAAM,MAAM,oBAAoB;AAAA,MACjC,SAAQ;AACP,cAAM,QAAQ;AACd,cAAM,MAAM,kBAAkB;AAAA,MAC/B,UAAA;AACC,cAAA;AAAA,MACD;AAAA,IACD;AAAA;AAKA,WAAS,WAAW,GAAqB;AACxC,QAAI,YAAA,KAAiB,MAAM,UAAU,UAAW;AAEhD,UAAM,YAAY,aAAa;AAC/B,QAAI,aAAa,UAAU,YAAY,EAAG;AAE1C,cAAU,QAAQ;AAClB,aAAS,EAAE,QAAQ,CAAC,EAAE;AACtB,eAAW;AACX,UAAM,QAAQ;AAAA,EACf;AAKA,WAAS,UAAU,GAAqB;AACvC,QAAI,CAAC,UAAU,SAAS,iBAAiB,MAAM,UAAU,UAAW;AAEpE,eAAW,EAAE,QAAQ,CAAC,EAAE;AACxB,UAAM,OAAO,WAAW;AAGxB,QAAI,QAAQ,GAAG;AACd,oBAAc,QAAQ;AACtB,YAAM,QAAQ;AACd;AAAA,IACD;AAGA,MAAE,eAAA;AAEF,UAAM,qBAAqB,KAAK,IAAI,OAAO,KAAK,gBAAgB;AAChE,kBAAc,QAAQ;AAEtB,UAAM,WAAW,qBAAqBA,aAAA;AACtC,UAAM,QAAQ,YAAY,IAAI,UAAU;AAAA,EACzC;AAKA,WAAS,WAAiB;AACzB,QAAI,CAAC,UAAU,SAAS,cAAe;AAEvC,cAAU,QAAQ;AAElB,QAAI,MAAM,UAAU,WAAW,cAAc,SAASA,gBAAe;AACpE,cAAA;AAAA,IACD,OAAO;AACN,oBAAc,QAAQ;AACtB,YAAA;AAAA,IACD;AAAA,EACD;AAGA,cAAY,MAAM;AACjB,UAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAED;AAAA,IACA;AAAA,EAAA;AAEF;AClLO,SAAS,UAAU,UAA4B,IAAqB;AAC1E,QAAM;AAAA,IACL,UAAA0B,YAAW;AAAA,IACX,MAAM;AAAA,IACN;AAAA,EAAA,IACG;AAEJ,QAAM,QAAQ,IAAI,CAAC;AACnB,QAAM,SAAS,IAAI,CAAC;AAEpB,MAAI,WAAkC,MACrC,gBAAsD,MACtD,iBAA2C;AAE5C,WAAS,aAAa,OAAkC;AACvD,UAAM,kBAAkB,MAAMA,SAAQ;AAEtC,aAAS,WAAiB;AACzB,YAAM,QAAQ,MAAM,YAAY;AAChC,aAAO,QAAQ,MAAM,YAAY;AACjC,2CAAW;AAAA,QACV,OAAO,MAAM,YAAY;AAAA,QACzB,QAAQ,MAAM,YAAY;AAAA,QAC1B,aAAa,MAAM;AAAA,MAAA;AAAA,IAErB;AAEA,QAAI,mBAAmB,kBAAkB,GAAG;AAC3C,UAAI,eAAe;AAClB,qBAAa,aAAa;AAAA,MAC3B;AACA,sBAAgB,WAAW,UAAU,eAAe;AAAA,IACrD,OAAO;AACN,eAAA;AAAA,IACD;AAAA,EACD;AAEA,WAASF,kBAAuB;AAC/B,QAAI,CAAC,YAAa;AAElB,QAAI,0BAA0B;AAC7B,iBAAW,IAAI,eAAe,CAAA,YAAW;AACxC,mBAAW,SAAS,SAAS;AAC5B,uBAAa,KAAK;AAAA,QACnB;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AAEA,WAAS,KAAK,SAAkC;AAC/C,QAAI,CAAC,UAAA,EAAa,QAAO,MAAM;AAAA,IAAC;AAGhC,SAAA;AAGA,UAAM,OAAO,QAAQ,sBAAA;AACrB,UAAM,QAAQ,KAAK;AACnB,WAAO,QAAQ,KAAK;AAEpB,QAAI,0BAA0B;AAC7B,MAAAA,gBAAA;AACA,2CAAU,QAAQ,SAAS,EAAE,IAAA;AAAA,IAC9B,OAAO;AAEN,uBAAiB,SAAS,cAAc,QAAQ;AAChD,qBAAe,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY/B,YAAM,gBAAgB,iBAAiB,OAAO;AAC9C,UAAI,cAAc,aAAa,UAAU;AACxC,gBAAQ,MAAM,WAAW;AAAA,MAC1B;AAEA,cAAQ,YAAY,cAAc;AAElC,YAAM,UAAU,eAAe;AAC/B,UAAI,SAAS;AACZ,gBAAQ,iBAAiB,UAAU,MAAM;AACxC,gBAAMG,QAAO,QAAQ,sBAAA;AACrB,uBAAa;AAAA,YAEZ,aAAaA;AAAAA,UAId,CAAwB;AAAA,QACzB,CAAC;AAAA,MACF;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAEA,WAAS,OAAa;AACrB,QAAI,UAAU;AACb,eAAS,WAAA;AACT,iBAAW;AAAA,IACZ;AACA,QAAI,gBAAgB;AACnB,qBAAe,OAAA;AACf,uBAAiB;AAAA,IAClB;AACA,QAAI,eAAe;AAClB,mBAAa,aAAa;AAC1B,sBAAgB;AAAA,IACjB;AAAA,EACD;AAGA,cAAY,MAAM;AACjB,SAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN,OAAO,SAAS,KAAK;AAAA,IACrB,QAAQ,SAAS,MAAM;AAAA,IACvB;AAAA,IACA;AAAA,EAAA;AAEF;AC3HA,SAAS,2BACR,WACA,gBACA,eACa;AACb,MAAI,aAAa,GAChB,YAAY,GACZ,gBAAgB,GAChB,eAAe;AAEhB,MAAI,cAAc,QAAQ;AACzB,iBAAa,OAAO,WAAW,SAAS,gBAAgB;AACxD,gBAAY,OAAO,WAAW,SAAS,gBAAgB;AACvD,oBAAgB,SAAS,gBAAgB,cAAc,OAAO;AAC9D,mBAAe,SAAS,gBAAgB,eAAe,OAAO;AAAA,EAC/D,OAAO;AACN,UAAM,KAAK;AACX,iBAAa,GAAG;AAChB,gBAAY,GAAG;AACf,oBAAgB,GAAG,cAAc,GAAG;AACpC,mBAAe,GAAG,eAAe,GAAG;AAAA,EACrC;AAEA,QAAM,YAAY,gBAAgB,IAAI,aAAa,gBAAgB;AACnE,QAAM,YAAY,eAAe,IAAI,YAAY,eAAe;AAEhE,QAAM,aAA8B,eAAe,iBAAkB,aAAa,iBAAiB,IAAI,KAAM;AAC7G,QAAM,aAA8B,cAAc,gBAAiB,YAAY,gBAAgB,IAAI,KAAM;AAEzG,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;AA2BO,SAAS,UAAU,UAA4B,IAAqB;AAC1E,QAAM,EAAE,UAAAC,YAAW,GAAG,UAAU,SAAS;AAEzC,QAAM,aAAa,IAAI,CAAC;AACxB,QAAM,YAAY,IAAI,CAAC;AACvB,QAAM,YAAY,IAAI,CAAC;AACvB,QAAM,YAAY,IAAI,CAAC;AACvB,QAAM,aAAa,IAAqB,CAAC;AACzC,QAAM,aAAa,IAAqB,CAAC;AACzC,QAAM,cAAc,IAAI,KAAK;AAE7B,MAAI,YAAqC,MACxC,iBAAiB,GACjB,gBAAgB,GAChB,gBAA6C,MAC7C,gBAAsD,MACtD,gBAAsD;AAEvD,QAAM,OAAO,SAAqB,OAAO;AAAA,IACxC,YAAY,WAAW;AAAA,IACvB,WAAW,UAAU;AAAA,IACrB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,WAAW,UAAU;AAAA,IACrB,WAAW,UAAU;AAAA,IACrB,YAAY,WAAW;AAAA,IACvB,YAAY,WAAW;AAAA,EAAA,EACtB;AAEF,WAAS,iBAAiB,IAAiB;AAC1C,QAAI,CAAC,UAAW;AAEhB,UAAM,kBAAkB,MAAMA,SAAQ;AAEtC,aAAS,WAAiB;AACzB,YAAM,aAAa,2BAA2B,WAAY,gBAAgB,aAAa;AAEvF,iBAAW,QAAQ,WAAW;AAC9B,gBAAU,QAAQ,WAAW;AAC7B,gBAAU,QAAQ,WAAW;AAC7B,gBAAU,QAAQ,WAAW;AAC7B,iBAAW,QAAQ,WAAW;AAC9B,iBAAW,QAAQ,WAAW;AAE9B,uBAAiB,WAAW;AAC5B,sBAAgB,WAAW;AAE3B,kBAAY,QAAQ;AAGpB,UAAI,eAAe;AAClB,qBAAa,aAAa;AAAA,MAC3B;AACA,sBAAgB,WAAW,MAAM;AAChC,oBAAY,QAAQ;AAAA,MACrB,GAAG,GAAG;AAAA,IACP;AAEA,QAAI,mBAAmB,kBAAkB,GAAG;AAC3C,UAAI,CAAC,eAAe;AACnB,wBAAgB,WAAW,MAAM;AAChC,mBAAA;AACA,0BAAgB;AAAA,QACjB,GAAG,eAAe;AAAA,MACnB;AAAA,IACD,OAAO;AACN,eAAA;AAAA,IACD;AAAA,EACD;AAEA,WAAS,KAAK,SAA4C;AACzD,QAAI,CAAC,UAAA,EAAa,QAAO,MAAM;AAAA,IAAC;AAGhC,SAAA;AAEA,QAAI,SAAS;AACZ,kBAAY;AAAA,IACb,OAAO;AACN,kBAAY;AAAA,IACb;AAGA,UAAM,cAAc,2BAA2B,WAAW,GAAG,CAAC;AAC9D,eAAW,QAAQ,YAAY;AAC/B,cAAU,QAAQ,YAAY;AAC9B,cAAU,QAAQ,YAAY;AAC9B,cAAU,QAAQ,YAAY;AAC9B,qBAAiB,YAAY;AAC7B,oBAAgB,YAAY;AAE5B,oBAAgB;AAChB,cAAU,iBAAiB,UAAU,eAAe,EAAE,SAAS;AAE/D,WAAO;AAAA,EACR;AAEA,WAAS,OAAa;AACrB,QAAI,aAAa,eAAe;AAC/B,gBAAU,oBAAoB,UAAU,aAAa;AAAA,IACtD;AACA,QAAI,eAAe;AAClB,mBAAa,aAAa;AAC1B,sBAAgB;AAAA,IACjB;AACA,QAAI,eAAe;AAClB,mBAAa,aAAa;AAC1B,sBAAgB;AAAA,IACjB;AACA,gBAAY;AACZ,oBAAgB;AAAA,EACjB;AAEA,WAAS,SAAS,MAA2E;AAC5F,QAAI,CAAC,UAAW;AAEhB,UAAM,EAAE,KAAK,MAAM,WAAW,aAAa;AAE3C,QAAI,cAAc,QAAQ;AACzB,aAAO,SAAS;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACA;AAAA,IACF,OAAO;AACN,YAAM,KAAK;AACX,UAAI,QAAQ,OAAW,IAAG,YAAY;AACtC,UAAI,SAAS,OAAW,IAAG,aAAa;AAAA,IACzC;AAAA,EACD;AAGA,cAAY,MAAM;AACjB,SAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN,YAAY,SAAS,UAAU;AAAA,IAC/B,WAAW,SAAS,SAAS;AAAA,IAC7B,WAAW,SAAS,SAAS;AAAA,IAC7B,WAAW,SAAS,SAAS;AAAA,IAC7B,YAAY,SAAS,UAAU;AAAA,IAC/B,YAAY,SAAS,UAAU;AAAA,IAC/B,aAAa,SAAS,WAAW;AAAA,IACjC,MAAM,SAAS,IAAI;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;AClNA,MAAM,qBAAuC,CAAC,QAAQ,SAAS,MAAM,MAAM;AAK3E,SAAS,kBACR,QACA,QACA,mBACwB;AACxB,QAAM,OAAO,KAAK,IAAI,MAAM;AAC5B,QAAM,OAAO,KAAK,IAAI,MAAM;AAE5B,MAAI,OAAO,MAAM;AAChB,UAAM,YAAY,SAAS,IAAI,UAAU;AACzC,WAAO,kBAAkB,SAAS,SAAS,IAAI,YAAY;AAAA,EAC5D,OAAO;AACN,UAAM,YAAY,SAAS,IAAI,SAAS;AACxC,WAAO,kBAAkB,SAAS,SAAS,IAAI,YAAY;AAAA,EAC5D;AACD;AA8BO,SAAS,SAAS,UAA2B,IAAoB;AACvE,QAAM;AAAA,IACL;AAAA,IACA,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,uBAAuB;AAAA,IACvB,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACG;AAEJ,QAAM,YAAY,IAA2B,IAAI;AACjD,QAAM,UAAU,IAAI,CAAC;AACrB,QAAM,UAAU,IAAI,CAAC;AACrB,QAAM,YAAY,IAAI,KAAK;AAE3B,MAAI,iBAAqC,MACxC,SAAS,GACT,SAAS,GACT,YAAY;AAEb,WAASC,cAAa,QAAgB,QAAgB,WAAmB,OAAoB;;AAC5F,UAAM,mBAAmB,MAAM,SAAS;AACxC,UAAM,iBAAiB,MAAM,OAAO;AAGpC,QAAI,YAAY,eAAgB;AAGhC,UAAM,WAAW,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI,MAAM,CAAC;AAC5D,QAAI,WAAW,iBAAkB;AAGjC,UAAM,iBAAiB,kBAAkB,QAAQ,QAAQ,UAAU;AACnE,QAAI,CAAC,eAAgB;AAErB,cAAU,QAAQ;AAClB,YAAQ,QAAQ;AAChB,YAAQ,QAAQ;AAGhB,QAAI,wBAAwB,MAAM,YAAY;AAC7C,YAAM,eAAA;AAAA,IACP;AAGA,uCAAU,gBAAgB;AAG1B,UAAM,YAA8D;AAAA,MACnE,MAAM;AAAA,MACN,OAAO;AAAA,MACP,IAAI;AAAA,MACJ,MAAM;AAAA,IAAA;AAEP,oBAAU,oBAAV;AAGA,qDAAgB,cAAc,IAAI,YAAY,SAAS;AAAA,MACtD,QAAQ,EAAE,WAAW,gBAAgB,QAAQ,QAAQ,UAAA;AAAA,IAAU,CAC/D;AAAA,EACF;AAEA,WAAS,YAAY,SAAiB,SAAuB;AAC5D,aAAS;AACT,aAAS;AACT,gBAAY,KAAK,IAAA;AACjB,cAAU,QAAQ;AAClB,cAAU,QAAQ;AAClB,YAAQ,QAAQ;AAChB,YAAQ,QAAQ;AAAA,EACjB;AAEA,WAAS,UAAU,SAAiB,SAAiB,OAAoB;AACxE,QAAI,CAAC,UAAU,MAAO;AAEtB,cAAU,QAAQ;AAClB,UAAM,SAAS,UAAU;AACzB,UAAM,SAAS,UAAU;AACzB,UAAM,YAAY,KAAK,IAAA,IAAQ;AAE/B,IAAAA,cAAa,QAAQ,QAAQ,WAAW,KAAK;AAAA,EAC9C;AAEA,WAAS,WAAW,GAAqB;AACxC,gBAAY,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,OAAO;AAAA,EACvD;AAEA,WAAS,UAAU,GAAqB;AACvC,QAAI,CAAC,UAAU,SAAS,CAAC,qBAAsB;AAC/C,MAAE,eAAA;AAAA,EACH;AAEA,WAAS,SAAS,GAAqB;AACtC,UAAM,QAAQ,EAAE,eAAe,CAAC;AAChC,cAAU,MAAM,SAAS,MAAM,SAAS,CAAC;AAAA,EAC1C;AAEA,WAAS,UAAU,GAAqB;AACvC,gBAAY,EAAE,SAAS,EAAE,OAAO;AAAA,EACjC;AAEA,WAAS,QAAQ,GAAqB;AACrC,cAAU,EAAE,SAAS,EAAE,SAAS,CAAC;AAAA,EAClC;AAEA,WAAS,WAAW,GAAqB;AACxC,QAAI,UAAU,OAAO;AACpB,gBAAU,EAAE,SAAS,EAAE,SAAS,CAAC;AAAA,IAClC;AAAA,EACD;AAEA,WAAS,KAAK,SAAkC;AAC/C,QAAI,CAAC,UAAA,EAAa,QAAO,MAAM;AAAA,IAAC;AAGhC,WAAA;AAEA,qBAAiB;AAEjB,YAAQ,MAAM,cAAc;AAC5B,YAAQ,MAAM,aAAa;AAE3B,YAAQ,iBAAiB,cAAc,YAAY,EAAE,SAAS,MAAM;AACpE,YAAQ,iBAAiB,aAAa,WAAW,EAAE,SAAS,OAAO;AACnE,YAAQ,iBAAiB,YAAY,QAAQ;AAC7C,YAAQ,iBAAiB,eAAe,QAAQ;AAEhD,QAAI,MAAM,KAAK,GAAG;AACjB,cAAQ,iBAAiB,aAAa,SAAS;AAC/C,cAAQ,iBAAiB,WAAW,OAAO;AAC3C,cAAQ,iBAAiB,cAAc,UAAU;AAAA,IAClD;AAEA,WAAO;AAAA,EACR;AAEA,WAAS,SAAe;AACvB,QAAI,CAAC,eAAgB;AAErB,mBAAe,oBAAoB,cAAc,UAAU;AAC3D,mBAAe,oBAAoB,aAAa,SAAS;AACzD,mBAAe,oBAAoB,YAAY,QAAQ;AACvD,mBAAe,oBAAoB,eAAe,QAAQ;AAE1D,QAAI,MAAM,KAAK,GAAG;AACjB,qBAAe,oBAAoB,aAAa,SAAS;AACzD,qBAAe,oBAAoB,WAAW,OAAO;AACrD,qBAAe,oBAAoB,cAAc,UAAU;AAAA,IAC5D;AAEA,qBAAiB;AAAA,EAClB;AAGA,cAAY,MAAM;AACjB,WAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN,WAAW,SAAS,SAAS;AAAA,IAC7B,SAAS,SAAS,OAAO;AAAA,IACzB,SAAS,SAAS,OAAO;AAAA,IACzB,WAAW,SAAS,SAAS;AAAA,IAC7B;AAAA,EAAA;AAEF;ACnOO,SAAS,YACf,SACuB;AACvB,QAAM;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,EAAA,IACR;AAGJ,MAAI,UAAgD,MACnD,WAAiC,MACjC,WAAgB,MAChB,eAAe;AAEhB,QAAM,UAAU,MAAc,MAAM,IAAI;AACxC,QAAM,aAAa,MAAe,MAAM,OAAO;AAC/C,QAAM,cAAc,MAAe,MAAM,QAAQ;AAEjD,QAAM,aAAa,MAAY;AAC9B,QAAI,UAAU;AACb,cAAQ,MAAM,UAAU,QAAQ;AAChC,iBAAW;AACX,iBAAW;AAAA,IACZ;AAAA,EACD;AAEA,WAAS,OAAkB,MAA2B;AACrD,UAAM,MAAM,KAAK,IAAA;AACjB,UAAM,cAAc,QAAA;AAEpB,QAAI,CAAC,gBAAgB,CAAC,cAAc;AACnC,qBAAe;AAAA,IAChB;AAEA,UAAM,YAAY,eAAe,MAAM;AAEvC,eAAW;AAEX,eAAW;AAEX,QAAI,aAAa,KAAK,YAAY,aAAa;AAC9C,UAAI,SAAS;AACZ,qBAAa,OAAO;AACpB,kBAAU;AAAA,MACX;AACA,qBAAe;AACf,iBAAA;AAAA,IACD,WAAW,CAAC,WAAW,eAAe;AACrC,gBAAU,WAAW,MAAM;AAC1B,uBAAe,WAAA,IAAe,KAAK,IAAA,IAAQ;AAC3C,kBAAU;AACV,mBAAA;AAAA,MACD,GAAG,SAAS;AAAA,IACb;AAAA,EACD;AAEA,WAAS,SAAe;AACvB,QAAI,SAAS;AACZ,mBAAa,OAAO;AACpB,gBAAU;AAAA,IACX;AACA,mBAAe;AACf,eAAW;AACX,eAAW;AAAA,EACZ;AAGA,cAAY,MAAM;AACjB,WAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA;AAAA,EAAA;AAEF;AAuBO,SAAS,WACf,IACA,OAAe,KACf,SAIiC;AACjC,SAAO,SAAS,IAAI,MAAM,OAAO;AAClC;AC3DO,SAAS,SAAS,UAA2B,IAAoB;AACvE,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,cAAc;AAAA,IACd,WAAW;AAAA,EAAA,IACR;AAEJ,QAAM,UAAU,IAAyB,IAAI;AAE7C,MAAI,iBAAqC,MACxC,SAAS,GACT,SAAS,GACT,YAAY,GACZ,iBAAuD,MACvD,uBAAuB,GACvB,eAAe;AAEhB,WAAS,eAAe,SAA8C;AACrE,QAAI,IAAI,GACP,IAAI;AACL,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACxC,WAAK,QAAQ,CAAC,EAAE;AAChB,WAAK,QAAQ,CAAC,EAAE;AAAA,IACjB;AACA,WAAO,EAAE,GAAG,IAAI,QAAQ,QAAQ,GAAG,IAAI,QAAQ,OAAA;AAAA,EAChD;AAEA,WAAS7B,aAAY,QAAe,QAAuB;AAC1D,UAAM,KAAK,OAAO,UAAU,OAAO;AACnC,UAAM,KAAK,OAAO,UAAU,OAAO;AACnC,WAAO,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAAA,EACnC;AAEA,WAAS8B,UAAS,QAAe,QAAuB;AACvD,WAAO,KAAK,MAAM,OAAO,UAAU,OAAO,SAAS,OAAO,UAAU,OAAO,OAAO,KAAK,MAAM,KAAK;AAAA,EACnG;AAEA,WAAS,iBAAiB,GAAqB;AAC9C,QAAI,MAAM,QAAQ,EAAG;AAErB,gBAAY,KAAK,IAAA;AACjB,YAAQ,QAAQ;AAEhB,QAAI,EAAE,QAAQ,WAAW,GAAG;AAC3B,eAAS,EAAE,QAAQ,CAAC,EAAE;AACtB,eAAS,EAAE,QAAQ,CAAC,EAAE;AAGtB,UAAI,aAAa;AAChB,yBAAiB,WAAW,MAAM;AACjC,kBAAQ,QAAQ;AAChB,sBAAY;AAAA,YACX,MAAM;AAAA,YACN,QAAQ,EAAE,GAAG,QAAQ,GAAG,OAAA;AAAA,YACxB,OAAO;AAAA,UAAA,CACP;AAAA,QACF,GAAG,iBAAiB;AAAA,MACrB;AAAA,IACD,WAAW,EAAE,QAAQ,WAAW,GAAG;AAElC,6BAAuB9B,aAAY,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC7D,qBAAe8B,UAAS,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAAA,IACnD;AAAA,EACD;AAEA,WAAS,gBAAgB,GAAqB;AAC7C,QAAI,MAAM,QAAQ,EAAG;AAGrB,QAAI,gBAAgB;AACnB,mBAAa,cAAc;AAC3B,uBAAiB;AAAA,IAClB;AAEA,QAAI,EAAE,QAAQ,WAAW,MAAM,WAAW,WAAW;AACpD,YAAM,kBAAkB9B,aAAY,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC9D,YAAM,eAAe8B,UAAS,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAExD,UAAI,WAAW,uBAAuB,GAAG;AACxC,cAAM,QAAQ,kBAAkB;AAChC,gBAAQ,QAAQ;AAChB,gBAAQ;AAAA,UACP,MAAM;AAAA,UACN;AAAA,UACA,QAAQ,eAAe,EAAE,OAAO;AAAA,UAChC,OAAO;AAAA,QAAA,CACP;AAAA,MACF;AAEA,UAAI,UAAU;AACb,cAAM,WAAW,eAAe;AAChC,gBAAQ,QAAQ;AAChB,iBAAS;AAAA,UACR,MAAM;AAAA,UACN;AAAA,UACA,QAAQ,eAAe,EAAE,OAAO;AAAA,UAChC,OAAO;AAAA,QAAA,CACP;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAEA,WAAS,eAAe,GAAqB;AAC5C,QAAI,MAAM,QAAQ,EAAG;AAGrB,QAAI,gBAAgB;AACnB,mBAAa,cAAc;AAC3B,uBAAiB;AAAA,IAClB;AAEA,UAAM,WAAW,KAAK,IAAA,IAAQ;AAE9B,QAAI,EAAE,eAAe,WAAW,GAAG;AAClC,YAAM,OAAO,EAAE,eAAe,CAAC,EAAE;AACjC,YAAM,OAAO,EAAE,eAAe,CAAC,EAAE;AACjC,YAAM,SAAS,OAAO;AACtB,YAAM,SAAS,OAAO;AACtB,YAAM,WAAW,KAAK,KAAK,SAAS,SAAS,SAAS,MAAM;AAG5D,UAAI,YAAY,gBAAgB;AAC/B,gBAAQ,QAAQ;AAChB,YAAI;AAEJ,YAAI,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,GAAG;AACxC,sBAAY,SAAS,IAAI,UAAU;AAAA,QACpC,OAAO;AACN,sBAAY,SAAS,IAAI,SAAS;AAAA,QACnC;AAEA,cAAM,QAA2B;AAAA,UAChC,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,OAAO,KAAK,MAAM,QAAQ,MAAM,KAAK,MAAM,KAAK;AAAA,UAChD,QAAQ,EAAE,GAAG,MAAM,GAAG,KAAA;AAAA,UACtB,OAAO;AAAA,QAAA;AAGR,2CAAU;AAEV,gBAAQ,WAAA;AAAA,UACP,KAAK;AACJ,uDAAc;AACd;AAAA,UACD,KAAK;AACJ,yDAAe;AACf;AAAA,UACD,KAAK;AACJ,mDAAY;AACZ;AAAA,UACD,KAAK;AACJ,uDAAc;AACd;AAAA,QAAA;AAAA,MAEH,WAAW,WAAW,MAAM,WAAW,eAAe,OAAO;AAC5D,gBAAQ,QAAQ;AAChB,cAAM;AAAA,UACL,MAAM;AAAA,UACN,QAAQ,EAAE,GAAG,MAAM,GAAG,KAAA;AAAA,UACtB,OAAO;AAAA,QAAA,CACP;AAAA,MACF;AAAA,IACD;AAEA,YAAQ,QAAQ;AAAA,EACjB;AAEA,WAAS,KAAK,SAAkC;AAC/C,QAAI,CAAC,UAAA,EAAa,QAAO,MAAM;AAAA,IAAC;AAGhC,WAAA;AAEA,qBAAiB;AAEjB,YAAQ,iBAAiB,cAAc,kBAAkB,EAAE,SAAS,MAAM;AAC1E,YAAQ,iBAAiB,aAAa,iBAAiB,EAAE,SAAS,MAAM;AACxE,YAAQ,iBAAiB,YAAY,cAAc;AACnD,YAAQ,iBAAiB,eAAe,cAAc;AAEtD,WAAO;AAAA,EACR;AAEA,WAAS,SAAe;AACvB,QAAI,gBAAgB;AACnB,qBAAe,oBAAoB,cAAc,gBAAgB;AACjE,qBAAe,oBAAoB,aAAa,eAAe;AAC/D,qBAAe,oBAAoB,YAAY,cAAc;AAC7D,qBAAe,oBAAoB,eAAe,cAAc;AAAA,IACjE;AAEA,QAAI,gBAAgB;AACnB,mBAAa,cAAc;AAC3B,uBAAiB;AAAA,IAClB;AAEA,qBAAiB;AACjB,YAAQ,QAAQ;AAAA,EACjB;AAGA,cAAY,MAAM;AACjB,WAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN,SAAS,SAAS,OAAO;AAAA,IACzB;AAAA,EAAA;AAEF;ACjTA,SAAS,YAAY,KAAqB;AACzC,SAAO,IAAI,QAAQ,uBAAuB,MAAM;AACjD;AAKA,SAAS,SACR,MACA,WAAyB,QACzB,OACS;AAET,QAAM,cAAc,QAAQ,OAAO,YAAY,KAAK,CAAC,MAAM;AAE3D,UAAQ,UAAA;AAAA,IACP,KAAK;AACJ,aAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,WAAW,KAAK,GAAG,GAAG,EAAE;AAAA,IAE5D,KAAK;AACJ,aAAO,KAAK,QAAQ,IAAI,OAAO,GAAG,WAAW,MAAM,GAAG,GAAG,EAAE;AAAA,IAE5D,KAAK;AAAA,IACL;AACC,aAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,WAAW,KAAK,WAAW,MAAM,GAAG,GAAG,EAAE;AAAA,EAAA;AAE/E;AA0BO,SAAS,QAAQ,SAAwC;AAC/D,QAAM;AAAA,IACL;AAAA,IACA,WAAW;AAAA,IACX;AAAA,EAAA,IACG;AAGJ,QAAM,WAAW,IAAI,MAAM,IAAI,CAAC;AAChC,QAAM,UAAU,IAAI,EAAE;AACtB,QAAM,aAAa,IAAI,KAAK;AAK5B,WAAS,YAAkB;AAC1B,UAAM,YAAY,MAAM,IAAI;AAC5B,UAAM,gBAAgB,MAAM,QAAQ;AACpC,UAAM,aAAa,MAAM,KAAK;AAE9B,aAAS,QAAQ;AACjB,YAAQ,QAAQ,SAAS,WAAW,eAAe,UAAU;AAC7D,eAAW,QAAQ,QAAQ,UAAU;AAAA,EACtC;AAGA;AAAA,IACC,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC;AAAA,IACjD,MAAM,UAAA;AAAA,IACN,EAAE,WAAW,KAAA;AAAA,EAAK;AAGnB,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;AAuCO,SAAS,cACf,WAAyB,QACzB,OAC2B;AAC3B,SAAO,CAAC,SAAiB,SAAS,MAAM,UAAU,KAAK;AACxD;ACpJA,SAAS,cAAc,MAAc,YAAY,OAAe;AAC/D,MAAI,CAAC,KAAM,QAAO;AAElB,MAAI,WAAW;AACd,WAAO,KAAK,OAAO,CAAC,EAAE,gBAAgB,KAAK,MAAM,CAAC;AAAA,EACnD;AAEA,SAAO,KAAK,YAAA;AACb;AAyBO,SAAS,aAAa,SAAkD;AAC9E,QAAM;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,EAAA,IACL;AAGJ,QAAM,WAAW,IAAI,MAAM,IAAI,CAAC;AAChC,QAAM,cAAc,IAAI,EAAE;AAK1B,WAAS,YAAkB;AAC1B,UAAM,YAAY,MAAM,IAAI;AAC5B,UAAM,aAAa,MAAM,KAAK;AAE9B,aAAS,QAAQ;AACjB,gBAAY,QAAQ,cAAc,WAAW,UAAU;AAAA,EACxD;AAGA;AAAA,IACC,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;AAAA,IAChC,MAAM,UAAA;AAAA,IACN,EAAE,WAAW,KAAA;AAAA,EAAK;AAGnB,SAAO;AAAA,IACN;AAAA,IACA;AAAA,EAAA;AAEF;AAoCO,SAAS,iBAAiB,QAAQ,OAAiC;AACzE,SAAO,CAAC,SAAiB,cAAc,MAAM,KAAK;AACnD;ACqBO,SAAS,eACf,SAC0B;AAC1B,QAAM;AAAA,IACL;AAAA,IACA,WAAW;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU,YAAY;AAAA,EAAA,IACnB;AAGJ,QAAM,eAAe,IAAwB,IAAI;AACjD,QAAM,YAAY,IAAI,CAAC;AACvB,QAAM,aAAa,IAAI,CAAC;AACxB,QAAM,WAAW,IAAI,CAAC;AAGtB,QAAM,WAAW,MAAW,MAAM,KAAK;AACvC,QAAM,mBAAmB,MAAiC,MAAM,QAAQ;AACxE,QAAM,YAAY,MAAc,MAAM,MAAM;AAC5C,QAAM,cAAc,MAAc,MAAM,QAAQ;AAKhD,QAAM,cAAc,SAAS,MAAM;AAClC,UAAM,YAAY,SAAA;AAClB,UAAM,OAAO,iBAAA;AAEb,QAAI,OAAO,SAAS,YAAY;AAC/B,UAAI,QAAQ;AACZ,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AAC1C,iBAAS,KAAK,CAAC;AAAA,MAChB;AACA,aAAO;AAAA,IACR;AAEA,WAAO,OAAO,UAAU;AAAA,EACzB,CAAC;AAKD,WAASC,yBAAyE;AACjF,UAAM,YAAY,SAAA;AAClB,UAAM,OAAO,iBAAA;AACb,UAAM,kBAAkB,UAAA;AACxB,UAAM,gBAAgB,YAAA;AACtB,UAAM,mBAAmB,UAAU;AAEnC,QAAI,QAAQ,GACX,MAAM,GACN,UAAU;AAEX,QAAI,OAAO,SAAS,YAAY;AAE/B,UAAI,gBAAgB;AACpB,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AAC1C,cAAM,aAAa,KAAK,CAAC;AACzB,YAAI,gBAAgB,aAAa,kBAAkB;AAClD,kBAAQ;AACR,oBAAU;AACV;AAAA,QACD;AACA,yBAAiB;AAAA,MAClB;AAGA,YAAM;AACN,sBAAgB;AAChB,aAAO,MAAM,UAAU,UAAU,gBAAgB,mBAAmB,iBAAiB;AACpF,yBAAiB,KAAK,GAAG;AACzB;AAAA,MACD;AAGA,cAAQ,KAAK,IAAI,GAAG,QAAQ,aAAa;AACzC,YAAM,KAAK,IAAI,UAAU,QAAQ,MAAM,aAAa;AAGpD,sBAAgB;AAChB,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC/B,yBAAiB,KAAK,CAAC;AAAA,MACxB;AACA,gBAAU;AAAA,IACX,OAAO;AAEN,cAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,mBAAmB,IAAI,IAAI,aAAa;AACvE,YAAM,KAAK,IAAI,UAAU,QAAQ,KAAK,MAAM,mBAAmB,mBAAmB,IAAI,IAAI,aAAa;AACvG,gBAAU,QAAQ;AAAA,IACnB;AAEA,WAAO,EAAE,OAAO,KAAK,QAAA;AAAA,EACtB;AAKA,QAAM,eAAe,SAAS,MAAM;AACnC,UAAM,YAAY,SAAA;AAClB,UAAM,OAAO,iBAAA;AACb,UAAM,EAAE,OAAO,KAAK,QAAA,IAAYA,uBAAA;AAEhC,eAAW,QAAQ;AACnB,aAAS,QAAQ;AAEjB,UAAM,SAA+B,CAAA;AAErC,QAAI,gBAAgB;AACpB,aAAS,IAAI,OAAO,IAAI,KAAK,KAAK;AACjC,YAAM,OAAO,UAAU,CAAC;AACxB,UAAI,SAAS,QAAW;AACvB,cAAM,aAAa,OAAO,SAAS,aAAa,KAAK,CAAC,IAAI;AAE1D,eAAO,KAAK;AAAA,UACX;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,YACN,UAAU;AAAA,YACV,KAAK,GAAG,aAAa;AAAA,YACrB,QAAQ,GAAG,UAAU;AAAA,YACrB,OAAO;AAAA,UAAA;AAAA,QACR,CACA;AAED,yBAAiB;AAAA,MAClB;AAAA,IACD;AAEA,WAAO;AAAA,EACR,CAAC;AAKD,QAAM,YAAY,SAAS,OAAO;AAAA,IACjC,QAAQ,GAAG,UAAA,CAAW;AAAA,IACtB,UAAU;AAAA,IACV,UAAU;AAAA,EAAA,EACT;AAKF,WAAS,aAAa,OAAoB;AACzC,UAAM,SAAS,MAAM;AACrB,cAAU,QAAQ,OAAO;AAAA,EAC1B;AAKA,WAAS,cAAc,OAAqB;AAC3C,QAAI,CAAC,aAAa,MAAO;AAEzB,UAAM,OAAO,iBAAA;AACb,UAAM,YAAY,SAAA;AAElB,QAAI,OAAO,SAAS,YAAY;AAE/B,UAAI,SAAS;AACb,eAAS,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,UAAU,MAAM,GAAG,KAAK;AAC3D,kBAAU,KAAK,CAAC;AAAA,MACjB;AACA,mBAAa,MAAM,YAAY;AAAA,IAChC,OAAO;AACN,mBAAa,MAAM,YAAY,QAAQ;AAAA,IACxC;AAAA,EACD;AAKA,WAAS,SAAS,UAAwB;AACzC,QAAI,CAAC,aAAa,MAAO;AACzB,iBAAa,MAAM,YAAY;AAAA,EAChC;AAGA,YAAU,MAAM;AACf,QAAI,aAAa,OAAO;AACvB,mBAAa,MAAM,iBAAiB,UAAU,cAAc,EAAE,SAAS,MAAM;AAAA,IAC9E;AAAA,EACD,CAAC;AAGD,cAAY,MAAM;AACjB,QAAI,aAAa,OAAO;AACvB,mBAAa,MAAM,oBAAoB,UAAU,YAAY;AAAA,IAC9D;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;ACpSO,SAAS,WAAW,UAA6B,IAAsB;AAC7E,QAAM;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,IACZ;AAAA,EAAA,IACG;AAEJ,QAAM,UAAU,IAAI,MAAM,OAAO,CAAC;AAElC,MAAI,iBAAqC,MACxC,kBAAkB,IAClB,qBAAqB;AAEtB,WAAS,OAAa;AACrB,YAAQ,QAAQ;AAAA,EACjB;AAEA,WAAS,OAAa;AACrB,YAAQ,QAAQ;AAAA,EACjB;AAEA,WAAS,SAAe;AACvB,YAAQ,QAAQ,CAAC,QAAQ;AAAA,EAC1B;AAEA,WAASC,iBAAgB,WAA0B;AAClD,QAAI,CAAC,eAAgB;AAErB,QAAI,WAAW;AACd,qBAAe,UAAU,OAAO,UAAU;AAC1C,qBAAe,UAAU,IAAI,WAAW;AAExC,UAAI,WAAW;AACd,uBAAe,MAAM,aAAa,sBAAsB;AAAA,MACzD,OAAO;AACN,uBAAe,MAAM,UAAU;AAAA,MAChC;AAAA,IACD,OAAO;AACN,qBAAe,UAAU,OAAO,WAAW;AAC3C,qBAAe,UAAU,IAAI,UAAU;AAEvC,UAAI,WAAW;AACd,uBAAe,MAAM,aAAa;AAAA,MACnC,OAAO;AACN,uBAAe,MAAM,UAAU;AAAA,MAChC;AAAA,IACD;AAAA,EACD;AAEA,WAAS,KAAK,SAAkC;AAC/C,QAAI,CAAC,UAAA,EAAa,QAAO,MAAM;AAAA,IAAC;AAGhC,WAAA;AAEA,qBAAiB;AAGjB,sBAAkB,QAAQ,MAAM;AAChC,yBAAqB,QAAQ,MAAM;AAGnC,IAAAA,iBAAgB,QAAQ,KAAK;AAE7B,WAAO;AAAA,EACR;AAEA,WAAS,SAAe;AACvB,QAAI,gBAAgB;AAEnB,qBAAe,MAAM,UAAU;AAC/B,qBAAe,MAAM,aAAa;AAClC,qBAAe,UAAU,OAAO,YAAY,WAAW;AAAA,IACxD;AACA,qBAAiB;AAAA,EAClB;AAGA,QAAM,SAAS,CAAC,UAAU,aAAa;AACtC,QAAI,aAAa,UAAU;AAC1B,MAAAA,iBAAgB,QAAQ;AACxB,2CAAW;AAAA,IACZ;AAAA,EACD,CAAC;AAGD,MAAI,OAAO,YAAY,YAAY,WAAW,SAAS;AACtD,UAAM,SAAS,CAAA,aAAY;AAC1B,cAAQ,QAAQ;AAAA,IACjB,CAAC;AAAA,EACF;AAGA,cAAY,MAAM;AACjB,WAAA;AAAA,EACD,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;ACzCA,SAAS,sBAAsB,SAST;AACrB,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,QAAM,MAAM,OAAO,WAAW,IAAI;AAElC,MAAI,CAAC,KAAK;AACT,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACxE;AAEA,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACG;AAEJ,SAAO,QAAQ;AACf,SAAO,SAAS;AAEhB,MAAI,OAAO,GAAG,UAAU,IAAI,QAAQ,MAAM,UAAU;AACpD,MAAI,YAAY;AAChB,MAAI,YAAY;AAChB,MAAI,eAAe;AAGnB,MAAI,UAAU,QAAQ,GAAG,SAAS,CAAC;AACnC,MAAI,OAAQ,SAAS,KAAK,KAAM,GAAG;AAGnC,QAAM,eAAe,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAChE,QAAM,aAAa,WAAW;AAC9B,QAAM,SAAS,GAAG,aAAa,SAAS,KAAK,cAAc;AAE3D,eAAa,QAAQ,CAAC,MAAM,UAAU;AACrC,QAAI,SAAS,MAAM,GAAG,SAAS,QAAQ,UAAU;AAAA,EAClD,CAAC;AAED,SAAO;AACR;AA4BO,SAAS,aAAa,SAAkD;AAC9E,QAAM;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,MAAM,CAAC,KAAK,GAAG;AAAA,IACf,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS,WAAW;AAAA,EAAA,IACjB;AAGJ,QAAM,SAAS,IAA8B,IAAI;AACjD,QAAM,UAAU,IAAI,EAAE;AACtB,QAAM,cAAc,IAAI,MAAM,QAAQ,CAAC;AAKvC,WAAS,WAAiB;AACzB,UAAM,eAAe,MAAM,OAAO;AAClC,UAAM,aAAa,MAAM,KAAK;AAC9B,UAAM,cAAc,MAAM,MAAM;AAChC,UAAM,cAAc,MAAM,MAAM;AAChC,UAAM,gBAAgB,MAAM,QAAQ;AACpC,UAAM,kBAAkB,MAAM,UAAU;AACxC,UAAM,kBAAkB,MAAM,UAAU;AACxC,UAAM,aAAa,MAAM,KAAK;AAE9B,WAAO,QAAQ,sBAAsB;AAAA,MACpC,SAAS;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACR;AAED,YAAQ,QAAQ,OAAO,MAAM,UAAA;AAAA,EAC9B;AAKA,QAAM,QAAQ,IAaX;AAAA,IACF,UAAU;AAAA,IACV,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,QAAQ,MAAM,MAAM;AAAA,IACpB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,EAAA,CAChB;AAKD,WAAS,cAAoB;AAC5B,UAAM,WAAW,MAAM,GAAG;AAC1B,UAAM,cAAc,MAAM,MAAM;AAChC,UAAM,WAAW,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,UAAU,QAAQ;AACzE,UAAM,aAAa,MAAM,KAAK;AAC9B,UAAM,cAAc,MAAM,MAAM;AAEhC,UAAM,QAAQ,iCACV,MAAM,QADI;AAAA,MAEb,QAAQ;AAAA,MACR,iBAAiB,QAAQ,QAAQ,KAAK;AAAA,MACtC,oBAAoB,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC;AAAA,MAC3D,gBAAgB,GAAG,aAAa,SAAS,CAAC,CAAC,MAAM,cAAc,SAAS,CAAC,CAAC;AAAA,IAAA;AAAA,EAE5E;AAKA,WAAS,OAAO,YAAgD;AAC/D,WAAO,OAAO,SAAS,UAAU;AACjC,aAAA;AACA,gBAAA;AAAA,EACD;AAKA,WAAS,SAAe;AACvB,gBAAY,QAAQ;AAAA,EACrB;AAKA,WAAS,UAAgB;AACxB,gBAAY,QAAQ;AAAA,EACrB;AAGA;AAAA,IACC,MAAM;AAAA,MACL,MAAM,OAAO;AAAA,MACb,MAAM,KAAK;AAAA,MACX,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,MAAM,QAAQ;AAAA,MACd,MAAM,UAAU;AAAA,MAChB,MAAM,UAAU;AAAA,MAChB,MAAM,KAAK;AAAA,MACX,MAAM,GAAG;AAAA,MACT,MAAM,MAAM;AAAA,IAAA;AAAA,IAEb,MAAM;AACL,eAAA;AACA,kBAAA;AAAA,IACD;AAAA,IACA,EAAE,WAAW,KAAA;AAAA,EAAK;AAInB,QAAM,aAAa,CAAA,eAAc;AAChC,UAAM,MAAM,UAAU,aAAa,SAAS;AAAA,EAC7C,CAAC;AAGD,MAAI,MAAM,QAAQ,GAAG;AACpB,UAAM,MAAM,UAAU;AAAA,EACvB;AAGA,cAAY,MAAM;AAAA,EAElB,CAAC;AAED,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF;AAiBO,SAAS,mBACf,SACA,UAMI,IACK;;AACT,QAAM,SAAS,sBAAsB;AAAA,IACpC;AAAA,IACA,QAAO,aAAQ,UAAR,YAAiB;AAAA,IACxB,SAAQ,aAAQ,WAAR,YAAkB;AAAA,IAC1B,WAAU,aAAQ,aAAR,YAAoB;AAAA,IAC9B,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,QAAO,aAAQ,UAAR,YAAiB;AAAA,IACxB,SAAQ,aAAQ,WAAR,YAAkB;AAAA,EAAA,CAC1B;AAED,SAAO,OAAO,UAAA;AACf;AC7SA,MAAM,gBAA2C;AAAA,EAChD,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,OAAO;AAAA,EACP,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,gBAAgB;AACjB;AAKA,MAAM,UAAU,CAAC,KAAgB,UAAmC,OAAa;;AAKhF,MAAI,aAA2B;AAG/B,MAAI,OAAO,QAAQ,gBAAc,SAAI,YAAJ,mBAAa,WAAW,OAAM;AAC9D,iBAAa;AAAA,EACd,YAAW,2BAAK,aAAU,gCAAK,YAAL,mBAAc,WAAW,OAAM;AAExD,iBAAa;AAAA,EACd,WAAW,QAAO,2BAAK,eAAc,cAAc,QAAO,2BAAK,WAAU,gBAAc,SAAI,YAAJ,mBAAa,WAAW,OAAM;AAEpH,iBAAa;AAAA,EACd,WAAW,OAAO,WAAW,aAAa;AAEzC,UAAM,MAAM;AAEZ,SAAI,eAAI,QAAJ,mBAAS,YAAT,mBAAkB,WAAW,MAAM;AACtC,mBAAa;AAAA,IACd,YAAW,eAAI,QAAJ,mBAAS,YAAT,mBAAkB,WAAW,MAAM;AAC7C,mBAAa;AAAA,IACd;AAAA,EACD;AAGA,MAAI,YAAY;AACf,kBAAc,UAAU;AAAA,EACzB;AAEA,QAAM,EAAE,YAAY,MAAM,MAAA,IAAU;AAEpC,MAAI,OAAO,CAAC,YAAY;AAEvB,WAAO,QAAQ,aAAa,EAAE,QAAQ,CAAC,CAAC,MAAM,SAAS,MAAM;AAC5D,UAAI,UAAU,MAAM,SAAS;AAAA,IAC9B,CAAC;AAAA,EACF,OAAO;AAEN,eAAW,QAAQ,CAAA,SAAQ;AAC1B,YAAM,YAAY,cAAc,IAAI;AAEpC,UAAI,WAAW;AACd,YAAI,UAAU,MAAM,SAAS;AAAA,MAC9B,OAAO;AACN,gBAAQ,KAAK,iCAAiC,IAAI,EAAE;AAAA,MACrD;AAAA,IACD,CAAC;AAAA,EACF;AACD;AAKO,MAAM,WAAmB;AAAA,EAC/B;AACD;"}