{"version":3,"sources":["../src/PhotoProvider.tsx","../src/hooks/useMethods.ts","../src/hooks/useSetState.ts","../src/photo-context.ts","../src/PhotoSlider.tsx","../src/variables.ts","../src/utils/limitTarget.ts","../src/hooks/useIsomorphicLayoutEffect.ts","../src/hooks/useAdjacentImages.ts","../src/hooks/useEventListener.ts","../src/hooks/useAnimationVisible.tsx","../src/hooks/useForkedVariable.ts","../src/components/SlidePortal.tsx","../src/components/PreventScroll.tsx","../src/PhotoBox.tsx","../src/utils/getMultipleTouchPosition.ts","../src/utils/edgeHandle.ts","../src/utils/getPositionOnMoveOrScale.ts","../src/utils/getRotateSize.ts","../src/utils/getSuitableImageSize.ts","../src/hooks/useDebounceCallback.ts","../src/hooks/useContinuousTap.ts","../src/hooks/useScrollPosition.ts","../src/hooks/useAnimationOrigin.tsx","../src/hooks/useTargetScale.ts","../src/hooks/useAnimationPosition.ts","../src/hooks/useMountedRef.ts","../src/Photo.tsx","../src/components/Spinner.tsx","../src/PhotoView.tsx","../src/hooks/useInitial.ts"],"sourcesContent":["import React, { forwardRef, useMemo, useRef } from 'react'\nimport type { DataType, PhotoProviderBase } from './types'\nimport useMethods from './hooks/useMethods'\nimport useSetState from './hooks/useSetState'\nimport PhotoContext from './photo-context'\nimport PhotoSlider from './PhotoSlider'\nimport { SlidePortalRef } from './components/SlidePortal'\n\nexport interface PhotoProviderProps extends PhotoProviderBase {\n  children: React.ReactNode\n  onIndexChange?: (index: number, state: PhotoProviderState) => void\n  onVisibleChange?: (visible: boolean, index: number, state: PhotoProviderState) => void\n}\n\ntype PhotoProviderState = {\n  images: DataType[]\n  visible: boolean\n  index: number\n}\n\nconst initialState: PhotoProviderState = {\n  images: [],\n  visible: false,\n  index: 0,\n}\n\nconst PhotoProvider = forwardRef<SlidePortalRef, PhotoProviderProps>(\n  ({ children, onIndexChange, onVisibleChange, ...restProps }, ref) => {\n    const [state, updateState] = useSetState(initialState)\n    const uniqueIdRef = useRef(0)\n    const { images, visible, index } = state\n\n    const methods = useMethods({\n      nextId() {\n        return (uniqueIdRef.current += 1)\n      },\n      update(imageItem: DataType) {\n        const currentIndex = images.findIndex(n => n.key === imageItem.key)\n        if (currentIndex > -1) {\n          const nextImages = images.slice()\n          nextImages.splice(currentIndex, 1, imageItem)\n          updateState({\n            images: nextImages,\n          })\n          return\n        }\n        updateState(prev => ({\n          images: prev.images.concat(imageItem),\n        }))\n      },\n      remove(key: number) {\n        updateState(prev => {\n          const nextImages = prev.images.filter(item => item.key !== key)\n          const nextEndIndex = nextImages.length - 1\n          return {\n            images: nextImages,\n            index: Math.min(nextEndIndex, index),\n          }\n        })\n      },\n      show(key: number) {\n        const currentIndex = images.findIndex(item => item.key === key)\n        updateState({\n          visible: true,\n          index: currentIndex,\n        })\n        if (onVisibleChange) {\n          onVisibleChange(true, currentIndex, state)\n        }\n      },\n    })\n\n    const fn = useMethods({\n      close() {\n        updateState({\n          visible: false,\n        })\n\n        if (onVisibleChange) {\n          onVisibleChange(false, index, state)\n        }\n      },\n      changeIndex(nextIndex: number) {\n        updateState({\n          index: nextIndex,\n        })\n\n        if (onIndexChange) {\n          onIndexChange(nextIndex, state)\n        }\n      },\n    })\n\n    const value = useMemo(() => ({ ...state, ...methods }), [state, methods])\n\n    return (\n      <PhotoContext.Provider value={value}>\n        {children}\n        <PhotoSlider\n          ref={ref}\n          images={images}\n          visible={visible}\n          index={index}\n          onIndexChange={fn.changeIndex}\n          onClose={fn.close}\n          {...restProps}\n        />\n      </PhotoContext.Provider>\n    )\n  },\n)\nPhotoProvider.displayName = 'PhotoProvider'\nexport default PhotoProvider\n","import { useRef } from 'react'\n\n/**\n * Hook of persistent methods\n */\nexport default function useMethods<T extends Record<string, (...args: any[]) => any>>(fn: T) {\n  const { current } = useRef({\n    fn,\n    curr: undefined as T | undefined,\n  })\n  current.fn = fn\n\n  if (!current.curr) {\n    const curr = Object.create(null)\n    Object.keys(fn).forEach(key => {\n      curr[key] = (...args: unknown[]) => current.fn[key].call(current.fn, ...args)\n    })\n    current.curr = curr\n  }\n\n  return current.curr as T\n}\n","import { useReducer } from 'react'\n\nexport default function useSetState<S extends Record<string, any>>(initialState: S) {\n  return useReducer(\n    (state: S, action: Partial<S> | ((state: S) => Partial<S>)) => ({\n      ...state,\n      ...(typeof action === 'function' ? action(state) : action),\n    }),\n    initialState,\n  )\n}\n","import { createContext } from 'react'\nimport type { DataType } from './types'\n\nexport type UpdateItemType = (dataType: DataType) => void\n\nexport interface PhotoContextType {\n  show: (key: number) => void\n  update: UpdateItemType\n  remove: (key: number) => void\n  nextId: () => number\n}\n\nexport default createContext<PhotoContextType>(undefined as unknown as PhotoContextType)\n","import _styled2styled_components from 'styled-components';\n            const _styled2 = typeof _styled2styled_components.default === 'undefined' ? _styled2styled_components : _styled2styled_components.default;;\nimport _styledstyled_components from 'styled-components';\n            const _styled = typeof _styledstyled_components.default === 'undefined' ? _styledstyled_components : _styledstyled_components.default;;\nimport { css as _css } from \"styled-components\";\nimport React, { forwardRef, useMemo, useRef, useState } from 'react';\nimport { defaultEasing, defaultSpeed, defaultOpacity, horizontalOffset, maxMoveOffset, defaultDragEasing } from './variables';\nimport isTouchDevice from './utils/isTouchDevice';\nimport { limitNumber } from './utils/limitTarget';\nimport useIsomorphicLayoutEffect from './hooks/useIsomorphicLayoutEffect';\nimport useAdjacentImages from './hooks/useAdjacentImages';\nimport useSetState from './hooks/useSetState';\nimport useEventListener from './hooks/useEventListener';\nimport useAnimationVisible from './hooks/useAnimationVisible';\nimport useMethods from './hooks/useMethods';\nimport SlidePortal from './components/SlidePortal';\nimport PreventScroll from './components/PreventScroll';\nimport PhotoBox from './PhotoBox';\nimport { keyframes } from 'styled-components';\nconst initialState = {\n  loading: false,\n  x: 0,\n  y: 0,\n  touched: false,\n  pause: false,\n  lastCX: undefined,\n  lastCY: undefined,\n  bg: undefined,\n  lastBg: undefined,\n  overlay: true,\n  minimal: true,\n  scale: 1,\n  rotate: 0\n};\nconst fade = keyframes([\"from{opacity:0;}to{opacity:1;}\"]);\nconst PhotoSlider = forwardRef((props, ref) => {\n  const {\n    mode: modeProp = 'slide',\n    loop = 3,\n    speed: speedFn,\n    easing: easingFn,\n    photoClosable,\n    maskClosable = true,\n    maskOpacity = defaultOpacity,\n    pullClosable = true,\n    overlayRender,\n    className,\n    maskClassName,\n    photoClassName,\n    photoWrapClassName,\n    loadingElement,\n    brokenElement,\n    images,\n    index: controlledIndex = 0,\n    onIndexChange: controlledIndexChange,\n    visible,\n    onClose,\n    afterClose,\n    portalContainer,\n    enableMouseZoom = true\n  } = props;\n  const isDragMode = useMemo(() => {\n    if (isTouchDevice) return false;\n    return modeProp === 'drag';\n  }, [modeProp]);\n  const [state, updateState] = useSetState(initialState);\n  const [innerIndex, updateInnerIndex] = useState(0);\n  const {\n    loading,\n    x,\n    y,\n    touched,\n    pause,\n    lastCX,\n    lastCY,\n    bg = maskOpacity,\n    lastBg,\n    overlay,\n    minimal,\n    scale,\n    rotate,\n    onScale,\n    onRotate\n  } = state;\n  // 受控 index\n  const isControlled = props.hasOwnProperty('index');\n  const index = isControlled ? controlledIndex : innerIndex;\n  const onIndexChange = isControlled ? controlledIndexChange : updateInnerIndex;\n  // 内部虚拟 index\n  const virtualIndexRef = useRef(index);\n\n  // 当前图片\n  const imageLength = images.length;\n  const currentImage = images[index];\n\n  // 是否开启\n  // noinspection SuspiciousTypeOfGuard\n  const enableLoop = typeof loop === 'boolean' ? loop : imageLength > loop;\n\n  // 显示动画处理\n  const [realVisible, activeAnimation, onAnimationEnd] = useAnimationVisible(visible, afterClose);\n  useIsomorphicLayoutEffect(() => {\n    // 显示弹出层，修正正确的指向\n    if (realVisible) {\n      updateState({\n        pause: true,\n        x: index * -(innerWidth + horizontalOffset)\n      });\n      virtualIndexRef.current = index;\n      return;\n    }\n    // 关闭后清空状态\n    updateState(initialState);\n  }, [realVisible]);\n  const {\n    close,\n    changeIndex\n  } = useMethods({\n    close(evt) {\n      if (onRotate) {\n        onRotate(0);\n      }\n      updateState({\n        overlay: true,\n        // 记录当前关闭时的透明度\n        lastBg: bg\n      });\n      onClose(evt);\n    },\n    changeIndex(nextIndex, isPause = false) {\n      // 当前索引\n      const currentIndex = enableLoop ? virtualIndexRef.current + (nextIndex - index) : nextIndex;\n      const max = imageLength - 1;\n      // 虚拟 index\n      // 非循环模式，限制区间\n      const limitIndex = limitNumber(currentIndex, 0, max);\n      const nextVirtualIndex = enableLoop ? currentIndex : limitIndex;\n      // 单个屏幕宽度\n      const singlePageWidth = innerWidth + horizontalOffset;\n      updateState({\n        touched: false,\n        lastCX: undefined,\n        lastCY: undefined,\n        x: -singlePageWidth * nextVirtualIndex,\n        pause: isPause\n      });\n      virtualIndexRef.current = nextVirtualIndex;\n      // 更新真实的 index\n      const realLoopIndex = nextIndex < 0 ? max : nextIndex > max ? 0 : nextIndex;\n      if (onIndexChange) {\n        onIndexChange(enableLoop ? realLoopIndex : limitIndex);\n      }\n    }\n  });\n  useEventListener('keydown', evt => {\n    if (visible) {\n      switch (evt.key) {\n        case 'ArrowLeft':\n          changeIndex(index - 1, true);\n          break;\n        case 'ArrowRight':\n          changeIndex(index + 1, true);\n          break;\n        case 'Escape':\n          close();\n          break;\n      }\n    }\n  });\n  function handlePhotoTap(closeable) {\n    return closeable ? close() : updateState({\n      overlay: !overlay\n    });\n  }\n  function handleResize() {\n    updateState({\n      x: -(innerWidth + horizontalOffset) * index,\n      lastCX: undefined,\n      lastCY: undefined,\n      pause: isDragMode ? false : true\n    });\n    virtualIndexRef.current = index;\n  }\n  function handleReachVerticalMove(clientY, nextScale) {\n    if (lastCY === undefined) {\n      updateState({\n        touched: true,\n        lastCY: clientY,\n        bg,\n        minimal: true\n      });\n      return;\n    }\n    const opacity = maskOpacity === null ? null : limitNumber(maskOpacity, 0.01, maskOpacity - Math.abs(clientY - lastCY) / 100 / 4);\n    updateState({\n      touched: true,\n      lastCY,\n      bg: nextScale === 1 && !isDragMode ? opacity : maskOpacity,\n      minimal: nextScale === 1\n    });\n  }\n  function handleReachHorizontalMove(clientX) {\n    if (lastCX === undefined) {\n      updateState({\n        touched: true,\n        lastCX: clientX,\n        x,\n        pause: false\n      });\n      return;\n    }\n    const originOffsetClientX = clientX - lastCX;\n    let offsetClientX = originOffsetClientX;\n\n    // 第一张和最后一张超出距离减半\n    if (!enableLoop && (index === 0 && originOffsetClientX > 0 || index === imageLength - 1 && originOffsetClientX < 0)) {\n      offsetClientX = originOffsetClientX / 2;\n    }\n    updateState({\n      touched: true,\n      lastCX: lastCX,\n      x: -(innerWidth + horizontalOffset) * virtualIndexRef.current + offsetClientX,\n      pause: false\n    });\n  }\n  function handleReachMove(reachPosition, clientX, clientY, nextScale) {\n    if (isDragMode) {\n      // handleReachDragMove\n    } else if (reachPosition === 'x') {\n      handleReachHorizontalMove(clientX);\n    } else if (reachPosition === 'y') {\n      handleReachVerticalMove(clientY, nextScale);\n    }\n  }\n  function handleReachUp(clientX, clientY) {\n    const offsetClientX = clientX - (lastCX ?? clientX);\n    const offsetClientY = clientY - (lastCY ?? clientY);\n    if (isDragMode) {\n      updateState({\n        touched: false\n      });\n      return;\n    }\n    let willClose = false;\n    // 下一张\n    if (offsetClientX < -maxMoveOffset) {\n      changeIndex(index + 1);\n      return;\n    }\n    // 上一张\n    if (offsetClientX > maxMoveOffset) {\n      changeIndex(index - 1);\n      return;\n    }\n    const singlePageWidth = innerWidth + horizontalOffset;\n    // 当前偏移\n    const currentTranslateX = -singlePageWidth * virtualIndexRef.current;\n    if (Math.abs(offsetClientY) > 100 && minimal && pullClosable) {\n      willClose = true;\n      close();\n    }\n    updateState({\n      touched: false,\n      x: currentTranslateX,\n      lastCX: undefined,\n      lastCY: undefined,\n      bg: maskOpacity,\n      overlay: willClose ? true : overlay\n    });\n  }\n  // 截取相邻的图片\n  const adjacentImages = useAdjacentImages(images, index, enableLoop);\n  if (!realVisible) {\n    return null;\n  }\n  const currentOverlayVisible = overlay && !activeAnimation;\n  // 关闭过程中使用下拉保存的透明度\n  const currentOpacity = visible ? bg : lastBg;\n  // 覆盖物参数\n  const overlayParams = onScale && onRotate && {\n    loading,\n    loop: enableLoop,\n    mode: isDragMode ? 'drag' : 'slide',\n    images,\n    index,\n    visible,\n    onClose: close,\n    onIndexChange: changeIndex,\n    overlayVisible: currentOverlayVisible,\n    overlay: currentImage && currentImage.overlay,\n    scale,\n    rotate,\n    onScale,\n    onRotate\n  };\n  // 动画时间\n  const currentSpeed = speedFn ? speedFn(activeAnimation) : defaultSpeed;\n  const currentEasing = easingFn ? easingFn(activeAnimation) : isDragMode ? defaultDragEasing : defaultEasing;\n  const slideSpeed = speedFn ? speedFn(3) : defaultSpeed + 200;\n  const slideEasing = easingFn ? easingFn(3) : defaultEasing;\n  return <SlidePortal ref={ref} className={className} role=\"dialog\" onClick={e => e.stopPropagation()} container={portalContainer}>\n        {visible && <PreventScroll />}\n        <_StyledDiv className={maskClassName} style={{\n      background: currentOpacity ? `rgba(0, 0, 0, ${currentOpacity})` : undefined,\n      transitionTimingFunction: currentEasing,\n      transitionDuration: `${touched ? 0 : currentSpeed}ms`,\n      animationDuration: `${currentSpeed}ms`\n    }} onAnimationEnd={onAnimationEnd} $_css2={[{\n      \"position\": \"absolute\",\n      \"left\": \"0px\",\n      \"top\": \"0px\",\n      \"zIndex\": \"-1\",\n      \"height\": \"100%\",\n      \"width\": \"100%\",\n      \"--tw-bg-opacity\": \"1\",\n      \"backgroundColor\": \"rgb(0 0 0 / var(--tw-bg-opacity))\",\n      \"transitionProperty\": \"background-color\",\n      \"transitionTimingFunction\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n      \"transitionDuration\": \"150ms\"\n    }, (activeAnimation === 1 || activeAnimation === 2) && {\n      \"opacity\": \"0\"\n    }, activeAnimation === 1 && _css([\"animation:\", \" linear both;\"], fade), activeAnimation === 2 && _css([\"animation:\", \" linear both reverse;\"], fade)]} />\n        {adjacentImages.map((item, currentIndex) => {\n      // 截取之前的索引位置\n      const nextIndex = !enableLoop && index === 0 ? index + currentIndex : virtualIndexRef.current - 1 + currentIndex;\n      const isActive = !item.isCloned && (currentImage && currentImage.key) === item.key;\n      return <PhotoBox key={enableLoop ? `${item.key}/${item.src}/${nextIndex}` : item.key} item={item} speed={currentSpeed} easing={currentEasing} visible={visible} onReachMove={handleReachMove} onReachUp={handleReachUp} onPhotoTap={() => handlePhotoTap(photoClosable)} onMaskTap={() => handlePhotoTap(maskClosable)} isDragMode={isDragMode} wrapClassName={photoWrapClassName} className={photoClassName} style={{\n        opacity: isDragMode ? isActive ? 1 : 0 : undefined,\n        left: `${(innerWidth + horizontalOffset) * nextIndex}px`,\n        transform: `translate3d(${x}px, ${y}px, 0)`,\n        transition: touched || pause ? undefined : `transform ${slideSpeed}ms ${slideEasing}`\n      }} loadingElement={loadingElement} brokenElement={brokenElement} onPhotoResize={handleResize} isActive={isActive} expose={updateState} enableMouseZoom={enableMouseZoom} />;\n    })}\n        {overlayRender && overlayParams && <_StyledDiv2 $_css3={[!currentOverlayVisible && {\n      \"opacity\": \"0\"\n    }]}>{overlayRender(overlayParams)}</_StyledDiv2>}\n      </SlidePortal>;\n});\nPhotoSlider.displayName = 'PhotoSlider';\nexport default PhotoSlider;\nvar _StyledDiv = _styled(\"div\").withConfig({\n  componentId: \"sc-12i02f7-0\"\n})([\"\", \"\"], p => p.$_css2);\nvar _StyledDiv2 = _styled(\"div\").withConfig({\n  componentId: \"sc-12i02f7-1\"\n})([\"\", \"\"], p => p.$_css3);","/**\n * 最大触摸时间\n */\nexport const maxTouchTime = 200\n\n/**\n * 默认动画速度\n */\nexport const defaultSpeed = 400\n\n/**\n * 默认动画函数\n */\nexport const defaultEasing = 'cubic-bezier(0.25, 0.8, 0.25, 1)'\n\n/**\n * 默认拖拽动画函数\n */\nexport const defaultDragEasing = 'ease'\n\n/**\n * 最大滑动切换图片距离\n */\nexport const maxMoveOffset = 40\n\n/**\n * 图片的间隔\n */\nexport const horizontalOffset = 20\n\n/**\n * 最小初始响应距离\n */\nexport const minStartTouchOffset = 20\n\n/**\n * 默认背景透明度\n */\nexport const defaultOpacity = 1\n\n/**\n * 最小缩放度\n */\nexport const minScale = 1\n\n/**\n * 拖拽模式最小缩放度\n */\nexport const minDragScale = 0.1\n\n/**\n * 最大缩放度（若图片足够大，则会超出）\n */\nexport const maxScale = 6\n\n/**\n * 最小长图模式比例\n */\nexport const longModeRatio = 3\n\n/**\n * 缩放弹性缓冲\n */\nexport const scaleBuffer = 0.2\n\n/**\n * 最大等待动画时间\n */\nexport const maxWaitAnimationTime = 250\n","import { maxScale, minDragScale, minScale } from '../variables'\n\nexport const limitNumber = (value: number, min: number, max: number) => {\n  return Math.max(Math.min(value, max), min)\n}\n\n/**\n * 限制最大/最小缩放\n */\nexport const limitScale = (\n  scale: number,\n  isDragMode = false,\n  max: number = 0,\n  buffer: number = 0,\n) => {\n  return limitNumber(\n    scale,\n    isDragMode ? minDragScale : minScale * (1 - buffer),\n    Math.max(maxScale, max) * (1 + buffer),\n  )\n}\n","import { useEffect, useLayoutEffect } from 'react'\n\nconst isSSR =\n  typeof window === 'undefined' || /ServerSideRendering/.test(navigator && navigator.userAgent)\n\nexport default isSSR ? useEffect : useLayoutEffect\n","import { useMemo } from 'react'\nimport type { DataType } from '../types'\n\ninterface AdjacentDataType extends DataType {\n  /**\n   * 是否是克隆的\n   */\n  isCloned?: boolean\n}\n\n/**\n * 截取相邻三张图片\n */\nexport default function useAdjacentImages(\n  images: DataType[],\n  index: number,\n  loop: boolean,\n): AdjacentDataType[] {\n  return useMemo(() => {\n    const imageLength = images.length\n    if (loop) {\n      const connected = images.concat(images).concat(images)\n      const currentImage = connected[imageLength + index]\n      const sliceImages: AdjacentDataType[] = connected.slice(\n        imageLength + index - 1,\n        imageLength + index + 2,\n      )\n\n      const adjacentImages: AdjacentDataType[] = []\n\n      for (let i = 0; i < sliceImages.length; i++) {\n        const image = sliceImages[i]\n        if (i !== 1 && image.key === currentImage.key) {\n          adjacentImages.push({ ...image, isCloned: true })\n        } else {\n          adjacentImages.push(image)\n        }\n      }\n      return adjacentImages\n    }\n    return images.slice(Math.max(index - 1, 0), Math.min(index + 2, imageLength + 1))\n  }, [images, index, loop])\n}\n","import { useEffect, useRef } from 'react'\n\nexport default function useEventListener<K extends keyof WindowEventMap>(\n  type: K | undefined,\n  fn: (evt: WindowEventMap[K]) => void,\n  options?: AddEventListenerOptions,\n) {\n  const latest = useRef(fn)\n  latest.current = fn\n\n  useEffect(() => {\n    function wrapper(evt: WindowEventMap[K]) {\n      latest.current(evt)\n    }\n    if (type) {\n      window.addEventListener(type, wrapper, options)\n    }\n    return () => {\n      if (type) {\n        window.removeEventListener(type, wrapper)\n      }\n    }\n  }, [type])\n}\n","import { useReducer, useRef } from 'react'\nimport type { ActiveAnimationType } from '../types'\nimport useForkedVariable from './useForkedVariable'\n\n/**\n * 动画关闭处理真实关闭状态\n * 通过 onAnimationEnd 回调实现 leaveCallback\n */\nexport default function useAnimationVisible(\n  visible: boolean | undefined,\n  afterClose?: () => void,\n): [\n  realVisible: boolean | undefined,\n  activeAnimation: ActiveAnimationType,\n  onAnimationEnd: () => void,\n] {\n  const [, handleRender] = useReducer(c => !c, false)\n\n  const activeAnimation = useRef<ActiveAnimationType>(0)\n\n  // 可见状态分支\n  const [realVisible, modifyRealVisible] = useForkedVariable(visible, modify => {\n    // 可见状态：设置进入动画\n    if (visible) {\n      modify(visible)\n      activeAnimation.current = 1\n    } else {\n      activeAnimation.current = 2\n    }\n  })\n\n  function onAnimationEnd() {\n    // 动画结束后触发渲染\n    handleRender()\n    // 结束动画：设置隐藏状态\n    if (activeAnimation.current === 2) {\n      modifyRealVisible(false)\n      // 触发隐藏回调\n      if (afterClose) {\n        afterClose()\n      }\n    }\n    // 重置状态\n    activeAnimation.current = 0\n  }\n\n  return [\n    /**\n     * 真实可见状态\n     */\n    realVisible,\n    /**\n     * 正在进行的动画\n     */\n    activeAnimation.current,\n    /**\n     * 动画结束后回调\n     */\n    onAnimationEnd,\n  ]\n}\n","import { useRef, useMemo } from 'react'\n\n/**\n * 逻辑分叉变量处理\n * 此 hook 不触发额外渲染\n */\nexport default function useForkedVariable<T>(\n  initial: T,\n  updater: (modify: (variable: T) => void) => void,\n) {\n  // 初始分叉变量\n  const forkedRef = useRef(initial)\n\n  function modify(next: T) {\n    forkedRef.current = next\n  }\n\n  useMemo(() => {\n    // 参数变化之后同步内部分叉变量\n    updater(modify)\n  }, [initial])\n\n  return [forkedRef.current, modify] as const\n}\n","import _styledstyled_components from 'styled-components';\n            const _styled = typeof _styledstyled_components.default === 'undefined' ? _styledstyled_components : _styledstyled_components.default;;\nimport React, { forwardRef } from 'react';\nimport { createPortal } from 'react-dom';\nconst SlidePortal = forwardRef(({\n  container = document.body,\n  ...rest\n}, ref) => {\n  return createPortal(<_StyledDiv ref={ref} {...rest} />, container);\n});\nSlidePortal.displayName = 'SlidePortal';\nexport default SlidePortal;\nvar _StyledDiv = _styled(\"div\").withConfig({\n  componentId: \"sc-1ab9qfp-0\"\n})({\n  \"position\": \"fixed\",\n  \"top\": \"0px\",\n  \"left\": \"0px\",\n  \"zIndex\": \"50\",\n  \"height\": \"100%\",\n  \"width\": \"100%\",\n  \"touchAction\": \"none\",\n  \"overflow\": \"hidden\"\n});","import { useEffect } from 'react'\n\nexport default function PreventScroll() {\n  useEffect(() => {\n    const { style } = document.body\n    const lastOverflow = style.overflow\n    style.overflow = 'hidden'\n\n    return () => {\n      style.overflow = lastOverflow\n    }\n  }, [])\n\n  return null\n}\n","import _styledstyled_components from 'styled-components';\n            const _styled = typeof _styledstyled_components.default === 'undefined' ? _styledstyled_components : _styledstyled_components.default;;\nimport React, { useRef } from 'react';\nimport isTouchDevice from './utils/isTouchDevice';\nimport getMultipleTouchPosition from './utils/getMultipleTouchPosition';\nimport getPositionOnMoveOrScale from './utils/getPositionOnMoveOrScale';\nimport { getReachType, computePositionEdge } from './utils/edgeHandle';\nimport getRotateSize from './utils/getRotateSize';\nimport { limitScale } from './utils/limitTarget';\nimport getSuitableImageSize from './utils/getSuitableImageSize';\nimport useIsomorphicLayoutEffect from './hooks/useIsomorphicLayoutEffect';\nimport { minDragScale, minScale, minStartTouchOffset, scaleBuffer } from './variables';\nimport useSetState from './hooks/useSetState';\nimport useMethods from './hooks/useMethods';\nimport useDebounceCallback from './hooks/useDebounceCallback';\nimport useEventListener from './hooks/useEventListener';\nimport useContinuousTap from './hooks/useContinuousTap';\nimport useScrollPosition from './hooks/useScrollPosition';\nimport useAnimationPosition from './hooks/useAnimationPosition';\nimport useMountedRef from './hooks/useMountedRef';\nimport Photo from './Photo';\nconst initialState = {\n  // 真实宽度\n  naturalWidth: undefined,\n  // 真实高度\n  naturalHeight: undefined,\n  // 宽度\n  width: undefined,\n  // 高度\n  height: undefined,\n  // 加载成功状态\n  loaded: undefined,\n  // 破碎状态\n  broken: false,\n  // 图片 X 偏移量\n  x: 0,\n  // 图片 y 偏移量\n  y: 0,\n  // 图片处于触摸的状态\n  touched: false,\n  // 背景处于触摸状态\n  maskTouched: false,\n  // 旋转状态\n  rotate: 0,\n  // 放大缩小\n  scale: 1,\n  // 触摸开始时 x 原始坐标\n  CX: 0,\n  // 触摸开始时 y 原始坐标\n  CY: 0,\n  // 触摸开始时图片 x 偏移量\n  lastX: 0,\n  // 触摸开始时图片 y 偏移量\n  lastY: 0,\n  // 上一个触摸状态 x 原始坐标\n  lastCX: 0,\n  // 上一个触摸状态 y 原始坐标\n  lastCY: 0,\n  // 上一个触摸状态的 scale\n  lastScale: 1,\n  // 触摸开始时时间\n  touchTime: 0,\n  // 多指触控间距\n  touchLength: 0,\n  // 是否暂停 transition\n  pause: true,\n  // 停止 Raf\n  stopRaf: true,\n  // 当前边缘触发状态\n  reach: undefined\n};\nconst StyledView = _styled.div.withConfig({\n  componentId: \"sc-1mzwirp-0\"\n})([\"\", \" direction:ltr\"], {\n  \"position\": \"absolute\",\n  \"top\": \"0px\",\n  \"right\": \"0px\",\n  \"bottom\": \"0px\",\n  \"left\": \"0px\",\n  \"width\": \"100%\",\n  \"touchAction\": \"none\"\n});\nconst StyledWrap = _styled(StyledView).withConfig({\n  componentId: \"sc-1mzwirp-1\"\n})(({\n  isDragMode\n}) => [{\n  \"zIndex\": \"10\"\n}, !isDragMode && {\n  \"overflow\": \"hidden\"\n}]);\nconst StyledBox = _styled(StyledView).withConfig({\n  componentId: \"sc-1mzwirp-2\"\n})([\"transform-origin:left top;\"]);\nexport default function PhotoBox({\n  isDragMode = false,\n  item: {\n    src,\n    render,\n    width: customWidth = 0,\n    height: customHeight = 0,\n    originRef\n  },\n  visible,\n  speed,\n  easing,\n  wrapClassName,\n  className,\n  style,\n  loadingElement,\n  brokenElement,\n  enableMouseZoom = true,\n  onPhotoTap,\n  onMaskTap,\n  onReachMove,\n  onReachUp,\n  onPhotoResize,\n  isActive,\n  expose\n}) {\n  const [state, updateState] = useSetState(initialState);\n  const initialTouchRef = useRef(0);\n  const mounted = useMountedRef();\n  const {\n    naturalWidth = customWidth,\n    naturalHeight = customHeight,\n    width = customWidth,\n    height = customHeight,\n    loaded = !src,\n    broken,\n    x,\n    y,\n    touched,\n    stopRaf,\n    maskTouched,\n    rotate,\n    scale,\n    CX,\n    CY,\n    lastX,\n    lastY,\n    lastCX,\n    lastCY,\n    lastScale,\n    touchTime,\n    touchLength,\n    pause,\n    reach\n  } = state;\n  const fn = useMethods({\n    onScale: current => onScale(limitScale(current, isDragMode)),\n    onRotate(current) {\n      if (rotate !== current) {\n        expose({\n          rotate: current\n        });\n        updateState({\n          rotate: current,\n          ...getSuitableImageSize(isDragMode, naturalWidth, naturalHeight, current),\n          scale\n        });\n      }\n    }\n  });\n\n  // 默认为屏幕中心缩放\n  function onScale(current, clientX, clientY) {\n    if (scale !== current) {\n      expose({\n        scale: current\n      });\n      updateState({\n        scale: current,\n        ...getPositionOnMoveOrScale(isDragMode, x, y, width, height, naturalWidth, naturalHeight, scale, current, clientX, clientY),\n        ...((isDragMode ? current < minDragScale : current <= minScale) ? {\n          x: 0,\n          y: 0\n        } : {})\n      });\n    }\n  }\n  const handleMove = useDebounceCallback((nextClientX, nextClientY, currentTouchLength = 0) => {\n    if ((touched || maskTouched) && isActive) {\n      // 通过旋转调换宽高\n      const [currentWidth, currentHeight] = getRotateSize(rotate, width, height);\n      // 单指最小缩放下，以初始移动距离来判断意图\n      if (currentTouchLength === 0 && initialTouchRef.current === 0) {\n        const isStillX = Math.abs(nextClientX - CX) <= minStartTouchOffset;\n        const isStillY = Math.abs(nextClientY - CY) <= minStartTouchOffset;\n        // 初始移动距离不足\n        if (isStillX && isStillY) {\n          // 方向记录上次移动距离，以便平滑过渡\n          updateState({\n            lastCX: nextClientX,\n            lastCY: nextClientY\n          });\n          return;\n        }\n        // 设置响应状态\n        initialTouchRef.current = !isStillX ? 1 : nextClientY > CY ? 3 : 2;\n      }\n      const offsetX = nextClientX - lastCX;\n      const offsetY = nextClientY - lastCY;\n      // 边缘触发状态\n      let currentReach = undefined;\n      if (currentTouchLength === 0) {\n        // 边缘超出状态\n        const [horizontalCloseEdge] = computePositionEdge(offsetX + lastX, scale, currentWidth, innerWidth);\n        const [verticalCloseEdge] = computePositionEdge(offsetY + lastY, scale, currentHeight, innerHeight);\n        // 边缘触发检测\n        currentReach = getReachType(initialTouchRef.current, horizontalCloseEdge, verticalCloseEdge, reach);\n        // 接触边缘\n        if (currentReach !== undefined) {\n          onReachMove(currentReach, nextClientX, nextClientY, scale);\n        }\n      }\n      // 横向边缘触发、背景触发禁用当前滑动\n      if (currentReach === 'x' || maskTouched || isDragMode) {\n        const state = {\n          reach: 'x'\n        };\n        if (isDragMode) {\n          state.x = lastX + offsetX;\n          state.y = lastY + offsetY;\n          state.pause = false;\n        }\n        updateState(state);\n        return;\n      }\n      // 目标倍数\n      const toScale = limitScale(scale + (currentTouchLength - touchLength) / 100 / 2 * scale, isDragMode, naturalWidth / width, scaleBuffer);\n      // 导出变量\n      expose({\n        scale: toScale\n      });\n      updateState({\n        touchLength: currentTouchLength,\n        reach: currentReach,\n        scale: toScale,\n        ...getPositionOnMoveOrScale(isDragMode, x, y, width, height, naturalWidth, naturalHeight, scale, toScale, nextClientX, nextClientY, offsetX, offsetY)\n      });\n    }\n  }, {\n    maxWait: 8\n  });\n  function updateRaf(position) {\n    if (stopRaf || touched) {\n      return false;\n    }\n    if (mounted.current) {\n      // 下拉关闭时可以有动画\n      updateState({\n        ...position,\n        pause: visible\n      });\n    }\n    return mounted.current;\n  }\n  const slideToPosition = useScrollPosition(nextX => updateRaf({\n    x: nextX\n  }), nextY => updateRaf({\n    y: nextY\n  }), nextScale => {\n    if (mounted.current) {\n      expose({\n        scale: nextScale\n      });\n      updateState({\n        scale: nextScale\n      });\n    }\n    return !touched && mounted.current;\n  });\n  const handlePhotoTap = useContinuousTap(onPhotoTap, (currentClientX, currentClientY) => {\n    if (!reach && !isDragMode) {\n      // 若图片足够大，则放大适应的倍数\n      const endScale = scale !== 1 ? 1 : Math.max(2, naturalWidth / width);\n      onScale(endScale, currentClientX, currentClientY);\n    }\n  });\n  function handleUp(nextClientX, nextClientY) {\n    // 重置响应状态\n    initialTouchRef.current = 0;\n    if ((touched || maskTouched) && isActive) {\n      updateState({\n        touched: false,\n        maskTouched: false,\n        pause: false,\n        stopRaf: false,\n        reach: undefined\n      });\n      const safeScale = limitScale(scale, isDragMode, naturalWidth / width);\n      // Go\n      if (!isDragMode) {\n        slideToPosition(x, y, lastX, lastY, width, height, naturalWidth, naturalHeight, scale, safeScale, lastScale, rotate, touchTime);\n      }\n      onReachUp(nextClientX, nextClientY);\n      // 触发 Tap 事件\n      if (CX === nextClientX && CY === nextClientY) {\n        if (touched) {\n          handlePhotoTap(nextClientX, nextClientY);\n          return;\n        }\n        if (maskTouched) {\n          onMaskTap(nextClientX, nextClientY);\n        }\n      }\n    }\n  }\n  useEventListener(isTouchDevice ? undefined : 'mousemove', e => {\n    e.preventDefault();\n    handleMove(e.clientX, e.clientY);\n  });\n  useEventListener(isTouchDevice ? undefined : 'mouseup', e => {\n    handleUp(e.clientX, e.clientY);\n  });\n  useEventListener(isTouchDevice ? 'touchmove' : undefined, e => {\n    e.preventDefault();\n    const position = getMultipleTouchPosition(e);\n    handleMove(...position);\n  }, {\n    passive: false\n  });\n  useEventListener(isTouchDevice ? 'touchend' : undefined, ({\n    changedTouches\n  }) => {\n    const touch = changedTouches[0];\n    handleUp(touch.clientX, touch.clientY);\n  }, {\n    passive: false\n  });\n  useEventListener('resize', useDebounceCallback(() => {\n    if (loaded && !touched) {\n      if (isDragMode) {\n        updateState({\n          x: 0,\n          y: 0\n        });\n      } else updateState(getSuitableImageSize(isDragMode, naturalWidth, naturalHeight, rotate));\n      onPhotoResize();\n    }\n  }, {\n    maxWait: 8\n  }));\n  useIsomorphicLayoutEffect(() => {\n    if (isActive) {\n      expose({\n        scale,\n        rotate,\n        loading: !loaded,\n        ...fn\n      });\n    }\n  }, [isActive]);\n  function handlePhotoLoad(params) {\n    const state = params.loaded ? getSuitableImageSize(isDragMode, params.naturalWidth || 0, params.naturalHeight || 0, rotate) : {};\n    if (isDragMode && params.loaded && isActive) expose({\n      scale: state.scale,\n      loading: false\n    });\n    updateState({\n      ...params,\n      ...state\n    });\n  }\n  function handleStart(currentClientX, currentClientY, currentTouchLength = 0) {\n    updateState({\n      touched: true,\n      CX: currentClientX,\n      CY: currentClientY,\n      lastCX: currentClientX,\n      lastCY: currentClientY,\n      lastX: x,\n      lastY: y,\n      lastScale: scale,\n      touchLength: currentTouchLength,\n      touchTime: Date.now()\n    });\n  }\n  function handleWheel(e) {\n    if (!reach && enableMouseZoom) {\n      // 限制最大倍数和最小倍数\n      const delta = isDragMode ? e.deltaY / 100 / 16 : e.deltaY / 100 / 2;\n      const toScale = limitScale(scale - delta, isDragMode, naturalWidth / width);\n      updateState({\n        stopRaf: true\n      });\n      onScale(toScale, e.clientX, e.clientY);\n    }\n  }\n  function handleMaskStart(e) {\n    updateState({\n      maskTouched: true,\n      CX: e.clientX,\n      CY: e.clientY,\n      lastX: x,\n      lastY: y\n    });\n  }\n  function handleTouchStart(e) {\n    e.stopPropagation();\n    handleStart(...getMultipleTouchPosition(e));\n  }\n  function handleMouseDown(e) {\n    e.stopPropagation();\n    if (e.button === 0) {\n      handleStart(e.clientX, e.clientY, 0);\n    }\n  }\n\n  // 计算位置\n  const [translateX, translateY, currentWidth, currentHeight, currentScale, opacity, easingMode, FIT] = useAnimationPosition(isDragMode, visible, originRef, loaded, x, y, width, height, naturalWidth, naturalHeight, scale, speed, isPause => updateState({\n    pause: isPause\n  }));\n  // 图片 objectFit 渐变时间\n  const transitionLayoutTime = easingMode < 4 ? speed / 2 : easingMode > 4 ? speed : 0;\n  const transitionCSS = `transform ${speed}ms ${easing}`;\n  const attrs = {\n    className,\n    onMouseDown: isTouchDevice ? undefined : handleMouseDown,\n    onTouchStart: isTouchDevice ? handleTouchStart : undefined,\n    onWheel: handleWheel,\n    style: {\n      width: currentWidth,\n      height: currentHeight,\n      opacity,\n      objectFit: easingMode === 4 ? undefined : FIT,\n      transform: rotate ? `rotate(${rotate}deg)` : undefined,\n      transition:\n      // 初始状态无渐变\n      easingMode > 2 ? isDragMode ? `${transitionCSS}, width ${transitionLayoutTime}ms ${easing}, height ${transitionLayoutTime}ms ${easing}` : `${transitionCSS}, opacity ${speed}ms ease, height ${transitionLayoutTime}ms ${easing}` : undefined\n    }\n  };\n  return <StyledWrap isDragMode={isDragMode} className={wrapClassName} style={style} onMouseDown={!isTouchDevice && isActive ? handleMaskStart : undefined} onTouchStart={isTouchDevice && isActive ? e => handleMaskStart(e.touches[0]) : undefined}>\n      <StyledBox style={{\n      transform: isDragMode ? undefined : `matrix(${currentScale}, 0, 0, ${currentScale}, ${translateX}, ${translateY})`,\n      left: isDragMode ? translateX : undefined,\n      top: isDragMode ? translateY : undefined,\n      transition: touched || pause ? undefined : isDragMode ? `left ${transitionLayoutTime}ms ${easing}, top ${transitionLayoutTime}ms ${easing}` : transitionCSS,\n      willChange: isActive ? 'transform' : undefined\n    }}>\n        {src ? <Photo src={src} loaded={loaded} broken={broken} {...attrs} onPhotoLoad={handlePhotoLoad} loadingElement={loadingElement} brokenElement={brokenElement} /> : render && render({\n        attrs,\n        scale: currentScale,\n        rotate\n      })}\n      </StyledBox>\n    </StyledWrap>;\n}","import type React from 'react'\n\n/**\n * 从 Touch 事件中获取两个触控中心位置\n */\nexport default function getMultipleTouchPosition(\n  evt: TouchEvent | React.TouchEvent,\n): [clientX: number, clientY: number, touchLength: number] {\n  const { clientX, clientY } = evt.touches[0]\n  if (evt.touches.length >= 2) {\n    const { clientX: nextClientX, clientY: nextClientY } = evt.touches[1]\n    return [\n      (clientX + nextClientX) / 2,\n      (clientY + nextClientY) / 2,\n      Math.sqrt((nextClientX - clientX) ** 2 + (nextClientY - clientY) ** 2),\n    ]\n  }\n  return [clientX, clientY, 0]\n}\n","import type { CloseEdgeType } from '../types'\nimport type { ReachType, TouchStartType } from '../types'\n\n/**\n * 获取接触边缘类型\n */\nexport const getReachType = (\n  initialTouchState: TouchStartType,\n  horizontalCloseEdge: CloseEdgeType,\n  verticalCloseEdge: CloseEdgeType,\n  reachPosition: ReachType,\n): ReachType => {\n  if ((horizontalCloseEdge && initialTouchState === 1) || reachPosition === 'x') {\n    return 'x'\n  } else if ((verticalCloseEdge && initialTouchState > 1) || reachPosition === 'y') {\n    return 'y'\n  }\n  return undefined\n}\n\n/**\n * 计算接触边缘位置\n * @param position - x/y\n * @param scale\n * @param size - width/height\n * @param innerSize - innerWidth/innerHeight\n * @return [CloseEdgeType, position]\n */\nexport const computePositionEdge = (\n  position: number,\n  scale: number,\n  size: number,\n  innerSize: number,\n) => {\n  const currentWidth = size * scale\n  // 图片超出的宽度\n  const outOffset = (currentWidth - innerSize) / 2\n  let closedEdge: CloseEdgeType = undefined\n\n  let current = position\n  if (currentWidth <= innerSize) {\n    closedEdge = 1\n    current = 0\n  } else if (position > 0 && outOffset - position <= 0) {\n    closedEdge = 2\n    current = outOffset\n  } else if (position < 0 && outOffset + position <= 0) {\n    closedEdge = 3\n    current = -outOffset\n  }\n\n  return [closedEdge, current] as const\n}\n","import { longModeRatio } from '../variables'\nimport { computePositionEdge } from './edgeHandle'\n\n/**\n * 获取移动或缩放之后的中心点\n */\nexport default function getPositionOnMoveOrScale(\n  isDragMode: boolean,\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  naturalWidth: number,\n  naturalHeight: number,\n  scale: number,\n  toScale: number,\n  clientX: number = innerWidth / 2,\n  clientY: number = innerHeight / 2,\n  offsetX: number = 0,\n  offsetY: number = 0,\n) {\n  // 是否接触边缘\n  const [closedEdgeX] = computePositionEdge(\n    x,\n    toScale,\n    isDragMode ? naturalWidth : width,\n    innerWidth,\n  )\n  const [closedEdgeY] = computePositionEdge(\n    y,\n    toScale,\n    isDragMode ? naturalHeight : height,\n    innerHeight,\n  )\n\n  const centerClientX = innerWidth / 2\n  const centerClientY = innerHeight / 2\n\n  // 坐标偏移\n  const lastPositionX = centerClientX + x\n  const lastPositionY = centerClientY + y\n\n  // 偏移位置\n  const originX = clientX - (clientX - lastPositionX) * (toScale / scale) - centerClientX\n  const originY = clientY - (clientY - lastPositionY) * (toScale / scale) - centerClientY\n  // 长图模式无左右反馈\n  const longModeEdge =\n    (isDragMode ? naturalHeight / naturalWidth : height / width) >= longModeRatio &&\n    (isDragMode ? naturalWidth : width) * toScale === innerWidth\n  // 超出边缘距离减半\n  return {\n    x: originX + (longModeEdge ? 0 : closedEdgeX ? offsetX / 2 : offsetX),\n    y: originY + (closedEdgeY ? offsetY / 2 : offsetY),\n    lastCX: clientX,\n    lastCY: clientY,\n  }\n}\n","/**\n * 获取旋转后的宽高\n */\nexport default function getRotateSize(rotate: number, width: number, height: number) {\n  const isVertical = rotate % 180 !== 0\n\n  // 若图片不是水平则调换属性\n  if (isVertical) {\n    return [height, width, isVertical] as const\n  }\n\n  return [width, height, isVertical] as const\n}\n","import { longModeRatio } from '../variables'\nimport getRotateSize from './getRotateSize'\n\n/**\n * 获取图片合适的大小\n */\nexport default function getSuitableImageSize(\n  isDragMode: boolean,\n  naturalWidth: number,\n  naturalHeight: number,\n  rotate: number,\n  margin = 0,\n) {\n  const [currentWidth, currentHeight, isVertical] = getRotateSize(rotate, innerWidth, innerHeight)\n\n  let y = margin\n  let width = currentWidth - margin * 2\n  let height = currentHeight - margin * 2\n\n  // 自适应宽高\n  const autoWidth = (naturalWidth / naturalHeight) * currentHeight\n  const autoHeight = (naturalHeight / naturalWidth) * currentWidth\n\n  if (naturalWidth < currentWidth && naturalHeight < currentHeight) {\n    width = naturalWidth\n    height = naturalHeight\n  } else if (naturalWidth < currentWidth && naturalHeight >= currentHeight) {\n    width = autoWidth\n  } else if (naturalWidth >= currentWidth && naturalHeight < currentHeight) {\n    height = autoHeight\n  } else if (naturalWidth / naturalHeight > currentWidth / currentHeight) {\n    height = autoHeight\n  }\n  // 长图模式\n  else if (naturalHeight / naturalWidth >= longModeRatio && !isVertical) {\n    height = autoHeight\n    y = (height - currentHeight) / 2\n  } else {\n    width = autoWidth\n  }\n  const state: Record<string, number | boolean> = {\n    width,\n    height,\n    x: margin,\n    y,\n    pause: isDragMode ? false : true,\n  }\n  if (isDragMode) state.scale = Math.min(height / naturalHeight, width / naturalWidth, 1)\n  return state\n}\n","import { useCallback, useRef } from 'react'\n\ninterface DebounceCallback<CallbackArguments extends any[]> {\n  (...args: CallbackArguments): void\n  cancel: () => void\n}\n\nexport default function useDebounceCallback<CallbackArguments extends any[]>(\n  callback: (...args: CallbackArguments) => void,\n  {\n    leading = false,\n    maxWait,\n    wait = maxWait || 0,\n  }: {\n    leading?: boolean\n    maxWait?: number\n    wait?: number\n  },\n): DebounceCallback<CallbackArguments> {\n  const callbackRef = useRef(callback)\n  callbackRef.current = callback\n\n  const prev = useRef(0)\n  const trailingTimeout = useRef<ReturnType<typeof setTimeout>>()\n  const clearTrailing = () => trailingTimeout.current && clearTimeout(trailingTimeout.current)\n\n  const fn = useCallback(\n    (...args: CallbackArguments) => {\n      const now = Date.now()\n\n      function call() {\n        prev.current = now\n        clearTrailing()\n        callbackRef.current.apply(null, args)\n      }\n      const last = prev.current\n      const offset = now - last\n      // leading\n      if (last === 0) {\n        if (leading) {\n          call()\n        }\n        prev.current = now\n      }\n\n      // body\n      if (maxWait !== undefined) {\n        if (offset > maxWait) {\n          call()\n          return\n        }\n      } else if (offset < wait) {\n        prev.current = now\n      }\n\n      // trailing\n      clearTrailing()\n      trailingTimeout.current = setTimeout(() => {\n        call()\n        prev.current = 0\n      }, wait)\n    },\n    [wait, maxWait, leading],\n  )\n  ;(fn as DebounceCallback<CallbackArguments>).cancel = clearTrailing\n\n  return fn as DebounceCallback<CallbackArguments>\n}\n","import { useRef } from 'react'\nimport useDebounceCallback from './useDebounceCallback'\n\nexport type TapFuncType<T> = (...args: T[]) => void\n\n/**\n * 单击和双击事件处理\n * @param singleTap - 单击事件\n * @param doubleTap - 双击事件\n * @return invokeTap\n */\nexport default function useContinuousTap<T>(\n  singleTap: TapFuncType<T>,\n  doubleTap: TapFuncType<T>,\n): TapFuncType<T> {\n  // 当前连续点击次数\n  const continuousClick = useRef(0)\n\n  const debounceTap = useDebounceCallback(\n    (...args) => {\n      continuousClick.current = 0\n      singleTap(...args)\n    },\n    {\n      wait: 300,\n    },\n  )\n\n  return function invokeTap(...args) {\n    continuousClick.current += 1\n    debounceTap(...args)\n    // 双击\n    if (continuousClick.current >= 2) {\n      debounceTap.cancel()\n      continuousClick.current = 0\n      doubleTap(...args)\n    }\n  }\n}\n","import { computePositionEdge } from '../utils/edgeHandle'\nimport getPositionOnMoveOrScale from '../utils/getPositionOnMoveOrScale'\nimport getRotateSize from '../utils/getRotateSize'\nimport { defaultSpeed, maxTouchTime } from '../variables'\nimport useMethods from './useMethods'\n\n// 触边运动反馈\nconst rebound = (start: number, bound: number, callback: (spatial: number) => boolean) =>\n  easeOutMove(\n    start,\n    bound,\n    callback,\n    defaultSpeed / 4,\n    t => t,\n    () => easeOutMove(bound, start, callback),\n  )\n\n/**\n * 物理滚动到具体位置\n */\nexport default function useScrollPosition<C extends (spatial: number) => boolean>(\n  callbackX: C,\n  callbackY: C,\n  callbackS: C,\n) {\n  const callback = useMethods({\n    X: (spatial: number) => callbackX(spatial),\n    Y: (spatial: number) => callbackY(spatial),\n    S: (spatial: number) => callbackS(spatial),\n  })\n\n  return (\n    x: number,\n    y: number,\n    lastX: number,\n    lastY: number,\n    width: number,\n    height: number,\n    naturalWidth: number,\n    naturalHeight: number,\n    scale: number,\n    safeScale: number,\n    lastScale: number,\n    rotate: number,\n    touchedTime: number,\n  ) => {\n    const [currentWidth, currentHeight] = getRotateSize(rotate, width, height)\n    // 开始状态下边缘触发状态\n    const [beginEdgeX, beginX] = computePositionEdge(x, safeScale, currentWidth, innerWidth)\n    const [beginEdgeY, beginY] = computePositionEdge(y, safeScale, currentHeight, innerHeight)\n    const moveTime = Date.now() - touchedTime\n\n    // 时间过长、超出安全范围的情况下不执行滚动逻辑，恢复安全范围\n    if (moveTime >= maxTouchTime || safeScale != scale || Math.abs(lastScale - scale) > 1) {\n      // 计算中心缩放点\n      const { x: nextX, y: nextY } = getPositionOnMoveOrScale(\n        false,\n        x,\n        y,\n        width,\n        height,\n        naturalWidth,\n        naturalHeight,\n        scale,\n        safeScale,\n      )\n      const targetX = beginEdgeX ? beginX : nextX !== x ? nextX : null\n      const targetY = beginEdgeY ? beginY : nextY !== y ? nextY : null\n\n      if (targetX !== null) {\n        easeOutMove(x, targetX, callback.X)\n      }\n      if (targetY !== null) {\n        easeOutMove(y, targetY, callback.Y)\n      }\n      if (safeScale != scale) {\n        easeOutMove(scale, safeScale, callback.S)\n      }\n      return\n    }\n\n    // 初始速度\n    const speedX = (x - lastX) / moveTime\n    const speedY = (y - lastY) / moveTime\n    const speedT = Math.sqrt(speedX ** 2 + speedY ** 2)\n    // 是否接触到边缘\n    let edgeX = false\n    let edgeY = false\n\n    scrollMove(speedT, spatial => {\n      const nextX = x + spatial * (speedX / speedT)\n      const nextY = y + spatial * (speedY / speedT)\n\n      const [isEdgeX, currentX] = computePositionEdge(nextX, scale, currentWidth, innerWidth)\n      const [isEdgeY, currentY] = computePositionEdge(nextY, scale, currentHeight, innerHeight)\n\n      if (isEdgeX && !edgeX) {\n        edgeX = true\n        if (beginEdgeX) {\n          easeOutMove(nextX, currentX, callback.X)\n        } else {\n          rebound(currentX, nextX + (nextX - currentX), callback.X)\n        }\n      }\n\n      if (isEdgeY && !edgeY) {\n        edgeY = true\n        if (beginEdgeY) {\n          easeOutMove(nextY, currentY, callback.Y)\n        } else {\n          rebound(currentY, nextY + (nextY - currentY), callback.Y)\n        }\n      }\n      // 同时接触边缘的情况下停止滚动\n      if (edgeX && edgeY) {\n        return false\n      }\n\n      const resultX = edgeX || callback.X(currentX)\n      const resultY = edgeY || callback.Y(currentY)\n      return resultX && resultY\n    })\n  }\n}\n\n// 加速度\nconst acceleration = -0.001\n// 阻力\nconst resistance = 0.0002\n\n/**\n * 通过速度滚动到停止\n */\nfunction scrollMove(initialSpeed: number, callback: (spatial: number) => boolean) {\n  let v = initialSpeed\n  let s = 0\n  let lastTime: number | undefined = undefined\n  let frameId = 0\n\n  const calcMove = (now: number) => {\n    if (!lastTime) {\n      lastTime = now\n    }\n    const dt = now - lastTime\n    const direction = Math.sign(initialSpeed)\n    const a = direction * acceleration\n    const f = Math.sign(-v) * v ** 2 * resistance\n    const ds = v * dt + ((a + f) * dt ** 2) / 2\n    v = v + (a + f) * dt\n\n    s = s + ds\n    // move to s\n    lastTime = now\n\n    if (direction * v <= 0) {\n      caf()\n      return\n    }\n\n    if (callback(s)) {\n      raf()\n      return\n    }\n    caf()\n  }\n  raf()\n\n  function raf() {\n    frameId = requestAnimationFrame(calcMove)\n  }\n  function caf() {\n    cancelAnimationFrame(frameId)\n  }\n}\n\n/**\n * 缓动函数\n */\nconst easeOutQuart = (x: number) => 1 - (1 - x) ** 4\n\n/**\n * 缓动回调\n */\nfunction easeOutMove(\n  start: number,\n  end: number,\n  callback: (spatial: number) => boolean,\n  speed = defaultSpeed,\n  easing = easeOutQuart,\n  complete?: () => void,\n) {\n  const distance = end - start\n  if (distance === 0) {\n    return\n  }\n\n  const startTime = Date.now()\n  let frameId = 0\n\n  const calcMove = () => {\n    const time = Math.min(1, (Date.now() - startTime) / speed)\n    const result = callback(start + easing(time) * distance)\n\n    if (result && time < 1) {\n      raf()\n      return\n    }\n    cancelAnimationFrame(frameId)\n    if (time >= 1 && complete) {\n      complete()\n    }\n  }\n  raf()\n\n  function raf() {\n    frameId = requestAnimationFrame(calcMove)\n  }\n}\n","import type { Dispatch, MutableRefObject, SetStateAction } from 'react'\nimport { useState, useEffect, useRef } from 'react'\nimport type { EasingMode, OriginRectType } from '../types'\nimport useMethods from './useMethods'\nimport { maxWaitAnimationTime } from '../variables'\n\nconst initialRect: OriginRectType = {\n  T: 0,\n  L: 0,\n  W: 0,\n  H: 0,\n  // 图像填充方式\n  FIT: undefined,\n}\n\nexport default function useAnimationOrigin(\n  isDragMode: boolean,\n  visible: boolean | undefined,\n  originRef: MutableRefObject<HTMLElement | null> | undefined,\n  loaded: boolean,\n  speed: number,\n  updateEasing: (pause: boolean) => void,\n): [\n  // 动画状态\n  easingMode: EasingMode,\n  originRect: OriginRectType,\n] {\n  const [originRect, updateOriginRect] = useState(initialRect)\n  // 动画状态\n  const [easingMode, updateEasingMode] = useState<EasingMode>(isDragMode ? 3 : 0)\n  const initialTime = useRef<number>()\n\n  const fn = useMethods({\n    OK: () => visible && updateEasingMode(4),\n  })\n\n  useEffect(() => {\n    // 记录初始打开的时间\n    if (!initialTime.current) {\n      initialTime.current = Date.now()\n    }\n    if (!loaded) {\n      return\n    }\n    handleUpdateOrigin(originRef, updateOriginRect)\n    if (isDragMode) return\n\n    if (visible) {\n      // 打开动画处理\n      // 小于最大允许动画时间，则执行缩放动画\n      if (Date.now() - initialTime.current < maxWaitAnimationTime) {\n        updateEasingMode(1)\n        // 延时执行动画，保持 transition 生效\n        requestAnimationFrame(() => {\n          updateEasingMode(2)\n          requestAnimationFrame(() => handleToShape(3))\n        })\n        setTimeout(fn.OK, speed)\n        return\n      }\n      // 超出则不执行\n      updateEasingMode(4)\n      return\n    }\n    // 关闭动画处理\n    handleToShape(5)\n  }, [visible, loaded, isDragMode])\n\n  function handleToShape(currentShape: EasingMode) {\n    updateEasing(false)\n    updateEasingMode(currentShape)\n  }\n\n  return [easingMode, originRect]\n}\n\n/**\n * 更新缩略图位置信息\n */\nfunction handleUpdateOrigin(\n  originRef: MutableRefObject<HTMLElement | null> | undefined,\n  updateOriginRect: Dispatch<SetStateAction<typeof initialRect>>,\n) {\n  const element = originRef && originRef.current\n\n  if (element && element.nodeType === 1) {\n    // 获取触发时节点位置\n    const { top, left, width, height } = element.getBoundingClientRect()\n    const isImage = element.tagName === 'IMG'\n    updateOriginRect({\n      T: top,\n      L: left,\n      W: width,\n      H: height,\n      FIT: isImage\n        ? (getComputedStyle(element).objectFit as 'contain' | 'cover' | 'fill' | undefined)\n        : undefined,\n    })\n  }\n}\n","import { useRef } from 'react'\nimport useSetState from './useSetState'\nimport useIsomorphicLayoutEffect from './useIsomorphicLayoutEffect'\nimport useDebounceCallback from './useDebounceCallback'\n\n/**\n * 目标缩放延迟处理\n */\nexport default function useTargetScale(\n  isDragMode: boolean,\n  realWidth: number,\n  realHeight: number,\n  naturalWidth: number,\n  naturalHeight: number,\n  realScale: number,\n  speed: number,\n  updateEasing: (pause: boolean) => void,\n) {\n  const execRef = useRef(false)\n\n  const [{ lead, scale }, updateState] = useSetState({ lead: true, scale: realScale })\n\n  const moveScale = useDebounceCallback(\n    async (current: number) => {\n      updateEasing(true)\n      updateState({ lead: false, scale: current })\n    },\n    { wait: speed },\n  )\n\n  useIsomorphicLayoutEffect(() => {\n    if (!execRef.current || isDragMode) {\n      execRef.current = true\n      return\n    }\n    updateEasing(false)\n    updateState({ lead: true })\n    moveScale(realScale)\n  }, [realScale, isDragMode])\n\n  if (isDragMode) {\n    return [naturalWidth * realScale, naturalHeight * realScale, realScale] as const\n  }\n\n  if (lead) {\n    // 运动开始\n    return [realWidth * scale, realHeight * scale, realScale / scale] as const\n  }\n  // 运动结束\n  return [realWidth * realScale, realHeight * realScale, 1] as const\n}\n","import type { MutableRefObject } from 'react'\nimport useAnimationOrigin from './useAnimationOrigin'\nimport useTargetScale from './useTargetScale'\n\nexport default function useAnimationPosition(\n  isDragMode: boolean,\n  visible: boolean | undefined,\n  originRef: MutableRefObject<HTMLElement | null> | undefined,\n  loaded: boolean,\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  naturalWidth: number,\n  naturalHeight: number,\n  scale: number,\n  speed: number,\n  updateEasing: (pause: boolean) => void,\n) {\n  // 延迟更新 width/height\n  const [autoWidth, autoHeight, autoScale] = useTargetScale(\n    isDragMode,\n    width,\n    height,\n    naturalWidth,\n    naturalHeight,\n    scale,\n    speed,\n    updateEasing,\n  )\n  // 动画源处理\n  const [easingMode, originRect] = useAnimationOrigin(\n    isDragMode,\n    visible,\n    originRef,\n    loaded,\n    speed,\n    updateEasing,\n  )\n\n  // 计算动画位置\n  const { T, L, W, H, FIT } = originRect\n  // 偏移量，x: 0, y: 0 居中为初始\n  const centerWidth = innerWidth / 2\n  const centerHeight = innerHeight / 2\n  const offsetX = centerWidth - ((isDragMode ? naturalWidth : width) * scale) / 2\n  const offsetY = centerHeight - ((isDragMode ? naturalHeight : height) * scale) / 2\n  // 缩略图状态\n  const miniMode = easingMode < 3 || easingMode > 4\n  // 有缩略图时，则为缩略图的位置，否则居中\n  const translateX = miniMode ? (W ? L : centerWidth) : x + offsetX\n  const translateY = miniMode ? (W ? T : centerHeight) : y + offsetY\n\n  // 最小值缩放\n  const minScale = W / ((isDragMode ? naturalWidth : width) * scale) || 0.01\n\n  // 适应 objectFit 保持缩略图宽高比\n  const currentHeight = miniMode && FIT ? autoWidth * (H / W) : autoHeight\n  // 初始加载情况无缩放\n  const currentScale = easingMode === 0 ? autoScale : miniMode ? minScale : autoScale\n  const opacity = miniMode ? (FIT ? 1 : 0) : 1\n\n  return [\n    translateX,\n    translateY,\n    autoWidth,\n    currentHeight,\n    currentScale,\n    opacity,\n    easingMode,\n    FIT,\n  ] as const\n}\n","import { useEffect, useRef } from 'react'\n\nconst useMountedRef = () => {\n  const mountedRef = useRef(false)\n  useEffect(() => {\n    mountedRef.current = true\n    return () => {\n      mountedRef.current = false\n    }\n  }, [])\n  return mountedRef\n}\n\nexport default useMountedRef\n","import _styled4styled_components from 'styled-components';\n            const _styled4 = typeof _styled4styled_components.default === 'undefined' ? _styled4styled_components : _styled4styled_components.default;;\nimport _styled3styled_components from 'styled-components';\n            const _styled3 = typeof _styled3styled_components.default === 'undefined' ? _styled3styled_components : _styled3styled_components.default;;\nimport _styled2styled_components from 'styled-components';\n            const _styled2 = typeof _styled2styled_components.default === 'undefined' ? _styled2styled_components : _styled2styled_components.default;;\nimport _styledstyled_components from 'styled-components';\n            const _styled = typeof _styledstyled_components.default === 'undefined' ? _styledstyled_components : _styledstyled_components.default;;\nimport { css as _css } from \"styled-components\";\nimport React from 'react';\nimport Spinner from './components/Spinner';\nimport useMountedRef from './hooks/useMountedRef';\nconst iconStyles = [{\n  \"position\": \"absolute\",\n  \"left\": \"0px\",\n  \"top\": \"0px\",\n  \"display\": \"inline-block\",\n  \"--tw-translate-x\": \"-50%\",\n  \"transform\": \"translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))\",\n  \"--tw-translate-y\": \"-50%\"\n}];\nexport default function Photo({\n  src,\n  loaded,\n  broken,\n  className,\n  onPhotoLoad,\n  loadingElement,\n  brokenElement,\n  ...restProps\n}) {\n  const mountedRef = useMountedRef();\n  function handleImageLoaded(e) {\n    const {\n      naturalWidth,\n      naturalHeight\n    } = e.target;\n    if (mountedRef.current) {\n      onPhotoLoad({\n        loaded: true,\n        naturalWidth,\n        naturalHeight\n      });\n    }\n  }\n  function handleImageBroken() {\n    if (mountedRef.current) {\n      onPhotoLoad({\n        broken: true\n      });\n    }\n  }\n  if (src && !broken) {\n    return <>\n        <_StyledImg className={className} src={src} onLoad={handleImageLoaded} onError={handleImageBroken} alt=\"\" {...restProps} $_css2={[{\n        \"cursor\": \"grab\",\n        \"--tw-bg-opacity\": \"1\",\n        \"backgroundColor\": \"rgb(255 255 255 / var(--tw-bg-opacity))\",\n        \":active\": {\n          \"cursor\": \"grabbing\"\n        }\n      }, _css([\"max-width:initial;\"])]} />\n        {!loaded && (<_StyledSpan>{loadingElement}</_StyledSpan> || <_StyledSpinner />)}\n      </>;\n  }\n  if (brokenElement) {\n    return <_StyledSpan2>\n        {typeof brokenElement === 'function' ? brokenElement({\n        src\n      }) : brokenElement}\n      </_StyledSpan2>;\n  }\n  return null;\n}\nvar _StyledImg = _styled(\"img\").withConfig({\n  componentId: \"sc-r1gl4k-0\"\n})([\"\", \"\"], p => p.$_css2);\nvar _StyledSpan = _styled(\"span\").withConfig({\n  componentId: \"sc-r1gl4k-1\"\n})([\"\", \"\"], iconStyles);\nvar _StyledSpinner = _styled(Spinner).withConfig({\n  componentId: \"sc-r1gl4k-2\"\n})([\"\", \"\"], iconStyles);\nvar _StyledSpan2 = _styled(\"span\").withConfig({\n  componentId: \"sc-r1gl4k-3\"\n})([\"\", \"\"], iconStyles);","import _styledstyled_components from 'styled-components';\n            const _styled = typeof _styledstyled_components.default === 'undefined' ? _styledstyled_components : _styledstyled_components.default;;\nimport React from 'react';\nimport { keyframes } from 'styled-components';\nconst rotate = keyframes([\"from{transform:rotate(0deg);}to{transform:rotate(360deg);}\"]);\nconst delayIn = keyframes([\"0%,50%{opacity:0;}100%{opacity:1;}\"]);\nconst StyledSpinner = _styled.div.withConfig({\n  componentId: \"sc-7ci1r2-0\"\n})([\"animation:\", \" 0.4s linear both;svg{animation:\", \" 0.6s linear infinite;}\"], delayIn, rotate);\nfunction Spinner({\n  className,\n  ...props\n}) {\n  return <StyledSpinner className={className} {...props}>\n      <svg viewBox=\"0 0 32 32\" width=\"36\" height=\"36\" fill=\"white\">\n        <path opacity=\".25\" d=\"M16 0 A16 16 0 0 0 16 32 A16 16 0 0 0 16 0 M16 4 A12 12 0 0 1 16 28 A12 12 0 0 1 16 4\" />\n        <path d=\"M16 0 A16 16 0 0 1 32 16 L28 16 A12 12 0 0 0 16 4z\" />\n      </svg>\n    </StyledSpinner>;\n}\nexport default Spinner;","import type React from 'react'\nimport { Children, cloneElement, useContext, useEffect, useMemo, useRef } from 'react'\nimport useInitial from './hooks/useInitial'\nimport useMethods from './hooks/useMethods'\nimport type { PhotoContextType } from './photo-context'\nimport PhotoContext from './photo-context'\nimport type { PhotoRenderParams } from './types'\n\nexport interface PhotoViewProps {\n  /**\n   * 图片地址\n   */\n  src?: string\n  /**\n   * 自定义渲染，优先级比 src 低\n   */\n  render?: (props: PhotoRenderParams) => React.ReactNode\n  /**\n   * 自定义覆盖节点\n   */\n  overlay?: React.ReactNode\n  /**\n   * 自定义渲染节点宽度\n   */\n  width?: number\n  /**\n   * 自定义渲染节点高度\n   */\n  height?: number\n  /**\n   * 子节点，一般为缩略图\n   */\n  children?: React.ReactElement\n  /**\n   * 触发的事件\n   */\n  triggers?: ('onClick' | 'onDoubleClick')[]\n}\n\nconst PhotoView: React.FC<PhotoViewProps> = ({\n  src,\n  render,\n  overlay,\n  width,\n  height,\n  triggers = ['onClick'],\n  children,\n}) => {\n  const photoContext = useContext<PhotoContextType>(PhotoContext)\n  const key = useInitial(() => photoContext.nextId())\n  const originRef = useRef<HTMLElement>(null)\n\n  useEffect(() => {\n    return () => {\n      photoContext.remove(key)\n    }\n  }, [])\n\n  function invokeChildrenFn(eventName: string, e: React.SyntheticEvent) {\n    if (children) {\n      const eventFn = children.props[eventName]\n      if (eventFn) {\n        eventFn(e)\n      }\n    }\n  }\n\n  const fn = useMethods({\n    render(props: PhotoRenderParams) {\n      return render && render(props)\n    },\n    show(eventName: string, e: React.MouseEvent) {\n      photoContext.show(key)\n      invokeChildrenFn(eventName, e)\n    },\n  })\n\n  const eventListeners = useMemo(() => {\n    const listener: Record<string, any> = {}\n    triggers.forEach(eventName => {\n      listener[eventName] = fn.show.bind(null, eventName)\n    })\n    return listener\n  }, [])\n\n  useEffect(() => {\n    photoContext.update({\n      key,\n      src,\n      originRef,\n      render: fn.render,\n      overlay,\n      width,\n      height,\n    })\n  }, [src])\n\n  if (children) {\n    return Children.only(cloneElement(children, { ...eventListeners, ref: originRef }))\n  }\n  return null\n}\n\nexport default PhotoView\n","import { useRef } from 'react'\n\nexport default function useInitial<T extends (...args: any) => any>(callback: T) {\n  const { current } = useRef({ sign: false, fn: undefined as ReturnType<T> })\n  if (!current.sign) {\n    current.sign = true\n    current.fn = callback()\n  }\n  return current.fn\n}\n"],"mappings":"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","names":["forwardRef","useMemo","useRef","useRef","useMethods","fn","current","curr","key","args","useReducer","useSetState","initialState","useReducer","state","action","__spreadValues","createContext","photo_context_default","_styled2styled_components","_styledstyled_components","_css","forwardRef","useMemo","useRef","useState","defaultEasing","defaultDragEasing","limitNumber","value","min","max","limitScale","scale","isDragMode","buffer","useEffect","useLayoutEffect","isSSR","useIsomorphicLayoutEffect_default","useMemo","useAdjacentImages","images","index","loop","useMemo","imageLength","connected","currentImage","sliceImages","adjacentImages","i","image","__spreadProps","__spreadValues","useEffect","useRef","useEventListener","type","fn","options","latest","wrapper","evt","useReducer","useRef","useRef","useMemo","useForkedVariable","initial","updater","forkedRef","modify","next","useAnimationVisible","visible","afterClose","handleRender","useReducer","c","activeAnimation","useRef","realVisible","modifyRealVisible","useForkedVariable","modify","onAnimationEnd","_styledstyled_components","forwardRef","createPortal","jsx","_styled","_styledstyled_components","SlidePortal","forwardRef","_a","ref","_b","container","rest","__objRest","createPortal","_StyledDiv","__spreadValues","SlidePortal_default","useEffect","PreventScroll","style","lastOverflow","_styledstyled_components","useRef","getMultipleTouchPosition","evt","clientX","clientY","nextClientX","nextClientY","__pow","getReachType","initialTouchState","horizontalCloseEdge","verticalCloseEdge","reachPosition","computePositionEdge","position","scale","size","innerSize","currentWidth","outOffset","closedEdge","current","getPositionOnMoveOrScale","isDragMode","x","y","width","height","naturalWidth","naturalHeight","scale","toScale","clientX","clientY","offsetX","offsetY","closedEdgeX","computePositionEdge","closedEdgeY","centerClientX","centerClientY","lastPositionX","lastPositionY","originX","originY","longModeEdge","getRotateSize","rotate","width","height","isVertical","getSuitableImageSize","isDragMode","naturalWidth","naturalHeight","rotate","margin","currentWidth","currentHeight","isVertical","getRotateSize","y","width","height","autoWidth","autoHeight","state","useCallback","useRef","useDebounceCallback","callback","leading","maxWait","wait","callbackRef","prev","trailingTimeout","clearTrailing","fn","args","now","call","last","offset","useRef","useContinuousTap","singleTap","doubleTap","continuousClick","useRef","debounceTap","useDebounceCallback","args","rebound","start","bound","callback","easeOutMove","t","useScrollPosition","callbackX","callbackY","callbackS","useMethods","spatial","x","y","lastX","lastY","width","height","naturalWidth","naturalHeight","scale","safeScale","lastScale","rotate","touchedTime","currentWidth","currentHeight","getRotateSize","beginEdgeX","beginX","computePositionEdge","beginEdgeY","beginY","moveTime","nextX","nextY","getPositionOnMoveOrScale","targetX","targetY","speedX","speedY","speedT","__pow","edgeX","edgeY","scrollMove","isEdgeX","currentX","isEdgeY","currentY","resultX","resultY","acceleration","resistance","initialSpeed","v","s","lastTime","frameId","calcMove","now","dt","direction","a","f","ds","caf","raf","easeOutQuart","end","speed","easing","complete","distance","startTime","time","useState","useEffect","useRef","initialRect","useAnimationOrigin","isDragMode","visible","originRef","loaded","speed","updateEasing","originRect","updateOriginRect","useState","easingMode","updateEasingMode","initialTime","useRef","fn","useMethods","useEffect","handleUpdateOrigin","handleToShape","currentShape","element","top","left","width","height","isImage","useRef","useTargetScale","isDragMode","realWidth","realHeight","naturalWidth","naturalHeight","realScale","speed","updateEasing","execRef","useRef","lead","scale","updateState","useSetState","moveScale","useDebounceCallback","current","__async","useIsomorphicLayoutEffect_default","useAnimationPosition","isDragMode","visible","originRef","loaded","x","y","width","height","naturalWidth","naturalHeight","scale","speed","updateEasing","autoWidth","autoHeight","autoScale","useTargetScale","easingMode","originRect","useAnimationOrigin","T","L","W","H","FIT","centerWidth","centerHeight","offsetX","offsetY","miniMode","translateX","translateY","minScale","currentHeight","useEffect","useRef","useMountedRef","mountedRef","useMountedRef_default","_styled4styled_components","_styled3styled_components","_styled2styled_components","_styledstyled_components","_css","_styledstyled_components","keyframes","jsx","jsxs","_styled","_styledstyled_components","rotate","keyframes","delayIn","StyledSpinner","Spinner","_a","_b","className","props","__objRest","__spreadProps","__spreadValues","Spinner_default","Fragment","jsx","jsxs","_styled4","_styled4styled_components","_styled3","_styled3styled_components","_styled2","_styled2styled_components","_styled","_styledstyled_components","iconStyles","Photo","_a","_b","src","loaded","broken","className","onPhotoLoad","loadingElement","brokenElement","restProps","__objRest","mountedRef","useMountedRef_default","handleImageLoaded","e","naturalWidth","naturalHeight","handleImageBroken","_StyledImg","__spreadProps","__spreadValues","_css","_StyledSpan","_StyledSpinner","_StyledSpan2","p","Spinner_default","jsx","_styled","_styledstyled_components","initialState","StyledView","StyledWrap","isDragMode","StyledBox","PhotoBox","src","render","customWidth","customHeight","originRef","visible","speed","easing","wrapClassName","className","style","loadingElement","brokenElement","enableMouseZoom","onPhotoTap","onMaskTap","onReachMove","onReachUp","onPhotoResize","isActive","expose","state","updateState","useSetState","initialTouchRef","useRef","mounted","useMountedRef_default","naturalWidth","naturalHeight","width","height","loaded","broken","x","y","touched","stopRaf","maskTouched","rotate","scale","CX","CY","lastX","lastY","lastCX","lastCY","lastScale","touchTime","touchLength","pause","reach","fn","useMethods","current","onScale","limitScale","__spreadProps","__spreadValues","getSuitableImageSize","clientX","clientY","getPositionOnMoveOrScale","handleMove","useDebounceCallback","nextClientX","nextClientY","currentTouchLength","currentWidth","currentHeight","getRotateSize","isStillX","isStillY","offsetX","offsetY","currentReach","horizontalCloseEdge","computePositionEdge","verticalCloseEdge","getReachType","toScale","updateRaf","position","slideToPosition","useScrollPosition","nextX","nextY","nextScale","handlePhotoTap","useContinuousTap","currentClientX","currentClientY","endScale","handleUp","safeScale","useEventListener","isTouchDevice_default","e","getMultipleTouchPosition","changedTouches","touch","useIsomorphicLayoutEffect_default","handlePhotoLoad","params","handleStart","handleWheel","delta","handleMaskStart","handleTouchStart","handleMouseDown","translateX","translateY","currentScale","opacity","easingMode","FIT","useAnimationPosition","isPause","transitionLayoutTime","transitionCSS","attrs","Photo","keyframes","jsx","jsxs","_styled2","_styled2styled_components","_styled","_styledstyled_components","initialState","fade","PhotoSlider","forwardRef","props","ref","modeProp","loop","speedFn","easingFn","photoClosable","maskClosable","maskOpacity","pullClosable","overlayRender","className","maskClassName","photoClassName","photoWrapClassName","loadingElement","brokenElement","images","controlledIndex","controlledIndexChange","visible","onClose","afterClose","portalContainer","enableMouseZoom","isDragMode","useMemo","isTouchDevice_default","state","updateState","useSetState","innerIndex","updateInnerIndex","useState","loading","x","y","touched","pause","lastCX","lastCY","bg","lastBg","overlay","minimal","scale","rotate","onScale","onRotate","isControlled","index","onIndexChange","virtualIndexRef","useRef","imageLength","currentImage","enableLoop","realVisible","activeAnimation","onAnimationEnd","useAnimationVisible","useIsomorphicLayoutEffect_default","close","changeIndex","useMethods","evt","nextIndex","isPause","currentIndex","max","limitIndex","limitNumber","nextVirtualIndex","singlePageWidth","realLoopIndex","useEventListener","handlePhotoTap","closeable","handleResize","handleReachVerticalMove","clientY","nextScale","opacity","handleReachHorizontalMove","clientX","originOffsetClientX","offsetClientX","handleReachMove","reachPosition","handleReachUp","offsetClientY","willClose","currentTranslateX","adjacentImages","useAdjacentImages","currentOverlayVisible","currentOpacity","overlayParams","currentSpeed","currentEasing","defaultDragEasing","defaultEasing","slideSpeed","slideEasing","SlidePortal_default","e","PreventScroll","_StyledDiv","_css","item","isActive","PhotoBox","_StyledDiv2","PhotoSlider_default","p","jsx","jsxs","initialState","PhotoProvider","forwardRef","_a","ref","_b","children","onIndexChange","onVisibleChange","restProps","__objRest","state","updateState","useSetState","uniqueIdRef","useRef","images","visible","index","methods","useMethods","imageItem","currentIndex","n","nextImages","prev","key","item","nextEndIndex","fn","nextIndex","value","useMemo","__spreadValues","photo_context_default","PhotoSlider_default","PhotoProvider_default","Children","cloneElement","useContext","useEffect","useMemo","useRef","useRef","useInitial","callback","current","PhotoView","src","render","overlay","width","height","triggers","children","photoContext","useContext","photo_context_default","key","useInitial","originRef","useRef","useEffect","invokeChildrenFn","eventName","e","eventFn","fn","useMethods","props","eventListeners","useMemo","listener","Children","cloneElement","__spreadProps","__spreadValues","PhotoView_default"]}