directix 1.0.0-beta.1 → 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} +123 -44
- 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
package/dist/index.esm.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.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 版本检测\n */\nlet _vueVersion: 2 | 3 | null = null\n\n/**\n * 获取当前 Vue 版本\n */\nexport function getVueVersion(): 2 | 3 {\n\tif (_vueVersion !== null) return _vueVersion\n\n\t// 尝试检测 Vue 版本\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 不可用\n\t}\n\n\t// 默认返回 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 * 是否 Vue 2\n */\nexport const isVue2 = (): boolean => getVueVersion() === 2\n\n/**\n * 是否 Vue 3\n */\nexport const isVue3 = (): boolean => getVueVersion() === 3\n\n/**\n * 是否浏览器环境\n */\nexport const isBrowser = (): boolean => {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\n/**\n * 是否服务端渲染\n */\nexport const isSSR = (): boolean => !isBrowser()\n\n/**\n * 是否支持 Passive 事件监听\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 * 是否支持 IntersectionObserver\n */\nexport const supportsIntersectionObserver = (): boolean => {\n\treturn isBrowser() && 'IntersectionObserver' in window\n}\n\n/**\n * 是否支持 ResizeObserver\n */\nexport const supportsResizeObserver = (): boolean => {\n\treturn isBrowser() && 'ResizeObserver' in window\n}\n\n/**\n * 是否支持 Clipboard API\n */\nexport const supportsClipboard = (): boolean => {\n\treturn isBrowser() && 'clipboard' in navigator\n}\n\n/**\n * 是否支持 MutationObserver\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 * 元素状态存储\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Vue 2 指令适配器\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// 存储状态\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\n\t\t\t// 调用 mounted\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\tinserted(_el: B, _binding: any, _vnode: VNode) {\n\t\t\t// Vue 2 的 inserted 在 DOM 插入后调用\n\t\t\t// 某些指令可能需要在这里执行 DOM 相关操作\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// 更新状态\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 特有,组件更新完成后调用\n\t\t\t// 通常 update 已经足够\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// 执行清理函数\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 * 标准化 Vue 2 binding 为统一格式\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 * 添加清理函数到元素\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 * 元素状态存储\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Vue 3 指令适配器\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 的 created 在元素创建时调用\n\t\t\t// 初始化状态\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// 挂载前\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// 更新前\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// 更新状态\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// 卸载前\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// 执行清理函数\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 * 标准化 Vue 3 binding\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 * 添加清理函数到元素\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 * 定义一个跨版本兼容的指令\n * @param definition 指令定义\n * @returns Vue 指令对象\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 检查\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// 应用默认值包装\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// 根据版本创建对应指令\n\tif (isVue2()) {\n\t\treturn createVue2Directive(wrappedHooks) as Directive\n\t}\n\n\treturn createVue3Directive(wrappedHooks) as Directive\n}\n\n/**\n * 应用默认值\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 * 创建空操作指令(用于 SSR)\n */\nfunction createNoOpDirective(): Directive {\n\treturn {\n\t\tmounted: () => {},\n\t\tupdated: () => {},\n\t\tunmounted: () => {},\n\t}\n}\n\n/**\n * 定义指令组\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 * 检查是否为元素\n */\nexport function isElement(value: unknown): value is Element {\n\treturn value instanceof Element\n}\n\n/**\n * 检查是否为 HTML 元素\n */\nexport function isHTMLElement(value: unknown): value is HTMLElement {\n\treturn value instanceof HTMLElement\n}\n\n/**\n * 获取元素\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 * 获取所有匹配元素\n */\nexport function getAllElements(target: string): Element[] {\n\tif (!isBrowser()) return []\n\n\treturn Array.from(document.querySelectorAll(target))\n}\n\n/**\n * 添加类名\n */\nexport function addClass(el: Element, ...classes: string[]): void {\n\tel.classList.add(...classes)\n}\n\n/**\n * 移除类名\n */\nexport function removeClass(el: Element, ...classes: string[]): void {\n\tel.classList.remove(...classes)\n}\n\n/**\n * 切换类名\n */\nexport function toggleClass(el: Element, className: string, force?: boolean): void {\n\tel.classList.toggle(className, force)\n}\n\n/**\n * 检查是否有类名\n */\nexport function hasClass(el: Element, className: string): boolean {\n\treturn el.classList.contains(className)\n}\n\n/**\n * 获取元素样式\n */\nexport function getStyle(el: Element, property: string): string {\n\tif (!isBrowser()) return ''\n\n\treturn getComputedStyle(el).getPropertyValue(property)\n}\n\n/**\n * 设置元素样式\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 * 批量设置样式\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 * 获取元素位置\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 * 获取元素尺寸\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 * 检查元素是否在视口内\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 * 获取最近的滚动父元素\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 * 检查元素是否匹配选择器\n */\nexport function matches(el: Element, selector: string): boolean {\n\treturn el.matches(selector)\n}\n\n/**\n * 获取最近的匹配祖先元素\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 * 添加事件监听\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 * 移除事件监听\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 * 触发自定义事件\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 * 标准化事件选项\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 * 创建事件委托\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 * 阻止事件冒泡\n */\nexport function stopPropagation(e: Event): void {\n\te.stopPropagation()\n}\n\n/**\n * 阻止默认行为\n */\nexport function preventDefault(e: Event): void {\n\te.preventDefault()\n}\n\n/**\n * 停止事件传播并阻止默认行为\n */\nexport function stopEvent(e: Event): void {\n\tstopPropagation(e)\n\tpreventDefault(e)\n}\n\n/**\n * 获取事件目标\n */\nexport function getEventTarget<T extends EventTarget = EventTarget>(e: Event): T | null {\n\treturn e.target as T | null\n}\n\n/**\n * 获取当前事件目标\n */\nexport function getCurrentTarget<T extends EventTarget = EventTarget>(e: Event): T | null {\n\treturn e.currentTarget as T | null\n}\n\n/**\n * 获取鼠标/触摸位置\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 */\nexport function isString(value: unknown): value is string {\n\treturn typeof value === 'string'\n}\n\n/**\n * 检查是否为数字\n */\nexport function isNumber(value: unknown): value is number {\n\treturn typeof value === 'number' && !Number.isNaN(value)\n}\n\n/**\n * 检查是否为布尔值\n */\nexport function isBoolean(value: unknown): value is boolean {\n\treturn typeof value === 'boolean'\n}\n\n/**\n * 检查是否为函数\n */\nexport function isFunction(value: unknown): value is (...args: any[]) => any {\n\treturn typeof value === 'function'\n}\n\n/**\n * 检查是否为对象\n */\nexport function isObject(value: unknown): value is Record<string, any> {\n\treturn typeof value === 'object' && value !== null\n}\n\n/**\n * 检查是否为数组\n */\nexport function isArray(value: unknown): value is any[] {\n\treturn Array.isArray(value)\n}\n\n/**\n * 检查是否为空\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 * 检查是否为 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 * 深拷贝\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 * 深合并\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 * 获取嵌套属性值\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 * 设置嵌套属性值\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 * 防抖函数\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 * 节流函数\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 * 解析时间参数\n * 支持格式: \"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 * 生成唯一 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 * 点击外部处理函数\n */\nexport type ClickOutsideHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * 点击外部指令选项\n */\nexport interface ClickOutsideOptions {\n\t/**\n * 点击外部时的回调函数\n * @required\n */\n\thandler: ClickOutsideHandler\n\n\t/**\n * 排除的元素选择器或元素引用\n */\n\texclude?: (string | HTMLElement | (() => HTMLElement | null))[]\n\n\t/**\n * 是否使用捕获模式\n * @default true\n */\n\tcapture?: boolean\n\n\t/**\n * 监听的事件类型\n * @default ['click']\n */\n\tevents?: ('click' | 'mousedown' | 'mouseup' | 'touchstart' | 'touchend')[]\n\n\t/**\n * 是否禁用\n * @default false\n */\n\tdisabled?: boolean\n\n\t/**\n * 停止传播\n * @default false\n */\n\tstop?: boolean\n\n\t/**\n * 阻止默认行为\n * @default false\n */\n\tprevent?: boolean\n}\n\n/**\n * 指令绑定值类型\n */\nexport type ClickOutsideBinding = ClickOutsideHandler | ClickOutsideOptions\n\n/**\n * 元素状态存储\n */\ninterface ClickOutsideState {\n\toptions: ClickOutsideOptions\n\thandlers: Map<string, (event: Event) => void>\n}\n\n/**\n * v-click-outside 指令\n *\n * @example\n * ```vue\n * <template>\n * <div v-click-outside=\"handleClickOutside\">\n * 下拉菜单\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// 创建事件处理器\n\t\tconst createHandler = (_eventType: string) => {\n\t\t\treturn (event: Event) => {\n\t\t\t\t// 检查事件目标\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// 停止传播\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// 阻止默认行为\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// 调用处理函数\n\t\t\t\toptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t}\n\t\t}\n\n\t\t// 绑定事件\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// 如果禁用状态变化\n\t\tif (oldOptions.disabled !== newOptions.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\t// 移除所有监听\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// 重新添加监听\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// 移除所有事件监听\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 * 标准化选项\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 * 检查点击是否有效(在元素外部)\n */\nfunction isValidClick(\n\tel: HTMLElement,\n\tevent: Event,\n\toptions: ClickOutsideOptions,\n): boolean {\n\tconst target = event.target as Node\n\n\t// 检查是否点击了元素本身或其子元素\n\tif (el.contains(target)) {\n\t\treturn false\n\t}\n\n\t// 检查排除元素\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 * 复制成功回调\n */\nexport type CopySuccessCallback = (text: string) => void\n\n/**\n * 复制失败回调\n */\nexport type CopyErrorCallback = (error: Error) => void\n\n/**\n * 复制指令选项\n */\nexport interface CopyOptions {\n\t/**\n * 要复制的文本\n * @required\n */\n\tvalue: string\n\n\t/**\n * 复制成功回调\n */\n\tonSuccess?: CopySuccessCallback\n\n\t/**\n * 复制失败回调\n */\n\tonError?: CopyErrorCallback\n\n\t/**\n * 复制按钮的提示文本\n */\n\ttitle?: string\n\n\t/**\n * 是否禁用\n * @default false\n */\n\tdisabled?: boolean\n}\n\n/**\n * 指令绑定值类型\n */\nexport type CopyBinding = string | CopyOptions\n\n/**\n * 元素状态存储\n */\ninterface CopyState {\n\thandler: () => void\n\toptions: CopyOptions\n}\n\n/**\n * 复制文本到剪贴板\n * 优先使用 Clipboard API,降级使用 execCommand\n */\nasync function copyToClipboard(text: string): Promise<boolean> {\n\t// 方式一:使用 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// 权限被拒绝或其他错误,降级处理\n\t\t\tconsole.warn('[Directix] Clipboard API failed, falling back to execCommand')\n\t\t}\n\t}\n\n\t// 方式二:使用 execCommand(已废弃但兼容性好)\n\treturn copyWithExecCommand(text)\n}\n\n/**\n * 使用 execCommand 复制\n */\nfunction copyWithExecCommand(text: string): boolean {\n\t// 创建临时 textarea\n\tconst textarea = document.createElement('textarea')\n\n\ttextarea.value = text\n\n\t// 设置样式使其不可见\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// 选中并复制\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// 清理\n\t\tdocument.body.removeChild(textarea)\n\t}\n}\n\n/**\n * v-copy 指令\n *\n * @example\n * ```vue\n * <template>\n * <button v-copy=\"textToCopy\">复制文本</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// 设置提示\n\t\tif (options.title) {\n\t\t\tel.setAttribute('title', options.title)\n\t\t}\n\n\t\t// 状态存储 - handler 会从这里读取最新值\n\t\tconst state: CopyState = {\n\t\t\thandler: null as any,\n\t\t\toptions,\n\t\t}\n\n\t\t// 添加点击事件 - 从 state 读取最新 options\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 * 标准化选项\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 * 防抖函数类型\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 * 防抖指令选项\n */\nexport interface DebounceOptions<T extends (...args: any[]) => any = any> {\n\t/**\n * 要防抖的函数\n */\n\thandler: T\n\n\t/**\n * 延迟时间(毫秒)\n * @default 300\n */\n\twait?: number\n\n\t/**\n * 是否在延迟开始前立即调用\n * @default false\n */\n\tleading?: boolean\n\n\t/**\n * 是否在延迟结束后调用\n * @default true\n */\n\ttrailing?: boolean\n}\n\n/**\n * 指令绑定值类型\n */\nexport type DebounceBinding<T extends (...args: any[]) => any = any> =\n | T\n | DebounceOptions<T>\n\n/**\n * 元素状态存储\n */\ninterface DebounceState {\n\tdebouncedFn: DebouncedFunction<any>\n\teventType: string\n\toptions: DebounceOptions\n}\n\n/**\n * v-debounce 指令\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\">滚动防抖</div>\n * <div v-debounce:100.scroll=\"handleScroll\">100ms 滚动防抖</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// 优先使用修饰符指定的事件类型,否则根据元素类型推断\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getEventType(el)\n\n\t\t// 创建防抖函数\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// 绑定事件\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// 如果配置变化,重新创建防抖函数\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// 取消旧的\n\t\t\tstate.debouncedFn.cancel()\n\n\t\t\t// 创建新的\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// 只更新 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 * 标准化选项\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 * 获取元素默认事件类型\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 * 支持事件类型的修饰符列表\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 * 从修饰符中提取事件类型\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 * 节流函数类型\n */\nexport interface ThrottledFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n}\n\n/**\n * 节流指令选项\n */\nexport interface ThrottleOptions<T extends (...args: any[]) => any = any> {\n\t/**\n * 要节流的函数\n */\n\thandler: T\n\n\t/**\n * 延迟时间(毫秒)\n * @default 300\n */\n\twait?: number\n\n\t/**\n * 是否在延迟开始前立即调用\n * @default true\n */\n\tleading?: boolean\n\n\t/**\n * 是否在延迟结束后调用\n * @default true\n */\n\ttrailing?: boolean\n}\n\n/**\n * 指令绑定值类型\n */\nexport type ThrottleBinding<T extends (...args: any[]) => any = any> =\n | T\n | ThrottleOptions<T>\n\n/**\n * 元素状态存储\n */\ninterface ThrottleState {\n\tthrottledFn: ThrottledFunction<any>\n\teventType: string\n\toptions: ThrottleOptions\n}\n\n/**\n * v-throttle 指令\n *\n * @example\n * ```vue\n * <template>\n * <button v-throttle=\"handleClick\">节流按钮</button>\n * <button v-throttle:1s=\"handleClick\">1秒节流</button>\n * <div v-throttle.scroll=\"handleScroll\">滚动节流</div>\n * <div v-throttle:100.scroll=\"handleScroll\">100ms 滚动节流</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// 优先使用修饰符指定的事件类型,否则根据元素类型推断\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getEventType(el)\n\n\t\t// 创建节流函数\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// 绑定事件\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// 如果配置变化,重新创建节流函数\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// 取消旧的\n\t\t\tstate.throttledFn.cancel()\n\n\t\t\t// 创建新的\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// 只更新 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 * 标准化选项\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 * 获取元素默认事件类型\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 * 支持事件类型的修饰符列表\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 * 从修饰符中提取事件类型\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 * 焦点指令选项\n */\nexport interface FocusOptions {\n\t/**\n\t * 是否自动聚焦\n\t * @default true\n\t */\n\tfocus?: boolean\n\n\t/**\n\t * 是否在每次更新时重新聚焦\n\t * @default false\n\t */\n\trefocus?: boolean\n\n\t/**\n\t * 聚焦时的回调\n\t */\n\tonFocus?: (el: HTMLElement) => void\n\n\t/**\n\t * 失焦时的回调\n\t */\n\tonBlur?: (el: HTMLElement) => void\n}\n\n/**\n * 指令绑定值类型\n */\nexport type FocusBinding = boolean | FocusOptions\n\n/**\n * 元素状态存储\n */\ninterface FocusState {\n\toptions: FocusOptions\n\thandleFocus: () => void\n\thandleBlur: () => void\n}\n\nconst FOCUSABLE_TAGS = new Set(['input', 'textarea', 'select', 'button'])\n\n/**\n * v-focus 指令\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} 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// 只在回调变化时更新事件监听器\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\tstate.options = newOptions\n\n\t\t// refocus 时重新聚焦\n\t\tif (newOptions.refocus && newOptions.focus) {\n\t\t\tel.focus()\n\t\t}\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 * 标准化选项\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 * 检查元素是否可聚焦\n */\nfunction isFocusable(el: HTMLElement): boolean {\n\tif (!isBrowser()) return false\n\n\tconst tagName = el.tagName.toLowerCase()\n\n\t// 表单元素\n\tif (FOCUSABLE_TAGS.has(tagName)) {\n\t\treturn !(el as HTMLInputElement).disabled\n\t}\n\n\t// 可编辑元素\n\tif (el.isContentEditable) return true\n\n\t// tabindex 属性\n\tconst tabindex = el.getAttribute('tabindex')\n\n\tif (tabindex != null) return tabindex !== '-1'\n\n\t// 链接元素\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// 导出所有指令\nexport * from './directives'\n\n// 导出核心工具\nexport * from '@directix/core'\n\n// 导出共享工具(排除与指令同名的工具)\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// 单独导出 debounce 和 throttle 工具函数(带别名)\nexport {\n\tdebounce as debounceFn,\n\tthrottle as throttleFn,\n} from '@directix/shared'\n\n// 所有指令列表\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 * 安装所有指令\n */\nconst install = (app: App, options: DirectiveInstallOptions = {}): void => {\n\tconst { directives, all = false } = options\n\n\tif (all || !directives) {\n\t\t// 注册所有指令\n\t\tObject.entries(allDirectives).forEach(([name, directive]) => {\n\t\t\tapp.directive(name, directive)\n\t\t})\n\t} else {\n\t\t// 注册指定指令\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 插件\n */\nexport const Directix: Plugin = {\n\tinstall,\n}\n"],"names":["addCleanup","normalizeOptions","getEventTypeFromModifiers","getEventType","EVENT_MODIFIERS"],"mappings":"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"}
|