{"version":3,"file":"ripple.mjs","sources":["../../../../src/_common/js/utils/ripple.ts"],"sourcesContent":["import setStyle from './setStyle';\n\nexport interface RippleOptions {\n  /** 组件类名前缀 */\n  classPrefix: string;\n  /** 是否开启动画 */\n  enable: boolean;\n  /** 波纹颜色，优先于 data-ripple 和 --ripple-color */\n  rippleColor?: string;\n}\n\nconst period = 200;\nconst elementTransitionPeriod = 200;\nconst rippleExtraWidth = 20;\nconst rippleSkewDeg = 8;\nconst rippleSkew = `skewX(-${rippleSkewDeg}deg)`;\nconst noneRippleBg = 'rgba(0, 0, 0, 0)';\nconst defaultRippleColor = 'rgba(0, 0, 0, 0.35)';\nconst blockingStates = ['is-active', 'is-disabled', 'is-checked', 'is-loading'];\n\nconst getRippleSkewOffset = (height: number) => {\n  if (!height) return 0;\n  return Math.ceil((height / 2) * Math.tan((rippleSkewDeg * Math.PI) / 180));\n};\n\nconst hasBlockingState = (el: Element, classPrefix: string) =>\n  blockingStates.some((state) => el.classList.contains(`${classPrefix}-${state}`));\n\nconst getRippleColor = (el: HTMLElement, rippleColor?: string) => {\n  if (rippleColor) {\n    return rippleColor;\n  }\n  if (el?.dataset?.ripple) {\n    return el.dataset.ripple;\n  }\n  if (el instanceof Element) {\n    const cssVariable = getComputedStyle(el).getPropertyValue('--ripple-color');\n    if (cssVariable) {\n      return cssVariable;\n    }\n  }\n  return defaultRippleColor;\n};\n\n/**\n * 在元素上启用斜八角按压动画，返回解除绑定的函数。\n */\nexport function bindRipple(el: HTMLElement, getOptions: () => RippleOptions): () => void {\n  if (typeof document === 'undefined' || !el) {\n    return () => undefined;\n  }\n\n  let container: HTMLDivElement | null = null;\n  const sessions = new Set<() => void>();\n\n  const ensureContainer = (classPrefix: string) => {\n    if (!container) {\n      container = document.createElement('div');\n    }\n    container.className = `${classPrefix}-ripple`;\n    return container;\n  };\n\n  const handlePointerDown = (event: PointerEvent) => {\n    if (event.button !== 0 || !(el instanceof Element)) return;\n\n    const { classPrefix, enable, rippleColor } = getOptions();\n    if (!enable || hasBlockingState(el, classPrefix)) return;\n\n    const color = getRippleColor(el, rippleColor);\n    const elStyle = getComputedStyle(el);\n    const elBorder = parseInt(elStyle.borderWidth, 10);\n    const border = elBorder > 0 ? elBorder : 0;\n    const rippleContainer = ensureContainer(classPrefix);\n\n    if (rippleContainer.parentNode === null) {\n      setStyle(rippleContainer, {\n        position: 'absolute',\n        left: `${0 - border}px`,\n        top: `${0 - border}px`,\n        width: `calc(100% + ${border * 2}px)`,\n        height: `calc(100% + ${border * 2}px)`,\n        borderRadius: elStyle.borderRadius,\n        pointerEvents: 'none',\n        overflow: 'hidden',\n      });\n      el.appendChild(rippleContainer);\n    }\n\n    const ripple = document.createElement('div');\n    ripple.className = `${classPrefix}-ripple__inner`;\n\n    const skewOffset = getRippleSkewOffset(rippleContainer.offsetHeight || el.offsetHeight);\n    const rippleWidth = rippleExtraWidth + skewOffset * 2;\n\n    setStyle(ripple, {\n      marginTop: '0',\n      marginLeft: '0',\n      right: '100%',\n      // 使用百分比控制尺寸与位移，并通过斜切外扩补偿，确保波纹动画结束时铺满宿主元素\n      width: `calc(100% + ${rippleWidth}px)`,\n      height: '100%',\n      transition: `transform ${period}ms cubic-bezier(.38, 0, .24, 1), background ${period * 2}ms linear`,\n      transform: rippleSkew,\n      pointerEvents: 'none',\n      position: 'absolute',\n      zIndex: '0',\n      backgroundColor: color,\n      opacity: '0.9',\n    });\n\n    Array.from(el.children).forEach((child) => {\n      const element = child as HTMLElement;\n      if (element.style.zIndex === '' && element !== rippleContainer) {\n        element.style.zIndex = '1';\n      }\n    });\n\n    const initPosition = el.style.position ? el.style.position : getComputedStyle(el).position;\n    if (initPosition === '' || initPosition === 'static') {\n      // eslint-disable-next-line no-param-reassign\n      el.style.position = 'relative';\n    }\n    rippleContainer.insertBefore(ripple, rippleContainer.firstChild);\n\n    setTimeout(() => {\n      ripple.style.transform = `translateX(calc(100% - ${rippleExtraWidth + skewOffset}px)) ${rippleSkew}`;\n    }, 0);\n\n    let cleared = false;\n    let classChangeObserver: MutationObserver | null = null;\n    const handleClearRipple = () => {\n      if (cleared) return;\n      cleared = true;\n      sessions.delete(handleClearRipple);\n\n      ripple.style.backgroundColor = noneRippleBg;\n\n      if (classChangeObserver) {\n        classChangeObserver.disconnect();\n        classChangeObserver = null;\n      }\n\n      el.removeEventListener('pointerup', handleClearRipple, false);\n      el.removeEventListener('pointerleave', handleClearRipple, false);\n\n      setTimeout(\n        () => {\n          ripple.remove();\n          if (rippleContainer.children.length === 0) rippleContainer.remove();\n        },\n        period * 2 + 100\n      );\n    };\n\n    sessions.add(handleClearRipple);\n\n    if (typeof MutationObserver !== 'undefined') {\n      classChangeObserver = new MutationObserver(() => {\n        if (!(el instanceof Element) || !hasBlockingState(el, classPrefix)) return;\n        ripple.style.transition = `transform ${period}ms cubic-bezier(.38, 0, .24, 1), background ${elementTransitionPeriod}ms linear`;\n        handleClearRipple();\n      });\n      classChangeObserver.observe(el, {\n        attributes: true,\n        attributeFilter: ['class'],\n      });\n    }\n\n    el.addEventListener('pointerup', handleClearRipple, false);\n    el.addEventListener('pointerleave', handleClearRipple, false);\n  };\n\n  el.addEventListener('pointerdown', handlePointerDown, false);\n\n  return () => {\n    el.removeEventListener('pointerdown', handlePointerDown, false);\n    sessions.forEach((release) => release());\n  };\n}\n"],"names":["period","elementTransitionPeriod","rippleExtraWidth","rippleSkewDeg","rippleSkew","noneRippleBg","defaultRippleColor","blockingStates","getRippleSkewOffset","height","Math","ceil","tan","PI","hasBlockingState","el","classPrefix","some","state","classList","contains","concat","getRippleColor","rippleColor","_el$dataset","dataset","ripple","Element","cssVariable","getComputedStyle","getPropertyValue","bindRipple","getOptions","document","container","sessions","Set","ensureContainer","createElement","className","handlePointerDown","event","button","_getOptions","enable","color","elStyle","elBorder","parseInt","borderWidth","border","rippleContainer","parentNode","setStyle","position","left","top","width","borderRadius","pointerEvents","overflow","appendChild","skewOffset","offsetHeight","rippleWidth","marginTop","marginLeft","right","transition","transform","zIndex","backgroundColor","opacity","Array","from","children","forEach","child","element","style","initPosition","insertBefore","firstChild","setTimeout","cleared","classChangeObserver","handleClearRipple","delete","disconnect","removeEventListener","remove","length","add","MutationObserver","observe","attributes","attributeFilter","addEventListener","release"],"mappings":"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"}