directix 1.0.0-beta.2 → 1.0.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.
- package/README.md +98 -12
- package/dist/index.cjs +1095 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +121 -121
- package/dist/index.iife.js +1224 -0
- package/dist/index.iife.js.map +1 -0
- package/dist/index.iife.min.js +7 -0
- package/dist/{index.esm.js → index.mjs} +124 -62
- package/dist/index.mjs.map +1 -0
- package/package.json +106 -95
- package/dist/index.cjs.js +0 -2
- package/dist/index.cjs.js.map +0 -1
- package/dist/index.esm.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.iife.js","sources":["../packages/core/src/env.ts","../packages/core/src/adapter/vue2.ts","../packages/core/src/adapter/vue3.ts","../packages/core/src/define.ts","../packages/shared/src/dom.ts","../packages/shared/src/event.ts","../packages/shared/src/utils.ts","../src/directives/click-outside.ts","../src/directives/copy.ts","../src/directives/debounce.ts","../src/directives/throttle.ts","../src/directives/focus.ts","../src/index.ts"],"sourcesContent":["/**\n * Vue version detection\n */\nlet _vueVersion: 2 | 3 | null = null\n\n/**\n * Get current Vue version\n */\nexport function getVueVersion(): 2 | 3 {\n\tif (_vueVersion !== null) return _vueVersion\n\n\t// Try to detect Vue version\n\ttry {\n\t\t// Use dynamic import for ESM compatibility\n\t\t// eslint-disable-next-line ts/no-require-imports\n\t\tconst vue = require('vue')\n\n\t\tif (vue?.version?.startsWith('2')) {\n\t\t\t_vueVersion = 2\n\t\t} else if (vue?.version?.startsWith('3')) {\n\t\t\t_vueVersion = 3\n\t\t}\n\t} catch {\n\t\t// Vue not available\n\t}\n\n\t// Default to Vue 3\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'Please ensure Vue is installed correctly.',\n\t\t\t)\n\t\t}\n\t\t_vueVersion = 3\n\t}\n\n\treturn _vueVersion\n}\n\n/**\n * Check if Vue 2\n */\nexport const isVue2 = (): boolean => getVueVersion() === 2\n\n/**\n * Check if Vue 3\n */\nexport const isVue3 = (): boolean => getVueVersion() === 3\n\n/**\n * Check if browser environment\n */\nexport const isBrowser = (): boolean => {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\n/**\n * Check if server-side rendering\n */\nexport const isSSR = (): boolean => !isBrowser()\n\n/**\n * Check if passive event listening is supported\n */\nexport const supportsPassive = (): boolean => {\n\tif (!isBrowser()) return false\n\n\tlet supports = false\n\n\ttry {\n\t\tconst options = {\n\t\t\tget passive() {\n\t\t\t\tsupports = true\n\n\t\t\t\treturn false\n\t\t\t},\n\t\t}\n\n\t\twindow.addEventListener('test', null as any, options)\n\t\twindow.removeEventListener('test', null as any, options as any)\n\t} catch {\n\t\tsupports = false\n\t}\n\n\treturn supports\n}\n\n/**\n * Check if IntersectionObserver is supported\n */\nexport const supportsIntersectionObserver = (): boolean => {\n\treturn isBrowser() && 'IntersectionObserver' in window\n}\n\n/**\n * Check if ResizeObserver is supported\n */\nexport const supportsResizeObserver = (): boolean => {\n\treturn isBrowser() && 'ResizeObserver' in window\n}\n\n/**\n * Check if Clipboard API is supported\n */\nexport const supportsClipboard = (): boolean => {\n\treturn isBrowser() && 'clipboard' in navigator\n}\n\n/**\n * Check if MutationObserver is supported\n */\nexport const supportsMutationObserver = (): boolean => {\n\treturn isBrowser() && 'MutationObserver' in window\n}\n","import type { VNode } from 'vue'\nimport type { DirectiveBinding, DirectiveHooks } from '../types'\n\n/**\n * Element state storage\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Vue 2 directive adapter\n * @returns Vue 2 directive object with bind/inserted/update/unbind hooks\n */\nexport function createVue2Directive<T, B extends Element>(\n\thooks: DirectiveHooks<T, B>,\n): Record<string, any> {\n\tconst directive = {\n\t\tbind(el: B, binding: any, vnode: VNode) {\n\t\t\t// Store state\n\t\t\tconst state: ElementState = {\n\t\t\t\tvalue: binding.value,\n\t\t\t\tvnode,\n\t\t\t\tcleanup: [],\n\t\t\t}\n\n ;(el as any).__directix_state__ = state\n\t\t},\n\n\t\tinserted(el: B, binding: any, vnode: VNode) {\n\t\t\t// Vue 2's inserted is called after element is inserted into DOM\n\t\t\t// Call mounted here to ensure element is in DOM\n\t\t\tif (hooks.mounted) {\n\t\t\t\thooks.mounted(el, normalizeBinding(binding), vnode)\n\t\t\t}\n\t\t},\n\n\t\tupdate(el: B, binding: any, vnode: VNode, oldVnode: VNode) {\n\t\t\tconst state = (el as any).__directix_state__\n\n\t\t\tif (hooks.updated) {\n\t\t\t\thooks.updated(\n\t\t\t\t\tel,\n\t\t\t\t\tnormalizeBinding(binding),\n\t\t\t\t\tvnode,\n\t\t\t\t\tnormalizeBinding({ ...binding, value: binding.oldValue }),\n\t\t\t\t\toldVnode,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Update state\n\t\t\tif (state) {\n\t\t\t\tstate.value = binding.value\n\t\t\t\tstate.vnode = vnode\n\t\t\t}\n\t\t},\n\n\t\tcomponentUpdated(_el: B, _binding: any, _vnode: VNode, _oldVnode: VNode) {\n\t\t\t// Vue 2 specific, called after component update completes\n\t\t\t// Usually update is sufficient\n\t\t},\n\n\t\tunbind(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.unmounted) {\n\t\t\t\thooks.unmounted(el, normalizeBinding(binding), vnode)\n\t\t\t}\n\n\t\t\t// Execute cleanup functions\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (state?.cleanup) {\n\t\t\t\tstate.cleanup.forEach(fn => fn())\n\t\t\t}\n\t\t\tdelete (el as any).__directix_state__\n\t\t},\n\t}\n\n\treturn directive\n}\n\n/**\n * Normalize Vue 2 binding to unified format\n */\nfunction normalizeBinding<T>(binding: any): DirectiveBinding<T> {\n\treturn {\n\t\tvalue: binding.value,\n\t\toldValue: binding.oldValue ?? null,\n\t\targ: binding.arg,\n\t\tmodifiers: binding.modifiers || {},\n\t\tinstance: binding.instance || null,\n\t}\n}\n\n/**\n * Add cleanup function to element\n */\nexport function addCleanup(el: Element, fn: () => void): void {\n\tconst state = (el as any).__directix_state__\n\n\tif (state) {\n\t\tstate.cleanup.push(fn)\n\t}\n}\n","import type { VNode } from 'vue'\nimport type { DirectiveBinding, DirectiveHooks } from '../types'\n\n/**\n * Element state storage\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Vue 3 directive adapter\n * @returns Vue 3 directive object with created/mounted/updated/unmounted hooks\n */\nexport function createVue3Directive<T, B extends Element>(\n\thooks: DirectiveHooks<T, B>,\n): Record<string, any> {\n\tconst directive = {\n\t\tcreated(el: B, binding: any, vnode: VNode) {\n\t\t\t// Vue 3's created is called when element is created\n\t\t\t// Initialize state\n\t\t\tconst state: ElementState = {\n\t\t\t\tvalue: binding.value,\n\t\t\t\tvnode,\n\t\t\t\tcleanup: [],\n\t\t\t}\n\n ;(el as any).__directix_state__ = state\n\t\t},\n\n\t\tbeforeMount(_el: B, _binding: any, _vnode: VNode) {\n\t\t\t// Before mount\n\t\t},\n\n\t\tmounted(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.mounted) {\n\t\t\t\thooks.mounted(el, normalizeBindingVue3(binding), vnode)\n\t\t\t}\n\t\t},\n\n\t\tbeforeUpdate(_el: B, _binding: any, _vnode: VNode, _prevVnode: VNode) {\n\t\t\t// Before update\n\t\t},\n\n\t\tupdated(el: B, binding: any, vnode: VNode, prevVnode: VNode) {\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (hooks.updated) {\n\t\t\t\thooks.updated(\n\t\t\t\t\tel,\n\t\t\t\t\tnormalizeBindingVue3(binding),\n\t\t\t\t\tvnode,\n\t\t\t\t\tnormalizeBindingVue3({ ...binding, value: binding.oldValue }),\n\t\t\t\t\tprevVnode,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Update state\n\t\t\tif (state) {\n\t\t\t\tstate.value = binding.value\n\t\t\t\tstate.vnode = vnode\n\t\t\t}\n\t\t},\n\n\t\tbeforeUnmount(_el: B, _binding: any, _vnode: VNode) {\n\t\t\t// Before unmount\n\t\t},\n\n\t\tunmounted(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.unmounted) {\n\t\t\t\thooks.unmounted(el, normalizeBindingVue3(binding), vnode)\n\t\t\t}\n\n\t\t\t// Execute cleanup functions\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (state?.cleanup) {\n\t\t\t\tstate.cleanup.forEach(fn => fn())\n\t\t\t}\n\t\t\tdelete (el as any).__directix_state__\n\t\t},\n\t}\n\n\treturn directive\n}\n\n/**\n * Normalize Vue 3 binding to unified format\n */\nfunction normalizeBindingVue3<T>(binding: any): DirectiveBinding<T> {\n\treturn {\n\t\tvalue: binding.value,\n\t\toldValue: binding.oldValue ?? null,\n\t\targ: binding.arg,\n\t\tmodifiers: binding.modifiers || {},\n\t\tinstance: binding.instance,\n\t}\n}\n\n/**\n * Add cleanup function to element\n */\nexport function addCleanup(el: Element, fn: () => void): void {\n\tconst state = (el as any).__directix_state__\n\n\tif (state) {\n\t\tstate.cleanup.push(fn)\n\t}\n}\n","import type { Directive } from 'vue'\nimport { isSSR, isVue2 } from './env'\nimport { createVue2Directive } from './adapter/vue2'\nimport { createVue3Directive } from './adapter/vue3'\nimport type { DirectiveBinding, DirectiveDefinition, DirectiveHooks } from './types'\n\n/**\n * Define a cross-version compatible directive\n * @param definition The directive definition\n * @returns Vue directive object\n */\nexport function defineDirective<T = any, B extends Element = Element>(\n\tdefinition: DirectiveDefinition<T, B>,\n): Directive {\n\tconst { name, version, ssr, defaults, ...hooks } = definition\n\n\t// SSR check\n\tif (isSSR() && !ssr) {\n\t\tif (typeof process !== 'undefined' && process.env?.NODE_ENV !== 'test') {\n\t\t\tconsole.warn(\n `[Directix] Directive \"${name}\" is not compatible with SSR. ` +\n '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\tconst mergedBinding = applyDefaults(binding, defaults)\n\n\t\t\thooks.mounted!(el, mergedBinding, vnode)\n\t\t} : undefined,\n\n\t\tupdated: hooks.updated ? (el, binding, vnode, prevBinding, prevVnode) => {\n\t\t\tconst mergedBinding = applyDefaults(binding, defaults)\n\n\t\t\thooks.updated!(el, mergedBinding, vnode, prevBinding, prevVnode)\n\t\t} : undefined,\n\n\t\tunmounted: hooks.unmounted,\n\t}\n\n\t// Create directive based on Vue version\n\tif (isVue2()) {\n\t\treturn createVue2Directive(wrappedHooks) as Directive\n\t}\n\n\treturn createVue3Directive(wrappedHooks) as Directive\n}\n\n/**\n * Apply default values to binding\n */\nfunction applyDefaults<T>(\n\tbinding: DirectiveBinding<T>,\n\tdefaults?: Partial<T>,\n): DirectiveBinding<T> {\n\tif (!defaults) return binding\n\n\tconst value =\n\t\ttypeof binding.value === 'object' && binding.value !== null ? { ...defaults, ...binding.value } : binding.value\n\n\treturn { ...binding, value: value as T }\n}\n\n/**\n * Create a no-op directive (for SSR)\n */\nfunction createNoOpDirective(): Directive {\n\treturn {\n\t\tmounted: () => {},\n\t\tupdated: () => {},\n\t\tunmounted: () => {},\n\t}\n}\n\n/**\n * Define a directive group\n */\nexport function defineDirectiveGroup(\n\tname: string,\n\tdirectives: Record<string, any>,\n): { name: string; directives: Record<string, any>; install: (app: any) => void } {\n\treturn {\n\t\tname,\n\t\tdirectives,\n\t\tinstall(app: any, _options?: any) {\n\t\t\tObject.entries(directives).forEach(([directiveName, directive]) => {\n\t\t\t\tconst fullName = `${name}-${directiveName}`\n\n\t\t\t\tapp.directive(fullName, directive)\n\t\t\t})\n\t\t},\n\t}\n}\n","import { isBrowser } from '@directix/core'\n\n/**\n * Check if value is an Element\n */\nexport function isElement(value: unknown): value is Element {\n\treturn value instanceof Element\n}\n\n/**\n * Check if value is an HTMLElement\n */\nexport function isHTMLElement(value: unknown): value is HTMLElement {\n\treturn value instanceof HTMLElement\n}\n\n/**\n * Get element by selector or return element itself\n */\nexport function getElement(target: string | Element | null | undefined): Element | null {\n\tif (!target) return null\n\n\tif (typeof target === 'string') {\n\t\tif (!isBrowser()) return null\n\n\t\treturn document.querySelector(target)\n\t}\n\n\treturn isElement(target) ? target : null\n}\n\n/**\n * Get all elements matching selector\n */\nexport function getAllElements(target: string): Element[] {\n\tif (!isBrowser()) return []\n\n\treturn Array.from(document.querySelectorAll(target))\n}\n\n/**\n * Add classes to element\n */\nexport function addClass(el: Element, ...classes: string[]): void {\n\tel.classList.add(...classes)\n}\n\n/**\n * Remove classes from element\n */\nexport function removeClass(el: Element, ...classes: string[]): void {\n\tel.classList.remove(...classes)\n}\n\n/**\n * Toggle class on element\n */\nexport function toggleClass(el: Element, className: string, force?: boolean): void {\n\tel.classList.toggle(className, force)\n}\n\n/**\n * Check if element has class\n */\nexport function hasClass(el: Element, className: string): boolean {\n\treturn el.classList.contains(className)\n}\n\n/**\n * Get element style property\n */\nexport function getStyle(el: Element, property: string): string {\n\tif (!isBrowser()) return ''\n\n\treturn getComputedStyle(el).getPropertyValue(property)\n}\n\n/**\n * Set element style property\n */\nexport function setStyle(el: HTMLElement, property: string, value: string | number): void {\n\tel.style.setProperty(property, typeof value === 'number' ? `${value}px` : value)\n}\n\n/**\n * Set multiple styles on element\n */\nexport function setStyles(el: HTMLElement, styles: Record<string, string | number>): void {\n\tObject.entries(styles).forEach(([property, value]) => {\n\t\tsetStyle(el, property, value)\n\t})\n}\n\n/**\n * Get element offset position\n */\nexport function getOffset(el: Element): { top: number; left: number } {\n\tif (!isBrowser()) return { top: 0, left: 0 }\n\tconst rect = el.getBoundingClientRect()\n\n\treturn {\n\t\ttop: rect.top + window.scrollY,\n\t\tleft: rect.left + window.scrollX,\n\t}\n}\n\n/**\n * Get element size\n */\nexport function getSize(el: Element): { width: number; height: number } {\n\tconst rect = el.getBoundingClientRect()\n\n\treturn {\n\t\twidth: rect.width,\n\t\theight: rect.height,\n\t}\n}\n\n/**\n * Check if element is in viewport\n */\nexport function isInViewport(el: Element): boolean {\n\tif (!isBrowser()) return false\n\tconst rect = el.getBoundingClientRect()\n\n\treturn (\n\t\trect.top >= 0 &&\n\t\trect.left >= 0 &&\n\t\trect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t)\n}\n\n/**\n * Get nearest scrollable parent element\n */\nexport function getScrollParent(el: Element): Element | Window {\n\tif (!isBrowser()) return window\n\n\tlet parent: Element | null = el.parentElement\n\n\twhile (parent) {\n\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent)\n\n\t\tif (/(auto|scroll)/.test(overflow + overflowX + overflowY)) {\n\t\t\treturn parent\n\t\t}\n\n\t\tparent = parent.parentElement\n\t}\n\n\treturn window\n}\n\n/**\n * Check if element matches selector\n */\nexport function matches(el: Element, selector: string): boolean {\n\treturn el.matches(selector)\n}\n\n/**\n * Get nearest ancestor matching selector\n */\nexport function closest(el: Element, selector: string): Element | null {\n\treturn el.closest(selector)\n}\n","import { isBrowser, supportsPassive } from '@directix/core'\n\nexport interface EventOptions {\n\tcapture?: boolean\n\tpassive?: boolean\n\tonce?: boolean\n}\n\n/**\n * Add event listener\n */\nexport function on(\n\ttarget: EventTarget,\n\tevent: string,\n\thandler: (event: Event) => void,\n\toptions: boolean | EventOptions = false,\n): void {\n\tif (!isBrowser()) return\n\tconst opts = normalizeOptions(options)\n\n\ttarget.addEventListener(event, handler, opts)\n}\n\n/**\n * Remove event listener\n */\nexport function off(\n\ttarget: EventTarget,\n\tevent: string,\n\thandler: (event: Event) => void,\n\toptions: boolean | EventOptions = false,\n): void {\n\tif (!isBrowser()) return\n\tconst opts = normalizeOptions(options)\n\n\ttarget.removeEventListener(event, handler, opts)\n}\n\n/**\n * Emit custom event\n */\nexport function emit(target: EventTarget, event: string, detail?: any): boolean {\n\tif (!isBrowser()) return false\n\n\treturn target.dispatchEvent(new CustomEvent(event, { detail }))\n}\n\n/**\n * Normalize event options\n */\nfunction normalizeOptions(options: boolean | EventOptions): boolean | { capture: boolean; passive: boolean; once: boolean } {\n\tif (typeof options === 'boolean') {\n\t\treturn options\n\t}\n\n\tconst { capture = false, passive = false, once = false } = options\n\n\tif (supportsPassive()) {\n\t\treturn { capture, passive, once }\n\t}\n\n\treturn capture\n}\n\n/**\n * Create event delegation\n */\nexport function delegate(\n\tcontainer: Element,\n\tselector: string,\n\tevent: string,\n\thandler: (el: Element, e: Event) => void,\n\toptions?: EventOptions,\n): () => void {\n\tconst listener = (e: Event): void => {\n\t\tconst target = e.target as Element\n\t\tconst matched = target.closest(selector)\n\n\t\tif (matched && container.contains(matched)) {\n\t\t\thandler(matched, e)\n\t\t}\n\t}\n\n\ton(container, event, listener, options)\n\n\treturn () => off(container, event, listener, options)\n}\n\n/**\n * Stop event propagation\n */\nexport function stopPropagation(e: Event): void {\n\te.stopPropagation()\n}\n\n/**\n * Prevent default behavior\n */\nexport function preventDefault(e: Event): void {\n\te.preventDefault()\n}\n\n/**\n * Stop event propagation and prevent default behavior\n */\nexport function stopEvent(e: Event): void {\n\tstopPropagation(e)\n\tpreventDefault(e)\n}\n\n/**\n * Get event target\n */\nexport function getEventTarget<T extends EventTarget = EventTarget>(e: Event): T | null {\n\treturn e.target as T | null\n}\n\n/**\n * Get current event target\n */\nexport function getCurrentTarget<T extends EventTarget = EventTarget>(e: Event): T | null {\n\treturn e.currentTarget as T | null\n}\n\n/**\n * Get mouse/touch position from event\n */\nexport function getEventPosition(\n\te: MouseEvent | TouchEvent,\n): { x: number; y: number; clientX: number; clientY: number } {\n\tlet clientX = 0,\n\t\tclientY = 0\n\n\tif ('touches' in e && e.touches.length > 0) {\n\t\tclientX = e.touches[0].clientX\n\t\tclientY = e.touches[0].clientY\n\t} else if ('clientX' in e) {\n\t\tclientX = e.clientX\n\t\tclientY = e.clientY\n\t}\n\n\treturn {\n\t\tx: clientX,\n\t\ty: clientY,\n\t\tclientX,\n\t\tclientY,\n\t}\n}\n","/**\n * Check if value is a string\n */\nexport function isString(value: unknown): value is string {\n\treturn typeof value === 'string'\n}\n\n/**\n * Check if value is a number\n */\nexport function isNumber(value: unknown): value is number {\n\treturn typeof value === 'number' && !Number.isNaN(value)\n}\n\n/**\n * Check if value is a boolean\n */\nexport function isBoolean(value: unknown): value is boolean {\n\treturn typeof value === 'boolean'\n}\n\n/**\n * Check if value is a function\n */\nexport function isFunction(value: unknown): value is (...args: any[]) => any {\n\treturn typeof value === 'function'\n}\n\n/**\n * Check if value is an object\n */\nexport function isObject(value: unknown): value is Record<string, any> {\n\treturn typeof value === 'object' && value !== null\n}\n\n/**\n * Check if value is an array\n */\nexport function isArray(value: unknown): value is any[] {\n\treturn Array.isArray(value)\n}\n\n/**\n * Check if value is empty\n */\nexport function isEmpty(value: unknown): boolean {\n\tif (value === null || value === undefined) return true\n\tif (isString(value) || isArray(value)) return value.length === 0\n\tif (isObject(value)) return Object.keys(value).length === 0\n\n\treturn false\n}\n\n/**\n * Check if value is a Promise\n */\nexport function isPromise<T = any>(value: unknown): value is Promise<T> {\n\treturn isObject(value) && isFunction((value as any).then)\n}\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n\tif (obj === null || typeof obj !== 'object') {\n\t\treturn obj\n\t}\n\n\tif (Array.isArray(obj)) {\n\t\treturn obj.map(item => deepClone(item)) as unknown as T\n\t}\n\n\tconst cloned = {} as T\n\n\tfor (const key in obj) {\n\t\tif (Object.prototype.hasOwnProperty.call(obj, key)) {\n\t\t\tcloned[key] = deepClone(obj[key])\n\t\t}\n\t}\n\n\treturn cloned\n}\n\n/**\n * Deep merge objects\n */\nexport function deepMerge<T extends Record<string, any>>(\n\ttarget: T,\n\t...sources: Partial<T>[]\n): T {\n\tif (!sources.length) return target\n\n\tconst source = sources.shift()\n\n\tif (isObject(target) && isObject(source)) {\n\t\tfor (const key in source) {\n\t\t\tif (isObject(source[key])) {\n\t\t\t\tif (!target[key]) {\n\t\t\t\t\tObject.assign(target, { [key]: {} })\n\t\t\t\t}\n\t\t\t\tdeepMerge(\n\t\t\t\t\ttarget[key] as Record<string, any>,\n\t\t\t\t\tsource[key] as Record<string, any>,\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tObject.assign(target, { [key]: source[key] })\n\t\t\t}\n\t\t}\n\t}\n\n\treturn deepMerge(target, ...sources)\n}\n\n/**\n * Get nested property value by path\n */\nexport function get<T = any>(\n\tobj: Record<string, any>,\n\tpath: string,\n\tdefaultValue?: T,\n): T {\n\tconst keys = path.split('.')\n\tlet result: any = obj\n\n\tfor (const key of keys) {\n\t\tif (result === null || result === undefined) {\n\t\t\treturn defaultValue as T\n\t\t}\n\t\tresult = result[key]\n\t}\n\n\treturn (result === undefined ? defaultValue : result) as T\n}\n\n/**\n * Set nested property value by path\n */\nexport function set(obj: Record<string, any>, path: string, value: any): void {\n\tconst keys = path.split('.')\n\tconst lastKey = keys.pop()!\n\tlet current = obj\n\n\tfor (const key of keys) {\n\t\tif (current[key] === undefined) {\n\t\t\tcurrent[key] = {}\n\t\t}\n\t\tcurrent = current[key]\n\t}\n\n\tcurrent[lastKey] = value\n}\n\n/**\n * Debounce function\n */\nexport function debounce<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number = 300,\n\toptions: { leading?: boolean; trailing?: boolean } = {},\n): ((...args: Parameters<T>) => void) & { cancel: () => void; flush: () => void } {\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null\n\n\tconst { leading = false, trailing = true } = options\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\tfunc.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst debounced = function (this: any, ...args: Parameters<T>): void {\n\t\tlastArgs = args\n\t\t// eslint-disable-next-line ts/no-this-alias\n\t\tlastThis = this\n\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t}\n\n\t\tif (leading && !timerId) {\n\t\t\tinvokeFunc()\n\t\t}\n\n\t\ttimerId = setTimeout(() => {\n\t\t\tif (trailing) {\n\t\t\t\tinvokeFunc()\n\t\t\t}\n\t\t\ttimerId = null\n\t\t}, wait)\n\t} as ((...args: Parameters<T>) => void) & { cancel: () => void; flush: () => void }\n\n\tdebounced.cancel = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tlastArgs = null\n\t\tlastThis = null\n\t}\n\n\tdebounced.flush = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\tinvokeFunc()\n\t\t\ttimerId = null\n\t\t}\n\t}\n\n\treturn debounced\n}\n\n/**\n * Throttle function\n */\nexport function throttle<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number = 300,\n\toptions: { leading?: boolean; trailing?: boolean } = {},\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null,\n\t\tlastCallTime = 0\n\n\tconst { leading = true, trailing = true } = options\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\tfunc.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst throttled = function (this: any, ...args: Parameters<T>): void {\n\t\tconst now = Date.now()\n\n\t\tif (!lastCallTime && !leading) {\n\t\t\tlastCallTime = now\n\t\t}\n\n\t\tconst remaining = wait - (now - lastCallTime)\n\n\t\tlastArgs = args\n\t\t// eslint-disable-next-line ts/no-this-alias\n\t\tlastThis = this\n\n\t\tif (remaining <= 0 || remaining > wait) {\n\t\t\tif (timerId) {\n\t\t\t\tclearTimeout(timerId)\n\t\t\t\ttimerId = null\n\t\t\t}\n\t\t\tlastCallTime = now\n\t\t\tinvokeFunc()\n\t\t} else if (!timerId && trailing) {\n\t\t\ttimerId = setTimeout(() => {\n\t\t\t\tlastCallTime = leading ? Date.now() : 0\n\t\t\t\ttimerId = null\n\t\t\t\tinvokeFunc()\n\t\t\t}, remaining)\n\t\t}\n\t} as ((...args: Parameters<T>) => void) & { cancel: () => void }\n\n\tthrottled.cancel = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tlastCallTime = 0\n\t\tlastArgs = null\n\t\tlastThis = null\n\t}\n\n\treturn throttled\n}\n\n/**\n * Parse time argument\n * Supports formats: \"300\" | \"300ms\" | \"1s\"\n */\nexport function parseTime(arg?: string): number | null {\n\tif (!arg) return null\n\n\tif (arg.endsWith('ms')) {\n\t\treturn Number.parseInt(arg, 10)\n\t}\n\n\tif (arg.endsWith('s')) {\n\t\treturn Number.parseFloat(arg) * 1000\n\t}\n\n\tconst num = Number.parseInt(arg, 10)\n\n\treturn Number.isNaN(num) ? null : num\n}\n\n/**\n * Generate unique ID\n */\nexport function generateId(prefix: string = ''): string {\n\treturn `${prefix}${Date.now().toString(36)}${Math.random().toString(36).slice(2, 9)}`\n}\n","import { defineDirective } from '@directix/core'\nimport { getElement, off, on } from '@directix/shared'\n\n/**\n * Click outside handler\n */\nexport type ClickOutsideHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Click outside directive options\n */\nexport interface ClickOutsideOptions {\n\t/**\n * Callback when clicking outside\n * @required\n */\n\thandler: ClickOutsideHandler\n\n\t/**\n * Excluded element selectors or element references\n */\n\texclude?: (string | HTMLElement | (() => HTMLElement | null))[]\n\n\t/**\n * Whether to use capture mode\n * @default true\n */\n\tcapture?: boolean\n\n\t/**\n * Event types to listen for\n * @default ['click']\n */\n\tevents?: ('click' | 'mousedown' | 'mouseup' | 'touchstart' | 'touchend')[]\n\n\t/**\n * Whether to disable\n * @default false\n */\n\tdisabled?: boolean\n\n\t/**\n * Stop propagation\n * @default false\n */\n\tstop?: boolean\n\n\t/**\n * Prevent default behavior\n * @default false\n */\n\tprevent?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ClickOutsideBinding = ClickOutsideHandler | ClickOutsideOptions\n\n/**\n * Element state storage\n */\ninterface ClickOutsideState {\n\toptions: ClickOutsideOptions\n\thandlers: Map<string, (event: Event) => void>\n}\n\n/**\n * v-click-outside directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-click-outside=\"handleClickOutside\">\n * Dropdown menu\n * </div>\n * </template>\n * ```\n */\nexport const vClickOutside = defineDirective<ClickOutsideBinding, HTMLElement>({\n\tname: 'click-outside',\n\tssr: false,\n\tdefaults: {\n\t\tcapture: true,\n\t\tevents: ['click'],\n\t\tdisabled: false,\n\t\tstop: false,\n\t\tprevent: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\tconst state: ClickOutsideState = {\n\t\t\toptions,\n\t\t\thandlers: new Map(),\n\t\t}\n\n ;(el as any).__clickOutside = state\n\n\t\t// Create event handler\n\t\tconst createHandler = (_eventType: string) => {\n\t\t\treturn (event: Event) => {\n\t\t\t\t// Check event target\n\t\t\t\tif (!isValidClick(el, event, options)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Stop propagation\n\t\t\t\tif (options.stop) {\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t}\n\n\t\t\t\t// Prevent default behavior\n\t\t\t\tif (options.prevent) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t}\n\n\t\t\t\t// Call handler\n\t\t\t\toptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t}\n\t\t}\n\n\t\t// Bind events\n\t\toptions.events!.forEach(eventType => {\n\t\t\tconst handler = createHandler(eventType)\n\n\t\t\tstate.handlers.set(eventType, handler)\n\n\t\t\tconst listenerOptions = {\n\t\t\t\tcapture: options.capture,\n\t\t\t\tpassive: !options.prevent,\n\t\t\t}\n\n\t\t\ton(document, eventType, handler, listenerOptions)\n\t\t})\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ClickOutsideState = (el as any).__clickOutside\n\n\t\tif (!state) return\n\n\t\tconst oldOptions = state.options\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// If disabled state changes\n\t\tif (oldOptions.disabled !== newOptions.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\t// Remove all listeners\n\t\t\t\tstate.handlers.forEach((handler, eventType) => {\n\t\t\t\t\toff(document, eventType, handler, { capture: oldOptions.capture })\n\t\t\t\t})\n\t\t\t\tstate.handlers.clear()\n\t\t\t} else {\n\t\t\t\t// Re-add listeners\n\t\t\t\tconst createHandler = (_eventType: string) => {\n\t\t\t\t\treturn (event: Event) => {\n\t\t\t\t\t\tif (!isValidClick(el, event, newOptions)) return\n\t\t\t\t\t\tif (newOptions.stop) event.stopPropagation()\n\t\t\t\t\t\tif (newOptions.prevent) event.preventDefault()\n\t\t\t\t\t\tnewOptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnewOptions.events!.forEach(eventType => {\n\t\t\t\t\tconst handler = createHandler(eventType)\n\n\t\t\t\t\tstate.handlers.set(eventType, handler)\n\t\t\t\t\ton(document, eventType, handler, {\n\t\t\t\t\t\tcapture: newOptions.capture,\n\t\t\t\t\t\tpassive: !newOptions.prevent,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ClickOutsideState = (el as any).__clickOutside\n\n\t\tif (!state) return\n\n\t\t// Remove all event listeners\n\t\tstate.handlers.forEach((handler, eventType) => {\n\t\t\toff(document, eventType, handler, { capture: state.options.capture })\n\t\t})\n\n\t\tdelete (el as any).__clickOutside\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ClickOutsideBinding | undefined): ClickOutsideOptions {\n\tif (typeof binding === 'function') {\n\t\treturn {\n\t\t\thandler: binding,\n\t\t\tcapture: true,\n\t\t\tevents: ['click'],\n\t\t\tdisabled: false,\n\t\t\tstop: false,\n\t\t\tprevent: false,\n\t\t}\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-click-outside: handler is required')\n\t}\n\n\treturn {\n\t\tcapture: binding.capture ?? true,\n\t\tevents: binding.events ?? ['click'],\n\t\tdisabled: binding.disabled ?? false,\n\t\tstop: binding.stop ?? false,\n\t\tprevent: binding.prevent ?? false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if click is valid (outside the element)\n */\nfunction isValidClick(\n\tel: HTMLElement,\n\tevent: Event,\n\toptions: ClickOutsideOptions,\n): boolean {\n\tconst target = event.target as Node\n\n\t// Check if clicked on element itself or its children\n\tif (el.contains(target)) {\n\t\treturn false\n\t}\n\n\t// Check excluded elements\n\tif (options.exclude?.length) {\n\t\tfor (const exclude of options.exclude) {\n\t\t\tconst excludeEl = typeof exclude === 'function' ? exclude() : getElement(exclude)\n\n\t\t\tif (excludeEl && (excludeEl === target || excludeEl.contains(target))) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true\n}\n\nexport default vClickOutside\n","import { defineDirective, supportsClipboard } from '@directix/core'\n\n/**\n * Copy success callback\n */\nexport type CopySuccessCallback = (text: string) => void\n\n/**\n * Copy error callback\n */\nexport type CopyErrorCallback = (error: Error) => void\n\n/**\n * Copy directive options\n */\nexport interface CopyOptions {\n\t/**\n * Text to copy\n * @required\n */\n\tvalue: string\n\n\t/**\n * Callback on copy success\n */\n\tonSuccess?: CopySuccessCallback\n\n\t/**\n * Callback on copy error\n */\n\tonError?: CopyErrorCallback\n\n\t/**\n * Tooltip text for the copy button\n */\n\ttitle?: string\n\n\t/**\n * Whether to disable\n * @default false\n */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type CopyBinding = string | CopyOptions\n\n/**\n * Element state storage\n */\ninterface CopyState {\n\thandler: () => void\n\toptions: CopyOptions\n}\n\n/**\n * Copy text to clipboard\n * Prefer Clipboard API, fallback to execCommand\n */\nasync function copyToClipboard(text: string): Promise<boolean> {\n\t// Method 1: Use Clipboard API\n\tif (supportsClipboard()) {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(text)\n\n\t\t\treturn true\n\t\t} catch {\n\t\t\t// Permission denied or other error, fallback\n\t\t\tconsole.warn('[Directix] Clipboard API failed, falling back to execCommand')\n\t\t}\n\t}\n\n\t// Method 2: Use execCommand (deprecated but has good compatibility)\n\treturn copyWithExecCommand(text)\n}\n\n/**\n * Copy using execCommand\n */\nfunction copyWithExecCommand(text: string): boolean {\n\t// Create temporary textarea\n\tconst textarea = document.createElement('textarea')\n\n\ttextarea.value = text\n\n\t// Set styles to make it invisible\n\ttextarea.style.cssText = `\n position: fixed;\n top: -9999px;\n left: -9999px;\n opacity: 0;\n pointer-events: none;\n `\n\n\tdocument.body.appendChild(textarea)\n\n\ttry {\n\t\t// Select and copy\n\t\ttextarea.select()\n\t\ttextarea.setSelectionRange(0, textarea.value.length)\n\n\t\treturn document.execCommand('copy')\n\t} catch {\n\t\treturn false\n\t} finally {\n\t\t// Cleanup\n\t\tdocument.body.removeChild(textarea)\n\t}\n}\n\n/**\n * v-copy directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-copy=\"textToCopy\">Copy Text</button>\n * </template>\n * ```\n */\nexport const vCopy = defineDirective<CopyBinding, HTMLElement>({\n\tname: 'copy',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Set tooltip\n\t\tif (options.title) {\n\t\t\tel.setAttribute('title', options.title)\n\t\t}\n\n\t\t// State storage - handler reads latest value from here\n\t\tconst state: CopyState = {\n\t\t\thandler: null as any,\n\t\t\toptions,\n\t\t}\n\n\t\t// Add click event - read latest options from state\n\t\tstate.handler = async () => {\n\t\t\tconst text = state.options.value\n\n\t\t\tif (!text) {\n\t\t\t\tconsole.warn('[Directix] v-copy: No text to copy')\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst success = await copyToClipboard(text)\n\n\t\t\t\tif (success) {\n\t\t\t\t\tstate.options.onSuccess?.(text)\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('copy:success', { detail: { text } }))\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Copy failed')\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err as Error\n\n\t\t\t\tstate.options.onError?.(error)\n\t\t\t\tel.dispatchEvent(new CustomEvent('copy:error', { detail: { error } }))\n\t\t\t}\n\t\t}\n\n\t\tel.addEventListener('click', state.handler)\n\t\t;(el as any).__copy = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: CopyState = (el as any).__copy\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\tif (state.options.title) {\n\t\t\tel.setAttribute('title', state.options.title)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: CopyState = (el as any).__copy\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handler)\n\t\tdelete (el as any).__copy\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CopyBinding): CopyOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { value: binding }\n\t}\n\n\treturn binding\n}\n\nexport default vCopy\n","import { defineDirective } from '@directix/core'\nimport { debounce, parseTime } from '@directix/shared'\nimport type { DirectiveBinding } from '@directix/core'\n\n/**\n * Debounced function type\n */\nexport interface DebouncedFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n\tflush: () => void\n}\n\n/**\n * Debounce directive options\n */\nexport interface DebounceOptions<T extends (...args: any[]) => any = any> {\n\t/**\n * Function to debounce\n */\n\thandler: T\n\n\t/**\n * Delay time in milliseconds\n * @default 300\n */\n\twait?: number\n\n\t/**\n * Whether to invoke immediately before delay starts\n * @default false\n */\n\tleading?: boolean\n\n\t/**\n * Whether to invoke after delay ends\n * @default true\n */\n\ttrailing?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type DebounceBinding<T extends (...args: any[]) => any = any> =\n | T\n | DebounceOptions<T>\n\n/**\n * Element state storage\n */\ninterface DebounceState {\n\tdebouncedFn: DebouncedFunction<any>\n\teventType: string\n\toptions: DebounceOptions\n}\n\n/**\n * v-debounce directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-debounce=\"handleInput\" />\n * <input v-debounce:500ms=\"handleInput\" />\n * <input v-debounce=\"{ handler: handleInput, wait: 500 }\" />\n * <div v-debounce.scroll=\"handleScroll\">Scroll Debounce</div>\n * <div v-debounce:100.scroll=\"handleScroll\">100ms Scroll Debounce</div>\n * </template>\n * ```\n */\nexport const vDebounce = defineDirective<DebounceBinding, HTMLElement>({\n\tname: 'debounce',\n\tssr: false,\n\tdefaults: {\n\t\twait: 300,\n\t\tleading: false,\n\t\ttrailing: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t// Prefer event type from modifiers, otherwise infer from element type\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getEventType(el)\n\n\t\t// Create debounced function\n\t\tconst debouncedFn = debounce(options.handler, options.wait, {\n\t\t\tleading: options.leading,\n\t\t\ttrailing: options.trailing,\n\t\t})\n\n\t\t// Bind event\n\t\tel.addEventListener(eventType, debouncedFn as any)\n\n\t\t;(el as any).__debounce = {\n\t\t\tdebouncedFn,\n\t\t\teventType,\n\t\t\toptions,\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: DebounceState = (el as any).__debounce\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If configuration changes, recreate debounced function\n\t\tif (\n\t\t\tnewOptions.wait !== state.options.wait ||\n\t\t\tnewOptions.leading !== state.options.leading ||\n\t\t\tnewOptions.trailing !== state.options.trailing\n\t\t) {\n\t\t\t// Cancel old one\n\t\t\tstate.debouncedFn.cancel()\n\n\t\t\t// Create new one\n\t\t\tconst debouncedFn = debounce(newOptions.handler, newOptions.wait, {\n\t\t\t\tleading: newOptions.leading,\n\t\t\t\ttrailing: newOptions.trailing,\n\t\t\t})\n\n\t\t\tel.removeEventListener(state.eventType, state.debouncedFn as any)\n\t\t\tel.addEventListener(state.eventType, debouncedFn as any)\n\n\t\t\t;(el as any).__debounce = {\n\t\t\t\tdebouncedFn,\n\t\t\t\teventType: state.eventType,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t} else if (newOptions.handler !== state.options.handler) {\n\t\t\t// Only update handler\n\t\t\tstate.options.handler = newOptions.handler\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: DebounceState = (el as any).__debounce\n\n\t\tif (!state) return\n\n\t\tstate.debouncedFn.cancel()\n\t\tel.removeEventListener(state.eventType, state.debouncedFn as any)\n\t\tdelete (el as any).__debounce\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: DebounceBinding,\n\tdirectiveBinding: DirectiveBinding<DebounceBinding>,\n): DebounceOptions {\n\tconst wait = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, wait }\n\t}\n\n\treturn { ...binding, wait: binding.wait || wait }\n}\n\n/**\n * Get default event type for element\n */\nfunction getEventType(el: HTMLElement): string {\n\tconst tagName = el.tagName.toLowerCase()\n\n\tif (tagName === 'input' || tagName === 'textarea') {\n\t\treturn 'input'\n\t}\n\n\treturn 'click'\n}\n\n/**\n * Supported event type modifiers list\n */\nconst EVENT_MODIFIERS = [\n\t'click',\n\t'input',\n\t'change',\n\t'submit',\n\t'scroll',\n\t'resize',\n\t'mouseenter',\n\t'mouseleave',\n\t'mousemove',\n\t'mousedown',\n\t'mouseup',\n\t'keydown',\n\t'keyup',\n\t'focus',\n\t'blur',\n\t'touchstart',\n\t'touchmove',\n\t'touchend',\n] as const\n\n/**\n * Extract event type from modifiers\n */\nfunction getEventTypeFromModifiers(modifiers: Record<string, boolean>): string | null {\n\tfor (const modifier of EVENT_MODIFIERS) {\n\t\tif (modifiers[modifier]) {\n\t\t\treturn modifier\n\t\t}\n\t}\n\n\treturn null\n}\n\nexport default vDebounce\n","import { defineDirective } from '@directix/core'\nimport { parseTime, throttle } from '@directix/shared'\nimport type { DirectiveBinding } from '@directix/core'\n\n/**\n * Throttled function type\n */\nexport interface ThrottledFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n}\n\n/**\n * Throttle directive options\n */\nexport interface ThrottleOptions<T extends (...args: any[]) => any = any> {\n\t/**\n * Function to throttle\n */\n\thandler: T\n\n\t/**\n * Delay time in milliseconds\n * @default 300\n */\n\twait?: number\n\n\t/**\n * Whether to invoke immediately before delay starts\n * @default true\n */\n\tleading?: boolean\n\n\t/**\n * Whether to invoke after delay ends\n * @default true\n */\n\ttrailing?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ThrottleBinding<T extends (...args: any[]) => any = any> =\n | T\n | ThrottleOptions<T>\n\n/**\n * Element state storage\n */\ninterface ThrottleState {\n\tthrottledFn: ThrottledFunction<any>\n\teventType: string\n\toptions: ThrottleOptions\n}\n\n/**\n * v-throttle directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-throttle=\"handleClick\">Throttled Button</button>\n * <button v-throttle:1s=\"handleClick\">1s Throttled</button>\n * <div v-throttle.scroll=\"handleScroll\">Scroll Throttle</div>\n * <div v-throttle:100.scroll=\"handleScroll\">100ms Scroll Throttle</div>\n * </template>\n * ```\n */\nexport const vThrottle = defineDirective<ThrottleBinding, HTMLElement>({\n\tname: 'throttle',\n\tssr: false,\n\tdefaults: {\n\t\twait: 300,\n\t\tleading: true,\n\t\ttrailing: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t// Prefer event type from modifiers, otherwise infer from element type\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getEventType(el)\n\n\t\t// Create throttled function\n\t\tconst throttledFn = throttle(options.handler, options.wait, {\n\t\t\tleading: options.leading,\n\t\t\ttrailing: options.trailing,\n\t\t})\n\n\t\t// Bind event\n\t\tel.addEventListener(eventType, throttledFn as any)\n\n\t\t;(el as any).__throttle = {\n\t\t\tthrottledFn,\n\t\t\teventType,\n\t\t\toptions,\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ThrottleState = (el as any).__throttle\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If configuration changes, recreate throttled function\n\t\tif (\n\t\t\tnewOptions.wait !== state.options.wait ||\n\t\t\tnewOptions.leading !== state.options.leading ||\n\t\t\tnewOptions.trailing !== state.options.trailing\n\t\t) {\n\t\t\t// Cancel old one\n\t\t\tstate.throttledFn.cancel()\n\n\t\t\t// Create new one\n\t\t\tconst throttledFn = throttle(newOptions.handler, newOptions.wait, {\n\t\t\t\tleading: newOptions.leading,\n\t\t\t\ttrailing: newOptions.trailing,\n\t\t\t})\n\n\t\t\tel.removeEventListener(state.eventType, state.throttledFn as any)\n\t\t\tel.addEventListener(state.eventType, throttledFn as any)\n\n\t\t\t;(el as any).__throttle = {\n\t\t\t\tthrottledFn,\n\t\t\t\teventType: state.eventType,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t} else if (newOptions.handler !== state.options.handler) {\n\t\t\t// Only update handler\n\t\t\tstate.options.handler = newOptions.handler\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ThrottleState = (el as any).__throttle\n\n\t\tif (!state) return\n\n\t\tstate.throttledFn.cancel()\n\t\tel.removeEventListener(state.eventType, state.throttledFn as any)\n\t\tdelete (el as any).__throttle\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: ThrottleBinding,\n\tdirectiveBinding: DirectiveBinding<ThrottleBinding>,\n): ThrottleOptions {\n\tconst wait = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, wait }\n\t}\n\n\treturn { ...binding, wait: binding.wait || wait }\n}\n\n/**\n * Get default event type for element\n */\nfunction getEventType(el: HTMLElement): string {\n\tconst tagName = el.tagName.toLowerCase()\n\n\tif (tagName === 'input' || tagName === 'textarea') {\n\t\treturn 'input'\n\t}\n\n\treturn 'click'\n}\n\n/**\n * Supported event type modifiers list\n */\nconst EVENT_MODIFIERS = [\n\t'click',\n\t'input',\n\t'change',\n\t'submit',\n\t'scroll',\n\t'resize',\n\t'mouseenter',\n\t'mouseleave',\n\t'mousemove',\n\t'mousedown',\n\t'mouseup',\n\t'keydown',\n\t'keyup',\n\t'focus',\n\t'blur',\n\t'touchstart',\n\t'touchmove',\n\t'touchend',\n] as const\n\n/**\n * Extract event type from modifiers\n */\nfunction getEventTypeFromModifiers(modifiers: Record<string, boolean>): string | null {\n\tfor (const modifier of EVENT_MODIFIERS) {\n\t\tif (modifiers[modifier]) {\n\t\t\treturn modifier\n\t\t}\n\t}\n\n\treturn null\n}\n\nexport default vThrottle\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Focus directive options\n */\nexport interface FocusOptions {\n\t/**\n\t * Whether to auto focus\n\t * @default true\n\t */\n\tfocus?: boolean\n\n\t/**\n\t * Whether to refocus when binding value changes\n\t * @default false\n\t */\n\trefocus?: boolean\n\n\t/**\n\t * Callback when focused\n\t */\n\tonFocus?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when blurred\n\t */\n\tonBlur?: (el: HTMLElement) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type FocusBinding = boolean | FocusOptions\n\n/**\n * Element state storage\n */\ninterface FocusState {\n\toptions: FocusOptions\n\thandleFocus: () => void\n\thandleBlur: () => void\n\tlastValue: FocusBinding\n}\n\nconst FOCUSABLE_TAGS = new Set(['input', 'textarea', 'select', 'button'])\n\n/**\n * Compare two values for equality (supports primitive types and shallow object comparison)\n */\nfunction isEqual(a: unknown, b: unknown): boolean {\n\tif (a === b) return true\n\tif (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n\tconst objA = a as Record<string, unknown>\n\tconst objB = b as Record<string, unknown>\n\tconst keysA = Object.keys(objA)\n\tconst keysB = Object.keys(objB)\n\n\tif (keysA.length !== keysB.length) return false\n\n\treturn keysA.every(key => objA[key] === objB[key])\n}\n\n/**\n * v-focus directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-focus />\n * <input v-focus=\"{ focus: true, refocus: true }\" />\n * </template>\n * ```\n */\nexport const vFocus = defineDirective<FocusBinding, HTMLElement>({\n\tname: 'focus',\n\tssr: false,\n\tdefaults: {\n\t\tfocus: true,\n\t\trefocus: false,\n\t},\n\n\tmounted(el, binding) {\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 type { App, Directive, Plugin } from 'vue'\nimport type { DirectiveInstallOptions } from '@directix/core'\nimport {\n\tvClickOutside,\n\tvCopy,\n\tvDebounce,\n\tvFocus,\n\tvThrottle,\n} from './directives'\n\n// Export all directives\nexport * from './directives'\n\n// Export core utilities\nexport * from '@directix/core'\n\n// Export shared utilities (excluding tools with the same name as directives)\nexport {\n\tisString,\n\tisNumber,\n\tisBoolean,\n\tisFunction,\n\tisObject,\n\tisArray,\n\tisEmpty,\n\tisPromise,\n\tdeepClone,\n\tdeepMerge,\n\tget,\n\tset,\n\tparseTime,\n\tgenerateId,\n} from '@directix/shared'\n// Export debounce and throttle utility functions separately (with aliases)\nexport {\n\tdebounce as debounceFn,\n\tthrottle as throttleFn,\n} from '@directix/shared'\n\n// All directives list\nconst allDirectives: Record<string, Directive> = {\n\t'click-outside': vClickOutside,\n\tcopy: vCopy,\n\tdebounce: vDebounce,\n\tthrottle: vThrottle,\n\tfocus: vFocus,\n}\n\n/**\n * Install all directives\n */\nconst install = (app: App, options: DirectiveInstallOptions = {}): void => {\n\tconst { directives, all = false } = options\n\n\tif (all || !directives) {\n\t\t// Register all directives\n\t\tObject.entries(allDirectives).forEach(([name, directive]) => {\n\t\t\tapp.directive(name, directive)\n\t\t})\n\t} else {\n\t\t// Register specified directives\n\t\tdirectives.forEach(name => {\n\t\t\tconst directive = allDirectives[name]\n\n\t\t\tif (directive) {\n\t\t\t\tapp.directive(name, directive)\n\t\t\t} else {\n\t\t\t\tconsole.warn(`[Directix] Unknown directive: ${name}`)\n\t\t\t}\n\t\t})\n\t}\n}\n\n/**\n * Directix plugin\n */\nexport const Directix: Plugin = {\n\tinstall,\n}\n"],"names":["addCleanup","normalizeOptions","getEventTypeFromModifiers","getEventType","EVENT_MODIFIERS"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* directix v1.0.0
|
|
3
|
+
* A comprehensive, easy-to-use, and high-performance Vue custom directives library supporting both Vue 2 and Vue 3
|
|
4
|
+
* (c) 2021-present saqqdy <https://github.com/saqqdy>
|
|
5
|
+
* Released under the MIT License.
|
|
6
|
+
*/
|
|
7
|
+
var _VueDemiGlobal="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,VueDemi=function(e,n,t){if(e.install)return e;if(!n)return console.error("[vue-demi] no Vue instance found, please be sure to import `vue` before `vue-demi`."),e;if("2.7."===n.version.slice(0,4)){for(var o in n)e[o]=n[o];e.isVue2=!0,e.isVue3=!1,e.install=function(){},e.Vue=n,e.Vue2=n,e.version=n.version,e.warn=n.util.warn,e.hasInjectionContext=function(){return!!e.getCurrentInstance()},e.createApp=function(e,t){var o,r={},i={config:n.config,use:n.use.bind(n),mixin:n.mixin.bind(n),component:n.component.bind(n),provide:function(e,n){return r[e]=n,this},directive:function(e,t){return t?(n.directive(e,t),i):n.directive(e)},mount:function(i,u){return o||((o=new n(Object.assign({propsData:t},e,{provide:Object.assign(r,e.provide)}))).$mount(i,u),o)},unmount:function(){o&&(o.$destroy(),o=void 0)}};return i}}else if("2."===n.version.slice(0,2))if(t){for(var o in t)e[o]=t[o];e.isVue2=!0,e.isVue3=!1,e.install=function(){},e.Vue=n,e.Vue2=n,e.version=n.version,e.hasInjectionContext=function(){return!!e.getCurrentInstance()}}else console.error("[vue-demi] no VueCompositionAPI instance found, please be sure to import `@vue/composition-api` before `vue-demi`.");else if("3."===n.version.slice(0,2)){for(var o in n)e[o]=n[o];e.isVue2=!1,e.isVue3=!0,e.install=function(){},e.Vue=n,e.Vue2=void 0,e.version=n.version,e.set=function(e,n,t){return Array.isArray(e)?(e.length=Math.max(e.length,n),e.splice(n,1,t),t):(e[n]=t,t)},e.del=function(e,n){Array.isArray(e)?e.splice(n,1):delete e[n]}}else console.error("[vue-demi] Vue version "+n.version+" is unsupported.");return e}(_VueDemiGlobal.VueDemi=_VueDemiGlobal.VueDemi||(void 0!==VueDemi?VueDemi:{}),_VueDemiGlobal.Vue||("undefined"!=typeof Vue?Vue:void 0),_VueDemiGlobal.VueCompositionAPI||("undefined"!=typeof VueCompositionAPI?VueCompositionAPI:void 0)),__defProp=Object.defineProperty,__defProps=Object.defineProperties,__getOwnPropDescs=Object.getOwnPropertyDescriptors,__getOwnPropSymbols=Object.getOwnPropertySymbols,__hasOwnProp=Object.prototype.hasOwnProperty,__propIsEnum=Object.prototype.propertyIsEnumerable,__defNormalProp=(e,n,t)=>n in e?__defProp(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t,__spreadValues=(e,n)=>{for(var t in n||(n={}))__hasOwnProp.call(n,t)&&__defNormalProp(e,t,n[t]);if(__getOwnPropSymbols)for(var t of __getOwnPropSymbols(n))__propIsEnum.call(n,t)&&__defNormalProp(e,t,n[t]);return e},__spreadProps=(e,n)=>__defProps(e,__getOwnPropDescs(n)),__objRest=(e,n)=>{var t={};for(var o in e)__hasOwnProp.call(e,o)&&n.indexOf(o)<0&&(t[o]=e[o]);if(null!=e&&__getOwnPropSymbols)for(var o of __getOwnPropSymbols(e))n.indexOf(o)<0&&__propIsEnum.call(e,o)&&(t[o]=e[o]);return t},__async=(e,n,t)=>new Promise((o,r)=>{var i=e=>{try{s(t.next(e))}catch(e){r(e)}},u=e=>{try{s(t.throw(e))}catch(e){r(e)}},s=e=>e.done?o(e.value):Promise.resolve(e.value).then(i,u);s((t=t.apply(e,n)).next())});!function(e){"use strict";let n=null;function t(){var e,t;if(null!==n)return n;try{const o=require("vue");(null==(e=null==o?void 0:o.version)?void 0:e.startsWith("2"))?n=2:(null==(t=null==o?void 0:o.version)?void 0:t.startsWith("3"))&&(n=3)}catch(e){}return null===n&&("undefined"!=typeof window&&console.warn("[Directix] Unable to detect Vue version, defaulting to Vue 3. Please ensure Vue is installed correctly."),n=3),n}const o=()=>2===t(),r=()=>"undefined"!=typeof window&&"undefined"!=typeof document,i=()=>!r(),u=()=>{if(!r())return!1;let e=!1;try{const n={get passive(){return e=!0,!1}};window.addEventListener("test",null,n),window.removeEventListener("test",null,n)}catch(n){e=!1}return e},s=()=>r()&&"clipboard"in navigator;function l(e){return{bind(e,n,t){const o={value:n.value,vnode:t,cleanup:[]};e.__directix_state__=o},inserted(n,t,o){e.mounted&&e.mounted(n,a(t),o)},update(n,t,o,r){const i=n.__directix_state__;e.updated&&e.updated(n,a(t),o,a(__spreadProps(__spreadValues({},t),{value:t.oldValue})),r),i&&(i.value=t.value,i.vnode=o)},componentUpdated(e,n,t,o){},unbind(n,t,o){e.unmounted&&e.unmounted(n,a(t),o);const r=n.__directix_state__;(null==r?void 0:r.cleanup)&&r.cleanup.forEach(e=>e()),delete n.__directix_state__}}}function a(e){var n;return{value:e.value,oldValue:null!=(n=e.oldValue)?n:null,arg:e.arg,modifiers:e.modifiers||{},instance:e.instance||null}}function c(e){return{created(e,n,t){const o={value:n.value,vnode:t,cleanup:[]};e.__directix_state__=o},beforeMount(e,n,t){},mounted(n,t,o){e.mounted&&e.mounted(n,d(t),o)},beforeUpdate(e,n,t,o){},updated(n,t,o,r){const i=n.__directix_state__;e.updated&&e.updated(n,d(t),o,d(__spreadProps(__spreadValues({},t),{value:t.oldValue})),r),i&&(i.value=t.value,i.vnode=o)},beforeUnmount(e,n,t){},unmounted(n,t,o){e.unmounted&&e.unmounted(n,d(t),o);const r=n.__directix_state__;(null==r?void 0:r.cleanup)&&r.cleanup.forEach(e=>e()),delete n.__directix_state__}}}function d(e){var n;return{value:e.value,oldValue:null!=(n=e.oldValue)?n:null,arg:e.arg,modifiers:e.modifiers||{},instance:e.instance}}function p(e){var n;const t=e,{name:r,version:u,ssr:s,defaults:a}=t,d=__objRest(t,["name","version","ssr","defaults"]);if(i()&&!s)return"undefined"!=typeof process&&"test"!==(null==(n=process.env)?void 0:n.NODE_ENV)&&console.warn(`[Directix] Directive "${r}" is not compatible with SSR. It will be a no-op on the server side.`),{mounted:()=>{},updated:()=>{},unmounted:()=>{}};const p={mounted:d.mounted?(e,n,t)=>{const o=f(n,a);d.mounted(e,o,t)}:void 0,updated:d.updated?(e,n,t,o,r)=>{const i=f(n,a);d.updated(e,i,t,o,r)}:void 0,unmounted:d.unmounted};return o()?l(p):c(p)}function f(e,n){if(!n)return e;const t="object"==typeof e.value&&null!==e.value?__spreadValues(__spreadValues({},n),e.value):e.value;return __spreadProps(__spreadValues({},e),{value:t})}function v(e){return e?"string"==typeof e?r()?document.querySelector(e):null:e instanceof Element?e:null:null}function _(e,n,t,o=!1){if(!r())return;const i=h(o);e.addEventListener(n,t,i)}function m(e,n,t,o=!1){if(!r())return;const i=h(o);e.removeEventListener(n,t,i)}function h(e){if("boolean"==typeof e)return e;const{capture:n=!1,passive:t=!1,once:o=!1}=e;return u()?{capture:n,passive:t,once:o}:n}function b(e){return"string"==typeof e}function y(e){return"function"==typeof e}function g(e){return"object"==typeof e&&null!==e}function w(e){return Array.isArray(e)}function V(e,n=300,t={}){let o=null,r=null,i=null;const{leading:u=!1,trailing:s=!0}=t,l=()=>{r&&(e.apply(i,r),r=null,i=null)},a=function(...e){r=e,i=this,o&&clearTimeout(o),u&&!o&&l(),o=setTimeout(()=>{s&&l(),o=null},n)};return a.cancel=()=>{o&&(clearTimeout(o),o=null),r=null,i=null},a.flush=()=>{o&&(clearTimeout(o),l(),o=null)},a}function E(e,n=300,t={}){let o=null,r=null,i=null,u=0;const{leading:s=!0,trailing:l=!0}=t,a=()=>{r&&(e.apply(i,r),r=null,i=null)},c=function(...e){const t=Date.now();u||s||(u=t);const c=n-(t-u);r=e,i=this,c<=0||c>n?(o&&(clearTimeout(o),o=null),u=t,a()):!o&&l&&(o=setTimeout(()=>{u=s?Date.now():0,o=null,a()},c))};return c.cancel=()=>{o&&(clearTimeout(o),o=null),u=0,r=null,i=null},c}function O(e){if(!e)return null;if(e.endsWith("ms"))return Number.parseInt(e,10);if(e.endsWith("s"))return 1e3*Number.parseFloat(e);const n=Number.parseInt(e,10);return Number.isNaN(n)?null:n}const x=p({name:"click-outside",ssr:!1,defaults:{capture:!0,events:["click"],disabled:!1,stop:!1,prevent:!1},mounted(e,n){const t=P(n.value);if(t.disabled)return;const o={options:t,handlers:new Map};e.__clickOutside=o;t.events.forEach(n=>{const r=n=>{D(e,n,t)&&(t.stop&&n.stopPropagation(),t.prevent&&n.preventDefault(),t.handler(n))};o.handlers.set(n,r);const i={capture:t.capture,passive:!t.prevent};_(document,n,r,i)})},updated(e,n){const t=e.__clickOutside;if(!t)return;const o=t.options,r=P(n.value);if(o.disabled!==r.disabled)if(r.disabled)t.handlers.forEach((e,n)=>{m(document,n,e,{capture:o.capture})}),t.handlers.clear();else{const n=n=>n=>{D(e,n,r)&&(r.stop&&n.stopPropagation(),r.prevent&&n.preventDefault(),r.handler(n))};r.events.forEach(e=>{const o=n();t.handlers.set(e,o),_(document,e,o,{capture:r.capture,passive:!r.prevent})})}t.options=r},unmounted(e){const n=e.__clickOutside;n&&(n.handlers.forEach((e,t)=>{m(document,t,e,{capture:n.options.capture})}),delete e.__clickOutside)}});function P(e){var n,t,o,r,i;if("function"==typeof e)return{handler:e,capture:!0,events:["click"],disabled:!1,stop:!1,prevent:!1};if(!e)throw new Error("[Directix] v-click-outside: handler is required");return __spreadValues({capture:null==(n=e.capture)||n,events:null!=(t=e.events)?t:["click"],disabled:null!=(o=e.disabled)&&o,stop:null!=(r=e.stop)&&r,prevent:null!=(i=e.prevent)&&i},e)}function D(e,n,t){var o;const r=n.target;if(e.contains(r))return!1;if(null==(o=t.exclude)?void 0:o.length)for(const e of t.exclude){const n="function"==typeof e?e():v(e);if(n&&(n===r||n.contains(r)))return!1}return!0}function j(e){return __async(this,null,function*(){if(s())try{return yield navigator.clipboard.writeText(e),!0}catch(e){console.warn("[Directix] Clipboard API failed, falling back to execCommand")}return function(e){const n=document.createElement("textarea");n.value=e,n.style.cssText="\n position: fixed;\n top: -9999px;\n left: -9999px;\n opacity: 0;\n pointer-events: none;\n ",document.body.appendChild(n);try{return n.select(),n.setSelectionRange(0,n.value.length),document.execCommand("copy")}catch(e){return!1}finally{document.body.removeChild(n)}}(e)})}const k=p({name:"copy",ssr:!1,mounted(e,n){const t=C(n.value);if(t.disabled)return;t.title&&e.setAttribute("title",t.title);const o={handler:null,options:t};o.handler=()=>__async(null,null,function*(){var n,t,r,i;const u=o.options.value;if(u)try{if(!(yield j(u)))throw new Error("Copy failed");null==(t=(n=o.options).onSuccess)||t.call(n,u),e.dispatchEvent(new CustomEvent("copy:success",{detail:{text:u}}))}catch(n){const t=n;null==(i=(r=o.options).onError)||i.call(r,t),e.dispatchEvent(new CustomEvent("copy:error",{detail:{error:t}}))}else console.warn("[Directix] v-copy: No text to copy")}),e.addEventListener("click",o.handler),e.__copy=o},updated(e,n){const t=e.__copy;t&&(t.options=C(n.value),t.options.title&&e.setAttribute("title",t.options.title))},unmounted(e){const n=e.__copy;n&&(e.removeEventListener("click",n.handler),delete e.__copy)}});function C(e){return"string"==typeof e?{value:e}:e}const F=p({name:"debounce",ssr:!1,defaults:{wait:300,leading:!1,trailing:!0},mounted(e,n){const t=T(n.value,n),o=function(e){for(const n of L)if(e[n])return n;return null}(n.modifiers)||function(e){const n=e.tagName.toLowerCase();if("input"===n||"textarea"===n)return"input";return"click"}(e),r=V(t.handler,t.wait,{leading:t.leading,trailing:t.trailing});e.addEventListener(o,r),e.__debounce={debouncedFn:r,eventType:o,options:t}},updated(e,n){const t=e.__debounce;if(!t)return;const o=T(n.value,n);if(o.wait!==t.options.wait||o.leading!==t.options.leading||o.trailing!==t.options.trailing){t.debouncedFn.cancel();const n=V(o.handler,o.wait,{leading:o.leading,trailing:o.trailing});e.removeEventListener(t.eventType,t.debouncedFn),e.addEventListener(t.eventType,n),e.__debounce={debouncedFn:n,eventType:t.eventType,options:o}}else o.handler!==t.options.handler&&(t.options.handler=o.handler)},unmounted(e){const n=e.__debounce;n&&(n.debouncedFn.cancel(),e.removeEventListener(n.eventType,n.debouncedFn),delete e.__debounce)}});function T(e,n){const t=O(n.arg)||300;return"function"==typeof e?{handler:e,wait:t}:__spreadProps(__spreadValues({},e),{wait:e.wait||t})}const L=["click","input","change","submit","scroll","resize","mouseenter","mouseleave","mousemove","mousedown","mouseup","keydown","keyup","focus","blur","touchstart","touchmove","touchend"];const A=p({name:"throttle",ssr:!1,defaults:{wait:300,leading:!0,trailing:!0},mounted(e,n){const t=I(n.value,n),o=function(e){for(const n of N)if(e[n])return n;return null}(n.modifiers)||function(e){const n=e.tagName.toLowerCase();if("input"===n||"textarea"===n)return"input";return"click"}(e),r=E(t.handler,t.wait,{leading:t.leading,trailing:t.trailing});e.addEventListener(o,r),e.__throttle={throttledFn:r,eventType:o,options:t}},updated(e,n){const t=e.__throttle;if(!t)return;const o=I(n.value,n);if(o.wait!==t.options.wait||o.leading!==t.options.leading||o.trailing!==t.options.trailing){t.throttledFn.cancel();const n=E(o.handler,o.wait,{leading:o.leading,trailing:o.trailing});e.removeEventListener(t.eventType,t.throttledFn),e.addEventListener(t.eventType,n),e.__throttle={throttledFn:n,eventType:t.eventType,options:o}}else o.handler!==t.options.handler&&(t.options.handler=o.handler)},unmounted(e){const n=e.__throttle;n&&(n.throttledFn.cancel(),e.removeEventListener(n.eventType,n.throttledFn),delete e.__throttle)}});function I(e,n){const t=O(n.arg)||300;return"function"==typeof e?{handler:e,wait:t}:__spreadProps(__spreadValues({},e),{wait:e.wait||t})}const N=["click","input","change","submit","scroll","resize","mouseenter","mouseleave","mousemove","mousedown","mouseup","keydown","keyup","focus","blur","touchstart","touchmove","touchend"];const S=new Set(["input","textarea","select","button"]);const B=p({name:"focus",ssr:!1,defaults:{focus:!0,refocus:!1},mounted(e,n){const t=$(n.value);if(!t.focus||!function(e){if(!r())return!1;const n=e.tagName.toLowerCase();if(S.has(n))return!e.disabled;if(e.isContentEditable)return!0;const t=e.getAttribute("tabindex");if(null!=t)return"-1"!==t;if("a"===n||"area"===n)return e.hasAttribute("href");return!1}(e))return void(t.focus&&console.warn("[Directix] v-focus: Element is not focusable"));const o=()=>{var n;return null==(n=t.onFocus)?void 0:n.call(t,e)},i=()=>{var n;return null==(n=t.onBlur)?void 0:n.call(t,e)};e.addEventListener("focus",o),e.addEventListener("blur",i),e.__focus={options:t,handleFocus:o,handleBlur:i,lastValue:n.value},e.focus()},updated(e,n){const t=e.__focus;if(!t)return;const o=$(n.value);o.onFocus!==t.options.onFocus&&(e.removeEventListener("focus",t.handleFocus),t.handleFocus=()=>{var n;return null==(n=o.onFocus)?void 0:n.call(o,e)},e.addEventListener("focus",t.handleFocus)),o.onBlur!==t.options.onBlur&&(e.removeEventListener("blur",t.handleBlur),t.handleBlur=()=>{var n;return null==(n=o.onBlur)?void 0:n.call(o,e)},e.addEventListener("blur",t.handleBlur));const r=!function(e,n){if(e===n)return!0;if("object"!=typeof e||"object"!=typeof n||null===e||null===n)return!1;const t=e,o=n,r=Object.keys(t),i=Object.keys(o);return r.length===i.length&&r.every(e=>t[e]===o[e])}(n.value,t.lastValue);o.refocus&&o.focus&&r&&e.focus(),t.options=o,t.lastValue=n.value},unmounted(e){const n=e.__focus;n&&(e.removeEventListener("focus",n.handleFocus),e.removeEventListener("blur",n.handleBlur),delete e.__focus)}});function $(e){return"boolean"==typeof e?{focus:e,refocus:!1}:__spreadValues({focus:!0,refocus:!1},e)}const M={"click-outside":x,copy:k,debounce:F,throttle:A,focus:B},R={install:(e,n={})=>{const{directives:t,all:o=!1}=n;o||!t?Object.entries(M).forEach(([n,t])=>{e.directive(n,t)}):t.forEach(n=>{const t=M[n];t?e.directive(n,t):console.warn(`[Directix] Unknown directive: ${n}`)})}};e.Directix=R,e.addCleanupVue2=function(e,n){const t=e.__directix_state__;t&&t.cleanup.push(n)},e.addCleanupVue3=function(e,n){const t=e.__directix_state__;t&&t.cleanup.push(n)},e.clickOutside=x,e.copy=k,e.createVue2Directive=l,e.createVue3Directive=c,e.debounce=F,e.debounceFn=V,e.deepClone=function e(n){if(null===n||"object"!=typeof n)return n;if(Array.isArray(n))return n.map(n=>e(n));const t={};for(const o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=e(n[o]));return t},e.deepMerge=function e(n,...t){if(!t.length)return n;const o=t.shift();if(g(n)&&g(o))for(const t in o)g(o[t])?(n[t]||Object.assign(n,{[t]:{}}),e(n[t],o[t])):Object.assign(n,{[t]:o[t]});return e(n,...t)},e.defineDirective=p,e.defineDirectiveGroup=function(e,n){return{name:e,directives:n,install(t,o){Object.entries(n).forEach(([n,o])=>{const r=`${e}-${n}`;t.directive(r,o)})}}},e.focus=B,e.generateId=function(e=""){return`${e}${Date.now().toString(36)}${Math.random().toString(36).slice(2,9)}`},e.get=function(e,n,t){const o=n.split(".");let r=e;for(const e of o){if(null==r)return t;r=r[e]}return void 0===r?t:r},e.getVueVersion=t,e.isArray=w,e.isBoolean=function(e){return"boolean"==typeof e},e.isBrowser=r,e.isEmpty=function(e){return null==e||(b(e)||w(e)?0===e.length:!!g(e)&&0===Object.keys(e).length)},e.isFunction=y,e.isNumber=function(e){return"number"==typeof e&&!Number.isNaN(e)},e.isObject=g,e.isPromise=function(e){return g(e)&&y(e.then)},e.isSSR=i,e.isString=b,e.isVue2=o,e.isVue3=()=>3===t(),e.parseTime=O,e.set=function(e,n,t){const o=n.split("."),r=o.pop();let i=e;for(const e of o)void 0===i[e]&&(i[e]={}),i=i[e];i[r]=t},e.supportsClipboard=s,e.supportsIntersectionObserver=()=>r()&&"IntersectionObserver"in window,e.supportsMutationObserver=()=>r()&&"MutationObserver"in window,e.supportsPassive=u,e.supportsResizeObserver=()=>r()&&"ResizeObserver"in window,e.throttle=A,e.throttleFn=E,e.vClickOutside=x,e.vCopy=k,e.vDebounce=F,e.vFocus=B,e.vThrottle=A,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})}(this.Directix=this.Directix||{});
|
|
@@ -1,3 +1,66 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* directix v1.0.0
|
|
3
|
+
* A comprehensive, easy-to-use, and high-performance Vue custom directives library supporting both Vue 2 and Vue 3
|
|
4
|
+
* (c) 2021-present saqqdy <https://github.com/saqqdy>
|
|
5
|
+
* Released under the MIT License.
|
|
6
|
+
*/
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __defProps = Object.defineProperties;
|
|
9
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
10
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
11
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
12
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
13
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
14
|
+
var __spreadValues = (a, b) => {
|
|
15
|
+
for (var prop in b || (b = {}))
|
|
16
|
+
if (__hasOwnProp.call(b, prop))
|
|
17
|
+
__defNormalProp(a, prop, b[prop]);
|
|
18
|
+
if (__getOwnPropSymbols)
|
|
19
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
20
|
+
if (__propIsEnum.call(b, prop))
|
|
21
|
+
__defNormalProp(a, prop, b[prop]);
|
|
22
|
+
}
|
|
23
|
+
return a;
|
|
24
|
+
};
|
|
25
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
26
|
+
var __objRest = (source, exclude) => {
|
|
27
|
+
var target = {};
|
|
28
|
+
for (var prop in source)
|
|
29
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
30
|
+
target[prop] = source[prop];
|
|
31
|
+
if (source != null && __getOwnPropSymbols)
|
|
32
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
33
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
34
|
+
target[prop] = source[prop];
|
|
35
|
+
}
|
|
36
|
+
return target;
|
|
37
|
+
};
|
|
38
|
+
var __async = (__this, __arguments, generator) => {
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
var fulfilled = (value) => {
|
|
41
|
+
try {
|
|
42
|
+
step(generator.next(value));
|
|
43
|
+
} catch (e) {
|
|
44
|
+
reject(e);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
var rejected = (value) => {
|
|
48
|
+
try {
|
|
49
|
+
step(generator.throw(value));
|
|
50
|
+
} catch (e) {
|
|
51
|
+
reject(e);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
55
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
/*!
|
|
59
|
+
* directix v1.0.0
|
|
60
|
+
* A comprehensive, easy-to-use, and high-performance Vue custom directives library supporting both Vue 2 and Vue 3
|
|
61
|
+
* (c) 2021-present saqqdy <https://github.com/saqqdy>
|
|
62
|
+
* Released under the MIT License.
|
|
63
|
+
*/
|
|
1
64
|
let _vueVersion = null;
|
|
2
65
|
function getVueVersion() {
|
|
3
66
|
var _a, _b;
|
|
@@ -9,7 +72,7 @@ function getVueVersion() {
|
|
|
9
72
|
} else if ((_b = vue == null ? void 0 : vue.version) == null ? void 0 : _b.startsWith("3")) {
|
|
10
73
|
_vueVersion = 3;
|
|
11
74
|
}
|
|
12
|
-
} catch {
|
|
75
|
+
} catch (e) {
|
|
13
76
|
}
|
|
14
77
|
if (_vueVersion === null) {
|
|
15
78
|
if (typeof window !== "undefined") {
|
|
@@ -39,7 +102,7 @@ const supportsPassive = () => {
|
|
|
39
102
|
};
|
|
40
103
|
window.addEventListener("test", null, options);
|
|
41
104
|
window.removeEventListener("test", null, options);
|
|
42
|
-
} catch {
|
|
105
|
+
} catch (e) {
|
|
43
106
|
supports = false;
|
|
44
107
|
}
|
|
45
108
|
return supports;
|
|
@@ -65,12 +128,12 @@ function createVue2Directive(hooks) {
|
|
|
65
128
|
cleanup: []
|
|
66
129
|
};
|
|
67
130
|
el.__directix_state__ = state;
|
|
131
|
+
},
|
|
132
|
+
inserted(el, binding, vnode) {
|
|
68
133
|
if (hooks.mounted) {
|
|
69
134
|
hooks.mounted(el, normalizeBinding(binding), vnode);
|
|
70
135
|
}
|
|
71
136
|
},
|
|
72
|
-
inserted(_el, _binding, _vnode) {
|
|
73
|
-
},
|
|
74
137
|
update(el, binding, vnode, oldVnode) {
|
|
75
138
|
const state = el.__directix_state__;
|
|
76
139
|
if (hooks.updated) {
|
|
@@ -78,7 +141,7 @@ function createVue2Directive(hooks) {
|
|
|
78
141
|
el,
|
|
79
142
|
normalizeBinding(binding),
|
|
80
143
|
vnode,
|
|
81
|
-
normalizeBinding({
|
|
144
|
+
normalizeBinding(__spreadProps(__spreadValues({}, binding), { value: binding.oldValue })),
|
|
82
145
|
oldVnode
|
|
83
146
|
);
|
|
84
147
|
}
|
|
@@ -103,9 +166,10 @@ function createVue2Directive(hooks) {
|
|
|
103
166
|
return directive;
|
|
104
167
|
}
|
|
105
168
|
function normalizeBinding(binding) {
|
|
169
|
+
var _a;
|
|
106
170
|
return {
|
|
107
171
|
value: binding.value,
|
|
108
|
-
oldValue: binding.oldValue
|
|
172
|
+
oldValue: (_a = binding.oldValue) != null ? _a : null,
|
|
109
173
|
arg: binding.arg,
|
|
110
174
|
modifiers: binding.modifiers || {},
|
|
111
175
|
instance: binding.instance || null
|
|
@@ -143,7 +207,7 @@ function createVue3Directive(hooks) {
|
|
|
143
207
|
el,
|
|
144
208
|
normalizeBindingVue3(binding),
|
|
145
209
|
vnode,
|
|
146
|
-
normalizeBindingVue3({
|
|
210
|
+
normalizeBindingVue3(__spreadProps(__spreadValues({}, binding), { value: binding.oldValue })),
|
|
147
211
|
prevVnode
|
|
148
212
|
);
|
|
149
213
|
}
|
|
@@ -168,9 +232,10 @@ function createVue3Directive(hooks) {
|
|
|
168
232
|
return directive;
|
|
169
233
|
}
|
|
170
234
|
function normalizeBindingVue3(binding) {
|
|
235
|
+
var _a;
|
|
171
236
|
return {
|
|
172
237
|
value: binding.value,
|
|
173
|
-
oldValue: binding.oldValue
|
|
238
|
+
oldValue: (_a = binding.oldValue) != null ? _a : null,
|
|
174
239
|
arg: binding.arg,
|
|
175
240
|
modifiers: binding.modifiers || {},
|
|
176
241
|
instance: binding.instance
|
|
@@ -183,10 +248,10 @@ function addCleanup(el, fn) {
|
|
|
183
248
|
}
|
|
184
249
|
}
|
|
185
250
|
function defineDirective(definition) {
|
|
186
|
-
var
|
|
187
|
-
const { name, version, ssr, defaults,
|
|
251
|
+
var _b;
|
|
252
|
+
const _a = definition, { name, version, ssr, defaults } = _a, hooks = __objRest(_a, ["name", "version", "ssr", "defaults"]);
|
|
188
253
|
if (isSSR() && !ssr) {
|
|
189
|
-
if (typeof process !== "undefined" && ((
|
|
254
|
+
if (typeof process !== "undefined" && ((_b = process.env) == null ? void 0 : _b.NODE_ENV) !== "test") {
|
|
190
255
|
console.warn(
|
|
191
256
|
`[Directix] Directive "${name}" is not compatible with SSR. It will be a no-op on the server side.`
|
|
192
257
|
);
|
|
@@ -211,8 +276,8 @@ function defineDirective(definition) {
|
|
|
211
276
|
}
|
|
212
277
|
function applyDefaults(binding, defaults) {
|
|
213
278
|
if (!defaults) return binding;
|
|
214
|
-
const value = typeof binding.value === "object" && binding.value !== null ? {
|
|
215
|
-
return {
|
|
279
|
+
const value = typeof binding.value === "object" && binding.value !== null ? __spreadValues(__spreadValues({}, defaults), binding.value) : binding.value;
|
|
280
|
+
return __spreadProps(__spreadValues({}, binding), { value });
|
|
216
281
|
}
|
|
217
282
|
function createNoOpDirective() {
|
|
218
283
|
return {
|
|
@@ -537,6 +602,7 @@ const vClickOutside = defineDirective({
|
|
|
537
602
|
}
|
|
538
603
|
});
|
|
539
604
|
function normalizeOptions$4(binding) {
|
|
605
|
+
var _a, _b, _c, _d, _e;
|
|
540
606
|
if (typeof binding === "function") {
|
|
541
607
|
return {
|
|
542
608
|
handler: binding,
|
|
@@ -550,14 +616,13 @@ function normalizeOptions$4(binding) {
|
|
|
550
616
|
if (!binding) {
|
|
551
617
|
throw new Error("[Directix] v-click-outside: handler is required");
|
|
552
618
|
}
|
|
553
|
-
return {
|
|
554
|
-
capture: binding.capture
|
|
555
|
-
events: binding.events
|
|
556
|
-
disabled: binding.disabled
|
|
557
|
-
stop: binding.stop
|
|
558
|
-
prevent: binding.prevent
|
|
559
|
-
|
|
560
|
-
};
|
|
619
|
+
return __spreadValues({
|
|
620
|
+
capture: (_a = binding.capture) != null ? _a : true,
|
|
621
|
+
events: (_b = binding.events) != null ? _b : ["click"],
|
|
622
|
+
disabled: (_c = binding.disabled) != null ? _c : false,
|
|
623
|
+
stop: (_d = binding.stop) != null ? _d : false,
|
|
624
|
+
prevent: (_e = binding.prevent) != null ? _e : false
|
|
625
|
+
}, binding);
|
|
561
626
|
}
|
|
562
627
|
function isValidClick(el, event, options) {
|
|
563
628
|
var _a;
|
|
@@ -575,16 +640,18 @@ function isValidClick(el, event, options) {
|
|
|
575
640
|
}
|
|
576
641
|
return true;
|
|
577
642
|
}
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
643
|
+
function copyToClipboard(text) {
|
|
644
|
+
return __async(this, null, function* () {
|
|
645
|
+
if (supportsClipboard()) {
|
|
646
|
+
try {
|
|
647
|
+
yield navigator.clipboard.writeText(text);
|
|
648
|
+
return true;
|
|
649
|
+
} catch (e) {
|
|
650
|
+
console.warn("[Directix] Clipboard API failed, falling back to execCommand");
|
|
651
|
+
}
|
|
585
652
|
}
|
|
586
|
-
|
|
587
|
-
|
|
653
|
+
return copyWithExecCommand(text);
|
|
654
|
+
});
|
|
588
655
|
}
|
|
589
656
|
function copyWithExecCommand(text) {
|
|
590
657
|
const textarea = document.createElement("textarea");
|
|
@@ -601,7 +668,7 @@ function copyWithExecCommand(text) {
|
|
|
601
668
|
textarea.select();
|
|
602
669
|
textarea.setSelectionRange(0, textarea.value.length);
|
|
603
670
|
return document.execCommand("copy");
|
|
604
|
-
} catch {
|
|
671
|
+
} catch (e) {
|
|
605
672
|
return false;
|
|
606
673
|
} finally {
|
|
607
674
|
document.body.removeChild(textarea);
|
|
@@ -620,7 +687,7 @@ const vCopy = defineDirective({
|
|
|
620
687
|
handler: null,
|
|
621
688
|
options
|
|
622
689
|
};
|
|
623
|
-
state.handler =
|
|
690
|
+
state.handler = () => __async(null, null, function* () {
|
|
624
691
|
var _a, _b, _c, _d;
|
|
625
692
|
const text = state.options.value;
|
|
626
693
|
if (!text) {
|
|
@@ -628,7 +695,7 @@ const vCopy = defineDirective({
|
|
|
628
695
|
return;
|
|
629
696
|
}
|
|
630
697
|
try {
|
|
631
|
-
const success =
|
|
698
|
+
const success = yield copyToClipboard(text);
|
|
632
699
|
if (success) {
|
|
633
700
|
(_b = (_a = state.options).onSuccess) == null ? void 0 : _b.call(_a, text);
|
|
634
701
|
el.dispatchEvent(new CustomEvent("copy:success", { detail: { text } }));
|
|
@@ -640,7 +707,7 @@ const vCopy = defineDirective({
|
|
|
640
707
|
(_d = (_c = state.options).onError) == null ? void 0 : _d.call(_c, error);
|
|
641
708
|
el.dispatchEvent(new CustomEvent("copy:error", { detail: { error } }));
|
|
642
709
|
}
|
|
643
|
-
};
|
|
710
|
+
});
|
|
644
711
|
el.addEventListener("click", state.handler);
|
|
645
712
|
el.__copy = state;
|
|
646
713
|
},
|
|
@@ -721,7 +788,7 @@ function normalizeOptions$2(binding, directiveBinding) {
|
|
|
721
788
|
if (typeof binding === "function") {
|
|
722
789
|
return { handler: binding, wait };
|
|
723
790
|
}
|
|
724
|
-
return {
|
|
791
|
+
return __spreadProps(__spreadValues({}, binding), { wait: binding.wait || wait });
|
|
725
792
|
}
|
|
726
793
|
function getEventType$1(el) {
|
|
727
794
|
const tagName = el.tagName.toLowerCase();
|
|
@@ -814,7 +881,7 @@ function normalizeOptions$1(binding, directiveBinding) {
|
|
|
814
881
|
if (typeof binding === "function") {
|
|
815
882
|
return { handler: binding, wait };
|
|
816
883
|
}
|
|
817
|
-
return {
|
|
884
|
+
return __spreadProps(__spreadValues({}, binding), { wait: binding.wait || wait });
|
|
818
885
|
}
|
|
819
886
|
function getEventType(el) {
|
|
820
887
|
const tagName = el.tagName.toLowerCase();
|
|
@@ -852,8 +919,16 @@ function getEventTypeFromModifiers(modifiers) {
|
|
|
852
919
|
return null;
|
|
853
920
|
}
|
|
854
921
|
const FOCUSABLE_TAGS = /* @__PURE__ */ new Set(["input", "textarea", "select", "button"]);
|
|
855
|
-
|
|
856
|
-
|
|
922
|
+
function isEqual(a, b) {
|
|
923
|
+
if (a === b) return true;
|
|
924
|
+
if (typeof a !== "object" || typeof b !== "object" || a === null || b === null) return false;
|
|
925
|
+
const objA = a;
|
|
926
|
+
const objB = b;
|
|
927
|
+
const keysA = Object.keys(objA);
|
|
928
|
+
const keysB = Object.keys(objB);
|
|
929
|
+
if (keysA.length !== keysB.length) return false;
|
|
930
|
+
return keysA.every((key) => objA[key] === objB[key]);
|
|
931
|
+
}
|
|
857
932
|
const vFocus = defineDirective({
|
|
858
933
|
name: "focus",
|
|
859
934
|
ssr: false,
|
|
@@ -882,13 +957,9 @@ const vFocus = defineDirective({
|
|
|
882
957
|
el.__focus = {
|
|
883
958
|
options,
|
|
884
959
|
handleFocus,
|
|
885
|
-
handleBlur
|
|
960
|
+
handleBlur,
|
|
961
|
+
lastValue: binding.value
|
|
886
962
|
};
|
|
887
|
-
if (pendingFocusTimer) {
|
|
888
|
-
clearTimeout(pendingFocusTimer);
|
|
889
|
-
pendingFocusTimer = null;
|
|
890
|
-
}
|
|
891
|
-
pendingFocusEl = el;
|
|
892
963
|
el.focus();
|
|
893
964
|
},
|
|
894
965
|
updated(el, binding) {
|
|
@@ -911,20 +982,12 @@ const vFocus = defineDirective({
|
|
|
911
982
|
};
|
|
912
983
|
el.addEventListener("blur", state.handleBlur);
|
|
913
984
|
}
|
|
914
|
-
|
|
915
|
-
if (newOptions.refocus && newOptions.focus) {
|
|
916
|
-
|
|
917
|
-
return;
|
|
918
|
-
}
|
|
919
|
-
pendingFocusEl = null;
|
|
920
|
-
if (pendingFocusTimer) {
|
|
921
|
-
clearTimeout(pendingFocusTimer);
|
|
922
|
-
}
|
|
923
|
-
pendingFocusTimer = setTimeout(() => {
|
|
924
|
-
pendingFocusTimer = null;
|
|
925
|
-
el.focus();
|
|
926
|
-
}, 0);
|
|
985
|
+
const valueChanged = !isEqual(binding.value, state.lastValue);
|
|
986
|
+
if (newOptions.refocus && newOptions.focus && valueChanged) {
|
|
987
|
+
el.focus();
|
|
927
988
|
}
|
|
989
|
+
state.options = newOptions;
|
|
990
|
+
state.lastValue = binding.value;
|
|
928
991
|
},
|
|
929
992
|
unmounted(el) {
|
|
930
993
|
const state = el.__focus;
|
|
@@ -938,11 +1001,10 @@ function normalizeOptions(binding) {
|
|
|
938
1001
|
if (typeof binding === "boolean") {
|
|
939
1002
|
return { focus: binding, refocus: false };
|
|
940
1003
|
}
|
|
941
|
-
return {
|
|
1004
|
+
return __spreadValues({
|
|
942
1005
|
focus: true,
|
|
943
|
-
refocus: false
|
|
944
|
-
|
|
945
|
-
};
|
|
1006
|
+
refocus: false
|
|
1007
|
+
}, binding);
|
|
946
1008
|
}
|
|
947
1009
|
function isFocusable(el) {
|
|
948
1010
|
if (!isBrowser()) return false;
|
|
@@ -1030,4 +1092,4 @@ export {
|
|
|
1030
1092
|
vFocus,
|
|
1031
1093
|
vThrottle
|
|
1032
1094
|
};
|
|
1033
|
-
//# sourceMappingURL=index.
|
|
1095
|
+
//# sourceMappingURL=index.mjs.map
|