{"version":3,"file":"circle.mjs","sources":["../../../../../../../packages/components/circle/src/circle.tsx"],"sourcesContent":["import {\n  type CSSProperties,\n  type ExtractPropTypes,\n  type PropType,\n  computed,\n  defineComponent,\n  watch,\n} from 'vue'\nimport {\n  type Numeric,\n  cancelRaf,\n  createNamespace,\n  getSizeStyle,\n  isObject,\n  makeNumberProp,\n  makeNumericProp,\n  makeStringProp,\n  numericProp,\n  raf,\n  truthProp,\n} from '@xzx-design/utils'\n\nconst [name, bem] = createNamespace('circle')\n\nlet uid = 0\n\nconst format = (rate: Numeric) => Math.min(Math.max(+rate, 0), 100)\n\nfunction getPath(clockwise: boolean, viewBoxSize: number) {\n  const sweepFlag = clockwise ? 1 : 0\n  return `M ${viewBoxSize / 2} ${\n    viewBoxSize / 2\n  } m 0, -500 a 500, 500 0 1, ${sweepFlag} 0, 1000 a 500, 500 0 1, ${sweepFlag} 0, -1000`\n}\n\nexport type CircleStartPosition = 'top' | 'right' | 'bottom' | 'left'\n\nexport const circleProps = {\n  text: String,\n  size: numericProp,\n  fill: makeStringProp('none'),\n  rate: makeNumericProp(100),\n  speed: makeNumericProp(0),\n  color: [String, Object] as PropType<string | Record<string, string>>,\n  clockwise: truthProp,\n  layerColor: String,\n  currentRate: makeNumberProp(0),\n  strokeWidth: makeNumericProp(6),\n  strokeLinecap: String as PropType<CanvasLineCap>,\n  startPosition: makeStringProp<CircleStartPosition>('top'),\n}\n\nexport type CircleProps = ExtractPropTypes<typeof circleProps>\n\nexport default defineComponent({\n  name,\n\n  props: circleProps,\n\n  emits: ['update:currentRate'],\n\n  setup(props, { emit, slots }) {\n    const id = `van-circle-${uid++}`\n\n    const viewBoxSize = computed(() => +props.strokeWidth * 10 + 1000)\n\n    const path = computed(() => getPath(props.clockwise, viewBoxSize.value))\n\n    // eslint-disable-next-line vue/return-in-computed-property\n    const svgStyle = computed(() => {\n      const ROTATE_ANGLE_MAP: Record<CircleStartPosition, number> = {\n        top: 0,\n        right: 90,\n        bottom: 180,\n        left: 270,\n      }\n\n      const angleValue = ROTATE_ANGLE_MAP[props.startPosition]\n      if (angleValue) {\n        return {\n          transform: `rotate(${angleValue}deg)`,\n        }\n      }\n    })\n\n    watch(\n      () => props.rate,\n      (rate) => {\n        let rafId: number | undefined\n\n        const startTime = Date.now()\n        const startRate = props.currentRate\n        const endRate = format(rate)\n        const duration = Math.abs(((startRate - endRate) * 1000) / +props.speed)\n\n        const animate = () => {\n          const now = Date.now()\n          const progress = Math.min((now - startTime) / duration, 1)\n          const rate = progress * (endRate - startRate) + startRate\n\n          emit('update:currentRate', format(Number.parseFloat(rate.toFixed(1))))\n\n          if (endRate > startRate ? rate < endRate : rate > endRate) {\n            rafId = raf(animate)\n          }\n        }\n\n        if (props.speed) {\n          if (rafId) {\n            cancelRaf(rafId)\n          }\n          rafId = raf(animate)\n        } else {\n          emit('update:currentRate', endRate)\n        }\n      },\n      { immediate: true }\n    )\n\n    const renderHover = () => {\n      const PERIMETER = 3140\n      const { strokeWidth, currentRate, strokeLinecap } = props\n      const offset = (PERIMETER * currentRate) / 100\n      const color = isObject(props.color) ? `url(#${id})` : props.color\n\n      const style: CSSProperties = {\n        stroke: color,\n        strokeWidth: `${+strokeWidth * 10 + 1}px`,\n        strokeLinecap,\n        strokeDasharray: `${offset}px ${PERIMETER}px`,\n      }\n\n      return (\n        <path\n          d={path.value}\n          style={style}\n          class={bem('hover')}\n          stroke={color}\n        />\n      )\n    }\n\n    const renderLayer = () => {\n      const style = {\n        fill: props.fill,\n        stroke: props.layerColor,\n        strokeWidth: `${+props.strokeWidth * 10}px`,\n      }\n\n      return <path class={bem('layer')} style={style} d={path.value} />\n    }\n\n    const renderGradient = () => {\n      const { color } = props\n\n      if (!isObject(color)) {\n        return\n      }\n\n      const Stops = Object.keys(color)\n        .sort((a, b) => Number.parseFloat(a) - Number.parseFloat(b))\n        .map((key, index) => (\n          <stop key={index} offset={key} stop-color={color[key]} />\n        ))\n\n      return (\n        <defs>\n          <linearGradient id={id} x1=\"100%\" y1=\"0%\" x2=\"0%\" y2=\"0%\">\n            {Stops}\n          </linearGradient>\n        </defs>\n      )\n    }\n\n    const renderText = () => {\n      if (slots.default) {\n        return slots.default()\n      }\n      if (props.text) {\n        return <div class={bem('text')}>{props.text}</div>\n      }\n    }\n\n    return () => (\n      <div class={bem()} style={getSizeStyle(props.size)}>\n        <svg\n          viewBox={`0 0 ${viewBoxSize.value} ${viewBoxSize.value}`}\n          style={svgStyle.value}\n        >\n          {renderGradient()}\n          {renderLayer()}\n          {renderHover()}\n        </svg>\n        {renderText()}\n      </div>\n    )\n  },\n})\n"],"names":["name","bem","createNamespace","uid","format","rate","Math","min","max","getPath","clockwise","viewBoxSize","sweepFlag","circleProps","text","String","size","numericProp","fill","makeStringProp","makeNumericProp","speed","color","Object","truthProp","layerColor","currentRate","makeNumberProp","strokeWidth","strokeLinecap","startPosition","defineComponent","props","emits","setup","emit","slots","id","computed","path","value","svgStyle","ROTATE_ANGLE_MAP","top","right","bottom","left","angleValue","transform","watch","rafId","startTime","Date","now","startRate","endRate","duration","abs","animate","progress","Number","parseFloat","toFixed","raf","cancelRaf","immediate","renderHover","PERIMETER","offset","isObject","style","stroke","strokeDasharray","_createVNode","renderLayer","renderGradient","Stops","keys","sort","a","b","map","key","index","renderText","default","getSizeStyle"],"mappings":";;;;;;;;AAsBA,MAAM,CAACA,IAAAA,EAAMC,GAAG,CAAA,GAAIC,gBAAgB,QAAQ,CAAA,CAAA;AAE5C,IAAIC,GAAM,GAAA,CAAA,CAAA;AAEV,MAAMC,MAAAA,GAAUC,CAAkBC,IAAAA,KAAAA,IAAAA,CAAKC,GAAID,CAAAA,IAAAA,CAAKE,IAAI,CAACH,IAAAA,EAAM,CAAC,CAAA,EAAG,GAAG,CAAA,CAAA;AAElE,SAASI,OAAAA,CAAQC,WAAoBC,WAAqB,EAAA;AACxD,EAAMC,MAAAA,SAAAA,GAAYF,YAAY,CAAI,GAAA,CAAA,CAAA;AAClC,EAAA,OAAO,CAAKC,EAAAA,EAAAA,WAAAA,GAAc,CACxBA,CAAAA,CAAAA,EAAAA,WAAAA,GAAc,+BACcC,SAAqCA,CAAAA,yBAAAA,EAAAA,SAAAA,CAAAA,SAAAA,CAAAA,CAAAA;AACrE,CAAA;AAIO,MAAMC,WAAc,GAAA;AAAA,EACzBC,IAAMC,EAAAA,MAAAA;AAAAA,EACNC,IAAMC,EAAAA,WAAAA;AAAAA,EACNC,IAAAA,EAAMC,eAAe,MAAM,CAAA;AAAA,EAC3Bd,IAAAA,EAAMe,gBAAgB,GAAG,CAAA;AAAA,EACzBC,KAAAA,EAAOD,gBAAgB,CAAC,CAAA;AAAA,EACxBE,KAAAA,EAAO,CAACP,MAAAA,EAAQQ,MAAM,CAAA;AAAA,EACtBb,SAAWc,EAAAA,SAAAA;AAAAA,EACXC,UAAYV,EAAAA,MAAAA;AAAAA,EACZW,WAAAA,EAAaC,eAAe,CAAC,CAAA;AAAA,EAC7BC,WAAAA,EAAaR,gBAAgB,CAAC,CAAA;AAAA,EAC9BS,aAAed,EAAAA,MAAAA;AAAAA,EACfe,aAAAA,EAAeX,eAAoC,KAAK,CAAA;AAC1D,EAAA;AAIA,cAAeY,eAAgB,CAAA;AAAA,EAC7B/B,IAAAA;AAAAA,EAEAgC,KAAOnB,EAAAA,WAAAA;AAAAA,EAEPoB,KAAAA,EAAO,CAAC,oBAAoB,CAAA;AAAA,EAE5BC,MAAMF,KAAO,EAAA;AAAA,IAAEG,IAAAA;AAAAA,IAAMC,KAAAA;AAAAA,GAAS,EAAA;AAC5B,IAAA,MAAMC,KAAK,CAAclC,WAAAA,EAAAA,GAAAA,EAAAA,CAAAA,CAAAA,CAAAA;AAEzB,IAAA,MAAMQ,cAAc2B,QAAS,CAAA,MAAM,CAACN,KAAMJ,CAAAA,WAAAA,GAAc,KAAK,GAAI,CAAA,CAAA;AAEjE,IAAMW,MAAAA,IAAAA,GAAOD,SAAS,MAAM7B,OAAAA,CAAQuB,MAAMtB,SAAWC,EAAAA,WAAAA,CAAY6B,KAAK,CAAC,CAAA,CAAA;AAGvE,IAAMC,MAAAA,QAAAA,GAAWH,SAAS,MAAM;AAC9B,MAAA,MAAMI,gBAAwD,GAAA;AAAA,QAC5DC,GAAK,EAAA,CAAA;AAAA,QACLC,KAAO,EAAA,EAAA;AAAA,QACPC,MAAQ,EAAA,GAAA;AAAA,QACRC,IAAM,EAAA,GAAA;AAAA,OACR,CAAA;AAEA,MAAMC,MAAAA,UAAAA,GAAaL,iBAAiBV,KAAMF,CAAAA,aAAAA,CAAAA,CAAAA;AAC1C,MAAA,IAAIiB,UAAY,EAAA;AACd,QAAO,OAAA;AAAA,UACLC,WAAW,CAAUD,OAAAA,EAAAA,UAAAA,CAAAA,IAAAA,CAAAA;AAAAA,SACvB,CAAA;AAAA,OACF;AAAA,KACD,CAAA,CAAA;AAEDE,IACE,KAAA,CAAA,MAAMjB,KAAM3B,CAAAA,IAAAA,EACXA,CAAS,IAAA,KAAA;AACR,MAAI6C,IAAAA,KAAAA,CAAAA;AAEJ,MAAMC,MAAAA,SAAAA,GAAYC,KAAKC,GAAI,EAAA,CAAA;AAC3B,MAAA,MAAMC,YAAYtB,KAAMN,CAAAA,WAAAA,CAAAA;AACxB,MAAM6B,MAAAA,OAAAA,GAAUnD,OAAOC,IAAI,CAAA,CAAA;AAC3B,MAAMmD,MAAAA,QAAAA,GAAWlD,KAAKmD,GAAMH,CAAAA,CAAAA,SAAAA,GAAYC,WAAW,GAAQ,GAAA,CAACvB,MAAMX,KAAK,CAAA,CAAA;AAEvE,MAAA,MAAMqC,UAAUA,MAAM;AACpB,QAAML,MAAAA,GAAAA,GAAMD,KAAKC,GAAI,EAAA,CAAA;AACrB,QAAA,MAAMM,WAAWrD,IAAKC,CAAAA,GAAAA,CAAAA,CAAK8C,GAAMF,GAAAA,SAAAA,IAAaK,UAAU,CAAC,CAAA,CAAA;AACzD,QAAMnD,MAAAA,KAAAA,GAAOsD,QAAYJ,IAAAA,OAAAA,GAAUD,SAAaA,CAAAA,GAAAA,SAAAA,CAAAA;AAEhDnB,QAAK,IAAA,CAAA,oBAAA,EAAsB/B,OAAOwD,MAAOC,CAAAA,UAAAA,CAAWxD,MAAKyD,OAAQ,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA;AAErE,QAAA,IAAIP,OAAUD,GAAAA,SAAAA,GAAYjD,KAAOkD,GAAAA,OAAAA,GAAUlD,QAAOkD,OAAS,EAAA;AACzDL,UAAAA,KAAAA,GAAQa,IAAIL,OAAO,CAAA,CAAA;AAAA,SACrB;AAAA,OACF,CAAA;AAEA,MAAA,IAAI1B,MAAMX,KAAO,EAAA;AACf,QAAA,IAAI6B,KAAO,EAAA;AACTc,UAAAA,SAAAA,CAAUd,KAAK,CAAA,CAAA;AAAA,SACjB;AACAA,QAAAA,KAAAA,GAAQa,IAAIL,OAAO,CAAA,CAAA;AAAA,OACd,MAAA;AACLvB,QAAAA,IAAAA,CAAK,sBAAsBoB,OAAO,CAAA,CAAA;AAAA,OACpC;AAAA,KAEF,EAAA;AAAA,MAAEU,SAAW,EAAA,IAAA;AAAA,KACf,CAAA,CAAA;AAEA,IAAA,MAAMC,cAAcA,MAAM;AACxB,MAAA,MAAMC,SAAY,GAAA,IAAA,CAAA;AAClB,MAAM,MAAA;AAAA,QAAEvC,WAAAA;AAAAA,QAAaF,WAAAA;AAAAA,QAAaG,aAAAA;AAAAA,OAAkBG,GAAAA,KAAAA,CAAAA;AACpD,MAAMoC,MAAAA,MAAAA,GAAUD,YAAYzC,WAAe,GAAA,GAAA,CAAA;AAC3C,MAAA,MAAMJ,QAAQ+C,QAASrC,CAAAA,KAAAA,CAAMV,KAAK,CAAI,GAAA,CAAA,KAAA,EAAQe,QAAQL,KAAMV,CAAAA,KAAAA,CAAAA;AAE5D,MAAA,MAAMgD,KAAuB,GAAA;AAAA,QAC3BC,MAAQjD,EAAAA,KAAAA;AAAAA,QACRM,WAAa,EAAA,CAAA,EAAG,CAACA,WAAAA,GAAc,EAAK,GAAA,CAAA,CAAA,EAAA,CAAA;AAAA,QACpCC,aAAAA;AAAAA,QACA2C,eAAAA,EAAiB,GAAGJ,MAAYD,CAAAA,GAAAA,EAAAA,SAAAA,CAAAA,EAAAA,CAAAA;AAAAA,OAClC,CAAA;AAEA,MAAA,OAAAM,YAAA,MAAA,EAAA;AAAA,QAAA,KAEOlC,IAAKC,CAAAA,KAAAA;AAAAA,QAAK,OACN8B,EAAAA,KAAAA;AAAAA,QAAK,OAAA,EACLrE,IAAI,OAAO,CAAA;AAAA,QAAC,QACXqB,EAAAA,KAAAA;AAAAA,SAAK,IAAA,CAAA,CAAA;AAAA,KAGnB,CAAA;AAEA,IAAA,MAAMoD,cAAcA,MAAM;AACxB,MAAA,MAAMJ,KAAQ,GAAA;AAAA,QACZpD,MAAMc,KAAMd,CAAAA,IAAAA;AAAAA,QACZqD,QAAQvC,KAAMP,CAAAA,UAAAA;AAAAA,QACdG,WAAa,EAAA,CAAA,EAAG,CAACI,KAAAA,CAAMJ,WAAc,GAAA,EAAA,CAAA,EAAA,CAAA;AAAA,OACvC,CAAA;AAEA,MAAA,OAAA6C,YAAA,MAAA,EAAA;AAAA,QAAA,OAAA,EAAoBxE,IAAI,OAAO,CAAA;AAAA,QAAC,OAASqE,EAAAA,KAAAA;AAAAA,QAAK,KAAK/B,IAAKC,CAAAA,KAAAA;AAAAA,SAAK,IAAA,CAAA,CAAA;AAAA,KAC/D,CAAA;AAEA,IAAA,MAAMmC,iBAAiBA,MAAM;AAC3B,MAAM,MAAA;AAAA,QAAErD,KAAAA;AAAAA,OAAUU,GAAAA,KAAAA,CAAAA;AAElB,MAAI,IAAA,CAACqC,QAAS/C,CAAAA,KAAK,CAAG,EAAA;AACpB,QAAA,OAAA;AAAA,OACF;AAEA,MAAMsD,MAAAA,KAAAA,GAAQrD,OAAOsD,IAAKvD,CAAAA,KAAK,EAC5BwD,IAAK,CAAA,CAACC,CAAGC,EAAAA,CAAAA,KAAMpB,MAAOC,CAAAA,UAAAA,CAAWkB,CAAC,CAAInB,GAAAA,MAAAA,CAAOC,UAAWmB,CAAAA,CAAC,CAAC,CAAA,CAC1DC,IAAI,CAACC,GAAAA,EAAKC,KAAKV,KAAAA,WAAAA,CAAA,MAAA,EAAA;AAAA,QAAA,KACHU,EAAAA,KAAAA;AAAAA,QAAK,QAAUD,EAAAA,GAAAA;AAAAA,QAAG,cAAc5D,KAAM4D,CAAAA,GAAAA,CAAAA;AAAAA,OAAI,EAAA,IAAA,CACtD,CAAA,CAAA;AAEH,MAAA,OAAAT,2BAAAA,YAAA,gBAAA,EAAA;AAAA,QAAA,IAEwBpC,EAAAA,EAAAA;AAAAA,QAAE,IAAA,EAAA,MAAA;AAAA,QAAA,IAAA,EAAA,IAAA;AAAA,QAAA,IAAA,EAAA,IAAA;AAAA,QAAA,IAAA,EAAA,IAAA;AAAA,OAAA,EAAA,CACnBuC,KAAK,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAId,CAAA;AAEA,IAAA,MAAMQ,aAAaA,MAAM;AACvB,MAAA,IAAIhD,MAAMiD,OAAS,EAAA;AACjB,QAAA,OAAOjD,MAAMiD,OAAQ,EAAA,CAAA;AAAA,OACvB;AACA,MAAA,IAAIrD,MAAMlB,IAAM,EAAA;AACd,QAAA,OAAA2D,YAAA,KAAA,EAAA;AAAA,UAAA,OAAA,EAAmBxE,IAAI,MAAM,CAAA;AAAA,SAAI+B,EAAAA,CAAAA,KAAMlB,CAAAA,IAAI,CAAA,CAAA,CAAA;AAAA,OAC7C;AAAA,KACF,CAAA;AAEA,IAAO,OAAA,MAAA2D,YAAA,KAAA,EAAA;AAAA,MAAA,SACOxE,GAAI,EAAA;AAAA,MAAC,OAAA,EAASqF,YAAatD,CAAAA,KAAAA,CAAMhB,IAAI,CAAA;AAAA,KAAC,EAAA,CAAAyD,WAAAA,CAAA,KAAA,EAAA;AAAA,MAAA,SAErC,EAAA,CAAA,IAAA,EAAO9D,WAAY6B,CAAAA,KAAAA,CAAAA,CAAAA,EAAS7B,WAAY6B,CAAAA,KAAAA,CAAAA,CAAAA;AAAAA,MAAO,SACjDC,QAASD,CAAAA,KAAAA;AAAAA,KAAK,EAAA,CAEpBmC,cAAe,EAAA,EACfD,WAAY,EAAA,EACZR,WAAY,EAAC,CAAA,CAAA,EAEfkB,UAAW,EAAC,CAEhB,CAAA,CAAA;AAAA,GACH;AACF,CAAC,CAAA;;;;"}