@zyzgroup/core-vue 0.0.42 → 0.0.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/ce/style.css +1 -1
  2. package/ce/yz_custom_element.iife.js +209 -171
  3. package/ce/yz_custom_element.iife.js.map +1 -1
  4. package/ce/yz_custom_element.js +21124 -20422
  5. package/ce/yz_custom_element.js.map +1 -1
  6. package/ce/yz_custom_element.umd.cjs +209 -171
  7. package/ce/yz_custom_element.umd.cjs.map +1 -1
  8. package/dist/style.css +1 -0
  9. package/dist/zyzgroup_core_vue.iife.js +29 -1
  10. package/dist/zyzgroup_core_vue.iife.js.map +1 -1
  11. package/dist/zyzgroup_core_vue.js +11751 -122
  12. package/dist/zyzgroup_core_vue.js.map +1 -1
  13. package/dist/zyzgroup_core_vue.umd.cjs +29 -1
  14. package/dist/zyzgroup_core_vue.umd.cjs.map +1 -1
  15. package/package.json +3 -2
  16. package/types/App.vue.d.ts +0 -2
  17. package/types/components/Accordion.ce.vue.d.ts +45 -54
  18. package/types/components/Accordion.vue.d.ts +45 -54
  19. package/types/components/Button.ce.vue.d.ts +63 -61
  20. package/types/components/Button.vue.d.ts +63 -61
  21. package/types/components/Canvas.ce.vue.d.ts +11 -36
  22. package/types/components/Canvas.vue.d.ts +11 -36
  23. package/types/components/CardFlip.ce.vue.d.ts +27 -36
  24. package/types/components/CardFlip.vue.d.ts +27 -36
  25. package/types/components/Container.ce.vue.d.ts +203 -49
  26. package/types/components/Container.vue.d.ts +203 -49
  27. package/types/components/Cube.ce.vue.d.ts +58 -39
  28. package/types/components/Cube.vue.d.ts +58 -39
  29. package/types/components/Dialog.ce.vue.d.ts +82 -46
  30. package/types/components/Dialog.vue.d.ts +82 -46
  31. package/types/components/DialogLoading.ce.vue.d.ts +37 -35
  32. package/types/components/DialogLoading.vue.d.ts +37 -35
  33. package/types/components/DialogToast.ce.vue.d.ts +9 -34
  34. package/types/components/DialogToast.vue.d.ts +9 -34
  35. package/types/components/EaseGraphDisplay.ce.vue.d.ts +11 -50
  36. package/types/components/EaseGraphDisplay.vue.d.ts +11 -50
  37. package/types/components/EaseGroupGraphDisplay.ce.vue.d.ts +5 -42
  38. package/types/components/EaseGroupGraphDisplay.vue.d.ts +5 -42
  39. package/types/components/HandWritePanel.ce.vue.d.ts +4 -44
  40. package/types/components/HandWritePanel.vue.d.ts +4 -44
  41. package/types/components/Icon.ce.vue.d.ts +3 -28
  42. package/types/components/Icon.vue.d.ts +3 -28
  43. package/types/components/Image.ce.vue.d.ts +6 -38
  44. package/types/components/Image.vue.d.ts +6 -38
  45. package/types/components/ImageView.ce.vue.d.ts +7 -32
  46. package/types/components/ImageView.vue.d.ts +7 -32
  47. package/types/components/InterpolationGraphDisplay.ce.vue.d.ts +9 -39
  48. package/types/components/InterpolationGraphDisplay.vue.d.ts +9 -39
  49. package/types/components/InterpolationGroupGraphDisplay.ce.vue.d.ts +3 -34
  50. package/types/components/InterpolationGroupGraphDisplay.vue.d.ts +3 -34
  51. package/types/components/MapTianditu.ce.vue.d.ts +32 -42
  52. package/types/components/MapTianditu.vue.d.ts +32 -42
  53. package/types/components/Overlay.ce.vue.d.ts +20 -34
  54. package/types/components/Overlay.vue.d.ts +20 -34
  55. package/types/components/Page.ce.vue.d.ts +55 -48
  56. package/types/components/Page.vue.d.ts +55 -48
  57. package/types/components/PlateDisplay.ce.vue.d.ts +4 -32
  58. package/types/components/PlateDisplay.vue.d.ts +4 -32
  59. package/types/components/PlateKeyboard.ce.vue.d.ts +10 -33
  60. package/types/components/PlateKeyboard.vue.d.ts +10 -33
  61. package/types/components/PlateMobile.ce.vue.d.ts +10 -28
  62. package/types/components/PlateMobile.vue.d.ts +10 -28
  63. package/types/components/Pop.ce.vue.d.ts +150 -65
  64. package/types/components/Pop.vue.d.ts +150 -65
  65. package/types/components/Popover.ce.vue.d.ts +41 -37
  66. package/types/components/Popover.vue.d.ts +41 -37
  67. package/types/components/Routes.ce.vue.d.ts +15 -49
  68. package/types/components/Routes.vue.d.ts +15 -49
  69. package/types/components/SVG.ce.vue.d.ts +11 -33
  70. package/types/components/SVG.vue.d.ts +11 -33
  71. package/types/components/SVGAndCanvas.ce.vue.d.ts +3 -28
  72. package/types/components/SVGAndCanvas.vue.d.ts +3 -28
  73. package/types/components/Video.ce.vue.d.ts +12 -44
  74. package/types/components/Video.vue.d.ts +12 -44
  75. package/types/components/VueRouterView.ce.vue.d.ts +3 -21
  76. package/types/components/VueRouterView.vue.d.ts +3 -21
  77. package/types/components/VueSuspense.ce.vue.d.ts +6 -4
  78. package/types/components/VueSuspense.vue.d.ts +6 -4
  79. package/types/components/bg/grid/BgGrid.ce.vue.d.ts +14 -0
  80. package/types/components/bg/grid/BgGrid.vue.d.ts +14 -0
  81. package/types/components/chat/ClockFlipper.ce.vue.d.ts +4 -53
  82. package/types/components/chat/ClockFlipper.vue.d.ts +4 -53
  83. package/types/components/chat/RingIndicator.ce.vue.d.ts +3 -37
  84. package/types/components/chat/RingIndicator.vue.d.ts +3 -37
  85. package/types/components/chat/RingText.ce.vue.d.ts +3 -37
  86. package/types/components/chat/RingText.vue.d.ts +3 -37
  87. package/types/components/effect/BorderFocusText.ce.vue.d.ts +31 -50
  88. package/types/components/effect/BorderFocusText.vue.d.ts +31 -50
  89. package/types/components/effect/CSSAnimation.ce.vue.d.ts +49 -61
  90. package/types/components/effect/CSSAnimation.vue.d.ts +49 -61
  91. package/types/components/effect/CSSTransition.ce.vue.d.ts +44 -53
  92. package/types/components/effect/CSSTransition.vue.d.ts +44 -53
  93. package/types/components/effect/Circle.ce.vue.d.ts +31 -44
  94. package/types/components/effect/Circle.vue.d.ts +31 -44
  95. package/types/components/effect/Float.ce.vue.d.ts +28 -47
  96. package/types/components/effect/Float.vue.d.ts +28 -47
  97. package/types/components/effect/ImageMask.ce.vue.d.ts +27 -32
  98. package/types/components/effect/ImageMask.vue.d.ts +27 -32
  99. package/types/components/effect/LineDouble.ce.vue.d.ts +40 -53
  100. package/types/components/effect/LineDouble.vue.d.ts +40 -53
  101. package/types/components/effect/LineSingle.ce.vue.d.ts +36 -53
  102. package/types/components/effect/LineSingle.vue.d.ts +36 -53
  103. package/types/components/effect/Slide.ce.vue.d.ts +30 -47
  104. package/types/components/effect/Slide.vue.d.ts +30 -47
  105. package/types/components/effect/SlideCorner.ce.vue.d.ts +31 -44
  106. package/types/components/effect/SlideCorner.vue.d.ts +31 -44
  107. package/types/components/effect/TextBackgroundClip.ce.vue.d.ts +3 -28
  108. package/types/components/effect/TextBackgroundClip.vue.d.ts +3 -28
  109. package/types/components/effect/VueTransition.ce.vue.d.ts +30 -43
  110. package/types/components/effect/VueTransition.vue.d.ts +30 -43
  111. package/types/components/effect/VueTransitionGroupSlideToLeft.ce.vue.d.ts +9 -3
  112. package/types/components/effect/VueTransitionGroupSlideToLeft.vue.d.ts +9 -3
  113. package/types/components/effect/VueTransitionOpacity.ce.vue.d.ts +9 -3
  114. package/types/components/effect/VueTransitionOpacity.vue.d.ts +9 -3
  115. package/types/components/effect/VueTransitionSlideUp.ce.vue.d.ts +9 -3
  116. package/types/components/effect/VueTransitionSlideUp.vue.d.ts +9 -3
  117. package/types/components/form/BooleanBox.ce.vue.d.ts +44 -60
  118. package/types/components/form/BooleanBox.vue.d.ts +44 -60
  119. package/types/components/form/CheckboxGroup.ce.vue.d.ts +11 -51
  120. package/types/components/form/CheckboxGroup.vue.d.ts +11 -51
  121. package/types/components/form/ColorPicker.ce.vue.d.ts +43 -32
  122. package/types/components/form/ColorPicker.vue.d.ts +43 -32
  123. package/types/components/form/Input.ce.vue.d.ts +23 -74
  124. package/types/components/form/Input.vue.d.ts +23 -74
  125. package/types/components/form/InputFileDrop.ce.vue.d.ts +23 -29
  126. package/types/components/form/InputFileDrop.vue.d.ts +23 -29
  127. package/types/components/form/InputRange.ce.vue.d.ts +33 -55
  128. package/types/components/form/InputRange.vue.d.ts +33 -55
  129. package/types/components/form/InputRangeBox.ce.vue.d.ts +38 -51
  130. package/types/components/form/InputRangeBox.vue.d.ts +38 -51
  131. package/types/components/form/InputRangeCanvas.ce.vue.d.ts +33 -53
  132. package/types/components/form/InputRangeCanvas.vue.d.ts +33 -53
  133. package/types/components/form/PageVerticalScrollProgressBar.ce.vue.d.ts +21 -0
  134. package/types/components/form/PageVerticalScrollProgressBar.vue.d.ts +21 -0
  135. package/types/components/form/ProgressBar.ce.vue.d.ts +22 -0
  136. package/types/components/form/ProgressBar.vue.d.ts +22 -0
  137. package/types/components/form/RadioGroup.ce.vue.d.ts +11 -51
  138. package/types/components/form/RadioGroup.vue.d.ts +11 -51
  139. package/types/components/form/Select.ce.vue.d.ts +14 -52
  140. package/types/components/form/Select.vue.d.ts +14 -52
  141. package/types/components/form/SelectAbsolute.ce.vue.d.ts +16 -64
  142. package/types/components/form/SelectAbsolute.vue.d.ts +16 -64
  143. package/types/components/form/SlideLeftItem.ce.vue.d.ts +51 -0
  144. package/types/components/form/SlideLeftItem.vue.d.ts +51 -0
  145. package/types/components/form/Status.ce.vue.d.ts +3 -26
  146. package/types/components/form/Status.vue.d.ts +3 -26
  147. package/types/components/form/Switch.ce.vue.d.ts +7 -47
  148. package/types/components/form/Switch.vue.d.ts +7 -47
  149. package/types/components/form/Tabs.ce.vue.d.ts +14 -0
  150. package/types/components/form/Tabs.vue.d.ts +14 -0
  151. package/types/components/form/Text.ce.vue.d.ts +36 -0
  152. package/types/components/form/Text.vue.d.ts +36 -0
  153. package/types/components/form/ViewDocument.ce.vue.d.ts +9 -0
  154. package/types/components/form/ViewDocument.vue.d.ts +9 -0
  155. package/types/components/layout/LayoutCenter.ce.vue.d.ts +20 -30
  156. package/types/components/layout/LayoutCenter.vue.d.ts +20 -30
  157. package/types/components/layout/LayoutMobile.ce.vue.d.ts +4 -36
  158. package/types/components/layout/LayoutMobile.vue.d.ts +4 -36
  159. package/types/components/layout/LayoutPage.ce.vue.d.ts +20 -0
  160. package/types/components/layout/LayoutPage.vue.d.ts +20 -0
  161. package/types/components/loading/Loading1.ce.vue.d.ts +3 -25
  162. package/types/components/loading/Loading1.vue.d.ts +3 -25
  163. package/types/components/loading/Loading10.ce.vue.d.ts +3 -25
  164. package/types/components/loading/Loading10.vue.d.ts +3 -25
  165. package/types/components/loading/Loading11.ce.vue.d.ts +3 -28
  166. package/types/components/loading/Loading11.vue.d.ts +3 -28
  167. package/types/components/loading/Loading2.ce.vue.d.ts +3 -25
  168. package/types/components/loading/Loading2.vue.d.ts +3 -25
  169. package/types/components/loading/Loading3.ce.vue.d.ts +3 -28
  170. package/types/components/loading/Loading3.vue.d.ts +3 -28
  171. package/types/components/loading/Loading4.ce.vue.d.ts +3 -25
  172. package/types/components/loading/Loading4.vue.d.ts +3 -25
  173. package/types/components/loading/Loading5.ce.vue.d.ts +3 -25
  174. package/types/components/loading/Loading5.vue.d.ts +3 -25
  175. package/types/components/loading/Loading6.ce.vue.d.ts +3 -25
  176. package/types/components/loading/Loading6.vue.d.ts +3 -25
  177. package/types/components/loading/Loading7.ce.vue.d.ts +3 -25
  178. package/types/components/loading/Loading7.vue.d.ts +3 -25
  179. package/types/components/loading/Loading8.ce.vue.d.ts +3 -25
  180. package/types/components/loading/Loading8.vue.d.ts +3 -25
  181. package/types/components/loading/Loading9.ce.vue.d.ts +3 -25
  182. package/types/components/loading/Loading9.vue.d.ts +3 -25
  183. package/types/components/pop/PopTel.ce.vue.d.ts +10 -0
  184. package/types/components/pop/PopTel.vue.d.ts +10 -0
  185. package/types/components/svg/SVGAdd.ce.vue.d.ts +7 -0
  186. package/types/components/svg/SVGAdd.vue.d.ts +7 -0
  187. package/types/components/svg/SVGCheck.ce.vue.d.ts +3 -28
  188. package/types/components/svg/SVGCheck.vue.d.ts +3 -28
  189. package/types/components/svg/SVGCleanUp.ce.vue.d.ts +3 -28
  190. package/types/components/svg/SVGCleanUp.vue.d.ts +3 -28
  191. package/types/components/svg/SVGClose.ce.vue.d.ts +7 -0
  192. package/types/components/svg/SVGClose.vue.d.ts +7 -0
  193. package/types/components/svg/SVGDelete.ce.vue.d.ts +3 -32
  194. package/types/components/svg/SVGDelete.vue.d.ts +3 -32
  195. package/types/components/svg/SVGDown.ce.vue.d.ts +3 -29
  196. package/types/components/svg/SVGDown.vue.d.ts +3 -29
  197. package/types/components/svg/SVGElement.ce.vue.d.ts +14 -38
  198. package/types/components/svg/SVGElement.vue.d.ts +14 -38
  199. package/types/components/svg/SVGEllipse.ce.vue.d.ts +7 -0
  200. package/types/components/svg/SVGEllipse.vue.d.ts +7 -0
  201. package/types/components/svg/SVGFail.ce.vue.d.ts +3 -29
  202. package/types/components/svg/SVGFail.vue.d.ts +3 -29
  203. package/types/components/svg/SVGHome.ce.vue.d.ts +3 -29
  204. package/types/components/svg/SVGHome.vue.d.ts +3 -29
  205. package/types/components/svg/SVGLock.ce.vue.d.ts +3 -29
  206. package/types/components/svg/SVGLock.vue.d.ts +3 -29
  207. package/types/components/svg/SVGPrompt.ce.vue.d.ts +3 -29
  208. package/types/components/svg/SVGPrompt.vue.d.ts +3 -29
  209. package/types/components/svg/SVGQuestion.ce.vue.d.ts +3 -29
  210. package/types/components/svg/SVGQuestion.vue.d.ts +3 -29
  211. package/types/components/svg/SVGReturn.ce.vue.d.ts +3 -29
  212. package/types/components/svg/SVGReturn.vue.d.ts +3 -29
  213. package/types/components/svg/SVGSuccess.vue.d.ts +3 -29
  214. package/types/components/svg/SVGWaiting.ce.vue.d.ts +3 -29
  215. package/types/components/svg/SVGWaiting.vue.d.ts +3 -29
  216. package/types/components/svg/SVGWarn.ce.vue.d.ts +9 -0
  217. package/types/components/svg/SVGWarn.vue.d.ts +9 -0
  218. package/types/components/xg/Park.ce.vue.d.ts +2 -0
  219. package/types/components/xg/Park.vue.d.ts +2 -0
  220. package/types/components/xg/XG.ce.vue.d.ts +2 -0
  221. package/types/components/xg/XG.vue.d.ts +2 -0
  222. package/types/demo_vue3.vue.d.ts +22 -58
  223. package/types/globalTeleport.d.ts +6 -7
  224. package/types/hooks/pinia/counter.d.ts +13 -0
  225. package/types/hooks/useSafeArea.d.ts +1 -0
  226. package/types/hooks/useVueRouter.d.ts +5 -14
  227. package/types/hooks/useVuex/modules/root.d.ts +0 -1
  228. package/types/hooks/useVuex/useVuex.d.ts +0 -1
  229. package/types/main.d.ts +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"zyzgroup_core_vue.iife.js","sources":["../src/hooks/useVue.ts","../src/hooks/useVueEffect.ts","../src/hooks/useVueRouter.ts","../src/hooks/useVuex/useVuex.ts"],"sourcesContent":["import {\n AppContext,\n VNode,\n createVNode,\n render,\n getCurrentInstance,\n VNodeProps,\n Component,\n // ComponentPublicInstance,\n ComponentInternalInstance\n} from \"vue\";\n\nexport function getInstance(): ComponentInternalInstance | null {\n return getCurrentInstance();\n}\n\nexport interface CommonComponentProps extends VNodeProps {\n [index: string]: any;\n}\n\nexport function getVNode<T extends Component>(\n component: T,\n props?: CommonComponentProps\n): VNode {\n const vNode = createVNode(component, props);\n // const vm: ComponentPublicInstance<CommonComponentProps> | null | undefined =\n // vNode.component?.proxy;\n // if (vm) {\n // for (const prop in props) {\n // if (Reflect.has(props, prop) && !Reflect.has(vm.$props, prop)) {\n // vm[prop as keyof ComponentPublicInstance] = props[prop];\n // }\n // }\n // }\n return vNode;\n}\n\nexport function renderComponent<T extends Component>(options: {\n component: T;\n props?: CommonComponentProps;\n appContext?: AppContext;\n selfContainer: HTMLElement;\n parentContainer?: HTMLElement;\n}) {\n const vNode = getVNode(options.component, options.props);\n if (options.appContext) {\n vNode.appContext = options.appContext;\n }\n render(vNode, options.selfContainer);\n options.parentContainer?.appendChild(options.selfContainer);\n}\n\n// export interface EnhancedComponentOptions extends VNodeProps {\n// [key: string]: any;\n// }\n// export function enhanceComponent<T extends Component>(\n// component: T\n// ): (options: EnhancedComponentOptions) => VNode {\n// const container = document.createElement(\"div\");\n// return (options: EnhancedComponentOptions): VNode => {\n// const vNode = renderComponent<T>({\n// Component: component,\n// props: options,\n// selfContainer: container,\n// appContext: getCurrentInstance()?.appContext\n// });\n// const vm = vNode.component\n// ?.proxy as ComponentPublicInstance<EnhancedComponentOptions>;\n// for (const prop in options) {\n// if (Reflect.has(options, prop) && !Reflect.has(vm.$props, prop)) {\n// vm[prop as keyof ComponentPublicInstance] = options[prop];\n// }\n// }\n// return vNode;\n// };\n// }\n","import { onMounted, onUnmounted } from \"vue\";\n\nexport function useVueEffect(effect: () => () => void) {\n let remove: () => void;\n onMounted(() => {\n remove = effect();\n });\n onUnmounted(() => {\n remove?.();\n });\n}\n","import {\n // RouterLink,\n // RouterView,\n // useRouter,\n createRouter,\n createWebHistory,\n // createWebHashHistory,\n // type Router,\n type RouteRecordRaw,\n type RouteRecordNormalized,\n type RouteLocationNormalized,\n type NavigationGuardNext,\n type RouteLocationRaw\n} from \"vue-router\";\n\n// <RouterLink to=\"/\">Home</RouterLink>\n// <RouterLink to=\"/about\">About</RouterLink>\n// <RouterView />\n\n// const router: Router = useRouter();\n\nexport function useVueRouter(routes: RouteRecordRaw[]) {\n const router = createRouter({\n history: createWebHistory(import.meta.env.BASE_URL),\n routes,\n // [\n // {\n // path: \"/\",\n // redirect: \"/showcase\"\n // },\n // {\n // path: \"/\",\n // path: \"/demo/:demoid\",\n // name: \"home\",\n // component: HomeView,\n // // router level code-splitting\n // // this generates a separate chunk (About.[hash].js) for this router\n // // which is lazy-loaded when the router is visited.\n // component: () => import(\"../views/AboutView.vue\"),\n // meta: {},\n // children: [\n // { path: \"\", name: \"default\", redirect: \"/demo/sub1\" },\n // {\n // path: \"sub1\",\n // name: \"sub1\",\n // component: () => import(\"@/src/views/sub1.vue\")\n // }\n // ]\n // },\n // {\n // path: \"/:pathMatch(.*)*\",\n // name: \"404\",\n // component: Page404\n // }\n // ]\n scrollBehavior: (_to, _from, savedPosition) => {\n // 这个功能只在支持 history.pushState 的浏览器中可用\n if (savedPosition) {\n return savedPosition;\n } else {\n return { left: 0, top: 0 };\n }\n }\n });\n\n // 路由导航守卫\n router.beforeEach(\n (\n _to: RouteLocationNormalized,\n _from: RouteLocationNormalized,\n next: NavigationGuardNext\n ) => {\n // console.log(\"to:\", to.fullPath, \"from:\", from.fullPath);\n // if (to.path.indexOf(\"/about\") != -1) return \"/404\";\n // else return;\n next();\n }\n );\n\n return {\n router,\n\n push: async (location: RouteLocationRaw) => {\n await router.push(location);\n },\n\n // {\n // name: Name;\n // path: Path;\n // paramsRaw: ParamsRaw;\n // params: Params;\n // meta: Meta;\n // }\n to: function (this: any, path: string) {\n this.push({ path });\n },\n\n // 动态注册路由\n // const remove = addRoute(\"demo\", {\n // path: \"sub2\",\n // name: \"sub2\",\n // component: () => import(\"@/src/views/sub2.vue\")\n // });\n // remove();\n addRoute: (name: string, route: RouteRecordRaw): (() => void) => {\n return router.addRoute(name, route);\n },\n\n removeRoute: (name: string) => {\n router.removeRoute(name);\n },\n\n hasRoute: (name: string): boolean => {\n return router.hasRoute(name);\n },\n\n getRoutes: (): RouteRecordNormalized[] => {\n return router.getRoutes();\n },\n\n getCurrentRoute: () => {\n return {\n params: router.currentRoute.value.params,\n query: router.currentRoute.value.query\n };\n }\n };\n}\n","import { computed } from \"vue\";\nimport {\n useStore,\n createNamespacedHelpers,\n mapState,\n mapGetters,\n mapMutations,\n mapActions\n} from \"vuex\";\n\n/// STATE TYPES\nexport type VuexState = VuexRootState & {\n demo: VuexDemoState;\n};\nexport interface VuexRootState {\n count: number;\n}\nexport interface VuexDemoState {\n name: string;\n}\n/// MUTATION TYPES\nexport const INCREMENT = \"increment\";\nexport const DECREMENT = \"decrement\";\n/// ACTION TYPES\nexport const INCREMENTACTION = \"incrementAction\";\n\nexport function useVuex() {\n const store = useStore<VuexState>();\n return {\n store\n // state: store.state\n\n // ...useVuexStates([\"count\"]),\n // ...useVuexStates(\"demo\", [\"name\"]),\n\n // ...useVuexGetters({ totaln: \"totaln\" }),\n // ...useVuexGetters(\"demo\", [\"nameFormat\"]),\n\n // ...useVuexMutations({\n // [INCREMENT]: INCREMENT,\n // [DECREMENT]: DECREMENT\n // }),\n // ...useVuexMutations(\"demo\", [\"changeName\"]),\n\n // ...useVuexActions({\n // [INCREMENTACTION]: INCREMENTACTION\n // }),\n // ...useVuexActions(\"demo\", [\"changeNameAction\"])\n\n // {{ state.count }}\n // {{ state.demo.name }}\n // {{ store.getters.totalCount }}\n // {{ store.getters.totaln(2) }}\n // {{ totaln(3) }}\n // {{ store.getters[\"demo/nameFormat\"] }}\n };\n}\n\n// ...mapState([\"count\"]);\n// ...mapState({ count: state => state.count });\nexport function useVuexStates(\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexStates(\n moduleName: string,\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexStates(\n moduleName: string | Record<string, string> | string[],\n keyMaps?: Record<string, string> | string[]\n): Record<string, any> {\n let mapFn = mapState;\n if (typeof moduleName == \"string\" && moduleName.length > 0) {\n mapFn = createNamespacedHelpers(moduleName).mapState;\n } else {\n keyMaps = moduleName as Record<string, string> | string[];\n }\n return useVuexMap(keyMaps!, mapFn);\n}\n\n// ...mapGetters([\"totaln\"]);\n// ...mapGetters({ totalnAnother: \"totaln\" });\nexport function useVuexGetters(\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexGetters(\n moduleName: string,\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexGetters(\n moduleName: string | Record<string, string> | string[],\n keyMaps?: Record<string, string> | string[]\n): Record<string, any> {\n let mapFn = mapGetters;\n if (typeof moduleName == \"string\" && moduleName.length > 0) {\n mapFn = createNamespacedHelpers(moduleName).mapGetters;\n } else {\n keyMaps = moduleName as Record<string, string> | string[];\n }\n return useVuexMap(keyMaps!, mapFn);\n}\n\n// ...mapMutations([INCREMENT]);\n// ...mapMutations({ inc: INCREMENT });\nexport function useVuexMutations(\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexMutations(\n moduleName: string,\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexMutations(\n moduleName: string | Record<string, string> | string[],\n keyMaps?: Record<string, string> | string[]\n): Record<string, any> {\n let mapFn = mapMutations;\n if (typeof moduleName == \"string\" && moduleName.length > 0) {\n mapFn = createNamespacedHelpers(moduleName).mapMutations;\n } else {\n keyMaps = moduleName as Record<string, string> | string[];\n }\n if (Array.isArray(keyMaps)) {\n return mapFn(keyMaps!);\n } else {\n return mapFn(keyMaps!);\n }\n}\n\n// ...mapActions([INCREMENTACTION]);\n// ...mapActions({ inca: INCREMENTACTION });\nexport function useVuexActions(\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexActions(\n moduleName: string,\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexActions(\n moduleName: string | Record<string, string> | string[],\n keyMaps?: Record<string, string> | string[]\n): Record<string, any> {\n let mapFn = mapActions;\n if (typeof moduleName == \"string\" && moduleName.length > 0) {\n mapFn = createNamespacedHelpers(moduleName).mapActions;\n } else {\n keyMaps = moduleName as Record<string, string> | string[];\n }\n if (Array.isArray(keyMaps)) {\n return mapFn(keyMaps!);\n } else {\n return mapFn(keyMaps!);\n }\n}\n\nfunction useVuexMap(\n keys: Record<string, string> | string[],\n mapFn: any\n): Record<string, any> {\n const store = useStore();\n const maps: Record<string, any> = {};\n const mappedKeyFns = mapFn(keys);\n Object.keys(mappedKeyFns).forEach((key) => {\n const fn = mappedKeyFns[key].bind({ $store: store });\n maps[key] = computed(fn);\n });\n return maps;\n}\n"],"names":["getInstance","getCurrentInstance","getVNode","component","props","createVNode","renderComponent","options","vNode","render","useVueEffect","effect","remove","onMounted","onUnmounted","useVueRouter","routes","router","createRouter","createWebHistory","_to","_from","savedPosition","next","location","path","name","route","INCREMENT","DECREMENT","INCREMENTACTION","useVuex","useStore","useVuexStates","moduleName","keyMaps","mapFn","mapState","createNamespacedHelpers","useVuexMap","useVuexGetters","mapGetters","useVuexMutations","mapMutations","useVuexActions","mapActions","keys","store","maps","mappedKeyFns","key","fn","computed"],"mappings":"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"}
1
+ {"version":3,"file":"zyzgroup_core_vue.iife.js","sources":["../src/hooks/useVue.ts","../src/hooks/useVueEffect.ts","../../core-common/src/string.ts","../../core-common/src/object.ts","../../core-common/src/array.ts","../../core-common/src/map.ts","../../core-common/src/set.ts","../../core-common/src/number.ts","../../core-common/src/type_symbol.ts","../../core-common/src/encode.ts","../../core-common/src/datetime.ts","../../core-common/src/event_control.ts","../../core-common/src/EventBus.ts","../../core-common/src/AsyncTaskQueue.ts","../../core-common/src/fp.ts","../../core-common/src/reactive.ts","../../core-common/src/datastructure/CacheMap.ts","../../core-common/src/algorithm/Sort.ts","../../core-common/src/async.ts","../../../node_modules/.pnpm/spark-md5@3.0.2/node_modules/spark-md5/spark-md5.js","../../core-web/src/file.ts","../../core-web/src/hooks/useLocalStorage.ts","../../core-web/src/hooks/useEventListener.ts","../../core-web/src/animate/schedule.ts","../../core-web/src/animate/tween/Sequence.ts","../../core-web/src/animate/tween/Easing.ts","../../core-web/src/animate/tween/Interpolation.ts","../../core-web/src/animate/tween/Group.ts","../../core-web/src/animate/tween/mainGroup.ts","../../core-web/src/animate/tween/Tween.ts","../../core-web/src/animate/Clock.ts","../../core-web/src/animate/Timeline.ts","../../core-web/src/hooks/useVnode.ts","../../core-web/src/math/math.ts","../../core-web/src/canvas/CustomCanvasContext.ts","../../core-web/src/canvas/YZCanvasContext.ts","../../core-web/src/math/line/L.ts","../../core-web/src/math/line/Arc.ts","../../core-web/src/math/line/QuadraticBezier.ts","../../core-web/src/math/line/CubicBezier.ts","../../core-web/src/svg/line2c.ts","../../core-web/src/svg/DOMSVGUtil.ts","../../core-web/src/math/line/PathD.ts","../../core-web/src/math/Shape.ts","../../core-web/src/math/shapes/Point3D.ts","../../core-web/src/math/Quaternion.ts","../../core-web/src/math/Vector.ts","../../core-web/src/math/Matrix.ts","../../core-web/src/hooks/useStyle.ts","../../core-web/src/hooks/useAttribute.ts","../../core-web/src/position.ts","../../core-web/src/hooks/useMouse.ts","../../../node_modules/.pnpm/hammerjs@2.0.8/node_modules/hammerjs/hammer.js","../../core-web/src/hooks/useResize.ts","../../core-web/src/hooks/usePressDownMove.ts","../../core-web/src/hooks/useElementEventBus.ts","../../core-web/src/hooks/useMedia.ts","../../core-web/src/hooks/useTheme.ts","../../core-web/src/hooks/useWindow.ts","../../core-web/src/hooks/useSafeArea.ts","../../core-web/src/image/image.ts","../../core-web/src/color.ts","../../core-web/src/hooks/useObjectURL.ts","../../core-web/src/hooks/useLoadImage.ts","../../core-web/src/hooks/useClickA.ts","../../core-web/src/hooks/useClass.ts","../../core-web/src/hooks/useElement.ts","../../core-web/src/hooks/useClipboard.ts","../../core-web/src/vnode.ts","../src/components/layout/LayoutPage.vue","../src/components/form/ViewDocument.vue","../../../node_modules/.pnpm/@iconify+vue@4.3.0_vue@3.5.13_typescript@5.8.3_/node_modules/@iconify/vue/dist/iconify.mjs","../src/components/Icon.vue","../src/components/loading/Loading11.vue","../src/components/Button.vue","../src/components/xg/Footer.vue","../src/components/PlateDisplay.vue","../src/components/Container.vue","../src/components/effect/CSSAnimation.vue","../src/components/Page.vue","../src/components/Routes.vue","../src/components/Overlay.vue","../src/components/Pop.vue","../src/components/Image.vue","../src/components/ImageView.vue","../src/components/pop/PopTel.vue","../src/components/xg/Lot.vue","../src/hooks/useVueRouter.ts","../src/hooks/useVuex/useVuex.ts"],"sourcesContent":["import {\n AppContext,\n VNode,\n createVNode,\n render,\n getCurrentInstance,\n VNodeProps,\n Component,\n // ComponentPublicInstance,\n ComponentInternalInstance\n} from \"vue\";\n\nexport function getInstance(): ComponentInternalInstance | null {\n return getCurrentInstance();\n}\n\nexport interface CommonComponentProps extends VNodeProps {\n [index: string]: any;\n}\n\nexport function getVNode<T extends Component>(\n component: T,\n props?: CommonComponentProps\n): VNode {\n const vNode = createVNode(component, props);\n // const vm: ComponentPublicInstance<CommonComponentProps> | null | undefined =\n // vNode.component?.proxy;\n // if (vm) {\n // for (const prop in props) {\n // if (Reflect.has(props, prop) && !Reflect.has(vm.$props, prop)) {\n // vm[prop as keyof ComponentPublicInstance] = props[prop];\n // }\n // }\n // }\n return vNode;\n}\n\nexport function renderComponent<T extends Component>(options: {\n component: T;\n props?: CommonComponentProps;\n appContext?: AppContext;\n selfContainer: HTMLElement;\n parentContainer?: HTMLElement;\n}) {\n const vNode = getVNode(options.component, options.props);\n if (options.appContext) {\n vNode.appContext = options.appContext;\n }\n render(vNode, options.selfContainer);\n options.parentContainer?.appendChild(options.selfContainer);\n}\n\n// export interface EnhancedComponentOptions extends VNodeProps {\n// [key: string]: any;\n// }\n// export function enhanceComponent<T extends Component>(\n// component: T\n// ): (options: EnhancedComponentOptions) => VNode {\n// const container = document.createElement(\"div\");\n// return (options: EnhancedComponentOptions): VNode => {\n// const vNode = renderComponent<T>({\n// Component: component,\n// props: options,\n// selfContainer: container,\n// appContext: getCurrentInstance()?.appContext\n// });\n// const vm = vNode.component\n// ?.proxy as ComponentPublicInstance<EnhancedComponentOptions>;\n// for (const prop in options) {\n// if (Reflect.has(options, prop) && !Reflect.has(vm.$props, prop)) {\n// vm[prop as keyof ComponentPublicInstance] = options[prop];\n// }\n// }\n// return vNode;\n// };\n// }\n","import { onMounted, onUnmounted } from \"vue\";\n\nexport function useVueEffect(effect: () => () => void) {\n let remove: () => void;\n onMounted(() => {\n remove = effect();\n });\n onUnmounted(() => {\n remove?.();\n });\n}\n","/* eslint-disable no-useless-escape */\n/* eslint-disable no-control-regex */\n\nexport const getDefinedRegExpPattern = (s: string): RegExp | null => {\n let regexp = null;\n switch (s) {\n case \"any-character\":\n regexp = /[^]/;\n // regexp = /./;\n break;\n case \"bin\":\n regexp = /^(0b)?[0-1]+$/i;\n break;\n case \"oct\":\n regexp = /^(0o)?[0-7]+$/i;\n break;\n case \"hex\":\n regexp = /^(0x)?[0-9a-fA-F]+$/i;\n break;\n case \"ascii\":\n regexp = /^[\\x00-\\xFF]+$/i;\n break;\n case \"int\":\n regexp = /^[-+]?[0-9]+$/;\n break;\n case \"number\":\n regexp = /[-+]?[0-9]*\\.?[0-9]+(?:e[-+]?\\d+)?/gi;\n break;\n case \"number-single\":\n regexp = /[-+]?[0-9]*\\.?[0-9]+(?:e[-+]?\\d+)?/i;\n break;\n case \"split\":\n regexp = /\\s*,\\s*/gi;\n break;\n case \"trim\":\n regexp = /^\\s+|\\s+$/g;\n break;\n case \"regexp\":\n /**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n regexp = /[\\\\^$.*+?()[\\]{}|]/g;\n break;\n case \"regexp-flags\":\n regexp = /\\w*$/;\n break;\n case \"native-method\":\n regexp = RegExp(\n \"^\" +\n Function.prototype.toString\n .call(Object.prototype.hasOwnProperty)\n .replace(getDefinedRegExpPattern(\"regexp\")!, \"\\\\$&\")\n .replace(\n /hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\n \"$1.*?\"\n ) +\n \"$\"\n );\n break;\n case \"svg-segment\":\n regexp = /([mlhvzaqtcs])([^mlhvzaqtcs]*)/gi;\n break;\n case \"mobile-china\":\n /// https://ihateregex.io/expr/phone/\n regexp = /^\\+?[1-9]{1}[0-9]{10}$/g;\n // regexp = /^[+]?[(]?[0-9]{3}[)]?[-\\s.]?[0-9]{3}[-\\s.]?[0-9]{4,6}$/gi;\n break;\n case \"email\":\n regexp =\n /^[A-Za-z0-9_!#$%&'*+/=?`{|}~^.-]+\\@[A-Za-z0-9._-]+\\.[A-Za-z0-9]+$/gm;\n // regexp =\n // /^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$/gm;\n break;\n case \"ip\":\n regexp =\n /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n break;\n case \"url\":\n regexp = /^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$/;\n break;\n // case \"relative-url\":\n // regexp = /^([a-z]+:)?[\\\\/]/i;\n // break;\n case \"element-url\":\n regexp = /^url\\(['\"]?(.+?)['\"]?\\)$/i;\n break;\n case \"date\":\n regexp = /^\\d{4}(\\-|\\/|\\.)(\\d{1,2})(\\-|\\/|\\.)(\\d{1,2})$/;\n break;\n case \"time\":\n regexp = /^(\\d{1,2}):(\\d{1,2}):(\\d{1,2})$/;\n break;\n case \"datetime\":\n regexp =\n /^\\d{4}(\\-|\\/|\\.)(\\d{1,2})(\\-|\\/|\\.)(\\d{1,2})\\s+(\\d{1,2}):(\\d{1,2}):(\\d{1,2})$/;\n break;\n case \"base64-data\":\n regexp =\n /^\\s*data:(?:[a-z]+\\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()*+;=\\-._~:@/?%\\s]*?)\\s*$/i;\n break;\n case \"hex-color\":\n regexp = /^#([0-9A-F]{3}|[0-9A-F]{4}|[0-9A-F]{6}|[0-9A-F]{8})$/i;\n break;\n case \"color\":\n regexp =\n /^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?)%?\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?)%?\\s*\\))\\s*$/i;\n break;\n case \"whitespace\":\n regexp =\n /[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000]/g;\n break;\n case \"commaSpaces\":\n regexp =\n /[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*/;\n break;\n case \"var-name\":\n regexp = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n break;\n case \"bezier\":\n regexp = /^(?:cubic-)?bezier\\(([^,]+),([^,]+),([^,]+),([^\\)]+)\\)/;\n break;\n case \"chinese-name\":\n regexp = /^(?:[\\u4e00-\\u9fa5·]{2,16})$/;\n break;\n case \"chinese\":\n // regexp = /^[\\u4E00-\\u9FFF]+$/g;\n // regexp = /^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$/g;\n regexp = new RegExp(\n String.raw`\n [\\u{FA0E}\\u{FA0F}\\u{FA11}\\u{FA13}\\u{FA14}\\u{FA1F}\\u{FA21}\\u{FA23}\\u{FA24}\\u{FA27}-\\u{FA29}]\n |[\\u{4E00}-\\u{9FCC}]\n |[\\u{3400}-\\u{4DB5}]\n |[\\u{20000}-\\u{2A6D6}]\n |[\\u{2A700}-\\u{2B734}]\n |[\\u{2B740}-\\u{2B81D}]\n |[\\u{2B820}-\\u{2CEAF}]\n |[\\u{2CEB0}-\\u{2EBEF}]\n `.replace(/\\s+/g, \"\"),\n \"u\"\n );\n break;\n case \"mime-image\":\n regexp = /^image\\//;\n break;\n case \"mime-video\":\n regexp = /^video\\//;\n break;\n case \"mime-audio\":\n regexp = /^audio\\//;\n break;\n case \"mime-document-word\":\n regexp =\n /^application\\/(?:vnd\\.openxmlformats-officedocument\\.wordprocessingml\\.document|msword|vnd\\.ms-word\\.document\\.macroenabled\\.12|vnd\\.openxmlformats-officedocument\\.wordprocessingml\\.template|vnd\\.ms-word\\.template\\.macroenabled\\.12)$/;\n break;\n case \"mime-document-excel\":\n regexp =\n /^application\\/(?:vnd\\.openxmlformats-officedocument\\.spreadsheetml\\.sheet|vnd\\.ms-excel|vnd\\.ms-excel\\.sheet\\.macroenabled\\.12|vnd\\.openxmlformats-officedocument\\.spreadsheetml\\.template|vnd\\.ms-excel\\.template\\.macroenabled\\.12)$/;\n break;\n case \"mime-document-ppt\":\n regexp =\n /^application\\/(?:vnd\\.ms-powerpoint|vnd\\.openxmlformats-officedocument\\.presentationml\\.presentation|vnd\\.ms-powerpoint\\.presentation\\.macroenabled\\.12|vnd\\.openxmlformats-officedocument\\.presentationml\\.template|vnd\\.ms-powerpoint\\.template\\.macroenabled\\.12)$/;\n break;\n case \"mime-document-json\":\n regexp = /^application\\/json$/;\n break;\n case \"mime-document-xml\":\n regexp = /^(?:application|text)\\/(?:xml|xhtml\\+xml)$/;\n break;\n }\n return regexp;\n};\n\nexport function getRegExpFlags(regExp: RegExp): string {\n if (regExp.flags) {\n return regExp.flags;\n }\n const flags = [];\n regExp.global && flags.push(\"g\");\n regExp.ignoreCase && flags.push(\"i\");\n regExp.multiline && flags.push(\"m\");\n regExp.sticky && flags.push(\"y\");\n regExp.unicode && flags.push(\"u\");\n return flags.join(\"\");\n}\n\nexport function cloneRegExp(regExp: RegExp): RegExp {\n const result = new RegExp(regExp.source, getRegExpFlags(regExp));\n result.lastIndex = regExp.lastIndex;\n return result;\n}\n\nexport type TRegExpResult = {\n // 匹配index\n matchIndex: number;\n // 完全匹配结果\n fullMatch: string | null;\n // 分组匹配结果\n groupMatchs: string[];\n};\n\n// const re = /(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})/u;\n// \"2015-01-02\".replace(re, \"$<day>/$<month>/$<year>\"); // '02/01/2015'\n// str.replace(/(john) (smith)/i, \"$2, $1\"); // Smith, John\n// str.replace(/([a-z]+)\\(?([^)a-z]+)\\)?/gi, function (all, command, values) {\n// values = values.split(/\\s*,\\s*/);\n// }\n// function replacer(match, p1, p2, /* …, */ pN, offset, string, groups) {\n// return replacement;\n// }\n\nexport const regTest = (s: string | RegExp, source: string): boolean => {\n if (typeof s === \"string\") {\n s = getDefinedRegExpPattern(s) || new RegExp(s);\n }\n return s.test(source);\n};\n\n// -1: not found\nexport const regSearchIndex = (s: string | RegExp, source: string): number => {\n if (typeof s === \"string\") {\n s = getDefinedRegExpPattern(s) || new RegExp(s);\n }\n return source.search(s);\n};\n\nexport const regSplit = (s: string | RegExp, source: string): string[] => {\n if (typeof s === \"string\") {\n s = getDefinedRegExpPattern(s) || new RegExp(s);\n }\n return source.split(s);\n};\n\n/// - 如果 regexp 不带有 `g` 标记,则它以数组的形式返回第一个匹配项,其中包含分组和属性 `index`(匹配项的位置)、`input`(输入字符串,等于 str)\n/// - 如果 regexp 带有 `g` 标记,则它将所有匹配项的数组作为字符串返回,而不包含分组和其他详细信息\n/// - 如果没有匹配项,则无论是否带有标记 `g` ,都将返回 null\nexport const regMatch = (\n s: string | RegExp,\n source: string\n): TRegExpResult[] | TRegExpResult | null => {\n if (typeof s === \"string\") {\n s = getDefinedRegExpPattern(s) || new RegExp(s);\n }\n const matchs = source.match(s);\n if (!matchs) {\n return null;\n }\n if (s.flags.toLowerCase().indexOf(\"g\") >= 0) {\n return matchs.map(\n (m) =>\n ({\n matchIndex: -1,\n fullMatch: m,\n groupMatchs: []\n } as TRegExpResult)\n );\n }\n return {\n matchIndex: typeof matchs.index === \"number\" ? matchs.index : -1,\n fullMatch: matchs[0],\n groupMatchs: matchs.slice(1)\n } as TRegExpResult;\n};\n\n/// 返回一个包含所有匹配正则表达式的结果及分组捕获组的迭代器(iterator)\nexport const regMatchAll = (\n s: string | RegExp,\n source: string\n): TRegExpResult[] => {\n if (typeof s === \"string\") {\n s = getDefinedRegExpPattern(s) || new RegExp(s);\n }\n const results: TRegExpResult[] = [];\n const matchsArray = source.matchAll(s);\n for (const matchs of matchsArray) {\n results.push({\n matchIndex: typeof matchs.index === \"number\" ? matchs.index : -1,\n fullMatch: matchs[0],\n groupMatchs: matchs.slice(1)\n } as TRegExpResult);\n }\n return results;\n};\n\n// - 返回字符串 str 中的 regexp 匹配项,它返回一个数组,未匹配到则返回 null\n// - 如果没有 `g`,返回的第一个匹配与 `str.match(regexp)` 完全相同\n// - 如果有标记 `g`,会返回第一个匹配项,并将紧随其后的位置保存在属性`regexp.lastIndex` 中。 下一次同样的调用会从位置 `regexp.lastIndex` 开始搜索,返回下一个匹配项,并将其后的位置保存在 `regexp.lastIndex` 中\nexport const regExec = (\n s: string | RegExp,\n source: string\n): TRegExpResult[] | TRegExpResult | null => {\n if (typeof s === \"string\") {\n s = getDefinedRegExpPattern(s) || new RegExp(s);\n }\n if (s.flags.toLowerCase().indexOf(\"g\") < 0) {\n return regMatch(s, source);\n }\n const results: TRegExpResult[] = [];\n let matchs;\n while ((matchs = s.exec(source))) {\n results.push({\n matchIndex: typeof matchs.index === \"number\" ? matchs.index : -1,\n fullMatch: matchs[0],\n groupMatchs: matchs.slice(1)\n } as TRegExpResult);\n }\n return results;\n};\n\n// 正确返回字符串长度的函数, 支持UTF-16\nexport function stringLength(text: string) {\n const result = text.match(/[\\s\\S]/gu);\n return result ? result.length : 0;\n}\n\n// 获取字符串长度,支持4字节32位unicode\nexport function stringLength2(str: string) {\n return [...str].length;\n}\n\nexport function charAt(str: string, index: number): string | undefined {\n const codePoint = str.codePointAt(index);\n return !codePoint ? undefined : String.fromCodePoint(codePoint);\n}\n\n/**\n * @description 获取字符串长度,支持4字节32位unicode\n * @summary\n * UTF-8 标准规定,0xD800到0xDFFF之间的码点,不能单独使用,必须配对使用。\n * 比如,\\uD834\\uDF06是两个码点,但是必须放在一起配对使用,代表字符𝌆\n */\nexport function _getUnicodeLengthES5(str: string) {\n const length = str.length;\n let index = 0;\n let unicodeLength = 0;\n while (index < length) {\n const charCode = str.charCodeAt(index);\n if (charCode >= 0xd800 && charCode <= 0xdbff) {\n const nextCharCode = str.charCodeAt(index + 1);\n if (nextCharCode >= 0xdc00 && nextCharCode <= 0xdfff) {\n index++;\n }\n }\n unicodeLength++;\n index++;\n }\n return unicodeLength;\n}\n\n/////////////// Special RegExp //////////////////\n\n/**\n * 税号: 15/17/18/20位数字与大写字母组合\n */\nexport const isChineseTaxNo = (str: string) => {\n str = trim(str);\n if (!/^[0-9A-Z]+$/.test(str)) {\n return false;\n }\n const length = stringLength(str);\n return length == 15 || length == 17 || length == 18 || length == 20;\n};\n\n/////////////////////////////////\n\nexport function generateUUID(digit = 12): string {\n // 耗时久\n // 方法1\n // let d = new Date().getTime();\n // const uuid = \"xxxxxxxx_xxxx_xxxx_yxxx_xxxxxxxxxxxx\".replace(\n // /[xy]/g,\n // function (c) {\n // const r = (d + Math.random() * 16) % 16 | 0;\n // d = Math.floor(d / 16);\n // return (c == \"x\" ? r : (r & 0x3) | 0x8).toString(16);\n // }\n // );\n // return uuid;\n\n // 方法2\n // return \"x\".repeat(digit).replace(/[x]/g, (c) => {\n // return ((Math.random() * 16) | 0).toString(16);\n // });\n\n // 方法3\n // let id = \"\";\n // for (let i = 0; i < digit; i++) {\n // id += (Math.random() * 16).toString(16).slice(0, 1);\n // }\n // return id;\n\n // 方法4\n const chars =\n \"ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghijklmnopqrstuvwxyz0123456789\";\n const length = chars.length;\n let id = \"\";\n for (let i = 0; i < digit; i++) {\n id += chars[Math.floor(Math.random() * length)];\n }\n return id;\n}\n\nexport const randomString = () => Math.random().toString(36).slice(2);\n\nexport const randomLetter = () =>\n String.fromCharCode(\n Math.random() * (\"z\".charCodeAt(0) - \"a\".charCodeAt(0)) + \"a\".charCodeAt(0)\n );\n\n/**\n * stringReplace(\"rgb({r},{g},{b})\", { r: \"255\", g: \"255\", b: \"255\" })\n */\nexport function stringReplace(str: string, args: Record<string, string>) {\n const keys = Object.keys(args);\n for (let i = 0, length = keys.length; i < length; i++) {\n str = str.replace(new RegExp(\"{\" + keys[i] + \"}\", \"gi\"), args[keys[i]]);\n }\n return str;\n}\n\n/**\n * raw`foo${1 + 2}bar` // \"foo3bar\"\n * raw({ raw: ['foo', 'bar'] }, 1 + 2) // \"foo3bar\"\n */\nexport function raw(strings: { raw: string[] }, ...values: any[]) {\n let output = \"\";\n let index;\n for (index = 0; index < values.length; index++) {\n output += strings.raw[index] + values[index];\n }\n output += strings.raw[index] || \"\";\n return output;\n}\n\nexport function capitalize(val: string): string {\n return val.charAt(0).toUpperCase() + val.slice(1);\n // return val.replace(/(^\\w)/g, (c) => c.toUpperCase());\n}\n\nexport function lowercaseFirst(val: string): string {\n return val.replace(/(^\\w)/g, (c) => c.toLowerCase());\n}\n\n/**\n * toKebab(\"-AaaBbbCcc\") = aaa-bbb-ccc\n * toKebab(\"Content-Type\") = content-type\n */\nexport const toKebab = (value: string, glue = \"-\"): string => {\n let v = value\n .replace(new RegExp(`${glue}?([A-Z])`, \"g\"), glue + \"$1\")\n .toLowerCase();\n v = v.replace(new RegExp(`^${glue}`), \"\");\n return v;\n};\n\n/**\n * toPascal(\"aaa_bbb-ccc\") = AaaBbbCcc\n * toPascal(\"aaabbbccc\") = Aaabbbccc\n */\nexport function toPascal(val: string): string {\n return val.replace(/(^\\w|[_-]\\w)/g, (c) => c.slice(-1).toUpperCase());\n}\n\n/**\n * toCamel(\"aaa_bbb-ccc\") = aaaBbbCcc\n */\nexport function toCamel(label: string): string {\n // if (label.length === 0) return label;\n // const words = label.split(/[_-]/);\n // if (words.length === 1) {\n // return `${label.charAt(0).toLowerCase()}${label.slice(1)}`;\n // }\n // let result = words[0].toLowerCase();\n // for (let n = 1, len = words.length; n < len; n++) {\n // result +=\n // words[n].charAt(0).toUpperCase() + words[n].substring(1).toLowerCase();\n // }\n // return result;\n return lowercaseFirst(toPascal(label));\n}\n\nexport function trim(str: string) {\n return str ? str.replaceAll(/^\\s+|\\s+$/g, \"\").replaceAll(/\\r?\\n/g, \"\") : \"\";\n}\n\n// 去除特殊字符,包含空格\nexport function trimSpecial(string = \"\") {\n const pattern =\n /[`~!@#$^\\-&*()=|{}':;',\\\\\\[\\]\\.<>\\/?~!@#¥……&*()——|{}【】';:\"\"'。,、?\\s]/g;\n return string.replaceAll(pattern, \"\");\n}\n\nexport const trimScopedCSS = (css: string, replace = \"\") => {\n css = css.replaceAll(/\\[data-v-[0-9a-zA-Z]*\\]/g, replace);\n return css;\n};\n\nexport function padString(\n str: string,\n expectLength: number,\n pad = \"0\",\n dir: \"left\" | \"right\" | \"both\" = \"left\"\n) {\n const strLength = stringLength(str);\n if (expectLength > strLength) {\n const padlen = expectLength - strLength;\n let rightlen;\n let leftlen;\n switch (dir) {\n case \"left\":\n str = Array(padlen + 1).join(pad) + str;\n break;\n case \"right\":\n str = str + Array(padlen + 1).join(pad);\n break;\n default:\n rightlen = Math.ceil(padlen / 2);\n leftlen = padlen - rightlen;\n str =\n Array(leftlen + 1).join(pad) + str + Array(rightlen + 1).join(pad);\n break;\n }\n }\n return str;\n}\n\nexport const repeatString = (str: string, numberOfTimes: number) =>\n str.repeat(numberOfTimes);\n\nexport const truncateString = (string: string, length: number, gap = \"...\") => {\n return stringLength(string) < length\n ? string\n : `${string.slice(0, length - 3)}${gap}`;\n};\n\nexport const truncateStringInMiddle = (\n string: string,\n start: number,\n end: number,\n gap = \"...\"\n) => {\n const length = stringLength(string);\n return length < start || end - start >= length\n ? string\n : `${string.slice(0, start)}${gap}${string.slice(length - end)}`;\n};\n\nexport const reverseString = (str: string) => str.split(\"\").reverse().join(\"\");\n\n// 字符串是否是32位的\nexport function is32BitString(c: string) {\n const codePoint = c.codePointAt(0);\n return typeof codePoint != \"undefined\" && codePoint > 0xffff;\n}\n\nexport function utf16to8(str: string) {\n let out = \"\";\n for (let i = 0, len = str.length; i < len; i++) {\n const c = str.charCodeAt(i);\n if (c >= 0x0001 && c <= 0x007f) {\n out += str.charAt(i);\n } else if (c > 0x07ff) {\n out += String.fromCharCode(0xe0 | ((c >> 12) & 0x0f));\n out += String.fromCharCode(0x80 | ((c >> 6) & 0x3f));\n out += String.fromCharCode(0x80 | ((c >> 0) & 0x3f));\n } else {\n out += String.fromCharCode(0xc0 | ((c >> 6) & 0x1f));\n out += String.fromCharCode(0x80 | ((c >> 0) & 0x3f));\n }\n }\n return out;\n}\n\nexport function utf8to16(str: string) {\n const len = str.length;\n let out = \"\";\n let i = 0;\n let char2;\n let char3;\n while (i < len) {\n const c = str.charCodeAt(i++);\n switch (c >> 4) {\n case 0:\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n case 6:\n case 7:\n // 0xxxxxxx\n out += str.charAt(i - 1);\n break;\n case 12:\n case 13:\n // 110x xxxx 10xx xxxx\n char2 = str.charCodeAt(i++);\n out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f));\n break;\n case 14:\n // 1110 xxxx 10xx xxxx 10xx xxxx\n char2 = str.charCodeAt(i++);\n char3 = str.charCodeAt(i++);\n out += String.fromCharCode(\n ((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0)\n );\n break;\n }\n }\n return out;\n}\n\n/**\n * 计算字符串所占的内存字节数,默认使用UTF-8的编码方式计算,也可制定为UTF-16\n * UTF-8 是一种可变长度的 Unicode 编码格式,使用一至四个字节为每个字符编码\n *\n * 000000 - 00007F(128个代码) 0zzzzzzz(00-7F) 一个字节\n * 000080 - 0007FF(1920个代码) 110yyyyy(C0-DF) 10zzzzzz(80-BF) 两个字节\n * 000800 - 00D7FF\n * 00E000 - 00FFFF(61440个代码) 1110xxxx(E0-EF) 10yyyyyy 10zzzzzz 三个字节\n * 010000 - 10FFFF(1048576个代码) 11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz 四个字节\n *\n * 注: Unicode在范围 D800-DFFF 中不存在任何字符\n * http://zh.wikipedia.org/wiki/UTF-8\n *\n * UTF-16 大部分使用两个字节编码,编码超出 65535 的使用四个字节\n * 000000 - 00FFFF 两个字节\n * 010000 - 10FFFF 四个字节\n *\n * http://zh.wikipedia.org/wiki/UTF-16\n */\nexport function stringByteSize(str: string, charset = \"utf-8\") {\n charset = charset.toLowerCase();\n let total = 0;\n if (charset === \"utf-16\" || charset === \"utf16\") {\n for (let i = 0, len = str.length; i < len; i++) {\n const charCode = str.charCodeAt(i);\n if (charCode <= 0xffff) {\n total += 2;\n } else {\n total += 4;\n }\n }\n } else {\n for (let i = 0, len = str.length; i < len; i++) {\n const charCode = str.charCodeAt(i);\n if (charCode <= 0x007f) {\n total += 1;\n } else if (charCode <= 0x07ff) {\n total += 2;\n } else if (charCode <= 0xffff) {\n total += 3;\n } else {\n total += 4;\n }\n }\n }\n return total;\n}\n","// - Object.is() 严格判断两个值是否相等,与严格比较运算符(===)的行为基本一致,不同之处只有两个:一是`+0`不等于`-0`,二是`NaN`等于自身\n// - Object.assign() 浅拷贝,忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性\n// - Object.getOwnPropertyDescriptors() 返回指定对象所有自身属性(非继承属性)的描述对象\n// - Object.getOwnPropertyDescriptor(obj, 'foo')\n// - Object.setPrototypeOf(object, prototype)\n// - Object.getPrototypeOf(obj);\n// - Object.keys() 返回自身的(不含继承的)所有可遍历(enumerable)属性的键名的数组\n// - Object.values() 返回自身的(不含继承的)所有可遍历(enumerable)属性的键对应值的数组\n// - Object.entries() 返回一个对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对的数组\n// - Object.fromEntries() 用于将一个键值对数组转为对象\n\nimport { cloneRegExp } from \"./string\";\nimport { cloneArrayBuffer } from \"./buffer\";\nimport { ObjectKey } from \"./type_symbol\";\n\n// const funcProto = Function.prototype;\n// const objectProto = Object.prototype;\n// const arrayProto = Array.prototype;\n// const funcToString = Function.prototype.toString;\n// const hasOwnProperty = Object.prototype.hasOwnProperty;\n// const objectToString = Object.prototype.toString;\n\nconst UndefinedTag = \"[object Undefined]\";\nconst NullTag = \"[object Null]\";\nconst BooleanTag = \"[object Boolean]\";\nconst NumberTag = \"[object Number]\";\nconst BigIntTag = \"[object BigInt]\";\nconst StringTag = \"[object String]\";\nconst SymbolTag = \"[object Symbol]\";\n\nconst FunctionTag = \"[object Function]\";\nconst ObjectTag = \"[object Object]\";\nconst ArrayTag = \"[object Array]\";\n\nconst MapTag = \"[object Map]\";\nconst WeakMapTag = \"[object WeakMap]\";\nconst SetTag = \"[object Set]\";\nconst DateTag = \"[object Date]\";\nconst RegExpTag = \"[object RegExp]\";\nconst ErrorTag = \"[object Error]\";\nconst GeneratorFunctionTag = \"[object GeneratorFunction]\";\nconst PromiseTag = \"[object Promise]\";\nconst ArgumentsTag = \"[object Arguments]\";\n\nconst ArrayBufferTag = \"[object ArrayBuffer]\";\nconst DataViewTag = \"[object DataView]\";\nconst Float32ArrayTag = \"[object Float32Array]\";\nconst Float64ArrayTag = \"[object Float64Array]\";\nconst Int8ArrayTag = \"[object Int8Array]\";\nconst Int16ArrayTag = \"[object Int16Array]\";\nconst Int32ArrayTag = \"[object Int32Array]\";\nconst Uint8ArrayTag = \"[object Uint8Array]\";\nconst Uint8ClampedArrayTag = \"[object Uint8ClampedArray]\";\nconst Uint16ArrayTag = \"[object Uint16Array]\";\nconst Uint32ArrayTag = \"[object Uint32Array]\";\n\nconst HTMLDocumentTag = \"[object HTMLDocument]\";\nconst WindowTag = \"[object Window]\";\n\n/// 获取数据类型\nexport function getTag(v: any): string {\n return Object.prototype.toString.call(v);\n}\n\n/// instanceof 可以准确的判断复杂引用数据类型, 即判断__proto__,但是不能判断基础数据类型\nexport function _instanceof(v: any, type: any) {\n return type != null && v instanceof type;\n}\n\n/**\ntypeof 可以判断基础数据类型(null除外),但是引用数据类型中,除了 function 之外,其他的也无法判断\nUndefined \"undefined\"\nBoolean \"boolean\"\nNumber \"number\"\nBigInt \"bigint\"\nString \"string\"\nSymbol \"symbol\"\nNull \"object\"\nFunction \"function\"\narray \"object\"\n其他任何对象 \"object\"\n*/\nexport function getType(v: any) {\n const type = typeof v;\n if (type !== \"object\") {\n return type;\n }\n return getTag(v)\n .replace(/^\\[object (\\S+)\\]$/, \"$1\")\n .toLowerCase();\n}\n\nexport function isUndefined(v: any): boolean {\n return getTag(v) === UndefinedTag;\n // return v === undefined;\n}\n\nexport function isNull(v: any): boolean {\n return getTag(v) === NullTag;\n // return v === null;\n}\n\nexport function isOK(v: any): boolean {\n return v !== null && v !== undefined;\n}\n\nexport function isNotOK(v: any): boolean {\n return v === null && v === undefined;\n}\n\nexport function isBoolean(v: any): boolean {\n return getTag(v) === BooleanTag;\n}\n\nexport function isString(v: any): boolean {\n return getTag(v) === StringTag;\n // return typeof v === \"string\";\n}\n\nexport function isNumber(v: any): boolean {\n // return getTag(v) === NumberTag;\n return v === v + 0;\n // return typeof v === \"number\";\n}\n\nexport function isNumeric(v: any) {\n return !isNaN(parseFloat(v)) && isFinite(v);\n}\n\nexport function isSymbol(v: any): boolean {\n return getTag(v) === SymbolTag;\n}\n\nexport function cloneSymbol(s: symbol) {\n const symbolProto = s ? Symbol.prototype : undefined;\n const symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n return symbolValueOf ? Object(symbolValueOf.call(s)) : {};\n}\n\nexport function isPrimitive(v: any): boolean {\n const tag = getTag(v);\n return (\n tag === UndefinedTag ||\n tag === NullTag ||\n tag === BooleanTag ||\n tag === NumberTag ||\n tag === StringTag ||\n tag === SymbolTag ||\n tag === BigIntTag\n );\n}\n\nexport function isFunction(v: any): boolean {\n const tag = getTag(v);\n return tag == FunctionTag || tag == GeneratorFunctionTag;\n // return typeof v === \"function\";\n // return v instanceof Function;\n}\n\nexport function isStringableFunction(v: any): boolean {\n return isFunction(v) && Object.prototype.hasOwnProperty.call(v, \"toString\");\n}\n\nexport function isNativeFunction(v: any): boolean {\n return (\n /^function\\s+\\w*\\s*\\(\\s*\\)\\s*{\\s+\\[native code\\]\\s+}$/i.exec(\n toFunctionSource(v)\n ) != null\n );\n}\n\nexport function isNative(v: any): boolean {\n if (!isObject(v)) {\n return false;\n }\n return (\n isNativeFunction(v) ||\n /^\\[object .+?Constructor\\]$/.test(toFunctionSource(v))\n );\n}\n\nexport function isArray(v: any) {\n return getTag(v) === ArrayTag;\n // return Array.isArray(v);\n // return v instanceof Array;\n // return v.constructor === Array;\n // return Object.getPrototypeOf(v) === Array.prototype;\n}\n\n/**\n * isArrayLike([1, 2, 3]);\n * // => true\n *\n * isArrayLike(document.body.children);\n * // => true\n *\n * isArrayLike('abc');\n * // => true\n *\n * isArrayLike(noop);\n * // => false\n */\nexport function isArrayLike(v: any) {\n return (\n v != null &&\n typeof v.length == \"number\" &&\n v.length > -1 &&\n v.length % 1 == 0 &&\n v.length <= Number.MAX_SAFE_INTEGER &&\n !isFunction(v)\n );\n}\n\n/**\n * 广泛意义的 object : Object + Array + Function + 非null\n *\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * isObject({});\n * // => true\n *\n * isObject([1, 2, 3]);\n * // => true\n *\n * isObject(noop);\n * // => true\n *\n * isObject(null);\n * // => false\n */\nexport function isObject(v: any) {\n const type = typeof v;\n return !!v && (type == \"object\" || type == \"function\");\n}\n\n/// 排除 Function 的 isObject(v) : Object + Array\nexport function isObjectLike(v: any) {\n return !!v && typeof v == \"object\";\n}\n\n/// 排除 Function 和 Array 的 isObject(v) : Object\nexport function isJustObject(v: any) {\n // return getTag(v) === ObjectTag; // 不准确\n // return v === Object(v);\n return isObjectLike(v) && !isArray(v);\n}\n\n/// 普通对象\nexport function isPlainObject(v: any) {\n if (!isObjectLike(v)) {\n return false;\n }\n return Object == v.constructor;\n // let proto = v;\n // while (Object.getPrototypeOf(proto) !== null) {\n // proto = Object.getPrototypeOf(proto);\n // }\n // return Object.getPrototypeOf(v) === proto;\n}\n\nexport function isKeyable(v: any) {\n const type = typeof v;\n return type == \"string\" ||\n type == \"number\" ||\n type == \"symbol\" ||\n type == \"boolean\"\n ? v !== \"__proto__\"\n : v === null;\n}\n\nexport function isPrototype(v: any) {\n const Ctor = v && v.constructor;\n const proto =\n (typeof Ctor == \"function\" && Ctor.prototype) || Object.prototype;\n return v === proto;\n}\n\nexport const isEmptyObject = (v: any) => {\n for (const prop in v) {\n if (Object.prototype.hasOwnProperty.call(v, prop)) {\n return false;\n }\n }\n return true;\n // return v && Object.keys(v).length === 0 && v.constructor === Object;\n // return JSON.stringify(v) === \"{}\"; // JSON.stringify():只串行化对象自身的可枚举的属性\n};\n\n// https://github.com/sindresorhus/p-is-promise/blob/cda35a513bda03f977ad5cde3a079d237e82d7ef/index.js\nexport function isPromise(v: any) {\n return (\n (typeof Promise !== \"undefined\" && v instanceof Promise) ||\n (isObject(v) &&\n \"function\" === typeof v.then &&\n \"function\" === typeof v.catch)\n );\n}\n\nexport function isIterator(v: any) {\n return (\n isObject(v) && \"function\" === typeof v.next && \"function\" === typeof v.throw\n );\n}\n\nexport function isGenerator(v: any) {\n const constructor = v.constructor;\n if (!constructor) {\n return false;\n }\n if (\n \"GeneratorFunction\" === constructor.name ||\n \"GeneratorFunction\" === constructor.displayName\n ) {\n return true;\n }\n return false;\n // return isIterator(constructor.prototype);\n}\n\nexport function isIterable(v: any) {\n return v && isFunction(Symbol) ? isFunction(v[Symbol.iterator]) : isArray(v);\n}\n\n// 彻底冻结对象\nexport function freeze(obj: any) {\n Object.freeze(obj);\n Object.keys(obj).forEach((key) => {\n if (isObject(obj[key])) {\n freeze(obj[key]);\n }\n });\n}\n\nexport function shuffleObject(obj: Record<string, any>) {\n const copy = Object.entries(obj).slice(0);\n const length = copy.length;\n let index = -1;\n const lastIndex = length - 1;\n while (++index < length) {\n const randomIndex =\n index + Math.floor(Math.random() * (lastIndex - index + 1));\n const value = copy[randomIndex];\n copy[randomIndex] = copy[index];\n copy[index] = value;\n }\n return Object.fromEntries(copy);\n}\n\nexport function bindDeep(o: any, ths: any) {\n Object.entries(o).forEach(([key, value]) => {\n if (typeof value === \"function\") {\n o[key] = o[key].bind(ths);\n }\n if (typeof value === \"object\" || typeof value === \"function\") {\n bindDeep(value, ths);\n }\n });\n}\n\nexport function mergeObjectDeep(\n target: Record<ObjectKey, any>,\n source: Record<ObjectKey, any>\n) {\n if (isJustObject(target) && isJustObject(source)) {\n for (const key in source) {\n if (isJustObject(source[key])) {\n if (!target[key]) {\n Object.assign(target, { [key]: {} });\n }\n mergeObjectDeep(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n return target;\n}\n\nexport function functionMixin(\n behaviour: Record<ObjectKey, any>,\n sharedBehaviour: Record<ObjectKey, any> = {}\n) {\n const typeTag = Symbol(\"isa\");\n function mixin(clazz: (...args: any[]) => void) {\n for (const prop of Reflect.ownKeys(behaviour))\n Object.defineProperty(clazz.prototype, prop, {\n value: behaviour[prop],\n writable: true\n });\n Object.defineProperty(clazz.prototype, typeTag, { value: true });\n return clazz;\n }\n for (const prop of Reflect.ownKeys(sharedBehaviour)) {\n Object.defineProperty(mixin, prop, {\n value: sharedBehaviour[prop],\n enumerable: Object.propertyIsEnumerable.call(sharedBehaviour, prop)\n });\n }\n /// for instanceof operator\n Object.defineProperty(mixin, Symbol.hasInstance, {\n value: (instance: any) => !!instance[typeTag]\n });\n return mixin;\n}\n\n/// class xxx extends classMixin(Loggable, Serializable) { ... }\nexport function classMixin(...mixins: any[]) {\n class Mix {\n constructor() {\n for (const mixin of mixins) {\n copyOwnProperties(this, new mixin()); // 拷贝实例属性\n }\n }\n }\n for (const mixin of mixins) {\n copyOwnProperties(Mix, mixin); // 拷贝静态属性\n copyOwnProperties(Mix.prototype, mixin.prototype); // 拷贝原型属性\n }\n return Mix;\n}\n\n/// postMessage cannot serialize objects which incompatible with structured clone algorithm, like Proxy.\nexport function isCloneable(obj: any) {\n try {\n postMessage(obj, \"*\");\n } catch (error: any) {\n if (error?.code === 25) {\n return false; // DATA_CLONE_ERR\n }\n }\n return true;\n}\n\n// export function shouldBeCloneable(o: any) {\n// const type = typeof o;\n// return (\n// o?.constructor === {}.constructor ||\n// type === \"undefined\" ||\n// o === null ||\n// type === \"boolean\" ||\n// type === \"number\" ||\n// type === \"string\" ||\n// o instanceof Date ||\n// o instanceof RegExp ||\n// o instanceof Blob ||\n// o instanceof File ||\n// o instanceof FileList ||\n// o instanceof ArrayBuffer ||\n// o instanceof ImageData ||\n// o instanceof ImageBitmap ||\n// o instanceof Array ||\n// o instanceof Map ||\n// o instanceof Set\n// );\n// }\n\n// // isProxy(new Proxy({},{})) => true\n// // isProxy({}) => false\n// // isProxy(new Proxy([],{})) => true\n// // isProxy([]) => false\n// // isProxy(new Proxy(()=>{},{})) => 'maybe'\n// // isProxy(()=>{}) => 'maybe'\n// // isProxy(new Proxy(new Map(),{})) => true\n// // isProxy(new Map()) => false\n// // class A{};\n// // isProxy(new Proxy(A,{})) => 'maybe'\n// // isProxy(A) => 'maybe'\n// // isProxy(new Proxy(new A(),{})) => 'maybe'\n// // isProxy(new A())) => false\n// export function isProxy(obj: any) {\n// const _isCloneable = isCloneable(obj);\n// if (_isCloneable) {\n// return false;\n// }\n// const _shouldBeCloneable = shouldBeCloneable(obj);\n// if (!_shouldBeCloneable) {\n// return \"maybe\";\n// }\n// return _shouldBeCloneable && !_isCloneable;\n// }\n\n// 基本类型数据保存在在栈内存中\n// 引用类型数据保存在堆内存中,引用数据类型的变量是一个指向堆内存中实际对象的引用,存在栈中\n// 浅拷贝,如果属性是基本类型,拷贝的就是基本类型的值。如果属性是引用类型,拷贝的就是内存地址\n// 深拷贝开辟一个新的栈,两个对象完全相同,但是对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性\n\n// 浅拷贝\n// Object.assign(target, source)\n// 扩展运算符 { ...obj }\n// 数组的concat方法\n// 数组的slice方法\n// 不会拷贝对象的继承属性\n// 不会拷贝对象的不可枚举属性\n// 可以拷贝Symbol类型的属性\n\n// 浅拷贝\nexport function shallowClone(source: any, target?: any) {\n if (isPrimitive(source) || isFunction(source)) {\n target = source;\n } else if (isArray(source)) {\n target = [...source];\n } else {\n if (!target) {\n target = Object.create(\n Object.getPrototypeOf(source),\n Object.getOwnPropertyDescriptors(source)\n );\n } else {\n Object.setPrototypeOf(target, source);\n copyOwnProperties(target, source);\n }\n }\n return target;\n}\n\nexport function newConstructor(o: any, ...args: any[]): any {\n return new o.constructor(...args);\n}\n\n// export function fakeNew() {\n// // 创建新对象\n// const obj = Object.create(null); // const obj = {};\n// const Constructor = [].shift.call(arguments); // const Constructor = o.constructor;\n// // 将对象的 __proto__ 赋值为构造函数的 prototype 属性\n// Object.setPrototypeOf(obj, Constructor.prototype); // obj.__proto__ = Constructor.prototype;\n// // 将构造函数内部的 this 赋值为新对象\n// const result = Constructor.apply(obj, arguments);\n// // 返回新对象\n// return typeof result === \"object\" && result !== null ? result : obj;\n// }\n\n// 深拷贝\n// JSON.parse(JSON.stringify(obj))\n// 1.拷贝的对象的值中如果有 函数、undefined、symbol 这几种类型,经过JSON.stringify序列化之后的字符串中这个键值对会消失\n// 2.拷贝 Date 引用类型会变成字符串\n// 3.无法拷贝不可枚举的属性\n// 4.无法拷贝对象的原型链\n// 5.拷贝RegExp引用类型会变成空对象\n// 6.对象中含有 NaN、Infinity 以及 -Infinity ,JSON序列化的结果会变成 null\n// 7.无法拷贝对象的循环引用,即对象成环( obj[key]= obj )\n// 8. 会抛弃对象的 constructor,所有的构造函数会指向 Object\n\n// 深拷贝\n/// 注意 不要引发 reference cycles, 从而 maximum call stack size exceeded\nexport function deepClone(from: any, hash = new WeakMap()): any {\n // try {\n // /// Proxy could not be cloned\n // return structuredClone(from);\n // } catch (_) {}\n if (!isObject(from)) {\n return from;\n }\n // 解决循环引用\n if (hash.has(from)) {\n return hash.get(from);\n }\n let clone: any;\n const Ctor = from.constructor;\n if (isFunction(from)) {\n clone = from;\n // if (!from.prototype) {\n // /// 箭头函数直接返回自身\n // clone = from;\n // } else {\n // const funcString = toFunctionSource(from);\n // // 匹配 函数体\n // const bodyReg = /(?<={)(.|\\n)+(?=})/m;\n // const body = bodyReg.exec(funcString);\n // if (!body) {\n // clone = null;\n // } else {\n // // 匹配 函数参数\n // const paramArr: any[] = [];\n // const paramReg = /(?<=\\().+(?=\\)\\s+{)/;\n // const param = paramReg.exec(funcString);\n // if (param) {\n // param[0].split(\",\").forEach((p) => {\n // paramArr.push(p);\n // });\n // }\n // clone = new Function(...paramArr, body[0]);\n // }\n // }\n } else if (Ctor === Array) {\n clone = [];\n } else if (Ctor === Map) {\n clone = new Map();\n } else if (Ctor === Set) {\n clone = new Set();\n } else if (Ctor === RegExp) {\n clone = cloneRegExp(from);\n } else if (Ctor === Date) {\n clone = new Date(from.getTime());\n } else if (typeof ArrayBuffer != \"undefined\" && Ctor === ArrayBuffer) {\n clone = cloneArrayBuffer(from);\n } else if (Ctor === Promise) {\n clone = new Promise((resolve, reject) => {\n from.then(\n (value: any) => {\n resolve(deepClone(value, hash));\n },\n (err: any) => {\n reject(deepClone(err, hash));\n }\n );\n });\n } else if (Ctor === Error) {\n clone = Object.create(from);\n } else {\n clone = Object.create(\n Object.getPrototypeOf(from)\n // Object.getOwnPropertyDescriptors(from)\n );\n }\n if (from instanceof Map) {\n from.forEach((v: any, k: any) => {\n clone.set(deepClone(k, hash), deepClone(v, hash));\n });\n } else if (from instanceof Set) {\n from.forEach((v: any) => {\n clone.add(deepClone(v, hash));\n });\n } else {\n for (const prop in from) {\n try {\n // {\n // configurable?: boolean;\n // enumerable?: boolean;\n // value?: any;\n // writable?: boolean;\n // get?(): any;\n // set?(v: any): void;\n // }\n const descriptor = Object.getOwnPropertyDescriptor(from, prop);\n // if (Object.prototype.hasOwnProperty.call(from, prop)) {\n if (descriptor) {\n // if (typeof descriptor.set === \"undefined\") {\n // continue;\n // }\n clone[prop] = deepClone(from[prop], hash);\n }\n } catch (e) {\n if (e instanceof TypeError) {\n // when in strict mode, TypeError will be thrown if clone[prop] property only has a getter\n continue;\n } else if (e instanceof ReferenceError) {\n // this may happen in non strict mode\n continue;\n }\n }\n }\n }\n if (Object.getOwnPropertySymbols) {\n const symbols = Object.getOwnPropertySymbols(from);\n for (let i = 0, l = symbols.length; i < l; i++) {\n const symbol = symbols[i];\n const descriptor = Object.getOwnPropertyDescriptor(from, symbol);\n if (descriptor) {\n clone[symbol] = deepClone(from[symbol], hash);\n Object.defineProperty(clone, symbol, descriptor);\n }\n }\n }\n /// includeNonEnumerable\n // const allPropertyNames = Object.getOwnPropertyNames(from);\n // for (let i = 0, l = allPropertyNames.length; i < l; i++) {\n // const propertyName = allPropertyNames[i];\n // const descriptor = Object.getOwnPropertyDescriptor(from, propertyName);\n // if (descriptor && descriptor.enumerable) {\n // continue;\n // }\n // if (descriptor) {\n // clone[propertyName] = deepClone(from[propertyName], hash);\n // Object.defineProperty(clone, propertyName, descriptor);\n // }\n // }\n hash.set(from, clone);\n return clone;\n}\n\n// 原型式继承\n// 就是 ES5 Object.create 的模拟实现\n// 包含引用类型的属性值始终都会共享相应的值,这点跟原型链继承一样\nexport function cloneAsPrototype(o: any): object | null {\n if (o === null) {\n return null;\n }\n class F {} // const F = function () {};\n F.prototype = o;\n return new F();\n}\n\n// 最优继承方式\n// 寄生组合式继承\n// function child() { parent.call(this); ...}\nexport function inheritPrototype(\n child: (...args: any[]) => void,\n parent: (...args: any[]) => void\n) {\n child.prototype = Object.create(parent.prototype);\n child.prototype.constructor = child;\n}\n\nexport function setProtoOf(obj: any, proto: any) {\n obj.__proto__ = proto;\n return obj;\n}\n\nexport function copyOwnProperties(target: any, source: any) {\n for (const prop in source) {\n // include prototype properties\n if (\n Object.prototype.hasOwnProperty.call(source, prop)\n // && !Object.prototype.hasOwnProperty.call(target, prop)\n ) {\n target[prop] = source[prop];\n }\n }\n // for (const key of Reflect.ownKeys(source)) {\n // if (\n // key !== \"constructor\" &&\n // key !== \"prototype\" &&\n // key !== \"name\" &&\n // key !== \"displayName\"\n // ) {\n // const desc = Object.getOwnPropertyDescriptor(source, key);\n // if (desc) {\n // Object.defineProperty(target, key, desc);\n // }\n // }\n // }\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * let object = { 'a': 1 };\n * let other = { 'a': 1 };\n *\n * eq(object, object);\n * // => true\n *\n * eq(object, other);\n * // => false\n *\n * eq('a', 'a');\n * // => true\n *\n * eq('a', Object('a'));\n * // => false\n *\n * eq(NaN, NaN);\n * // => true\n */\nexport function eq(value: any, other: any) {\n return value === other || (value !== value && other !== other);\n}\n\n// 深对比\nexport function deepEqual(\n object1: Record<ObjectKey, any>,\n object2: Record<ObjectKey, any>\n) {\n if (object1 === object2) {\n return true;\n }\n const keys1 = Object.keys(object1);\n const keys2 = Object.keys(object2);\n if (keys1.length !== keys2.length) {\n return false;\n }\n for (const key of keys1) {\n const val1 = object1[key];\n const val2 = object2[key];\n const areObjects = isJustObject(val1) && isJustObject(val2);\n if (\n (areObjects && !deepEqual(val1, val2)) ||\n (!areObjects && val1 !== val2)\n ) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * 获取对象方法的时候,自动绑定this\n *\n * const logger = bindObjectThis(new Logger());\n * const { printName } = logger;\n * // printName 的 this 指向 logger\n */\nexport function bindObjectThis(target: Record<ObjectKey, any>) {\n const cache = new WeakMap();\n return new Proxy(target, {\n get(target, key) {\n const value = Reflect.get(target, key);\n if (typeof value !== \"function\") {\n return value;\n }\n if (!cache.has(value)) {\n cache.set(value, value.bind(target));\n }\n return cache.get(value);\n }\n });\n}\n\nexport function subtractObject(obj: any, subObj: any) {\n for (const k in subObj) {\n if (Object.prototype.hasOwnProperty.call(subObj, k)) {\n delete obj[k];\n }\n }\n return obj;\n}\n\nexport function filterObject(obj: any, filter: (k: any, v: any) => boolean) {\n for (const key in obj) {\n if (\n Object.prototype.hasOwnProperty.call(obj, key) &&\n !filter(key, obj[key])\n ) {\n delete obj[key];\n }\n }\n return obj;\n}\n\nexport function pick(obj: any, keys: any[]) {\n const result: any = {};\n keys.forEach((k) => {\n if (Object.prototype.hasOwnProperty.call(obj, k)) {\n result[k] = obj[k];\n }\n });\n return result;\n}\n\nexport function clearObject(obj: any) {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n delete obj[key];\n }\n }\n return obj;\n}\n\nexport function toObjectString(obj: any) {\n const properties: string[] = [];\n for (const k in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, k)) {\n properties.push(`${k}: ${obj[k]}`);\n }\n }\n return `{ ${properties.join(\", \")} }`;\n}\n\nexport function toFunctionSource(f: any): string {\n if (f != null) {\n try {\n return Function.prototype.toString.call(f);\n } catch (e) {\n ///\n }\n try {\n return f + \"\";\n } catch (e) {\n ///\n }\n }\n return \"\";\n}\n\n// 对象-字典序-拼接字符串\nexport function getSortedObjectString(\n obj: any,\n salt = \"\",\n excludes = [\"\", \"sign\", \"key\"]\n) {\n return (\n Object.keys(obj)\n .filter((key) => {\n for (let i = 0, c = excludes.length; i < c; i++) {\n if (obj[key] == excludes[i]) {\n return false;\n }\n }\n return true;\n })\n // 字典序\n .sort()\n .map((key) => `${key}=${obj[key]}`)\n .join(\"&\") + salt\n );\n}\n","// 增\n// - push() 接收任意数量的参数,并将它们添加到数组末尾,返回数组的最新长度\n// - unshift() 在数组开头添加任意多个值,然后返回新的数组长度\n// - splice() 传入三个参数,分别是开始位置,要删除元素的数量,要插入的任意多个元素,返回删除元素的数组,对原数组产生影响\n// - concat() 首先会创建一个当前数组的副本,然后再把它的参数添加到副本末尾,最后返回这个新构建的数组,不会影响原始数组\n\n// 删\n// - pop() 用于删除数组的最后一项,同时减少数组的length值,返回被删除的项\n// - shift() 用于删除数组的第一项,同时减少数组的length值,返回被删除的项\n// - splice() 传入两个参数,分别是开始位置,删除元素的数量,返回包含删除元素的数组\n// - slice() 用于创建一个包含原有数组中一个或多个元素的新数组,不会影响原始数组\n\n// 改\n// - splice() 传入三个参数,分别是开始位置,要删除元素的数量,要插入的任意多个元素,返回删除元素的数组,对原数组产生影响\n// - slice() 不改变自身\n\n// 查\n// - indexOf() 返回要查找的元素在数组中的位置,如果没找到则返回 -1\n// - includes() 返回要查找的元素在数组中的位置,找到返回true,否则false\n// - find() 返回第一个匹配的元素\n// - findIndex()\n\n// 排序\n// - reverse() 将数组元素方向反转\n// - sort() 接受一个比较函数,用于判断哪个值应该排在前面\n\n// 转换\n// - join() 接收一个参数,即字符串分隔符,返回包含所有项的字符串\n\n// 迭代\n// - some() 对数组每一项都运行传入的测试函数,如果至少有1个元素返回 true ,则这个方法返回 true\n// - every() 对数组每一项都运行传入的测试函数,如果所有元素都返回 true ,则这个方法返回 true\n// - forEach() 对数组每一项都运行传入的函数,没有返回值\n// - filter() 对数组每一项都运行传入的函数,函数返回 true的项会组成数组之后返回\n// - map() 对数组每一项都运行传入的函数,返回由每次函数调用的结果构成的数组\n// - reduce()\n// - reduceRight()\n\n// 其他\n// - copyWithin(target, start, end)\n// - fill()\n// - entries() keys() values()\n// - flat(flatNumber = 1) flatMap()\n\n// call()\n// apply()\n\n// Set\n// - size 属性\n// - add()\n// - delete()\n// - has()\n// - clear()\n// - keys():返回键名的遍历器\n// - values():返回键值的遍历器\n// - entries():返回键值对的遍历器\n// - forEach():使用回调函数遍历每个成员\n// WeakSet\n// 没有遍历操作的API\n// 没有size属性\n// 成员只能是引用类型\n// 里面的引用只要在外部消失,它在WeakSet里面的引用就会自动消失\n\n// Map\n// - size 属性\n// - set()\n// - get()\n// - has()\n// - delete()\n// - clear()\n// - keys():返回键名的遍历器\n// - values():返回键值的遍历器\n// - entries():返回所有成员的遍历器\n// - forEach():遍历 Map 的所有成员\n// WeakMap\n// 没有遍历操作的API\n// 没有clear清空方法\n// 只接受对象作为键名(null除外)\n// 里面的键名引用只要在外部消失,它在WeakMap里面的键名对象和所对应的键值对会自动消失\n// WeakMap弱引用的只是键名,而不是键值。键值依然是正常引用\n\nimport { isArray } from \"./object\";\n\nexport const createEmptyArray = (n: number) => new Array(n).fill(undefined);\n\nexport const isNotEmptyArray = (arr: any[]) =>\n Array.isArray(arr) && arr.length > 0;\n\nexport function fillArrayIterate(\n n: number,\n iteratee: (i: number) => any\n): any[] {\n const result = new Array(n);\n let index = -1;\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport function fillArray(length: number, initValue: any) {\n return Array.from({ length }, (_value, _index) => initValue);\n}\n\nexport function fill2DArray(\n rowLength: number,\n columnLength: number,\n initValue: any\n) {\n return Array.from({ length: rowLength }, () =>\n new Array(columnLength).fill(initValue)\n );\n}\n\nexport function cloneFill2DArray(arr: any[][], initValue: any) {\n if (!arr[0].length) {\n return new Error(\"Illegal, Array must be any[][]!\");\n }\n return fill2DArray(\n arr.map((r) => r.filter((v, j) => j === 0)[0]).length,\n arr[0].length,\n initValue\n );\n}\n\nexport function get2DArrayRow(arr: any[][], rowIndex: number) {\n return [...arr[rowIndex]];\n}\n\nexport function get2DArrayColumn(arr: any[][], columnIndex: number) {\n return arr.map((r) => r.filter((v, j) => j === columnIndex)[0]);\n}\n\nexport function get2DArrayRowColumn(\n arr: any[][],\n rowIndex: number,\n columnIndex: number\n) {\n return {\n row: get2DArrayRow(arr, rowIndex),\n column: get2DArrayColumn(arr, columnIndex)\n };\n}\n\nexport function arrayEach(\n array: any[],\n iteratee: (v: any, i: number, a: any[]) => boolean\n) {\n const length = array.length || 0;\n let index = -1;\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\n/// 原地交换,不用临时数组\nexport function swapArrayValue<T = number>(\n array: T[],\n aIndex: number,\n bIndex: number\n) {\n [array[aIndex], array[bIndex]] = [array[bIndex], array[aIndex]];\n}\n\nexport function popToTopInArray(arr: any[], index: number) {\n return swapArrayValue<any>(arr, 0, index);\n}\n\nexport function getMiddleValue(array: number[]): number {\n array.sort((a, b) => a - b);\n const middle = Math.floor(array.length / 2);\n return array[middle];\n}\n\n// 不改变 targetArray 的引用,更新 targetArray 的值\nexport function flushArray(targetArray: any[] = [], sourceArray: any[] = []) {\n const sourceArrayLength = targetArray.length;\n const newArrayLength = sourceArray.length;\n for (let i = 0; i < newArrayLength; i++) {\n targetArray[i] = sourceArray[i];\n }\n let deleteCount = Math.max(0, sourceArrayLength - newArrayLength);\n while (deleteCount > 0) {\n targetArray.pop();\n deleteCount--;\n }\n return targetArray;\n}\n\nexport function deleteArrayItem(arr: any[], item: any) {\n // const index = arr.indexOf(item);\n const index = arr.findIndex((s) => s === item);\n if (index >= 0) {\n arr.splice(index, 1);\n }\n return arr;\n}\n\nexport const isArrayNotEmpty = (arr: any) =>\n isArray(arr) && Object.keys(arr).length > 0;\n\nexport const isArrayEqual = (a: any[], b: any[]) =>\n a.length === b.length && a.every((v, i) => v === b[i]);\n\nfunction* flat(array: any[]): Generator<any> {\n for (const item of array) {\n if (isArray(item)) yield* flat(item);\n else yield item;\n }\n}\nexport function flattenArray(array: any[]) {\n if (!isArray(array)) return;\n return [...flat(array)];\n}\n\n// 递归\nexport function flattenArray2(arr: any[]) {\n let result: any[] = [];\n arr.forEach((v) => {\n if (isArray(v)) {\n result = result.concat(flattenArray2(v));\n } else {\n result.push(v);\n }\n });\n return result;\n}\n\nexport function flattenArray3(arr: any[]): any[] {\n return arr.reduce((prev, next) => {\n return prev.concat(isArray(next) ? flattenArray3(next) : next);\n }, []);\n}\n\nexport function flattenArray4(arr: any[]) {\n while (arr.some((item) => isArray(item))) {\n arr = [].concat(...arr);\n }\n return arr;\n}\n\nexport function flattenArray5(arr: any[]) {\n return arr.toString().split(\",\");\n}\n\nexport function flattenArray6(arr: any[]) {\n return arr.flat(Infinity);\n}\n\nexport function flattenArray7(arr: any[]) {\n let str = JSON.stringify(arr);\n str = str.replace(/(\\[|\\])/g, \"\");\n str = \"[\" + str + \"]\";\n return JSON.parse(str);\n}\n\nexport const shuffleArray = (arr: any[]) => arr.sort(() => 0.5 - Math.random());\n\n// 去重\nexport function getUniqueArray(array: any[]) {\n return [...new Set(array)];\n}\nexport function isInArray(array: any[], data: any) {\n return array.findIndex((a) => a == data) >= 0;\n}\nexport function appendUniqueArray(array: any[], ...data: any[]) {\n data.forEach((d) => {\n if (!isInArray(array, d)) {\n array.push(d);\n }\n });\n return array;\n}\n\n// 并集\nexport function getUnionArray(a: any[], b: any[]) {\n return [...new Set([...a, ...b])];\n}\nexport function getUnionSet(a: Set<any>, b: Set<any>) {\n return new Set([...a, ...b]);\n}\n\n// 交集\nexport function getIntersectArray(a: any[], b: any[]) {\n return [...new Set(a.filter((x) => b.includes(x)))];\n}\nexport function getIntersectSet(a: Set<any>, b: Set<any>) {\n return new Set([...a].filter((x) => b.has(x)));\n}\nexport function getIntersectArrayUseMap(a: any[], b: any[]) {\n const map = new Map();\n a.forEach((v) => {\n map.set(v, true);\n });\n const result: any[] = [];\n b.forEach((v) => {\n if (map.has(v)) {\n result.push(v);\n map.delete(v);\n }\n });\n return result;\n}\n\n// 差集\nexport function getDifferenceArray(a: any[], b: any[]) {\n return [...new Set(a.filter((x) => !b.includes(x)))];\n}\nexport function getDifferenceSet(a: Set<any>, b: Set<any>) {\n return new Set([...a].filter((x) => !b.has(x)));\n}\n\nexport function arrayNeedsUint32(array: number[]) {\n // assumes larger values usually on last\n for (let i = array.length - 1; i >= 0; --i) {\n if (array[i] >= 65535) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n }\n return false;\n}\n","import { Entry } from \"./entries\";\n\nlet _nativeMap;\ntry {\n _nativeMap = Map;\n} catch (_) {\n /// UNDO mock Map\n _nativeMap = function () {};\n}\nexport const nativeMap = _nativeMap;\n\nexport function mapToArray(map: Map<any, any>): Entry[] {\n const array = Array(map.size);\n map.forEach(function (v, k) {\n array.push([k, v]);\n });\n return array;\n}\n\nexport function addMapEntry(map: Map<any, any>, pair: Entry) {\n map.set(pair[0], pair[1]);\n return map;\n}\n\n/// 有 cloneFunc 代表 深拷贝\nexport function cloneMap(\n map: Map<any, any>,\n cloneFunc?: (entries: Entry[], isDeep: boolean) => Entry[]\n): Map<any, any> {\n return (\n cloneFunc ? cloneFunc(mapToArray(map), true) : mapToArray(map)\n ).reduce(addMapEntry, new Map());\n}\n","let _nativeSet;\ntry {\n _nativeSet = Set;\n} catch (_) {\n /// UNDO mock Set\n _nativeSet = function () {};\n}\nexport const nativeSet = _nativeSet;\n\nexport function setToArray(set: Set<any>): any[] {\n const array = Array(set.size);\n set.forEach((v, i) => {\n array[i] = v;\n });\n return array;\n}\n\nexport function addSetEntry(set: Set<any>, value: any) {\n // Don't return `set.add` because it's not chainable in IE 11.\n set.add(value);\n return set;\n}\n\n/// 有 cloneFunc 代表 深拷贝\nexport function cloneSet(\n set: Set<any>,\n cloneFunc?: (values: any[], isDeep: boolean) => any[]\n) {\n return (\n cloneFunc ? cloneFunc(setToArray(set), true) : setToArray(set)\n ).reduce(addSetEntry, new Set());\n}\n","import { isOK } from \"./object\";\nimport { regMatch } from \"./string\";\n\n// Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1 === 9007199254740991;\nexport const MAX_SAFE_INTEGER = 9007199254740991;\n// Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER === -9007199254740991;\nexport const MIN_SAFE_INTEGER = -9007199254740991;\n// Number.EPSILON === Math.pow(2, -52)\nexport const EPSILON = Math.pow(2, -52);\n// Number.isFinite(-Infinity); // false\n// Number.isSafeInteger(9007199254740990); // true\n// Number.isSafeInteger(9007199254740992); // false\n\nexport function isReallyNaN(num: any) {\n return typeof num === \"number\" && Number.isNaN(num);\n}\n\nexport const isEven = (num: number) => num % 2 === 0;\n\nexport const average = (...args: number[]) =>\n args.reduce((a, b) => a + b) / args.length;\n\nexport function parseNumber(value: any, defaultValue?: number): number {\n value = parseFloat(value);\n if (isReallyNaN(value)) {\n if (typeof defaultValue === \"number\") {\n return defaultValue;\n }\n // return NaN;\n throw new Error(`parseNumber(${value}) isNaN!`);\n }\n return value;\n}\n\nexport function parseRelativeNumber(\n value: any,\n relativeSize: number,\n defaultValue?: number\n): number {\n if (typeof value == \"string\") {\n value = value.trim().toLowerCase();\n if (value.indexOf(\"%\") > 0) {\n return (parseNumber(value, defaultValue) / 100) * relativeSize;\n } else if (value.indexOf(\"vw\") > 0) {\n return (parseNumber(value, defaultValue) / 100) * window.innerWidth;\n } else if (value.indexOf(\"vh\") > 0) {\n return (parseNumber(value, defaultValue) / 100) * window.innerHeight;\n } else if (value.indexOf(\"vm\") > 0) {\n return (\n (parseNumber(value, defaultValue) / 100) *\n Math.min(window.innerWidth, window.innerHeight)\n );\n } else if (value == \"top\" || value == \"left\") {\n return 0;\n } else if (value == \"center\" || value == \"middle\") {\n return relativeSize * 0.5;\n } else if (value == \"bottom\" || value == \"right\") {\n return relativeSize;\n } else {\n return parseNumber(value, defaultValue);\n }\n } else {\n return parseNumber(value, defaultValue);\n }\n}\n\n// 0.1 + 0.2 - 0.3; // 5.551115123125783e-17\n// 0.1 + 0.2 === 0.3; // 0.30000000000000004 // false\n// withinErrorMarginNumber(0.1 + 0.2, 0.3); // true\n// 1.1 + 1.3 === 2.4; // false\n// withinErrorMarginNumber(1.1 + 1.3, 2.4); // true\nexport function withinErrorMarginNumber(\n left: number,\n right: number,\n margin = Number.EPSILON * Math.pow(2, 2)\n) {\n return Math.abs(left - right) < margin;\n}\n\n/// 精确加法\nexport function add(num1: number, num2: number) {\n const num1Digits = (num1.toString().split(\".\")[1] || \"\").length;\n const num2Digits = (num2.toString().split(\".\")[1] || \"\").length;\n const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));\n return (num1 * baseNum + num2 * baseNum) / baseNum;\n}\n\nexport function clamp(x: number, min: number, max: number) {\n const realMin = Math.min(min, max);\n const realMax = Math.max(min, max);\n return x < realMin ? realMin : x > realMax ? realMax : x;\n // return Math.min(Math.max(realMin, x), realMax);\n}\n\nexport function round(source: number, digits = 0): number {\n const base = Math.pow(10, digits);\n return Math.round(base * source) / base;\n}\n\n// compute euclidean modulo of m % n\n// 计算 n % m 的欧几里德模数\n// https://en.wikipedia.org/wiki/Modulo_operation\nexport function euclideanModulo(n: number, m: number) {\n return ((n % m) + m) % m;\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nexport function lerp(x: number, y: number, t: number) {\n return (1 - t) * x + t * y;\n}\n\nexport function lerpMap(\n v: number,\n fromStart: number,\n fromEnd: number,\n toStart: number,\n toEnd: number\n) {\n return (\n toStart + (toEnd - toStart) * ((v - fromStart) / (fromEnd - fromStart))\n );\n}\n\nexport const stepNumber =\n (min: number, max: number, step: number) => (value: number) => {\n const v = clamp(value, min, max);\n if (step == 0) {\n return v;\n }\n if (max - v < step) {\n return max;\n }\n return Math.round(v / step) * step;\n };\n\n// fixedNumberString(1.12345678, 6) = '1.12346'\n// fixedNumberString(1234,3) = '1.23e+3'\nexport function fixedNumberString(num: any, precision = 12): string {\n return parseNumber(num, 0).toPrecision(precision);\n}\n\n// fixedDotNumberString(1.12345678, 6) = '1.123457'\nexport function fixedDotNumberString(num: any, precision = 12): string {\n return parseNumber(num, 0).toFixed(precision);\n}\n\n// maxDotNumber(1234,3) = 1234\n// maxDotNumber(1.12345678, 6) = 1.123457\nexport function maxDotNumber(num: any, precision = 12): number {\n return +fixedDotNumberString(num, precision);\n}\n\n// decimalNumber(11.234) = 11\nexport function decimalNumber(num: any): number {\n return maxDotNumber(num, 0);\n}\n\nexport function formatNumber(n: number, count = 4, glue = \",\") {\n const regexp = new RegExp(`\\\\d{1,${count}}(?=(\\\\d{${count}})+$)`, \"g\");\n return String(n).replace(regexp, `$&${glue}`);\n}\n\nexport function extractNumber(str: any, defaultNumber?: number) {\n const match = regMatch(\"number-single\", String(str));\n return {\n hasNumber: !!match,\n number:\n match && !Array.isArray(match) && match.fullMatch\n ? parseFloat(match.fullMatch)\n : isOK(defaultNumber)\n ? (defaultNumber as number)\n : NaN,\n prefix:\n match && !Array.isArray(match) && match.fullMatch\n ? str.substring(0, match.matchIndex)\n : \"\",\n suffix:\n match && !Array.isArray(match) && match.fullMatch\n ? str.substring(match.matchIndex + match.fullMatch.length)\n : \"\"\n };\n}\n\nexport function extractAllNumbers(str: string): number[] {\n const matches = regMatch(\"number\", str);\n return matches\n ? Array.isArray(matches)\n ? matches.map((m) => Number(m.fullMatch))\n : [Number(matches.fullMatch)]\n : [];\n}\n\n/// 输出随机 1 或 -1\nexport function randomDirection() {\n return Math.random() > 0.5 ? 1 : -1;\n}\n\n/// 生成随机数 max = Infinity\nexport function randomFloat(min = 0, max = 100): number {\n return Math.random() * (max - min) + min;\n}\n\n/// 生成随机整数 max = Infinity\nexport function randomInt(min = 0, max = 100): number {\n return Math.floor(randomFloat(min, max));\n}\n\nexport function createNextInt(start = 0) {\n return () => ++start;\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\nconst _tables = _generateTables();\nfunction _generateTables() {\n // float32 to float16 helpers\n const buffer = new ArrayBuffer(4);\n const floatView = new Float32Array(buffer);\n const uint32View = new Uint32Array(buffer);\n const baseTable = new Uint32Array(512);\n const shiftTable = new Uint32Array(512);\n for (let i = 0; i < 256; ++i) {\n const e = i - 127;\n // very small number (0, -0)\n if (e < -27) {\n baseTable[i] = 0x0000;\n baseTable[i | 0x100] = 0x8000;\n shiftTable[i] = 24;\n shiftTable[i | 0x100] = 24;\n // small number (denorm)\n } else if (e < -14) {\n baseTable[i] = 0x0400 >> (-e - 14);\n baseTable[i | 0x100] = (0x0400 >> (-e - 14)) | 0x8000;\n shiftTable[i] = -e - 1;\n shiftTable[i | 0x100] = -e - 1;\n // normal number\n } else if (e <= 15) {\n baseTable[i] = (e + 15) << 10;\n baseTable[i | 0x100] = ((e + 15) << 10) | 0x8000;\n shiftTable[i] = 13;\n shiftTable[i | 0x100] = 13;\n // large number (Infinity, -Infinity)\n } else if (e < 128) {\n baseTable[i] = 0x7c00;\n baseTable[i | 0x100] = 0xfc00;\n shiftTable[i] = 24;\n shiftTable[i | 0x100] = 24;\n // stay (NaN, Infinity, -Infinity)\n } else {\n baseTable[i] = 0x7c00;\n baseTable[i | 0x100] = 0xfc00;\n shiftTable[i] = 13;\n shiftTable[i | 0x100] = 13;\n }\n }\n // float16 to float32 helpers\n const mantissaTable = new Uint32Array(2048);\n const exponentTable = new Uint32Array(64);\n const offsetTable = new Uint32Array(64);\n for (let i = 1; i < 1024; ++i) {\n let m = i << 13; // zero pad mantissa bits\n let e = 0; // zero exponent\n // normalized\n while ((m & 0x00800000) === 0) {\n m <<= 1;\n e -= 0x00800000; // decrement exponent\n }\n m &= ~0x00800000; // clear leading 1 bit\n e += 0x38800000; // adjust bias\n mantissaTable[i] = m | e;\n }\n for (let i = 1024; i < 2048; ++i) {\n mantissaTable[i] = 0x38000000 + ((i - 1024) << 13);\n }\n for (let i = 1; i < 31; ++i) {\n exponentTable[i] = i << 23;\n }\n exponentTable[31] = 0x47800000;\n exponentTable[32] = 0x80000000;\n for (let i = 33; i < 63; ++i) {\n exponentTable[i] = 0x80000000 + ((i - 32) << 23);\n }\n exponentTable[63] = 0xc7800000;\n for (let i = 1; i < 64; ++i) {\n if (i !== 32) {\n offsetTable[i] = 1024;\n }\n }\n return {\n floatView: floatView,\n uint32View: uint32View,\n baseTable: baseTable,\n shiftTable: shiftTable,\n mantissaTable: mantissaTable,\n exponentTable: exponentTable,\n offsetTable: offsetTable\n };\n}\n\n// float32 to float16\nexport function toHalfFloat(val: number): number {\n if (Math.abs(val) > 65504) {\n console.warn(\"toHalfFloat(): Value out of range.\");\n }\n val = clamp(val, -65504, 65504);\n _tables.floatView[0] = val;\n const f = _tables.uint32View[0];\n const e = (f >> 23) & 0x1ff;\n return _tables.baseTable[e] + ((f & 0x007fffff) >> _tables.shiftTable[e]);\n}\n\n// float16 to float32\nexport function fromHalfFloat(val: number): number {\n const m = val >> 10;\n _tables.uint32View[0] =\n _tables.mantissaTable[_tables.offsetTable[m] + (val & 0x3ff)] +\n _tables.exponentTable[m];\n return _tables.floatView[0];\n}\n","const SYMBOL_NAMESPACE = \"@@zyz/\";\nexport const createSymbol = (name: string) => `${SYMBOL_NAMESPACE}${name}`;\nexport function isZYZSymbol(s: any): boolean {\n try {\n return s.indexOf(SYMBOL_NAMESPACE) === 0;\n } catch (e) {\n return false;\n }\n}\n\n/// ** Predicate **\nexport type Predicate<T = any> = (v: T) => boolean;\nexport type AsyncPredicate<T = any> = (v: T) => Promise<boolean>;\nexport type GuardPredicate<G extends T, T = any> = (v: T) => v is G;\n\n/// ** Object **\nexport type ObjectKey = string | number | symbol;\nexport type PlainObject = Record<ObjectKey, any>;\nexport type NotUndefined = object | null;\nexport interface Context<T extends object = object> {\n set<C extends T>(props: Partial<C>): void;\n get(): () => T;\n}\n\n/// ** function **\nexport type anyFn = (...args: any[]) => void | Promise<void>;\nexport type voidFn = () => void;\nexport type unaryFn<A = any, R = any> = (a: A) => R;\nexport type binaryFn<A = any, B = any, R = any> = (a: A, b: B) => R;\nexport type ternaryFn<A = any, B = any, C = any, R = any> = (\n a: A,\n b: B,\n c: C\n) => R;\nexport type variadicFn<Args extends any[] = any[], R = any> = (\n ...args: Args\n) => R;\n// 传统回调函数\nexport type Thunk<T = any> = (err: any, data?: T) => void;\nexport type Callback<T = any> = (data?: T) => void;\n// subscribe: 发布订阅模式, return unsubscribe\nexport type Subscribe<T = any> = (cb: Callback<T>) => voidFn;\n// 数据处理器\nexport interface Handler<T = any> {\n (input: T): void;\n cancel?: voidFn; // 未执行的Handler可取消\n match?: Predicate<T>; // 是否匹配该Handler\n}\n\n/// ** Iterator **\nexport type IterationResult<R = any> = {\n value: R | undefined;\n done: boolean;\n};\nexport type IteratorNext<R = any> = (value?: R) => IterationResult<R>;\nexport interface Iterator<R = any> {\n next: IteratorNext<R>;\n return?: IteratorNext<R>;\n throw?: Callback;\n}\nexport interface Iterable {\n [Symbol.iterator](): Iterator;\n}\n\n/// ** Generator **\nexport type Generator<T extends any[] = any[], R = any> = variadicFn<\n T,\n Iterator<R>\n>;\n\n/// ** Action **\nexport type ActionType = ObjectKey;\nexport interface Action {\n type: ActionType;\n payload?: any;\n}\n// 有副作用的Action\nexport interface EffectAction extends Action {\n effectId: number;\n}\nexport const isEffectAction = (v: any) => v && typeof v.effectId === \"number\";\nexport interface AnyAction extends Action {\n [extraProps: string]: any;\n}\nexport interface UnknownAction extends Action {\n [extraProps: string]: unknown;\n}\nexport type ActionCreator<A extends Action = Action> = {\n (...args: any[]): A;\n};\nexport interface StringableActionCreator<A extends Action = Action>\n extends ActionCreator<A> {\n toString(): string;\n}\n\n/// ** Redux **\n// state: 只读状态\nexport type State = PlainObject;\nexport const EMPTY_STATE: State = {};\n// action: 动作\n// dispatch: 改变state的唯一方法\nexport type Dispatch = (action: Action) => void;\n// reducer: 纯函数, dispatch 内部使用\n// 因为是纯函数,不能在 reducer 中进行异步操作\nexport type Reducer = (state: State, action: Action) => State;\nexport type Store = {\n // 单一数据源\n getState: () => State;\n dispatch: Dispatch;\n subscribe: Subscribe;\n replaceReducer: (newReducer: Reducer) => void;\n};\nexport type CreateStore = (\n reducer: Reducer,\n initState?: State,\n enhancer?: CreateStoreEnhancer\n) => Store;\n// enhancer: 装饰器模式\nexport type CreateStoreEnhancer = (oldCreateStore: CreateStore) => CreateStore;\n// 中间件\nexport type StoreMiddleware = (\n store: Pick<Store, \"getState\" | \"dispatch\">\n) => (next: Dispatch) => Dispatch;\n\n/// ** 同步任务 **\nexport type SyncTask = () => void;\n\n/// ** 异步任务 **\nexport type AsyncPromiseTaskCreator<T = any> = () => Promise<T>;\nexport const TASK_STATUS = {\n RUNNING: 1 as const,\n CANCELLED: 2 as const,\n ABORTED: 3 as const,\n DONE: 4 as const\n};\nexport type TaskStatus = Values<typeof TASK_STATUS>;\nexport interface AsyncTask<T = any> {\n status: TaskStatus;\n isRunning(): boolean;\n isCancelled(): boolean;\n isAborted(): boolean;\n isDone(): boolean;\n result(): T | undefined;\n error(): string | undefined;\n // cancel: 主动取消\n cancel(): void;\n // abort: 被动错误\n abort: (err: string) => void;\n // done: 完成\n done: (res: T) => void;\n toPromise(): Promise<T>;\n}\n/**\n AsyncTaskSet has the following semantics\n - It completes if all its forks complete\n - If it completes, the return value is the one returned by the main task\n - It cancels if any fork cancel\n - If it's cancelled, all forks are cancelled as well\n - It aborts if any uncaught error bubbles up from forks\n - If it's aborted, all forks are aborted as well\n */\nexport interface AsyncTaskSet<T = any> {\n mainTask: AsyncTask<T>;\n doneTask: AsyncTask<T>;\n addTask: (task: AsyncTask) => void;\n getTasks: () => AsyncTask[];\n cancel: () => void;\n abort: (err: string) => void;\n}\n\n/// ** HTML **\n// export type AnyElement = Element | HTMLElement | SVGElement;\nexport type AnyElement = HTMLElement | SVGElement;\nexport type AnyNode = AnyElement | ParentNode;\n\n/// ** Typescript **\nexport type Keys<T> = keyof T;\nexport type Values<T> = T[keyof T];\n// https://stackoverflow.com/a/50375286\n// https://stackoverflow.com/questions/69991802/is-there-any-way-to-extract-all-of-the-function-signatures-from-an-overloaded-ts\n\n// MIME : Multipurpose Internet Mail Extensions\n// https://developer.mozilla.org/en-US/docs/Web/HTTP/MIME_types\n// https://www.iana.org/assignments/media-types/media-types.xhtml\n// type/subtype;parameter=value\nexport const enum MIMEEnum {\n UNKNOWN = \"\",\n\n TEXT = \"text/plain\", // text/plain;charset=UTF-8\n MD = \"text/plain\", // text/markdown\n HTML = \"text/html\",\n XML_TEXT = \"text/xml\",\n CSS = \"text/css\",\n\n JPEG = \"image/jpeg\",\n PNG = \"image/png\",\n GIF = \"image/gif\",\n BMP = \"image/bmp\",\n WEBP = \"image/webp\",\n // data:image/svg+xml;charset=utf-8,${string}\n // data:image/svg+xml;base64,${string}\n SVG = \"image/svg+xml\",\n ICON = \"image/x-icon\",\n MICROSOFT_ICON = \"image/vnd.microsoft.icon\",\n // image/octet-stream\n\n MPEG = \"audio/mpeg\",\n MP3 = \"audio/mpeg\",\n MP4 = \"video/mp4\",\n OGG = \"audio/ogg\",\n WAV = \"audio/wav\",\n MIDI = \"audio/midi\",\n WEBM = \"video/webm\",\n VIDEO_OGG = \"video/ogg\",\n\n // multipart/form-data\n // multipart/byteranges\n OCTET_STREAM = \"application/octet-stream\", // binary 默认\n JAVASCRIPT = \"application/javascript\",\n ECMASCRIPT = \"application/ecmascript\",\n JSON = \"application/json\",\n XML = \"application/xml\",\n XHTML = \"application/xhtml+xml\",\n XWWW = \"application/x-www-form-urlencoded\",\n DOC = \"application/msword\",\n CSV = \"application/x-csv\",\n EXCEL = \"application/vnb.ms-excel\",\n PPT = \"application/vnb.mspowerpoint\",\n PDF = \"application/pdf\",\n ZIP = \"application/zip\",\n TGZ = \"application/x-gtar\",\n TAR_GZ = \"application/x-gzip\",\n EOT = \"appliaction/vnd.ms-fontobject\",\n TTF = \"aplication/font-sfnt\",\n PKCS12 = \"aplication/pkcs12\"\n}\n\nexport const enum EncodeEnum {\n ascii = \"ascii\",\n utf8 = \"utf8\", // utf-8\n utf16le = \"utf16le\", // 2 或 4 个字节,小字节序编码的 Unicode 字符,支持代理(U+10000至 U+10FFFF)\n ucs2 = \"ucs2\", // ucs-2, utf16le 的别名\n base64 = \"base64\",\n base64url = \"base64url\",\n latin1 = \"latin1\", // 一种把 Buffer 编码成一字节编码的字符串的方式\n binary = \"binary\", // latin1 的别名\n hex = \"hex\" // 将每个字节编码为两个十六进制字符\n}\n\nexport const enum ReadInBrowserEnum {\n text = \"text\",\n dataURL = \"dataURL\",\n binaryString = \"binaryString\",\n arraybuffer = \"arraybuffer\"\n}\n\nexport const enum AlgorithmEnum {\n md5 = \"md5\",\n sha1 = \"sha1\",\n sha256 = \"sha256\",\n sha512 = \"sha512\",\n aesgcm = \"AES-GCM\"\n}\n\nexport const enum CipherEnum {\n aes_128_cbc = \"aes-128-cbc\",\n aes_128_ecb = \"aes-128-ecb\",\n aes_192_cbc = \"aes-192-cbc\",\n ae_192_ecb = \"aes-192-ecb\",\n aes_256_cbc = \"aes-256-cbc\",\n aes_256_ecb = \"aes-256-ecb\"\n}\n\n// declare global 只能扩充现有对象的类型描述,不能增加新的顶层类型\n// declare global {\n// interface Window {\n// YZCustomElement: any\n// }\n// }\n\n/// <reference types=\"vite/client\" />\n\n// declare module \"*.svg\";\n// declare module \"*.png\";\n// declare module \"*.jpg\";\n// declare module \"*.jpeg\";\n// declare module \"*.gif\";\n// declare module \"*.bmp\";\n// declare module \"*.tiff\";\n\n// declare module \"*.md\" {\n// const value: string;\n// export default value;\n// }\n\n// declare module \"*.vue\" {\n// import { defineComponent } from \"vue\";\n// const component: ReturnType<typeof defineComponent>;\n// export default component;\n// }\n\n// declare module \"*.vue\" {\n// import { ComponentOptions } from \"vue\";\n// const componentOptions: ComponentOptions;\n// export default componentOptions;\n// }\n\n// declare module \"vuex\" {\n// export * from \"vuex/types/index.d.ts\";\n// export * from \"vuex/types/helpers.d.ts\";\n// export * from \"vuex/types/logger.d.ts\";\n// export * from \"vuex/types/vue.d.ts\";\n// }\n\ndeclare const document: Document & {\n attachEvent: any;\n createEventObject: any;\n onmousewheel: any;\n};\n","import { toArrayBuffer } from \"./buffer\";\nimport { MIMEEnum, EncodeEnum } from \"./type_symbol\";\n\n// numberToRadixString(0x89504E47, 16) = '89504e47'\n// numberToRadixString(2303741511, 16) = '89504e47'\nexport const numberToRadixString = (n: number, radix = 16): string =>\n n.toString(radix);\n\n// radixStringToNumber(\"0x89504E47\", 16) = 2303741511\n// radixStringToNumber(\"89504E47\", 16) = 2303741511\nexport const radixStringToNumber = (str: string, radix = 16): number => {\n let s = str.toLowerCase();\n const isB = s.indexOf(\"0b\") == 0;\n const isO = s.indexOf(\"0o\") == 0; // || s.indexOf(\"0\") == 0;\n const isX = s.indexOf(\"0x\") == 0;\n if (isB || isO || isX) {\n s = s.slice(2);\n }\n if (isB) {\n radix = 2;\n }\n if (isO) {\n radix = 8;\n }\n if (isX) {\n radix = 16;\n }\n const num = parseInt(s, radix);\n if (isNaN(num)) {\n throw new Error(`radixStringToNumber(${str}, ${radix}) 无法解析!`);\n }\n return num;\n};\n\n/// ****** Byte Array ******\n\nexport function getByteArrayFromArrayBuffer(data: ArrayBuffer): number[] {\n return Array.from(new Uint8Array(data));\n}\n// getByteArrayFromNumber(2303741511) = [ 137, 80, 78, 71 ]\nexport function getByteArrayFromNumber(data: number): number[] {\n const byteArray: number[] = [];\n while (data > 0) {\n const byte = data & 0xff;\n byteArray.unshift(byte);\n data = (data - byte) / 256;\n }\n return byteArray;\n}\n// getByteArrayFromHexString(\"0x89504E47\") = [ 137, 80, 78, 71 ]\n// getByteArrayFromHexString(\"89504E47\") = [ 137, 80, 78, 71 ]\nexport function getByteArrayFromHexString(data: string): number[] {\n if (data.toLowerCase().indexOf(\"0x\") == 0) {\n data = data.slice(2);\n }\n const byteArray: number[] = [];\n for (let i = 0, len = data.length; i < len; i += 2) {\n byteArray.push(radixStringToNumber(data.slice(i, i + 2), 16));\n }\n return byteArray;\n}\n// getByteArrayFromString('𠮷a') = [ 55362, 57271, 97 ]\nexport function getByteArrayFromString(data: string): number[] {\n const byteArray: number[] = [];\n for (let i = 0, c = data.length; i < c; i++) {\n const charCode = data.charCodeAt(i);\n if (charCode) {\n byteArray.push(charCode);\n }\n }\n return byteArray;\n}\nexport function getUint8ArrayFromString(data: string): Uint8Array {\n const encoder = new TextEncoder();\n return encoder.encode(data);\n}\n// getCodePointArrayFromString('𠮷a') = [ 134071, 97 ]\nexport function getCodePointArrayFromString(data: string): number[] {\n const byteArray: number[] = [];\n for (const char of data) {\n const codePoint = char.codePointAt(0);\n if (codePoint) {\n byteArray.push(codePoint);\n }\n }\n return byteArray;\n}\n\n/// ****** Array Buffer ******\n\nexport function getArrayBufferFromByteArray(byteArray: number[]): ArrayBuffer {\n return toArrayBuffer(byteArray);\n}\nexport function getArrayBufferFromNumber(data: number): ArrayBuffer {\n return toArrayBuffer(getByteArrayFromNumber(data));\n}\n// getArrayBuffer('504e47', 16)\nexport function getArrayBufferFromHexString(data: string): ArrayBuffer {\n return toArrayBuffer(getByteArrayFromHexString(data));\n}\nexport function getArrayBufferFromString(data: string): ArrayBuffer {\n return toArrayBuffer(getByteArrayFromString(data));\n}\n\n/// ****** base64 ******\n\n// encodeURIComponent()\n// encodeURI()\n\nexport function base64URLEncode(str: string): string {\n return btoa(encodeURIComponent(str))\n .replaceAll(\"+\", \"*\")\n .replaceAll(\"/\", \"-\")\n .replaceAll(\"=\", \"\");\n}\n\nexport function base64URLDecode(base64UrlStr: string): string {\n let data = base64UrlStr.replaceAll(\"*\", \"+\").replaceAll(\"-\", \"/\");\n const mod4 = data.length % 4;\n if (mod4) {\n data = data.padEnd(data.length + (4 - mod4), \"=\");\n }\n return decodeURIComponent(atob(data));\n}\n\nexport function pack(ab: ArrayBuffer): string {\n return base64URLEncode(getString(getByteArrayFromArrayBuffer(ab)));\n}\n\nexport function unpack(str: string): ArrayBuffer {\n return getArrayBufferFromString(base64URLDecode(str));\n}\n\n/// ****** 实际运用: 全部传入 byteArray: number[] 为最后类型 ******\n\n/// ****** Hex ******\n\nexport function getHexNumber(byteArray: number[]): number {\n let value = 0;\n for (let i = 0, c = byteArray.length; i < c; i++) {\n value = value * 256 + byteArray[i];\n }\n return value;\n}\n// getHexString([ 137, 80, 78, 71 ]) = '89504e47'\n// getHexString(\"89504e47\", 16) = '89504e47'\nexport function getHexString(byteArray: number[]): string {\n let str = \"\";\n for (let i = 0, c = byteArray.length; i < c; i++) {\n str += numberToRadixString(byteArray[i], 16).padStart(2, \"0\");\n }\n return str;\n}\n\n/// ****** String ******\n\n// A === \\u0041 === \\x41 === \\u{41}\n\n// \\u0000 ~ \\uFFFF\n// \\u20BB7 => \\u20BB + 7\n// \\uD842\\uDFB7 === \\u{20BB7} === 𠮷\n// \\uD83D\\uDE80 === \\u{1F680}\n\n// '\\z' === 'z' // true\n// '\\172' === 'z' // true\n// '\\x7A' === 'z' // true\n// '\\u007A' === 'z' // true\n// '\\u{7A}' === 'z' // true\n\n// JavaScript 规定有5个字符,不能在字符串里面直接使用,只能使用转义形式\n// - U+005C:反斜杠(reverse solidus)\n// - U+000D:回车(carriage return)\n// - U+2028:行分隔符(line separator)\n// - U+2029:段分隔符(paragraph separator)\n// - U+000A:换行符(line feed)\n\n// JavaScript内部,字符以UTF-16的格式储存,每个字符固定为2个字节\n// 对于那些需要4个字节储存的字符(Unicode码点大于0xFFFF的字符),JavaScript会认为它们是两个字符\n// const s = \"𠮷\";\n// s.length; //2\n// s.charAt(0); //''\n// s.charAt(1); //''\n// s.charCodeAt(0); //55362\n// s.charCodeAt(1); //57271\n// String.fromCharCode(0x20bb7); //\"ஷ\"\n\n// const s = \"𠮷a\";\n// s.codePointAt(0).toString(16); //\"20bb7\"\n// s.charCodeAt(2).toString(16); //\"61\"\n// String.fromCodePoint(0x20bb7); //\"𠮷\"\n// String.fromCodePoint(0x78, 0x1f680, 0x79) === \"x\\uD83D\\uDE80y\"; //true\n\n// 许多欧洲语言有语调符号和重音符号。为了表示它们,Unicode提供了两种方法。一种是直接提供带重音符号的字符,比如Ǒ(\\u01D1)\n// 另一种是提供合成符号(combiningcharacter),即原字符与重音符号的合成,两个字符合成一个字符,比如O(\\u004F)和ˇ(\\u030C)合成Ǒ(\\u004F\\u030C)\n// 这两种表示方法,在视觉和语义上都等价,但是JavaScript不能识别\n// \"\\u01D1\" === \"\\u004F\\u030C\"; //false\n// \"\\u01D1\".length; //1\n// \"\\u004F\\u030C\".length; //2\n// '\\u01D1'.normalize() === '\\u004F\\u030C'.normalize() //true\n// normalize方法可以接受一个参数来指定normalize的方式,参数的四个可选值如下。\n// 1. NFC,默认参数,表示“标准等价合成”(Normalization Form Canonical Composition),返回多个简单字符的合成字符。所谓“标准等价”指的是视觉和语义上的等价。\n// 2. NFD,表示“标准等价分解”(Normalization Form Canonical Decomposition),即在标准等价的前提下,返回合成字符分解的多个简单字符。\n// 3. NFKC,表示“兼容等价合成”(Normalization Form Compatibility Composition),返回合成字符。所谓“兼容等价”指的是语义上存在等价,但视觉上不等价,比如“囍”和“喜喜”。(这只是用来举例,normalize方法不能识别中文。)\n// 4. NFKD,表示“兼容等价分解”(Normalization Form Compatibility Decomposition),即在兼容等价的前提下,返回合成字符分解的多个简单字符。\n// 不过,normalize方法目前不能识别三个或三个以上字符的合成。这种情况下,还是只能使用正则表达式,通过Unicode编号区间判断。\n\n/**\n * UTF-8 是一种可变长度的 Unicode 编码格式,使用一至四个字节为每个字符编码\n *\n * 000000 - 00007F(128个代码) 0zzzzzzz(00-7F) 一个字节\n * 000080 - 0007FF(1920个代码) 110yyyyy(C0-DF) 10zzzzzz(80-BF) 两个字节\n * 000800 - 00D7FF\n * 00E000 - 00FFFF(61440个代码) 1110xxxx(E0-EF) 10yyyyyy 10zzzzzz 三个字节\n * 010000 - 10FFFF(1048576个代码) 11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz 四个字节\n *\n * 注: Unicode在范围 D800-DFFF 中不存在任何字符\n * http://zh.wikipedia.org/wiki/UTF-8\n *\n * UTF-16 大部分使用两个字节编码,编码超出 65535 的使用四个字节\n * 000000 - 00FFFF 两个字节\n * 010000 - 10FFFF 四个字节\n *\n * http://zh.wikipedia.org/wiki/UTF-16\n */\n\n// getString([\n// 0xc3, 0x8e, 0xc3, 0xb1, 0xc5, 0xa3, 0xc3, 0xa9, 0x72, 0xc3, 0xb1, 0xc3, 0xa5,\n// 0xc5, 0xa3, 0xc3, 0xae, 0xc3, 0xb6, 0xc3, 0xb1, 0xc3, 0xa5, 0xc4, 0xbc, 0xc3,\n// 0xae, 0xc5, 0xbe, 0xc3, 0xa5, 0xc5, 0xa3, 0xc3, 0xae, 0xe1, 0xbb, 0x9d, 0xc3,\n// 0xb1\n// ]) = \"Îñţérñåţîöñåļîžåţîờñ\"\n// getString('𠮷a') = '𠮷a'\n// getString([ 134071, 97 ]) = '𠮷a'\n// getString(\"89504e47\", 16) = '‰PNG'\n// getString(getArrayBuffer('504e47', 16)) = \"PNG\"\nexport function getString(byteArray: number[]) {\n return String.fromCodePoint.apply(null, byteArray);\n}\nexport function getStringFromArrayBuffer(buffer: ArrayBuffer) {\n return String.fromCharCode.apply(\n null,\n new Uint16Array(buffer) as unknown as number[]\n );\n}\nexport function getStringFromArrayBuffer2(\n byteArray: ArrayBufferView | ArrayBuffer,\n encode = EncodeEnum.utf8\n): string {\n const decoder = new TextDecoder(encode);\n return decoder.decode(byteArray);\n}\n// getString(getArrayBuffer(getStringFromBase64('UE5H'))) = \"PNG\"\nexport function getStringFromBase64(data: string) {\n return atob(data);\n}\n\n/// ****** Blob ******\n\n// [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"]\n\nexport const toBlob = (\n data: ArrayBufferView | ArrayBuffer | Blob | string,\n mime?: MIMEEnum,\n encode?: EncodeEnum // utf-8 base64\n) => {\n if (mime) {\n if (encode === EncodeEnum.base64) {\n // data:image/svg+xml;base64,${string}\n return new Blob([data], { type: `${mime};${encode}` });\n } else if (encode === EncodeEnum.utf8) {\n // data:image/svg+xml;charset=utf-8,${string}\n return new Blob([data], {\n type: `${mime};charset=${encode}`\n });\n } else {\n // data:image/svg+xml;${string}\n return new Blob([data], {\n type: `${mime}`\n });\n }\n } else {\n return new Blob([data]);\n }\n};\n\n/// ****** File ******\n\n// 根据buffer中的文件头信息判断文件类型\nexport const getFileTypeFromArrayBuffer = (buffer: ArrayBuffer) => {\n let fileType = MIMEEnum.UNKNOWN;\n const view = new DataView(buffer);\n const first4Byte = view.getUint32(0, isLittleEndian());\n const hexValue = first4Byte.toString(16).toUpperCase();\n switch (hexValue) {\n case \"FFD8FFDB\":\n // jpg\n fileType = MIMEEnum.JPEG;\n break;\n case \"FFD8FFE0\":\n case \"FFD8FFE1\":\n case \"FFD8FFE2\":\n case \"FFD8FFE3\":\n // jpeg\n fileType = MIMEEnum.JPEG;\n break;\n case \"89504E47\":\n fileType = MIMEEnum.PNG;\n break;\n case \"47494638\":\n fileType = MIMEEnum.GIF;\n break;\n case \"52494646\":\n fileType = MIMEEnum.WEBP;\n break;\n case \"25504446\":\n fileType = MIMEEnum.PDF;\n break;\n case \"504B0304\":\n fileType = MIMEEnum.ZIP;\n break;\n default:\n break;\n }\n return fileType;\n};\n\n/// ****** other ******\n\nclass InvalidCharacterError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nconst chars =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\n// encoder\n// [https://gist.github.com/999166] by [https://github.com/nignag]\nexport function btoa(input: string) {\n const str = String(input);\n let output = \"\";\n for (\n // initialize result and counter\n let block = 0, charCode, idx = 0, map = chars;\n // if the next str index does not exist:\n // change the mapping table to \"=\"\n // check if d has no fractional digits\n str.charAt(idx | 0) || ((map = \"=\"), idx % 1);\n // \"8 - idx % 1 * 8\" generates the sequence 2, 4, 6, 8\n output += map.charAt(63 & (block >> (8 - (idx % 1) * 8)))\n ) {\n charCode = str.charCodeAt((idx += 3 / 4));\n if (charCode > 0xff) {\n throw new InvalidCharacterError(\n \"'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.\"\n );\n }\n block = (block << 8) | charCode;\n }\n return output;\n}\n\n// decoder\n// [https://gist.github.com/1020396] by [https://github.com/atk]\nexport function atob(input: string) {\n const str = String(input).replace(/[=]+$/, \"\"); // #31: ExtendScript bad parse of /=\n if (str.length % 4 === 1) {\n throw new InvalidCharacterError(\n \"'atob' failed: The string to be decoded is not correctly encoded.\"\n );\n }\n let output = \"\";\n for (\n // initialize result and counters\n let bc = 0, bs = 0, buffer, idx = 0;\n // get next character\n (buffer = str.charAt(idx++)); // eslint-disable-line no-cond-assign\n // character found in table? initialize bit storage and add its ascii value;\n ~buffer &&\n ((bs = bc % 4 ? bs * 64 + buffer : buffer),\n // and if not first of each 4 characters,\n // convert the first 8 bits to one ascii character\n bc++ % 4)\n ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n : 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer);\n }\n return output;\n}\n\n/// 判断当前视图是小端字节序,还是大端字节序\nexport function isLittleEndian() {\n const arr32 = Uint32Array.of(0x12345678);\n const arr8 = new Uint8Array(arr32.buffer);\n switch (arr8[0] * 0x1000000 + arr8[1] * 0x10000 + arr8[2] * 0x100 + arr8[3]) {\n case 0x12345678:\n // BIG_ENDIAN\n return false;\n case 0x78563412:\n // LITTLE_ENDIAN\n return true;\n }\n}\n\nexport function getUint64(\n dataview: DataView,\n byteOffset: number,\n littleEndian = isLittleEndian()\n) {\n // split 64-bit number into two 32-bit (4-byte) parts\n const left = dataview.getUint32(byteOffset, littleEndian);\n const right = dataview.getUint32(byteOffset + 4, littleEndian);\n // combine the two 32-bit values\n const combined = littleEndian\n ? left + 2 ** 32 * right\n : 2 ** 32 * left + right;\n if (!Number.isSafeInteger(combined)) {\n console.warn(combined, \"exceeds MAX_SAFE_INTEGER. Precision may be lost\");\n }\n return combined;\n}\n\nexport function getUint64BigInt(\n dataview: DataView,\n byteOffset: number,\n littleEndian = isLittleEndian()\n) {\n const bigThirtyTwo = BigInt(32);\n const bigZero = BigInt(0);\n // split 64-bit number into two 32-bit (4-byte) parts\n const left = BigInt(dataview.getUint32(byteOffset | 0, !!littleEndian) >>> 0);\n const right = BigInt(\n dataview.getUint32(((byteOffset | 0) + 4) | 0, !!littleEndian) >>> 0\n );\n // combine the two 32-bit values and return\n return littleEndian\n ? (right << bigThirtyTwo) | left\n : (left << bigThirtyTwo) | right;\n}\n","import { padString } from \"./string\";\nimport { extractAllNumbers, isReallyNaN } from \"./number\";\n\n// https://www.iana.org/time-zones\n// UTC Asia/Shanghai America/New_York\nexport function changeTimeZone(date: Date, ianatz = \"Asia/Shanghai\"): Date {\n // new Date(\"4/15/2025, 9:29:41 AM\") 在部分 iOS 下无法正常使用,iOS 只支持 \"yyyy/MM/dd\"、\"yyyy/MM/dd HH:mm:ss\"、\"yyyy-MM-dd\"、\"yyyy-MM-ddTHH:mm:ss\"、\"yyyy-MM-ddTHH:mm:ss+HH:mm\" 的格式\n // const tzDate = new Date(\n // date.toLocaleString(\"en-US\", {\n // timeZone: ianatz\n // })\n // );\n // const diff = date.getTime() - tzDate.getTime();\n const diff = new Date().getTimezoneOffset() * 60 * 1000;\n return new Date(date.getTime() - diff);\n}\n\n// DOMHighResTimeStamp 单位毫秒, 以浮点数的形式表示时间,精度最高可达微秒级\n// 与 performance.now() 相同, 以一个恒定的速率慢慢增加的,不会受到系统时间的影响\n// 返回值表示为从 time origin 之后到当前调用时经过的时间\n// time origin 时间源 是一个可以被认定为当前文档生命周期的开始节点的标准时间\nexport function now() {\n // if (\n // typeof self === \"undefined\" &&\n // typeof process !== \"undefined\" &&\n // process.hrtime\n // ) {\n // const time = process.hrtime();\n // // Convert [seconds, nanoseconds] to milliseconds.\n // return time[0] * 1000 + time[1] / 1000000;\n // }\n return (performance || Date).now();\n}\n\nexport const ONE_DAY_TIMESTAMP = 86400000;\n\n// 秒级时间戳(Unix 时间戳):长度为 10 位,如 1715143000\n// 毫秒级时间戳:长度为 13 位,如 1715143000000\nfunction isTimestampInMilliSeconds(timestamp: number): boolean {\n return timestamp > 1e12;\n}\nfunction isTimestampInSeconds(timestamp: number): boolean {\n return timestamp > 1e9;\n}\n\nexport function isDateValid(d: Date): boolean {\n return !isReallyNaN(d.valueOf());\n}\n\nexport function parseDate(date?: Date | string | number | null): Date {\n if (date === null || date === undefined) {\n return new Date(NaN); // Invalid Date\n }\n if (date instanceof Date) {\n return new Date(date);\n }\n if (typeof date === \"string\") {\n const d = date.match(\n /^(\\d{4})[-/.]?(\\d{1,2})?[-/.]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?[zZ]?$/\n );\n if (d) {\n const year = parseInt(d[1]);\n const month = d[2] ? parseInt(d[2]) - 1 : 0;\n const day = d[3] ? parseInt(d[3]) : 1;\n const hour = d[4] ? parseInt(d[4]) : 0;\n const minute = d[5] ? parseInt(d[5]) : 0;\n const second = d[6] ? parseInt(d[6]) : 0;\n const ms = d[7] ? parseInt(d[7].substring(0, 3)) : 0;\n // 如果以\"Z\"结尾,表示该时间是以零时区为基准的\n if (/Z$/i.test(date)) {\n return new Date(Date.UTC(year, month, day, hour, minute, second, ms));\n } else {\n return new Date(year, month, day, hour, minute, second, ms);\n }\n } else {\n return new Date(NaN); // Invalid Date\n }\n }\n // number\n if (!isTimestampInSeconds(date)) {\n return new Date(NaN); // Invalid Date\n }\n return new Date(isTimestampInMilliSeconds(date) ? date : date * 1000);\n}\n\n// [小时十位, 小时个位, 分钟十位, 分钟个位, 秒十位, 秒个位]\nexport type Time = [number, number, number, number, number, number];\n\nexport function formatTimeArray(\n time: Time,\n length: 1 | 2 | 3 = 3,\n timeGlue = \":\"\n): string {\n let formatted = \"\" + time[0] + time[1];\n switch (length) {\n case 1:\n break;\n case 2:\n formatted += timeGlue + time[2] + time[3];\n break;\n case 3:\n formatted += timeGlue + time[4] + time[5];\n break;\n }\n return formatted;\n}\n\nfunction getTimeStampFromTimeArray(time: Time): number {\n let t = 0;\n for (let i = 5; i >= 0; i = i - 2) {\n if (i == 5) {\n // 秒\n t += time[i - 1] * 10 + time[i];\n } else if (i == 3) {\n // 分\n t += (time[i - 1] * 10 + time[i]) * 60;\n } else if (i == 1) {\n // 时\n t += (time[i - 1] * 10 + time[i]) * 60 * 60;\n }\n }\n t = Math.floor(Math.max(0, t));\n return t * 1000;\n}\n\nexport function diffTimeStampFromTimeArray(start: Time, end: Time): number {\n return getTimeStampFromTimeArray(end) - getTimeStampFromTimeArray(start);\n}\n\nfunction validTimeArray(time: Time): Time {\n let t = getTimeStampFromTimeArray(time) / 1000;\n // 秒\n const seconds = t % 60;\n time[5] = seconds % 10;\n time[4] = Math.floor(seconds / 10);\n // 分\n t = Math.floor(t / 60);\n const minutes = t % 60;\n time[3] = minutes % 10;\n time[2] = Math.floor(minutes / 10);\n // 时\n t = Math.floor(t / 60);\n const hours = (t % 60) % 24;\n time[1] = hours % 10;\n time[0] = Math.floor(hours / 10);\n return time;\n}\n\nexport function parseTime(t: string): Time {\n const time: Time = [0, 0, 0, 0, 0, 0];\n const numbers = extractAllNumbers(t);\n const length = numbers.length;\n const count = Math.min(length, 3);\n for (let i = 0; i < count; i++) {\n const n = Math.floor(Math.abs(numbers[length - count + i] || 0));\n time[2 * i + 1] = n % 10;\n time[2 * i] = Math.floor(n / 10);\n }\n return validTimeArray(time);\n}\n\nexport function getTimeFromDate(d: Date): Time {\n return parseTime(formatTime(d));\n}\n\nexport function increaseTime(time: Time, account = 1): Time {\n time[5] += account;\n return validTimeArray(time);\n}\n\nexport function decreaseTime(time: Time, account = 1): Time {\n time[5] -= account;\n return validTimeArray(time);\n}\n\nexport function copyTime(sourceTime: Time, targetTime: Time): void {\n sourceTime.forEach((t, i) => {\n targetTime[i] = t;\n });\n}\n\n// 只判断 时-分-秒 是否在 [start, end] 范围内\nexport function isInTime(start: Time, end: Time, curr: Time): boolean {\n if (diffTimeStampFromTimeArray(start, curr) < 0) {\n return false;\n }\n if (diffTimeStampFromTimeArray(curr, end) < 0) {\n return false;\n }\n return true;\n}\n\nconst padTimeNumber = (n: number) => padString(n.toString(), 2, \"0\", \"left\");\n\nexport const formatDate = (date: Date, dateGlue = \"-\") => {\n const year = date.getFullYear();\n const month = date.getMonth() + 1;\n const day = date.getDate();\n return [year, month, day].map(padTimeNumber).join(dateGlue);\n};\n\nexport const formatTime = (date: Date, timeGlue = \":\") => {\n const hour = date.getHours();\n const minute = date.getMinutes();\n const second = date.getSeconds();\n return [hour, minute, second].map(padTimeNumber).join(timeGlue);\n};\nexport const formatTime2 = (date: Date) => {\n return date.toTimeString().slice(0, 8);\n};\nexport function formatTimeDuring(\n start: Date,\n end: Date,\n format: \"en\" | \"zh\" = \"zh\"\n) {\n let time =\n isDateValid(start) && isDateValid(end)\n ? Math.abs(end.getTime() - start.getTime())\n : 0;\n time = Math.floor(time / 1000);\n const seconds = time % 60;\n time = Math.floor(time / 60);\n const minutes = time % 60;\n time = Math.floor(time / 60);\n const hours = time;\n let timestr = \"\";\n switch (format) {\n case \"en\":\n return (\n \"\" +\n padTimeNumber(hours) +\n \":\" +\n padTimeNumber(minutes) +\n \":\" +\n padTimeNumber(seconds)\n );\n case \"zh\":\n default:\n if (hours) {\n timestr += hours + \"小时\";\n }\n if (minutes) {\n timestr += minutes + \"分钟\";\n }\n if (seconds) {\n timestr += seconds + \"秒\";\n }\n return timestr || \"0秒\";\n }\n}\n\nexport const formatDateTime = (date: Date, dateGlue = \"-\", timeGlue = \":\") => {\n return formatDate(date, dateGlue) + \" \" + formatTime(date, timeGlue);\n};\n\n// Date.prototype.format\n// format(new Date(1695000491000), \"yyyy-mm-dd hh:ii:ss\")\nexport function format(date: Date, fmt: string) {\n const r = /(y+)/.exec(fmt);\n if (r && r[1]) {\n const year = r[1];\n fmt = fmt.replace(\n year,\n (date.getFullYear() + \"\").substring(Math.max(4 - year.length, 0))\n );\n }\n const o: { [index: string]: number } = {\n \"m+\": date.getMonth() + 1, //月份\n \"d+\": date.getDate(), //日\n \"h+\": date.getHours(), //小时\n \"i+\": date.getMinutes(), //分\n \"s+\": date.getSeconds(), //秒\n \"q+\": Math.floor((date.getMonth() + 3) / 3),\n \"S+\": date.getMilliseconds() //毫秒\n };\n for (const k in o) {\n const r = new RegExp(\"(\" + k + \")\").exec(fmt);\n if (r && r[1]) {\n const d = r[1];\n fmt = fmt.replace(\n d,\n d.length == 1 ? \"\" + o[k] : (\"00\" + o[k]).substring((\"\" + o[k]).length)\n );\n }\n }\n return fmt;\n}\n\nexport function isWeekend(date: Date): boolean {\n if (!isDateValid(date)) {\n return false;\n }\n return [0, 6].indexOf(date.getDay()) !== -1;\n}\n\nexport function dayOfYear(date: Date): number {\n if (!isDateValid(date)) {\n return -1;\n }\n return Math.floor(\n (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) /\n ONE_DAY_TIMESTAMP\n );\n}\n\n// 返回整数\nexport function diffDays(start: Date, end: Date): number {\n if (!isDateValid(start) || !isDateValid(end)) {\n return -1;\n }\n return Math.ceil((end.getTime() - start.getTime()) / ONE_DAY_TIMESTAMP);\n}\n\n// 只判断 年-月-日 是否在 [start, end] 范围内\nexport function isInDays(start: Date, end: Date, curr: Date): boolean {\n if (!isDateValid(start) || !isDateValid(end) || !isDateValid(curr)) {\n return false;\n }\n if (diffDays(start, curr) < 0) {\n return false;\n }\n if (diffDays(curr, end) < 0) {\n return false;\n }\n return true;\n}\n\n// 获取某个月的总天数\nexport function getLastDayOfMonth(year: number, month: number) {\n const date = new Date(year, month, 0);\n const days = date.getDate();\n return days;\n}\n\nexport function getLastDayTimestampOfMonth(year: number, month: number) {\n const nextMonthFirstDay = new Date(year, month, 1);\n nextMonthFirstDay.setHours(0, 0, 0, 0);\n return nextMonthFirstDay.getTime() - 1;\n}\n\nexport function getFirstDayTimestampOfMonth(year: number, month: number) {\n const firstDay = new Date(year, month - 1, 1);\n firstDay.setHours(0, 0, 0, 0);\n return firstDay.getTime();\n}\n\nexport type TimeUnit =\n | \"millisecond\"\n | \"milliseconds\"\n | \"ms\"\n | \"second\"\n | \"seconds\"\n | \"s\"\n | \"minute\"\n | \"minutes\"\n | \"m\"\n | \"hour\"\n | \"hours\"\n | \"h\"\n | \"day\"\n | \"days\"\n | \"d\";\nexport function toMilliseconds(fromTime: number, fromUnit: TimeUnit = \"ms\") {\n let milliseconds;\n switch (fromUnit) {\n case \"millisecond\":\n case \"milliseconds\":\n case \"ms\":\n milliseconds = fromTime;\n break;\n case \"second\":\n case \"seconds\":\n case \"s\":\n milliseconds = fromTime * 1000;\n break;\n case \"minute\":\n case \"minutes\":\n case \"m\":\n milliseconds = fromTime * 60 * 1000;\n break;\n case \"hour\":\n case \"hours\":\n case \"h\":\n milliseconds = fromTime * 60 * 60 * 1000;\n break;\n case \"day\":\n case \"days\":\n case \"d\":\n milliseconds = fromTime * 24 * 60 * 60 * 1000;\n break;\n default:\n milliseconds = NaN;\n }\n return milliseconds;\n}\n","/**\n * throttle 节流\n * ms 毫秒内只运行一次,若在 ms 毫秒内重复触发,只有一次生效\n */\nexport function throttle(fn: (...args: any[]) => any, ms: number) {\n let ready = true;\n return function (this: any, ...args: any[]) {\n if (!ready) {\n return;\n }\n ready = false;\n fn.apply(this, args);\n setTimeout(() => {\n ready = true;\n }, ms);\n };\n}\n\n/**\n * debounce 防抖\n * ms 毫秒后再执行该事件,若在 ms 毫秒内被重复触发,则重新计时\n * debounce 的问题在于它“太有耐心了”\n * 试想,如果用户的操作十分频繁——他每次都不等 debounce 设置的 delay 时间结束就进行下一次操作,\n * 于是每次 debounce 都为该用户重新生成定时器,回调函数被延迟了不计其数次。\n * 频繁的延迟会导致用户迟迟得不到响应,用户同样会产生“这个页面卡死了”的观感。\n */\nexport function debounce(fn: (...args: any[]) => any, ms: number) {\n let timer: ReturnType<typeof setTimeout>;\n return function (this: any, ...args: any[]) {\n clearTimeout(timer);\n timer = setTimeout(() => {\n fn.apply(this, args);\n }, ms);\n };\n}\n\n/// 用 Throttle 来优化 Debounce\nexport function debounceBetter(fn: (...args: any[]) => any, ms: number) {\n let last = +new Date();\n let timer: ReturnType<typeof setTimeout>;\n return function (this: any, ...args: any[]) {\n const now = +new Date();\n if (now - last < ms) {\n // 如果时间间隔小于我们设定的时间间隔阈值,则为本次触发操作设立一个新的定时器\n clearTimeout(timer);\n timer = setTimeout(() => {\n last = now;\n fn.apply(this, args);\n }, ms);\n } else {\n // 如果时间间隔超出了我们设定的时间间隔阈值,那就不等了,无论如何要反馈给用户一次响应\n clearTimeout(timer);\n last = now;\n fn.apply(this, args);\n }\n };\n}\n","export interface EventBusListeners {\n [key: string | symbol]: (...payload: any[]) => void;\n}\n// interface CustomEventBusListeners extends EventBusListeners {\n// test: (a: number, b: number) => void;\n// }\n// class CustomEventBus extends EventBus<CustomEventBusListeners> {\n// constructor() {\n// super();\n// }\n// test() {\n// this.on(\"test\", (a, b) => {\n// console.log(a, b);\n// });\n// this.once(\"test\", (a, b) => {\n// console.log(a, b);\n// });\n// this.emit(\"test\", 1, 2);\n// }\n// }\n\nexport class EventBus<T extends EventBusListeners> {\n events: { [index: string | symbol]: T[keyof T][] };\n\n constructor() {\n this.events = {};\n }\n\n isEmpty<K extends keyof T>(name: K): boolean {\n return this.events[name] == undefined || this.events[name].length == 0;\n }\n\n has<K extends keyof T>(name: K, handler: T[K]): boolean {\n return (\n this.events[name] !== undefined &&\n this.events[name].indexOf(handler) !== -1\n );\n }\n\n prependListener<K extends keyof T>(name: K, handler: T[K]) {\n if (!this.events[name]) {\n this.events[name] = [];\n }\n this.events[name].unshift(handler);\n return this;\n }\n\n addListener<K extends keyof T>(name: K, handler: T[K]) {\n if (!this.events[name]) {\n this.events[name] = [];\n }\n this.events[name].push(handler);\n return this;\n }\n\n on<K extends keyof T>(name: K, handler: T[K]) {\n this.addListener(name, handler);\n return this;\n }\n\n removeListener<K extends keyof T>(name: K, handler: T[K]) {\n if (this.events[name]) {\n this.events[name] = this.events[name].filter((item) => item !== handler);\n }\n return this;\n }\n\n off<K extends keyof T>(name: K, handler: T[K]) {\n this.removeListener(name, handler);\n return this;\n }\n\n removeAllListeners<K extends keyof T>(name?: K) {\n if (name) {\n this.events[name] = [];\n } else {\n this.events = {};\n }\n return this;\n }\n\n emit<K extends keyof T>(\n name: K,\n // ...payload: T[K] extends (...args: infer I) => infer R ? I : never\n ...payload: Parameters<T[K]>\n ) {\n if (this.events[name]) {\n // make a copy, in case listeners are removed while iterating.\n const array = this.events[name].slice(0);\n array.forEach((handler) => {\n // Reflect.apply(handler, this, payload);\n // handler.apply(this, payload);\n handler(...payload);\n });\n }\n return this;\n }\n\n once<K extends keyof T>(name: K, handler: T[K]) {\n const getOnceCb = () => {\n let fired = false;\n return ((\n // ...payload: T[K] extends (...args: infer I) => infer R ? I : never\n ...payload: Parameters<T[K]>\n ): void => {\n if (!fired) {\n fired = true;\n // Reflect.apply(handler, this, payload);\n // handler.apply(this, payload);\n handler(...payload);\n this.off(name, onceCb);\n }\n }) as T[keyof T];\n };\n const onceCb = getOnceCb();\n this.on(name, onceCb);\n return this;\n }\n}\n","import { EventBus, EventBusListeners } from \"./EventBus\";\nimport { AsyncPromiseTaskCreator } from \"./type_symbol\";\n\ninterface AsyncTaskQueueEventBusListeners extends EventBusListeners {\n success: (taskIndex: number, result: any) => void;\n error: (taskIndex: number, result: any) => void;\n}\n\nexport class AsyncTaskQueue extends EventBus<AsyncTaskQueueEventBusListeners> {\n /// 外部可主动读取结果\n public results: any[] = [];\n\n private queue: Array<AsyncPromiseTaskCreator> = [];\n\n private rs: ReadableStream;\n private controller?: ReadableStreamDefaultController<any>;\n\n // 并发数量\n private concurrency: number;\n // 当前运行的数量\n private activeTaskCount = 0;\n\n constructor(concurrency = 1) {\n super();\n\n this.concurrency = concurrency;\n\n this.rs = new ReadableStream({\n start: async (controller) => {\n this.controller = controller;\n }\n });\n }\n\n // readStream(taskQueue.stream, (value) => {\n // console.log(value, value instanceof Error);\n // });\n get stream() {\n return this.rs;\n }\n\n public clearUnstartTasks() {\n this.queue = [];\n }\n\n public addTask(\n task: AsyncPromiseTaskCreator | Array<AsyncPromiseTaskCreator>\n ): void {\n if (Array.isArray(task)) {\n this.queue.push(...task);\n } else {\n this.queue.push(task);\n }\n if (this.activeTaskCount < this.concurrency && this.queue.length > 0) {\n this.runTasks();\n }\n }\n\n private async runTasks(): Promise<void> {\n while (this.activeTaskCount < this.concurrency && this.queue.length > 0) {\n const waitTasks = this.queue.splice(\n 0,\n this.concurrency - this.activeTaskCount\n );\n this.activeTaskCount += waitTasks.length;\n const results: PromiseSettledResult<any>[] = await Promise.allSettled(\n waitTasks.map((task) => task())\n );\n const lastIndex = this.results.length;\n results.forEach((r, i) => {\n if (r.status == \"fulfilled\") {\n const success = r.value;\n this.results.push(success);\n this.controller?.enqueue(success);\n this.emit(\"success\", lastIndex + i, success);\n } else if (r.status == \"rejected\") {\n const error = new Error(r.reason);\n this.results.push(error);\n this.controller?.enqueue(error);\n this.emit(\"error\", lastIndex + i, error);\n }\n });\n this.activeTaskCount -= results.length;\n }\n }\n}\n","import { unaryFn, variadicFn } from \"./type_symbol\";\n\nexport const noop = () => {};\nexport const identity = <T = any>(v: T) => v;\nexport const konst =\n <T = any>(v: T) =>\n () =>\n v;\nexport const kTrue = konst<true>(true);\nexport const kFalse = konst<false>(false);\n\n// 柯里化\nexport function curry(fn: variadicFn, ...args: any[]) {\n const length = fn.length; // fn 的参数个数\n args = args || [];\n return function (this: any, ...otherArgs: any[]) {\n const totalArgs = args.concat(Array.prototype.slice.call(otherArgs));\n if (totalArgs.length < length) {\n return curry.call(this, fn, ...totalArgs);\n } else {\n return fn.apply(this, totalArgs);\n }\n };\n}\n\n// 组合\n// compose(f, g, h) = (...args) => f(g(h(...args)))\nexport function compose(...fns: variadicFn[]): variadicFn {\n if (fns.length === 0) {\n return (...args: any[]) => args;\n }\n if (fns.length === 1) {\n return fns[0];\n }\n return fns.reduce(\n (a, b) =>\n (...args) =>\n a(b(...args))\n );\n}\n\n// 串联 | 管道\n// pip(f, g, h) = (...args) => h(g(f(...args)))\nexport const pipe = (...fns: variadicFn[]): variadicFn => {\n if (fns.length === 0) {\n return (...args: any[]) => args;\n }\n if (fns.length === 1) {\n return fns[0];\n }\n return fns.reduceRight(\n (a, b) =>\n (...args) =>\n a(b(...args))\n );\n};\n\n// 异步串联\n/**\n * const addA = (value, next) => {\n * next(value + 'A', 'a');\n * };\n * const addB = (value, anotherValue, next) => {\n * console.log(anotherValue); // => a\n * next(value + 'B');\n * };\n * const consoleLog = (value, next) => {\n * console.log(value);\n * };\n * pipeNext(addA, addB, consoleLog)('1'); // 1AB\n */\nexport const pipeNext = (...fns: variadicFn[]): variadicFn => {\n if (fns.length === 0) {\n return (...args: any[]) => args;\n }\n if (fns.length === 1) {\n return fns[0];\n }\n return fns.reduceRight(\n (next, fn) =>\n (...args) =>\n fn(...args, next),\n noop\n );\n};\n\n/**\n * @description 蹦床函数,循环调用返回函数的函数,将递归执行转为循环执行,适用于没有尾递归优化的环境\n *\n * 原递归函数\n * function sum(x, y) {\n * if (y > 0) {\n * return sum( x + 1, y - 1);\n * } else {\n * return x;\n * }\n * }\n * 改造后的递归函数,返回函数\n * function sum(x, y) {\n * if (y > 0) {\n * return sum.bind(null, x + 1, y - 1); // 这里是返回一个函数,而不是函数里面调用函数,从而避免递归执行\n * } else {\n * return x;\n * }\n * }\n * trampoline(sum(1,1000000));\n */\nexport function trampoline(f: variadicFn) {\n while (f && f instanceof Function) {\n f = f();\n }\n return f;\n}\n\n/**\n * @description 尾递归优化\n *\n * const sum = tco(function(x, y) {\n * \t if (y > 0) {\n * \t return sum(x + 1, y - 1)\n * \t }\n * \t else {\n * \t return x\n * \t }\n * \t});\n * \tsum(1, 100000)\t// 100001\n */\nexport function tco(f: variadicFn) {\n let value: any;\n let active = false;\n const accumulated: any[] = [];\n return function accumulator(this: any, ...args: any) {\n accumulated.push(args); // 第二次及以后只push参数\n // 避免递归执行: 只第一次执行,递归转为循环\n if (!active) {\n active = true;\n while (accumulated.length) {\n value = f.apply(this, accumulated.shift());\n }\n active = false;\n return value;\n }\n };\n}\n\n/**\n * 缓存函数结果\n */\nexport function memoize(f: variadicFn) {\n const cache: Record<string, any> = {};\n return function (this: any, ...args: any[]) {\n const str = JSON.stringify(args);\n cache[str] = cache[str] || f.apply(this, args);\n return cache[str];\n };\n}\n\n/**\n * 函数参数反转\n */\nexport function reverseArgs(fn: variadicFn) {\n return function (this: any, ...args: any[]) {\n return fn.apply(this, args.reverse());\n };\n}\n\nexport function once(fn: variadicFn) {\n let called = false;\n return function (this: any, ...args: any[]) {\n if (called) {\n return;\n }\n called = true;\n return fn.apply(this, args);\n };\n}\n\nexport function conditional(\n ifFn: variadicFn,\n thenFn: variadicFn,\n elseFn: variadicFn\n) {\n return function (this: any, ...args: any[]) {\n return ifFn.apply(this, args)\n ? thenFn.apply(this, args)\n : elseFn.apply(this, args);\n };\n}\n\nexport function tryCatch(tryer: variadicFn, catcher: unaryFn) {\n return function (this: any, ...args: any[]) {\n try {\n return tryer.apply(this, args);\n } catch (e: any) {\n return catcher.apply(this, e);\n }\n };\n}\n\n// 函数式编程调试, trace不是纯函数\nexport function trace(tag: string) {\n return (x: any) => {\n console.log(tag, x);\n return x;\n };\n}\n\nexport function transformUnaryArg(\n fn: unaryFn,\n transform: (v: any) => any\n): unaryFn {\n return function (this: any, arg: any) {\n return fn.call(this, transform(arg));\n };\n}\n\nexport const map =\n <T = any>(fn: (v: T, i?: number, a?: T[]) => any) =>\n (arr: T[]) =>\n arr.map(fn);\n\nexport const reduce =\n <T = any>(fn: (p: T, c: T, i?: number, a?: T[]) => any) =>\n (arr: T[], init?: any) =>\n arr.reduce(fn, init);\n\n// export const add = (x: number) => (y: number) => x + y;\n// export const minus = (x: number) => (y: number) => x - y;\n// export const multiply = (x: number) => (y: number) => x * y;\n// export const divide = (x: number) => (y: number) => x / y;\n\ndeclare global {\n interface Array<T> {\n ap: (args: any[]) => any[];\n }\n}\n// const arg1 = [1, 3];\n// const arg2 = [4, 5];\n// const partiallyAppliedAdds = [add].ap(arg1); // [(y) => 1 + y, (y) => 3 + y]\n// partiallyAppliedAdds.ap(arg2); // [5, 6, 7, 8]\nArray.prototype.ap = function (args: any[]) {\n return this.reduce((acc, fn) => acc.concat(args.map(fn)), []);\n};\n","import { type State, type ObjectKey, type voidFn } from \"./type_symbol\";\n\n// 响应式系统 的核心就是 数据代理\n// 数据 在 getter 时进行 依赖收集,在 setter 时对依赖 触发更新\n\n// 响应函数\ntype Effect = voidFn;\n\nlet activeEffect: Effect | null;\n\n// 订阅者 : 执行一次,自动收集依赖\nexport function watchEffect(effect: Effect) {\n activeEffect = effect;\n effect(); // effect 里面 get数据 时 自动收集依赖\n activeEffect = null;\n}\n\n// 订阅器 : 发布订阅\nexport class Dep {\n subscribers: Set<Effect> = new Set();\n add() {\n if (activeEffect && !this.subscribers.has(activeEffect)) {\n this.subscribers.add(activeEffect);\n }\n }\n notify() {\n this.subscribers.forEach((effect) => effect());\n }\n}\n\nconst targetKeyDepMap = new WeakMap<State, Map<ObjectKey, Dep>>();\n\nfunction getDep(target: State, key: ObjectKey) {\n let keyDepMap = targetKeyDepMap.get(target);\n if (!keyDepMap) {\n keyDepMap = new Map();\n targetKeyDepMap.set(target, keyDepMap);\n }\n let dep = keyDepMap.get(key);\n if (!dep) {\n dep = new Dep();\n keyDepMap.set(key, dep);\n }\n return dep;\n}\n\n// 监听器 : defineProperty 数据劫持\n// 无法劫持新创建的属性\n// 无法劫持数组的变化\n// 无法劫持利用索引修改数组元素\nexport function reactiveVue2<T extends State>(raw: T, deep = false): T {\n (Object.keys(raw) as Array<keyof T>).forEach((key) => {\n let value = raw[key];\n if (deep && typeof value === \"object\" && value !== null) {\n // array or object\n raw[key] = reactiveVue3(value, deep);\n } else {\n const dep = getDep(raw, key);\n Object.defineProperty(raw, key, {\n configurable: true, // 是否可删除、可配置\n enumerable: true, // 是否可枚举\n // 数据描述符\n // value : 默认为 undefined\n // writable : 是否可读写\n // 存取描述符\n get() {\n // 通过 getter 自动收集依赖\n dep.add();\n return value; // 避免死循环\n },\n set(v) {\n if (value != v) {\n value = v;\n // 通过 setter 触发更新\n dep.notify();\n }\n }\n });\n }\n });\n return raw;\n}\n\nexport function ref<T = any>(value: T, deep = false) {\n return reactiveVue2({ value }, deep);\n}\n\nexport function toValue(maybeRefOrGetter: any) {\n if (maybeRefOrGetter.value) {\n return maybeRefOrGetter.value;\n }\n if (typeof maybeRefOrGetter == \"function\") {\n return maybeRefOrGetter();\n }\n return maybeRefOrGetter;\n}\n\n// export function reactiveArrayVue2(arr: any[]) {\n// const originProto = Array.prototype;\n// const arrayPrototype = Object.create(originProto);\n// // 定义需要重写的方法\n// const methods = [\n// \"push\",\n// \"pop\",\n// \"shift\",\n// \"unshift\",\n// \"splice\",\n// \"sort\",\n// \"reverse\"\n// ];\n// methods.forEach((method) => {\n// arrayPrototype[method] = function (...params: any[]) {\n// const result = originProto[method].apply(this, params);\n// return result;\n// };\n// });\n// Object.setPrototypeOf(arr, arrayPrototype);\n// }\n\n// 监听器 : Proxy 数据代理\n// 可以监听新创建的属性\n// 可以监听数组的变化\n// 可以监听利用索引修改数组元素\nexport function reactiveVue3<T extends State>(raw: T, deep = false): T {\n const handler: ProxyHandler<T> = {\n // 拦截对象属性的读取\n // target 目标对象、key 键值、receiver 当前proxy实例\n get(target, key, receiver) {\n // 只要 Proxy 对象具有的代理方法,Reflect 对象全部具有,以静态方法的形式存在\n // - 修改某些 Object 方法的返回结果,让其变得更合理(定义不存在属性行为的时候不报错而是返回 false)\n const prevValue = Reflect.get(target, key, receiver);\n if (\n deep &&\n typeof prevValue === \"object\" &&\n prevValue !== null &&\n !(\"isYZReactiveProxy\" in prevValue)\n ) {\n // 递归 : array or object,以支持深层次对象的数据代理\n const deepProxy = reactiveVue3(prevValue, deep) as any;\n deepProxy[\"YZReactiveProxyParentTarget\"] = target;\n deepProxy[\"YZReactiveProxyParentKey\"] = key;\n Reflect.set(receiver, key, deepProxy);\n }\n // 通过 getter 自动收集依赖\n const dep = getDep(target, key);\n dep.add();\n return Reflect.get(target, key, receiver);\n },\n // 拦截对象属性的设置\n // target 目标对象、key 键值、value 值、receiver 当前proxy实例\n set(target, key, value, receiver) {\n const prevValue = Reflect.get(target, key, receiver);\n const r = Reflect.set(target, key, value, receiver);\n if (Array.isArray(target)) {\n // 通过 setter 触发更新\n const dep = getDep(\n target[\"YZReactiveProxyParentTarget\"],\n target[\"YZReactiveProxyParentKey\"]\n );\n dep.notify();\n } else {\n if (prevValue != value) {\n // 通过 setter 触发更新\n const dep = getDep(target, key);\n dep.notify();\n }\n }\n return r;\n },\n // 拦截 `key in proxy` 的操作,返回一个布尔值\n has(target, key) {\n return key === \"isYZReactiveProxy\" || key in target;\n }\n // 拦截 `delete proxy[key]` 的操作,返回一个布尔值\n // deleteProperty(target, key) {\n // return true;\n // },\n // 拦截 `Object.keys(proxy)`、`for...in` 等循环,返回一个数组\n // ownKeys(target) {\n // return [];\n // },\n // 拦截 `Object.getOwnPropertyDescriptor(proxy, key)`,返回属性的描述对象\n // getOwnPropertyDescriptor(target, key) {\n // return {};\n // },\n // 拦截 `Object.defineProperty(proxy, key, desc`,返回一个布尔值\n // defineProperty(target, key, desc) {\n // return true;\n // },\n // 拦截 `Object.preventExtensions(proxy)`,返回一个布尔值\n // preventExtensions(target) {\n // return true;\n // },\n // 拦截 `Object.getPrototypeOf(proxy)`,返回一个对象\n // getPrototypeOf(target) {\n // return {};\n // },\n // 拦截 `Object.isExtensible(proxy)`,返回一个布尔值\n // isExtensible(target) {\n // return true;\n // },\n // 拦截 `Object.setPrototypeOf(proxy, proto)`,返回一个布尔值\n // setPrototypeOf(target, proto) {\n // return true;\n // },\n // 拦截 Proxy 实例作为函数调用的操作\n // apply(target, thisArg, args) {\n // return target.apply(thisArg, args);\n // }\n // 拦截 Proxy 实例作为构造函数调用的操作\n // construct(target, args) {\n // return {};\n // }\n };\n const proxy = new Proxy(raw, handler);\n // 取消代理 : Proxy.revocable(target, handler);\n return proxy;\n}\n\nexport const reactive = reactiveVue3;\n\n// const info1 = reactive({ name: \"David\", age: 18 });\n// const info2 = reactive({ count: 100 });\n\n// watchEffect(() => {\n// console.log(`effect1: ${info1.name} ${info1.age}`);\n// });\n// watchEffect(() => {\n// console.log(`effect2: ${info1.name}`);\n// });\n// watchEffect(() => {\n// console.log(`effect3: ${info1.age}`);\n// });\n// watchEffect(() => {\n// console.log(`effect4: ${info2.count}`);\n// });\n\n// console.log(\"------\");\n// info1.name = \"John\";\n// console.log(\"------\");\n// info1.age++;\n// console.log(\"------\");\n// info2.count++;\n\n// 执行结果\n// 'effect1: David 18'\n// 'effect2: David'\n// 'effect3: 18'\n// 'effect4: 100'\n// '------'\n// 'effect1: John 18'\n// 'effect2: John'\n// '------'\n// 'effect1: John 19'\n// 'effect3: 19'\n// '------'\n// 'effect4: 101'\n","import { isString, isNumber, isSymbol } from \"../object\";\n\nexport class CacheMap<\n K extends string | number | symbol | any = string,\n V = string\n> {\n private maps: Map<K, V> = new Map();\n private mapsAddedDuringUpdate: Map<K, V> = new Map();\n\n // Object.entries(...);\n // Object.fromEntries(...)\n entries(): Array<[K, V]> {\n return Array.from(this.maps.entries());\n }\n\n // Object.keys(...);\n keys(): Array<K> {\n return Array.from(this.maps.keys());\n }\n\n // Object.values(...);\n values(): Array<V> {\n return Array.from(this.maps.values());\n }\n\n json(): Record<string | number | symbol, V> {\n return this.entries().reduce((acc, [k, v]) => {\n if (isString(k) || isNumber(k) || isSymbol(k)) {\n acc[k as string | number | symbol] = v;\n }\n return acc;\n }, {} as Record<string | number | symbol, V>);\n }\n\n get length(): number {\n return this.entries().length;\n }\n\n set(k: K, v: V): void {\n this.maps.set(k, v);\n this.mapsAddedDuringUpdate.set(k, v);\n }\n\n get(k: K): V | undefined {\n return this.maps.get(k);\n }\n\n /// Map 对象是按插入的顺序返回键值\n getIndex(i: number): [K, V] | undefined {\n const entries = this.entries();\n if (entries.length && entries[i]) {\n const [k, v] = entries[i];\n return [k, v];\n }\n return undefined;\n }\n\n top(): [K, V] | undefined {\n return this.getIndex(0);\n }\n\n shift(): [K, V] | undefined {\n const top = this.top();\n if (top) {\n const [k] = top;\n this.delete(k);\n }\n return top;\n }\n\n delete(k: K): boolean {\n this.mapsAddedDuringUpdate.delete(k);\n return this.maps.delete(k);\n }\n\n clear(): void {\n this.maps.clear();\n this.mapsAddedDuringUpdate.clear();\n }\n\n /// cb return false : 删除\n filter(cb: (k: K, v: V) => boolean) {\n let entries = Array.from(this.maps.entries());\n while (entries.length > 0) {\n this.mapsAddedDuringUpdate.clear();\n for (let i = 0, c = entries.length; i < c; i++) {\n const [k, v] = entries[i];\n if (cb(k, v) === false) {\n this.delete(k);\n }\n }\n entries = Array.from(this.mapsAddedDuringUpdate.entries());\n }\n }\n}\n\nexport default CacheMap;\n\n// {\n// '自定义key': {\n// value: 枚举值,\n// name: 枚举值名称,\n// title?: 枚举值别名,\n// }\n// }\nexport class Enum<\n V extends { value: any; name: string; title?: string } = {\n value: any;\n name: string;\n }\n> extends CacheMap<string, V> {\n [index: string]: any;\n\n constructor(json: Record<string, V>) {\n super();\n for (const k in json) {\n super.set(k, json[k]);\n this[k] = json[k].value; // Enum.xxx = yyy;\n }\n }\n\n copy(): Enum<V> {\n return new Enum(this.json());\n }\n\n // get types() {\n // return typeof ([...super.values().keys()] as const);\n // }\n\n isValidValue(v: string): boolean {\n return !!super.values().find((e) => e.value === v);\n }\n\n getDetail(v: string): V {\n const f = super.values().find((e) => e.value === v);\n if (f == undefined) {\n throw new Error(`Invalid Key: ${v}`);\n }\n return f;\n }\n\n getName(v: string): string {\n const d = this.getDetail(v);\n return d.title || d.name;\n }\n\n setTitle(v: string, title: string): void {\n try {\n this.getDetail(v).title = title;\n } catch (e) {\n // do nothing\n }\n }\n}\n","import { BasicHeap } from \"../datastructure/Heap\";\n\n/// 冒泡排序\n/// 时间复杂度 O(N^2) θ(N^2) Ω(N)\n/// 空间复杂度 O(1)\n/// 稳定性 稳定\nexport function BubbleSort<T = number>(\n array: T[],\n obeyCompare = (a: T, b: T) => a <= b\n) {\n let swapped = false;\n for (let i = 1, len = array.length; i < len; i++) {\n swapped = false;\n for (let j = 0; j < len - i; j++) {\n if (!obeyCompare(array[j], array[j + 1])) {\n [array[j], array[j + 1]] = [array[j + 1], array[j]];\n swapped = true;\n }\n }\n // If there were no swaps then array is already sorted and there is no need to proceed.\n if (!swapped) {\n return;\n }\n }\n}\n\n/// 选择排序\n/// 时间复杂度 O(N^2) θ(N^2) Ω(N^2)\n/// 空间复杂度 O(1)\n/// 稳定性 不稳定\nexport function SelectSort<T = number>(\n array: T[],\n obeyCompare = (a: T, b: T) => a <= b\n) {\n let minIndex;\n for (let i = 0, len = array.length; i < len - 1; i++) {\n minIndex = i;\n for (let j = i + 1; j < len; j++) {\n if (!obeyCompare(array[minIndex], array[j])) {\n minIndex = j;\n }\n }\n if (minIndex != i) {\n [array[minIndex], array[i]] = [array[i], array[minIndex]];\n }\n }\n}\n\n/// 插入排序\n/// 时间复杂度 O(N^2) θ(N^2) Ω(N)\n/// 空间复杂度 O(1)\n/// 稳定性 稳定\nexport function InsertSort<T = number>(\n array: T[],\n obeyCompare = (a: T, b: T) => a <= b\n) {\n for (let i = 1, len = array.length; i < len; i++) {\n let preIndex = i - 1;\n const current = array[i];\n while (preIndex >= 0 && !obeyCompare(array[preIndex], current)) {\n array[preIndex + 1] = array[preIndex];\n preIndex--;\n }\n array[preIndex + 1] = current;\n }\n}\n\n/// 希尔排序\n/// 时间复杂度 O(nlog_n) θ(nlog_n) Ω(nlog_n)\n/// 空间复杂度 O(1)\n/// 稳定性 稳定\nexport function ShellSort<T = number>(\n array: T[],\n obeyCompare = (a: T, b: T) => a <= b\n) {\n const len = array.length;\n let gapSize = Math.floor(len / 2);\n while (gapSize > 0) {\n for (let i = gapSize; i < len; i++) {\n const temp = array[i];\n let j = i;\n while (j >= gapSize && !obeyCompare(array[j - gapSize], temp)) {\n array[j] = array[j - gapSize];\n j -= gapSize;\n }\n array[j] = temp;\n }\n gapSize = Math.floor(gapSize / 2);\n }\n}\n\n/// 归并排序\n/// 时间复杂度 O(nlog_n) θ(nlog_n) Ω(nlog_n)\n/// 空间复杂度 O(N)\n/// 稳定性 稳定\nexport function MergeSort<T = number>(\n array: T[],\n obeyCompare = (a: T, b: T) => a <= b\n): T[] {\n const len = array.length;\n if (len < 2) {\n return array;\n }\n const middleIndex = Math.floor(len / 2);\n const left = MergeSort(array.slice(0, middleIndex), obeyCompare);\n const right = MergeSort(array.slice(middleIndex), obeyCompare);\n const result: T[] = [];\n while (left.length && right.length) {\n if (obeyCompare(left[0], right[0])) {\n result.push(left.shift() as T);\n } else {\n result.push(right.shift() as T);\n }\n }\n while (left.length) result.push(left.shift() as T);\n while (right.length) result.push(right.shift() as T);\n return result;\n}\nexport function MergeSortOrigin<T = number>(\n array: T[],\n obeyCompare = (a: T, b: T) => a <= b,\n left = 0,\n right = array.length - 1\n) {\n if (left >= right) {\n return;\n }\n const mid = (left + right) >> 1;\n MergeSortOrigin(array, obeyCompare, left, mid);\n MergeSortOrigin(array, obeyCompare, mid + 1, right);\n let i = left;\n let j = mid + 1;\n const tmp: T[] = [];\n while (i <= mid && j <= right) {\n if (obeyCompare(array[i], array[j])) {\n tmp.push(array[i++]);\n } else {\n tmp.push(array[j++]);\n }\n }\n while (i <= mid) {\n tmp.push(array[i++]);\n }\n while (j <= right) {\n tmp.push(array[j++]);\n }\n for (i = left, j = 0; i <= right; ++i, ++j) {\n array[i] = tmp[j];\n }\n}\n\n/// 快速排序\n/// 时间复杂度 O(n^2) θ(nlog_n) Ω(nlog_n)\n/// 空间复杂度 O(1)\n/// 稳定性 不稳定\nexport function QuickSort<T = number>(\n array: T[],\n obeyCompare = (a: T, b: T) => a <= b, // notice =\n left = 0,\n right = array.length - 1\n) {\n if (left >= right) {\n return;\n }\n const pivot = Math.floor((left + right) / 2);\n let i = left;\n let j = right;\n while (i <= j) {\n while (i != pivot && obeyCompare(array[i], array[pivot])) {\n i++;\n }\n while (j != pivot && obeyCompare(array[pivot], array[j])) {\n j--;\n }\n if (i <= j) {\n [array[i], array[j]] = [array[j], array[i]];\n i++;\n j--;\n }\n }\n QuickSort(array, obeyCompare, left, i - 1);\n QuickSort(array, obeyCompare, i, right);\n}\nexport function QuickSort2<T = number>(\n array: T[],\n obeyCompare = (a: T, b: T) => a <= b, // notice =\n left = 0,\n right = array.length - 1\n) {\n if (left >= right) {\n return;\n }\n let i = left - 1;\n let j = right + 1;\n const pivot = (left + right) >> 1;\n while (i < j) {\n while (i != pivot && obeyCompare(array[++i], array[pivot]));\n while (j != pivot && obeyCompare(array[pivot], array[--j]));\n if (i < j) {\n [array[i], array[j]] = [array[j], array[i]];\n }\n }\n QuickSort2(array, obeyCompare, left, j);\n QuickSort2(array, obeyCompare, j + 1, right);\n}\n\n/// 堆排序\n/// 时间复杂度 O(nlog_n) θ(nlog_n) Ω(nlog_n)\n/// 空间复杂度 O(N)\n/// 稳定性 不稳定\nexport function HeapSort<T = number>(\n array: T[],\n obeyCompare = (a: T, b: T) => a <= b\n): T[] {\n // // 插入建堆\n // const heap = new BasicHeap<T>(obeyCompare);\n // for (let i = 0, n = array.length; i < n; i++) {\n // heap.push(array[i]);\n // }\n // Floyd建堆\n const heap = new BasicHeap<T>(obeyCompare, array);\n const result: T[] = [];\n let value: T | null;\n while ((value = heap.pop()) !== null) {\n result.push(value);\n }\n return result;\n}\n","/* eslint-disable prefer-rest-params */\nimport { Iterator, Generator, variadicFn, Thunk } from \"./type_symbol\";\nimport { isPromise, isGenerator, isIterator, isPlainObject } from \"./object\";\n\n// function* gen() {\n// try {\n// yield xxx;\n// yield* anotherGen;\n// } catch (e) {\n// console.log(\"内部捕获\", e);\n// }\n// }\n// const i = gen();\n// i.next();\n// try {\n// i.throw(\"a\"); // 内部捕获\n// i.throw(\"b\"); // 外部捕获\n// } catch (e) {\n// console.log(\"外部捕获\", e);\n// }\n\n// - Generator运行:惰性求值(Lazy Evaluation)\n// \t- 1. 遇到 yield 表达式,就暂停执行,并将紧跟在 yield 后面的那个表达式的值,作为返回的 iterator.value\n// \t- 2. 下一次调用 next 方法时,再恢复执行,直到遇到下一个 yield 表达式\n// \t\t- next 方法可以带一个参数,该参数就会被当作上一个 yield 表达式的返回值。\n// \t\t- 如果 next 方法未带参数,上一个 yield 表达式的返回值为 undefined\n// \t- 3. 如果没有再遇到新的 yield 表达式,就一直运行到函数结束,直到 return 语句为止,并将 return 语句后面的表达式的值,作为返回的对象的 value 属性值,此时返回的对象的 done 属性值为 true\n// \t\t- 如果该函数没有return语句,则返回的对象的 value 属性值为 undefined\n\n// 如果 Generator 函数内部没有 try...catch 代码块,那么 throw 方法抛出的错误,将被外部 try...catch 代码块捕获\n// 如果 Generator 函数内部和外部,都没有 try...catch 代码块,那么程序将报错,直接中断执行\n// throw()方法抛出的错误要被内部捕获,前提是必须至少执行过一次 next 方法。否则不会被内部捕获\n// throw()方法被捕获以后,会附带执行下一条 yield 表达式。也就是说,会附带执行一次 next 方法。\n// 一旦 Generator 执行过程中抛出错误,且没有被内部捕获,就不会再执行下去了。如果此后还调用 next 方法,将返回一个 value 属性等于 undefined、done 等于 true 的对象\n\n// Generator 函数可以作为异步编程的完整解决方案是因为:函数体内外的数据交换和错误处理机制。\n// 一个线程(或函数)执行到一半,可以暂停执行,将执行权交给另一个线程(或函数),等到稍后收回执行权的时候,再恢复执行。\n// 这种可以并行执行、交换执行权的线程(或函数),就称为协程\n// Generator 函数是 ES6 对协程的实现,但属于不完全实现。Generator 函数被称为“半协程”(semi-coroutine),\n// 意思是只有 Generator 函数的调用者,才能将程序的执行权还给 Generator 函数。如果是完全执行的协程,任何函数都可以让暂停的协程继续执行\n\n// function* main() {\n// var result = yield request(\"http://some.url\");\n// var resp = JSON.parse(result);\n// console.log(resp.value);\n// }\n// function request(url) {\n// makeAjaxCall(url, function (response) {\n// it.next(response);\n// });\n// }\n// var it = main();\n// it.next();\n\n// async + await\n// async 就是 Generator 函数的语法糖,就是将 Generator 函数的星号* 替换成 async,将 yield 替换成 await\n// - 1. 内置执行器\n// \t- Generator 函数的执行必须靠执行器,所以才有了co模块,而 async 函数自带执行器。也就是说,async 函数的执行,与普通函数一模一样。\n// - 2. 更好的语义\n// \t- async 和 await,比起 星号 和 yield,语义更清楚了。async 表示函数里有异步操作,await 表示紧跟在后面的表达式需要等待结果。\n// - 3. 更广的适用性\n// \t- co模块约定,yield 命令后面只能是 Thunk 函数或 Promise 对象,而 async 函数的 await 命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved 的 Promise 对象)。\n// - 4. 返回值是 Promise\n// \t- async 函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你可以用 then 方法指定下一步的操作。\n// \t- 进一步说,async 函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而 await 命令就是内部 then 命令的语法糖。\n\nexport type Deferred<T = any> = {\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: any) => void;\n promise: Promise<T>;\n};\nexport function deferred<T = any>(): Deferred<T> {\n const def: any = {};\n def.promise = new Promise<T>((resolve, reject) => {\n def.resolve = resolve;\n def.reject = reject;\n });\n return def as Deferred<T>;\n}\n\nexport function arrayOfDeferred(length: number) {\n const arr = [];\n for (let i = 0; i < length; i++) {\n arr.push(deferred());\n }\n return arr;\n}\n\nexport function runSyncGenerator(gen: Generator) {\n const i = gen();\n let result = i.next();\n while (!result.done) {\n result = i.next(result.value);\n }\n}\n\nexport function runAsyncGeneratorValueThunk(gen: Generator) {\n const i = gen();\n // thunk函数签名\n function run(err?: any, data?: any) {\n if (err) {\n return i.throw?.(err);\n }\n const result = i.next(data);\n if (result.done) {\n return;\n }\n // result.value 就是 thunk函数,异步完成后将执行权交还\n result.value(run);\n }\n run();\n}\n\nexport function runAsyncGeneratorValuePromise(gen: Generator) {\n const i = gen();\n function run(data?: any) {\n const result = i.next(data);\n if (result.done) {\n return result.value;\n }\n // result.value 就是 Promise对象,异步完成后将执行权交还\n result.value.then(run).catch(i?.throw);\n }\n run();\n}\n\n/**\n * 将多参数函数替换成一个只接受 Thunk回调函数 作为参数的单参数函数\n * fn(args1, args2, ... , callback) = thunkify(fn)(args1, args2, ... )(callback)\n */\nexport function thunkify(this: any, fn: variadicFn) {\n const ctx = this;\n return (...rest: any[]) =>\n // Thunk函数签名\n (callback: (err?: any, data?: any) => void) => {\n let called: boolean;\n try {\n fn.apply(ctx, [\n ...rest,\n (err?: any, data?: any) => {\n if (called) {\n return;\n }\n called = true;\n // 原fn的callback参数过多\n if (arguments.length > 2) {\n data = Array.prototype.slice.call(arguments, 1);\n callback(err, ...data);\n } else {\n callback(err, data);\n }\n }\n ]);\n } catch (err) {\n callback(err);\n }\n };\n}\n\n/// Convert a `yield`ed value into a promise\nexport function toPromise(this: any, obj: any): any {\n if (!obj) {\n return obj;\n }\n if (isPromise(obj)) {\n return obj;\n }\n if (isGenerator(obj) || isIterator(obj)) {\n return co.call(this, obj);\n }\n if (\"function\" == typeof obj) {\n return thunkToPromise.call(this, obj);\n }\n if (Array.isArray(obj)) {\n return arrayToPromise.call(this, obj);\n }\n if (isPlainObject(obj)) {\n return objectToPromise.call(this, obj);\n }\n return obj;\n}\n\nfunction thunkToPromise(this: any, thunk: Thunk) {\n const ctx = this;\n return new Promise(function (resolve, reject) {\n thunk.call(ctx, function (err?: any, res?: any) {\n if (err) {\n return reject(err);\n }\n if (arguments.length > 2) {\n res = Array.prototype.slice.call(arguments, 1);\n }\n resolve(res);\n });\n });\n}\n\nfunction arrayToPromise(this: any, obj: any[]) {\n return Promise.all(obj.map(toPromise, this));\n}\n\nfunction objectToPromise(this: any, obj: any) {\n const results = new obj.constructor();\n const keys = Object.keys(obj);\n const promises: Promise<any>[] = [];\n for (let i = 0, c = keys.length; i < c; i++) {\n const key = keys[i];\n const promise = toPromise.call(this, obj[key]);\n if (promise && isPromise(promise)) {\n results[key] = undefined;\n promises.push(\n promise.then(function (res: any) {\n results[key] = res;\n })\n );\n } else {\n results[key] = obj[key];\n }\n }\n return Promise.all(promises).then(function () {\n return results;\n });\n}\n\nexport function co(this: any, gen: Generator | Iterator): Promise<any> {\n const ctx = this;\n const args = Array.prototype.slice.call(arguments, 1);\n\n // we wrap everything in a promise to avoid promise chaining,\n // which leads to memory leak errors.\n // see https://github.com/tj/co/issues/180\n return new Promise(function (resolve, reject) {\n const iterator = isIterator(gen)\n ? (gen as Iterator)\n : (gen as Generator).apply(ctx, args);\n\n if (typeof iterator.next !== \"function\") {\n return resolve(iterator);\n }\n\n onFulfilled();\n\n function onFulfilled(res?: any) {\n let ret;\n try {\n ret = iterator.next(res);\n } catch (e) {\n return reject(e);\n }\n next(ret);\n }\n\n function onRejected(err?: any) {\n let ret;\n try {\n ret = iterator.throw?.(err);\n } catch (e) {\n return reject(e);\n }\n next(ret);\n }\n\n function next(ret?: any) {\n if (ret.done) {\n return resolve(ret.value);\n }\n const value = toPromise.call(ctx, ret.value);\n if (value && isPromise(value)) {\n return value.then(onFulfilled, onRejected);\n }\n return onRejected(\n new TypeError(\n \"You may only yield a function, promise, generator, array, or object, \" +\n 'but the following object was passed: \"' +\n String(ret.value) +\n '\"'\n )\n );\n }\n });\n}\n\n/// Promise\nlet _nativePromise;\ntry {\n _nativePromise = Promise;\n} catch (_) {\n // UNDO mock Promise\n _nativePromise = function () {};\n}\nexport const nativePromise = _nativePromise;\n\nexport const cancelablePromise = (promise: Promise<any>) => {\n let isCanceled = false;\n return {\n promise: new Promise((resolve, reject) => {\n promise.then(\n (value) =>\n isCanceled ? reject({ isCanceled: true, value }) : resolve(value),\n (error) => reject({ isCanceled: isCanceled, error })\n );\n }),\n cancel: () => (isCanceled = true)\n };\n};\n\nexport function timeoutLimitPromise(promise: Promise<any>, timeout: number) {\n let timeoutHandle: ReturnType<typeof setTimeout>;\n return Promise.race([\n promise,\n new Promise((resolve, reject) => {\n timeoutHandle = setTimeout(() => reject(new Error(\"Timeout\")), timeout);\n })\n ])\n .then((data) => {\n clearTimeout(timeoutHandle);\n return data;\n })\n .catch((e) => {\n clearTimeout(timeoutHandle);\n return e;\n });\n}\n\nexport function chainPromise(promises: Promise<any>[]) {\n let result: any = null;\n let p = Promise.resolve();\n for (const _p of promises) {\n p = p.then((val) => {\n result = val;\n return _p;\n });\n }\n return p\n .catch((e) => {\n /* 忽略错误,继续执行 */\n })\n .then(() => {\n return result;\n });\n}\n\nconst MAX_SIGNED_INT = 2147483647;\n\n/// await delayAsync(300)\nexport function delayAsync(ms: number) {\n return new Promise<void>((resolve) => {\n setTimeout(resolve, Math.min(MAX_SIGNED_INT, ms));\n });\n}\n\nexport function delaySync(ms: number) {\n ms = Math.min(MAX_SIGNED_INT, ms);\n let flag = true;\n const now = Date.now();\n while (flag) {\n if (Date.now() - now > ms) {\n flag = false;\n }\n }\n}\n","(function (factory) {\n if (typeof exports === 'object') {\n // Node/CommonJS\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n // AMD\n define(factory);\n } else {\n // Browser globals (with support for web workers)\n var glob;\n\n try {\n glob = window;\n } catch (e) {\n glob = self;\n }\n\n glob.SparkMD5 = factory();\n }\n}(function (undefined) {\n\n 'use strict';\n\n /*\n * Fastest md5 implementation around (JKM md5).\n * Credits: Joseph Myers\n *\n * @see http://www.myersdaily.org/joseph/javascript/md5-text.html\n * @see http://jsperf.com/md5-shootout/7\n */\n\n /* this function is much faster,\n so if possible we use it. Some IEs\n are the only ones I know of that\n need the idiotic second function,\n generated by an if clause. */\n var add32 = function (a, b) {\n return (a + b) & 0xFFFFFFFF;\n },\n hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];\n\n\n function cmn(q, a, b, x, s, t) {\n a = add32(add32(a, q), add32(x, t));\n return add32((a << s) | (a >>> (32 - s)), b);\n }\n\n function md5cycle(x, k) {\n var a = x[0],\n b = x[1],\n c = x[2],\n d = x[3];\n\n a += (b & c | ~b & d) + k[0] - 680876936 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[1] - 389564586 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[2] + 606105819 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[3] - 1044525330 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[4] - 176418897 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[5] + 1200080426 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[6] - 1473231341 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[7] - 45705983 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[8] + 1770035416 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[9] - 1958414417 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[10] - 42063 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[11] - 1990404162 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[12] + 1804603682 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[13] - 40341101 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[14] - 1502002290 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[15] + 1236535329 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n\n a += (b & d | c & ~d) + k[1] - 165796510 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[6] - 1069501632 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[11] + 643717713 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[0] - 373897302 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[5] - 701558691 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[10] + 38016083 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[15] - 660478335 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[4] - 405537848 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[9] + 568446438 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[14] - 1019803690 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[3] - 187363961 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[8] + 1163531501 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[13] - 1444681467 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[2] - 51403784 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[7] + 1735328473 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[12] - 1926607734 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n\n a += (b ^ c ^ d) + k[5] - 378558 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[8] - 2022574463 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[11] + 1839030562 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[14] - 35309556 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[1] - 1530992060 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[4] + 1272893353 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[7] - 155497632 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[10] - 1094730640 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[13] + 681279174 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[0] - 358537222 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[3] - 722521979 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[6] + 76029189 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[9] - 640364487 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[12] - 421815835 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[15] + 530742520 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[2] - 995338651 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n\n a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;\n b = (b << 21 | b >>> 11) + c | 0;\n\n x[0] = a + x[0] | 0;\n x[1] = b + x[1] | 0;\n x[2] = c + x[2] | 0;\n x[3] = d + x[3] | 0;\n }\n\n function md5blk(s) {\n var md5blks = [],\n i; /* Andy King said do it this way. */\n\n for (i = 0; i < 64; i += 4) {\n md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);\n }\n return md5blks;\n }\n\n function md5blk_array(a) {\n var md5blks = [],\n i; /* Andy King said do it this way. */\n\n for (i = 0; i < 64; i += 4) {\n md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);\n }\n return md5blks;\n }\n\n function md51(s) {\n var n = s.length,\n state = [1732584193, -271733879, -1732584194, 271733878],\n i,\n length,\n tail,\n tmp,\n lo,\n hi;\n\n for (i = 64; i <= n; i += 64) {\n md5cycle(state, md5blk(s.substring(i - 64, i)));\n }\n s = s.substring(i - 64);\n length = s.length;\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);\n }\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(state, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Beware that the final length might not fit in 32 bits so we take care of that\n tmp = n * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n\n md5cycle(state, tail);\n return state;\n }\n\n function md51_array(a) {\n var n = a.length,\n state = [1732584193, -271733879, -1732584194, 271733878],\n i,\n length,\n tail,\n tmp,\n lo,\n hi;\n\n for (i = 64; i <= n; i += 64) {\n md5cycle(state, md5blk_array(a.subarray(i - 64, i)));\n }\n\n // Not sure if it is a bug, however IE10 will always produce a sub array of length 1\n // containing the last element of the parent array if the sub array specified starts\n // beyond the length of the parent array - weird.\n // https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue\n a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0);\n\n length = a.length;\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= a[i] << ((i % 4) << 3);\n }\n\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(state, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Beware that the final length might not fit in 32 bits so we take care of that\n tmp = n * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n\n md5cycle(state, tail);\n\n return state;\n }\n\n function rhex(n) {\n var s = '',\n j;\n for (j = 0; j < 4; j += 1) {\n s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];\n }\n return s;\n }\n\n function hex(x) {\n var i;\n for (i = 0; i < x.length; i += 1) {\n x[i] = rhex(x[i]);\n }\n return x.join('');\n }\n\n // In some cases the fast add32 function cannot be used..\n if (hex(md51('hello')) !== '5d41402abc4b2a76b9719d911017c592') {\n add32 = function (x, y) {\n var lsw = (x & 0xFFFF) + (y & 0xFFFF),\n msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xFFFF);\n };\n }\n\n // ---------------------------------------------------\n\n /**\n * ArrayBuffer slice polyfill.\n *\n * @see https://github.com/ttaubert/node-arraybuffer-slice\n */\n\n if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {\n (function () {\n function clamp(val, length) {\n val = (val | 0) || 0;\n\n if (val < 0) {\n return Math.max(val + length, 0);\n }\n\n return Math.min(val, length);\n }\n\n ArrayBuffer.prototype.slice = function (from, to) {\n var length = this.byteLength,\n begin = clamp(from, length),\n end = length,\n num,\n target,\n targetArray,\n sourceArray;\n\n if (to !== undefined) {\n end = clamp(to, length);\n }\n\n if (begin > end) {\n return new ArrayBuffer(0);\n }\n\n num = end - begin;\n target = new ArrayBuffer(num);\n targetArray = new Uint8Array(target);\n\n sourceArray = new Uint8Array(this, begin, num);\n targetArray.set(sourceArray);\n\n return target;\n };\n })();\n }\n\n // ---------------------------------------------------\n\n /**\n * Helpers.\n */\n\n function toUtf8(str) {\n if (/[\\u0080-\\uFFFF]/.test(str)) {\n str = unescape(encodeURIComponent(str));\n }\n\n return str;\n }\n\n function utf8Str2ArrayBuffer(str, returnUInt8Array) {\n var length = str.length,\n buff = new ArrayBuffer(length),\n arr = new Uint8Array(buff),\n i;\n\n for (i = 0; i < length; i += 1) {\n arr[i] = str.charCodeAt(i);\n }\n\n return returnUInt8Array ? arr : buff;\n }\n\n function arrayBuffer2Utf8Str(buff) {\n return String.fromCharCode.apply(null, new Uint8Array(buff));\n }\n\n function concatenateArrayBuffers(first, second, returnUInt8Array) {\n var result = new Uint8Array(first.byteLength + second.byteLength);\n\n result.set(new Uint8Array(first));\n result.set(new Uint8Array(second), first.byteLength);\n\n return returnUInt8Array ? result : result.buffer;\n }\n\n function hexToBinaryString(hex) {\n var bytes = [],\n length = hex.length,\n x;\n\n for (x = 0; x < length - 1; x += 2) {\n bytes.push(parseInt(hex.substr(x, 2), 16));\n }\n\n return String.fromCharCode.apply(String, bytes);\n }\n\n // ---------------------------------------------------\n\n /**\n * SparkMD5 OOP implementation.\n *\n * Use this class to perform an incremental md5, otherwise use the\n * static methods instead.\n */\n\n function SparkMD5() {\n // call reset to init the instance\n this.reset();\n }\n\n /**\n * Appends a string.\n * A conversion will be applied if an utf8 string is detected.\n *\n * @param {String} str The string to be appended\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.append = function (str) {\n // Converts the string to utf8 bytes if necessary\n // Then append as binary\n this.appendBinary(toUtf8(str));\n\n return this;\n };\n\n /**\n * Appends a binary string.\n *\n * @param {String} contents The binary string to be appended\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.appendBinary = function (contents) {\n this._buff += contents;\n this._length += contents.length;\n\n var length = this._buff.length,\n i;\n\n for (i = 64; i <= length; i += 64) {\n md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));\n }\n\n this._buff = this._buff.substring(i - 64);\n\n return this;\n };\n\n /**\n * Finishes the incremental computation, reseting the internal state and\n * returning the result.\n *\n * @param {Boolean} raw True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.prototype.end = function (raw) {\n var buff = this._buff,\n length = buff.length,\n i,\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n ret;\n\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3);\n }\n\n this._finish(tail, length);\n ret = hex(this._hash);\n\n if (raw) {\n ret = hexToBinaryString(ret);\n }\n\n this.reset();\n\n return ret;\n };\n\n /**\n * Resets the internal state of the computation.\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.reset = function () {\n this._buff = '';\n this._length = 0;\n this._hash = [1732584193, -271733879, -1732584194, 271733878];\n\n return this;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @return {Object} The state\n */\n SparkMD5.prototype.getState = function () {\n return {\n buff: this._buff,\n length: this._length,\n hash: this._hash.slice()\n };\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @param {Object} state The state\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.setState = function (state) {\n this._buff = state.buff;\n this._length = state.length;\n this._hash = state.hash;\n\n return this;\n };\n\n /**\n * Releases memory used by the incremental buffer and other additional\n * resources. If you plan to use the instance again, use reset instead.\n */\n SparkMD5.prototype.destroy = function () {\n delete this._hash;\n delete this._buff;\n delete this._length;\n };\n\n /**\n * Finish the final calculation based on the tail.\n *\n * @param {Array} tail The tail (will be modified)\n * @param {Number} length The length of the remaining buffer\n */\n SparkMD5.prototype._finish = function (tail, length) {\n var i = length,\n tmp,\n lo,\n hi;\n\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(this._hash, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Do the final computation based on the tail and length\n // Beware that the final length may not fit in 32 bits so we take care of that\n tmp = this._length * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n md5cycle(this._hash, tail);\n };\n\n /**\n * Performs the md5 hash on a string.\n * A conversion will be applied if utf8 string is detected.\n *\n * @param {String} str The string\n * @param {Boolean} [raw] True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.hash = function (str, raw) {\n // Converts the string to utf8 bytes if necessary\n // Then compute it using the binary function\n return SparkMD5.hashBinary(toUtf8(str), raw);\n };\n\n /**\n * Performs the md5 hash on a binary string.\n *\n * @param {String} content The binary string\n * @param {Boolean} [raw] True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.hashBinary = function (content, raw) {\n var hash = md51(content),\n ret = hex(hash);\n\n return raw ? hexToBinaryString(ret) : ret;\n };\n\n // ---------------------------------------------------\n\n /**\n * SparkMD5 OOP implementation for array buffers.\n *\n * Use this class to perform an incremental md5 ONLY for array buffers.\n */\n SparkMD5.ArrayBuffer = function () {\n // call reset to init the instance\n this.reset();\n };\n\n /**\n * Appends an array buffer.\n *\n * @param {ArrayBuffer} arr The array to be appended\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.append = function (arr) {\n var buff = concatenateArrayBuffers(this._buff.buffer, arr, true),\n length = buff.length,\n i;\n\n this._length += arr.byteLength;\n\n for (i = 64; i <= length; i += 64) {\n md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));\n }\n\n this._buff = (i - 64) < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);\n\n return this;\n };\n\n /**\n * Finishes the incremental computation, reseting the internal state and\n * returning the result.\n *\n * @param {Boolean} raw True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.ArrayBuffer.prototype.end = function (raw) {\n var buff = this._buff,\n length = buff.length,\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n i,\n ret;\n\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= buff[i] << ((i % 4) << 3);\n }\n\n this._finish(tail, length);\n ret = hex(this._hash);\n\n if (raw) {\n ret = hexToBinaryString(ret);\n }\n\n this.reset();\n\n return ret;\n };\n\n /**\n * Resets the internal state of the computation.\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.reset = function () {\n this._buff = new Uint8Array(0);\n this._length = 0;\n this._hash = [1732584193, -271733879, -1732584194, 271733878];\n\n return this;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @return {Object} The state\n */\n SparkMD5.ArrayBuffer.prototype.getState = function () {\n var state = SparkMD5.prototype.getState.call(this);\n\n // Convert buffer to a string\n state.buff = arrayBuffer2Utf8Str(state.buff);\n\n return state;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @param {Object} state The state\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.setState = function (state) {\n // Convert string to buffer\n state.buff = utf8Str2ArrayBuffer(state.buff, true);\n\n return SparkMD5.prototype.setState.call(this, state);\n };\n\n SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;\n\n SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;\n\n /**\n * Performs the md5 hash on an array buffer.\n *\n * @param {ArrayBuffer} arr The array buffer\n * @param {Boolean} [raw] True to get the raw string, false to get the hex one\n *\n * @return {String} The result\n */\n SparkMD5.ArrayBuffer.hash = function (arr, raw) {\n var hash = md51_array(new Uint8Array(arr)),\n ret = hex(hash);\n\n return raw ? hexToBinaryString(ret) : ret;\n };\n\n return SparkMD5;\n}));\n","import {\n getFileTypeFromArrayBuffer,\n toBlob,\n MIMEEnum,\n EncodeEnum,\n Time,\n increaseTime,\n formatTimeArray,\n ReadInBrowserEnum\n} from \"@zyzgroup/core-common\";\nimport SparkMD5 from \"spark-md5\";\nimport { FetchWithAxios } from \"./axios\";\n\nexport const DOMToString = (el: HTMLElement) => {\n return new XMLSerializer().serializeToString(el);\n};\n\nexport const stringToDOM = (\n str: string,\n type: DOMParserSupportedType = \"text/html\"\n) => {\n return new DOMParser().parseFromString(str, type);\n};\n\nexport const DOMToBlob = (\n el: HTMLElement,\n mimeType = MIMEEnum.SVG,\n encode = EncodeEnum.utf8 // utf-8 base64\n) => {\n return toBlob(DOMToString(el), mimeType, encode);\n};\n\nexport async function selectFileInBrowser(\n accepts: string[] = [\"*\"],\n multiple?: boolean\n): Promise<File[]> {\n if (!document || !(document instanceof Document)) {\n throw new Error(\"This is not a browser environment\");\n }\n // 新API\n // window.showOpenFilePicker();\n // window.showDirectoryPicker();\n let files: File[] = [];\n const input = document.createElement(\"input\") as HTMLInputElement;\n input.setAttribute(\"type\", \"file\");\n input.setAttribute(\"visibility\", \"hidden\");\n input.setAttribute(\"accept\", accepts.join(\",\"));\n if (multiple) {\n input.setAttribute(\"multiple\", \"true\");\n }\n input.addEventListener(\n \"click\",\n (e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // input.blur();\n input.value = \"\"; // 连续上传2次相同的文件时,清空 value 以触发 change 事件\n },\n false\n );\n return new Promise<File[]>((resolve, reject) => {\n input.addEventListener(\n \"change\",\n (e: Event) => {\n files = Array.from((e.target as HTMLInputElement).files || []);\n if (files.length === 0) {\n reject(new Error(\"Cancel\"));\n }\n // else if (\n // !accepts.includes(\"*\") &&\n // files.some((file) => !accepts.includes(`.${getFileExtension(file)}`))\n // ) {\n // reject(new Error(`Please select files in ${accepts} format`));\n // }\n else {\n resolve(files);\n }\n },\n false\n );\n window.addEventListener(\n \"focus\",\n () => {\n setTimeout(() => {\n if (files.length === 0) {\n reject(new Error(\"Cancel\"));\n }\n }, 1000);\n },\n { once: true }\n );\n // input.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n input.click();\n })\n .then((files) => {\n input.remove();\n return files;\n })\n .catch((e) => {\n input.remove();\n throw e;\n });\n}\n\nexport function readFileInBrowser<T extends string | ArrayBuffer>(\n // files: FileList,\n file: File | Blob,\n type: ReadInBrowserEnum = ReadInBrowserEnum.text,\n progressCb?: (loaded: number, total: number) => void\n): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener(\"progress\", (e: ProgressEvent<FileReader>) => {\n // e: FileReaderEventMap[\"progress\"]\n progressCb?.(e.loaded, e.total);\n });\n reader.addEventListener(\"load\", (e: FileReaderEventMap[\"load\"]) => {\n resolve(e.target?.result as T);\n // resolve(reader.result as T);\n });\n reader.addEventListener(\"error\", (e: FileReaderEventMap[\"error\"]) => {\n reject(e);\n });\n switch (type) {\n case ReadInBrowserEnum.dataURL:\n reader.readAsDataURL(file);\n break;\n case ReadInBrowserEnum.binaryString:\n reader.readAsBinaryString(file);\n break;\n case ReadInBrowserEnum.arraybuffer:\n reader.readAsArrayBuffer(file);\n break;\n case ReadInBrowserEnum.text:\n default:\n reader.readAsText(file);\n }\n });\n}\n\nexport async function getFileTypeFromFile(file: File) {\n const arrayBuffer = await readFileInBrowser<ArrayBuffer>(\n file,\n ReadInBrowserEnum.arraybuffer\n );\n return getFileTypeFromArrayBuffer(arrayBuffer);\n}\n\n/// 获取文件后缀\nexport const getFileExtension = (file: File | string): string => {\n let fileName: string;\n if (file instanceof File) {\n fileName = file.name;\n } else {\n fileName = file;\n }\n return fileName.match(/\\.([0-9a-z]+)(?:[\\\\?#]|$)/i)?.[1] || \"\";\n};\n\nexport function getMIME(name: string) {\n switch (name.toLowerCase()) {\n case \"jpg\":\n case \"jpeg\":\n return MIMEEnum.JPEG;\n case \"gif\":\n return MIMEEnum.GIF;\n case \"svg\":\n return MIMEEnum.SVG;\n case \"pdf\":\n return MIMEEnum.PDF;\n case \"png\":\n default:\n return MIMEEnum.PNG;\n }\n}\n\nfunction readFileMD5Hash(\n resolve: (v: string) => void,\n reject: (e: any) => void,\n spark: SparkMD5.ArrayBuffer,\n file: File,\n chunkSize: number,\n start: number,\n end: number\n) {\n const fileReader = new FileReader();\n fileReader.addEventListener(\"load\", (e) => {\n if (!e.target || !e.target.result) {\n return reject(e);\n }\n spark.append(e.target.result as ArrayBuffer);\n if (end < file.size) {\n readFileMD5Hash(\n resolve,\n reject,\n spark,\n file,\n chunkSize,\n end,\n Math.min(end + chunkSize, file.size)\n );\n } else {\n return resolve(spark.end());\n }\n });\n fileReader.addEventListener(\"error\", (e) => {\n return reject(e);\n });\n fileReader.readAsArrayBuffer(file.slice(start, end));\n}\n\n/// 获取文件 MD5 hash\nexport async function getFileMD5Hash(file: File, chunkSize = 1 * 1024 * 1024) {\n return await new Promise<string>((resolve, reject) =>\n readFileMD5Hash(\n resolve,\n reject,\n new SparkMD5.ArrayBuffer(),\n file,\n chunkSize,\n 0,\n Math.min(chunkSize, file.size)\n )\n );\n}\n\nexport class FileUpload {\n axios: FetchWithAxios;\n // 获取服务器端 文件 MD5 hash 地址\n checkURL: string;\n // 文件上传地址\n uploadURL: string;\n // 要上传的文件\n file: File;\n // 本地文件 MD5 hash\n fileHash?: string;\n // 文件切割块大小\n chunkSize: number;\n // 文件总切割数量\n chunks: number;\n // 当前块数\n currentChunk = 0;\n // 是否正在上传\n isUploading = false;\n begin = 0;\n end = 0;\n timer?: NodeJS.Timer;\n time: Time = [0, 0, 0, 0, 0, 0];\n onExist?: () => void;\n onStart?: () => void;\n onProgress?: (currentChunk: number, chunks: number) => void;\n onComplete?: () => void;\n onTime?: (time: string) => void;\n\n constructor(options: {\n baseURL: string;\n checkURL: string;\n uploadURL: string;\n file: File;\n chunkSize?: number;\n onExist?: () => void;\n onStart?: () => void;\n onProgress?: (currentChunk: number, chunks: number) => void;\n onComplete?: () => void;\n onTime?: (time: string) => void;\n }) {\n this.axios = new FetchWithAxios({\n baseURL: options.baseURL,\n interceptor: {\n request: (config) => {\n return config;\n },\n response: (response) => {\n if (response.config.url == this.uploadURL) {\n if (response.status == 200) {\n this.onProgress?.(this.currentChunk++, this.chunks);\n if (this.end == this.file.size) {\n this.isUploading = false;\n this.stopTimeCount();\n this.onComplete?.();\n } else {\n if (this.isUploading) {\n this.uploadChunk();\n }\n }\n } else {\n // UNDO: 上传失败,尝试重传\n }\n }\n return response;\n }\n }\n });\n this.checkURL = options.checkURL;\n this.uploadURL = options.uploadURL;\n this.file = options.file;\n this.chunkSize = options.chunkSize || 1 * 1024 * 1024;\n this.chunks = Math.ceil(this.file.size / this.chunkSize);\n this.onExist = options.onExist;\n this.onStart = options.onStart;\n this.onProgress = options.onProgress;\n this.onComplete = options.onComplete;\n this.onTime = options.onTime;\n }\n\n public async start() {\n if (!this.fileHash) {\n this.fileHash = await getFileMD5Hash(this.file, this.chunkSize);\n }\n // 后台判断文件是否已存在\n const result = await this.axios.post(this.checkURL, {\n fileName: this.file.name,\n fileHash: this.fileHash\n });\n if (result.isExist) {\n this.isUploading = false;\n this.onExist?.();\n } else {\n if (!this.isUploading) {\n this.onStart?.();\n this.startTimeCount();\n await this.uploadChunk();\n }\n }\n }\n\n public pause() {\n if (this.isUploading) {\n this.isUploading = false;\n this.stopTimeCount();\n }\n }\n\n private async uploadChunk() {\n this.isUploading = true;\n this.begin = this.currentChunk * this.chunkSize;\n this.end = Math.min(this.begin + this.chunkSize, this.file.size);\n const blob = this.file.slice(this.begin, this.end);\n const fd = new FormData();\n fd.append(\"fileData\", blob);\n fd.append(\"fileName\", this.file.name);\n fd.append(\"fileHash\", this.fileHash!);\n fd.append(\"chunkIndex\", String(this.currentChunk));\n fd.append(\"chunks\", String(this.chunks));\n await this.axios.postBlob(this.uploadURL, fd);\n }\n\n private startTimeCount() {\n this.stopTimeCount();\n this.timer = setInterval(() => {\n increaseTime(this.time, 1);\n this.onTime?.(formatTimeArray(this.time));\n }, 1000);\n }\n\n private stopTimeCount() {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n }\n}\n","import { ref, watchEffect } from \"@zyzgroup/core-common\";\n\n// localStorage 存储的数据可以跨浏览器会话访问\n\n// 存储量 5MB\n\n// 不会带到 HTTP 请求中,仅位于浏览器端,不与服务端发生通信\n\nexport function useLocalStorage(key: string, value?: any) {\n const data = ref(value || \"\");\n\n if (!value) {\n try {\n let v = window.localStorage.getItem(key);\n if (v) {\n v = JSON.parse(v);\n data.value = v ? (v as unknown as typeof data).value : \"\";\n }\n } catch (e) {\n // NOTHING\n }\n }\n\n watchEffect(() => {\n if (data.value) {\n try {\n window.localStorage.setItem(key, JSON.stringify(data));\n } catch (e) {\n // NOTHING\n }\n } else {\n window.localStorage.removeItem(key);\n }\n });\n\n return data;\n}\n","type EventMap = GlobalEventHandlersEventMap &\n ElementEventMap &\n HTMLElementEventMap &\n DocumentEventMap &\n WindowEventHandlersEventMap &\n WindowEventMap &\n MediaQueryListEventMap;\n\nexport function useEventListener<K extends keyof EventMap>(\n target: EventTarget | any,\n event: K | \"mousewheel\" | \"DOMMouseScroll\",\n handler: (e: EventMap[K]) => void | Promise<void>,\n // 捕获阶段 -> 目标阶段 -> 冒泡阶段\n // useCapture 用于指定是否在捕获阶段进行处理,一般设置为 false 与 IE浏览器保持一致\n useCapture = false\n): () => void {\n const eventHandler = async (e: Event) => {\n await handler(e as EventMap[K]);\n };\n\n try {\n target.addEventListener(event, eventHandler, useCapture);\n } catch (e) {\n target.attachEvent(\"on\" + event, eventHandler);\n }\n\n return () => {\n try {\n target.removeEventListener(event, eventHandler, useCapture);\n } catch (e) {\n target.detachEvent(\"on\" + event, eventHandler);\n }\n };\n}\n","import { now, CacheMap } from \"@zyzgroup/core-common\";\nimport { isNative } from \"../env\";\n\n/// requestAnimationFrame polyfill\n/// requestAnimationFrame 的触发时机是在一帧的开头\n(function () {\n if (!window.requestAnimationFrame) {\n let lastTime = now();\n window.requestAnimationFrame = function (\n // DOMHighResTimeStamp 单位毫秒, 以浮点数的形式表示时间,精度最高可达微秒级\n // 与 performance.now() 相同, 以一个恒定的速率慢慢增加的,不会受到系统时间的影响\n // 返回值表示为从 time origin 之后到当前调用时经过的时间\n // time origin 是一个可以被认定为当前文档生命周期的开始节点的标准时间\n cb: (time: DOMHighResTimeStamp) => void\n ) {\n const currTime = now();\n const timeRemain = Math.max(0, 16 - (currTime - lastTime)); // 16 = 1000 / 60\n const id = window.setTimeout(function () {\n cb(currTime + timeRemain);\n }, timeRemain);\n lastTime = currTime + timeRemain;\n return id;\n };\n }\n if (!window.cancelAnimationFrame) {\n window.cancelAnimationFrame = function (id) {\n clearTimeout(id);\n };\n }\n})();\n\n/// 自调用 requestAnimationFrame\n/// cb return false : 结束持续调用\nexport function requestAnimationFrameCycle(\n cb: (time: DOMHighResTimeStamp) => boolean\n): () => void {\n let isCancel = false;\n window.requestAnimationFrame(function frame(time: DOMHighResTimeStamp) {\n if (!isCancel && cb(time)) {\n window.requestAnimationFrame(frame);\n }\n });\n return () => {\n isCancel = true;\n };\n}\n\nexport function setTimeoutAccurate(\n cb: (time: DOMHighResTimeStamp) => void,\n timeout = 0\n): () => void {\n if (timeout == 0) {\n /// 同步立即执行\n cb(now());\n return () => {};\n } else {\n /// 异步执行\n const startTime = now();\n return requestAnimationFrameCycle((time: DOMHighResTimeStamp) => {\n if (time - startTime >= timeout) {\n cb(time);\n return false;\n }\n return true;\n });\n }\n}\n\nexport function setIntervalAccurate(\n cb: (\n time: DOMHighResTimeStamp,\n count: number,\n isTimeOutInThisCycle: boolean\n ) => void,\n interval = 0\n): () => void {\n let isCancel = false;\n let count = 0;\n const startTime = now();\n const frame = (time: DOMHighResTimeStamp) => {\n if (isCancel) {\n return;\n }\n count++;\n // 时间偏差\n const offset = time - startTime - count * interval;\n cb(time, count, interval <= offset);\n // 根据时间偏差,计算下次倒计时设定的回调时间,从而达到纠正的目的\n setTimeoutAccurate(frame, Math.max(0, interval - offset));\n };\n setTimeoutAccurate(frame, interval);\n return () => {\n isCancel = true;\n };\n}\n\n/// 快于指定帧率调用时,返回缓存值\nexport function createRunCycleInMaxRate(task: () => any, fps = 20): () => any {\n const duration = 1000 / fps;\n let lastTime = 0;\n let lastResult: any;\n return () => {\n if (now() - lastTime >= duration) {\n lastTime = now();\n lastResult = task();\n }\n return lastResult;\n };\n}\n\n/// FPS(frame per second)是浏览器每秒刷新的次数\n/// fps 低于 60 人眼就会感知卡顿掉帧\n/// 在两次屏幕硬件刷新之间,浏览器正好进行一次刷新(重绘),网页会很流畅\n/// 两次硬件刷新之间浏览器重绘多次是没意义的,只会消耗资源\n/// 如果浏览器重绘一次的时间是硬件多次刷新的时间,那么人眼将感知卡顿掉帧\n/// 所以浏览器对一次重绘的渲染工作需要在 16ms( 1000ms/60 )之内完成,也就是说每一次重绘小于 16ms 才不会卡顿掉帧\n\n/// requestIdleCallback 会在每一帧结束后判断浏览器是否空闲,如果浏览器一直处于占用状态,则没有空闲时间\n/// 且如果 requestIdleCallback 没有设置 timeout 时间,那么 callback 的任务会一直推迟执行\n/// 如果在当前帧设置 timeout,浏览器会在当前帧结束的下一帧开始判断是否超时执行 callback\n\n// 浏览器出现空闲时段,调用 requestIdleCallback 的场景\n// 1. 当浏览器一帧渲染所用时间小于屏幕刷新率(对于具有60Hz 的设备,一帧间隔应该小于16ms)时间,到下一帧渲染渲染开始时出现的空闲时间\n// 2. 当浏览器没有可渲染的任务,主线程一直处于空闲状态,事件队列为空\n// 为了避免在不可预测的任务(例如用户输入的处理)中引起用户可察觉的延迟,这些空闲周期的长度应限制为最大值 50ms = 1000 / 20\n// 也就是 timeRemaining 最大不超过 50ms(也就是20fps,这也是 react polyfill 的原因之一)\n// 当空闲时段结束时,可以调度另一个空闲时段,如果它保持空闲,那么空闲时段将更长,后台任务可以在更长时间段内发生\n\n// 注意:timeRemaining 最大为 50毫秒 ,是根据研究[ https://w3c.github.io/requestidlecallback/#bib-responsetime ] 得出的\n// 该研究表明,对用户输入的 100毫秒 以内的响应通常被认为对人类是瞬时的,就是人类不会有察觉\n// 将闲置截止期限设置为 50ms 意味着即使在闲置任务开始后立即发生用户输入,用户代理仍然有剩余的 50ms 可以在其中响应用户输入而不会产生用户可察觉的滞后\n\n// requestIdleCallback 注意事项:\n// 1. requestIdleCallback 是屏幕渲染之后执行的\n// 2. 一些低优先级的任务可使用 requestIdleCallback 等浏览器不忙的时候来执行\n// 同时因为时间有限,它所执行的任务应该尽量是能够量化\n// 细分的微任务(micro task)比较适合 requestIdleCallback\n// 3. requestIdleCallback 不会和帧对齐,所以涉及到 DOM的操作 和 动画 最好放在 requestAnimationFrame 中执行\n// requestAnimationFrame 在重新渲染屏幕之前执行\n// 4. Promise 也不建议在这里面进行,因为 Promise 的回调是在 Event loop 中优先级较高的一种微任务\n// 会在 requestIdleCallback 结束时立即执行,不管此时是否还有富余的时间,这样有很大可能会让一帧超过 16 ms\n\ninterface Window {\n requestIdleCallback(\n cb: (deadline: {\n didTimeout: boolean; // 任务是否超时\n timeRemaining(): DOMHighResTimeStamp;\n }) => void,\n options?: {\n // 表示超过这个时间后,如果任务还没执行,则强制执行,不必等待空闲\n timeout?: number;\n }\n ): number;\n cancelIdleCallback(id: number): void;\n}\n\n/// requestIdleCallback polyfill\nwindow.requestIdleCallback =\n window.requestIdleCallback ||\n function (cb: IdleRequestCallback, options?: IdleRequestOptions) {\n const start = now();\n return setTimeout(function () {\n cb({\n didTimeout: now() - start > 50,\n timeRemaining: () => Math.max(0, 50 - (now() - start))\n } as IdleDeadline);\n }, options?.timeout);\n };\n/// cancelIdleCallback polyfill\nwindow.cancelIdleCallback =\n window.cancelIdleCallback ||\n function (id: number) {\n clearTimeout(id);\n };\n\n/// 以最快帧率20fps调用空闲任务 - 几乎没用\nexport function scheduleIdle(cb: () => void, timeout?: number) {\n requestIdleCallback(\n (deadline) => {\n if (deadline.timeRemaining() > 0 || timeout) {\n cb();\n } else {\n scheduleIdle(cb, timeout);\n }\n },\n { timeout }\n );\n}\n\n// 空闲任务队列\nconst idleTaskQueue: CacheMap<\n string,\n { cb: () => void; startTime: number; timeout?: number }\n> = new CacheMap();\n\n/// 以当前帧率调用空闲任务\nlet isYZRequestIdleCallbackScheduled = false;\nexport function scheduleYZIdle(\n key?: string,\n cb?: () => void,\n timeout?: number\n) {\n if (key && cb) {\n // key相同时,如果旧任务还未执行,新任务将会覆盖旧任务\n idleTaskQueue.set(key, { cb, startTime: now(), timeout });\n }\n if (isYZRequestIdleCallbackScheduled) {\n return;\n }\n isYZRequestIdleCallbackScheduled = true;\n yzRequestIdleCallback((deadline) => {\n isYZRequestIdleCallbackScheduled = false;\n let timeRemaining = deadline.timeRemaining();\n idleTaskQueue.filter((k, v) => {\n let isDeleteTask = false;\n const taskStartTime = now();\n if (\n timeRemaining > 0 ||\n (v.timeout && now() - v.startTime >= v.timeout)\n ) {\n v.cb();\n isDeleteTask = true;\n }\n const taskEndTime = now();\n timeRemaining -= taskEndTime - taskStartTime;\n return !isDeleteTask;\n });\n if (idleTaskQueue.length > 0) {\n scheduleYZIdle();\n }\n });\n}\n\n// https://www.npmjs.com/package/scheduler\n\n/// React 任务优先级\n// Immediate -1 需要立刻执行\n// UserBlocking 250ms 超时时间250ms,一般指的是用户交互\n// Normal 5000ms 超时时间5s,不需要直观立即变化的任务,比如网络请求\n// Low 10000ms 超时时间10s,肯定要执行的任务,但是可以放在最后处理\n// Idle 一些没有必要的任务,可能不会执行\n\n/// 使用 rAF 来动态算出当前帧率:\n/// 1. 假设初始帧率为 30fps,则每一帧执行时间为 1000 / 30 = 33ms\n/// 2. 如果连续 2 帧的执行时间都小于当前帧率下的每帧执行时间,则表明当前帧率有待提高\n/// 3. 如果连续 2 帧的执行时间都大于当前帧率下的每帧执行时间,则表明当前帧率有待减低\n\n// 估算的当前帧截止时间\nlet frameEndTimeStamp = 0;\n// 估算的上一帧执行时间\nlet previousFrameDurTime = 33;\n// 估算的帧执行时间\nlet activeFrameDurTime = 33;\n\nlet currentCallback: IdleRequestCallback | null;\nconst channel = new MessageChannel();\nconst port = channel.port2;\nchannel.port1.onmessage = (e: MessageEvent) => {\n if (currentCallback !== null) {\n currentCallback({\n didTimeout: frameEndTimeStamp <= now(),\n timeRemaining: () => Math.max(0, frameEndTimeStamp - now())\n });\n }\n};\n\n/// React v16.0.0 中实现 rIC 的核心思路就是,使用 rAF 动态计算帧率,使用 postMessage 实现异步调用\nfunction yzRequestIdleCallback(cb: IdleRequestCallback): number {\n currentCallback = cb;\n /// 如果直接使用 rAF 模拟 requestIdleCallback ,Fiber tree 的更新操作会在 rAF 里执行,整体增加了当前帧完成所需的时间,会导致帧率下降\n /// 使用 rAF 动态计算出当前帧率,得出帧截止时间\n /// 从而可以较准确的计算得到 rIC 中参数 timeRemaining\n return requestAnimationFrame((frameStartTimeStamp: DOMHighResTimeStamp) => {\n // 估算的当前帧执行时间,这里的 frameEndTimeStamp 为上一帧的截止时间\n let currentFrameDurTime =\n frameStartTimeStamp - frameEndTimeStamp + activeFrameDurTime;\n // 如果连续2帧的执行时间都小于帧执行时间,说明可以提高帧率\n if (\n currentFrameDurTime < activeFrameDurTime &&\n previousFrameDurTime < activeFrameDurTime\n ) {\n // 最高 120 fps, 1000 / 120 = 8.3\n if (currentFrameDurTime < 8) {\n currentFrameDurTime = 8;\n }\n // 取连续2帧中执行时间较大的,防止执行超过帧截止时间\n activeFrameDurTime =\n currentFrameDurTime < previousFrameDurTime\n ? previousFrameDurTime\n : currentFrameDurTime;\n } else if (\n currentFrameDurTime > activeFrameDurTime &&\n previousFrameDurTime > activeFrameDurTime\n ) {\n // 如果连续2帧的执行时间都大于帧执行时间,说明可以减低帧率\n activeFrameDurTime =\n currentFrameDurTime < previousFrameDurTime\n ? previousFrameDurTime\n : currentFrameDurTime;\n } else {\n previousFrameDurTime = currentFrameDurTime;\n }\n frameEndTimeStamp = frameStartTimeStamp + activeFrameDurTime;\n /// 为了减少误差,使用 postMessage,而不是 setTimeout,因为 postMessage 比 setTimeout 要早得到执行\n /// 异步调度越早开始,那么 timeRemaining 得到值的误差就会越小\n\n /// 对于现代浏览器来说,使用 setTimeout(callback,0),会存在 4ms 的执行间隔限制\n // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers\n // If timeout is less than 0, then set timeout to 0.\n // If nesting level is greater than 5, and timeout is less than 4, then set timeout to 4.\n port.postMessage(null);\n });\n}\n\n/// process.nextTick(() => {})\n/// import { nextTick } from \"vue\";\nexport function nextTick(cb: () => void) {\n if (typeof setImmediate !== \"undefined\" && isNative(setImmediate)) {\n setImmediate(cb);\n } else if (\n typeof MessageChannel !== \"undefined\" &&\n (isNative(MessageChannel) ||\n MessageChannel.toString() === \"[object MessageChannelConstructor]\")\n ) {\n const { port1, port2 } = new MessageChannel();\n port2.onmessage = cb;\n port1.postMessage(null);\n } else if (typeof Promise !== \"undefined\" && isNative(Promise)) {\n Promise.resolve().then(cb);\n } else {\n setTimeout(cb, 0);\n }\n}\n\nexport function microTask(cb: () => void) {\n if (typeof queueMicrotask === \"function\") {\n queueMicrotask(cb);\n } else {\n Promise.resolve()\n .then(cb)\n .catch((e) =>\n setTimeout(() => {\n throw e;\n })\n );\n }\n}\n","export default class Sequence {\n private static _nextId = 0;\n\n static nextId(): number {\n return Sequence._nextId++;\n }\n}\n","// 缓动函数 amount: 0-1\nexport type EasingFunction = (amount: number) => number;\n\nexport const Easing = {\n // 线性\n Linear: {\n None: function (amount: number): number {\n return amount;\n }\n },\n Ease: {\n In: function (amount: number): number {\n return Math.pow(amount, 1.7);\n }\n },\n // 二次\n Quadratic: {\n In: function (amount: number): number {\n return amount * amount;\n },\n Out: function (amount: number): number {\n return amount * (2 - amount);\n },\n InOut: function (amount: number): number {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount;\n }\n return -0.5 * (--amount * (amount - 2) - 1);\n }\n },\n // 三次\n Cubic: {\n In: function (amount: number): number {\n return amount * amount * amount;\n },\n Out: function (amount: number): number {\n return --amount * amount * amount + 1;\n },\n InOut: function (amount: number): number {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount;\n }\n return 0.5 * ((amount -= 2) * amount * amount + 2);\n }\n },\n // 四次\n Quartic: {\n In: function (amount: number): number {\n return amount * amount * amount * amount;\n },\n Out: function (amount: number): number {\n return 1 - --amount * amount * amount * amount;\n },\n InOut: function (amount: number): number {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount * amount;\n }\n return -0.5 * ((amount -= 2) * amount * amount * amount - 2);\n }\n },\n // 五次\n Quintic: {\n In: function (amount: number): number {\n return amount * amount * amount * amount * amount;\n },\n Out: function (amount: number): number {\n return --amount * amount * amount * amount * amount + 1;\n },\n InOut: function (amount: number): number {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount * amount * amount;\n }\n return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2);\n }\n },\n // 正弦曲线\n Sinusoidal: {\n In: function (amount: number): number {\n return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2);\n },\n Out: function (amount: number): number {\n return Math.sin((amount * Math.PI) / 2);\n },\n InOut: function (amount: number): number {\n return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount)));\n }\n },\n // 指数\n Exponential: {\n In: function (amount: number): number {\n return amount === 0 ? 0 : Math.pow(1024, amount - 1);\n },\n Out: function (amount: number): number {\n return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount);\n },\n InOut: function (amount: number): number {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n if ((amount *= 2) < 1) {\n return 0.5 * Math.pow(1024, amount - 1);\n }\n return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2);\n }\n },\n // 圆\n Circular: {\n In: function (amount: number): number {\n return 1 - Math.sqrt(1 - amount * amount);\n },\n Out: function (amount: number): number {\n return Math.sqrt(1 - --amount * amount);\n },\n InOut: function (amount: number): number {\n if ((amount *= 2) < 1) {\n return -0.5 * (Math.sqrt(1 - amount * amount) - 1);\n }\n return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1);\n }\n },\n // 松紧带\n Elastic: {\n In: function (amount: number): number {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n return (\n -Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI)\n );\n },\n Out: function (amount: number): number {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n return (\n Math.pow(2, -10 * amount) * Math.sin((amount - 0.1) * 5 * Math.PI) + 1\n );\n },\n InOut: function (amount: number): number {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n amount *= 2;\n if (amount < 1) {\n return (\n -0.5 *\n Math.pow(2, 10 * (amount - 1)) *\n Math.sin((amount - 1.1) * 5 * Math.PI)\n );\n }\n return (\n 0.5 *\n Math.pow(2, -10 * (amount - 1)) *\n Math.sin((amount - 1.1) * 5 * Math.PI) +\n 1\n );\n }\n },\n // 后退\n Back: {\n In: function (amount: number): number {\n const s = 1.70158;\n return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s);\n },\n Out: function (amount: number): number {\n const s = 1.70158;\n return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1;\n },\n InOut: function (amount: number): number {\n const s = 1.70158 * 1.525;\n if ((amount *= 2) < 1) {\n return 0.5 * (amount * amount * ((s + 1) * amount - s));\n }\n return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2);\n }\n },\n // 弹跳\n Bounce: {\n In: function (amount: number): number {\n return 1 - Easing.Bounce.Out(1 - amount);\n },\n Out: function (amount: number): number {\n if (amount < 1 / 2.75) {\n return 7.5625 * amount * amount;\n } else if (amount < 2 / 2.75) {\n return 7.5625 * (amount -= 1.5 / 2.75) * amount + 0.75;\n } else if (amount < 2.5 / 2.75) {\n return 7.5625 * (amount -= 2.25 / 2.75) * amount + 0.9375;\n } else {\n return 7.5625 * (amount -= 2.625 / 2.75) * amount + 0.984375;\n }\n },\n InOut: function (amount: number): number {\n if (amount < 0.5) {\n return Easing.Bounce.In(amount * 2) * 0.5;\n }\n return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5;\n }\n },\n // 生成指数\n generatePow: function (power = 4): {\n In(amount: number): number;\n Out(amount: number): number;\n InOut(amount: number): number;\n } {\n power = power < Number.EPSILON ? Number.EPSILON : power;\n power = power > 10000 ? 10000 : power;\n return {\n In: function (amount: number): number {\n return amount ** power;\n },\n Out: function (amount: number): number {\n return 1 - (1 - amount) ** power;\n },\n InOut: function (amount: number): number {\n if (amount < 0.5) {\n return (amount * 2) ** power / 2;\n }\n return (1 - (2 - amount * 2) ** power) / 2 + 0.5;\n }\n };\n },\n // 随机\n random: function (amount: number) {\n return Math.random();\n },\n // 步数\n createStep: function (numSteps: number): EasingFunction {\n return function (amount: number) {\n return Math.floor(amount * numSteps) / numSteps;\n };\n },\n // 增加噪音\n createNoisyEasing: function (\n easingFunction: EasingFunction,\n randomProportion = 0.1\n ): EasingFunction {\n const normalProportion = 1.0 - randomProportion;\n return function (amount: number) {\n return (\n randomProportion * Math.random() +\n normalProportion * easingFunction(amount)\n );\n };\n },\n swing: function (amount: number) {\n return amount + Math.sin(amount * Math.PI * 2) / 2;\n },\n causeSeizures: function (amount: number) {\n return amount + 0.2 * Math.random() - 0.1;\n }\n};\n\nexport default Easing;\n\nexport function reverseEasing(easing: EasingFunction): EasingFunction {\n switch (easing) {\n // 二次\n case Easing.Quadratic.In:\n return Easing.Quadratic.Out;\n case Easing.Quadratic.Out:\n return Easing.Quadratic.In;\n case Easing.Quadratic.InOut:\n return Easing.Quadratic.InOut;\n // 三次\n case Easing.Cubic.In:\n return Easing.Cubic.Out;\n case Easing.Cubic.Out:\n return Easing.Cubic.In;\n case Easing.Cubic.InOut:\n return Easing.Cubic.InOut;\n // 四次\n case Easing.Quartic.In:\n return Easing.Quartic.Out;\n case Easing.Quartic.Out:\n return Easing.Quartic.In;\n case Easing.Quartic.InOut:\n return Easing.Quartic.InOut;\n // 五次\n case Easing.Quintic.In:\n return Easing.Quintic.Out;\n case Easing.Quintic.Out:\n return Easing.Quintic.In;\n case Easing.Quintic.InOut:\n return Easing.Quintic.InOut;\n // 正弦曲线\n case Easing.Sinusoidal.In:\n return Easing.Sinusoidal.Out;\n case Easing.Sinusoidal.Out:\n return Easing.Sinusoidal.In;\n case Easing.Sinusoidal.InOut:\n return Easing.Sinusoidal.InOut;\n // 指数\n case Easing.Exponential.In:\n return Easing.Exponential.Out;\n case Easing.Exponential.Out:\n return Easing.Exponential.In;\n case Easing.Exponential.InOut:\n return Easing.Exponential.InOut;\n // 圆\n case Easing.Circular.In:\n return Easing.Circular.Out;\n case Easing.Circular.Out:\n return Easing.Circular.In;\n case Easing.Circular.InOut:\n return Easing.Circular.InOut;\n // 松紧带\n case Easing.Elastic.In:\n return Easing.Elastic.Out;\n case Easing.Elastic.Out:\n return Easing.Elastic.In;\n case Easing.Elastic.InOut:\n return Easing.Elastic.InOut;\n // 后退\n case Easing.Back.In:\n return Easing.Back.Out;\n case Easing.Back.Out:\n return Easing.Back.In;\n case Easing.Back.InOut:\n return Easing.Back.InOut;\n // 弹跳\n case Easing.Bounce.In:\n return Easing.Bounce.Out;\n case Easing.Bounce.Out:\n return Easing.Bounce.In;\n case Easing.Bounce.InOut:\n return Easing.Bounce.InOut;\n default:\n return easing;\n }\n}\n","// 插值函数\nexport type InterpolationFunction = (\n originalValues: number[],\n t: number // 0 ~ 1\n) => number;\n\nexport const Interpolation = {\n Utils: {\n Linear: function (p0: number, p1: number, t: number): number {\n return (p1 - p0) * t + p0;\n },\n Factorial: (function () {\n const a = [1];\n return function (n: number): number {\n let s = 1;\n if (a[n]) {\n return a[n];\n }\n for (let i = n; i > 1; i--) {\n s *= i;\n }\n a[n] = s;\n return s;\n };\n })(),\n Bernstein: function (n: number, i: number): number {\n const fc = Interpolation.Utils.Factorial;\n return fc(n) / fc(i) / fc(n - i);\n },\n // 卡特穆尔·罗姆\n CatmullRom: function (\n p0: number,\n p1: number,\n p2: number,\n p3: number,\n t: number\n ): number {\n const v0 = (p2 - p0) * 0.5;\n const v1 = (p3 - p1) * 0.5;\n const t2 = t * t;\n const t3 = t * t2;\n return (\n (2 * p1 - 2 * p2 + v0 + v1) * t3 +\n (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 +\n v0 * t +\n p1\n );\n },\n QuadraticBezier: (\n p0: number,\n p1: number,\n p2: number,\n t: number\n ): number => {\n const k = 1 - t;\n return k * k * p0 + 2 * k * t * p1 + t * t * p2;\n },\n CubicBezier: (\n p0: number,\n p1: number,\n p2: number,\n p3: number,\n t: number\n ): number => {\n const k = 1 - t;\n return (\n k * k * k * p0 +\n 3 * k * k * t * p1 +\n 3 * k * t * t * p2 +\n t * t * t * p3\n );\n }\n },\n // 线性\n Linear: function (v: number[], k: number): number {\n const m = v.length - 1;\n const f = m * k;\n const i = Math.floor(f);\n const fn = Interpolation.Utils.Linear;\n if (k < 0) {\n return fn(v[0], v[1], f);\n }\n if (k > 1) {\n return fn(v[m], v[m - 1], m - f);\n }\n return fn(v[i], v[i + 1 > m ? m : i + 1], f - i);\n },\n // 贝塞尔\n Bezier: function (v: number[], k: number): number {\n let b = 0;\n const n = v.length - 1;\n const pw = Math.pow;\n const bn = Interpolation.Utils.Bernstein;\n for (let i = 0; i <= n; i++) {\n b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i);\n }\n return b;\n },\n // 卡特穆尔·罗姆\n CatmullRom: function (v: number[], k: number): number {\n const m = v.length - 1;\n let f = m * k;\n let i = Math.floor(f);\n const fn = Interpolation.Utils.CatmullRom;\n if (v[0] === v[m]) {\n if (k < 0) {\n i = Math.floor((f = m * (1 + k)));\n }\n return fn(\n v[(i - 1 + m) % m],\n v[i],\n v[(i + 1) % m],\n v[(i + 2) % m],\n f - i\n );\n } else {\n if (k < 0) {\n return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]);\n }\n if (k > 1) {\n return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]);\n }\n return fn(\n v[i ? i - 1 : 0],\n v[i],\n v[m < i + 1 ? m : i + 1],\n v[m < i + 2 ? m : i + 2],\n f - i\n );\n }\n }\n};\n\nexport default Interpolation;\n","// import now from \"./Now\";\nimport { now } from \"@zyzgroup/core-common\";\nimport type { Tween, UnknownProps } from \"./Tween\";\n\n/**\n * Controlling groups of tweens\n *\n * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components.\n * In these cases, you may want to create your own smaller groups of tween\n */\nexport default class Group {\n private _tweens: {\n [key: string]: Tween<UnknownProps>;\n } = {};\n\n private _tweensAddedDuringUpdate: {\n [key: string]: Tween<UnknownProps>;\n } = {};\n\n getAll(): Array<Tween<UnknownProps>> {\n return Object.keys(this._tweens).map((tweenId) => this._tweens[tweenId]);\n }\n\n removeAll(): void {\n this._tweens = {};\n }\n\n add(tween: Tween<UnknownProps>): void {\n this._tweens[tween.getId()] = tween;\n this._tweensAddedDuringUpdate[tween.getId()] = tween;\n }\n\n remove(tween: Tween<UnknownProps>): void {\n delete this._tweens[tween.getId()];\n delete this._tweensAddedDuringUpdate[tween.getId()];\n }\n\n update(time: number = now(), preserve = false): boolean {\n const tweenIds = Object.keys(this._tweens);\n // if (tweenIds.length === 0) {\n // return false;\n // }\n // while (tweenIds.length > 0) {\n // this._tweensAddedDuringUpdate = {};\n for (let i = 0; i < tweenIds.length; i++) {\n const tween = this._tweens[tweenIds[i]];\n const autoStart = !preserve;\n if (tween && tween.update(time, autoStart) === false && !preserve) {\n delete this._tweens[tweenIds[i]];\n }\n }\n // tweenIds = Object.keys(this._tweensAddedDuringUpdate);\n // }\n // return true;\n return !!Object.keys(this._tweens).length;\n }\n}\n","import Group from \"./Group\";\n\nexport const mainGroup = new Group();\n","import Easing from \"./Easing\";\nimport Interpolation from \"./Interpolation\";\nimport Sequence from \"./Sequence\";\n// import now from \"./Now\";\nimport { now } from \"@zyzgroup/core-common\";\nimport { mainGroup } from \"./mainGroup\";\n\nimport type { EasingFunction } from \"./Easing\";\nimport type { InterpolationFunction } from \"./Interpolation\";\nimport type Group from \"./Group\";\n\nexport type UnknownProps = Record<string, any>;\n\nexport class Tween<T extends UnknownProps> {\n private _id = Sequence.nextId();\n\n // 是否正在执行\n private _isPlaying = false;\n // 动画开始时间\n private _startTime = 0;\n // 动画延迟时间\n private _delayTime = 0;\n // 动画持续时间\n private _durationTime = 1000;\n\n // 是否暂停\n private _isPaused = false;\n // 暂停开始时间\n private _pauseStartTime = 0;\n\n // 动画重复次数初始值\n private _initialRepeat = 0;\n // 动画重复次数剩余值\n private _repeat = 0;\n // 动画重复间隔\n private _repeatDelayTime?: number;\n // 动画重复时是否倒置\n private _yoyo = false;\n // 是否倒置运行\n private _reversed = false;\n\n // 初始值\n private _valuesStart: UnknownProps = {};\n // 结束值\n private _valuesEnd: Record<string, number | string> = {};\n // reverse时的初始值\n private _valuesStartRepeat: UnknownProps = {};\n\n // 缓动函数\n private _easingFunction: EasingFunction = Easing.Linear.None;\n // 插值函数\n private _interpolationFunction: InterpolationFunction = Interpolation.Linear;\n\n // 链式动画数组\n private _chainedTweens: Array<Tween<any>> = [];\n // 链式动画是否已停止\n private _isChainStopped = false;\n\n // 动画开始hook\n private _onStartCallback?: (object: T) => void;\n // 动画开始hook是否已被执行\n private _onStartCallbackFired = false;\n // 动画每轮repeat开始hook\n private _onEveryStartCallback?: (object: T) => void;\n // 动画每轮repeat开始hook是否已被执行\n private _onEveryStartCallbackFired = false;\n // 动画更新hook\n private _onUpdateCallback?: (object: T, elapsed: number) => void;\n // 动画repeat hook\n private _onRepeatCallback?: (object: T) => void;\n // 动画完成hook\n private _onCompleteCallback?: (object: T) => void;\n // 动画结束hook\n private _onStopCallback?: (object: T) => void;\n // 是否强制结束动画\n private _goToEnd = false;\n\n constructor(private _object: T, private _group: Group | false = mainGroup) {}\n\n getId(): number {\n return this._id;\n }\n\n isPlaying(): boolean {\n return this._isPlaying;\n }\n\n isPaused(): boolean {\n return this._isPaused;\n }\n\n to(properties: UnknownProps, duration?: number): this {\n this._valuesEnd = Object.create(properties);\n if (duration !== undefined) {\n this._durationTime = duration;\n }\n return this;\n }\n\n duration(d = 1000): this {\n this._durationTime = d;\n return this;\n }\n\n start(time: number = now()): this {\n if (this._isPlaying) {\n return this;\n }\n this._group && this._group.add(this as Tween<UnknownProps>);\n this._repeat = this._initialRepeat;\n if (this._reversed) {\n this._reversed = false;\n for (const property in this._valuesStartRepeat) {\n this._swapEndStartRepeatValues(property);\n this._valuesStart[property] = this._valuesStartRepeat[property];\n }\n }\n this._isPlaying = true;\n this._isPaused = false;\n this._onStartCallbackFired = false;\n this._onEveryStartCallbackFired = false;\n this._isChainStopped = false;\n this._startTime = time;\n this._startTime += this._delayTime;\n this._setupProperties(\n this._object,\n this._valuesStart,\n this._valuesEnd,\n this._valuesStartRepeat\n );\n return this;\n }\n\n private _setupProperties(\n _object: UnknownProps,\n _valuesStart: UnknownProps,\n _valuesEnd: UnknownProps,\n _valuesStartRepeat: UnknownProps\n ): void {\n for (const property in _valuesEnd) {\n const startValue = _object[property];\n const startValueIsArray = Array.isArray(startValue);\n const propType = startValueIsArray ? \"array\" : typeof startValue;\n const isInterpolationList =\n !startValueIsArray && Array.isArray(_valuesEnd[property]);\n if (propType === \"undefined\" || propType === \"function\") {\n continue;\n }\n if (isInterpolationList) {\n let endValues = _valuesEnd[property] as Array<number | string>;\n if (endValues.length === 0) {\n continue;\n }\n endValues = endValues.map(\n this._handleRelativeValue.bind(this, startValue as number)\n );\n _valuesEnd[property] = [startValue].concat(endValues);\n }\n if (\n (propType === \"object\" || startValueIsArray) &&\n startValue &&\n !isInterpolationList\n ) {\n _valuesStart[property] = startValueIsArray ? [] : {};\n for (const prop in startValue as object) {\n _valuesStart[property][prop] = startValue[prop];\n }\n _valuesStartRepeat[property] = startValueIsArray ? [] : {}; // TODO? repeat nested values? And yoyo? And array values?\n this._setupProperties(\n startValue,\n _valuesStart[property],\n _valuesEnd[property],\n _valuesStartRepeat[property]\n );\n } else {\n if (typeof _valuesStart[property] === \"undefined\") {\n _valuesStart[property] = startValue;\n }\n if (!startValueIsArray) {\n _valuesStart[property] *= 1.0;\n }\n if (isInterpolationList) {\n _valuesStartRepeat[property] = _valuesEnd[property].slice().reverse();\n } else {\n _valuesStartRepeat[property] = _valuesStart[property] || 0;\n }\n }\n }\n }\n\n stop(): this {\n if (!this._isChainStopped) {\n this._isChainStopped = true;\n this.stopChainedTweens();\n }\n if (!this._isPlaying) {\n return this;\n }\n this._group && this._group.remove(this as Tween<UnknownProps>);\n this._isPlaying = false;\n this._isPaused = false;\n if (this._onStopCallback) {\n this._onStopCallback(this._object);\n }\n return this;\n }\n\n end(): this {\n this._goToEnd = true;\n this.update(Infinity);\n return this;\n }\n\n pause(time: number = now()): this {\n if (this._isPaused || !this._isPlaying) {\n return this;\n }\n this._isPaused = true;\n this._pauseStartTime = time;\n this._group && this._group.remove(this as Tween<UnknownProps>);\n return this;\n }\n\n resume(time: number = now()): this {\n if (!this._isPaused || !this._isPlaying) {\n return this;\n }\n this._isPaused = false;\n this._startTime += time - this._pauseStartTime;\n this._pauseStartTime = 0;\n this._group && this._group.add(this as Tween<UnknownProps>);\n return this;\n }\n\n stopChainedTweens(): this {\n for (\n let i = 0, numChainedTweens = this._chainedTweens.length;\n i < numChainedTweens;\n i++\n ) {\n this._chainedTweens[i].stop();\n }\n return this;\n }\n\n group(group = mainGroup): this {\n this._group = group;\n return this;\n }\n\n delay(amount = 0): this {\n this._delayTime = amount;\n return this;\n }\n\n repeat(times = 0): this {\n this._initialRepeat = times;\n this._repeat = times;\n return this;\n }\n\n repeatDelay(amount?: number): this {\n this._repeatDelayTime = amount;\n return this;\n }\n\n yoyo(yoyo = false): this {\n this._yoyo = yoyo;\n return this;\n }\n\n easing(easingFunction: EasingFunction = Easing.Linear.None): this {\n this._easingFunction = easingFunction;\n return this;\n }\n\n interpolation(\n interpolationFunction: InterpolationFunction = Interpolation.Linear\n ): this {\n this._interpolationFunction = interpolationFunction;\n return this;\n }\n\n chain(...tweens: Array<Tween<any>>): this {\n this._chainedTweens = tweens;\n return this;\n }\n\n onStart(callback?: (object: T) => void): this {\n this._onStartCallback = callback;\n return this;\n }\n\n onEveryStart(callback?: (object: T) => void): this {\n this._onEveryStartCallback = callback;\n return this;\n }\n\n onUpdate(callback?: (object: T, elapsed: number) => void): this {\n this._onUpdateCallback = callback;\n return this;\n }\n\n onRepeat(callback?: (object: T) => void): this {\n this._onRepeatCallback = callback;\n return this;\n }\n\n onComplete(callback?: (object: T) => void): this {\n this._onCompleteCallback = callback;\n return this;\n }\n\n onStop(callback?: (object: T) => void): this {\n this._onStopCallback = callback;\n return this;\n }\n\n /**\n * @returns true if the tween is still playing after the update, false otherwise\n */\n update(time = now(), autoStart = true): boolean {\n if (this._isPaused) return true;\n let property;\n let elapsed;\n const endTime = this._startTime + this._durationTime;\n if (!this._goToEnd && !this._isPlaying) {\n if (time > endTime) return false;\n if (autoStart) this.start(time);\n }\n this._goToEnd = false;\n if (time < this._startTime) {\n return true;\n }\n if (this._onStartCallbackFired === false) {\n if (this._onStartCallback) {\n this._onStartCallback(this._object);\n }\n this._onStartCallbackFired = true;\n }\n if (this._onEveryStartCallbackFired === false) {\n if (this._onEveryStartCallback) {\n this._onEveryStartCallback(this._object);\n }\n this._onEveryStartCallbackFired = true;\n }\n elapsed = (time - this._startTime) / this._durationTime;\n elapsed = this._durationTime === 0 || elapsed > 1 ? 1 : elapsed;\n const value = this._easingFunction(elapsed);\n this._updateProperties(\n this._object,\n this._valuesStart,\n this._valuesEnd,\n value\n );\n if (this._onUpdateCallback) {\n this._onUpdateCallback(this._object, elapsed);\n }\n if (elapsed === 1) {\n if (this._repeat > 0) {\n if (isFinite(this._repeat)) {\n this._repeat--;\n }\n for (property in this._valuesStartRepeat) {\n if (!this._yoyo && typeof this._valuesEnd[property] === \"string\") {\n this._valuesStartRepeat[property] =\n this._valuesStartRepeat[property] +\n parseFloat(this._valuesEnd[property] as string);\n }\n if (this._yoyo) {\n this._swapEndStartRepeatValues(property);\n }\n this._valuesStart[property] = this._valuesStartRepeat[property];\n }\n if (this._yoyo) {\n this._reversed = !this._reversed;\n }\n if (this._repeatDelayTime !== undefined) {\n this._startTime = time + this._repeatDelayTime;\n } else {\n this._startTime = time + this._delayTime;\n }\n if (this._onRepeatCallback) {\n this._onRepeatCallback(this._object);\n }\n this._onEveryStartCallbackFired = false;\n return true;\n } else {\n if (this._onCompleteCallback) {\n this._onCompleteCallback(this._object);\n }\n for (\n let i = 0, numChainedTweens = this._chainedTweens.length;\n i < numChainedTweens;\n i++\n ) {\n // Make the chained tweens start exactly at the time they should,\n // even if the `update()` method was called way past the duration of the tween\n this._chainedTweens[i].start(this._startTime + this._durationTime);\n }\n this._isPlaying = false;\n return false;\n }\n }\n return true;\n }\n\n private _updateProperties(\n _object: UnknownProps,\n _valuesStart: UnknownProps,\n _valuesEnd: UnknownProps,\n value: number\n ): void {\n for (const property in _valuesEnd) {\n if (_valuesStart[property] === undefined) {\n continue;\n }\n const start = _valuesStart[property] || 0;\n let end = _valuesEnd[property];\n const startIsArray = Array.isArray(_object[property]);\n const endIsArray = Array.isArray(end);\n const isInterpolationList = !startIsArray && endIsArray;\n if (isInterpolationList) {\n _object[property] = this._interpolationFunction(\n end as Array<number>,\n value\n );\n } else if (typeof end === \"object\" && end) {\n this._updateProperties(_object[property], start, end, value);\n } else {\n end = this._handleRelativeValue(\n start as number,\n end as number | string\n );\n if (typeof end === \"number\") {\n _object[property] = start + (end - start) * value;\n }\n }\n }\n }\n\n // Parses relative end values with start as base (e.g.: +10, -3)\n private _handleRelativeValue(start: number, end: number | string): number {\n if (typeof end !== \"string\") {\n return end;\n }\n if (end.charAt(0) === \"+\" || end.charAt(0) === \"-\") {\n return start + parseFloat(end);\n } else {\n return parseFloat(end);\n }\n }\n\n private _swapEndStartRepeatValues(property: string): void {\n const tmp = this._valuesStartRepeat[property];\n const endValue = this._valuesEnd[property];\n if (typeof endValue === \"string\") {\n this._valuesStartRepeat[property] =\n this._valuesStartRepeat[property] + parseFloat(endValue);\n } else {\n this._valuesStartRepeat[property] = endValue;\n }\n this._valuesEnd[property] = tmp;\n }\n}\n\nexport default Tween;\n","import { now } from \"@zyzgroup/core-common\";\n\nexport class Clock {\n autoStart: boolean;\n startTime: number;\n oldTime: number;\n elapsedTime: number;\n running: boolean;\n\n constructor(autoStart = true) {\n this.autoStart = autoStart;\n this.startTime = 0;\n this.oldTime = 0;\n this.elapsedTime = 0;\n this.running = false;\n }\n\n start() {\n this.startTime = now();\n this.oldTime = this.startTime;\n this.elapsedTime = 0;\n this.running = true;\n }\n\n stop() {\n this.getElapsedTime();\n this.running = false;\n this.autoStart = false;\n }\n\n /// 毫秒\n getElapsedTime() {\n this.getDelta();\n return this.elapsedTime;\n }\n\n /// 毫秒\n getDelta() {\n let diff = 0;\n if (this.autoStart && !this.running) {\n this.start();\n return 0;\n }\n if (this.running) {\n const newTime = now();\n diff = newTime - this.oldTime;\n this.oldTime = newTime;\n this.elapsedTime += diff;\n }\n return diff;\n }\n}\n\nexport default Clock;\n","import {\n ShellSort,\n deleteArrayItem\n // AsyncTaskQueue\n} from \"@zyzgroup/core-common\";\nimport {\n Tween,\n Easing,\n reverseEasing,\n type EasingFunction,\n Interpolation,\n type InterpolationFunction\n} from \"./tween\";\nimport { requestAnimationFrameCycle } from \"./schedule\";\nimport Clock from \"./Clock\";\n// import gsap from \"gsap\";\n\nexport type TweenValue = Record<string, any>;\n\nexport type TweenRawOptions = {\n /// 动画占用帧数\n frames?: number;\n /// 开始帧数\n delay?: number;\n easeFunction?: EasingFunction;\n interpolationFunction?: InterpolationFunction;\n repeat?: number | typeof Infinity;\n yoyo?: boolean;\n onStart?: (currentValue: TweenValue) => void;\n onUpdate?: (currentValue: TweenValue, elapsed: number) => void;\n onComplete?: (currentValue: TweenValue) => void;\n};\n\ntype TimelineTweenConfig = Required<TweenRawOptions> & {\n fromValues: TweenValue;\n // number[] 代表使用插值\n toValues: TweenValue;\n tween?: Tween<TweenValue>;\n};\n\nexport class Timeline {\n public tweens: TimelineTweenConfig[] = [];\n\n /// 异步任务队列\n // private taskQueue: AsyncTaskQueue = new AsyncTaskQueue(1);\n\n /// 每帧时间\n public frameDuration: number;\n public onGroupStart?: () => void;\n public onGroupComplete?: () => void;\n\n constructor(options?: {\n frameDuration?: number;\n onGroupStart?: () => void;\n onGroupComplete?: () => void;\n }) {\n this.frameDuration = options?.frameDuration || 1000;\n this.onGroupStart = options?.onGroupStart;\n this.onGroupComplete = options?.onGroupComplete;\n }\n\n public get count(): number {\n return this.tweens.length;\n }\n\n public clear(): void {\n this.tweens = [];\n }\n\n private sort(reverse = false) {\n ShellSort<TimelineTweenConfig>(\n this.tweens,\n (a: TimelineTweenConfig, b: TimelineTweenConfig) =>\n !reverse ? a.delay <= b.delay : a.delay > b.delay\n );\n }\n\n private cloneTweens(\n tweens: TimelineTweenConfig[] = this.tweens\n ): TimelineTweenConfig[] {\n const clones: TimelineTweenConfig[] = [];\n tweens.forEach((tween) => {\n const t = { ...tween };\n delete t.tween;\n t.fromValues = { ...t.fromValues };\n t.toValues = { ...t.toValues };\n clones.push(t);\n });\n return clones;\n }\n\n public addTween(\n fromValues: TweenValue,\n toValues: TweenValue,\n options?: TweenRawOptions\n ): this {\n const tweenConfig = {\n fromValues,\n toValues,\n frames: typeof options?.frames === \"number\" ? options.frames : 1,\n /// 默认顺序执行\n delay:\n typeof options?.delay === \"number\" ? options.delay : this.tweens.length,\n easeFunction: options?.easeFunction || Easing.Linear.None,\n interpolationFunction:\n options?.interpolationFunction || Interpolation.Linear,\n repeat: typeof options?.repeat === \"number\" ? options.repeat : 0,\n yoyo: options?.yoyo || false,\n onStart: options?.onStart || (() => {}),\n onUpdate: options?.onUpdate || (() => {}),\n onComplete: options?.onComplete || (() => {})\n };\n this.tweens.push(tweenConfig);\n // this.sort();\n return this;\n }\n\n private cancelRequestAnimationCycle = () => {};\n private runTweens(tweens: TimelineTweenConfig[]): Promise<void> {\n this.cancelRequestAnimationCycle();\n const clock = new Clock();\n const frameDuration = this.frameDuration;\n return new Promise<void>((resolve) => {\n this.onGroupStart?.();\n this.cancelRequestAnimationCycle = requestAnimationFrameCycle(\n (t: number) => {\n if (this.isPaused) {\n // tweens.forEach((t) => {\n // if (t.tween && t.tween.isPlaying()) {\n // t.tween.pause();\n // }\n // });\n } else {\n const time = Math.max(0, t - this.pausedDuration);\n const duration = Math.max(\n 0,\n clock.getElapsedTime() - this.pausedDuration\n );\n tweens\n .filter((t) => t.delay * frameDuration <= duration)\n .forEach((t) => {\n /// 开始的tween\n if (!t.tween) {\n t.tween = new Tween({ ...t.fromValues })\n .to({ ...t.toValues }, t.frames * frameDuration)\n // .delay(t.delay * frameDuration)\n .easing(t.easeFunction)\n .interpolation(t.interpolationFunction)\n .repeat(t.repeat)\n .yoyo(t.yoyo)\n .onStart(t.onStart)\n .onUpdate(t.onUpdate)\n .onComplete(t.onComplete);\n t.tween.start(time);\n // tween.chain(tweenBack);\n // tweenBack.chain(tween);\n // tween.start();\n // tween.start(\"+2000\");\n // tween.start(\"-500\");\n // tween.stop();\n }\n // if (t.tween.isPaused()) {\n // t.tween.resume();\n // }\n if (\n /// 进行中的tween\n (t.delay + t.frames * (t.repeat + 1)) * frameDuration >\n duration\n ) {\n t.tween.update(time);\n } else {\n /// 结束的tween\n if (t.tween.isPlaying()) {\n t.tween.end();\n }\n deleteArrayItem(tweens, t);\n }\n });\n }\n const isContinue = !!tweens.length;\n if (!isContinue) {\n this.onGroupComplete?.();\n resolve();\n }\n return isContinue;\n }\n );\n });\n }\n\n public isPaused = false;\n private pausedClock = new Clock();\n private pausedDuration = 0;\n\n /// 注意传入的 tweens 为深拷贝新数据\n play(tweens: TimelineTweenConfig[] = this.cloneTweens(this.tweens)) {\n this.isPaused = false;\n this.pausedDuration = 0;\n // this.taskQueue.addTask(() => this.runTweens(tweens));\n this.runTweens(tweens);\n }\n\n reverse() {\n const reverseTweens = this.cloneTweens(this.tweens);\n let maxFrames = 0;\n reverseTweens.forEach((t) => {\n maxFrames = Math.max(maxFrames, t.delay + t.frames);\n t.easeFunction = reverseEasing(t.easeFunction);\n const temp = { ...t.toValues };\n t.toValues = { ...t.fromValues };\n t.fromValues = { ...temp };\n });\n /// 改变delay以改变执行顺序\n reverseTweens.forEach((t) => {\n t.delay = maxFrames - t.frames;\n });\n // reverseTweens.sort();\n this.play(reverseTweens);\n }\n\n pause() {\n this.pausedClock.start();\n this.isPaused = true;\n }\n\n resume() {\n this.pausedDuration += this.pausedClock.getElapsedTime();\n this.pausedClock.stop();\n this.isPaused = false;\n }\n}\n\nexport default Timeline;\n","import { type AnyElement, CacheMap } from \"@zyzgroup/core-common\";\nimport { VNode, hFromEl, patch } from \"../vnode\";\nimport { scheduleYZIdle } from \"../animate\";\n\nconst vnodes = new CacheMap<AnyElement, VNode>();\n\n// 更新 vnode to 真实dom\nconst patchs = (keep = true) => {\n vnodes.filter((el: AnyElement, vnode: VNode) => {\n if (vnode.alternate) {\n patch(vnode, vnode.alternate);\n if (keep) {\n vnodes.set(el, vnode.alternate);\n }\n vnode.alternate = undefined;\n }\n return keep;\n });\n};\n\n/// 利用 vnode 缓存数据\nexport function getVnode(el: AnyElement): VNode {\n let vnode = vnodes.get(el);\n if (!vnode) {\n vnode = hFromEl(el);\n vnodes.set(el, vnode);\n }\n return vnode;\n}\n\nfunction getAlternateVnode(el: AnyElement): VNode {\n const vnode = getVnode(el);\n if (!vnode.alternate) {\n vnode.alternate = hFromEl(el);\n }\n return vnode.alternate;\n}\n\nexport function immediateVnode(\n el: AnyElement,\n editVnodeImmediate: (vnode: VNode) => void,\n keep = true\n) {\n editVnodeImmediate(getAlternateVnode(el));\n patchs(keep);\n}\n\nexport function scheduleVnode(\n el: AnyElement,\n editVnodeImmediate: (vnode: VNode) => void,\n keep = true\n) {\n editVnodeImmediate(getAlternateVnode(el));\n scheduleYZIdle(\"FLUSH_DOM_ACTION\", () => patchs(keep), 50);\n}\n","/// 角度单位 degree(deg) radian(rad) turns(turn) gradian(grad)\n/// SVG 默认 deg\n\n/// 判断 CSS 中 transform rotate 旋转方向:\n/// 轻握左手,大拇指指向旋转轴正方向,四指指向的方向就是旋转正方向\n/// x轴正方向向右\n/// y轴正方向向下\n/// z轴正方向向外\n\n// css transform 影响的是视觉渲染,而不是布局\n\n// transform: none;\n// transform-style: flat; // preserve-3d | flat\n\n// transform-origin: center;\n// transform-origin: 50% 50%;\n// HTML element 默认坐标系原点在自身的(50%, 50%)处\n// SVG element 默认坐标系原点在svg画布的原点(0,0)处\n// 实测 SVG element 的 transform-origin 只能设置为百分比,且是相对svg画布的百分比,不是相对 html element 的百分比\n\n// viewBox=\"0 0 width height\"时,svg画布的原点(0,0)在屏幕左上点\n// viewBox=\"x y width height\"时,svg画布的原点(0,0)在屏幕左上点(0-x,0-y)处\n\n// transform 4 种变形方式\n// # 位移\n// \tCSS : translate(tx[, ty=0]) translateX(tx) translateY(ty)\n// \tSVG : translate(tx[ ty=0])\n// 连续的 translate(tx1 ty1) translate(tx2 ty2) = translate(tx1+tx2 ty1+ty2)\n// 还原 translate(tx ty) = translate(-tx -ty)\n// # 旋转\n// \tCSS : rotate(angle)\n// \tSVG : rotate(angle [centerX centerY])\n// 连续的 rotate(a1) rotate(a2) = rotate(a1+a2)\n// 还原 rotate(a1) = rotate(-a1)\n// # 缩放\n// \tCSS : scale(sx[, sy = sx]) scaleX(sx) scaleY(sy)\n// \tSVG : scale(sx[ sy = sx])\n// 连续的 scale(sx1 sy1) scale(sx2 sy2) = scale(sx1*sx2 sy1*sy2)\n// 还原 scale(sx sy) = scale(1/sx 1/sy)\n// # 倾斜\n// \tCSS : skewX(a) skewY(a)\n// \tSVG : skewX(a) skewY(a)\n// \tskewX(angle) 所有点x坐标变换,y坐标不变,相当于y轴倾斜,任何与x轴平行的边长度保持不变,y轴正方向向x轴正方向靠近为+angle\n// \tskewY(angle) 所有点y坐标变换,x坐标不变,相当于x轴倾斜,任何与y轴平行的边长度保持不变,x轴正方向向y轴正方向靠近为+angle\n// \t连续的 skewX(a1) skewX(a2) != skewX(a1 + a2)\n\n// 使用多个变换函数,每一个变换函数不仅改变了元素,同时也会改变和元素关联的transform坐标系\n// 当变换函数依次执行时,后一个变换函数总是基于前一个变换后的新transform坐标系\n// 即变换函数是通过数学上的矩阵乘法运算完成的,而矩阵的乘法是不满足交换律的\n// transform: scale(0.8, 1.5) rotate(35deg) skew(5deg, 20deg) translate(15px, 25px);\n\n/**\n * CSS系统\n * 0deg = 从下到上\n * 90deg = 从左到右\n * [0deg] [45deg]\n * ⬆ ⬈\n * * *\n * * *\n * * *\n * [-90deg] ⬅ * * * * * * * ⮕ [90deg]\n * *\n * *\n * *\n * ⬇\n * [180deg]\n */\n\n/**\n * canvas svg Vector 系统\n * [-90° / 270°]\n * *\n * *\n * *\n * [180°] * * * * * * * [0°]\n * *\n * *\n * *\n * [90°]\n */\n\nexport function toRadian(degree: number) {\n return (degree * Math.PI) / 180;\n}\n\nexport function toDegree(radian: number) {\n return (radian * 180) / Math.PI;\n}\n\nexport function length(x: number, y: number, z = 0) {\n return Math.sqrt(x * x + y * y + z * z);\n}\n\nexport function distance(x1: number, y1: number, x2: number, y2: number) {\n return length(x2 - x1, y2 - y1);\n}\nexport function distance2(x1: number, y1: number, x2: number, y2: number) {\n const x = x2 - x1;\n const y = y2 - y1;\n return x * x + y * y;\n}\n\n/// 返回从原点(0,0) 到 (x,y) 点的线段与 x 轴正方向之间的平面角度(弧度值)\nexport function angle(\n startX: number,\n startY: number,\n endX: number,\n endY: number\n): number {\n let radian = Math.atan2(endY - startY, endX - startX);\n if (radian < 0) {\n radian += Math.PI * 2;\n }\n return radian;\n}\n\nexport function polar(radian: number, length: number) {\n return {\n dx: Math.cos(radian) * length,\n dy: Math.sin(radian) * length\n };\n}\n\nexport function normalizePoint(x: number, y: number, z?: number) {\n if (typeof z === \"number\") {\n const length = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2));\n return {\n x: (x /= length),\n y: (y /= length),\n z: (z /= length)\n };\n } else {\n const length = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n return {\n x: (x /= length),\n y: (y /= length)\n };\n }\n}\n\n/// 根据起点终点返回方向\nexport function getDirection(\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n minDistance = 10\n): \"up\" | \"down\" | \"left\" | \"right\" | \"no\" {\n // 如果滑动距离太短\n if (\n Math.abs(endX - startX) < minDistance &&\n Math.abs(endY - startY) < minDistance\n ) {\n return \"no\";\n }\n const degree = toDegree(angle(startX, startY, endX, endY));\n if (degree >= -135 && degree <= -45) {\n return \"up\";\n } else if (degree > 45 && degree < 135) {\n return \"down\";\n } else if (\n (degree >= 135 && degree <= 180) ||\n (degree >= -180 && degree < -135)\n ) {\n return \"left\";\n } else {\n // if (degree >= -45 && degree <= 45) {\n return \"right\";\n }\n}\n","// Unpack entities lookup where the numbers are in radix 32 to reduce the size\n// entity mapping courtesy of tinymce\nconst namedEntities = createNamedToNumberedLookup(\n \"50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,\" +\n \"5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,\" +\n \"5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,\" +\n \"5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,\" +\n \"68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,\" +\n \"6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,\" +\n \"6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,\" +\n \"75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,\" +\n \"7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,\" +\n \"7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,\" +\n \"sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,\" +\n \"st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,\" +\n \"t9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,\" +\n \"tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,\" +\n \"u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,\" +\n \"81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,\" +\n \"8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,\" +\n \"8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,\" +\n \"8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,\" +\n \"8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,\" +\n \"nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,\" +\n \"rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,\" +\n \"Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,\" +\n \"80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,\" +\n \"811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro\",\n 32\n);\n\nfunction createNamedToNumberedLookup(itemsString: string, radix = 10) {\n const lookup = {} as Record<string, string>;\n const items = itemsString.split(\",\");\n // Map from named to numbered entities.\n for (let i = 0; i < items.length; i += 2) {\n const entity = \"&\" + items[i + 1] + \";\";\n const base10 = parseInt(items[i], radix);\n lookup[entity] = \"&#\" + base10 + \";\";\n }\n // FF and IE need to create a regex from hex values ie &nbsp; == \\xa0\n lookup[\"\\\\xa0\"] = \"&#160;\";\n return lookup;\n}\n\nfunction format(str: string, args: Record<string, string | number>) {\n const keys = Object.keys(args);\n for (let i = 0; i < keys.length; i++) {\n str = str.replace(\n new RegExp(\"{\" + keys[i] + \"}\", \"gi\"),\n \"\" + args[keys[i]]\n );\n }\n return str;\n}\n\nfunction randomString(holder: { [x: string]: any }) {\n let randomstring, i;\n if (!holder) {\n throw new Error(\n \"cannot create a random attribute name for an undefined object\"\n );\n }\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz\";\n randomstring = \"\";\n do {\n randomstring = \"\";\n for (i = 0; i < 12; i++) {\n randomstring += chars[Math.floor(Math.random() * chars.length)];\n }\n } while (holder[randomstring]);\n return randomstring;\n}\n\n// helper function to map canvas-textAlign to svg-textAnchor\nfunction getTextAnchor(textAlign: string) {\n // TODO: support rtl languages\n const mapping = {\n left: \"start\",\n right: \"end\",\n center: \"middle\",\n start: \"start\",\n end: \"end\"\n } as Record<string, string>;\n return mapping[textAlign] || mapping.start;\n}\n\n// helper function to map canvas-textBaseline to svg-dominantBaseline\nfunction getDominantBaseline(textBaseline: string) {\n // INFO: not supported in all browsers\n const mapping = {\n alphabetic: \"alphabetic\",\n hanging: \"hanging\",\n top: \"text-before-edge\",\n bottom: \"text-after-edge\",\n middle: \"central\"\n } as Record<string, string>;\n return mapping[textBaseline] || mapping.alphabetic;\n}\n\n// Some basic mappings for attributes and default values.\nconst STYLES: Record<\n string,\n {\n svgAttr?: string; // corresponding svg attribute\n canvas?: string | number | string[] | number[]; // canvas default\n svg?: string | number | null; // svg default\n apply?: string; // apply on stroke() or fill()\n }\n> = {\n strokeStyle: {\n svgAttr: \"stroke\",\n canvas: \"#000000\",\n svg: \"none\",\n apply: \"stroke\"\n },\n fillStyle: {\n svgAttr: \"fill\",\n canvas: \"#000000\",\n svg: null, // svg default is black, but we need to special case this to handle canvas stroke without fill\n apply: \"fill\"\n },\n lineCap: {\n svgAttr: \"stroke-linecap\",\n canvas: \"butt\",\n svg: \"butt\",\n apply: \"stroke\"\n },\n lineJoin: {\n svgAttr: \"stroke-linejoin\",\n canvas: \"miter\",\n svg: \"miter\",\n apply: \"stroke\"\n },\n miterLimit: {\n svgAttr: \"stroke-miterlimit\",\n canvas: 10,\n svg: 4,\n apply: \"stroke\"\n },\n lineWidth: {\n svgAttr: \"stroke-width\",\n canvas: 1,\n svg: 1,\n apply: \"stroke\"\n },\n globalAlpha: {\n svgAttr: \"opacity\",\n canvas: 1,\n svg: 1,\n apply: \"fill stroke\"\n },\n font: {\n // font converts to multiple svg attributes, there is custom logic for this\n canvas: \"10px sans-serif\"\n },\n shadowColor: {\n canvas: \"#000000\"\n },\n shadowOffsetX: {\n canvas: 0\n },\n shadowOffsetY: {\n canvas: 0\n },\n shadowBlur: {\n canvas: 0\n },\n textAlign: {\n canvas: \"start\"\n },\n textBaseline: {\n canvas: \"alphabetic\"\n },\n lineDash: {\n svgAttr: \"stroke-dasharray\",\n canvas: [],\n svg: null,\n apply: \"stroke\"\n },\n lineDashOffset: {\n svgAttr: \"stroke-dashoffset\",\n canvas: 0,\n svg: 0,\n apply: \"stroke\"\n }\n};\n\nexport class CustomCanvasGradient {\n __root: SVGElement;\n __ctx: CustomCanvasContext;\n constructor(gradientNode: SVGElement, ctx: CustomCanvasContext) {\n this.__root = gradientNode;\n this.__ctx = ctx;\n }\n\n /**\n * Adds a color stop to the gradient root\n */\n addColorStop(offset: number, color: string) {\n const stop = this.__ctx.__createElement(\"stop\");\n stop.setAttribute(\"offset\", \"\" + offset);\n if (color.indexOf(\"rgba\") !== -1) {\n // separate alpha value, since webkit can't handle it\n const regex =\n /rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d?\\.?\\d*)\\s*\\)/gi;\n const matches = regex.exec(color);\n if (matches) {\n stop.setAttribute(\n \"stop-color\",\n format(\"rgb({r},{g},{b})\", {\n r: matches[1],\n g: matches[2],\n b: matches[3]\n })\n );\n stop.setAttribute(\"stop-opacity\", matches[4]);\n }\n } else {\n stop.setAttribute(\"stop-color\", color);\n }\n this.__root.appendChild(stop);\n }\n}\n\nexport class CustomCanvasPattern {\n __root: SVGElement;\n __ctx: CustomCanvasContext;\n constructor(pattern: SVGElement, ctx: CustomCanvasContext) {\n this.__root = pattern;\n this.__ctx = ctx;\n }\n}\n\n/**\n * The mock canvas context\n */\nexport class CustomCanvasContext {\n [index: keyof typeof STYLES]: any;\n\n __document: Document = document;\n __canvas: HTMLCanvasElement;\n __ctx: CanvasRenderingContext2D;\n width: number;\n height: number;\n __styleStack: Record<string, any>[];\n __groupStack: SVGElement[];\n __rootSVG: SVGElement;\n __ids: Record<string, string>;\n __SVGdefs: SVGDefsElement;\n __currentElement: SVGElement;\n __currentElementsToStyle: {\n element: SVGElement;\n children: SVGElement[];\n } | null = null;\n\n constructor({\n canvas,\n width = 500,\n height = 500\n }: {\n canvas?: HTMLCanvasElement;\n width?: number;\n height?: number;\n }) {\n if (canvas) {\n this.__canvas = canvas;\n this.__ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n this.width = canvas.width;\n this.height = canvas.height;\n } else {\n this.__canvas = this.__document.createElement(\"canvas\");\n this.__ctx = this.__canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n this.width = width;\n this.height = height;\n }\n\n this.__setDefaultStyles();\n this.__styleStack = [this.__getStyleState()];\n this.__groupStack = [];\n\n this.__rootSVG = this.__document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"svg\"\n );\n this.__rootSVG.setAttribute(\"version\", \"1.1\");\n this.__rootSVG.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n this.__rootSVG.setAttributeNS(\n \"http://www.w3.org/2000/xmlns/\",\n \"xmlns:xlink\",\n \"http://www.w3.org/1999/xlink\"\n );\n this.__rootSVG.setAttribute(\"width\", \"\" + this.width);\n this.__rootSVG.setAttribute(\"height\", \"\" + this.height);\n\n // make sure we don't generate the same ids in defs\n this.__ids = {};\n\n // defs tag\n this.__SVGdefs = this.__document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"defs\"\n );\n this.__rootSVG.appendChild(this.__SVGdefs);\n\n // also add a group child. the svg element can't use the transform attribute\n this.__currentElement = this.__document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"g\"\n );\n this.__rootSVG.appendChild(this.__currentElement);\n }\n\n /**\n * Applies default canvas styles to the context\n */\n __setDefaultStyles() {\n // default 2d canvas context properties see: http://www.w3.org/TR/2dcontext/\n const keys = Object.keys(STYLES);\n for (let i = 0, length = keys.length; i < length; i++) {\n const key = keys[i];\n this[key] = STYLES[key].canvas;\n }\n }\n\n /**\n * Gets the current style state\n */\n __getStyleState() {\n const styleState: Record<string, any> = {};\n const keys = Object.keys(STYLES);\n for (let i = 0, length = keys.length; i < length; i++) {\n const key = keys[i];\n styleState[key] = this[key];\n }\n return styleState;\n }\n\n /**\n * Applies styles on restore\n */\n __applyStyleState(styleState: Record<string, any>) {\n const keys = Object.keys(styleState);\n for (let i = 0, length = keys.length; i < length; i++) {\n const key = keys[i];\n this[key] = styleState[key];\n }\n }\n\n /**\n * Creates the specified svg element\n */\n __createElement(\n elementName: string,\n properties: Record<string, any> = {},\n resetFill = false\n ) {\n const element = this.__document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n elementName\n );\n const keys = Object.keys(properties);\n if (resetFill) {\n // if fill or stroke is not specified, the svg element should not display. By default SVG's fill is black.\n element.setAttribute(\"fill\", \"none\");\n element.setAttribute(\"stroke\", \"none\");\n }\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n element.setAttribute(key, properties[key]);\n }\n return element;\n }\n\n /**\n * Apples the current styles to the current SVG element. On \"CustomCanvasContext.fill\" or \"CustomCanvasContext.stroke\"\n */\n __applyStyleToCurrentElement(type: \"fill\" | \"stroke\") {\n let currentElement = this.__currentElement;\n const currentStyleGroup = this.__currentElementsToStyle;\n if (currentStyleGroup) {\n currentElement.setAttribute(type, \"\");\n currentElement = currentStyleGroup.element;\n currentStyleGroup.children.forEach((node: SVGElement) => {\n node.setAttribute(type, \"\");\n });\n }\n\n const keys = Object.keys(STYLES);\n for (let i = 0; i < keys.length; i++) {\n const style = STYLES[keys[i]];\n const value = this[keys[i]];\n if (style.apply) {\n if (value instanceof CustomCanvasPattern) {\n if (value.__ctx) {\n // copy over defs\n while (value.__ctx.__SVGdefs.childNodes.length) {\n const id = (\n value.__ctx.__SVGdefs.childNodes[0] as SVGElement\n ).getAttribute(\"id\") as string;\n this.__ids[id] = id;\n this.__SVGdefs.appendChild(value.__ctx.__SVGdefs.childNodes[0]);\n }\n }\n currentElement.setAttribute(\n style.apply,\n format(\"url(#{id})\", {\n id: value.__root.getAttribute(\"id\") as string\n })\n );\n } else if (value instanceof CustomCanvasGradient) {\n currentElement.setAttribute(\n style.apply,\n format(\"url(#{id})\", {\n id: value.__root.getAttribute(\"id\") as string\n })\n );\n } else if (style.apply.indexOf(type) !== -1 && style.svg !== value) {\n if (\n (style.svgAttr === \"stroke\" || style.svgAttr === \"fill\") &&\n value.indexOf(\"rgba\") !== -1\n ) {\n // separate alpha value, since illustrator can't handle it\n const regex =\n /rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d?\\.?\\d*)\\s*\\)/gi;\n const matches = regex.exec(value);\n if (matches) {\n currentElement.setAttribute(\n style.svgAttr,\n format(\"rgb({r},{g},{b})\", {\n r: matches[1],\n g: matches[2],\n b: matches[3]\n })\n );\n // should take globalAlpha here\n let opacity = parseFloat(matches[4]);\n const globalAlpha = this.globalAlpha;\n if (globalAlpha != null) {\n opacity *= globalAlpha;\n }\n currentElement.setAttribute(\n style.svgAttr + \"-opacity\",\n \"\" + opacity\n );\n }\n } else {\n let attr = style.svgAttr;\n if (keys[i] === \"globalAlpha\") {\n attr = type + \"-\" + style.svgAttr;\n if (currentElement.getAttribute(attr)) {\n // fill-opacity or stroke-opacity has already been set by stroke or fill.\n continue;\n }\n }\n //otherwise only update attribute if right type, and not svg default\n if (attr) currentElement.setAttribute(attr, value);\n }\n }\n }\n }\n }\n\n /**\n * Will return the closest group or svg node. May return the current element.\n */\n __closestGroupOrSvg(node?: SVGElement | null): SVGElement {\n node = node || this.__currentElement;\n if (node.nodeName === \"g\" || node.nodeName === \"svg\") {\n return node;\n } else {\n return this.__closestGroupOrSvg(node.parentNode as unknown as SVGElement);\n }\n }\n\n /**\n * Returns the serialized value of the svg so far\n * @param fixNamedEntities - Standalone SVG doesn't support named entities, which document.createTextNode encodes.\n * If true, we attempt to find all named entities and encode it as a numeric entity.\n * @return serialized svg\n */\n getSerializedSvg(fixNamedEntities: boolean) {\n let serialized = new XMLSerializer().serializeToString(this.__rootSVG);\n\n // IE search for a duplicate xmnls because they didn't implement setAttributeNS correctly\n const xmlns =\n /xmlns=\"http:\\/\\/www\\.w3\\.org\\/2000\\/svg\".+xmlns=\"http:\\/\\/www\\.w3\\.org\\/2000\\/svg/gi;\n if (xmlns.test(serialized)) {\n serialized = serialized.replace(\n 'xmlns=\"http://www.w3.org/2000/svg',\n 'xmlns:xlink=\"http://www.w3.org/1999/xlink'\n );\n }\n\n if (fixNamedEntities) {\n const keys = Object.keys(namedEntities);\n //loop over each named entity and replace with the proper equivalent.\n for (let i = 0, length = keys.length; i < length; i++) {\n const key = keys[i];\n const value = namedEntities[key];\n const regexp = new RegExp(key, \"gi\");\n if (regexp.test(serialized)) {\n serialized = serialized.replace(regexp, value);\n }\n }\n }\n\n return serialized;\n }\n\n /**\n * Returns the root svg\n */\n getSvg() {\n return this.__rootSVG;\n }\n\n /**\n * Will generate a group tag\n */\n save() {\n const group = this.__createElement(\"g\");\n const parent = this.__closestGroupOrSvg();\n this.__groupStack.push(parent);\n parent.appendChild(group);\n this.__currentElement = group;\n this.__styleStack.push(this.__getStyleState());\n }\n\n /**\n * Sets current element to parent, or just root if already root\n */\n restore() {\n this.__currentElementsToStyle = null;\n const currentElement = this.__groupStack.pop();\n // Clearing canvas will make the poped group invalid, currentElement is set to the root group node.\n if (!currentElement) {\n this.__currentElement = this.__rootSVG\n .childNodes[1] as unknown as SVGElement;\n } else {\n this.__currentElement = currentElement;\n }\n const state = this.__styleStack.pop();\n if (state) {\n this.__applyStyleState(state);\n }\n }\n\n /**\n * Helper method to add transform\n */\n __addTransform(t: string) {\n // if the current element has siblings, add another group\n const parent = this.__closestGroupOrSvg();\n if (parent.childNodes.length > 0) {\n if (this.__currentElement.nodeName === \"path\") {\n if (!this.__currentElementsToStyle)\n this.__currentElementsToStyle = { element: parent, children: [] };\n this.__currentElementsToStyle.children.push(this.__currentElement);\n this.__applyCurrentDefaultPath();\n }\n const group = this.__createElement(\"g\");\n parent.appendChild(group);\n this.__currentElement = group;\n }\n\n let transform = this.__currentElement.getAttribute(\"transform\");\n if (transform) {\n transform += \" \";\n } else {\n transform = \"\";\n }\n transform += t;\n this.__currentElement.setAttribute(\"transform\", transform);\n }\n\n /**\n * scales the current element\n */\n scale(x: number, y?: number) {\n if (y === undefined) {\n y = x;\n }\n this.__addTransform(format(\"scale({x},{y})\", { x: x, y: y }));\n }\n\n /**\n * rotates the current element\n */\n rotate(angle: number) {\n const degrees = (angle * 180) / Math.PI;\n this.__addTransform(\n format(\"rotate({angle},{cx},{cy})\", {\n angle: degrees,\n cx: 0,\n cy: 0\n })\n );\n }\n\n /**\n * translates the current element\n */\n translate(x: number, y: number) {\n this.__addTransform(format(\"translate({x},{y})\", { x: x, y: y }));\n }\n\n /**\n * applies a transform to the current element\n */\n transform(a: number, b: number, c: number, d: number, e: number, f: number) {\n this.__addTransform(\n format(\"matrix({a},{b},{c},{d},{e},{f})\", {\n a: a,\n b: b,\n c: c,\n d: d,\n e: e,\n f: f\n })\n );\n }\n\n /**\n * Create a new Path Element\n */\n beginPath() {\n // Note that there is only one current default path, it is not part of the drawing state.\n // See also: https://html.spec.whatwg.org/multipage/scripting.html#current-default-path\n this.__currentDefaultPath = \"\";\n this.__currentPosition = {};\n\n const path = this.__createElement(\"path\", {}, true);\n const parent = this.__closestGroupOrSvg();\n parent.appendChild(path);\n this.__currentElement = path;\n }\n\n /**\n * Helper function to apply currentDefaultPath to current path element\n */\n __applyCurrentDefaultPath() {\n const currentElement = this.__currentElement;\n if (currentElement.nodeName === \"path\") {\n currentElement.setAttribute(\"d\", this.__currentDefaultPath);\n } else {\n // console.error(\n // \"Attempted to apply path command to node\",\n // currentElement.nodeName\n // );\n }\n }\n\n /**\n * Helper function to add path command\n */\n __addPathCommand(command: string) {\n this.__currentDefaultPath += \" \";\n this.__currentDefaultPath += command;\n }\n\n /**\n * Adds the move command to the current path element,\n * if the currentPathElement is not empty create a new path element\n */\n moveTo(x: number, y: number) {\n if (this.__currentElement.nodeName !== \"path\") {\n this.beginPath();\n }\n\n // creates a new subpath with the given point\n this.__currentPosition = { x: x, y: y };\n this.__addPathCommand(format(\"M {x} {y}\", this.__currentPosition));\n }\n\n /**\n * Closes the current path\n */\n closePath() {\n if (this.__currentDefaultPath) {\n this.__addPathCommand(\"Z\");\n }\n }\n\n /**\n * Adds a line to command\n */\n lineTo(x: number, y: number) {\n this.__currentPosition = { x: x, y: y };\n if (this.__currentDefaultPath.indexOf(\"M\") > -1) {\n this.__addPathCommand(format(\"L {x} {y}\", this.__currentPosition));\n } else {\n this.__addPathCommand(format(\"M {x} {y}\", this.__currentPosition));\n }\n }\n\n /**\n * Add a bezier command\n */\n bezierCurveTo(\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n x: number,\n y: number\n ) {\n this.__currentPosition = { x: x, y: y };\n this.__addPathCommand(\n format(\"C {cp1x} {cp1y} {cp2x} {cp2y} {x} {y}\", {\n cp1x: cp1x,\n cp1y: cp1y,\n cp2x: cp2x,\n cp2y: cp2y,\n x: x,\n y: y\n })\n );\n }\n\n /**\n * Adds a quadratic curve to command\n */\n quadraticCurveTo(cpx: number, cpy: number, x: number, y: number) {\n this.__currentPosition = { x: x, y: y };\n this.__addPathCommand(\n format(\"Q {cpx} {cpy} {x} {y}\", { cpx: cpx, cpy: cpy, x: x, y: y })\n );\n }\n\n /**\n * Return a new normalized vector of given vector\n */\n normalize(vector: [number, number]) {\n const len = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]);\n return [vector[0] / len, vector[1] / len];\n }\n\n /**\n * Adds the arcTo to the current path\n *\n * @see http://www.w3.org/TR/2015/WD-2dcontext-20150514/#dom-context-2d-arcto\n */\n arcTo(x1: number, y1: number, x2: number, y2: number, radius: number) {\n // Let the point (x0, y0) be the last point in the subpath.\n const x0 = this.__currentPosition && this.__currentPosition.x;\n const y0 = this.__currentPosition && this.__currentPosition.y;\n\n // First ensure there is a subpath for (x1, y1).\n if (typeof x0 == \"undefined\" || typeof y0 == \"undefined\") {\n return;\n }\n\n // Negative values for radius must cause the implementation to throw an IndexSizeError exception.\n if (radius < 0) {\n throw new Error(\n \"IndexSizeError: The radius provided (\" + radius + \") is negative.\"\n );\n }\n\n // If the point (x0, y0) is equal to the point (x1, y1),\n // or if the point (x1, y1) is equal to the point (x2, y2),\n // or if the radius radius is zero,\n // then the method must add the point (x1, y1) to the subpath,\n // and connect that point to the previous point (x0, y0) by a straight line.\n if ((x0 === x1 && y0 === y1) || (x1 === x2 && y1 === y2) || radius === 0) {\n this.lineTo(x1, y1);\n return;\n }\n\n // Otherwise, if the points (x0, y0), (x1, y1), and (x2, y2) all lie on a single straight line,\n // then the method must add the point (x1, y1) to the subpath,\n // and connect that point to the previous point (x0, y0) by a straight line.\n const unit_vec_p1_p0 = this.normalize([x0 - x1, y0 - y1]);\n const unit_vec_p1_p2 = this.normalize([x2 - x1, y2 - y1]);\n if (\n unit_vec_p1_p0[0] * unit_vec_p1_p2[1] ===\n unit_vec_p1_p0[1] * unit_vec_p1_p2[0]\n ) {\n this.lineTo(x1, y1);\n return;\n }\n\n // Otherwise, let The Arc be the shortest arc given by circumference of the circle that has radius radius,\n // and that has one point tangent to the half-infinite line that crosses the point (x0, y0) and ends at the point (x1, y1),\n // and that has a different point tangent to the half-infinite line that ends at the point (x1, y1), and crosses the point (x2, y2).\n // The points at which this circle touches these two lines are called the start and end tangent points respectively.\n\n // note that both vectors are unit vectors, so the length is 1\n const cos =\n unit_vec_p1_p0[0] * unit_vec_p1_p2[0] +\n unit_vec_p1_p0[1] * unit_vec_p1_p2[1];\n const theta = Math.acos(Math.abs(cos));\n\n // Calculate origin\n const unit_vec_p1_origin = this.normalize([\n unit_vec_p1_p0[0] + unit_vec_p1_p2[0],\n unit_vec_p1_p0[1] + unit_vec_p1_p2[1]\n ]);\n const len_p1_origin = radius / Math.sin(theta / 2);\n const x = x1 + len_p1_origin * unit_vec_p1_origin[0];\n const y = y1 + len_p1_origin * unit_vec_p1_origin[1];\n\n // Calculate start angle and end angle\n // rotate 90deg clockwise (note that y axis points to its down)\n const unit_vec_origin_start_tangent = [\n -unit_vec_p1_p0[1],\n unit_vec_p1_p0[0]\n ];\n // rotate 90deg counter clockwise (note that y axis points to its down)\n const unit_vec_origin_end_tangent = [unit_vec_p1_p2[1], -unit_vec_p1_p2[0]];\n const getAngle = function (vector: number[]) {\n // get angle (clockwise) between vector and (1, 0)\n const x = vector[0];\n const y = vector[1];\n if (y >= 0) {\n // note that y axis points to its down\n return Math.acos(x);\n } else {\n return -Math.acos(x);\n }\n };\n const startAngle = getAngle(unit_vec_origin_start_tangent);\n const endAngle = getAngle(unit_vec_origin_end_tangent);\n\n // Connect the point (x0, y0) to the start tangent point by a straight line\n this.lineTo(\n x + unit_vec_origin_start_tangent[0] * radius,\n y + unit_vec_origin_start_tangent[1] * radius\n );\n\n // Connect the start tangent point to the end tangent point by arc\n // and adding the end tangent point to the subpath.\n this.arc(x, y, radius, startAngle, endAngle);\n }\n\n /**\n * Sets the stroke property on the current element\n */\n stroke() {\n if (this.__currentElement.nodeName === \"path\") {\n this.__currentElement.setAttribute(\"paint-order\", \"fill stroke markers\");\n }\n this.__applyCurrentDefaultPath();\n this.__applyStyleToCurrentElement(\"stroke\");\n }\n\n /**\n * Sets fill properties on the current element\n */\n fill() {\n if (this.__currentElement.nodeName === \"path\") {\n this.__currentElement.setAttribute(\"paint-order\", \"stroke fill markers\");\n }\n this.__applyCurrentDefaultPath();\n this.__applyStyleToCurrentElement(\"fill\");\n }\n\n /**\n * Adds a rectangle to the path.\n */\n rect(x: number, y: number, width: number, height: number) {\n if (this.__currentElement.nodeName !== \"path\") {\n this.beginPath();\n }\n this.moveTo(x, y);\n this.lineTo(x + width, y);\n this.lineTo(x + width, y + height);\n this.lineTo(x, y + height);\n this.lineTo(x, y);\n this.closePath();\n }\n\n /**\n * adds a rectangle element\n */\n fillRect(x: number, y: number, width: number, height: number) {\n const rect = this.__createElement(\n \"rect\",\n {\n x: x,\n y: y,\n width: width,\n height: height\n },\n true\n );\n const parent = this.__closestGroupOrSvg();\n parent.appendChild(rect);\n this.__currentElement = rect;\n this.__applyStyleToCurrentElement(\"fill\");\n }\n\n /**\n * Draws a rectangle with no fill\n */\n strokeRect(x: number, y: number, width: number, height: number) {\n const rect = this.__createElement(\n \"rect\",\n {\n x: x,\n y: y,\n width: width,\n height: height\n },\n true\n );\n const parent = this.__closestGroupOrSvg();\n parent.appendChild(rect);\n this.__currentElement = rect;\n this.__applyStyleToCurrentElement(\"stroke\");\n }\n\n /**\n * Clear entire canvas:\n * 1. save current transforms\n * 2. remove all the childNodes of the root g element\n */\n __clearCanvas() {\n const current = this.__closestGroupOrSvg();\n const transform = current.getAttribute(\"transform\");\n const rootGroup = this.__rootSVG.childNodes[1] as SVGElement;\n const childNodes = rootGroup.childNodes;\n for (let i = childNodes.length - 1; i >= 0; i--) {\n if (childNodes[i]) {\n rootGroup.removeChild(childNodes[i]);\n }\n }\n this.__currentElement = rootGroup;\n // reset __groupStack as all the child group nodes are all removed.\n this.__groupStack = [];\n if (transform) {\n this.__addTransform(transform);\n }\n }\n\n /**\n * \"Clears\" a canvas by just drawing a white rectangle in the current group.\n */\n clearRect(x: number, y: number, width: number, height: number) {\n // clear entire canvas\n if (x === 0 && y === 0 && width === this.width && height === this.height) {\n this.__clearCanvas();\n return;\n }\n const parent = this.__closestGroupOrSvg();\n const rect = this.__createElement(\n \"rect\",\n {\n x: x,\n y: y,\n width: width,\n height: height,\n fill: \"#FFFFFF\"\n },\n true\n );\n parent.appendChild(rect);\n }\n\n /**\n * Adds a linear gradient to a defs tag.\n * Returns a canvas gradient object that has a reference to it's parent def\n */\n createLinearGradient(x1: number, y1: number, x2: number, y2: number) {\n const grad = this.__createElement(\n \"linearGradient\",\n {\n id: randomString(this.__ids),\n x1: x1 + \"px\",\n x2: x2 + \"px\",\n y1: y1 + \"px\",\n y2: y2 + \"px\",\n gradientUnits: \"userSpaceOnUse\"\n },\n false\n );\n this.__SVGdefs.appendChild(grad);\n return new CustomCanvasGradient(grad as unknown as SVGElement, this);\n }\n\n /**\n * Adds a radial gradient to a defs tag.\n * Returns a canvas gradient object that has a reference to it's parent def\n */\n createRadialGradient(\n x0: number,\n y0: number,\n r0: number,\n x1: number,\n y1: number,\n r1: number\n ) {\n const grad = this.__createElement(\n \"radialGradient\",\n {\n id: randomString(this.__ids),\n cx: x1 + \"px\",\n cy: y1 + \"px\",\n r: r1 + \"px\",\n fx: x0 + \"px\",\n fy: y0 + \"px\",\n gradientUnits: \"userSpaceOnUse\"\n },\n false\n );\n this.__SVGdefs.appendChild(grad);\n return new CustomCanvasGradient(grad as unknown as SVGElement, this);\n }\n\n /**\n * Parses the font string and returns svg mapping\n */\n __parseFont() {\n const regex =\n /^\\s*(?=(?:(?:[-a-z]+\\s*){0,2}(italic|oblique))?)(?=(?:(?:[-a-z]+\\s*){0,2}(small-caps))?)(?=(?:(?:[-a-z]+\\s*){0,2}(bold(?:er)?|lighter|[1-9]00))?)(?:(?:normal|\\1|\\2|\\3)\\s*){0,3}((?:xx?-)?(?:small|large)|medium|smaller|larger|[.\\d]+(?:%|in|[cem]m|ex|p[CustomCanvasContext]))(?:\\s*\\/\\s*(normal|[.\\d]+(?:%|in|[cem]m|ex|p[CustomCanvasContext])))?\\s*([-,'\"\\sa-z0-9]+?)\\s*$/i;\n const fontPart = regex.exec(this.font) as RegExpExecArray;\n const data = {\n style: fontPart[1] || \"normal\",\n size: fontPart[4] || \"10px\",\n family: fontPart[6] || \"sans-serif\",\n weight: fontPart[3] || \"normal\",\n decoration: fontPart[2] || \"normal\",\n href: null\n };\n\n //canvas doesn't support underline natively, but we can pass this attribute\n if (this.__fontUnderline === \"underline\") {\n data.decoration = \"underline\";\n }\n\n //canvas also doesn't support linking, but we can pass this as well\n if (this.__fontHref) {\n data.href = this.__fontHref;\n }\n\n return data;\n }\n\n /**\n * Helper to link text fragments\n */\n __wrapTextLink(font: { href: string | null }, element: HTMLElement) {\n if (font.href) {\n const a = this.__createElement(\"a\");\n a.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\", font.href);\n a.appendChild(element);\n return a;\n }\n return element;\n }\n\n /**\n * Fills or strokes text\n * @param text\n * @param x\n * @param y\n * @param action - stroke or fill\n */\n __applyText(text: string, x: number, y: number, action: \"stroke\" | \"fill\") {\n const font = this.__parseFont(),\n parent = this.__closestGroupOrSvg(),\n textElement = this.__createElement(\n \"text\",\n {\n \"font-family\": font.family,\n \"font-size\": font.size,\n \"font-style\": font.style,\n \"font-weight\": font.weight,\n \"text-decoration\": font.decoration,\n x: x,\n y: y,\n \"text-anchor\": getTextAnchor(this.textAlign),\n \"dominant-baseline\": getDominantBaseline(this.textBaseline)\n },\n true\n );\n\n textElement.appendChild(this.__document.createTextNode(text));\n this.__currentElement = textElement;\n this.__applyStyleToCurrentElement(action);\n parent.appendChild(\n this.__wrapTextLink(font, textElement as unknown as HTMLElement)\n );\n }\n\n /**\n * Creates a text element\n * @param text\n * @param x\n * @param y\n */\n fillText(text: string, x: number, y: number) {\n this.__applyText(text, x, y, \"fill\");\n }\n\n /**\n * Strokes text\n * @param text\n * @param x\n * @param y\n */\n strokeText(text: string, x: number, y: number) {\n this.__applyText(text, x, y, \"stroke\");\n }\n\n /**\n * No need to implement this for svg.\n * @param text\n * @return {TextMetrics}\n */\n measureText(text: string) {\n this.__ctx.font = this.font;\n return this.__ctx.measureText(text);\n }\n\n /**\n * Arc command!\n */\n arc(\n x: number,\n y: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n counterClockwise?: number\n ) {\n // in canvas no circle is drawn if no angle is provided.\n if (startAngle === endAngle) {\n return;\n }\n startAngle = startAngle % (2 * Math.PI);\n endAngle = endAngle % (2 * Math.PI);\n if (startAngle === endAngle) {\n //circle time! subtract some of the angle so svg is happy (svg elliptical arc can't draw a full circle)\n endAngle =\n (endAngle + 2 * Math.PI - 0.001 * (counterClockwise ? -1 : 1)) %\n (2 * Math.PI);\n }\n const endX = x + radius * Math.cos(endAngle),\n endY = y + radius * Math.sin(endAngle),\n startX = x + radius * Math.cos(startAngle),\n startY = y + radius * Math.sin(startAngle),\n sweepFlag = counterClockwise ? 0 : 1;\n let largeArcFlag = 0;\n let diff = endAngle - startAngle;\n\n // https://github.com/gliffy/canvas2svg/issues/4\n if (diff < 0) {\n diff += 2 * Math.PI;\n }\n\n if (counterClockwise) {\n largeArcFlag = diff > Math.PI ? 0 : 1;\n } else {\n largeArcFlag = diff > Math.PI ? 1 : 0;\n }\n\n this.lineTo(startX, startY);\n this.__addPathCommand(\n format(\n \"A {rx} {ry} {xAxisRotation} {largeArcFlag} {sweepFlag} {endX} {endY}\",\n {\n rx: radius,\n ry: radius,\n xAxisRotation: 0,\n largeArcFlag: largeArcFlag,\n sweepFlag: sweepFlag,\n endX: endX,\n endY: endY\n }\n )\n );\n\n this.__currentPosition = { x: endX, y: endY };\n }\n\n /**\n * Generates a ClipPath from the clip command.\n */\n clip() {\n const group = this.__closestGroupOrSvg(),\n clipPath = this.__createElement(\"clipPath\"),\n id = randomString(this.__ids),\n newGroup = this.__createElement(\"g\");\n\n this.__applyCurrentDefaultPath();\n group.removeChild(this.__currentElement);\n clipPath.setAttribute(\"id\", id);\n clipPath.appendChild(this.__currentElement);\n\n this.__SVGdefs.appendChild(clipPath);\n\n //set the clip path to this group\n group.setAttribute(\"clip-path\", format(\"url(#{id})\", { id: id }));\n\n //clip paths can be scaled and transformed, we need to add another wrapper group to avoid later transformations\n // to this path\n group.appendChild(newGroup);\n\n this.__currentElement = newGroup;\n }\n\n /**\n * Draws a canvas, image or mock context to this canvas.\n * Note that all svg dom manipulation uses node.childNodes rather than node.children for IE support.\n * http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage\n */\n drawImage(...args: any[]) {\n let image = args[0],\n dx,\n dy,\n dw,\n dh,\n sx = 0,\n sy = 0,\n sw,\n sh,\n svg,\n defs,\n group,\n svgImage,\n canvas,\n id;\n\n if (args.length === 3) {\n dx = args[1];\n dy = args[2];\n sw = image.width;\n sh = image.height;\n dw = sw;\n dh = sh;\n } else if (args.length === 5) {\n dx = args[1];\n dy = args[2];\n dw = args[3];\n dh = args[4];\n sw = image.width;\n sh = image.height;\n } else if (args.length === 9) {\n sx = args[1];\n sy = args[2];\n sw = args[3];\n sh = args[4];\n dx = args[5];\n dy = args[6];\n dw = args[7];\n dh = args[8];\n } else {\n throw new Error(\n \"Invalid number of arguments passed to drawImage: \" + arguments.length\n );\n }\n\n const parent = this.__closestGroupOrSvg();\n const currentElement = this.__currentElement;\n const translateDirective = \"translate(\" + dx + \", \" + dy + \")\";\n if (image instanceof CustomCanvasContext) {\n //canvas2svg mock canvas context. In the future we may want to clone nodes instead.\n //also I'm currently ignoring dw, dh, sw, sh, sx, sy for a mock context.\n svg = image.getSvg().cloneNode(true);\n if (svg.childNodes && svg.childNodes.length > 1) {\n defs = svg.childNodes[0] as SVGElement;\n while (defs.childNodes.length) {\n id = (defs.childNodes[0] as SVGElement).getAttribute(\"id\") as string;\n this.__ids[id] = id;\n this.__SVGdefs.appendChild(defs.childNodes[0]);\n }\n group = svg.childNodes[1] as SVGElement;\n if (group) {\n //save original transform\n const originTransform = group.getAttribute(\"transform\");\n let transformDirective;\n if (originTransform) {\n transformDirective = originTransform + \" \" + translateDirective;\n } else {\n transformDirective = translateDirective;\n }\n group.setAttribute(\"transform\", transformDirective);\n parent.appendChild(group);\n }\n }\n } else if (image.nodeName === \"CANVAS\" || image.nodeName === \"IMG\") {\n //canvas or image\n svgImage = this.__createElement(\"image\");\n svgImage.setAttribute(\"width\", dw);\n svgImage.setAttribute(\"height\", dh);\n svgImage.setAttribute(\"preserveAspectRatio\", \"none\");\n\n if (sx || sy || sw !== image.width || sh !== image.height) {\n //crop the image using a temporary canvas\n canvas = this.__document.createElement(\"canvas\");\n canvas.width = dw;\n canvas.height = dh;\n const context = canvas.getContext(\"2d\");\n context?.drawImage(image, sx, sy, sw, sh, 0, 0, dw, dh);\n image = canvas;\n }\n svgImage.setAttribute(\"transform\", translateDirective);\n svgImage.setAttributeNS(\n \"http://www.w3.org/1999/xlink\",\n \"xlink:href\",\n image.nodeName === \"CANVAS\"\n ? image.toDataURL()\n : image.getAttribute(\"src\")\n );\n parent.appendChild(svgImage);\n }\n }\n\n /**\n * Generates a pattern tag\n */\n createPattern(\n image: HTMLImageElement | HTMLCanvasElement | CustomCanvasContext,\n repetition: number\n ) {\n const pattern = this.__document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"pattern\"\n ),\n id = randomString(this.__ids);\n let img;\n pattern.setAttribute(\"id\", id);\n\n if (image.nodeName === \"CANVAS\" || image.nodeName === \"IMG\") {\n img = this.__document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"image\"\n );\n img.setAttribute(\n \"width\",\n \"\" + (image as HTMLImageElement | HTMLCanvasElement).width\n );\n img.setAttribute(\n \"height\",\n \"\" + (image as HTMLImageElement | HTMLCanvasElement).height\n );\n img.setAttributeNS(\n \"http://www.w3.org/1999/xlink\",\n \"xlink:href\",\n image.nodeName === \"CANVAS\"\n ? (image as HTMLCanvasElement).toDataURL()\n : image.getAttribute(\"src\")\n );\n pattern.appendChild(img);\n this.__SVGdefs.appendChild(pattern);\n } else if (image instanceof CustomCanvasContext) {\n pattern.setAttribute(\"width\", \"\" + (image as CustomCanvasContext).width);\n pattern.setAttribute(\n \"height\",\n \"\" + (image as CustomCanvasContext).height\n );\n pattern.appendChild(image.__rootSVG.childNodes[1]);\n this.__SVGdefs.appendChild(pattern);\n }\n return new CustomCanvasPattern(pattern as unknown as SVGElement, this);\n }\n\n setLineDash(dashArray: number[]) {\n if (dashArray && dashArray.length > 0) {\n this.lineDash = dashArray.join(\",\");\n } else {\n this.lineDash = null;\n }\n }\n\n drawFocusRing() {\n /// Not yet implemented\n }\n createImageData() {\n /// Not yet implemented\n }\n getImageData() {\n /// Not yet implemented\n }\n putImageData() {\n /// Not yet implemented\n }\n globalCompositeOperation() {\n /// Not yet implemented\n }\n setTransform() {\n /// Not yet implemented\n }\n}\n\nexport default CustomCanvasContext;\n","import {\n CustomCanvasContext,\n CustomCanvasGradient\n} from \"./CustomCanvasContext\";\n\n// direction:\"ltr\"\n// filter:\"none\"\n// fontKerning:\"auto\"\n// fontStretch:\"normal\"\n// fontVariantCaps:\"normal\"\n// globalCompositeOperation:\"source-over\"\n// imageSmoothingEnabled:true\n// imageSmoothingQuality:\"low\"\n// letterSpacing:\"0px\"\n// lineCap:\"butt\"\n// lineWidth:1\n// shadowBlur:0\n// shadowColor:\"rgba(0, 0, 0, 0)\"\n// shadowOffsetX:0\n// shadowOffsetY:0\n// textRendering:\"auto\"\n// wordSpacing:\"0px\"\n\n// clip\n// createConicGradient\n// createImageData\n// direction\n// drawFocusIfNeeded\n// filter\n// fontKerning\n// fontStretch\n// fontVariantCaps\n// getContextAttributes\n// getLineDash\n// getTransform\n// globalCompositeOperation\n// imageSmoothingEnabled\n// imageSmoothingQuality\n// isContextLost\n// letterSpacing\n// reset\n// resetTransform\n// roundRect\n// setTransform\n// shadowBlur\n// shadowColor\n// shadowOffsetX\n// shadowOffsetY\n// textRendering\n// wordSpacing\n\nexport class YZCanvasContext {\n canvas: HTMLCanvasElement;\n\n context: CanvasRenderingContext2D;\n // context: CanvasRenderingContext2D\n // | WebGLRenderingContext\n // | WebGL2RenderingContext\n // | GPUCanvasContext\n // | ImageBitmapRenderingContext\n customContext?: CustomCanvasContext;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Path2D\n currentPath2D: Path2D = new Path2D();\n path2Ds: Path2D[] = [];\n\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMMatrix\n currentMatrix: DOMMatrix = new DOMMatrix();\n // currentMatrix = document\n // .createElementNS(\"http://www.w3.org/2000/svg\", \"svg\")\n // .createSVGMatrix();\n\n hasSetCustomStrokeStyle = false;\n hasSetCustomFillStyle = false;\n\n constructor(\n canvas: HTMLCanvasElement,\n width?: number,\n height?: number,\n enableCustomContext = false // 性能影响\n ) {\n this.canvas = canvas;\n this.context = canvas.getContext(\"2d\", {\n willReadFrequently: true\n }) as CanvasRenderingContext2D;\n if (enableCustomContext) {\n this.customContext = new CustomCanvasContext({\n canvas: this.canvas,\n width: width || this.canvas.width,\n height: height || this.canvas.height\n });\n }\n }\n\n set lineWidth(lineWidth: number) {\n this.hasSetCustomStrokeStyle = true;\n this.context.lineWidth = lineWidth;\n if (this.customContext) this.customContext.lineWidth = lineWidth;\n }\n\n get lineWidth(): number {\n return this.context.lineWidth;\n }\n\n set lineCap(lineCap: CanvasLineCap) {\n this.hasSetCustomStrokeStyle = true;\n this.context.lineCap = lineCap;\n if (this.customContext) this.customContext.lineCap = lineCap;\n }\n\n get lineCap(): CanvasLineCap {\n return this.context.lineCap;\n }\n\n set lineJoin(lineJoin: CanvasLineJoin) {\n this.hasSetCustomStrokeStyle = true;\n this.context.lineJoin = lineJoin;\n if (this.customContext) this.customContext.lineCap = lineJoin;\n }\n\n get lineJoin(): CanvasLineJoin {\n return this.context.lineJoin;\n }\n\n set lineDashOffset(lineDashOffset: number) {\n this.hasSetCustomStrokeStyle = true;\n this.context.lineDashOffset = lineDashOffset;\n if (this.customContext) this.customContext.lineDashOffset = lineDashOffset;\n }\n\n get lineDashOffset(): number {\n return this.context.lineDashOffset;\n }\n\n set miterLimit(miterLimit: number) {\n this.hasSetCustomStrokeStyle = true;\n this.context.miterLimit = miterLimit;\n if (this.customContext) this.customContext.miterLimit = miterLimit;\n }\n\n get miterLimit(): number {\n return this.context.miterLimit;\n }\n\n set globalAlpha(alpha: number) {\n this.context.globalAlpha = alpha;\n if (this.customContext) this.customContext.globalAlpha = alpha;\n }\n\n get globalAlpha(): number {\n return this.context.globalAlpha;\n }\n\n // rgb(255,221,0)\n // rgba(255,221,0,1)\n // #000000\n set fillStyle(\n style:\n | string\n | CanvasGradient\n | CanvasPattern\n | { gradient: CanvasGradient; gradientCustom: CustomCanvasGradient }\n ) {\n this.hasSetCustomFillStyle = true;\n if (\n typeof style == \"string\" ||\n style instanceof CanvasGradient ||\n style instanceof CanvasPattern\n ) {\n this.context.fillStyle = style;\n if (this.customContext) this.customContext.fillStyle = style;\n } else {\n this.context.fillStyle = style.gradient;\n if (this.customContext)\n this.customContext.fillStyle = style.gradientCustom;\n }\n }\n\n get fillStyle(): string | CanvasGradient | CanvasPattern {\n return this.context.fillStyle;\n }\n\n set strokeStyle(\n style:\n | string\n | CanvasGradient\n | CanvasPattern\n | { gradient: CanvasGradient; gradientCustom: CustomCanvasGradient }\n ) {\n this.hasSetCustomStrokeStyle = true;\n if (\n typeof style == \"string\" ||\n style instanceof CanvasGradient ||\n style instanceof CanvasPattern\n ) {\n this.context.strokeStyle = style;\n if (this.customContext) this.customContext.strokeStyle = style;\n } else {\n this.context.strokeStyle = style.gradient;\n if (this.customContext)\n this.customContext.strokeStyle = style.gradientCustom;\n }\n }\n\n get strokeStyle(): string | CanvasGradient | CanvasPattern {\n return this.context.strokeStyle;\n }\n\n // font:\"10px sans-serif\"\n set font(font: string) {\n this.context.font = font;\n if (this.customContext) this.customContext.font = font;\n }\n\n get font(): string {\n return this.context.font;\n }\n\n set textBaseline(textBaseline: CanvasTextBaseline) {\n this.context.textBaseline = textBaseline;\n if (this.customContext) this.customContext.textBaseline = textBaseline;\n }\n\n get textBaseline(): CanvasTextBaseline {\n return this.context.textBaseline;\n }\n\n set textAlign(textAlign: CanvasTextAlign) {\n this.context.textAlign = textAlign;\n if (this.customContext) this.customContext.textAlign = textAlign;\n }\n\n get textAlign(): CanvasTextAlign {\n return this.context.textAlign;\n }\n\n fill(path?: Path2D) {\n if (path) {\n this.context.fill(path);\n /// customContext Not yet implemented\n } else {\n this.context.fill();\n if (this.customContext) this.customContext.fill();\n }\n return this;\n }\n\n fillRect(x: number, y: number, w: number, h: number) {\n this.context.fillRect(x, y, w, h);\n if (this.customContext) this.customContext.fillRect(x, y, w, h);\n return this;\n }\n\n fillText(text: string, x: number, y: number, maxWidth?: number | undefined) {\n this.hasSetCustomFillStyle = false;\n this.context.fillText(text, x, y, maxWidth);\n if (this.customContext) this.customContext.fillText(text, x, y);\n return this;\n }\n\n setLineDash(dashArray: number[]) {\n this.context.setLineDash(dashArray);\n if (this.customContext) this.customContext.setLineDash(dashArray);\n return this;\n }\n\n stroke(path?: Path2D) {\n if (path) {\n this.context.stroke(path);\n /// customContext Not yet implemented\n } else {\n this.context.stroke();\n if (this.customContext) this.customContext.stroke();\n }\n return this;\n }\n\n strokeText(\n text: string,\n x: number,\n y: number,\n maxWidth?: number | undefined\n ) {\n this.context.strokeText(text, x, y, maxWidth);\n if (this.customContext) this.customContext.strokeText(text, x, y);\n return this;\n }\n\n strokeRect(x: number, y: number, w: number, h: number) {\n this.context.strokeRect(x, y, w, h);\n if (this.customContext) this.customContext.strokeRect(x, y, w, h);\n return this;\n }\n\n measureText(text: string): TextMetrics {\n return this.context.measureText(text);\n /// customContext Not yet implemented\n }\n\n clearRect(x = 0, y = 0, w = this.canvas.width, h = this.canvas.height) {\n this.context.clearRect(x, y, w, h);\n if (this.customContext) this.customContext.clearRect(x, y, w, h);\n return this;\n }\n\n save() {\n this.context.save();\n if (this.customContext) this.customContext.save();\n this.currentMatrix = new DOMMatrix();\n this.path2Ds.push(this.currentPath2D);\n this.currentPath2D = new Path2D();\n return this;\n }\n\n restore() {\n this.context.restore();\n if (this.customContext) this.customContext.restore();\n this.hasSetCustomStrokeStyle = false;\n this.hasSetCustomFillStyle = false;\n this.currentMatrix = new DOMMatrix();\n this.currentPath2D = this.path2Ds.pop() || new Path2D();\n return this;\n }\n\n beginPath() {\n this.context.beginPath();\n if (this.customContext) this.customContext.beginPath();\n return this;\n }\n\n closePath() {\n this.context.closePath();\n if (this.customContext) this.customContext.closePath();\n this.currentPath2D.closePath();\n return this;\n }\n\n changePath2D(path = this.currentPath2D, transform = this.currentMatrix) {\n const newPath = new Path2D();\n newPath.addPath(path, transform);\n this.currentPath2D = newPath;\n }\n\n isPointInStroke(path: Path2D, x: number, y: number): boolean;\n isPointInStroke(x: number, y: number): boolean;\n isPointInStroke(...args: any[]): boolean {\n if (args[0] instanceof Path2D) {\n return this.context.isPointInStroke(args[0], args[1], args[2]);\n }\n return this.context.isPointInStroke(args[0], args[1]);\n /// customContext Not yet implemented\n }\n\n isPointInPath(path: Path2D, x: number, y: number): boolean;\n isPointInPath(x: number, y: number): boolean;\n isPointInPath(...args: any[]): boolean {\n if (args[0] instanceof Path2D) {\n return this.context.isPointInPath(args[0], args[1], args[2]);\n }\n return this.context.isPointInPath(args[0], args[1]);\n /// customContext Not yet implemented\n }\n\n // transform(a: number, b: number, c: number, d: number, e: number, f: number) {\n // this.context.transform(a, b, c, d, e, f);\n // if (this.customContext) this.customContext.transform(a, b, c, d, e, f);\n // return this;\n // }\n\n translate(x: number, y: number) {\n this.context.translate(x, y);\n if (this.customContext) {\n this.customContext.translate(x, y);\n }\n this.currentMatrix.translate(x, y);\n this.changePath2D();\n return this;\n }\n\n rotate(radian: number, centerX = 0, centerY = 0) {\n /// 移动的是坐标系\n this.translate(centerX, centerY);\n this.context.rotate(radian);\n if (this.customContext) {\n this.customContext.rotate(radian);\n }\n this.currentMatrix.rotate(radian);\n this.translate(-centerX, -centerY);\n this.changePath2D();\n return this;\n }\n\n scale(x: number, y = x, centerX = 0, centerY = 0) {\n /// 移动的是坐标系\n this.translate(centerX, centerY);\n this.context.scale(x, y);\n if (this.customContext) {\n this.customContext.scale(x, y);\n }\n this.currentMatrix.scale(x, y);\n this.translate(-centerX, -centerY);\n this.changePath2D();\n return this;\n }\n\n moveTo(x: number, y: number) {\n this.context.moveTo(x, y);\n if (this.customContext) this.customContext.moveTo(x, y);\n this.currentPath2D.moveTo(x, y);\n return this;\n }\n\n lineTo(x: number, y: number) {\n this.context.lineTo(x, y);\n if (this.customContext) this.customContext.lineTo(x, y);\n this.currentPath2D.lineTo(x, y);\n return this;\n }\n\n arc(\n x: number,\n y: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n counterClockwise?: boolean\n ) {\n this.context.arc(x, y, radius, startAngle, endAngle, counterClockwise);\n if (this.customContext)\n this.customContext.arc(\n x,\n y,\n radius,\n startAngle,\n endAngle,\n counterClockwise ? -1 : 1\n );\n this.currentPath2D.arc(\n x,\n y,\n radius,\n startAngle,\n endAngle,\n counterClockwise\n );\n return this;\n }\n\n arcTo(x1: number, y1: number, x2: number, y2: number, radius: number) {\n this.context.arcTo(x1, y1, x2, y2, radius);\n if (this.customContext) this.customContext.arcTo(x1, y1, x2, y2, radius);\n this.currentPath2D.arcTo(x1, y1, x2, y2, radius);\n return this;\n }\n\n ellipse(\n x: number,\n y: number,\n radiusX: number,\n radiusY: number,\n rotation: number,\n startAngle: number,\n endAngle: number,\n counterClockwise?: boolean\n ) {\n this.context.ellipse(\n x,\n y,\n radiusX,\n radiusY,\n rotation,\n startAngle,\n endAngle,\n counterClockwise\n );\n /// customContext Not yet implemented\n this.currentPath2D.ellipse(\n x,\n y,\n radiusX,\n radiusY,\n rotation,\n startAngle,\n endAngle,\n counterClockwise\n );\n return this;\n }\n\n quadraticCurveTo(cpx: number, cpy: number, x: number, y: number) {\n this.context.quadraticCurveTo(cpx, cpy, x, y);\n if (this.customContext) this.customContext.quadraticCurveTo(cpx, cpy, x, y);\n this.currentPath2D.quadraticCurveTo(cpx, cpy, x, y);\n return this;\n }\n\n bezierCurveTo(\n cp1x: number,\n cp1y: number,\n cp2x: number,\n cp2y: number,\n x: number,\n y: number\n ) {\n this.context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n if (this.customContext)\n this.customContext.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n this.currentPath2D.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n return this;\n }\n\n rect(x: number, y: number, w: number, h: number) {\n this.context.rect(x, y, w, h);\n if (this.customContext) this.customContext.rect(x, y, w, h);\n this.currentPath2D.rect(x, y, w, h);\n return this;\n }\n\n // { 0: \"#ffffff\", 1: \"#ff0000\" }\n createLinearGradient(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n colorStops?: Record<number, string>\n ) {\n const gradient: CanvasGradient = this.context.createLinearGradient(\n x1,\n y1,\n x2,\n y2\n );\n // const gradientCustom: CustomCanvasGradient =\n // this.customContext.createLinearGradient(x1, y1, x2, y2);\n if (colorStops) {\n Object.entries(colorStops).forEach(([key, value]) => {\n gradient.addColorStop(parseFloat(key), value);\n // gradientCustom.addColorStop(parseFloat(key), value);\n });\n }\n return gradient;\n // return {\n // gradient\n // // gradientCustom\n // };\n }\n\n createRadialGradient(\n x0: number,\n y0: number,\n r0: number,\n x1: number,\n y1: number,\n r1: number,\n colorStops?: Record<number, string>\n ) {\n const gradient: CanvasGradient = this.context.createRadialGradient(\n x0,\n y0,\n r0,\n x1,\n y1,\n r1\n );\n // const gradientCustom: CustomCanvasGradient =\n // this.customContext.createRadialGradient(x0, y0, r0, x1, y1, r1);\n if (colorStops) {\n Object.entries(colorStops).forEach(([key, value]) => {\n gradient.addColorStop(parseFloat(key), value);\n // gradientCustom.addColorStop(parseFloat(key), value);\n });\n }\n return gradient;\n // return {\n // gradient\n // // gradientCustom\n // };\n }\n\n // const image = new Image();\n // image.src = \"../assets/images/picture.jpg\";\n // image.onload = function () {\n // co.drawImage(image);\n // };\n drawImage(\n element:\n | HTMLOrSVGImageElement\n | HTMLVideoElement\n | HTMLCanvasElement\n | ImageBitmap\n | OffscreenCanvas,\n ...args: number[]\n ) {\n if (args.length === 0) {\n this.context.drawImage(element, 0, 0);\n } else if (args.length === 2) {\n const dx = args[0];\n const dy = args[1];\n this.context.drawImage(element, dx, dy);\n } else if (args.length === 4) {\n const dx = args[0];\n const dy = args[1];\n const dw = args[2];\n const dh = args[3];\n this.context.drawImage(element, dx, dy, dw, dh);\n } else if (args.length === 8) {\n const sx = args[0];\n const sy = args[1];\n const sw = args[2];\n const sh = args[3];\n const dx = args[4];\n const dy = args[5];\n const dw = args[6];\n const dh = args[7];\n this.context.drawImage(element, sx, sy, sw, sh, dx, dy, dw, dh);\n } else {\n throw new Error(\n \"Invalid number of arguments passed to drawImage: \" + args.length\n );\n }\n if (this.customContext) this.customContext.drawImage(element, ...args);\n return this;\n }\n\n getImageData(\n sx = 0,\n sy = 0,\n sw = this.canvas.width,\n sh = this.canvas.height,\n settings?: ImageDataSettings | undefined\n ): ImageData {\n return this.context.getImageData(sx, sy, sw, sh, settings);\n /// customContext Not yet implemented\n }\n\n putImageData(imageData: ImageData, dx = 0, dy = 0) {\n return this.context.putImageData(imageData, dx, dy);\n /// customContext Not yet implemented\n }\n\n createPattern(\n image:\n | HTMLImageElement\n | SVGImageElement\n | HTMLVideoElement\n | HTMLCanvasElement\n | ImageBitmap\n | OffscreenCanvas,\n repetition: \"repeat\" | \"repeat-x\" | \"repeat-y\" | \"no-repeat\" | null\n ): CanvasPattern | null {\n return this.context.createPattern(image, repetition);\n /// customContext Not yet implemented\n }\n\n toRawSVG() {\n if (this.customContext) {\n const serializedSVG: string = this.customContext.getSerializedSvg(true);\n const svgElement: SVGElement = this.customContext.getSvg();\n return { raw: serializedSVG, element: svgElement };\n } else {\n return { raw: \"\", element: null };\n }\n }\n}\n\nexport default YZCanvasContext;\n","import { YZCanvasContext } from \"../../canvas\";\nimport { type TSVGParsedPathData } from \"../../svg/DOMSVGUtil\";\nimport { angle } from \"../math\";\n\nexport type TLOptions = {\n x?: number;\n y?: number;\n toX?: number;\n toY?: number;\n};\n\n/// 配合 PathD 使用,不可单独使用\nexport class L {\n x: number;\n y: number;\n toX: number;\n toY: number;\n\n constructor(options?: TLOptions) {\n this.x = options?.x || 0;\n this.y = options?.y || 0;\n this.toX = options?.toX || 0;\n this.toY = options?.toY || 0;\n }\n\n toSVGPathData(): TSVGParsedPathData[] {\n return [[\"L\", this.toX, this.toY]];\n }\n\n toCanvasContext(ctx: YZCanvasContext) {\n ctx.lineTo(this.toX, this.toY);\n }\n\n getBoundingClientRect() {\n const lineAngle = angle(this.x, this.y, this.toX, this.toY);\n if (lineAngle === 0) {\n const minX = Math.min(this.x, this.toX);\n const minY = Math.min(this.y, this.toY);\n const maxX = Math.max(this.x, this.toX);\n const maxY = Math.max(this.y, this.toY);\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n } else {\n const sin = Math.sin(lineAngle);\n const cos = Math.cos(lineAngle);\n const x1r = cos * this.x - sin * this.y;\n const x2r = cos * this.toX - sin * this.toY;\n const y1r = cos * this.y + sin * this.x;\n const y2r = cos * this.toY + sin * this.toX;\n return {\n x: Math.min(x1r, x2r),\n y: Math.min(y1r, y2r),\n width: Math.max(x1r, x2r) - Math.min(x1r, x2r),\n height: Math.max(y1r, y2r) - Math.min(y1r, y2r)\n };\n }\n }\n\n // t : The fraction of the overall duration of the path. (A value from 0.0 to 1.0)\n interpolate(t: number): { x: number; y: number } {\n return {\n x: this.x + t * (this.toX - this.x),\n y: this.y + t * (this.toY - this.y)\n };\n }\n\n intersection(line: L): { x: number; y: number } | null {\n const x1 = this.x;\n const y1 = this.y;\n const x4 = line.toX;\n const y4 = line.toY;\n const dx1 = this.toX - x1;\n const dx2 = line.x - x4;\n if (!dx1 && !dx2) {\n return null;\n }\n const m1 = (this.toY - y1) / dx1;\n const m2 = (line.y - y4) / dx2;\n if (!dx1) {\n // infinity\n return { x: x1, y: m2 * (x1 - x4) + y4 };\n } else if (!dx2) {\n // infinity\n return { x: x4, y: m1 * (x4 - x1) + y1 };\n }\n const xInt = (-m2 * x4 + y4 + m1 * x1 - y1) / (m1 - m2);\n const yInt = m1 * (xInt - x1) + y1;\n if (isNaN(xInt) || isNaN(yInt)) {\n return null;\n }\n return { x: xInt, y: yInt };\n }\n}\n\nexport default L;\n","import { TSVGParsedPathData } from \"../../svg/DOMSVGUtil\";\nimport { YZCanvasContext } from \"../../canvas\";\nimport { L, TLOptions } from \"./L\";\n\nexport type TCArcOptions = {\n rx: number;\n ry: number;\n xAxisRotate?: number; // phi\n largeArcFlag?: number; // fa\n sweepFlag?: number; //fs\n toX: number;\n toY: number;\n} & TLOptions;\n\nexport class Arc extends L {\n // x方向的半径\n public rx: number;\n // y方向的半径\n public ry: number;\n // 绕着x轴旋转的角度\n public xAxisRotate: number;\n // 0小弧 1大弧\n public largeArcFlag: number;\n // 0逆时针方向 1顺时针方向\n public sweepFlag: number;\n\n constructor(options: TCArcOptions) {\n super(options);\n this.rx = options.rx;\n this.ry = options.ry;\n this.xAxisRotate = options?.xAxisRotate ?? 0;\n this.largeArcFlag = options?.largeArcFlag ?? 1;\n this.sweepFlag = options?.sweepFlag ?? 1;\n this.toX = options.toX;\n this.toY = options.toY;\n }\n\n /// A rx,ry xAxisRotate LargeArcFlag,SweepFlag x,y\n toSVGPathData(): TSVGParsedPathData[] {\n return [\n [\n \"A\",\n this.rx,\n this.ry,\n this.xAxisRotate,\n this.largeArcFlag,\n this.sweepFlag,\n this.toX,\n this.toY\n ]\n ];\n }\n\n toCanvasContext(ctx: YZCanvasContext): void {\n const [cx, cy, rx, ry, xAxisRotate, startAngle, endAngle] = this.convert(\n this.x,\n this.y,\n this.toX,\n this.toY,\n this.rx,\n this.ry,\n this.xAxisRotate,\n this.largeArcFlag,\n this.sweepFlag\n );\n ctx.ellipse(\n cx,\n cy,\n rx,\n ry,\n xAxisRotate,\n startAngle,\n endAngle,\n !this.sweepFlag\n );\n // ctx.scale(this.rx, this.ry);\n // ctx.arc(0, 0, 1, startAngle, endAngle, !this.sweepFlag);\n }\n\n convert(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n rx: number,\n ry: number,\n phi: number,\n fa: number,\n fs: number\n ) {\n const p = (phi / 180) * Math.PI;\n const x_m = (x1 - x2) / 2;\n const y_m = (y1 - y2) / 2;\n\n const x1_d = Math.cos(p) * x_m + Math.sin(p) * y_m;\n const y1_d = -Math.sin(p) * x_m + Math.cos(p) * y_m;\n\n const radius_check_value =\n (x1_d * x1_d) / (rx * rx) + (y1_d * y1_d) / (ry * ry);\n if (radius_check_value > 1) {\n // throw \"Radius is too small to build an arc!\";\n\n // Check out radius correction in the W3C document\n // https://www.w3.org/TR/SVG11/implnote.html#ArcCorrectionOutOfRangeRadii\n const r_sq = Math.sqrt(radius_check_value);\n rx = r_sq * rx;\n ry = r_sq * ry;\n\n throw new Error(\n `Radii are too small to build an arc. Correcting them to ${rx}/${ry}.`\n );\n }\n\n const sq = Math.sqrt(\n (rx * rx * ry * ry - rx * rx * y1_d * y1_d - ry * ry * x1_d * x1_d) /\n (rx * rx * y1_d * y1_d + ry * ry * x1_d * x1_d)\n );\n\n const s = fa != fs ? 1 : -1;\n const cx_d = (s * sq * rx * y1_d) / ry;\n const cy_d = (s * sq * -ry * x1_d) / rx;\n\n const x_m_d = (x1 + x2) / 2;\n const y_m_d = (y1 + y2) / 2;\n const cx = Math.cos(p) * cx_d - Math.sin(p) * cy_d + x_m_d;\n const cy = Math.sin(p) * cx_d + Math.cos(p) * cy_d + y_m_d;\n\n const vectorAngle = (ux: number, uy: number, vx: number, vy: number) =>\n (ux * vy >= uy * vx ? 1 : -1) *\n Math.acos(\n (ux * vx + uy * vy) /\n (Math.sqrt(ux * ux + uy * uy) * Math.sqrt(vx * vx + vy * vy))\n );\n const theta_1 = vectorAngle(1, 0, x1 - cx, y1 - cy) - p;\n const delta_theta = vectorAngle(x1 - cx, y1 - cy, x2 - cx, y2 - cy);\n\n return [cx, cy, rx, ry, p, theta_1, theta_1 + delta_theta];\n }\n}\n\nexport default Arc;\n","import { TSVGParsedPathData } from \"../../svg/DOMSVGUtil\";\nimport { YZCanvasContext } from \"../../canvas\";\nimport { L, TLOptions } from \"./L\";\n\nexport type TQuadraticBezierOptions = {\n cx: number;\n cy: number;\n toX?: number;\n toY?: number;\n isLineThrough?: boolean;\n} & TLOptions;\n\nexport class QuadraticBezier extends L {\n public cx: number;\n public cy: number;\n public isLineThrough: boolean;\n\n constructor(options: TQuadraticBezierOptions) {\n super(options);\n this.cx = options.cx;\n this.cy = options.cy;\n this.isLineThrough =\n typeof options.isLineThrough == \"boolean\" ? options.isLineThrough : false;\n }\n\n /// Q cx,cy x,y\n /// T x,y\n toSVGPathData(): TSVGParsedPathData[] {\n if (this.isLineThrough) {\n const c1x = this.cx * 2 - (this.x + this.toX) / 2;\n const c1y = this.cy * 2 - (this.y + this.toY) / 2;\n return [[\"Q\", c1x, c1y, this.toX, this.toY]];\n } else {\n return [[\"Q\", this.cx, this.cy, this.toX, this.toY]];\n }\n }\n\n toCanvasContext(ctx: YZCanvasContext) {\n if (this.isLineThrough) {\n const c1x = this.cx * 2 - (this.x + this.toX) / 2;\n const c1y = this.cy * 2 - (this.y + this.toY) / 2;\n ctx.quadraticCurveTo(c1x, c1y, this.toX, this.toY);\n } else {\n ctx.quadraticCurveTo(this.cx, this.cy, this.toX, this.toY);\n }\n }\n\n getBoundingClientRect() {\n const xArr = [this.x, this.toX];\n const yArr = [this.y, this.toY];\n let a, b, c, t;\n for (let i = 0; i < 2; ++i) {\n a =\n i == 0\n ? this.x - 2 * this.cx + this.toX\n : this.y - 2 * this.cy + this.toY;\n b = i == 0 ? -2 * this.x + 2 * this.cx : -2 * this.y + 2 * this.cy;\n c = i == 0 ? this.x : this.y;\n if (Math.abs(a) > 1e-12) {\n t = -b / (2 * a);\n if (0 < t && t < 1) {\n [xArr, yArr][i].push(a * t * t + b * t + c);\n }\n }\n }\n const min = { x: Math.min.apply(0, xArr), y: Math.min.apply(0, yArr) };\n const max = { x: Math.max.apply(0, xArr), y: Math.max.apply(0, yArr) };\n return {\n x: min.x,\n y: min.y,\n width: max.x - min.x,\n height: max.y - min.y\n };\n }\n\n // t : The fraction of the overall duration of the path. (A value from 0.0 to 1.0)\n interpolate(t: number): { x: number; y: number } {\n return {\n x:\n (1 - t) * (1 - t) * this.x +\n 2 * (1 - t) * t * this.cx +\n t * t * this.toX,\n y:\n (1 - t) * (1 - t) * this.y +\n 2 * (1 - t) * t * this.cy +\n t * t * this.toY\n };\n }\n}\n\nexport default QuadraticBezier;\n","import DOMSVGUtil, { TSVGParsedPathData } from \"../../svg/DOMSVGUtil\";\nimport { YZCanvasContext } from \"../../canvas\";\nimport { L, TLOptions } from \"./L\";\n\nexport type TCubicBezierOptions = {\n c1x: number;\n c1y: number;\n c2x: number;\n c2y: number;\n toX?: number;\n toY?: number;\n} & TLOptions;\n\nexport class CubicBezier extends L {\n public c1x: number;\n public c1y: number;\n public c2x: number;\n public c2y: number;\n\n constructor(options: TCubicBezierOptions) {\n super(options);\n this.c1x = options.c1x;\n this.c1y = options.c1y;\n this.c2x = options.c2x;\n this.c2y = options.c2y;\n }\n\n /// C c1x,c1y c2x,c2y x,y\n /// S c2x,c2y x,y\n toSVGPathData(): TSVGParsedPathData[] {\n return [[\"C\", this.c1x, this.c1y, this.c2x, this.c2y, this.toX, this.toY]];\n }\n\n toCanvasContext(ctx: YZCanvasContext) {\n ctx.bezierCurveTo(\n this.c1x,\n this.c1y,\n this.c2x,\n this.c2y,\n this.toX,\n this.toY\n );\n }\n\n getBoundingClientRect() {\n /// 一种方法\n // const tvalues = [];\n // const bounds: number[][] = [[], []];\n // let a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n // for (let i = 0; i < 2; ++i) {\n // if (i === 0) {\n // b = 6 * this.x - 12 * this.c1x + 6 * this.c2x;\n // a = -3 * this.x + 9 * this.c1x - 9 * this.c2x + 3 * this.toX;\n // c = 3 * this.c1x - 3 * this.x;\n // } else {\n // b = 6 * this.y - 12 * this.c1y + 6 * this.c2y;\n // a = -3 * this.y + 9 * this.c1y - 9 * this.c2y + 3 * this.toY;\n // c = 3 * this.c1y - 3 * this.y;\n // }\n // if (Math.abs(a) < 1e-12) {\n // if (Math.abs(b) < 1e-12) {\n // continue;\n // }\n // t = -c / b;\n // if (t > 0 && t < 1) {\n // tvalues.push(t);\n // }\n // continue;\n // }\n // b2ac = b * b - 4 * c * a;\n // if (b2ac < 0) {\n // continue;\n // }\n // sqrtb2ac = Math.sqrt(b2ac);\n // t1 = (-b + sqrtb2ac) / (2 * a);\n // if (t1 > 0 && t1 < 1) {\n // tvalues.push(t1);\n // }\n // t2 = (-b - sqrtb2ac) / (2 * a);\n // if (t2 > 0 && t2 < 1) {\n // tvalues.push(t2);\n // }\n // }\n // let j = tvalues.length;\n // let mt;\n // const jlen = j;\n // while (j--) {\n // t = tvalues[j];\n // mt = 1 - t;\n // bounds[0][j] =\n // mt * mt * mt * this.x +\n // 3 * mt * mt * t * this.c1x +\n // 3 * mt * t * t * this.c2x +\n // t * t * t * this.toX;\n // bounds[1][j] =\n // mt * mt * mt * this.y +\n // 3 * mt * mt * t * this.c1y +\n // 3 * mt * t * t * this.c2y +\n // t * t * t * this.toY;\n // }\n // bounds[0][jlen] = this.x;\n // bounds[1][jlen] = this.y;\n // bounds[0][jlen + 1] = this.toX;\n // bounds[1][jlen + 1] = this.toY;\n // bounds[0].length = bounds[1].length = jlen + 2;\n // const min = {\n // x: Math.min.apply(0, bounds[0]),\n // y: Math.min.apply(0, bounds[1])\n // };\n // const max = {\n // x: Math.max.apply(0, bounds[0]),\n // y: Math.max.apply(0, bounds[1])\n // };\n // return {\n // x: min.x,\n // y: min.y,\n // width: max.x - min.x,\n // height: max.y - min.y\n // };\n\n /// 另一种方法\n let a =\n this.c2x - 2 * this.c1x + this.x - (this.toX - 2 * this.c2x + this.c1x);\n let b = 2 * (this.c1x - this.x) - 2 * (this.c2x - this.c1x);\n let c = this.x - this.c1x;\n let t1 = (-b + Math.sqrt(b * b - 4 * a * c)) / 2 / a;\n let t2 = (-b - Math.sqrt(b * b - 4 * a * c)) / 2 / a;\n const y = [this.y, this.toY];\n const x = [this.x, this.toX];\n let dot;\n const dots = [];\n Math.abs(t1) > 1e12 && (t1 = 0.5);\n Math.abs(t2) > 1e12 && (t2 = 0.5);\n if (t1 >= 0 && t1 <= 1) {\n dot = this.interpolate(t1);\n x.push(dot.x);\n y.push(dot.y);\n dots.push({ X: dot.x, Y: dot.y });\n }\n if (t2 >= 0 && t2 <= 1) {\n dot = this.interpolate(t2);\n x.push(dot.x);\n y.push(dot.y);\n dots.push({ X: dot.x, Y: dot.y });\n }\n a = this.c2y - 2 * this.c1y + this.y - (this.toY - 2 * this.c2y + this.c1y);\n b = 2 * (this.c1y - this.y) - 2 * (this.c2y - this.c1y);\n c = this.y - this.c1y;\n t1 = (-b + Math.sqrt(b * b - 4 * a * c)) / 2 / a;\n t2 = (-b - Math.sqrt(b * b - 4 * a * c)) / 2 / a;\n Math.abs(t1) > 1e12 && (t1 = 0.5);\n Math.abs(t2) > 1e12 && (t2 = 0.5);\n if (t1 >= 0 && t1 <= 1) {\n dot = this.interpolate(t1);\n x.push(dot.x);\n y.push(dot.y);\n dots.push({ X: dot.x, Y: dot.y });\n }\n if (t2 >= 0 && t2 <= 1) {\n dot = this.interpolate(t2);\n x.push(dot.x);\n y.push(dot.y);\n dots.push({ X: dot.x, Y: dot.y });\n }\n // remove duplicate dots\n const dots2 = [];\n const l = dots.length;\n for (let i = 0; i < l; i++) {\n for (let j = i + 1; j < l; j++) {\n if (dots[i].X === dots[j].X && dots[i].Y === dots[j].Y) j = ++i;\n }\n dots2.push({ X: dots[i].X, Y: dots[i].Y });\n }\n const min = { x: Math.min.apply(Math, x), y: Math.min.apply(Math, y) };\n const max = { x: Math.max.apply(Math, x), y: Math.max.apply(Math, y) };\n return {\n x: min.x,\n y: min.y,\n width: max.x - min.x,\n height: max.y - min.y,\n dots: dots2 // these are the extrema points\n };\n }\n\n /// t (0.0 to 1.0) : The fraction of the overall duration of the path\n interpolate(t: number): { x: number; y: number } {\n return {\n x:\n Math.pow(1 - t, 3) * this.x +\n 3 * Math.pow(1 - t, 2) * t * this.c1x +\n 3 * Math.pow(1 - t, 1) * Math.pow(t, 2) * this.c2x +\n Math.pow(t, 3) * this.toX,\n y:\n Math.pow(1 - t, 3) * this.y +\n 3 * Math.pow(1 - t, 2) * t * this.c1y +\n 3 * Math.pow(1 - t, 1) * Math.pow(t, 2) * this.c2y +\n Math.pow(t, 3) * this.toY\n };\n }\n\n static base3(\n t: number,\n p1: number,\n p2: number,\n p3: number,\n p4: number\n ): number {\n const t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4;\n const t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n return t * t2 - 3 * p1 + 3 * p2;\n }\n\n /**\n * Based on snap.svg bezlen() function\n * like getTotalLength(), approximate a cubic bézier length\n * https://github.com/adobe-webplatform/Snap.svg/blob/master/dist/snap.svg.js#L5786\n */\n static bezlen(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n x4: number,\n y4: number,\n z = 1 /// length: 0 ~ 1\n ): number {\n z = Math.max(0, Math.min(z, 1));\n const z2 = z / 2;\n const Tvalues = [\n -0.1252, 0.1252, -0.3678, 0.3678, -0.5873, 0.5873, -0.7699, 0.7699,\n -0.9041, 0.9041, -0.9816, 0.9816\n ];\n const Cvalues = [\n 0.2491, 0.2491, 0.2335, 0.2335, 0.2032, 0.2032, 0.1601, 0.1601, 0.1069,\n 0.1069, 0.0472, 0.0472\n ];\n let sum = 0;\n /// 12 = Tvalues.length = Cvalues.length\n for (let i = 0; i < 12; i++) {\n const ct = z2 * Tvalues[i] + z2;\n const xbase = this.base3(ct, x1, x2, x3, x4);\n const ybase = this.base3(ct, y1, y2, y3, y4);\n sum += Cvalues[i] * Math.sqrt(xbase * xbase + ybase * ybase);\n }\n return z2 * sum;\n }\n\n length(z = 1): number {\n return CubicBezier.bezlen(\n this.x,\n this.y,\n this.c1x,\n this.c1y,\n this.c2x,\n this.c2y,\n this.toX,\n this.toY,\n z\n );\n }\n\n /// get position on the curve (0..1)\n getTatLen(ll: number): number {\n const x1 = this.x;\n const y1 = this.y;\n const x2 = this.c1x;\n const y2 = this.c1y;\n const x3 = this.c2x;\n const y3 = this.c2y;\n const x4 = this.toX;\n const y4 = this.toY;\n if (ll < 0 || CubicBezier.bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) {\n return 0;\n }\n const t = 1;\n let step = t / 2;\n let t2 = t - step;\n let l = CubicBezier.bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n while (Math.abs(l - ll) > 0.01) {\n step /= 2;\n t2 += (l < ll ? 1 : -1) * step;\n l = CubicBezier.bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n }\n return t2;\n }\n\n /// Find dot coordinates on the given cubic bezier curve at the given t\n getPointAtSegmentLength(length: number) {\n const t = this.getTatLen(length);\n const t1 = 1 - t,\n t13 = Math.pow(t1, 3),\n t12 = Math.pow(t1, 2),\n t2 = t * t,\n t3 = t2 * t,\n x =\n t13 * this.x +\n t12 * 3 * t * this.c1x +\n t1 * 3 * t * t * this.c2x +\n t3 * this.toX,\n y =\n t13 * this.y +\n t12 * 3 * t * this.c1y +\n t1 * 3 * t * t * this.c2y +\n t3 * this.toY,\n mx =\n this.x +\n 2 * t * (this.c1x - this.x) +\n t2 * (this.c2x - 2 * this.c1x + this.x),\n my =\n this.y +\n 2 * t * (this.c1y - this.y) +\n t2 * (this.c2y - 2 * this.c1y + this.y),\n nx =\n this.c1x +\n 2 * t * (this.c2x - this.c1x) +\n t2 * (this.toX - 2 * this.c2x + this.c1x),\n ny =\n this.c1y +\n 2 * t * (this.c2y - this.c1y) +\n t2 * (this.toY - 2 * this.c2y + this.c1y),\n ax = t1 * this.x + t * this.c1x,\n ay = t1 * this.y + t * this.c1y,\n cx = t1 * this.c2x + t * this.toX,\n cy = t1 * this.c2y + t * this.toY,\n alpha = 90 - (Math.atan2(mx - nx, my - ny) * 180) / Math.PI;\n // (mx > nx || my < ny) && (alpha += 180);\n return {\n x: x, // x coordinate of the point\n y: y, // y coordinate of the point\n m: {\n x: mx, // x coordinate of the left anchor\n y: my // y coordinate of the left anchor\n },\n n: {\n x: nx, // x coordinate of the right anchor\n y: ny // y coordinate of the right anchor\n },\n start: {\n x: ax, // x coordinate of the start of the curve\n y: ay // y coordinate of the start of the curve\n },\n end: {\n x: cx, // x coordinate of the end of the curve\n y: cy // y coordinate of the end of the curve\n },\n alpha: alpha // degree: angle of the curve derivative at the point\n };\n }\n}\n\nexport default CubicBezier;\n","// https://github.com/colinmeinke/svg-arc-to-cubic-bezier\n//\n// Convert an arc to a sequence of cubic bézier curves\n//\n\nconst TAU = Math.PI * 2;\n\n// Calculate an angle between two unit vectors\n//\n// Since we measure angle between radii of circular arcs,\n// we can use simplified math (without length normalization)\n//\nfunction unit_vector_angle(ux: number, uy: number, vx: number, vy: number) {\n const sign = ux * vy - uy * vx < 0 ? -1 : 1;\n let dot = ux * vx + uy * vy;\n\n // Add this to work with arbitrary vectors:\n // dot /= Math.sqrt(ux * ux + uy * uy) * Math.sqrt(vx * vx + vy * vy);\n\n // rounding errors, e.g. -1.0000000000000002 can screw up this\n if (dot > 1.0) {\n dot = 1.0;\n }\n if (dot < -1.0) {\n dot = -1.0;\n }\n\n return sign * Math.acos(dot);\n}\n\n// Convert from endpoint to center parameterization,\n// see http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n//\n// Return [cx, cy, theta1, delta_theta]\n//\nfunction get_arc_center(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n fa: number,\n fs: number,\n rx: number,\n ry: number,\n sin_phi: number,\n cos_phi: number\n) {\n // Step 1.\n //\n // Moving an ellipse so origin will be the middlepoint between our two\n // points. After that, rotate it to line up ellipse axes with coordinate\n // axes.\n //\n const x1p = (cos_phi * (x1 - x2)) / 2 + (sin_phi * (y1 - y2)) / 2;\n const y1p = (-sin_phi * (x1 - x2)) / 2 + (cos_phi * (y1 - y2)) / 2;\n\n const rx_sq = rx * rx;\n const ry_sq = ry * ry;\n const x1p_sq = x1p * x1p;\n const y1p_sq = y1p * y1p;\n\n // Step 2.\n //\n // Compute coordinates of the centre of this ellipse (cx', cy')\n // in the new coordinate system.\n //\n let radicant = rx_sq * ry_sq - rx_sq * y1p_sq - ry_sq * x1p_sq;\n\n if (radicant < 0) {\n // due to rounding errors it might be e.g. -1.3877787807814457e-17\n radicant = 0;\n }\n\n radicant /= rx_sq * y1p_sq + ry_sq * x1p_sq;\n radicant = Math.sqrt(radicant) * (fa === fs ? -1 : 1);\n\n const cxp = ((radicant * rx) / ry) * y1p;\n const cyp = ((radicant * -ry) / rx) * x1p;\n\n // Step 3.\n //\n // Transform back to get centre coordinates (cx, cy) in the original\n // coordinate system.\n //\n const cx = cos_phi * cxp - sin_phi * cyp + (x1 + x2) / 2;\n const cy = sin_phi * cxp + cos_phi * cyp + (y1 + y2) / 2;\n\n // Step 4.\n //\n // Compute angles (theta1, delta_theta).\n //\n const v1x = (x1p - cxp) / rx;\n const v1y = (y1p - cyp) / ry;\n const v2x = (-x1p - cxp) / rx;\n const v2y = (-y1p - cyp) / ry;\n\n const theta1 = unit_vector_angle(1, 0, v1x, v1y);\n let delta_theta = unit_vector_angle(v1x, v1y, v2x, v2y);\n\n if (fs === 0 && delta_theta > 0) {\n delta_theta -= TAU;\n }\n if (fs === 1 && delta_theta < 0) {\n delta_theta += TAU;\n }\n\n return [cx, cy, theta1, delta_theta];\n}\n\n//\n// Approximate one unit arc segment with bézier curves,\n// see http://math.stackexchange.com/questions/873224\n//\nfunction approximate_unit_arc(theta1: number, delta_theta: number) {\n const alpha = (4 / 3) * Math.tan(delta_theta / 4);\n\n // // If 90 degree circular arc, use a constant\n // // as derived from http://spencermortensen.com/articles/bezier-circle\n // const alpha =\n // delta_theta === 1.5707963267948966\n // ? 0.551915024494\n // : delta_theta === -1.5707963267948966\n // ? -0.551915024494\n // : (4 / 3) * Math.tan(delta_theta / 4);\n\n const x1 = Math.cos(theta1);\n const y1 = Math.sin(theta1);\n const x2 = Math.cos(theta1 + delta_theta);\n const y2 = Math.sin(theta1 + delta_theta);\n\n return [\n x1,\n y1,\n x1 - y1 * alpha,\n y1 + x1 * alpha,\n x2 + y2 * alpha,\n y2 - x2 * alpha,\n x2,\n y2\n ];\n}\n\n// var curves = a2c(\n// x,\n// y,\n// seg[6],x\n// seg[7],y\n// seg[4],largeArcFlag\n// seg[5],sweepFlag\n// seg[1],rx\n// seg[2],ry\n// seg[3],xAxisRotate\n// );\nexport function a2c(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n fa: number,\n fs: number,\n rx: number,\n ry: number,\n phi: number\n) {\n const sin_phi = Math.sin((phi * TAU) / 360);\n const cos_phi = Math.cos((phi * TAU) / 360);\n\n // Make sure radii are valid\n //\n const x1p = (cos_phi * (x1 - x2)) / 2 + (sin_phi * (y1 - y2)) / 2;\n const y1p = (-sin_phi * (x1 - x2)) / 2 + (cos_phi * (y1 - y2)) / 2;\n\n if (x1p === 0 && y1p === 0) {\n // we're asked to draw line to itself\n return [];\n }\n\n if (rx === 0 || ry === 0) {\n // one of the radii is zero\n return [];\n }\n\n // Compensate out-of-range radii\n //\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n\n const lambda = (x1p * x1p) / (rx * rx) + (y1p * y1p) / (ry * ry);\n if (lambda > 1) {\n rx *= Math.sqrt(lambda);\n ry *= Math.sqrt(lambda);\n }\n\n // Get center parameters (cx, cy, theta1, delta_theta)\n //\n const cc = get_arc_center(x1, y1, x2, y2, fa, fs, rx, ry, sin_phi, cos_phi);\n\n const result = [];\n let theta1 = cc[2];\n let delta_theta = cc[3];\n\n // Split an arc to multiple segments, so each segment\n // will be less than τ/4 (= 90°)\n //\n const segments = Math.max(Math.ceil(Math.abs(delta_theta) / (TAU / 4)), 1);\n\n // // If 'ang2' == 90.0000000001, then `ratio` will evaluate to\n // // 1.0000000001. This causes `segments` to be greater than one, which is an\n // // unecessary split, and adds extra points to the bezier curve. To alleviate\n // // this issue, we round to 1.0 when the ratio is close to 1.0.\n // let ratio = Math.abs(delta_theta) / (TAU / 4);\n // if (Math.abs(1.0 - ratio) < 0.0000001) {\n // ratio = 1.0;\n // }\n // const segments = Math.max(Math.ceil(ratio), 1);\n\n delta_theta /= segments;\n\n for (let i = 0; i < segments; i++) {\n result.push(approximate_unit_arc(theta1, delta_theta));\n theta1 += delta_theta;\n }\n\n // We have a bezier approximation of a unit circle,\n // now need to transform back to the original ellipse\n //\n return result.map((curve) => {\n for (let i = 0; i < curve.length; i += 2) {\n let x = curve[i + 0];\n let y = curve[i + 1];\n\n // scale\n x *= rx;\n y *= ry;\n\n // rotate\n const xp = cos_phi * x - sin_phi * y;\n const yp = sin_phi * x + cos_phi * y;\n\n // translate\n curve[i + 0] = xp + cc[0];\n curve[i + 1] = yp + cc[1];\n }\n\n return curve;\n });\n}\n\n// for more information of where this math came from visit:\n// http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\nexport function a2c2(\n x1: number,\n y1: number,\n rx: number,\n ry: number,\n angle: number,\n large_arc_flag: number,\n sweep_flag: number,\n x2: number,\n y2: number,\n recursive?: number[]\n): number[][] {\n let _120 = (Math.PI * 120) / 180,\n rad = (Math.PI / 180) * (+angle || 0),\n res: number[][] = [],\n xy,\n rotate = function (x: number, y: number, rad: number) {\n const X = x * Math.cos(rad) - y * Math.sin(rad);\n const Y = x * Math.sin(rad) + y * Math.cos(rad);\n return { x: X, y: Y };\n };\n let f1: number;\n let f2: number;\n let cx: number;\n let cy: number;\n if (!recursive) {\n xy = rotate(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotate(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n let cos = Math.cos((Math.PI / 180) * angle),\n sin = Math.sin((Math.PI / 180) * angle),\n x = (x1 - x2) / 2,\n y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx = h * rx;\n ry = h * ry;\n }\n let rx2 = rx * rx,\n ry2 = ry * ry,\n k =\n (large_arc_flag == sweep_flag ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) /\n (rx2 * y * y + ry2 * x * x)\n )\n );\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n f1 = Math.asin(Number(((y1 - cy) / ry).toFixed(9)));\n f2 = Math.asin(Number(((y2 - cy) / ry).toFixed(9)));\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n f1 < 0 && (f1 = Math.PI * 2 + f1);\n f2 < 0 && (f2 = Math.PI * 2 + f2);\n if (sweep_flag && f1 > f2) {\n f1 = f1 - Math.PI * 2;\n }\n if (!sweep_flag && f2 > f1) {\n f2 = f2 - Math.PI * 2;\n }\n } else {\n f1 = recursive[0];\n f2 = recursive[1];\n cx = recursive[2];\n cy = recursive[3];\n }\n let df = f2 - f1;\n if (Math.abs(df) > _120) {\n let f2old = f2,\n x2old = x2,\n y2old = y2;\n f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = a2c2(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy\n ]);\n }\n df = f2 - f1;\n let c1 = Math.cos(f1),\n s1 = Math.sin(f1),\n c2 = Math.cos(f2),\n s2 = Math.sin(f2),\n t = Math.tan(df / 4),\n hx = (4 / 3) * rx * t,\n hy = (4 / 3) * ry * t,\n m1 = [x1, y1],\n m2 = [x1 + hx * s1, y1 - hy * c1],\n m3 = [x2 + hx * s2, y2 - hy * c2],\n m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [[...m2, ...m3, ...m4]].concat(res);\n } else {\n return [[...m2, ...m3, ...m4]].concat(res).map((r) => {\n const newres: number[] = [];\n for (let i = 0, ii = r.length; i < ii; i++) {\n newres[i] =\n i % 2 ? rotate(r[i - 1], r[i], rad).y : rotate(r[i], r[i + 1], rad).x;\n }\n return newres;\n });\n }\n}\n\nexport function q2c(\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number\n) {\n return [\n x1 / 3 + (2 / 3) * cx,\n y1 / 3 + (2 / 3) * cy,\n x2 / 3 + (2 / 3) * cx,\n y2 / 3 + (2 / 3) * cy,\n x2,\n y2\n ];\n}\n\nexport function l2c(x1: number, y1: number, x2: number, y2: number) {\n return [x1, y1, x2, y2, x2, y2];\n}\n","/* eslint-disable no-case-declarations */\nimport { extractAllNumbers, generateUUID, toBlob } from \"@zyzgroup/core-common\";\nimport { DOMToBlob, DOMToString } from \"../file\";\nimport { a2c, a2c2, l2c, q2c } from \"./line2c\";\nimport { useAttribute, useClickA } from \"../hooks\";\n\nexport type TSVGParsedPathData = [command: string, ...args: number[]];\n\nexport const SVGParsedPathArgsLength: Record<string, number> = {\n a: 7, // A rx,ry xAxisRotate LargeArcFlag,SweepFlag x,y\n c: 6, // C c1x,c1y c2x,c2y x,y\n s: 4, // S c2x,c2y x,y\n q: 4, // Q cx,cy x,y\n t: 2, // T x,y\n m: 2, // M x,y\n l: 2, // L x,y\n h: 1, // H x\n v: 1, // V y\n z: 0 // Z\n // r: 4\n};\n\n// console.log(\n// DOMSVGUtil.SVGPathDataToD(\n// DOMSVGUtil.relativeSVGPath(\n// DOMSVGUtil.parseSVGPath(\n// \"M17.7722 6.22781C18.0759 6.53155 18.0759 7.02401 17.7722 7.32775L7.32775 17.7722C7.02401 18.0759 6.53155 18.0759 6.22781 17.7722C5.92406 17.4685 5.92407 16.976 6.22781 16.6722L16.6722 6.22781C16.976 5.92406 17.4684 5.92406 17.7722 6.22781Z\"\n// )\n// )\n// )\n// );\n\nexport class DOMSVGUtil {\n static createSVGElement(\n tagName = \"path\",\n attrs?: Record<string, string>\n ): SVGGeometryElement {\n const el = document.createElementNS.call(\n document,\n \"http://www.w3.org/2000/svg\",\n tagName\n ) as SVGGeometryElement;\n if (attrs) {\n useAttribute(el, attrs);\n }\n return el;\n }\n\n static createSvgPath(d: string, id?: string): SVGPathElement {\n const path = this.createSVGElement(\"path\", { d, id: id || generateUUID() });\n return path as unknown as SVGPathElement;\n }\n\n static downloadFromSVGElement(svgContainer: SVGElement, name = \"shape\") {\n return useClickA(\n DOMToBlob(svgContainer as unknown as HTMLElement),\n `${name}.svg`\n );\n }\n\n static downloadFromSVGString(svgString: string, name = \"shape\") {\n return useClickA(toBlob(svgString), `${name}.svg`);\n }\n\n static getSVGRawStringFromElement(el: HTMLElement) {\n return DOMToString(el);\n }\n\n // https://github.com/dy/is-svg-path\n // isSVGPath('M0 0L10 20 20 0Z') //true\n // isSVGPath('M00Z') //false\n // isSVGPath('xyz') //false\n static isSVGPath(str: string) {\n if (typeof str !== \"string\") return false;\n str = str.trim();\n // https://www.w3.org/TR/SVG/paths.html#PathDataBNF\n return (\n /^[mlhvzaqtcs]\\s*[-+.0-9][^mlhvzaqtcs]+/i.test(str) && /[\\dz]$/i.test(str)\n // && str.length > 4\n );\n }\n\n static SVGPathDataToD(path: TSVGParsedPathData[]): string {\n return path\n .map((item) => {\n if (!item[0]) {\n return \"\";\n }\n switch (item[0].toLowerCase()) {\n case \"a\":\n return `${item[0]} ${item[1]},${item[2]} ${item[3]} ${item[4]},${item[5]} ${item[6]},${item[7]}`;\n case \"c\":\n return `${item[0]} ${item[1]},${item[2]} ${item[3]},${item[4]} ${item[5]},${item[6]}`;\n case \"s\":\n case \"q\":\n return `${item[0]} ${item[1]},${item[2]} ${item[3]},${item[4]}`;\n default:\n return item[0] + \" \" + item.slice(1).join(\",\");\n }\n })\n .join(\" \");\n }\n\n /// parse an svg path data string to `[[command, arg1, arg2, ...], ...]`\n static parseSVGPath(path: string): TSVGParsedPathData[] {\n const data: TSVGParsedPathData[] = [];\n if (!DOMSVGUtil.isSVGPath(path)) {\n // throw new Error(`parseSVGPath(path = ${path}) is not a SVG path!`);\n return data;\n }\n path.replace(\n /([mlhvzaqtcs])([^mlhvzaqtcs]*)/gi,\n (substring: string, command: string, argsString: string): string => {\n let type = command.toLowerCase();\n const args: number[] = extractAllNumbers(argsString);\n\n // overloaded moveTo\n if (type == \"m\" && args.length > SVGParsedPathArgsLength[type]) {\n data.push([\n command,\n ...args.splice(0, SVGParsedPathArgsLength[type])\n ]);\n type = \"l\";\n command = command == \"m\" ? \"l\" : \"L\";\n }\n\n while (args.length) {\n if (args.length < SVGParsedPathArgsLength[type]) {\n throw new Error(\n `parseSVGPath substring:{ ${substring} } command:{ ${command} } args:{ ${args} }`\n );\n } else {\n data.push([\n command,\n ...args.splice(0, SVGParsedPathArgsLength[type])\n ]);\n }\n }\n\n if (type == \"z\") {\n data.push([command]);\n }\n\n return \"\";\n }\n );\n return data;\n }\n\n /// https://github.com/jkroso/abs-svg-path\n static absolutizeSVGPath(path: TSVGParsedPathData[]): TSVGParsedPathData[] {\n let startX = 0;\n let startY = 0;\n let x = 0;\n let y = 0;\n\n return path.map(function (seg) {\n const type = seg[0];\n const command = type.toUpperCase();\n\n // is relative\n if (type != command) {\n seg[0] = command;\n switch (type) {\n case \"a\":\n seg[6] += x;\n seg[7] += y;\n break;\n case \"v\":\n seg[1] += y;\n break;\n case \"h\":\n seg[1] += x;\n break;\n default:\n for (let i = 1; i < seg.length; ) {\n (seg[i++] as number) += x;\n (seg[i++] as number) += y;\n }\n }\n }\n\n switch (command) {\n case \"Z\":\n x = startX;\n y = startY;\n break;\n case \"H\":\n x = seg[1];\n break;\n case \"V\":\n y = seg[1];\n break;\n case \"M\":\n x = startX = seg[1];\n y = startY = seg[2];\n break;\n default:\n x = seg[seg.length - 2] as number;\n y = seg[seg.length - 1] as number;\n }\n\n return seg;\n });\n }\n\n static relativeSVGPath(path: TSVGParsedPathData[]): TSVGParsedPathData[] {\n let startX = 0;\n let startY = 0;\n let x = 0;\n let y = 0;\n\n return path.map(function (seg) {\n const type = seg[0];\n const command = type.toLowerCase();\n\n // is absolute\n if (type != command) {\n seg[0] = command;\n switch (type) {\n case \"A\":\n seg[6] -= x;\n seg[7] -= y;\n break;\n case \"V\":\n seg[1] -= y;\n break;\n case \"H\":\n seg[1] -= x;\n break;\n default:\n for (let i = 1; i < seg.length; ) {\n (seg[i++] as number) -= x;\n (seg[i++] as number) -= y;\n }\n }\n }\n\n switch (command) {\n case \"z\":\n x = startX;\n y = startY;\n break;\n case \"h\":\n x += seg[1];\n break;\n case \"v\":\n y += seg[1];\n break;\n case \"m\":\n x += seg[1];\n y += seg[2];\n startX += seg[1];\n startY += seg[2];\n break;\n default:\n x += seg[seg.length - 2] as number;\n y += seg[seg.length - 1] as number;\n }\n\n return seg;\n });\n }\n\n /// 统统变为 CubicBezier\n /// https://github.com/jkroso/normalize-svg-path\n static normalizeSVGPath(path: TSVGParsedPathData[]): TSVGParsedPathData[] {\n const result: TSVGParsedPathData[] = [];\n let startX = 0;\n let startY = 0;\n let x = 0;\n let y = 0;\n let quadX = 0;\n let quadY = 0;\n let bezierX = 0;\n let bezierY = 0;\n\n let prevCommand;\n\n for (let i = 0, len = path.length; i < len; i++) {\n let seg = path[i];\n const command = seg[0];\n\n switch (command) {\n case \"M\":\n startX = seg[1];\n startY = seg[2];\n break;\n case \"A\":\n const curves = a2c(\n x,\n y,\n seg[6],\n seg[7],\n seg[4],\n seg[5],\n seg[1],\n seg[2],\n seg[3]\n );\n // const curves = a2c2(\n // x,\n // y,\n // seg[1],\n // seg[2],\n // seg[3],\n // seg[4],\n // seg[5],\n // seg[6],\n // seg[7]\n // );\n if (!curves.length) continue;\n curves.forEach((curve, j) => {\n /// a2c\n const [x0, y0, x1, y1, x2, y2, x3, y3] = curve;\n /// a2c2\n // const [x1, y1, x2, y2, x3, y3] = curve;\n seg = [\"C\", x1, y1, x2, y2, x3, y3];\n if (j < curves.length - 1) {\n result.push(seg);\n }\n });\n break;\n case \"S\":\n // default control point\n let cx = x;\n let cy = y;\n if (prevCommand == \"C\" || prevCommand == \"S\") {\n cx += cx - bezierX; // reflect the previous command's control\n cy += cy - bezierY; // point relative to the current point\n }\n seg = [\"C\", cx, cy, seg[1], seg[2], seg[3], seg[4]];\n break;\n case \"T\":\n if (prevCommand == \"Q\" || prevCommand == \"T\") {\n quadX = x * 2 - quadX; // as with 'S' reflect previous control point\n quadY = y * 2 - quadY;\n } else {\n quadX = x;\n quadY = y;\n }\n seg = [\"C\", ...q2c(x, y, quadX, quadY, seg[1], seg[2])];\n break;\n case \"Q\":\n quadX = seg[1];\n quadY = seg[2];\n seg = [\"C\", ...q2c(x, y, seg[1], seg[2], seg[3], seg[4])];\n break;\n case \"L\":\n seg = [\"C\", ...l2c(x, y, seg[1], seg[2])];\n break;\n case \"H\":\n seg = [\"C\", ...l2c(x, y, seg[1], y)];\n break;\n case \"V\":\n seg = [\"C\", ...l2c(x, y, x, seg[1])];\n break;\n case \"Z\":\n seg = [\"C\", ...l2c(x, y, startX, startY)];\n break;\n }\n\n prevCommand = command;\n x = seg[seg.length - 2] as number;\n y = seg[seg.length - 1] as number;\n if (seg.length > 4) {\n bezierX = seg[seg.length - 4] as number;\n bezierY = seg[seg.length - 3] as number;\n } else {\n bezierX = x;\n bezierY = y;\n }\n\n result.push(seg);\n }\n\n return result;\n }\n\n /// http://schepers.cc/getting-to-the-point\n /// Catmull-Rom curves : `R x1,y1 x2,y2 x3,y3`\n static catmullRom2bezier(crp: number[]): TSVGParsedPathData[] {\n const d: TSVGParsedPathData[] = [];\n for (let i = 0, iLen = crp.length; iLen - 2 > i; i += 2) {\n let p;\n if (0 == i) {\n p = [\n { x: crp[i], y: crp[i + 1] },\n { x: crp[i], y: crp[i + 1] },\n { x: crp[i + 2], y: crp[i + 3] },\n { x: crp[i + 4], y: crp[i + 5] }\n ];\n } else if (iLen - 4 == i) {\n p = [\n { x: crp[i - 2], y: crp[i - 1] },\n { x: crp[i], y: crp[i + 1] },\n { x: crp[i + 2], y: crp[i + 3] },\n { x: crp[i + 2], y: crp[i + 3] }\n ];\n } else {\n p = [\n { x: crp[i - 2], y: crp[i - 1] },\n { x: crp[i], y: crp[i + 1] },\n { x: crp[i + 2], y: crp[i + 3] },\n { x: crp[i + 4], y: crp[i + 5] }\n ];\n }\n\n // Catmull-Rom to Cubic Bezier conversion matrix\n // 0 1 0 0\n // -1/6 1 1/6 0\n // 0 1/6 1 -1/6\n // 0 0 1 0\n\n const bp = [\n { x: p[1].x, y: p[1].y },\n {\n x: (-p[0].x + 6 * p[1].x + p[2].x) / 6,\n y: (-p[0].y + 6 * p[1].y + p[2].y) / 6\n },\n {\n x: (p[1].x + 6 * p[2].x - p[3].x) / 6,\n y: (p[1].y + 6 * p[2].y - p[3].y) / 6\n },\n { x: p[2].x, y: p[2].y }\n ];\n\n d.push([\"C\", bp[1].x, bp[1].y, bp[2].x, bp[2].y, bp[3].x, bp[3].y]);\n }\n\n return d;\n }\n\n // Convert 'Z', 'V' and 'H' segments to 'L' segments\n static zvhToLSVGPath(path: TSVGParsedPathData[]): TSVGParsedPathData[] {\n const result: TSVGParsedPathData[] = [];\n let startPoint: TSVGParsedPathData = [\"L\", 0, 0];\n let lastPoint: TSVGParsedPathData;\n for (let i = 0, len = path.length; i < len; i++) {\n const pt = path[i];\n switch (pt[0]) {\n case \"M\":\n startPoint = [\"L\", pt[1], pt[2]];\n result.push(pt);\n break;\n case \"Z\":\n result.push(startPoint);\n break;\n case \"H\":\n lastPoint = result[result.length - 1] || [\"L\", 0, 0];\n result.push([\n \"L\",\n pt[1],\n lastPoint[lastPoint.length - 1]\n ] as TSVGParsedPathData);\n break;\n case \"V\":\n lastPoint = result[result.length - 1] || [\"L\", 0, 0];\n result.push([\n \"L\",\n lastPoint[lastPoint.length - 2],\n pt[1]\n ] as TSVGParsedPathData);\n break;\n default:\n result.push(pt);\n }\n }\n return result;\n }\n\n // Expand shorthand curve commands to full versions; mutates the path in place for efficiency\n // Requires commands have already been converted to absolute versions\n static longhandSVGPath(path: TSVGParsedPathData[]): TSVGParsedPathData[] {\n const conversion: Record<string, { to: string; x: number }> = {\n S: { to: \"C\", x: 3 },\n T: { to: \"Q\", x: 1 }\n };\n let prev;\n let x1 = 0;\n let y1 = 0;\n for (let i = 0, len = path.length; i < len; i++) {\n const cmd = path[i];\n const convert = conversion[cmd[0]];\n if (convert) {\n cmd[0] = convert.to;\n if (prev) {\n if (prev[0] === convert.to) {\n x1 = 2 * Number(prev[convert.x + 2]) - Number(prev[convert.x]);\n y1 = 2 * Number(prev[convert.x + 3]) - Number(prev[convert.x + 1]);\n } else {\n x1 = Number(prev[prev.length - 2]);\n y1 = Number(prev[prev.length - 1]);\n }\n }\n cmd.splice(1, 0, x1, y1);\n }\n prev = cmd;\n }\n return path;\n }\n}\n\nexport default DOMSVGUtil;\n","import { maxDotNumber } from \"@zyzgroup/core-common\";\nimport { Matrix, Matrix4 } from \"../Matrix\";\nimport { angle, distance, distance2, toRadian } from \"../math\";\nimport { YZCanvasContext } from \"../../canvas/YZCanvasContext\";\nimport DOMSVGUtil, { type TSVGParsedPathData } from \"../../svg/DOMSVGUtil\";\nimport { a2c, l2c, q2c } from \"../../svg/line2c\";\nimport L from \"./L\";\nimport CubicBezier from \"./CubicBezier\";\nimport QuadraticBezier from \"./QuadraticBezier\";\nimport Arc from \"./Arc\";\n\n/// 连续的曲线\nexport class PathD {\n /// cX cY 为相对于自身 (0,0) 点的相对值\n public cX: number;\n public cY: number;\n public x: number;\n public y: number;\n public degree: number;\n public scalarX: number;\n public scalarY: number;\n\n /// 绝对值\n public startPathX = 0;\n public startPathY = 0;\n public prevPathX = 0;\n public prevPathY = 0;\n public normalizedLines: CubicBezier[] = [];\n\n // d = \"M0,0\"\n // d = [['C',1,2,3,4,5,6]]\n constructor(options?: {\n d?: string | TSVGParsedPathData[] | PathD;\n originMatrix?: Matrix | Matrix4 | DOMMatrix;\n centerX?: number;\n centerY?: number;\n x?: number;\n y?: number;\n degree?: number;\n scalar?: number;\n scalarX?: number;\n scalarY?: number;\n }) {\n this.cX = 0;\n this.cY = 0;\n this.x = options?.x || 0;\n this.y = options?.y || 0;\n if (\n typeof options?.centerX == \"number\" &&\n typeof options?.centerY == \"number\"\n ) {\n this.cX = options.centerX - this.x;\n this.cY = options.centerY - this.y;\n }\n this.degree = options?.degree || 0;\n this.scalarX = 1;\n this.scalarY = 1;\n if (options?.scalar !== void 0) {\n this.scalarX = options.scalar;\n this.scalarY = options.scalar;\n }\n if (options?.scalarX !== void 0) {\n this.scalarX = options.scalarX;\n }\n if (options?.scalarY !== void 0) {\n this.scalarY = options.scalarY;\n }\n this.reset(options?.d, options?.originMatrix);\n }\n\n public reset(\n d?: string | TSVGParsedPathData[] | PathD,\n originMatrix?: Matrix | Matrix4 | DOMMatrix\n ) {\n if (typeof d == \"string\") {\n this.resetFromSVGPathData(DOMSVGUtil.parseSVGPath(d), originMatrix);\n } else if (d instanceof PathD) {\n this.resetFromSVGPathData(d.toSVGPathData(), originMatrix);\n } else {\n this.resetFromSVGPathData(d || [], originMatrix);\n }\n }\n\n private resetFromSVGPathData(\n data: TSVGParsedPathData[],\n originMatrix?: Matrix | Matrix4 | DOMMatrix\n ) {\n this.normalizedLines = [];\n /// paths 只包含 M 或 C 语句\n const paths = DOMSVGUtil.normalizeSVGPath(\n DOMSVGUtil.absolutizeSVGPath(data)\n );\n this.prevPathX = this.startPathX = 0;\n this.prevPathY = this.startPathY = 0;\n let isResetStart = false;\n for (let i = 0, count = paths.length; i < count; i++) {\n const path = paths[i];\n const command = path[0];\n if (command == \"M\") {\n if (!isResetStart) {\n isResetStart = true;\n this.startPathX = path[1];\n this.startPathY = path[2];\n }\n this.prevPathX = path[1];\n this.prevPathY = path[2];\n continue;\n }\n this.appendLine(\n new CubicBezier({\n c1x: path[1],\n c1y: path[2],\n c2x: path[3],\n c2y: path[4],\n toX: path[5],\n toY: path[6]\n })\n );\n }\n if (originMatrix) {\n ({ x: this.startPathX, y: this.startPathY } = originMatrix.transformPoint(\n {\n x: this.startPathX,\n y: this.startPathY\n }\n ));\n ({ x: this.prevPathX, y: this.prevPathY } = originMatrix.transformPoint({\n x: this.prevPathX,\n y: this.prevPathY\n }));\n this.normalizedLines.forEach((l) => {\n ({ x: l.x, y: l.y } = originMatrix.transformPoint({ x: l.x, y: l.y }));\n ({ x: l.c1x, y: l.c1y } = originMatrix.transformPoint({\n x: l.c1x,\n y: l.c1y\n }));\n ({ x: l.c2x, y: l.c2y } = originMatrix.transformPoint({\n x: l.c2x,\n y: l.c2y\n }));\n ({ x: l.toX, y: l.toY } = originMatrix.transformPoint({\n x: l.toX,\n y: l.toY\n }));\n });\n }\n }\n\n static fromPolymorphPoints(points: number[]): PathD {\n const d = new PathD();\n d.prevPathX = d.startPathX = points[0] || 0;\n d.prevPathY = d.startPathY = points[1] || 0;\n for (let k = 2, count = points.length; k + 5 < count; k += 6) {\n d.appendLine(\n new CubicBezier({\n c1x: points[k],\n c1y: points[k + 1],\n c2x: points[k + 2],\n c2y: points[k + 3],\n toX: points[k + 4],\n toY: points[k + 5]\n })\n );\n }\n return d;\n }\n\n static fromLines(lines: L[]): PathD {\n const d = new PathD();\n d.prevPathX = d.startPathX = lines[0].x || 0;\n d.prevPathY = d.startPathY = lines[0].y || 0;\n for (let i = 0, count = lines.length; i < count; i++) {\n d.appendLine(lines[i]);\n }\n return d;\n }\n\n /// 涉及 this.prevPathX + this.prevPathY\n private appendLine(line: L) {\n if (line instanceof Arc) {\n const curves = a2c(\n this.prevPathX,\n this.prevPathY,\n line.toX,\n line.toY,\n line.largeArcFlag,\n line.sweepFlag,\n line.rx,\n line.ry,\n line.xAxisRotate\n );\n curves.forEach((curve) => {\n const [x0, y0, x1, y1, x2, y2, x, y] = curve;\n this.normalizedLines.push(\n new CubicBezier({\n x: this.prevPathX,\n y: this.prevPathY,\n c1x: x1,\n c1y: y1,\n c2x: x2,\n c2y: y2,\n toX: x,\n toY: y\n })\n );\n this.prevPathX = x;\n this.prevPathY = y;\n });\n return;\n }\n let x1, y1, x2, y2, toX, toY;\n if (line instanceof CubicBezier) {\n x1 = line.c1x;\n y1 = line.c1y;\n x2 = line.c2x;\n y2 = line.c2y;\n toX = line.toX;\n toY = line.toY;\n } else if (line instanceof QuadraticBezier) {\n [x1, y1, x2, y2, toX, toY] = q2c(\n this.prevPathX,\n this.prevPathY,\n line.cx,\n line.cy,\n line.toX,\n line.toY\n );\n } else {\n /// L\n [x1, y1, x2, y2, toX, toY] = l2c(\n this.prevPathX,\n this.prevPathY,\n line.toX,\n line.toY\n );\n }\n this.normalizedLines.push(\n new CubicBezier({\n x: this.prevPathX,\n y: this.prevPathY,\n c1x: x1,\n c1y: y1,\n c2x: x2,\n c2y: y2,\n toX: toX,\n toY: toY\n })\n );\n this.prevPathX = toX;\n this.prevPathY = toY;\n }\n\n /// 绝对值\n toSVGPathData(): TSVGParsedPathData[] {\n const { startPathX, startPathY, normalizedLines } = this.updateTransform();\n const data: TSVGParsedPathData[] = [];\n data.push([\"M\", startPathX, startPathY]);\n for (let i = 0, count = normalizedLines.length; i < count; i++) {\n data.push(...normalizedLines[i].toSVGPathData());\n }\n // data.push([\"z\"]);\n return data;\n }\n\n toSVGPathD(): string {\n return DOMSVGUtil.SVGPathDataToD(this.toSVGPathData());\n }\n\n /// PathD 自己管理 canvas transform\n toCanvasContext(ctx: YZCanvasContext) {\n const { startPathX, startPathY, normalizedLines } = this.updateTransform();\n ctx.beginPath();\n ctx.moveTo(startPathX, startPathY);\n normalizedLines.forEach((c) => {\n c.toCanvasContext(ctx);\n });\n // ctx.closePath();\n }\n\n /// 绝对值\n public getBoundingClientRect() {\n const { normalizedLines } = this.updateTransform();\n const X: number[] = [];\n const Y: number[] = [];\n normalizedLines.forEach((l) => {\n const rect = l.getBoundingClientRect();\n X.push(rect.x, rect.x + rect.width);\n Y.push(rect.y, rect.y + rect.height);\n });\n if (X.length == 0 || Y.length == 0) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n const xmin = Math.min.apply(0, X);\n const ymin = Math.min.apply(0, Y);\n const xmax = Math.max.apply(0, X);\n const ymax = Math.max.apply(0, Y);\n return {\n x: xmin,\n y: ymin,\n width: xmax - xmin,\n height: ymax - ymin\n };\n }\n\n public update(t: {\n cX?: number;\n cY?: number;\n x: number;\n y: number;\n degree: number;\n scalarX: number;\n scalarY: number;\n }) {\n this.cX = typeof t.cX == \"number\" ? t.cX : this.cX;\n this.cY = typeof t.cY == \"number\" ? t.cY : this.cY;\n this.x = t.x;\n this.y = t.y;\n this.degree = t.degree;\n this.scalarX = t.scalarX;\n this.scalarY = t.scalarY;\n }\n\n private updateTransform() {\n /// 移动的是坐标系\n /// the order of these are important\n const m = new Matrix();\n\n /// followMouse 不对\n // m.translate(\n // this.x - this.prevX + this.prevCX,\n // this.y - this.prevY + this.prevCY\n // );\n // m.scale(1 / this.prevScalarX, 1 / this.prevScalarY);\n // m.rotate(-this.prevDegree);\n // m.translate(this.cX - this.prevCX, this.cY - this.prevCY);\n // m.rotate(this.degree);\n // m.scale(this.scalarX, this.scalarY);\n // m.translate(-this.cX, -this.cY);\n\n /// 连续精度影响 不对\n // m.scale(\n // this.scalarX / this.prevScalarX,\n // this.scalarY / this.prevScalarY,\n // this.cX + this.x,\n // this.cY + this.y\n // );\n // m.rotate(this.degree - this.prevDegree, this.cX + this.x, this.cY + this.y);\n // m.translate(this.x - this.prevX, this.y - this.prevY);\n\n /// 连续精度影响 不对\n // m.translate(this.x + this.cX, this.y + this.cY);\n // m.scale(this.scalarX / this.prevScalarX, this.scalarY / this.prevScalarY);\n // m.rotate(this.degree - this.prevDegree);\n // m.translate(-this.prevX - this.cX, -this.prevY - this.cY);\n\n m.translate(this.x + this.cX, this.y + this.cY);\n m.rotate(this.degree);\n m.scale(this.scalarX, this.scalarY);\n m.translate(-this.cX, -this.cY);\n\n if (!m.isIdentity) {\n let startPathX = this.startPathX;\n let startPathY = this.startPathY;\n ({ x: startPathX, y: startPathY } = m.transformPoint({\n x: startPathX,\n y: startPathY\n }));\n const normalizedLines: CubicBezier[] = [];\n this.normalizedLines.forEach((l) => {\n let x = l.x;\n let y = l.y;\n let c1x = l.c1x;\n let c1y = l.c1y;\n let c2x = l.c2x;\n let c2y = l.c2y;\n let toX = l.toX;\n let toY = l.toY;\n ({ x: x, y: y } = m.transformPoint({ x: x, y: y }));\n ({ x: c1x, y: c1y } = m.transformPoint({ x: c1x, y: c1y }));\n ({ x: c2x, y: c2y } = m.transformPoint({ x: c2x, y: c2y }));\n ({ x: toX, y: toY } = m.transformPoint({ x: toX, y: toY }));\n normalizedLines.push(\n new CubicBezier({ x, y, c1x, c1y, c2x, c2y, toX, toY })\n );\n });\n return {\n startPathX,\n startPathY,\n normalizedLines\n };\n } else {\n return {\n startPathX: this.startPathX,\n startPathY: this.startPathY,\n normalizedLines: this.normalizedLines\n };\n }\n }\n\n /// returns length in pixels\n getTotalLength(): number {\n const { normalizedLines } = this.updateTransform();\n /// 实际值:1718.289461119151\n return normalizedLines.reduce((acc, l) => (acc += l.length()), 0);\n /// 实际值:1718.2906494140625\n // const el = DOMSVGUtil.createSvgPath(this.toSVGPathD());\n // return el.getTotalLength();\n }\n\n getPointAtLength(length: number): {\n x: number;\n y: number;\n alpha: number; // degree: angle of derivative\n } {\n const { normalizedLines } = this.updateTransform();\n /// 实际值:{x: 69.12001660070015, y: 139.8368628028231}\n let len = 0;\n const linesCount = normalizedLines.length;\n for (let i = 0; i < linesCount; i++) {\n const p = normalizedLines[i];\n const l = p.length();\n if (len + l >= length) {\n return p.getPointAtSegmentLength(length - len);\n }\n len += l;\n }\n return normalizedLines[linesCount - 1].getPointAtSegmentLength(1);\n /// 实际值:{x: 69.12151336669922, y: 139.8350830078125}\n // const el = DOMSVGUtil.createSvgPath(this.toSVGPathD());\n // return el.getPointAtLength(length);\n }\n\n /// 与 getPointAtLength 类似\n /// t (0.0 to 1.0) : The fraction of the overall duration of the path\n interpolate(t: number): { x: number; y: number } {\n const { startPathX, startPathY, normalizedLines } = this.updateTransform();\n const linesCount = normalizedLines.length;\n if (linesCount === 0) {\n return { x: startPathX, y: startPathY };\n } else if (linesCount === 1) {\n return normalizedLines[0].interpolate(t);\n } else {\n let ratio = t * linesCount;\n let path = normalizedLines[0];\n ratio--;\n if (ratio > 1) {\n for (let i = 1; i < linesCount; i++) {\n path = normalizedLines[i];\n if (ratio > 1) {\n ratio -= 1;\n } else {\n break;\n }\n }\n }\n return path.interpolate(ratio);\n }\n }\n\n /// from | to : 0 ~ 1\n getSubpath(from: number, to: number): PathD {\n if (this.getTotalLength() - to < 1e-6) {\n return this.getSubpathsAtLength(this, from);\n } else {\n const a = this.getSubpathsAtLength(this, to, 1);\n return from ? this.getSubpathsAtLength(a, from) : a;\n }\n }\n\n getSubpathsAtLength(path: PathD, length: number, onlystart?: number): PathD {\n const { startPathX, startPathY, normalizedLines } = path.updateTransform();\n /// 从 0 到 length 的部分\n let start: PathD | null = null;\n let len = 0;\n // const sp = new PathD({ x: path.x, y: path.y });\n const sp = new PathD();\n sp.prevPathX = sp.startPathX = startPathX;\n sp.prevPathY = sp.startPathY = startPathY;\n for (let i = 0, ii = normalizedLines.length; i < ii; i++) {\n const p = normalizedLines[i];\n const l = p.length();\n if (len + l > length) {\n if (!start) {\n const point = p.getPointAtSegmentLength(length - len);\n sp.appendLine(\n new CubicBezier({\n c1x: point.start.x,\n c1y: point.start.y,\n c2x: point.m.x,\n c2y: point.m.y,\n toX: point.x,\n toY: point.y\n })\n );\n if (onlystart) {\n return sp;\n }\n start = sp;\n /// 从 length 到 end 的部分\n // sp.prevPathX = point.x;\n // sp.prevPathY = point.y;\n sp.appendLine(\n new CubicBezier({\n c1x: point.n.x,\n c1y: point.n.y,\n c2x: point.end.x,\n c2y: point.end.y,\n toX: p.x,\n toY: p.y\n })\n );\n len += l;\n continue;\n }\n }\n len += l;\n sp.appendLine(p);\n }\n // sp.updateTransform();\n return sp;\n }\n\n /// drag along path\n closestPoint(\n pointX: number,\n pointY: number\n ): {\n point: {\n x: number;\n y: number;\n };\n rotation: number;\n distance: number;\n } {\n const pathLength = this.getTotalLength();\n let best = { x: pointX, y: pointY };\n let bestLength = 0;\n let bestDistance = Infinity;\n let precision = 8;\n\n // linear scan for coarse approximation\n for (\n let scanLength = 0;\n scanLength <= pathLength;\n scanLength += precision\n ) {\n const scan = this.getPointAtLength(scanLength);\n const scanDistance = distance2(scan.x, scan.y, pointX, pointY);\n if (scanDistance < bestDistance) {\n best = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n while (precision > 0.5) {\n const beforeLength = bestLength - precision;\n const before = this.getPointAtLength(beforeLength);\n const beforeDistance = distance2(before.x, before.y, pointX, pointY);\n const afterLength = bestLength + precision;\n const after = this.getPointAtLength(afterLength);\n const afterDistance = distance2(after.x, after.y, pointX, pointY);\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n best = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n best = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n }\n\n const p = this.getPointAtLength(\n bestLength + (bestLength === pathLength ? -0.1 : 0.1)\n );\n\n return {\n point: best,\n rotation:\n bestLength >= pathLength\n ? angle(p.x, p.y, best.x, best.y)\n : angle(best.x, best.y, p.x, p.y),\n distance: Math.sqrt(bestDistance)\n };\n }\n\n get polymorphPoints(): number[] {\n const { startPathX, startPathY, normalizedLines } = this.updateTransform();\n return [startPathX, startPathY].concat(\n normalizedLines.reduce(\n (acc, l) => acc.concat([l.c1x, l.c1y, l.c2x, l.c2y, l.toX, l.toY]),\n [] as number[]\n )\n );\n }\n\n perimeterPoints(): number {\n const pts = this.polymorphPoints;\n const n = pts.length;\n let x2 = pts[n - 2];\n let y2 = pts[n - 1];\n let p = 0;\n for (let i = 0; i < n; i += 6) {\n p += distance(pts[i], pts[i + 1], x2, y2);\n x2 = pts[i];\n y2 = pts[i + 1];\n }\n return Math.floor(p);\n }\n\n expendFill(totalLength: number): TSVGParsedPathData[] {\n const ns = this.polymorphPoints;\n const nsLength = ns.length;\n let needAdded = totalLength - nsLength;\n const ratio = Math.ceil(totalLength / nsLength);\n const points: TSVGParsedPathData[] = [];\n points.push([\"M\", ns[0], ns[1]]);\n let k = 2;\n while (k + 5 <= nsLength - 1) {\n const c1x = ns[k++];\n const c1y = ns[k++];\n const c2x = ns[k++];\n const c2y = ns[k++];\n const x = ns[k++];\n const y = ns[k++];\n points.push([\"C\", c1x, c1y, c2x, c2y, x, y]);\n let f = 0;\n while (f < ratio && needAdded > 0) {\n points.push([\"C\", x, y, x, y, x, y]);\n needAdded -= 6;\n f++;\n }\n }\n return points;\n }\n\n static mixPoints(a: number[], b: number[], o: number): number[] {\n const alen = a.length;\n const results = new Array(alen);\n for (let i = 0; i < alen; i++) {\n results[i] = maxDotNumber(a[i] + (b[i] - a[i]) * o, 6);\n }\n return results;\n }\n\n /// offset : 0 ~ 1\n static getPathInterpolator(\n left: TSVGParsedPathData[],\n right: TSVGParsedPathData[]\n ): (offset: number) => TSVGParsedPathData[] {\n return (offset: number) => {\n if (Math.abs(offset - 0) < Number.EPSILON) {\n // return DOMSVGUtil.SVGPathDataToD(left);\n return left;\n }\n if (Math.abs(offset - 1) < Number.EPSILON) {\n // return DOMSVGUtil.SVGPathDataToD(right);\n return right;\n }\n const path = PathD.fromPolymorphPoints(\n PathD.mixPoints(\n new PathD({ d: left }).polymorphPoints,\n new PathD({ d: right }).polymorphPoints,\n offset\n )\n );\n return path.toSVGPathData();\n };\n }\n}\n\nexport default PathD;\n","import {\n generateUUID,\n deepClone,\n toKebab,\n EventBus,\n EventBusListeners,\n extractAllNumbers,\n maxDotNumber,\n reactive,\n watchEffect,\n parseNumber,\n shallowClone,\n newConstructor\n // saveReactiveState,\n // restoreReactiveState,\n // getReactiveState\n} from \"@zyzgroup/core-common\";\nimport { distance, angle, polar, toDegree, toRadian } from \"./math\";\nimport { TSVGParsedPathData } from \"../svg/DOMSVGUtil\";\nimport { YZCanvasContext } from \"../canvas/YZCanvasContext\";\nimport { PathD } from \"./line/\";\nimport { Matrix } from \"./Matrix\";\nimport { Timeline, TweenRawOptions, TweenValue } from \"../animate\";\n\nexport type TShapeOptions = {\n d?: string | TSVGParsedPathData[] | PathD;\n originMatrix?: Matrix;\n\n independentTransformInGroup?: boolean;\n\n /// 坐标系原点\n /// options 中为相对于画布 (0,0) 点的绝对值\n /// this 中为相对于自身 (0,0) 点的相对值\n centerX?: number;\n centerY?: number;\n\n // translate\n x?: number;\n y?: number;\n\n // rotate\n degree?: number;\n\n // scale\n scalar?: number;\n scalarX?: number;\n scalarY?: number;\n\n diffXInGroup?: number;\n diffYInGroup?: number;\n diffDegreeInGroup?: number;\n diffScalarXInGroup?: number;\n diffScalarYInGroup?: number;\n\n // 速度\n vx?: number;\n vy?: number;\n\n // 加速度\n ax?: number;\n ay?: number;\n\n // 重量\n mass?: number;\n\n /// 样式属性\n attrs?: Record<string, string | CanvasGradient>;\n\n /// 是否绘制\n isShow?: boolean;\n\n /// 是否可拖拽\n enableDrag?: boolean;\n alongPath?: PathD;\n\n /// 是否鼠标放开后运动到target\n targetToAfterDragFree?: { targetX: number; targetY: number; easing?: number };\n\n /// 是否跟随mouse移动而移动\n followMouse?: boolean;\n\n /// 是否绘制行军蚁边框\n strokeArmyAnts?: boolean;\n};\n\nexport interface ShapeEventBusListeners extends EventBusListeners {\n draging(dx: number, dy: number, excludeShapeInGroup?: Shape): void;\n clicked(shape: Shape): void;\n}\n\nexport type TShapeRunOptions = {\n gravity?: number; // 重力常量,例如 0.1\n friction?: number; // 摩擦系数常量,例如 1\n};\nexport type TShapeRunEasingOptions = TShapeRunOptions & {\n easing?: number; // 例如 0.05\n};\nexport type TShapeRunSpringOptions = TShapeRunOptions & {\n spring?: number; // 例如 0.03\n};\n\nexport class Shape extends EventBus<ShapeEventBusListeners> {\n // [index: string | number | symbol]: any;\n\n public id: string;\n public originD?: string | TSVGParsedPathData[] | PathD;\n public originMatrix?: Matrix;\n\n public independentTransformInGroup: boolean;\n\n public forceCXY = false;\n\n /// 相对于自身 (0,0) 点的相对值\n public cX: number;\n public cY: number;\n\n public x: number;\n public y: number;\n\n public degree: number;\n\n public scalarX: number;\n public scalarY: number;\n\n public diffXInGroup: number;\n public diffYInGroup: number;\n public diffDegreeInGroup: number;\n public diffScalarXInGroup: number;\n public diffScalarYInGroup: number;\n\n public vx: number;\n public vy: number;\n public ax: number;\n public ay: number;\n public mass: number;\n\n private attrs: Record<string, string | CanvasGradient>;\n\n public enableDrag: boolean;\n public alongPath?: PathD;\n\n public isDragging = false;\n public isMouseIn = false;\n\n public targetToAfterDragFree?: {\n targetX: number;\n targetY: number;\n easing?: number;\n };\n\n public followMouse: boolean;\n\n public strokeArmyAnts: boolean;\n public strokeArmyAntsOffset = 0;\n public strokeDashTotalLength = 0;\n\n public isShow = true;\n public el?: HTMLElement | SVGElement;\n\n public pathd?: PathD;\n public usePathDtoCanvasContext = false;\n\n public parent?: Shape;\n public shapes: Shape[] = [];\n\n constructor(options?: TShapeOptions) {\n super();\n\n this.id = generateUUID();\n if (options?.d) {\n this.originD = options?.d;\n }\n if (options?.originMatrix) {\n this.originMatrix = options.originMatrix;\n }\n\n this.independentTransformInGroup =\n typeof options?.independentTransformInGroup == \"boolean\"\n ? options.independentTransformInGroup\n : false;\n\n this.x = options?.x || 0;\n this.y = options?.y || 0;\n\n this.cX = 0;\n this.cY = 0;\n if (\n typeof options?.centerX == \"number\" &&\n typeof options?.centerY == \"number\"\n ) {\n this.forceSetCXY(options.centerX - this.x, options.centerY - this.y);\n }\n\n this.degree = options?.degree || 0;\n\n this.scalarX = 1;\n this.scalarY = 1;\n if (options?.scalar !== void 0) {\n this.scalarX = options.scalar;\n this.scalarY = options.scalar;\n }\n if (options?.scalarX !== void 0) {\n this.scalarX = options.scalarX;\n }\n if (options?.scalarY !== void 0) {\n this.scalarY = options.scalarY;\n }\n\n this.diffXInGroup = options?.diffXInGroup || 0;\n this.diffYInGroup = options?.diffYInGroup || 0;\n this.diffDegreeInGroup = options?.diffDegreeInGroup || 0;\n this.diffScalarXInGroup = options?.diffScalarXInGroup || 1;\n this.diffScalarYInGroup = options?.diffScalarYInGroup || 1;\n\n this.vx = options?.vx || 0;\n this.vy = options?.vy || 0;\n this.ax = options?.ax || 0;\n this.ay = options?.ay || 0;\n this.mass = options?.mass || 1;\n this.attrs = {\n // \"paint-order\": \"markers stroke fill\", // 先 stroke 再 fill\n // \"paint-order\": \"fill stroke markers\", // default\n stroke: \"none\",\n fill: \"none\"\n // \"pointerEvents\": \"none\",\n };\n if (options?.attrs) {\n this.setAttr(options?.attrs);\n }\n this.enableDrag = options?.enableDrag || false;\n this.alongPath = options?.alongPath;\n this.targetToAfterDragFree = options?.targetToAfterDragFree;\n this.followMouse = options?.followMouse || false;\n this.isShow = typeof options?.isShow == \"boolean\" ? options?.isShow : true;\n this.strokeArmyAnts = options?.strokeArmyAnts || false;\n\n if (this.strokeArmyAnts) {\n const sourceDashArray = this.getAttr(\"stroke-dasharray\", \"4 4\");\n this.setAttr(\"stroke-dasharray\", sourceDashArray);\n this.strokeDashTotalLength = extractAllNumbers(\n sourceDashArray as string\n ).reduce((acc, d) => acc + d, 0);\n }\n\n /// 父类调用时,子类 this.toSVGPathData() 有些值可能还未初始化\n /// clone() 对象暂时无法执行下面方法!\n // nextTick(() => {\n // this.pathd = this.initPathD();\n // });\n\n const proxy = reactive(this);\n return proxy;\n }\n\n /// 强制设置 坐标系原点\n public forceSetCXY(cX: number, cY: number) {\n this.cX = cX;\n this.cY = cY;\n this.forceCXY = true;\n }\n\n /// 子类可覆盖\n public shapeInit() {\n // watchEffect(() => {});\n }\n\n /// 统一初始化 pathd\n public initPathD(): PathD {\n if (!this.pathd) {\n /// 初始化\n this.pathd = new PathD();\n /// Shape其他属性改变,涉及到 pathd.normalizedLines 时,自动更新\n watchEffect(() => {\n this.pathd?.reset(\n this.originD || this.toSVGPathData(),\n this.originMatrix\n );\n });\n if (this.pathd && !this.forceCXY) {\n /// 改变 默认坐标系原点 为自身中心点\n const rect =\n this.shapes.length == 0\n ? this.pathd.getBoundingClientRect()\n : this.getBoundingClientRect();\n // const rect = this.getBoundingClientRect();\n if (rect) {\n this.pathd.cX = this.cX = rect.x + rect.width / 2 - this.pathd.x;\n this.pathd.cY = this.cY = rect.y + rect.height / 2 - this.pathd.y;\n // console.log(\"shape\", rect, this.cX, this.cY);\n }\n }\n this.shapeInit();\n }\n return this.pathd;\n }\n\n public frameStart(mouse?: { x: number; y: number }): void {\n // this.pathd = this.initPathD();\n }\n\n public frameUpdate(\n mouse?: { x: number; y: number },\n ctx?: YZCanvasContext\n ): void {\n /// 同步 this.pathd 属性\n this.pathd = this.initPathD();\n this.pathd.update(this);\n /// 绘制行军蚁边框\n if (this.strokeArmyAnts) {\n if (!this.isMouseIn) {\n this.setAttr(\"stroke-dashoffset\", String(this.strokeArmyAntsOffset++));\n if (this.strokeArmyAntsOffset > this.strokeDashTotalLength) {\n this.strokeArmyAntsOffset = 0;\n }\n }\n }\n }\n\n public frameEnd(mouse?: { x: number; y: number }): void {\n ///\n }\n\n /// Shape SVG 使用 PathD transform 系统,使用相对值\n /// 子类一定要覆盖 toSVGPathData !\n /// 唯一例外是 group ,可以不覆盖!\n /// translate() rotate() scale() 等 transfrom 交给 PathD 处理, YZSVG 不处理\n /// 属性值自己保存\n public toSVGPathData(): TSVGParsedPathData[] {\n // return [[\"m\", 0, 0]];\n return [];\n }\n\n /// 子类不要覆盖 toSVGPathD !\n /// 供 YZSVG 调用\n public toSVGPathD(): string {\n return this.pathd?.toSVGPathD() || \"\";\n }\n\n /// Shape Canvas 使用 PathD transform 系统 或 原生canvas系统\n /// 如果子类没有覆盖 toCanvasContext , 则默认使用 PathD 的 toCanvasContext\n /// - translate() rotate() scale() 等 transfrom 交给 PathD 处理,YZCanvas 不处理\n /// - canvas.ctx.createLinearGradient 使用绝对值\n /// 如果子类覆盖 toCanvasContext , 则使用 原生canvas系统\n /// - translate() rotate() scale() 等 transfrom 交给 YZCanvas 处理\n /// - canvas.ctx.createLinearGradient 使用相对值\n /// 不包含 fill() 及 stroke()\n /// 属性值自己保存\n public toCanvasContext(\n ctx: YZCanvasContext\n // ctx: CanvasRenderingContext2D\n // | WebGLRenderingContext\n // | WebGL2RenderingContext\n // | GPUCanvasContext\n // | ImageBitmapRenderingContext\n ): void {\n this.usePathDtoCanvasContext = true;\n this.pathd?.toCanvasContext(ctx);\n }\n\n /// 目前 仅 Text 无法转换为 PathD, 也就无 getBoundingClientRect\n /// 子类可覆盖\n /// 绝对值\n public getBoundingClientRect(): {\n x: number;\n y: number;\n width: number;\n height: number;\n } | null {\n return this.pathd?.getBoundingClientRect() || null;\n }\n\n /// 绝对值\n public get center(): { x: number; y: number } {\n const rect = this.getBoundingClientRect();\n const c = { x: this.x, y: this.y };\n if (rect) {\n c.x = rect.x + rect.width / 2;\n c.y = rect.y + rect.height / 2;\n }\n return c;\n }\n\n public trim() {\n if (this.parent) {\n return;\n }\n const rect = this.getBoundingClientRect();\n if (!rect) {\n return;\n }\n this.shapes.forEach((s) => {\n const originMatrix = s.originMatrix\n ? s.originMatrix.clone()\n : new Matrix();\n originMatrix.translate(-rect.x + s.x, -rect.y + s.y);\n s.originMatrix = originMatrix; /// set 引发 自动 watchEffect\n });\n const originMatrix = this.originMatrix\n ? this.originMatrix.clone()\n : new Matrix();\n originMatrix.translate(-rect.x + this.x, -rect.y + this.y);\n this.originMatrix = originMatrix; /// set 引发 自动 watchEffect\n }\n\n public isPointInPath(\n x: number,\n y: number,\n ctx: YZCanvasContext | SVGSVGElement\n ): boolean {\n if (ctx instanceof YZCanvasContext) {\n return ctx.isPointInPath(new Path2D(this.toSVGPathD()), x, y);\n }\n /// 性能差\n let point;\n try {\n point = new SVGPoint(x, y);\n } catch (e) {\n // fallback for browsers that don't support SVGPoint as an argument\n point = ctx.createSVGPoint();\n point.x = x;\n point.y = y;\n }\n if (this.el instanceof SVGGeometryElement) {\n return this.el.isPointInFill(point);\n } else {\n const rect = this.getBoundingClientRect();\n if (rect) {\n return (\n x >= rect.x &&\n x <= rect.x + rect.width &&\n y >= rect.y &&\n y <= rect.y + rect.height\n /// UNSUCCESS\n // && PathD.interPathHelper(\n // this.toSVGPathData(),\n // DOMSVGUtil.normalizeSVGPath([\n // [\"M\", x, y],\n // [\"H\", rect.x + rect.width + 10]\n // // [\"l\", rect.width + 10, Math.random()]\n // ])\n // ).length %\n // 2 ==\n // 1\n );\n }\n }\n return false;\n }\n\n public isPointInStroke(\n x: number,\n y: number,\n ctx: YZCanvasContext | SVGSVGElement\n ): boolean {\n if (ctx instanceof YZCanvasContext) {\n return ctx.isPointInStroke(new Path2D(this.toSVGPathD()), x, y);\n }\n /// 性能差\n let point;\n try {\n point = new SVGPoint(x, y);\n } catch (e) {\n // fallback for browsers that don't support SVGPoint as an argument\n point = ctx.createSVGPoint();\n point.x = x;\n point.y = y;\n }\n if (this.el instanceof SVGGeometryElement) {\n return this.el.isPointInStroke(point);\n }\n return false;\n /// UNDO: node-canvas return undefined\n }\n\n public clone() {\n // return deepClone(this);\n return newConstructor(this).copy(this);\n // return shallowClone(this).copy(this);\n }\n\n public copy(shape: Shape) {\n this.id = shape.id;\n this.originD = shape.originD;\n this.originMatrix = shape.originMatrix;\n this.independentTransformInGroup = shape.independentTransformInGroup;\n this.x = shape.x;\n this.y = shape.y;\n this.cX = shape.cX;\n this.cY = shape.cY;\n this.degree = shape.degree;\n this.scalarX = shape.scalarX;\n this.scalarY = shape.scalarY;\n this.diffXInGroup = shape.diffXInGroup;\n this.diffYInGroup = shape.diffYInGroup;\n this.diffDegreeInGroup = shape.diffDegreeInGroup;\n this.diffScalarXInGroup = shape.diffScalarXInGroup;\n this.diffScalarYInGroup = shape.diffScalarYInGroup;\n this.vx = shape.vx;\n this.vy = shape.vy;\n this.ax = shape.ax;\n this.ay = shape.ay;\n this.mass = shape.mass;\n this.attrs = {\n ...shape.attrs\n };\n this.enableDrag = shape.enableDrag;\n this.alongPath = shape.alongPath;\n this.targetToAfterDragFree = shape.targetToAfterDragFree;\n this.followMouse = shape.followMouse;\n this.isShow = shape.isShow;\n this.strokeArmyAnts = shape.strokeArmyAnts;\n this.strokeDashTotalLength = shape.strokeDashTotalLength;\n return this;\n }\n\n public save() {\n /// toRaw Proxy\n // saveReactiveState(this.raw);\n // console.log(\"save\", this.raw, getReactiveState(this.raw));\n }\n\n public restore() {\n /// toRaw Proxy\n // restoreReactiveState(this.raw);\n // console.log(\"restore\", this.raw, getReactiveState(this.raw));\n }\n\n public setAttr(obj: Record<string, string | CanvasGradient>): void;\n public setAttr(name: string, value: string | CanvasGradient): void;\n public setAttr(\n nameOrObj: string | Record<string, string | CanvasGradient>,\n value?: string | CanvasGradient\n ): void {\n if (typeof nameOrObj !== \"string\") {\n Object.assign(\n this.attrs,\n Object.fromEntries(\n Object.entries(nameOrObj).map(([k, v]) => {\n return [toKebab(k), v];\n })\n )\n );\n } else {\n if (value) {\n this.attrs[toKebab(nameOrObj)] = value;\n }\n }\n }\n\n public getAttr(\n name: string,\n defaultValue: string | CanvasGradient\n ): string | CanvasGradient;\n public getAttr(name: string): string | CanvasGradient | undefined;\n public getAttr(\n name: string,\n defaultValue?: string | CanvasGradient\n ): string | CanvasGradient | undefined {\n return this.attrs[name] || this.attrs[toKebab(name)] || defaultValue;\n }\n\n public getAttrs(): Record<string, string | CanvasGradient> {\n return this.attrs;\n }\n\n public hasAttr(name: string): boolean {\n return !!this.attrs[name] || !!this.attrs[toKebab(name)];\n }\n\n public distance(target: { x: number; y: number }): number {\n return distance(this.x, this.y, target.x, target.y);\n }\n\n public rotateTo(target: { x: number; y: number }) {\n this.degree = toDegree(angle(this.x, this.y, target.x, target.y));\n }\n\n public followTo(target: { x: number; y: number }, length = 3) {\n this.rotateTo(target);\n const { dx: vx, dy: vy } = polar(toRadian(this.degree), length);\n this.vx = vx;\n this.vy = vy;\n this.run();\n }\n\n public followAccelerationTo(target: { x: number; y: number }, length = 0.05) {\n this.rotateTo(target);\n const { dx: ax, dy: ay } = polar(toRadian(this.degree), length);\n this.ax = ax;\n this.ay = ay;\n this.run();\n }\n\n /// 碰撞检测\n public checkCollision(target: Shape) {\n /// UNDO\n }\n\n /// 回弹\n public checkWall(options: {\n wall: { x: number; y: number; width: number; height: number };\n bounce?: number;\n }) {\n /// UNDO\n }\n\n /// 物体之间引力\n public gravitateTo(target: Shape) {\n const dx = target.x - this.x;\n const dy = target.y - this.y;\n const distSQ = dx * dx + dy * dy;\n const dist = Math.sqrt(distSQ);\n const force = (this.mass * target.mass) / distSQ;\n const ax = (force * dx) / dist;\n const ay = (force * dy) / dist;\n this.vx += ax / this.mass;\n this.vy += ay / this.mass;\n target.vx -= ax / target.mass;\n target.vy -= ay / target.mass;\n }\n\n public run(options?: TShapeRunOptions) {\n // 加速度\n this.vx += this.ax;\n this.vy += this.ay;\n\n // 重力\n const gravity = parseNumber(options?.gravity, 0);\n this.vy += gravity;\n\n // 摩擦力方式一\n // const friction = parseNumber(options?.friction, 0);\n // if (friction > 0) {\n // const radian = Math.atan2(this.vy, this.vx);\n // let speed = Math.sqrt(this.vx * this.vx + this.vy * this.vy);\n // if (speed > friction) {\n // speed -= friction;\n // } else {\n // speed = 0;\n // }\n // this.vx = Math.cos(radian) * speed;\n // this.vy = Math.sin(radian) * speed;\n // }\n\n // 摩擦力方式二\n const friction = parseNumber(options?.friction, 1);\n this.vx *= friction;\n this.vy *= friction;\n\n this.x += this.vx;\n this.y += this.vy;\n }\n\n public runEaseTo(\n target: { x: number; y: number },\n options?: TShapeRunEasingOptions\n ) {\n const easing = parseNumber(options?.easing, 0.05);\n const dx = target.x - this.cX - this.x;\n const dy = target.y - this.cY - this.y;\n this.vx = dx * easing;\n this.vy = dy * easing;\n this.run(options);\n }\n\n public runSpringTo(\n target: { x: number; y: number } | { x: number; y: number }[],\n options?: TShapeRunSpringOptions\n ) {\n const spring = parseNumber(options?.spring, 0.03);\n (Array.isArray(target) ? target : [target]).forEach((t) => {\n const dx = t.x - this.cX - this.x;\n const dy = t.y - this.cY - this.y;\n const ax = dx * spring;\n const ay = dy * spring;\n this.vx += ax;\n this.vy += ay;\n });\n this.run({ friction: 0.9, ...options });\n }\n\n public springMassTo(\n target: Shape,\n options?: {\n springLength?: number;\n spring?: number;\n }\n ): number {\n const springLength = parseNumber(options?.springLength, 100);\n const spring = parseNumber(options?.spring, 0.0001);\n const dx = target.x - this.x;\n const dy = target.y - this.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist < springLength) {\n const ax = dx * spring;\n const ay = dy * spring;\n this.vx += ax / this.mass;\n this.vy += ay / this.mass;\n target.vx -= ax / target.mass;\n target.vy -= ay / target.mass;\n return 1 - dist / springLength; /// alpha: 0 ~ 1\n }\n return 0;\n }\n\n getTotalLength(): number {\n return this.initPathD().getTotalLength();\n }\n\n interpolate(t: number): { x: number; y: number } {\n return this.initPathD().interpolate(t);\n }\n\n getPointAtLength(length: number): {\n x: number;\n y: number;\n alpha: number;\n } {\n return this.initPathD().getPointAtLength(length);\n }\n\n public trailPath(\n trail: Shape,\n progress = 0 // 0 ~ 1\n ): {\n x: number;\n y: number;\n alpha: number;\n } {\n const totalLength = this.getTotalLength();\n trail.originD = this.initPathD().getSubpath(0, progress * totalLength);\n return this.getPointAtLength(progress * totalLength);\n }\n\n public strokeDashTween(frameDuration = 1000, options?: TweenRawOptions) {\n const pathd = this.initPathD();\n const totalLength = maxDotNumber(pathd.getTotalLength(), 0);\n this.setAttr({\n strokeDasharray: `${totalLength} ${totalLength}`,\n strokeDashoffset: `${totalLength}`\n });\n const prevOnUpdate = options?.onUpdate;\n const tl = new Timeline({ frameDuration });\n tl.addTween(\n { offset: totalLength },\n { offset: 0 },\n Object.assign(options || {}, {\n onUpdate: (coords: TweenValue, elapsed: number) => {\n this.setAttr(\"strokeDashoffset\", \"\" + maxDotNumber(coords.offset, 2));\n prevOnUpdate?.(coords, elapsed);\n }\n })\n );\n tl.play();\n }\n}\n\nexport default Shape;\n","import { Shape, TShapeOptions } from \"../Shape\";\nimport { TSVGParsedPathData } from \"../../svg/DOMSVGUtil\";\nimport { YZCanvasContext } from \"../../canvas\";\nimport { rotatePoint } from \"../Matrix\";\nimport { length, toRadian } from \"../math\";\n\nexport type TPoint3DOptions = {\n x?: number;\n y?: number;\n z?: number;\n fl?: number;\n vpX?: number;\n vpY?: number;\n cX?: number;\n cY?: number;\n cZ?: number;\n radius?: number;\n} & TShapeOptions;\n\nexport class Point3D extends Shape {\n public x: number;\n public y: number;\n public z: number;\n // public w: number; // perspective\n public fl: number;\n public vpX: number;\n public vpY: number;\n public cX: number;\n public cY: number;\n public cZ: number;\n public radius: number;\n\n constructor(options?: TPoint3DOptions) {\n super(options);\n this.x = options?.x || 0;\n this.y = options?.y || 0;\n this.z = options?.z || 0;\n this.fl = options?.fl || 250;\n this.vpX = options?.vpX || 0;\n this.vpY = options?.vpY || 0;\n this.cX = options?.cX || 0;\n this.cY = options?.cY || 0;\n this.cZ = options?.cZ || 0;\n this.radius = options?.radius || 0;\n }\n\n toSVGPathData(): TSVGParsedPathData[] {\n if (this.radius) {\n return [\n [\"M\", this.getScreenX(), this.getScreenY() - this.radius],\n [\"a\", this.radius, this.radius, 0, 1, 1, 0, 2 * this.radius],\n [\"a\", this.radius, this.radius, 0, 1, 1, 0, -2 * this.radius],\n [\"z\"]\n ];\n } else {\n return [[\"M\", this.getScreenX(), this.getScreenY()]];\n }\n }\n\n toCanvasContext(ctx: YZCanvasContext) {\n ctx.beginPath();\n ctx.arc(0, 0, this.radius, 0, Math.PI * 2, true);\n ctx.closePath();\n }\n\n setVanishingPoint(vpX: number, vpY: number) {\n this.vpX = vpX;\n this.vpY = vpY;\n }\n\n setCenter(cX: number, cY: number, cZ: number) {\n this.cX = cX;\n this.cY = cY;\n this.cZ = cZ;\n }\n\n rotateX(degX: number) {\n ({ x: this.y, y: this.z } = rotatePoint(toRadian(degX), this.y, this.z));\n }\n\n rotateY(degY: number) {\n ({ x: this.x, y: this.z } = rotatePoint(toRadian(degY), this.x, this.z));\n }\n\n rotateZ(degZ: number) {\n ({ x: this.x, y: this.y } = rotatePoint(toRadian(degZ), this.x, this.y));\n }\n\n getScreenX() {\n const scale = this.fl / (this.fl + this.z + this.cZ);\n return this.vpX + (this.cX + this.x) * scale;\n }\n\n getScreenY() {\n const scale = this.fl / (this.fl + this.z + this.cZ);\n return this.vpY + (this.cY + this.y) * scale;\n }\n\n eq(point: Point3D): boolean {\n return (\n this.x === point.x &&\n this.y === point.y &&\n this.z === point.z &&\n this.radius === point.radius &&\n this.mass === point.mass\n );\n }\n\n length() {\n return length(this.x, this.y, this.z);\n }\n\n distance(pt: Point3D): number {\n const dx = pt.x - this.x;\n const dy = pt.y - this.y;\n const dz = pt.z - this.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n\n scalar(scale: number) {\n this.x *= scale;\n this.y *= scale;\n this.z *= scale;\n return this;\n }\n\n normalize(len = 1): Point3D {\n const totalLength = this.length();\n if (totalLength) {\n const scale = len / totalLength;\n this.scalar(scale);\n }\n return this;\n }\n\n clamp(len: number) {\n const totalLength = this.length();\n if (totalLength && totalLength > len) {\n this.scalar(len / totalLength);\n }\n return this;\n }\n\n cross(pt: Point3D) {\n const x = this.x;\n const y = this.y;\n const z = this.z;\n return {\n x: y * pt.z - z * pt.y,\n y: z * pt.x - x * pt.z,\n z: x * pt.y - y * pt.x\n };\n }\n\n multiply(pt: Point3D) {\n return {\n x: this.x * pt.x,\n y: this.y * pt.y,\n z: this.z * pt.z\n };\n }\n\n div(pt: Point3D) {\n return {\n x: this.x / pt.x,\n y: this.y / pt.y,\n z: this.z / pt.z\n };\n }\n\n add(pt: Point3D) {\n return {\n x: this.x + pt.x,\n y: this.y + pt.y,\n z: this.z + pt.z\n };\n }\n\n sub(pt: Point3D) {\n return {\n x: this.x - pt.x,\n y: this.y - pt.y,\n z: this.z - pt.z\n };\n }\n\n dot(pt: Point3D): number {\n return this.x * pt.x + this.y * pt.y + this.z * pt.z;\n }\n\n reflect(pt: Point3D) {\n const dp = this.dot(pt);\n return {\n x: this.x - 2 * dp * pt.x,\n y: this.y - 2 * dp * pt.y,\n z: this.z - 2 * dp * pt.z\n };\n }\n}\n\nexport default Point3D;\n","import { clamp } from \"@zyzgroup/core-common\";\nimport { Euler } from \"./Euler\";\nimport { Matrix4 } from \"./Matrix\";\nimport { Vector3 } from \"./Vector\";\nimport { BufferAttribute } from \"./BufferAttribute\";\n\n/// 四元数 Quaternion\n/// 四元数是一个四维复数 q = w + x * i + y * j + z * k 写成 q=(x,y,z,w) 当 q=1 时表示一个旋转\n\n/// 没有万向锁问题\n/// 适合平滑插值\n\nexport class Quaternion {\n // x, y, z 表示旋转轴的方向\n private _x: number;\n private _y: number;\n private _z: number;\n // w 表示旋转角度的余弦值(实际上是 cos(θ/2))\n private _w: number;\n\n constructor(x = 0, y = 0, z = 0, w = 1) {\n this._x = x;\n this._y = y;\n this._z = z;\n this._w = w;\n }\n\n static slerpFlat(\n dst: number[],\n dstOffset: number,\n src0: number[],\n srcOffset0: number,\n src1: number[],\n srcOffset1: number,\n t: number\n ) {\n // fuzz-free, array-based Quaternion SLERP operation\n\n let x0 = src0[srcOffset0 + 0];\n let y0 = src0[srcOffset0 + 1];\n let z0 = src0[srcOffset0 + 2];\n let w0 = src0[srcOffset0 + 3];\n\n const x1 = src1[srcOffset1 + 0];\n const y1 = src1[srcOffset1 + 1];\n const z1 = src1[srcOffset1 + 2];\n const w1 = src1[srcOffset1 + 3];\n\n if (t === 0) {\n dst[dstOffset + 0] = x0;\n dst[dstOffset + 1] = y0;\n dst[dstOffset + 2] = z0;\n dst[dstOffset + 3] = w0;\n return;\n }\n\n if (t === 1) {\n dst[dstOffset + 0] = x1;\n dst[dstOffset + 1] = y1;\n dst[dstOffset + 2] = z1;\n dst[dstOffset + 3] = w1;\n return;\n }\n\n if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) {\n let s = 1 - t;\n const cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n const dir = cos >= 0 ? 1 : -1;\n const sqrSin = 1 - cos * cos;\n\n // Skip the Slerp for tiny steps to avoid numeric problems:\n if (sqrSin > Number.EPSILON) {\n const sin = Math.sqrt(sqrSin);\n const len = Math.atan2(sin, cos * dir);\n\n s = Math.sin(s * len) / sin;\n t = Math.sin(t * len) / sin;\n }\n\n const tDir = t * dir;\n\n x0 = x0 * s + x1 * tDir;\n y0 = y0 * s + y1 * tDir;\n z0 = z0 * s + z1 * tDir;\n w0 = w0 * s + w1 * tDir;\n\n // Normalize in case we just did a lerp:\n if (s === 1 - t) {\n const f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0);\n\n x0 *= f;\n y0 *= f;\n z0 *= f;\n w0 *= f;\n }\n }\n\n dst[dstOffset] = x0;\n dst[dstOffset + 1] = y0;\n dst[dstOffset + 2] = z0;\n dst[dstOffset + 3] = w0;\n }\n\n static multiplyQuaternionsFlat(\n dst: number[],\n dstOffset: number,\n src0: number[],\n srcOffset0: number,\n src1: number[],\n srcOffset1: number\n ) {\n const x0 = src0[srcOffset0];\n const y0 = src0[srcOffset0 + 1];\n const z0 = src0[srcOffset0 + 2];\n const w0 = src0[srcOffset0 + 3];\n\n const x1 = src1[srcOffset1];\n const y1 = src1[srcOffset1 + 1];\n const z1 = src1[srcOffset1 + 2];\n const w1 = src1[srcOffset1 + 3];\n\n dst[dstOffset] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n dst[dstOffset + 1] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n dst[dstOffset + 2] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n dst[dstOffset + 3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n return dst;\n }\n\n get x() {\n return this._x;\n }\n\n set x(value: number) {\n this._x = value;\n this._onChangeCallback();\n }\n\n get y() {\n return this._y;\n }\n\n set y(value: number) {\n this._y = value;\n this._onChangeCallback();\n }\n\n get z() {\n return this._z;\n }\n\n set z(value: number) {\n this._z = value;\n this._onChangeCallback();\n }\n\n get w() {\n return this._w;\n }\n\n set w(value: number) {\n this._w = value;\n this._onChangeCallback();\n }\n\n set(x = this._x, y = this._y, z = this._z, w = this._w) {\n this._x = x;\n this._y = y;\n this._z = z;\n this._w = w;\n this._onChangeCallback();\n return this;\n }\n\n clone() {\n return new Quaternion(this._x, this._y, this._z, this._w);\n }\n\n copy(quaternion: Quaternion) {\n this._x = quaternion.x;\n this._y = quaternion.y;\n this._z = quaternion.z;\n this._w = quaternion.w;\n this._onChangeCallback();\n return this;\n }\n\n setFromEuler(euler: Euler, update = true) {\n const x = euler.x;\n const y = euler.y;\n const z = euler.z;\n const order = euler.order;\n\n // http://www.mathworks.com/matlabcentral/fileexchange/\n // \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n //\tcontent/SpinCalc.m\n\n const cos = Math.cos;\n const sin = Math.sin;\n\n const c1 = cos(x / 2);\n const c2 = cos(y / 2);\n const c3 = cos(z / 2);\n\n const s1 = sin(x / 2);\n const s2 = sin(y / 2);\n const s3 = sin(z / 2);\n\n switch (order) {\n case \"XYZ\":\n this._x = s1 * c2 * c3 + c1 * s2 * s3;\n this._y = c1 * s2 * c3 - s1 * c2 * s3;\n this._z = c1 * c2 * s3 + s1 * s2 * c3;\n this._w = c1 * c2 * c3 - s1 * s2 * s3;\n break;\n\n case \"YXZ\":\n this._x = s1 * c2 * c3 + c1 * s2 * s3;\n this._y = c1 * s2 * c3 - s1 * c2 * s3;\n this._z = c1 * c2 * s3 - s1 * s2 * c3;\n this._w = c1 * c2 * c3 + s1 * s2 * s3;\n break;\n\n case \"ZXY\":\n this._x = s1 * c2 * c3 - c1 * s2 * s3;\n this._y = c1 * s2 * c3 + s1 * c2 * s3;\n this._z = c1 * c2 * s3 + s1 * s2 * c3;\n this._w = c1 * c2 * c3 - s1 * s2 * s3;\n break;\n\n case \"ZYX\":\n this._x = s1 * c2 * c3 - c1 * s2 * s3;\n this._y = c1 * s2 * c3 + s1 * c2 * s3;\n this._z = c1 * c2 * s3 - s1 * s2 * c3;\n this._w = c1 * c2 * c3 + s1 * s2 * s3;\n break;\n\n case \"YZX\":\n this._x = s1 * c2 * c3 + c1 * s2 * s3;\n this._y = c1 * s2 * c3 + s1 * c2 * s3;\n this._z = c1 * c2 * s3 - s1 * s2 * c3;\n this._w = c1 * c2 * c3 - s1 * s2 * s3;\n break;\n\n case \"XZY\":\n this._x = s1 * c2 * c3 - c1 * s2 * s3;\n this._y = c1 * s2 * c3 - s1 * c2 * s3;\n this._z = c1 * c2 * s3 + s1 * s2 * c3;\n this._w = c1 * c2 * c3 + s1 * s2 * s3;\n break;\n\n default:\n console.warn(\n \"Quaternion: .setFromEuler() encountered an unknown order: \" + order\n );\n }\n\n if (update === true) this._onChangeCallback();\n return this;\n }\n\n setFromAxisAngle(axis: Vector3, angle: number) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n const halfAngle = angle / 2;\n const s = Math.sin(halfAngle);\n this._x = axis.x * s;\n this._y = axis.y * s;\n this._z = axis.z * s;\n this._w = Math.cos(halfAngle);\n this._onChangeCallback();\n return this;\n }\n\n setFromRotationMatrix4(m: Matrix4) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n const te = m.value;\n const m11 = te[0];\n const m12 = te[4];\n const m13 = te[8];\n const m21 = te[1];\n const m22 = te[5];\n const m23 = te[9];\n const m31 = te[2];\n const m32 = te[6];\n const m33 = te[10];\n const trace = m11 + m22 + m33;\n\n if (trace > 0) {\n const s = 0.5 / Math.sqrt(trace + 1.0);\n\n this._w = 0.25 / s;\n this._x = (m32 - m23) * s;\n this._y = (m13 - m31) * s;\n this._z = (m21 - m12) * s;\n } else if (m11 > m22 && m11 > m33) {\n const s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\n\n this._w = (m32 - m23) / s;\n this._x = 0.25 * s;\n this._y = (m12 + m21) / s;\n this._z = (m13 + m31) / s;\n } else if (m22 > m33) {\n const s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\n\n this._w = (m13 - m31) / s;\n this._x = (m12 + m21) / s;\n this._y = 0.25 * s;\n this._z = (m23 + m32) / s;\n } else {\n const s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\n\n this._w = (m21 - m12) / s;\n this._x = (m13 + m31) / s;\n this._y = (m23 + m32) / s;\n this._z = 0.25 * s;\n }\n\n this._onChangeCallback();\n return this;\n }\n\n setFromUnitVectors(vFrom: Vector3, vTo: Vector3) {\n // assumes direction vectors vFrom and vTo are normalized\n\n let r = vFrom.dot(vTo) + 1;\n\n if (r < Number.EPSILON) {\n // vFrom and vTo point in opposite directions\n\n r = 0;\n\n if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {\n this._x = -vFrom.y;\n this._y = vFrom.x;\n this._z = 0;\n this._w = r;\n } else {\n this._x = 0;\n this._y = -vFrom.z;\n this._z = vFrom.y;\n this._w = r;\n }\n } else {\n // crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n this._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n this._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n this._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n this._w = r;\n }\n\n return this.normalize();\n }\n\n angleTo(q: Quaternion) {\n return 2 * Math.acos(Math.abs(clamp(this.dot(q), -1, 1)));\n }\n\n rotateTowards(q: Quaternion, step: number) {\n const angle = this.angleTo(q);\n if (angle === 0) return this;\n const t = Math.min(1, step / angle);\n this.slerp(q, t);\n return this;\n }\n\n identity() {\n return this.set(0, 0, 0, 1);\n }\n\n invert() {\n // quaternion is assumed to have unit length\n return this.conjugate();\n }\n\n conjugate() {\n this._x *= -1;\n this._y *= -1;\n this._z *= -1;\n this._onChangeCallback();\n return this;\n }\n\n dot(v: Quaternion) {\n return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n }\n\n lengthSq() {\n return (\n this._x * this._x +\n this._y * this._y +\n this._z * this._z +\n this._w * this._w\n );\n }\n\n length() {\n return Math.sqrt(\n this._x * this._x +\n this._y * this._y +\n this._z * this._z +\n this._w * this._w\n );\n }\n\n normalize() {\n let l = this.length();\n if (l === 0) {\n this._x = 0;\n this._y = 0;\n this._z = 0;\n this._w = 1;\n } else {\n l = 1 / l;\n this._x = this._x * l;\n this._y = this._y * l;\n this._z = this._z * l;\n this._w = this._w * l;\n }\n this._onChangeCallback();\n return this;\n }\n\n multiply(q: Quaternion) {\n return this.multiplyQuaternions(this, q);\n }\n\n premultiply(q: Quaternion) {\n return this.multiplyQuaternions(q, this);\n }\n\n multiplyQuaternions(a: Quaternion, b: Quaternion) {\n // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n const qax = a._x;\n const qay = a._y;\n const qaz = a._z;\n const qaw = a._w;\n const qbx = b._x;\n const qby = b._y;\n const qbz = b._z;\n const qbw = b._w;\n\n this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n this._onChangeCallback();\n\n return this;\n }\n\n // 插值 t: 0 ~ 1\n slerp(qb: Quaternion, t: number) {\n if (t === 0) return this;\n if (t === 1) return this.copy(qb);\n\n const x = this._x;\n const y = this._y;\n const z = this._z;\n const w = this._w;\n\n // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n let cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n if (cosHalfTheta < 0) {\n this._w = -qb._w;\n this._x = -qb._x;\n this._y = -qb._y;\n this._z = -qb._z;\n\n cosHalfTheta = -cosHalfTheta;\n } else {\n this.copy(qb);\n }\n\n if (cosHalfTheta >= 1.0) {\n this._w = w;\n this._x = x;\n this._y = y;\n this._z = z;\n\n return this;\n }\n\n const sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n if (sqrSinHalfTheta <= Number.EPSILON) {\n const s = 1 - t;\n this._w = s * w + t * this._w;\n this._x = s * x + t * this._x;\n this._y = s * y + t * this._y;\n this._z = s * z + t * this._z;\n\n this.normalize(); // normalize calls _onChangeCallback()\n\n return this;\n }\n\n const sinHalfTheta = Math.sqrt(sqrSinHalfTheta);\n const halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta);\n const ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta;\n const ratioB = Math.sin(t * halfTheta) / sinHalfTheta;\n\n this._w = w * ratioA + this._w * ratioB;\n this._x = x * ratioA + this._x * ratioB;\n this._y = y * ratioA + this._y * ratioB;\n this._z = z * ratioA + this._z * ratioB;\n\n this._onChangeCallback();\n\n return this;\n }\n\n slerpQuaternions(qa: Quaternion, qb: Quaternion, t: number) {\n return this.copy(qa).slerp(qb, t);\n }\n\n random() {\n // sets this quaternion to a uniform random unit quaternnion\n\n // Ken Shoemake\n // Uniform random rotations\n // D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n\n const theta1 = 2 * Math.PI * Math.random();\n const theta2 = 2 * Math.PI * Math.random();\n\n const x0 = Math.random();\n const r1 = Math.sqrt(1 - x0);\n const r2 = Math.sqrt(x0);\n\n return this.set(\n r1 * Math.sin(theta1),\n r1 * Math.cos(theta1),\n r2 * Math.sin(theta2),\n r2 * Math.cos(theta2)\n );\n }\n\n equals(quaternion: Quaternion) {\n return (\n quaternion._x === this._x &&\n quaternion._y === this._y &&\n quaternion._z === this._z &&\n quaternion._w === this._w\n );\n }\n\n fromArray(array: number[], offset = 0) {\n this._x = array[offset];\n this._y = array[offset + 1];\n this._z = array[offset + 2];\n this._w = array[offset + 3];\n this._onChangeCallback();\n return this;\n }\n\n toArray(array: number[] = [], offset = 0) {\n array[offset] = this._x;\n array[offset + 1] = this._y;\n array[offset + 2] = this._z;\n array[offset + 3] = this._w;\n return array;\n }\n\n fromBufferAttribute(attribute: BufferAttribute, index: number) {\n this._x = attribute.getX(index);\n this._y = attribute.getY(index);\n this._z = attribute.getZ(index);\n this._w = attribute.getW(index);\n this._onChangeCallback();\n return this;\n }\n\n toJSON() {\n return this.toArray();\n }\n\n onChange(callback: () => void) {\n this._onChangeCallback = callback;\n return this;\n }\n\n _onChangeCallback() {}\n\n *[Symbol.iterator]() {\n yield this._x;\n yield this._y;\n yield this._z;\n yield this._w;\n }\n}\n","import { clamp } from \"@zyzgroup/core-common\";\nimport { Matrix3, Matrix4 } from \"./Matrix\";\nimport { BufferAttribute } from \"./BufferAttribute\";\nimport { Quaternion } from \"./Quaternion\";\nimport { Euler } from \"./Euler\";\n\n/// 向量\n\nexport class Vector2 {\n x = 0;\n y = 0;\n\n constructor(x = 0, y = 0) {\n this.x = x;\n this.y = y;\n }\n\n get width() {\n return this.x;\n }\n\n set width(value: number) {\n this.x = value;\n }\n\n get height() {\n return this.y;\n }\n\n set height(value: number) {\n this.y = value;\n }\n\n set(x = 0, y = 0) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n setScalar(scalar: number) {\n this.x = scalar;\n this.y = scalar;\n return this;\n }\n\n setX(x: number) {\n this.x = x;\n return this;\n }\n\n setY(y: number) {\n this.y = y;\n return this;\n }\n\n setComponent(index: number, value: number) {\n switch (index) {\n case 0:\n this.x = value;\n break;\n case 1:\n this.y = value;\n break;\n default:\n throw new Error(\"index is out of range: \" + index);\n }\n return this;\n }\n\n getComponent(index: number) {\n switch (index) {\n case 0:\n return this.x;\n case 1:\n return this.y;\n default:\n throw new Error(\"index is out of range: \" + index);\n }\n }\n\n copy(v: Vector2) {\n this.x = v.x;\n this.y = v.y;\n return this;\n }\n\n clone() {\n return new Vector2(this.x, this.y);\n }\n\n /// 交换律: P + Q = Q + P\n /// 结合律: (P + Q) + R = P + (Q + R)\n /// 分配率: a(P + Q) = aP + aQ\n add(v: Vector2) {\n this.x += v.x;\n this.y += v.y;\n return this;\n }\n\n addScalar(s: number) {\n this.x += s;\n this.y += s;\n return this;\n }\n\n addVectors(a: Vector2, b: Vector2) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n return this;\n }\n\n addScaledVector(v: Vector2, s: number) {\n this.x += v.x * s;\n this.y += v.y * s;\n return this;\n }\n\n /// P.sub(Q) = 从 Q的终点 到 P的终点\n sub(v: Vector2) {\n this.x -= v.x;\n this.y -= v.y;\n return this;\n }\n\n subScalar(s: number) {\n this.x -= s;\n this.y -= s;\n return this;\n }\n\n subVectors(a: Vector2, b: Vector2) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n return this;\n }\n\n /// 乘积\n /// 交换律: P * Q = Q * P\n /// 结合律: (ab)P = a(bP)\n /// 分配率: (a + b)P = aP + bP\n multiply(v: Vector2) {\n this.x *= v.x;\n this.y *= v.y;\n return this;\n }\n\n multiplyScalar(scalar: number) {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n\n divide(v: Vector2) {\n this.x /= v.x;\n this.y /= v.y;\n return this;\n }\n\n divideScalar(scalar: number) {\n return this.multiplyScalar(1 / scalar);\n }\n\n applyMatrix3(m: Matrix3) {\n const x = this.x;\n const y = this.y;\n this.x = m.m11 * x + m.m21 * y + m.m31;\n this.y = m.m12 * x + m.m22 * y + m.m32;\n return this;\n }\n\n min(v: Vector2) {\n this.x = Math.min(this.x, v.x);\n this.y = Math.min(this.y, v.y);\n return this;\n }\n\n max(v: Vector2) {\n this.x = Math.max(this.x, v.x);\n this.y = Math.max(this.y, v.y);\n return this;\n }\n\n clamp(min: Vector2, max: Vector2) {\n this.x = clamp(this.x, min.x, max.x);\n this.y = clamp(this.y, min.y, max.y);\n return this;\n }\n\n clampScalar(minVal: number, maxVal: number) {\n this.x = clamp(this.x, minVal, maxVal);\n this.y = clamp(this.y, minVal, maxVal);\n return this;\n }\n\n clampLength(min: number, max: number) {\n const length = this.length();\n return this.divideScalar(length || 1).multiplyScalar(\n clamp(length, min, max)\n );\n }\n\n floor() {\n this.x = Math.floor(this.x);\n this.y = Math.floor(this.y);\n return this;\n }\n\n ceil() {\n this.x = Math.ceil(this.x);\n this.y = Math.ceil(this.y);\n return this;\n }\n\n round() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n return this;\n }\n\n roundToZero() {\n this.x = Math.trunc(this.x);\n this.y = Math.trunc(this.y);\n return this;\n }\n\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n\n /// 点积、数量积、内积\n /// 点积的正负号说明2个向量指向同一方向的接近程度\n /// P.Q = 0 => 向量P 和 向量Q 互相垂直 => 向量P 和 向量Q 线性无关\n /// P.Q = |P| * |Q| * cos(从Q到P的角度差)\n\n /// P.Q = Q.P\n /// (aP).Q = a(Q.P)\n /// P.(Q + R) = P.Q + P.R\n /// P.P = |P| * |P|\n /// |P.Q| <= |P| * |Q|\n dot(v: Vector2) {\n return this.x * v.x + this.y * v.y;\n }\n\n /// 叉积、向量积 => 新向量垂直于原来两个向量\n /// 三维向量独有\n /// 叉积遵循右手法则:右手4指指向 向量P 的方向,手掌掌内指向 向量Q 的方向,则大拇指所指方向就是 叉积 P x Q 的方向\n\n /// (P x Q).P = (P x Q).Q = 0\n /// |P x Q| = |P| * |Q| * sin(从Q到P的角度差) = 向量P 和 向量Q 组成的平行四边形的面积\n\n /// 假设 单位向量i<1,0,0> 指向 x轴正方向,单位向量j<0,1,0> 指向 y轴正方向,单位向量k<0,0,1> 指向 z轴正方向\n /// 且 i 在 j 之前,j 在 k 之前,k 在 i 之前\n /// 则\n /// i x j = k\n /// j x k = i\n /// k x i = j\n /// j x i = -k\n /// k x j = -i\n /// i x k = -j\n\n /// Q x P = -(P x Q)\n // (aP) x Q = a(P x Q)\n /// P x (Q + R) = P x Q + P x R\n /// P x P - O = <0,0,0>\n /// (P x Q).R = (R x P).Q = (Q x R).P\n /// P x (Q x R) = P x Q x R = |P| * |P| * Q - (P.Q)P\n cross(v: Vector2) {\n return this.x * v.y - this.y * v.x;\n }\n\n /// 投影到 v 的向量\n projectOnVector(v: Vector2) {\n const denominator = v.lengthSq();\n if (denominator === 0) {\n return this.set(0, 0);\n }\n const scalar = v.dot(this) / denominator;\n return this.copy(v).multiplyScalar(scalar);\n }\n\n /// 相对于 v 的垂直分量\n perpendOnVector(v: Vector2) {\n _v2.copy(this).projectOnVector(v);\n return this.sub(_v2);\n }\n\n /// 模、范数、长度\n /// |P| >= 0\n /// |aP| = |a| * |P|\n /// |P + Q| <= |P| + |Q|\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n lengthSq() {\n return this.x * this.x + this.y * this.y;\n }\n\n manhattanLength() {\n return Math.abs(this.x) + Math.abs(this.y);\n }\n\n /// 规格化\n normalize() {\n return this.divideScalar(this.length() || 1);\n }\n\n // computes the angle in radians with respect to the positive x-axis\n angle() {\n return Math.atan2(-this.y, -this.x) + Math.PI;\n }\n\n angleTo(v: Vector2) {\n const denominator = Math.sqrt(this.lengthSq() * v.lengthSq());\n if (denominator === 0) {\n return Math.PI / 2;\n }\n const theta = this.dot(v) / denominator;\n // clamp, to handle numerical problems\n return Math.acos(clamp(theta, -1, 1));\n }\n\n distanceTo(v: Vector2) {\n return Math.sqrt(this.distanceToSquared(v));\n }\n\n distanceToSquared(v: Vector2) {\n const dx = this.x - v.x;\n const dy = this.y - v.y;\n return dx * dx + dy * dy;\n }\n\n manhattanDistanceTo(v: Vector2) {\n return Math.abs(this.x - v.x) + Math.abs(this.y - v.y);\n }\n\n setLength(length: number) {\n return this.normalize().multiplyScalar(length);\n }\n\n lerp(v: Vector2, alpha: number) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n return this;\n }\n\n lerpVectors(v1: Vector2, v2: Vector2, alpha: number) {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n return this;\n }\n\n equals(v: Vector2) {\n return v.x === this.x && v.y === this.y;\n }\n\n fromArray(array: number[], offset = 0) {\n this.x = array[offset];\n this.y = array[offset + 1];\n return this;\n }\n\n toArray(array: number[] = [], offset = 0) {\n array[offset] = this.x;\n array[offset + 1] = this.y;\n return array;\n }\n\n fromBufferAttribute(attribute: BufferAttribute, index: number) {\n this.x = attribute.getX(index);\n this.y = attribute.getY(index);\n return this;\n }\n\n rotateAround(center: Vector2, angle: number) {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const x = this.x - center.x;\n const y = this.y - center.y;\n this.x = x * c - y * s + center.x;\n this.y = x * s + y * c + center.y;\n return this;\n }\n\n random() {\n this.x = Math.random();\n this.y = Math.random();\n return this;\n }\n\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n }\n}\n\nexport class Vector3 {\n x = 0;\n y = 0;\n z = 0;\n\n constructor(x = 0, y = 0, z = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n\n set(x = 0, y = 0, z = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n\n setScalar(scalar: number) {\n this.x = scalar;\n this.y = scalar;\n this.z = scalar;\n return this;\n }\n\n setX(x: number) {\n this.x = x;\n return this;\n }\n\n setY(y: number) {\n this.y = y;\n return this;\n }\n\n setZ(z: number) {\n this.z = z;\n return this;\n }\n\n setComponent(index: number, value: number) {\n switch (index) {\n case 0:\n this.x = value;\n break;\n case 1:\n this.y = value;\n break;\n case 2:\n this.z = value;\n break;\n default:\n throw new Error(\"index is out of range: \" + index);\n }\n return this;\n }\n\n getComponent(index: number) {\n switch (index) {\n case 0:\n return this.x;\n case 1:\n return this.y;\n case 2:\n return this.z;\n default:\n throw new Error(\"index is out of range: \" + index);\n }\n }\n\n clone() {\n return new Vector3(this.x, this.y, this.z);\n }\n\n copy(v: Vector3) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n return this;\n }\n\n add(v: Vector3) {\n this.x += v.x;\n this.y += v.y;\n this.z += v.z;\n return this;\n }\n\n addScalar(s: number) {\n this.x += s;\n this.y += s;\n this.z += s;\n return this;\n }\n\n addVectors(a: Vector3, b: Vector3) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n this.z = a.z + b.z;\n return this;\n }\n\n addScaledVector(v: Vector3, s: number) {\n this.x += v.x * s;\n this.y += v.y * s;\n this.z += v.z * s;\n return this;\n }\n\n sub(v: Vector3) {\n this.x -= v.x;\n this.y -= v.y;\n this.z -= v.z;\n return this;\n }\n\n subScalar(s: number) {\n this.x -= s;\n this.y -= s;\n this.z -= s;\n return this;\n }\n\n subVectors(a: Vector3, b: Vector3) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n this.z = a.z - b.z;\n return this;\n }\n\n multiply(v: Vector3) {\n this.x *= v.x;\n this.y *= v.y;\n this.z *= v.z;\n return this;\n }\n\n multiplyScalar(scalar: number) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n return this;\n }\n\n multiplyVectors(a: Vector3, b: Vector3) {\n this.x = a.x * b.x;\n this.y = a.y * b.y;\n this.z = a.z * b.z;\n return this;\n }\n\n applyEuler(euler: Euler) {\n return this.applyQuaternion(_quaternion.setFromEuler(euler));\n }\n\n applyAxisAngle(axis: Vector3, angle: number) {\n return this.applyQuaternion(_quaternion.setFromAxisAngle(axis, angle));\n }\n\n applyMatrix3(m: Matrix3) {\n const x = this.x;\n const y = this.y;\n const z = this.z;\n const e = m.value;\n this.x = e[0] * x + e[3] * y + e[6] * z;\n this.y = e[1] * x + e[4] * y + e[7] * z;\n this.z = e[2] * x + e[5] * y + e[8] * z;\n return this;\n }\n\n applyNormalMatrix(m: Matrix3) {\n return this.applyMatrix3(m).normalize();\n }\n\n applyMatrix4(m: Matrix4) {\n const x = this.x;\n const y = this.y;\n const z = this.z;\n const e = m.value;\n const w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]);\n this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w;\n this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w;\n this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w;\n return this;\n }\n\n applyQuaternion(q: Quaternion) {\n // quaternion q is assumed to have unit length\n const vx = this.x;\n const vy = this.y;\n const vz = this.z;\n const qx = q.x;\n const qy = q.y;\n const qz = q.z;\n const qw = q.w;\n // t = 2 * cross( q.xyz, v );\n const tx = 2 * (qy * vz - qz * vy);\n const ty = 2 * (qz * vx - qx * vz);\n const tz = 2 * (qx * vy - qy * vx);\n // v + q.w * t + cross( q.xyz, t );\n this.x = vx + qw * tx + qy * tz - qz * ty;\n this.y = vy + qw * ty + qz * tx - qx * tz;\n this.z = vz + qw * tz + qx * ty - qy * tx;\n return this;\n }\n\n // project(camera) {\n // return this.applyMatrix4(camera.matrixWorldInverse).applyMatrix4(\n // camera.projectionMatrix\n // );\n // }\n\n // unproject(camera) {\n // return this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(\n // camera.matrixWorld\n // );\n // }\n\n transformDirection(m: Matrix4) {\n // input: Matrix4 affine matrix\n // vector interpreted as a direction\n const x = this.x;\n const y = this.y;\n const z = this.z;\n const e = m.value;\n this.x = e[0] * x + e[4] * y + e[8] * z;\n this.y = e[1] * x + e[5] * y + e[9] * z;\n this.z = e[2] * x + e[6] * y + e[10] * z;\n return this.normalize();\n }\n\n divide(v: Vector3) {\n this.x /= v.x;\n this.y /= v.y;\n this.z /= v.z;\n return this;\n }\n\n divideScalar(scalar: number) {\n return this.multiplyScalar(1 / scalar);\n }\n\n min(v: Vector3) {\n this.x = Math.min(this.x, v.x);\n this.y = Math.min(this.y, v.y);\n this.z = Math.min(this.z, v.z);\n return this;\n }\n\n max(v: Vector3) {\n this.x = Math.max(this.x, v.x);\n this.y = Math.max(this.y, v.y);\n this.z = Math.max(this.z, v.z);\n return this;\n }\n\n clamp(min: Vector3, max: Vector3) {\n // assumes min < max, componentwise\n this.x = clamp(this.x, min.x, max.x);\n this.y = clamp(this.y, min.y, max.y);\n this.z = clamp(this.z, min.z, max.z);\n return this;\n }\n\n clampScalar(minVal: number, maxVal: number) {\n this.x = clamp(this.x, minVal, maxVal);\n this.y = clamp(this.y, minVal, maxVal);\n this.z = clamp(this.z, minVal, maxVal);\n return this;\n }\n\n clampLength(min: number, max: number) {\n const length = this.length();\n return this.divideScalar(length || 1).multiplyScalar(\n clamp(length, min, max)\n );\n }\n\n floor() {\n this.x = Math.floor(this.x);\n this.y = Math.floor(this.y);\n this.z = Math.floor(this.z);\n return this;\n }\n\n ceil() {\n this.x = Math.ceil(this.x);\n this.y = Math.ceil(this.y);\n this.z = Math.ceil(this.z);\n return this;\n }\n\n round() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n this.z = Math.round(this.z);\n return this;\n }\n\n roundToZero() {\n this.x = Math.trunc(this.x);\n this.y = Math.trunc(this.y);\n this.z = Math.trunc(this.z);\n return this;\n }\n\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n\n dot(v: Vector3) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n }\n\n lengthSq() {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n }\n\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n }\n\n manhattanLength() {\n return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z);\n }\n\n normalize() {\n return this.divideScalar(this.length() || 1);\n }\n\n setLength(length: number) {\n return this.normalize().multiplyScalar(length);\n }\n\n lerp(v: Vector3, alpha: number) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n this.z += (v.z - this.z) * alpha;\n return this;\n }\n\n lerpVectors(v1: Vector3, v2: Vector3, alpha: number) {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n this.z = v1.z + (v2.z - v1.z) * alpha;\n return this;\n }\n\n cross(v: Vector3) {\n return this.crossVectors(this, v);\n }\n\n crossVectors(a: Vector3, b: Vector3) {\n const ax = a.x;\n const ay = a.y;\n const az = a.z;\n const bx = b.x;\n const by = b.y;\n const bz = b.z;\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n return this;\n }\n\n /// 投影到 v 的向量\n projectOnVector(v: Vector3) {\n const denominator = v.lengthSq();\n if (denominator === 0) {\n return this.set(0, 0, 0);\n }\n const scalar = v.dot(this) / denominator;\n return this.copy(v).multiplyScalar(scalar);\n }\n\n /// 相对于 v 的垂直分量\n perpendOnVector(v: Vector3) {\n _v3.copy(this).projectOnVector(v);\n return this.sub(_v3);\n }\n\n projectOnPlane(planeNormal: Vector3) {\n // _v3.copy(this).projectOnVector(planeNormal);\n // return this.sub(_v3);\n return this.perpendOnVector(planeNormal);\n }\n\n reflect(normal: Vector3) {\n // reflect incident vector off plane orthogonal to normal\n // normal is assumed to have unit length\n return this.sub(_v3.copy(normal).multiplyScalar(2 * this.dot(normal)));\n }\n\n angleTo(v: Vector3) {\n const denominator = Math.sqrt(this.lengthSq() * v.lengthSq());\n if (denominator === 0) {\n return Math.PI / 2;\n }\n const theta = this.dot(v) / denominator;\n // clamp, to handle numerical problems\n return Math.acos(clamp(theta, -1, 1));\n }\n\n distanceTo(v: Vector3) {\n return Math.sqrt(this.distanceToSquared(v));\n }\n\n distanceToSquared(v: Vector3) {\n const dx = this.x - v.x;\n const dy = this.y - v.y;\n const dz = this.z - v.z;\n return dx * dx + dy * dy + dz * dz;\n }\n\n manhattanDistanceTo(v: Vector3) {\n return (\n Math.abs(this.x - v.x) + Math.abs(this.y - v.y) + Math.abs(this.z - v.z)\n );\n }\n\n // setFromSpherical(s) {\n // return this.setFromSphericalCoords(s.radius, s.phi, s.theta);\n // }\n\n // setFromSphericalCoords(radius, phi, theta) {\n // const sinPhiRadius = Math.sin(phi) * radius;\n // this.x = sinPhiRadius * Math.sin(theta);\n // this.y = Math.cos(phi) * radius;\n // this.z = sinPhiRadius * Math.cos(theta);\n // return this;\n // }\n\n // setFromCylindrical(c) {\n // return this.setFromCylindricalCoords(c.radius, c.theta, c.y);\n // }\n\n // setFromCylindricalCoords(radius, theta, y) {\n // this.x = radius * Math.sin(theta);\n // this.y = y;\n // this.z = radius * Math.cos(theta);\n // return this;\n // }\n\n setFromMatrix4Position(m: Matrix4) {\n const e = m.value;\n this.x = e[12];\n this.y = e[13];\n this.z = e[14];\n return this;\n }\n\n setFromMatrix4Scale(m: Matrix4) {\n const sx = this.setFromMatrix4Column(m, 0).length();\n const sy = this.setFromMatrix4Column(m, 1).length();\n const sz = this.setFromMatrix4Column(m, 2).length();\n this.x = sx;\n this.y = sy;\n this.z = sz;\n return this;\n }\n\n setFromMatrix4Column(m: Matrix4, index: number) {\n return this.fromArray(m.value, index * 4);\n }\n\n setFromMatrix3Column(m: Matrix3, index: number) {\n return this.fromArray(m.value, index * 3);\n }\n\n setFromEuler(e: Euler) {\n this.x = e.x;\n this.y = e.y;\n this.z = e.z;\n return this;\n }\n\n // setFromColor(c) {\n // this.x = c.r;\n // this.y = c.g;\n // this.z = c.b;\n // return this;\n // }\n\n equals(v: Vector3) {\n return v.x === this.x && v.y === this.y && v.z === this.z;\n }\n\n fromArray(array: number[], offset = 0) {\n this.x = array[offset];\n this.y = array[offset + 1];\n this.z = array[offset + 2];\n return this;\n }\n\n toArray(array: number[] = [], offset = 0) {\n array[offset] = this.x;\n array[offset + 1] = this.y;\n array[offset + 2] = this.z;\n return array;\n }\n\n fromBufferAttribute(attribute: BufferAttribute, index: number) {\n this.x = attribute.getX(index);\n this.y = attribute.getY(index);\n this.z = attribute.getZ(index);\n return this;\n }\n\n random() {\n this.x = Math.random();\n this.y = Math.random();\n this.z = Math.random();\n return this;\n }\n\n randomDirection() {\n // https://mathworld.wolfram.com/SpherePointPicking.html\n const theta = Math.random() * Math.PI * 2;\n const u = Math.random() * 2 - 1;\n const c = Math.sqrt(1 - u * u);\n this.x = c * Math.cos(theta);\n this.y = u;\n this.z = c * Math.sin(theta);\n return this;\n }\n\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n yield this.z;\n }\n}\n\nexport class Vector4 {\n x = 0;\n y = 0;\n z = 0;\n w = 1;\n\n constructor(x = 0, y = 0, z = 0, w = 1) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n }\n\n get width() {\n return this.z;\n }\n\n set width(value) {\n this.z = value;\n }\n\n get height() {\n return this.w;\n }\n\n set height(value) {\n this.w = value;\n }\n\n set(x = 0, y = 0, z = 0, w = 1) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n return this;\n }\n\n setScalar(scalar: number) {\n this.x = scalar;\n this.y = scalar;\n this.z = scalar;\n this.w = scalar;\n return this;\n }\n\n setX(x: number) {\n this.x = x;\n return this;\n }\n\n setY(y: number) {\n this.y = y;\n return this;\n }\n\n setZ(z: number) {\n this.z = z;\n return this;\n }\n\n setW(w: number) {\n this.w = w;\n return this;\n }\n\n setComponent(index: number, value: number) {\n switch (index) {\n case 0:\n this.x = value;\n break;\n case 1:\n this.y = value;\n break;\n case 2:\n this.z = value;\n break;\n case 3:\n this.w = value;\n break;\n default:\n throw new Error(\"index is out of range: \" + index);\n }\n return this;\n }\n\n getComponent(index: number) {\n switch (index) {\n case 0:\n return this.x;\n case 1:\n return this.y;\n case 2:\n return this.z;\n case 3:\n return this.w;\n default:\n throw new Error(\"index is out of range: \" + index);\n }\n }\n\n clone() {\n return new Vector4(this.x, this.y, this.z, this.w);\n }\n\n copy(v: Vector4) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n this.w = v.w;\n return this;\n }\n\n add(v: Vector4) {\n this.x += v.x;\n this.y += v.y;\n this.z += v.z;\n this.w += v.w;\n return this;\n }\n\n addScalar(s: number) {\n this.x += s;\n this.y += s;\n this.z += s;\n this.w += s;\n return this;\n }\n\n addVectors(a: Vector4, b: Vector4) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n this.z = a.z + b.z;\n this.w = a.w + b.w;\n return this;\n }\n\n addScaledVector(v: Vector4, s: number) {\n this.x += v.x * s;\n this.y += v.y * s;\n this.z += v.z * s;\n this.w += v.w * s;\n return this;\n }\n\n sub(v: Vector4) {\n this.x -= v.x;\n this.y -= v.y;\n this.z -= v.z;\n this.w -= v.w;\n return this;\n }\n\n subScalar(s: number) {\n this.x -= s;\n this.y -= s;\n this.z -= s;\n this.w -= s;\n return this;\n }\n\n subVectors(a: Vector4, b: Vector4) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n this.z = a.z - b.z;\n this.w = a.w - b.w;\n return this;\n }\n\n multiply(v: Vector4) {\n this.x *= v.x;\n this.y *= v.y;\n this.z *= v.z;\n this.w *= v.w;\n return this;\n }\n\n multiplyScalar(scalar: number) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n this.w *= scalar;\n return this;\n }\n\n applyMatrix4(m: Matrix4) {\n const x = this.x;\n const y = this.y;\n const z = this.z;\n const w = this.w;\n const e = m.value;\n this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w;\n this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w;\n this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w;\n this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w;\n return this;\n }\n\n divide(v: Vector4) {\n this.x /= v.x;\n this.y /= v.y;\n this.z /= v.z;\n this.w /= v.w;\n return this;\n }\n\n divideScalar(scalar: number) {\n return this.multiplyScalar(1 / scalar);\n }\n\n setAxisAngleFromQuaternion(q: Quaternion) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n // q is assumed to be normalized\n this.w = 2 * Math.acos(q.w);\n const s = Math.sqrt(1 - q.w * q.w);\n if (s < 0.0001) {\n this.x = 1;\n this.y = 0;\n this.z = 0;\n } else {\n this.x = q.x / s;\n this.y = q.y / s;\n this.z = q.z / s;\n }\n return this;\n }\n\n setAxisAngleFromRotationMatrix4(m: Matrix4) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n let angle, x, y, z; // variables for result\n const epsilon = 0.01; // margin to allow for rounding errors\n const epsilon2 = 0.1; // margin to distinguish between 0 and 180 degrees\n const te = m.value;\n const m11 = te[0];\n const m12 = te[4];\n const m13 = te[8];\n const m21 = te[1];\n const m22 = te[5];\n const m23 = te[9];\n const m31 = te[2];\n const m32 = te[6];\n const m33 = te[10];\n if (\n Math.abs(m12 - m21) < epsilon &&\n Math.abs(m13 - m31) < epsilon &&\n Math.abs(m23 - m32) < epsilon\n ) {\n // singularity found\n // first check for identity matrix which must have +1 for all terms\n // in leading diagonal and zero in other terms\n if (\n Math.abs(m12 + m21) < epsilon2 &&\n Math.abs(m13 + m31) < epsilon2 &&\n Math.abs(m23 + m32) < epsilon2 &&\n Math.abs(m11 + m22 + m33 - 3) < epsilon2\n ) {\n // this singularity is identity matrix so angle = 0\n this.set(1, 0, 0, 0);\n return this; // zero angle, arbitrary axis\n }\n // otherwise this singularity is angle = 180\n angle = Math.PI;\n const xx = (m11 + 1) / 2;\n const yy = (m22 + 1) / 2;\n const zz = (m33 + 1) / 2;\n const xy = (m12 + m21) / 4;\n const xz = (m13 + m31) / 4;\n const yz = (m23 + m32) / 4;\n if (xx > yy && xx > zz) {\n // m11 is the largest diagonal term\n if (xx < epsilon) {\n x = 0;\n y = 0.707106781;\n z = 0.707106781;\n } else {\n x = Math.sqrt(xx);\n y = xy / x;\n z = xz / x;\n }\n } else if (yy > zz) {\n // m22 is the largest diagonal term\n if (yy < epsilon) {\n x = 0.707106781;\n y = 0;\n z = 0.707106781;\n } else {\n y = Math.sqrt(yy);\n x = xy / y;\n z = yz / y;\n }\n } else {\n // m33 is the largest diagonal term so base result on this\n if (zz < epsilon) {\n x = 0.707106781;\n y = 0.707106781;\n z = 0;\n } else {\n z = Math.sqrt(zz);\n x = xz / z;\n y = yz / z;\n }\n }\n this.set(x, y, z, angle);\n return this; // return 180 deg rotation\n }\n // as we have reached here there are no singularities so we can handle normally\n let s = Math.sqrt(\n (m32 - m23) * (m32 - m23) +\n (m13 - m31) * (m13 - m31) +\n (m21 - m12) * (m21 - m12)\n ); // used to normalize\n if (Math.abs(s) < 0.001) s = 1;\n // prevent divide by zero, should not happen if matrix is orthogonal and should be\n // caught by singularity test above, but I've left it in just in case\n this.x = (m32 - m23) / s;\n this.y = (m13 - m31) / s;\n this.z = (m21 - m12) / s;\n this.w = Math.acos((m11 + m22 + m33 - 1) / 2);\n return this;\n }\n\n setFromMatrix4Position(m: Matrix4) {\n const e = m.value;\n this.x = e[12];\n this.y = e[13];\n this.z = e[14];\n this.w = e[15];\n return this;\n }\n\n min(v: Vector4) {\n this.x = Math.min(this.x, v.x);\n this.y = Math.min(this.y, v.y);\n this.z = Math.min(this.z, v.z);\n this.w = Math.min(this.w, v.w);\n return this;\n }\n\n max(v: Vector4) {\n this.x = Math.max(this.x, v.x);\n this.y = Math.max(this.y, v.y);\n this.z = Math.max(this.z, v.z);\n this.w = Math.max(this.w, v.w);\n return this;\n }\n\n clamp(min: Vector4, max: Vector4) {\n // assumes min < max, componentwise\n this.x = clamp(this.x, min.x, max.x);\n this.y = clamp(this.y, min.y, max.y);\n this.z = clamp(this.z, min.z, max.z);\n this.w = clamp(this.w, min.w, max.w);\n return this;\n }\n\n clampScalar(minVal: number, maxVal: number) {\n this.x = clamp(this.x, minVal, maxVal);\n this.y = clamp(this.y, minVal, maxVal);\n this.z = clamp(this.z, minVal, maxVal);\n this.w = clamp(this.w, minVal, maxVal);\n return this;\n }\n\n clampLength(min: number, max: number) {\n const length = this.length();\n return this.divideScalar(length || 1).multiplyScalar(\n clamp(length, min, max)\n );\n }\n\n floor() {\n this.x = Math.floor(this.x);\n this.y = Math.floor(this.y);\n this.z = Math.floor(this.z);\n this.w = Math.floor(this.w);\n return this;\n }\n\n ceil() {\n this.x = Math.ceil(this.x);\n this.y = Math.ceil(this.y);\n this.z = Math.ceil(this.z);\n this.w = Math.ceil(this.w);\n return this;\n }\n\n round() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n this.z = Math.round(this.z);\n this.w = Math.round(this.w);\n return this;\n }\n\n roundToZero() {\n this.x = Math.trunc(this.x);\n this.y = Math.trunc(this.y);\n this.z = Math.trunc(this.z);\n this.w = Math.trunc(this.w);\n return this;\n }\n\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n this.w = -this.w;\n return this;\n }\n\n dot(v: Vector4) {\n return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n }\n\n lengthSq() {\n return (\n this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w\n );\n }\n\n length() {\n return Math.sqrt(\n this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w\n );\n }\n\n manhattanLength() {\n return (\n Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w)\n );\n }\n\n normalize() {\n return this.divideScalar(this.length() || 1);\n }\n\n setLength(length: number) {\n return this.normalize().multiplyScalar(length);\n }\n\n /// 投影到 v 的向量\n projectOnVector(v: Vector4) {\n const denominator = v.lengthSq();\n if (denominator === 0) {\n return this.set(0, 0, 0, 1);\n }\n const scalar = v.dot(this) / denominator;\n return this.copy(v).multiplyScalar(scalar);\n }\n\n // /// 相对于 v 的垂直分量\n // perpendOnVector(v: Vector4) {\n // _v4.copy(this).projectOnVector(v);\n // return this.sub(_v4);\n // }\n\n lerp(v: Vector4, alpha: number) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n this.z += (v.z - this.z) * alpha;\n this.w += (v.w - this.w) * alpha;\n return this;\n }\n\n lerpVectors(v1: Vector4, v2: Vector4, alpha: number) {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n this.z = v1.z + (v2.z - v1.z) * alpha;\n this.w = v1.w + (v2.w - v1.w) * alpha;\n return this;\n }\n\n equals(v: Vector4) {\n return v.x === this.x && v.y === this.y && v.z === this.z && v.w === this.w;\n }\n\n fromArray(array: number[], offset = 0) {\n this.x = array[offset];\n this.y = array[offset + 1];\n this.z = array[offset + 2];\n this.w = array[offset + 3];\n return this;\n }\n\n toArray(array: number[] = [], offset = 0) {\n array[offset] = this.x;\n array[offset + 1] = this.y;\n array[offset + 2] = this.z;\n array[offset + 3] = this.w;\n return array;\n }\n\n fromBufferAttribute(attribute: BufferAttribute, index: number) {\n this.x = attribute.getX(index);\n this.y = attribute.getY(index);\n this.z = attribute.getZ(index);\n this.w = attribute.getW(index);\n return this;\n }\n\n random() {\n this.x = Math.random();\n this.y = Math.random();\n this.z = Math.random();\n this.w = Math.random();\n return this;\n }\n\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n yield this.z;\n yield this.w;\n }\n}\n\nconst _v2 = new Vector2();\nconst _v3 = new Vector3();\nconst _v4 = new Vector4();\nconst _quaternion = new Quaternion();\n","/* eslint-disable @typescript-eslint/adjacent-overload-signatures */\nimport { regMatchAll, maxDotNumber, clamp } from \"@zyzgroup/core-common\";\nimport { toDegree, toRadian } from \"./math\";\nimport Point3D from \"./shapes/Point3D\";\nimport { Vector2, Vector3 } from \"./Vector\";\nimport { Euler } from \"./Euler\";\nimport { Quaternion } from \"./Quaternion\";\n\nexport const WebGLCoordinateSystem = 2000;\nexport const WebGPUCoordinateSystem = 2001;\n\n// [矩阵转换小工具](http://meyerweb.com/eric/tools/matrix/)\n\n// https://developer.mozilla.org/en-US/docs/Web/API/DOMMatrix\n\n// https://github.com/chrisaljoudi/transformatrix.js\n\n// https://en.wikipedia.org/wiki/Matrix_multiplication\n\n// https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Matrix_math_for_the_web\n// https://github.com/gregtatum/mdn-webgl\n\n// https://glmatrix.net/\n\n/**\n\n matrix2(a, b, c, d)\n matrix(a, b, c, d, e, f)\n matrix4(a1, b1, c1, d1, a2, b2, c2, d2, a3, b3, c3, d3, a4, b4, c4, d4)\n\n (a, c, e)\n (b, d, f)\n (0, 0, 1)\n\n (1, 0, 0)\n (0, 1, 0)\n (0, 0, 1)\n\n a1 a2 a3 a4\n b1 b2 b3 b4\n c1 c2 c3 c4\n d1 d2 d3 d4\n\n m11 m21 0 m31\n m12 m22 0 m32\n 0 0 0 0\n m13 m23 0 m33\n\n 1 0 0 0\n 0 1 0 0\n 0 0 1 0\n 0 0 0 1\n\n scaleX skewX tx\n skewY scaleY ty\n 0 0 1\n\n scaleX a2 a3 tx\n b1 scaleY b3 ty\n c1 c2 scaleZ tz\n skewX skewY skewZ 1\n\n\n a c e x_prev a * x_prev + c * y_prev + e\n ( b d f ) * ( y_prev ) = ( b * x_prev + d * y_prev + f )\n 0 0 1 1 1\n\n a1 c1 a2 c2 a1*a2+c1*b2 a1*c2+c1*d2\n ( b1 d1 ) * ( b2 d2 ) = ( b1*a2+d1*b2 b1*c2+d1*d2 )\n\n */\n\n/// matrixB • matrixA => matrixA first, then matrixB\n\n/// 按列顺序 - 4\nexport type TMatrix2Value = [number, number, number, number];\nconst DEFAULT_MATRIX2_VALUE: TMatrix2Value = [1, 0, 0, 1];\n\n/// 按列顺序 - 6\nexport type TMatrixValue = [number, number, number, number, number, number];\nconst DEFAULT_MATRIX_VALUE: TMatrixValue = [1, 0, 0, 1, 0, 0];\n\n/// 按列顺序 - 9\nexport type TMatrix3Value = [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number\n];\nconst DEFAULT_MATRIX3_VALUE: TMatrix3Value = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\n/// 按列顺序 - 16\nexport type TMatrix4Value = [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number\n];\nconst DEFAULT_MATRIX4_VALUE: TMatrix4Value = [\n 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1\n];\n\nexport class Matrix2 {\n /// 按列顺序\n value: TMatrix2Value;\n\n constructor(value: TMatrix2Value = DEFAULT_MATRIX2_VALUE) {\n this.value = Array.from(value) as TMatrix2Value;\n }\n\n get m11() {\n return this.value[0];\n }\n get m12() {\n return this.value[1];\n }\n get m21() {\n return this.value[2];\n }\n get m22() {\n return this.value[3];\n }\n\n set m11(v: number) {\n this.value[0] = v;\n }\n set m12(v: number) {\n this.value[1] = v;\n }\n set m21(v: number) {\n this.value[2] = v;\n }\n set m22(v: number) {\n this.value[3] = v;\n }\n\n /// 按行顺序\n set(n11 = 1, n12 = 0, n21 = 0, n22 = 1) {\n this.m11 = n11;\n this.m21 = n12;\n this.m12 = n21;\n this.m22 = n22;\n return this;\n }\n\n identity() {\n this.value = Array.from(DEFAULT_MATRIX2_VALUE) as TMatrix2Value;\n return this;\n }\n\n get isIdentity(): boolean {\n return this.m11 == 1 && this.m12 == 0 && this.m21 == 0 && this.m22 == 1;\n }\n\n copy(m: Matrix2) {\n this.m11 = m.m11;\n this.m12 = m.m12;\n this.m21 = m.m21;\n this.m22 = m.m22;\n return this;\n }\n\n clone(): Matrix2 {\n return new Matrix2(this.value);\n }\n\n fromArray(array: number[], offset = 0) {\n for (let i = 0; i < 4; i++) {\n this.value[i] = array[i + offset];\n }\n return this;\n }\n\n toArray(array: number[] = [], offset = 0) {\n array[offset] = this.m11;\n array[offset + 1] = this.m12;\n array[offset + 2] = this.m21;\n array[offset + 3] = this.m22;\n return array;\n }\n\n multiplyMatrices(a: Matrix2, b: Matrix2) {\n const ae = a.value;\n const be = b.value;\n const te = this.value;\n\n const a11 = ae[0];\n const a12 = ae[2];\n const a21 = ae[1];\n const a22 = ae[3];\n\n const b11 = be[0];\n const b12 = be[2];\n const b21 = be[1];\n const b22 = be[3];\n\n te[0] = a11 * b11 + a12 * b21;\n te[2] = a11 * b12 + a12 * b22;\n\n te[1] = a21 * b11 + a22 * b21;\n te[3] = a21 * b12 + a22 * b22;\n\n return this;\n }\n\n multiply(m: Matrix2) {\n return this.multiplyMatrices(this, m);\n }\n\n premultiply(m: Matrix2) {\n return this.multiplyMatrices(m, this);\n }\n\n multiplyScalar(s: number) {\n this.m11 *= s;\n this.m12 *= s;\n this.m21 *= s;\n this.m22 *= s;\n return this;\n }\n\n /// 行列式\n determinant(): number {\n return this.m11 * this.m22 - this.m21 * this.m12;\n }\n}\n\nexport class Matrix3 {\n /// 按列顺序\n value: TMatrix3Value;\n\n constructor(value: TMatrix3Value = DEFAULT_MATRIX3_VALUE) {\n this.value = Array.from(value) as TMatrix3Value;\n }\n\n get m11() {\n return this.value[0];\n }\n get m12() {\n return this.value[1];\n }\n get m13() {\n return this.value[2];\n }\n get m21() {\n return this.value[3];\n }\n get m22() {\n return this.value[4];\n }\n get m23() {\n return this.value[5];\n }\n get m31() {\n return this.value[6];\n }\n get m32() {\n return this.value[7];\n }\n get m33() {\n return this.value[8];\n }\n\n set m11(v: number) {\n this.value[0] = v;\n }\n set m12(v: number) {\n this.value[1] = v;\n }\n set m13(v: number) {\n this.value[2] = v;\n }\n set m21(v: number) {\n this.value[3] = v;\n }\n set m22(v: number) {\n this.value[4] = v;\n }\n set m23(v: number) {\n this.value[5] = v;\n }\n set m31(v: number) {\n this.value[6] = v;\n }\n set m32(v: number) {\n this.value[7] = v;\n }\n set m33(v: number) {\n this.value[8] = v;\n }\n\n /// 按行顺序\n set(\n n11 = 1,\n n12 = 0,\n n13 = 0,\n n21 = 0,\n n22 = 1,\n n23 = 0,\n n31 = 0,\n n32 = 0,\n n33 = 1\n ) {\n const te = this.value;\n te[0] = n11;\n te[1] = n21;\n te[2] = n31;\n te[3] = n12;\n te[4] = n22;\n te[5] = n32;\n te[6] = n13;\n te[7] = n23;\n te[8] = n33;\n return this;\n }\n\n identity() {\n this.value = Array.from(DEFAULT_MATRIX3_VALUE) as TMatrix3Value;\n return this;\n }\n\n get isIdentity(): boolean {\n return (\n this.m11 == 1 &&\n this.m12 == 0 &&\n this.m13 == 0 &&\n this.m21 == 0 &&\n this.m22 == 1 &&\n this.m23 == 0 &&\n this.m31 == 0 &&\n this.m32 == 0 &&\n this.m33 == 1\n );\n }\n\n copy(m: Matrix3) {\n this.m11 = m.m11;\n this.m12 = m.m12;\n this.m13 = m.m13;\n this.m21 = m.m21;\n this.m22 = m.m22;\n this.m23 = m.m23;\n this.m31 = m.m31;\n this.m32 = m.m32;\n this.m33 = m.m33;\n return this;\n }\n\n clone(): Matrix3 {\n return new Matrix3(this.value);\n }\n\n fromArray(array: number[], offset = 0) {\n for (let i = 0; i < 9; i++) {\n this.value[i] = array[i + offset];\n }\n return this;\n }\n\n toArray(array: number[] = [], offset = 0) {\n array[offset] = this.m11;\n array[offset + 1] = this.m12;\n array[offset + 2] = this.m13;\n array[offset + 3] = this.m21;\n array[offset + 4] = this.m22;\n array[offset + 5] = this.m23;\n array[offset + 6] = this.m31;\n array[offset + 7] = this.m32;\n array[offset + 8] = this.m33;\n return array;\n }\n\n extractBasis(xAxis: Vector3, yAxis: Vector3, zAxis: Vector3) {\n xAxis.setFromMatrix3Column(this, 0);\n yAxis.setFromMatrix3Column(this, 1);\n zAxis.setFromMatrix3Column(this, 2);\n return this;\n }\n\n setFromMatrix4(m: Matrix4) {\n this.set(m.m11, m.m21, m.m31, m.m12, m.m22, m.m32, m.m13, m.m23, m.m33);\n return this;\n }\n\n multiplyMatrices(a: Matrix3, b: Matrix3) {\n const ae = a.value;\n const be = b.value;\n const te = this.value;\n\n const a11 = ae[0];\n const a12 = ae[3];\n const a13 = ae[6];\n const a21 = ae[1];\n const a22 = ae[4];\n const a23 = ae[7];\n const a31 = ae[2];\n const a32 = ae[5];\n const a33 = ae[8];\n\n const b11 = be[0];\n const b12 = be[3];\n const b13 = be[6];\n const b21 = be[1];\n const b22 = be[4];\n const b23 = be[7];\n const b31 = be[2];\n const b32 = be[5];\n const b33 = be[8];\n\n te[0] = a11 * b11 + a12 * b21 + a13 * b31;\n te[3] = a11 * b12 + a12 * b22 + a13 * b32;\n te[6] = a11 * b13 + a12 * b23 + a13 * b33;\n\n te[1] = a21 * b11 + a22 * b21 + a23 * b31;\n te[4] = a21 * b12 + a22 * b22 + a23 * b32;\n te[7] = a21 * b13 + a22 * b23 + a23 * b33;\n\n te[2] = a31 * b11 + a32 * b21 + a33 * b31;\n te[5] = a31 * b12 + a32 * b22 + a33 * b32;\n te[8] = a31 * b13 + a32 * b23 + a33 * b33;\n\n return this;\n }\n\n multiply(m: Matrix3) {\n return this.multiplyMatrices(this, m);\n }\n\n premultiply(m: Matrix3) {\n return this.multiplyMatrices(m, this);\n }\n\n multiplyScalar(s: number) {\n this.m11 *= s;\n this.m12 *= s;\n this.m13 *= s;\n this.m21 *= s;\n this.m22 *= s;\n this.m23 *= s;\n this.m31 *= s;\n this.m32 *= s;\n this.m33 *= s;\n return this;\n }\n\n /// 行列式\n determinant(): number {\n const te = this.value;\n const a = te[0];\n const b = te[1];\n const c = te[2];\n const d = te[3];\n const e = te[4];\n const f = te[5];\n const g = te[6];\n const h = te[7];\n const i = te[8];\n return (\n a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g\n );\n }\n\n invert() {\n const te = this.value;\n const n11 = te[0];\n const n21 = te[1];\n const n31 = te[2];\n const n12 = te[3];\n const n22 = te[4];\n const n32 = te[5];\n const n13 = te[6];\n const n23 = te[7];\n const n33 = te[8];\n const t11 = n33 * n22 - n32 * n23;\n const t12 = n32 * n13 - n33 * n12;\n const t13 = n23 * n12 - n22 * n13;\n const det = n11 * t11 + n21 * t12 + n31 * t13;\n\n if (det === 0) {\n return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n\n const detInv = 1 / det;\n\n te[0] = t11 * detInv;\n te[1] = (n31 * n23 - n33 * n21) * detInv;\n te[2] = (n32 * n21 - n31 * n22) * detInv;\n\n te[3] = t12 * detInv;\n te[4] = (n33 * n11 - n31 * n13) * detInv;\n te[5] = (n31 * n12 - n32 * n11) * detInv;\n\n te[6] = t13 * detInv;\n te[7] = (n21 * n13 - n23 * n11) * detInv;\n te[8] = (n22 * n11 - n21 * n12) * detInv;\n\n return this;\n }\n\n transpose() {\n let tmp;\n const m = this.value;\n\n tmp = m[1];\n m[1] = m[3];\n m[3] = tmp;\n tmp = m[2];\n m[2] = m[6];\n m[6] = tmp;\n tmp = m[5];\n m[5] = m[7];\n m[7] = tmp;\n\n return this;\n }\n\n getNormalMatrix(matrix4: Matrix4) {\n return this.setFromMatrix4(matrix4).invert().transpose();\n }\n\n transposeIntoArray(r: number[]) {\n const m = this.value;\n r[0] = m[0];\n r[1] = m[3];\n r[2] = m[6];\n r[3] = m[1];\n r[4] = m[4];\n r[5] = m[7];\n r[6] = m[2];\n r[7] = m[5];\n r[8] = m[8];\n return this;\n }\n\n setUvTransform(\n tx: number,\n ty: number,\n sx: number,\n sy: number,\n rotation: number,\n cx: number,\n cy: number\n ) {\n const c = Math.cos(rotation);\n const s = Math.sin(rotation);\n this.set(\n sx * c,\n sx * s,\n -sx * (c * cx + s * cy) + cx + tx,\n -sy * s,\n sy * c,\n -sy * (-s * cx + c * cy) + cy + ty,\n 0,\n 0,\n 1\n );\n return this;\n }\n\n scale(sx: number, sy: number) {\n this.premultiply(_m3.makeScale(sx, sy));\n return this;\n }\n\n rotate(theta: number) {\n this.premultiply(_m3.makeRotation(-theta));\n return this;\n }\n\n translate(tx: number, ty: number) {\n this.premultiply(_m3.makeTranslation(tx, ty));\n return this;\n }\n\n makeTranslation(x: Vector2 | number, y?: number) {\n if (typeof x === \"number\") {\n this.set(1, 0, x, 0, 1, y, 0, 0, 1);\n } else {\n this.set(1, 0, x.x, 0, 1, x.y, 0, 0, 1);\n }\n return this;\n }\n\n // counterclockwise\n makeRotation(theta: number) {\n const c = Math.cos(theta);\n const s = Math.sin(theta);\n this.set(c, -s, 0, s, c, 0, 0, 0, 1);\n return this;\n }\n\n makeScale(x: number, y: number) {\n this.set(x, 0, 0, 0, y, 0, 0, 0, 1);\n return this;\n }\n\n equals(matrix: Matrix3) {\n for (let i = 0; i < 9; i++) {\n if (this.value[i] !== matrix.value[i]) {\n return false;\n }\n }\n return true;\n }\n}\n\nexport class Matrix4 {\n /// 按列顺序\n value: TMatrix4Value;\n is3dSpecial = false;\n\n constructor(value: TMatrix4Value = DEFAULT_MATRIX4_VALUE) {\n this.value = Array.from(value) as TMatrix4Value;\n }\n\n get m11() {\n return this.value[0];\n }\n get m12() {\n return this.value[1];\n }\n get m13() {\n return this.value[2];\n }\n get m14() {\n return this.value[3];\n }\n get m21() {\n return this.value[4];\n }\n get m22() {\n return this.value[5];\n }\n get m23() {\n return this.value[6];\n }\n get m24() {\n return this.value[7];\n }\n get m31() {\n return this.value[8];\n }\n get m32() {\n return this.value[9];\n }\n get m33() {\n return this.value[10];\n }\n get m34() {\n return this.value[11];\n }\n get m41() {\n return this.value[12];\n }\n get m42() {\n return this.value[13];\n }\n get m43() {\n return this.value[14];\n }\n get m44() {\n return this.value[15];\n }\n\n set m11(v: number) {\n this.value[0] = v;\n }\n set m12(v: number) {\n this.value[1] = v;\n }\n set m13(v: number) {\n this.value[2] = v;\n }\n set m14(v: number) {\n this.value[3] = v;\n }\n set m21(v: number) {\n this.value[4] = v;\n }\n set m22(v: number) {\n this.value[5] = v;\n }\n set m23(v: number) {\n this.value[6] = v;\n }\n set m24(v: number) {\n this.value[7] = v;\n }\n set m31(v: number) {\n this.value[8] = v;\n }\n set m32(v: number) {\n this.value[9] = v;\n }\n set m33(v: number) {\n this.value[10] = v;\n }\n set m34(v: number) {\n this.value[11] = v;\n }\n set m41(v: number) {\n this.value[12] = v;\n }\n set m42(v: number) {\n this.value[13] = v;\n }\n set m43(v: number) {\n this.value[14] = v;\n }\n set m44(v: number) {\n this.value[15] = v;\n }\n\n /// 按行顺序\n set(\n n11 = 1,\n n12 = 0,\n n13 = 0,\n n14 = 0,\n n21 = 0,\n n22 = 1,\n n23 = 0,\n n24 = 0,\n n31 = 0,\n n32 = 0,\n n33 = 1,\n n34 = 0,\n n41 = 0,\n n42 = 0,\n n43 = 0,\n n44 = 1\n ) {\n const te = this.value;\n te[0] = n11;\n te[4] = n12;\n te[8] = n13;\n te[12] = n14;\n te[1] = n21;\n te[5] = n22;\n te[9] = n23;\n te[13] = n24;\n te[2] = n31;\n te[6] = n32;\n te[10] = n33;\n te[14] = n34;\n te[3] = n41;\n te[7] = n42;\n te[11] = n43;\n te[15] = n44;\n return this;\n }\n\n is2D(): boolean {\n return (\n !this.is3dSpecial &&\n this.m31 == 0 &&\n this.m32 == 0 &&\n this.m33 == 1 &&\n this.m34 == 0 &&\n this.m43 == 0 &&\n this.m44 == 1\n );\n }\n\n is3D(): boolean {\n return !this.is2D();\n }\n\n identity() {\n this.value = Array.from(DEFAULT_MATRIX4_VALUE) as TMatrix4Value;\n return this;\n }\n\n get isIdentity(): boolean {\n return (\n this.m11 == 1 &&\n this.m12 == 0 &&\n this.m13 == 0 &&\n this.m14 == 0 &&\n this.m21 == 0 &&\n this.m22 == 1 &&\n this.m23 == 0 &&\n this.m24 == 0 &&\n this.m31 == 0 &&\n this.m32 == 0 &&\n this.m33 == 1 &&\n this.m34 == 0 &&\n this.m41 == 0 &&\n this.m42 == 0 &&\n this.m43 == 0 &&\n this.m44 == 1\n );\n }\n\n copy(m: Matrix4) {\n this.m11 = m.m11;\n this.m12 = m.m12;\n this.m13 = m.m13;\n this.m14 = m.m14;\n this.m21 = m.m21;\n this.m22 = m.m22;\n this.m23 = m.m23;\n this.m24 = m.m24;\n this.m31 = m.m31;\n this.m32 = m.m32;\n this.m33 = m.m33;\n this.m34 = m.m34;\n this.m41 = m.m41;\n this.m42 = m.m42;\n this.m43 = m.m43;\n this.m44 = m.m44;\n return this;\n }\n\n clone(): Matrix4 {\n return new Matrix4(this.value);\n }\n\n // matrix4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1)\n static fromString(s: string) {\n const m = new Matrix4();\n const results = regMatchAll(\"number\", s);\n if (results.length === 16) {\n results.forEach((result, index) => {\n if (result.fullMatch) {\n m.value[index] = parseFloat(result.fullMatch);\n }\n });\n }\n return m;\n }\n\n fromArray(array: number[], offset = 0) {\n for (let i = 0; i < 16; i++) {\n this.value[i] = array[i + offset];\n }\n return this;\n }\n\n toArray(array: number[] = [], offset = 0) {\n const te = this.value;\n\n array[offset] = te[0];\n array[offset + 1] = te[1];\n array[offset + 2] = te[2];\n array[offset + 3] = te[3];\n\n array[offset + 4] = te[4];\n array[offset + 5] = te[5];\n array[offset + 6] = te[6];\n array[offset + 7] = te[7];\n\n array[offset + 8] = te[8];\n array[offset + 9] = te[9];\n array[offset + 10] = te[10];\n array[offset + 11] = te[11];\n\n array[offset + 12] = te[12];\n array[offset + 13] = te[13];\n array[offset + 14] = te[14];\n array[offset + 15] = te[15];\n\n return array;\n }\n\n copyPosition(m: Matrix4) {\n const te = this.value;\n const me = m.value;\n te[12] = me[12];\n te[13] = me[13];\n te[14] = me[14];\n return this;\n }\n\n setFromMatrix3(m: Matrix3) {\n const me = m.value;\n this.set(\n me[0],\n me[3],\n me[6],\n 0,\n me[1],\n me[4],\n me[7],\n 0,\n me[2],\n me[5],\n me[8],\n 0,\n 0,\n 0,\n 0,\n 1\n );\n return this;\n }\n\n extractBasis(xAxis: Vector3, yAxis: Vector3, zAxis: Vector3) {\n xAxis.setFromMatrix4Column(this, 0);\n yAxis.setFromMatrix4Column(this, 1);\n zAxis.setFromMatrix4Column(this, 2);\n return this;\n }\n\n makeBasis(xAxis: Vector3, yAxis: Vector3, zAxis: Vector3) {\n this.set(\n xAxis.x,\n yAxis.x,\n zAxis.x,\n 0,\n xAxis.y,\n yAxis.y,\n zAxis.y,\n 0,\n xAxis.z,\n yAxis.z,\n zAxis.z,\n 0,\n 0,\n 0,\n 0,\n 1\n );\n return this;\n }\n\n normalize() {\n return this.multiplyScalar(1 / (this.m44 || 0.0001));\n }\n\n // w: perspective\n transformPoint(point: { x: number; y: number; z?: number; w?: number }): {\n x: number;\n y: number;\n z: number;\n w: number;\n } {\n const z = point.z || 1;\n const w = point.w || 1;\n return {\n x: point.x * this.m11 + point.y * this.m21 + z * this.m31 + w * this.m41,\n y: point.x * this.m12 + point.y * this.m22 + z * this.m32 + w * this.m42,\n z: point.x * this.m13 + point.y * this.m23 + z * this.m33 + w * this.m43,\n w: point.x * this.m14 + point.y * this.m24 + z * this.m34 + w * this.m44\n };\n }\n\n toMatrix(matrix?: Matrix) {\n const { scalarX, scalarY, skewX, skewY, x, y } = this.split();\n const value: TMatrixValue = [scalarX, skewY, skewX, scalarY, x, y];\n if (matrix) {\n matrix.value = value;\n return matrix;\n } else {\n return new Matrix(value);\n }\n // if (!matrix) {\n // matrix = new Matrix();\n // }\n // matrix.m11 = this.m11;\n // matrix.m12 = this.m12;\n // matrix.m13 = this.m14;\n // matrix.m21 = this.m21;\n // matrix.m22 = this.m22;\n // matrix.m23 = this.m24;\n // matrix.m31 = this.m41;\n // matrix.m32 = this.m42;\n // matrix.m33 = this.m44;\n // return matrix;\n }\n\n flatten(): Matrix4 {\n this.m31 = 0;\n this.m32 = 0;\n this.m33 = 1;\n this.m34 = 0;\n this.m14 = 0;\n this.m24 = 0;\n this.m43 = 0;\n this.m44 = 1;\n return this;\n }\n\n toString(fractionalDigits = 6) {\n return `matrix4(${this.value\n .map((v) => maxDotNumber(v, fractionalDigits))\n .join(\",\")})`;\n }\n\n split() {\n const scalarX = Math.sqrt(\n this.m11 * this.m11 + this.m12 * this.m12 + this.m13 * this.m13\n );\n const scalarY = Math.sqrt(\n this.m21 * this.m21 + this.m22 * this.m22 + this.m23 * this.m23\n );\n const scalarZ = Math.sqrt(\n this.m31 * this.m31 + this.m32 * this.m32 + this.m33 * this.m33\n );\n const degreeY = toDegree(clamp(Math.asin(-this.m13), -1, 1));\n let degreeX = toDegree(Math.atan2(this.m23, this.m33));\n if (Math.cos(toRadian(degreeY)) === 0) {\n degreeX = toDegree(Math.atan2(-this.m31, this.m22));\n // degreeZ = 0;\n }\n let degreeZ = toDegree(Math.atan2(this.m12, this.m11));\n if (this.m11 < 0 && this.m22 >= 0) {\n degreeZ += 180;\n }\n return {\n x: this.m41,\n y: this.m42,\n z: this.m43,\n scalarX,\n scalarY,\n scalarZ,\n degreeX,\n degreeY,\n degreeZ,\n skewX: toDegree(this.m14),\n skewY: toDegree(this.m24),\n skewZ: toDegree(this.m34),\n skewW: this.m44,\n perspective: this.m34 ? -(1 / this.m34) : 0\n };\n }\n\n extractRotation(m: Matrix4) {\n // this method does not support reflection matrices\n const te = this.value;\n const me = m.value;\n\n const scaleX = 1 / _v3.setFromMatrix4Column(m, 0).length();\n const scaleY = 1 / _v3.setFromMatrix4Column(m, 1).length();\n const scaleZ = 1 / _v3.setFromMatrix4Column(m, 2).length();\n\n te[0] = me[0] * scaleX;\n te[1] = me[1] * scaleX;\n te[2] = me[2] * scaleX;\n te[3] = 0;\n\n te[4] = me[4] * scaleY;\n te[5] = me[5] * scaleY;\n te[6] = me[6] * scaleY;\n te[7] = 0;\n\n te[8] = me[8] * scaleZ;\n te[9] = me[9] * scaleZ;\n te[10] = me[10] * scaleZ;\n te[11] = 0;\n\n te[12] = 0;\n te[13] = 0;\n te[14] = 0;\n te[15] = 1;\n\n return this;\n }\n\n makeRotationFromEuler(euler: Euler) {\n const te = this.value;\n\n const x = euler.x;\n const y = euler.y;\n const z = euler.z;\n const a = Math.cos(x);\n const b = Math.sin(x);\n const c = Math.cos(y);\n const d = Math.sin(y);\n const e = Math.cos(z);\n const f = Math.sin(z);\n\n if (euler.order === \"XYZ\") {\n const ae = a * e;\n const af = a * f;\n const be = b * e;\n const bf = b * f;\n\n te[0] = c * e;\n te[4] = -c * f;\n te[8] = d;\n\n te[1] = af + be * d;\n te[5] = ae - bf * d;\n te[9] = -b * c;\n\n te[2] = bf - ae * d;\n te[6] = be + af * d;\n te[10] = a * c;\n } else if (euler.order === \"YXZ\") {\n const ce = c * e;\n const cf = c * f;\n const de = d * e;\n const df = d * f;\n\n te[0] = ce + df * b;\n te[4] = de * b - cf;\n te[8] = a * d;\n\n te[1] = a * f;\n te[5] = a * e;\n te[9] = -b;\n\n te[2] = cf * b - de;\n te[6] = df + ce * b;\n te[10] = a * c;\n } else if (euler.order === \"ZXY\") {\n const ce = c * e;\n const cf = c * f;\n const de = d * e;\n const df = d * f;\n\n te[0] = ce - df * b;\n te[4] = -a * f;\n te[8] = de + cf * b;\n\n te[1] = cf + de * b;\n te[5] = a * e;\n te[9] = df - ce * b;\n\n te[2] = -a * d;\n te[6] = b;\n te[10] = a * c;\n } else if (euler.order === \"ZYX\") {\n const ae = a * e;\n const af = a * f;\n const be = b * e;\n const bf = b * f;\n\n te[0] = c * e;\n te[4] = be * d - af;\n te[8] = ae * d + bf;\n\n te[1] = c * f;\n te[5] = bf * d + ae;\n te[9] = af * d - be;\n\n te[2] = -d;\n te[6] = b * c;\n te[10] = a * c;\n } else if (euler.order === \"YZX\") {\n const ac = a * c;\n const ad = a * d;\n const bc = b * c;\n const bd = b * d;\n\n te[0] = c * e;\n te[4] = bd - ac * f;\n te[8] = bc * f + ad;\n\n te[1] = f;\n te[5] = a * e;\n te[9] = -b * e;\n\n te[2] = -d * e;\n te[6] = ad * f + bc;\n te[10] = ac - bd * f;\n } else if (euler.order === \"XZY\") {\n const ac = a * c;\n const ad = a * d;\n const bc = b * c;\n const bd = b * d;\n\n te[0] = c * e;\n te[4] = -f;\n te[8] = d * e;\n\n te[1] = ac * f + bd;\n te[5] = a * e;\n te[9] = ad * f - bc;\n\n te[2] = bc * f - ad;\n te[6] = b * e;\n te[10] = bd * f + ac;\n }\n\n // bottom row\n te[3] = 0;\n te[7] = 0;\n te[11] = 0;\n\n // last column\n te[12] = 0;\n te[13] = 0;\n te[14] = 0;\n te[15] = 1;\n\n return this;\n }\n\n makeRotationFromQuaternion(q: Quaternion) {\n return this.compose(_zero, q, _one);\n }\n\n lookAt(eye: Vector3, target: Vector3, up: Vector3) {\n const te = this.value;\n\n _z.subVectors(eye, target);\n\n if (_z.lengthSq() === 0) {\n // eye and target are in the same position\n _z.z = 1;\n }\n\n _z.normalize();\n _x.crossVectors(up, _z);\n\n if (_x.lengthSq() === 0) {\n // up and z are parallel\n\n if (Math.abs(up.z) === 1) {\n _z.x += 0.0001;\n } else {\n _z.z += 0.0001;\n }\n\n _z.normalize();\n _x.crossVectors(up, _z);\n }\n\n _x.normalize();\n _y.crossVectors(_z, _x);\n\n te[0] = _x.x;\n te[4] = _y.x;\n te[8] = _z.x;\n te[1] = _x.y;\n te[5] = _y.y;\n te[9] = _z.y;\n te[2] = _x.z;\n te[6] = _y.z;\n te[10] = _z.z;\n\n return this;\n }\n\n multiplyMatrices(a: Matrix4, b: Matrix4) {\n const ae = a.value;\n const be = b.value;\n const te = this.value;\n\n const a11 = ae[0];\n const a12 = ae[4];\n const a13 = ae[8];\n const a14 = ae[12];\n const a21 = ae[1];\n const a22 = ae[5];\n const a23 = ae[9];\n const a24 = ae[13];\n const a31 = ae[2];\n const a32 = ae[6];\n const a33 = ae[10];\n const a34 = ae[14];\n const a41 = ae[3];\n const a42 = ae[7];\n const a43 = ae[11];\n const a44 = ae[15];\n\n const b11 = be[0];\n const b12 = be[4];\n const b13 = be[8];\n const b14 = be[12];\n const b21 = be[1];\n const b22 = be[5];\n const b23 = be[9];\n const b24 = be[13];\n const b31 = be[2];\n const b32 = be[6];\n const b33 = be[10];\n const b34 = be[14];\n const b41 = be[3];\n const b42 = be[7];\n const b43 = be[11];\n const b44 = be[15];\n\n te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n return this;\n }\n\n multiply(m: Matrix4) {\n return this.multiplyMatrices(this, m);\n }\n\n premultiply(m: Matrix4) {\n return this.multiplyMatrices(m, this);\n }\n\n multiplyScalar(s: number) {\n this.m11 *= s;\n this.m12 *= s;\n this.m13 *= s;\n this.m14 *= s;\n this.m21 *= s;\n this.m22 *= s;\n this.m23 *= s;\n this.m24 *= s;\n this.m31 *= s;\n this.m32 *= s;\n this.m33 *= s;\n this.m34 *= s;\n return this;\n }\n\n /// 行列式\n determinant() {\n const te = this.value;\n\n const n11 = te[0];\n const n12 = te[4];\n const n13 = te[8];\n const n14 = te[12];\n const n21 = te[1];\n const n22 = te[5];\n const n23 = te[9];\n const n24 = te[13];\n const n31 = te[2];\n const n32 = te[6];\n const n33 = te[10];\n const n34 = te[14];\n const n41 = te[3];\n const n42 = te[7];\n const n43 = te[11];\n const n44 = te[15];\n\n //TODO: make this more efficient\n //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n return (\n n41 *\n (+n14 * n23 * n32 -\n n13 * n24 * n32 -\n n14 * n22 * n33 +\n n12 * n24 * n33 +\n n13 * n22 * n34 -\n n12 * n23 * n34) +\n n42 *\n (+n11 * n23 * n34 -\n n11 * n24 * n33 +\n n14 * n21 * n33 -\n n13 * n21 * n34 +\n n13 * n24 * n31 -\n n14 * n23 * n31) +\n n43 *\n (+n11 * n24 * n32 -\n n11 * n22 * n34 -\n n14 * n21 * n32 +\n n12 * n21 * n34 +\n n14 * n22 * n31 -\n n12 * n24 * n31) +\n n44 *\n (-n13 * n22 * n31 -\n n11 * n23 * n32 +\n n11 * n22 * n33 +\n n13 * n21 * n32 -\n n12 * n21 * n33 +\n n12 * n23 * n31)\n );\n }\n\n transpose() {\n const te = this.value;\n let tmp;\n\n tmp = te[1];\n te[1] = te[4];\n te[4] = tmp;\n tmp = te[2];\n te[2] = te[8];\n te[8] = tmp;\n tmp = te[6];\n te[6] = te[9];\n te[9] = tmp;\n\n tmp = te[3];\n te[3] = te[12];\n te[12] = tmp;\n tmp = te[7];\n te[7] = te[13];\n te[13] = tmp;\n tmp = te[11];\n te[11] = te[14];\n te[14] = tmp;\n\n return this;\n }\n\n setPosition(x: number, y: number, z: number): this;\n setPosition(x: Vector3): this;\n setPosition(x: Vector3 | number, y?: number, z?: number): this {\n const te = this.value;\n if (x instanceof Vector3) {\n te[12] = x.x;\n te[13] = x.y;\n te[14] = x.z;\n } else if (\n typeof x == \"number\" &&\n typeof y == \"number\" &&\n typeof z == \"number\"\n ) {\n te[12] = x;\n te[13] = y;\n te[14] = z;\n }\n return this;\n }\n\n /**\n * Inverts the matrix\n * -> based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n * -> based on https://github.com/mrdoob/three.js/blob/master/src/math/Matrix4.js\n */\n invert() {\n const te = this.value;\n const n11 = te[0];\n const n21 = te[1];\n const n31 = te[2];\n const n41 = te[3];\n const n12 = te[4];\n const n22 = te[5];\n const n32 = te[6];\n const n42 = te[7];\n const n13 = te[8];\n const n23 = te[9];\n const n33 = te[10];\n const n43 = te[11];\n const n14 = te[12];\n const n24 = te[13];\n const n34 = te[14];\n const n44 = te[15];\n const t11 =\n n23 * n34 * n42 -\n n24 * n33 * n42 +\n n24 * n32 * n43 -\n n22 * n34 * n43 -\n n23 * n32 * n44 +\n n22 * n33 * n44;\n const t12 =\n n14 * n33 * n42 -\n n13 * n34 * n42 -\n n14 * n32 * n43 +\n n12 * n34 * n43 +\n n13 * n32 * n44 -\n n12 * n33 * n44;\n const t13 =\n n13 * n24 * n42 -\n n14 * n23 * n42 +\n n14 * n22 * n43 -\n n12 * n24 * n43 -\n n13 * n22 * n44 +\n n12 * n23 * n44;\n const t14 =\n n14 * n23 * n32 -\n n13 * n24 * n32 -\n n14 * n22 * n33 +\n n12 * n24 * n33 +\n n13 * n22 * n34 -\n n12 * n23 * n34;\n\n const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n if (det === 0) {\n return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n\n const detInv = 1 / det;\n\n te[0] = t11 * detInv;\n te[1] =\n (n24 * n33 * n41 -\n n23 * n34 * n41 -\n n24 * n31 * n43 +\n n21 * n34 * n43 +\n n23 * n31 * n44 -\n n21 * n33 * n44) *\n detInv;\n te[2] =\n (n22 * n34 * n41 -\n n24 * n32 * n41 +\n n24 * n31 * n42 -\n n21 * n34 * n42 -\n n22 * n31 * n44 +\n n21 * n32 * n44) *\n detInv;\n te[3] =\n (n23 * n32 * n41 -\n n22 * n33 * n41 -\n n23 * n31 * n42 +\n n21 * n33 * n42 +\n n22 * n31 * n43 -\n n21 * n32 * n43) *\n detInv;\n\n te[4] = t12 * detInv;\n te[5] =\n (n13 * n34 * n41 -\n n14 * n33 * n41 +\n n14 * n31 * n43 -\n n11 * n34 * n43 -\n n13 * n31 * n44 +\n n11 * n33 * n44) *\n detInv;\n te[6] =\n (n14 * n32 * n41 -\n n12 * n34 * n41 -\n n14 * n31 * n42 +\n n11 * n34 * n42 +\n n12 * n31 * n44 -\n n11 * n32 * n44) *\n detInv;\n te[7] =\n (n12 * n33 * n41 -\n n13 * n32 * n41 +\n n13 * n31 * n42 -\n n11 * n33 * n42 -\n n12 * n31 * n43 +\n n11 * n32 * n43) *\n detInv;\n\n te[8] = t13 * detInv;\n te[9] =\n (n14 * n23 * n41 -\n n13 * n24 * n41 -\n n14 * n21 * n43 +\n n11 * n24 * n43 +\n n13 * n21 * n44 -\n n11 * n23 * n44) *\n detInv;\n te[10] =\n (n12 * n24 * n41 -\n n14 * n22 * n41 +\n n14 * n21 * n42 -\n n11 * n24 * n42 -\n n12 * n21 * n44 +\n n11 * n22 * n44) *\n detInv;\n te[11] =\n (n13 * n22 * n41 -\n n12 * n23 * n41 -\n n13 * n21 * n42 +\n n11 * n23 * n42 +\n n12 * n21 * n43 -\n n11 * n22 * n43) *\n detInv;\n\n te[12] = t14 * detInv;\n te[13] =\n (n13 * n24 * n31 -\n n14 * n23 * n31 +\n n14 * n21 * n33 -\n n11 * n24 * n33 -\n n13 * n21 * n34 +\n n11 * n23 * n34) *\n detInv;\n te[14] =\n (n14 * n22 * n31 -\n n12 * n24 * n31 -\n n14 * n21 * n32 +\n n11 * n24 * n32 +\n n12 * n21 * n34 -\n n11 * n22 * n34) *\n detInv;\n te[15] =\n (n12 * n23 * n31 -\n n13 * n22 * n31 +\n n13 * n21 * n32 -\n n11 * n23 * n32 -\n n12 * n21 * n33 +\n n11 * n22 * n33) *\n detInv;\n return this;\n }\n\n getMaxScaleOnAxis() {\n const te = this.value;\n const scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2];\n const scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6];\n const scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10];\n return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq));\n }\n\n makeTranslation(x: Vector3 | number, y?: number, z?: number) {\n if (x instanceof Vector3) {\n this.set(1, 0, 0, x.x, 0, 1, 0, x.y, 0, 0, 1, x.z, 0, 0, 0, 1);\n } else {\n this.set(1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1);\n }\n return this;\n }\n\n makeRotationX(theta: number) {\n const c = Math.cos(theta);\n const s = Math.sin(theta);\n this.set(1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1);\n return this;\n }\n\n makeRotationY(theta: number) {\n const c = Math.cos(theta);\n const s = Math.sin(theta);\n this.set(c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1);\n return this;\n }\n\n makeRotationZ(theta: number) {\n const c = Math.cos(theta);\n const s = Math.sin(theta);\n this.set(c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n return this;\n }\n\n makeRotationAxis(axis: Vector3, angle: number) {\n // Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const t = 1 - c;\n const x = axis.x;\n const y = axis.y;\n const z = axis.z;\n const tx = t * x;\n const ty = t * y;\n\n this.set(\n tx * x + c,\n tx * y - s * z,\n tx * z + s * y,\n 0,\n tx * y + s * z,\n ty * y + c,\n ty * z - s * x,\n 0,\n tx * z - s * y,\n ty * z + s * x,\n t * z * z + c,\n 0,\n 0,\n 0,\n 0,\n 1\n );\n\n return this;\n }\n\n makeScale(x: number, y: number, z: number) {\n this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);\n return this;\n }\n\n makeShear(\n xy: number,\n xz: number,\n yx: number,\n yz: number,\n zx: number,\n zy: number\n ) {\n this.set(1, yx, zx, 0, xy, 1, zy, 0, xz, yz, 1, 0, 0, 0, 0, 1);\n return this;\n }\n\n makePerspective(\n left: number,\n right: number,\n top: number,\n bottom: number,\n near: number,\n far: number,\n coordinateSystem = WebGLCoordinateSystem\n ) {\n const te = this.value;\n const x = (2 * near) / (right - left);\n const y = (2 * near) / (top - bottom);\n\n const a = (right + left) / (right - left);\n const b = (top + bottom) / (top - bottom);\n\n let c, d;\n\n if (coordinateSystem === WebGLCoordinateSystem) {\n c = -(far + near) / (far - near);\n d = (-2 * far * near) / (far - near);\n } else if (coordinateSystem === WebGPUCoordinateSystem) {\n c = -far / (far - near);\n d = (-far * near) / (far - near);\n } else {\n throw new Error(\n \"Matrix4.makePerspective(): Invalid coordinate system: \" +\n coordinateSystem\n );\n }\n\n te[0] = x;\n te[4] = 0;\n te[8] = a;\n te[12] = 0;\n te[1] = 0;\n te[5] = y;\n te[9] = b;\n te[13] = 0;\n te[2] = 0;\n te[6] = 0;\n te[10] = c;\n te[14] = d;\n te[3] = 0;\n te[7] = 0;\n te[11] = -1;\n te[15] = 0;\n\n return this;\n }\n\n makeOrthographic(\n left: number,\n right: number,\n top: number,\n bottom: number,\n near: number,\n far: number,\n coordinateSystem = WebGLCoordinateSystem\n ) {\n const te = this.value;\n const w = 1.0 / (right - left);\n const h = 1.0 / (top - bottom);\n const p = 1.0 / (far - near);\n\n const x = (right + left) * w;\n const y = (top + bottom) * h;\n\n let z, zInv;\n\n if (coordinateSystem === WebGLCoordinateSystem) {\n z = (far + near) * p;\n zInv = -2 * p;\n } else if (coordinateSystem === WebGPUCoordinateSystem) {\n z = near * p;\n zInv = -1 * p;\n } else {\n throw new Error(\n \"Matrix4.makeOrthographic(): Invalid coordinate system: \" +\n coordinateSystem\n );\n }\n\n te[0] = 2 * w;\n te[4] = 0;\n te[8] = 0;\n te[12] = -x;\n te[1] = 0;\n te[5] = 2 * h;\n te[9] = 0;\n te[13] = -y;\n te[2] = 0;\n te[6] = 0;\n te[10] = zInv;\n te[14] = -z;\n te[3] = 0;\n te[7] = 0;\n te[11] = 0;\n te[15] = 1;\n\n return this;\n }\n\n compose(position: Vector3, quaternion: Quaternion, scale: Vector3) {\n const te = this.value;\n\n const x = quaternion.x;\n const y = quaternion.y;\n const z = quaternion.z;\n const w = quaternion.w;\n const x2 = x + x;\n const y2 = y + y;\n const z2 = z + z;\n const xx = x * x2;\n const xy = x * y2;\n const xz = x * z2;\n const yy = y * y2;\n const yz = y * z2;\n const zz = z * z2;\n const wx = w * x2;\n const wy = w * y2;\n const wz = w * z2;\n\n const sx = scale.x;\n const sy = scale.y;\n const sz = scale.z;\n\n te[0] = (1 - (yy + zz)) * sx;\n te[1] = (xy + wz) * sx;\n te[2] = (xz - wy) * sx;\n te[3] = 0;\n\n te[4] = (xy - wz) * sy;\n te[5] = (1 - (xx + zz)) * sy;\n te[6] = (yz + wx) * sy;\n te[7] = 0;\n\n te[8] = (xz + wy) * sz;\n te[9] = (yz - wx) * sz;\n te[10] = (1 - (xx + yy)) * sz;\n te[11] = 0;\n\n te[12] = position.x;\n te[13] = position.y;\n te[14] = position.z;\n te[15] = 1;\n\n return this;\n }\n\n decompose(position: Vector3, quaternion: Quaternion, scale: Vector3) {\n const te = this.value;\n\n let sx = _v3.set(te[0], te[1], te[2]).length();\n const sy = _v3.set(te[4], te[5], te[6]).length();\n const sz = _v3.set(te[8], te[9], te[10]).length();\n\n // if determine is negative, we need to invert one scale\n const det = this.determinant();\n if (det < 0) sx = -sx;\n\n position.x = te[12];\n position.y = te[13];\n position.z = te[14];\n\n // scale the rotation part\n _m4.copy(this);\n\n const invSX = 1 / sx;\n const invSY = 1 / sy;\n const invSZ = 1 / sz;\n\n _m4.value[0] *= invSX;\n _m4.value[1] *= invSX;\n _m4.value[2] *= invSX;\n\n _m4.value[4] *= invSY;\n _m4.value[5] *= invSY;\n _m4.value[6] *= invSY;\n\n _m4.value[8] *= invSZ;\n _m4.value[9] *= invSZ;\n _m4.value[10] *= invSZ;\n\n quaternion.setFromRotationMatrix4(_m4);\n\n scale.x = sx;\n scale.y = sy;\n scale.z = sz;\n\n return this;\n }\n\n equals(matrix: Matrix4) {\n for (let i = 0; i < 16; i++) {\n if (this.value[i] !== matrix.value[i]) {\n return false;\n }\n }\n return true;\n }\n\n translate(x = 0, y = 0, z = 0) {\n return this.multiply(\n new Matrix4([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1])\n );\n }\n\n scale(x = 1, y = 1, z = 1) {\n return this.multiply(\n new Matrix4([x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1])\n );\n }\n\n scaleVector3(v: Vector3) {\n const te = this.value;\n const x = v.x;\n const y = v.y;\n const z = v.z;\n\n te[0] *= x;\n te[4] *= y;\n te[8] *= z;\n te[1] *= x;\n te[5] *= y;\n te[9] *= z;\n te[2] *= x;\n te[6] *= y;\n te[10] *= z;\n te[3] *= x;\n te[7] *= y;\n te[11] *= z;\n\n return this;\n }\n\n // rotate(degX = 0, degY = 0, degZ = 0) {\n // if (degZ) {\n // this.is3dSpecial = true;\n // }\n // const x = toRadian(degX);\n // const y = toRadian(degY);\n // const z = toRadian(degZ);\n // const a = Math.cos(x);\n // const b = Math.sin(x);\n // const c = Math.cos(y);\n // const d = Math.sin(y);\n // const e = Math.cos(z);\n // const f = Math.sin(z);\n // const ae = a * e;\n // const af = a * f;\n // const be = b * e;\n // const bf = b * f;\n // this.m11 = c * e;\n // this.m21 = -c * f;\n // this.m31 = d;\n // this.m12 = af + be * d;\n // this.m22 = ae - bf * d;\n // this.m32 = -b * c;\n // this.m13 = bf - ae * d;\n // this.m23 = be + af * d;\n // this.m33 = a * c;\n // return this;\n // }\n\n rotateX(degree: number) {\n const a = toRadian(degree);\n const c = Math.cos(a);\n const s = Math.sin(a);\n return this.multiply(\n // new Matrix4([1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1])\n new Matrix4([1, 0, 0, 0, 0, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1])\n );\n }\n\n rotateY(degree: number) {\n const a = toRadian(degree);\n const c = Math.cos(a);\n const s = Math.sin(a);\n return this.multiply(\n // new Matrix4([c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1])\n new Matrix4([c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1])\n );\n }\n\n /// this.multiply([c, s, -s, c, 0, 0]);\n rotateZ(degree: number) {\n this.is3dSpecial = true;\n const a = toRadian(degree);\n const c = Math.cos(a);\n const s = Math.sin(a);\n return this.multiply(\n // new Matrix4([c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1])\n new Matrix4([c, s, 0, 0, -s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1])\n );\n }\n\n skew(degX = 0, degY = 0, degZ = 0) {\n return this.multiply(\n new Matrix4([\n 1,\n 0,\n 0,\n toRadian(degX),\n 0,\n 1,\n 0,\n toRadian(degY),\n 0,\n 0,\n 1,\n toRadian(degZ),\n 0,\n 0,\n 0,\n 1\n ])\n );\n }\n\n perspective(perspective: number) {\n return this.multiply(\n new Matrix4([\n 1,\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n 0,\n 0,\n 0,\n 1,\n perspective ? -(1 / perspective) : 0,\n 0,\n 0,\n 0,\n 1\n ])\n );\n }\n\n // based on http://code.metager.de/source/xref/mozilla/B2G/gecko/gfx/thebes/gfx3DMatrix.cpp#651\n unproject(point: { x: number; y: number }) {\n let x = point.x * this.m11 + point.y * this.m21 + this.m41;\n let y = point.x * this.m12 + point.y * this.m22 + this.m42;\n let z = point.x * this.m13 + point.y * this.m23 + this.m43;\n let w = point.x * this.m14 + point.y * this.m24 + this.m44;\n\n let qx = x + this.m31;\n let qy = y + this.m32;\n let qz = z + this.m33;\n let qw = w + this.m34;\n\n if (w == 0) w = 0.0001;\n x /= w;\n y /= w;\n z /= w;\n\n if (qw == 0) qw = 0.0001;\n qx /= qw;\n qy /= qw;\n qz /= qw;\n\n // TODO: ....\n const wz = qz - z;\n if (wz == 0) {\n return { x, y, z, mass: w };\n }\n\n const t = -z / wz;\n x += t * (qx - x);\n y += t * (qy - y);\n\n return { x, y, z, mass: w };\n }\n\n // from homegeneous (euclid) to cartesian FLATTENED!!!! like a projection\n project(point: Point3D) {\n const z = point.z;\n let x = point.x * this.m11 + point.y * this.m21 + z * this.m31 + this.m41;\n let y = point.x * this.m12 + point.y * this.m22 + z * this.m32 + this.m42;\n let w = point.x * this.m14 + point.y * this.m24 + z * this.m34 + this.m44;\n\n if (w == 0) w = 0.0001;\n x /= w;\n y /= w;\n\n // lets call it \"hasenfuss\"\n // look at the developer tools of firefox and chrome ->\n // ff and chrome do it wrong: the highlighted bounding box failed to be correct\n // and getBoundingClientRect also\n\n // behind the \"camera\" (z > 0)\n if (w < 0) {\n x -= this.m41;\n y -= this.m42;\n x *= 1 / w;\n y *= 1 / w;\n x += this.m41;\n y += this.m42;\n }\n return { x, y, z, mass: w };\n }\n\n bounds(\n x: number,\n y: number,\n width: number,\n height: number\n ): { x: number; y: number; width: number; height: number } {\n const ptA = new Point3D({ x, y });\n const ptB = new Point3D({ x: x + width, y });\n const ptC = new Point3D({ x: x + width, y: y + height });\n const ptD = new Point3D({ x, y: y + height });\n\n ({ x: ptA.x, y: ptA.y, z: ptA.z, mass: ptA.mass } = this.project(ptA));\n ({ x: ptB.x, y: ptB.y, z: ptB.z, mass: ptB.mass } = this.project(ptB));\n ({ x: ptC.x, y: ptC.y, z: ptC.z, mass: ptC.mass } = this.project(ptC));\n ({ x: ptD.x, y: ptD.y, z: ptD.z, mass: ptD.mass } = this.project(ptD));\n\n const x2 = Math.min(ptA.x, ptB.x, ptC.x, ptD.x);\n const y2 = Math.min(ptA.y, ptB.y, ptC.y, ptD.y);\n const width2 = Math.max(ptA.x, ptB.x, ptC.x, ptD.x) - x2;\n const height2 = Math.max(ptA.y, ptB.y, ptC.y, ptD.y) - y2;\n\n return { x: x2, y: y2, width: width2, height: height2 };\n }\n}\n\nexport class Matrix {\n /// 按列顺序\n value: TMatrixValue;\n private _m13 = 0;\n private _m23 = 0;\n private _m33 = 1;\n\n matrix4: Matrix4;\n\n constructor(value: TMatrixValue = DEFAULT_MATRIX_VALUE) {\n this.value = Array.from(value) as TMatrixValue;\n this.matrix4 = this.toMatrix4();\n }\n\n get m11() {\n return this.value[0];\n }\n get m12() {\n return this.value[1];\n }\n get m13() {\n return this._m13;\n }\n get m21() {\n return this.value[2];\n }\n get m22() {\n return this.value[3];\n }\n get m23() {\n return this._m23;\n }\n get m31() {\n return this.value[4];\n }\n get m32() {\n return this.value[5];\n }\n get m33() {\n return this._m33;\n }\n\n set m11(v: number) {\n this.value[0] = v;\n }\n set m12(v: number) {\n this.value[1] = v;\n }\n set m13(v: number) {\n this._m13 = v;\n }\n set m21(v: number) {\n this.value[2] = v;\n }\n set m22(v: number) {\n this.value[3] = v;\n }\n set m23(v: number) {\n this._m23 = v;\n }\n set m31(v: number) {\n this.value[4] = v;\n }\n set m32(v: number) {\n this.value[5] = v;\n }\n set m33(v: number) {\n this._m33 = v;\n }\n\n // matrix(1, 0, 0, 1, -50, -50)\n static fromString(s: string) {\n const m = new Matrix();\n const results = regMatchAll(\"number\", s);\n if (results.length === 6) {\n results.forEach((result, index) => {\n if (result.fullMatch) {\n m.value[index] = parseFloat(result.fullMatch);\n }\n });\n }\n return m;\n }\n\n toMatrix4(matrix4 = this.matrix4) {\n const value: TMatrix4Value = [\n this.m11,\n this.m12,\n 0,\n this.m13,\n this.m21,\n this.m22,\n 0,\n this.m23,\n 0,\n 0,\n 1,\n 0,\n this.m31,\n this.m32,\n 0,\n this.m33\n ];\n if (matrix4) {\n matrix4.value = value;\n return matrix4;\n }\n return new Matrix4(value);\n }\n\n identity() {\n this.value = Array.from(DEFAULT_MATRIX_VALUE) as TMatrixValue;\n this.m13 = 0;\n this.m23 = 0;\n this.m33 = 1;\n this.matrix4 = this.toMatrix4();\n return this;\n }\n\n get isIdentity(): boolean {\n return (\n this.m11 == 1 &&\n this.m12 == 0 &&\n this.m13 == 0 &&\n this.m21 == 0 &&\n this.m22 == 1 &&\n this.m23 == 0 &&\n this.m31 == 0 &&\n this.m32 == 0 &&\n this.m33 == 1\n );\n }\n\n multiplyScalar(s: number) {\n this.m11 *= s;\n this.m12 *= s;\n this.m13 *= s;\n this.m21 *= s;\n this.m22 *= s;\n this.m23 *= s;\n this.m31 *= s;\n this.m32 *= s;\n this.m33 *= s;\n return this;\n }\n\n normalize() {\n const m33 = this.m33 || 0.0001;\n return this.multiplyScalar(1 / m33);\n }\n\n transformPoint(point: { x: number; y: number; z?: number }): {\n x: number;\n y: number;\n z: number;\n } {\n const z = point.z || 1;\n return {\n x: point.x * this.m11 + point.y * this.m21 + z * this.m31,\n y: point.x * this.m12 + point.y * this.m22 + z * this.m32,\n z: point.x * this.m13 + point.y * this.m23 + z * this.m33\n };\n }\n\n clone(): Matrix {\n return new Matrix(this.value);\n }\n\n multiply(matrix: Matrix | TMatrixValue) {\n const a = this.clone();\n const b = matrix instanceof Matrix ? matrix : new Matrix(matrix);\n this.m11 = b.m11 * a.m11 + b.m12 * a.m21 + b.m13 * a.m31;\n this.m12 = b.m11 * a.m12 + b.m12 * a.m22 + b.m13 * a.m32;\n this.m13 = b.m11 * a.m13 + b.m12 * a.m23 + b.m13 * a.m33;\n this.m21 = b.m21 * a.m11 + b.m22 * a.m21 + b.m23 * a.m31;\n this.m22 = b.m21 * a.m12 + b.m22 * a.m22 + b.m23 * a.m32;\n this.m23 = b.m21 * a.m13 + b.m22 * a.m23 + b.m23 * a.m33;\n this.m31 = b.m31 * a.m11 + b.m32 * a.m21 + b.m33 * a.m31;\n this.m32 = b.m31 * a.m12 + b.m32 * a.m22 + b.m33 * a.m32;\n this.m33 = b.m31 * a.m13 + b.m32 * a.m23 + b.m33 * a.m33;\n return this;\n }\n\n append(matrix: Matrix) {\n return this.multiply(matrix);\n }\n\n prepend(matrix: Matrix) {\n matrix.multiply(this);\n return this;\n }\n\n invert() {\n // const m11 = this.m11;\n // const m12 = this.m12;\n // const m21 = this.m21;\n // const m22 = this.m22;\n // const m31 = this.m31;\n // const m32 = this.m32;\n // const n = m11 * m22 - m12 * m21;\n // this.m11 = m22 / n;\n // this.m12 = -m12 / n;\n // this.m21 = -m21 / n;\n // this.m22 = m11 / n;\n // this.m31 = (m21 * m32 - m22 * m31) / n;\n // this.m32 = -(m11 * m32 - m12 * m31) / n;\n // this.m13 = 0;\n // this.m23 = 0;\n // this.m33 = 1;\n const a00 = this.m11;\n const a01 = this.m12;\n const a02 = this.m13;\n const a10 = this.m21;\n const a11 = this.m22;\n const a12 = this.m23;\n const a20 = this.m31;\n const a21 = this.m32;\n const a22 = this.m33;\n\n const b01 = a22 * a11 - a12 * a21;\n const b11 = -a22 * a10 + a12 * a20;\n const b21 = a21 * a10 - a11 * a20;\n\n // Calculate the determinant\n let det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) {\n return null;\n }\n det = 1.0 / det;\n\n this.m11 = b01 * det;\n this.m12 = (-a22 * a01 + a02 * a21) * det;\n this.m13 = (a12 * a01 - a02 * a11) * det;\n this.m21 = b11 * det;\n this.m22 = (a22 * a00 - a02 * a20) * det;\n this.m23 = (-a12 * a00 + a02 * a10) * det;\n this.m31 = b21 * det;\n this.m32 = (-a21 * a00 + a01 * a20) * det;\n this.m33 = (a11 * a00 - a01 * a10) * det;\n return this;\n }\n\n adjugate(): Matrix {\n const matrix = new Matrix();\n matrix.m11 = this.m22 * this.m33 - this.m32 * this.m23;\n matrix.m12 = this.m32 * this.m13 - this.m12 * this.m33;\n matrix.m13 = this.m12 * this.m23 - this.m22 * this.m13;\n matrix.m21 = this.m31 * this.m23 - this.m21 * this.m33;\n matrix.m22 = this.m11 * this.m33 - this.m31 * this.m13;\n matrix.m23 = this.m21 * this.m13 - this.m11 * this.m23;\n matrix.m31 = this.m21 * this.m32 - this.m31 * this.m22;\n matrix.m32 = this.m31 * this.m12 - this.m11 * this.m32;\n matrix.m33 = this.m11 * this.m22 - this.m21 * this.m12;\n return matrix;\n }\n\n split() {\n let degree = toDegree(Math.atan2(this.m12, this.m11));\n if (this.m11 < 0 && this.m22 >= 0) {\n degree += 180;\n }\n return {\n x: this.m31,\n y: this.m32,\n degree,\n scaleX: Math.sqrt(this.m11 * this.m11 + this.m12 * this.m12),\n scaleY: Math.sqrt(this.m21 * this.m21 + this.m22 * this.m22),\n skewX: toDegree(Math.atan2(-this.m21, this.m22)),\n skewY: toDegree(Math.atan2(this.m12, this.m11))\n };\n }\n\n getGroupCoords(group: Matrix) {\n // possible to replace with node * group.invert()\n const M = this.value[0],\n N = this.value[1],\n O = this.value[2],\n P = this.value[3],\n R = this.value[4],\n S = this.value[5],\n A = group.value[0],\n B = group.value[1],\n C = group.value[2],\n D = group.value[3],\n E = group.value[4],\n F = group.value[5],\n AD = A * D,\n BC = B * C,\n G = (C * N - M * D) / (BC - AD),\n H = (A * N - M * B) / (AD - BC),\n I = (C * P - O * D) / (BC - AD),\n J = (A * P - O * B) / (AD - BC),\n K = (C * (S - F) + D * (E - R)) / (BC - AD),\n L = (A * (S - F) + B * (E - R)) / (AD - BC);\n const matrix = [G, H, I, J, K, L];\n return new Matrix(matrix as TMatrixValue);\n }\n\n toString(fractionalDigits = 6) {\n if (this.matrix4.is2D()) {\n return `matrix(${this.value\n .map((v) => maxDotNumber(v, fractionalDigits))\n .join(\",\")})`;\n } else {\n return this.matrix4.toString();\n }\n }\n\n // toFilter() {\n // return (\n // \"progid:DXImageTransform.Microsoft.Matrix(M11=\" +\n // this.value[0] +\n // \", M12=\" +\n // this.value[2] +\n // \", M21=\" +\n // this.value[1] +\n // \", M22=\" +\n // this.value[3] +\n // \", Dx=\" +\n // this.value[4] +\n // \", Dy=\" +\n // this.value[5] +\n // \", sizingmethod='auto expand')\"\n // );\n // }\n\n // 相对值\n translate(x: number, y: number) {\n this.multiply([1, 0, 0, 1, x, y]);\n this.toMatrix4();\n return this;\n }\n // 绝对值\n translateTo(x: number, y: number) {\n return this.translate(x - this.m31, y - this.m32);\n }\n translateX(x: number) {\n return this.translate(x, 0);\n }\n translateXTo(x: number) {\n return this.translateTo(x, this.m32);\n }\n translateY(y: number) {\n return this.translate(0, y);\n }\n translateYTo(y: number) {\n return this.translateTo(this.m31, y);\n }\n translateZ(z: number) {\n this.matrix4.translate(0, 0, z);\n this.matrix4.toMatrix(this);\n return this;\n }\n translateZTo(z: number) {\n this.translateZ(z - this.matrix4.m43);\n return this;\n }\n translate3d(x: number, y: number, z: number) {\n this.matrix4.translate(x, y, z);\n this.matrix4.toMatrix(this);\n return this;\n }\n translate3dTo(x: number, y: number, z: number) {\n this.translate3d(\n x - this.matrix4.m41,\n y - this.matrix4.m42,\n z - this.matrix4.m43\n );\n return this;\n }\n\n rotate(deg: number, centerX = 0, centerY = 0) {\n const rad = toRadian(deg);\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n this.translate(centerX, centerY);\n this.multiply([c, s, -s, c, 0, 0]);\n this.translate(-centerX, -centerY);\n this.toMatrix4();\n return this;\n }\n rotateTo(targetDeg: number, centerX = 0, centerY = 0) {\n const { degree } = this.split();\n this.rotate(targetDeg - degree, centerX, centerY);\n return this;\n }\n rotateX(deg: number) {\n this.matrix4.rotateX(deg);\n this.matrix4.toMatrix(this);\n return this;\n }\n rotateXTo(targetDeg: number) {\n const { degreeX } = this.matrix4.split();\n this.rotateX(targetDeg - degreeX);\n return this;\n }\n rotateY(deg: number) {\n this.matrix4.rotateY(deg);\n this.matrix4.toMatrix(this);\n return this;\n }\n rotateYTo(targetDeg: number) {\n const { degreeY } = this.matrix4.split();\n this.rotateY(targetDeg - degreeY);\n return this;\n }\n rotateZ(deg: number) {\n this.matrix4.rotateZ(deg);\n // this.matrix4.rotate(0, 0, deg);\n this.matrix4.toMatrix(this);\n return this;\n }\n rotateZTo(targetDeg: number) {\n const { degreeZ } = this.matrix4.split();\n this.rotateZ(targetDeg - degreeZ);\n return this;\n }\n rotate3d(x: number, y: number, z: number) {\n // this.matrix4.rotate(x, y, z);\n this.matrix4.rotateX(x).rotateY(y).rotateZ(z);\n this.matrix4.toMatrix(this);\n return this;\n }\n rotate3dTo(targetX: number, targetY: number, targetZ: number) {\n const { degreeX, degreeY, degreeZ } = this.matrix4.split();\n this.rotate3d(targetX - degreeX, targetY - degreeY, targetZ - degreeZ);\n return this;\n }\n\n scale(sx: number, sy = sx, centerX = 0, centerY = 0) {\n this.translate(centerX, centerY);\n this.multiply([sx, 0, 0, sy, 0, 0]);\n this.translate(-centerX, -centerY);\n this.toMatrix4();\n return this;\n }\n scaleTo(targetSx: number, targetSy = targetSx, centerX = 0, centerY = 0) {\n return this.scale(\n targetSx / this.m11,\n targetSy / this.m22,\n centerX,\n centerY\n );\n }\n scaleX(sx: number) {\n return this.scale(sx, 1);\n }\n scaleXTo(sx: number) {\n return this.scale(sx / this.m11, 1);\n }\n scaleY(sy: number) {\n return this.scale(1, sy);\n }\n scaleYTo(sy: number) {\n return this.scale(1, sy / this.m22);\n }\n scaleZ(sz: number) {\n this.matrix4.scale(1, 1, sz);\n this.matrix4.toMatrix(this);\n return this;\n }\n scaleZTo(sz: number) {\n const { scalarZ } = this.matrix4.split();\n this.scaleZ(sz / scalarZ);\n return this;\n }\n scale3d(sx: number, sy = sx, sz = sx) {\n this.matrix4.scale(sx, sy, sz);\n this.matrix4.toMatrix(this);\n return this;\n }\n scale3dTo(sx: number, sy = sx, sz = sx) {\n const { scalarX, scalarY, scalarZ } = this.matrix4.split();\n this.scale3d(sx / scalarX, sy / scalarY, sz / scalarZ);\n return this;\n }\n\n skew(degX: number, degY = degX) {\n // const tx = Math.tan(toRadian(degX));\n // const ty = Math.tan(toRadian(degY));\n // this.multiply([1, ty, tx, 1, 0, 0]);\n this.multiply([\n Math.cos(toRadian(degY)),\n Math.sin(toRadian(degY)),\n -Math.sin(toRadian(degX)),\n Math.cos(toRadian(degX)),\n 0,\n 0\n ]);\n this.toMatrix4();\n return this;\n }\n skewTo(degX: number, degY = degX) {\n const { skewX, skewY } = this.split();\n return this.skew(degX - skewX, degY - skewY);\n }\n skewX(deg: number) {\n const { skewY } = this.split();\n return this.skew(deg, skewY);\n }\n skewXTo(deg: number) {\n const { skewY } = this.split();\n return this.skewTo(deg, skewY);\n }\n skewY(deg: number) {\n const { skewX } = this.split();\n return this.skew(skewX, deg);\n }\n skewYTo(deg: number) {\n const { skewX } = this.split();\n return this.skewTo(skewX, deg);\n }\n skewZ(deg: number) {\n /// UNDO\n return this;\n }\n skewZTo(deg: number) {\n /// UNDO\n return this;\n }\n skew3d(degx: number, degy: number, degz: number) {\n /// UNDO\n return this;\n }\n skew3dTo(degx: number, degy: number, degz: number) {\n /// UNDO\n return this;\n }\n\n perspective(perspective: number) {\n this.matrix4.perspective(perspective);\n this.matrix4.toMatrix(this);\n return this;\n }\n}\n\nexport default Matrix;\n\nconst _zero = new Vector3(0, 0, 0);\nconst _one = new Vector3(1, 1, 1);\nconst _x = new Vector3();\nconst _y = new Vector3();\nconst _z = new Vector3();\nconst _v3 = new Vector3();\nconst _m3 = new Matrix3();\nconst _m4 = new Matrix4();\n\n// 矩阵不满足交换律,所以顺序很重要\n// matrix(0.707106781,0.707106781,-0.707106781,0.707106781,-0.7071067810000002,34.648232269)\n// CSS transform: parseTransformToMatrix('rotate(45deg) translate(24px,25px)')\n// SVG Path d : parseTransformToMatrix('r 45 t 24,25')\n// SVG transform : parseTransformToMatrix('rotate(45) translate(24 25)')\n// translate(-50%, -50%) 暂不支持%\nexport function parseTransformToMatrix(t: string) {\n const matrix = new Matrix();\n t.replace(\n // /([a-z]+)\\(?([^)a-z]+)\\)?/gi,\n /([a-z0-9]+)\\s*\\(?\\s*((-?[0-9]*\\.?[0-9]+(?:e[-+]?\\d+)*[a-z%]*\\s*,?\\s*)+)\\)?/gi,\n function (all, command, matchString) {\n if (matchString.indexOf(\",\") >= 0) {\n matchString = matchString.split(/\\s*,\\s*/);\n } else {\n matchString = matchString.split(/\\s+/);\n }\n const values: number[] = [];\n for (let i = 0, count = matchString.length; i < count; i++) {\n if (matchString[i].trim()) {\n values.push(parseFloat(\"\" + matchString[i]));\n }\n }\n switch (command.toLowerCase()) {\n case \"t\":\n case \"translate\":\n matrix.translate(values[0], values[1]);\n break;\n case \"translatex\":\n matrix.translateX(values[0]);\n break;\n case \"translatey\":\n matrix.translateY(values[0]);\n break;\n case \"translatez\":\n matrix.translateZ(values[0]);\n break;\n case \"translate3d\":\n matrix.translate3d(values[0], values[1], values[2]);\n break;\n case \"r\":\n case \"rotate\":\n matrix.rotate(values[0], values[1] ?? 0, values[2] ?? 0);\n break;\n case \"rotatex\":\n matrix.rotateX(values[0]);\n break;\n case \"rotatey\":\n matrix.rotateY(values[0]);\n break;\n case \"rotatez\":\n matrix.rotateZ(values[0]);\n break;\n case \"rotate3d\":\n matrix.rotate3d(values[0], values[1], values[2]);\n break;\n case \"s\":\n case \"scale\":\n matrix.scale(values[0], values[1] ?? values[0]);\n break;\n case \"scalex\":\n matrix.scaleX(values[0]);\n break;\n case \"scaley\":\n matrix.scaleY(values[0]);\n break;\n case \"scalez\":\n matrix.scaleZ(values[0]);\n break;\n case \"scale3d\":\n matrix.scale3d(values[0], values[1], values[2]);\n break;\n case \"skew\":\n matrix.skew(values[0], values[1] ?? 0);\n break;\n case \"skewx\":\n matrix.skewX(values[0]);\n break;\n case \"skewy\":\n matrix.skewY(values[0]);\n break;\n case \"skewz\":\n matrix.skewZ(values[0]);\n break;\n case \"skew3d\":\n matrix.skew3d(values[0], values[1], values[2]);\n break;\n case \"m\":\n case \"matrix\":\n matrix.multiply([\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5]\n ]);\n matrix.toMatrix4();\n break;\n case \"matrix3d\":\n matrix.matrix4.multiply(new Matrix4(values as TMatrix4Value));\n matrix.matrix4.toMatrix(matrix);\n break;\n }\n return \"\";\n }\n );\n return matrix;\n}\n\nexport function rotatePoint(\n radian: number,\n pointX: number,\n pointY: number\n): { x: number; y: number } {\n const m = new Matrix();\n m.rotate(toDegree(radian));\n return m.transformPoint({ x: pointX, y: pointY });\n}\n\n// see https://developer.mozilla.org/en-US/docs/Web/API/DOMMatrix/DOMMatrix\nexport function getDOMMatrix(options?: {\n originMatrix?: string | number[];\n x?: number;\n y?: number;\n degree?: number;\n scalarX?: number;\n scalarY?: number;\n}): DOMMatrix {\n const x = typeof options?.x == \"number\" ? options?.x : 0;\n const y = typeof options?.y == \"number\" ? options?.y : 0;\n const degree = typeof options?.degree == \"number\" ? options?.degree : 0;\n const scalarX = typeof options?.scalarX == \"number\" ? options?.scalarX : 1;\n const scalarY = typeof options?.scalarY == \"number\" ? options?.scalarY : 1;\n const radian = toRadian(degree);\n const c = Math.cos(radian);\n const s = Math.sin(radian);\n const matrix = new DOMMatrix([\n c * scalarX,\n s * scalarX,\n -s * scalarY,\n c * scalarY,\n x,\n y\n ]);\n matrix.multiplySelf(new DOMMatrix(options?.originMatrix || \"\"));\n return matrix;\n}\n\n// ctx.beginPath();\n// ctx.fill(pathd)\nexport function transformPath2D(\n pathString: string,\n options?: {\n originMatrix?: string | number[];\n x?: number;\n y?: number;\n degree?: number;\n scalarX?: number;\n scalarY?: number;\n }\n): Path2D {\n // const x = typeof options?.x == \"number\" ? options?.x : 0;\n // const y = typeof options?.y == \"number\" ? options?.y : 0;\n // const degree = typeof options?.degree == \"number\" ? options?.degree : 0;\n // const scalarX = typeof options?.scalarX == \"number\" ? options?.scalarX : 1;\n // const scalarY = typeof options?.scalarY == \"number\" ? options?.scalarY : 1;\n // const path2d = new Path2D(pathString);\n // const t1 = new Path2D();\n // t1.addPath(path2d, new DOMMatrix(options?.originMatrix || \"\"));\n // t1.addPath(path2d);\n // const t2 = new Path2D();\n // const radian = toRadian(degree);\n // const c = Math.cos(radian);\n // const s = Math.sin(radian);\n // const matrix = new DOMMatrix([\n // c * scalarX,\n // s * scalarX,\n // -s * scalarY,\n // c * scalarY,\n // x,\n // y\n // ]);\n // t2.addPath(t1, matrix);\n // return t2;\n const path2d = new Path2D(pathString);\n const t = new Path2D();\n t.addPath(path2d, getDOMMatrix(options));\n return t;\n}\n","import { toKebab, type AnyElement, toCamel } from \"@zyzgroup/core-common\";\nimport { VNode } from \"../vnode\";\nimport { getVnode, scheduleVnode } from \"./useVnode\";\nimport { parseTransformToMatrix } from \"../math/Matrix\";\n\n////// window.getComputedStyle() 可能导致性能问题的一些因素:\n// 1. 计算成本:\n// getComputedStyle 涉及到遍历元素的所有 CSS 规则(包括层叠和继承),计算出每个属性的最终值\n// 对于复杂的 CSS 树结构、大量样式规则或频繁变动的动态样式,这种计算可能较为耗时,尤其是在大型或复杂的网页中\n// 2. DOM 访问:\n// 调用 getComputedStyle 通常伴随着 DOM 元素的访问。频繁地跨 DOM 查询元素,特别是深度嵌套或数量众多的元素,会增加 DOM 访问的成本,导致潜在的性能瓶颈\n// 3. 重排与重绘:\n// 如果 getComputedStyle 被触发在元素样式改变之后,且这些变化影响了布局(如尺寸、位置变化),浏览器可能需要进行重新布局(重排)和/或重新绘制\n// 这些操作通常是昂贵的,尤其是在没有优化的情况下连续触发\n// 4. 内存消耗:\n// getComputedStyle 返回一个 CSSStyleDeclaration 对象,它包含了元素所有计算后的样式属性\n// 频繁调用并保存这些对象可能会增加内存消耗,特别是在循环或定时器中持续查询多个元素时\n// 5. 阻塞主线程:\n// 如果在关键渲染路径(如页面加载或用户交互期间)中同步调用 getComputedStyle,可能会阻塞浏览器主线程,延迟其他重要任务(如脚本执行、布局、绘制等)的处理,从而影响页面响应速度和用户体验\n////// 为了缓解上述潜在的性能问题,可以采取以下策略:\n// 1. 缓存计算结果:如果可能,尽量避免对同一元素的样式进行重复查询。将 getComputedStyle 的结果缓存起来,只有当知道样式确实发生变更时才重新计算\n// 2. 批量处理:如果有多个元素需要查询样式,尝试一次性收集所有元素并批量调用 getComputedStyle,而不是逐个查询,以减少 DOM 访问和计算次数\n// 3. 使用事件监听:对于动态变化的样式,使用 MutationObserver 或相关的事件(如 transitionend、animationend)来监听样式变化,而不是频繁轮询\n// 4. 优化查询时机:\n// 4.1 避免在动画帧、滚动事件等高频率回调中无必要地调用 getComputedStyle\n// 4.2 尽量在微任务中执行,利用浏览器的异步更新机制,减少对主线程的阻塞\n// 5. 减少不必要的样式计算:\n// 5.1 精简 CSS 规则,避免过度复杂和冗余的样式\n// 5.2 使用 CSS Containment 属性(如 contain: layout)来限制样式计算的范围\n\n// 考虑替代方案:\n// 如果只需要检测特定样式属性的变化,可以尝试使用更轻量级的 API,如 elment.getBoundingClientRect()(获取布局信息)或 elment.classList.contains()(检查类名存在)等\n////// elment.getBoundingClientRect() 方法相对于 window.getComputedStyle() 在某些情况下可以被认为是一种性能优化的选择,主要是基于以下几个原因:\n// 1. 更有限的计算范围:\n// getComputedStyle 计算的是元素的所有计算样式属性,包括但不限于尺寸、颜色、字体、边框、定位、背景等,这涉及对整个 CSSOM(CSS Object Model)和样式层叠过程的遍历。\n// 而 getBoundingClientRect() 只关心元素在视口中的几何位置和尺寸(top, right, bottom, left, width, height),计算范围明显更为有限\n// 它直接从布局引擎获取已计算好的布局信息,无需处理样式层叠和解析等复杂过程,因此通常具有较低的计算成本\n// 2. 避免样式计算:\n// getBoundingClientRect() 不涉及样式计算,它返回的是浏览器已经完成布局后,元素在当前视口坐标系统下的实际位置和大小\n// 这意味着即使元素的样式发生变化,只要尚未触发布局更新,该方法的结果不会立即改变\n// 相比之下,getComputedStyle 需要实时反映样式变化,每次调用都可能触发样式计算\n// 3. 非阻塞性:\n// getBoundingClientRect() 不触发重排(reflow)或重绘(repaint)。它提供的信息是布局阶段的副产品,浏览器在渲染过程中已经计算好并存储了这些数据\n// 因此,调用此方法不会直接影响渲染流水线,避免了可能阻塞主线程的操作\n// 4. 更低的内存开销:\n// getComputedStyle 返回一个包含所有计算样式的 CSSStyleDeclaration 对象,如果频繁调用且不及时释放内存,可能会积累大量临时对象\n// 相反,getBoundingClientRect() 返回的是一个相对轻量的 DOMRect 对象,仅包含位置和尺寸信息,内存占用较小\n// 5. 适用场景明确:\n// 当仅需要获取元素的布局相关数据(如位置、尺寸)时,使用 getBoundingClientRect() 直接满足需求,无需处理与当前任务无关的其他样式信息\n// 针对性更强的方法使用可以避免不必要的计算和资源消耗\n// 6. 更好的跨浏览器兼容性:\n// getBoundingClientRect() 是一个历史悠久且广泛支持的 API,其性能表现和行为在各主流浏览器中通常更为一致,减少了因浏览器差异带来的潜在性能问题\n\n// 对外接口\nexport function getStyle(\n el: AnyElement | any,\n prop?: string,\n pseudo?: string // :before\n) {\n /// 利用 vnode 缓存 style\n const vnode = getVnode(el);\n vnode.props.style = vnode.props.style || {};\n if (!prop) {\n // read all\n // return atomReadStyles(el);\n return vnode.props.style;\n } else {\n // read single\n // return atomReadStyle(el, prop, pseudo);\n return (\n vnode.props.style[prop] ||\n vnode.props.style[toCamel(prop)] ||\n vnode.props.style[toKebab(prop)] ||\n \"\"\n );\n }\n}\n\n// 对外接口\nexport function setStyle(\n el: HTMLElement | any,\n prop: string | Record<string, string>,\n value?: string\n) {\n scheduleVnode(\n el,\n (vnode: VNode) => {\n vnode.props.style = vnode.props.style || {};\n if (typeof prop == \"string\" && value) {\n vnode.props.style[prop] = value;\n } else if (prop instanceof Object) {\n Object.keys(prop).forEach((key: string) => {\n vnode.props.style[key] = prop[key];\n });\n }\n },\n true\n );\n}\n\nexport function atomReadStyles(el: HTMLElement | any): Record<string, string> {\n const styles: Record<string, string> = {};\n if (getComputedStyle) {\n const s = getComputedStyle(el);\n for (let i = 0, n = s.length; i < n; i++) {\n styles[s[i]] = s.getPropertyValue(styles[i]);\n }\n } else {\n // IE\n const s = el.currentStyle;\n for (const prop in s) {\n styles[prop] = s[prop];\n }\n }\n if (el.style.cssText) {\n el.style.cssText\n .split(\";\")\n .filter((a: string) => !!a) // filter: non-empty\n .forEach((a: string) => {\n const [k, v] = a.split(\":\");\n if (k && v) {\n styles[k.trim()] = v.trim();\n }\n });\n }\n return styles;\n}\n\nexport function atomReadStyle(\n el: HTMLElement | any,\n prop: string,\n pseudo?: string // :before\n) {\n if (getComputedStyle) {\n prop = toKebab(prop);\n const style = getComputedStyle(el, pseudo);\n const priority = style.getPropertyPriority(prop);\n return (\n style.getPropertyValue(prop).trim() + (priority ? \"!\" + priority : \"\")\n );\n } else {\n return el.currentStyle[prop];\n }\n}\n\nexport function atomWriteStyle(\n el: HTMLElement | any,\n prop: string | Record<string, string>,\n value?: string\n) {\n if (typeof prop == \"string\" && value) {\n el.style.setProperty(\n toKebab(prop),\n value.replace(/!important/i, \"\"),\n String(value).toLowerCase().includes(\"!important\") ? \"important\" : \"\"\n );\n } else if (prop instanceof Object) {\n Object.keys(prop).forEach((key: string) => {\n atomWriteStyle(el, key, prop[key]);\n });\n }\n}\n\nexport function atomRemoveStyle(\n el: HTMLElement | any,\n prop: string | Record<string, string>\n) {\n if (typeof prop == \"string\") {\n el.style.removeProperty(toKebab(prop));\n } else {\n Object.keys(prop).forEach((key: string) => {\n atomRemoveStyle(el, key);\n });\n }\n}\n\n// `\n// :root {}\n// :host {}\n// `\n// :root, :host {\n// --color-primary: #5A82F0;\n// --linear-gradient-blue: linear-gradient(to right, #50c8fa, var(--color-primary));\n// --linear-gradient-red: linear-gradient(to right, #ff9696, var(--color-red));\n// --linear-gradient-green: linear-gradient(to right, #50f096, var(--color-green));\n// }\nexport function injectStyle(\n styleSheetInnerText: string,\n el?: AnyElement | string\n) {\n let dom: Element | ShadowRoot | null;\n if (typeof el === \"string\") {\n const shadowRoot = document.querySelector(el)?.shadowRoot;\n if (shadowRoot) {\n dom = shadowRoot;\n } else {\n dom = document.querySelector(el);\n }\n } else {\n dom = el || document.getElementsByTagName(\"head\")[0];\n }\n if (dom) {\n const style = document.createElement(\"style\");\n style.innerHTML = styleSheetInnerText;\n dom.appendChild(style);\n return () => {\n if (dom instanceof HTMLElement || dom instanceof ShadowRoot) {\n dom.removeChild(style);\n }\n };\n } else {\n // const sheet = new CSSStyleSheet();\n // sheet.replaceSync(`.color { color: pink }`);\n // host.shadowRoot.adoptedStyleSheets.push(sheet);\n const position = document.styleSheets[0].insertRule(styleSheetInnerText);\n return () => {\n document.styleSheets[0].deleteRule(position);\n };\n }\n}\n\n/// convert css transform to matrix together\nexport function combineTransformToMatrix(\n el: AnyElement,\n changeAttrs: Record<string, any>,\n originAttrs: Record<string, any> = {}\n): Record<string, string> {\n if (!Object.prototype.hasOwnProperty.call(originAttrs, \"transform\")) {\n Object.assign(originAttrs, {\n transform: getStyle(el, \"transform\") || \"\"\n });\n }\n const matrix = parseTransformToMatrix(originAttrs.transform);\n const toAttrs: Record<string, string> = {};\n for (const attrName in changeAttrs) {\n const attrValue = changeAttrs[attrName];\n switch (attrName) {\n case \"transform\":\n break;\n case \"translate\":\n matrix.translate(attrValue[0] || 0, attrValue[1] || 0);\n break;\n case \"translateTo\":\n matrix.translateTo(attrValue[0] || 0, attrValue[1] || 0);\n break;\n case \"translateX\":\n matrix.translateX(attrValue || 0);\n break;\n case \"translateXTo\":\n matrix.translateXTo(attrValue || 0);\n break;\n case \"translateY\":\n matrix.translateY(attrValue || 0);\n break;\n case \"translateYTo\":\n matrix.translateYTo(attrValue || 0);\n break;\n case \"translateZ\":\n matrix.translateZ(attrValue || 0);\n break;\n case \"translateZTo\":\n matrix.translateZTo(attrValue || 0);\n break;\n case \"translate3d\":\n matrix.translate3d(\n attrValue[0] || 0,\n attrValue[1] || 0,\n attrValue[2] || 0\n );\n break;\n case \"translate3dTo\":\n matrix.translate3dTo(\n attrValue[0] || 0,\n attrValue[1] || 0,\n attrValue[2] || 0\n );\n break;\n case \"rotate\":\n if (typeof attrValue == \"number\") {\n matrix.rotate(attrValue || 0);\n } else {\n matrix.rotate(\n attrValue[0] || 0,\n attrValue[1] || 0,\n attrValue[2] || 0\n );\n }\n break;\n case \"rotateTo\":\n if (typeof attrValue == \"number\") {\n matrix.rotateTo(attrValue || 0);\n } else {\n matrix.rotateTo(\n attrValue[0] || 0,\n attrValue[1] || 0,\n attrValue[2] || 0\n );\n }\n break;\n case \"rotateX\":\n matrix.rotateX(attrValue || 0);\n break;\n case \"rotateXTo\":\n matrix.rotateXTo(attrValue || 0);\n break;\n case \"rotateY\":\n matrix.rotateY(attrValue || 0);\n break;\n case \"rotateYTo\":\n matrix.rotateYTo(attrValue || 0);\n break;\n case \"rotateZ\":\n matrix.rotateZ(attrValue || 0);\n break;\n case \"rotateZTo\":\n matrix.rotateZTo(attrValue || 0);\n break;\n case \"rotate3d\":\n matrix.rotate3d(\n attrValue[0] || 0,\n attrValue[1] || 0,\n attrValue[2] || 0\n );\n break;\n case \"rotate3dTo\":\n matrix.rotate3dTo(\n attrValue[0] || 0,\n attrValue[1] || 0,\n attrValue[2] || 0\n );\n break;\n case \"scale\":\n if (typeof attrValue == \"number\") {\n matrix.scale(attrValue || 1);\n } else {\n matrix.scale(\n attrValue[0] || 1,\n attrValue[1] || 1,\n attrValue[2] || 0,\n attrValue[3] || 0\n );\n }\n break;\n case \"scaleTo\":\n if (typeof attrValue == \"number\") {\n matrix.scaleTo(attrValue || 1);\n } else {\n matrix.scaleTo(\n attrValue[0] || 1,\n attrValue[1] || 1,\n attrValue[2] || 0,\n attrValue[3] || 0\n );\n }\n break;\n case \"scaleX\":\n matrix.scaleX(attrValue || 1);\n break;\n case \"scaleXTo\":\n matrix.scaleXTo(attrValue || 1);\n break;\n case \"scaleY\":\n matrix.scaleY(attrValue || 1);\n break;\n case \"scaleYTo\":\n matrix.scaleYTo(attrValue || 1);\n break;\n case \"scaleZ\":\n matrix.scaleZ(attrValue || 1);\n break;\n case \"scaleZTo\":\n matrix.scaleZTo(attrValue || 1);\n break;\n case \"scale3d\":\n if (typeof attrValue == \"number\") {\n matrix.scale3d(attrValue || 1);\n } else {\n matrix.scale3d(\n attrValue[0] || 1,\n attrValue[1] || 1,\n attrValue[2] || 1\n );\n }\n break;\n case \"scale3dTo\":\n if (typeof attrValue == \"number\") {\n matrix.scale3dTo(attrValue || 1);\n } else {\n matrix.scale3dTo(\n attrValue[0] || 1,\n attrValue[1] || 1,\n attrValue[2] || 1\n );\n }\n break;\n case \"skew\":\n if (typeof attrValue == \"number\") {\n matrix.skew(attrValue || 0);\n } else {\n matrix.skew(attrValue[0] || 0, attrValue[1] || 0);\n }\n break;\n case \"skewTo\":\n if (typeof attrValue == \"number\") {\n matrix.skewTo(attrValue || 0);\n } else {\n matrix.skewTo(attrValue[0] || 0, attrValue[1] || 0);\n }\n break;\n case \"skewX\":\n matrix.skewX(attrValue || 0);\n break;\n case \"skewXTo\":\n matrix.skewXTo(attrValue || 0);\n break;\n case \"skewY\":\n matrix.skewY(attrValue || 0);\n break;\n case \"skewYTo\":\n matrix.skewYTo(attrValue || 0);\n break;\n case \"skewZ\":\n break;\n case \"skewZTo\":\n break;\n case \"skew3d\":\n break;\n case \"skew3dTo\":\n break;\n case \"perspective\":\n matrix.perspective(attrValue || 0);\n break;\n // 其他属性 opacity display ...\n default:\n if (!Object.prototype.hasOwnProperty.call(originAttrs, attrName)) {\n originAttrs[attrName] = getStyle(el, attrName);\n }\n Object.assign(toAttrs, {\n [attrName]: `${attrValue}`\n });\n break;\n }\n }\n Object.assign(toAttrs, {\n transform: matrix.toString()\n });\n return toAttrs;\n}\n\n// /// combine css transform together\n// function combineTransform(\n// changeAttrs: Record<string, any>,\n// unit = \"%\"\n// ): string {\n// let transform = \"\";\n// for (const attrName in changeAttrs) {\n// const attrValue = changeAttrs[attrName];\n// switch (attrName) {\n// case \"transform\":\n// transform += ` ${attrValue}`;\n// break;\n// case \"translate\":\n// if (typeof attrValue == \"number\") {\n// transform += ` translate(${attrValue}${unit})`;\n// } else {\n// transform += ` translate(${attrValue[0]}${unit}, ${attrValue[1]}${unit})`;\n// }\n// break;\n// case \"translateX\":\n// transform += ` translateX(${attrValue}${unit})`;\n// break;\n// case \"translateY\":\n// transform += ` translateY(${attrValue}${unit})`;\n// break;\n// case \"translateZ\":\n// transform += ` translateZ(${attrValue}${unit})`;\n// break;\n// case \"translate3d\":\n// transform += ` translate3d(${attrValue[0]}${unit}, ${attrValue[1]}${unit}, ${attrValue[2]}${unit})`;\n// break;\n// case \"rotate\":\n// transform += ` rotate(${attrValue}${unit})`;\n// break;\n// case \"rotateX\":\n// transform += ` rotateX(${attrValue}${unit})`;\n// break;\n// case \"rotateY\":\n// transform += ` rotateY(${attrValue}${unit})`;\n// break;\n// case \"rotateZ\":\n// transform += ` rotateZ(${attrValue}${unit})`;\n// break;\n// case \"rotate3d\":\n// transform += ` rotate3d(${attrValue[0]}${unit}, ${attrValue[1]}${unit}, ${attrValue[2]}${unit})`;\n// break;\n// case \"scale\":\n// if (typeof attrValue == \"number\") {\n// transform += ` scale(${attrValue}${unit})`;\n// } else {\n// transform += ` scale(${attrValue[0]}${unit}, ${attrValue[1]}${unit})`;\n// }\n// break;\n// case \"scaleX\":\n// transform += ` scaleX(${attrValue}${unit})`;\n// break;\n// case \"scaleY\":\n// transform += ` scaleY(${attrValue}${unit})`;\n// break;\n// case \"scaleZ\":\n// transform += ` scaleZ(${attrValue}${unit})`;\n// break;\n// case \"scale3d\":\n// transform += ` scale3d(${attrValue[0]}${unit}, ${attrValue[1]}${unit}, ${attrValue[2]}${unit})`;\n// break;\n// case \"skew\":\n// if (typeof attrValue == \"number\") {\n// transform += ` skew(${attrValue}${unit})`;\n// } else {\n// transform += ` skew(${attrValue[0]}${unit}, ${attrValue[1]}${unit})`;\n// }\n// break;\n// case \"skewX\":\n// transform += ` skewX(${attrValue}${unit})`;\n// break;\n// case \"skewY\":\n// transform += ` skewY(${attrValue}${unit})`;\n// break;\n// case \"skewZ\":\n// break;\n// case \"skewZTo\":\n// break;\n// case \"skew3d\":\n// break;\n// case \"skew3dTo\":\n// break;\n// }\n// }\n// return transform;\n// }\n","import { type AnyElement, toKebab } from \"@zyzgroup/core-common\";\nimport { VNode } from \"../vnode\";\nimport { scheduleVnode } from \"./useVnode\";\nimport { atomReadStyles } from \"./useStyle\";\n\n/// attribute 直接改变 HTML 的属性\n\n// 对外接口\nexport function useAttribute(\n el: AnyElement,\n prop?: string | Record<string, string>,\n value?: string\n) {\n /// read all\n if (prop === undefined && value === undefined) {\n return atomReadAttributes(el);\n }\n /// read single\n if (typeof prop == \"string\" && value === undefined) {\n return atomReadAttribute(el, prop);\n }\n let obj: Record<string, string> = {};\n if (typeof prop == \"object\") {\n /// write all\n obj = prop;\n } else if (typeof prop == \"string\" && typeof value == \"string\") {\n /// write single\n obj[prop] = \"\" + value;\n }\n /// 性能原因,el.setAttribute() 耗时久, 改为使用虚拟DOM\n // Object.entries(obj).forEach(([prop, val]) => {\n // el.setAttribute(toKebab(prop), val);\n // });\n scheduleVnode(el, (vnode: VNode) => {\n Object.entries(obj).forEach(([prop, val]) => {\n vnode.props[prop] = \"\" + val;\n });\n });\n}\n\nexport const domPrefixes = [\"-o-\", \"-ms-\", \"-moz-\", \"-webkit-\", \"\"];\n\nexport function atomReadAttributes(el: AnyElement) {\n const obj: Record<string, string | Record<string, string>> = {};\n for (let i = 0, attrs = el.attributes, n = attrs.length; i < n; i++) {\n const attr = attrs[i];\n if (attr.nodeName && attr.nodeValue) {\n if (attr.nodeName === \"style\") {\n obj[attr.nodeName] = atomReadStyles(el);\n } else {\n obj[attr.nodeName] = attr.nodeValue;\n }\n }\n }\n return obj;\n}\n\nexport function atomReadAttribute(el: AnyElement, prop: string) {\n if (prop === \"style\") {\n return atomReadStyles(el);\n } else {\n return el.getAttribute(toKebab(prop));\n }\n}\n\nexport function atomWriteAttribute(\n el: AnyElement,\n prop: string,\n value: string\n) {\n return el.setAttribute(toKebab(prop), \"\" + value);\n}\n\nexport function atomRemoveAttribute(el: AnyElement, attrs: string) {\n attrs.split(/[,\\s]+/i).forEach((attr) => {\n const a = toKebab(attr.trim());\n if (a != \"\") {\n el.removeAttribute(a);\n }\n });\n}\n","export function getScreenPosition() {\n return {\n screenWidth: window.screen.width,\n screenHeight: window.screen.height,\n screenX: window.screenX,\n screenY: window.screenY // window.screenY + (window.outerHeight - window.innerHeight)\n };\n}\n\n/// For any non-empty HTML document, documentElement will always be an <html> element.\n/// For any non-empty XML document, documentElement will always be whatever element is the root element of the document.\nexport function getDocumentElementPosition() {\n const el = document.documentElement;\n return {\n // 不包括边框大小,只包含内容和内边距\n clientWidth: el.clientWidth,\n clientHeight: el.clientHeight,\n clientTop: el.clientTop,\n clientLeft: el.clientLeft,\n\n // 元素的内容区域加上它的内边距再加上任何溢出内容的尺寸\n // 当内容没有溢出时,scrollWidth == clientWidth , scrollHeight == clientHeight\n // 当内容溢出时, scrollWidth > clientWidth , scrollHeight > clientHeight\n scrollWidth: el.scrollWidth,\n scrollHeight: el.scrollHeight,\n scrollTop: el.scrollTop,\n scrollLeft: el.scrollLeft,\n\n // 返回元素的实际大小,包括边框、内边距和滚动条\n offsetWidth: el.offsetWidth,\n offsetHeight: el.offsetHeight,\n offsetTop: el.offsetTop,\n offsetLeft: el.offsetLeft,\n\n offsetParent: el.offsetParent\n };\n}\n\n/// The Document.body property represents the <body> or <frameset> node of the current document, or null if no such element exists.\nexport function getBodyPosition() {\n const el = document.body;\n return {\n clientWidth: el.clientWidth,\n clientHeight: el.clientHeight,\n clientTop: el.clientTop,\n clientLeft: el.clientLeft,\n\n scrollWidth: el.scrollWidth,\n scrollHeight: el.scrollHeight,\n scrollTop: el.scrollTop,\n scrollLeft: el.scrollLeft,\n\n offsetWidth: el.offsetWidth,\n offsetHeight: el.offsetHeight,\n offsetTop: el.offsetTop,\n offsetLeft: el.offsetLeft,\n\n offsetParent: el.offsetParent\n };\n}\n\n/// 获取可视区域大小\nexport function getViewportSize() {\n if (typeof window.innerWidth === \"number\") {\n return {\n width: window.innerWidth,\n height: window.innerHeight\n };\n } else {\n // IE浏览器\n if (document.compatMode === \"CSS1Compat\") {\n // 标准模式\n return {\n width: document.documentElement.clientWidth,\n height: document.documentElement.clientHeight\n };\n } else {\n // 怪异模式\n return {\n width: document.body.clientWidth,\n height: document.body.clientHeight\n };\n }\n }\n}\n\n/// 获取页面整体大小\nexport function getPageSize() {\n const { scrollWidth, scrollHeight } = getDocumentElementPosition();\n // const contentWidth =\n // [...document.body.children].reduce(\n // (a, el) => Math.max(a, el.getBoundingClientRect().right),\n // 0\n // ) - document.body.getBoundingClientRect().x;\n return {\n // width: Math.min(scrollWidth, contentWidth),\n width: scrollWidth,\n height: scrollHeight\n };\n}\n\nexport function getElementPositionInPage(\n el: HTMLElement | SVGElement | Element\n) {\n const { top, left, width, height } = el.getBoundingClientRect();\n const { scrollLeft, scrollTop } = getDocumentElementPosition();\n return {\n x: left + scrollLeft,\n y: top + scrollTop,\n width,\n height\n };\n}\n\nexport function getElementPositionInPage2(el: HTMLElement) {\n let elem: HTMLElement | null = el;\n let actualLeft = 0;\n let actualTop = 0;\n while (elem !== null) {\n actualLeft += elem.offsetLeft;\n actualTop += elem.offsetTop;\n if (elem.offsetParent instanceof HTMLElement) {\n elem = elem.offsetParent;\n } else {\n elem = null;\n }\n }\n return {\n x: actualLeft,\n y: actualTop,\n width: el.offsetWidth,\n height: el.offsetHeight\n };\n}\n\nexport function getElementPositionInViewport(el: HTMLElement) {\n return el.getBoundingClientRect();\n}\n\nexport function getRelativeBoundingClientRect(child: HTMLElement) {\n const childRect = child.getBoundingClientRect();\n return {\n x: child.offsetLeft,\n y: child.offsetTop,\n width: childRect.width || childRect.right - childRect.left,\n height: childRect.height || childRect.bottom - childRect.top\n };\n}\n\nexport function getVerticalScrollPercentInPage() {\n const { clientHeight, scrollTop, scrollHeight } =\n getDocumentElementPosition();\n const height = scrollHeight - clientHeight;\n const percent = height <= 0 ? 0 : (scrollTop / height) * 100;\n return percent;\n}\n","import { AnyElement, clamp } from \"@zyzgroup/core-common\";\nimport {\n getDocumentElementPosition,\n getElementPositionInPage,\n getElementPositionInViewport\n} from \"../position\";\n\nexport type MousePoint = {\n x: number;\n y: number;\n dx: number;\n dy: number;\n dStartX: number;\n dStartY: number;\n isDown: boolean; // 是否已按下\n};\n\nexport function useMousePoint() {\n const startMousePoint: MousePoint = {\n x: 0,\n y: 0,\n dx: 0,\n dy: 0,\n dStartX: 0,\n dStartY: 0,\n isDown: false\n };\n\n const currentMousePoint: MousePoint = {\n x: 0,\n y: 0,\n dx: 0,\n dy: 0,\n dStartX: 0,\n dStartY: 0,\n isDown: false\n };\n\n return {\n mousePoint: currentMousePoint,\n\n setStartMousePoint: function (\n p: { x: number; y: number },\n isDown?: boolean\n ) {\n startMousePoint.x = p.x;\n startMousePoint.y = p.y;\n if (typeof isDown == \"boolean\") {\n startMousePoint.isDown = isDown;\n }\n this.setCurrentMousePoint(p, isDown);\n },\n\n setCurrentMousePoint: (p: { x: number; y: number }, isDown?: boolean) => {\n const prevX = currentMousePoint.x;\n const prevY = currentMousePoint.y;\n currentMousePoint.x = p.x;\n currentMousePoint.y = p.y;\n currentMousePoint.dx = currentMousePoint.x - prevX;\n currentMousePoint.dy = currentMousePoint.y - prevY;\n currentMousePoint.dStartX = currentMousePoint.x - startMousePoint.x;\n currentMousePoint.dStartY = currentMousePoint.y - startMousePoint.y;\n if (typeof isDown == \"boolean\") {\n currentMousePoint.isDown = isDown;\n }\n }\n };\n}\n\n////////////////////// Mouse 或 Touch 或 Pointer 或 hammer //////////////////////\n\nexport type MousePointEvent = MouseEvent | Touch | PointerEvent | HammerInput;\n\nexport function getMousePositionInViewport(ev: MousePointEvent) {\n if (\"center\" in ev) {\n const center = (ev as HammerInput).center;\n const rect = getElementPositionInViewport(ev.target);\n return {\n x: center.x - rect.x,\n y: center.y - rect.y\n };\n }\n return {\n x: ev.clientX,\n y: ev.clientY\n };\n}\n\nexport function getMousePositionInPage(ev: MousePointEvent) {\n if (\"center\" in ev) {\n return (ev as HammerInput).center;\n }\n if (typeof ev.pageX == \"number\" && typeof ev.pageY == \"number\") {\n return {\n x: ev.pageX,\n y: ev.pageY\n };\n }\n const { scrollLeft, scrollTop } = getDocumentElementPosition();\n return {\n x: ev.clientX + scrollLeft,\n y: ev.clientY + scrollTop\n };\n}\n\nexport function getMousePositionInElement(\n ev: MousePointEvent,\n element?: AnyElement\n) {\n const r = {\n x: 0,\n y: 0\n };\n if (!element) {\n /// 原 offset 只是相对于直接父类\n let fixedOffsetX = 0;\n let fixedOffsetY = 0;\n if (\n \"currentTarget\" in ev &&\n ev.currentTarget &&\n ev.target &&\n ev.currentTarget != ev.target\n // ev.target: Refers to the actual element where the event occurred\n // ev.currentTarget: Refers to the element to which the event handler is attached\n ) {\n const currentTargetRect = (\n ev.currentTarget as AnyElement\n ).getBoundingClientRect();\n const targetRect = (ev.target as AnyElement).getBoundingClientRect();\n fixedOffsetX = targetRect.left - currentTargetRect.left;\n fixedOffsetY = targetRect.top - currentTargetRect.top;\n }\n if (\"offsetX\" in ev) {\n r.x = ev.offsetX + fixedOffsetX;\n r.y = ev.offsetY + fixedOffsetY;\n } else {\n const mouse = getMousePositionInPage(ev);\n const p = getElementPositionInPage(ev.target as AnyElement);\n r.x = clamp(mouse.x - p.x + fixedOffsetX, 0, p.width);\n r.y = clamp(mouse.y - p.y + fixedOffsetY, 0, p.height);\n }\n } else {\n const mouse = getMousePositionInPage(ev);\n const p = getElementPositionInPage(element);\n r.x = clamp(mouse.x - p.x, 0, p.width);\n r.y = clamp(mouse.y - p.y, 0, p.height);\n }\n return r;\n}\n","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.<anonymous>\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n","import { type AnyElement } from \"@zyzgroup/core-common\";\nimport { useEventListener } from \"./useEventListener\";\n\nexport async function useResize(el: AnyElement, cb: (r: DOMRect) => void) {\n return new Promise<() => void>((resolve) => {\n const observer = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n // const rect = el.getBoundingClientRect();\n const entry = entries[0];\n // const { width, height, left, right, top, bottom, x, y } = entry.contentRect;\n const rect = entry.contentRect;\n cb(rect);\n resolve(() => {\n observer.unobserve(el);\n });\n });\n observer.observe(el);\n });\n}\n\nexport function useWindowResize(cb: (width: number, height: number) => void) {\n cb(window.innerWidth, window.innerHeight);\n return useEventListener(\n window,\n \"orientationchange\" in window ? \"orientationchange\" : \"resize\",\n (e: Event | UIEvent) => {\n const width = (e.target as Window).innerWidth;\n const height = (e.target as Window).innerHeight;\n cb(width, height);\n }\n );\n}\n","import { ElementEventBusController } from \"./useElementEventBus\";\nimport { MousePointEvent } from \"./useMouse\";\nimport { isTouchSupport } from \"../env\";\n\ntype Options = {\n start?: (e: MousePointEvent) => void;\n move?: (e: MousePointEvent) => void;\n end?: (e: MousePointEvent) => void;\n};\n\nexport function usePressDownMove(\n controller: ElementEventBusController,\n options?: Options\n): () => void {\n return usePressDownMoveWithPointer(controller, options);\n // if (isTouchSupport()) {\n // return usePressDownMoveWithTouch(controller, options);\n // } else {\n // return usePressDownMoveWithMouse(controller, options);\n // }\n}\n\nexport function usePressDownMoveWithPointer(\n controller: ElementEventBusController,\n options?: Options\n): () => void {\n const eb = controller.eb;\n\n const start = (e: PointerEvent) => {\n // e.preventDefault();\n // e.stopPropagation();\n eb.on(\"pointerMove\", move);\n eb.on(\"pointerUp\", end);\n eb.on(\"pointerCancel\", end);\n options?.start?.(e);\n };\n\n const end = (e: PointerEvent) => {\n // e.preventDefault();\n // e.stopPropagation();\n eb.off(\"pointerMove\", move);\n eb.off(\"pointerUp\", end);\n eb.off(\"pointerCancel\", end);\n options?.end?.(e);\n };\n\n const move = (e: PointerEvent) => {\n // e.preventDefault();\n // e.stopPropagation();\n options?.move?.(e);\n };\n\n eb.on(\"pointerDown\", start);\n\n return () => eb.off(\"pointerDown\", start);\n}\n\nexport function usePressDownMoveWithMouse(\n controller: ElementEventBusController,\n options?: Options\n): () => void {\n const eb = controller.eb;\n\n const start = (e: MouseEvent) => {\n // e.preventDefault();\n // e.stopPropagation();\n document.addEventListener(\"mousemove\", move, false);\n document.addEventListener(\"mouseup\", end, false);\n options?.start?.(e);\n };\n\n const end = (e: MouseEvent) => {\n // e.preventDefault();\n // e.stopPropagation();\n document.removeEventListener(\"mousemove\", move, false);\n document.removeEventListener(\"mouseup\", end, false);\n options?.end?.(e);\n };\n\n const move = (e: MouseEvent) => {\n // e.preventDefault();\n // e.stopPropagation();\n options?.move?.(e);\n };\n\n eb.on(\"mouseDown\", start);\n\n return () => eb.off(\"mouseDown\", start);\n}\n\nexport function usePressDownMoveWithTouch(\n controller: ElementEventBusController,\n options?: Options\n): () => void {\n const eb = controller.eb;\n\n const start = (e: TouchEvent) => {\n // e.preventDefault();\n // e.stopPropagation();\n eb.on(\"touchMove\", move);\n eb.on(\"touchEnd\", end);\n eb.on(\"touchCancel\", end);\n const touch = e.changedTouches[0]; // first touch\n options?.start?.(touch);\n };\n\n const end = (e: TouchEvent) => {\n // e.preventDefault();\n // e.stopPropagation();\n eb.off(\"touchMove\", move);\n eb.off(\"touchEnd\", end);\n eb.off(\"touchCancel\", end);\n const touch = e.changedTouches[0]; // first touch\n options?.end?.(touch);\n };\n\n const move = (e: TouchEvent) => {\n // e.preventDefault();\n // e.stopPropagation();\n const touch = e.changedTouches[0]; // first touch\n options?.move?.(touch);\n };\n\n eb.on(\"touchStart\", start);\n\n return () => eb.off(\"touchStart\", start);\n}\n","import { EventBus, EventBusListeners } from \"@zyzgroup/core-common\";\nimport Hammer from \"hammerjs\";\nimport { useEventListener } from \"./useEventListener\";\nimport { getMousePositionInElement, useMousePoint } from \"./useMouse\";\nimport { useResize } from \"./useResize\";\nimport { usePressDownMove } from \"./usePressDownMove\";\nimport { isTouchSupport } from \"../env\";\n\ndeclare const document: Document & {\n attachEvent: any;\n createEventObject: any;\n onmousewheel: any;\n};\n\nexport interface ElementEventBusListeners extends EventBusListeners {\n mouseDown(e: MouseEvent): void;\n mouseUp(e: MouseEvent): void;\n mouseMove(e: MouseEvent): void;\n mouseOver(e: MouseEvent): void;\n mouseOut(e: MouseEvent): void;\n mouseEnter(e: MouseEvent): void;\n mouseLeave(e: MouseEvent): void;\n mouseClick(e: MouseEvent): void;\n mouseDoubleClick(e: MouseEvent): void;\n mouseWheel(e: WheelEvent): void;\n mouseContextMenu(e: MouseEvent): void;\n\n touchStart(e: TouchEvent): void;\n touchEnd(e: TouchEvent): void;\n touchCancel(e: TouchEvent): void;\n touchMove(e: TouchEvent): void;\n\n pointerDown(e: PointerEvent): void;\n pointerUp(e: PointerEvent): void;\n pointerCancel(e: PointerEvent): void;\n pointerMove(e: PointerEvent): void;\n\n /// https://hammerjs.github.io/\n // Pan : Recognized when the pointer is down and moved in the allowed direction.\n pan(e: HammerInput): void;\n panStart(e: HammerInput): void;\n panMove(e: HammerInput): void;\n panEnd(e: HammerInput): void;\n panCancel(e: HammerInput): void;\n panLeft(e: HammerInput): void;\n panRight(e: HammerInput): void;\n panUp(e: HammerInput): void;\n panDown(e: HammerInput): void;\n\n // Pinch : Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n pinch(e: HammerInput): void;\n\n // Press : Recognized when the pointer is down for x ms without any movement.\n press(e: HammerInput): void;\n\n // Rotate : Recognized when two or more pointer are moving in a circular motion.\n rotate(e: HammerInput): void;\n\n // Swipe : Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n swipe(e: HammerInput): void;\n swipeLeft(e: HammerInput): void;\n swipeRight(e: HammerInput): void;\n swipeUp(e: HammerInput): void;\n swipeDown(e: HammerInput): void;\n\n // Tap : Recognized when the pointer is doing a small tap/click.\n tap(e: HammerInput): void;\n\n // 在 el 之外点击\n tapOutSide(e: Event): void;\n\n transitionstart(e: TransitionEvent): void;\n transitionend(e: TransitionEvent): void;\n animationstart(e: AnimationEvent): void;\n animationend(e: AnimationEvent): void;\n\n resize: (rect: DOMRect) => void;\n}\n\nexport type ElementEventBus = EventBus<ElementEventBusListeners>;\n\nexport type ElementEventBusController = ReturnType<typeof useElementEventBus>;\n\nexport function useElementEventBus(el: HTMLElement = document.documentElement) {\n const eb = new EventBus<ElementEventBusListeners>();\n const hammer = new Hammer(el);\n let removes: (() => void)[] = [];\n\n const ump = useMousePoint();\n const mousePoint = ump.mousePoint;\n\n const mouseDown = (e: MouseEvent) => {\n // 影响性能\n // el.style.userSelect = \"none\"; // if there's text\n eb.emit(\"mouseDown\", e);\n };\n const mouseUp = (e: MouseEvent) => {\n // 影响性能\n // el.style.userSelect = \"\";\n eb.emit(\"mouseUp\", e);\n };\n const mouseMove = (e: MouseEvent) => {\n if (!mousePoint.isDown) {\n ump.setCurrentMousePoint(getMousePositionInElement(e, el));\n }\n eb.emit(\"mouseMove\", e);\n };\n /// 如果触发的元素内部有其他的元素的时候当鼠标移上的时候会反复的触发 mouseover 和 mouseout 事件\n /// 因为内部元素在鼠标移上的时候会向它的父对象派发事件,所以外面元素相当于也触发了mouseover 事件\n const mouseOver = (e: MouseEvent) => {\n eb.emit(\"mouseOver\", e);\n };\n const mouseOut = (e: MouseEvent) => {\n eb.emit(\"mouseOut\", e);\n };\n const mouseEnter = (e: MouseEvent) => {\n eb.emit(\"mouseEnter\", e);\n };\n const mouseLeave = (e: MouseEvent) => {\n eb.emit(\"mouseLeave\", e);\n };\n const mouseClick = (e: MouseEvent) => {\n eb.emit(\"mouseClick\", e);\n };\n const mouseDoubleClick = (e: MouseEvent) => {\n eb.emit(\"mouseDoubleClick\", e);\n };\n const mouseWheel = (e: WheelEvent) => {\n // const delta = e.deltaY || -e.wheelDelta || e.detail;\n eb.emit(\"mouseWheel\", e);\n };\n const mouseContextMenu = (e: MouseEvent) => {\n eb.emit(\"mouseContextMenu\", e);\n };\n\n const touchStart = (e: TouchEvent) => {\n // const touch = e.changedTouches[0]; // first touch\n eb.emit(\"touchStart\", e);\n };\n const touchEnd = (e: TouchEvent) => {\n // const touch = e.changedTouches[0]; // first touch\n eb.emit(\"touchEnd\", e);\n };\n const touchCancel = (e: TouchEvent) => {\n // const touch = e.changedTouches[0]; // first touch\n eb.emit(\"touchCancel\", e);\n };\n const touchMove = (e: TouchEvent) => {\n // e.preventDefault(); // prevent scroll\n const touch = e.changedTouches[0]; // first touch\n if (!mousePoint.isDown) {\n ump.setCurrentMousePoint(getMousePositionInElement(touch, el));\n }\n eb.emit(\"touchMove\", e);\n };\n\n const pointerDown = (e: PointerEvent) => {\n // el.setPointerCapture(e.pointerId); // 捕获后续 pointermove / pointerup\n eb.emit(\"pointerDown\", e);\n };\n const pointerUp = (e: PointerEvent) => {\n // el.releasePointerCapture(e.pointerId);\n eb.emit(\"pointerUp\", e);\n };\n const pointerCancel = (e: PointerEvent) => {\n // el.releasePointerCapture(e.pointerId);\n eb.emit(\"pointerCancel\", e);\n };\n const pointerMove = (e: PointerEvent) => {\n eb.emit(\"pointerMove\", e);\n };\n\n const pan = (e: HammerInput) => {\n eb.emit(\"pan\", e);\n };\n const panStart = (e: HammerInput) => {\n eb.emit(\"panStart\", e);\n };\n const panMove = (e: HammerInput) => {\n eb.emit(\"panMove\", e);\n };\n const panEnd = (e: HammerInput) => {\n eb.emit(\"panEnd\", e);\n };\n const panCancel = (e: HammerInput) => {\n eb.emit(\"panCancel\", e);\n };\n const panLeft = (e: HammerInput) => {\n eb.emit(\"panLeft\", e);\n };\n const panRight = (e: HammerInput) => {\n eb.emit(\"panRight\", e);\n };\n const panUp = (e: HammerInput) => {\n eb.emit(\"panUp\", e);\n };\n const panDown = (e: HammerInput) => {\n eb.emit(\"panDown\", e);\n };\n\n const pinch = (e: HammerInput) => {\n eb.emit(\"pinch\", e);\n };\n\n const press = (e: HammerInput) => {\n eb.emit(\"press\", e);\n };\n\n const rotate = (e: HammerInput) => {\n eb.emit(\"rotate\", e);\n };\n\n const swipe = (e: HammerInput) => {\n eb.emit(\"swipe\", e);\n };\n const swipeLeft = (e: HammerInput) => {\n eb.emit(\"swipeLeft\", e);\n };\n const swipeRight = (e: HammerInput) => {\n eb.emit(\"swipeRight\", e);\n };\n const swipeUp = (e: HammerInput) => {\n eb.emit(\"swipeUp\", e);\n };\n const swipeDown = (e: HammerInput) => {\n eb.emit(\"swipeDown\", e);\n };\n\n const tap = (e: HammerInput) => {\n eb.emit(\"tap\", e);\n };\n\n const tapOutSide = (e: Event) => {\n if (!e.target || el == e.target || el.contains(e.target as Node)) {\n return;\n }\n eb.emit(\"tapOutSide\", e);\n };\n\n const transitionstart = (e: TransitionEvent) => {\n eb.emit(\"transitionstart\", e);\n };\n const transitionend = (e: TransitionEvent) => {\n eb.emit(\"transitionend\", e);\n };\n const animationstart = (e: AnimationEvent) => {\n eb.emit(\"animationstart\", e);\n };\n const animationend = (e: AnimationEvent) => {\n eb.emit(\"animationend\", e);\n };\n\n let _rect = {\n ...el.getBoundingClientRect(),\n width: el.offsetWidth,\n height: el.offsetHeight\n };\n\n return {\n el,\n get rect() {\n return _rect;\n },\n mousePoint,\n eb,\n start: async function () {\n removes.push(useEventListener(el, \"mousedown\", mouseDown));\n removes.push(useEventListener(el, \"mouseup\", mouseUp));\n removes.push(useEventListener(el, \"mousemove\", mouseMove));\n removes.push(useEventListener(el, \"mouseover\", mouseOver));\n removes.push(useEventListener(el, \"mouseout\", mouseOut));\n removes.push(useEventListener(el, \"mouseenter\", mouseEnter));\n removes.push(useEventListener(el, \"mouseleave\", mouseLeave));\n removes.push(useEventListener(el, \"click\", mouseClick));\n removes.push(useEventListener(el, \"dblclick\", mouseDoubleClick));\n removes.push(\n useEventListener(\n el,\n \"onwheel\" in document.createElement(\"div\")\n ? \"wheel\" // modern browsers\n : document.onmousewheel !== undefined\n ? \"mousewheel\" // Webkit and IE\n : \"DOMMouseScroll\", // older Firefox\n mouseWheel\n )\n );\n removes.push(useEventListener(el, \"contextmenu\", mouseContextMenu));\n\n removes.push(useEventListener(el, \"touchstart\", touchStart));\n removes.push(useEventListener(el, \"touchend\", touchEnd));\n removes.push(useEventListener(el, \"touchcancel\", touchCancel));\n removes.push(useEventListener(el, \"touchmove\", touchMove));\n\n removes.push(useEventListener(el, \"pointerdown\", pointerDown));\n removes.push(useEventListener(el, \"pointerup\", pointerUp));\n removes.push(useEventListener(el, \"pointercancel\", pointerCancel));\n removes.push(useEventListener(el, \"pointermove\", pointerMove));\n\n hammer.on(\"pan\", pan);\n hammer.on(\"panstart\", panStart);\n hammer.on(\"panmove\", panMove);\n hammer.on(\"panend\", panEnd);\n hammer.on(\"pancancel\", panCancel);\n hammer.on(\"panleft\", panLeft);\n hammer.on(\"panright\", panRight);\n hammer.on(\"panup\", panUp);\n hammer.on(\"pandown\", panDown);\n\n hammer.on(\"pinch\", pinch);\n\n hammer.on(\"press\", press);\n\n hammer.on(\"rotate\", rotate);\n\n hammer.on(\"swipe\", swipe);\n hammer.on(\"swipeleft\", swipeLeft);\n hammer.on(\"swiperight\", swipeRight);\n hammer.on(\"swipeup\", swipeUp);\n hammer.on(\"swipedown\", swipeDown);\n\n hammer.on(\"tap\", tap);\n\n // tapOutSide\n removes.push(useEventListener(document, \"pointerdown\", tapOutSide));\n // if (isTouchSupport()) {\n // removes.push(useEventListener(document, \"touchstart\", tapOutSide));\n // } else {\n // removes.push(useEventListener(document, \"mousedown\", tapOutSide));\n // }\n\n // transition + animation\n removes.push(useEventListener(el, \"transitionstart\", transitionstart));\n removes.push(useEventListener(el, \"transitionend\", transitionend));\n removes.push(useEventListener(el, \"animationstart\", animationstart));\n removes.push(useEventListener(el, \"animationend\", animationend));\n\n // resize\n const end = await useResize(el, (rect) => {\n _rect = rect;\n eb.emit(\"resize\", rect);\n });\n removes.push(end);\n\n // mousePoint 鼠标相对el的位置\n removes.push(\n usePressDownMove(this, {\n start: (e) => {\n ump.setStartMousePoint(getMousePositionInElement(e, el), true);\n },\n move: (e) => {\n ump.setCurrentMousePoint(getMousePositionInElement(e, el));\n },\n end: (e) => {\n ump.setCurrentMousePoint(getMousePositionInElement(e, el), false);\n }\n })\n );\n },\n end: () => {\n eb.removeAllListeners();\n\n removes.forEach((r) => r());\n removes = [];\n\n hammer.off(\"pan\", pan);\n hammer.off(\"panstart\", panStart);\n hammer.off(\"panmove\", panMove);\n hammer.off(\"panend\", panEnd);\n hammer.off(\"pancancel\", panCancel);\n hammer.off(\"panleft\", panLeft);\n hammer.off(\"panright\", panRight);\n hammer.off(\"panup\", panUp);\n hammer.off(\"pandown\", panDown);\n\n hammer.off(\"pinch\", pinch);\n\n hammer.off(\"press\", press);\n\n hammer.off(\"rotate\", rotate);\n\n hammer.off(\"swipe\", swipe);\n hammer.off(\"swipeleft\", swipeLeft);\n hammer.off(\"swiperight\", swipeRight);\n hammer.off(\"swipeup\", swipeUp);\n hammer.off(\"swipedown\", swipeDown);\n\n hammer.off(\"tap\", tap);\n }\n };\n}\n","import { ref } from \"@zyzgroup/core-common\";\nimport { useEventListener } from \"./useEventListener\";\n\n// (min-width: 600px)\n// (prefers-reduced-motion: reduce)\nexport function useMedia(query = \"(prefers-color-scheme: dark)\") {\n const mediaQuery = window.matchMedia(query);\n const matches = ref<boolean>(mediaQuery.matches);\n\n useEventListener(mediaQuery, \"change\", (e) => {\n matches.value = e.matches;\n });\n\n return matches;\n}\n","import { watchEffect } from \"@zyzgroup/core-common\";\nimport { useLocalStorage } from \"./useLocalStorage\";\nimport { useMedia } from \"./useMedia\";\nimport { atomWriteAttribute } from \"./useAttribute\";\n\n// import \"@zyzgroup/core-web/dist/theme.css\";\n\n// 初始化\nconst LOCAL_STORAGE_THEME = \"__theme__\";\nconst theme = useLocalStorage(LOCAL_STORAGE_THEME);\nif (!theme.value) {\n const media = useMedia(\"(prefers-color-scheme: dark)\");\n theme.value = media.value ? \"dark\" : \"light\";\n}\n\nconst change = () => {\n switch (theme.value) {\n case \"dark\":\n document.documentElement.classList.add(\"dark\");\n atomWriteAttribute(document.documentElement, \"data-theme\", \"dark\");\n break;\n default:\n document.documentElement.classList.remove(\"dark\");\n atomWriteAttribute(document.documentElement, \"data-theme\", \"light\");\n break;\n }\n};\n\nwatchEffect(() => {\n change();\n});\n\n// 初始化:在系统根据当前外观模式强制设置class之后\nsetTimeout(change);\n\nexport function useTheme(t?: \"dark\" | \"light\") {\n if (t) {\n theme.value = t;\n }\n return theme;\n}\n\nexport function useThemeToggle() {\n theme.value = theme.value == \"light\" ? \"dark\" : \"light\";\n return theme;\n}\n\nexport function getCSSVar(name: string, defaultValue = \"\") {\n return (\n getComputedStyle(document.documentElement).getPropertyValue(name) ||\n defaultValue\n );\n}\n\nexport function setCSSVar(name: string, value: string) {\n document.documentElement.style.setProperty(name, value);\n // getComputedStyle(document.documentElement).setProperty(name, value);\n}\n","// eslint-disable-next-line no-debugger\n// debugger;\n\n// BOM Browser Object Model\n// BOM 的顶级对象是 window\n\n// const target = document.documentElement || document || window;\n\n// history\n// history.go(3); //向前跳转三个记录\n// history.go(-1); //向后跳转一个记录\n// history.forward() 向前跳转一个页面\n// history.back() 向后跳转一个页面\n// history.length 获取历史记录数\n\n// location.reload(true)\n\n// screen\n\n// const myWin = window.open(\"htttp://www.vue3js.cn\", \"topFrame\");\n// myWin.close();\n\n// 单例模式\nexport const useWindow = {\n getSelectedText: () => window.getSelection()?.toString() || \"\"\n};\n\nexport function setWindowTitle(title: string) {\n document.getElementsByTagName(\"title\")[0].innerText = title;\n document.title = title;\n}\n","import { injectStyle } from \"./useStyle\";\nimport { EventBus } from \"@zyzgroup/core-common\";\nimport { useResize } from \"./useResize\";\nimport { isIOS, getOperatingSystemVersion, compareVersion } from \"../env\";\n\nlet isInjected = false;\nfunction inject() {\n if (isInjected) {\n return;\n }\n isInjected = true;\n // <meta name=\"viewport\" content=\"viewport-fit=cover\" />\n // iPhoneX 可能有问题\n // 注意注入时:--xxx:后面不要有空格\n // if (isIOS() && compareVersion(getOperatingSystemVersion(), \"11.2\") < 0) {\n // // iOS < 11.2\n // injectStyle(`\n // :root {\n // --sat:constant(safe-area-inset-top, 0px);\n // --sar:constant(safe-area-inset-right, 0px);\n // --sab:constant(safe-area-inset-bottom, 0px);\n // --sal:constant(safe-area-inset-left, 0px);\n // }\n // :host {\n // --sat:constant(safe-area-inset-top, 0px);\n // --sar:constant(safe-area-inset-right, 0px);\n // --sab:constant(safe-area-inset-bottom, 0px);\n // --sal:constant(safe-area-inset-left, 0px);\n // }\n // `);\n // } else {\n // iOS > 11.2\n injectStyle(`\n :root {\n --sat:env(safe-area-inset-top, 0px);\n --sar:env(safe-area-inset-right, 0px);\n --sab:env(safe-area-inset-bottom, 0px);\n --sal:env(safe-area-inset-left, 0px);\n }\n :host {\n --sat:env(safe-area-inset-top, 0px);\n --sar:env(safe-area-inset-right, 0px);\n --sab:env(safe-area-inset-bottom, 0px);\n --sal:env(safe-area-inset-left, 0px);\n }\n `);\n // }\n}\n\ninject();\n\nconst eb = new EventBus();\n\nlet prevTop: string;\nlet prevRight: string;\nlet prevBottom: string;\nlet prevLeft: string;\n\nuseResize(document.documentElement, () => {\n // next tick\n setTimeout(() => {\n const declaration = getComputedStyle(document.documentElement);\n\n const top = declaration.getPropertyValue(\"--sat\");\n if (top !== prevTop) {\n eb.emit(\"top\", top);\n }\n prevTop = top;\n\n const right = declaration.getPropertyValue(\"--sar\");\n if (right !== prevRight) {\n eb.emit(\"right\", right);\n }\n prevRight = right;\n\n const bottom = declaration.getPropertyValue(\"--sab\");\n if (bottom !== prevBottom) {\n eb.emit(\"bottom\", bottom);\n }\n prevBottom = bottom;\n\n const left = declaration.getPropertyValue(\"--sal\");\n if (left !== prevLeft) {\n eb.emit(\"left\", left);\n }\n prevLeft = left;\n }, 0);\n});\n\n// 单例\nexport const useSafeArea = {\n onTop: (cb: (v: string) => void) => {\n if (prevTop) {\n cb(prevTop);\n }\n eb.on(\"top\", cb);\n return () => {\n eb.off(\"top\", cb);\n };\n },\n\n onRight: (cb: (v: string) => void) => {\n if (prevRight) {\n cb(prevRight);\n }\n eb.on(\"right\", cb);\n return () => {\n eb.off(\"right\", cb);\n };\n },\n\n onBottom: (cb: (v: string) => void) => {\n if (prevBottom) {\n cb(prevBottom);\n }\n eb.on(\"bottom\", cb);\n return () => {\n eb.off(\"bottom\", cb);\n };\n },\n\n onLeft: (cb: (v: string) => void) => {\n if (prevLeft) {\n cb(prevLeft);\n }\n eb.on(\"left\", cb);\n return () => {\n eb.off(\"left\", cb);\n };\n }\n};\n\n// const safeAreaBottom = ref(\"0px\");\n// let remove;\n// onMounted(() => {\n// remove = useSafeArea.onBottom((b) => {\n// safeAreaBottom.value = b;\n// });\n// });\n// onUnmounted(() => {\n// remove?.();\n// });\n","// import UPNG from \"./UPNG\";\n\nexport type ImageDisplayMode =\n | \"scaleToFill\" // 不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素\n | \"aspectFit\" // 保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以完整地将图片显示出来\n | \"aspectFill\" // 保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取\n | \"widthFix\" // 保持纵横比缩放图片,宽度完全拉伸,高度自动变化\n | \"heightFix\"; // 保持纵横比缩放图片,高度完全拉伸,宽度自动变化\n\nexport function computeImageDisplayRect(\n mode: ImageDisplayMode,\n sourceWidth: number,\n sourceHeight: number,\n wrapWidth: number,\n wrapHeight: number\n): { width: number; height: number } {\n const sourceAspectRatio = sourceWidth / sourceHeight;\n let showWidth = 0;\n let showHeight = 0;\n switch (mode) {\n case \"aspectFit\":\n if (sourceAspectRatio >= 1) {\n showWidth = wrapWidth;\n showHeight = showWidth / sourceAspectRatio;\n if (showHeight > wrapHeight) {\n showHeight = wrapHeight;\n showWidth = showHeight * sourceAspectRatio;\n }\n } else {\n showHeight = wrapHeight;\n showWidth = showHeight * sourceAspectRatio;\n if (showWidth > wrapWidth) {\n showWidth = wrapWidth;\n showHeight = showWidth / sourceAspectRatio;\n }\n }\n break;\n case \"aspectFill\":\n if (sourceAspectRatio >= 1) {\n showHeight = wrapHeight;\n showWidth = showHeight * sourceAspectRatio;\n } else {\n showWidth = wrapWidth;\n showHeight = showWidth / sourceAspectRatio;\n }\n break;\n case \"widthFix\":\n showWidth = wrapWidth;\n showHeight = showWidth / sourceAspectRatio;\n break;\n case \"heightFix\":\n showHeight = wrapHeight;\n showWidth = showHeight * sourceAspectRatio;\n break;\n case \"scaleToFill\":\n default:\n showWidth = wrapWidth;\n showHeight = wrapHeight;\n break;\n }\n return { width: showWidth, height: showHeight };\n}\n\nexport function getImageData(\n image: ImageBitmap | HTMLImageElement | HTMLVideoElement\n): ImageData {\n try {\n const canvas = document.createElement(\"canvas\") as HTMLCanvasElement;\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n canvas.width = image.width;\n canvas.height = image.height;\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n return ctx.getImageData(0, 0, canvas.width, canvas.height) as ImageData;\n } catch (e) {\n // Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.\n return new ImageData(image.width, image.height);\n }\n}\n\n/// ImageData对象转Bitmap\nexport const imageDataToBitmap = (imageData: ImageData) => {\n //\n // BITMAPFILEHEADER: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183374(v=vs.85).aspx\n // BITMAPINFOHEADER: http://msdn.microsoft.com/en-us/library/dd183376.aspx\n //\n\n const biWidth = imageData.width;\n const biHeight = imageData.height;\n const biSizeImage = biWidth * biHeight * 3;\n const bfSize = biSizeImage + 54; // total header size = 54 bytes\n\n //\n // typedef struct tagBITMAPFILEHEADER {\n // \tWORD bfType;\n // \tDWORD bfSize;\n // \tWORD bfReserved1;\n // \tWORD bfReserved2;\n // \tDWORD bfOffBits;\n // } BITMAPFILEHEADER;\n //\n const BITMAPFILEHEADER = [\n // WORD bfType -- The file type signature; must be \"BM\"\n 0x42,\n 0x4d,\n // DWORD bfSize -- The size, in bytes, of the bitmap file\n bfSize & 0xff,\n (bfSize >> 8) & 0xff,\n (bfSize >> 16) & 0xff,\n (bfSize >> 24) & 0xff,\n // WORD bfReserved1 -- Reserved; must be zero\n 0,\n 0,\n // WORD bfReserved2 -- Reserved; must be zero\n 0,\n 0,\n // DWORD bfOffBits -- The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits.\n 54,\n 0,\n 0,\n 0\n ];\n\n //\n // typedef struct tagBITMAPINFOHEADER {\n // \tDWORD biSize;\n // \tLONG biWidth;\n // \tLONG biHeight;\n // \tWORD biPlanes;\n // \tWORD biBitCount;\n // \tDWORD biCompression;\n // \tDWORD biSizeImage;\n // \tLONG biXPelsPerMeter;\n // \tLONG biYPelsPerMeter;\n // \tDWORD biClrUsed;\n // \tDWORD biClrImportant;\n // } BITMAPINFOHEADER, *PBITMAPINFOHEADER;\n //\n const BITMAPINFOHEADER = [\n // DWORD biSize -- The number of bytes required by the structure\n 40,\n 0,\n 0,\n 0,\n // LONG biWidth -- The width of the bitmap, in pixels\n biWidth & 0xff,\n (biWidth >> 8) & 0xff,\n (biWidth >> 16) & 0xff,\n (biWidth >> 24) & 0xff,\n // LONG biHeight -- The height of the bitmap, in pixels\n biHeight & 0xff,\n (biHeight >> 8) & 0xff,\n (biHeight >> 16) & 0xff,\n (biHeight >> 24) & 0xff,\n // WORD biPlanes -- The number of planes for the target device. This value must be set to 1\n 1,\n 0,\n // WORD biBitCount -- The number of bits-per-pixel, 24 bits-per-pixel -- the bitmap\n // has a maximum of 2^24 colors (16777216, Truecolor)\n 24,\n 0,\n // DWORD biCompression -- The type of compression, BI_RGB (code 0) -- uncompressed\n 0,\n 0,\n 0,\n 0,\n // DWORD biSizeImage -- The size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps\n biSizeImage & 0xff,\n (biSizeImage >> 8) & 0xff,\n (biSizeImage >> 16) & 0xff,\n (biSizeImage >> 24) & 0xff,\n // LONG biXPelsPerMeter, unused\n 0,\n 0,\n 0,\n 0,\n // LONG biYPelsPerMeter, unused\n 0,\n 0,\n 0,\n 0,\n // DWORD biClrUsed, the number of color indexes of palette, unused\n 0,\n 0,\n 0,\n 0,\n // DWORD biClrImportant, unused\n 0,\n 0,\n 0,\n 0\n ];\n\n const iPadding = (4 - ((biWidth * 3) % 4)) % 4;\n const aImgData = imageData.data;\n\n let strPixelData = \"\";\n const biWidth4 = biWidth << 2;\n let y = biHeight;\n const fromCharCode = String.fromCharCode;\n\n do {\n const iOffsetY = biWidth4 * (y - 1);\n let strPixelRow = \"\";\n for (let x = 0; x < biWidth; x++) {\n const iOffsetX = x << 2;\n strPixelRow +=\n fromCharCode(aImgData[iOffsetY + iOffsetX + 2]) +\n fromCharCode(aImgData[iOffsetY + iOffsetX + 1]) +\n fromCharCode(aImgData[iOffsetY + iOffsetX]);\n }\n\n for (let c = 0; c < iPadding; c++) {\n strPixelRow += String.fromCharCode(0);\n }\n\n strPixelData += strPixelRow;\n } while (--y);\n\n function encodeData(data: string | any[]) {\n if (!window.btoa) {\n throw \"btoa undefined\";\n }\n let str = \"\";\n if (typeof data == \"string\") {\n str = data;\n } else {\n for (let i = 0; i < data.length; i++) {\n str += String.fromCharCode(data[i]);\n }\n }\n return btoa(str);\n }\n\n return (\n encodeData(BITMAPFILEHEADER.concat(BITMAPINFOHEADER)) +\n encodeData(strPixelData)\n );\n};\n\n/// ImageData对象转DataURL\nexport const imageDataToDataURL = (imageData: ImageData) => {\n const { width, height } = imageData;\n const canvas = document.createElement(\"canvas\") as HTMLCanvasElement;\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n canvas.width = width;\n canvas.height = height;\n ctx.putImageData(imageData, 0, 0, 0, 0, width, height);\n const dataUrl = canvas.toDataURL(\"image/png\");\n return dataUrl;\n};\n\n/// ImageData对象转Blob\nexport const imageDataToBlob = (\n imageData: ImageData,\n exportImageType?: string,\n cb?: (err: any, blob: Blob | null) => void\n) => {\n const { width, height } = imageData;\n const canvas = document.createElement(\"canvas\") as HTMLCanvasElement;\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n canvas.width = width;\n canvas.height = height;\n ctx.putImageData(imageData, 0, 0, 0, 0, width, height);\n const toImageType = `image/${\n exportImageType ? exportImageType.toLowerCase() : \"png\"\n }`;\n canvas.toBlob(\n (blob: Blob | null) => {\n cb?.(null, blob);\n },\n toImageType,\n 1\n );\n};\n\nexport function blobToImageData(blob: Blob, options?: ImageBitmapOptions) {\n return createImageBitmap(blob, options);\n}\n\n/// 获取图片的主要颜色值,返回表示颜色值的字符串,如rgb(red,green,blue)\nexport function getImageMainColor(imageData: ImageData) {\n const arrR = [];\n const arrG = [];\n const arrB = [];\n let j = 0;\n for (let i = 0, len = imageData.data.length; i < len; i += 4) {\n arrR[j] = imageData.data[i];\n arrG[j] = imageData.data[i + 1];\n arrB[j] = imageData.data[i + 2];\n j += 1;\n }\n const R = _getArryWeightValue(arrR);\n const G = _getArryWeightValue(arrG);\n const B = _getArryWeightValue(arrB);\n return \"rgb(\" + R + \",\" + G + \",\" + B + \")\";\n}\n// 用于获取数组中的最高权重值 返回数组的最高权重值\nfunction _getArryWeightValue(arr: number[]) {\n const existArr = {} as { [index: number]: number };\n const duplicationArr = [];\n const duplicationCount = [];\n for (let i = 0; i < arr.length; i++) {\n if (!existArr[arr[i]]) {\n existArr[arr[i]] = 1;\n } else {\n duplicationArr.push(arr[i]);\n }\n }\n let k = 0;\n for (let i = 0; i < duplicationArr.length; i++) {\n k = 0;\n for (let j = 0; j < duplicationArr.length; j++) {\n if (duplicationArr[i] === duplicationArr[j]) {\n k += 1;\n }\n duplicationCount[i] = k;\n }\n }\n const max = Math.max.apply(null, duplicationCount);\n let maxIndex = 0;\n for (; maxIndex < duplicationCount.length; maxIndex++) {\n if (duplicationCount[maxIndex] === max) {\n return;\n }\n }\n return duplicationArr[maxIndex];\n}\n\n/// 左右翻转ImageData\nexport const flipSideToSide = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n newImgData[startIndex] = data[(y * width + width - x - 1) * 4];\n newImgData[startIndex + 1] = data[(y * width + width - x - 1) * 4 + 1];\n newImgData[startIndex + 2] = data[(y * width + width - x - 1) * 4 + 2];\n newImgData[startIndex + 3] = data[(y * width + width - x - 1) * 4 + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 上下翻转ImageData\nexport const flipUpsideDown = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n newImgData[startIndex] = data[((height - y - 1) * width + x) * 4];\n newImgData[startIndex + 1] = data[((height - y - 1) * width + x) * 4 + 1];\n newImgData[startIndex + 2] = data[((height - y - 1) * width + x) * 4 + 2];\n newImgData[startIndex + 3] = data[((height - y - 1) * width + x) * 4 + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 左旋转ImageData\nexport const leftRotate = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let x = 0; x < width; x++) {\n for (let y = 0; y < height; y++) {\n const startIndex = (x * height + y) * 4;\n newImgData[startIndex] = data[(y * width + width - x - 1) * 4];\n newImgData[startIndex + 1] = data[(y * width + width - x - 1) * 4 + 1];\n newImgData[startIndex + 2] = data[(y * width + width - x - 1) * 4 + 2];\n newImgData[startIndex + 3] = data[(y * width + width - x - 1) * 4 + 3];\n }\n }\n const newImageData = new ImageData(newImgData, height, width);\n return newImageData;\n};\n\n/// 右旋转ImageData\nexport const rightRotate = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let x = 0; x < width; x++) {\n for (let y = 0; y < height; y++) {\n const startIndex = (x * height + y) * 4;\n newImgData[startIndex] = data[((height - y - 1) * width + x) * 4];\n newImgData[startIndex + 1] = data[((height - y - 1) * width + x) * 4 + 1];\n newImgData[startIndex + 2] = data[((height - y - 1) * width + x) * 4 + 2];\n newImgData[startIndex + 3] = data[((height - y - 1) * width + x) * 4 + 3];\n }\n }\n const newImageData = new ImageData(newImgData, height, width);\n return newImageData;\n};\n\n/// 灰化ImageData\nexport const toGrey = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n const avgColor =\n (data[startIndex] + data[startIndex + 1] + data[startIndex + 2]) / 3;\n newImgData[startIndex] = avgColor;\n newImgData[startIndex + 1] = avgColor;\n newImgData[startIndex + 2] = avgColor;\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 灰化ImageData\nexport const toGrey2 = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n //relative luminance, humans perceive green more\n const avgColor =\n 0.2126 * data[startIndex] +\n 0.7152 * data[startIndex + 1] +\n 0.0722 * data[startIndex + 2];\n newImgData[startIndex] = avgColor;\n newImgData[startIndex + 1] = avgColor;\n newImgData[startIndex + 2] = avgColor;\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 黑白化ImageData\nexport const toBlackAndWhite = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n const avgColor =\n (data[startIndex] + data[startIndex + 1] + data[startIndex + 2]) / 3;\n const newColor = avgColor > 127 ? 255 : 0;\n newImgData[startIndex] = newColor;\n newImgData[startIndex + 1] = newColor;\n newImgData[startIndex + 2] = newColor;\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 反相色滤镜ImageData\nexport const toOpposite = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n newImgData[startIndex] = 255 - data[startIndex];\n newImgData[startIndex + 1] = 255 - data[startIndex + 1];\n newImgData[startIndex + 2] = 255 - data[startIndex + 2];\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 红色滤镜ImageData\nexport const toRed = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n newImgData[startIndex] = data[startIndex];\n newImgData[startIndex + 1] = 0;\n newImgData[startIndex + 2] = 0;\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 绿色滤镜ImageData\nexport const toGreen = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n newImgData[startIndex] = 0;\n newImgData[startIndex + 1] = data[startIndex + 1];\n newImgData[startIndex + 2] = 0;\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 蓝色滤镜ImageData\nexport const toBlue = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n newImgData[startIndex] = 0;\n newImgData[startIndex + 1] = 0;\n newImgData[startIndex + 2] = data[startIndex + 2];\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 红绿色滤镜ImageData\nexport const toRedAndGreen = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n newImgData[startIndex] = data[startIndex];\n newImgData[startIndex + 1] = data[startIndex + 1];\n newImgData[startIndex + 2] = 0;\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 红蓝色滤镜ImageData\nexport const toRedAndBlue = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n newImgData[startIndex] = data[startIndex];\n newImgData[startIndex + 1] = 0;\n newImgData[startIndex + 2] = data[startIndex + 1];\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 蓝绿色滤镜ImageData\nexport const toBlueAndGreen = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n newImgData[startIndex] = 0;\n newImgData[startIndex + 1] = data[startIndex + 1];\n newImgData[startIndex + 2] = data[startIndex + 1];\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 红灰色滤镜ImageData\nexport const toRedAndGrey = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n const greyColor = (data[startIndex + 1] + data[startIndex + 2]) / 2;\n newImgData[startIndex] = data[startIndex];\n newImgData[startIndex + 1] = greyColor;\n newImgData[startIndex + 2] = greyColor;\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 绿灰色滤镜ImageData\nexport const toGreenAndGrey = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n const greyColor = (data[startIndex] + data[startIndex + 2]) / 2;\n newImgData[startIndex] = greyColor;\n newImgData[startIndex + 1] = data[startIndex + 1];\n newImgData[startIndex + 2] = greyColor;\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 蓝灰色滤镜ImageData\nexport const toBlueAndGrey = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n const greyColor = (data[startIndex] + data[startIndex + 1]) / 2;\n newImgData[startIndex] = greyColor;\n newImgData[startIndex + 1] = greyColor;\n newImgData[startIndex + 2] = data[startIndex + 2];\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 锐化ImageData\nexport const sharpen = (imageData: ImageData) => {\n const kernel = [-1, -1, -1, -1, 9, -1, -1, -1, -1]; // 锐化卷积核\n const newImageData = convolutionMatrix(imageData, kernel);\n return newImageData;\n};\n\n/// 边缘锐化ImageData\nexport const marginSharpen = (imageData: ImageData) => {\n const kernel = [-1, -1, -1, -1, 8, -1, -1, -1, -1]; // 边缘化卷积核\n const newImageData = convolutionMatrix(imageData, kernel);\n return newImageData;\n};\n\n/// JPG转PNG\nexport const jpgToPng = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n newImgData[startIndex] = data[startIndex];\n newImgData[startIndex + 1] = data[startIndex + 1];\n newImgData[startIndex + 2] = data[startIndex + 2];\n newImgData[startIndex + 3] = 255;\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// PNG转JPG\nexport const pngToJpg = (imageData: ImageData) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n if (data[startIndex + 3] === 0) {\n newImgData[startIndex] = 255;\n newImgData[startIndex + 1] = 255;\n newImgData[startIndex + 2] = 255;\n newImgData[startIndex + 3] = 255;\n } else {\n const newColor = colorStacks(\n [\n data[startIndex],\n data[startIndex + 1],\n data[startIndex + 2],\n data[startIndex + 3]\n ],\n [255, 255, 255, 255]\n );\n newImgData[startIndex] = newColor[0];\n newImgData[startIndex + 1] = newColor[1];\n newImgData[startIndex + 2] = newColor[2];\n newImgData[startIndex + 3] = newColor[3];\n }\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/**\n * 矩形裁剪\n * @param imageData ImageData源数据\n * @param newWidth 新图的宽度(retainOriginalSize为true时,宽度为imageData.width)\n * @param newHeight 新图的高度(retainOriginalSize为true时,高度为imageData.height)\n * @param top 新图相对于原图顶部的起始位置\n * @param left 新图相对于原图左侧的起始位置\n * @param retainOriginalSize 是否保留为原图的宽高 (宽高继承原图,多余部分用白色或透明色填充)\n * @param imageType 图片类型 (retainOriginalSize为true时必须传该值)\n * @returns ImageData\n */\nexport const rectClip = (\n imageData: ImageData,\n newWidth: number,\n newHeight: number,\n top: number,\n left: number,\n retainOriginalSize = false,\n imageType?: string\n) => {\n const { data, width, height } = imageData;\n let finalLeft = left;\n let finalTop = top;\n let finalWidth = newWidth;\n let finalHeight = newHeight;\n if (finalLeft < 0) {\n finalLeft = 0;\n } else if (finalLeft > width) {\n finalLeft = width;\n }\n if (finalTop < 0) {\n finalTop = 0;\n } else if (finalTop > height) {\n finalTop = height;\n }\n if (finalWidth < 1) {\n finalWidth = 1;\n } else if (finalWidth > width) {\n finalWidth = width;\n }\n if (finalHeight < 1) {\n finalHeight = 1;\n } else if (finalHeight > height) {\n finalHeight = height;\n }\n if (finalLeft + finalWidth > width) {\n finalWidth = width - finalLeft;\n }\n if (finalTop + finalHeight > height) {\n finalHeight = height - finalTop;\n }\n // 保留原尺寸\n if (retainOriginalSize) {\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n if (\n x >= finalLeft &&\n x <= finalLeft + finalWidth &&\n y >= finalTop &&\n y <= finalTop + finalHeight\n ) {\n newImgData[startIndex] = data[startIndex];\n newImgData[startIndex + 1] = data[startIndex + 1];\n newImgData[startIndex + 2] = data[startIndex + 2];\n newImgData[startIndex + 3] = data[startIndex + 3];\n } else {\n newImgData[startIndex] = 255;\n newImgData[startIndex + 1] = 255;\n newImgData[startIndex + 2] = 255;\n newImgData[startIndex + 3] =\n imageType && [\"JPG\", \"JPEG\"].includes(imageType.toUpperCase())\n ? 255\n : 0;\n }\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n } else {\n const newImgData = new Uint8ClampedArray(finalWidth * finalHeight * 4);\n for (let y = finalTop; y <= finalTop + finalHeight; y++) {\n for (let x = finalLeft; x <= finalLeft + finalWidth; x++) {\n const startIndex = ((y - finalTop) * finalWidth + x - finalLeft) * 4;\n const startIndex2 = (y * width + x) * 4;\n newImgData[startIndex] = data[startIndex2];\n newImgData[startIndex + 1] = data[startIndex2 + 1];\n newImgData[startIndex + 2] = data[startIndex2 + 2];\n newImgData[startIndex + 3] = data[startIndex2 + 3];\n }\n }\n const newImageData = new ImageData(newImgData, finalWidth, finalHeight);\n return newImageData;\n }\n};\n\n/**\n * 圆角裁剪\n * @param imageData ImageData源数据\n * @param borderRadius 圆角半径\n * @param imageType 图片类型\n * @param jpgToPNG 是否为JPG转成PNG\n * @returns ImageData\n */\nexport const radiusClip = (\n imageData: ImageData,\n borderRadius: number,\n imageType: string,\n jpgToPNG?: boolean\n) => {\n const { data, width, height } = imageData;\n let finalRadius = borderRadius;\n if (finalRadius > Math.floor(width / 2)) {\n finalRadius = Math.floor(width / 2);\n }\n if (finalRadius > Math.floor(height / 2)) {\n finalRadius = Math.floor(height / 2);\n }\n if (finalRadius < 0) {\n finalRadius = 0;\n }\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n let l = -1;\n if (x < finalRadius) {\n if (y < finalRadius) {\n l = Math.sqrt(\n Math.pow(finalRadius - x - 1, 2) + Math.pow(finalRadius - y - 1, 2)\n );\n } else if (y > height - finalRadius - 1) {\n l = Math.sqrt(\n Math.pow(finalRadius - x - 1, 2) +\n Math.pow(y - (height - finalRadius), 2)\n );\n }\n } else if (x > width - finalRadius - 1) {\n if (y < finalRadius) {\n l = Math.sqrt(\n Math.pow(x - (width - finalRadius), 2) +\n Math.pow(finalRadius - y - 1, 2)\n );\n } else if (y > height - finalRadius - 1) {\n l = Math.sqrt(\n Math.pow(x - (width - finalRadius), 2) +\n Math.pow(y - (height - finalRadius), 2)\n );\n }\n }\n if (Math.round(l) > finalRadius) {\n newImgData[startIndex] = 255;\n newImgData[startIndex + 1] = 255;\n newImgData[startIndex + 2] = 255;\n newImgData[startIndex + 3] =\n jpgToPNG || imageType.toUpperCase() === \"PNG\" ? 0 : 255;\n } else {\n newImgData[startIndex] = data[startIndex];\n newImgData[startIndex + 1] = data[startIndex + 1];\n newImgData[startIndex + 2] = data[startIndex + 2];\n newImgData[startIndex + 3] =\n jpgToPNG || imageType.toUpperCase() === \"PNG\"\n ? data[startIndex + 3]\n : 255;\n }\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 修改尺寸\nexport const changeSize = (\n imgUrl: string,\n width: number,\n height: number,\n newWidth: number,\n newHeight: number,\n maxWidthHeight = 10000\n) => {\n const img = new Image();\n img.src = imgUrl;\n const canvas = document.createElement(\"canvas\") as HTMLCanvasElement;\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n canvas.width = maxWidthHeight;\n canvas.height = maxWidthHeight;\n ctx.drawImage(img, 0, 0, width, height, 0, 0, newWidth, newHeight);\n const newImageData = ctx.getImageData(0, 0, newWidth, newHeight) as ImageData;\n return newImageData;\n};\n\n/// 修改亮度\nexport const changeBrightness = (imageData: ImageData, changeNum: number) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n newImgData[startIndex] = Math.max(\n Math.min(data[startIndex] + changeNum, 255),\n 0\n );\n newImgData[startIndex + 1] = Math.max(\n Math.min(data[startIndex + 1] + changeNum, 255),\n 0\n );\n newImgData[startIndex + 2] = Math.max(\n Math.min(data[startIndex + 2] + changeNum, 255),\n 0\n );\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 修改透明度\nexport const changeDiaphaneity = (\n imageData: ImageData,\n value: number,\n fixedDiaphaneity = false\n) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n if (data[startIndex + 3] === 0) {\n newImgData[startIndex] = 255;\n newImgData[startIndex + 1] = 255;\n newImgData[startIndex + 2] = 255;\n } else {\n newImgData[startIndex] = data[startIndex];\n newImgData[startIndex + 1] = data[startIndex + 1];\n newImgData[startIndex + 2] = data[startIndex + 2];\n }\n let a = data[startIndex + 3];\n if (fixedDiaphaneity) {\n a = Math.max(Math.min(Math.floor(255 * value), 255), 0);\n } else {\n a = Math.max(Math.min(Math.floor(a + 255 * value), 255), 0);\n }\n newImgData[startIndex + 3] = a;\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 添加水印\nexport const addWatermark = (\n imageData: ImageData,\n watermarkImageData: ImageData,\n top: number,\n left: number\n) => {\n const { data, width, height } = imageData;\n const {\n data: watermarkData,\n width: watermarkWidth,\n height: watermarkHeight\n } = watermarkImageData;\n let finalTop = top;\n let finalLeft = left;\n if (top + watermarkHeight > height) {\n finalTop = height - watermarkHeight;\n }\n if (left + watermarkWidth > width) {\n finalLeft = width - watermarkWidth;\n }\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n if (\n x < finalLeft ||\n x > finalLeft + watermarkWidth ||\n y <= finalTop ||\n y >= finalTop + watermarkHeight\n ) {\n newImgData[startIndex] = data[startIndex];\n newImgData[startIndex + 1] = data[startIndex + 1];\n newImgData[startIndex + 2] = data[startIndex + 2];\n newImgData[startIndex + 3] = data[startIndex + 3];\n } else {\n const watermarkStartIndex =\n (y * width +\n x -\n ((finalTop + 1) * width +\n (y - (finalTop + 1)) * (width - watermarkWidth)) +\n watermarkWidth -\n finalLeft -\n 1) *\n 4;\n const aboveColor: [number, number, number, number] = [\n watermarkData[watermarkStartIndex],\n watermarkData[watermarkStartIndex + 1],\n watermarkData[watermarkStartIndex + 2],\n watermarkData[watermarkStartIndex + 3]\n ];\n const belowColor: [number, number, number, number] = [\n data[startIndex],\n data[startIndex + 1],\n data[startIndex + 2],\n data[startIndex + 3]\n ];\n const finalColor = colorStacks(aboveColor, belowColor);\n newImgData[startIndex] = finalColor[0];\n newImgData[startIndex + 1] = finalColor[1];\n newImgData[startIndex + 2] = finalColor[2];\n newImgData[startIndex + 3] = finalColor[3];\n }\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/**\n * 打马赛克\n * @param imageData ImageData源数据\n * @param width 马赛克区域的宽度\n * @param height 马赛克区域的高度\n * @param top 马赛克相对于顶部的起始位置\n * @param left 马塞克相对于左侧的起始位置\n * @param mosaicSize 马塞克颗粒的大小\n * @returns ImageData\n */\nexport const mosaic = (\n imageData: ImageData,\n mosaicWidth: number,\n mosaicHeight: number,\n top: number,\n left: number,\n mosaicSize = 10\n) => {\n const { data, width, height } = imageData;\n let finalLeft = left;\n let finalTop = top;\n let finalWidth = mosaicWidth;\n let finalHeight = mosaicHeight;\n if (finalLeft < 0) {\n finalLeft = 0;\n } else if (finalLeft > width) {\n finalLeft = width;\n }\n if (finalTop < 0) {\n finalTop = 0;\n } else if (finalTop > height) {\n finalTop = height;\n }\n if (finalWidth < 1) {\n finalWidth = 1;\n } else if (finalWidth > width) {\n finalWidth = width;\n }\n if (finalHeight < 1) {\n finalHeight = 1;\n } else if (finalHeight > height) {\n finalHeight = height;\n }\n if (finalLeft + finalWidth > width) {\n finalWidth = width - finalLeft;\n }\n if (finalTop + finalHeight > height) {\n finalHeight = height - finalTop;\n }\n\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n if (\n x >= finalLeft &&\n x <= finalLeft + finalWidth &&\n y >= finalTop &&\n y <= finalTop + finalHeight\n ) {\n const boxXIndex = Math.floor((x - finalLeft) / mosaicSize);\n const boxYIndex = Math.floor((y - finalTop) / mosaicSize);\n let mosaicBoxColorX = Math.floor(\n mosaicSize * (boxXIndex + 1) - mosaicSize / 2 + finalLeft\n );\n let mosaicBoxColorY = Math.floor(\n mosaicSize * (boxYIndex + 1) - mosaicSize / 2 + finalTop\n );\n if (mosaicBoxColorX > width - 1) {\n mosaicBoxColorX = width - 1;\n }\n if (mosaicBoxColorY > height - 1) {\n mosaicBoxColorY = height - 1;\n }\n const mosaicBoxColorIndex =\n (mosaicBoxColorY * width + mosaicBoxColorX) * 4;\n newImgData[startIndex] = data[mosaicBoxColorIndex];\n newImgData[startIndex + 1] = data[mosaicBoxColorIndex + 1];\n newImgData[startIndex + 2] = data[mosaicBoxColorIndex + 2];\n newImgData[startIndex + 3] = data[mosaicBoxColorIndex + 3];\n } else {\n newImgData[startIndex] = data[startIndex];\n newImgData[startIndex + 1] = data[startIndex + 1];\n newImgData[startIndex + 2] = data[startIndex + 2];\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 图片压缩\n// export const compression = async (\n// imageUrl: string | ImageData,\n// width: number,\n// height: number,\n// imageType: string,\n// compressionDegree: number,\n// cb: (blob: Blob | null) => void\n// ) => {\n// const degree = compressionDegree / 100;\n// if ([\"JPG\", \"JPEG\"].includes(imageType.toUpperCase())) {\n// const img = new Image();\n// img.src = imageUrl as string;\n// const canvas = document.createElement(\"canvas\") as HTMLCanvasElement;\n// const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n// canvas.width = width;\n// canvas.height = height;\n// ctx.drawImage(img, 0, 0, width, height);\n// canvas.toBlob(\n// (blob: Blob | null) => {\n// cb(blob);\n// },\n// `image/${imageType.toLowerCase()}`,\n// degree\n// );\n// } else {\n// const bit = Math.floor(degree * 256);\n// const png = UPNG.encode(\n// [(imageUrl as ImageData).data.buffer],\n// width,\n// height,\n// bit\n// );\n// const blob = new Blob([png]);\n// cb && cb(blob);\n// }\n// };\n\n/// 根据AI识别的人像数据算出界面中需要显示的最终数据\nexport const getImageDataByAIData = (\n originalImageData: ImageData,\n AIImageData: ImageData,\n options: {\n backgroundColor: { r: number; g: number; b: number; a: number };\n changeIntoColor: { r: number; g: number; b: number; a: number };\n } = {\n backgroundColor: { r: 0, g: 0, b: 0, a: 255 },\n changeIntoColor: { r: 0, g: 0, b: 0, a: 0 }\n }\n) => {\n if (AIImageData && options) {\n const { data, width, height } = originalImageData;\n const { data: AIData } = AIImageData;\n const newImgData = new Uint8ClampedArray(data.length);\n const { backgroundColor, changeIntoColor } = options;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n const r = AIData[startIndex];\n const g = AIData[startIndex + 1];\n const b = AIData[startIndex + 2];\n const a = AIData[startIndex + 3];\n if (\n r === backgroundColor.r &&\n g === backgroundColor.g &&\n b === backgroundColor.b &&\n a === backgroundColor.a &&\n changeIntoColor.a !== 0\n ) {\n newImgData[startIndex] = changeIntoColor.r;\n newImgData[startIndex + 1] = changeIntoColor.g;\n newImgData[startIndex + 2] = changeIntoColor.b;\n newImgData[startIndex + 3] = changeIntoColor.a;\n } else {\n newImgData[startIndex] = data[startIndex];\n newImgData[startIndex + 1] = data[startIndex + 1];\n newImgData[startIndex + 2] = data[startIndex + 2];\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n }\n return originalImageData;\n};\n\n/// 卷积算法\nconst convolutionMatrix = (imageData: ImageData, kernel: number[]) => {\n const { data, width, height } = imageData;\n const newImgData = new Uint8ClampedArray(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const startIndex = (y * width + x) * 4;\n for (let i = 0; i < 3; i++) {\n const index = startIndex + i;\n if (x === 0 || x === width - 1 || y === 0 || y === height - 1) {\n newImgData[index] = data[index];\n } else {\n newImgData[index] =\n kernel[0] * data[index - width * 4 - 4] +\n kernel[1] * data[index - width * 4] +\n kernel[2] * data[index - width * 4 + 4] +\n kernel[3] * data[index - 4] +\n kernel[4] * data[index] +\n kernel[5] * data[index + 4] +\n kernel[6] * data[index + width * 4 - 4] +\n kernel[7] * data[index + width * 4] +\n kernel[8] * data[index + width * 4 + 4];\n }\n }\n newImgData[startIndex + 3] = data[startIndex + 3];\n }\n }\n const newImageData = new ImageData(newImgData, width, height);\n return newImageData;\n};\n\n/// 颜色叠加算法\nconst colorStacks = (\n aboveColor: [number, number, number, number],\n belowColor: [number, number, number, number]\n) => {\n if (\n aboveColor &&\n aboveColor.length === 4 &&\n belowColor &&\n belowColor.length === 4\n ) {\n const aboveA = aboveColor[3];\n const belowA = belowColor[3];\n if (aboveA === 255 || belowA === 0) {\n return aboveColor;\n } else if (aboveA === 0) {\n return belowColor;\n } else {\n const aboveDiaphaneity = aboveA / 255;\n const belowDiaphaneity = belowA / 255;\n const newColorR = Math.max(\n Math.min(\n Math.floor(\n aboveColor[0] * aboveDiaphaneity +\n belowColor[0] * belowDiaphaneity * (1 - aboveDiaphaneity)\n ),\n 255\n ),\n 0\n );\n const newColorG = Math.max(\n Math.min(\n Math.floor(\n aboveColor[1] * aboveDiaphaneity +\n belowColor[1] * belowDiaphaneity * (1 - aboveDiaphaneity)\n ),\n 255\n ),\n 0\n );\n const newColorB = Math.max(\n Math.min(\n Math.floor(\n aboveColor[2] * aboveDiaphaneity +\n belowColor[2] * belowDiaphaneity * (1 - aboveDiaphaneity)\n ),\n 255\n ),\n 0\n );\n const newColorA = Math.max(\n Math.min(\n Math.floor(\n (aboveDiaphaneity + belowDiaphaneity * (1 - aboveDiaphaneity)) * 255\n ),\n 255\n ),\n 0\n );\n return [newColorR, newColorG, newColorB, newColorA];\n }\n }\n return [255, 255, 255, 255];\n};\n","import {\n clamp,\n euclideanModulo,\n lerp,\n maxDotNumber,\n parseNumber\n} from \"@zyzgroup/core-common\";\nimport { BufferAttribute, Matrix3, Vector3 } from \"./math\";\n\nconst _colorKeywords: Record<string, number> = {\n 1: 0x0ac2d2, // rgb(10,194,210)\n 2: 0x7bb7fa, // rgb(123,183,250)\n 3: 0x60d7a9, // rgb(96,215,169)\n 4: 0xfdc162, // rgb(253,193,98)\n 5: 0xfd6a62, // rgb(253,106,98)\n 6: 0xf68dbb, // rgb(246,141,187)\n 7: 0x26ccff,\n 8: 0xa25afd,\n 9: 0xff5e7e,\n 10: 0x88ff5a,\n 11: 0xfcff42,\n 12: 0xffa62d,\n 13: 0xff36ff,\n 14: 0xdc4916,\n 15: 0x6871b1,\n 16: 0xd1b935,\n 17: 0x1bbc9b,\n 18: 0xff7f50,\n 19: 0x4bbfc3,\n 20: 0xff9900,\n aliceblue: 0xf0f8ff, // rgb(240,248,255)\n antiquewhite: 0xfaebd7, // rgb(250,235,215)\n aqua: 0x00ffff, // rgb(0,255,255)\n aquamarine: 0x7fffd4, // rgb(127,255,212)\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000, // rgb(0,0,0)\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000, // rgb(255,0,0)\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff, // rgb(255,255,255)\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00, // rgb(255,255,0)\n yellowgreen: 0x9acd32 // rgb(154,205,50)\n};\n\nexport class Color {\n static NAMES = _colorKeywords;\n\n private _color = {\n r: 0, // 0 ~ 255\n g: 0, // 0 ~ 255\n b: 0, // 0 ~ 255\n a: 1 // 0 ~ 1\n };\n\n constructor(color?: any, forceAlpha?: number) {\n if (color) {\n this.setColor(color);\n }\n this.setAlpha(forceAlpha);\n }\n\n get color() {\n return this._color;\n }\n set color(color: any) {\n const ErrMsg = `Color: Unknown color(${color}) type(${typeof color})`;\n if (typeof color === \"number\") {\n this.setHEX(color);\n } else if (typeof color === \"string\") {\n let m;\n if ((m = /^(\\w+)\\(([^)]*)\\)/.exec(color))) {\n // rgb / hsl\n const components = m[2];\n let matches;\n switch (m[1]) {\n case \"rgb\":\n case \"rgba\":\n if (\n (matches =\n /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(\n components\n ))\n ) {\n // rgb(255,0,0) rgba(255,0,0,0.5)\n this.r = parseInt(matches[1], 10);\n this.g = parseInt(matches[2], 10);\n this.b = parseInt(matches[3], 10);\n this.a = matches[4] ? parseFloat(matches[4]) : 1;\n } else if (\n (matches =\n /^\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(\n components\n ))\n ) {\n // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n this.r = (clamp(parseFloat(matches[1]), 0, 100) * 255) / 100;\n this.g = (clamp(parseFloat(matches[2]), 0, 100) * 255) / 100;\n this.b = (clamp(parseFloat(matches[3]), 0, 100) * 255) / 100;\n this.a = matches[4] ? parseFloat(matches[4]) : 1;\n } else {\n // throw new Error(ErrMsg);\n console.warn(ErrMsg);\n }\n break;\n case \"hsl\":\n case \"hsla\":\n if (\n (matches =\n /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)%\\s*,\\s*(\\d*\\.?\\d+)%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(\n components\n ))\n ) {\n // hsl(120,50%,50%) hsla(120,60.00%,1.00%,0.50)\n this.setHSL(\n parseFloat(matches[1]) / 360,\n parseFloat(matches[2]) / 100,\n parseFloat(matches[3]) / 100,\n matches[4] ? parseFloat(matches[4]) : 1\n );\n } else {\n // throw new Error(ErrMsg);\n console.warn(ErrMsg);\n }\n break;\n default:\n // throw new Error(ErrMsg);\n console.warn(ErrMsg);\n }\n } else if ((m = /#([A-Fa-f0-9]+)/.exec(color))) {\n // #RGB #RRGGBB #RRGGBBAA\n const hex = m[1];\n const size = hex.length;\n if (size === 3) {\n // #RGB\n this.setRGB(\n parseInt(hex.charAt(0), 16),\n parseInt(hex.charAt(1), 16),\n parseInt(hex.charAt(2), 16),\n 1\n );\n } else if (size === 6 || size === 8) {\n // #RRGGBB #RRGGBBAA\n this.setHEX(parseInt(hex, 16));\n } else {\n // throw new Error(ErrMsg);\n console.warn(ErrMsg);\n }\n } else if (color && color.length > 0) {\n try {\n this.setColorName(color);\n } catch (e) {\n // throw new Error(ErrMsg);\n console.warn(ErrMsg);\n }\n } else {\n // throw new Error(ErrMsg);\n console.warn(ErrMsg);\n }\n } else if (color instanceof Color) {\n this.setRGB(color.r, color.g, color.b, color.a);\n } else if (\n Object.prototype.hasOwnProperty.call(color, \"r\") &&\n Object.prototype.hasOwnProperty.call(color, \"g\") &&\n Object.prototype.hasOwnProperty.call(color, \"b\")\n ) {\n this.setRGB(\n color.r,\n color.g,\n color.b,\n Object.prototype.hasOwnProperty.call(color, \"a\") ? color.a : 1\n );\n } else if (\n Object.prototype.hasOwnProperty.call(color, \"h\") &&\n Object.prototype.hasOwnProperty.call(color, \"s\") &&\n Object.prototype.hasOwnProperty.call(color, \"l\")\n ) {\n this.setHSL(\n color.h,\n color.s,\n color.l,\n Object.prototype.hasOwnProperty.call(color, \"a\") ? color.a : 1\n );\n } else if (\n Object.prototype.hasOwnProperty.call(color, \"h\") &&\n Object.prototype.hasOwnProperty.call(color, \"s\") &&\n Object.prototype.hasOwnProperty.call(color, \"v\")\n ) {\n this.setHSV(\n color.h,\n color.s,\n color.v,\n Object.prototype.hasOwnProperty.call(color, \"a\") ? color.a : 1\n );\n } else {\n // throw new Error(ErrMsg);\n console.warn(ErrMsg);\n }\n }\n setColor(color: any) {\n this.color = color;\n return this;\n }\n set(color: any) {\n return this.setColor(color);\n }\n\n get r() {\n return this._color.r;\n }\n set r(v: any) {\n try {\n this._color.r = clamp(Math.round(parseNumber(v)), 0, 255);\n } catch (e) {\n // do nothing\n }\n }\n\n get g() {\n return this._color.g;\n }\n set g(v: any) {\n try {\n this._color.g = clamp(Math.round(parseNumber(v)), 0, 255);\n } catch (e) {\n // do nothing\n }\n }\n\n get b() {\n return this._color.b;\n }\n set b(v: any) {\n try {\n this._color.b = clamp(Math.round(parseNumber(v)), 0, 255);\n } catch (e) {\n // do nothing\n }\n }\n\n get a() {\n return this._color.a;\n }\n set a(a: any) {\n try {\n this._color.a = clamp(parseNumber(a), 0, 1);\n } catch (e) {\n // do nothing\n }\n }\n setAlpha(a: any) {\n this.a = a;\n return this;\n }\n\n setFromVector3(v: Vector3) {\n this.r = v.x;\n this.g = v.y;\n this.b = v.z;\n return this;\n }\n\n applyMatrix3(m: Matrix3) {\n const r = this.r;\n const g = this.g;\n const b = this.b;\n const e = m.value;\n this.r = e[0] * r + e[3] * g + e[6] * b;\n this.g = e[1] * r + e[4] * g + e[7] * b;\n this.b = e[2] * r + e[5] * g + e[8] * b;\n return this;\n }\n\n fromBufferAttribute(attribute: BufferAttribute, index: number) {\n this.r = attribute.getX(index);\n this.g = attribute.getY(index);\n this.b = attribute.getZ(index);\n return this;\n }\n\n fromArray(array: number[], offset = 0) {\n this.r = array[offset];\n this.g = array[offset + 1];\n this.b = array[offset + 2];\n this.a = array[offset + 3];\n return this;\n }\n\n toArray(array: number[] = [], offset = 0) {\n array[offset] = this.r;\n array[offset + 1] = this.g;\n array[offset + 2] = this.b;\n array[offset + 3] = this.a;\n return array;\n }\n\n toRGBString(): string {\n if (this.a === 1) {\n return `rgb(${this.r},${this.g},${this.b})`;\n } else {\n return `rgba(${this.r},${this.g},${this.b},${maxDotNumber(this.a, 6)})`;\n }\n }\n\n toHexString(): string {\n if (this.a === 1) {\n return (\"000000\" + this.hex.toString(16)).slice(-6);\n } else {\n return (\"00000000\" + this.hex.toString(16)).slice(-8);\n }\n }\n\n toString(): string {\n if (this.a === 1) {\n return \"#\" + this.toHexString();\n } else {\n return this.toRGBString();\n }\n }\n\n toColorSpaceString(colorSpace = SRGBColorSpace): string {\n ColorManagement.fromWorkingColorSpace(__color.copy(this), colorSpace);\n const r = __color.r;\n const g = __color.g;\n const b = __color.b;\n if (colorSpace !== SRGBColorSpace) {\n // Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n return `color(${colorSpace} ${r.toFixed(3)} ${g.toFixed(3)} ${b.toFixed(\n 3\n )})`;\n } else {\n return this.toRGBString();\n }\n }\n\n *[Symbol.iterator]() {\n yield this.r;\n yield this.g;\n yield this.b;\n yield this.a;\n }\n\n clone(): Color {\n return new Color(this.color);\n }\n\n copy(c: Color) {\n this.setColor(c.color);\n return this;\n }\n\n copySRGBToLinear(color: Color) {\n this.r = SRGBToLinear(color.r);\n this.g = SRGBToLinear(color.g);\n this.b = SRGBToLinear(color.b);\n // this.a = SRGBToLinear(color.a);\n return this;\n }\n\n copyLinearToSRGB(color: Color) {\n this.r = LinearToSRGB(color.r);\n this.g = LinearToSRGB(color.g);\n this.b = LinearToSRGB(color.b);\n // this.a = LinearToSRGB(color.a);\n return this;\n }\n\n convertSRGBToLinear() {\n this.copySRGBToLinear(this);\n return this;\n }\n\n convertLinearToSRGB() {\n this.copyLinearToSRGB(this);\n return this;\n }\n\n equals(c: Color) {\n return c.r === this.r && c.g === this.g && c.b === this.b && c.a === this.a;\n }\n\n add(color: Color) {\n this.r = this.r + color.r;\n this.g = this.g + color.g;\n this.b = this.b + color.b;\n return this;\n }\n\n addColors(color1: Color, color2: Color) {\n this.r = color1.r + color2.r;\n this.g = color1.g + color2.g;\n this.b = color1.b + color2.b;\n return this;\n }\n\n addScalar(s: number) {\n this.r = this.r + s;\n this.g = this.g + s;\n this.b = this.b + s;\n return this;\n }\n\n setScalar(scalar: number) {\n this.r = scalar;\n this.g = scalar;\n this.b = scalar;\n return this;\n }\n\n sub(color: Color) {\n this.r = this.r - color.r;\n this.g = this.g - color.g;\n this.b = this.b - color.b;\n return this;\n }\n\n multiply(color: Color) {\n this.r = this.r * color.r;\n this.g = this.g * color.g;\n this.b = this.b * color.b;\n return this;\n }\n\n multiplyScalar(s: number) {\n this.r = this.r * s;\n this.g = this.g * s;\n this.b = this.b * s;\n return this;\n }\n\n opposite(\n bw = true, // whether to invert to black or white\n blackColor = \"#000000\",\n whiteColor = \"#ffffff\"\n ) {\n if (bw) {\n // https://stackoverflow.com/a/3943023/112731\n return this.setColor(\n this.r * 0.299 + this.g * 0.587 + this.b * 0.114 > 186\n ? blackColor\n : whiteColor\n );\n } else {\n const { r, g, b } = this.color;\n this.r = 255 - r;\n this.g = 255 - g;\n this.b = 255 - b;\n return this;\n }\n }\n\n /// t: 0 ~ 1\n lighten(t: number) {\n t = clamp(t, 0, 1);\n const { r, g, b } = this.color;\n this.r = r + (255 - r) * t;\n this.g = g + (255 - g) * t;\n this.b = b + (255 - b) * t;\n return this;\n }\n\n /// t: 0 ~ 1\n darken(t: number) {\n t = clamp(t, 0, 1);\n const { r, g, b } = this.color;\n this.r = r * (1 - t);\n this.g = g * (1 - t);\n this.b = b * (1 - t);\n return this;\n }\n\n /// 渐变色\n /// t: 0 ~ 1\n lerp(color: Color, t: number) {\n t = clamp(t, 0, 1);\n const { r, g, b } = this.color;\n this.r = r + (color.r - r) * t;\n this.g = g + (color.g - g) * t;\n this.b = b + (color.b - b) * t;\n return this;\n }\n\n /// 渐变色\n /// t: 0 ~ 1\n lerpColors(start: Color, end: Color, t: number) {\n t = clamp(t, 0, 1);\n this.r = start.r + (end.r - start.r) * t;\n this.g = start.g + (end.g - start.g) * t;\n this.b = start.b + (end.b - start.b) * t;\n return this;\n }\n\n /// 渐变色\n /// t: 0 ~ 1\n static gradient(start: string, end: string, t: number): string {\n try {\n return __color.lerpColors(new Color(start), new Color(end), t).toString();\n } catch (e) {\n return end;\n }\n }\n\n static random(): string {\n return __color.setHEX(Math.random() * 0xffffff).toString();\n }\n\n static nextIndex = 0;\n static next(startIndex = Color.nextIndex): string {\n Color.nextIndex = startIndex;\n const keys = Object.keys(Color.NAMES);\n const length = keys.length;\n return __color\n .setHEX(Color.NAMES[keys[Color.nextIndex++ % length]])\n .toString();\n }\n\n setColorName(style: string) {\n const hex = Color.NAMES[style.toLowerCase()];\n if (hex !== undefined) {\n this.setHEX(hex);\n } else if (style === \"none\") {\n this.a = 0;\n } else {\n this.a = 1;\n // throw new Error(\"Color.setColorName: Unknown color \" + style);\n console.warn(\"Color.setColorName: Unknown color \" + style);\n }\n return this;\n }\n static getColors(): string[] {\n return Object.values(Color.NAMES).map((v) => {\n return __color.setHEX(v).toString();\n });\n }\n\n setRGB(r: number, g: number, b: number, a = 1) {\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a;\n return this;\n }\n\n get rgb() {\n return {\n r: this.r,\n g: this.g,\n b: this.b,\n a: this.a\n };\n }\n\n // RRGGBB(AA)\n setHEX(hex: number) {\n hex = Math.floor(hex);\n // Math.pow(2, 24) = 16777216\n if (hex < 16777216) {\n this.r = (hex >> 16) & 0xff;\n this.g = (hex >> 8) & 0xff;\n this.b = hex & 0xff;\n this.a = 1;\n } else {\n this.r = (hex >> 24) & 0xff;\n this.g = (hex >> 16) & 0xff;\n this.b = (hex >> 8) & 0xff;\n this.a = (hex & 0xff) / 255;\n }\n return this;\n }\n\n get hex(): number {\n let hex = (this.r << 16) + (this.g << 8) + this.b;\n if (this.a !== 1) {\n // hex += Math.round(this.a * 255) << 24;\n hex = hex << 8;\n hex += Math.round(this.a * 255);\n }\n return hex;\n }\n\n /// hsl(a) : hue 色相 + saturation 饱和度 + lightness luminosity 亮度\n /// h,s,l ranges are in 0.0 ~ 1.0\n setHSL(_h: number, _s: number, _l: number, a = 1) {\n const h = euclideanModulo(_h, 1);\n const s = clamp(_s, 0, 1);\n const l = clamp(_l, 0, 1);\n if (s === 0) {\n this.r = l * 255;\n this.g = l * 255;\n this.b = l * 255;\n } else {\n const p = l <= 0.5 ? l * (1 + s) : l + s - l * s;\n const q = 2 * l - p;\n this.r = hue2rgb(q, p, h + 1 / 3) * 255;\n this.g = hue2rgb(q, p, h) * 255;\n this.b = hue2rgb(q, p, h - 1 / 3) * 255;\n }\n this.a = a;\n return this;\n }\n\n getHSL(target?: Color) {\n const r = this.r;\n const g = this.g;\n const b = this.b;\n const max = Math.max(r, g, b) / 255;\n const min = Math.min(r, g, b) / 255;\n let hue, saturation;\n const lightness = (min + max) / 2.0;\n if (min === max) {\n hue = 0;\n saturation = 0;\n } else {\n const delta = max - min;\n saturation =\n lightness <= 0.5 ? delta / (max + min) : delta / (2 - max - min);\n switch (max) {\n case r:\n hue = (g - b) / delta + (g < b ? 6 : 0);\n break;\n case g:\n hue = (b - r) / delta + 2;\n break;\n case b:\n default:\n hue = (r - g) / delta + 4;\n break;\n }\n hue /= 6;\n }\n if (target) {\n target.setHSL(hue, saturation, lightness, this.a);\n }\n return {\n h: hue,\n s: saturation,\n l: lightness,\n a: this.a\n };\n }\n\n offsetHSL(h: number, s: number, l: number) {\n const hsl = this.getHSL();\n return this.setHSL(hsl.h + h, hsl.s + s, hsl.l + l);\n }\n\n lerpHSL(color: Color, t: number) {\n const hsla = this.getHSL();\n const hslb = color.getHSL();\n const h = lerp(hsla.h, hslb.h, t);\n const s = lerp(hsla.s, hslb.s, t);\n const l = lerp(hsla.l, hslb.l, t);\n this.setHSL(h, s, l);\n return this;\n }\n\n /// hsv(a) / hsb(a) : hue 色相 + saturation 饱和度 + value or brightness 明度\n /// h,s,v ranges are in 0.0 ~ 1.0\n setHSV(_h: number, _s: number, _v: number, a = 1) {\n const h = clamp(_h, 0, 1) * 360;\n const s = clamp(_s, 0, 1);\n const v = clamp(_v, 0, 1);\n const hi = Math.floor(h / 60) % 6;\n const f = h / 60 - Math.floor(h / 60);\n const p = v * (1.0 - s);\n const q = v * (1.0 - f * s);\n const t = v * (1.0 - (1.0 - f) * s);\n const c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n this.r = c[0] * 255;\n this.g = c[1] * 255;\n this.b = c[2] * 255;\n this.a = a;\n return this;\n }\n\n getHSV(target?: Color) {\n const { r, g, b, a } = this.color;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n let h;\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n const _h = delta == 0 ? 0 : h;\n const _s = max === 0 ? 0 : delta / max;\n const _v = max / 255;\n if (target) {\n target.setHSV(_h, _s, _v, a);\n }\n return {\n h: _h,\n s: _s,\n v: _v,\n a: a\n };\n }\n}\n\n// 可复用的对象\nexport const __color = new Color();\n\nexport function SRGBToLinear(c: number): number {\n return c < 0.04045\n ? c * 0.0773993808\n : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4);\n}\n\nexport function LinearToSRGB(c: number): number {\n return c < 0.0031308 ? c * 12.92 : 1.055 * Math.pow(c, 0.41666) - 0.055;\n}\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\nexport const NoColorSpace = \"\";\nexport const SRGBColorSpace = \"srgb\";\nexport const LinearSRGBColorSpace = \"srgb-linear\";\n\nexport const LinearTransfer = \"linear\";\nexport const SRGBTransfer = \"srgb\";\n\nconst LINEAR_REC709_TO_XYZ: Matrix3 = new Matrix3().set(\n 0.4123908,\n 0.3575843,\n 0.1804808,\n 0.212639,\n 0.7151687,\n 0.0721923,\n 0.0193308,\n 0.1191948,\n 0.9505322\n);\nconst XYZ_TO_LINEAR_REC709: Matrix3 = new Matrix3().set(\n 3.2409699,\n -1.5373832,\n -0.4986108,\n -0.9692436,\n 1.8759675,\n 0.0415551,\n 0.0556301,\n -0.203977,\n 1.0569715\n);\nconst REC709_PRIMARIES = [0.64, 0.33, 0.3, 0.6, 0.15, 0.06];\nconst REC709_LUMINANCE_COEFFICIENTS = [0.2126, 0.7152, 0.0722];\nconst D65 = [0.3127, 0.329];\n\nexport const ColorManagement = {\n enabled: true,\n\n workingColorSpace: LinearSRGBColorSpace,\n\n /**\n * Implementations of supported color spaces.\n *\n * Required:\n *\t- primaries: chromaticity coordinates [ rx ry gx gy bx by ]\n *\t- whitePoint: reference white [ x y ]\n *\t- transfer: transfer function (pre-defined)\n *\t- toXYZ: Matrix3 RGB to XYZ transform\n *\t- fromXYZ: Matrix3 XYZ to RGB transform\n *\t- luminanceCoefficients: RGB luminance coefficients\n *\n * Optional:\n * - outputColorSpaceConfig: { drawingBufferColorSpace: ColorSpace }\n * - workingColorSpaceConfig: { unpackColorSpace: ColorSpace }\n *\n * Reference:\n * - https://www.russellcottrell.com/photo/matrixCalculator.htm\n */\n spaces: {} as Record<string, Record<string, any>>,\n\n convert: function (\n color: Color,\n sourceColorSpace: string,\n targetColorSpace: string\n ): Color {\n if (\n this.enabled === false ||\n sourceColorSpace === targetColorSpace ||\n !sourceColorSpace ||\n !targetColorSpace\n ) {\n return color;\n }\n\n if (this.spaces[sourceColorSpace].transfer === SRGBTransfer) {\n color.r = SRGBToLinear(color.r);\n color.g = SRGBToLinear(color.g);\n color.b = SRGBToLinear(color.b);\n // color.a = SRGBToLinear(color.a);\n }\n\n if (\n this.spaces[sourceColorSpace].primaries !==\n this.spaces[targetColorSpace].primaries\n ) {\n color.applyMatrix3(this.spaces[sourceColorSpace].toXYZ);\n color.applyMatrix3(this.spaces[targetColorSpace].fromXYZ);\n }\n\n if (this.spaces[targetColorSpace].transfer === SRGBTransfer) {\n color.r = LinearToSRGB(color.r);\n color.g = LinearToSRGB(color.g);\n color.b = LinearToSRGB(color.b);\n // color.a = LinearToSRGB(color.a);\n }\n\n return color;\n },\n\n fromWorkingColorSpace: function (color: Color, targetColorSpace: string) {\n return this.convert(color, this.workingColorSpace, targetColorSpace);\n },\n\n toWorkingColorSpace: function (color: Color, sourceColorSpace: string) {\n return this.convert(color, sourceColorSpace, this.workingColorSpace);\n },\n\n getPrimaries: function (colorSpace: string) {\n return this.spaces[colorSpace].primaries;\n },\n\n getTransfer: function (colorSpace: string) {\n if (colorSpace === NoColorSpace) {\n return LinearTransfer;\n }\n return this.spaces[colorSpace].transfer;\n },\n\n getLuminanceCoefficients: function (\n this: any,\n target: Color,\n colorSpace = this.workingColorSpace\n ) {\n return target.fromArray(this.spaces[colorSpace].luminanceCoefficients);\n },\n\n define: function (colorSpaces: Record<string, Record<string, any>>) {\n Object.assign(this.spaces, colorSpaces);\n },\n\n // Internal APIs\n\n _getMatrix: function (\n targetMatrix: Matrix3,\n sourceColorSpace: string,\n targetColorSpace: string\n ) {\n return targetMatrix\n .copy(this.spaces[sourceColorSpace].toXYZ)\n .multiply(this.spaces[targetColorSpace].fromXYZ);\n },\n\n _getDrawingBufferColorSpace: function (colorSpace: string) {\n return this.spaces[colorSpace].outputColorSpaceConfig\n .drawingBufferColorSpace;\n },\n\n _getUnpackColorSpace: function (\n this: any,\n colorSpace = this.workingColorSpace\n ) {\n return this.spaces[colorSpace].workingColorSpaceConfig.unpackColorSpace;\n }\n};\n\nColorManagement.define({\n [LinearSRGBColorSpace]: {\n primaries: REC709_PRIMARIES,\n whitePoint: D65,\n transfer: LinearTransfer,\n toXYZ: LINEAR_REC709_TO_XYZ,\n fromXYZ: XYZ_TO_LINEAR_REC709,\n luminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n workingColorSpaceConfig: { unpackColorSpace: SRGBColorSpace },\n outputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n },\n\n [SRGBColorSpace]: {\n primaries: REC709_PRIMARIES,\n whitePoint: D65,\n transfer: SRGBTransfer,\n toXYZ: LINEAR_REC709_TO_XYZ,\n fromXYZ: XYZ_TO_LINEAR_REC709,\n luminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n outputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n }\n});\n\nfunction hue2rgb(p: number, q: number, t: number) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t);\n return p;\n}\n","export function createObjectURL(blob: File | Blob | MediaSource) {\n return window.URL.createObjectURL(blob);\n}\n\nexport function revokeObjectURL(url: string) {\n return window.URL.revokeObjectURL(url);\n}\n","import { CacheMap } from \"@zyzgroup/core-common\";\nimport { getImageData } from \"../image\";\nimport { createObjectURL } from \"./useObjectURL\";\n\n// \"https://s3-us-west-2.amazonaws.com/s.cdpn.io/181794/kl-owl.png\"\n// \"https://s3-us-west-2.amazonaws.com/s.cdpn.io/181794/kl-deer.png\"\n// \"https://s3-us-west-2.amazonaws.com/s.cdpn.io/181794/kl-hipster.png\"\n// \"https://s3-us-west-2.amazonaws.com/s.cdpn.io/181794/kl-ram.png\"\n// \"https://s3-us-west-2.amazonaws.com/s.cdpn.io/181794/kl-dog.png\"\n// \"https://s3-us-west-2.amazonaws.com/s.cdpn.io/181794/kl-sideram.png\"\n// \"https://s3-us-west-2.amazonaws.com/s.cdpn.io/181794/kl-multiram.png\"\n// \"https://s3-us-west-2.amazonaws.com/s.cdpn.io/181794/kl-gorilla.png\"\n// \"https://s3-us-west-2.amazonaws.com/s.cdpn.io/181794/kl-bird.png\"\n\nexport interface RawImageInfo {\n width: number;\n height: number;\n aspectRatio: number;\n element: HTMLImageElement;\n imageData?: ImageData;\n}\n\nconst caches = new CacheMap<string, RawImageInfo>();\n\nexport async function useLoadImage(url: string | Blob | File, ms = 60000) {\n return new Promise<RawImageInfo>((resolve, reject) => {\n const finalUrl = typeof url === \"string\" ? url : createObjectURL(url);\n const cached = caches.get(finalUrl);\n if (cached) {\n return resolve(cached);\n }\n const image = document.createElement(\"img\");\n // const image = new Image();\n // only works if the remote server sets : Access-Control-Allow-Origin \"*\"\n // image.crossOrigin = \"Anonymous\";\n // image.setAttribute(\"crossOrigin\", \"\");\n image.onload = (e) => {\n clearTimeout(timeout);\n const width = image.naturalWidth || image.width;\n const height = image.naturalHeight || image.height;\n const rawImageInfo = {\n width,\n height,\n aspectRatio: width / height,\n element: image,\n imageData: getImageData(image)\n };\n caches.set(finalUrl, rawImageInfo);\n resolve(rawImageInfo);\n // avoid memory leaks in IE\n image.onerror = image.onload = null;\n };\n image.onerror = (e) => {\n clearTimeout(timeout);\n reject(e);\n };\n image.src = finalUrl;\n const timeout: ReturnType<typeof setTimeout> = setTimeout(() => {\n reject(\"Timeout!\");\n }, ms);\n // document.body.appendChild(image);\n });\n}\n","export function useClickA(blobOrUrl: Blob | string, fileName: string) {\n const a = document.createElement(\"a\");\n a.style.visibility = \"hidden\";\n a.download = fileName;\n if (typeof blobOrUrl === \"string\") {\n a.href = blobOrUrl;\n } else {\n a.href = window.URL.createObjectURL(blobOrUrl);\n }\n // document.body.appendChild(a);\n a.click();\n // document.body.removeChild(a);\n // window.URL.revokeObjectURL(a.href);\n}\n","import { type AnyElement } from \"@zyzgroup/core-common\";\nimport { useAttribute } from \"./useAttribute\";\n\nexport function toggleClass(\n el: AnyElement,\n className: string,\n act: \"toggle\" | \"add\" | \"remove\" = \"toggle\"\n) {\n const classNames = className.split(/[,\\s]+/);\n if (el.classList) {\n classNames.forEach((singleClassName) => {\n const name = singleClassName.trim();\n if (name !== \"\") {\n el.classList[act](name);\n }\n });\n } else {\n const exists = el.className.split(/ +/);\n let isUpdate = false;\n classNames.forEach((singleClassName) => {\n const name = singleClassName.trim();\n if (name !== \"\") {\n const index = exists.indexOf(name);\n switch (act) {\n case \"add\":\n if (index === -1) {\n exists.push(name);\n isUpdate = true;\n }\n break;\n case \"remove\":\n if (index !== -1) {\n exists.splice(index, 1);\n isUpdate = true;\n }\n break;\n case \"toggle\":\n if (index === -1) {\n exists.push(name);\n } else {\n exists.splice(index, 1);\n }\n isUpdate = true;\n break;\n }\n }\n });\n if (isUpdate) {\n useAttribute(\n el,\n \"class\",\n exists.join(\" \").replace(/^\\s+/, \"\").replace(/\\s+$/, \"\")\n );\n }\n }\n}\n\nexport function addClass(el: AnyElement, className: string) {\n toggleClass(el, className, \"add\");\n}\n\nexport function removeClass(el: AnyElement, className: string) {\n toggleClass(el, className, \"remove\");\n}\n\nexport function hasClass(el: AnyElement, className: string): boolean {\n return (\n new RegExp(\"(?:^|\\\\s+)\" + className + \"(?:\\\\s+|$)\").test(el.className) ||\n false\n );\n}\n","import { AnyElement, AnyNode } from \"@zyzgroup/core-common\";\nimport { getStyle } from \"./useStyle\";\n\n// document.querySelector(\".element\");\n// document.querySelector(\"#element\");\n// document.querySelector(\"div\");\n// document.querySelector('[name=\"username\"]');\n// document.querySelector(\"div + p > span\");\n// document.querySelectorAll(\"p\");\n// document.getElementById(\"id属性值\");\n// document.getElementsByClassName(\"class属性值\");\n// document.getElementsByTagName(\"标签名\");\n// document.getElementsByName(\"name属性值\");\n// element.querySelector(\"CSS选择器\");\n// element.querySelectorAll(\"CSS选择器\");\n// document.documentElement; // 获取页面中的HTML标签;\n// document.body;\n\nexport function useElement(el: AnyElement) {\n // document.defaultView\n // document.parentWindow\n\n return {\n el,\n\n isRoot: () =>\n /(html|body)/i.test(el.tagName) || el === document.documentElement,\n\n isActive: () => {\n // http://stackoverflow.com/posts/2684561/revisions\n return (\n el === document.activeElement && ((el as any).type || (el as any).href)\n );\n },\n\n getRemSize: function () {\n return parseFloat(getComputedStyle(document.documentElement).fontSize);\n },\n\n rem2px: function (rem: number) {\n return rem * this.getRemSize();\n },\n\n getEmSize: function () {\n return el.parentElement\n ? parseFloat(getComputedStyle(el.parentElement).fontSize)\n : this.getRemSize();\n },\n\n nearestElement: () => {\n let elm = el;\n while (elm && elm.nodeType !== 1 /* ELEMENT */ && elm.parentElement) {\n elm = elm.parentElement;\n }\n return elm;\n },\n\n parent: () => {\n return el.parentElement;\n // return el.parentNode;\n },\n\n parents: function (\n this: any,\n node: AnyElement | null = el,\n ps: AnyElement[] = []\n ) {\n if (!node || node.parentElement === null) {\n return ps;\n }\n return this.parents(node.parentElement, ps.concat([node]));\n },\n\n scrollParent: function (this: any) {\n const ps = this.parents();\n for (let i = 0, n = ps.length; i < n; i++) {\n if (\n /(auto|scroll)/.test(\n getStyle(ps[i], \"overflow\") +\n getStyle(ps[i], \"overflow-y\") +\n getStyle(ps[i], \"overflow-x\")\n )\n ) {\n return ps[i];\n }\n }\n return document.scrollingElement || document.documentElement;\n },\n\n contains: (child: AnyElement) => {\n if (el.contains) {\n return el != child && el.contains(child);\n } else {\n return !!(el.compareDocumentPosition(child) & 16);\n }\n },\n\n siblings: () => {\n return Array.prototype.slice\n .call(el.parentElement?.children)\n .filter((child) => child !== el);\n },\n\n nextElementSibling: () => {\n return el.nextElementSibling;\n },\n\n previousElementSibling: () => {\n return el.previousElementSibling;\n },\n\n closest: (selector: string) => {\n return el.closest(selector);\n },\n\n shadowRoot: () => {\n return el.shadowRoot;\n },\n\n isInput: () => {\n return el.tagName === \"INPUT\" || el instanceof HTMLInputElement;\n },\n\n isSelect: () => {\n return el.tagName === \"SELECT\" || el instanceof HTMLSelectElement;\n },\n\n isTextArea: () => {\n return el.tagName === \"TEXTAREA\" || el instanceof HTMLTextAreaElement;\n },\n\n isInputCheckbox: function (this: any) {\n return this.isInput(el) && el.getAttribute(\"type\") === \"checkbox\";\n },\n\n isInputRadio: function (this: any) {\n return this.isInput(el) && el.getAttribute(\"type\") === \"radio\";\n },\n\n isInputText: function (this: any) {\n return this.isInput(el) && el.getAttribute(\"type\") === \"text\";\n },\n\n isInputNumber: function (this: any) {\n return this.isInput(el) && el.getAttribute(\"type\") === \"number\";\n },\n\n changeSelected: function (this: any, selectedValue: string) {\n if (this.isSelect()) {\n const options = (el as HTMLSelectElement).options;\n for (let i = 0, len = options.length; i < len; i++) {\n options[i].selected = options[i].value == selectedValue;\n }\n }\n },\n\n changeRadioChecked: function (this: any, checkedValue: string) {\n if (this.isInputRadio()) {\n const options = document.getElementsByName(\n (el as HTMLInputElement).name\n );\n for (let i = 0, len = options.length; i < len; i++) {\n const option = options[i] as HTMLInputElement;\n option.checked = option.value == checkedValue;\n }\n }\n },\n\n changeCheckboxChecked: function (this: any, checked: boolean) {\n if (this.isInputCheckbox()) {\n (el as HTMLInputElement).checked = checked;\n }\n },\n\n insert: (\n html: string | AnyElement,\n method:\n | \"append\"\n | \"appendChild\"\n | \"prepend\"\n | \"after\"\n | \"before\"\n | \"replaceWith\" = \"append\"\n ) => {\n if (typeof html == \"string\") {\n el[method](createFragment(html));\n } else {\n el[method](html);\n }\n },\n\n html: function (this: any, html: string | AnyElement) {\n if (typeof html == \"string\") {\n el.innerHTML = html;\n const newEl = scriptConvert(el);\n if (newEl != el) {\n el = newEl;\n }\n } else {\n this.insert(html, \"replaceWith\");\n }\n },\n\n empty: function (this: any) {\n this.html(\"\");\n },\n\n text: (text: string) => {\n el.textContent = text;\n },\n\n getInnerText: () => {\n if (el instanceof SVGElement) {\n return \"\";\n }\n let copyText = el.innerText;\n if (!copyText) {\n const slots = el.querySelector(\"slot\")?.assignedNodes() || [];\n let index = 0;\n while (!copyText && index <= slots.length - 1) {\n if (\"innerText\" in slots[index]) {\n copyText = (slots[index] as HTMLElement).innerText;\n }\n index++;\n }\n }\n return copyText;\n },\n\n remove: () => {\n return el.remove();\n // return el.parentElement?.removeChild(el);\n }\n };\n}\n\n// document.createDocumentFragment()\n// DocumentFragment 接口表示一个没有父级文件的最小文档对象\n// 因为 DocumentFragment 不是真实 DOM 树的一部分,它的变化不会引起 DOM 树的重新渲染的操作(reflow),不会导致性能问题\nexport function createFragment(\n html: string,\n convert = false // 性能优化\n): DocumentFragment {\n const tmpl = document.createElement(\"template\");\n tmpl.innerHTML = html;\n if (convert) {\n tmpl.content.childNodes.forEach((node) => {\n const newNode = scriptConvert(node as AnyElement);\n if (newNode != node) {\n tmpl.content.replaceChild(newNode, node);\n }\n });\n }\n return tmpl.content;\n}\n\nexport function createElement(tagName: string) {\n return document.createElement.call(document, tagName);\n}\n\nexport function createElementNS(name: string) {\n return document.createElementNS(\"http://www.w3.org/1999/xhtml\", name);\n}\n\nexport function createTextNode(data: string) {\n return document.createTextNode.call(document, data);\n}\n\nfunction scriptConvert(el: AnyElement) {\n if (el.tagName == \"SCRIPT\") {\n el = convert(el as HTMLScriptElement);\n }\n if (el.querySelectorAll) {\n el.querySelectorAll(\"script\").forEach((e) => {\n e.parentNode?.replaceChild(convert(e), e);\n });\n }\n return el;\n}\n\n// innerHTML, append, etc. script tags will not be executed unless they are proper script tags\nfunction convert(el: HTMLScriptElement) {\n const script = el.ownerDocument.createElement(\"script\");\n script.text = el.text;\n const attrs = el.attributes;\n for (let i = 0, n = attrs.length; i < n; i++) {\n script.setAttribute(attrs[i].name, attrs[i].value);\n }\n return script;\n}\n\nexport function useShadowRoot(el: AnyNode) {\n return {\n shadowRoot: () => {\n let root: AnyNode = el;\n while (root) {\n const p = el.parentElement || el.parentNode;\n if (p) {\n root = p;\n } else {\n break;\n }\n }\n return root;\n }\n };\n}\n","export async function useClipboard(text: string) {\n if (navigator.clipboard) {\n return await navigator.clipboard.writeText(text);\n } else {\n const textArea = document.createElement(\"textarea\");\n textArea.value = text;\n textArea.style.opacity = \"0\";\n // avoid scrolling to bottom\n textArea.style.position = \"fixed\";\n textArea.style.top = \"0\";\n textArea.style.left = \"0\";\n // document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n // document.body.removeChild(textArea);\n return document.execCommand(\"copy\");\n }\n}\n","import { type AnyElement } from \"@zyzgroup/core-common\";\nimport {\n atomReadAttributes,\n atomWriteAttribute,\n atomRemoveStyle,\n atomWriteStyle\n} from \"./hooks\";\n\n// Virtual DOM 其实就是一棵以 VNode节点 作为基础的树\nexport interface VNode {\n tag: string;\n props: { [index: string]: any };\n children: string | VNode[];\n // 挂载后才会有el\n el?: AnyElement;\n // 下次更新时的来源\n alternate?: VNode;\n}\n\n/// 将 tag 转化为 vnode\nexport function h(\n tag: string,\n props: { [index: string]: any } = {},\n children: string | VNode[] = [],\n el?: AnyElement\n): VNode {\n return {\n tag,\n props,\n children,\n el\n };\n}\n\nexport function hFromEl(el: AnyElement): VNode {\n return h(\n el.tagName,\n atomReadAttributes(el),\n Array.from(el.children).map((e) => hFromEl(e as AnyElement)),\n el\n );\n}\n\n/// 将 vnode 挂载到 真实dom 上\nexport function mount(\n vnode: VNode,\n parentContainer: AnyElement = document.documentElement\n): AnyElement {\n if (vnode.el) {\n return vnode.el;\n }\n vnode.el = document.createElement(vnode.tag);\n if (vnode.props) {\n for (const k in vnode.props) {\n const v = vnode.props[k];\n if (k.startsWith(\"on\")) {\n vnode.el.addEventListener(k.slice(2).toLowerCase(), v);\n } else if (k === \"style\") {\n atomWriteStyle(vnode.el, vnode.props[k]);\n } else {\n atomWriteAttribute(vnode.el, k, v);\n }\n }\n }\n if (vnode.children) {\n if (typeof vnode.children == \"string\") {\n vnode.el.appendChild(document.createTextNode(vnode.children));\n // vnode.el.textContent = vnode.children;\n // vnode.el.innerHTML = vnode.children;\n } else {\n vnode.children.forEach((item) => {\n mount(item, vnode.el);\n });\n }\n }\n parentContainer.appendChild(vnode.el);\n return vnode.el;\n}\n\n/// diff vnode to 真实dom\nexport function patch(oldVnode: VNode, newVnode: VNode): void {\n if (!oldVnode.el) {\n return;\n }\n // 不同 tag\n if (oldVnode.tag !== newVnode.tag) {\n (oldVnode.el.parentElement || document.body).replaceChild(\n mount(newVnode),\n oldVnode.el\n );\n return;\n }\n // 相同 tag\n const el = (newVnode.el = oldVnode.el);\n const oldProps = oldVnode.props;\n const newProps = newVnode.props;\n for (const k in oldProps) {\n if (!(k in newProps)) {\n if (k.startsWith(\"on\")) {\n el.removeEventListener(k.slice(2).toLowerCase(), oldProps[k]);\n } else {\n el.removeAttribute(k);\n }\n }\n }\n for (const k in newProps) {\n const oldValue = oldProps[k];\n const newValue = newProps[k];\n if (newValue != oldValue) {\n if (k.startsWith(\"on\")) {\n const name = k.slice(2).toLowerCase();\n el.removeEventListener(name, oldValue);\n el.addEventListener(name, newValue);\n } else if (k === \"style\") {\n for (const sk in oldValue) {\n if (!(sk in newValue)) {\n atomRemoveStyle(el, sk);\n }\n }\n atomWriteStyle(el, newValue);\n } else {\n atomWriteAttribute(el, k, newValue);\n }\n }\n }\n const oldChildren = oldVnode.children || [];\n const newChildren = newVnode.children || [];\n if (typeof newChildren == \"string\") {\n // el.textContent = newChildren;\n el.innerHTML = newChildren;\n } else {\n if (typeof oldChildren == \"string\") {\n el.innerHTML = \"\";\n newChildren.forEach((item) => {\n mount(item, el);\n });\n } else {\n const commonLength = Math.min(oldChildren.length, newChildren.length);\n for (let i = 0; i < commonLength; i++) {\n patch(oldChildren[i], newChildren[i]);\n }\n if (newChildren.length > oldChildren.length) {\n newChildren.slice(oldChildren.length).forEach((item) => {\n mount(item, el);\n });\n }\n if (newChildren.length < oldChildren.length) {\n oldChildren.slice(newChildren.length).forEach((item) => {\n if (item.el) {\n el.removeChild(item.el);\n }\n });\n }\n }\n }\n}\n","<template>\n <div class=\"page\">\n <div class=\"page-header\">\n <slot name=\"header\"></slot>\n </div>\n\n <div class=\"page-main\">\n <div class=\"page-main-scroll\">\n <slot></slot>\n </div>\n </div>\n\n <div class=\"page-footer\">\n <slot name=\"footer\"></slot>\n </div>\n\n <div class=\"page-global\">\n <slot name=\"global\"></slot>\n </div>\n </div>\n</template>\n\n<style scoped>\n.page {\n position: relative;\n width: 100%;\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n.page-header {\n position: relative;\n z-index: 1;\n flex: 0 0 auto;\n}\n.page-footer {\n position: relative;\n z-index: 1;\n flex: 0 0 auto;\n}\n.page-main {\n position: relative;\n z-index: 2;\n flex: 1 1 auto;\n width: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n.page-main-scroll {\n position: relative;\n z-index: 3;\n flex: 1 1 auto;\n width: 100%;\n overflow-y: scroll;\n}\n/*\n.page-main-scroll > :nth-child(1) {\n min-height: 100%;\n}\n*/\n</style>\n\n<script setup lang=\"ts\">\n// for merge ce shadow-root styles\ndefineOptions({\n customOptions: {},\n inheritAttrs: true\n});\n\ndefineExpose({});\n</script>\n","<script lang=\"tsx\" setup>\nimport { ref } from \"vue\";\nimport {setWindowTitle} from \"@zyzgroup/core-web\"\nimport LayoutPage from \"../layout/LayoutPage.vue\";\nimport { useRoute } from \"../../hooks\";\n\n// for merge ce shadow-root styles\ndefineOptions({\n inheritAttrs: true,\n customOptions: { LayoutPage }\n});\n\nconst props = withDefaults(\n defineProps<{\n src?: string; // https://erichd2.oss-cn-shanghai.aliyuncs.com/0000/0002/2159\n title?: string;\n }>(),\n {\n src: \"\",\n title: \"\"\n }\n);\n\nconst route = useRoute();\nsetWindowTitle(typeof route.params.title == \"string\" ? route.params.title : props.title);\nconst src = decodeURIComponent(typeof route.params.src == \"string\" ? route.params.src : props.src);\n\n</script>\n\n<template>\n <LayoutPage>\n <div class=\"view-document\">\n <img\n class=\"img\"\n :src=\"src\"\n ></img>\n </div>\n </LayoutPage>\n</template>\n\n<style scoped>\n.view-document {\n box-sizing: border-box;\n width: 100%;\n padding: 15px;\n}\n.img {\n width: 100%;\n}\n</style>\n","import { h, defineComponent } from 'vue';\n\nconst matchIconName = /^[a-z0-9]+(-[a-z0-9]+)*$/;\nconst stringToIcon = (value, validate, allowSimpleName, provider = \"\") => {\n const colonSeparated = value.split(\":\");\n if (value.slice(0, 1) === \"@\") {\n if (colonSeparated.length < 2 || colonSeparated.length > 3) {\n return null;\n }\n provider = colonSeparated.shift().slice(1);\n }\n if (colonSeparated.length > 3 || !colonSeparated.length) {\n return null;\n }\n if (colonSeparated.length > 1) {\n const name2 = colonSeparated.pop();\n const prefix = colonSeparated.pop();\n const result = {\n // Allow provider without '@': \"provider:prefix:name\"\n provider: colonSeparated.length > 0 ? colonSeparated[0] : provider,\n prefix,\n name: name2\n };\n return validate && !validateIconName(result) ? null : result;\n }\n const name = colonSeparated[0];\n const dashSeparated = name.split(\"-\");\n if (dashSeparated.length > 1) {\n const result = {\n provider,\n prefix: dashSeparated.shift(),\n name: dashSeparated.join(\"-\")\n };\n return validate && !validateIconName(result) ? null : result;\n }\n if (allowSimpleName && provider === \"\") {\n const result = {\n provider,\n prefix: \"\",\n name\n };\n return validate && !validateIconName(result, allowSimpleName) ? null : result;\n }\n return null;\n};\nconst validateIconName = (icon, allowSimpleName) => {\n if (!icon) {\n return false;\n }\n return !!// Check prefix: cannot be empty, unless allowSimpleName is enabled\n // Check name: cannot be empty\n ((allowSimpleName && icon.prefix === \"\" || !!icon.prefix) && !!icon.name);\n};\n\nconst defaultIconDimensions = Object.freeze(\n {\n left: 0,\n top: 0,\n width: 16,\n height: 16\n }\n);\nconst defaultIconTransformations = Object.freeze({\n rotate: 0,\n vFlip: false,\n hFlip: false\n});\nconst defaultIconProps = Object.freeze({\n ...defaultIconDimensions,\n ...defaultIconTransformations\n});\nconst defaultExtendedIconProps = Object.freeze({\n ...defaultIconProps,\n body: \"\",\n hidden: false\n});\n\nfunction mergeIconTransformations(obj1, obj2) {\n const result = {};\n if (!obj1.hFlip !== !obj2.hFlip) {\n result.hFlip = true;\n }\n if (!obj1.vFlip !== !obj2.vFlip) {\n result.vFlip = true;\n }\n const rotate = ((obj1.rotate || 0) + (obj2.rotate || 0)) % 4;\n if (rotate) {\n result.rotate = rotate;\n }\n return result;\n}\n\nfunction mergeIconData(parent, child) {\n const result = mergeIconTransformations(parent, child);\n for (const key in defaultExtendedIconProps) {\n if (key in defaultIconTransformations) {\n if (key in parent && !(key in result)) {\n result[key] = defaultIconTransformations[key];\n }\n } else if (key in child) {\n result[key] = child[key];\n } else if (key in parent) {\n result[key] = parent[key];\n }\n }\n return result;\n}\n\nfunction getIconsTree(data, names) {\n const icons = data.icons;\n const aliases = data.aliases || /* @__PURE__ */ Object.create(null);\n const resolved = /* @__PURE__ */ Object.create(null);\n function resolve(name) {\n if (icons[name]) {\n return resolved[name] = [];\n }\n if (!(name in resolved)) {\n resolved[name] = null;\n const parent = aliases[name] && aliases[name].parent;\n const value = parent && resolve(parent);\n if (value) {\n resolved[name] = [parent].concat(value);\n }\n }\n return resolved[name];\n }\n (Object.keys(icons).concat(Object.keys(aliases))).forEach(resolve);\n return resolved;\n}\n\nfunction internalGetIconData(data, name, tree) {\n const icons = data.icons;\n const aliases = data.aliases || /* @__PURE__ */ Object.create(null);\n let currentProps = {};\n function parse(name2) {\n currentProps = mergeIconData(\n icons[name2] || aliases[name2],\n currentProps\n );\n }\n parse(name);\n tree.forEach(parse);\n return mergeIconData(data, currentProps);\n}\n\nfunction parseIconSet(data, callback) {\n const names = [];\n if (typeof data !== \"object\" || typeof data.icons !== \"object\") {\n return names;\n }\n if (data.not_found instanceof Array) {\n data.not_found.forEach((name) => {\n callback(name, null);\n names.push(name);\n });\n }\n const tree = getIconsTree(data);\n for (const name in tree) {\n const item = tree[name];\n if (item) {\n callback(name, internalGetIconData(data, name, item));\n names.push(name);\n }\n }\n return names;\n}\n\nconst optionalPropertyDefaults = {\n provider: \"\",\n aliases: {},\n not_found: {},\n ...defaultIconDimensions\n};\nfunction checkOptionalProps(item, defaults) {\n for (const prop in defaults) {\n if (prop in item && typeof item[prop] !== typeof defaults[prop]) {\n return false;\n }\n }\n return true;\n}\nfunction quicklyValidateIconSet(obj) {\n if (typeof obj !== \"object\" || obj === null) {\n return null;\n }\n const data = obj;\n if (typeof data.prefix !== \"string\" || !obj.icons || typeof obj.icons !== \"object\") {\n return null;\n }\n if (!checkOptionalProps(obj, optionalPropertyDefaults)) {\n return null;\n }\n const icons = data.icons;\n for (const name in icons) {\n const icon = icons[name];\n if (\n // Name cannot be empty\n !name || // Must have body\n typeof icon.body !== \"string\" || // Check other props\n !checkOptionalProps(\n icon,\n defaultExtendedIconProps\n )\n ) {\n return null;\n }\n }\n const aliases = data.aliases || /* @__PURE__ */ Object.create(null);\n for (const name in aliases) {\n const icon = aliases[name];\n const parent = icon.parent;\n if (\n // Name cannot be empty\n !name || // Parent must be set and point to existing icon\n typeof parent !== \"string\" || !icons[parent] && !aliases[parent] || // Check other props\n !checkOptionalProps(\n icon,\n defaultExtendedIconProps\n )\n ) {\n return null;\n }\n }\n return data;\n}\n\nconst dataStorage = /* @__PURE__ */ Object.create(null);\nfunction newStorage(provider, prefix) {\n return {\n provider,\n prefix,\n icons: /* @__PURE__ */ Object.create(null),\n missing: /* @__PURE__ */ new Set()\n };\n}\nfunction getStorage(provider, prefix) {\n const providerStorage = dataStorage[provider] || (dataStorage[provider] = /* @__PURE__ */ Object.create(null));\n return providerStorage[prefix] || (providerStorage[prefix] = newStorage(provider, prefix));\n}\nfunction addIconSet(storage, data) {\n if (!quicklyValidateIconSet(data)) {\n return [];\n }\n return parseIconSet(data, (name, icon) => {\n if (icon) {\n storage.icons[name] = icon;\n } else {\n storage.missing.add(name);\n }\n });\n}\nfunction addIconToStorage(storage, name, icon) {\n try {\n if (typeof icon.body === \"string\") {\n storage.icons[name] = { ...icon };\n return true;\n }\n } catch (err) {\n }\n return false;\n}\nfunction listIcons(provider, prefix) {\n let allIcons = [];\n const providers = typeof provider === \"string\" ? [provider] : Object.keys(dataStorage);\n providers.forEach((provider2) => {\n const prefixes = typeof provider2 === \"string\" && typeof prefix === \"string\" ? [prefix] : Object.keys(dataStorage[provider2] || {});\n prefixes.forEach((prefix2) => {\n const storage = getStorage(provider2, prefix2);\n allIcons = allIcons.concat(\n Object.keys(storage.icons).map(\n (name) => (provider2 !== \"\" ? \"@\" + provider2 + \":\" : \"\") + prefix2 + \":\" + name\n )\n );\n });\n });\n return allIcons;\n}\n\nlet simpleNames = false;\nfunction allowSimpleNames(allow) {\n if (typeof allow === \"boolean\") {\n simpleNames = allow;\n }\n return simpleNames;\n}\nfunction getIconData(name) {\n const icon = typeof name === \"string\" ? stringToIcon(name, true, simpleNames) : name;\n if (icon) {\n const storage = getStorage(icon.provider, icon.prefix);\n const iconName = icon.name;\n return storage.icons[iconName] || (storage.missing.has(iconName) ? null : void 0);\n }\n}\nfunction addIcon(name, data) {\n const icon = stringToIcon(name, true, simpleNames);\n if (!icon) {\n return false;\n }\n const storage = getStorage(icon.provider, icon.prefix);\n if (data) {\n return addIconToStorage(storage, icon.name, data);\n } else {\n storage.missing.add(icon.name);\n return true;\n }\n}\nfunction addCollection(data, provider) {\n if (typeof data !== \"object\") {\n return false;\n }\n if (typeof provider !== \"string\") {\n provider = data.provider || \"\";\n }\n if (simpleNames && !provider && !data.prefix) {\n let added = false;\n if (quicklyValidateIconSet(data)) {\n data.prefix = \"\";\n parseIconSet(data, (name, icon) => {\n if (addIcon(name, icon)) {\n added = true;\n }\n });\n }\n return added;\n }\n const prefix = data.prefix;\n if (!validateIconName({\n provider,\n prefix,\n name: \"a\"\n })) {\n return false;\n }\n const storage = getStorage(provider, prefix);\n return !!addIconSet(storage, data);\n}\nfunction iconLoaded(name) {\n return !!getIconData(name);\n}\nfunction getIcon(name) {\n const result = getIconData(name);\n return result ? {\n ...defaultIconProps,\n ...result\n } : result;\n}\n\nconst defaultIconSizeCustomisations = Object.freeze({\n width: null,\n height: null\n});\nconst defaultIconCustomisations = Object.freeze({\n // Dimensions\n ...defaultIconSizeCustomisations,\n // Transformations\n ...defaultIconTransformations\n});\n\nconst unitsSplit = /(-?[0-9.]*[0-9]+[0-9.]*)/g;\nconst unitsTest = /^-?[0-9.]*[0-9]+[0-9.]*$/g;\nfunction calculateSize(size, ratio, precision) {\n if (ratio === 1) {\n return size;\n }\n precision = precision || 100;\n if (typeof size === \"number\") {\n return Math.ceil(size * ratio * precision) / precision;\n }\n if (typeof size !== \"string\") {\n return size;\n }\n const oldParts = size.split(unitsSplit);\n if (oldParts === null || !oldParts.length) {\n return size;\n }\n const newParts = [];\n let code = oldParts.shift();\n let isNumber = unitsTest.test(code);\n while (true) {\n if (isNumber) {\n const num = parseFloat(code);\n if (isNaN(num)) {\n newParts.push(code);\n } else {\n newParts.push(Math.ceil(num * ratio * precision) / precision);\n }\n } else {\n newParts.push(code);\n }\n code = oldParts.shift();\n if (code === void 0) {\n return newParts.join(\"\");\n }\n isNumber = !isNumber;\n }\n}\n\nfunction splitSVGDefs(content, tag = \"defs\") {\n let defs = \"\";\n const index = content.indexOf(\"<\" + tag);\n while (index >= 0) {\n const start = content.indexOf(\">\", index);\n const end = content.indexOf(\"</\" + tag);\n if (start === -1 || end === -1) {\n break;\n }\n const endEnd = content.indexOf(\">\", end);\n if (endEnd === -1) {\n break;\n }\n defs += content.slice(start + 1, end).trim();\n content = content.slice(0, index).trim() + content.slice(endEnd + 1);\n }\n return {\n defs,\n content\n };\n}\nfunction mergeDefsAndContent(defs, content) {\n return defs ? \"<defs>\" + defs + \"</defs>\" + content : content;\n}\nfunction wrapSVGContent(body, start, end) {\n const split = splitSVGDefs(body);\n return mergeDefsAndContent(split.defs, start + split.content + end);\n}\n\nconst isUnsetKeyword = (value) => value === \"unset\" || value === \"undefined\" || value === \"none\";\nfunction iconToSVG(icon, customisations) {\n const fullIcon = {\n ...defaultIconProps,\n ...icon\n };\n const fullCustomisations = {\n ...defaultIconCustomisations,\n ...customisations\n };\n const box = {\n left: fullIcon.left,\n top: fullIcon.top,\n width: fullIcon.width,\n height: fullIcon.height\n };\n let body = fullIcon.body;\n [fullIcon, fullCustomisations].forEach((props) => {\n const transformations = [];\n const hFlip = props.hFlip;\n const vFlip = props.vFlip;\n let rotation = props.rotate;\n if (hFlip) {\n if (vFlip) {\n rotation += 2;\n } else {\n transformations.push(\n \"translate(\" + (box.width + box.left).toString() + \" \" + (0 - box.top).toString() + \")\"\n );\n transformations.push(\"scale(-1 1)\");\n box.top = box.left = 0;\n }\n } else if (vFlip) {\n transformations.push(\n \"translate(\" + (0 - box.left).toString() + \" \" + (box.height + box.top).toString() + \")\"\n );\n transformations.push(\"scale(1 -1)\");\n box.top = box.left = 0;\n }\n let tempValue;\n if (rotation < 0) {\n rotation -= Math.floor(rotation / 4) * 4;\n }\n rotation = rotation % 4;\n switch (rotation) {\n case 1:\n tempValue = box.height / 2 + box.top;\n transformations.unshift(\n \"rotate(90 \" + tempValue.toString() + \" \" + tempValue.toString() + \")\"\n );\n break;\n case 2:\n transformations.unshift(\n \"rotate(180 \" + (box.width / 2 + box.left).toString() + \" \" + (box.height / 2 + box.top).toString() + \")\"\n );\n break;\n case 3:\n tempValue = box.width / 2 + box.left;\n transformations.unshift(\n \"rotate(-90 \" + tempValue.toString() + \" \" + tempValue.toString() + \")\"\n );\n break;\n }\n if (rotation % 2 === 1) {\n if (box.left !== box.top) {\n tempValue = box.left;\n box.left = box.top;\n box.top = tempValue;\n }\n if (box.width !== box.height) {\n tempValue = box.width;\n box.width = box.height;\n box.height = tempValue;\n }\n }\n if (transformations.length) {\n body = wrapSVGContent(\n body,\n '<g transform=\"' + transformations.join(\" \") + '\">',\n \"</g>\"\n );\n }\n });\n const customisationsWidth = fullCustomisations.width;\n const customisationsHeight = fullCustomisations.height;\n const boxWidth = box.width;\n const boxHeight = box.height;\n let width;\n let height;\n if (customisationsWidth === null) {\n height = customisationsHeight === null ? \"1em\" : customisationsHeight === \"auto\" ? boxHeight : customisationsHeight;\n width = calculateSize(height, boxWidth / boxHeight);\n } else {\n width = customisationsWidth === \"auto\" ? boxWidth : customisationsWidth;\n height = customisationsHeight === null ? calculateSize(width, boxHeight / boxWidth) : customisationsHeight === \"auto\" ? boxHeight : customisationsHeight;\n }\n const attributes = {};\n const setAttr = (prop, value) => {\n if (!isUnsetKeyword(value)) {\n attributes[prop] = value.toString();\n }\n };\n setAttr(\"width\", width);\n setAttr(\"height\", height);\n const viewBox = [box.left, box.top, boxWidth, boxHeight];\n attributes.viewBox = viewBox.join(\" \");\n return {\n attributes,\n viewBox,\n body\n };\n}\n\nconst regex = /\\sid=\"(\\S+)\"/g;\nconst randomPrefix = \"IconifyId\" + Date.now().toString(16) + (Math.random() * 16777216 | 0).toString(16);\nlet counter = 0;\nfunction replaceIDs(body, prefix = randomPrefix) {\n const ids = [];\n let match;\n while (match = regex.exec(body)) {\n ids.push(match[1]);\n }\n if (!ids.length) {\n return body;\n }\n const suffix = \"suffix\" + (Math.random() * 16777216 | Date.now()).toString(16);\n ids.forEach((id) => {\n const newID = typeof prefix === \"function\" ? prefix(id) : prefix + (counter++).toString();\n const escapedID = id.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n body = body.replace(\n // Allowed characters before id: [#;\"]\n // Allowed characters after id: [)\"], .[a-z]\n new RegExp('([#;\"])(' + escapedID + ')([\")]|\\\\.[a-z])', \"g\"),\n \"$1\" + newID + suffix + \"$3\"\n );\n });\n body = body.replace(new RegExp(suffix, \"g\"), \"\");\n return body;\n}\n\nconst storage = /* @__PURE__ */ Object.create(null);\nfunction setAPIModule(provider, item) {\n storage[provider] = item;\n}\nfunction getAPIModule(provider) {\n return storage[provider] || storage[\"\"];\n}\n\nfunction createAPIConfig(source) {\n let resources;\n if (typeof source.resources === \"string\") {\n resources = [source.resources];\n } else {\n resources = source.resources;\n if (!(resources instanceof Array) || !resources.length) {\n return null;\n }\n }\n const result = {\n // API hosts\n resources,\n // Root path\n path: source.path || \"/\",\n // URL length limit\n maxURL: source.maxURL || 500,\n // Timeout before next host is used.\n rotate: source.rotate || 750,\n // Timeout before failing query.\n timeout: source.timeout || 5e3,\n // Randomise default API end point.\n random: source.random === true,\n // Start index\n index: source.index || 0,\n // Receive data after time out (used if time out kicks in first, then API module sends data anyway).\n dataAfterTimeout: source.dataAfterTimeout !== false\n };\n return result;\n}\nconst configStorage = /* @__PURE__ */ Object.create(null);\nconst fallBackAPISources = [\n \"https://api.simplesvg.com\",\n \"https://api.unisvg.com\"\n];\nconst fallBackAPI = [];\nwhile (fallBackAPISources.length > 0) {\n if (fallBackAPISources.length === 1) {\n fallBackAPI.push(fallBackAPISources.shift());\n } else {\n if (Math.random() > 0.5) {\n fallBackAPI.push(fallBackAPISources.shift());\n } else {\n fallBackAPI.push(fallBackAPISources.pop());\n }\n }\n}\nconfigStorage[\"\"] = createAPIConfig({\n resources: [\"https://api.iconify.design\"].concat(fallBackAPI)\n});\nfunction addAPIProvider(provider, customConfig) {\n const config = createAPIConfig(customConfig);\n if (config === null) {\n return false;\n }\n configStorage[provider] = config;\n return true;\n}\nfunction getAPIConfig(provider) {\n return configStorage[provider];\n}\nfunction listAPIProviders() {\n return Object.keys(configStorage);\n}\n\nconst detectFetch = () => {\n let callback;\n try {\n callback = fetch;\n if (typeof callback === \"function\") {\n return callback;\n }\n } catch (err) {\n }\n};\nlet fetchModule = detectFetch();\nfunction setFetch(fetch2) {\n fetchModule = fetch2;\n}\nfunction getFetch() {\n return fetchModule;\n}\nfunction calculateMaxLength(provider, prefix) {\n const config = getAPIConfig(provider);\n if (!config) {\n return 0;\n }\n let result;\n if (!config.maxURL) {\n result = 0;\n } else {\n let maxHostLength = 0;\n config.resources.forEach((item) => {\n const host = item;\n maxHostLength = Math.max(maxHostLength, host.length);\n });\n const url = prefix + \".json?icons=\";\n result = config.maxURL - maxHostLength - config.path.length - url.length;\n }\n return result;\n}\nfunction shouldAbort(status) {\n return status === 404;\n}\nconst prepare = (provider, prefix, icons) => {\n const results = [];\n const maxLength = calculateMaxLength(provider, prefix);\n const type = \"icons\";\n let item = {\n type,\n provider,\n prefix,\n icons: []\n };\n let length = 0;\n icons.forEach((name, index) => {\n length += name.length + 1;\n if (length >= maxLength && index > 0) {\n results.push(item);\n item = {\n type,\n provider,\n prefix,\n icons: []\n };\n length = name.length;\n }\n item.icons.push(name);\n });\n results.push(item);\n return results;\n};\nfunction getPath(provider) {\n if (typeof provider === \"string\") {\n const config = getAPIConfig(provider);\n if (config) {\n return config.path;\n }\n }\n return \"/\";\n}\nconst send = (host, params, callback) => {\n if (!fetchModule) {\n callback(\"abort\", 424);\n return;\n }\n let path = getPath(params.provider);\n switch (params.type) {\n case \"icons\": {\n const prefix = params.prefix;\n const icons = params.icons;\n const iconsList = icons.join(\",\");\n const urlParams = new URLSearchParams({\n icons: iconsList\n });\n path += prefix + \".json?\" + urlParams.toString();\n break;\n }\n case \"custom\": {\n const uri = params.uri;\n path += uri.slice(0, 1) === \"/\" ? uri.slice(1) : uri;\n break;\n }\n default:\n callback(\"abort\", 400);\n return;\n }\n let defaultError = 503;\n fetchModule(host + path).then((response) => {\n const status = response.status;\n if (status !== 200) {\n setTimeout(() => {\n callback(shouldAbort(status) ? \"abort\" : \"next\", status);\n });\n return;\n }\n defaultError = 501;\n return response.json();\n }).then((data) => {\n if (typeof data !== \"object\" || data === null) {\n setTimeout(() => {\n if (data === 404) {\n callback(\"abort\", data);\n } else {\n callback(\"next\", defaultError);\n }\n });\n return;\n }\n setTimeout(() => {\n callback(\"success\", data);\n });\n }).catch(() => {\n callback(\"next\", defaultError);\n });\n};\nconst fetchAPIModule = {\n prepare,\n send\n};\n\nfunction sortIcons(icons) {\n const result = {\n loaded: [],\n missing: [],\n pending: []\n };\n const storage = /* @__PURE__ */ Object.create(null);\n icons.sort((a, b) => {\n if (a.provider !== b.provider) {\n return a.provider.localeCompare(b.provider);\n }\n if (a.prefix !== b.prefix) {\n return a.prefix.localeCompare(b.prefix);\n }\n return a.name.localeCompare(b.name);\n });\n let lastIcon = {\n provider: \"\",\n prefix: \"\",\n name: \"\"\n };\n icons.forEach((icon) => {\n if (lastIcon.name === icon.name && lastIcon.prefix === icon.prefix && lastIcon.provider === icon.provider) {\n return;\n }\n lastIcon = icon;\n const provider = icon.provider;\n const prefix = icon.prefix;\n const name = icon.name;\n const providerStorage = storage[provider] || (storage[provider] = /* @__PURE__ */ Object.create(null));\n const localStorage = providerStorage[prefix] || (providerStorage[prefix] = getStorage(provider, prefix));\n let list;\n if (name in localStorage.icons) {\n list = result.loaded;\n } else if (prefix === \"\" || localStorage.missing.has(name)) {\n list = result.missing;\n } else {\n list = result.pending;\n }\n const item = {\n provider,\n prefix,\n name\n };\n list.push(item);\n });\n return result;\n}\n\nfunction removeCallback(storages, id) {\n storages.forEach((storage) => {\n const items = storage.loaderCallbacks;\n if (items) {\n storage.loaderCallbacks = items.filter((row) => row.id !== id);\n }\n });\n}\nfunction updateCallbacks(storage) {\n if (!storage.pendingCallbacksFlag) {\n storage.pendingCallbacksFlag = true;\n setTimeout(() => {\n storage.pendingCallbacksFlag = false;\n const items = storage.loaderCallbacks ? storage.loaderCallbacks.slice(0) : [];\n if (!items.length) {\n return;\n }\n let hasPending = false;\n const provider = storage.provider;\n const prefix = storage.prefix;\n items.forEach((item) => {\n const icons = item.icons;\n const oldLength = icons.pending.length;\n icons.pending = icons.pending.filter((icon) => {\n if (icon.prefix !== prefix) {\n return true;\n }\n const name = icon.name;\n if (storage.icons[name]) {\n icons.loaded.push({\n provider,\n prefix,\n name\n });\n } else if (storage.missing.has(name)) {\n icons.missing.push({\n provider,\n prefix,\n name\n });\n } else {\n hasPending = true;\n return true;\n }\n return false;\n });\n if (icons.pending.length !== oldLength) {\n if (!hasPending) {\n removeCallback([storage], item.id);\n }\n item.callback(\n icons.loaded.slice(0),\n icons.missing.slice(0),\n icons.pending.slice(0),\n item.abort\n );\n }\n });\n });\n }\n}\nlet idCounter = 0;\nfunction storeCallback(callback, icons, pendingSources) {\n const id = idCounter++;\n const abort = removeCallback.bind(null, pendingSources, id);\n if (!icons.pending.length) {\n return abort;\n }\n const item = {\n id,\n icons,\n callback,\n abort\n };\n pendingSources.forEach((storage) => {\n (storage.loaderCallbacks || (storage.loaderCallbacks = [])).push(item);\n });\n return abort;\n}\n\nfunction listToIcons(list, validate = true, simpleNames = false) {\n const result = [];\n list.forEach((item) => {\n const icon = typeof item === \"string\" ? stringToIcon(item, validate, simpleNames) : item;\n if (icon) {\n result.push(icon);\n }\n });\n return result;\n}\n\n// src/config.ts\nvar defaultConfig = {\n resources: [],\n index: 0,\n timeout: 2e3,\n rotate: 750,\n random: false,\n dataAfterTimeout: false\n};\n\n// src/query.ts\nfunction sendQuery(config, payload, query, done) {\n const resourcesCount = config.resources.length;\n const startIndex = config.random ? Math.floor(Math.random() * resourcesCount) : config.index;\n let resources;\n if (config.random) {\n let list = config.resources.slice(0);\n resources = [];\n while (list.length > 1) {\n const nextIndex = Math.floor(Math.random() * list.length);\n resources.push(list[nextIndex]);\n list = list.slice(0, nextIndex).concat(list.slice(nextIndex + 1));\n }\n resources = resources.concat(list);\n } else {\n resources = config.resources.slice(startIndex).concat(config.resources.slice(0, startIndex));\n }\n const startTime = Date.now();\n let status = \"pending\";\n let queriesSent = 0;\n let lastError;\n let timer = null;\n let queue = [];\n let doneCallbacks = [];\n if (typeof done === \"function\") {\n doneCallbacks.push(done);\n }\n function resetTimer() {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n }\n function abort() {\n if (status === \"pending\") {\n status = \"aborted\";\n }\n resetTimer();\n queue.forEach((item) => {\n if (item.status === \"pending\") {\n item.status = \"aborted\";\n }\n });\n queue = [];\n }\n function subscribe(callback, overwrite) {\n if (overwrite) {\n doneCallbacks = [];\n }\n if (typeof callback === \"function\") {\n doneCallbacks.push(callback);\n }\n }\n function getQueryStatus() {\n return {\n startTime,\n payload,\n status,\n queriesSent,\n queriesPending: queue.length,\n subscribe,\n abort\n };\n }\n function failQuery() {\n status = \"failed\";\n doneCallbacks.forEach((callback) => {\n callback(void 0, lastError);\n });\n }\n function clearQueue() {\n queue.forEach((item) => {\n if (item.status === \"pending\") {\n item.status = \"aborted\";\n }\n });\n queue = [];\n }\n function moduleResponse(item, response, data) {\n const isError = response !== \"success\";\n queue = queue.filter((queued) => queued !== item);\n switch (status) {\n case \"pending\":\n break;\n case \"failed\":\n if (isError || !config.dataAfterTimeout) {\n return;\n }\n break;\n default:\n return;\n }\n if (response === \"abort\") {\n lastError = data;\n failQuery();\n return;\n }\n if (isError) {\n lastError = data;\n if (!queue.length) {\n if (!resources.length) {\n failQuery();\n } else {\n execNext();\n }\n }\n return;\n }\n resetTimer();\n clearQueue();\n if (!config.random) {\n const index = config.resources.indexOf(item.resource);\n if (index !== -1 && index !== config.index) {\n config.index = index;\n }\n }\n status = \"completed\";\n doneCallbacks.forEach((callback) => {\n callback(data);\n });\n }\n function execNext() {\n if (status !== \"pending\") {\n return;\n }\n resetTimer();\n const resource = resources.shift();\n if (resource === void 0) {\n if (queue.length) {\n timer = setTimeout(() => {\n resetTimer();\n if (status === \"pending\") {\n clearQueue();\n failQuery();\n }\n }, config.timeout);\n return;\n }\n failQuery();\n return;\n }\n const item = {\n status: \"pending\",\n resource,\n callback: (status2, data) => {\n moduleResponse(item, status2, data);\n }\n };\n queue.push(item);\n queriesSent++;\n timer = setTimeout(execNext, config.rotate);\n query(resource, payload, item.callback);\n }\n setTimeout(execNext);\n return getQueryStatus;\n}\n\n// src/index.ts\nfunction initRedundancy(cfg) {\n const config = {\n ...defaultConfig,\n ...cfg\n };\n let queries = [];\n function cleanup() {\n queries = queries.filter((item) => item().status === \"pending\");\n }\n function query(payload, queryCallback, doneCallback) {\n const query2 = sendQuery(\n config,\n payload,\n queryCallback,\n (data, error) => {\n cleanup();\n if (doneCallback) {\n doneCallback(data, error);\n }\n }\n );\n queries.push(query2);\n return query2;\n }\n function find(callback) {\n return queries.find((value) => {\n return callback(value);\n }) || null;\n }\n const instance = {\n query,\n find,\n setIndex: (index) => {\n config.index = index;\n },\n getIndex: () => config.index,\n cleanup\n };\n return instance;\n}\n\nfunction emptyCallback$1() {\n}\nconst redundancyCache = /* @__PURE__ */ Object.create(null);\nfunction getRedundancyCache(provider) {\n if (!redundancyCache[provider]) {\n const config = getAPIConfig(provider);\n if (!config) {\n return;\n }\n const redundancy = initRedundancy(config);\n const cachedReundancy = {\n config,\n redundancy\n };\n redundancyCache[provider] = cachedReundancy;\n }\n return redundancyCache[provider];\n}\nfunction sendAPIQuery(target, query, callback) {\n let redundancy;\n let send;\n if (typeof target === \"string\") {\n const api = getAPIModule(target);\n if (!api) {\n callback(void 0, 424);\n return emptyCallback$1;\n }\n send = api.send;\n const cached = getRedundancyCache(target);\n if (cached) {\n redundancy = cached.redundancy;\n }\n } else {\n const config = createAPIConfig(target);\n if (config) {\n redundancy = initRedundancy(config);\n const moduleKey = target.resources ? target.resources[0] : \"\";\n const api = getAPIModule(moduleKey);\n if (api) {\n send = api.send;\n }\n }\n }\n if (!redundancy || !send) {\n callback(void 0, 424);\n return emptyCallback$1;\n }\n return redundancy.query(query, send, callback)().abort;\n}\n\nfunction emptyCallback() {\n}\nfunction loadedNewIcons(storage) {\n if (!storage.iconsLoaderFlag) {\n storage.iconsLoaderFlag = true;\n setTimeout(() => {\n storage.iconsLoaderFlag = false;\n updateCallbacks(storage);\n });\n }\n}\nfunction checkIconNamesForAPI(icons) {\n const valid = [];\n const invalid = [];\n icons.forEach((name) => {\n (name.match(matchIconName) ? valid : invalid).push(name);\n });\n return {\n valid,\n invalid\n };\n}\nfunction parseLoaderResponse(storage, icons, data) {\n function checkMissing() {\n const pending = storage.pendingIcons;\n icons.forEach((name) => {\n if (pending) {\n pending.delete(name);\n }\n if (!storage.icons[name]) {\n storage.missing.add(name);\n }\n });\n }\n if (data && typeof data === \"object\") {\n try {\n const parsed = addIconSet(storage, data);\n if (!parsed.length) {\n checkMissing();\n return;\n }\n } catch (err) {\n console.error(err);\n }\n }\n checkMissing();\n loadedNewIcons(storage);\n}\nfunction parsePossiblyAsyncResponse(response, callback) {\n if (response instanceof Promise) {\n response.then((data) => {\n callback(data);\n }).catch(() => {\n callback(null);\n });\n } else {\n callback(response);\n }\n}\nfunction loadNewIcons(storage, icons) {\n if (!storage.iconsToLoad) {\n storage.iconsToLoad = icons;\n } else {\n storage.iconsToLoad = storage.iconsToLoad.concat(icons).sort();\n }\n if (!storage.iconsQueueFlag) {\n storage.iconsQueueFlag = true;\n setTimeout(() => {\n storage.iconsQueueFlag = false;\n const { provider, prefix } = storage;\n const icons2 = storage.iconsToLoad;\n delete storage.iconsToLoad;\n if (!icons2 || !icons2.length) {\n return;\n }\n const customIconLoader = storage.loadIcon;\n if (storage.loadIcons && (icons2.length > 1 || !customIconLoader)) {\n parsePossiblyAsyncResponse(\n storage.loadIcons(icons2, prefix, provider),\n (data) => {\n parseLoaderResponse(storage, icons2, data);\n }\n );\n return;\n }\n if (customIconLoader) {\n icons2.forEach((name) => {\n const response = customIconLoader(name, prefix, provider);\n parsePossiblyAsyncResponse(response, (data) => {\n const iconSet = data ? {\n prefix,\n icons: {\n [name]: data\n }\n } : null;\n parseLoaderResponse(storage, [name], iconSet);\n });\n });\n return;\n }\n const { valid, invalid } = checkIconNamesForAPI(icons2);\n if (invalid.length) {\n parseLoaderResponse(storage, invalid, null);\n }\n if (!valid.length) {\n return;\n }\n const api = prefix.match(matchIconName) ? getAPIModule(provider) : null;\n if (!api) {\n parseLoaderResponse(storage, valid, null);\n return;\n }\n const params = api.prepare(provider, prefix, valid);\n params.forEach((item) => {\n sendAPIQuery(provider, item, (data) => {\n parseLoaderResponse(storage, item.icons, data);\n });\n });\n });\n }\n}\nconst loadIcons = (icons, callback) => {\n const cleanedIcons = listToIcons(icons, true, allowSimpleNames());\n const sortedIcons = sortIcons(cleanedIcons);\n if (!sortedIcons.pending.length) {\n let callCallback = true;\n if (callback) {\n setTimeout(() => {\n if (callCallback) {\n callback(\n sortedIcons.loaded,\n sortedIcons.missing,\n sortedIcons.pending,\n emptyCallback\n );\n }\n });\n }\n return () => {\n callCallback = false;\n };\n }\n const newIcons = /* @__PURE__ */ Object.create(null);\n const sources = [];\n let lastProvider, lastPrefix;\n sortedIcons.pending.forEach((icon) => {\n const { provider, prefix } = icon;\n if (prefix === lastPrefix && provider === lastProvider) {\n return;\n }\n lastProvider = provider;\n lastPrefix = prefix;\n sources.push(getStorage(provider, prefix));\n const providerNewIcons = newIcons[provider] || (newIcons[provider] = /* @__PURE__ */ Object.create(null));\n if (!providerNewIcons[prefix]) {\n providerNewIcons[prefix] = [];\n }\n });\n sortedIcons.pending.forEach((icon) => {\n const { provider, prefix, name } = icon;\n const storage = getStorage(provider, prefix);\n const pendingQueue = storage.pendingIcons || (storage.pendingIcons = /* @__PURE__ */ new Set());\n if (!pendingQueue.has(name)) {\n pendingQueue.add(name);\n newIcons[provider][prefix].push(name);\n }\n });\n sources.forEach((storage) => {\n const list = newIcons[storage.provider][storage.prefix];\n if (list.length) {\n loadNewIcons(storage, list);\n }\n });\n return callback ? storeCallback(callback, sortedIcons, sources) : emptyCallback;\n};\nconst loadIcon = (icon) => {\n return new Promise((fulfill, reject) => {\n const iconObj = typeof icon === \"string\" ? stringToIcon(icon, true) : icon;\n if (!iconObj) {\n reject(icon);\n return;\n }\n loadIcons([iconObj || icon], (loaded) => {\n if (loaded.length && iconObj) {\n const data = getIconData(iconObj);\n if (data) {\n fulfill({\n ...defaultIconProps,\n ...data\n });\n return;\n }\n }\n reject(icon);\n });\n });\n};\n\nfunction setCustomIconsLoader(loader, prefix, provider) {\n getStorage(provider || \"\", prefix).loadIcons = loader;\n}\nfunction setCustomIconLoader(loader, prefix, provider) {\n getStorage(provider || \"\", prefix).loadIcon = loader;\n}\n\nfunction mergeCustomisations(defaults, item) {\n const result = {\n ...defaults\n };\n for (const key in item) {\n const value = item[key];\n const valueType = typeof value;\n if (key in defaultIconSizeCustomisations) {\n if (value === null || value && (valueType === \"string\" || valueType === \"number\")) {\n result[key] = value;\n }\n } else if (valueType === typeof result[key]) {\n result[key] = key === \"rotate\" ? value % 4 : value;\n }\n }\n return result;\n}\n\nconst separator = /[\\s,]+/;\nfunction flipFromString(custom, flip) {\n flip.split(separator).forEach((str) => {\n const value = str.trim();\n switch (value) {\n case \"horizontal\":\n custom.hFlip = true;\n break;\n case \"vertical\":\n custom.vFlip = true;\n break;\n }\n });\n}\n\nfunction rotateFromString(value, defaultValue = 0) {\n const units = value.replace(/^-?[0-9.]*/, \"\");\n function cleanup(value2) {\n while (value2 < 0) {\n value2 += 4;\n }\n return value2 % 4;\n }\n if (units === \"\") {\n const num = parseInt(value);\n return isNaN(num) ? 0 : cleanup(num);\n } else if (units !== value) {\n let split = 0;\n switch (units) {\n case \"%\":\n split = 25;\n break;\n case \"deg\":\n split = 90;\n }\n if (split) {\n let num = parseFloat(value.slice(0, value.length - units.length));\n if (isNaN(num)) {\n return 0;\n }\n num = num / split;\n return num % 1 === 0 ? cleanup(num) : 0;\n }\n }\n return defaultValue;\n}\n\nfunction iconToHTML(body, attributes) {\n let renderAttribsHTML = body.indexOf(\"xlink:\") === -1 ? \"\" : ' xmlns:xlink=\"http://www.w3.org/1999/xlink\"';\n for (const attr in attributes) {\n renderAttribsHTML += \" \" + attr + '=\"' + attributes[attr] + '\"';\n }\n return '<svg xmlns=\"http://www.w3.org/2000/svg\"' + renderAttribsHTML + \">\" + body + \"</svg>\";\n}\n\nfunction encodeSVGforURL(svg) {\n return svg.replace(/\"/g, \"'\").replace(/%/g, \"%25\").replace(/#/g, \"%23\").replace(/</g, \"%3C\").replace(/>/g, \"%3E\").replace(/\\s+/g, \" \");\n}\nfunction svgToData(svg) {\n return \"data:image/svg+xml,\" + encodeSVGforURL(svg);\n}\nfunction svgToURL(svg) {\n return 'url(\"' + svgToData(svg) + '\")';\n}\n\nconst defaultExtendedIconCustomisations = {\n ...defaultIconCustomisations,\n inline: false,\n};\n\n/**\n * Default SVG attributes\n */\nconst svgDefaults = {\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'xmlns:xlink': 'http://www.w3.org/1999/xlink',\n 'aria-hidden': true,\n 'role': 'img',\n};\n/**\n * Style modes\n */\nconst commonProps = {\n display: 'inline-block',\n};\nconst monotoneProps = {\n backgroundColor: 'currentColor',\n};\nconst coloredProps = {\n backgroundColor: 'transparent',\n};\n// Dynamically add common props to variables above\nconst propsToAdd = {\n Image: 'var(--svg)',\n Repeat: 'no-repeat',\n Size: '100% 100%',\n};\nconst propsToAddTo = {\n webkitMask: monotoneProps,\n mask: monotoneProps,\n background: coloredProps,\n};\nfor (const prefix in propsToAddTo) {\n const list = propsToAddTo[prefix];\n for (const prop in propsToAdd) {\n list[prefix + prop] = propsToAdd[prop];\n }\n}\n/**\n * Aliases for customisations.\n * In Vue 'v-' properties are reserved, so v-flip must be renamed\n */\nconst customisationAliases = {};\n['horizontal', 'vertical'].forEach((prefix) => {\n const attr = prefix.slice(0, 1) + 'Flip';\n // vertical-flip\n customisationAliases[prefix + '-flip'] = attr;\n // v-flip\n customisationAliases[prefix.slice(0, 1) + '-flip'] = attr;\n // verticalFlip\n customisationAliases[prefix + 'Flip'] = attr;\n});\n/**\n * Fix size: add 'px' to numbers\n */\nfunction fixSize(value) {\n return value + (value.match(/^[-0-9.]+$/) ? 'px' : '');\n}\n/**\n * Render icon\n */\nconst render = (\n// Icon must be validated before calling this function\nicon, \n// Partial properties\nprops) => {\n // Split properties\n const customisations = mergeCustomisations(defaultExtendedIconCustomisations, props);\n const componentProps = { ...svgDefaults };\n // Check mode\n const mode = props.mode || 'svg';\n // Copy style\n const style = {};\n const propsStyle = props.style;\n const customStyle = typeof propsStyle === 'object' && !(propsStyle instanceof Array)\n ? propsStyle\n : {};\n // Get element properties\n for (let key in props) {\n const value = props[key];\n if (value === void 0) {\n continue;\n }\n switch (key) {\n // Properties to ignore\n case 'icon':\n case 'style':\n case 'onLoad':\n case 'mode':\n case 'ssr':\n break;\n // Boolean attributes\n case 'inline':\n case 'hFlip':\n case 'vFlip':\n customisations[key] =\n value === true || value === 'true' || value === 1;\n break;\n // Flip as string: 'horizontal,vertical'\n case 'flip':\n if (typeof value === 'string') {\n flipFromString(customisations, value);\n }\n break;\n // Color: override style\n case 'color':\n style.color = value;\n break;\n // Rotation as string\n case 'rotate':\n if (typeof value === 'string') {\n customisations[key] = rotateFromString(value);\n }\n else if (typeof value === 'number') {\n customisations[key] = value;\n }\n break;\n // Remove aria-hidden\n case 'ariaHidden':\n case 'aria-hidden':\n // Vue transforms 'aria-hidden' property to 'ariaHidden'\n if (value !== true && value !== 'true') {\n delete componentProps['aria-hidden'];\n }\n break;\n default: {\n const alias = customisationAliases[key];\n if (alias) {\n // Aliases for boolean customisations\n if (value === true || value === 'true' || value === 1) {\n customisations[alias] = true;\n }\n }\n else if (defaultExtendedIconCustomisations[key] === void 0) {\n // Copy missing property if it does not exist in customisations\n componentProps[key] = value;\n }\n }\n }\n }\n // Generate icon\n const item = iconToSVG(icon, customisations);\n const renderAttribs = item.attributes;\n // Inline display\n if (customisations.inline) {\n style.verticalAlign = '-0.125em';\n }\n if (mode === 'svg') {\n // Add style\n componentProps.style = {\n ...style,\n ...customStyle,\n };\n // Add icon stuff\n Object.assign(componentProps, renderAttribs);\n // Counter for ids based on \"id\" property to render icons consistently on server and client\n let localCounter = 0;\n let id = props.id;\n if (typeof id === 'string') {\n // Convert '-' to '_' to avoid errors in animations\n id = id.replace(/-/g, '_');\n }\n // Add innerHTML and style to props\n componentProps['innerHTML'] = replaceIDs(item.body, id ? () => id + 'ID' + localCounter++ : 'iconifyVue');\n // Render icon\n return h('svg', componentProps);\n }\n // Render <span> with style\n const { body, width, height } = icon;\n const useMask = mode === 'mask' ||\n (mode === 'bg' ? false : body.indexOf('currentColor') !== -1);\n // Generate SVG\n const html = iconToHTML(body, {\n ...renderAttribs,\n width: width + '',\n height: height + '',\n });\n // Generate style\n componentProps.style = {\n ...style,\n '--svg': svgToURL(html),\n 'width': fixSize(renderAttribs.width),\n 'height': fixSize(renderAttribs.height),\n ...commonProps,\n ...(useMask ? monotoneProps : coloredProps),\n ...customStyle,\n };\n return h('span', componentProps);\n};\n\n/**\n * Enable cache\n *\n * @deprecated No longer used\n */\nfunction enableCache(storage) {\n //\n}\n/**\n * Disable cache\n *\n * @deprecated No longer used\n */\nfunction disableCache(storage) {\n //\n}\n/**\n * Initialise stuff\n */\n// Enable short names\nallowSimpleNames(true);\n// Set API module\nsetAPIModule('', fetchAPIModule);\n/**\n * Browser stuff\n */\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n const _window = window;\n // Load icons from global \"IconifyPreload\"\n if (_window.IconifyPreload !== void 0) {\n const preload = _window.IconifyPreload;\n const err = 'Invalid IconifyPreload syntax.';\n if (typeof preload === 'object' && preload !== null) {\n (preload instanceof Array ? preload : [preload]).forEach((item) => {\n try {\n if (\n // Check if item is an object and not null/array\n typeof item !== 'object' ||\n item === null ||\n item instanceof Array ||\n // Check for 'icons' and 'prefix'\n typeof item.icons !== 'object' ||\n typeof item.prefix !== 'string' ||\n // Add icon set\n !addCollection(item)) {\n console.error(err);\n }\n }\n catch (e) {\n console.error(err);\n }\n });\n }\n }\n // Set API from global \"IconifyProviders\"\n if (_window.IconifyProviders !== void 0) {\n const providers = _window.IconifyProviders;\n if (typeof providers === 'object' && providers !== null) {\n for (let key in providers) {\n const err = 'IconifyProviders[' + key + '] is invalid.';\n try {\n const value = providers[key];\n if (typeof value !== 'object' ||\n !value ||\n value.resources === void 0) {\n continue;\n }\n if (!addAPIProvider(key, value)) {\n console.error(err);\n }\n }\n catch (e) {\n console.error(err);\n }\n }\n }\n }\n}\n/**\n * Empty icon data, rendered when icon is not available\n */\nconst emptyIcon = {\n ...defaultIconProps,\n body: '',\n};\nconst Icon = defineComponent({\n // Do not inherit other attributes: it is handled by render()\n inheritAttrs: false,\n // Set initial data\n data() {\n return {\n // Current icon name\n _name: '',\n // Loading\n _loadingIcon: null,\n // Mounted status\n iconMounted: false,\n // Callback counter to trigger re-render\n counter: 0,\n };\n },\n mounted() {\n // Mark as mounted\n this.iconMounted = true;\n },\n unmounted() {\n this.abortLoading();\n },\n methods: {\n abortLoading() {\n if (this._loadingIcon) {\n this._loadingIcon.abort();\n this._loadingIcon = null;\n }\n },\n // Get data for icon to render or null\n getIcon(icon, onload, customise) {\n // Icon is an object\n if (typeof icon === 'object' &&\n icon !== null &&\n typeof icon.body === 'string') {\n // Stop loading\n this._name = '';\n this.abortLoading();\n return {\n data: icon,\n };\n }\n // Invalid icon?\n let iconName;\n if (typeof icon !== 'string' ||\n (iconName = stringToIcon(icon, false, true)) === null) {\n this.abortLoading();\n return null;\n }\n // Load icon\n let data = getIconData(iconName);\n if (!data) {\n // Icon data is not available\n if (!this._loadingIcon || this._loadingIcon.name !== icon) {\n // New icon to load\n this.abortLoading();\n this._name = '';\n if (data !== null) {\n // Icon was not loaded\n this._loadingIcon = {\n name: icon,\n abort: loadIcons([iconName], () => {\n this.counter++;\n }),\n };\n }\n }\n return null;\n }\n // Icon data is available\n this.abortLoading();\n if (this._name !== icon) {\n this._name = icon;\n if (onload) {\n onload(icon);\n }\n }\n // Customise icon\n if (customise) {\n // Clone data and customise it\n data = Object.assign({}, data);\n const customised = customise(data.body, iconName.name, iconName.prefix, iconName.provider);\n if (typeof customised === 'string') {\n data.body = customised;\n }\n }\n // Add classes\n const classes = ['iconify'];\n if (iconName.prefix !== '') {\n classes.push('iconify--' + iconName.prefix);\n }\n if (iconName.provider !== '') {\n classes.push('iconify--' + iconName.provider);\n }\n return { data, classes };\n },\n },\n // Render icon\n render() {\n // Re-render when counter changes\n this.counter;\n const props = this.$attrs;\n // Get icon data\n const icon = this.iconMounted || props.ssr\n ? this.getIcon(props.icon, props.onLoad, props.customise)\n : null;\n // Validate icon object\n if (!icon) {\n return render(emptyIcon, props);\n }\n // Add classes\n let newProps = props;\n if (icon.classes) {\n newProps = {\n ...props,\n class: (typeof props['class'] === 'string'\n ? props['class'] + ' '\n : '') + icon.classes.join(' '),\n };\n }\n // Render icon\n return render({\n ...defaultIconProps,\n ...icon.data,\n }, newProps);\n },\n});\n/**\n * Internal API\n */\nconst _api = {\n getAPIConfig,\n setAPIModule,\n sendAPIQuery,\n setFetch,\n getFetch,\n listAPIProviders,\n};\n\nexport { Icon, _api, addAPIProvider, addCollection, addIcon, iconToSVG as buildIcon, calculateSize, disableCache, enableCache, getIcon, iconLoaded as iconExists, iconLoaded, listIcons, loadIcon, loadIcons, replaceIDs, setCustomIconLoader, setCustomIconsLoader };\n","<script setup lang=\"ts\">\n// https://icon-sets.iconify.design/\n\n// SUCCESS\n// import IconAccessibility from \"~icons/carbon/accessibility\";\n// <icon-accessibility />\n// import IconAccountBox from \"~icons/mdi/account-box\";\n// <icon-account-box style=\"font-size: 2em; color: red\" />\n\n// import { ChevronUpDownIcon } from \"@heroicons/vue/24/solid\";\n\n// UNSUCCESS : 使用 unplugin-icons 和 unplugin-auto-import 从 iconify 中自动导入任何图标集\n// in Vite\n// pnpm i unplugin-icons --save-dev\n// pnpm i unplugin-vue-component --save-dev\n// pnpm i @iconify/json --save-dev\n// pnpm i @iconify-json/mdi --save-dev\n// <icon-carbon-accessibility />\n// <icon-mdi-account-box style=\"font-size: 2em; color: red\" />\n\nimport { Icon } from \"@iconify/vue\";\nimport { getCSSVar } from \"@zyzgroup/core-web\";\n\nconst props = withDefaults(\n defineProps<{\n icon?: string;\n color?: string;\n }>(),\n { icon: \"mdi-light:home\", color: getCSSVar(\"--xg-blue\") }\n);\n</script>\n\n<template>\n <span\n class=\"icon\"\n :style=\"[\n 'color: ' + color,\n 'display: inline-flex',\n 'justify-content: center',\n 'align-items: center',\n 'cursor: pointer',\n 'font-size: 1em'\n ]\"\n >\n <Icon\n :icon=\"props.icon\"\n :color=\"color\"\n />\n </span>\n</template>\n\n<style scoped></style>\n","<script setup lang=\"tsx\">\nimport { getCSSVar } from \"@zyzgroup/core-web\";\n\nconst props = withDefaults(\n defineProps<{\n color?: string;\n width?: string;\n }>(),\n {\n color: getCSSVar(\"--xg-blue\"),\n width: \"0.8em\"\n }\n);\n</script>\n\n<template>\n <div\n class=\"loading-11\"\n ref=\"loading11\"\n >\n <div\n class=\"loading-11-inner\"\n :style=\"{ width: props.width, height: props.width }\"\n >\n <div class=\"container container-1\">\n <div\n class=\"dot dot-1\"\n :style=\"{ backgroundColor: props.color }\"\n ></div>\n <div\n class=\"dot dot-2\"\n :style=\"{ backgroundColor: props.color }\"\n ></div>\n <div\n class=\"dot dot-3\"\n :style=\"{ backgroundColor: props.color }\"\n ></div>\n <div\n class=\"dot dot-4\"\n :style=\"{ backgroundColor: props.color }\"\n ></div>\n </div>\n <div class=\"container container-2\">\n <div\n class=\"dot dot-1\"\n :style=\"{ backgroundColor: props.color }\"\n ></div>\n <div\n class=\"dot dot-2\"\n :style=\"{ backgroundColor: props.color }\"\n ></div>\n <div\n class=\"dot dot-3\"\n :style=\"{ backgroundColor: props.color }\"\n ></div>\n <div\n class=\"dot dot-4\"\n :style=\"{ backgroundColor: props.color }\"\n ></div>\n </div>\n <div class=\"container container-3\">\n <div\n class=\"dot dot-1\"\n :style=\"{ backgroundColor: props.color }\"\n ></div>\n <div\n class=\"dot dot-2\"\n :style=\"{ backgroundColor: props.color }\"\n ></div>\n <div\n class=\"dot dot-3\"\n :style=\"{ backgroundColor: props.color }\"\n ></div>\n <div\n class=\"dot dot-4\"\n :style=\"{ backgroundColor: props.color }\"\n ></div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.loading-11 {\n position: relative;\n display: inline-flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n}\n.loading-11-inner {\n position: relative;\n}\n.loading-11-inner .container {\n position: absolute;\n width: 100%;\n height: 100%;\n}\n.loading-11-inner .container .dot {\n width: 20%;\n height: 20%;\n border-radius: 100%;\n position: absolute;\n animation: bouncedelay 1.2s infinite ease-in-out;\n animation-fill-mode: both;\n}\n.loading-11-inner .container .dot-1 {\n top: 0;\n left: 0;\n}\n.loading-11-inner .container .dot-2 {\n top: 0;\n right: 0;\n}\n.loading-11-inner .container .dot-3 {\n right: 0;\n bottom: 0;\n}\n.loading-11-inner .container .dot-4 {\n left: 0;\n bottom: 0;\n}\n.loading-11-inner .container-1 .dot-2 {\n animation-delay: -0.9s;\n}\n.loading-11-inner .container-1 .dot-3 {\n animation-delay: -0.6s;\n}\n.loading-11-inner .container-1 .dot-4 {\n animation-delay: -0.3s;\n}\n.loading-11-inner .container-2 {\n transform: rotateZ(45deg);\n}\n.loading-11-inner .container-2 .dot-1 {\n animation-delay: -1.1s;\n}\n.loading-11-inner .container-2 .dot-2 {\n animation-delay: -0.8s;\n}\n.loading-11-inner .container-2 .dot-3 {\n animation-delay: -0.5s;\n}\n.loading-11-inner .container-2 .dot-4 {\n animation-delay: -0.2s;\n}\n.loading-11-inner .container-3 {\n transform: rotateZ(90deg);\n}\n.loading-11-inner .container-3 .dot-1 {\n animation-delay: -1s;\n}\n.loading-11-inner .container-3 .dot-2 {\n animation-delay: -0.7s;\n}\n.loading-11-inner .container-3 .dot-3 {\n animation-delay: -0.4s;\n}\n.loading-11-inner .container-3 .dot-4 {\n animation-delay: -0.1s;\n}\n@keyframes bouncedelay {\n 0%,\n 80%,\n 100% {\n transform: scale(0.3);\n }\n 40% {\n transform: scale(1);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, watch } from \"vue\";\nimport Icon from \"./Icon.vue\";\nimport { throttle } from \"@zyzgroup/core-common\";\nimport { __color, getCSSVar } from \"@zyzgroup/core-web\";\nimport Loading11 from \"./loading/Loading11.vue\";\n\n// for merge ce shadow-root styles\ndefineOptions({\n customOptions: { Loading11 },\n inheritAttrs: true\n});\n\nexport type ButtonStylePatternType = \"fullfill\" | \"outline\" | \"transparent\";\n\nconst props = withDefaults(\n defineProps<{\n label?: string;\n icon?: string;\n iconPosition?: \"left\" | \"right\";\n disabled?: boolean;\n width?: string;\n height?: string;\n padding?: string;\n fontSize?: string;\n fontWeight?: string;\n borderRadius?: string; // border-radius:x/y\n stylePattern?: ButtonStylePatternType;\n fontColor?: string;\n borderColor?: string;\n bgColor?: string;\n bgColorStart?: string; // 渐变背景色-开始\n bgColorEnd?: string; // 渐变背景色-结束\n asyncClick?: () => Promise<void>;\n }>(),\n {\n iconPosition: \"left\",\n disabled: false,\n width: \"auto\",\n height: \"44px\",\n padding: \"20px\",\n fontSize: \"16px\",\n fontWeight: \"normal\", // normal bold\n borderRadius: \"4px\",\n stylePattern: \"fullfill\"\n }\n);\n\nconst emits = defineEmits<{\n // for ce element\n (event: \"yz-click\"): void;\n (event: \"click\"): void;\n}>();\n\nconst el = ref<HTMLElement>();\n\nconst xgBlue = getCSSVar(\"--xg-blue\", \"#5a82f0\");\n\nconst fontColor = ref(props.fontColor);\nconst borderColor = ref(props.borderColor);\nconst bgColor = ref(props.bgColor);\n\nconst baseFontColor = ref(fontColor.value);\nconst baseBorderColor = ref(borderColor.value);\nconst baseBgColor = ref(bgColor.value);\nconst baseBgColorStart = ref(props.bgColorStart || \"\");\nconst baseBgColorEnd = ref(props.bgColorEnd || \"\");\n\nconst isBgColorGradient = props.bgColorStart && props.bgColorEnd;\n\nfunction setStylePattern(stylePattern: ButtonStylePatternType) {\n switch (stylePattern) {\n case \"transparent\":\n borderColor.value = props.borderColor || \"rgba(255,255,255,0)\";\n bgColor.value = props.bgColor || \"rgba(255,255,255,0)\";\n fontColor.value = props.fontColor || xgBlue;\n break;\n case \"outline\":\n borderColor.value = props.borderColor || xgBlue;\n bgColor.value = props.bgColor || \"rgba(255,255,255,0)\";\n fontColor.value = props.fontColor || xgBlue;\n break;\n case \"fullfill\":\n default:\n borderColor.value = props.borderColor || \"rgba(255,255,255,0)\";\n bgColor.value = props.bgColor || xgBlue;\n fontColor.value =\n props.fontColor || __color.set(bgColor.value).opposite(true).toString();\n break;\n }\n baseFontColor.value = fontColor.value;\n baseBorderColor.value = borderColor.value;\n baseBgColor.value = bgColor.value;\n // 背景色-渐变\n if (isBgColorGradient) {\n baseBgColorStart.value = props.bgColorStart;\n baseBgColorEnd.value = props.bgColorEnd;\n bgColor.value = `linear-gradient(180deg, ${baseBgColorStart.value} 0%, ${baseBgColorEnd.value} 100%)`;\n }\n}\n\nwatch(\n () => props.stylePattern,\n () => {\n setStylePattern(props.stylePattern);\n },\n { immediate: true }\n);\n\nconst opacity = ref(props.disabled ? \"0.6\" : \"1\");\nconst cursor = ref(props.disabled ? \"not-allowed\" : \"pointer\");\n\nlet isMouseOver = false;\nconst darkenOver = 0.05;\nconst darkenClick = 0.1;\n\nconst mouseover = () => {\n if (props.disabled) return;\n isMouseOver = true;\n if (props.stylePattern == \"transparent\") {\n fontColor.value = __color\n .set(baseFontColor.value)\n .darken(darkenOver)\n .toString();\n }\n borderColor.value = __color\n .set(baseBorderColor.value)\n .darken(darkenOver)\n .toString();\n // 背景色-渐变\n if (isBgColorGradient) {\n bgColor.value = `linear-gradient(180deg, ${baseBgColorEnd.value} 0%, ${baseBgColorStart.value} 100%)`;\n } else {\n bgColor.value = __color\n .set(baseBgColor.value)\n .darken(darkenOver)\n .toString();\n }\n};\n\nconst mouseleave = () => {\n if (props.disabled) return;\n isMouseOver = false;\n fontColor.value = baseFontColor.value;\n borderColor.value = baseBorderColor.value;\n // 背景色-渐变\n if (isBgColorGradient) {\n bgColor.value = `linear-gradient(180deg, ${baseBgColorStart.value} 0%, ${baseBgColorEnd.value} 100%)`;\n } else {\n bgColor.value = baseBgColor.value;\n }\n};\n\nconst asyncClickPending = ref(false);\n\nconst click = () => {\n if (props.disabled || asyncClickPending.value) {\n return;\n }\n if (props.stylePattern == \"transparent\") {\n fontColor.value = __color\n .set(baseFontColor.value)\n .darken(darkenClick)\n .toString();\n }\n borderColor.value = __color\n .set(baseBorderColor.value)\n .darken(darkenClick)\n .toString();\n // 背景色-渐变\n if (isBgColorGradient) {\n bgColor.value = `linear-gradient(180deg, ${baseBgColorStart.value} 0%, ${baseBgColorEnd.value} 100%)`;\n } else {\n bgColor.value = __color\n .set(baseBgColor.value)\n .darken(darkenClick)\n .toString();\n }\n setTimeout(() => {\n if (isMouseOver) {\n mouseover();\n } else {\n mouseleave();\n }\n }, 150);\n emits(\"yz-click\");\n emits(\"click\");\n if (props.asyncClick) {\n asyncClickPending.value = true;\n props\n .asyncClick()\n .then(() => {\n asyncClickPending.value = false;\n })\n .catch(() => {\n asyncClickPending.value = false;\n });\n }\n};\n\nconst throttleClick = throttle(click, 300);\n\ndefineExpose({\n // 父组件ref子Button组件时:xxx.value.el.getBoundingClientRect()\n el\n});\n</script>\n\n<template>\n <div\n ref=\"el\"\n class=\"button\"\n :style=\"[\n `opacity: ${opacity}`,\n `border: 1px solid ${borderColor}`,\n `background: ${bgColor}`,\n `color: ${fontColor}`,\n `border-radius: ${props.borderRadius}`,\n `width: ${props.width}`,\n `height: ${props.height}`,\n `line-height: ${props.height}`,\n `font-size: ${props.fontSize}`,\n `cursor: ${cursor}`,\n `user-select: none`,\n `box-sizing: border-box`,\n `display: inline-flex`,\n `justify-content: center`,\n `align-items: center`,\n `z-index: 0`\n ]\"\n @mouseover=\"mouseover\"\n @mouseleave=\"mouseleave\"\n @click=\"throttleClick\"\n >\n <label\n class=\"label truncate\"\n :style=\"{\n padding: '0 ' + padding,\n cursor: cursor,\n display: 'inline-flex',\n justifyContent: 'center',\n alignItems: 'center',\n fontWeight: props.fontWeight || 'normal'\n }\"\n >\n <div\n v-if=\"asyncClickPending\"\n class=\"loading\"\n style=\"margin-right: 6px\"\n >\n <Loading11 :color=\"fontColor\"></Loading11>\n </div>\n <slot>\n <Icon\n v-if=\"icon && iconPosition === 'left'\"\n :icon=\"icon\"\n :color=\"fontColor\"\n :style=\"{\n marginRight: '4px',\n cursor: cursor\n }\"\n ></Icon>\n <span\n :style=\"{\n cursor: cursor\n }\"\n >\n {{ label }}\n </span>\n <Icon\n v-if=\"icon && iconPosition === 'right'\"\n :icon=\"icon\"\n :color=\"fontColor\"\n :style=\"{\n marginLeft: '4px',\n cursor: cursor\n }\"\n ></Icon>\n </slot>\n </label>\n </div>\n</template>\n","<script setup lang=\"tsx\">\nimport { ref, onMounted, onUnmounted } from \"vue\";\nimport { useSafeArea } from \"@zyzgroup/core-web\";\nimport { useRouter } from \"../../hooks\";\nimport Button from \"../Button.vue\";\n\n// for merge ce shadow-root styles\ndefineOptions({\n customOptions: { Button },\n inheritAttrs: true\n});\n\nconst router = useRouter();\nfunction gotoPay() {\n router.push(\"/park\");\n}\n\nconst safeAreaBottom = ref(\"0px\");\nlet cancelOnBottom;\nonMounted(() => {\n cancelOnBottom = useSafeArea.onBottom((b) => {\n safeAreaBottom.value = b;\n });\n});\nonUnmounted(() => {\n cancelOnBottom?.();\n});\n</script>\n\n<template>\n <div\n class=\"xg-footer\"\n :style=\"{ paddingBottom: safeAreaBottom }\"\n >\n <div class=\"xg-footer-inner\">\n <Button\n label=\"去支付\"\n width=\"100%\"\n @click=\"gotoPay\"\n ></Button>\n </div>\n </div>\n</template>\n\n<style scoped>\n.xg-footer {\n box-sizing: border-box;\n background-color: #ffffff;\n border-top: 1px solid #cccccc;\n}\n.xg-footer-inner {\n box-sizing: border-box;\n width: 100%;\n padding: 0.2rem 0.3rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { onMounted, ref } from \"vue\";\nimport { useElement } from \"@zyzgroup/core-web\";\n\n// for merge ce shadow-root styles\ndefineOptions({\n customOptions: {},\n inheritAttrs: true\n});\n\nconst props = withDefaults(\n defineProps<{\n plate: string; // 无牌车\n plateType?:\n | \"蓝牌\"\n | \"b\"\n | \"绿牌\"\n | \"g\"\n | \"黄牌\"\n | \"y\"\n | \"黄绿\"\n | \"q\"\n | \"黑牌\"\n | \"d\"\n | \"白牌\"\n | \"w\"\n | \"未知\";\n displayType?: \"dot\" | \"chinese\" | \"plaintext\";\n // fontSize : 1em\n }>(),\n { displayType: \"chinese\" }\n);\n\nconst emits = defineEmits<{\n // (event: \"void\"): void;\n}>();\n\nconst PLATE_TYPES: { name: string; style: Record<string, string> }[] = [\n {\n name: \"蓝牌\",\n style: {\n \"background-color\": \"#0078f0\",\n color: \"#ffffff\"\n }\n },\n {\n name: \"绿牌\",\n style: {\n \"background-color\": \"#00f08c\",\n color: \"#000000\"\n }\n },\n {\n name: \"黄牌\",\n style: {\n \"background-color\": \"#fac800\",\n color: \"#000000\"\n }\n },\n {\n name: \"黄绿\",\n style: {\n background: \"linear-gradient(90deg, #fac800 51.5%, #00f08c 51.51%)\",\n color: \"#000000\"\n }\n },\n {\n name: \"黑牌\",\n style: {\n \"background-color\": \"#222222\",\n color: \"#ffffff\"\n }\n },\n {\n name: \"白牌\",\n style: {\n \"background-color\": \"#ffffff\",\n color: \"#000000\",\n border: \"1px solid #999999\"\n }\n },\n {\n name: \"未知\",\n style: {\n \"background-color\": \"#cccccc\",\n color: \"#ffffff\"\n }\n }\n];\n\nfunction getPlateType(name: string): {\n name: string;\n style: Record<string, string>;\n} {\n switch (name) {\n case \"b\":\n case \"蓝牌\":\n name = \"蓝牌\";\n break;\n case \"g\":\n case \"绿牌\":\n name = \"绿牌\";\n break;\n case \"y\":\n case \"黄牌\":\n name = \"黄牌\";\n break;\n case \"q\":\n case \"黄绿\":\n name = \"黄绿\";\n break;\n case \"d\":\n case \"黑牌\":\n name = \"黑牌\";\n break;\n case \"w\":\n case \"白牌\":\n name = \"白牌\";\n break;\n default:\n name = \"未知\";\n break;\n }\n const result = PLATE_TYPES.filter((item) => item.name === name);\n return result.length ? result[0] : getPlateType(\"未知\");\n}\n\nconst plateType = ref(getPlateType(props.plateType || \"\"));\n\nconst el = ref();\nconst dotSize = ref(14);\nonMounted(() => {\n dotSize.value = useElement(el.value).getEmSize();\n});\n\ndefineExpose({});\n</script>\n\n<template>\n <div\n class=\"plate-display\"\n ref=\"el\"\n >\n <div\n v-if=\"displayType == 'dot' && plate !== '无牌车'\"\n class=\"leading\"\n :class=\"displayType\"\n :style=\"{\n ...plateType.style,\n width: dotSize + 'px',\n height: dotSize + 'px',\n marginRight: 0.36 * dotSize + 'px'\n }\"\n >\n {{ plateType.name }}\n </div>\n <div\n v-if=\"displayType == 'chinese' && plate !== '无牌车'\"\n class=\"leading\"\n :class=\"displayType\"\n :style=\"plateType.style\"\n >\n {{ plateType.name }}\n </div>\n <div\n v-if=\"displayType == 'plaintext' && plate !== '无牌车'\"\n class=\"leading\"\n :class=\"displayType\"\n >\n {{ plateType.name }}\n </div>\n <div class=\"text\">\n {{ plate }}\n </div>\n </div>\n</template>\n\n<style scoped>\n.plate-display {\n display: inline-flex;\n justify-content: center;\n align-items: center;\n}\n.leading {\n box-sizing: border-box;\n font-size: 0.86em;\n line-height: 1;\n border-radius: 0.3em;\n margin-right: 0.36em;\n}\n.leading.chinese {\n padding: 0.3em;\n}\n.leading.dot {\n font-size: 0;\n border-radius: 50%;\n}\n.leading.plaintext {\n padding-right: 0.36em;\n border-right: 1px solid #e6e6e6;\n border-radius: 0;\n}\n.text {\n line-height: 1;\n}\n</style>\n","<script setup lang=\"tsx\">\nimport { onMounted, onUnmounted, ref, watchEffect } from \"vue\";\nimport {\n ElementEventBusController,\n useClipboard,\n useElement,\n useElementEventBus\n} from \"@zyzgroup/core-web\";\n\nexport type ContainerType = \"block\" | \"shrink\" | \"full\";\n\n/// 效果触发时机\nexport type EffectTriggerTiming =\n | \"manual\"\n | \"mouseMove\"\n | \"click\"\n | \"immediate\";\n\n/// 效果状态\nexport type EffectStatus = \"start\" | \"end\";\n\n// for merge ce shadow-root styles\ndefineOptions({\n customOptions: {},\n inheritAttrs: true\n});\n\nconst props = withDefaults(\n defineProps<{\n type?: ContainerType;\n /// 效果触发时机\n effectTriggerTiming?: EffectTriggerTiming;\n /// 是否支持复制文字\n supportCopyText?: boolean;\n }>(),\n {\n type: \"block\",\n effectTriggerTiming: \"manual\",\n supportCopyText: false\n }\n);\n\nconst emits = defineEmits<{\n (event: \"ready\", controller: ElementEventBusController): void;\n (event: \"update\", controller: ElementEventBusController): void;\n (event: \"clipboard_success\", text: string): void;\n (event: \"clipboard_error\", text: string): void;\n /// 效果\n (event: \"start\"): void;\n (event: \"end\"): void;\n}>();\n\nlet effectStatus: EffectStatus = \"start\";\nconst start = () => {\n effectStatus = \"start\";\n emits(\"start\");\n};\nconst end = () => {\n effectStatus = \"end\";\n emits(\"end\");\n};\nconst next = () => {\n effectStatus == \"start\" ? end() : start();\n};\n\nconst r = ref();\n\nlet controller: ElementEventBusController;\n\nlet getControllerResolve: (\n value: ElementEventBusController | PromiseLike<ElementEventBusController>\n) => void;\n\nlet isEmitReady = false;\n\nwatchEffect(() => {\n if (!r.value) {\n // not mounted yet, or the element was unmounted (e.g. by v-if)\n return;\n }\n if (controller) {\n return;\n }\n\n controller = useElementEventBus(r.value);\n\n controller.eb.on(\"resize\", () => {\n if (isEmitReady) {\n emits(\"update\", controller);\n }\n });\n\n controller.eb.on(\"mouseEnter\", () => {\n if (props.effectTriggerTiming == \"mouseMove\") {\n next();\n }\n });\n\n controller.eb.on(\"mouseLeave\", () => {\n if (props.effectTriggerTiming == \"mouseMove\") {\n next();\n }\n });\n\n controller.eb.on(\"tap\", () => {\n if (props.effectTriggerTiming == \"click\") {\n next();\n }\n if (props.supportCopyText) {\n const text = useElement(r.value).getInnerText();\n useClipboard(text)\n .then(() => {\n emits(\"clipboard_success\", text);\n })\n .catch((err) => {\n emits(\"clipboard_error\", err.toString());\n });\n }\n });\n\n if (props.effectTriggerTiming !== \"manual\") {\n start();\n }\n\n if (props.effectTriggerTiming == \"immediate\") {\n next();\n }\n\n controller.start().then(() => {\n getControllerResolve?.(controller);\n emits(\"ready\", controller);\n isEmitReady = true;\n });\n});\n\nonMounted(() => {});\n\nonUnmounted(() => {\n controller?.end();\n});\n\n// 不推荐使用,只推荐使用 @ready + @update\ndefineExpose({\n getController: () =>\n new Promise<ElementEventBusController>((resolve) => {\n if (controller) {\n return resolve(controller);\n }\n getControllerResolve = resolve;\n }),\n getElement: () => r.value,\n getRect: () => r.value.getBoundingClientRect()\n});\n</script>\n\n<template>\n <div\n ref=\"r\"\n class=\"container\"\n :style=\"{\n position: 'relative',\n boxSizing: 'border-box',\n display: props.type == 'shrink' ? 'inline-block' : 'block',\n width: props.type == 'full' ? '100%' : 'auto',\n height: props.type == 'full' ? '100%' : 'auto'\n /* overflow: 'hidden', */\n /* pointer-events: none; */\n }\"\n v-bind=\"$attrs\"\n >\n <slot></slot>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, reactive, watch } from \"vue\";\nimport Container, {\n ContainerType,\n EffectTriggerTiming\n} from \"../Container.vue\";\nimport {\n ElementEventBusController,\n SupportedEaseNameToCubicBezier\n} from \"@zyzgroup/core-web\";\n\nexport type SupportedCSSAnimation =\n | \"jelly\"\n | \"bounce\"\n | \"flash\"\n | \"pulse\"\n | \"rubberBand\"\n | \"shakeX\"\n | \"shakeY\"\n | \"headShake\"\n | \"swing\"\n | \"tada\"\n | \"wobble\"\n | \"jello\"\n | \"heartBeat\"\n | \"backInLeft\"\n | \"backInRight\"\n | \"backInUp\"\n | \"backInDown\"\n | \"backOutLeft\"\n | \"backOutRight\"\n | \"backOutUp\"\n | \"backOutDown\"\n | \"bounceIn\"\n | \"bounceInLeft\"\n | \"bounceInRight\"\n | \"bounceInUp\"\n | \"bounceInDown\"\n | \"bounceOut\"\n | \"bounceOutLeft\"\n | \"bounceOutRight\"\n | \"bounceOutUp\"\n | \"bounceOutDown\"\n | \"fadeIn\"\n | \"fadeInLeft\"\n | \"fadeInLeftBig\"\n | \"fadeInRight\"\n | \"fadeInRightBig\"\n | \"fadeInUp\"\n | \"fadeInUpBig\"\n | \"fadeInDown\"\n | \"fadeInDownBig\"\n | \"fadeInTopLeft\"\n | \"fadeInTopRight\"\n | \"fadeInBottomLeft\"\n | \"fadeInBottomRight\"\n | \"fadeOut\"\n | \"fadeOutLeft\"\n | \"fadeOutLeftBig\"\n | \"fadeOutRight\"\n | \"fadeOutRightBig\"\n | \"fadeOutUp\"\n | \"fadeOutUpBig\"\n | \"fadeOutDown\"\n | \"fadeOutDownBig\"\n | \"fadeOutTopLeft\"\n | \"fadeOutTopRight\"\n | \"fadeOutBottomRight\"\n | \"fadeOutBottomLeft\"\n | \"flip\"\n | \"flipInX\"\n | \"flipInY\"\n | \"flipOutX\"\n | \"flipOutY\"\n | \"flipOutRight\"\n | \"flipInLeft\"\n | \"flipOutLeft\"\n | \"flipInRight\"\n | \"flipOutTop\"\n | \"flipInBottom\"\n | \"flipOutBottom\"\n | \"flipInTop\"\n | \"lightSpeedInLeft\"\n | \"lightSpeedInRight\"\n | \"lightSpeedOutLeft\"\n | \"lightSpeedOutRight\"\n | \"rotateIn\"\n | \"rotateInUpLeft\"\n | \"rotateInUpRight\"\n | \"rotateInDownLeft\"\n | \"rotateInDownRight\"\n | \"rotateOut\"\n | \"rotateOutUpLeft\"\n | \"rotateOutUpRight\"\n | \"rotateOutDownLeft\"\n | \"rotateOutDownRight\"\n | \"hinge\"\n | \"rotateFall\"\n | \"rotateOutNewspaper\"\n | \"rotateInNewspaper\"\n | \"jackInTheBox\"\n | \"rollIn\"\n | \"rollOut\"\n | \"zoomIn\"\n | \"zoomInLeft\"\n | \"zoomInRight\"\n | \"zoomInUp\"\n | \"zoomInDown\"\n | \"zoomOut\"\n | \"zoomOutLeft\"\n | \"zoomOutRight\"\n | \"zoomOutUp\"\n | \"zoomOutDown\"\n | \"fade\"\n | \"moveFromLeft\"\n | \"moveToLeft\"\n | \"moveFromRight\"\n | \"moveToRight\"\n | \"moveFromTop\"\n | \"moveToTop\"\n | \"moveFromBottom\"\n | \"moveToBottom\"\n | \"moveFromLeftFade\"\n | \"moveToLeftFade\"\n | \"moveFromRightFade\"\n | \"moveToRightFade\"\n | \"moveFromTopFade\"\n | \"moveToTopFade\"\n | \"moveFromBottomFade\"\n | \"moveToBottomFade\"\n | \"scaleFromSmall\"\n | \"scaleToSmall\"\n | \"scaleFromLarge\"\n | \"scaleToLarge\"\n | \"scaleFromSmallCenter\"\n | \"scaleToSmallCenter\"\n | \"slideInLeft\"\n | \"slideInRight\"\n | \"slideInUp\"\n | \"slideInDown\"\n | \"slideOutLeft\"\n | \"slideOutRight\"\n | \"slideOutUp\"\n | \"slideOutDown\"\n | \"rotateRightSideFirst\"\n | \"rotateLeftSideFirst\"\n | \"rotateTopSideFirst\"\n | \"rotateBottomSideFirst\"\n | \"rotatePushLeft\"\n | \"rotatePushRight\"\n | \"rotatePushTop\"\n | \"rotatePushBottom\"\n | \"rotatePullRight\"\n | \"rotatePullLeft\"\n | \"rotatePullTop\"\n | \"rotatePullBottom\"\n | \"rotateFoldRight\"\n | \"rotateFoldLeft\"\n | \"rotateFoldTop\"\n | \"rotateFoldBottom\"\n | \"rotateUnfoldLeft\"\n | \"rotateUnfoldRight\"\n | \"rotateUnfoldTop\"\n | \"rotateUnfoldBottom\"\n | \"rotateRoomLeftOut\"\n | \"rotateRoomLeftIn\"\n | \"rotateRoomRightOut\"\n | \"rotateRoomRightIn\"\n | \"rotateRoomTopOut\"\n | \"rotateRoomTopIn\"\n | \"rotateRoomBottomOut\"\n | \"rotateRoomBottomIn\"\n | \"rotateCubeLeftOut\"\n | \"rotateCubeLeftIn\"\n | \"rotateCubeRightOut\"\n | \"rotateCubeRightIn\"\n | \"rotateCubeTopOut\"\n | \"rotateCubeTopIn\"\n | \"rotateCubeBottomOut\"\n | \"rotateCubeBottomIn\"\n | \"rotateCarouselLeftOut\"\n | \"rotateCarouselLeftIn\"\n | \"rotateCarouselRightOut\"\n | \"rotateCarouselRightIn\"\n | \"rotateCarouselTopOut\"\n | \"rotateCarouselTopIn\"\n | \"rotateCarouselBottomOut\"\n | \"rotateCarouselBottomIn\"\n | \"rotateSidesOut\"\n | \"rotateSidesIn\"\n | \"rotateSlideOut\"\n | \"rotateSlideIn\"\n | \"superRainbow\"\n | \"statusProcessing\";\n\n// for merge ce shadow-root styles\ndefineOptions({\n customOptions: { Container },\n inheritAttrs: true\n});\n\n// timingFunction :\n// linear\n// ease\n// ease-in\n// ease-out\n// ease-in-out\n// step-start=steps(1, start) 动画执行时以开始端点为开始\n// step-end=steps(1, end) 动画执行时以结尾端点为开始、\n// cubic-bezier()\n// steps()\n\n// animation: moveObject 2s ease-in-out, fadeBox 3s linear;\n// animation-name: moveObject, fadeBox;\n// animation-duation: 2s, 3s;\n// animation-timing-function: ease-in-out, linear;\n\n// .exmaple {\n// animation-play-state: paused;\n// }\n// .exmaple:hover {\n// animation-play-state: running;\n// }\n\nconst props = withDefaults(\n defineProps<{\n containerType?: ContainerType;\n supportCopyText?: boolean;\n effectTriggerTiming?: EffectTriggerTiming;\n name?: SupportedCSSAnimation;\n timingFunction?: SupportedEaseNameToCubicBezier;\n duration?: number;\n delay?: number;\n repeat?: number | \"infinite\";\n direction?: \"normal\" | \"reverse\" | \"alternate\" | \"alternate-reverse\";\n fillMode?: \"none\" | \"forwards\" | \"backwards\" | \"both\";\n playState?: \"running\" | \"paused\";\n perspective?: string;\n }>(),\n {\n containerType: \"shrink\",\n supportCopyText: false,\n effectTriggerTiming: \"mouseMove\",\n name: \"jelly\",\n fillMode: \"both\",\n playState: \"running\",\n perspective: \"1200px\"\n }\n);\n\nconst emits = defineEmits<{\n (event: \"cssanimationstart\", name: string): void;\n (event: \"cssanimationend\", name: string): void;\n}>();\n\nconst parentStyle = reactive<Record<string, string>>({});\nconst style = reactive<Record<string, string>>({});\n\nlet animationName = props.name;\nlet duration = props.duration;\nlet timingFunction = props.timingFunction;\nlet delay = props.delay;\nlet repeat = props.repeat;\nlet direction = props.direction;\n\nfunction changeEffect(newAnimationName: SupportedCSSAnimation) {\n animationName = newAnimationName;\n /// duration\n switch (animationName) {\n case \"superRainbow\":\n duration = props.duration || 15000;\n break;\n case \"heartBeat\":\n duration = props.duration || 1300;\n break;\n case \"statusProcessing\":\n duration = props.duration || 1200;\n break;\n case \"rotateFall\":\n case \"rotateSlideOut\":\n case \"rotateSlideIn\":\n duration = props.duration || 1000;\n break;\n case \"rotateRightSideFirst\":\n case \"rotateLeftSideFirst\":\n case \"rotateTopSideFirst\":\n case \"rotateBottomSideFirst\":\n case \"rotatePushLeft\":\n case \"rotatePushRight\":\n case \"rotatePushTop\":\n case \"rotatePushBottom\":\n case \"rotateRoomLeftOut\":\n case \"rotateRoomLeftIn\":\n case \"rotateRoomRightOut\":\n case \"rotateRoomRightIn\":\n case \"rotateRoomTopOut\":\n case \"rotateRoomTopIn\":\n case \"rotateRoomBottomOut\":\n case \"rotateRoomBottomIn\":\n case \"rotateCarouselLeftOut\":\n case \"rotateCarouselLeftIn\":\n case \"rotateCarouselRightOut\":\n case \"rotateCarouselRightIn\":\n case \"rotateCarouselTopOut\":\n case \"rotateCarouselTopIn\":\n case \"rotateCarouselBottomOut\":\n case \"rotateCarouselBottomIn\":\n duration = props.duration || 800;\n break;\n case \"bounceIn\":\n case \"bounceOut\":\n case \"flipOutX\":\n case \"hinge\":\n duration = props.duration || 750;\n break;\n case \"rotateFoldRight\":\n case \"rotateFoldLeft\":\n case \"rotateFoldTop\":\n case \"rotateFoldBottom\":\n case \"rotateUnfoldLeft\":\n case \"rotateUnfoldRight\":\n case \"rotateUnfoldTop\":\n case \"rotateUnfoldBottom\":\n case \"fade\":\n case \"moveFromLeftFade\":\n case \"moveToLeftFade\":\n case \"moveFromRightFade\":\n case \"moveToRightFade\":\n case \"moveFromTopFade\":\n case \"moveToTopFade\":\n case \"moveFromBottomFade\":\n case \"moveToBottomFade\":\n duration = props.duration || 700;\n break;\n case \"moveFromLeft\":\n case \"moveToLeft\":\n case \"moveFromRight\":\n case \"moveToRight\":\n case \"moveFromTop\":\n case \"moveToTop\":\n case \"moveFromBottom\":\n case \"moveToBottom\":\n case \"rotateCubeLeftOut\":\n case \"rotateCubeLeftIn\":\n case \"rotateCubeRightOut\":\n case \"rotateCubeRightIn\":\n case \"rotateCubeTopOut\":\n case \"rotateCubeTopIn\":\n case \"rotateCubeBottomOut\":\n case \"rotateCubeBottomIn\":\n duration = props.duration || 600;\n break;\n default:\n duration = props.duration || 500;\n break;\n }\n\n /// css ease timingFunction\n switch (animationName) {\n case \"superRainbow\":\n timingFunction = props.timingFunction || \"linear\";\n break;\n case \"lightSpeedOutLeft\":\n case \"lightSpeedOutRight\":\n case \"rotateRightSideFirst\":\n case \"rotateLeftSideFirst\":\n case \"rotateTopSideFirst\":\n case \"rotateBottomSideFirst\":\n case \"flipOutRight\":\n case \"flipOutLeft\":\n case \"flipOutTop\":\n case \"flipOutBottom\":\n case \"rotateFall\":\n case \"rotateOutNewspaper\":\n case \"rotateCubeLeftOut\":\n case \"rotateCubeLeftIn\":\n case \"rotateCubeRightOut\":\n case \"rotateCubeRightIn\":\n case \"rotateCubeTopOut\":\n case \"rotateCubeTopIn\":\n case \"rotateCubeBottomOut\":\n case \"rotateCubeBottomIn\":\n case \"rotateSidesOut\":\n timingFunction = props.timingFunction || \"ease-in\";\n break;\n case \"lightSpeedInLeft\":\n case \"lightSpeedInRight\":\n case \"flipInLeft\":\n case \"flipInRight\":\n case \"flipInBottom\":\n case \"flipInTop\":\n case \"rotateInNewspaper\":\n case \"rotateSidesIn\":\n timingFunction = props.timingFunction || \"ease-out\";\n break;\n case \"pulse\":\n case \"headShake\":\n case \"heartBeat\":\n case \"statusProcessing\":\n timingFunction = props.timingFunction || \"ease-in-out\";\n break;\n default:\n timingFunction = props.timingFunction || \"ease\";\n break;\n }\n\n /// delay\n switch (animationName) {\n default:\n delay = props.delay || 0;\n break;\n }\n\n /// repeat\n switch (animationName) {\n case \"superRainbow\":\n case \"statusProcessing\":\n repeat = props.repeat || \"infinite\";\n break;\n default:\n repeat = props.repeat || 1;\n break;\n }\n\n /// direction\n switch (animationName) {\n case \"superRainbow\":\n direction = props.direction || \"alternate\";\n break;\n default:\n direction = props.direction || \"normal\";\n break;\n }\n\n /// transformOrigin: x-offset y-offset\n switch (animationName) {\n case \"hinge\":\n case \"rotateFall\":\n style.transformOrigin = \"left top\";\n // style.transformOrigin = \"0% 0%\";\n break;\n case \"zoomOutLeft\":\n case \"rotateRightSideFirst\":\n case \"rotatePushLeft\":\n case \"rotatePullLeft\":\n case \"rotateFoldRight\":\n case \"rotateUnfoldRight\":\n case \"rotateRoomLeftIn\":\n case \"rotateRoomRightOut\":\n case \"rotateCubeLeftIn\":\n case \"rotateCubeRightOut\":\n style.transformOrigin = \"left center\";\n // style.transformOrigin = \"0% 50%\";\n break;\n case \"rotateInUpLeft\":\n case \"rotateInDownLeft\":\n case \"rotateOutUpLeft\":\n case \"rotateOutDownLeft\":\n style.transformOrigin = \"left bottom\";\n // style.transformOrigin = \"0% 100%\";\n break;\n case \"swing\":\n case \"zoomOutUp\":\n case \"rotateBottomSideFirst\":\n case \"rotatePushTop\":\n case \"rotatePullTop\":\n case \"rotateFoldBottom\":\n case \"rotateUnfoldBottom\":\n case \"rotateRoomTopIn\":\n case \"rotateRoomBottomOut\":\n case \"rotateCubeTopIn\":\n case \"rotateCubeBottomOut\":\n style.transformOrigin = \"center top\";\n // style.transformOrigin = \"50% 0%\";\n break;\n case \"bounce\":\n case \"zoomOutDown\":\n case \"rotateTopSideFirst\":\n case \"rotatePushBottom\":\n case \"rotatePullBottom\":\n case \"rotateFoldTop\":\n case \"rotateUnfoldTop\":\n case \"rotateRoomTopOut\":\n case \"rotateRoomBottomIn\":\n case \"rotateCubeTopOut\":\n case \"rotateCubeBottomIn\":\n style.transformOrigin = \"center bottom\";\n // style.transformOrigin = \"50% 100%\";\n break;\n // case \"xxx\":\n // style.transformOrigin = \"right top\";\n // style.transformOrigin = \"100% 0%\";\n // break;\n case \"zoomOutRight\":\n case \"rotateLeftSideFirst\":\n case \"rotatePushRight\":\n case \"rotatePullRight\":\n case \"rotateFoldLeft\":\n case \"rotateUnfoldLeft\":\n case \"rotateRoomLeftOut\":\n case \"rotateRoomRightIn\":\n case \"rotateCubeLeftOut\":\n case \"rotateCubeRightIn\":\n style.transformOrigin = \"right center\";\n // style.transformOrigin = \"100% 50%\";\n break;\n case \"rotateInUpRight\":\n case \"rotateInDownRight\":\n case \"rotateOutUpRight\":\n case \"rotateOutDownRight\":\n style.transformOrigin = \"right bottom\";\n // style.transformOrigin = \"100% 100%\";\n break;\n default:\n // style.transformOrigin = \"center\"; // default\n // style.transformOrigin = \"50% 50%\"; // default\n delete style.transformOrigin;\n break;\n }\n\n /// overflow\n switch (animationName) {\n case \"jelly\":\n case \"bounce\":\n case \"flash\":\n case \"pulse\":\n case \"rubberBand\":\n case \"shakeX\":\n case \"shakeY\":\n case \"headShake\":\n case \"swing\":\n case \"tada\":\n case \"wobble\":\n case \"jello\":\n case \"heartBeat\":\n case \"bounceIn\":\n case \"fadeIn\":\n case \"fadeOut\":\n case \"flip\":\n case \"flipInX\":\n case \"flipInY\":\n case \"flipOutX\":\n case \"flipOutY\":\n case \"hinge\":\n case \"jackInTheBox\":\n parentStyle.overflow = \"visible\";\n break;\n default:\n parentStyle.overflow = \"hidden\";\n break;\n }\n\n /// backfaceVisibility\n switch (animationName) {\n case \"flip\":\n case \"flipInX\":\n case \"flipInY\":\n case \"flipOutX\":\n case \"flipOutY\":\n style.backfaceVisibility = \"visible\";\n break;\n default:\n delete style.backfaceVisibility;\n break;\n }\n}\n\nconst animationRef = ref();\n\nconst ready = (controller: ElementEventBusController) => {\n parentStyle.perspective = props.perspective;\n controller.eb.on(\"animationstart\", (e) => {\n emits(\"cssanimationstart\", e.animationName);\n });\n controller.eb.on(\"animationend\", (e) => {\n emits(\"cssanimationend\", e.animationName);\n });\n};\n\n/// restart css animation\nfunction resetAnimation() {\n animationRef.value.style.animation = \"none\";\n animationRef.value.offsetHeight; /* trigger reflow */\n animationRef.value.style.animation = null;\n}\n\nconst start = () => {\n style.animation = \"none\";\n};\nconst end = () => {\n resetAnimation();\n // style.animationName = `${animationName}`;\n // style.animationDuration = `${duration}ms`;\n // style.animationDelay = `${delay}ms`;\n // style.animationIterationCount = `${repeat}`;\n // style.animationFillMode = `${props.fillMode}`;\n // style.animationTimingFunction = `${timingFunction}`;\n // style.animationDirection = `${direction}`;\n // style.animationPlayState = `${props.playState}`;\n style.animation = `${duration}ms ${timingFunction} ${delay}ms ${repeat} ${direction} ${props.fillMode} ${props.playState} ${animationName}`;\n};\n\nconst trigger = (newAnimationName?: SupportedCSSAnimation) => {\n if (newAnimationName) {\n changeEffect(newAnimationName);\n }\n start();\n direction = \"normal\";\n end();\n};\n\nconst triggerReverse = (newAnimationName?: SupportedCSSAnimation) => {\n if (newAnimationName) {\n changeEffect(newAnimationName);\n }\n start();\n direction = \"reverse\";\n end();\n};\n\n/// 清除样式\nconst clear = () => {\n style.animation = \"none\";\n};\n\nwatch(\n () => props.name,\n () => {\n changeEffect(props.name);\n },\n { immediate: true }\n);\n\ndefineExpose({ trigger, triggerReverse, clear });\n</script>\n\n<template>\n <Container\n class=\"css-animation\"\n :type=\"props.containerType\"\n :supportCopyText=\"props.supportCopyText\"\n :effectTriggerTiming=\"props.effectTriggerTiming\"\n :style=\"parentStyle\"\n @ready=\"ready\"\n @start=\"start\"\n @end=\"end\"\n >\n <div\n class=\"css-animation-inner\"\n ref=\"animationRef\"\n :style=\"{\n position: 'relative',\n display: 'block',\n width: '100%',\n height: '100%',\n cursor: 'pointer',\n transformStyle: 'preserve-3d',\n ...style\n }\"\n >\n <slot></slot>\n </div>\n </Container>\n</template>\n\n<style>\n@import \"../../../../../css/animate_ce.css\";\n</style>\n","<script setup lang=\"ts\">\nimport { ref, reactive, watch } from \"vue\";\nimport {\n Easing,\n EasingFunction,\n SupportedEaseNameToCubicBezier,\n Timeline,\n TweenValue\n} from \"@zyzgroup/core-web\";\nimport Container from \"./Container.vue\";\nimport CSSAnimation, { SupportedCSSAnimation } from \"./effect/CSSAnimation.vue\";\n\nexport type SupportedPageEffect =\n | \"static\"\n | \"fade\"\n | \"moveFromLeft\"\n | \"moveToLeft\"\n | \"moveFromRight\"\n | \"moveToRight\"\n | \"moveFromTop\"\n | \"moveToTop\"\n | \"moveFromBottom\"\n | \"moveToBottom\"\n | \"moveFromLeftFade\"\n | \"moveToLeftFade\"\n | \"moveFromRightFade\"\n | \"moveToRightFade\"\n | \"moveFromTopFade\"\n | \"moveToTopFade\"\n | \"moveFromBottomFade\"\n | \"moveToBottomFade\"\n | \"scaleFromSmall\"\n | \"scaleToSmall\"\n | \"scaleFromLarge\"\n | \"scaleToLarge\"\n | \"scaleFromSmallCenter\"\n | \"scaleToSmallCenter\"\n | \"rotateRightSideFirst\"\n | \"rotateLeftSideFirst\"\n | \"rotateTopSideFirst\"\n | \"rotateBottomSideFirst\"\n | \"flipOutRight\"\n | \"flipInLeft\"\n | \"flipOutLeft\"\n | \"flipInRight\"\n | \"flipOutTop\"\n | \"flipInBottom\"\n | \"flipOutBottom\"\n | \"flipInTop\"\n | \"rotateFall\"\n | \"rotateOutNewspaper\"\n | \"rotateInNewspaper\"\n | \"rotatePushLeft\"\n | \"rotatePushRight\"\n | \"rotatePushTop\"\n | \"rotatePushBottom\"\n | \"rotatePullRight\"\n | \"rotatePullLeft\"\n | \"rotatePullTop\"\n | \"rotatePullBottom\"\n | \"rotateFoldRight\"\n | \"rotateFoldLeft\"\n | \"rotateFoldTop\"\n | \"rotateFoldBottom\"\n | \"rotateUnfoldLeft\"\n | \"rotateUnfoldRight\"\n | \"rotateUnfoldTop\"\n | \"rotateUnfoldBottom\"\n | \"rotateRoomLeftOut\"\n | \"rotateRoomLeftIn\"\n | \"rotateRoomRightOut\"\n | \"rotateRoomRightIn\"\n | \"rotateRoomTopOut\"\n | \"rotateRoomTopIn\"\n | \"rotateRoomBottomOut\"\n | \"rotateRoomBottomIn\"\n | \"rotateCubeLeftOut\"\n | \"rotateCubeLeftIn\"\n | \"rotateCubeRightOut\"\n | \"rotateCubeRightIn\"\n | \"rotateCubeTopOut\"\n | \"rotateCubeTopIn\"\n | \"rotateCubeBottomOut\"\n | \"rotateCubeBottomIn\"\n | \"rotateCarouselLeftOut\"\n | \"rotateCarouselLeftIn\"\n | \"rotateCarouselRightOut\"\n | \"rotateCarouselRightIn\"\n | \"rotateCarouselTopOut\"\n | \"rotateCarouselTopIn\"\n | \"rotateCarouselBottomOut\"\n | \"rotateCarouselBottomIn\"\n | \"rotateSidesOut\"\n | \"rotateSidesIn\"\n | \"rotateSlideOut\"\n | \"rotateSlideIn\";\n\n// type AtomEffect =\n// | \"moveFromLeft\"\n// | \"moveToLeft\"\n// | \"moveFromRight\"\n// | \"moveToRight\"\n// | \"moveFromTop\"\n// | \"moveToTop\"\n// | \"moveFromBottom\"\n// | \"moveToBottom\"\n// | \"fadeOut\"\n// | \"fadeIn\"\n// | \"disappear\"\n// | \"appear\"\n// | \"scaleFromSmall\"\n// | \"scaleToSmall\"\n// | \"scaleFromLarge\"\n// | \"scaleToLarge\"\n// | \"scaleFromSmallCenter\"\n// | \"scaleToSmallCenter\";\n\n// for merge ce shadow-root styles\ndefineOptions({\n customOptions: { Container, CSSAnimation },\n inheritAttrs: true\n});\n\nconst props = withDefaults(\n defineProps<{\n effect?: SupportedPageEffect;\n duration?: number;\n /// js ease\n easeFunction?: EasingFunction;\n /// css ease\n timingFunction?: SupportedEaseNameToCubicBezier;\n delay?: number;\n }>(),\n {\n effect: \"moveFromLeft\",\n duration: 500,\n easeFunction: Easing.Cubic.InOut,\n timingFunction: \"ease\",\n delay: 0\n }\n);\n\nconst emits = defineEmits<{\n (event: \"ready\", open: () => void, close: () => void): void;\n (event: \"pageOpenStart\"): void;\n (event: \"pageOpenEnd\"): void;\n (event: \"pageCloseStart\"): void;\n (event: \"pageCloseEnd\"): void;\n}>();\n\nconst pageRef = ref();\nconst style = reactive<Record<string, string>>({});\n\nconst ready = () => {\n emits(\"ready\", open, close);\n};\n\nconst update = () => {\n changeEffect();\n};\n\nconst cssAnimationRef = ref();\nlet cssAnimationName: SupportedCSSAnimation = \"rotateRightSideFirst\";\n\nlet effect: SupportedPageEffect = props.effect;\nfunction runDependOnEffectType(\n cssAnimationTask: () => void,\n jsAnimationTask: () => void\n) {\n switch (effect) {\n case \"static\":\n /// JS Animation\n jsAnimationTask();\n break;\n default:\n /// CSS Animation\n cssAnimationTask();\n break;\n }\n}\n\n// const _addAtomEffect = (\n// attrFrom: Record<string, number>,\n// attrTo: Record<string, number>,\n// effect: AtomEffect\n// ) => {\n// switch (effect) {\n// case \"moveFromLeft\":\n// attrFrom.x = -100;\n// attrTo.x = 0;\n// break;\n// case \"moveToLeft\":\n// attrFrom.x = 0;\n// attrTo.x = -100;\n// break;\n// case \"moveFromRight\":\n// attrFrom.x = 100;\n// attrTo.x = 0;\n// break;\n// case \"moveToRight\":\n// attrFrom.x = 0;\n// attrTo.x = 100;\n// break;\n// case \"moveFromTop\":\n// attrFrom.y = -100;\n// attrTo.y = 0;\n// break;\n// case \"moveToTop\":\n// attrFrom.y = 0;\n// attrTo.y = -100;\n// break;\n// case \"moveFromBottom\":\n// attrFrom.y = 100;\n// attrTo.y = 0;\n// break;\n// case \"moveToBottom\":\n// attrFrom.y = 0;\n// attrTo.y = 100;\n// break;\n// case \"fadeOut\":\n// attrFrom.opacity = 1;\n// attrTo.opacity = 0.3;\n// break;\n// case \"fadeIn\":\n// attrFrom.opacity = 0.3;\n// attrTo.opacity = 1;\n// break;\n// case \"disappear\":\n// attrFrom.opacity = 1;\n// attrTo.opacity = 0;\n// break;\n// case \"appear\":\n// attrFrom.opacity = 0;\n// attrTo.opacity = 1;\n// break;\n// case \"scaleFromSmall\":\n// attrFrom.scale = 0.8;\n// attrTo.scale = 1;\n// break;\n// case \"scaleToSmall\":\n// attrFrom.scale = 1;\n// attrTo.scale = 0.8;\n// break;\n// case \"scaleFromLarge\":\n// attrFrom.scale = 1.2;\n// attrTo.scale = 1;\n// break;\n// case \"scaleToLarge\":\n// attrFrom.scale = 1;\n// attrTo.scale = 1.2;\n// break;\n// case \"scaleFromSmallCenter\":\n// attrFrom.scale = 0.7;\n// attrTo.scale = 1;\n// break;\n// case \"scaleToSmallCenter\":\n// attrFrom.scale = 1;\n// attrTo.scale = 0.7;\n// break;\n// }\n// };\n\nlet isClose = false;\n\nconst triggerTimeline = new Timeline();\nconst changeEffect = () => {\n const triggerFrom: Record<string, number> = {};\n const triggerTo: Record<string, number> = {};\n switch (effect) {\n case \"static\":\n break;\n /// 统一用 css animation ,抹平与 js animation 的差异\n // case \"moveFromLeft\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveFromLeft\");\n // break;\n // case \"moveToLeft\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveToLeft\");\n // break;\n // case \"moveFromRight\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveFromRight\");\n // break;\n // case \"moveToRight\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveToRight\");\n // break;\n // case \"moveFromTop\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveFromTop\");\n // break;\n // case \"moveToTop\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveToTop\");\n // break;\n // case \"moveFromBottom\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveFromBottom\");\n // break;\n // case \"moveToBottom\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveToBottom\");\n // break;\n // case \"fade\":\n // _addAtomEffect(triggerFrom, triggerTo, \"fadeOut\");\n // break;\n // case \"moveFromLeftFade\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveFromLeft\");\n // _addAtomEffect(triggerFrom, triggerTo, \"fadeIn\");\n // break;\n // case \"moveToLeftFade\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveToLeft\");\n // _addAtomEffect(triggerFrom, triggerTo, \"fadeOut\");\n // break;\n // case \"moveFromRightFade\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveFromRight\");\n // _addAtomEffect(triggerFrom, triggerTo, \"fadeIn\");\n // break;\n // case \"moveToRightFade\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveToRight\");\n // _addAtomEffect(triggerFrom, triggerTo, \"fadeOut\");\n // break;\n // case \"moveFromTopFade\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveFromTop\");\n // _addAtomEffect(triggerFrom, triggerTo, \"fadeIn\");\n // break;\n // case \"moveToTopFade\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveToTop\");\n // _addAtomEffect(triggerFrom, triggerTo, \"fadeOut\");\n // break;\n // case \"moveFromBottomFade\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveFromBottom\");\n // _addAtomEffect(triggerFrom, triggerTo, \"fadeIn\");\n // break;\n // case \"moveToBottomFade\":\n // _addAtomEffect(triggerFrom, triggerTo, \"moveToBottom\");\n // _addAtomEffect(triggerFrom, triggerTo, \"fadeOut\");\n // break;\n // case \"scaleFromSmall\":\n // _addAtomEffect(triggerFrom, triggerTo, \"scaleFromSmall\");\n // _addAtomEffect(triggerFrom, triggerTo, \"appear\");\n // break;\n // case \"scaleToSmall\":\n // _addAtomEffect(triggerFrom, triggerTo, \"scaleToSmall\");\n // _addAtomEffect(triggerFrom, triggerTo, \"disappear\");\n // break;\n // case \"scaleFromLarge\":\n // _addAtomEffect(triggerFrom, triggerTo, \"scaleFromLarge\");\n // _addAtomEffect(triggerFrom, triggerTo, \"appear\");\n // break;\n // case \"scaleToLarge\":\n // _addAtomEffect(triggerFrom, triggerTo, \"scaleToLarge\");\n // _addAtomEffect(triggerFrom, triggerTo, \"disappear\");\n // break;\n // case \"scaleFromSmallCenter\":\n // _addAtomEffect(triggerFrom, triggerTo, \"scaleFromSmallCenter\");\n // _addAtomEffect(triggerFrom, triggerTo, \"appear\");\n // break;\n // case \"scaleToSmallCenter\":\n // _addAtomEffect(triggerFrom, triggerTo, \"scaleToSmallCenter\");\n // _addAtomEffect(triggerFrom, triggerTo, \"disappear\");\n // break;\n }\n triggerTimeline.clear();\n triggerTimeline.frameDuration = props.duration;\n runDependOnEffectType(\n () => {\n /// CSS Animation\n cssAnimationName = effect as SupportedCSSAnimation;\n },\n () => {\n /// JS Animation\n triggerTimeline.addTween(triggerFrom, triggerTo, {\n delay: props.delay / props.duration,\n easeFunction: props.easeFunction,\n onStart: () => {\n if (!isClose) {\n emits(\"pageOpenStart\");\n } else {\n emits(\"pageCloseStart\");\n }\n },\n onUpdate: (attrs: TweenValue) => {\n style.transform = \"\";\n if (\"x\" in attrs) {\n style.transform += ` translateX(${attrs.x}%)`;\n }\n if (\"y\" in attrs) {\n style.transform += ` translateY(${attrs.y}%)`;\n }\n if (\"rx\" in attrs) {\n style.transform += ` rotateX(${attrs.rx}deg)`;\n }\n if (\"ry\" in attrs) {\n style.transform += ` rotateY(${attrs.ry}deg)`;\n }\n if (\"scale\" in attrs) {\n style.transform += ` scale(${attrs.scale})`;\n }\n if (\"opacity\" in attrs) {\n style.opacity = `${attrs.opacity}`;\n }\n },\n onComplete: () => {\n if (!isClose) {\n emits(\"pageOpenEnd\");\n } else {\n emits(\"pageCloseEnd\");\n }\n }\n });\n }\n );\n};\n\nwatch(\n () => [props.effect, props.delay, props.duration, props.easeFunction],\n () => {\n effect = props.effect;\n changeEffect();\n },\n {\n immediate: true\n }\n);\n\nconst cssanimationstart = () => {\n if (!isClose) {\n emits(\"pageOpenStart\");\n } else {\n emits(\"pageCloseStart\");\n }\n};\n\nconst cssanimationend = () => {\n if (!isClose) {\n emits(\"pageOpenEnd\");\n } else {\n emits(\"pageCloseEnd\");\n }\n};\n\nconst start = () => {\n runDependOnEffectType(\n () => {\n /// CSS Animation\n cssAnimationRef.value.trigger(cssAnimationName);\n },\n () => {\n /// JS Animation\n triggerTimeline.play();\n }\n );\n};\n\nconst end = () => {\n runDependOnEffectType(\n () => {\n /// CSS Animation\n cssAnimationRef.value.triggerReverse(cssAnimationName);\n },\n () => {\n /// JS Animation\n triggerTimeline.reverse();\n }\n );\n};\n\n/// 清除样式\nconst clear = () => {\n style.transform = \"none\";\n style.opacity = \"1\";\n};\n\nfunction clearStyle() {\n runDependOnEffectType(\n () => {\n /// CSS Animation : clear js style\n clear();\n },\n () => {\n /// JS Animation : clear css style\n cssAnimationRef.value?.clear();\n }\n );\n}\n\nconst open = (newEffect?: SupportedPageEffect) => {\n if (newEffect) {\n effect = newEffect;\n changeEffect();\n }\n isClose = false;\n clearStyle();\n start();\n};\n\nconst close = (newEffect?: SupportedPageEffect) => {\n if (newEffect) {\n effect = newEffect;\n changeEffect();\n }\n isClose = true;\n clearStyle();\n end();\n};\n\ndefineExpose({\n open,\n close,\n clear\n});\n</script>\n\n<template>\n <Container\n class=\"page\"\n ref=\"pageRef\"\n type=\"full\"\n effectTriggerTiming=\"manual\"\n :style=\"{\n overflow: 'hidden',\n width: '100%',\n height: '100%'\n }\"\n @ready=\"ready\"\n @update=\"update\"\n >\n <CSSAnimation\n ref=\"cssAnimationRef\"\n containerType=\"full\"\n effectTriggerTiming=\"manual\"\n :duration=\"props.duration\"\n :delay=\"props.delay\"\n :timingFunction=\"props.timingFunction\"\n @cssanimationstart=\"cssanimationstart\"\n @cssanimationend=\"cssanimationend\"\n >\n <div\n class=\"page-inner\"\n :style=\"{\n position: 'relative',\n display: 'block',\n width: '100%',\n height: '100%',\n overflow: 'scroll',\n backfaceVisibility: 'hidden',\n transformStyle: 'preserve-3d',\n ...style\n }\"\n >\n <slot></slot>\n </div>\n </CSSAnimation>\n </Container>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, VNode, render, h, Component, watch } from \"vue\";\nimport Page, { SupportedPageEffect } from \"./Page.vue\";\nimport Container from \"./Container.vue\";\nimport { generateUUID, AsyncTaskQueue } from \"@zyzgroup/core-common\";\nimport {\n Easing,\n EasingFunction,\n // CSSToJSEasing,\n // reverseCSSToJSEasing,\n SupportedEaseNameToCubicBezier\n} from \"@zyzgroup/core-web\";\n// import { elementsToVNodes } from \"../vnode\";\n\n// for merge ce shadow-root styles\ndefineOptions({\n customOptions: { Page, Container },\n inheritAttrs: true\n});\n\nexport type SupportedRouteEffect =\n | \"moveToLeft\"\n | \"moveToRight\"\n | \"moveToTop\"\n | \"moveToBottom\"\n | \"moveFromLeftPrevFade\"\n | \"moveFromRightPrevFade\"\n | \"moveFromTopPrevFade\"\n | \"moveFromBottomPrevFade\"\n | \"moveToLeftFade\"\n | \"moveToRightFade\"\n | \"moveToTopFade\"\n | \"moveToBottomFade\"\n | \"moveToLeftEasing\"\n | \"moveToRightEasing\"\n | \"moveToTopEasing\"\n | \"moveToBottomEasing\"\n | \"moveFromLeftPrevScaleToSmall\"\n | \"moveFromRightPrevScaleToSmall\"\n | \"moveFromTopPrevScaleToSmall\"\n | \"moveFromBottomPrevScaleToSmall\" /// ⭐\n | \"scaleSmall\"\n | \"scaleLarge\"\n | \"scaleToLargePrevScaleToSmall\"\n | \"scaleFromSmallPrevMoveToLeft\"\n | \"scaleFromSmallPrevMoveToRight\"\n | \"scaleFromSmallPrevMoveToTop\"\n | \"scaleFromSmallPrevMoveToBottom\"\n | \"glueToLeft\"\n | \"glueToRight\"\n | \"glueToTop\"\n | \"glueToBottom\"\n | \"flipToLeft\"\n | \"flipToRight\"\n | \"flipToTop\"\n | \"flipToBottom\"\n | \"rotateFall\"\n | \"newspaper\"\n | \"moveFromLeftPrevPush\"\n | \"moveFromRightPrevPush\"\n | \"moveFromTopPrevPush\"\n | \"moveFromBottomPrevPush\"\n | \"pullFromLeftPrevPush\"\n | \"pullFromRightPrevPush\"\n | \"pullFromTopPrevPush\"\n | \"pullFromBottomPrevPush\"\n | \"moveFromLeftFadePrevFold\"\n | \"moveFromRightFadePrevFold\"\n | \"moveFromTopFadePrevFold\"\n | \"moveFromBottomFadePrevFold\"\n | \"moveToLeftFadePrevUnfold\"\n | \"moveToRightFadePrevUnfold\"\n | \"moveToTopFadePrevUnfold\"\n | \"moveToBottomFadePrevUnfold\"\n | \"rotateRoomLeftIn\"\n | \"rotateRoomRightIn\"\n | \"rotateRoomTopIn\"\n | \"rotateRoomBottomIn\"\n | \"rotateCubeLeftIn\"\n | \"rotateCubeRightIn\"\n | \"rotateCubeTopIn\"\n | \"rotateCubeBottomIn\"\n | \"rotateCarouselLeftIn\"\n | \"rotateCarouselRightIn\"\n | \"rotateCarouselTopIn\"\n | \"rotateCarouselBottomIn\"\n | \"rotateSidesIn\"\n | \"rotateSlideIn\";\n\nconst props = withDefaults(\n defineProps<{\n effect?: SupportedRouteEffect;\n duration?: number;\n /// js ease\n easeFunction?: EasingFunction;\n // differentEaseFunction?: EasingFunction;\n /// css ease\n timingFunction?: SupportedEaseNameToCubicBezier;\n delay?: number;\n }>(),\n {\n effect: \"moveToLeft\",\n duration: 500,\n easeFunction: Easing.Cubic.InOut,\n // differentEaseFunction: Easing.Quintic.InOut,\n timingFunction: \"ease\",\n delay: 0\n }\n);\n\nconst emits = defineEmits<{\n (\n event: \"routeChangeStart\",\n fromPageIndex: number,\n toPageIndex: number,\n totalPages: number\n ): void;\n (\n event: \"routeChangeEnd\",\n fromPageIndex: number,\n toPageIndex: number,\n totalPages: number\n ): void;\n (event: \"renderComplete\"): void;\n}>();\n\ntype VNodeChildAtom =\n | VNode\n | string\n | number\n | boolean\n | null\n | undefined\n | void;\ntype VNodeArrayChildren = Array<VNodeArrayChildren | VNodeChildAtom>;\ntype RawChildren =\n | string\n | number\n | boolean\n | VNode\n | VNodeArrayChildren\n | (() => any);\ntype RawSlots = {\n [name: string]: unknown;\n $stable?: boolean;\n};\n\nexport type PageArgument = {\n pageKey?: string;\n // pageAttributes?: InstanceType<typeof Page>;\n component: VNode | Component | HTMLElement;\n attributes?: Record<string, any>;\n child?: RawChildren | RawSlots;\n};\n\nlet currentPageIndex = -1;\nlet nextPageIndex = -1;\nlet onRenderComplete: () => void;\nconst onRouteCompletes: (() => void)[] = [];\n\nlet pages: PageArgument[] = [];\nlet pageActions: {\n open: () => void;\n close: () => void;\n}[] = [];\nlet pageElements: HTMLElement[] = [];\n\nfunction isValidPageIndex(pageIndex: number): boolean {\n return pageIndex >= 0 && pageIndex < pages.length;\n}\n\nfunction isForward(): boolean {\n return nextPageIndex > currentPageIndex;\n}\n\n/// page effect\nfunction _getPageEffect(\n pageIndex: number,\n currentPageEffect: SupportedPageEffect,\n nextPageEffect: SupportedPageEffect\n): SupportedPageEffect {\n switch (pageIndex) {\n case currentPageIndex:\n return isForward() ? currentPageEffect : nextPageEffect;\n case nextPageIndex:\n return isForward() ? nextPageEffect : currentPageEffect;\n default:\n return \"static\";\n }\n}\nfunction getPageEffect(\n routeEffect: SupportedRouteEffect,\n pageIndex: number\n): SupportedPageEffect {\n switch (routeEffect) {\n case \"moveToLeft\":\n return _getPageEffect(pageIndex, \"moveToLeft\", \"moveFromRight\");\n case \"moveToRight\":\n return _getPageEffect(pageIndex, \"moveToRight\", \"moveFromLeft\");\n case \"moveToTop\":\n return _getPageEffect(pageIndex, \"moveToTop\", \"moveFromBottom\");\n case \"moveToBottom\":\n return _getPageEffect(pageIndex, \"moveToBottom\", \"moveFromTop\");\n\n case \"moveFromLeftPrevFade\":\n return _getPageEffect(pageIndex, \"fade\", \"moveFromLeft\");\n case \"moveFromRightPrevFade\":\n return _getPageEffect(pageIndex, \"fade\", \"moveFromRight\");\n case \"moveFromTopPrevFade\":\n return _getPageEffect(pageIndex, \"fade\", \"moveFromTop\");\n case \"moveFromBottomPrevFade\":\n return _getPageEffect(pageIndex, \"fade\", \"moveFromBottom\");\n\n case \"moveToLeftFade\":\n return _getPageEffect(pageIndex, \"moveToLeftFade\", \"moveFromRightFade\");\n case \"moveToRightFade\":\n return _getPageEffect(pageIndex, \"moveToRightFade\", \"moveFromLeftFade\");\n case \"moveToTopFade\":\n return _getPageEffect(pageIndex, \"moveToTopFade\", \"moveFromBottomFade\");\n case \"moveToBottomFade\":\n return _getPageEffect(pageIndex, \"moveToBottomFade\", \"moveFromTopFade\");\n\n case \"moveToLeftEasing\":\n return _getPageEffect(pageIndex, \"moveToLeft\", \"moveFromRight\");\n case \"moveToRightEasing\":\n return _getPageEffect(pageIndex, \"moveToRight\", \"moveFromLeft\");\n case \"moveToTopEasing\":\n return _getPageEffect(pageIndex, \"moveToTop\", \"moveFromBottom\");\n case \"moveToBottomEasing\":\n return _getPageEffect(pageIndex, \"moveToBottom\", \"moveFromTop\");\n\n case \"moveFromLeftPrevScaleToSmall\":\n return _getPageEffect(pageIndex, \"scaleToSmall\", \"moveFromLeft\");\n case \"moveFromRightPrevScaleToSmall\":\n return _getPageEffect(pageIndex, \"scaleToSmall\", \"moveFromRight\");\n case \"moveFromTopPrevScaleToSmall\":\n return _getPageEffect(pageIndex, \"scaleToSmall\", \"moveFromTop\");\n case \"moveFromBottomPrevScaleToSmall\":\n return _getPageEffect(pageIndex, \"scaleToSmall\", \"moveFromBottom\");\n\n case \"scaleSmall\":\n return _getPageEffect(pageIndex, \"scaleToSmall\", \"scaleFromLarge\");\n case \"scaleLarge\":\n return _getPageEffect(pageIndex, \"scaleToLarge\", \"scaleFromSmall\");\n case \"scaleToLargePrevScaleToSmall\":\n return _getPageEffect(\n pageIndex,\n \"scaleToSmallCenter\",\n \"scaleFromSmallCenter\"\n );\n\n case \"scaleFromSmallPrevMoveToLeft\":\n return _getPageEffect(pageIndex, \"moveToLeft\", \"scaleFromSmall\");\n case \"scaleFromSmallPrevMoveToRight\":\n return _getPageEffect(pageIndex, \"moveToRight\", \"scaleFromSmall\");\n case \"scaleFromSmallPrevMoveToTop\":\n return _getPageEffect(pageIndex, \"moveToTop\", \"scaleFromSmall\");\n case \"scaleFromSmallPrevMoveToBottom\":\n return _getPageEffect(pageIndex, \"moveToBottom\", \"scaleFromSmall\");\n\n case \"glueToLeft\":\n return _getPageEffect(pageIndex, \"rotateRightSideFirst\", \"moveFromRight\");\n case \"glueToRight\":\n return _getPageEffect(pageIndex, \"rotateLeftSideFirst\", \"moveFromLeft\");\n case \"glueToTop\":\n return _getPageEffect(\n pageIndex,\n \"rotateBottomSideFirst\",\n \"moveFromBottom\"\n );\n case \"glueToBottom\":\n return _getPageEffect(pageIndex, \"rotateTopSideFirst\", \"moveFromTop\");\n\n case \"flipToLeft\":\n return _getPageEffect(pageIndex, \"flipOutLeft\", \"flipInRight\");\n case \"flipToRight\":\n return _getPageEffect(pageIndex, \"flipOutRight\", \"flipInLeft\");\n case \"flipToTop\":\n return _getPageEffect(pageIndex, \"flipOutTop\", \"flipInBottom\");\n case \"flipToBottom\":\n return _getPageEffect(pageIndex, \"flipOutBottom\", \"flipInTop\");\n\n case \"rotateFall\":\n return _getPageEffect(pageIndex, \"rotateFall\", \"scaleFromSmall\");\n\n case \"newspaper\":\n return _getPageEffect(\n pageIndex,\n \"rotateOutNewspaper\",\n \"rotateInNewspaper\"\n );\n\n case \"moveFromLeftPrevPush\":\n return _getPageEffect(pageIndex, \"rotatePushRight\", \"moveFromLeft\");\n case \"moveFromRightPrevPush\":\n return _getPageEffect(pageIndex, \"rotatePushLeft\", \"moveFromRight\");\n case \"moveFromTopPrevPush\":\n return _getPageEffect(pageIndex, \"rotatePushBottom\", \"moveFromTop\");\n case \"moveFromBottomPrevPush\":\n return _getPageEffect(pageIndex, \"rotatePushTop\", \"moveFromBottom\");\n\n case \"pullFromLeftPrevPush\":\n return _getPageEffect(pageIndex, \"rotatePushRight\", \"rotatePullLeft\");\n case \"pullFromRightPrevPush\":\n return _getPageEffect(pageIndex, \"rotatePushLeft\", \"rotatePullRight\");\n case \"pullFromTopPrevPush\":\n return _getPageEffect(pageIndex, \"rotatePushBottom\", \"rotatePullTop\");\n case \"pullFromBottomPrevPush\":\n return _getPageEffect(pageIndex, \"rotatePushTop\", \"rotatePullBottom\");\n\n case \"moveFromLeftFadePrevFold\":\n return _getPageEffect(pageIndex, \"rotateFoldRight\", \"moveFromLeftFade\");\n case \"moveFromRightFadePrevFold\":\n return _getPageEffect(pageIndex, \"rotateFoldLeft\", \"moveFromRightFade\");\n case \"moveFromTopFadePrevFold\":\n return _getPageEffect(pageIndex, \"rotateFoldBottom\", \"moveFromTopFade\");\n case \"moveFromBottomFadePrevFold\":\n return _getPageEffect(pageIndex, \"rotateFoldTop\", \"moveFromBottomFade\");\n\n case \"moveToLeftFadePrevUnfold\":\n return _getPageEffect(pageIndex, \"moveToLeftFade\", \"rotateUnfoldRight\");\n case \"moveToRightFadePrevUnfold\":\n return _getPageEffect(pageIndex, \"moveToRightFade\", \"rotateUnfoldLeft\");\n case \"moveToTopFadePrevUnfold\":\n return _getPageEffect(pageIndex, \"moveToTopFade\", \"rotateUnfoldBottom\");\n case \"moveToBottomFadePrevUnfold\":\n return _getPageEffect(pageIndex, \"moveToBottomFade\", \"rotateUnfoldTop\");\n\n case \"rotateRoomLeftIn\":\n return _getPageEffect(pageIndex, \"rotateRoomLeftOut\", \"rotateRoomLeftIn\");\n case \"rotateRoomRightIn\":\n return _getPageEffect(\n pageIndex,\n \"rotateRoomRightOut\",\n \"rotateRoomRightIn\"\n );\n case \"rotateRoomTopIn\":\n return _getPageEffect(pageIndex, \"rotateRoomTopOut\", \"rotateRoomTopIn\");\n case \"rotateRoomBottomIn\":\n return _getPageEffect(\n pageIndex,\n \"rotateRoomBottomOut\",\n \"rotateRoomBottomIn\"\n );\n\n case \"rotateCubeLeftIn\":\n return _getPageEffect(pageIndex, \"rotateCubeLeftOut\", \"rotateCubeLeftIn\");\n case \"rotateCubeRightIn\":\n return _getPageEffect(\n pageIndex,\n \"rotateCubeRightOut\",\n \"rotateCubeRightIn\"\n );\n case \"rotateCubeTopIn\":\n return _getPageEffect(pageIndex, \"rotateCubeTopOut\", \"rotateCubeTopIn\");\n case \"rotateCubeBottomIn\":\n return _getPageEffect(\n pageIndex,\n \"rotateCubeBottomOut\",\n \"rotateCubeBottomIn\"\n );\n\n case \"rotateCarouselLeftIn\":\n return _getPageEffect(\n pageIndex,\n \"rotateCarouselLeftOut\",\n \"rotateCarouselLeftIn\"\n );\n case \"rotateCarouselRightIn\":\n return _getPageEffect(\n pageIndex,\n \"rotateCarouselRightOut\",\n \"rotateCarouselRightIn\"\n );\n case \"rotateCarouselTopIn\":\n return _getPageEffect(\n pageIndex,\n \"rotateCarouselTopOut\",\n \"rotateCarouselTopIn\"\n );\n case \"rotateCarouselBottomIn\":\n return _getPageEffect(\n pageIndex,\n \"rotateCarouselBottomOut\",\n \"rotateCarouselBottomIn\"\n );\n\n case \"rotateSidesIn\":\n return _getPageEffect(pageIndex, \"rotateSidesOut\", \"rotateSidesIn\");\n case \"rotateSlideIn\":\n return _getPageEffect(pageIndex, \"rotateSlideOut\", \"rotateSlideIn\");\n }\n}\n\n/// duration\nfunction _getPageDuration(\n pageIndex: number,\n currentDuration = 600,\n nextDuration = 600\n): number {\n switch (pageIndex) {\n case currentPageIndex:\n return currentDuration;\n case nextPageIndex:\n return nextDuration;\n default:\n return props.duration;\n }\n}\nfunction getPageDuration(\n routeEffect: SupportedRouteEffect,\n pageIndex: number\n): number {\n switch (routeEffect) {\n case \"moveFromLeftFadePrevFold\":\n case \"moveFromRightFadePrevFold\":\n case \"moveFromTopFadePrevFold\":\n case \"moveFromBottomFadePrevFold\":\n return _getPageDuration(pageIndex, 700, 700);\n case \"moveToLeftEasing\":\n case \"moveToRightEasing\":\n case \"moveToTopEasing\":\n case \"moveToBottomEasing\":\n case \"moveFromLeftPrevScaleToSmall\":\n case \"moveFromRightPrevScaleToSmall\":\n case \"moveFromTopPrevScaleToSmall\":\n case \"moveFromBottomPrevScaleToSmall\":\n return _getPageDuration(pageIndex, 700, 600);\n case \"scaleSmall\":\n return _getPageDuration(pageIndex, 700, 500);\n case \"scaleLarge\":\n return _getPageDuration(pageIndex, 500, 700);\n case \"scaleToLargePrevScaleToSmall\":\n return _getPageDuration(pageIndex, 400, 400);\n case \"scaleFromSmallPrevMoveToLeft\":\n case \"scaleFromSmallPrevMoveToRight\":\n case \"scaleFromSmallPrevMoveToTop\":\n case \"scaleFromSmallPrevMoveToBottom\":\n return _getPageDuration(pageIndex, 600, 700);\n case \"glueToLeft\":\n case \"glueToRight\":\n case \"glueToTop\":\n case \"glueToBottom\":\n return _getPageDuration(pageIndex, 800, 600);\n default:\n return props.duration;\n }\n}\n\n/// js ease\nlet timingFunction = props.timingFunction;\n// function _getPageEaseFunctionFromCSS(pageIndex: number): EasingFunction {\n// switch (pageIndex) {\n// case currentPageIndex:\n// case nextPageIndex:\n// return isForward()\n// ? CSSToJSEasing(timingFunction)\n// : reverseCSSToJSEasing(timingFunction);\n// default:\n// return props.easeFunction;\n// }\n// }\nfunction _getPageEaseFunction(pageIndex: number): EasingFunction {\n switch (pageIndex) {\n // case currentPageIndex:\n // return props.differentEaseFunction;\n // case nextPageIndex:\n default:\n return props.easeFunction;\n }\n}\nfunction getPageEaseFunction(\n routeEffect: SupportedRouteEffect,\n pageIndex: number\n): EasingFunction {\n /// css animation 和 js animation 混合\n // switch (routeEffect) {\n // case \"moveFromLeftFadePrevFold\":\n // case \"moveFromRightFadePrevFold\":\n // case \"moveFromTopFadePrevFold\":\n // case \"moveFromBottomFadePrevFold\":\n // timingFunction = \"ease\";\n // return _getPageEaseFunctionFromCSS(pageIndex);\n // default:\n // timingFunction = props.timingFunction;\n // break;\n // }\n /// js animation\n switch (routeEffect) {\n case \"moveToLeftEasing\":\n case \"moveToRightEasing\":\n case \"moveToTopEasing\":\n case \"moveToBottomEasing\":\n switch (pageIndex) {\n case currentPageIndex:\n timingFunction = isForward() ? \"ease-in-out\" : \"ease\";\n break;\n case nextPageIndex:\n default:\n timingFunction = isForward() ? \"ease\" : \"ease-in-out\";\n }\n return _getPageEaseFunction(pageIndex);\n default:\n timingFunction = props.timingFunction;\n return props.easeFunction;\n }\n}\n\n/// delay\nfunction _getPageDelay(pageIndex: number, delay = 300): number {\n switch (pageIndex) {\n case nextPageIndex:\n return props.delay + delay;\n default:\n return props.delay;\n }\n}\nfunction getPageDelay(\n routeEffect: SupportedRouteEffect,\n pageIndex: number\n): number {\n switch (routeEffect) {\n case \"flipToLeft\":\n case \"flipToRight\":\n case \"flipToTop\":\n case \"flipToBottom\":\n case \"newspaper\":\n return _getPageDelay(pageIndex, 500);\n case \"scaleSmall\":\n case \"scaleLarge\":\n return _getPageDelay(pageIndex, 300);\n case \"scaleToLargePrevScaleToSmall\":\n return _getPageDelay(pageIndex, 400);\n case \"glueToLeft\":\n case \"glueToRight\":\n case \"glueToTop\":\n case \"glueToBottom\":\n case \"rotateSidesIn\":\n return _getPageDelay(pageIndex, 200);\n case \"pullFromLeftPrevPush\":\n case \"pullFromRightPrevPush\":\n case \"pullFromTopPrevPush\":\n case \"pullFromBottomPrevPush\":\n return _getPageDelay(pageIndex, 180);\n default:\n return props.delay;\n }\n}\n\nlet currentZIndex = 2;\nlet nextZIndex = 2;\nconst sameOnTop = () => {\n currentZIndex = 2;\n nextZIndex = 2;\n};\nconst nextOnTop = () => {\n currentZIndex = 2;\n nextZIndex = 3;\n};\nconst currentOnTop = () => {\n currentZIndex = 3;\n nextZIndex = 2;\n};\nfunction setRunningStyle(pageIndex: number) {\n switch (props.effect) {\n case \"moveToLeftEasing\":\n case \"moveToRightEasing\":\n case \"moveToTopEasing\":\n case \"moveToBottomEasing\":\n currentOnTop();\n break;\n // case \"xxx\":\n // nextOnTop();\n // break;\n case \"scaleFromSmallPrevMoveToLeft\":\n case \"scaleFromSmallPrevMoveToRight\":\n case \"scaleFromSmallPrevMoveToTop\":\n case \"scaleFromSmallPrevMoveToBottom\":\n case \"rotateFall\":\n case \"rotateRoomLeftIn\":\n case \"rotateRoomRightIn\":\n case \"rotateRoomTopIn\":\n case \"rotateRoomBottomIn\":\n case \"rotateCubeLeftIn\":\n case \"rotateCubeRightIn\":\n case \"rotateCubeTopIn\":\n case \"rotateCubeBottomIn\":\n case \"rotateCarouselLeftIn\":\n case \"rotateCarouselRightIn\":\n case \"rotateCarouselTopIn\":\n case \"rotateCarouselBottomIn\":\n isForward() ? currentOnTop() : nextOnTop();\n break;\n case \"moveFromLeftPrevFade\":\n case \"moveFromRightPrevFade\":\n case \"moveFromTopPrevFade\":\n case \"moveFromBottomPrevFade\":\n case \"moveFromLeftPrevScaleToSmall\":\n case \"moveFromRightPrevScaleToSmall\":\n case \"moveFromTopPrevScaleToSmall\":\n case \"moveFromBottomPrevScaleToSmall\":\n case \"glueToLeft\":\n case \"glueToRight\":\n case \"glueToTop\":\n case \"glueToBottom\":\n isForward() ? nextOnTop() : currentOnTop();\n break;\n default:\n sameOnTop();\n break;\n }\n if (isValidPageIndex(currentPageIndex) && currentPageIndex == pageIndex) {\n pageElements[currentPageIndex].style.zIndex = `${currentZIndex}`;\n pageElements[currentPageIndex].style.visibility = \"visible\";\n }\n if (isValidPageIndex(nextPageIndex) && nextPageIndex == pageIndex) {\n pageElements[nextPageIndex].style.zIndex = `${nextZIndex}`;\n pageElements[nextPageIndex].style.visibility = \"visible\";\n }\n}\n\n/// css animation 与 js animation 有时间差\nfunction emitsEnd(pageIndex: number) {\n nextOnTop();\n if (pageIndex == currentPageIndex) {\n pageElements[currentPageIndex].style.zIndex = `${currentZIndex}`;\n pageElements[currentPageIndex].style.visibility = \"hidden\";\n }\n if (pageIndex == nextPageIndex) {\n pageElements[nextPageIndex].style.zIndex = `${nextZIndex}`;\n pageElements[nextPageIndex].style.visibility = \"visible\";\n onRouteCompletes.shift()?.();\n emits(\"routeChangeEnd\", currentPageIndex, nextPageIndex, pages.length);\n currentPageIndex = nextPageIndex;\n }\n}\n\nconst routesRef = ref();\nfunction renderPages(appendCount = 0, isReset = false) {\n if (!routesRef.value) {\n return;\n }\n let renderCount = 0;\n render(\n h(\n \"div\",\n {\n class: \"routes-pages\",\n style: {\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n overflow: \"hidden\",\n position: \"relative\"\n }\n },\n pages.map((page, index) => {\n /// 初始化\n const pageEffect = getPageEffect(props.effect, index);\n return h(\n \"div\",\n Object.assign(\n {\n class: \"routes-page\",\n style: {\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n overflow: \"hidden\",\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n backfaceVisibility: \"hidden\",\n transform: \"translate3d(0, 0, 0)\",\n transformStyle: \"preserve-3d\",\n visibility: currentPageIndex == index ? \"visible\" : \"hidden\",\n zIndex: isReset ? \"1\" : \"0\"\n }\n },\n page.pageKey\n ? { key: page.pageKey }\n : {\n /// 无 key 不会重复利用\n }\n ),\n h(\n Page,\n {\n // ...page.pageAttributes,\n effect: pageEffect,\n duration: getPageDuration(props.effect, index),\n easeFunction: getPageEaseFunction(props.effect, index),\n timingFunction: timingFunction,\n delay: getPageDelay(props.effect, index),\n onReady: (open, close) => {\n // console.log(\"onReady \", index);\n pageActions[index] = { open, close };\n /// 渲染结束\n if (++renderCount == appendCount) {\n onRenderComplete?.();\n emits(\"renderComplete\");\n }\n },\n onPageOpenStart: () => {\n // console.log(\"onPageOpenStart \", index);\n setRunningStyle(index);\n },\n onPageOpenEnd: () => {\n // console.log(\"onPageOpenEnd \", index);\n emitsEnd(index);\n },\n onPageCloseStart: () => {\n // console.log(\"onPageCloseStart \", index);\n setRunningStyle(index);\n },\n onPageCloseEnd: () => {\n // console.log(\"onPageCloseEnd \", index);\n emitsEnd(index);\n }\n },\n // () => h(page.component, page.attributes)\n {\n default: () =>\n page.component instanceof HTMLElement\n ? h(\n \"div\",\n {\n ...page.attributes,\n innerHTML: page.component.innerHTML /// ce 动态设置的 props 丢失 !\n }\n // elementsToVNodes(page.component)\n )\n : h(page.component, page.attributes, () => page.child)\n }\n )\n );\n })\n ),\n routesRef.value\n );\n pageElements = routesRef.value.children[0].children;\n}\n\nwatch(\n () => props.effect,\n () => {\n renderPages();\n }\n);\n\nfunction reset(resetPages: PageArgument[] = []) {\n pages = [...resetPages];\n pages.forEach((p) => {\n p.pageKey = p.pageKey || generateUUID();\n });\n onRenderComplete = () => {\n currentPageIndex = -1;\n goto(0);\n };\n renderPages(pages.length, true);\n}\n\nfunction push(page: PageArgument) {\n page.pageKey = page.pageKey || generateUUID();\n pages.push(page);\n onRenderComplete = () => {\n goto(pages.length - 1);\n };\n renderPages(1, pages.length == 1);\n}\n\nfunction pop() {\n if (pages.length <= 1) {\n return;\n }\n goto(pages.length - 2, () => {\n pages.splice(pages.length - 1, 1);\n /// pop 中 onRenderComplete 不会执行\n currentPageIndex = pages.length - 1;\n renderPages();\n });\n}\n\nfunction forward() {\n goto(currentPageIndex + 1);\n}\n\nfunction back() {\n goto(currentPageIndex - 1);\n}\n\nconst routeTaskQueue = new AsyncTaskQueue(1);\n\nfunction goto(index: number, cb?: () => void) {\n routeTaskQueue.addTask(\n () =>\n new Promise<void>((resolve) => {\n const onRouteComplete = () => {\n cb?.();\n resolve();\n };\n if (!isValidPageIndex(index)) {\n onRouteComplete();\n return;\n }\n nextPageIndex = index;\n if (nextPageIndex == currentPageIndex) {\n onRouteComplete();\n return;\n }\n /// 执行动画\n onRouteCompletes.push(onRouteComplete);\n /// 修改 page prop\n renderPages();\n emits(\n \"routeChangeStart\",\n currentPageIndex,\n nextPageIndex,\n pages.length\n );\n if (isForward()) {\n /// forward\n if (isValidPageIndex(currentPageIndex)) {\n pageActions[currentPageIndex].open();\n }\n if (isValidPageIndex(nextPageIndex)) {\n pageActions[nextPageIndex].open();\n }\n } else {\n /// back\n if (isValidPageIndex(currentPageIndex)) {\n pageActions[currentPageIndex].close();\n }\n if (isValidPageIndex(nextPageIndex)) {\n pageActions[nextPageIndex].close();\n }\n }\n })\n );\n}\n\ndefineExpose({\n reset,\n push,\n pop,\n forward,\n back,\n goto,\n currentPageIndex: () => currentPageIndex,\n totalPages: () => pages.length\n});\n</script>\n\n<template>\n <div\n class=\"routes\"\n ref=\"routesRef\"\n style=\"\n display: block;\n position: relative;\n width: 100%;\n height: 100%;\n overflow-x: hidden;\n overflow-y: hidden;\n \"\n ></div>\n</template>\n","<script setup lang=\"ts\">\nimport { watch, ref, computed } from \"vue\";\n\n// for merge ce shadow-root styles\ndefineOptions({\n customOptions: {},\n inheritAttrs: true\n});\n\nconst props = withDefaults(\n defineProps<{\n visible?: boolean;\n isGlobal?: boolean;\n color?: string;\n }>(),\n {\n visible: false,\n isGlobal: true,\n color: \"rgba(0, 0, 0, 0.25)\"\n }\n);\n\nconst style = computed(\n () =>\n ({\n \"background-color\": props.color,\n position: \"fixed\",\n \"z-index\": \"99999\",\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n inset: \"0\",\n overflow: \"hidden\"\n // 'overscroll-behavior-y': 'contain' /* avoid scroll chaining */,\n // 'scrollbar-gutter': 'stable',\n } as Record<string, string>)\n);\n\nconst el = ref();\nconst initDocumentOverflow = document.documentElement.style.overflow;\nlet initParentOverflow;\nwatch(\n () => props.visible,\n () => {\n /// fixScroll\n if (props.isGlobal) {\n document.documentElement.style.overflow = props.visible\n ? \"hidden\"\n : initDocumentOverflow;\n } else {\n if (!initParentOverflow) {\n initParentOverflow = el.value.parentElement.style.overflow || \"visible\";\n }\n el.value.parentElement.style.overflow = props.visible\n ? \"hidden\"\n : initParentOverflow;\n }\n },\n { immediate: true }\n);\n\ndefineExpose({});\n</script>\n\n<template>\n <div\n v-if=\"props.visible\"\n class=\"overlay\"\n :style=\"style\"\n ref=\"el\"\n >\n <slot></slot>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, reactive, watch } from \"vue\";\nimport Overlay from \"./Overlay.vue\";\nimport Container from \"./Container.vue\";\nimport { Timeline, Easing, hasClass } from \"@zyzgroup/core-web\";\n\n// for merge ce shadow-root styles\ndefineOptions({\n customOptions: { Overlay, Container },\n inheritAttrs: true\n});\n\nconst props = withDefaults(\n defineProps<{\n closeWhenClickOverlay?: boolean;\n directionFrom?: \"bottom\" | \"top\" | \"left\" | \"right\" | \"center\" | \"absolute\";\n absoluteLeft?: string;\n absoluteTop?: string;\n absoluteWidth?: string;\n absoluteHeight?: string;\n dur?: number;\n isGlobal?: boolean;\n overlayBgColor?: string;\n /// popValue 单位px, 如果不传,默认 slot width or height\n popValue?: number;\n }>(),\n {\n closeWhenClickOverlay: true,\n directionFrom: \"bottom\",\n absoluteLeft: \"0px\",\n absoluteTop: \"0px\",\n absoluteWidth: \"100%\",\n absoluteHeight: \"100%\",\n dur: 200,\n isGlobal: true\n }\n);\n\nconst emits = defineEmits<{\n (event: \"open\"): void;\n (event: \"close\"): void;\n (event: \"resize\", rect: DOMRect): void;\n (event: \"clickOverlay\"): void;\n}>();\n\nconst tl = new Timeline({ frameDuration: props.dur });\n\nconst popStyle = reactive<{\n width?: string;\n height?: string;\n top?: string;\n bottom?: string;\n left?: string;\n right?: string;\n transform?: string;\n position: string;\n // overflow: string;\n opacity?: String;\n}>({\n position: \"absolute\",\n // overflow: \"hidden\",\n opacity: \"1\"\n});\n\nconst visible = ref(false);\n\nconst popType = ref<\"full\" | \"shrink\" | \"block\">(\"full\");\nwatch(\n () => [props.directionFrom, props.popValue],\n () => {\n tl.clear();\n const isShrink = !props.popValue;\n const popValue = props.popValue ? props.popValue : 100;\n const popUnit = props.popValue ? \"px\" : \"%\";\n switch (props.directionFrom) {\n case \"left\":\n popStyle.height = \"100%\";\n if (!isShrink) {\n popStyle.width = `${popValue}${popUnit}`;\n } else {\n delete popStyle.width;\n }\n popStyle.top = \"0\";\n popStyle.bottom = \"0\";\n delete popStyle.right;\n tl.addTween(\n {\n left: popValue\n },\n { left: 0 },\n {\n easeFunction: Easing.Quadratic.Out,\n onUpdate(data) {\n popStyle.left = `-${data.left}${popUnit}`;\n },\n onComplete\n }\n );\n break;\n case \"right\":\n popStyle.height = \"100%\";\n if (!isShrink) {\n popStyle.width = `${popValue}${popUnit}`;\n } else {\n delete popStyle.width;\n }\n popStyle.top = \"0\";\n popStyle.bottom = \"0\";\n delete popStyle.left;\n tl.addTween(\n {\n right: popValue\n },\n { right: 0 },\n {\n easeFunction: Easing.Quadratic.Out,\n onUpdate(data) {\n popStyle.right = `-${data.right}${popUnit}`;\n },\n onComplete\n }\n );\n break;\n case \"top\":\n popStyle.width = \"100%\";\n if (!isShrink) {\n popStyle.height = `${popValue}${popUnit}`;\n } else {\n delete popStyle.height;\n }\n popStyle.left = \"0\";\n popStyle.right = \"0\";\n delete popStyle.bottom;\n tl.addTween(\n {\n top: popValue\n },\n { top: 0 },\n {\n easeFunction: Easing.Quadratic.Out,\n onUpdate(data) {\n popStyle.top = `-${data.top}${popUnit}`;\n },\n onComplete\n }\n );\n break;\n case \"bottom\":\n popStyle.width = \"100%\";\n if (!isShrink) {\n popStyle.height = `${popValue}${popUnit}`;\n } else {\n delete popStyle.height;\n }\n popStyle.left = \"0\";\n popStyle.right = \"0\";\n delete popStyle.top;\n tl.addTween(\n {\n bottom: popValue\n },\n { bottom: 0 },\n {\n easeFunction: Easing.Quadratic.Out,\n onUpdate(data) {\n popStyle.bottom = `-${data.bottom}${popUnit}`;\n },\n onComplete\n }\n );\n break;\n case \"center\":\n delete popStyle.width;\n delete popStyle.height;\n popStyle.left = \"50%\";\n delete popStyle.right;\n popStyle.top = \"50%\";\n delete popStyle.bottom;\n tl.addTween(\n {\n scale: 0.8,\n opacity: 0\n },\n { scale: 1, opacity: 1 },\n {\n easeFunction: Easing.Quadratic.Out,\n onUpdate(data) {\n popStyle.transform = `translate(-50%, -50%) scale(${data.scale})`;\n popStyle.opacity = `${data.opacity}`;\n },\n onComplete\n }\n );\n break;\n case \"absolute\":\n popStyle.width = props.absoluteWidth;\n popStyle.height = props.absoluteHeight;\n popStyle.left = props.absoluteLeft;\n popStyle.top = props.absoluteTop;\n delete popStyle.right;\n delete popStyle.bottom;\n break;\n }\n\n switch (props.directionFrom) {\n case \"center\":\n popType.value = \"shrink\";\n popStyle.transform = \"translate(-50%, -50%)\";\n break;\n case \"absolute\":\n popType.value = \"shrink\";\n delete popStyle.transform;\n delete popStyle.opacity;\n break;\n default:\n popType.value = \"full\";\n delete popStyle.transform;\n delete popStyle.opacity;\n break;\n }\n if (isShrink) {\n popType.value = \"shrink\";\n }\n },\n { immediate: true }\n);\n\nwatch(\n () => props.absoluteLeft,\n () => {\n switch (props.directionFrom) {\n case \"absolute\":\n popStyle.left = props.absoluteLeft;\n break;\n }\n }\n);\n\nwatch(\n () => props.absoluteTop,\n () => {\n switch (props.directionFrom) {\n case \"absolute\":\n popStyle.top = props.absoluteTop;\n break;\n }\n }\n);\n\nwatch(\n () => props.absoluteWidth,\n () => {\n switch (props.directionFrom) {\n case \"absolute\":\n popStyle.width = props.absoluteWidth;\n break;\n }\n }\n);\n\nwatch(\n () => props.absoluteHeight,\n () => {\n switch (props.directionFrom) {\n case \"absolute\":\n popStyle.height = props.absoluteHeight;\n break;\n }\n }\n);\n\nconst resize = (controller) => {\n emits(\"resize\", controller.rect);\n};\n\nlet action: \"open\" | \"close\" = \"open\";\nfunction onComplete() {\n if (action == \"open\") {\n emits(\"open\");\n } else {\n visible.value = false;\n emits(\"close\");\n }\n}\n\nfunction open() {\n visible.value = true;\n action = \"open\";\n tl.play();\n}\n\nfunction close() {\n action = \"close\";\n switch (props.directionFrom) {\n case \"absolute\":\n onComplete();\n break;\n default:\n tl.reverse();\n break;\n }\n}\n\nfunction clickOverlay(e: Event) {\n // console.log(e.target);\n // console.log(popRef.value.contains(e.target));\n // console.log(hasClass(e.target as HTMLElement, \"pop-content\"));\n const className =\n props.directionFrom == \"absolute\" &&\n props.absoluteWidth == \"100%\" &&\n props.absoluteHeight == \"100%\"\n ? \"pop-content\"\n : \"pop\";\n if (e.target && hasClass(e.target as HTMLElement, className)) {\n if (props.closeWhenClickOverlay) {\n close();\n }\n emits(\"clickOverlay\");\n }\n}\n\ndefineExpose({ open, close });\n</script>\n\n<template>\n <Overlay\n :visible=\"visible\"\n :isGlobal=\"props.isGlobal\"\n :color=\"props.overlayBgColor\"\n >\n <!-- overflow: hidden; -->\n <div\n class=\"pop\"\n style=\"display: block; position: relative; width: 100%; height: 100%\"\n @click=\"clickOverlay\"\n >\n <Container\n class=\"pop-content\"\n :type=\"popType\"\n :style=\"popStyle\"\n @ready=\"resize\"\n @update=\"resize\"\n >\n <slot><div></div></slot>\n </Container>\n </div>\n </Overlay>\n</template>\n","<script setup lang=\"ts\">\nimport { ref } from \"vue\";\nimport {\n useLoadImage,\n Timeline,\n ImageDisplayMode,\n computeImageDisplayRect,\n getViewportSize,\n Easing\n} from \"@zyzgroup/core-web\";\nimport Container from \"./Container.vue\";\nimport Pop from \"./Pop.vue\";\n\n// for merge ce shadow-root styles\ndefineOptions({\n name: \"Image\",\n customOptions: { Container, Pop },\n inheritAttrs: true\n});\n\nconst props = withDefaults(\n defineProps<{\n src: string;\n mode?: ImageDisplayMode;\n dur?: number;\n bgColor?: string;\n openImageDetailWhenClick?: boolean;\n }>(),\n {\n mode: \"scaleToFill\",\n dur: 300,\n bgColor: \"transparent\",\n openImageDetailWhenClick: true\n }\n);\n\nconst emits = defineEmits<{\n (event: \"settled\", x: number, y: number, width: number, height: number): void;\n}>();\n\nconst tl = new Timeline({\n frameDuration: props.dur\n});\n\nconst popX = ref(0);\nconst popY = ref(0);\nconst popWidth = ref(0);\nconst popHeight = ref(0);\n\nconst finalX = ref(0);\nconst finalY = ref(0);\nconst finalWidth = ref(0);\nconst finalHeight = ref(0);\n\nconst isCORS = ref(true);\n\nconst sourceWidth = ref(0);\nconst sourceHeight = ref(0);\n/// 初始化获取图片信息\nuseLoadImage(props.src)\n .then((info: { width: number; height: number; aspectRatio: number }) => {\n sourceWidth.value = info.width;\n sourceHeight.value = info.height;\n setImageWidthHeight();\n })\n .catch(() => {\n isCORS.value = false;\n });\n\nconst wrapWidth = ref(0);\nconst wrapHeight = ref(0);\nconst outter = (controller) => {\n wrapWidth.value = controller.rect.width;\n wrapHeight.value = controller.rect.height;\n setImageWidthHeight();\n};\n\nconst showWidth = ref(0);\nconst showHeight = ref(0);\nfunction setImageWidthHeight() {\n if (\n !wrapWidth.value ||\n !wrapHeight.value ||\n !sourceWidth.value ||\n !sourceHeight.value\n ) {\n return;\n }\n const wrapImageRect = computeImageDisplayRect(\n props.mode,\n sourceWidth.value,\n sourceHeight.value,\n wrapWidth.value,\n wrapHeight.value\n );\n showWidth.value = wrapImageRect.width;\n showHeight.value = wrapImageRect.height;\n\n const { width: viewportWidth, height: viewportHeight } = getViewportSize();\n const viewportImageRect = computeImageDisplayRect(\n \"aspectFit\",\n sourceWidth.value,\n sourceHeight.value,\n viewportWidth,\n viewportHeight\n );\n finalWidth.value = viewportImageRect.width;\n finalHeight.value = viewportImageRect.height;\n finalX.value = (viewportWidth - finalWidth.value) / 2;\n finalY.value = (viewportHeight - finalHeight.value) / 2;\n}\n\nconst inner = (controller) => {\n emits(\"settled\", controller.rect.x, controller.rect.y, controller.rect.width, controller.rect.height);\n};\n\n// const app = inject(\"app\", null) as unknown as App<Element>;\n\nlet isOpenPop = false;\nconst imageRef = ref();\nconst popRef = ref();\nasync function clickSourceImage() {\n if (!props.openImageDetailWhenClick) {\n return;\n }\n const showSize = await imageRef.value.getRect();\n tl.clear();\n tl.addTween(\n {\n left: showSize.x,\n top: showSize.y,\n width: showSize.width,\n height: showSize.height\n },\n {\n left: finalX.value,\n top: finalY.value,\n width: finalWidth.value,\n height: finalHeight.value\n },\n {\n easeFunction: Easing.Quadratic.Out,\n onUpdate(data) {\n popX.value = data.left;\n popY.value = data.top;\n popWidth.value = data.width;\n popHeight.value = data.height;\n },\n onComplete() {\n if (isOpenPop) {\n popRef.value.close();\n }\n isOpenPop = !isOpenPop;\n }\n }\n );\n if (!isOpenPop) {\n popRef.value.open();\n tl.play();\n }\n}\n\nfunction clickOverlay() {\n if (isOpenPop) {\n tl.reverse();\n }\n}\n\ndefineExpose({});\n</script>\n\n<template>\n <Container\n class=\"image\"\n type=\"full\"\n :style=\"{ backgroundColor: props.bgColor }\"\n @ready=\"outter\"\n @update=\"outter\"\n @click=\"clickSourceImage\"\n >\n <Container\n v-if=\"isCORS\"\n class=\"image-inner\"\n ref=\"imageRef\"\n type=\"shrink\"\n :style=\"{\n width: showWidth + 'px',\n height: showHeight + 'px',\n backgroundImage: `url(${props.src})`,\n backgroundSize: `${showWidth}px ${showHeight}px`\n }\"\n @ready=\"inner\"\n @update=\"inner\"\n ></Container>\n <Container v-if=\"!isCORS\" type=\"shrink\">\n <img :src=\"props.src\" :style=\"{display: 'block', objectFit: 'contain'}\"></img>\n </Container>\n <Pop\n ref=\"popRef\"\n direction-from=\"absolute\"\n :absolute-left=\"`${popX}px`\"\n :absolute-top=\"`${popY}px`\"\n :absolute-width=\"`${popWidth}px`\"\n :absolute-height=\"`${popHeight}px`\"\n :close-when-click-overlay=\"false\"\n @clickOverlay=\"clickOverlay\"\n >\n <div\n class=\"image-pop\"\n :style=\"{\n width: '100%',\n height: '100%',\n backgroundImage: `url(${props.src})`,\n backgroundSize: '100% 100%'\n }\"\n ></div>\n </Pop>\n </Container>\n</template>\n\n<style scoped>\n.image {\n overflow: hidden;\n display: flex !important;\n justify-content: center;\n align-items: center;\n}\n.image-inner,\n.image-pop {\n background-repeat: no-repeat;\n background-position: center center;\n /* background-size: contain; */\n}\n/*\n.none {\n object-fit: none;\n}\n.fill {\n object-fit: fill;\n}\n.cover {\n object-fit: cover;\n}\n.contain {\n object-fit: contain;\n}\n.scale-down {\n object-fit: scale-down;\n}\n*/\n</style>\n","<script setup lang=\"ts\">\nimport { ref, h } from \"vue\";\nimport { ElementEventBusController, hasClass } from \"@zyzgroup/core-web\";\nimport Routes, { SupportedRouteEffect } from \"./Routes.vue\";\nimport Pop from \"./Pop.vue\";\nimport Image from \"./Image.vue\";\nimport Container from \"./Container.vue\";\n\n// for merge ce shadow-root styles\ndefineOptions({\n customOptions: { Image, Container, Routes },\n inheritAttrs: true\n});\n\nconst props = withDefaults(\n defineProps<{\n urls: string[];\n effect?: SupportedRouteEffect;\n }>(),\n {\n urls: () => [],\n effect: \"moveToLeftFade\"\n }\n);\n\nconst emits = defineEmits<{\n // (event: \"click\"): void;\n}>();\n\nconst currentIndex = ref(0);\nfunction routeChangeEnd(_: number, toPageIndex: number) {\n currentIndex.value = toPageIndex;\n}\n\nconst routesRef = ref();\nconst ready = (controller: ElementEventBusController) => {\n controller.eb.on(\"panLeft\", () => {\n routesRef.value?.forward();\n });\n controller.eb.on(\"panRight\", () => {\n routesRef.value?.back();\n });\n routesRef.value.reset(\n props.urls.map((url) => ({\n component: h(Image, {\n mode: \"aspectFit\",\n src: url,\n openImageDetailWhenClick: false\n })\n }))\n );\n};\n\nconst popRef = ref();\nfunction open() {\n popRef.value?.open();\n}\nfunction close() {\n popRef.value?.close();\n}\n\nconst checkClose = (e: Event) => {\n // console.log(e.target);\n if (e.target && hasClass(e.target as HTMLElement, \"image\")) {\n close();\n }\n};\n\ndefineExpose({ open, close });\n</script>\n\n<template>\n <Pop\n ref=\"popRef\"\n directionFrom=\"absolute\"\n @click=\"checkClose\"\n >\n <div\n v-if=\"props.urls.length > 1\"\n style=\"\n position: absolute;\n top: 30px;\n left: 50%;\n transform: translate(-50%, 0);\n color: #ffffff;\n font-size: 1em;\n z-index: 98;\n \"\n >\n {{ currentIndex + 1 }} / {{ props.urls.length }}\n </div>\n <Container\n style=\"\n position: absolute;\n top: 50%;\n transform: translate(0, -50%);\n width: 100%;\n height: 100%;\n z-index: 97;\n \"\n @ready=\"ready\"\n >\n <Routes\n ref=\"routesRef\"\n :effect=\"props.effect\"\n @routeChangeEnd=\"routeChangeEnd\"\n />\n </Container>\n </Pop>\n</template>\n","<script setup lang=\"ts\">\nimport { ref } from \"vue\";\nimport Pop from \"../Pop.vue\";\n\n// for merge ce shadow-root styles\ndefineOptions({\n customOptions: { Pop },\n inheritAttrs: true\n});\n\nconst props = withDefaults(\n defineProps<{\n tel: string;\n }>(),\n {}\n);\n\nconst emits = defineEmits<{}>();\n\nconst el = ref();\nfunction open() {\n el.value?.open();\n}\nfunction close() {\n el.value?.close();\n}\ndefineExpose({ open, close });\n</script>\n\n<template>\n <Pop\n directionFrom=\"bottom\"\n :closeWhenClickOverlay=\"false\"\n ref=\"el\"\n >\n <div class=\"pop-tel\">\n <div>{{ tel }}</div>\n <a\n class=\"pop-tel-call\"\n @click=\"close\"\n :href=\"`tel:${tel}`\"\n >\n 呼叫\n </a>\n <div\n class=\"pop-tel-cancel\"\n @click=\"close\"\n >\n 取消\n </div>\n </div>\n </Pop>\n</template>\n\n<style scoped>\n.pop-tel {\n background-color: #ffffff;\n color: #333333;\n border-top-left-radius: 8px;\n border-top-right-radius: 8px;\n}\n.pop-tel > div,\n.pop-tel-call {\n display: block;\n height: 64px;\n line-height: 64px;\n font-size: 18px;\n text-align: center;\n}\n.pop-tel-cancel,\n.pop-tel-call {\n border-top: 1px solid #e6e6e6;\n}\n.pop-tel > div:nth-child(1) {\n color: #999999;\n}\n.pop-tel-call {\n color: #333333;\n font-weight: bold;\n}\n.pop-tel-call,\n.pop-tel-call:link,\n.pop-tel-call:visited,\n.pop-tel-call:hover,\n.pop-tel-call:active {\n /* 禁止长按链接与图片弹出菜单 */\n -webkit-touch-callout: none;\n text-decoration: none;\n}\n.pop-tel-call:focus {\n outline: none;\n}\n</style>\n","<script setup lang=\"tsx\">\nimport { ref } from \"vue\";\nimport { useRouter } from \"../../hooks\";\nimport LayoutPage from \"../layout/LayoutPage.vue\";\nimport Footer from \"./Footer.vue\";\nimport PlateDisplay from \"../PlateDisplay.vue\";\nimport ImageView from \"../ImageView.vue\";\nimport ViewDocument from \"../form/ViewDocument.vue\";\nimport PopTel from \"../pop/PopTel.vue\";\n\n// for merge ce shadow-root styles\ndefineOptions({\n customOptions: {\n LayoutPage,\n Footer,\n PlateDisplay,\n ViewDocument,\n PopTel,\n ImageView\n },\n inheritAttrs: true\n});\n\nconst router = useRouter();\n\nfunction viewDocument() {\n router.push({\n name: \"view-document\",\n params: {\n title: \"收费标准\",\n src: encodeURIComponent(\n \"https://erichd2.oss-cn-shanghai.aliyuncs.com/0000/0002/2159\"\n )\n }\n });\n}\n\nconst popTelEl = ref();\nfunction call() {\n popTelEl.value?.open();\n}\n\nconst imageViewEl = ref();\nfunction viewPhotos() {\n imageViewEl.value?.open();\n}\n</script>\n\n<template>\n <LayoutPage class=\"lot\">\n <div class=\"lot-main-bg\"></div>\n <div class=\"lot-main\">\n <div>若临测试泊位机器人停车场</div>\n <div>\n <div></div>\n <div>编号</div>\n <div></div>\n </div>\n <div>\n <span>103</span>\n <span>002</span>\n </div>\n <div>\n <div>停车场主页</div>\n <div>更换附近车位</div>\n <div @click=\"viewDocument\">收费标准</div>\n </div>\n <div class=\"lot-detail\">\n <div>\n <div>待支付</div>\n <div class=\"red\">¥0.01</div>\n </div>\n <div>\n <div>已支付</div>\n <div>¥0.01</div>\n </div>\n <div>\n <div>订单编号</div>\n <div>33333333333</div>\n </div>\n <div>\n <div>开始时间</div>\n <div>2025-04-08 09:41:25</div>\n </div>\n <div>\n <div>停车时长</div>\n <div>51小时53分钟15秒</div>\n </div>\n <div>\n <div>优惠券</div>\n <div class=\"red\">1分钟</div>\n </div>\n <div>\n <div>优惠信息</div>\n <div class=\"red\">xxxx</div>\n </div>\n <!-- <div>\n <div>包月开始时间</div>\n <div>2025-04-08 09:41:25</div>\n </div>\n <div>\n <div>包月结束时间</div>\n <div>2025-04-08 09:41:25</div>\n </div> -->\n <div class=\"lot-detail-gap\"></div>\n <div>\n <div>车牌号</div>\n <div class=\"bold\">\n <PlateDisplay\n plate=\"苏U77777\"\n plate-type=\"b\"\n ></PlateDisplay>\n </div>\n </div>\n <div>\n <div>现场照片</div>\n <div @click=\"viewPhotos\">查看</div>\n </div>\n </div>\n <div class=\"lot-actions\">\n <div @click=\"call\">联系客服</div>\n </div>\n </div>\n <template #footer><Footer></Footer></template>\n <template #global>\n <PopTel\n tel=\"15851575410\"\n ref=\"popTelEl\"\n ></PopTel>\n <ImageView\n :urls=\"[\n 'https://erichd2.oss-cn-shanghai.aliyuncs.com/0000/0002/2159',\n 'https://erichd2.oss-cn-shanghai.aliyuncs.com/0000/0002/2159'\n ]\"\n ref=\"imageViewEl\"\n ></ImageView>\n </template>\n </LayoutPage>\n</template>\n\n<style scoped>\n.lot-main-bg {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1;\n width: 100%;\n height: 5.2rem;\n border-bottom-left-radius: 2rem 0.5rem;\n border-bottom-right-radius: 2rem 0.5rem;\n background: linear-gradient(180deg, #5a82f0 0%, #66b3ff 100%);\n}\n.lot-main {\n position: relative;\n z-index: 2;\n width: 100%;\n overflow: hidden;\n box-sizing: border-box;\n line-height: 1;\n color: #ffffff;\n padding: 0 0.3rem;\n margin-bottom: 0.3rem;\n text-align: center;\n}\n.lot-main > div:nth-child(1) {\n font-size: 0.32rem;\n padding-top: 0.4rem;\n word-break: break-all;\n font-weight: bold;\n}\n.lot-main > div:nth-child(2) > div:nth-child(1) {\n width: 2.4rem;\n height: 0.04rem;\n background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, #ffffff 100%);\n}\n.lot-main > div:nth-child(2) > div:nth-child(3) {\n width: 2.4rem;\n height: 0.04rem;\n background: linear-gradient(90deg, #ffffff 0%, rgba(255, 255, 255, 0) 100%);\n}\n.lot-main > div:nth-child(2) > div:nth-child(2) {\n width: 1rem;\n font-size: 0.28rem;\n line-height: 0.32rem;\n}\n.lot-main > div:nth-child(2) {\n display: flex;\n align-items: center;\n margin: 0.28rem auto 0;\n width: 4.8rem;\n position: relative;\n}\n.lot-main > div:nth-child(3) {\n font-family: \"D-DINExp-Bold-number\";\n margin-top: 0.12rem;\n font-size: 0.8rem;\n letter-spacing: 0.06rem;\n}\n.lot-main > div:nth-child(3) > span + span {\n margin-left: 0.3rem;\n}\n.lot-main > div:nth-child(4) {\n display: flex;\n justify-content: space-between;\n font-size: 0.28rem;\n line-height: 0.28rem;\n margin: 0.3rem 0;\n}\n.lot-main > div:nth-child(4) > div {\n flex: 1 1 auto;\n text-align: center;\n}\n.lot-main > div:nth-child(4) > div + div {\n border-left: 1px solid rgba(255, 255, 255, 0.4);\n}\n.lot-detail {\n position: relative;\n background: #ffffff;\n box-shadow: 0 0.04rem 0.1rem rgba(0, 0, 0, 0.1);\n border-radius: 0.08rem;\n padding: 0 0.3rem 0.1rem;\n font-size: 0.28rem;\n color: #666666;\n}\n.lot-detail > div {\n line-height: 0.4rem;\n margin: 0.2rem auto;\n display: flex;\n justify-content: space-between;\n}\n.lot-detail > div:nth-child(1) {\n border-bottom: 1px solid var(--yz-xg-border-color);\n line-height: 0.88rem;\n margin: 0 0 0.2rem;\n font-weight: bold;\n}\n.lot-detail > div:nth-child(1) > div:nth-child(2) {\n font-size: 0.4rem;\n}\n.lot-detail > div > div:nth-child(1) {\n flex: 0 0 auto;\n padding-right: 0.2rem;\n}\n.lot-detail > div > div:nth-child(2) {\n color: #333333;\n}\n.lot-detail-gap {\n border-top: 1px solid var(--yz-xg-border-color);\n}\n.lot-actions {\n margin: 0.2rem 0;\n background: #ffffff;\n box-shadow: 0px 0.04rem 0.1rem rgba(0, 0, 0, 0.1);\n border-radius: 0.08rem;\n display: flex;\n align-items: center;\n font-size: 0.28rem;\n}\n.lot-actions > div {\n flex: 1;\n line-height: 0.88rem;\n position: relative;\n cursor: pointer;\n color: var(--yz-xg-primary);\n text-align: center;\n font-weight: 700;\n}\n</style>\n","import { ref } from \"vue\";\nimport {\n createRouter,\n createWebHistory,\n createWebHashHistory,\n type Router,\n type RouteRecordRaw,\n type RouteRecordNormalized,\n type RouteLocationNormalized,\n type NavigationGuardNext,\n type RouteLocationRaw,\n RouteLocationNormalizedLoaded,\n NavigationFailure\n} from \"vue-router\";\nexport {\n RouterLink,\n RouterView,\n useRouter,\n useRoute,\n type Router\n} from \"vue-router\";\nimport App from \"../App.vue\";\nimport ViewDocument from \"../components/form/ViewDocument.vue\";\n// import XG from \"../components/xg/XG.vue\";\nimport Lot from \"../components/xg/Lot.vue\";\nimport Park from \"../components/xg/Park.vue\";\n\nconst router = createRouter({\n // history: createWebHistory(import.meta.env.BASE_URL),\n history: createWebHashHistory(import.meta.env.BASE_URL),\n routes: [\n // {\n // path: \"/\",\n // name: \"app\",\n // component: App\n // },\n {\n path: \"/view-document/:title/:src\",\n name: \"view-document\",\n component: ViewDocument\n // props: true // error : https://github.com/vuejs/router/blob/main/packages/router/CHANGELOG.md#414-2022-08-22\n },\n {\n path: \"/\",\n name: \"xg\",\n redirect: \"/lot\"\n },\n {\n path: \"/lot\",\n name: \"lot\",\n component: Lot\n },\n {\n path: \"/park\",\n name: \"park\",\n component: Park\n }\n ],\n // [\n // {\n // path: \"/\",\n // redirect: \"/showcase\"\n // },\n // {\n // path: \"/\",\n // path: \"/demo/:demoid\",\n // name: \"home\",\n // component: HomeView,\n // // router level code-splitting\n // // this generates a separate chunk (About.[hash].js) for this router\n // // which is lazy-loaded when the router is visited.\n // component: () => import(\"../views/AboutView.vue\"),\n // meta: {},\n // children: [\n // { path: \"\", name: \"default\", redirect: \"/demo/sub1\" },\n // {\n // path: \"sub1\",\n // name: \"sub1\",\n // component: () => import(\"@/src/views/sub1.vue\")\n // }\n // ]\n // },\n // {\n // path: \"/:pathMatch(.*)*\",\n // name: \"404\",\n // component: Page404\n // }\n // ]\n scrollBehavior: (_to, _from, savedPosition) => {\n // 这个功能只在支持 history.pushState 的浏览器中可用\n if (savedPosition) {\n return savedPosition;\n } else {\n return { left: 0, top: 0 };\n }\n }\n});\n\nexport default router;\n\n// <RouterLink to=\"/\">Home</RouterLink>\n// <RouterLink to=\"/about\">About</RouterLink>\n// <RouterView />\n\n// const router: Router = useRouter();\n// const route = useRoute();\n// route.query\n// route.params\n\n// next: 前进 prev: 返回\nexport const routeDirection = ref<\"next\" | \"prev\">(\"next\");\nconst routeList = [];\n\n// 路由导航守卫\nrouter.beforeEach(\n (\n to: RouteLocationNormalized,\n from: RouteLocationNormalized,\n next: NavigationGuardNext\n ) => {\n // console.log(to, from);\n // console.log(...routeList, \" : \", to.name);\n const length = routeList.length;\n const index = routeList.findIndex((r) => r == to.name);\n if (length > 1 && index >= 0 && index < length - 1) {\n routeDirection.value = \"prev\";\n routeList.splice(index + 1);\n } else {\n routeDirection.value = \"next\";\n routeList.push(to.name);\n }\n // console.log(routeDirection.value);\n next();\n }\n);\n\n// router.afterEach(\n// (\n// to: RouteLocationNormalized,\n// from: RouteLocationNormalizedLoaded,\n// failure?: NavigationFailure | void\n// ) => {}\n// );\n\n// export async function push(location: RouteLocationRaw) {\n// const router: Router = useRouter();\n// await router.push(location);\n// }\n\n// {\n// name: Name;\n// path: Path;\n// paramsRaw: ParamsRaw;\n// params: Params;\n// meta: Meta;\n// }\n// export async function to(this: any, path: string) {\n// await push({ path });\n// }\n\n// 动态注册路由\n// const remove = addRoute(\"demo\", {\n// path: \"sub2\",\n// name: \"sub2\",\n// component: () => import(\"@/src/views/sub2.vue\")\n// });\n// remove();\n// export function addRoute(route: RouteRecordRaw): () => void {\n// const router: Router = useRouter();\n// return router.addRoute(route);\n// }\n\n// export function removeRoute(name: string) {\n// const router: Router = useRouter();\n// router.removeRoute(name);\n// }\n\n// export function hasRoute(name: string): boolean {\n// const router: Router = useRouter();\n// return router.hasRoute(name);\n// }\n\n// export function getRoutes(): RouteRecordNormalized[] {\n// const router: Router = useRouter();\n// return router.getRoutes();\n// }\n\n// export function getCurrentRoute() {\n// const router: Router = useRouter();\n// return {\n// params: router.currentRoute.value.params,\n// query: router.currentRoute.value.query\n// };\n// }\n","import { computed } from \"vue\";\nimport {\n useStore,\n createNamespacedHelpers,\n mapState,\n mapGetters,\n mapMutations,\n mapActions\n} from \"vuex\";\n\n/// STATE TYPES\nexport type VuexState = VuexRootState & {\n demo: VuexDemoState;\n};\nexport interface VuexRootState {\n count: number;\n}\nexport interface VuexDemoState {\n name: string;\n}\n/// MUTATION TYPES\nexport const INCREMENT = \"increment\";\nexport const DECREMENT = \"decrement\";\n/// ACTION TYPES\nexport const INCREMENTACTION = \"incrementAction\";\n\nexport function useVuex() {\n const store = useStore<VuexState>();\n return {\n store\n // state: store.state\n\n // ...useVuexStates([\"count\"]),\n // ...useVuexStates(\"demo\", [\"name\"]),\n\n // ...useVuexGetters({ totaln: \"totaln\" }),\n // ...useVuexGetters(\"demo\", [\"nameFormat\"]),\n\n // ...useVuexMutations({\n // [INCREMENT]: INCREMENT,\n // [DECREMENT]: DECREMENT\n // }),\n // ...useVuexMutations(\"demo\", [\"changeName\"]),\n\n // ...useVuexActions({\n // [INCREMENTACTION]: INCREMENTACTION\n // }),\n // ...useVuexActions(\"demo\", [\"changeNameAction\"])\n\n // {{ state.count }}\n // {{ state.demo.name }}\n // {{ store.getters.totalCount }}\n // {{ store.getters.totaln(2) }}\n // {{ totaln(3) }}\n // {{ store.getters[\"demo/nameFormat\"] }}\n };\n}\n\n// ...mapState([\"count\"]);\n// ...mapState({ count: state => state.count });\nexport function useVuexStates(\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexStates(\n moduleName: string,\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexStates(\n moduleName: string | Record<string, string> | string[],\n keyMaps?: Record<string, string> | string[]\n): Record<string, any> {\n let mapFn = mapState;\n if (typeof moduleName == \"string\" && moduleName.length > 0) {\n mapFn = createNamespacedHelpers(moduleName).mapState;\n } else {\n keyMaps = moduleName as Record<string, string> | string[];\n }\n return useVuexMap(keyMaps!, mapFn);\n}\n\n// ...mapGetters([\"totaln\"]);\n// ...mapGetters({ totalnAnother: \"totaln\" });\nexport function useVuexGetters(\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexGetters(\n moduleName: string,\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexGetters(\n moduleName: string | Record<string, string> | string[],\n keyMaps?: Record<string, string> | string[]\n): Record<string, any> {\n let mapFn = mapGetters;\n if (typeof moduleName == \"string\" && moduleName.length > 0) {\n mapFn = createNamespacedHelpers(moduleName).mapGetters;\n } else {\n keyMaps = moduleName as Record<string, string> | string[];\n }\n return useVuexMap(keyMaps!, mapFn);\n}\n\n// ...mapMutations([INCREMENT]);\n// ...mapMutations({ inc: INCREMENT });\nexport function useVuexMutations(\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexMutations(\n moduleName: string,\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexMutations(\n moduleName: string | Record<string, string> | string[],\n keyMaps?: Record<string, string> | string[]\n): Record<string, any> {\n let mapFn = mapMutations;\n if (typeof moduleName == \"string\" && moduleName.length > 0) {\n mapFn = createNamespacedHelpers(moduleName).mapMutations;\n } else {\n keyMaps = moduleName as Record<string, string> | string[];\n }\n if (Array.isArray(keyMaps)) {\n return mapFn(keyMaps!);\n } else {\n return mapFn(keyMaps!);\n }\n}\n\n// ...mapActions([INCREMENTACTION]);\n// ...mapActions({ inca: INCREMENTACTION });\nexport function useVuexActions(\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexActions(\n moduleName: string,\n keyMaps: Record<string, string> | string[]\n): Record<string, any>;\nexport function useVuexActions(\n moduleName: string | Record<string, string> | string[],\n keyMaps?: Record<string, string> | string[]\n): Record<string, any> {\n let mapFn = mapActions;\n if (typeof moduleName == \"string\" && moduleName.length > 0) {\n mapFn = createNamespacedHelpers(moduleName).mapActions;\n } else {\n keyMaps = moduleName as Record<string, string> | string[];\n }\n if (Array.isArray(keyMaps)) {\n return mapFn(keyMaps!);\n } else {\n return mapFn(keyMaps!);\n }\n}\n\nfunction useVuexMap(\n keys: Record<string, string> | string[],\n mapFn: any\n): Record<string, any> {\n const store = useStore();\n const maps: Record<string, any> = {};\n const mappedKeyFns = mapFn(keys);\n Object.keys(mappedKeyFns).forEach((key) => {\n const fn = mappedKeyFns[key].bind({ $store: store });\n maps[key] = computed(fn);\n });\n return maps;\n}\n"],"names":["getInstance","getCurrentInstance","getVNode","component","props","createVNode","renderComponent","options","vNode","render","useVueEffect","effect","remove","onMounted","onUnmounted","getDefinedRegExpPattern","s","regexp","regMatch","source","matchs","m","regMatchAll","results","matchsArray","generateUUID","digit","chars","length","id","lowercaseFirst","val","c","toKebab","value","glue","v","toPascal","toCamel","label","StringTag","SymbolTag","getTag","isString","isNumber","isSymbol","newConstructor","o","args","deleteArrayItem","arr","item","index","_nativeMap","_nativeSet","isReallyNaN","num","parseNumber","defaultValue","clamp","x","min","max","realMin","realMax","euclideanModulo","lerp","y","t","fixedDotNumberString","precision","maxDotNumber","extractAllNumbers","str","matches","_generateTables","buffer","floatView","uint32View","baseTable","shiftTable","i","e","mantissaTable","exponentTable","offsetTable","MIMEEnum","EncodeEnum","toBlob","data","mime","encode","now","throttle","fn","ms","ready","EventBus","name","handler","payload","onceCb","fired","AsyncTaskQueue","concurrency","controller","task","waitTasks","lastIndex","r","success","error","acc","activeEffect","watchEffect","Dep","targetKeyDepMap","getDep","target","key","keyDepMap","dep","reactiveVue2","raw","deep","reactiveVue3","ref","receiver","prevValue","deepProxy","reactive","CacheMap","k","entries","top","cb","ShellSort","array","obeyCompare","a","b","len","gapSize","temp","j","_nativePromise","factory","module","undefined","hex_chr","md5cycle","d","md5blk","md5blks","md5blk_array","md51","n","state","tail","tmp","lo","hi","md51_array","rhex","hex","from","to","begin","end","targetArray","sourceArray","toUtf8","utf8Str2ArrayBuffer","returnUInt8Array","buff","arrayBuffer2Utf8Str","concatenateArrayBuffers","first","second","result","hexToBinaryString","bytes","SparkMD5","contents","ret","content","hash","DOMToString","el","DOMToBlob","mimeType","useLocalStorage","useEventListener","event","useCapture","eventHandler","lastTime","currTime","timeRemain","requestAnimationFrameCycle","isCancel","frame","time","start","idleTaskQueue","isYZRequestIdleCallbackScheduled","scheduleYZIdle","timeout","yzRequestIdleCallback","deadline","timeRemaining","isDeleteTask","taskStartTime","taskEndTime","frameEndTimeStamp","previousFrameDurTime","activeFrameDurTime","currentCallback","channel","port","frameStartTimeStamp","currentFrameDurTime","Sequence","Easing","amount","power","numSteps","easingFunction","randomProportion","normalProportion","reverseEasing","easing","Interpolation","p0","p1","fc","p2","p3","v0","v1","t2","t3","f","pw","bn","Group","tweenId","tween","preserve","tweenIds","autoStart","mainGroup","Tween","_object","_group","properties","duration","property","_valuesStart","_valuesEnd","_valuesStartRepeat","startValue","startValueIsArray","propType","isInterpolationList","endValues","prop","numChainedTweens","group","times","yoyo","interpolationFunction","tweens","callback","elapsed","endTime","startIsArray","endIsArray","endValue","Clock","diff","newTime","Clock$1","Timeline","reverse","clones","fromValues","toValues","tweenConfig","clock","frameDuration","resolve","isContinue","reverseTweens","maxFrames","vnodes","patchs","keep","vnode","patch","getVnode","hFromEl","getAlternateVnode","scheduleVnode","editVnodeImmediate","toRadian","degree","toDegree","radian","z","distance","x1","y1","x2","y2","distance2","angle","startX","startY","endX","endY","polar","namedEntities","createNamedToNumberedLookup","itemsString","radix","lookup","items","entity","base10","format","keys","randomString","holder","randomstring","getTextAnchor","textAlign","mapping","getDominantBaseline","textBaseline","STYLES","CustomCanvasGradient","gradientNode","ctx","offset","color","stop","CustomCanvasPattern","pattern","CustomCanvasContext","canvas","width","height","styleState","elementName","resetFill","element","type","currentElement","currentStyleGroup","node","style","opacity","globalAlpha","attr","fixNamedEntities","serialized","parent","transform","degrees","path","command","cp1x","cp1y","cp2x","cp2y","cpx","cpy","vector","radius","x0","y0","unit_vec_p1_p0","unit_vec_p1_p2","cos","theta","unit_vec_p1_origin","len_p1_origin","unit_vec_origin_start_tangent","unit_vec_origin_end_tangent","getAngle","startAngle","endAngle","rect","rootGroup","childNodes","grad","r0","r1","fontPart","font","text","action","textElement","counterClockwise","sweepFlag","largeArcFlag","clipPath","newGroup","image","dx","dy","dw","dh","sx","sy","sw","sh","svg","defs","svgImage","translateDirective","originTransform","transformDirective","repetition","img","dashArray","YZCanvasContext","enableCustomContext","lineWidth","lineCap","lineJoin","lineDashOffset","miterLimit","alpha","w","h","maxWidth","newPath","centerX","centerY","radiusX","radiusY","rotation","colorStops","gradient","settings","imageData","serializedSVG","svgElement","L","lineAngle","minX","minY","maxX","maxY","sin","x1r","x2r","y1r","y2r","line","x4","y4","dx1","dx2","m1","m2","xInt","yInt","Arc","cx","cy","rx","ry","xAxisRotate","phi","fa","fs","p","x_m","y_m","x1_d","y1_d","radius_check_value","r_sq","sq","cx_d","cy_d","x_m_d","y_m_d","vectorAngle","ux","uy","vx","vy","theta_1","delta_theta","Arc$1","QuadraticBezier","c1x","c1y","xArr","yArr","QuadraticBezier$1","CubicBezier","t1","dot","dots","dots2","l","p4","x3","y3","z2","Tvalues","Cvalues","sum","ct","xbase","ybase","ll","step","t13","t12","mx","my","nx","ny","ax","ay","CubicBezier$1","TAU","unit_vector_angle","sign","get_arc_center","sin_phi","cos_phi","x1p","y1p","rx_sq","ry_sq","x1p_sq","y1p_sq","radicant","cxp","cyp","v1x","v1y","v2x","v2y","theta1","approximate_unit_arc","a2c","lambda","cc","segments","curve","xp","yp","q2c","l2c","SVGParsedPathArgsLength","DOMSVGUtil","tagName","attrs","useAttribute","svgContainer","useClickA","svgString","substring","argsString","seg","quadX","quadY","bezierX","bezierY","prevCommand","curves","crp","iLen","bp","startPoint","lastPoint","pt","conversion","prev","cmd","convert","DOMSVGUtil$1","PathD","originMatrix","paths","isResetStart","count","points","lines","toX","toY","startPathX","startPathY","normalizedLines","X","Y","xmin","ymin","xmax","ymax","Matrix","c2x","c2y","linesCount","ratio","onlystart","sp","ii","point","pointX","pointY","pathLength","best","bestLength","bestDistance","scanLength","scan","scanDistance","beforeLength","before","beforeDistance","afterLength","after","afterDistance","pts","totalLength","ns","nsLength","needAdded","alen","left","right","Shape","sourceDashArray","cX","cY","mouse","shape","nameOrObj","distSQ","dist","force","gravity","friction","spring","springLength","trail","progress","pathd","prevOnUpdate","tl","coords","Point3D","vpX","vpY","cZ","degX","rotatePoint","degY","degZ","scale","dz","dp","Point3D$1","Quaternion","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","z0","w0","z1","w1","dir","sqrSin","tDir","quaternion","euler","update","order","c1","c2","c3","s1","s2","s3","axis","halfAngle","te","m11","m12","m13","m21","m22","m23","m31","m32","m33","trace","vFrom","vTo","q","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","qb","cosHalfTheta","sqrSinHalfTheta","sinHalfTheta","halfTheta","ratioA","ratioB","qa","theta2","r2","attribute","Vector3","scalar","_quaternion","vz","qx","qy","qz","qw","tx","ty","tz","minVal","maxVal","v2","az","bx","by","bz","denominator","_v3","planeNormal","normal","sz","u","WebGLCoordinateSystem","WebGPUCoordinateSystem","DEFAULT_MATRIX_VALUE","DEFAULT_MATRIX3_VALUE","DEFAULT_MATRIX4_VALUE","Matrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","xAxis","yAxis","zAxis","ae","be","a11","a12","a13","a21","a22","a23","a31","a32","a33","b11","b12","b13","b21","b22","b23","b31","b32","b33","g","t11","det","detInv","matrix4","_m3","matrix","Matrix4","n14","n24","n34","n41","n42","n43","n44","me","scalarX","scalarY","skewX","skewY","fractionalDigits","scalarZ","degreeY","degreeX","degreeZ","scaleX","scaleY","scaleZ","af","bf","ce","cf","de","df","ac","ad","bc","bd","_zero","_one","eye","up","_z","_x","_y","a14","a24","a34","a41","a42","a43","a44","b14","b24","b34","b41","b42","b43","b44","t14","scaleXSq","scaleYSq","scaleZSq","xy","xz","yx","yz","zx","zy","bottom","near","far","coordinateSystem","zInv","position","xx","yy","zz","wx","wy","wz","_m4","invSX","invSY","invSZ","perspective","ptA","ptB","ptC","ptD","width2","height2","a00","a01","a02","a10","a20","b01","M","N","O","P","R","S","A","B","C","D","E","F","AD","BC","G","H","I","J","K","deg","rad","targetDeg","targetX","targetY","targetZ","targetSx","targetSy","degx","degy","degz","getStyle","pseudo","atomReadStyles","styles","atomWriteStyle","atomRemoveStyle","injectStyle","styleSheetInnerText","dom","shadowRoot","atomReadAttributes","atomReadAttribute","obj","atomWriteAttribute","getDocumentElementPosition","getViewportSize","getElementPositionInPage","scrollLeft","scrollTop","useMousePoint","startMousePoint","currentMousePoint","isDown","prevX","prevY","getMousePositionInPage","ev","getMousePositionInElement","fixedOffsetX","fixedOffsetY","currentTargetRect","targetRect","window","document","exportName","VENDOR_PREFIXES","TEST_ELEMENT","TYPE_FUNCTION","round","abs","setTimeoutContext","context","bindFn","invokeArrayArg","arg","each","iterator","deprecate","method","message","deprecationMessage","stack","log","assign","output","nextKey","extend","dest","src","merge","inherit","child","base","baseP","childP","boolOrFn","ifUndefined","val1","val2","addEventListeners","types","splitStr","removeEventListeners","hasParent","inStr","find","inArray","findByKey","toArray","uniqueArray","sort","values","prefixed","prefix","camelProp","_uniqueId","uniqueId","getWindowForElement","doc","MOBILE_REGEX","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","INPUT_TYPE_TOUCH","INPUT_TYPE_PEN","INPUT_TYPE_MOUSE","INPUT_TYPE_KINECT","COMPUTE_INTERVAL","INPUT_START","INPUT_MOVE","INPUT_END","INPUT_CANCEL","DIRECTION_NONE","DIRECTION_LEFT","DIRECTION_RIGHT","DIRECTION_UP","DIRECTION_DOWN","DIRECTION_HORIZONTAL","DIRECTION_VERTICAL","DIRECTION_ALL","PROPS_XY","PROPS_CLIENT_XY","Input","manager","self","createInputInstance","Type","inputClass","PointerEventInput","TouchInput","TouchMouseInput","MouseInput","inputHandler","eventType","input","pointersLen","changedPointersLen","isFirst","isFinal","computeInputData","session","pointers","pointersLength","simpleCloneInputData","firstInput","firstMultiple","offsetCenter","center","getCenter","getDistance","computeDeltaXY","getDirection","overallVelocity","getVelocity","getScale","getRotation","computeIntervalInputData","prevDelta","prevInput","last","deltaTime","velocity","velocityX","velocityY","direction","deltaX","deltaY","MOUSE_INPUT_MAP","MOUSE_ELEMENT_EVENTS","MOUSE_WINDOW_EVENTS","POINTER_INPUT_MAP","IE10_POINTER_TYPE_ENUM","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","store","removePointer","eventTypeNormalized","pointerType","isTouch","storeIndex","SINGLE_TOUCH_INPUT_MAP","SINGLE_TOUCH_TARGET_EVENTS","SINGLE_TOUCH_WINDOW_EVENTS","SingleTouchInput","touches","normalizeSingleTouches","all","changed","TOUCH_INPUT_MAP","TOUCH_TARGET_EVENTS","getTouches","allTouches","targetIds","targetTouches","changedTouches","changedTargetTouches","touch","DEDUP_TIMEOUT","DEDUP_DISTANCE","inputEvent","inputData","isMouse","recordTouches","isSyntheticEvent","eventData","setLastTouch","lastTouch","lts","removeLastTouch","PREFIXED_TOUCH_ACTION","NATIVE_TOUCH_ACTION","TOUCH_ACTION_COMPUTE","TOUCH_ACTION_AUTO","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_NONE","TOUCH_ACTION_PAN_X","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MAP","getTouchActionProps","TouchAction","actions","recognizer","cleanTouchActions","srcEvent","hasNone","hasPanY","hasPanX","isTapPointer","isTapMovement","isTapTouchTime","touchMap","cssSupports","STATE_POSSIBLE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","STATE_FAILED","Recognizer","otherRecognizer","simultaneous","getRecognizerByNameIfManager","requireFail","emit","stateStr","inputDataClone","directionStr","AttrRecognizer","optionPointers","isRecognized","isValid","PanRecognizer","hasMoved","PinchRecognizer","inOut","PressRecognizer","validPointers","validMovement","validTime","RotateRecognizer","SwipeRecognizer","TapRecognizer","validTouchTime","validInterval","validMultiTap","tapCount","Hammer","Manager","STOP","FORCED_STOP","toggleCssProps","recognizers","curRecognizer","existing","events","handlers","triggerDomEvent","add","gestureEvent","freeGlobal","define","useResize","observer","usePressDownMove","usePressDownMoveWithPointer","eb","move","useElementEventBus","hammer","removes","ump","mousePoint","mouseDown","mouseUp","mouseMove","mouseOver","mouseOut","mouseEnter","mouseLeave","mouseClick","mouseDoubleClick","mouseWheel","mouseContextMenu","touchStart","touchEnd","touchCancel","touchMove","pointerDown","pointerUp","pointerCancel","pointerMove","pan","panStart","panMove","panEnd","panCancel","panLeft","panRight","panUp","panDown","pinch","press","rotate","swipe","swipeLeft","swipeRight","swipeUp","swipeDown","tap","tapOutSide","transitionstart","transitionend","animationstart","animationend","_rect","useMedia","query","mediaQuery","theme","media","change","getCSSVar","setWindowTitle","title","isInjected","inject","prevTop","prevRight","prevBottom","prevLeft","declaration","useSafeArea","computeImageDisplayRect","mode","sourceWidth","sourceHeight","wrapWidth","wrapHeight","sourceAspectRatio","showWidth","showHeight","getImageData","_colorKeywords","Color","forceAlpha","ErrMsg","components","size","colorSpace","SRGBColorSpace","ColorManagement","__color","SRGBToLinear","LinearToSRGB","color1","color2","bw","blackColor","whiteColor","startIndex","_h","_s","_l","hue2rgb","hue","saturation","lightness","delta","hsl","hsla","hslb","_v","NoColorSpace","LinearSRGBColorSpace","LinearTransfer","SRGBTransfer","LINEAR_REC709_TO_XYZ","XYZ_TO_LINEAR_REC709","REC709_PRIMARIES","REC709_LUMINANCE_COEFFICIENTS","D65","sourceColorSpace","targetColorSpace","colorSpaces","targetMatrix","createObjectURL","blob","caches","useLoadImage","url","reject","finalUrl","cached","rawImageInfo","blobOrUrl","fileName","hasClass","className","useElement","rem","elm","ps","selector","selectedValue","checkedValue","option","checked","html","createFragment","newEl","scriptConvert","copyText","slots","tmpl","newNode","script","useClipboard","textArea","tag","children","mount","parentContainer","oldVnode","newVnode","oldProps","newProps","oldValue","newValue","sk","oldChildren","newChildren","commonLength","__expose","__props","route","useRoute","matchIconName","stringToIcon","validate","allowSimpleName","provider","colonSeparated","name2","validateIconName","dashSeparated","icon","defaultIconDimensions","defaultIconTransformations","defaultIconProps","defaultExtendedIconProps","mergeIconTransformations","obj1","obj2","mergeIconData","getIconsTree","names","icons","aliases","resolved","internalGetIconData","tree","currentProps","parse","parseIconSet","optionalPropertyDefaults","checkOptionalProps","defaults","quicklyValidateIconSet","dataStorage","newStorage","getStorage","providerStorage","addIconSet","storage","addIconToStorage","simpleNames","allowSimpleNames","allow","getIconData","iconName","addIcon","addCollection","added","defaultIconSizeCustomisations","defaultIconCustomisations","unitsSplit","unitsTest","calculateSize","oldParts","newParts","code","splitSVGDefs","endEnd","mergeDefsAndContent","wrapSVGContent","body","split","isUnsetKeyword","iconToSVG","customisations","fullIcon","fullCustomisations","box","transformations","hFlip","vFlip","tempValue","customisationsWidth","customisationsHeight","boxWidth","boxHeight","attributes","setAttr","viewBox","regex","randomPrefix","counter","replaceIDs","ids","match","suffix","newID","escapedID","setAPIModule","getAPIModule","createAPIConfig","resources","configStorage","fallBackAPISources","fallBackAPI","addAPIProvider","customConfig","config","getAPIConfig","fetchModule","calculateMaxLength","maxHostLength","shouldAbort","status","prepare","maxLength","getPath","fetchAPIModule","host","params","iconsList","urlParams","uri","defaultError","response","sortIcons","lastIcon","localStorage","list","removeCallback","storages","row","updateCallbacks","hasPending","oldLength","idCounter","storeCallback","pendingSources","abort","listToIcons","defaultConfig","sendQuery","done","resourcesCount","nextIndex","startTime","queriesSent","lastError","timer","queue","doneCallbacks","resetTimer","subscribe","overwrite","getQueryStatus","failQuery","clearQueue","moduleResponse","isError","queued","execNext","resource","status2","initRedundancy","cfg","queries","cleanup","queryCallback","doneCallback","query2","emptyCallback$1","redundancyCache","getRedundancyCache","redundancy","cachedReundancy","sendAPIQuery","send","api","moduleKey","emptyCallback","loadedNewIcons","checkIconNamesForAPI","valid","invalid","parseLoaderResponse","checkMissing","pending","err","parsePossiblyAsyncResponse","loadNewIcons","icons2","customIconLoader","iconSet","loadIcons","cleanedIcons","sortedIcons","callCallback","newIcons","sources","lastProvider","lastPrefix","providerNewIcons","pendingQueue","mergeCustomisations","valueType","separator","flipFromString","custom","flip","rotateFromString","units","value2","iconToHTML","renderAttribsHTML","encodeSVGforURL","svgToData","svgToURL","defaultExtendedIconCustomisations","svgDefaults","commonProps","monotoneProps","coloredProps","propsToAdd","propsToAddTo","customisationAliases","fixSize","componentProps","propsStyle","customStyle","alias","renderAttribs","localCounter","useMask","_window","preload","providers","emptyIcon","Icon","defineComponent","onload","customise","customised","classes","darkenOver","darkenClick","emits","__emit","xgBlue","fontColor","borderColor","bgColor","baseFontColor","baseBorderColor","baseBgColor","baseBgColorStart","baseBgColorEnd","isBgColorGradient","setStylePattern","stylePattern","watch","cursor","isMouseOver","mouseover","mouseleave","asyncClickPending","throttleClick","router","useRouter","gotoPay","safeAreaBottom","cancelOnBottom","PLATE_TYPES","getPlateType","plateType","dotSize","effectStatus","next","getControllerResolve","isEmitReady","parentStyle","animationName","timingFunction","delay","repeat","changeEffect","newAnimationName","animationRef","resetAnimation","trigger","triggerReverse","clear","pageRef","open","close","cssAnimationRef","cssAnimationName","runDependOnEffectType","cssAnimationTask","jsAnimationTask","isClose","triggerTimeline","triggerFrom","triggerTo","cssanimationstart","cssanimationend","clearStyle","newEffect","currentPageIndex","nextPageIndex","onRenderComplete","onRouteCompletes","pages","pageActions","pageElements","isValidPageIndex","pageIndex","isForward","_getPageEffect","currentPageEffect","nextPageEffect","getPageEffect","routeEffect","_getPageDuration","currentDuration","nextDuration","getPageDuration","_getPageEaseFunction","getPageEaseFunction","_getPageDelay","getPageDelay","currentZIndex","nextZIndex","sameOnTop","nextOnTop","currentOnTop","setRunningStyle","emitsEnd","routesRef","renderPages","appendCount","isReset","renderCount","page","pageEffect","Page","reset","resetPages","goto","push","pop","forward","back","routeTaskQueue","onRouteComplete","computed","initDocumentOverflow","initParentOverflow","popStyle","visible","popType","isShrink","popValue","popUnit","onComplete","resize","clickOverlay","popX","popY","popWidth","popHeight","finalX","finalY","finalWidth","finalHeight","isCORS","info","setImageWidthHeight","outter","wrapImageRect","viewportWidth","viewportHeight","viewportImageRect","inner","isOpenPop","imageRef","popRef","clickSourceImage","showSize","currentIndex","routeChangeEnd","_","toPageIndex","Image","checkClose","viewDocument","popTelEl","call","imageViewEl","viewPhotos","createRouter","createWebHashHistory","ViewDocument","Lot","Park","_to","_from","savedPosition","routeDirection","routeList","INCREMENT","DECREMENT","INCREMENTACTION","useVuex","useStore","useVuexStates","moduleName","keyMaps","mapFn","mapState","createNamespacedHelpers","useVuexMap","useVuexGetters","mapGetters","useVuexMutations","mapMutations","useVuexActions","mapActions","maps","mappedKeyFns"],"mappings":"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","x_google_ignoreList":[19,52,71]}