hongluan-ui
Version:
Hongluan Component Library for Vue 3
1 lines • 12.4 kB
Source Map (JSON)
{"version":3,"file":"directive.mjs","sources":["../../../../../../packages/components/ripple/src/directive.ts"],"sourcesContent":["// source code from: https://varlet.gitee.io/varlet-ui/#/zh-CN/ripple\nimport { supportTouch } from '@hongluan-ui/utils'\nimport { useGlobalConfig, useNamespace } from '@hongluan-ui/hooks'\n\nimport type { ObjectDirective } from 'vue'\nimport type { DirectiveBinding } from '@vue/runtime-core'\n\nconst { namespace } = useNamespace('ripple')\nconst config = useGlobalConfig()\n\ninterface RippleStyles {\n x: number\n y: number\n centerX: number\n centerY: number\n size: number\n}\n\ninterface RippleOptions {\n removeRipple: any\n touchmoveForbid: boolean\n color?: string\n disabled?: boolean\n tasker?: number | null\n}\n\ninterface RippleHTMLElement extends HTMLElement {\n _ripple?: RippleOptions\n}\n\nconst ANIMATION_DURATION = 250\n\nfunction setStyles(element: RippleHTMLElement) {\n const { zIndex, position } = window.getComputedStyle(element)\n\n element.style.overflow = 'hidden'\n element.style.overflowX = 'hidden'\n element.style.overflowY = 'hidden'\n position === 'static' && (element.style.position = 'relative')\n zIndex === 'auto' && (element.style.zIndex = '1')\n}\n\nfunction computeRippleStyles(element: RippleHTMLElement, event: TouchEvent | MouseEvent): RippleStyles {\n const { top, left }: DOMRect = element.getBoundingClientRect()\n const { clientWidth, clientHeight } = element\n\n const radius: number = Math.sqrt(clientWidth ** 2 + clientHeight ** 2) / 2\n const size: number = radius * 2\n\n const localX: number = (event as any).touches ? (event as TouchEvent).touches[0].clientX : (event as MouseEvent).clientX - left\n const localY: number = (event as any).touches ? (event as TouchEvent).touches[0].clientY : (event as MouseEvent).clientY - top\n\n const centerX: number = (clientWidth - radius * 2) / 2\n const centerY: number = (clientHeight - radius * 2) / 2\n\n const x: number = localX - radius\n const y: number = localY - radius\n\n return { x, y, centerX, centerY, size }\n}\n\nfunction createRipple(this: RippleHTMLElement, event: TouchEvent | MouseEvent) {\n const _ripple = this._ripple as RippleOptions\n _ripple.removeRipple()\n\n if (_ripple.disabled || _ripple.tasker) {\n return\n }\n\n const task = () => {\n _ripple.tasker = null\n\n const { x, y, centerX, centerY, size }: RippleStyles = computeRippleStyles(this, event)\n const ripple: RippleHTMLElement = document.createElement('div')\n ripple.classList.add(namespace.value)\n ripple.style.opacity = `0`\n ripple.style.transform = `translate(${x}px, ${y}px) scale3d(.3, .3, .3)`\n ripple.style.width = `${size}px`\n ripple.style.height = `${size}px`\n _ripple.color && (ripple.style.backgroundColor = _ripple.color)\n ripple.dataset.createdAt = String(performance.now())\n\n setStyles(this)\n\n this.appendChild(ripple)\n\n window.setTimeout(() => {\n ripple.style.transform = `translate(${centerX}px, ${centerY}px) scale3d(1, 1, 1)`\n ripple.style.opacity = `.25`\n }, 20)\n }\n\n _ripple.tasker = window.setTimeout(task, 60)\n}\n\nfunction removeRipple(this: RippleHTMLElement) {\n const _ripple = this._ripple as RippleOptions\n\n const task = () => {\n const ripples: NodeListOf<RippleHTMLElement> = this.querySelectorAll(`.${namespace.value}`)\n if (!ripples.length) {\n return\n }\n\n const lastRipple: RippleHTMLElement = ripples[ripples.length - 1]\n const delay: number = ANIMATION_DURATION - performance.now() + Number(lastRipple.dataset.createdAt)\n\n setTimeout(() => {\n lastRipple.style.opacity = `0`\n\n setTimeout(() => lastRipple.parentNode?.removeChild(lastRipple), ANIMATION_DURATION)\n }, delay)\n }\n\n _ripple.tasker ? setTimeout(task, 60) : task()\n}\n\nfunction forbidRippleTask(this: RippleHTMLElement) {\n const _ripple = this._ripple as RippleOptions\n\n if (!supportTouch()) {\n return\n }\n\n if (!_ripple.touchmoveForbid) {\n return\n }\n\n _ripple.tasker && window.clearTimeout(_ripple.tasker)\n _ripple.tasker = null\n}\n\nfunction mounted(el: RippleHTMLElement, binding: DirectiveBinding<RippleOptions>) {\n el._ripple = {\n tasker: null,\n ...(binding.value ?? {}),\n touchmoveForbid: binding.value?.touchmoveForbid ?? config.value.touchmoveForbid,\n removeRipple: removeRipple.bind(el),\n }\n\n if (supportTouch()) {\n el.addEventListener('touchstart', createRipple, { passive: true })\n el.addEventListener('touchmove', forbidRippleTask, { passive: true })\n document.addEventListener('touchend', el._ripple.removeRipple, { passive: true })\n document.addEventListener('touchcancel', el._ripple.removeRipple, { passive: true })\n } else {\n el.addEventListener('mousedown', createRipple, { passive: true })\n document.addEventListener('mouseup', el._ripple.removeRipple, { passive: true })\n }\n el.addEventListener('dragstart', removeRipple, { passive: true })\n}\n\nfunction unmounted(el: RippleHTMLElement) {\n if (supportTouch()) {\n el.removeEventListener('touchstart', createRipple)\n el.removeEventListener('touchmove', forbidRippleTask)\n document.removeEventListener('touchend', el._ripple?.removeRipple)\n document.removeEventListener('touchcancel', el._ripple?.removeRipple)\n } else {\n el.removeEventListener('mousedown', createRipple)\n document.removeEventListener('mouseup', el._ripple?.removeRipple)\n }\n el.removeEventListener('dragstart', removeRipple)\n}\n\nfunction updated(el: RippleHTMLElement, binding: DirectiveBinding<RippleOptions>) {\n el._ripple = {\n ...el._ripple,\n ...(binding.value ?? {}),\n touchmoveForbid: binding.value?.touchmoveForbid ?? config.value.touchmoveForbid,\n tasker: null,\n }\n}\n\nexport const vRipple: ObjectDirective = {\n mounted,\n updated,\n unmounted,\n}\n"],"names":[],"mappings":"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"}