@zyzgroup/core-vue 0.0.42 → 0.0.43
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.
- package/ce/style.css +1 -1
- package/ce/yz_custom_element.iife.js +209 -168
- package/ce/yz_custom_element.iife.js.map +1 -1
- package/ce/yz_custom_element.js +19799 -20547
- package/ce/yz_custom_element.js.map +1 -1
- package/ce/yz_custom_element.umd.cjs +209 -168
- package/ce/yz_custom_element.umd.cjs.map +1 -1
- package/dist/style.css +1 -0
- package/dist/zyzgroup_core_vue.iife.js +22 -1
- package/dist/zyzgroup_core_vue.iife.js.map +1 -1
- package/dist/zyzgroup_core_vue.js +6744 -119
- package/dist/zyzgroup_core_vue.js.map +1 -1
- package/dist/zyzgroup_core_vue.umd.cjs +22 -1
- package/dist/zyzgroup_core_vue.umd.cjs.map +1 -1
- package/package.json +2 -1
- package/types/App.vue.d.ts +0 -2
- package/types/components/Accordion.ce.vue.d.ts +49 -52
- package/types/components/Accordion.vue.d.ts +49 -52
- package/types/components/Button.ce.vue.d.ts +53 -55
- package/types/components/Button.vue.d.ts +53 -55
- package/types/components/Canvas.ce.vue.d.ts +8 -33
- package/types/components/Canvas.vue.d.ts +8 -33
- package/types/components/CardFlip.ce.vue.d.ts +27 -36
- package/types/components/CardFlip.vue.d.ts +27 -36
- package/types/components/Container.ce.vue.d.ts +43 -43
- package/types/components/Container.vue.d.ts +43 -43
- package/types/components/Cube.ce.vue.d.ts +58 -39
- package/types/components/Cube.vue.d.ts +58 -39
- package/types/components/Dialog.ce.vue.d.ts +63 -45
- package/types/components/Dialog.vue.d.ts +63 -45
- package/types/components/DialogLoading.ce.vue.d.ts +37 -35
- package/types/components/DialogLoading.vue.d.ts +37 -35
- package/types/components/DialogToast.ce.vue.d.ts +9 -34
- package/types/components/DialogToast.vue.d.ts +9 -34
- package/types/components/EaseGraphDisplay.ce.vue.d.ts +11 -50
- package/types/components/EaseGraphDisplay.vue.d.ts +11 -50
- package/types/components/EaseGroupGraphDisplay.ce.vue.d.ts +5 -42
- package/types/components/EaseGroupGraphDisplay.vue.d.ts +5 -42
- package/types/components/HandWritePanel.ce.vue.d.ts +4 -44
- package/types/components/HandWritePanel.vue.d.ts +4 -44
- package/types/components/Icon.ce.vue.d.ts +3 -28
- package/types/components/Icon.vue.d.ts +3 -28
- package/types/components/Image.ce.vue.d.ts +6 -38
- package/types/components/Image.vue.d.ts +6 -38
- package/types/components/ImageView.ce.vue.d.ts +7 -32
- package/types/components/ImageView.vue.d.ts +7 -32
- package/types/components/InterpolationGraphDisplay.ce.vue.d.ts +9 -39
- package/types/components/InterpolationGraphDisplay.vue.d.ts +9 -39
- package/types/components/InterpolationGroupGraphDisplay.ce.vue.d.ts +3 -34
- package/types/components/InterpolationGroupGraphDisplay.vue.d.ts +3 -34
- package/types/components/MapTianditu.ce.vue.d.ts +28 -42
- package/types/components/MapTianditu.vue.d.ts +28 -42
- package/types/components/Overlay.ce.vue.d.ts +20 -34
- package/types/components/Overlay.vue.d.ts +20 -34
- package/types/components/Page.ce.vue.d.ts +55 -47
- package/types/components/Page.vue.d.ts +55 -47
- package/types/components/PlateDisplay.ce.vue.d.ts +4 -32
- package/types/components/PlateDisplay.vue.d.ts +4 -32
- package/types/components/PlateKeyboard.ce.vue.d.ts +10 -33
- package/types/components/PlateKeyboard.vue.d.ts +10 -33
- package/types/components/PlateMobile.ce.vue.d.ts +10 -28
- package/types/components/PlateMobile.vue.d.ts +10 -28
- package/types/components/Pop.ce.vue.d.ts +150 -64
- package/types/components/Pop.vue.d.ts +150 -64
- package/types/components/Popover.ce.vue.d.ts +41 -37
- package/types/components/Popover.vue.d.ts +41 -37
- package/types/components/Routes.ce.vue.d.ts +15 -49
- package/types/components/Routes.vue.d.ts +15 -49
- package/types/components/SVG.ce.vue.d.ts +8 -30
- package/types/components/SVG.vue.d.ts +8 -30
- package/types/components/SVGAndCanvas.ce.vue.d.ts +3 -28
- package/types/components/SVGAndCanvas.vue.d.ts +3 -28
- package/types/components/Video.ce.vue.d.ts +12 -44
- package/types/components/Video.vue.d.ts +12 -44
- package/types/components/VueRouterView.ce.vue.d.ts +3 -21
- package/types/components/VueRouterView.vue.d.ts +3 -21
- package/types/components/VueSuspense.ce.vue.d.ts +6 -4
- package/types/components/VueSuspense.vue.d.ts +6 -4
- package/types/components/bg/grid/BgGrid.ce.vue.d.ts +14 -0
- package/types/components/bg/grid/BgGrid.vue.d.ts +14 -0
- package/types/components/chat/ClockFlipper.ce.vue.d.ts +4 -53
- package/types/components/chat/ClockFlipper.vue.d.ts +4 -53
- package/types/components/chat/RingIndicator.ce.vue.d.ts +3 -37
- package/types/components/chat/RingIndicator.vue.d.ts +3 -37
- package/types/components/chat/RingText.ce.vue.d.ts +3 -37
- package/types/components/chat/RingText.vue.d.ts +3 -37
- package/types/components/effect/BorderFocusText.ce.vue.d.ts +31 -49
- package/types/components/effect/BorderFocusText.vue.d.ts +31 -49
- package/types/components/effect/CSSAnimation.ce.vue.d.ts +49 -60
- package/types/components/effect/CSSAnimation.vue.d.ts +49 -60
- package/types/components/effect/CSSTransition.ce.vue.d.ts +44 -52
- package/types/components/effect/CSSTransition.vue.d.ts +44 -52
- package/types/components/effect/Circle.ce.vue.d.ts +31 -43
- package/types/components/effect/Circle.vue.d.ts +31 -43
- package/types/components/effect/Float.ce.vue.d.ts +28 -46
- package/types/components/effect/Float.vue.d.ts +28 -46
- package/types/components/effect/ImageMask.ce.vue.d.ts +27 -32
- package/types/components/effect/ImageMask.vue.d.ts +27 -32
- package/types/components/effect/LineDouble.ce.vue.d.ts +40 -52
- package/types/components/effect/LineDouble.vue.d.ts +40 -52
- package/types/components/effect/LineSingle.ce.vue.d.ts +36 -52
- package/types/components/effect/LineSingle.vue.d.ts +36 -52
- package/types/components/effect/Slide.ce.vue.d.ts +30 -46
- package/types/components/effect/Slide.vue.d.ts +30 -46
- package/types/components/effect/SlideCorner.ce.vue.d.ts +31 -43
- package/types/components/effect/SlideCorner.vue.d.ts +31 -43
- package/types/components/effect/TextBackgroundClip.ce.vue.d.ts +3 -28
- package/types/components/effect/TextBackgroundClip.vue.d.ts +3 -28
- package/types/components/effect/VueTransition.ce.vue.d.ts +30 -43
- package/types/components/effect/VueTransition.vue.d.ts +30 -43
- package/types/components/effect/VueTransitionGroupSlideToLeft.ce.vue.d.ts +9 -3
- package/types/components/effect/VueTransitionGroupSlideToLeft.vue.d.ts +9 -3
- package/types/components/effect/VueTransitionOpacity.ce.vue.d.ts +9 -3
- package/types/components/effect/VueTransitionOpacity.vue.d.ts +9 -3
- package/types/components/effect/VueTransitionSlideUp.ce.vue.d.ts +9 -3
- package/types/components/effect/VueTransitionSlideUp.vue.d.ts +9 -3
- package/types/components/form/BooleanBox.ce.vue.d.ts +44 -60
- package/types/components/form/BooleanBox.vue.d.ts +44 -60
- package/types/components/form/CheckboxGroup.ce.vue.d.ts +11 -51
- package/types/components/form/CheckboxGroup.vue.d.ts +11 -51
- package/types/components/form/ColorPicker.ce.vue.d.ts +46 -31
- package/types/components/form/ColorPicker.vue.d.ts +46 -31
- package/types/components/form/Input.ce.vue.d.ts +23 -74
- package/types/components/form/Input.vue.d.ts +23 -74
- package/types/components/form/InputFileDrop.ce.vue.d.ts +23 -29
- package/types/components/form/InputFileDrop.vue.d.ts +23 -29
- package/types/components/form/InputRange.ce.vue.d.ts +33 -55
- package/types/components/form/InputRange.vue.d.ts +33 -55
- package/types/components/form/InputRangeBox.ce.vue.d.ts +38 -51
- package/types/components/form/InputRangeBox.vue.d.ts +38 -51
- package/types/components/form/InputRangeCanvas.ce.vue.d.ts +31 -53
- package/types/components/form/InputRangeCanvas.vue.d.ts +31 -53
- package/types/components/form/PageVerticalScrollProgressBar.ce.vue.d.ts +21 -0
- package/types/components/form/PageVerticalScrollProgressBar.vue.d.ts +21 -0
- package/types/components/form/ProgressBar.ce.vue.d.ts +22 -0
- package/types/components/form/ProgressBar.vue.d.ts +22 -0
- package/types/components/form/RadioGroup.ce.vue.d.ts +11 -51
- package/types/components/form/RadioGroup.vue.d.ts +11 -51
- package/types/components/form/Select.ce.vue.d.ts +14 -52
- package/types/components/form/Select.vue.d.ts +14 -52
- package/types/components/form/SelectAbsolute.ce.vue.d.ts +16 -64
- package/types/components/form/SelectAbsolute.vue.d.ts +16 -64
- package/types/components/form/SlideLeftItem.ce.vue.d.ts +50 -0
- package/types/components/form/SlideLeftItem.vue.d.ts +50 -0
- package/types/components/form/Status.ce.vue.d.ts +3 -26
- package/types/components/form/Status.vue.d.ts +3 -26
- package/types/components/form/Switch.ce.vue.d.ts +7 -47
- package/types/components/form/Switch.vue.d.ts +7 -47
- package/types/components/form/Tabs.ce.vue.d.ts +14 -0
- package/types/components/form/Tabs.vue.d.ts +14 -0
- package/types/components/form/Text.ce.vue.d.ts +36 -0
- package/types/components/form/Text.vue.d.ts +36 -0
- package/types/components/form/ViewDocument.ce.vue.d.ts +9 -0
- package/types/components/form/ViewDocument.vue.d.ts +9 -0
- package/types/components/layout/LayoutCenter.ce.vue.d.ts +20 -30
- package/types/components/layout/LayoutCenter.vue.d.ts +20 -30
- package/types/components/layout/LayoutMobile.ce.vue.d.ts +4 -36
- package/types/components/layout/LayoutMobile.vue.d.ts +4 -36
- package/types/components/layout/LayoutPage.ce.vue.d.ts +20 -0
- package/types/components/layout/LayoutPage.vue.d.ts +20 -0
- package/types/components/loading/Loading1.ce.vue.d.ts +3 -25
- package/types/components/loading/Loading1.vue.d.ts +3 -25
- package/types/components/loading/Loading10.ce.vue.d.ts +3 -25
- package/types/components/loading/Loading10.vue.d.ts +3 -25
- package/types/components/loading/Loading11.ce.vue.d.ts +3 -28
- package/types/components/loading/Loading11.vue.d.ts +3 -28
- package/types/components/loading/Loading2.ce.vue.d.ts +3 -25
- package/types/components/loading/Loading2.vue.d.ts +3 -25
- package/types/components/loading/Loading3.ce.vue.d.ts +3 -28
- package/types/components/loading/Loading3.vue.d.ts +3 -28
- package/types/components/loading/Loading4.ce.vue.d.ts +3 -25
- package/types/components/loading/Loading4.vue.d.ts +3 -25
- package/types/components/loading/Loading5.ce.vue.d.ts +3 -25
- package/types/components/loading/Loading5.vue.d.ts +3 -25
- package/types/components/loading/Loading6.ce.vue.d.ts +3 -25
- package/types/components/loading/Loading6.vue.d.ts +3 -25
- package/types/components/loading/Loading7.ce.vue.d.ts +3 -25
- package/types/components/loading/Loading7.vue.d.ts +3 -25
- package/types/components/loading/Loading8.ce.vue.d.ts +3 -25
- package/types/components/loading/Loading8.vue.d.ts +3 -25
- package/types/components/loading/Loading9.ce.vue.d.ts +3 -25
- package/types/components/loading/Loading9.vue.d.ts +3 -25
- package/types/components/pop/PopTel.ce.vue.d.ts +10 -0
- package/types/components/pop/PopTel.vue.d.ts +10 -0
- package/types/components/svg/SVGCheck.ce.vue.d.ts +3 -28
- package/types/components/svg/SVGCheck.vue.d.ts +3 -28
- package/types/components/svg/SVGCleanUp.ce.vue.d.ts +3 -28
- package/types/components/svg/SVGCleanUp.vue.d.ts +3 -28
- package/types/components/svg/SVGDelete.ce.vue.d.ts +3 -29
- package/types/components/svg/SVGDelete.vue.d.ts +3 -29
- package/types/components/svg/SVGDown.ce.vue.d.ts +3 -29
- package/types/components/svg/SVGDown.vue.d.ts +3 -29
- package/types/components/svg/SVGElement.ce.vue.d.ts +14 -38
- package/types/components/svg/SVGElement.vue.d.ts +14 -38
- package/types/components/svg/SVGFail.ce.vue.d.ts +3 -29
- package/types/components/svg/SVGFail.vue.d.ts +3 -29
- package/types/components/svg/SVGHome.ce.vue.d.ts +3 -29
- package/types/components/svg/SVGHome.vue.d.ts +3 -29
- package/types/components/svg/SVGLock.ce.vue.d.ts +3 -29
- package/types/components/svg/SVGLock.vue.d.ts +3 -29
- package/types/components/svg/SVGPrompt.ce.vue.d.ts +3 -29
- package/types/components/svg/SVGPrompt.vue.d.ts +3 -29
- package/types/components/svg/SVGQuestion.ce.vue.d.ts +3 -29
- package/types/components/svg/SVGQuestion.vue.d.ts +3 -29
- package/types/components/svg/SVGReturn.ce.vue.d.ts +3 -29
- package/types/components/svg/SVGReturn.vue.d.ts +3 -29
- package/types/components/svg/SVGSuccess.vue.d.ts +3 -29
- package/types/components/svg/SVGWaiting.ce.vue.d.ts +3 -29
- package/types/components/svg/SVGWaiting.vue.d.ts +3 -29
- package/types/components/svg/SVGWarn.ce.vue.d.ts +9 -0
- package/types/components/svg/SVGWarn.vue.d.ts +9 -0
- package/types/components/xg/Park.ce.vue.d.ts +2 -0
- package/types/components/xg/Park.vue.d.ts +2 -0
- package/types/components/xg/XG.ce.vue.d.ts +2 -0
- package/types/components/xg/XG.vue.d.ts +2 -0
- package/types/demo_vue3.vue.d.ts +22 -58
- package/types/globalTeleport.d.ts +4 -6
- package/types/hooks/pinia/counter.d.ts +13 -0
- package/types/hooks/useSafeArea.d.ts +1 -0
- package/types/hooks/useVueRouter.d.ts +5 -14
- package/types/hooks/useVuex/modules/root.d.ts +0 -1
- package/types/hooks/useVuex/useVuex.d.ts +0 -1
- package/types/main.d.ts +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zyzgroup_core_vue.umd.cjs","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.umd.cjs","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/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/datastructure/CacheMap.ts","../../core-common/src/algorithm/Sort.ts","../../core-common/src/async.ts","../../core-web/src/hooks/useEventListener.ts","../../core-web/src/hooks/useEmit.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/hooks/useStyle.ts","../../core-web/src/hooks/useAttribute.ts","../../core-web/src/hooks/useWindow.ts","../../core-web/src/hooks/useSafeArea.ts","../../core-web/src/hooks/useResize.ts","../../core-web/src/image/image.ts","../../core-web/src/theme.ts","../../../node_modules/.pnpm/hammerjs@2.0.8/node_modules/hammerjs/hammer.js","../../core-web/src/position.ts","../../core-web/src/dom/DOMEventBus.ts","../../core-web/src/hooks/useObjectURL.ts","../../core-web/src/hooks/useLoadImage.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 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 const clamp = (x: number, min: number, max: number) =>\n x < min ? min : x > max ? max : x;\n// Math.min(Math.max(min, x), max);\n\nexport const round = (\n number: number,\n digits = 0,\n base = Math.pow(10, digits)\n): number => {\n return Math.round(base * number) / base;\n};\n\n// compute euclidean modulo of m % n\n// 计算 m % n 的欧几里德模数\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","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.emit(\"test\", 1, 2);\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// }\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 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((item) => {\n // Reflect.apply(item, this, payload);\n // item.apply(this, payload);\n item(...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 { 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","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,\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\n// // 鼠标滚轮\n// export function useMouseWheelEventListener(\n// target: EventTarget | any,\n// handler: (e: Event) => void | Promise<void>\n// ): () => void {\n// const eventHandler = async (e: Event) => {\n// await handler(e);\n// };\n// try {\n// // target.addEventListener(\"DOMMouseScroll\", eventHandler, true);\n// // target.addEventListener(\"wheel\", eventHandler, true);\n// target.addEventListener(\"mousewheel\", eventHandler, true);\n// } catch (e) {\n// /** IE/Opera. */\n// target.attachEvent(\"onmousewheel\", eventHandler);\n// }\n// return () => {\n// try {\n// // target.removeEventListener(\"DOMMouseScroll\", eventHandler, true);\n// // target.removeEventListener(\"wheel\", eventHandler, true);\n// target.removeEventListener(\"mousewheel\", eventHandler, true);\n// } catch (e) {\n// /** IE/Opera. */\n// target.detachEvent(\"onmousewheel\", eventHandler);\n// }\n// };\n// }\n","import { EventBus } from \"@zyzgroup/core-common\";\n\nexport function useEmit() {\n const eb = new EventBus();\n\n return {\n on: (name: string, cb: (...v: any[]) => void) => {\n eb.on(name, cb);\n },\n off: (name: string, cb: (...v: any[]) => void) => {\n eb.off(name, cb);\n },\n emit: (name: string, ...v: any[]) => {\n eb.emit(name, ...v);\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","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// `\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 const style = document.createElement(\"style\");\n style.innerHTML = styleSheetInnerText;\n if (dom) {\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","import { once } from \"@zyzgroup/core-common\";\nimport { useEmit } from \"./useEmit\";\nimport { useEventListener } from \"./useEventListener\";\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\nconst eb = useEmit();\n\nlet prevUrl = \"\";\nconst observer = new MutationObserver((_records, _observer) => {\n if (location.href !== prevUrl) {\n prevUrl = location.href;\n eb.emit(\"urlchange\", location.href);\n }\n});\nobserver.observe(document, {\n attributes: true,\n childList: true,\n subtree: true\n});\n// observer.disconnect();\n\nuseEventListener(window, \"hashchange\", () => {\n eb.emit(\"hashchange\", location.hash);\n});\n\nuseEventListener(window, \"popstate\", (e: PopStateEvent) => {\n eb.emit(\"popstate\", e.state);\n});\n\nuseEventListener(\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 eb.emit(\"windowresize\", width, height);\n }\n);\n\nuseEventListener(window, \"load\", (e: Event) => {\n eb.emit(\"load\", e);\n});\n\nuseEventListener(window, \"beforeunload\", (e: BeforeUnloadEvent) => {\n eb.emit(\"beforeunload\", e);\n});\n\nuseEventListener(window, \"pagehide\", (e: Event) => {\n eb.emit(\"pagehide\", e);\n});\n\nuseEventListener(window, \"focus\", (e: Event) => {\n eb.emit(\"focus\", e);\n});\n\nuseEventListener(window, \"blur\", (e: Event) => {\n eb.emit(\"blur\", e);\n});\n\n/// The most reliable way\nuseEventListener(window, \"visibilitychange\", (e: Event) => {\n if (document.hidden) {\n eb.emit(\"windowhidden\", e);\n } else {\n eb.emit(\"windowvisible\", e);\n }\n});\n\n// 单例模式\nexport const useWindow = {\n getSelectedText: () => window.getSelection()?.toString() || \"\",\n\n isTabInView: () => !document.hidden,\n\n onurlchange: (cb: (...v: any[]) => void) => {\n eb.on(\"urlchange\", cb);\n return () => {\n eb.off(\"urlchange\", cb);\n };\n },\n\n onhashchange: (cb: (hash: any) => void) => {\n eb.on(\"hashchange\", cb);\n return () => {\n eb.off(\"hashchange\", cb);\n };\n },\n\n onpopstate: (cb: (state: any) => void) => {\n eb.on(\"popstate\", cb);\n return () => {\n eb.off(\"popstate\", cb);\n };\n },\n\n // pushstate(\"/home?name=xxx\")\n pushstate: (url: string, state: any = null) => {\n history.pushState(state, \"\", url);\n // window.dispatchEvent(new PopStateEvent(\"name\", { state }));\n },\n\n replacestate: (url: string, state: any = null) => {\n history.replaceState(state, \"\", url);\n },\n\n onwindowresize: (cb: (width: number, height: number) => void) => {\n eb.on(\"windowresize\", cb);\n return () => {\n eb.off(\"windowresize\", cb);\n };\n },\n\n onload: (cb: () => void) => {\n const cbOnce = once(cb);\n eb.on(\"load\", cbOnce);\n return () => {\n eb.off(\"load\", cbOnce);\n };\n },\n\n onbeforeunload: (cb: (v: any) => void) => {\n eb.on(\"beforeunload\", cb);\n return () => {\n eb.off(\"beforeunload\", cb);\n };\n },\n\n onpagehide: (cb: (v: any) => void) => {\n eb.on(\"pagehide\", cb);\n return () => {\n eb.off(\"pagehide\", cb);\n };\n },\n\n onfocus: (cb: (v: any) => void) => {\n eb.on(\"focus\", cb);\n return () => {\n eb.off(\"focus\", cb);\n };\n },\n\n onblur: (cb: (v: any) => void) => {\n eb.on(\"blur\", cb);\n return () => {\n eb.off(\"blur\", cb);\n };\n },\n\n onwindowvisible: (cb: (v: any) => void) => {\n eb.on(\"windowvisible\", cb);\n return () => {\n eb.off(\"windowvisible\", cb);\n };\n },\n\n onwindowhidden: (cb: (v: any) => void) => {\n eb.on(\"windowhidden\", cb);\n return () => {\n eb.off(\"windowhidden\", cb);\n };\n }\n};\n\n// The DOMContentLoaded event is fired when the document has been completely loaded and parsed, without waiting for stylesheets, images, and subframes to finish loading\n// the load event can be used to detect a fully-loaded page\nexport function onDocumentReady(cb: () => void) {\n let isCalled = false;\n let unload: () => void;\n function check() {\n // loading loaded complete\n if (document.readyState === \"loading\") {\n return;\n }\n if (isCalled) {\n try {\n document.removeEventListener(\"DOMContentLoaded\", check, false);\n } catch (e) {\n unload?.();\n }\n return;\n }\n isCalled = true;\n try {\n document.removeEventListener(\"DOMContentLoaded\", check, false);\n } catch (e) {\n unload?.();\n }\n cb();\n }\n try {\n document.addEventListener(\"DOMContentLoaded\", check, false);\n } catch (e) {\n unload = useWindow.onload(check);\n }\n check();\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 { useEmit } from \"./useEmit\";\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 // if (isIOS() && compareVersion(getOperatingSystemVersion(), \"11.2\") < 0) {\n // injectStyle(`\n // /* iOS < 11.2 */\n // /* 注意:--xxx:后面不要有空格 */\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 injectStyle(`\n /* iOS > 11.2 */\n /* 注意:--xxx:后面不要有空格 */\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\nconst eb = useEmit();\n\n// 单例\nexport const useSafeArea = {\n onTop: (cb: (v: string) => void) => {\n inject();\n // next tick\n setTimeout(() => {\n const declaration = getComputedStyle(document.documentElement);\n eb.emit(\"top\", declaration.getPropertyValue(\"--sat\"));\n }, 1);\n return eb.on(\"top\", cb);\n },\n\n onRight: (cb: (v: string) => void) => {\n inject();\n // next tick\n setTimeout(() => {\n const declaration = getComputedStyle(document.documentElement);\n eb.emit(\"right\", declaration.getPropertyValue(\"--sar\"));\n }, 1);\n return eb.on(\"right\", cb);\n },\n\n onBottom: (cb: (v: string) => void) => {\n inject();\n // next tick\n setTimeout(() => {\n const declaration = getComputedStyle(document.documentElement);\n eb.emit(\"bottom\", declaration.getPropertyValue(\"--sab\"));\n }, 1);\n return eb.on(\"bottom\", cb);\n },\n\n onLeft: (cb: (v: string) => void) => {\n inject();\n // next tick\n setTimeout(() => {\n const declaration = getComputedStyle(document.documentElement);\n eb.emit(\"left\", declaration.getPropertyValue(\"--sal\"));\n }, 1);\n return eb.on(\"left\", cb);\n }\n};\n\n// const safeAreaBottom = ref(\"0px\");\n// let cancelOnBottom;\n// onMounted(() => {\n// cancelOnBottom = useSafeArea.onBottom((b) => {\n// safeAreaBottom.value = b;\n// });\n// });\n// onUnmounted(() => {\n// cancelOnBottom?.();\n// });\n","import { type AnyElement } from \"@zyzgroup/core-common\";\nimport { useEmit } from \"./useEmit\";\n\nexport function useResize(target: AnyElement) {\n const eb = useEmit();\n\n const observer = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n const entry = entries[0];\n const { width, height } = entry.contentRect;\n eb.emit(\"resize\", width, height);\n });\n\n observer.observe(target);\n\n return {\n on: (cb: (width: number, height: number) => void) => {\n eb.on(\"resize\", cb);\n return () => {\n eb.off(\"resize\", cb);\n };\n },\n destroy: () => {\n observer.unobserve(target);\n }\n };\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 '@zyzgroup/core-web/dist/better.css'\n\nimport { clamp, maxDotNumber } from \"@zyzgroup/core-common\";\n\nconst styleDeclaration = getComputedStyle(document.documentElement);\n\nexport function getCSSVar(name: string) {\n return styleDeclaration.getPropertyValue(name);\n}\n\nexport function setCSSVar(name: string, value: string) {\n document.documentElement.style.setProperty(name, value);\n styleDeclaration.setProperty(name, value);\n}\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// }\n\nexport const theme: Record<string, string> = {\n colorPrimary: getCSSVar(\"--color-primary\") || \"#5A82F0\",\n colorRed: getCSSVar(\"--color-red\") || \"#FA503C\",\n colorOrange: getCSSVar(\"--color-orange\") || \"#fa8c00\",\n colorYellow: getCSSVar(\"--color-yellow\") || \"#fadc32\",\n colorGreen: getCSSVar(\"--color-green\") || \"#00c878\",\n colorBlue: getCSSVar(\"--color-blue\") || \"#00b4fa\",\n colorPurple: getCSSVar(\"--color-purple\") || \"#6464fa\",\n colorBlack: getCSSVar(\"--color-black\") || \"#001428\",\n\n colorGray00: getCSSVar(\"--color-gray-00\") || \"#000000\",\n colorGray33: getCSSVar(\"--color-gray-33\") || \"#333333\",\n colorGray66: getCSSVar(\"--color-gray-66\") || \"#666666\",\n colorGray99: getCSSVar(\"--color-gray-99\") || \"#999999\",\n colorGrayCC: getCSSVar(\"--color-gray-cc\") || \"#cccccc\",\n colorGrayDD: getCSSVar(\"--color-gray-dd\") || \"#dddddd\",\n colorGrayE6: getCSSVar(\"--color-gray-e6\") || \"#e6e6e6\",\n colorGrayEE: getCSSVar(\"--color-gray-ee\") || \"#eeeeee\",\n colorGrayEF: getCSSVar(\"--color-gray-ef\") || \"#efefef\",\n colorGrayF5: getCSSVar(\"--color-gray-f5\") || \"#f5f5f5\",\n colorGrayFF: getCSSVar(\"--color-gray-ff\") || \"#ffffff\",\n\n fontLineHeight: getCSSVar(\"--font-line-height\") || \"1.4\",\n\n fontSize32: getCSSVar(\"--font-size-32\") || \"32px\",\n fontSize24: getCSSVar(\"--font-size-24\") || \"24px\",\n fontSize22: getCSSVar(\"--font-size-22\") || \"22px\",\n fontSize20: getCSSVar(\"--font-size-20\") || \"20px\",\n fontSize18: getCSSVar(\"--font-size-18\") || \"18px\",\n fontSize16: getCSSVar(\"--font-size-16\") || \"16px\",\n fontSize14: getCSSVar(\"--font-size-14\") || \"14px\",\n fontSize12: getCSSVar(\"--font-size-12\") || \"12px\",\n fontSize10: getCSSVar(\"--font-size-10\") || \"10px\",\n\n d4: getCSSVar(\"--distance-4\") || \"4px\", /// borderRadius\n d8: getCSSVar(\"--distance-8\") || \"8px\",\n d12: getCSSVar(\"--distance-12\") || \"12px\",\n d16: getCSSVar(\"--distance-16\") || \"16px\",\n d20: getCSSVar(\"--distance-20\") || \"20px\",\n d32: getCSSVar(\"--distance-32\") || \"32px\",\n d40: getCSSVar(\"--distance-40\") || \"40px\",\n d44: getCSSVar(\"--distance-44\") || \"44px\" /// button-height\n};\nexport default theme;\n\nexport class Color {\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 if (typeof forceAlpha === \"number\") {\n this.setAlpha(forceAlpha);\n }\n }\n\n get color() {\n return this.__color;\n }\n set color(color: any) {\n this.__color = parseColor(color);\n }\n setColor(color: any) {\n this.color = color;\n return this;\n }\n\n get r() {\n return this.__color.r;\n }\n set r(v: number) {\n this.__color.r = clamp(Math.round(v), 0, 255);\n }\n\n get g() {\n return this.__color.g;\n }\n set g(v: number) {\n this.__color.g = clamp(Math.round(v), 0, 255);\n }\n\n get b() {\n return this.__color.b;\n }\n set b(v: number) {\n this.__color.b = clamp(Math.round(v), 0, 255);\n }\n\n get a() {\n return this.__color.a;\n }\n set a(a: number) {\n this.__color.a = clamp(a, 0, 1);\n }\n setAlpha(a: number) {\n this.a = a;\n return this;\n }\n\n setRGB(r: number, g: number, b: number) {\n this.r = r;\n this.g = g;\n this.b = b;\n return this;\n }\n setRGBA(r: number, g: number, b: number, a: number) {\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a;\n return this;\n }\n\n get hex() {\n const hex = (this.r << 16) + (this.g << 8) + this.b;\n // if (this.a !== 1) {\n // hex += Math.round(this.a * 255) << 24;\n // }\n // if (this.a !== 1) {\n // hex <<= 8;\n // hex += Math.round(this.a * 255);\n // }\n return hex;\n }\n\n toString() {\n if (this.a === 1) {\n const str = \"000000\" + this.hex.toString(16);\n return \"#\" + str.slice(str.length - 6);\n } else {\n return `rgba(${this.r},${this.g},${this.b},${maxDotNumber(this.a, 6)})`;\n }\n }\n\n clone(): Color {\n return new Color(this.color);\n }\n\n copy(c: Color) {\n this.setColor(c.color);\n }\n\n opposite(\n bw = false, // whether to invert to black or white\n blackColor = \"#000000\",\n whiteColor = \"#ffffff\"\n ): Color {\n if (bw) {\n // https://stackoverflow.com/a/3943023/112731\n return new Color(\n this.r * 0.299 + this.g * 0.587 + this.b * 0.114 > 186\n ? blackColor\n : whiteColor\n );\n } else {\n const c = this.clone();\n c.r = 255 - c.r;\n c.g = 255 - c.g;\n c.b = 255 - c.b;\n // c.a = 1 - c.a;\n return c;\n }\n }\n\n /// t: 0 ~ 1\n lighten(t: number): Color {\n t = clamp(Math.abs(t), 0, 1);\n let { r, g, b } = this.color;\n r += (255 - r) * t;\n g += (255 - g) * t;\n b += (255 - b) * t;\n return new Color().setRGBA(r, g, b, this.color.a);\n }\n\n /// t: 0 ~ 1\n darken(t: number): Color {\n t = clamp(Math.abs(t), 0, 1);\n let { r, g, b } = this.color;\n r = r * (1 - t);\n g = g * (1 - t);\n b = b * (1 - t);\n return new Color().setRGBA(r, g, b, this.color.a);\n }\n\n // 渐变色\n static gradient(\n startColor: string,\n endColor: string,\n t: number // 0 - 1\n ): Color {\n try {\n const s = parseColor(startColor);\n const e = parseColor(endColor);\n return new Color().setRGB(\n (e.r - s.r) * t + s.r,\n (e.g - s.g) * t + s.g,\n (e.b - s.b) * t + s.b\n );\n // .setAlpha((e.a - s.a) * t + s.a);\n } catch (e) {\n return new Color(endColor);\n }\n }\n\n static random(): Color {\n return new Color(Math.random() * 0xffffff);\n }\n\n get hsv() {\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 return {\n h: delta == 0 ? 0 : h * 360,\n s: max === 0 ? 0 : delta / max,\n v: max / 255,\n a\n };\n }\n\n set h(h: number) {\n const hsv = this.hsv;\n hsv.h = clamp(h, 0, 360);\n this.setColor(hsv);\n }\n get h() {\n return this.hsv.h;\n }\n\n set s(s: number) {\n const hsv = this.hsv;\n hsv.s = clamp(s, 0, 1);\n this.setColor(hsv);\n }\n get s() {\n return this.hsv.s;\n }\n\n set v(v: number) {\n const hsv = this.hsv;\n hsv.v = clamp(v, 0, 1);\n this.setColor(hsv);\n }\n get v() {\n return this.hsv.v;\n }\n}\n\nexport function color(color?: any, forceAlpha?: number): Color {\n return new Color(color, forceAlpha);\n}\n\nfunction parseColor(color: any): {\n r: number; // 0 - 255\n g: number; // 0 - 255\n b: number; // 0 - 255\n a: number; // 0 - 1\n} {\n const a = Object.prototype.hasOwnProperty.call(color, \"a\")\n ? clamp(color.a, 0, 1)\n : 1;\n /// rgb(a)\n if (\n Object.prototype.hasOwnProperty.call(color, \"r\") &&\n Object.prototype.hasOwnProperty.call(color, \"g\") &&\n Object.prototype.hasOwnProperty.call(color, \"b\")\n ) {\n color.r = clamp(Math.round(color.r), 0, 255);\n color.g = clamp(Math.round(color.g), 0, 255);\n color.b = clamp(Math.round(color.b), 0, 255);\n color.a = a;\n return color;\n }\n /// hsv(a) / hsb(a) : hue 色相 + saturation 饱和度 + value or brightness 明度\n /// UNDO hsl(a) : hue 色相 + saturation 饱和度 + lightness luminosity 亮度\n if (\n Object.prototype.hasOwnProperty.call(color, \"h\") &&\n Object.prototype.hasOwnProperty.call(color, \"s\") &&\n Object.prototype.hasOwnProperty.call(color, \"v\")\n ) {\n const h = clamp(color.h, 0, 360);\n const s = clamp(color.s, 0, 1);\n const v = clamp(color.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 return {\n r: Math.round(c[0] * 255),\n g: Math.round(c[1] * 255),\n b: Math.round(c[2] * 255),\n a: a\n };\n }\n const result = {\n r: 0,\n g: 0,\n b: 0,\n a: a\n };\n if (typeof color === \"number\") {\n /// RRGGBB(AA)\n if (color < Math.pow(2, 24)) {\n result.r = (color >> 16) & 0xff;\n result.g = (color >> 8) & 0xff;\n result.b = color & 0xff;\n } else {\n result.r = (color >> 24) & 0xff;\n result.g = (color >> 16) & 0xff;\n result.b = (color >> 8) & 0xff;\n result.a = (color & 0xff) / 255;\n }\n } else if (typeof color === \"string\") {\n /// rgba(r,g,b,a)\n const matches =\n /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,?\\s*(\\d?\\.?\\d*)?\\s*\\)/gi.exec(\n color\n );\n if (matches) {\n result.r = parseInt(matches[1]);\n result.g = parseInt(matches[2]);\n result.b = parseInt(matches[3]);\n if (matches[4]) {\n result.a = parseFloat(matches[4]);\n }\n } else {\n let matches = color.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (matches) {\n /// #RGB\n result.r = parseInt(`${matches[1]}${matches[1]}`, 16);\n result.g = parseInt(`${matches[2]}${matches[2]}`, 16);\n result.b = parseInt(`${matches[3]}${matches[3]}`, 16);\n } else {\n matches = color.match(/^#([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})$/i);\n if (matches) {\n /// #RRGGBB\n result.r = parseInt(matches[1], 16);\n result.g = parseInt(matches[2], 16);\n result.b = parseInt(matches[3], 16);\n } else {\n matches = color.match(\n /^#([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})$/i\n );\n if (matches) {\n /// #RRGGBBAA\n result.r = parseInt(matches[1], 16);\n result.g = parseInt(matches[2], 16);\n result.b = parseInt(matches[3], 16);\n result.a = parseInt(matches[4], 16) / 255;\n } else {\n if (color === \"none\") {\n result.a = 0;\n } else {\n /// 其他 string 为 默认值\n }\n }\n }\n }\n }\n } else {\n throw new Error(\"parseColor 不支持的颜色解析:\" + color);\n }\n result.r = clamp(result.r, 0, 255);\n result.g = clamp(result.g, 0, 255);\n result.b = clamp(result.b, 0, 255);\n result.a = clamp(result.a, 0, 1);\n return result;\n}\n\nexport const NormalColors = [\n \"#0ac2d2\",\n \"#7bb7fa\",\n \"#60d7a9\",\n \"#fdc162\",\n \"#fd6a62\",\n \"#f68dbb\",\n \"#26ccff\",\n \"#a25afd\",\n \"#ff5e7e\",\n \"#88ff5a\",\n \"#fcff42\",\n \"#ffa62d\",\n \"#ff36ff\",\n \"#dc4916\",\n \"#6871b1\",\n \"#d1b935\",\n \"#1bbc9b\",\n \"#FF7F50\",\n \"#4BBFC3\",\n \"#ff9900\"\n];\n\nexport const ControlsColorPattern = {\n backgroundColor: \"#1a1a1a\",\n numberColor: \"#2FA1D6\",\n booleanColor: \"#806787\",\n stringColor: \"#1ed36f\",\n functionColor: \"#e61d5f\",\n saveRowColor: \"#dad5cb\",\n buttonColor: \"\",\n borderColor: \"\",\n inputColor: \"\"\n};\nControlsColorPattern.buttonColor = new Color(ControlsColorPattern.saveRowColor)\n .darken(0.1)\n .toString();\nControlsColorPattern.borderColor = new Color(\n ControlsColorPattern.backgroundColor\n)\n .lighten(0.07)\n .toString();\nControlsColorPattern.inputColor = new Color(\n ControlsColorPattern.backgroundColor\n)\n .lighten(0.085)\n .toString();\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 { AnyElement } from \"@zyzgroup/core-common\";\n\nexport 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\n////////////////////// Mouse 或 Touch 或 Pointer 或 hammer //////////////////////\n\nexport type TMousePoint = MouseEvent | Touch | PointerEvent | HammerInput;\n\nexport function getMousePositionInViewport(ev: TMousePoint) {\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: TMousePoint) {\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: TMousePoint,\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 ) {\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 = mouse.x - p.x + fixedOffsetX;\n r.y = mouse.y - p.y + fixedOffsetY;\n }\n } else {\n const mouse = getMousePositionInPage(ev);\n const p = getElementPositionInPage(element);\n r.x = mouse.x - p.x;\n r.y = mouse.y - p.y;\n }\n return r;\n}\n\n////////////////////////////////////////////////////////////////\n","import { EventBus, EventBusListeners, debounce } from \"@zyzgroup/core-common\";\nimport Hammer from \"hammerjs\";\nimport { getMousePositionInElement, TMousePoint } from \"../position\";\nimport { useResize } from \"../hooks\";\n\nexport interface DOMEventBusListeners extends EventBusListeners {\n resize(width: number, height: number): void;\n\n transitionstart(e: TransitionEvent): void;\n transitionend(e: TransitionEvent): void;\n animationstart(e: AnimationEvent): void;\n animationend(e: AnimationEvent): void;\n\n pullDown(): void;\n pullDowning(distance: number): void;\n pullUp(): void;\n pullUping(distance: number): void;\n\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: MouseEvent): 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 inputChange(e: Event, files: FileList | null): void;\n\n dragstart(e: DragEvent): void;\n dragover(e: DragEvent): void;\n dragenter(e: DragEvent): void;\n dragend(e: DragEvent): void;\n drop(e: DragEvent, files: FileList | null): 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 // 在container之外点击\n tapOutSide(e: Event): void;\n}\n\ntype CaptureMoveStartFn = (e: TMousePoint, p: { x: number; y: number }) => void;\ntype CaptureMoveMoveFn = (\n e: TMousePoint,\n p: {\n x: number;\n y: number;\n dx: number;\n dy: number;\n dStartX: number;\n dStartY: number;\n }\n) => void;\ntype CaptureMoveEndFn = (\n e: TMousePoint,\n p: { x: number; y: number; dStartX: number; dStartY: number }\n) => void;\ntype CaptureMoveOptions = {\n start?: CaptureMoveStartFn;\n move?: CaptureMoveMoveFn;\n end?: CaptureMoveEndFn;\n};\n\nexport class DOMEventBus extends EventBus<DOMEventBusListeners> {\n // [idx: string]: any;\n\n public container: HTMLElement;\n public width: number;\n public height: number;\n public mousePoint = { x: 0, y: 0, dx: 0, dy: 0, dStartX: 0, dStartY: 0 };\n /// https://hammerjs.github.io/getting-started/\n private hammer: HammerManager;\n private removes: (() => void)[] = [];\n\n constructor(\n container: HTMLElement = document.documentElement,\n startAuto = true,\n additions?: (() => () => void)[]\n ) {\n super();\n this.container = container;\n this.width = container.offsetWidth;\n this.height = container.offsetHeight;\n this.hammer = new Hammer(this.container);\n if (startAuto) {\n this.start(additions);\n }\n }\n\n private emitDebounce = debounce(\n (type: string | symbol, ...payload: any[]) => super.emit(type, ...payload),\n 50\n );\n\n emit<K extends keyof DOMEventBusListeners>(\n type: K,\n ...payload: Parameters<DOMEventBusListeners[K]>\n ) {\n switch (type) {\n case \"panLeft\":\n case \"panRight\":\n this.emitDebounce(type, ...payload);\n break;\n default:\n super.emit(type, ...payload);\n break;\n }\n return this;\n }\n\n public start(additions?: (() => () => void)[]) {\n this.registerMouseEventListeners();\n this.registerTransitionEventListeners();\n this.registerAnimationEventListeners();\n this.registerResizeObserver();\n if (additions) {\n additions.forEach((a) => {\n this.addRemoves(a());\n });\n }\n this.on(\"pointerMove\", (e) => {\n this.setMousePoint(getMousePositionInElement(e, this.container));\n });\n }\n\n public destroy() {\n this.removes.forEach((remove) => remove());\n this.removes = [];\n /// remove parent's emit listeners\n this.removeAllListeners();\n }\n\n public restart() {\n this.destroy();\n this.start();\n }\n\n private addRemoves(remove: () => void) {\n this.removes.push(remove);\n }\n\n private registerMouseEventListeners() {\n const mouseDown = (e: MouseEvent) => {\n this.emit(\"mouseDown\", e);\n // 影响性能\n // this.container.style.userSelect = \"none\"; // if there's text\n };\n const mouseUp = (e: MouseEvent) => {\n this.emit(\"mouseUp\", e);\n // 影响性能\n // this.container.style.userSelect = \"\";\n };\n const mouseMove = (e: MouseEvent) => {\n this.emit(\"mouseMove\", e);\n };\n /// 如果触发的元素内部有其他的元素的时候当鼠标移上的时候会反复的触发 mouseover 和 mouseout 事件\n /// 因为内部元素在鼠标移上的时候会向它的父对象派发事件,所以外面元素相当于也触发了mouseover 事件\n const mouseOver = (e: MouseEvent) => {\n this.emit(\"mouseOver\", e);\n };\n const mouseOut = (e: MouseEvent) => {\n this.emit(\"mouseOut\", e);\n // 影响性能\n // this.container.style.userSelect = \"\";\n };\n const mouseEnter = (e: MouseEvent) => {\n this.emit(\"mouseEnter\", e);\n };\n const mouseLeave = (e: MouseEvent) => {\n this.emit(\"mouseLeave\", e);\n };\n const mouseClick = (e: MouseEvent) => {\n this.emit(\"mouseClick\", e);\n };\n const mouseDoubleClick = (e: MouseEvent) => {\n this.emit(\"mouseDoubleClick\", e);\n };\n const mouseWheel = (e: MouseEvent) => {\n this.emit(\"mouseWheel\", e);\n };\n const mouseContextMenu = (e: MouseEvent) => {\n this.emit(\"mouseContextMenu\", e);\n };\n\n const touchStart = (e: TouchEvent) => {\n this.emit(\"touchStart\", e);\n // 影响性能\n // this.container.style.userSelect = \"none\";\n };\n const touchEnd = (e: TouchEvent) => {\n this.emit(\"touchEnd\", e);\n // 影响性能\n // this.container.style.userSelect = \"\";\n };\n const touchCancel = (e: TouchEvent) => {\n this.emit(\"touchCancel\", e);\n // 影响性能\n // this.container.style.userSelect = \"\";\n };\n const touchMove = (e: TouchEvent) => {\n this.emit(\"touchMove\", e);\n };\n\n const pointerDown = (e: PointerEvent) => {\n this.emit(\"pointerDown\", e);\n // 影响性能\n // this.container.style.userSelect = \"none\";\n };\n const pointerUp = (e: PointerEvent) => {\n this.emit(\"pointerUp\", e);\n // 影响性能\n // this.container.style.userSelect = \"\";\n };\n const pointerCancel = (e: PointerEvent) => {\n this.emit(\"pointerCancel\", e);\n // 影响性能\n // this.container.style.userSelect = \"\";\n };\n const pointerMove = (e: PointerEvent) => {\n this.emit(\"pointerMove\", e);\n };\n\n const pan = (e: HammerInput) => {\n this.emit(\"pan\", e);\n };\n const panStart = (e: HammerInput) => {\n this.emit(\"panStart\", e);\n // 影响性能\n // this.container.style.userSelect = \"none\";\n };\n const panMove = (e: HammerInput) => {\n this.emit(\"panMove\", e);\n };\n const panEnd = (e: HammerInput) => {\n this.emit(\"panEnd\", e);\n // 影响性能\n // this.container.style.userSelect = \"\";\n };\n const panCancel = (e: HammerInput) => {\n this.emit(\"panCancel\", e);\n // 影响性能\n // this.container.style.userSelect = \"\";\n };\n const panLeft = (e: HammerInput) => {\n this.emit(\"panLeft\", e);\n };\n const panRight = (e: HammerInput) => {\n this.emit(\"panRight\", e);\n };\n const panUp = (e: HammerInput) => {\n this.emit(\"panUp\", e);\n // 影响性能\n // this.container.style.userSelect = \"\";\n };\n const panDown = (e: HammerInput) => {\n this.emit(\"panDown\", e);\n // 影响性能\n // this.container.style.userSelect = \"none\";\n };\n\n const pinch = (e: HammerInput) => {\n this.emit(\"pinch\", e);\n };\n\n const press = (e: HammerInput) => {\n this.emit(\"press\", e);\n };\n\n const rotate = (e: HammerInput) => {\n this.emit(\"rotate\", e);\n };\n\n const swipe = (e: HammerInput) => {\n this.emit(\"swipe\", e);\n };\n const swipeLeft = (e: HammerInput) => {\n this.emit(\"swipeLeft\", e);\n };\n const swipeRight = (e: HammerInput) => {\n this.emit(\"swipeRight\", e);\n };\n const swipeUp = (e: HammerInput) => {\n this.emit(\"swipeUp\", e);\n };\n const swipeDown = (e: HammerInput) => {\n this.emit(\"swipeDown\", e);\n };\n\n const tap = (e: HammerInput) => {\n this.emit(\"tap\", e);\n };\n\n const tapOutSide = (e: Event) => {\n if (\n !e.target ||\n this.container == e.target ||\n this.container.contains(e.target as Node)\n ) {\n return;\n }\n this.emit(\"tapOutSide\", e);\n };\n\n const inputChange = (e: Event) => {\n this.emit(\"inputChange\", e, (this.container as HTMLInputElement).files);\n };\n const dragstart = (e: DragEvent) => {\n this.emit(\"dragstart\", e);\n };\n const dragover = (e: DragEvent) => {\n // e.stopPropagation();\n // e.preventDefault();\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = \"copy\";\n // e.dataTransfer.setData(\"text\", (e.target as HTMLElement).id);\n }\n this.emit(\"dragover\", e);\n };\n const dragenter = (e: DragEvent) => {\n this.emit(\"dragenter\", e);\n };\n const dragend = (e: DragEvent) => {\n this.emit(\"dragend\", e);\n };\n const drop = (e: DragEvent) => {\n // e.stopPropagation();\n // e.preventDefault();\n if (e.dataTransfer) {\n // const id = e.dataTransfer.getData(\"text\");\n // const draggableElement = document.getElementById(id) as HTMLElement;\n // const dropzone = e.target as HTMLElement;\n // dropzone.appendChild(draggableElement);\n // e.dataTransfer.clearData();\n }\n this.emit(\"drop\", e, e.dataTransfer?.files || null);\n };\n\n // 捕获阶段 -> 目标阶段 -> 冒泡阶段\n // useCapture用于指定是否在捕获阶段进行处理,一般设置为false与IE浏览器保持一致\n this.container.addEventListener(\"mousedown\", mouseDown, false);\n this.container.addEventListener(\"mouseup\", mouseUp, false);\n this.container.addEventListener(\"mousemove\", mouseMove, false);\n this.container.addEventListener(\"mouseover\", mouseOver, false);\n this.container.addEventListener(\"mouseout\", mouseOut, false);\n this.container.addEventListener(\"mouseenter\", mouseEnter, false);\n this.container.addEventListener(\"mouseleave\", mouseLeave, false);\n this.container.addEventListener(\"click\", mouseClick, false);\n this.container.addEventListener(\"dblclick\", mouseDoubleClick, false);\n this.container.addEventListener(\"wheel\", mouseWheel, false);\n this.container.addEventListener(\"contextmenu\", mouseContextMenu, false);\n\n this.container.addEventListener(\"touchstart\", touchStart, false);\n this.container.addEventListener(\"touchend\", touchEnd, false);\n this.container.addEventListener(\"touchcancel\", touchCancel, false);\n this.container.addEventListener(\"touchmove\", touchMove, false);\n\n this.container.addEventListener(\"pointerdown\", pointerDown, false);\n this.container.addEventListener(\"pointerup\", pointerUp, false);\n this.container.addEventListener(\"pointercancel\", pointerCancel, false);\n this.container.addEventListener(\"pointermove\", pointerMove, false);\n\n this.hammer.on(\"pan\", pan);\n this.hammer.on(\"panstart\", panStart);\n this.hammer.on(\"panmove\", panMove);\n this.hammer.on(\"panend\", panEnd);\n this.hammer.on(\"pancancel\", panCancel);\n this.hammer.on(\"panleft\", panLeft);\n this.hammer.on(\"panright\", panRight);\n this.hammer.on(\"panup\", panUp);\n this.hammer.on(\"pandown\", panDown);\n\n this.hammer.on(\"pinch\", pinch);\n\n this.hammer.on(\"press\", press);\n\n this.hammer.on(\"rotate\", rotate);\n\n this.hammer.on(\"swipe\", swipe);\n this.hammer.on(\"swipeleft\", swipeLeft);\n this.hammer.on(\"swiperight\", swipeRight);\n this.hammer.on(\"swipeup\", swipeUp);\n this.hammer.on(\"swipedown\", swipeDown);\n\n this.hammer.on(\"tap\", tap);\n\n document.addEventListener(\"pointerdown\", tapOutSide, false);\n\n if (this.container instanceof HTMLInputElement) {\n this.container.addEventListener(\"change\", inputChange, false);\n }\n this.container.addEventListener(\"dragstart\", dragstart, false);\n this.container.addEventListener(\"dragover\", dragover, false);\n this.container.addEventListener(\"dragenter\", dragenter, false);\n this.container.addEventListener(\"dragend\", dragend, false);\n this.container.addEventListener(\"drop\", drop, false);\n\n const remove = () => {\n this.container.removeEventListener(\"mousedown\", mouseDown, false);\n this.container.removeEventListener(\"mouseup\", mouseUp, false);\n this.container.removeEventListener(\"mousemove\", mouseMove, false);\n this.container.removeEventListener(\"mouseover\", mouseOver, false);\n this.container.removeEventListener(\"mouseout\", mouseOut, false);\n this.container.removeEventListener(\"mouseenter\", mouseEnter, false);\n this.container.removeEventListener(\"mouseleave\", mouseLeave, false);\n this.container.removeEventListener(\"click\", mouseClick, false);\n this.container.removeEventListener(\"dblclick\", mouseDoubleClick, false);\n this.container.removeEventListener(\"wheel\", mouseWheel, false);\n this.container.removeEventListener(\n \"contextmenu\",\n mouseContextMenu,\n false\n );\n\n this.container.removeEventListener(\"touchstart\", touchStart, false);\n this.container.removeEventListener(\"touchend\", touchEnd, false);\n this.container.removeEventListener(\"touchcancel\", touchCancel, false);\n this.container.removeEventListener(\"touchmove\", touchMove, false);\n\n this.container.removeEventListener(\"pointerdown\", pointerDown, false);\n this.container.removeEventListener(\"pointerup\", pointerUp, false);\n this.container.removeEventListener(\"pointercancel\", pointerCancel), false;\n this.container.removeEventListener(\"pointermove\", pointerMove, false);\n\n this.hammer.off(\"pan\", pan);\n this.hammer.off(\"panstart\", panStart);\n this.hammer.off(\"panmove\", panMove);\n this.hammer.off(\"panend\", panEnd);\n this.hammer.off(\"pancancel\", panCancel);\n this.hammer.off(\"panleft\", panLeft);\n this.hammer.off(\"panright\", panRight);\n this.hammer.off(\"panup\", panUp);\n this.hammer.off(\"pandown\", panDown);\n\n this.hammer.off(\"pinch\", pinch);\n\n this.hammer.off(\"press\", press);\n\n this.hammer.off(\"rotate\", rotate);\n\n this.hammer.off(\"swipe\", swipe);\n this.hammer.off(\"swipeleft\", swipeLeft);\n this.hammer.off(\"swiperight\", swipeRight);\n this.hammer.off(\"swipeup\", swipeUp);\n this.hammer.off(\"swipedown\", swipeDown);\n\n this.hammer.off(\"tap\", tap);\n\n document.removeEventListener(\"pointerdown\", tapOutSide, false);\n document.removeEventListener(\"touchstart\", tapOutSide, false);\n document.removeEventListener(\"mousedown\", tapOutSide, false);\n\n if (this.container instanceof HTMLInputElement) {\n this.container.removeEventListener(\"change\", inputChange, false);\n }\n this.container.removeEventListener(\"dragstart\", dragstart, false);\n this.container.removeEventListener(\"dragover\", dragover, false);\n this.container.removeEventListener(\"dragenter\", dragenter, false);\n this.container.removeEventListener(\"dragend\", dragend, false);\n this.container.removeEventListener(\"drop\", drop, false);\n };\n this.addRemoves(remove);\n return remove;\n }\n\n private registerTransitionEventListeners() {\n const transitionstart = (e: TransitionEvent) => {\n this.emit(\"transitionstart\", e);\n };\n const transitionend = (e: TransitionEvent) => {\n this.emit(\"transitionend\", e);\n };\n this.container.addEventListener(\"transitionstart\", transitionstart, false);\n this.container.addEventListener(\"transitionend\", transitionend, false);\n const remove = () => {\n this.container.removeEventListener(\n \"transitionstart\",\n transitionstart,\n false\n );\n this.container.removeEventListener(\"transitionend\", transitionend, false);\n };\n this.addRemoves(remove);\n return remove;\n }\n\n private registerAnimationEventListeners() {\n const animationstart = (e: AnimationEvent) => {\n this.emit(\"animationstart\", e);\n };\n const animationend = (e: AnimationEvent) => {\n this.emit(\"animationend\", e);\n };\n this.container.addEventListener(\"animationstart\", animationstart, false);\n this.container.addEventListener(\"animationend\", animationend, false);\n const remove = () => {\n this.container.removeEventListener(\n \"animationstart\",\n animationstart,\n false\n );\n this.container.removeEventListener(\"animationend\", animationend, false);\n };\n this.addRemoves(remove);\n return remove;\n }\n\n public registerResizeObserver() {\n const { on, destroy } = useResize(this.container);\n const off = on((width: number, height: number) => {\n this.width = width;\n this.height = height;\n this.emit(\"resize\", width, height);\n });\n const remove = () => {\n off();\n destroy();\n };\n this.addRemoves(remove);\n return remove;\n }\n\n /// 下拉刷新\n public registerPullDownRefresh(options?: { distance?: number }) {\n const distance = options?.distance || 50;\n return this.captureDrag({\n move: (e, p) => {\n if (p.dStartY > 0 && p.dStartY < distance) {\n this.emit(\"pullDowning\", p.dStartY);\n }\n },\n end: (e, p) => {\n if (p.dStartY >= distance) {\n this.emit(\"pullDown\");\n }\n }\n });\n }\n\n /// 上拉加载\n public registerPullUpLoading(options?: { distance?: number }) {\n const distance = options?.distance || 50;\n return this.captureDrag({\n move: (e, p) => {\n if (p.dStartY > 0 && p.dStartY < distance) {\n this.emit(\"pullUping\", p.dStartY);\n }\n },\n end: (e, p) => {\n if (p.dStartY >= distance) {\n this.emit(\"pullUp\");\n }\n }\n });\n }\n\n private setMousePoint(p: {\n x: number;\n y: number;\n dx?: number;\n dy?: number;\n dStartX?: number;\n dStartY?: number;\n }) {\n this.mousePoint.x = p.x;\n this.mousePoint.y = p.y;\n this.mousePoint.dx = typeof p.dx == \"number\" ? p.dx : 0;\n this.mousePoint.dy = typeof p.dy == \"number\" ? p.dy : 0;\n this.mousePoint.dStartX = typeof p.dStartX == \"number\" ? p.dStartX : 0;\n this.mousePoint.dStartY = typeof p.dStartY == \"number\" ? p.dStartY : 0;\n }\n\n captureDrag(options?: CaptureMoveOptions): () => void {\n return this.captureDragUsePointer(options);\n // if (\n // \"ontouchstart\" in window ||\n // \"ontouchend\" in document ||\n // navigator.maxTouchPoints > 0\n // ) {\n // return this.captureDragUseTouch(options);\n // } else {\n // return this.captureDragUseMouse(options);\n // }\n }\n\n captureDragUsePointer(options?: CaptureMoveOptions) {\n let startP: { x: number; y: number } | null;\n let p: { x: number; y: number };\n\n const start = (event: PointerEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.on(\"pointerMove\", move);\n this.on(\"pointerUp\", end);\n this.on(\"pointerCancel\", end);\n // this.container.setPointerCapture(event.pointerId);\n // 影响性能\n // this.container.style.userSelect = \"none\";\n p = getMousePositionInElement(event, this.container);\n const r = { ...p };\n startP = r;\n this.setMousePoint(r);\n options?.start?.(event, r);\n };\n\n const end = (event: PointerEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.off(\"pointerMove\", move);\n this.off(\"pointerUp\", end);\n this.off(\"pointerCancel\", end);\n // this.container.releasePointerCapture(event.pointerId);\n // 影响性能\n // this.container.style.userSelect = \"\";\n p = getMousePositionInElement(event, this.container);\n const r = {\n ...p,\n dStartX: startP ? p.x - startP.x : 0,\n dStartY: startP ? p.y - startP.y : 0\n };\n this.setMousePoint(r);\n options?.end?.(event, r);\n startP = null;\n };\n\n const move = (event: PointerEvent) => {\n event.preventDefault();\n event.stopPropagation();\n const prevP = { ...p };\n p = getMousePositionInElement(event, this.container);\n const r = {\n ...p,\n dx: p.x - (prevP.x || 0),\n dy: p.y - (prevP.y || 0),\n dStartX: startP ? p.x - startP.x : 0,\n dStartY: startP ? p.y - startP.y : 0\n };\n this.setMousePoint(r);\n options?.move?.(event, r);\n };\n\n this.on(\"pointerDown\", start);\n const remove = () => {\n this.off(\"pointerDown\", start);\n };\n this.addRemoves(remove);\n return remove;\n }\n\n captureDragUseMouse(options?: CaptureMoveOptions) {\n let startP: { x: number; y: number } | null;\n let p: { x: number; y: number };\n\n const start = (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n document.addEventListener(\"mousemove\", move, false);\n document.addEventListener(\"mouseup\", end, false);\n // 影响性能\n // this.container.style.userSelect = \"none\";\n p = getMousePositionInElement(event, this.container);\n const r = { ...p };\n startP = r;\n this.setMousePoint(r);\n options?.start?.(event, r);\n };\n\n const end = (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n document.removeEventListener(\"mousemove\", move, false);\n document.removeEventListener(\"mouseup\", end, false);\n // 影响性能\n // this.container.style.userSelect = \"\";\n p = getMousePositionInElement(event, this.container);\n const r = {\n ...p,\n dStartX: startP ? p.x - startP.x : 0,\n dStartY: startP ? p.y - startP.y : 0\n };\n this.setMousePoint(r);\n options?.end?.(event, r);\n startP = null;\n };\n\n const move = (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n const prevP = { ...p };\n p = getMousePositionInElement(event, this.container);\n const r = {\n ...p,\n dx: p.x - (prevP.x || 0),\n dy: p.y - (prevP.y || 0),\n dStartX: startP ? p.x - startP.x : 0,\n dStartY: startP ? p.y - startP.y : 0\n };\n this.setMousePoint(r);\n options?.move?.(event, r);\n };\n\n this.on(\"mouseDown\", start);\n const remove = () => {\n this.off(\"mouseDown\", start);\n };\n this.addRemoves(remove);\n return remove;\n }\n\n captureDragUseTouch(options?: CaptureMoveOptions) {\n let startP: { x: number; y: number } | null;\n let p: { x: number; y: number };\n\n const start = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.on(\"touchMove\", move);\n this.on(\"touchEnd\", end);\n this.on(\"touchCancel\", end);\n const touch = event.changedTouches[0]; // first touch\n p = getMousePositionInElement(touch, this.container);\n const r = { ...p };\n startP = r;\n this.setMousePoint(r);\n options?.start?.(touch, r);\n };\n\n const end = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.off(\"touchMove\", move);\n this.off(\"touchEnd\", end);\n this.off(\"touchCancel\", end);\n const touch = event.changedTouches[0]; // first touch\n p = getMousePositionInElement(touch, this.container);\n const r = {\n ...p,\n dStartX: startP ? p.x - startP.x : 0,\n dStartY: startP ? p.y - startP.y : 0\n };\n this.setMousePoint(r);\n options?.end?.(touch, r);\n startP = null;\n };\n\n const move = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n const touch = event.changedTouches[0]; // first touch\n const prevP = { ...p };\n p = getMousePositionInElement(touch, this.container);\n const r = {\n ...p,\n dx: p.x - (prevP.x || 0),\n dy: p.y - (prevP.y || 0),\n dStartX: startP ? p.x - startP.x : 0,\n dStartY: startP ? p.y - startP.y : 0\n };\n this.setMousePoint(r);\n options?.move?.(touch, r);\n };\n\n this.on(\"touchStart\", start);\n const remove = () => {\n this.off(\"touchStart\", start);\n };\n this.addRemoves(remove);\n return remove;\n }\n}\n\nexport default DOMEventBus;\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, ms = 60000) {\n const finalUrl = typeof url === \"string\" ? url : createObjectURL(url);\n return new Promise<RawImageInfo>((resolve, reject) => {\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","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(html: string): DocumentFragment {\n const tmpl = document.createElement(\"template\");\n tmpl.innerHTML = html;\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 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 { theme } from \"@zyzgroup/core-web\";\n\nconst props = withDefaults(\n defineProps<{\n icon?: string;\n color?: string;\n }>(),\n { icon: \"mdi-light:home\", color: theme.colorPrimary }\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 { theme } from \"@zyzgroup/core-web\";\n\nconst props = withDefaults(\n defineProps<{\n color?: string;\n width?: string;\n }>(),\n {\n color: theme.colorPrimary,\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, theme } 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\nconst props = withDefaults(\n defineProps<{\n label?: string;\n icon?: string;\n iconPosition?: string;\n disabled?: boolean;\n width?: string;\n height?: string;\n padding?: string;\n fontSize?: string;\n borderRadius?: string;\n\n stylePattern?: \"fullfilled\" | \"outline\";\n borderColor?: string;\n bgColor?: string;\n fontColor?: string;\n\n asyncClick?: () => Promise<void>;\n }>(),\n {\n iconPosition: \"left\",\n disabled: false,\n width: \"auto\",\n height: \"44px\",\n padding: \"20px\",\n fontSize: \"14px\",\n borderRadius: \"4px\",\n stylePattern: \"fullfilled\"\n }\n);\n\nconst emits = defineEmits<{\n // for ce element\n (event: \"yz-click\"): void;\n (event: \"click\"): void;\n}>();\n\n// 父组件ref子Button组件时:xxx.value.el.getBoundingClientRect()\nconst el = ref<HTMLElement>();\n\nconst borderColor = ref(props.borderColor);\nconst bgColor = ref(props.bgColor);\nconst fontColor = ref(props.fontColor);\n\nconst baseBorderColor = ref(props.borderColor);\nconst baseBgColor = ref(props.bgColor);\n\nfunction changeStylePattern(stylePattern: string) {\n switch (stylePattern) {\n case \"outline\":\n borderColor.value = props.borderColor ?? theme.colorPrimary;\n bgColor.value = props.bgColor ?? theme.colorGrayFF;\n fontColor.value = props.fontColor ?? theme.colorPrimary;\n\n baseBorderColor.value = borderColor.value;\n baseBgColor.value = bgColor.value;\n break;\n case \"fullfilled\":\n default:\n borderColor.value = props.borderColor ?? theme.colorPrimary;\n bgColor.value = props.bgColor ?? theme.colorPrimary;\n fontColor.value = props.fontColor ?? theme.colorGrayFF;\n\n baseBorderColor.value = borderColor.value;\n baseBgColor.value = bgColor.value;\n break;\n }\n}\nwatch(\n () => props.stylePattern,\n () => {\n changeStylePattern(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 mouseover = () => {\n if (props.disabled) return;\n isMouseOver = true;\n borderColor.value = color(baseBorderColor.value!).lighten(0.05).toString();\n bgColor.value = color(baseBgColor.value!).lighten(0.05).toString();\n};\n\nconst mouseleave = () => {\n if (props.disabled) return;\n isMouseOver = false;\n borderColor.value = baseBorderColor.value;\n bgColor.value = baseBgColor.value;\n};\n\nconst asyncClickResultPending = ref(false);\nconst click = () => {\n if (props.disabled || asyncClickResultPending.value) {\n return;\n }\n borderColor.value = color(baseBorderColor.value!).darken(0.1).toString();\n bgColor.value = color(baseBgColor.value!).darken(0.1).toString();\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 asyncClickResultPending.value = true;\n props\n .asyncClick()\n .then(() => {\n asyncClickResultPending.value = false;\n })\n .catch(() => {\n asyncClickResultPending.value = false;\n });\n }\n};\n\nconst throttleClick = throttle(click, 300);\n\ndefineExpose({ el });\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-color: ${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 }\"\n >\n <div\n v-if=\"asyncClickResultPending\"\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: theme.d4,\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: theme.d4,\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 } from \"vue\";\nimport { DOMEventBus, useClipboard, useElement } from \"@zyzgroup/core-web\";\nimport { ContainerType, EffectStatus, EffectTriggerTiming } from \"../types\";\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\", app: DOMEventBus): void;\n (event: \"resize\", width: number, height: number, rect: DOMRect): 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();\nlet isReady = false;\nlet app: DOMEventBus;\nlet getAppResolve: (value: DOMEventBus | PromiseLike<DOMEventBus>) => void;\n\nonMounted(() => {\n app = new DOMEventBus(r.value, false);\n app.on(\"resize\", (width, height) => {\n emits(\"resize\", width, height, r.value.getBoundingClientRect());\n getAppResolve?.(app);\n if (!isReady) {\n /// 初始化\n isReady = true;\n if (props.effectTriggerTiming !== \"manual\") {\n start();\n }\n emits(\"ready\", app);\n if (props.effectTriggerTiming == \"immediate\") {\n next();\n }\n }\n });\n app.on(\"mouseEnter\", () => {\n if (props.effectTriggerTiming == \"mouseMove\") {\n next();\n }\n });\n app.on(\"mouseLeave\", () => {\n if (props.effectTriggerTiming == \"mouseMove\") {\n next();\n }\n });\n app.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 app.start();\n});\n\nconst getApp = () => {\n return new Promise<DOMEventBus>((resolve) => {\n if (app) {\n return resolve(app);\n }\n getAppResolve = resolve;\n });\n};\n\nconst getSize = async (): Promise<DOMRect> => {\n await getApp();\n return r.value.getBoundingClientRect();\n};\n\nonUnmounted(() => {\n app?.destroy();\n});\n\ndefineExpose({\n getElement: () => r.value,\n getApp,\n getSize\n});\n</script>\n\n<template>\n <div\n class=\"container\"\n ref=\"r\"\n :class=\"[props.type]\"\n :style=\"{\n position: 'relative',\n boxSizing: 'border-box',\n /* overflow: 'hidden', */\n display: props.type == 'shrink' ? 'inline-block' : 'block',\n width: props.type == 'full' ? '100%' : 'auto',\n height: props.type == 'full' ? '100%' : 'auto'\n }\"\n >\n <slot></slot>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, reactive, watch } from \"vue\";\nimport Container from \"../Container.vue\";\nimport { ContainerType, EffectTriggerTiming } from \"../../types\";\nimport {\n DOMEventBus,\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 = (app: DOMEventBus) => {\n parentStyle.perspective = props.perspective;\n app.on(\"animationstart\", (e) => {\n emits(\"cssanimationstart\", e.animationName);\n });\n app.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 resize = () => {\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 getElement: () => pageRef.value.getElement()\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 @resize=\"resize\"\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\", width: number, height: number, 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 = (w: number, h: number, rect: DOMRect) => {\n emits(\"resize\", w, h, 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 <div\n class=\"pop\"\n style=\"\n display: block;\n position: relative;\n width: 100%;\n height: 100%;\n overflow: hidden;\n \"\n @click=\"clickOverlay\"\n >\n <Container\n class=\"pop-content\"\n :type=\"popType\"\n :style=\"popStyle\"\n @resize=\"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 resizeOutter = (w: number, h: number) => {\n wrapWidth.value = w;\n wrapHeight.value = h;\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 resizeInner = (_: number, __: number, rect: DOMRect) => {\n emits(\"settled\", rect.x, rect.y, rect.width, 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.getSize();\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 @resize=\"resizeOutter\"\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 @resize=\"resizeInner\"\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 { DOMEventBus, 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 = (app: DOMEventBus) => {\n app.on(\"panLeft\", () => {\n routesRef.value?.forward();\n });\n app.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","generateUUID","digit","chars","length","id","i","lowercaseFirst","val","c","toKebab","value","glue","v","toPascal","toCamel","label","StringTag","SymbolTag","getTag","isString","isNumber","isSymbol","deleteArrayItem","arr","item","index","s","_nativeMap","_nativeSet","isReallyNaN","num","parseNumber","defaultValue","clamp","x","min","max","fixedDotNumberString","precision","maxDotNumber","_generateTables","buffer","floatView","uint32View","baseTable","shiftTable","e","mantissaTable","exponentTable","offsetTable","m","now","throttle","fn","ms","ready","args","debounce","timer","EventBus","name","handler","payload","onceCb","fired","AsyncTaskQueue","concurrency","controller","task","waitTasks","results","lastIndex","success","error","acc","CacheMap","k","entries","top","cb","ShellSort","array","obeyCompare","a","b","len","gapSize","temp","j","_nativePromise","useEventListener","target","event","useCapture","eventHandler","useEmit","eb","lastTime","currTime","timeRemain","requestAnimationFrameCycle","isCancel","frame","time","start","frameEndTimeStamp","currentCallback","channel","Sequence","Easing","amount","power","numSteps","easingFunction","randomProportion","normalProportion","reverseEasing","easing","Interpolation","p0","p1","t","n","fc","p2","p3","v0","v1","t2","t3","f","pw","bn","Group","tweenId","tween","preserve","tweenIds","autoStart","mainGroup","Tween","_object","_group","properties","duration","d","property","_valuesStart","_valuesEnd","_valuesStartRepeat","startValue","startValueIsArray","propType","isInterpolationList","endValues","prop","numChainedTweens","group","times","yoyo","interpolationFunction","tweens","callback","elapsed","endTime","end","startIsArray","endIsArray","tmp","endValue","Clock","diff","newTime","Clock$1","Timeline","reverse","clones","fromValues","toValues","tweenConfig","clock","frameDuration","resolve","isContinue","reverseTweens","maxFrames","vnodes","getVnode","el","vnode","hFromEl","getStyle","pseudo","atomReadStyles","styles","injectStyle","styleSheetInnerText","dom","shadowRoot","style","position","atomReadAttributes","obj","attrs","attr","prevUrl","_records","_observer","width","height","setWindowTitle","title","isInjected","inject","useSafeArea","declaration","useResize","observer","entry","computeImageDisplayRect","mode","sourceWidth","sourceHeight","wrapWidth","wrapHeight","sourceAspectRatio","showWidth","showHeight","getImageData","image","canvas","ctx","styleDeclaration","getCSSVar","theme","Color","color","forceAlpha","parseColor","r","g","str","bw","blackColor","whiteColor","startColor","endColor","delta","h","hsv","hi","p","q","result","matches","ControlsColorPattern","window","document","exportName","undefined","VENDOR_PREFIXES","TEST_ELEMENT","TYPE_FUNCTION","round","abs","setTimeoutContext","timeout","context","bindFn","invokeArrayArg","arg","each","iterator","deprecate","method","message","deprecationMessage","stack","log","assign","output","source","nextKey","extend","dest","src","merge","keys","inherit","child","base","baseP","childP","boolOrFn","ifUndefined","val1","val2","addEventListeners","types","splitStr","type","removeEventListeners","hasParent","node","parent","inStr","find","inArray","findByKey","toArray","uniqueArray","key","sort","values","prefixed","prefix","camelProp","_uniqueId","uniqueId","getWindowForElement","element","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","ev","createInputInstance","Type","inputClass","PointerEventInput","TouchInput","TouchMouseInput","MouseInput","inputHandler","eventType","input","pointersLen","changedPointersLen","isFirst","isFinal","computeInputData","session","pointers","pointersLength","simpleCloneInputData","firstInput","firstMultiple","offsetCenter","center","getCenter","getAngle","getDistance","computeDeltaXY","getDirection","overallVelocity","getVelocity","getScale","getRotation","computeIntervalInputData","offset","prevDelta","prevInput","last","deltaTime","velocity","velocityX","velocityY","direction","deltaX","deltaY","y","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","dx","dy","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","state","emit","stateStr","inputDataClone","directionStr","AttrRecognizer","optionPointers","isRecognized","isValid","PanRecognizer","hasMoved","distance","PinchRecognizer","inOut","PressRecognizer","validPointers","validMovement","validTime","RotateRecognizer","SwipeRecognizer","TapRecognizer","validTouchTime","validInterval","validMultiTap","tapCount","Hammer","Manager","STOP","FORCED_STOP","toggleCssProps","force","recognizers","curRecognizer","existing","events","handlers","data","triggerDomEvent","add","gestureEvent","freeGlobal","define","module","getDocumentElementPosition","getViewportSize","getElementPositionInPage","left","scrollLeft","scrollTop","getMousePositionInPage","getMousePositionInElement","mouse","fixedOffsetX","fixedOffsetY","currentTargetRect","targetRect","DOMEventBus","container","startAuto","additions","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","inputChange","dragstart","dragover","dragenter","dragend","drop","transitionstart","transitionend","animationstart","animationend","on","destroy","off","startP","move","prevP","createObjectURL","blob","caches","useLoadImage","url","finalUrl","reject","cached","rawImageInfo","hasClass","className","useElement","rem","elm","ps","selector","selectedValue","checkedValue","option","checked","html","createFragment","newEl","scriptConvert","text","copyText","slots","tmpl","newNode","convert","script","useClipboard","textArea","tag","children","__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","size","ratio","oldParts","newParts","code","splitSVGDefs","content","defs","endEnd","mergeDefsAndContent","wrapSVGContent","body","split","isUnsetKeyword","iconToSVG","customisations","fullIcon","fullCustomisations","box","transformations","hFlip","vFlip","rotation","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","path","iconsList","urlParams","uri","defaultError","response","sortIcons","lastIcon","localStorage","list","removeCallback","storages","items","row","updateCallbacks","hasPending","oldLength","idCounter","storeCallback","pendingSources","abort","listToIcons","defaultConfig","sendQuery","query","done","resourcesCount","startIndex","nextIndex","startTime","queriesSent","lastError","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","svg","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","newProps","emits","__emit","ref","borderColor","bgColor","fontColor","baseBorderColor","baseBgColor","changeStylePattern","stylePattern","watch","opacity","cursor","isMouseOver","mouseover","mouseleave","asyncClickResultPending","throttleClick","router","useRouter","gotoPay","safeAreaBottom","cancelOnBottom","PLATE_TYPES","getPlateType","plateType","dotSize","effectStatus","next","isReady","app","getAppResolve","getApp","getSize","parentStyle","reactive","animationName","timingFunction","delay","repeat","changeEffect","newAnimationName","animationRef","resetAnimation","trigger","triggerReverse","clear","pageRef","open","close","resize","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","tl","popStyle","visible","popType","isShrink","popValue","popUnit","onComplete","rect","action","clickOverlay","popX","popY","popWidth","popHeight","finalX","finalY","finalWidth","finalHeight","isCORS","info","setImageWidthHeight","resizeOutter","w","wrapImageRect","viewportWidth","viewportHeight","viewportImageRect","resizeInner","_","__","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","to","from","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":[35,46]}
|