@veltra/directives 1.1.27 → 1.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/click-outside/index.ts"],"sourcesContent":["import { createIncrease } from '@veltra/utils'\nimport type { ObjectDirective } from 'vue'\n\nconst uid = createIncrease(1000)\nconst targets = new Map<string, { handler: (e: MouseEvent) => void; el: HTMLElement }>()\n\nlet eventAdded = false\nlet mousedownEvent: MouseEvent | undefined\n\nconst documentClickHandler = (event: MouseEvent) => {\n if (!mousedownEvent) return\n if (mousedownEvent?.target !== event.target) {\n return (mousedownEvent = undefined)\n }\n targets.forEach(({ el, handler }) => {\n if (el.contains(event.target as Node)) return\n handler(event)\n })\n mousedownEvent = undefined\n}\n\nfunction documentMousedownHandler(event: MouseEvent) {\n mousedownEvent = event\n}\n\nfunction addEvent() {\n if (eventAdded) return\n document.addEventListener('mousedown', documentMousedownHandler, true)\n document.addEventListener('click', documentClickHandler, true)\n eventAdded = true\n}\n\nfunction removeEvent() {\n if (!eventAdded) return\n document.removeEventListener('click', documentClickHandler, true)\n document.removeEventListener('mousedown', documentMousedownHandler, true)\n eventAdded = false\n}\n\nfunction syncDocumentEvents(): void {\n if (typeof document === 'undefined') return\n\n if (targets.size > 0) {\n addEvent()\n } else {\n removeEvent()\n }\n}\n\nexport const vClickOutside: ObjectDirective<HTMLElement> = {\n mounted(el, binding) {\n if (!binding.value) return\n\n // 为元素添加一个id, 并加入到字典中\n const id = String(uid())\n el.dataset.outsideId = id\n\n targets.set(id, { handler: binding.value, el })\n syncDocumentEvents()\n },\n\n updated(el, binding) {\n if (!binding.value) {\n if (!el.dataset.outsideId) return\n targets.delete(el.dataset.outsideId)\n syncDocumentEvents()\n } else {\n if (!el.dataset.outsideId) {\n el.dataset.outsideId = String(uid())\n }\n\n targets.set(el.dataset.outsideId!, { handler: binding.value, el })\n syncDocumentEvents()\n }\n },\n\n unmounted(el: HTMLElement) {\n targets.delete(el.dataset.outsideId!)\n syncDocumentEvents()\n }\n}\n"],"mappings":";;AAGA,MAAM,MAAM,eAAe,IAAK;AAChC,MAAM,0BAAU,IAAI,KAAoE;AAExF,IAAI,aAAa;AACjB,IAAI;AAEJ,MAAM,wBAAwB,UAAsB;CAClD,IAAI,CAAC,gBAAgB;CACrB,IAAI,gBAAgB,WAAW,MAAM,QAAQ;EACnC,iBAAiB,KAAA;EAAzB;;CAEF,QAAQ,SAAS,EAAE,IAAI,cAAc;EACnC,IAAI,GAAG,SAAS,MAAM,OAAe,EAAE;EACvC,QAAQ,MAAM;GACd;CACF,iBAAiB,KAAA;;AAGnB,SAAS,yBAAyB,OAAmB;CACnD,iBAAiB;;AAGnB,SAAS,WAAW;CAClB,IAAI,YAAY;CAChB,SAAS,iBAAiB,aAAa,0BAA0B,KAAK;CACtE,SAAS,iBAAiB,SAAS,sBAAsB,KAAK;CAC9D,aAAa;;AAGf,SAAS,cAAc;CACrB,IAAI,CAAC,YAAY;CACjB,SAAS,oBAAoB,SAAS,sBAAsB,KAAK;CACjE,SAAS,oBAAoB,aAAa,0BAA0B,KAAK;CACzE,aAAa;;AAGf,SAAS,qBAA2B;CAClC,IAAI,OAAO,aAAa,aAAa;CAErC,IAAI,QAAQ,OAAO,GACjB,UAAU;MAEV,aAAa;;AAIjB,MAAa,gBAA8C;CACzD,QAAQ,IAAI,SAAS;EACnB,IAAI,CAAC,QAAQ,OAAO;EAGpB,MAAM,KAAK,OAAO,KAAK,CAAC;EACxB,GAAG,QAAQ,YAAY;EAEvB,QAAQ,IAAI,IAAI;GAAE,SAAS,QAAQ;GAAO;GAAI,CAAC;EAC/C,oBAAoB;;CAGtB,QAAQ,IAAI,SAAS;EACnB,IAAI,CAAC,QAAQ,OAAO;GAClB,IAAI,CAAC,GAAG,QAAQ,WAAW;GAC3B,QAAQ,OAAO,GAAG,QAAQ,UAAU;GACpC,oBAAoB;SACf;GACL,IAAI,CAAC,GAAG,QAAQ,WACd,GAAG,QAAQ,YAAY,OAAO,KAAK,CAAC;GAGtC,QAAQ,IAAI,GAAG,QAAQ,WAAY;IAAE,SAAS,QAAQ;IAAO;IAAI,CAAC;GAClE,oBAAoB;;;CAIxB,UAAU,IAAiB;EACzB,QAAQ,OAAO,GAAG,QAAQ,UAAW;EACrC,oBAAoB;;CAEvB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/click-outside/index.ts"],"sourcesContent":["import { createIncrease } from '@veltra/utils'\nimport type { ObjectDirective } from 'vue'\n\nconst uid = createIncrease(1000)\nconst targets = new Map<string, { handler: (e: MouseEvent) => void; el: HTMLElement }>()\n\nlet eventAdded = false\nlet mousedownEvent: MouseEvent | undefined\n\nconst documentClickHandler = (event: MouseEvent) => {\n if (!mousedownEvent) return\n if (mousedownEvent?.target !== event.target) {\n return (mousedownEvent = undefined)\n }\n targets.forEach(({ el, handler }) => {\n if (el.contains(event.target as Node)) return\n handler(event)\n })\n mousedownEvent = undefined\n}\n\nfunction documentMousedownHandler(event: MouseEvent) {\n mousedownEvent = event\n}\n\nfunction addEvent() {\n if (eventAdded) return\n document.addEventListener('mousedown', documentMousedownHandler, true)\n document.addEventListener('click', documentClickHandler, true)\n eventAdded = true\n}\n\nfunction removeEvent() {\n if (!eventAdded) return\n document.removeEventListener('click', documentClickHandler, true)\n document.removeEventListener('mousedown', documentMousedownHandler, true)\n eventAdded = false\n}\n\nfunction syncDocumentEvents(): void {\n if (typeof document === 'undefined') return\n\n if (targets.size > 0) {\n addEvent()\n } else {\n removeEvent()\n }\n}\n\nexport const vClickOutside: ObjectDirective<HTMLElement> = {\n mounted(el, binding) {\n if (!binding.value) return\n\n // 为元素添加一个id, 并加入到字典中\n const id = String(uid())\n el.dataset.outsideId = id\n\n targets.set(id, { handler: binding.value, el })\n syncDocumentEvents()\n },\n\n updated(el, binding) {\n if (!binding.value) {\n if (!el.dataset.outsideId) return\n targets.delete(el.dataset.outsideId)\n syncDocumentEvents()\n } else {\n if (!el.dataset.outsideId) {\n el.dataset.outsideId = String(uid())\n }\n\n targets.set(el.dataset.outsideId!, { handler: binding.value, el })\n syncDocumentEvents()\n }\n },\n\n unmounted(el: HTMLElement) {\n targets.delete(el.dataset.outsideId!)\n syncDocumentEvents()\n }\n}\n"],"mappings":";;AAGA,MAAM,MAAM,eAAe,GAAI;AAC/B,MAAM,0BAAU,IAAI,IAAmE;AAEvF,IAAI,aAAa;AACjB,IAAI;AAEJ,MAAM,wBAAwB,UAAsB;CAClD,IAAI,CAAC,gBAAgB;CACrB,IAAI,gBAAgB,WAAW,MAAM,QAAQ;EACnC,iBAAiB,KAAA;EAAzB;CACF;CACA,QAAQ,SAAS,EAAE,IAAI,cAAc;EACnC,IAAI,GAAG,SAAS,MAAM,MAAc,GAAG;EACvC,QAAQ,KAAK;CACf,CAAC;CACD,iBAAiB,KAAA;AACnB;AAEA,SAAS,yBAAyB,OAAmB;CACnD,iBAAiB;AACnB;AAEA,SAAS,WAAW;CAClB,IAAI,YAAY;CAChB,SAAS,iBAAiB,aAAa,0BAA0B,IAAI;CACrE,SAAS,iBAAiB,SAAS,sBAAsB,IAAI;CAC7D,aAAa;AACf;AAEA,SAAS,cAAc;CACrB,IAAI,CAAC,YAAY;CACjB,SAAS,oBAAoB,SAAS,sBAAsB,IAAI;CAChE,SAAS,oBAAoB,aAAa,0BAA0B,IAAI;CACxE,aAAa;AACf;AAEA,SAAS,qBAA2B;CAClC,IAAI,OAAO,aAAa,aAAa;CAErC,IAAI,QAAQ,OAAO,GACjB,SAAS;MAET,YAAY;AAEhB;AAEA,MAAa,gBAA8C;CACzD,QAAQ,IAAI,SAAS;EACnB,IAAI,CAAC,QAAQ,OAAO;EAGpB,MAAM,KAAK,OAAO,IAAI,CAAC;EACvB,GAAG,QAAQ,YAAY;EAEvB,QAAQ,IAAI,IAAI;GAAE,SAAS,QAAQ;GAAO;EAAG,CAAC;EAC9C,mBAAmB;CACrB;CAEA,QAAQ,IAAI,SAAS;EACnB,IAAI,CAAC,QAAQ,OAAO;GAClB,IAAI,CAAC,GAAG,QAAQ,WAAW;GAC3B,QAAQ,OAAO,GAAG,QAAQ,SAAS;GACnC,mBAAmB;EACrB,OAAO;GACL,IAAI,CAAC,GAAG,QAAQ,WACd,GAAG,QAAQ,YAAY,OAAO,IAAI,CAAC;GAGrC,QAAQ,IAAI,GAAG,QAAQ,WAAY;IAAE,SAAS,QAAQ;IAAO;GAAG,CAAC;GACjE,mBAAmB;EACrB;CACF;CAEA,UAAU,IAAiB;EACzB,QAAQ,OAAO,GAAG,QAAQ,SAAU;EACpC,mBAAmB;CACrB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/focus/index.ts"],"sourcesContent":["import type { ObjectDirective } from 'vue'\n\nexport const vFocus: ObjectDirective<HTMLElement> = {\n mounted: (el) => {\n if (el.tagName === 'INPUT') {\n el.focus()\n } else {\n const input = el.querySelector('input')\n if (input) {\n input.focus()\n } else {\n console.warn('v-focus 指令需要一个 input 元素')\n }\n }\n }\n}\n"],"mappings":";AAEA,MAAa,SAAuC,EAClD,UAAU,OAAO;CACf,IAAI,GAAG,YAAY,SACjB,GAAG,OAAO;MACL;EACL,MAAM,QAAQ,GAAG,cAAc,QAAQ;EACvC,IAAI,OACF,MAAM,OAAO;OAEb,QAAQ,KAAK,0BAA0B;;GAI9C"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/focus/index.ts"],"sourcesContent":["import type { ObjectDirective } from 'vue'\n\nexport const vFocus: ObjectDirective<HTMLElement> = {\n mounted: (el) => {\n if (el.tagName === 'INPUT') {\n el.focus()\n } else {\n const input = el.querySelector('input')\n if (input) {\n input.focus()\n } else {\n console.warn('v-focus 指令需要一个 input 元素')\n }\n }\n }\n}\n"],"mappings":";AAEA,MAAa,SAAuC,EAClD,UAAU,OAAO;CACf,IAAI,GAAG,YAAY,SACjB,GAAG,MAAM;MACJ;EACL,MAAM,QAAQ,GAAG,cAAc,OAAO;EACtC,IAAI,OACF,MAAM,MAAM;OAEZ,QAAQ,KAAK,yBAAyB;CAE1C;AACF,EACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/ripple/index.ts"],"sourcesContent":["import type { DirectiveBinding, ObjectDirective } from 'vue'\n\nimport { Ripple } from './ripple'\n\nconst rippleMap = new WeakMap<HTMLElement, Ripple>()\n\nfunction handleMousedown(e: MouseEvent) {\n if (e.button !== 0) return\n const container = e.currentTarget as HTMLElement\n\n const mouseupHandler = () => {\n rippleMap.get(container)?.remove()\n document.removeEventListener('mouseup', mouseupHandler)\n }\n\n document.addEventListener('mouseup', mouseupHandler)\n\n let ripple = rippleMap.get(container)\n if (!ripple) {\n const { rippleClass, duration } = container.dataset\n ripple = new Ripple(container, {\n rippleClass,\n duration: duration ? Number(duration) : undefined\n })\n rippleMap.set(container, ripple)\n }\n\n ripple.showByEvent(e)\n}\n\nfunction handleMouseleave(e: MouseEvent) {\n rippleMap.get(e.currentTarget as HTMLElement)?.remove()\n}\n\n/**\n * 注册按下事件\n * @param el\n * @param binding\n * @todo 如有必要将来可添加触摸事件\n */\nconst registerEvents = (el: HTMLElement, binding: DirectiveBinding<any>) => {\n // 如果指令绑定的值为false则不应用该事件.\n if (binding.value === false) return\n\n el.addEventListener('mousedown', handleMousedown)\n el.addEventListener('mouseleave', handleMouseleave)\n}\n\n/**\n * 注销按下事件\n * @param el 元素\n */\nconst unregisterEvents = (el: HTMLElement) => {\n el.removeEventListener('mousedown', handleMousedown)\n el.removeEventListener('mouseleave', handleMouseleave)\n}\n\nexport { Ripple }\n\nexport const vRipple: ObjectDirective<HTMLElement> = {\n mounted: (el, binding) => {\n if (binding.value !== false) {\n el.dataset.rippleClass = binding.value\n }\n\n if (binding.arg) {\n el.dataset.duration = binding.arg\n }\n\n registerEvents(el, binding)\n },\n\n unmounted: (el) => {\n unregisterEvents(el)\n rippleMap.get(el)?.remove()\n rippleMap.delete(el)\n },\n\n updated(el, binding) {\n const registered = binding.oldValue !== false\n\n if (binding.value !== false) {\n if (!registered) {\n registerEvents(el, binding)\n }\n } else {\n if (registered) {\n unregisterEvents(el)\n }\n }\n }\n}\n"],"mappings":";;AAIA,MAAM,4BAAY,IAAI,SAA8B;AAEpD,SAAS,gBAAgB,GAAe;CACtC,IAAI,EAAE,WAAW,GAAG;CACpB,MAAM,YAAY,EAAE;CAEpB,MAAM,uBAAuB;EAC3B,UAAU,IAAI,UAAU,EAAE,QAAQ;EAClC,SAAS,oBAAoB,WAAW,eAAe;;CAGzD,SAAS,iBAAiB,WAAW,eAAe;CAEpD,IAAI,SAAS,UAAU,IAAI,UAAU;CACrC,IAAI,CAAC,QAAQ;EACX,MAAM,EAAE,aAAa,aAAa,UAAU;EAC5C,SAAS,IAAI,OAAO,WAAW;GAC7B;GACA,UAAU,WAAW,OAAO,SAAS,GAAG,KAAA;GACzC,CAAC;EACF,UAAU,IAAI,WAAW,OAAO;;CAGlC,OAAO,YAAY,EAAE;;AAGvB,SAAS,iBAAiB,GAAe;CACvC,UAAU,IAAI,EAAE,cAA6B,EAAE,QAAQ;;;;;;;;AASzD,MAAM,kBAAkB,IAAiB,YAAmC;CAE1E,IAAI,QAAQ,UAAU,OAAO;CAE7B,GAAG,iBAAiB,aAAa,gBAAgB;CACjD,GAAG,iBAAiB,cAAc,iBAAiB;;;;;;AAOrD,MAAM,oBAAoB,OAAoB;CAC5C,GAAG,oBAAoB,aAAa,gBAAgB;CACpD,GAAG,oBAAoB,cAAc,iBAAiB;;AAKxD,MAAa,UAAwC;CACnD,UAAU,IAAI,YAAY;EACxB,IAAI,QAAQ,UAAU,OACpB,GAAG,QAAQ,cAAc,QAAQ;EAGnC,IAAI,QAAQ,KACV,GAAG,QAAQ,WAAW,QAAQ;EAGhC,eAAe,IAAI,QAAQ;;CAG7B,YAAY,OAAO;EACjB,iBAAiB,GAAG;EACpB,UAAU,IAAI,GAAG,EAAE,QAAQ;EAC3B,UAAU,OAAO,GAAG;;CAGtB,QAAQ,IAAI,SAAS;EACnB,MAAM,aAAa,QAAQ,aAAa;EAExC,IAAI,QAAQ,UAAU;OAChB,CAAC,YACH,eAAe,IAAI,QAAQ;SAG7B,IAAI,YACF,iBAAiB,GAAG;;CAI3B"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/ripple/index.ts"],"sourcesContent":["import type { DirectiveBinding, ObjectDirective } from 'vue'\n\nimport { Ripple } from './ripple'\n\nconst rippleMap = new WeakMap<HTMLElement, Ripple>()\n\nfunction handleMousedown(e: MouseEvent) {\n if (e.button !== 0) return\n const container = e.currentTarget as HTMLElement\n\n const mouseupHandler = () => {\n rippleMap.get(container)?.remove()\n document.removeEventListener('mouseup', mouseupHandler)\n }\n\n document.addEventListener('mouseup', mouseupHandler)\n\n let ripple = rippleMap.get(container)\n if (!ripple) {\n const { rippleClass, duration } = container.dataset\n ripple = new Ripple(container, {\n rippleClass,\n duration: duration ? Number(duration) : undefined\n })\n rippleMap.set(container, ripple)\n }\n\n ripple.showByEvent(e)\n}\n\nfunction handleMouseleave(e: MouseEvent) {\n rippleMap.get(e.currentTarget as HTMLElement)?.remove()\n}\n\n/**\n * 注册按下事件\n * @param el\n * @param binding\n * @todo 如有必要将来可添加触摸事件\n */\nconst registerEvents = (el: HTMLElement, binding: DirectiveBinding<any>) => {\n // 如果指令绑定的值为false则不应用该事件.\n if (binding.value === false) return\n\n el.addEventListener('mousedown', handleMousedown)\n el.addEventListener('mouseleave', handleMouseleave)\n}\n\n/**\n * 注销按下事件\n * @param el 元素\n */\nconst unregisterEvents = (el: HTMLElement) => {\n el.removeEventListener('mousedown', handleMousedown)\n el.removeEventListener('mouseleave', handleMouseleave)\n}\n\nexport { Ripple }\n\nexport const vRipple: ObjectDirective<HTMLElement> = {\n mounted: (el, binding) => {\n if (binding.value !== false) {\n el.dataset.rippleClass = binding.value\n }\n\n if (binding.arg) {\n el.dataset.duration = binding.arg\n }\n\n registerEvents(el, binding)\n },\n\n unmounted: (el) => {\n unregisterEvents(el)\n rippleMap.get(el)?.remove()\n rippleMap.delete(el)\n },\n\n updated(el, binding) {\n const registered = binding.oldValue !== false\n\n if (binding.value !== false) {\n if (!registered) {\n registerEvents(el, binding)\n }\n } else {\n if (registered) {\n unregisterEvents(el)\n }\n }\n }\n}\n"],"mappings":";;AAIA,MAAM,4BAAY,IAAI,QAA6B;AAEnD,SAAS,gBAAgB,GAAe;CACtC,IAAI,EAAE,WAAW,GAAG;CACpB,MAAM,YAAY,EAAE;CAEpB,MAAM,uBAAuB;EAC3B,UAAU,IAAI,SAAS,GAAG,OAAO;EACjC,SAAS,oBAAoB,WAAW,cAAc;CACxD;CAEA,SAAS,iBAAiB,WAAW,cAAc;CAEnD,IAAI,SAAS,UAAU,IAAI,SAAS;CACpC,IAAI,CAAC,QAAQ;EACX,MAAM,EAAE,aAAa,aAAa,UAAU;EAC5C,SAAS,IAAI,OAAO,WAAW;GAC7B;GACA,UAAU,WAAW,OAAO,QAAQ,IAAI,KAAA;EAC1C,CAAC;EACD,UAAU,IAAI,WAAW,MAAM;CACjC;CAEA,OAAO,YAAY,CAAC;AACtB;AAEA,SAAS,iBAAiB,GAAe;CACvC,UAAU,IAAI,EAAE,aAA4B,GAAG,OAAO;AACxD;;;;;;;AAQA,MAAM,kBAAkB,IAAiB,YAAmC;CAE1E,IAAI,QAAQ,UAAU,OAAO;CAE7B,GAAG,iBAAiB,aAAa,eAAe;CAChD,GAAG,iBAAiB,cAAc,gBAAgB;AACpD;;;;;AAMA,MAAM,oBAAoB,OAAoB;CAC5C,GAAG,oBAAoB,aAAa,eAAe;CACnD,GAAG,oBAAoB,cAAc,gBAAgB;AACvD;AAIA,MAAa,UAAwC;CACnD,UAAU,IAAI,YAAY;EACxB,IAAI,QAAQ,UAAU,OACpB,GAAG,QAAQ,cAAc,QAAQ;EAGnC,IAAI,QAAQ,KACV,GAAG,QAAQ,WAAW,QAAQ;EAGhC,eAAe,IAAI,OAAO;CAC5B;CAEA,YAAY,OAAO;EACjB,iBAAiB,EAAE;EACnB,UAAU,IAAI,EAAE,GAAG,OAAO;EAC1B,UAAU,OAAO,EAAE;CACrB;CAEA,QAAQ,IAAI,SAAS;EACnB,MAAM,aAAa,QAAQ,aAAa;EAExC,IAAI,QAAQ,UAAU;OAChB,CAAC,YACH,eAAe,IAAI,OAAO;EAAA,OAG5B,IAAI,YACF,iBAAiB,EAAE;CAGzB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"ripple.js","names":[],"sources":["../../src/ripple/ripple.ts"],"sourcesContent":["import { bem, nextFrame, setStyles, type BEM } from '@veltra/utils'\nimport type { CSSProperties } from 'vue'\n\n/** 鼠标或触摸事件类型 */\ntype MouseOrTouchEvent = MouseEvent | Touch\n\n/** 波纹位置接口 */\ninterface RipplePosition {\n /** X 坐标 */\n x: number\n /** Y 坐标 */\n y: number\n}\n\n/** 波纹配置接口 */\ninterface RippleConfig {\n /** 波纹类 */\n rippleClass?: string\n /** 波纹动画时长 */\n duration?: number\n /** 是否自动移除 */\n autoRemove?: boolean\n}\n\n/** 数据集 key,用于标记 Ripple 修改过的样式 */\nconst PositionKey = 'uRipplePosition'\nconst OverflowKey = 'uRippleOverflow'\nconst CountKey = 'uRippleActiveCount'\n\n/**\n * 波纹效果类\n * 用于在指定容器中创建和管理波纹动画效果\n * 支持鼠标点击和触摸事件触发的波纹动画\n *\n * 样式管理策略:\n * - 只在容器 position 为 static 时设置 relative\n * - 只在容器 overflow 为 visible 时设置 hidden\n * - 使用 dataset 做引用计数,多实例可安全协作\n * - 最后一个波纹移除时,精确恢复到修改前的状态\n */\nexport class Ripple {\n /** 波纹样式类名生成器 */\n static cls: BEM<'ripple'> = bem('ripple')\n\n /** 波纹容器元素 */\n private container: HTMLElement\n /** 容器矩形区域缓存 */\n private containerRect?: DOMRect\n\n /** 当前活跃的波纹元素 */\n private currentRippleEl?: HTMLElement\n\n /** 波纹配置 */\n private config?: RippleConfig\n\n /** 波纹元素数量(私有) */\n private _amount = 0\n\n /**\n * 设置波纹元素数量\n * 当数量为 0 时自动重置容器样式\n */\n private set amount(amount: number) {\n this._amount = amount\n amount === 0 && this.resetContainerStyle()\n }\n\n /** 获取当前波纹元素数量 */\n private get amount(): number {\n return this._amount\n }\n\n /**\n * 构造函数\n * @param container 波纹容器元素\n * @param config 波纹配置选项\n */\n constructor(container: HTMLElement, config?: RippleConfig) {\n this.container = container\n if (config) {\n this.config = config\n }\n }\n\n /**\n * 获取波纹容器元素\n * @returns 容器元素\n */\n getContainer(): HTMLElement {\n return this.container\n }\n\n /**\n * 获取容器矩形区域\n * 使用缓存机制避免重复计算\n * @returns 容器矩形区域\n */\n private getContainerRect(): DOMRect {\n const rect = this.container.getBoundingClientRect()\n this.containerRect = rect\n return this.containerRect\n }\n\n /**\n * 获取波纹圆心位置\n * 根据鼠标或触摸事件计算相对于容器的坐标\n * @param e 鼠标或触摸事件\n * @returns 波纹圆心位置\n */\n private getRippleCenterPosition(e: MouseOrTouchEvent): { x: number; y: number } {\n const { left, top } = this.getContainerRect()\n const { clientX, clientY } = e\n return { x: clientX - left, y: clientY - top }\n }\n\n /**\n * 标记元素过渡动画结束\n * @param el 目标元素\n */\n private markTransitionEnd(el: HTMLElement) {\n el.dataset.transitionend = 'true'\n }\n\n /**\n * 标记元素为可移除状态\n * @param el 目标元素\n */\n private markRemovable(el: HTMLElement) {\n el.dataset.removable = 'true'\n }\n\n /**\n * 计算波纹半径\n * 根据点击位置计算能覆盖整个容器的最小半径\n * @param centerPosition 波纹圆心位置\n * @returns 波纹半径\n */\n private calcRippleRadius(centerPosition: RipplePosition) {\n const { x, y } = centerPosition\n const { width, height } = this.getContainerRect()\n const edgeA = Math.max(x, width - x)\n const edgeB = Math.max(y, height - y)\n return Math.ceil(Math.sqrt(edgeA ** 2 + edgeB ** 2))\n }\n\n /**\n * 设置容器样式\n * 使用引用计数 + dataset 标记,确保多实例协作安全\n */\n private setContainerStyle() {\n const { container } = this\n const count = Number(container.dataset[CountKey] || 0)\n container.dataset[CountKey] = String(count + 1)\n\n // 已经有其他波纹在运行,样式已设置,直接返回\n if (count > 0) return\n\n const computed = window.getComputedStyle(container)\n\n if (computed.position === 'static') {\n container.dataset[PositionKey] = 'static'\n container.style.position = 'relative'\n }\n\n if (computed.overflow === 'visible') {\n container.dataset[OverflowKey] = 'visible'\n container.style.overflow = 'hidden'\n }\n }\n\n /**\n * 重置容器样式\n * 根据 dataset 标记精确恢复,避免误删其他内联样式\n */\n private resetContainerStyle() {\n const { container } = this\n const count = Number(container.dataset[CountKey] || 0)\n\n if (count <= 1) {\n // 最后一个波纹,执行恢复\n if (container.dataset[PositionKey] === 'static') {\n container.style.position = ''\n delete container.dataset[PositionKey]\n }\n\n if (container.dataset[OverflowKey] === 'visible') {\n container.style.overflow = ''\n delete container.dataset[OverflowKey]\n }\n\n delete container.dataset[CountKey]\n } else {\n // 还有其他波纹在运行,只减计数\n container.dataset[CountKey] = String(count - 1)\n }\n }\n\n /**\n * 创建波纹元素\n * 生成波纹DOM元素并设置样式和动画\n * @param centerPosition 波纹圆心位置\n */\n private createRipple(centerPosition: RipplePosition) {\n const { config } = this\n\n // 必须在创建ripple元素之前调用\n this.setContainerStyle()\n\n const rippleEl = document.createElement('span')\n this.currentRippleEl = rippleEl\n rippleEl.classList.add(Ripple.cls.b)\n config?.rippleClass && rippleEl.classList.add(config.rippleClass)\n\n const radius = this.calcRippleRadius(centerPosition)\n const diameter = radius * 2\n\n // 设置波纹元素的基础样式\n const rippleStyle: CSSProperties = {\n width: `${diameter}px`,\n height: `${diameter}px`,\n left: `${centerPosition.x - radius}px`,\n top: `${centerPosition.y - radius}px`\n }\n\n // 设置自定义动画时长\n if (config?.duration) {\n rippleStyle.transitionDuration = `${config.duration}ms`\n }\n\n setStyles(rippleEl, rippleStyle)\n\n // 监听过渡动画结束事件\n const transitionEndHandler = (e: TransitionEvent) => {\n if (e.propertyName !== 'transform') return\n\n rippleEl.removeEventListener('transitionend', transitionEndHandler)\n this.markTransitionEnd(rippleEl)\n // 尝试移除\n this.removeRippleEl(rippleEl)\n }\n\n rippleEl.addEventListener('transitionend', transitionEndHandler)\n\n this.container.appendChild(rippleEl)\n this.amount++\n\n // 如果配置了自动移除,标记为可移除\n if (config?.autoRemove) {\n this.markRemovable(rippleEl)\n }\n\n // 触发缩放动画\n nextFrame(() => {\n setStyles(rippleEl, { transform: 'scale3d(1, 1, 1)' })\n })\n }\n\n /**\n * 移除波纹元素\n * 检查元素状态,符合条件时执行淡出动画并移除DOM\n * @param rippleEl 要移除的波纹元素\n */\n private removeRippleEl(rippleEl: HTMLElement): void {\n const { transitionend, removable } = rippleEl.dataset\n\n // 只有在过渡结束且标记为可移除时才执行移除\n if (transitionend !== 'true' || removable !== 'true') return\n\n const transitionEndOrCancelHandler = (e: TransitionEvent) => {\n if (e.propertyName !== 'opacity') return\n\n rippleEl.removeEventListener('transitionend', transitionEndOrCancelHandler)\n rippleEl.removeEventListener('transitioncancel', transitionEndOrCancelHandler)\n rippleEl.remove()\n this.amount--\n }\n\n rippleEl.addEventListener('transitionend', transitionEndOrCancelHandler)\n rippleEl.addEventListener('transitioncancel', transitionEndOrCancelHandler)\n rippleEl.classList.add(bem.is('removing'))\n }\n\n /**\n * 显示波纹\n * 根据指定位置创建波纹效果\n * @param centerPosition 波纹圆心位置\n */\n show(centerPosition: RipplePosition): void {\n this.createRipple(centerPosition)\n }\n\n /**\n * 根据事件对象显示波纹\n * 从鼠标或触摸事件中提取位置信息并创建波纹\n * @param e 鼠标或触摸事件对象\n */\n showByEvent(e: MouseEvent | TouchEvent): void {\n const centerPosition = this.getRippleCenterPosition(e instanceof MouseEvent ? e : e.touches[0]!)\n this.createRipple(centerPosition)\n }\n\n /**\n * 移除波纹\n * 手动移除当前活跃的波纹元素\n * 注意:如果已经在Ripple配置中增加了autoRemove属性,则不需要调用此方法\n */\n remove(): void {\n let el = this.currentRippleEl\n if (el) {\n this.markRemovable(el)\n this.removeRippleEl(el)\n el = undefined\n this.currentRippleEl = undefined\n }\n }\n\n /**\n * 重置容器矩形\n * 当容器大小发生变化时,需要重置容器矩形缓存\n * 否则计算的波纹半径不准确\n * 注意:大部分情况下不需要调用此方法\n */\n resetContainerRect(): void {\n this.containerRect = undefined\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ripple.js","names":[],"sources":["../../src/ripple/ripple.ts"],"sourcesContent":["import { bem, nextFrame, setStyles, type BEM } from '@veltra/utils'\nimport type { CSSProperties } from 'vue'\n\n/** 鼠标或触摸事件类型 */\ntype MouseOrTouchEvent = MouseEvent | Touch\n\n/** 波纹位置接口 */\ninterface RipplePosition {\n /** X 坐标 */\n x: number\n /** Y 坐标 */\n y: number\n}\n\n/** 波纹配置接口 */\ninterface RippleConfig {\n /** 波纹类 */\n rippleClass?: string\n /** 波纹动画时长 */\n duration?: number\n /** 是否自动移除 */\n autoRemove?: boolean\n}\n\n/** 数据集 key,用于标记 Ripple 修改过的样式 */\nconst PositionKey = 'uRipplePosition'\nconst OverflowKey = 'uRippleOverflow'\nconst CountKey = 'uRippleActiveCount'\n\n/**\n * 波纹效果类\n * 用于在指定容器中创建和管理波纹动画效果\n * 支持鼠标点击和触摸事件触发的波纹动画\n *\n * 样式管理策略:\n * - 只在容器 position 为 static 时设置 relative\n * - 只在容器 overflow 为 visible 时设置 hidden\n * - 使用 dataset 做引用计数,多实例可安全协作\n * - 最后一个波纹移除时,精确恢复到修改前的状态\n */\nexport class Ripple {\n /** 波纹样式类名生成器 */\n static cls: BEM<'ripple'> = bem('ripple')\n\n /** 波纹容器元素 */\n private container: HTMLElement\n /** 容器矩形区域缓存 */\n private containerRect?: DOMRect\n\n /** 当前活跃的波纹元素 */\n private currentRippleEl?: HTMLElement\n\n /** 波纹配置 */\n private config?: RippleConfig\n\n /** 波纹元素数量(私有) */\n private _amount = 0\n\n /**\n * 设置波纹元素数量\n * 当数量为 0 时自动重置容器样式\n */\n private set amount(amount: number) {\n this._amount = amount\n amount === 0 && this.resetContainerStyle()\n }\n\n /** 获取当前波纹元素数量 */\n private get amount(): number {\n return this._amount\n }\n\n /**\n * 构造函数\n * @param container 波纹容器元素\n * @param config 波纹配置选项\n */\n constructor(container: HTMLElement, config?: RippleConfig) {\n this.container = container\n if (config) {\n this.config = config\n }\n }\n\n /**\n * 获取波纹容器元素\n * @returns 容器元素\n */\n getContainer(): HTMLElement {\n return this.container\n }\n\n /**\n * 获取容器矩形区域\n * 使用缓存机制避免重复计算\n * @returns 容器矩形区域\n */\n private getContainerRect(): DOMRect {\n const rect = this.container.getBoundingClientRect()\n this.containerRect = rect\n return this.containerRect\n }\n\n /**\n * 获取波纹圆心位置\n * 根据鼠标或触摸事件计算相对于容器的坐标\n * @param e 鼠标或触摸事件\n * @returns 波纹圆心位置\n */\n private getRippleCenterPosition(e: MouseOrTouchEvent): { x: number; y: number } {\n const { left, top } = this.getContainerRect()\n const { clientX, clientY } = e\n return { x: clientX - left, y: clientY - top }\n }\n\n /**\n * 标记元素过渡动画结束\n * @param el 目标元素\n */\n private markTransitionEnd(el: HTMLElement) {\n el.dataset.transitionend = 'true'\n }\n\n /**\n * 标记元素为可移除状态\n * @param el 目标元素\n */\n private markRemovable(el: HTMLElement) {\n el.dataset.removable = 'true'\n }\n\n /**\n * 计算波纹半径\n * 根据点击位置计算能覆盖整个容器的最小半径\n * @param centerPosition 波纹圆心位置\n * @returns 波纹半径\n */\n private calcRippleRadius(centerPosition: RipplePosition) {\n const { x, y } = centerPosition\n const { width, height } = this.getContainerRect()\n const edgeA = Math.max(x, width - x)\n const edgeB = Math.max(y, height - y)\n return Math.ceil(Math.sqrt(edgeA ** 2 + edgeB ** 2))\n }\n\n /**\n * 设置容器样式\n * 使用引用计数 + dataset 标记,确保多实例协作安全\n */\n private setContainerStyle() {\n const { container } = this\n const count = Number(container.dataset[CountKey] || 0)\n container.dataset[CountKey] = String(count + 1)\n\n // 已经有其他波纹在运行,样式已设置,直接返回\n if (count > 0) return\n\n const computed = window.getComputedStyle(container)\n\n if (computed.position === 'static') {\n container.dataset[PositionKey] = 'static'\n container.style.position = 'relative'\n }\n\n if (computed.overflow === 'visible') {\n container.dataset[OverflowKey] = 'visible'\n container.style.overflow = 'hidden'\n }\n }\n\n /**\n * 重置容器样式\n * 根据 dataset 标记精确恢复,避免误删其他内联样式\n */\n private resetContainerStyle() {\n const { container } = this\n const count = Number(container.dataset[CountKey] || 0)\n\n if (count <= 1) {\n // 最后一个波纹,执行恢复\n if (container.dataset[PositionKey] === 'static') {\n container.style.position = ''\n delete container.dataset[PositionKey]\n }\n\n if (container.dataset[OverflowKey] === 'visible') {\n container.style.overflow = ''\n delete container.dataset[OverflowKey]\n }\n\n delete container.dataset[CountKey]\n } else {\n // 还有其他波纹在运行,只减计数\n container.dataset[CountKey] = String(count - 1)\n }\n }\n\n /**\n * 创建波纹元素\n * 生成波纹DOM元素并设置样式和动画\n * @param centerPosition 波纹圆心位置\n */\n private createRipple(centerPosition: RipplePosition) {\n const { config } = this\n\n // 必须在创建ripple元素之前调用\n this.setContainerStyle()\n\n const rippleEl = document.createElement('span')\n this.currentRippleEl = rippleEl\n rippleEl.classList.add(Ripple.cls.b)\n config?.rippleClass && rippleEl.classList.add(config.rippleClass)\n\n const radius = this.calcRippleRadius(centerPosition)\n const diameter = radius * 2\n\n // 设置波纹元素的基础样式\n const rippleStyle: CSSProperties = {\n width: `${diameter}px`,\n height: `${diameter}px`,\n left: `${centerPosition.x - radius}px`,\n top: `${centerPosition.y - radius}px`\n }\n\n // 设置自定义动画时长\n if (config?.duration) {\n rippleStyle.transitionDuration = `${config.duration}ms`\n }\n\n setStyles(rippleEl, rippleStyle)\n\n // 监听过渡动画结束事件\n const transitionEndHandler = (e: TransitionEvent) => {\n if (e.propertyName !== 'transform') return\n\n rippleEl.removeEventListener('transitionend', transitionEndHandler)\n this.markTransitionEnd(rippleEl)\n // 尝试移除\n this.removeRippleEl(rippleEl)\n }\n\n rippleEl.addEventListener('transitionend', transitionEndHandler)\n\n this.container.appendChild(rippleEl)\n this.amount++\n\n // 如果配置了自动移除,标记为可移除\n if (config?.autoRemove) {\n this.markRemovable(rippleEl)\n }\n\n // 触发缩放动画\n nextFrame(() => {\n setStyles(rippleEl, { transform: 'scale3d(1, 1, 1)' })\n })\n }\n\n /**\n * 移除波纹元素\n * 检查元素状态,符合条件时执行淡出动画并移除DOM\n * @param rippleEl 要移除的波纹元素\n */\n private removeRippleEl(rippleEl: HTMLElement): void {\n const { transitionend, removable } = rippleEl.dataset\n\n // 只有在过渡结束且标记为可移除时才执行移除\n if (transitionend !== 'true' || removable !== 'true') return\n\n const transitionEndOrCancelHandler = (e: TransitionEvent) => {\n if (e.propertyName !== 'opacity') return\n\n rippleEl.removeEventListener('transitionend', transitionEndOrCancelHandler)\n rippleEl.removeEventListener('transitioncancel', transitionEndOrCancelHandler)\n rippleEl.remove()\n this.amount--\n }\n\n rippleEl.addEventListener('transitionend', transitionEndOrCancelHandler)\n rippleEl.addEventListener('transitioncancel', transitionEndOrCancelHandler)\n rippleEl.classList.add(bem.is('removing'))\n }\n\n /**\n * 显示波纹\n * 根据指定位置创建波纹效果\n * @param centerPosition 波纹圆心位置\n */\n show(centerPosition: RipplePosition): void {\n this.createRipple(centerPosition)\n }\n\n /**\n * 根据事件对象显示波纹\n * 从鼠标或触摸事件中提取位置信息并创建波纹\n * @param e 鼠标或触摸事件对象\n */\n showByEvent(e: MouseEvent | TouchEvent): void {\n const centerPosition = this.getRippleCenterPosition(e instanceof MouseEvent ? e : e.touches[0]!)\n this.createRipple(centerPosition)\n }\n\n /**\n * 移除波纹\n * 手动移除当前活跃的波纹元素\n * 注意:如果已经在Ripple配置中增加了autoRemove属性,则不需要调用此方法\n */\n remove(): void {\n let el = this.currentRippleEl\n if (el) {\n this.markRemovable(el)\n this.removeRippleEl(el)\n el = undefined\n this.currentRippleEl = undefined\n }\n }\n\n /**\n * 重置容器矩形\n * 当容器大小发生变化时,需要重置容器矩形缓存\n * 否则计算的波纹半径不准确\n * 注意:大部分情况下不需要调用此方法\n */\n resetContainerRect(): void {\n this.containerRect = undefined\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veltra/directives",
3
- "version": "1.1.27",
3
+ "version": "1.1.29",
4
4
  "files": [
5
5
  "dist",
6
6
  "src"
@@ -24,8 +24,8 @@
24
24
  "build": "vp pack"
25
25
  },
26
26
  "peerDependencies": {
27
- "@veltra/styles": "1.1.27",
28
- "@veltra/utils": "1.1.27",
27
+ "@veltra/styles": "1.1.29",
28
+ "@veltra/utils": "1.1.29",
29
29
  "vue": ">=3.5.0"
30
30
  }
31
31
  }