@tmagic/editor 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/dist/style.css +505 -0
  2. package/dist/tmagic-editor.es.js +4233 -0
  3. package/dist/tmagic-editor.es.js.map +1 -0
  4. package/dist/tmagic-editor.umd.js +4276 -0
  5. package/dist/tmagic-editor.umd.js.map +1 -0
  6. package/dist/types/src/Editor.vue.d.ts +136 -0
  7. package/dist/types/src/components/Icon.vue.d.ts +13 -0
  8. package/dist/types/src/components/ToolButton.vue.d.ts +35 -0
  9. package/dist/types/src/fields/Code.vue.d.ts +24 -0
  10. package/dist/types/src/fields/CodeLink.vue.d.ts +54 -0
  11. package/dist/types/src/fields/UISelect.vue.d.ts +32 -0
  12. package/dist/types/src/index.d.ts +19 -0
  13. package/dist/types/src/layouts/AddPageBox.vue.d.ts +5 -0
  14. package/dist/types/src/layouts/CodeEditor.vue.d.ts +46 -0
  15. package/dist/types/src/layouts/Framework.vue.d.ts +11 -0
  16. package/dist/types/src/layouts/NavMenu.vue.d.ts +24 -0
  17. package/dist/types/src/layouts/PropsPanel.vue.d.ts +13 -0
  18. package/dist/types/src/layouts/Resizer.vue.d.ts +13 -0
  19. package/dist/types/src/layouts/sidebar/ComponentListPanel.vue.d.ts +12 -0
  20. package/dist/types/src/layouts/sidebar/LayerMenu.vue.d.ts +31 -0
  21. package/dist/types/src/layouts/sidebar/LayerPanel.vue.d.ts +973 -0
  22. package/dist/types/src/layouts/sidebar/Sidebar.vue.d.ts +27 -0
  23. package/dist/types/src/layouts/workspace/PageBar.vue.d.ts +11 -0
  24. package/dist/types/src/layouts/workspace/Stage.vue.d.ts +153 -0
  25. package/dist/types/src/layouts/workspace/ViewerMenu.vue.d.ts +18 -0
  26. package/dist/types/src/layouts/workspace/Workspace.vue.d.ts +37 -0
  27. package/dist/types/src/services/BaseService.d.ts +56 -0
  28. package/dist/types/src/services/editor.d.ts +122 -0
  29. package/dist/types/src/services/events.d.ts +16 -0
  30. package/dist/types/src/services/history.d.ts +51 -0
  31. package/dist/types/src/services/props.d.ts +36 -0
  32. package/dist/types/src/services/ui.d.ts +26 -0
  33. package/dist/types/src/shims-vue.d.ts +6 -0
  34. package/dist/types/src/type.d.ts +183 -0
  35. package/dist/types/src/utils/compose.d.ts +5 -0
  36. package/dist/types/src/utils/config.d.ts +4 -0
  37. package/dist/types/src/utils/editor.d.ts +45 -0
  38. package/dist/types/src/utils/index.d.ts +4 -0
  39. package/dist/types/src/utils/logger.d.ts +5 -0
  40. package/dist/types/src/utils/props.d.ts +49 -0
  41. package/dist/types/src/utils/undo-redo.d.ts +12 -0
  42. package/dist/types/src/vite-env.d.ts +1 -0
  43. package/package.json +57 -0
  44. package/src/Editor.vue +234 -0
  45. package/src/components/Icon.vue +29 -0
  46. package/src/components/ToolButton.vue +188 -0
  47. package/src/fields/Code.vue +35 -0
  48. package/src/fields/CodeLink.vue +81 -0
  49. package/src/fields/UISelect.vue +100 -0
  50. package/src/index.ts +63 -0
  51. package/src/layouts/AddPageBox.vue +41 -0
  52. package/src/layouts/CodeEditor.vue +188 -0
  53. package/src/layouts/Framework.vue +73 -0
  54. package/src/layouts/NavMenu.vue +37 -0
  55. package/src/layouts/PropsPanel.vue +81 -0
  56. package/src/layouts/Resizer.vue +61 -0
  57. package/src/layouts/sidebar/ComponentListPanel.vue +69 -0
  58. package/src/layouts/sidebar/LayerMenu.vue +117 -0
  59. package/src/layouts/sidebar/LayerPanel.vue +209 -0
  60. package/src/layouts/sidebar/Sidebar.vue +86 -0
  61. package/src/layouts/workspace/PageBar.vue +83 -0
  62. package/src/layouts/workspace/Stage.vue +221 -0
  63. package/src/layouts/workspace/ViewerMenu.vue +110 -0
  64. package/src/layouts/workspace/Workspace.vue +98 -0
  65. package/src/services/BaseService.ts +138 -0
  66. package/src/services/componentList.ts +48 -0
  67. package/src/services/editor.ts +521 -0
  68. package/src/services/events.ts +82 -0
  69. package/src/services/history.ts +124 -0
  70. package/src/services/props.ts +110 -0
  71. package/src/services/ui.ts +101 -0
  72. package/src/shims-vue.d.ts +6 -0
  73. package/src/theme/code-editor.scss +7 -0
  74. package/src/theme/common/var.scss +13 -0
  75. package/src/theme/component-list-panel.scss +102 -0
  76. package/src/theme/content-menu.scss +39 -0
  77. package/src/theme/framework.scss +72 -0
  78. package/src/theme/index.scss +13 -0
  79. package/src/theme/layer-panel.scss +68 -0
  80. package/src/theme/nav-menu.scss +69 -0
  81. package/src/theme/page-bar.scss +31 -0
  82. package/src/theme/props-panel.scss +17 -0
  83. package/src/theme/resizer.scss +51 -0
  84. package/src/theme/ruler.scss +38 -0
  85. package/src/theme/sidebar.scss +97 -0
  86. package/src/theme/stage.scss +22 -0
  87. package/src/theme/workspace.scss +5 -0
  88. package/src/type.ts +236 -0
  89. package/src/utils/compose.ts +33 -0
  90. package/src/utils/config.ts +29 -0
  91. package/src/utils/editor.ts +244 -0
  92. package/src/utils/index.ts +22 -0
  93. package/src/utils/logger.ts +47 -0
  94. package/src/utils/props.ts +218 -0
  95. package/src/utils/undo-redo.ts +76 -0
  96. package/src/vite-env.d.ts +1 -0
  97. package/tsconfig.json +9 -0
  98. package/vite.config.ts +30 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmagic-editor.es.js","sources":["../plugin-vue:export-helper","../src/fields/Code.vue","../src/fields/CodeLink.vue","../src/fields/UISelect.vue","../src/layouts/CodeEditor.vue","../src/utils/config.ts","../src/utils/undo-redo.ts","../src/utils/compose.ts","../src/services/BaseService.ts","../src/services/history.ts","../src/services/props.ts","../src/type.ts","../src/utils/editor.ts","../src/utils/logger.ts","../src/services/editor.ts","../src/services/events.ts","../src/utils/props.ts","../src/layouts/AddPageBox.vue","../../../node_modules/@daybrush/utils/dist/utils.esm.js","../../../node_modules/@scena/event-emitter/dist/event-emitter.esm.js","../../../node_modules/gesto/dist/gesto.esm.js","../src/layouts/Resizer.vue","../src/layouts/Framework.vue","../src/components/Icon.vue","../src/components/ToolButton.vue","../src/layouts/NavMenu.vue","../src/layouts/PropsPanel.vue","../src/layouts/sidebar/ComponentListPanel.vue","../src/layouts/sidebar/LayerMenu.vue","../src/layouts/sidebar/LayerPanel.vue","../src/layouts/sidebar/Sidebar.vue","../src/layouts/workspace/PageBar.vue","../src/layouts/workspace/ViewerMenu.vue","../src/layouts/workspace/Stage.vue","../src/layouts/workspace/Workspace.vue","../src/services/componentList.ts","../src/services/ui.ts","../src/Editor.vue","../src/index.ts"],"sourcesContent":["\nexport default (sfc, props) => {\n const target = sfc.__vccOpts || sfc;\n for (const [key, val] of props) {\n target[key] = val;\n }\n return target;\n}\n","<template>\n <magic-code-editor\n :style=\"`height: ${height}`\"\n :init-values=\"model[name]\"\n :language=\"language\"\n @save=\"save\"\n ></magic-code-editor>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue';\n\nexport default defineComponent({\n name: 'm-fields-vs-code',\n\n props: ['model', 'name', 'config', 'prop'],\n\n emits: ['change'],\n\n setup(props, { emit }) {\n const language = computed(() => props.config.language || 'javascript');\n const height = computed(() => `${document.body.clientHeight - 168}px`);\n\n return {\n height,\n language,\n\n save(v: string) {\n props.model[props.name] = v;\n emit('change', v);\n },\n };\n },\n});\n</script>\n","<template>\n <m-fields-link :config=\"formConfig\" :model=\"modelValue\" name=\"form\" @change=\"changeHandler\"></m-fields-link>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, PropType, ref, watchEffect } from 'vue';\nimport serialize from 'serialize-javascript';\n\ninterface CodeLinkConfig {\n type: 'code-link';\n name: string;\n text?: string;\n formTitle?: string;\n}\n\nexport default defineComponent({\n name: 'm-fields-code-link',\n\n props: {\n config: {\n type: Object as PropType<CodeLinkConfig>,\n },\n\n model: {\n type: Object,\n },\n\n name: {\n type: String,\n },\n\n prop: {\n type: String,\n },\n },\n\n emits: ['change'],\n\n setup(props, { emit }) {\n const modelValue = ref<{ form: Record<string, any> }>({\n form: {},\n });\n\n watchEffect(() => {\n if (!props.model || !props.name) return;\n modelValue.value.form[props.name] = serialize(props.model[props.name], {\n space: 2,\n unsafe: true,\n }).replace(/\"(\\w+)\":\\s/g, '$1: ');\n });\n\n return {\n modelValue,\n\n formConfig: computed(() => ({\n ...props.config,\n text: '',\n type: 'link',\n form: [\n {\n name: props.name,\n type: 'vs-code',\n },\n ],\n })),\n\n changeHandler(v: Record<string, any>) {\n if (!props.name || !props.model) return;\n\n try {\n // eslint-disable-next-line no-eval\n props.model[props.name] = eval(`${v[props.name]}`);\n emit('change', props.model[props.name]);\n } catch (e) {\n console.error(e);\n }\n },\n };\n },\n});\n</script>\n","<template>\n <div class=\"m-fields-ui-select\" v-if=\"uiSelectMode\" @click=\"cancelHandler\">\n <i class=\"el-icon-delete\" style=\"color: rgb(221, 75, 57)\">取消</i>\n </div>\n <div class=\"m-fields-ui-select\" v-else @click=\"startSelect\">\n <i class=\"el-icon-thumb\"></i>\n <span>{{ val ? toName + '_' + val : '点击此处选择' }}</span>\n <i class=\"el-icon-delete\" @click.stop=\"deleteHandler\" v-if=\"val\"></i>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref } from 'vue';\n\nimport { FormState } from '@tmagic/form';\n\nimport { Services } from '@editor/type';\n\nexport default defineComponent({\n name: 'm-fields-ui-select',\n\n props: {\n labelWidth: String,\n config: Object,\n model: Object,\n prop: {\n type: String,\n default() {\n return '';\n },\n },\n name: String,\n },\n\n emits: ['change'],\n\n setup(props: any, { emit }) {\n const services = inject<Services>('services');\n const mForm = inject<FormState>('mForm');\n const val = computed(() => props.model[props.name]);\n const uiSelectMode = ref(false);\n\n const cancelHandler = () => {\n if (!services?.uiService) return;\n services.uiService.set<boolean>('uiSelectMode', false);\n uiSelectMode.value = false;\n globalThis.document.removeEventListener('ui-select', clickHandler as EventListener);\n };\n\n const clickHandler = ({ detail }: Event & { detail: any }) => {\n if (detail.id) {\n props.model[props.name] = detail.id;\n emit('change', detail.id);\n mForm?.$emit('field-change', props.prop, detail.id);\n }\n\n if (cancelHandler) {\n cancelHandler();\n }\n };\n\n return {\n val,\n uiSelectMode,\n toName: computed(() => {\n const config = services?.editorService.getNodeById(val.value);\n return config?.name || '';\n }),\n\n startSelect() {\n if (!services?.uiService) return;\n services.uiService.set<boolean>('uiSelectMode', true);\n uiSelectMode.value = true;\n globalThis.document.addEventListener('ui-select', clickHandler as EventListener);\n },\n\n cancelHandler,\n\n deleteHandler() {\n if (props.model) {\n props.model[props.name] = '';\n emit('change', '');\n mForm?.$emit('field-change', props.prop, '');\n }\n },\n };\n },\n});\n</script>\n<style lang=\"scss\">\n.m-fields-ui-select {\n cursor: pointer;\n i {\n margin-right: 3px;\n }\n span {\n color: #2882e0;\n }\n}\n</style>\n","<template>\n <div ref=\"codeEditor\" class=\"magic-code-editor\"></div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, onUnmounted, ref, watch } from 'vue';\nimport serialize from 'serialize-javascript';\n\nimport { asyncLoadJs } from '@tmagic/utils';\n\nconst initEditor = () => {\n if ((globalThis as any).monaco) {\n Promise.resolve((globalThis as any).monaco);\n }\n\n return asyncLoadJs(`https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.26.1/min/vs/loader.min.js`).then(() => {\n (globalThis as any).require.config({\n paths: { vs: `https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.26.1/min/vs` },\n });\n return new Promise((resolve) => {\n (globalThis as any).require(['vs/editor/editor.main'], () => {\n resolve((globalThis as any).monaco);\n });\n });\n });\n};\n\nconst toString = (v: any, language: string): string => {\n let value = '';\n if (typeof v !== 'string') {\n value = serialize(v, {\n space: 2,\n unsafe: true,\n }).replace(/\"(\\w+)\":\\s/g, '$1: ');\n } else {\n value = v;\n }\n if (language === 'javascript' && value.startsWith('{') && value.endsWith('}')) {\n value = `(${value})`;\n }\n return value;\n};\n\nexport default defineComponent({\n name: 'magic-code-editor',\n\n props: {\n initValues: {\n type: [String, Object],\n },\n\n modifiedValues: {\n type: [String, Object],\n },\n\n type: {\n type: [String],\n default: () => '',\n },\n\n language: {\n type: [String],\n default: () => 'javascript',\n },\n },\n\n emits: ['inited', 'save'],\n\n setup(props, { emit }) {\n let vsEditor: any = null;\n const values = ref('');\n const loading = ref(false);\n const codeEditor = ref<HTMLDivElement>();\n\n const setEditorValue = (v: any, m: any) => {\n values.value = toString(v, props.language);\n\n if (props.type === 'diff') {\n const originalModel = (globalThis as any).monaco.editor.createModel(values.value, 'text/javascript');\n const modifiedModel = (globalThis as any).monaco.editor.createModel(\n toString(m, props.language),\n 'text/javascript',\n );\n\n return vsEditor.setModel({\n original: originalModel,\n modified: modifiedModel,\n });\n }\n\n return vsEditor.setValue?.(values.value);\n };\n\n const resizeHandler = () => {\n vsEditor?.layout();\n };\n\n const getEditorValue = () => vsEditor.getValue?.() || '';\n\n const init = async () => {\n if (!codeEditor.value) return;\n\n vsEditor = (globalThis as any).monaco.editor[props.type === 'diff' ? 'createDiffEditor' : 'create'](\n codeEditor.value,\n {\n value: values.value,\n language: props.language,\n tabSize: 2,\n theme: 'vs-dark',\n fontFamily: 'dm, Menlo, Monaco, \"Courier New\", monospace',\n fontSize: 15,\n formatOnPaste: true,\n },\n );\n\n setEditorValue(props.initValues, props.modifiedValues);\n\n loading.value = false;\n\n emit('inited', vsEditor);\n\n codeEditor.value.addEventListener('keydown', (e) => {\n if (e.keyCode === 83 && (navigator.platform.match('Mac') ? e.metaKey : e.ctrlKey)) {\n e.preventDefault();\n emit('save', getEditorValue());\n }\n });\n\n if (props.type !== 'diff') {\n vsEditor.onDidBlurEditorWidget(() => {\n emit('save', getEditorValue());\n });\n }\n\n globalThis.addEventListener('resize', resizeHandler);\n };\n\n watch(\n () => props.initValues,\n (v, preV) => {\n if (vsEditor && v !== preV) {\n setEditorValue(props.initValues, props.modifiedValues);\n }\n },\n {\n deep: true,\n immediate: true,\n },\n );\n\n onMounted(async () => {\n loading.value = true;\n\n await initEditor();\n if (!(globalThis as any).monaco) {\n const interval = setInterval(() => {\n if ((globalThis as any).monaco) {\n clearInterval(interval);\n init();\n }\n }, 300);\n } else {\n init();\n }\n });\n\n onUnmounted(() => {\n globalThis.removeEventListener('resize', resizeHandler);\n });\n\n return {\n values,\n loading,\n codeEditor,\n\n getEditor() {\n return vsEditor;\n },\n\n setEditorValue,\n\n focus() {\n vsEditor.focus();\n },\n };\n },\n});\n</script>\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InstallOptions } from '@editor/type';\n\nlet $TMAGIC_EDITOR: InstallOptions = {} as any;\n\nconst setConfig = (option: InstallOptions): void => {\n $TMAGIC_EDITOR = option;\n};\n\nconst getConfig = (key: keyof InstallOptions): unknown => $TMAGIC_EDITOR[key];\n\nexport { getConfig, setConfig };\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { cloneDeep } from 'lodash-es';\n\nexport class UndoRedo<T = any> {\n private elementList: T[];\n private listCursor: number;\n private listMaxSize: number;\n\n constructor(listMaxSize = 200) {\n const minListMaxSize = 2;\n this.elementList = [];\n this.listCursor = 0;\n this.listMaxSize = listMaxSize > minListMaxSize ? listMaxSize : minListMaxSize;\n }\n\n public pushElement(element: T): void {\n // 新元素进来时,把游标之外的元素全部丢弃,并把新元素放进来\n this.elementList.splice(this.listCursor, this.elementList.length - this.listCursor, cloneDeep(element));\n this.listCursor += 1;\n // 如果list中的元素超过maxSize,则移除第一个元素\n if (this.elementList.length > this.listMaxSize) {\n this.elementList.shift();\n this.listCursor -= 1;\n }\n }\n\n public canUndo(): boolean {\n return this.listCursor > 1;\n }\n\n // 返回undo后的当前元素\n public undo(): T | null {\n if (!this.canUndo()) {\n return null;\n }\n this.listCursor -= 1;\n return this.getCurrentElement();\n }\n\n public canRedo() {\n return this.elementList.length > this.listCursor;\n }\n\n // 返回redo后的当前元素\n public redo(): T | null {\n if (!this.canRedo()) {\n return null;\n }\n this.listCursor += 1;\n return this.getCurrentElement();\n }\n\n public getCurrentElement(): T | null {\n if (this.listCursor < 1) {\n return null;\n }\n return cloneDeep(this.elementList[this.listCursor - 1]);\n }\n}\n","/**\n * @param {Array} middleware\n * @return {Function}\n */\nexport const compose = (middleware: Function[]) => {\n if (!Array.isArray(middleware)) throw new TypeError('Middleware 必须是一个数组!');\n for (const fn of middleware) {\n if (typeof fn !== 'function') throw new TypeError('Middleware 必须由函数组成!');\n }\n\n /**\n * @param {Object} args\n * @return {Promise}\n * @api public\n */\n return (args: any[], next?: Function) => {\n // last called middleware #\n let index = -1;\n return dispatch(0);\n function dispatch(i: number): Promise<void> {\n if (i <= index) return Promise.reject(new Error('next() 被多次调用'));\n index = i;\n let fn = middleware[i];\n if (i === middleware.length && next) fn = next;\n if (!fn) return Promise.resolve();\n try {\n return Promise.resolve(fn(...args, dispatch.bind(null, i + 1)));\n } catch (err) {\n return Promise.reject(err);\n }\n }\n };\n};\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { EventEmitter } from 'events';\n\nimport { compose } from '@editor/utils/compose';\n\nconst methodName = (prefix: string, name: string) => `${prefix}${name[0].toUpperCase()}${name.substring(1)}`;\n\nconst isError = (error: any): boolean => Object.prototype.toString.call(error) === '[object Error]';\n\n/**\n * 提供两种方式对Class进行扩展\n * 方法1:\n * 给Class中的每个方法都添加before after两个钩子\n * 给Class添加一个usePlugin方法,use方法可以传入一个包含before或者after方法的对象\n *\n * 例如:\n * Class EditorService extends BaseService {\n * constructor() {\n * super(['add']);\n * }\n * add(value) { return result; }\n * };\n *\n * const editorService = new EditorService();\n *\n * editorService.usePlugin({\n * beforeAdd(value) { return [value] },\n * afterAdd(value, result) {},\n * });\n *\n * editorService.add(); 最终会变成 () => {\n * editorService.beforeAdd();\n * editorService.add();\n * editorService.afterAdd();\n * }\n *\n * 调用时的参数会透传到before方法的参数中, 然后before的return 会作为原方法的参数和after的参数,after最后一个参数则是原方法的return值;\n * 如需终止后续方法调用可以return new Error();\n *\n * 方法2:\n * 给Class中的每个方法都添加中间件\n * 给Class添加一个use方法,use方法可以传入一个包含源对象方法名作为key值的对象\n *\n * 例如:\n * Class EditorService extends BaseService {\n * constructor() {\n * super(['add']);\n * }\n * add(value) { return result; }\n * };\n *\n * const editorService = new EditorService();\n * editorService.use({\n * add(value, next) { console.log(value); next() },\n * });\n */\nexport default class extends EventEmitter {\n private pluginOptionsList: Record<string, Function[]> = {};\n private middleware: Record<string, Function[]> = {};\n\n constructor(methods: string[]) {\n super();\n\n methods.forEach((propertyName: string) => {\n const scope = this as any;\n\n const sourceMethod = scope[propertyName];\n\n const beforeMethodName = methodName('before', propertyName);\n const afterMethodName = methodName('after', propertyName);\n\n this.pluginOptionsList[beforeMethodName] = [];\n this.pluginOptionsList[afterMethodName] = [];\n this.middleware[propertyName] = [];\n\n const fn = compose(this.middleware[propertyName]);\n Object.defineProperty(scope, propertyName, {\n value: async (...args: any[]) => {\n let beforeArgs = args;\n\n for (const beforeMethod of this.pluginOptionsList[beforeMethodName]) {\n let beforeReturnValue = (await beforeMethod(...beforeArgs)) || [];\n\n if (isError(beforeReturnValue)) throw beforeReturnValue;\n\n if (!Array.isArray(beforeReturnValue)) {\n beforeReturnValue = [beforeReturnValue];\n }\n\n beforeArgs = beforeArgs.map((v: any, index: number) => {\n if (typeof beforeReturnValue[index] === 'undefined') return v;\n return beforeReturnValue[index];\n });\n }\n\n let returnValue = await fn(beforeArgs, sourceMethod.bind(scope));\n\n for (const afterMethod of this.pluginOptionsList[afterMethodName]) {\n returnValue = await afterMethod(...beforeArgs, returnValue);\n\n if (isError(returnValue)) throw returnValue;\n }\n\n return returnValue;\n },\n });\n });\n }\n\n public use(options: Record<string, Function>) {\n Object.entries(options).forEach(([methodName, method]: [string, Function]) => {\n if (typeof method === 'function') this.middleware[methodName].push(method);\n });\n }\n\n public usePlugin(options: Record<string, Function>) {\n Object.entries(options).forEach(([methodName, method]: [string, Function]) => {\n if (typeof method === 'function') this.pluginOptionsList[methodName].push(method);\n });\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { reactive } from 'vue';\n\nimport { Id, MPage } from '@tmagic/schema';\n\nimport { UndoRedo } from '@editor/utils/undo-redo';\n\nimport BaseService from './BaseService';\n\nexport interface StepValue {\n data: MPage;\n modifiedNodeIds: Map<Id, Id>;\n nodeId: Id;\n}\n\nexport interface HistoryState {\n pageId?: Id;\n pageSteps: Record<Id, UndoRedo<StepValue>>;\n canRedo: boolean;\n canUndo: boolean;\n}\n\nclass History extends BaseService {\n public state = reactive<HistoryState>({\n pageSteps: {},\n pageId: undefined,\n canRedo: false,\n canUndo: false,\n });\n\n constructor() {\n super([]);\n\n this.on('change', this.setCanUndoRedo);\n }\n\n public changePage(page: MPage): void {\n if (!page) return;\n\n this.state.pageId = page.id;\n\n if (!this.state.pageSteps[this.state.pageId]) {\n const undoRedo = new UndoRedo<StepValue>();\n\n undoRedo.pushElement({\n data: page,\n modifiedNodeIds: new Map(),\n nodeId: page.id,\n });\n\n this.state.pageSteps[this.state.pageId] = undoRedo;\n }\n\n this.setCanUndoRedo();\n }\n\n public empty(): void {\n this.state.pageId = undefined;\n this.state.pageSteps = {};\n this.state.canRedo = false;\n this.state.canUndo = false;\n }\n\n public push(state: StepValue): StepValue | null {\n const undoRedo = this.getUndoRedo();\n if (!undoRedo) return null;\n undoRedo.pushElement(state);\n this.emit('change', state);\n return state;\n }\n\n public undo(): StepValue | null {\n const undoRedo = this.getUndoRedo();\n if (!undoRedo) return null;\n const state = undoRedo.undo();\n this.emit('change', state);\n return state;\n }\n\n public redo(): StepValue | null {\n const undoRedo = this.getUndoRedo();\n if (!undoRedo) return null;\n const state = undoRedo.redo();\n this.emit('change', state);\n return state;\n }\n\n public destroy(): void {\n this.empty();\n this.removeAllListeners();\n }\n\n private getUndoRedo() {\n if (!this.state.pageId) return null;\n return this.state.pageSteps[this.state.pageId];\n }\n\n private setCanUndoRedo(): void {\n const undoRedo = this.getUndoRedo();\n this.state.canRedo = undoRedo?.canRedo() || false;\n this.state.canUndo = undoRedo?.canUndo() || false;\n }\n}\n\nexport type HistoryService = History;\n\nexport default new History();\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { reactive } from 'vue';\nimport { cloneDeep } from 'lodash-es';\n\nimport type { FormConfig } from '@tmagic/form';\nimport type { MComponent, MNode } from '@tmagic/schema';\nimport { toLine } from '@tmagic/utils';\n\nimport type { PropsState } from '@editor/type';\nimport { DEFAULT_CONFIG, fillConfig, getDefaultPropsValue } from '@editor/utils/props';\n\nimport BaseService from './BaseService';\n\nclass Props extends BaseService {\n private state = reactive<PropsState>({\n propsConfigMap: {},\n propsValueMap: {},\n });\n\n constructor() {\n super(['setPropsConfig', 'getPropsConfig', 'setPropsValue', 'getPropsValue']);\n }\n\n public setPropsConfigs(configs: Record<string, FormConfig>) {\n Object.keys(configs).forEach((type: string) => {\n this.setPropsConfig(toLine(type), configs[type]);\n });\n this.emit('props-configs-change');\n }\n\n /**\n * 为指定类型组件设置组件属性表单配置\n * @param type 组件类型\n * @param config 组件属性表单配置\n */\n public setPropsConfig(type: string, config: FormConfig) {\n this.state.propsConfigMap[type] = fillConfig(Array.isArray(config) ? config : [config]);\n }\n\n /**\n * 获取指点类型的组件属性表单配置\n * @param type 组件类型\n * @returns 组件属性表单配置\n */\n public async getPropsConfig(type: string): Promise<FormConfig> {\n if (type === 'area') {\n return await this.getPropsConfig('button');\n }\n\n return cloneDeep(this.state.propsConfigMap[type] || DEFAULT_CONFIG);\n }\n\n public setPropsValues(values: Record<string, MNode>) {\n Object.keys(values).forEach((type: string) => {\n this.setPropsValue(toLine(type), values[type]);\n });\n }\n\n /**\n * 为指点类型组件设置组件初始值\n * @param type 组件类型\n * @param value 组件初始值\n */\n public setPropsValue(type: string, value: MNode) {\n this.state.propsValueMap[type] = value;\n }\n\n /**\n * 获取指定类型的组件初始值\n * @param type 组件类型\n * @returns 组件初始值\n */\n public async getPropsValue(type: string) {\n if (type === 'area') {\n const value = (await this.getPropsValue('button')) as MComponent;\n value.className = 'action-area';\n value.text = '';\n if (value.style) {\n value.style.backgroundColor = 'rgba(255, 255, 255, 0)';\n }\n return value;\n }\n\n return cloneDeep({\n ...getDefaultPropsValue(type),\n ...(this.state.propsValueMap[type] || {}),\n });\n }\n}\n\nexport type PropsService = Props;\n\nexport default new Props();\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Component } from 'vue';\n\nimport { FormConfig } from '@tmagic/form';\nimport { Id, MApp, MContainer, MNode, MPage } from '@tmagic/schema';\nimport StageCore from '@tmagic/stage';\n\nimport type { ComponentListService } from '@editor/services/componentList';\nimport type { EditorService } from '@editor/services/editor';\nimport type { EventsService } from '@editor/services/events';\nimport type { HistoryService } from '@editor/services/history';\nimport type { PropsService } from '@editor/services/props';\nimport type { UiService } from '@editor/services/ui';\n\nexport type BeforeAdd = (config: MNode, parent: MContainer) => Promise<MNode> | MNode;\nexport type GetConfig = (config: FormConfig) => Promise<FormConfig> | FormConfig;\n\nexport interface InstallOptions {\n [key: string]: any;\n}\n\nexport interface Services {\n editorService: EditorService;\n historyService: HistoryService;\n eventsService: EventsService;\n propsService: PropsService;\n componentListService: ComponentListService;\n uiService: UiService;\n}\n\nexport interface StoreState {\n root: MApp | null;\n page: MPage | null;\n parent: MContainer | null;\n node: MNode | null;\n stage: StageCore | null;\n modifiedNodeIds: Map<Id, Id>;\n}\n\nexport interface PropsState {\n propsConfigMap: Record<string, FormConfig>;\n propsValueMap: Record<string, MNode>;\n}\n\nexport interface ComponentGroupState {\n list: ComponentGroup[];\n}\n\nexport interface SetColumnWidth {\n left?: number;\n center?: number | 'auto';\n right?: number;\n}\n\nexport interface GetColumnWidth {\n left: number;\n center: number;\n right: number;\n}\n\nexport interface UiState {\n /** 当前点击画布是否触发选中,true: 不触发,false: 触发,默认为false */\n uiSelectMode: boolean;\n /** 是否显示整个配置源码, true: 显示, false: 不显示,默认为false */\n showSrc: boolean;\n /** 画布显示放大倍数,默认为 1 */\n zoom: number;\n /** 画布顶层div的样式,可用于改变画布的大小 */\n stageStyle: Record<string, string | number>;\n /** 编辑器列布局每一列的宽度,分为左中右三列 */\n columnWidth: GetColumnWidth;\n /** 是否显示画布参考线,true: 显示,false: 不显示,默认为true */\n showGuides: boolean;\n /** 是否显示标尺,true: 显示,false: 不显示,默认为true */\n showRule: boolean;\n}\n\nexport interface EditorNodeInfo {\n node?: MNode;\n parent?: MContainer;\n page?: MPage;\n}\n\nexport interface AddMNode {\n type: string;\n name?: string;\n [key: string]: any;\n}\n\n/**\n * 菜单按钮\n */\nexport interface MenuButton {\n /**\n * 按钮类型\n * button: 只有文字不带边框的按钮\n * text: 纯文本\n * dropdown: 下拉菜单\n * divider: 分隔线\n * zoom: 放大缩小\n */\n type: 'button' | 'dropdown' | 'text' | 'divider' | 'zoom';\n /** 展示的文案 */\n text?: string;\n /** 鼠标悬浮是显示的气泡中的文案 */\n tooltip?: string;\n /** element-plus icon class */\n icon?: string | Component<{}, {}, any>;\n /** 是否置灰,默认为false */\n disabled?: boolean | ((data?: Services) => boolean);\n /** 是否显示,默认为true */\n display?: boolean | ((data?: Services) => boolean);\n /** type为button/dropdown时点击运行的方法 */\n handler?: (data?: Services) => Promise<any> | any;\n /** type为dropdown时,下拉的菜单列表 */\n items?: {\n /** 展示的文案 */\n text: string;\n /** 点击运行的方法 */\n handler(data: Services): any;\n }[];\n}\n\nexport interface MenuComponent {\n type: 'component';\n /** Vue3组件 */\n component: any;\n /** 传入组件的props对象 */\n props?: Record<string, any>;\n /** 组件监听的事件对象,如:{ click: () => { console.log('click'); } } */\n listeners?: Record<string, Function>;\n slots?: Record<string, any>;\n /** 是否显示,默认为true */\n display?: boolean | ((data?: Services) => Promise<boolean> | boolean);\n}\n\n/**\n * '/': 分隔符\n * 'delete': 删除按钮\n * 'undo': 撤销按钮\n * 'redo': 恢复按钮\n * 'zoom-in': 放大按钮\n * 'zoom-out': 缩小按钮\n */\nexport type MenuItem =\n | '/'\n | 'delete'\n | 'undo'\n | 'redo'\n | 'zoom'\n | 'zoom-in'\n | 'zoom-out'\n | 'guides'\n | 'rule'\n | MenuButton\n | MenuComponent;\n\n/** 工具栏 */\nexport interface MenuBarData {\n /** 顶部工具栏左边项 */\n left?: MenuItem[];\n /** 顶部工具栏中间项 */\n center?: MenuItem[];\n /** 顶部工具栏右边项 */\n right?: MenuItem[];\n}\n\nexport interface SideComponent extends MenuComponent {\n /** 显示文案 */\n text: string;\n /** element-plus icon class */\n icon: Component<{}, {}, any>;\n}\n\n/**\n * component-list: 组件列表\n * layer: 已选组件树\n */\nexport type SideItem = 'component-list' | 'layer' | SideComponent;\n\n/** 工具栏 */\nexport interface SideBarData {\n /** 容器类型 */\n type: 'tabs';\n /** 默认激活的内容 */\n status: string;\n /** panel列表 */\n items: SideItem[];\n}\n\nexport interface ComponentItem {\n /** 显示文案 */\n text: string;\n /** 组件类型 */\n type: string;\n /** element-plus icon class */\n icon?: string | Component;\n [key: string]: any;\n}\n\nexport interface ComponentGroup {\n /** 显示文案 */\n title: string;\n /** 组内列表 */\n items: ComponentItem[];\n}\n\nexport enum LayerOffset {\n TOP = 'top',\n BOTTOM = 'bottom',\n}\n\n/** 容器布局 */\nexport enum Layout {\n FLEX = 'flex',\n FIXED = 'fixed',\n RELATIVE = 'relative',\n ABSOLUTE = 'absolute',\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { cloneDeep, random } from 'lodash-es';\n\nimport { Id, MApp, MContainer, MNode, MPage } from '@tmagic/schema';\nimport { getNodePath, isPop } from '@tmagic/utils';\n\nimport { Layout } from '@editor/type';\n\nexport const COPY_STORAGE_KEY = '$MagicEditorCopyData';\n\nexport const generateId = (type: string | number): string => `${type}_${random(10000, false)}`;\n\n/**\n * 获取所有页面配置\n * @param app DSL跟节点\n * @returns 所有页面配置\n */\nexport const getPageList = (app: MApp): MPage[] => {\n if (app.items && Array.isArray(app.items)) {\n return app.items.filter((item: MPage) => item.type === 'page');\n }\n return [];\n};\n\n/**\n * 获取所有页面名称\n * @param pages 所有页面配置\n * @returns 所有页面名称\n */\nexport const getPageNameList = (pages: MPage[]): string[] => pages.map((page: MPage) => page.name || 'index');\n\n/**\n * 新增页面时,生成页面名称\n * @param {Object} pageNameList 所有页面名称\n * @returns {string}\n */\nexport const generatePageName = (pageNameList: string[]): string => {\n let pageLength = pageNameList.length;\n\n if (!pageLength) return 'index';\n\n let pageName = `page_${pageLength}`;\n while (pageNameList.includes(pageName)) {\n pageLength += 1;\n pageName = `page_${pageLength}`;\n }\n\n return pageName;\n};\n\n/**\n * 新增页面时,生成页面名称\n * @param {Object} app 所有页面配置\n * @returns {string}\n */\nexport const generatePageNameByApp = (app: MApp): string => generatePageName(getPageNameList(getPageList(app)));\n\n/**\n * 复制页面时,需要把组件下关联的弹窗id换测复制出来的弹窗的id\n * @param {number} oldId 复制的源弹窗id\n * @param {number} popId 新的弹窗id\n * @param {Object} pageConfig 页面配置\n */\nconst updatePopId = (oldId: Id, popId: Id, pageConfig: MPage) => {\n pageConfig.items?.forEach((config) => {\n if (config.pop === oldId) {\n config.pop = popId;\n return;\n }\n\n if (config.popId === oldId) {\n config.popId = popId;\n return;\n }\n\n if (Array.isArray(config.items)) {\n updatePopId(oldId, popId, config as MPage);\n }\n });\n};\n\n/**\n * 将组件与组件的子元素配置中的id都设置成一个新的ID\n * @param {Object} config 组件配置\n */\n/* eslint no-param-reassign: [\"error\", { \"props\": false }] */\nexport const setNewItemId = (config: MNode, parent?: MPage) => {\n const oldId = config.id;\n\n config.id = generateId(config.type);\n config.name = `${config.name?.replace(/_(\\d+)$/, '')}_${config.id}`;\n\n // 只有弹窗在页面下的一级子元素才有效\n if (isPop(config) && parent?.type === 'page') {\n updatePopId(oldId, config.id, parent);\n }\n\n if (config.items && Array.isArray(config.items)) {\n config.items.forEach((item) => setNewItemId(item, config as MPage));\n }\n};\n\n/**\n * @param {Object} node\n * @returns {boolean}\n */\nexport const isFixed = (node: MNode): boolean => node.style?.position === 'fixed';\n\nexport const getNodeIndex = (node: MNode, parent: MContainer): number => {\n const items = parent?.items || [];\n return items.findIndex((item: MNode) => `${item.id}` === `${node.id}`);\n};\n\nexport const toRelative = (node: MNode) => {\n node.style = {\n ...(node.style || {}),\n position: 'relative',\n top: 0,\n left: 0,\n };\n return node;\n};\n\nexport const initPosition = (node: MNode, layout: Layout) => {\n if (layout === Layout.ABSOLUTE) {\n node.style = {\n position: 'absolute',\n ...(node.style || {}),\n };\n return node;\n }\n\n if (layout === Layout.RELATIVE) {\n return toRelative(node);\n }\n\n return node;\n};\n\nexport const setLayout = (node: MNode, layout: Layout) => {\n node.items?.forEach((child: MNode) => {\n if (isPop(child)) return;\n\n child.style = child.style || {};\n\n // 是 fixed 不做处理\n if (child.style.position === 'fixed') return;\n\n if (layout !== Layout.RELATIVE) {\n child.style.position = 'absolute';\n } else {\n toRelative(child);\n child.style.right = 'auto';\n child.style.bottom = 'auto';\n }\n });\n return node;\n};\n\nexport const change2Fixed = (node: MNode, root: MApp) => {\n const path = getNodePath(node.id, root.items);\n const offset = {\n left: 0,\n top: 0,\n };\n\n path.forEach((value) => {\n offset.left = offset.left + globalThis.parseFloat(value.style?.left || 0);\n offset.top = offset.top + globalThis.parseFloat(value.style?.top || 0);\n });\n\n node.style = {\n ...(node.style || {}),\n ...offset,\n };\n return node;\n};\n\nexport const Fixed2Other = async (node: MNode, root: MApp, getLayout: (node: MNode) => Promise<Layout>) => {\n const path = getNodePath(node.id, root.items);\n const cur = path.pop();\n const offset = {\n left: cur?.style?.left || 0,\n top: cur?.style?.top || 0,\n };\n\n path.forEach((value) => {\n offset.left = offset.left - globalThis.parseFloat(value.style?.left || 0);\n offset.top = offset.top - globalThis.parseFloat(value.style?.top || 0);\n });\n\n const parent = path.pop();\n if (!parent) {\n return toRelative(node);\n }\n\n const layout = await getLayout(parent);\n if (layout !== Layout.RELATIVE) {\n node.style = {\n ...(node.style || {}),\n ...offset,\n position: 'absolute',\n };\n return node;\n }\n\n return toRelative(node);\n};\n\nexport const defaults = (object: any, source: any) => {\n let o = source;\n if (Array.isArray(object)) {\n o = object;\n }\n\n Object.entries(o).forEach(([key, value]: [string, any]) => {\n if (typeof object[key] === 'undefined') {\n object[key] = value;\n return;\n }\n\n if (value && typeof value !== 'string' && Object.keys(value).length) {\n object[key] = defaults(cloneDeep(object[key]), value);\n }\n });\n return object;\n};\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const log = (...args: any[]) => {\n if (process.env.NODE_ENV === 'development') {\n console.log('magic editor: ', ...args);\n }\n};\n\nexport const info = (...args: any[]) => {\n if (process.env.NODE_ENV === 'development') {\n console.info('magic editor: ', ...args);\n }\n};\n\nexport const warn = (...args: any[]) => {\n if (process.env.NODE_ENV === 'development') {\n console.warn('magic editor: ', ...args);\n }\n};\n\nexport const debug = (...args: any[]) => {\n if (process.env.NODE_ENV === 'development') {\n console.debug('magic editor: ', ...args);\n }\n};\n\nexport const error = (...args: any[]) => {\n if (process.env.NODE_ENV === 'development') {\n console.error('magic editor: ', ...args);\n }\n};\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { reactive, toRaw } from 'vue';\nimport { cloneDeep } from 'lodash-es';\nimport serialize from 'serialize-javascript';\n\nimport type { Id, MApp, MComponent, MContainer, MNode, MPage } from '@tmagic/schema';\nimport type StageCore from '@tmagic/stage';\nimport { getNodePath, isPop } from '@tmagic/utils';\n\nimport historyService, { StepValue } from '@editor/services/history';\nimport propsService from '@editor/services/props';\nimport type { AddMNode, EditorNodeInfo, StoreState } from '@editor/type';\nimport { LayerOffset, Layout } from '@editor/type';\nimport {\n change2Fixed,\n COPY_STORAGE_KEY,\n defaults,\n Fixed2Other,\n getNodeIndex,\n initPosition,\n isFixed,\n setLayout,\n setNewItemId,\n} from '@editor/utils/editor';\nimport { log } from '@editor/utils/logger';\n\nimport BaseService from './BaseService';\n\nclass Editor extends BaseService {\n private isHistoryStateChange = false;\n\n private state = reactive<StoreState>({\n root: null,\n page: null,\n parent: null,\n node: null,\n stage: null,\n modifiedNodeIds: new Map(),\n });\n\n constructor() {\n super([\n 'getLayout',\n 'select',\n 'add',\n 'remove',\n 'update',\n 'sort',\n 'copy',\n 'paste',\n 'alignCenter',\n 'moveLayer',\n 'undo',\n 'redo',\n ]);\n }\n\n /**\n * 设置当前指点节点配置\n * @param name 'root' | 'page' | 'parent' | 'node'\n * @param value MNode\n * @returns MNode\n */\n public set<T = MNode>(name: keyof StoreState, value: T) {\n this.state[name] = value as any;\n log('store set ', name, ' ', value);\n\n if (name === 'root') {\n this.emit('root-change', value);\n }\n }\n\n /**\n * 获取当前指点节点配置\n * @param name 'root' | 'page' | 'parent' | 'node'\n * @returns MNode\n */\n public get<T = MNode>(name: keyof StoreState): T {\n return (this.state as any)[name];\n }\n\n /**\n * 根据id获取组件、组件的父组件以及组件所属的页面节点\n * @param {number | string} id 组件id\n * @returns {EditorNodeInfo}\n */\n public getNodeInfo(id: Id): EditorNodeInfo {\n const root = this.get<MApp | null>('root');\n if (!root) return {};\n\n if (id === root.id) {\n return { node: root };\n }\n\n const path = getNodePath(id, root.items);\n\n if (!path.length) return {};\n\n path.unshift(root);\n const info: EditorNodeInfo = {};\n\n info.node = path[path.length - 1] as MComponent;\n info.parent = path[path.length - 2] as MContainer;\n\n path.forEach((item) => {\n if (item.type === 'page') {\n info.page = item as MPage;\n return;\n }\n });\n\n return info;\n }\n\n /**\n * 根据ID获取指点节点配置\n * @param id 组件ID\n * @returns 组件节点配置\n */\n public getNodeById(id: Id): MNode | undefined {\n const { node } = this.getNodeInfo(id);\n return node;\n }\n\n /**\n * 根据ID获取指点节点的父节点配置\n * @param id 组件ID\n * @returns 指点组件的父节点配置\n */\n public getParentById(id: Id): MContainer | undefined {\n if (!this.get<MApp | null>('root')) return;\n const { parent } = this.getNodeInfo(id);\n return parent;\n }\n\n /**\n * 只有容器拥有布局\n */\n public async getLayout(node: MNode): Promise<Layout> {\n if (node.layout) {\n return node.layout;\n }\n\n // 如果该节点没有设置position,则认为是流式布局,例如获取root的布局时\n if (!node.style?.position) {\n return Layout.RELATIVE;\n }\n\n return Layout.ABSOLUTE;\n }\n\n /**\n * 选中指点节点(将指点节点设置成当前选中状态)\n * @param config 指点节点配置或者ID\n * @returns 当前选中的节点配置\n */\n public async select(config: MNode | Id): Promise<MNode> {\n let id: Id;\n if (typeof config === 'string' || typeof config === 'number') {\n id = config;\n } else {\n id = config.id;\n }\n if (!id) {\n throw new Error('没有ID,无法选中');\n }\n\n const { node, parent, page } = this.getNodeInfo(id);\n if (!node) throw new Error('获取不到组件信息');\n\n this.set('node', node);\n this.set('page', page || null);\n this.set('parent', parent || null);\n\n if (page) {\n historyService.changePage(toRaw(page));\n } else {\n historyService.empty();\n }\n\n return node;\n }\n\n /**\n * 向指点容器添加组件节点\n * @param addConfig 将要添加的组件节点配置\n * @param parent 要添加到的容器组件节点配置,如果不设置,默认为当前选中的组件的父节点\n * @returns 添加后的节点\n */\n public async add({ type, ...config }: AddMNode, parent?: MContainer | null): Promise<MNode> {\n const curNode = this.get<MContainer>('node');\n\n let parentNode: MNode | undefined;\n\n if (type === 'page') {\n parentNode = this.get<MApp>('root');\n // 由于支持中间件扩展,在parent参数为undefined时,parent会变成next函数\n } else if (parent && typeof parent !== 'function') {\n parentNode = parent;\n } else if (curNode.items) {\n parentNode = curNode;\n } else {\n parentNode = this.getParentById(curNode.id);\n }\n\n if (!parentNode) throw new Error('未找到父元素');\n\n const layout = await this.getLayout(parentNode);\n const newNode = initPosition({ ...toRaw(await propsService.getPropsValue(type)), ...config }, layout);\n\n if ((parentNode?.type === 'app' || curNode.type === 'app') && newNode.type !== 'page') {\n throw new Error('app下不能添加组件');\n }\n\n parentNode?.items?.push(newNode);\n\n await this.get<StageCore>('stage')?.add({ config: cloneDeep(newNode), root: cloneDeep(this.get('root')) });\n\n await this.select(newNode);\n\n this.addModifiedNodeId(newNode.id);\n this.pushHistoryState();\n\n return newNode;\n }\n\n /**\n * 删除组件\n * @param {Object} node\n * @return {Object} 删除的组件配置\n */\n public async remove(node: MNode): Promise<MNode | void> {\n if (!node?.id) return;\n\n const root = this.get<MApp | null>('root');\n\n if (!root) throw new Error('没有root');\n\n const { parent, node: curNode } = this.getNodeInfo(node.id);\n\n if (!parent || !curNode) throw new Error('找不要删除的节点');\n\n const index = getNodeIndex(curNode, parent);\n\n if (typeof index !== 'number' || index === -1) throw new Error('找不要删除的节点');\n\n parent.items?.splice(index, 1);\n this.get<StageCore>('stage')?.remove({ id: node.id, root: this.get('root') });\n\n if (node.type === 'page') {\n await this.select(root.items[0] || root);\n } else {\n await this.select(parent);\n }\n\n this.addModifiedNodeId(parent.id);\n this.pushHistoryState();\n\n return node;\n }\n\n /**\n * 更新节点\n * @param config 新的节点配置,配置中需要有id信息\n * @returns 更新后的节点配置\n */\n public async update(config: MNode): Promise<MNode> {\n if (!config?.id) throw new Error('没有配置或者配置缺少id值');\n\n const info = this.getNodeInfo(config.id);\n\n if (!info.node) throw new Error(`获取不到id为${config.id}的节点`);\n\n const node = cloneDeep(toRaw(info.node));\n const { parent } = info;\n if (!parent) throw new Error('获取不到父级节点');\n\n let newConfig = await this.toggleFixedPosition(toRaw(config), node, this.get<MApp>('root'));\n\n defaults(newConfig, node);\n\n if (!newConfig.type) throw new Error('配置缺少type值');\n\n if (newConfig.type === 'app') {\n this.set('root', newConfig);\n return newConfig;\n }\n\n const parentNodeItems = parent.items;\n const index = getNodeIndex(newConfig, parent);\n\n if (!parentNodeItems || typeof index === 'undefined' || index === -1) throw new Error('更新的节点未找到');\n\n const newLayout = await this.getLayout(newConfig);\n const layout = await this.getLayout(node);\n if (newLayout !== layout) {\n newConfig = setLayout(newConfig, newLayout);\n }\n\n parentNodeItems[index] = newConfig;\n\n if (newConfig.id === this.get('node').id) {\n this.set('node', newConfig);\n }\n\n this.get<StageCore>('stage')?.update({ config: cloneDeep(newConfig), root: this.get('root') });\n\n if (newConfig.type === 'page') {\n this.set('page', newConfig);\n }\n\n this.addModifiedNodeId(newConfig.id);\n this.pushHistoryState();\n\n return newConfig;\n }\n\n /**\n * 将id为id1的组件移动到id为id2的组件位置上,例如:[1,2,3,4] -> sort(1,3) -> [2,1,3,4]\n * @param id1 组件ID\n * @param id2 组件ID\n * @returns void\n */\n public async sort(id1: Id, id2: Id): Promise<void> {\n const node = this.get<MNode>('node');\n const parent = cloneDeep(toRaw(this.get<MContainer>('parent')));\n const index2 = parent.items.findIndex((node: MNode) => `${node.id}` === `${id2}`);\n // 在 id1 的兄弟组件中若无 id2 则直接 return\n if (index2 < 0) return;\n const index1 = parent.items.findIndex((node: MNode) => `${node.id}` === `${id1}`);\n\n parent.items.splice(index2, 0, ...parent.items.splice(index1, 1));\n\n await this.update(parent);\n await this.select(node);\n\n this.addModifiedNodeId(parent.id);\n this.pushHistoryState();\n }\n\n /**\n * 将组将节点配置转化成string,然后存储到localStorage中\n * @param config 组件节点配置\n * @returns 组件节点配置\n */\n public async copy(config: MNode): Promise<void> {\n globalThis.localStorage.setItem(COPY_STORAGE_KEY, serialize(config));\n }\n\n /**\n * 从localStorage中获取节点,然后添加到当前容器中\n * @param position 如果设置,指定组件位置\n * @returns 添加后的组件节点配置\n */\n public async paste(position: { left?: number; top?: number } = {}): Promise<MNode | void> {\n const configStr = globalThis.localStorage.getItem(COPY_STORAGE_KEY);\n // eslint-disable-next-line prefer-const\n let config: any = {};\n if (!configStr) {\n return;\n }\n\n try {\n // eslint-disable-next-line no-eval\n eval(`config = ${configStr}`);\n } catch (e) {\n console.error(e);\n return;\n }\n\n setNewItemId(config, this.get('root'));\n if (config.style) {\n config.style = {\n ...config.style,\n ...position,\n };\n }\n\n return await this.add(config);\n }\n\n /**\n * 将指点节点设置居中\n * @param config 组件节点配置\n * @returns 当前组件节点配置\n */\n public async alignCenter(config: MNode): Promise<MNode | void> {\n const parent = this.get<MContainer>('parent');\n const node = this.get<MNode>('node');\n const layout = await this.getLayout(parent);\n if (layout === Layout.RELATIVE) {\n return;\n }\n\n if (parent.style?.width && node.style?.width) {\n node.style.left = (parent.style.width - node.style.width) / 2;\n }\n\n await this.update(node);\n this.get<StageCore>('stage')?.update({ config: cloneDeep(toRaw(node)), root: this.get('root') });\n this.addModifiedNodeId(config.id);\n this.pushHistoryState();\n\n return config;\n }\n\n /**\n * 移动当前选中节点位置\n * @param offset 偏移量\n */\n public async moveLayer(offset: number | LayerOffset): Promise<void> {\n const parent = this.get<MContainer>('parent');\n const node = this.get('node');\n const brothers: MNode[] = parent?.items || [];\n const index = brothers.findIndex((item) => `${item.id}` === `${node?.id}`);\n\n if (offset === LayerOffset.BOTTOM) {\n brothers.splice(brothers.length - 1, 0, brothers.splice(index, 1)[0]);\n } else if (offset === LayerOffset.TOP) {\n brothers.splice(0, 0, brothers.splice(index, 1)[0]);\n } else {\n brothers.splice(index + parseInt(`${offset}`, 10), 0, brothers.splice(index, 1)[0]);\n }\n\n this.get<StageCore>('stage')?.update({ config: cloneDeep(toRaw(parent)), root: this.get('root') });\n }\n\n /**\n * 撤销当前操作\n * @returns 上一次数据\n */\n public async undo(): Promise<StepValue | null> {\n const value = historyService.undo();\n await this.changeHistoryState(value);\n return value;\n }\n\n /**\n * 恢复到下一步\n * @returns 下一步数据\n */\n public async redo(): Promise<StepValue | null> {\n const value = historyService.redo();\n await this.changeHistoryState(value);\n return value;\n }\n\n public destroy() {\n this.removeAllListeners();\n this.set('root', null);\n this.set('node', null);\n this.set('page', null);\n this.set('parent', null);\n }\n\n public resetModifiedNodeId() {\n this.get<Map<Id, Id>>('modifiedNodeIds').clear();\n }\n\n private addModifiedNodeId(id: Id) {\n if (!this.isHistoryStateChange) {\n this.get<Map<Id, Id>>('modifiedNodeIds').set(id, id);\n }\n }\n\n private pushHistoryState() {\n const curNode = cloneDeep(toRaw(this.get('node')));\n if (!this.isHistoryStateChange) {\n historyService.push({\n data: cloneDeep(toRaw(this.get('page'))),\n modifiedNodeIds: this.get<Map<Id, Id>>('modifiedNodeIds'),\n nodeId: curNode.id,\n });\n }\n this.isHistoryStateChange = false;\n }\n\n private async changeHistoryState(value: StepValue | null) {\n if (!value) return;\n\n this.isHistoryStateChange = true;\n await this.update(value.data);\n this.set('modifiedNodeIds', value.modifiedNodeIds);\n setTimeout(() => value.nodeId && this.select(value.nodeId), 0);\n }\n\n private async toggleFixedPosition(dist: MNode, src: MNode, root: MApp) {\n let newConfig = cloneDeep(dist);\n\n if (!isPop(src) && newConfig.style?.position) {\n if (isFixed(newConfig) && !isFixed(src)) {\n newConfig = change2Fixed(newConfig, root);\n } else if (!isFixed(newConfig) && isFixed(src)) {\n newConfig = await Fixed2Other(newConfig, root, this.getLayout);\n }\n }\n\n return newConfig;\n }\n}\n\nexport type EditorService = Editor;\n\nexport default new Editor();\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { reactive } from 'vue';\nimport { cloneDeep } from 'lodash-es';\n\nimport { DEFAULT_EVENTS, DEFAULT_METHODS, EventOption } from '@tmagic/core';\nimport { toLine } from '@tmagic/utils';\n\nimport type { ComponentGroup } from '@editor/type';\n\nimport BaseService from './BaseService';\n\nconst eventMap: Record<string, EventOption[]> = reactive({});\nconst methodMap: Record<string, EventOption[]> = reactive({});\n\nclass Events extends BaseService {\n constructor() {\n super([]);\n }\n\n public init(componentGroupList: ComponentGroup[]) {\n componentGroupList.forEach((group) => {\n group.items.forEach((element) => {\n const type = toLine(element.type);\n if (!this.getEvent(type)) {\n this.setEvent(type, DEFAULT_EVENTS);\n }\n if (!this.getMethod(type)) {\n this.setMethod(type, DEFAULT_METHODS);\n }\n });\n });\n }\n\n public setEvents(events: Record<string, EventOption[]>) {\n Object.keys(events).forEach((type: string) => {\n this.setEvent(toLine(type), events[type] || []);\n });\n }\n\n public setEvent(type: string, events: EventOption[]) {\n eventMap[type] = [...DEFAULT_EVENTS, ...events];\n }\n\n public getEvent(type: string): EventOption[] {\n return cloneDeep(eventMap[type] || DEFAULT_EVENTS);\n }\n\n public setMethods(methods: Record<string, EventOption[]>) {\n Object.keys(methods).forEach((type: string) => {\n this.setMethod(toLine(type), methods[type] || []);\n });\n }\n\n public setMethod(type: string, method: EventOption[]) {\n methodMap[type] = [...DEFAULT_METHODS, ...method];\n }\n\n public getMethod(type: string) {\n return cloneDeep(methodMap[type] || DEFAULT_METHODS);\n }\n}\n\nexport type EventsService = Events;\n\nexport default new Events();\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FormConfig, FormState } from '@tmagic/form';\n\nimport editorService from '@editor/services/editor';\nimport eventsService from '@editor/services/events';\nimport { generateId } from '@editor/utils/editor';\n\n/**\n * 统一为组件属性表单加上事件、高级、样式配置\n * @param config 组件属性配置\n * @returns Object\n */\nexport const fillConfig = (config: FormConfig = []) => [\n {\n type: 'tab',\n items: [\n {\n title: '属性',\n labelWidth: '80px',\n items: [\n // 组件类型,必须要有\n {\n text: 'type',\n name: 'type',\n type: 'hidden',\n },\n // 组件id,必须要有\n {\n name: 'id',\n type: 'display',\n text: 'id',\n },\n {\n name: 'name',\n text: '组件名称',\n },\n ...config,\n ],\n },\n {\n title: '样式',\n labelWidth: '80px',\n items: [\n {\n name: 'style',\n items: [\n {\n type: 'fieldset',\n legend: '位置',\n items: [\n {\n name: 'position',\n type: 'checkbox',\n activeValue: 'fixed',\n inactiveValue: 'absolute',\n defaultValue: 'absolute',\n text: '固定定位',\n },\n {\n name: 'left',\n text: 'left',\n },\n {\n name: 'top',\n text: 'top',\n disabled: (vm: FormState, { model }: any) =>\n model.position === 'fixed' && model._magic_position === 'fixedBottom',\n },\n {\n name: 'right',\n text: 'right',\n },\n {\n name: 'bottom',\n text: 'bottom',\n disabled: (vm: FormState, { model }: any) =>\n model.position === 'fixed' && model._magic_position === 'fixedTop',\n },\n ],\n },\n {\n type: 'fieldset',\n legend: '盒子',\n items: [\n {\n name: 'width',\n text: '宽度',\n },\n {\n name: 'height',\n text: '高度',\n },\n ],\n },\n {\n type: 'fieldset',\n legend: '背景',\n items: [\n {\n name: 'backgroundImage',\n text: '背景图',\n },\n {\n name: 'backgroundColor',\n text: '背景颜色',\n type: 'colorPicker',\n },\n {\n name: 'backgroundRepeat',\n text: '背景图重复',\n type: 'select',\n defaultValue: 'no-repeat',\n options: [\n { text: 'repeat', value: 'repeat' },\n { text: 'repeat-x', value: 'repeat-x' },\n { text: 'repeat-y', value: 'repeat-y' },\n { text: 'no-repeat', value: 'no-repeat' },\n { text: 'inherit', value: 'inherit' },\n ],\n },\n {\n name: 'backgroundSize',\n text: '背景图大小',\n defaultValue: '100% 100%',\n },\n ],\n },\n ],\n },\n ],\n },\n {\n title: '事件',\n items: [\n {\n type: 'table',\n name: 'events',\n items: [\n {\n name: 'name',\n label: '事件名',\n type: 'select',\n options: (mForm: FormState, { formValue }: any) =>\n eventsService.getEvent(formValue.type).map((option) => ({\n text: option.label,\n value: option.value,\n })),\n },\n {\n name: 'to',\n label: '联动组件',\n type: 'ui-select',\n },\n {\n name: 'method',\n label: '动作',\n type: 'select',\n options: (mForm: FormState, { model }: any) => {\n const node = editorService.getNodeById(model.to);\n if (!node) return [];\n\n return eventsService.getMethod(node.type).map((option) => ({\n text: option.label,\n value: option.value,\n }));\n },\n },\n ],\n },\n ],\n },\n {\n title: '高级',\n labelWidth: '80px',\n items: [\n {\n type: 'code-link',\n name: 'created',\n text: 'created',\n formTitle: 'created',\n },\n ],\n },\n ],\n },\n];\n\n// 默认组件属性表单配置\nexport const DEFAULT_CONFIG: FormConfig = fillConfig([]);\n\n/**\n * 获取默认属性配置\n * @param type 组件类型\n * @returns Object\n */\nexport const getDefaultPropsValue = (type: string) => ({\n type,\n id: generateId(type),\n style: {},\n name: type,\n});\n","<template>\n <div class=\"m-editor-empty-panel\">\n <div class=\"m-editor-empty-content\">\n <div class=\"m-editor-empty-button\" @click=\"clickHandler\">\n <div>\n <el-icon><plus /></el-icon>\n </div>\n <p>新增页面</p>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, toRaw } from 'vue';\nimport { Plus } from '@element-plus/icons';\n\nimport { Services } from '@editor/type';\nimport { generatePageNameByApp } from '@editor/utils';\n\nexport default defineComponent({\n components: { Plus },\n\n setup() {\n const services = inject<Services>('services');\n\n return {\n clickHandler() {\n const { editorService } = services || {};\n\n if (!editorService) return;\n\n editorService.add({\n type: 'page',\n name: generatePageNameByApp(toRaw(editorService.get('root'))),\n });\n },\n };\n },\n});\n</script>\n","/*\nCopyright (c) 2018 Daybrush\n@name: @daybrush/utils\nlicense: MIT\nauthor: Daybrush\nrepository: https://github.com/daybrush/utils\n@version 1.6.0\n*/\n/**\n* @namespace\n* @name Consts\n*/\n\n/**\n* get string \"rgb\"\n* @memberof Color\n* @example\nimport {RGB} from \"@daybrush/utils\";\n\nconsole.log(RGB); // \"rgb\"\n*/\nvar RGB = \"rgb\";\n/**\n* get string \"rgba\"\n* @memberof Color\n* @example\nimport {RGBA} from \"@daybrush/utils\";\n\nconsole.log(RGBA); // \"rgba\"\n*/\n\nvar RGBA = \"rgba\";\n/**\n* get string \"hsl\"\n* @memberof Color\n* @example\nimport {HSL} from \"@daybrush/utils\";\n\nconsole.log(HSL); // \"hsl\"\n*/\n\nvar HSL = \"hsl\";\n/**\n* get string \"hsla\"\n* @memberof Color\n* @example\nimport {HSLA} from \"@daybrush/utils\";\n\nconsole.log(HSLA); // \"hsla\"\n*/\n\nvar HSLA = \"hsla\";\n/**\n* gets an array of color models.\n* @memberof Color\n* @example\nimport {COLOR_MODELS} from \"@daybrush/utils\";\n\nconsole.log(COLOR_MODELS); // [\"rgb\", \"rgba\", \"hsl\", \"hsla\"];\n*/\n\nvar COLOR_MODELS = [RGB, RGBA, HSL, HSLA];\n/**\n* get string \"function\"\n* @memberof Consts\n* @example\nimport {FUNCTION} from \"@daybrush/utils\";\n\nconsole.log(FUNCTION); // \"function\"\n*/\n\nvar FUNCTION = \"function\";\n/**\n* get string \"property\"\n* @memberof Consts\n* @example\nimport {PROPERTY} from \"@daybrush/utils\";\n\nconsole.log(PROPERTY); // \"property\"\n*/\n\nvar PROPERTY = \"property\";\n/**\n* get string \"array\"\n* @memberof Consts\n* @example\nimport {ARRAY} from \"@daybrush/utils\";\n\nconsole.log(ARRAY); // \"array\"\n*/\n\nvar ARRAY = \"array\";\n/**\n* get string \"object\"\n* @memberof Consts\n* @example\nimport {OBJECT} from \"@daybrush/utils\";\n\nconsole.log(OBJECT); // \"object\"\n*/\n\nvar OBJECT = \"object\";\n/**\n* get string \"string\"\n* @memberof Consts\n* @example\nimport {STRING} from \"@daybrush/utils\";\n\nconsole.log(STRING); // \"string\"\n*/\n\nvar STRING = \"string\";\n/**\n* get string \"number\"\n* @memberof Consts\n* @example\nimport {NUMBER} from \"@daybrush/utils\";\n\nconsole.log(NUMBER); // \"number\"\n*/\n\nvar NUMBER = \"number\";\n/**\n* get string \"undefined\"\n* @memberof Consts\n* @example\nimport {UNDEFINED} from \"@daybrush/utils\";\n\nconsole.log(UNDEFINED); // \"undefined\"\n*/\n\nvar UNDEFINED = \"undefined\";\n/**\n* Check whether the environment is window or node.js.\n* @memberof Consts\n* @example\nimport {IS_WINDOW} from \"@daybrush/utils\";\n\nconsole.log(IS_WINDOW); // false in node.js\nconsole.log(IS_WINDOW); // true in browser\n*/\n\nvar IS_WINDOW = typeof window !== UNDEFINED;\n/**\n* Check whether the environment is window or node.js.\n* @memberof Consts\n* @name document\n* @example\nimport {IS_WINDOW} from \"@daybrush/utils\";\n\nconsole.log(IS_WINDOW); // false in node.js\nconsole.log(IS_WINDOW); // true in browser\n*/\n\nvar doc = typeof document !== UNDEFINED && document; // FIXME: this type maybe false\nvar prefixes = [\"webkit\", \"ms\", \"moz\", \"o\"];\n/**\n * @namespace CrossBrowser\n */\n\n/**\n* Get a CSS property with a vendor prefix that supports cross browser.\n* @function\n* @param {string} property - A CSS property\n* @return {string} CSS property with cross-browser vendor prefix\n* @memberof CrossBrowser\n* @example\nimport {getCrossBrowserProperty} from \"@daybrush/utils\";\n\nconsole.log(getCrossBrowserProperty(\"transform\")); // \"transform\", \"-ms-transform\", \"-webkit-transform\"\nconsole.log(getCrossBrowserProperty(\"filter\")); // \"filter\", \"-webkit-filter\"\n*/\n\nvar getCrossBrowserProperty = /*#__PURE__*/function (property) {\n if (!doc) {\n return \"\";\n }\n\n var styles = (doc.body || doc.documentElement).style;\n var length = prefixes.length;\n\n if (typeof styles[property] !== UNDEFINED) {\n return property;\n }\n\n for (var i = 0; i < length; ++i) {\n var name = \"-\" + prefixes[i] + \"-\" + property;\n\n if (typeof styles[name] !== UNDEFINED) {\n return name;\n }\n }\n\n return \"\";\n};\n/**\n* get string \"transfrom\" with the vendor prefix.\n* @memberof CrossBrowser\n* @example\nimport {TRANSFORM} from \"@daybrush/utils\";\n\nconsole.log(TRANSFORM); // \"transform\", \"-ms-transform\", \"-webkit-transform\"\n*/\n\nvar TRANSFORM = /*#__PURE__*/getCrossBrowserProperty(\"transform\");\n/**\n* get string \"filter\" with the vendor prefix.\n* @memberof CrossBrowser\n* @example\nimport {FILTER} from \"@daybrush/utils\";\n\nconsole.log(FILTER); // \"filter\", \"-ms-filter\", \"-webkit-filter\"\n*/\n\nvar FILTER = /*#__PURE__*/getCrossBrowserProperty(\"filter\");\n/**\n* get string \"animation\" with the vendor prefix.\n* @memberof CrossBrowser\n* @example\nimport {ANIMATION} from \"@daybrush/utils\";\n\nconsole.log(ANIMATION); // \"animation\", \"-ms-animation\", \"-webkit-animation\"\n*/\n\nvar ANIMATION = /*#__PURE__*/getCrossBrowserProperty(\"animation\");\n/**\n* get string \"keyframes\" with the vendor prefix.\n* @memberof CrossBrowser\n* @example\nimport {KEYFRAMES} from \"@daybrush/utils\";\n\nconsole.log(KEYFRAMES); // \"keyframes\", \"-ms-keyframes\", \"-webkit-keyframes\"\n*/\n\nvar KEYFRAMES = /*#__PURE__*/ANIMATION.replace(\"animation\", \"keyframes\");\nvar OPEN_CLOSED_CHARACTERS = [{\n open: \"(\",\n close: \")\"\n}, {\n open: \"\\\"\",\n close: \"\\\"\"\n}, {\n open: \"'\",\n close: \"'\"\n}, {\n open: \"\\\\\\\"\",\n close: \"\\\\\\\"\"\n}, {\n open: \"\\\\'\",\n close: \"\\\\'\"\n}];\nvar TINY_NUM = 0.0000001;\nvar DEFAULT_UNIT_PRESETS = {\n \"cm\": function (pos) {\n return pos * 96 / 2.54;\n },\n \"mm\": function (pos) {\n return pos * 96 / 254;\n },\n \"in\": function (pos) {\n return pos * 96;\n },\n \"pt\": function (pos) {\n return pos * 96 / 72;\n },\n \"pc\": function (pos) {\n return pos * 96 / 6;\n },\n \"%\": function (pos, size) {\n return pos * size / 100;\n },\n \"vw\": function (pos, size) {\n if (size === void 0) {\n size = window.innerWidth;\n }\n\n return pos / 100 * size;\n },\n \"vh\": function (pos, size) {\n if (size === void 0) {\n size = window.innerHeight;\n }\n\n return pos / 100 * size;\n },\n \"vmax\": function (pos, size) {\n if (size === void 0) {\n size = Math.max(window.innerWidth, window.innerHeight);\n }\n\n return pos / 100 * size;\n },\n \"vmin\": function (pos, size) {\n if (size === void 0) {\n size = Math.min(window.innerWidth, window.innerHeight);\n }\n\n return pos / 100 * size;\n }\n};\n\n/**\n* @namespace\n* @name Utils\n*/\n\n/**\n * Returns the inner product of two numbers(`a1`, `a2`) by two criteria(`b1`, `b2`).\n * @memberof Utils\n * @param - The first number\n * @param - The second number\n * @param - The first number to base on the inner product\n * @param - The second number to base on the inner product\n * @return - Returns the inner product\nimport { dot } from \"@daybrush/utils\";\n\nconsole.log(dot(0, 15, 2, 3)); // 6\nconsole.log(dot(5, 15, 2, 3)); // 9\nconsole.log(dot(5, 15, 1, 1)); // 10\n */\n\nfunction dot(a1, a2, b1, b2) {\n return (a1 * b2 + a2 * b1) / (b1 + b2);\n}\n/**\n* Check the type that the value is undefined.\n* @memberof Utils\n* @param {string} value - Value to check the type\n* @return {boolean} true if the type is correct, false otherwise\n* @example\nimport {isUndefined} from \"@daybrush/utils\";\n\nconsole.log(isUndefined(undefined)); // true\nconsole.log(isUndefined(\"\")); // false\nconsole.log(isUndefined(1)); // false\nconsole.log(isUndefined(null)); // false\n*/\n\nfunction isUndefined(value) {\n return typeof value === UNDEFINED;\n}\n/**\n* Check the type that the value is object.\n* @memberof Utils\n* @param {string} value - Value to check the type\n* @return {} true if the type is correct, false otherwise\n* @example\nimport {isObject} from \"@daybrush/utils\";\n\nconsole.log(isObject({})); // true\nconsole.log(isObject(undefined)); // false\nconsole.log(isObject(\"\")); // false\nconsole.log(isObject(null)); // false\n*/\n\nfunction isObject(value) {\n return value && typeof value === OBJECT;\n}\n/**\n* Check the type that the value is isArray.\n* @memberof Utils\n* @param {string} value - Value to check the type\n* @return {} true if the type is correct, false otherwise\n* @example\nimport {isArray} from \"@daybrush/utils\";\n\nconsole.log(isArray([])); // true\nconsole.log(isArray({})); // false\nconsole.log(isArray(undefined)); // false\nconsole.log(isArray(null)); // false\n*/\n\nfunction isArray(value) {\n return Array.isArray(value);\n}\n/**\n* Check the type that the value is string.\n* @memberof Utils\n* @param {string} value - Value to check the type\n* @return {} true if the type is correct, false otherwise\n* @example\nimport {isString} from \"@daybrush/utils\";\n\nconsole.log(isString(\"1234\")); // true\nconsole.log(isString(undefined)); // false\nconsole.log(isString(1)); // false\nconsole.log(isString(null)); // false\n*/\n\nfunction isString(value) {\n return typeof value === STRING;\n}\nfunction isNumber(value) {\n return typeof value === NUMBER;\n}\n/**\n* Check the type that the value is function.\n* @memberof Utils\n* @param {string} value - Value to check the type\n* @return {} true if the type is correct, false otherwise\n* @example\nimport {isFunction} from \"@daybrush/utils\";\n\nconsole.log(isFunction(function a() {})); // true\nconsole.log(isFunction(() => {})); // true\nconsole.log(isFunction(\"1234\")); // false\nconsole.log(isFunction(1)); // false\nconsole.log(isFunction(null)); // false\n*/\n\nfunction isFunction(value) {\n return typeof value === FUNCTION;\n}\n\nfunction isEqualSeparator(character, separator) {\n var isCharacterSpace = character === \"\" || character == \" \";\n var isSeparatorSpace = separator === \"\" || separator == \" \";\n return isSeparatorSpace && isCharacterSpace || character === separator;\n}\n\nfunction findOpen(openCharacter, texts, index, length, openCloseCharacters) {\n var isIgnore = findIgnore(openCharacter, texts, index);\n\n if (!isIgnore) {\n return findClose(openCharacter, texts, index + 1, length, openCloseCharacters);\n }\n\n return index;\n}\n\nfunction findIgnore(character, texts, index) {\n if (!character.ignore) {\n return null;\n }\n\n var otherText = texts.slice(Math.max(index - 3, 0), index + 3).join(\"\");\n return new RegExp(character.ignore).exec(otherText);\n}\n\nfunction findClose(closeCharacter, texts, index, length, openCloseCharacters) {\n var _loop_1 = function (i) {\n var character = texts[i].trim();\n\n if (character === closeCharacter.close && !findIgnore(closeCharacter, texts, i)) {\n return {\n value: i\n };\n }\n\n var nextIndex = i; // re open\n\n var openCharacter = find(openCloseCharacters, function (_a) {\n var open = _a.open;\n return open === character;\n });\n\n if (openCharacter) {\n nextIndex = findOpen(openCharacter, texts, i, length, openCloseCharacters);\n }\n\n if (nextIndex === -1) {\n return out_i_1 = i, \"break\";\n }\n\n i = nextIndex;\n out_i_1 = i;\n };\n\n var out_i_1;\n\n for (var i = index; i < length; ++i) {\n var state_1 = _loop_1(i);\n\n i = out_i_1;\n if (typeof state_1 === \"object\") return state_1.value;\n if (state_1 === \"break\") break;\n }\n\n return -1;\n}\n\nfunction splitText(text, splitOptions) {\n var _a = isString(splitOptions) ? {\n separator: splitOptions\n } : splitOptions,\n _b = _a.separator,\n separator = _b === void 0 ? \",\" : _b,\n isSeparateFirst = _a.isSeparateFirst,\n isSeparateOnlyOpenClose = _a.isSeparateOnlyOpenClose,\n _c = _a.isSeparateOpenClose,\n isSeparateOpenClose = _c === void 0 ? isSeparateOnlyOpenClose : _c,\n _d = _a.openCloseCharacters,\n openCloseCharacters = _d === void 0 ? OPEN_CLOSED_CHARACTERS : _d;\n\n var openClosedText = openCloseCharacters.map(function (_a) {\n var open = _a.open,\n close = _a.close;\n\n if (open === close) {\n return open;\n }\n\n return open + \"|\" + close;\n }).join(\"|\");\n var regexText = \"(\\\\s*\" + separator + \"\\\\s*|\" + openClosedText + \"|\\\\s+)\";\n var regex = new RegExp(regexText, \"g\");\n var texts = text.split(regex).filter(Boolean);\n var length = texts.length;\n var values = [];\n var tempValues = [];\n\n function resetTemp() {\n if (tempValues.length) {\n values.push(tempValues.join(\"\"));\n tempValues = [];\n return true;\n }\n\n return false;\n }\n\n var _loop_2 = function (i) {\n var character = texts[i].trim();\n var nextIndex = i;\n var openCharacter = find(openCloseCharacters, function (_a) {\n var open = _a.open;\n return open === character;\n });\n var closeCharacter = find(openCloseCharacters, function (_a) {\n var close = _a.close;\n return close === character;\n });\n\n if (openCharacter) {\n nextIndex = findOpen(openCharacter, texts, i, length, openCloseCharacters);\n\n if (nextIndex !== -1 && isSeparateOpenClose) {\n if (resetTemp() && isSeparateFirst) {\n return out_i_2 = i, \"break\";\n }\n\n values.push(texts.slice(i, nextIndex + 1).join(\"\"));\n i = nextIndex;\n\n if (isSeparateFirst) {\n return out_i_2 = i, \"break\";\n }\n\n return out_i_2 = i, \"continue\";\n }\n } else if (closeCharacter && !findIgnore(closeCharacter, texts, i)) {\n throw new Error(\"invalid format: \" + closeCharacter.close);\n } else if (isEqualSeparator(character, separator) && !isSeparateOnlyOpenClose) {\n resetTemp();\n\n if (isSeparateFirst) {\n return out_i_2 = i, \"break\";\n }\n\n return out_i_2 = i, \"continue\";\n }\n\n if (nextIndex === -1) {\n nextIndex = length - 1;\n }\n\n tempValues.push(texts.slice(i, nextIndex + 1).join(\"\"));\n i = nextIndex;\n out_i_2 = i;\n };\n\n var out_i_2;\n\n for (var i = 0; i < length; ++i) {\n var state_2 = _loop_2(i);\n\n i = out_i_2;\n if (state_2 === \"break\") break;\n }\n\n if (tempValues.length) {\n values.push(tempValues.join(\"\"));\n }\n\n return values;\n}\n/**\n* divide text by space.\n* @memberof Utils\n* @param {string} text - text to divide\n* @return {Array} divided texts\n* @example\nimport {spliceSpace} from \"@daybrush/utils\";\n\nconsole.log(splitSpace(\"a b c d e f g\"));\n// [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\"]\nconsole.log(splitSpace(\"'a,b' c 'd,e' f g\"));\n// [\"'a,b'\", \"c\", \"'d,e'\", \"f\", \"g\"]\n*/\n\nfunction splitSpace(text) {\n // divide comma(space)\n return splitText(text, \"\");\n}\n/**\n* divide text by comma.\n* @memberof Utils\n* @param {string} text - text to divide\n* @return {Array} divided texts\n* @example\nimport {splitComma} from \"@daybrush/utils\";\n\nconsole.log(splitComma(\"a,b,c,d,e,f,g\"));\n// [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\"]\nconsole.log(splitComma(\"'a,b',c,'d,e',f,g\"));\n// [\"'a,b'\", \"c\", \"'d,e'\", \"f\", \"g\"]\n*/\n\nfunction splitComma(text) {\n // divide comma(,)\n // \"[^\"]*\"|'[^']*'\n return splitText(text, \",\");\n}\n/**\n* divide text by bracket \"(\", \")\".\n* @memberof Utils\n* @param {string} text - text to divide\n* @return {object} divided texts\n* @example\nimport {splitBracket} from \"@daybrush/utils\";\n\nconsole.log(splitBracket(\"a(1, 2)\"));\n// {prefix: \"a\", value: \"1, 2\", suffix: \"\"}\nconsole.log(splitBracket(\"a(1, 2)b\"));\n// {prefix: \"a\", value: \"1, 2\", suffix: \"b\"}\n*/\n\nfunction splitBracket(text) {\n var matches = /([^(]*)\\(([\\s\\S]*)\\)([\\s\\S]*)/g.exec(text);\n\n if (!matches || matches.length < 4) {\n return {};\n } else {\n return {\n prefix: matches[1],\n value: matches[2],\n suffix: matches[3]\n };\n }\n}\n/**\n* divide text by number and unit.\n* @memberof Utils\n* @param {string} text - text to divide\n* @return {} divided texts\n* @example\nimport {splitUnit} from \"@daybrush/utils\";\n\nconsole.log(splitUnit(\"10px\"));\n// {prefix: \"\", value: 10, unit: \"px\"}\nconsole.log(splitUnit(\"-10px\"));\n// {prefix: \"\", value: -10, unit: \"px\"}\nconsole.log(splitUnit(\"a10%\"));\n// {prefix: \"a\", value: 10, unit: \"%\"}\n*/\n\nfunction splitUnit(text) {\n var matches = /^([^\\d|e|\\-|\\+]*)((?:\\d|\\.|-|e-|e\\+)+)(\\S*)$/g.exec(text);\n\n if (!matches) {\n return {\n prefix: \"\",\n unit: \"\",\n value: NaN\n };\n }\n\n var prefix = matches[1];\n var value = matches[2];\n var unit = matches[3];\n return {\n prefix: prefix,\n unit: unit,\n value: parseFloat(value)\n };\n}\n/**\n* transform strings to camel-case\n* @memberof Utils\n* @param {String} text - string\n* @return {String} camel-case string\n* @example\nimport {camelize} from \"@daybrush/utils\";\n\nconsole.log(camelize(\"transform-origin\")); // transformOrigin\nconsole.log(camelize(\"abcd_efg\")); // abcdEfg\nconsole.log(camelize(\"abcd efg\")); // abcdEfg\n*/\n\nfunction camelize(str) {\n return str.replace(/[\\s-_]([a-z])/g, function (all, letter) {\n return letter.toUpperCase();\n });\n}\n/**\n* transform a camelized string into a lowercased string.\n* @memberof Utils\n* @param {string} text - a camel-cased string\n* @param {string} [separator=\"-\"] - a separator\n* @return {string} a lowercased string\n* @example\nimport {decamelize} from \"@daybrush/utils\";\n\nconsole.log(decamelize(\"transformOrigin\")); // transform-origin\nconsole.log(decamelize(\"abcdEfg\", \"_\")); // abcd_efg\n*/\n\nfunction decamelize(str, separator) {\n if (separator === void 0) {\n separator = \"-\";\n }\n\n return str.replace(/([a-z])([A-Z])/g, function (all, letter, letter2) {\n return \"\" + letter + separator + letter2.toLowerCase();\n });\n}\n/**\n* transforms something in an array into an array.\n* @memberof Utils\n* @param - Array form\n* @return an array\n* @example\nimport {toArray} from \"@daybrush/utils\";\n\nconst arr1 = toArray(document.querySelectorAll(\".a\")); // Element[]\nconst arr2 = toArray(document.querySelectorAll<HTMLElement>(\".a\")); // HTMLElement[]\n*/\n\nfunction toArray(value) {\n return [].slice.call(value);\n}\n/**\n* Date.now() method\n* @memberof CrossBrowser\n* @return {number} milliseconds\n* @example\nimport {now} from \"@daybrush/utils\";\n\nconsole.log(now()); // 12121324241(milliseconds)\n*/\n\nfunction now() {\n return Date.now ? Date.now() : new Date().getTime();\n}\n/**\n* Returns the index of the first element in the array that satisfies the provided testing function.\n* @function\n* @memberof CrossBrowser\n* @param - The array `findIndex` was called upon.\n* @param - A function to execute on each value in the array until the function returns true, indicating that the satisfying element was found.\n* @param - Returns defaultIndex if not found by the function.\n* @example\nimport { findIndex } from \"@daybrush/utils\";\n\nfindIndex([{a: 1}, {a: 2}, {a: 3}, {a: 4}], ({ a }) => a === 2); // 1\n*/\n\nfunction findIndex(arr, callback, defaultIndex) {\n if (defaultIndex === void 0) {\n defaultIndex = -1;\n }\n\n var length = arr.length;\n\n for (var i = 0; i < length; ++i) {\n if (callback(arr[i], i, arr)) {\n return i;\n }\n }\n\n return defaultIndex;\n}\n/**\n* Returns the reverse direction index of the first element in the array that satisfies the provided testing function.\n* @function\n* @memberof CrossBrowser\n* @param - The array `findLastIndex` was called upon.\n* @param - A function to execute on each value in the array until the function returns true, indicating that the satisfying element was found.\n* @param - Returns defaultIndex if not found by the function.\n* @example\nimport { findLastIndex } from \"@daybrush/utils\";\n\nfindLastIndex([{a: 1}, {a: 2}, {a: 3}, {a: 4}], ({ a }) => a === 2); // 1\n*/\n\nfunction findLastIndex(arr, callback, defaultIndex) {\n if (defaultIndex === void 0) {\n defaultIndex = -1;\n }\n\n var length = arr.length;\n\n for (var i = length - 1; i >= 0; --i) {\n if (callback(arr[i], i, arr)) {\n return i;\n }\n }\n\n return defaultIndex;\n}\n/**\n* Returns the value of the reverse direction element in the array that satisfies the provided testing function.\n* @function\n* @memberof CrossBrowser\n* @param - The array `findLast` was called upon.\n* @param - A function to execute on each value in the array,\n* @param - Returns defalutValue if not found by the function.\n* @example\nimport { find } from \"@daybrush/utils\";\n\nfind([{a: 1}, {a: 2}, {a: 3}, {a: 4}], ({ a }) => a === 2); // {a: 2}\n*/\n\nfunction findLast(arr, callback, defalutValue) {\n var index = findLastIndex(arr, callback);\n return index > -1 ? arr[index] : defalutValue;\n}\n/**\n* Returns the value of the first element in the array that satisfies the provided testing function.\n* @function\n* @memberof CrossBrowser\n* @param - The array `find` was called upon.\n* @param - A function to execute on each value in the array,\n* @param - Returns defalutValue if not found by the function.\n* @example\nimport { find } from \"@daybrush/utils\";\n\nfind([{a: 1}, {a: 2}, {a: 3}, {a: 4}], ({ a }) => a === 2); // {a: 2}\n*/\n\nfunction find(arr, callback, defalutValue) {\n var index = findIndex(arr, callback);\n return index > -1 ? arr[index] : defalutValue;\n}\n/**\n* window.requestAnimationFrame() method with cross browser.\n* @function\n* @memberof CrossBrowser\n* @param {FrameRequestCallback} callback - The function to call when it's time to update your animation for the next repaint.\n* @return {number} id\n* @example\nimport {requestAnimationFrame} from \"@daybrush/utils\";\n\nrequestAnimationFrame((timestamp) => {\n console.log(timestamp);\n});\n*/\n\nvar requestAnimationFrame = /*#__PURE__*/function () {\n var firstTime = now();\n var raf = IS_WINDOW && (window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame);\n return raf ? raf.bind(window) : function (callback) {\n var currTime = now();\n var id = window.setTimeout(function () {\n callback(currTime - firstTime);\n }, 1000 / 60);\n return id;\n };\n}();\n/**\n* window.cancelAnimationFrame() method with cross browser.\n* @function\n* @memberof CrossBrowser\n* @param {number} handle - the id obtained through requestAnimationFrame method\n* @return {void}\n* @example\nimport { requestAnimationFrame, cancelAnimationFrame } from \"@daybrush/utils\";\n\nconst id = requestAnimationFrame((timestamp) => {\n console.log(timestamp);\n});\n\ncancelAnimationFrame(id);\n*/\n\nvar cancelAnimationFrame = /*#__PURE__*/function () {\n var caf = IS_WINDOW && (window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || window.msCancelAnimationFrame);\n return caf ? caf.bind(window) : function (handle) {\n clearTimeout(handle);\n };\n}();\n/**\n* @function\n* @memberof Utils\n*/\n\nfunction getKeys(obj) {\n if (Object.keys) {\n return Object.keys(obj);\n }\n\n var keys = [];\n\n for (var name in keys) {\n keys.push(name);\n }\n\n return keys;\n}\n/**\n* @function\n* @memberof Utils\n*/\n\nfunction sortOrders(keys, orders) {\n if (orders === void 0) {\n orders = [];\n }\n\n keys.sort(function (a, b) {\n var index1 = orders.indexOf(a);\n var index2 = orders.indexOf(b);\n\n if (index2 === -1 && index1 === -1) {\n return 0;\n }\n\n if (index1 === -1) {\n return 1;\n }\n\n if (index2 === -1) {\n return -1;\n }\n\n return index1 - index2;\n });\n}\n/**\n* convert unit size to px size\n* @function\n* @memberof Utils\n*/\n\nfunction convertUnitSize(pos, size) {\n var _a = splitUnit(pos),\n value = _a.value,\n unit = _a.unit;\n\n if (isObject(size)) {\n var sizeFunction = size[unit];\n\n if (sizeFunction) {\n if (isFunction(sizeFunction)) {\n return sizeFunction(value);\n } else if (DEFAULT_UNIT_PRESETS[unit]) {\n return DEFAULT_UNIT_PRESETS[unit](value, sizeFunction);\n }\n }\n } else if (unit === \"%\") {\n return value * size / 100;\n }\n\n if (DEFAULT_UNIT_PRESETS[unit]) {\n return DEFAULT_UNIT_PRESETS[unit](value);\n }\n\n return value;\n}\n/**\n* calculate between min, max\n* @function\n* @memberof Utils\n*/\n\nfunction between(value, min, max) {\n return Math.max(min, Math.min(value, max));\n}\nfunction checkBoundSize(targetSize, compareSize, isMax) {\n return [[throttle(compareSize[0], TINY_NUM), throttle(compareSize[0] * targetSize[1] / targetSize[0], TINY_NUM)], [throttle(compareSize[1] * targetSize[0] / targetSize[1], TINY_NUM), throttle(compareSize[1], TINY_NUM)]].filter(function (size) {\n return size.every(function (value, i) {\n return isMax ? value <= compareSize[i] : value >= compareSize[i];\n });\n })[0] || targetSize;\n}\n/**\n* calculate bound size\n* @function\n* @memberof Utils\n*/\n\nfunction calculateBoundSize(size, minSize, maxSize, keepRatio) {\n if (!keepRatio) {\n return size.map(function (value, i) {\n return between(value, minSize[i], maxSize[i]);\n });\n }\n\n var width = size[0],\n height = size[1]; // width : height = minWidth : minHeight;\n\n var _a = checkBoundSize(size, minSize, false),\n minWidth = _a[0],\n minHeight = _a[1];\n\n var _b = checkBoundSize(size, maxSize, true),\n maxWidth = _b[0],\n maxHeight = _b[1];\n\n if (width < minWidth || height < minHeight) {\n width = minWidth;\n height = minHeight;\n } else if (width > maxWidth || height > maxHeight) {\n width = maxWidth;\n height = maxHeight;\n }\n\n return [width, height];\n}\n/**\n* Add all the numbers.\n* @function\n* @memberof Utils\n*/\n\nfunction sum(nums) {\n var length = nums.length;\n var total = 0;\n\n for (var i = length - 1; i >= 0; --i) {\n total += nums[i];\n }\n\n return total;\n}\n/**\n* Average all numbers.\n* @function\n* @memberof Utils\n*/\n\nfunction average(nums) {\n var length = nums.length;\n var total = 0;\n\n for (var i = length - 1; i >= 0; --i) {\n total += nums[i];\n }\n\n return length ? total / length : 0;\n}\n/**\n* Get the angle of two points. (0 <= rad < 359)\n* @function\n* @memberof Utils\n*/\n\nfunction getRad(pos1, pos2) {\n var distX = pos2[0] - pos1[0];\n var distY = pos2[1] - pos1[1];\n var rad = Math.atan2(distY, distX);\n return rad >= 0 ? rad : rad + Math.PI * 2;\n}\n/**\n* Get the average point of all points.\n* @function\n* @memberof Utils\n*/\n\nfunction getCenterPoint(points) {\n return [0, 1].map(function (i) {\n return average(points.map(function (pos) {\n return pos[i];\n }));\n });\n}\n/**\n* Gets the direction of the shape.\n* @function\n* @memberof Utils\n*/\n\nfunction getShapeDirection(points) {\n var center = getCenterPoint(points);\n var pos1Rad = getRad(center, points[0]);\n var pos2Rad = getRad(center, points[1]);\n return pos1Rad < pos2Rad && pos2Rad - pos1Rad < Math.PI || pos1Rad > pos2Rad && pos2Rad - pos1Rad < -Math.PI ? 1 : -1;\n}\n/**\n* Get the distance between two points.\n* @function\n* @memberof Utils\n*/\n\nfunction getDist(a, b) {\n return Math.sqrt(Math.pow((b ? b[0] : 0) - a[0], 2) + Math.pow((b ? b[1] : 0) - a[1], 2));\n}\n/**\n* throttle number depending on the unit.\n* @function\n* @memberof Utils\n*/\n\nfunction throttle(num, unit) {\n if (!unit) {\n return num;\n }\n\n return Math.round(num / unit) * unit;\n}\n/**\n* throttle number array depending on the unit.\n* @function\n* @memberof Utils\n*/\n\nfunction throttleArray(nums, unit) {\n nums.forEach(function (_, i) {\n nums[i] = throttle(nums[i], unit);\n });\n return nums;\n}\n/**\n* @function\n* @memberof Utils\n*/\n\nfunction counter(num) {\n var nums = [];\n\n for (var i = 0; i < num; ++i) {\n nums.push(i);\n }\n\n return nums;\n}\n/**\n* @function\n* @memberof Utils\n*/\n\nfunction replaceOnce(text, fromText, toText) {\n var isOnce = false;\n return text.replace(fromText, function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n if (isOnce) {\n return args[0];\n }\n\n isOnce = true;\n return isString(toText) ? toText : toText.apply(void 0, args);\n });\n}\n\n/**\n* @namespace\n* @name Color\n*/\n\n/**\n* Remove the # from the hex color.\n* @memberof Color\n* @param {} hex - hex color\n* @return {} hex color\n* @example\nimport {cutHex} from \"@daybrush/utils\";\n\nconsole.log(cutHex(\"#000000\")) // \"000000\"\n*/\n\nfunction cutHex(hex) {\n return hex.replace(\"#\", \"\");\n}\n/**\n* convert hex color to rgb color.\n* @memberof Color\n* @param {} hex - hex color\n* @return {} rgb color\n* @example\nimport {hexToRGBA} from \"@daybrush/utils\";\n\nconsole.log(hexToRGBA(\"#00000005\"));\n// [0, 0, 0, 1]\nconsole.log(hexToRGBA(\"#201045\"));\n// [32, 16, 69, 1]\n*/\n\nfunction hexToRGBA(hex) {\n var h = cutHex(hex);\n var r = parseInt(h.substring(0, 2), 16);\n var g = parseInt(h.substring(2, 4), 16);\n var b = parseInt(h.substring(4, 6), 16);\n var a = parseInt(h.substring(6, 8), 16) / 255;\n\n if (isNaN(a)) {\n a = 1;\n }\n\n return [r, g, b, a];\n}\n/**\n* convert 3(or 4)-digit hex color to 6(or 8)-digit hex color.\n* @memberof Color\n* @param {} hex - 3(or 4)-digit hex color\n* @return {} 6(or 8)-digit hex color\n* @example\nimport {toFullHex} from \"@daybrush/utils\";\n\nconsole.log(toFullHex(\"#123\")); // \"#112233\"\nconsole.log(toFullHex(\"#123a\")); // \"#112233aa\"\n*/\n\nfunction toFullHex(h) {\n var r = h.charAt(1);\n var g = h.charAt(2);\n var b = h.charAt(3);\n var a = h.charAt(4);\n var arr = [\"#\", r, r, g, g, b, b, a, a];\n return arr.join(\"\");\n}\n/**\n* convert hsl color to rgba color.\n* @memberof Color\n* @param {} hsl - hsl color(hue: 0 ~ 360, saturation: 0 ~ 1, lightness: 0 ~ 1, alpha: 0 ~ 1)\n* @return {} rgba color\n* @example\nimport {hslToRGBA} from \"@daybrush/utils\";\n\nconsole.log(hslToRGBA([150, 0.5, 0.4]));\n// [51, 153, 102, 1]\n*/\n\nfunction hslToRGBA(hsl) {\n var _a;\n\n var h = hsl[0];\n var s = hsl[1];\n var l = hsl[2];\n\n if (h < 0) {\n h += Math.floor((Math.abs(h) + 360) / 360) * 360;\n }\n\n h %= 360;\n var c = (1 - Math.abs(2 * l - 1)) * s;\n var x = c * (1 - Math.abs(h / 60 % 2 - 1));\n var m = l - c / 2;\n var rgb;\n\n if (h < 60) {\n rgb = [c, x, 0];\n } else if (h < 120) {\n rgb = [x, c, 0];\n } else if (h < 180) {\n rgb = [0, c, x];\n } else if (h < 240) {\n rgb = [0, x, c];\n } else if (h < 300) {\n rgb = [x, 0, c];\n } else if (h < 360) {\n rgb = [c, 0, x];\n } else {\n rgb = [0, 0, 0];\n }\n\n return [Math.round((rgb[0] + m) * 255), Math.round((rgb[1] + m) * 255), Math.round((rgb[2] + m) * 255), (_a = hsl[3]) !== null && _a !== void 0 ? _a : 1];\n}\n/**\n* convert string to rgba color.\n* @memberof Color\n* @param {} - 3-hex(#000), 4-hex(#0000) 6-hex(#000000), 8-hex(#00000000) or RGB(A), or HSL(A)\n* @return {} rgba color\n* @example\nimport {stringToRGBA} from \"@daybrush/utils\";\n\nconsole.log(stringToRGBA(\"#000000\")); // [0, 0, 0, 1]\nconsole.log(stringToRGBA(\"rgb(100, 100, 100)\")); // [100, 100, 100, 1]\nconsole.log(stringToRGBA(\"hsl(150, 0.5, 0.4)\")); // [51, 153, 102, 1]\n*/\n\nfunction stringToRGBA(color) {\n if (color.charAt(0) === \"#\") {\n if (color.length === 4 || color.length === 5) {\n return hexToRGBA(toFullHex(color));\n } else {\n return hexToRGBA(color);\n }\n } else if (color.indexOf(\"(\") !== -1) {\n // in bracket.\n var _a = splitBracket(color),\n prefix = _a.prefix,\n value = _a.value;\n\n if (!prefix || !value) {\n return undefined;\n }\n\n var arr = splitComma(value);\n var colorArr = [0, 0, 0, 1];\n var length = arr.length;\n\n switch (prefix) {\n case RGB:\n case RGBA:\n for (var i = 0; i < length; ++i) {\n colorArr[i] = parseFloat(arr[i]);\n }\n\n return colorArr;\n\n case HSL:\n case HSLA:\n for (var i = 0; i < length; ++i) {\n if (arr[i].indexOf(\"%\") !== -1) {\n colorArr[i] = parseFloat(arr[i]) / 100;\n } else {\n colorArr[i] = parseFloat(arr[i]);\n }\n } // hsl, hsla to rgba\n\n\n return hslToRGBA(colorArr);\n }\n }\n\n return undefined;\n}\n\n/**\n * Returns all element descendants of node that\n * match selectors.\n */\n\n/**\n * Checks if the specified class value exists in the element's class attribute.\n * @memberof DOM\n * @param - A DOMString containing one or more selectors to match\n * @param - If multi is true, a DOMString containing one or more selectors to match against.\n * @example\nimport {$} from \"@daybrush/utils\";\n\nconsole.log($(\"div\")); // div element\nconsole.log($(\"div\", true)); // [div, div] elements\n*/\n\nfunction $(selectors, multi) {\n return multi ? doc.querySelectorAll(selectors) : doc.querySelector(selectors);\n}\n/**\n* Checks if the specified class value exists in the element's class attribute.\n* @memberof DOM\n* @param element - target\n* @param className - the class name to search\n* @return {boolean} return false if the class is not found.\n* @example\nimport {hasClass} from \"@daybrush/utils\";\n\nconsole.log(hasClass(element, \"start\")); // true or false\n*/\n\nfunction hasClass(element, className) {\n if (element.classList) {\n return element.classList.contains(className);\n }\n\n return !!element.className.match(new RegExp(\"(\\\\s|^)\" + className + \"(\\\\s|$)\"));\n}\n/**\n* Add the specified class value. If these classe already exist in the element's class attribute they are ignored.\n* @memberof DOM\n* @param element - target\n* @param className - the class name to add\n* @example\nimport {addClass} from \"@daybrush/utils\";\n\naddClass(element, \"start\");\n*/\n\nfunction addClass(element, className) {\n if (element.classList) {\n element.classList.add(className);\n } else {\n element.className += \" \" + className;\n }\n}\n/**\n* Removes the specified class value.\n* @memberof DOM\n* @param element - target\n* @param className - the class name to remove\n* @example\nimport {removeClass} from \"@daybrush/utils\";\n\nremoveClass(element, \"start\");\n*/\n\nfunction removeClass(element, className) {\n if (element.classList) {\n element.classList.remove(className);\n } else {\n var reg = new RegExp(\"(\\\\s|^)\" + className + \"(\\\\s|$)\");\n element.className = element.className.replace(reg, \" \");\n }\n}\n/**\n* Gets the CSS properties from the element.\n* @memberof DOM\n* @param elements - elements\n* @param properites - the CSS properties\n* @return returns CSS properties and values.\n* @example\nimport {fromCSS} from \"@daybrush/utils\";\n\nconsole.log(fromCSS(element, [\"left\", \"opacity\", \"top\"])); // {\"left\": \"10px\", \"opacity\": 1, \"top\": \"10px\"}\n*/\n\nfunction fromCSS(elements, properties) {\n if (!elements || !properties || !properties.length) {\n return {};\n }\n\n var element;\n\n if (elements instanceof Element) {\n element = elements;\n } else if (elements.length) {\n element = elements[0];\n } else {\n return {};\n }\n\n var cssObject = {};\n var styles = window.getComputedStyle(element);\n var length = properties.length;\n\n for (var i = 0; i < length; ++i) {\n cssObject[properties[i]] = styles[properties[i]];\n }\n\n return cssObject;\n}\n/**\n* Sets up a function that will be called whenever the specified event is delivered to the target\n* @memberof DOM\n* @param - event target\n* @param - A case-sensitive string representing the event type to listen for.\n* @param - The object which receives a notification (an object that implements the Event interface) when an event of the specified type occurs\n* @param - An options object that specifies characteristics about the event listener.\n* @example\nimport {addEvent} from \"@daybrush/utils\";\n\naddEvent(el, \"click\", e => {\n console.log(e);\n});\n*/\n\nfunction addEvent(el, type, listener, options) {\n el.addEventListener(type, listener, options);\n}\n/**\n* removes from the EventTarget an event listener previously registered with EventTarget.addEventListener()\n* @memberof DOM\n* @param - event target\n* @param - A case-sensitive string representing the event type to listen for.\n* @param - The EventListener function of the event handler to remove from the event target.\n* @param - An options object that specifies characteristics about the event listener.\n* @example\nimport {addEvent, removeEvent} from \"@daybrush/utils\";\nconst listener = e => {\n console.log(e);\n};\naddEvent(el, \"click\", listener);\nremoveEvent(el, \"click\", listener);\n*/\n\nfunction removeEvent(el, type, listener, options) {\n el.removeEventListener(type, listener, options);\n}\n\nexport { RGB, RGBA, HSL, HSLA, COLOR_MODELS, FUNCTION, PROPERTY, ARRAY, OBJECT, STRING, NUMBER, UNDEFINED, IS_WINDOW, doc as document, getCrossBrowserProperty, TRANSFORM, FILTER, ANIMATION, KEYFRAMES, OPEN_CLOSED_CHARACTERS, TINY_NUM, DEFAULT_UNIT_PRESETS, cutHex, hexToRGBA, toFullHex, hslToRGBA, stringToRGBA, dot, isUndefined, isObject, isArray, isString, isNumber, isFunction, splitText, splitSpace, splitComma, splitBracket, splitUnit, camelize, decamelize, toArray, now, findIndex, findLastIndex, findLast, find, requestAnimationFrame, cancelAnimationFrame, getKeys, sortOrders, convertUnitSize, between, checkBoundSize, calculateBoundSize, sum, average, getRad, getCenterPoint, getShapeDirection, getDist, throttle, throttleArray, counter, replaceOnce, $, hasClass, addClass, removeClass, fromCSS, addEvent, removeEvent };\n//# sourceMappingURL=utils.esm.js.map\n","/*\nCopyright (c) 2019 Daybrush\nname: @scena/event-emitter\nlicense: MIT\nauthor: Daybrush\nrepository: git+https://github.com/daybrush/gesture.git\nversion: 1.0.5\n*/\nimport { isObject, findIndex } from '@daybrush/utils';\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\nvar __assign = function () {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n\n return t;\n };\n\n return __assign.apply(this, arguments);\n};\nfunction __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j];\n\n return r;\n}\n\n/**\n * Implement EventEmitter on object or component.\n */\n\nvar EventEmitter =\n/*#__PURE__*/\nfunction () {\n function EventEmitter() {\n this._events = {};\n }\n /**\n * Add a listener to the registered event.\n * @param - Name of the event to be added\n * @param - listener function of the event to be added\n * @example\n * import EventEmitter from \"@scena/event-emitter\";\n * cosnt emitter = new EventEmitter();\n *\n * // Add listener in \"a\" event\n * emitter.on(\"a\", () => {\n * });\n * // Add listeners\n * emitter.on({\n * a: () => {},\n * b: () => {},\n * });\n */\n\n\n var __proto = EventEmitter.prototype;\n\n __proto.on = function (eventName, listener) {\n if (isObject(eventName)) {\n for (var name in eventName) {\n this.on(name, eventName[name]);\n }\n } else {\n this._addEvent(eventName, listener, {});\n }\n\n return this;\n };\n /**\n * Remove listeners registered in the event target.\n * @param - Name of the event to be removed\n * @param - listener function of the event to be removed\n * @example\n * import EventEmitter from \"@scena/event-emitter\";\n * cosnt emitter = new EventEmitter();\n *\n * // Remove all listeners.\n * emitter.off();\n *\n * // Remove all listeners in \"A\" event.\n * emitter.off(\"a\");\n *\n *\n * // Remove \"listener\" listener in \"a\" event.\n * emitter.off(\"a\", listener);\n */\n\n\n __proto.off = function (eventName, listener) {\n if (!eventName) {\n this._events = {};\n } else if (isObject(eventName)) {\n for (var name in eventName) {\n this.off(name);\n }\n } else if (!listener) {\n this._events[eventName] = [];\n } else {\n var events = this._events[eventName];\n\n if (events) {\n var index = findIndex(events, function (e) {\n return e.listener === listener;\n });\n\n if (index > -1) {\n events.splice(index, 1);\n }\n }\n }\n\n return this;\n };\n /**\n * Add a disposable listener and Use promise to the registered event.\n * @param - Name of the event to be added\n * @param - disposable listener function of the event to be added\n * @example\n * import EventEmitter from \"@scena/event-emitter\";\n * cosnt emitter = new EventEmitter();\n *\n * // Add a disposable listener in \"a\" event\n * emitter.once(\"a\", () => {\n * });\n *\n * // Use Promise\n * emitter.once(\"a\").then(e => {\n * });\n */\n\n\n __proto.once = function (eventName, listener) {\n var _this = this;\n\n if (listener) {\n this._addEvent(eventName, listener, {\n once: true\n });\n }\n\n return new Promise(function (resolve) {\n _this._addEvent(eventName, resolve, {\n once: true\n });\n });\n };\n /**\n * Fires an event to call listeners.\n * @param - Event name\n * @param - Event parameter\n * @return If false, stop the event.\n * @example\n *\n * import EventEmitter from \"@scena/event-emitter\";\n *\n *\n * const emitter = new EventEmitter();\n *\n * emitter.on(\"a\", e => {\n * });\n *\n *\n * emitter.emit(\"a\", {\n * a: 1,\n * });\n */\n\n\n __proto.emit = function (eventName, param) {\n var _this = this;\n\n if (param === void 0) {\n param = {};\n }\n\n var events = this._events[eventName];\n\n if (!eventName || !events) {\n return true;\n }\n\n var isStop = false;\n param.eventType = eventName;\n\n param.stop = function () {\n isStop = true;\n };\n\n param.currentTarget = this;\n\n __spreadArrays(events).forEach(function (info) {\n info.listener(param);\n\n if (info.once) {\n _this.off(eventName, info.listener);\n }\n });\n\n return !isStop;\n };\n /**\n * Fires an event to call listeners.\n * @param - Event name\n * @param - Event parameter\n * @return If false, stop the event.\n * @example\n *\n * import EventEmitter from \"@scena/event-emitter\";\n *\n *\n * const emitter = new EventEmitter();\n *\n * emitter.on(\"a\", e => {\n * });\n *\n *\n * emitter.emit(\"a\", {\n * a: 1,\n * });\n */\n\n /**\n * Fires an event to call listeners.\n * @param - Event name\n * @param - Event parameter\n * @return If false, stop the event.\n * @example\n *\n * import EventEmitter from \"@scena/event-emitter\";\n *\n *\n * const emitter = new EventEmitter();\n *\n * emitter.on(\"a\", e => {\n * });\n *\n * // emit\n * emitter.trigger(\"a\", {\n * a: 1,\n * });\n */\n\n\n __proto.trigger = function (eventName, param) {\n if (param === void 0) {\n param = {};\n }\n\n return this.emit(eventName, param);\n };\n\n __proto._addEvent = function (eventName, listener, options) {\n var events = this._events;\n events[eventName] = events[eventName] || [];\n var listeners = events[eventName];\n listeners.push(__assign({\n listener: listener\n }, options));\n };\n\n return EventEmitter;\n}();\n\nexport default EventEmitter;\n//# sourceMappingURL=event-emitter.esm.js.map\n","/*\nCopyright (c) 2019 Daybrush\nname: gesto\nlicense: MIT\nauthor: Daybrush\nrepository: git+https://github.com/daybrush/gesture.git\nversion: 1.5.0\n*/\nimport EventEmitter from '@scena/event-emitter';\nimport { removeEvent, now, addEvent } from '@daybrush/utils';\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\n\n/* global Reflect, Promise */\nvar extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n };\n\n return extendStatics(d, b);\n};\n\nfunction __extends(d, b) {\n extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\nvar __assign = function () {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n\n return t;\n };\n\n return __assign.apply(this, arguments);\n};\n\nfunction getRad(pos1, pos2) {\n var distX = pos2[0] - pos1[0];\n var distY = pos2[1] - pos1[1];\n var rad = Math.atan2(distY, distX);\n return rad >= 0 ? rad : rad + Math.PI * 2;\n}\nfunction getRotatiion(touches) {\n return getRad([touches[0].clientX, touches[0].clientY], [touches[1].clientX, touches[1].clientY]) / Math.PI * 180;\n}\nfunction isMultiTouch(e) {\n return e.touches && e.touches.length >= 2;\n}\nfunction getEventClients(e) {\n if (e.touches) {\n return getClients(e.touches);\n } else {\n return [getClient(e)];\n }\n}\nfunction getPosition(clients, prevClients, startClients) {\n var length = startClients.length;\n\n var _a = getAverageClient(clients, length),\n clientX = _a.clientX,\n clientY = _a.clientY,\n originalClientX = _a.originalClientX,\n originalClientY = _a.originalClientY;\n\n var _b = getAverageClient(prevClients, length),\n prevX = _b.clientX,\n prevY = _b.clientY;\n\n var _c = getAverageClient(startClients, length),\n startX = _c.clientX,\n startY = _c.clientY;\n\n var deltaX = clientX - prevX;\n var deltaY = clientY - prevY;\n var distX = clientX - startX;\n var distY = clientY - startY;\n return {\n clientX: originalClientX,\n clientY: originalClientY,\n deltaX: deltaX,\n deltaY: deltaY,\n distX: distX,\n distY: distY\n };\n}\nfunction getDist(clients) {\n return Math.sqrt(Math.pow(clients[0].clientX - clients[1].clientX, 2) + Math.pow(clients[0].clientY - clients[1].clientY, 2));\n}\nfunction getClients(touches) {\n var length = Math.min(touches.length, 2);\n var clients = [];\n\n for (var i = 0; i < length; ++i) {\n clients.push(getClient(touches[i]));\n }\n\n return clients;\n}\nfunction getClient(e) {\n return {\n clientX: e.clientX,\n clientY: e.clientY\n };\n}\nfunction getAverageClient(clients, length) {\n if (length === void 0) {\n length = clients.length;\n }\n\n var sumClient = {\n clientX: 0,\n clientY: 0,\n originalClientX: 0,\n originalClientY: 0\n };\n\n for (var i = 0; i < length; ++i) {\n var client = clients[i];\n sumClient.originalClientX += \"originalClientX\" in client ? client.originalClientX : client.clientX;\n sumClient.originalClientY += \"originalClientY\" in client ? client.originalClientY : client.clientY;\n sumClient.clientX += client.clientX;\n sumClient.clientY += client.clientY;\n }\n\n if (!length) {\n return sumClient;\n }\n\n return {\n clientX: sumClient.clientX / length,\n clientY: sumClient.clientY / length,\n originalClientX: sumClient.originalClientX / length,\n originalClientY: sumClient.originalClientY / length\n };\n}\n\nvar ClientStore =\n/*#__PURE__*/\nfunction () {\n function ClientStore(clients) {\n this.prevClients = [];\n this.startClients = [];\n this.movement = 0;\n this.length = 0;\n this.startClients = clients;\n this.prevClients = clients;\n this.length = clients.length;\n }\n\n var __proto = ClientStore.prototype;\n\n __proto.addClients = function (clients) {\n if (clients === void 0) {\n clients = this.prevClients;\n }\n\n var position = this.getPosition(clients);\n var deltaX = position.deltaX,\n deltaY = position.deltaY;\n this.movement += Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n this.prevClients = clients;\n return position;\n };\n\n __proto.getAngle = function (clients) {\n if (clients === void 0) {\n clients = this.prevClients;\n }\n\n return getRotatiion(clients);\n };\n\n __proto.getRotation = function (clients) {\n if (clients === void 0) {\n clients = this.prevClients;\n }\n\n return getRotatiion(clients) - getRotatiion(this.startClients);\n };\n\n __proto.getPosition = function (clients) {\n return getPosition(clients || this.prevClients, this.prevClients, this.startClients);\n };\n\n __proto.getPositions = function (clients) {\n if (clients === void 0) {\n clients = this.prevClients;\n }\n\n var prevClients = this.prevClients;\n return this.startClients.map(function (startClient, i) {\n return getPosition([clients[i]], [prevClients[i]], [startClient]);\n });\n };\n\n __proto.getMovement = function (clients) {\n var movement = this.movement;\n\n if (!clients) {\n return movement;\n }\n\n var currentClient = getAverageClient(clients, this.length);\n var prevClient = getAverageClient(this.prevClients, this.length);\n var deltaX = currentClient.clientX - prevClient.clientX;\n var deltaY = currentClient.clientY - prevClient.clientY;\n return Math.sqrt(deltaX * deltaX + deltaY * deltaY) + movement;\n };\n\n __proto.getDistance = function (clients) {\n if (clients === void 0) {\n clients = this.prevClients;\n }\n\n return getDist(clients);\n };\n\n __proto.getScale = function (clients) {\n if (clients === void 0) {\n clients = this.prevClients;\n }\n\n return getDist(clients) / getDist(this.startClients);\n };\n\n __proto.move = function (deltaX, deltaY) {\n this.startClients.forEach(function (client) {\n client.clientX -= deltaX;\n client.clientY -= deltaY;\n });\n this.prevClients.forEach(function (client) {\n client.clientX -= deltaX;\n client.clientY -= deltaY;\n });\n };\n\n return ClientStore;\n}();\n\nvar INPUT_TAGNAMES = [\"textarea\", \"input\"];\n/**\n * You can set up drag, pinch events in any browser.\n */\n\nvar Gesto =\n/*#__PURE__*/\nfunction (_super) {\n __extends(Gesto, _super);\n /**\n *\n */\n\n\n function Gesto(targets, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _this = _super.call(this) || this;\n\n _this.options = {};\n _this.flag = false;\n _this.pinchFlag = false;\n _this.datas = {};\n _this.isDrag = false;\n _this.isPinch = false;\n _this.isMouse = false;\n _this.isTouch = false;\n _this.clientStores = [];\n _this.targets = [];\n _this.prevTime = 0;\n _this.doubleFlag = false;\n\n _this.onDragStart = function (e, isTrusted) {\n if (isTrusted === void 0) {\n isTrusted = true;\n }\n\n if (!_this.flag && e.cancelable === false) {\n return;\n }\n\n var _a = _this.options,\n container = _a.container,\n pinchOutside = _a.pinchOutside,\n preventRightClick = _a.preventRightClick,\n preventDefault = _a.preventDefault,\n checkInput = _a.checkInput;\n var isTouch = _this.isTouch;\n var isDragStart = !_this.flag;\n\n if (isDragStart) {\n var activeElement = document.activeElement;\n var target = e.target;\n var tagName = target.tagName.toLowerCase();\n var hasInput = INPUT_TAGNAMES.indexOf(tagName) > -1;\n var hasContentEditable = target.isContentEditable;\n\n if (hasInput || hasContentEditable) {\n if (checkInput || activeElement === target) {\n // force false or already focused.\n return false;\n }\n\n if (activeElement && hasContentEditable && activeElement.isContentEditable && activeElement.contains(target)) {\n return false;\n }\n } else if ((preventDefault || e.type === \"touchstart\") && activeElement) {\n var activeTagName = activeElement.tagName;\n\n if (activeElement.isContentEditable || INPUT_TAGNAMES.indexOf(activeTagName) > -1) {\n activeElement.blur();\n }\n }\n\n _this.clientStores = [new ClientStore(getEventClients(e))];\n _this.flag = true;\n _this.isDrag = false;\n _this.datas = {};\n\n if (preventRightClick && (e.which === 3 || e.button === 2)) {\n _this.initDrag();\n\n return false;\n }\n\n _this.doubleFlag = now() - _this.prevTime < 200;\n\n var result = _this.emit(\"dragStart\", __assign({\n datas: _this.datas,\n inputEvent: e,\n isTrusted: isTrusted,\n isDouble: _this.doubleFlag\n }, _this.getCurrentStore().getPosition()));\n\n if (result === false) {\n _this.initDrag();\n }\n\n _this.flag && preventDefault && e.preventDefault();\n }\n\n if (!_this.flag) {\n return false;\n }\n\n var timer = 0;\n\n if (isDragStart && isTouch && pinchOutside) {\n timer = setTimeout(function () {\n addEvent(container, \"touchstart\", _this.onDragStart, {\n passive: false\n });\n });\n }\n\n if (!isDragStart && isTouch && pinchOutside) {\n removeEvent(container, \"touchstart\", _this.onDragStart);\n }\n\n if (_this.flag && isMultiTouch(e)) {\n clearTimeout(timer);\n\n if (isDragStart && e.touches.length !== e.changedTouches.length) {\n return;\n }\n\n if (!_this.pinchFlag) {\n _this.onPinchStart(e);\n }\n }\n };\n\n _this.onDrag = function (e, isScroll) {\n if (!_this.flag) {\n return;\n }\n\n var clients = getEventClients(e);\n\n var result = _this.moveClients(clients, e, false);\n\n if (_this.pinchFlag || result.deltaX || result.deltaY) {\n var dragResult = _this.emit(\"drag\", __assign({}, result, {\n isScroll: !!isScroll,\n inputEvent: e\n }));\n\n if (dragResult === false) {\n _this.stop();\n\n return;\n }\n }\n\n if (_this.pinchFlag) {\n _this.onPinch(e, clients);\n }\n\n _this.getCurrentStore().addClients(clients);\n };\n\n _this.onDragEnd = function (e) {\n if (!_this.flag) {\n return;\n }\n\n var _a = _this.options,\n pinchOutside = _a.pinchOutside,\n container = _a.container;\n\n if (_this.isTouch && pinchOutside) {\n removeEvent(container, \"touchstart\", _this.onDragStart);\n }\n\n _this.flag = false;\n\n var position = _this.getCurrentStore().getPosition();\n\n var currentTime = now();\n var isDouble = !_this.isDrag && _this.doubleFlag;\n _this.prevTime = _this.isDrag || isDouble ? 0 : currentTime;\n\n _this.emit(\"dragEnd\", __assign({\n datas: _this.datas,\n isDouble: isDouble,\n isDrag: _this.isDrag,\n isClick: !_this.isDrag,\n inputEvent: e\n }, position));\n\n if (_this.pinchFlag) {\n _this.onPinchEnd(e);\n }\n\n _this.clientStores = [];\n };\n\n _this.onBlur = function () {\n _this.onDragEnd();\n };\n\n var elements = [].concat(targets);\n _this.options = __assign({\n checkInput: false,\n container: elements.length > 1 ? window : elements[0],\n preventRightClick: true,\n preventDefault: true,\n checkWindowBlur: false,\n pinchThreshold: 0,\n events: [\"touch\", \"mouse\"]\n }, options);\n var _a = _this.options,\n container = _a.container,\n events = _a.events,\n checkWindowBlur = _a.checkWindowBlur;\n _this.isTouch = events.indexOf(\"touch\") > -1;\n _this.isMouse = events.indexOf(\"mouse\") > -1;\n _this.targets = elements;\n\n if (_this.isMouse) {\n elements.forEach(function (el) {\n addEvent(el, \"mousedown\", _this.onDragStart);\n });\n addEvent(container, \"mousemove\", _this.onDrag);\n addEvent(container, \"mouseup\", _this.onDragEnd);\n addEvent(container, \"contextmenu\", _this.onDragEnd);\n }\n\n if (checkWindowBlur) {\n addEvent(window, \"blur\", _this.onBlur);\n }\n\n if (_this.isTouch) {\n var passive_1 = {\n passive: false\n };\n elements.forEach(function (el) {\n addEvent(el, \"touchstart\", _this.onDragStart, passive_1);\n });\n addEvent(container, \"touchmove\", _this.onDrag, passive_1);\n addEvent(container, \"touchend\", _this.onDragEnd, passive_1);\n addEvent(container, \"touchcancel\", _this.onDragEnd, passive_1);\n }\n\n return _this;\n }\n /**\n * Stop Gesto's drag events.\n */\n\n\n var __proto = Gesto.prototype;\n\n __proto.stop = function () {\n this.isDrag = false;\n this.flag = false;\n this.clientStores = [];\n this.datas = {};\n };\n /**\n * The total moved distance\n */\n\n\n __proto.getMovement = function (clients) {\n return this.getCurrentStore().getMovement(clients) + this.clientStores.slice(1).reduce(function (prev, cur) {\n return prev + cur.movement;\n }, 0);\n };\n /**\n * Whether to drag\n */\n\n\n __proto.isDragging = function () {\n return this.isDrag;\n };\n /**\n * Whether to start drag\n */\n\n\n __proto.isFlag = function () {\n return this.flag;\n };\n /**\n * Whether to start pinch\n */\n\n\n __proto.isPinchFlag = function () {\n return this.pinchFlag;\n };\n /**\n * Whether to start double click\n */\n\n\n __proto.isDoubleFlag = function () {\n return this.doubleFlag;\n };\n /**\n * Whether to pinch\n */\n\n\n __proto.isPinching = function () {\n return this.isPinch;\n };\n /**\n * If a scroll event occurs, it is corrected by the scroll distance.\n */\n\n\n __proto.scrollBy = function (deltaX, deltaY, e, isCallDrag) {\n if (isCallDrag === void 0) {\n isCallDrag = true;\n }\n\n if (!this.flag) {\n return;\n }\n\n this.clientStores[0].move(deltaX, deltaY);\n isCallDrag && this.onDrag(e, true);\n };\n /**\n * Create a virtual drag event.\n */\n\n\n __proto.move = function (_a, inputEvent) {\n var deltaX = _a[0],\n deltaY = _a[1];\n var store = this.getCurrentStore();\n var nextClients = store.prevClients;\n return this.moveClients(nextClients.map(function (_a) {\n var clientX = _a.clientX,\n clientY = _a.clientY;\n return {\n clientX: clientX + deltaX,\n clientY: clientY + deltaY,\n originalClientX: clientX,\n originalClientY: clientY\n };\n }), inputEvent, true);\n };\n /**\n * The dragStart event is triggered by an external event.\n */\n\n\n __proto.triggerDragStart = function (e) {\n this.onDragStart(e, false);\n };\n /**\n * Set the event data while dragging.\n */\n\n\n __proto.setEventDatas = function (datas) {\n var currentDatas = this.datas;\n\n for (var name in datas) {\n currentDatas[name] = datas[name];\n }\n\n return this;\n };\n /**\n * Set the event data while dragging.\n */\n\n\n __proto.getEventDatas = function () {\n return this.datas;\n };\n /**\n * Unset Gesto\n */\n\n\n __proto.unset = function () {\n var _this = this;\n\n var targets = this.targets;\n var container = this.options.container;\n this.off();\n removeEvent(window, \"blur\", this.onBlur);\n\n if (this.isMouse) {\n targets.forEach(function (target) {\n removeEvent(target, \"mousedown\", _this.onDragStart);\n });\n removeEvent(container, \"mousemove\", this.onDrag);\n removeEvent(container, \"mouseup\", this.onDragEnd);\n removeEvent(container, \"contextmenu\", this.onDragEnd);\n }\n\n if (this.isTouch) {\n targets.forEach(function (target) {\n removeEvent(target, \"touchstart\", _this.onDragStart);\n });\n removeEvent(container, \"touchstart\", this.onDragStart);\n removeEvent(container, \"touchmove\", this.onDrag);\n removeEvent(container, \"touchend\", this.onDragEnd);\n removeEvent(container, \"touchcancel\", this.onDragEnd);\n }\n };\n\n __proto.onPinchStart = function (e) {\n var pinchThreshold = this.options.pinchThreshold;\n\n if (this.isDrag && this.getMovement() > pinchThreshold) {\n return;\n }\n\n var store = new ClientStore(getEventClients(e));\n this.pinchFlag = true;\n this.clientStores.splice(0, 0, store);\n var result = this.emit(\"pinchStart\", __assign({\n datas: this.datas,\n angle: store.getAngle(),\n touches: this.getCurrentStore().getPositions()\n }, store.getPosition(), {\n inputEvent: e\n }));\n\n if (result === false) {\n this.pinchFlag = false;\n }\n };\n\n __proto.onPinch = function (e, clients) {\n if (!this.flag || !this.pinchFlag || clients.length < 2) {\n return;\n }\n\n var store = this.getCurrentStore();\n this.isPinch = true;\n this.emit(\"pinch\", __assign({\n datas: this.datas,\n movement: this.getMovement(clients),\n angle: store.getAngle(clients),\n rotation: store.getRotation(clients),\n touches: store.getPositions(clients),\n scale: store.getScale(clients),\n distance: store.getDistance(clients)\n }, store.getPosition(clients), {\n inputEvent: e\n }));\n };\n\n __proto.onPinchEnd = function (e) {\n if (!this.pinchFlag) {\n return;\n }\n\n var isPinch = this.isPinch;\n this.isPinch = false;\n this.pinchFlag = false;\n var store = this.getCurrentStore();\n this.emit(\"pinchEnd\", __assign({\n datas: this.datas,\n isPinch: isPinch,\n touches: store.getPositions()\n }, store.getPosition(), {\n inputEvent: e\n }));\n this.isPinch = false;\n this.pinchFlag = false;\n };\n\n __proto.initDrag = function () {\n this.clientStores = [];\n this.pinchFlag = false;\n this.doubleFlag = false;\n this.prevTime = 0;\n this.flag = false;\n };\n\n __proto.getCurrentStore = function () {\n return this.clientStores[0];\n };\n\n __proto.moveClients = function (clients, inputEvent, isAdd) {\n var store = this.getCurrentStore();\n var position = store[isAdd ? \"addClients\" : \"getPosition\"](clients);\n this.isDrag = true;\n return __assign({\n datas: this.datas\n }, position, {\n movement: this.getMovement(clients),\n isDrag: this.isDrag,\n isPinch: this.isPinch,\n isScroll: false,\n inputEvent: inputEvent\n });\n };\n\n return Gesto;\n}(EventEmitter);\n\nexport default Gesto;\n//# sourceMappingURL=gesto.esm.js.map\n","<template>\n <span ref=\"target\" class=\"m-editor-resizer\">\n <slot></slot>\n </span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, onMounted, onUnmounted, ref, toRaw } from 'vue';\nimport Gesto from 'gesto';\n\nimport { Services } from '@editor/type';\n\nexport default defineComponent({\n name: 'm-editor-resize',\n\n props: {\n type: {\n type: String,\n },\n },\n\n setup(props) {\n const services = inject<Services>('services');\n\n const target = ref<HTMLSpanElement>();\n\n let getso: Gesto;\n\n onMounted(() => {\n if (!target.value) return;\n getso = new Gesto(target.value, {\n container: window,\n pinchOutside: true,\n }).on('drag', (e) => {\n if (!target.value || !services) return;\n\n let { left, right } = {\n ...toRaw(services.uiService.get('columnWidth')),\n };\n if (props.type === 'left') {\n left += e.deltaX;\n } else if (props.type === 'right') {\n right -= e.deltaX;\n }\n services.uiService.set('columnWidth', {\n left,\n right,\n });\n });\n });\n\n onUnmounted(() => {\n getso?.unset();\n });\n\n return {\n target,\n };\n },\n});\n</script>\n","<template>\n <div class=\"m-editor\">\n <slot name=\"nav\" class=\"m-editor-nav-menu\"></slot>\n\n <magic-code-editor v-if=\"showSrc\" class=\"m-editor-content\" :init-values=\"root\" @save=\"saveCode\"></magic-code-editor>\n\n <div class=\"m-editor-content\" v-else>\n <div class=\"m-editor-framework-left\" :style=\"`width: ${columnWidth?.left}px`\">\n <slot name=\"sidebar\"></slot>\n </div>\n\n <resizer type=\"left\"></resizer>\n\n <template v-if=\"pageLength > 0\">\n <div class=\"m-editor-framework-center\" :style=\"`width: ${columnWidth?.center}px`\">\n <slot name=\"workspace\"></slot>\n </div>\n\n <resizer type=\"right\"></resizer>\n\n <div class=\"m-editor-framework-right\" :style=\"`width: ${columnWidth?.right}px`\">\n <el-scrollbar>\n <slot name=\"propsPanel\"></slot>\n </el-scrollbar>\n </div>\n </template>\n\n <slot v-else name=\"empty\">\n <add-page-box></add-page-box>\n </slot>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject } from 'vue';\n\nimport type { MApp } from '@tmagic/schema';\n\nimport { GetColumnWidth, Services } from '@editor/type';\n\nimport AddPageBox from './AddPageBox.vue';\nimport Resizer from './Resizer.vue';\n\nexport default defineComponent({\n components: {\n AddPageBox,\n Resizer,\n },\n\n setup() {\n const services = inject<Services>('services');\n\n const root = computed(() => services?.editorService.get<MApp>('root'));\n\n return {\n root,\n pageLength: computed(() => root.value?.items?.length || 0),\n showSrc: computed(() => services?.uiService.get<boolean>('showSrc')),\n columnWidth: computed(() => services?.uiService.get<GetColumnWidth>('columnWidth')),\n\n saveCode(value: string) {\n try {\n // eslint-disable-next-line no-eval\n services?.editorService.set('root', eval(value));\n } catch (e: any) {\n console.error(e);\n }\n },\n };\n },\n});\n</script>\n","<template>\n <el-icon v-if=\"!icon\"><edit></edit></el-icon>\n <img v-else-if=\"typeof icon === 'string' && icon.startsWith('http')\" :src=\"icon\" />\n <i v-else-if=\"typeof icon === 'string'\" :class=\"icon\"></i>\n <el-icon v-else><component :is=\"toRaw(icon)\"></component></el-icon>\n</template>\n\n<script lang=\"ts\">\nimport { Component, defineComponent, PropType, toRaw } from 'vue';\nimport { Edit } from '@element-plus/icons';\n\nexport default defineComponent({\n name: 'm-icon',\n\n components: { Edit },\n\n props: {\n icon: {\n type: [String, Object] as PropType<string | Component>,\n },\n },\n\n setup() {\n return {\n toRaw,\n };\n },\n});\n</script>\n","<template>\n <div v-if=\"display\" class=\"menu-item\">\n <el-divider v-if=\"item.type === 'divider'\" direction=\"vertical\"></el-divider>\n <div v-else-if=\"item.type === 'text'\" class=\"menu-item-text\">{{ item.text }}</div>\n\n <template v-else-if=\"item.type === 'zoom'\">\n <m-icon :icon=\"ZoomIn\" @click=\"zoomInHandler\"></m-icon>\n <span class=\"menu-item-text\" style=\"margin: 0 5px\">{{ parseInt(`${zoom * 100}`, 10) }}%</span>\n <m-icon :icon=\"ZoomOut\" @click=\"zoomOutHandler\"></m-icon>\n </template>\n\n <el-tooltip\n v-else-if=\"item.type === 'button'\"\n effect=\"dark\"\n placement=\"bottom-start\"\n :content=\"item.tooltip || item.text\"\n >\n <el-button size=\"small\" type=\"text\" :disabled=\"disabled\" @click=\"buttonHandler(item)\"\n ><m-icon :icon=\"item.icon\"></m-icon><span>{{ item.text }}</span></el-button\n >\n </el-tooltip>\n\n <el-dropdown v-else-if=\"item.type === 'dropdown'\" trigger=\"click\" :disabled=\"disabled\" @command=\"dropdownHandler\">\n <span class=\"el-dropdown-link menubar-menu-button\">\n {{ item.text }}<el-icon class=\"el-icon--right\"><arrow-down></arrow-down></el-icon>\n </span>\n <template #dropdown>\n <el-dropdown-menu v-if=\"item.items && item.items.length\">\n <el-dropdown-item v-for=\"(subItem, index) in item.items\" :key=\"index\" :command=\"{ item, subItem }\">{{\n subItem.text\n }}</el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n\n <component v-else-if=\"item.type === 'component'\" v-bind=\"item.props || {}\" :is=\"item.component\"></component>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, PropType } from 'vue';\nimport { ArrowDown, Back, Delete, Grid, Right, ScaleToOriginal, ZoomIn, ZoomOut } from '@element-plus/icons';\n\nimport MIcon from '@editor/components/Icon.vue';\nimport type { MenuButton, MenuComponent, MenuItem, Services } from '@editor/type';\n\nexport default defineComponent({\n components: { MIcon, ArrowDown },\n\n props: {\n data: {\n type: [Object, String] as PropType<MenuItem | string>,\n require: true,\n default: () => ({\n type: 'text',\n display: false,\n }),\n },\n },\n\n setup(props) {\n const services = inject<Services>('services');\n const uiService = services?.uiService;\n\n const zoomInHandler = () => uiService?.set('zoom', zoom.value + 0.1);\n const zoomOutHandler = () => uiService?.set('zoom', zoom.value - 0.1);\n\n const zoom = computed((): number => uiService?.get<number>('zoom') ?? 1);\n const showGuides = computed((): boolean => uiService?.get<boolean>('showGuides') ?? true);\n const showRule = computed((): boolean => uiService?.get<boolean>('showRule') ?? true);\n\n const item = computed((): MenuButton | MenuComponent => {\n if (typeof props.data !== 'string') {\n return props.data;\n }\n switch (props.data) {\n case '/':\n return {\n type: 'divider',\n };\n case 'zoom':\n return {\n type: 'zoom',\n };\n case 'delete':\n return {\n type: 'button',\n icon: Delete,\n tooltip: '刪除',\n disabled: () => services?.editorService.get('node')?.type === 'page',\n handler: () => services?.editorService.remove(services?.editorService.get('node')),\n };\n case 'undo':\n return {\n type: 'button',\n icon: Back,\n tooltip: '后退',\n disabled: () => !services?.historyService.state.canUndo,\n handler: () => services?.editorService.undo(),\n };\n case 'redo':\n return {\n type: 'button',\n icon: Right,\n tooltip: '前进',\n disabled: () => !services?.historyService.state.canRedo,\n handler: () => services?.editorService.redo(),\n };\n case 'zoom-in':\n return {\n type: 'button',\n icon: ZoomIn,\n tooltip: '放大',\n handler: zoomInHandler,\n };\n case 'zoom-out':\n return {\n type: 'button',\n icon: ZoomOut,\n tooltip: '縮小',\n handler: zoomOutHandler,\n };\n case 'rule':\n return {\n type: 'button',\n icon: ScaleToOriginal,\n tooltip: showRule.value ? '隐藏标尺' : '显示标尺',\n handler: () => uiService?.set('showRule', !showRule.value),\n };\n case 'guides':\n return {\n type: 'button',\n icon: Grid,\n tooltip: showGuides.value ? '隐藏参考线' : '显示参考线',\n handler: () => uiService?.set('showGuides', !showGuides.value),\n };\n default:\n return {\n type: 'text',\n text: props.data,\n };\n }\n });\n\n const disabled = computed(() => {\n if (typeof item.value === 'string') return false;\n if (item.value.type === 'component') return false;\n if (typeof item.value.disabled === 'function') {\n return item.value.disabled(services);\n }\n return item.value.disabled;\n });\n\n return {\n ZoomIn,\n ZoomOut,\n\n item,\n zoom,\n disabled,\n display: computed(() => {\n if (!item.value) return false;\n if (typeof item.value === 'string') return true;\n if (typeof item.value.display === 'function') {\n return item.value.display(services);\n }\n return item.value.display ?? true;\n }),\n\n zoomInHandler,\n zoomOutHandler,\n\n dropdownHandler(command: any) {\n if (command.item.handler) {\n command.item.handler(services);\n }\n },\n\n buttonHandler(item: MenuButton | MenuComponent) {\n if (disabled.value) return;\n if (typeof (item as MenuButton).handler === 'function') {\n (item as MenuButton).handler?.(services);\n }\n },\n };\n },\n});\n</script>\n","<template>\n <div class=\"m-editor-nav-menu\" :style=\"{ height: `${height}px` }\">\n <div v-for=\"key in keys\" :class=\"`menu-${key}`\" :key=\"key\">\n <tool-button :data=\"item\" v-for=\"(item, index) in data[key]\" :key=\"index\"></tool-button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, PropType } from 'vue';\n\nimport ToolButton from '@editor/components/ToolButton.vue';\nimport { MenuBarData } from '@editor/type';\n\nexport default defineComponent({\n name: 'nav-menu',\n\n components: { ToolButton },\n\n props: {\n data: {\n type: Object as PropType<MenuBarData>,\n default: () => ({}),\n },\n\n height: {\n type: Number,\n },\n },\n\n setup(props) {\n return {\n keys: computed(() => Object.keys(props.data) as Array<keyof MenuBarData>),\n };\n },\n});\n</script>\n","<template>\n <m-form\n class=\"m-editor-props-panel\"\n ref=\"configForm\"\n size=\"small\"\n :init-values=\"values\"\n :config=\"curFormConfig\"\n @change=\"submit\"\n ></m-form>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, getCurrentInstance, inject, onMounted, ref, watchEffect } from 'vue';\nimport { ElMessage } from 'element-plus';\n\nimport type { FormValue, MForm } from '@tmagic/form';\nimport type { MNode } from '@tmagic/schema';\n\nimport type { Services } from '@editor/type';\n\nexport default defineComponent({\n name: 'm-editor-props-panel',\n\n emits: ['mounted'],\n\n setup(props, { emit }) {\n const internalInstance = getCurrentInstance();\n const values = ref<FormValue>({});\n const configForm = ref<InstanceType<typeof MForm>>();\n // ts类型应该是FormConfig, 但是打包时会出错,所以暂时用any\n const curFormConfig = ref<any>([]);\n const services = inject<Services>('services');\n\n const init = async () => {\n const node = services?.editorService.get<MNode | null>('node');\n\n if (!node) {\n curFormConfig.value = [];\n return;\n }\n\n if (node.devconfig && node.style && !isNaN(+node.style.height) && !isNaN(+node.style.width)) {\n node.devconfig.ratio = node.style.height / node.style.width || 1;\n }\n\n values.value = node;\n const type = node.type || (node.items ? 'container' : 'text');\n curFormConfig.value = (await services?.propsService.getPropsConfig(type)) || [];\n };\n\n watchEffect(init);\n services?.propsService.on('props-configs-change', init);\n\n onMounted(() => {\n emit('mounted', internalInstance);\n });\n\n return {\n values,\n configForm,\n curFormConfig,\n\n async submit() {\n try {\n const values = await configForm.value?.submitForm();\n services?.editorService.update(values);\n } catch (e: any) {\n console.error(e);\n ElMessage.closeAll();\n ElMessage.error({\n duration: 10000,\n showClose: true,\n message: e.message,\n dangerouslyUseHTMLString: true,\n });\n }\n },\n };\n },\n});\n</script>\n","<template>\n <el-scrollbar>\n <el-collapse class=\"ui-component-panel\" :model-value=\"collapseValue\">\n <el-input\n prefix-icon=\"el-icon-search\"\n placeholder=\"输入关键字进行过滤\"\n class=\"search-input\"\n size=\"small\"\n clearable\n v-model=\"searchText\"\n />\n <template v-for=\"(group, index) in list\">\n <el-collapse-item v-if=\"group.items && group.items.length\" :key=\"index\" :name=\"index\">\n <template #title><i class=\"el-icon-s-grid\"></i>{{ group.title }}</template>\n <div class=\"component-item\" v-for=\"item in group.items\" :key=\"item.type\" @click=\"appendComponent(item)\">\n <m-icon :icon=\"item.icon\"></m-icon>\n\n <el-tooltip effect=\"dark\" placement=\"bottom\" :content=\"item.text\">\n <span>{{ item.text }}</span>\n </el-tooltip>\n </div>\n </el-collapse-item>\n </template>\n </el-collapse>\n </el-scrollbar>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref } from 'vue';\n\nimport MIcon from '@editor/components/Icon.vue';\nimport type { ComponentGroup, ComponentItem, Services } from '@editor/type';\n\nexport default defineComponent({\n name: 'ui-component-panel',\n\n components: { MIcon },\n\n setup() {\n const searchText = ref('');\n const services = inject<Services>('services');\n const list = computed(() =>\n services?.componentListService.getList().map((group: ComponentGroup) => ({\n ...group,\n items: group.items.filter((item: ComponentItem) => item.text.includes(searchText.value)),\n })),\n );\n const collapseValue = computed(() =>\n Array(list.value?.length)\n .fill(1)\n .map((x, i) => i),\n );\n\n return {\n searchText,\n collapseValue,\n list,\n\n appendComponent({ text, type, ...config }: ComponentItem): void {\n services?.editorService.add({\n name: text,\n type,\n ...config,\n });\n },\n };\n },\n});\n</script>\n","<template>\n <div v-if=\"node\" class=\"magic-editor-content-menu\">\n <div\n v-if=\"node.items\"\n class=\"magic-editor-content-menu-item\"\n @mouseenter=\"setSubVisiable(true)\"\n @mouseleave=\"setSubVisiable(false)\"\n >\n 新增\n </div>\n <div v-if=\"node.type !== 'app'\" class=\"magic-editor-content-menu-item\" @click=\"() => copy(node)\">复制</div>\n <div\n v-if=\"node.type !== 'app' && node.type !== 'page'\"\n class=\"magic-editor-content-menu-item\"\n @click=\"() => remove()\"\n >\n 删除\n </div>\n <div class=\"subMenu\" v-show=\"subVisible\" @mouseenter=\"setSubVisiable(true)\" @mouseleave=\"setSubVisiable(false)\">\n <el-scrollbar>\n <template v-if=\"node.type === 'tabs'\">\n <div\n class=\"magic-editor-content-menu-item\"\n @click=\"\n () =>\n append({\n type: 'tab-pane',\n })\n \"\n >\n 标签\n </div>\n </template>\n\n <template v-else-if=\"node.type === 'app'\">\n <div\n class=\"magic-editor-content-menu-item\"\n v-for=\"item in menu.app\"\n :key=\"item.type\"\n @click=\"() => append(item)\"\n >\n {{ item.text }}\n </div>\n </template>\n\n <template v-else-if=\"node.items\">\n <div v-for=\"list in menu.component\" :key=\"list.title\">\n <template v-for=\"item in list.items\">\n <div class=\"magic-editor-content-menu-item\" v-if=\"item\" :key=\"item.type\" @click=\"() => append(item)\">\n {{ item.text }}\n </div>\n </template>\n <div class=\"separation\"></div>\n </div>\n </template>\n </el-scrollbar>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, PropType, ref } from 'vue';\n\nimport type { ComponentGroup, Services } from '@editor/type';\n\nexport default defineComponent({\n name: 'magic-editor-content-menu',\n\n props: {\n componentGroupList: {\n type: Array as PropType<ComponentGroup[]>,\n default: () => [],\n },\n },\n\n setup(props) {\n const services = inject<Services>('services');\n const subVisible = ref(false);\n const node = computed(() => services?.editorService.get('node'));\n\n return {\n subVisible,\n\n node,\n\n menu: computed(() => ({\n app: [\n {\n type: 'page',\n text: '页面',\n },\n ],\n component: props.componentGroupList,\n })),\n\n append(config: any) {\n services?.editorService.add({\n name: config.text,\n type: config.type,\n });\n },\n\n remove() {\n node.value && services?.editorService.remove(node.value);\n },\n\n copy(node: any) {\n services?.editorService.copy(node);\n },\n\n setSubVisiable(v: any) {\n subVisible.value = v;\n },\n };\n },\n});\n</script>\n","<template>\n <el-scrollbar class=\"magic-editor-layer-panel\">\n <el-input\n class=\"filterInput\"\n size=\"small\"\n placeholder=\"输入关键字进行过滤\"\n clearable\n v-model=\"filterText\"\n @change=\"filterTextChangeHandler\"\n ></el-input>\n\n <el-tree\n v-if=\"values.length\"\n ref=\"tree\"\n node-key=\"id\"\n draggable\n :load=\"loadItems\"\n :data=\"values\"\n :expand-on-click-node=\"false\"\n :highlight-current=\"true\"\n :props=\"{\n children: 'items',\n }\"\n :filter-node-method=\"filterNode\"\n :allow-drop=\"allowDrop\"\n @node-click=\"clickHandler\"\n @node-contextmenu=\"contextmenu\"\n @node-drag-end=\"handleDragEnd\"\n empty-text=\"页面空荡荡的\"\n >\n <template #default=\"{ node, data }\">\n <slot name=\"layer-node-content\" :node=\"node\" :data=\"data\">\n <span>\n {{ `${data.name} (${data.id})` }}\n </span>\n </slot>\n </template>\n </el-tree>\n\n <teleport to=\"body\">\n <layer-menu :style=\"menuStyle\"></layer-menu>\n </teleport>\n </el-scrollbar>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, onMounted, Ref, ref, watchEffect } from 'vue';\nimport type { ElTree } from 'element-plus';\n\nimport type { MNode, MPage } from '@tmagic/schema';\n\nimport type { EditorService } from '@editor/services/editor';\nimport type { Services } from '@editor/type';\n\nimport LayerMenu from './LayerMenu.vue';\n\nconst select = (data: MNode, editorService?: EditorService) => {\n if (!data.id) {\n throw new Error('没有id');\n }\n\n editorService?.select(data);\n};\n\nconst useDrop = (tree: Ref<InstanceType<typeof ElTree> | undefined>, editorService?: EditorService) => ({\n allowDrop: (draggingNode: any, dropNode: any, type: string): boolean => {\n const { data } = dropNode || {};\n const { data: ingData } = draggingNode;\n\n const { type: ingType } = ingData;\n\n if (ingType !== 'page' && data.type === 'page') return false;\n if (ingType === 'page' && data.type !== 'page') return false;\n if (!data || !data.type) return false;\n if (['prev', 'next'].includes(type)) return true;\n if (data.items || data.type === 'container') return true;\n\n return false;\n },\n\n handleDragEnd() {\n if (!tree.value) return;\n const { data } = tree.value;\n const [page] = data as [MPage];\n editorService?.update(page);\n },\n});\n\nconst useStatus = (tree: Ref<InstanceType<typeof ElTree> | undefined>, editorService?: EditorService) => {\n const page = computed(() => editorService?.get('page'));\n\n watchEffect(() => {\n if (!tree.value) return;\n\n const node = editorService?.get('node');\n node && tree.value.setCurrentKey(node.id, true);\n\n const parent = editorService?.get('parent');\n if (!parent?.id) return;\n\n const treeNode = tree.value.getNode(parent.id);\n treeNode?.updateChildren();\n });\n\n return {\n values: computed(() => (page.value ? [page.value] : [])),\n\n loadItems: (node: any, resolve: Function) => {\n if (Array.isArray(node.data)) {\n return resolve(node.data);\n }\n if (Array.isArray(node.data?.items)) {\n return resolve(node.data?.items);\n }\n resolve([]);\n },\n };\n};\n\nconst useFilter = (tree: Ref<InstanceType<typeof ElTree> | undefined>) => ({\n filterText: ref(''),\n\n filterNode: (value: string, data: MNode): boolean => {\n if (!value) {\n return true;\n }\n let name = '';\n if (data.name) {\n name = data.name;\n } else if (data.type) {\n name = data.type;\n } else if (data.items) {\n name = 'container';\n }\n return name.indexOf(value) !== -1;\n },\n\n filterTextChangeHandler(val: string) {\n tree.value?.filter(val);\n },\n});\n\nconst useContentMenu = (editorService?: EditorService) => {\n const menuStyle = ref({\n position: 'absolute',\n left: '0',\n top: '0',\n display: 'none',\n });\n\n onMounted(() => {\n document.addEventListener(\n 'click',\n () => {\n menuStyle.value.display = 'none';\n },\n true,\n );\n });\n\n return {\n menuStyle,\n\n contextmenu(event: MouseEvent, data: MNode) {\n const bodyHeight = globalThis.document.body.clientHeight;\n\n const left = `${event.clientX + 20}px`;\n let top = `${event.clientY - 10}px`;\n\n if (event.clientY + 300 > bodyHeight) {\n top = `${bodyHeight - 300}px`;\n }\n\n menuStyle.value.left = left;\n menuStyle.value.top = top;\n menuStyle.value.display = '';\n\n select(data, editorService);\n },\n };\n};\n\nexport default defineComponent({\n name: 'magic-editor-layer-panel',\n\n components: { LayerMenu },\n\n setup() {\n const services = inject<Services>('services');\n const tree = ref<InstanceType<typeof ElTree>>();\n const editorService = services?.editorService;\n return {\n tree,\n ...useDrop(tree, editorService),\n ...useStatus(tree, editorService),\n ...useFilter(tree),\n ...useContentMenu(editorService),\n\n clickHandler(data: MNode): void {\n if (services?.uiService.get<boolean>('uiSelectMode')) {\n document.dispatchEvent(new CustomEvent('ui-select', { detail: data }));\n return;\n }\n select(data, editorService);\n },\n };\n },\n});\n</script>\n","<template>\n <el-tabs v-if=\"data.type === 'tabs'\" class=\"m-editor-sidebar\" v-model=\"activeTabName\" type=\"card\" tab-position=\"left\">\n <el-tab-pane v-for=\"item in items\" :key=\"item.text\" :name=\"item.text\">\n <template #label>\n <span>\n <m-icon v-if=\"item.icon\" :icon=\"item.icon\"></m-icon>\n <div v-if=\"item.text\" class=\"magic-editor-tab-panel-title\">{{ item.text }}</div>\n </span>\n </template>\n\n <component :is=\"item.component\" v-bind=\"item.props || {}\" v-on=\"item.listeners || {}\">\n <template #layer-node-content=\"{ data, node }\" v-if=\"item.slots?.layerNodeContent\">\n <component :is=\"item.slots.layerNodeContent\" :data=\"data\" :node=\"node\" />\n </template>\n </component>\n </el-tab-pane>\n </el-tabs>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, PropType, ref, watch } from 'vue';\nimport { Coin, Files } from '@element-plus/icons';\n\nimport MIcon from '@editor/components/Icon.vue';\nimport { SideBarData, SideComponent } from '@editor/type';\n\nimport ComponentListPanel from './ComponentListPanel.vue';\nimport LayerPanel from './LayerPanel.vue';\n\nexport default defineComponent({\n name: 'm-sidebar',\n\n components: { MIcon },\n\n props: {\n data: {\n type: Object as PropType<SideBarData>,\n default: () => ({ type: 'tabs', status: '组件', items: ['component-list', 'layer'] }),\n },\n },\n\n setup(props) {\n const activeTabName = ref(props.data?.status);\n\n watch(\n () => props.data?.status,\n (status) => {\n activeTabName.value = status || '0';\n },\n );\n\n return {\n activeTabName,\n\n items: computed<SideComponent[] | Record<string, any>[]>(() =>\n props.data?.items.map((item) => {\n if (typeof item !== 'string') {\n return item;\n }\n\n switch (item) {\n case 'component-list':\n return {\n type: 'component',\n icon: Coin,\n text: '组件',\n component: ComponentListPanel,\n slots: {},\n };\n case 'layer':\n return {\n type: 'component',\n icon: Files,\n text: '已选组件',\n component: LayerPanel,\n slots: {},\n };\n default:\n return {};\n }\n }),\n ),\n };\n },\n});\n</script>\n","<template>\n <div class=\"m-editor-page-bar\">\n <div class=\"m-editor-page-bar-item\" @click=\"addPage\">\n <el-icon class=\"m-editor-page-bar-menu-add-icon\"><plus></plus></el-icon>\n </div>\n <template v-if=\"root\">\n <div\n v-for=\"item in root.items\"\n :key=\"item.key\"\n class=\"m-editor-page-bar-item\"\n :class=\"{ active: page?.id === item.id }\"\n @click=\"switchPage(item)\"\n >\n <slot name=\"page-bar-title\" :page=\"item\">\n <span>{{ item.name }}</span>\n </slot>\n\n <el-popover placement=\"top\" :width=\"160\" trigger=\"hover\">\n <div>\n <slot name=\"page-bar-popover\" :page=\"item\">\n <div class=\"magic-editor-content-menu-item\" @click=\"() => copy(item)\">复制</div>\n <div class=\"magic-editor-content-menu-item\" @click=\"() => remove(item)\">删除</div>\n </slot>\n </div>\n <template #reference>\n <el-icon class=\"m-editor-page-bar-menu-icon\">\n <caret-bottom></caret-bottom>\n </el-icon>\n </template>\n </el-popover>\n </div>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, toRaw } from 'vue';\nimport { CaretBottom, Plus } from '@element-plus/icons';\n\nimport type { MPage } from '@tmagic/schema';\n\nimport type { Services } from '@editor/type';\nimport { generatePageNameByApp } from '@editor/utils/editor';\n\nexport default defineComponent({\n components: { CaretBottom, Plus },\n\n setup() {\n const services = inject<Services>('services');\n const editorService = services?.editorService;\n\n return {\n root: computed(() => editorService?.get('root')),\n page: computed(() => editorService?.get('page')),\n\n switchPage(page: MPage) {\n editorService?.select(page);\n },\n\n addPage() {\n if (!editorService) return;\n const pageConfig = {\n type: 'page',\n name: generatePageNameByApp(toRaw(editorService.get('root'))),\n };\n editorService.add(pageConfig);\n },\n\n copy(node: MPage) {\n node && editorService?.copy(node);\n editorService?.paste({\n left: 0,\n top: 0,\n });\n },\n\n remove(node: MPage) {\n editorService?.remove(node);\n },\n };\n },\n});\n</script>\n","<template>\n <div class=\"magic-editor-content-menu\" ref=\"menu\">\n <div>\n <div class=\"magic-editor-content-menu-item\" @click=\"() => center()\" v-if=\"canCenter\">水平居中</div>\n <div class=\"magic-editor-content-menu-item\" @click=\"() => copy()\">复制</div>\n <div class=\"magic-editor-content-menu-item\" @click=\"paste\" v-if=\"canPaste\">粘贴</div>\n <template v-if=\"canMoveZPos\">\n <div class=\"separation\"></div>\n <div class=\"magic-editor-content-menu-item\" @click=\"topItem\">上移一层</div>\n <div class=\"magic-editor-content-menu-item\" @click=\"bottomItem\">下移一层</div>\n <div class=\"magic-editor-content-menu-item\" @click=\"top\">置顶</div>\n <div class=\"magic-editor-content-menu-item\" @click=\"bottom\">置底</div>\n </template>\n <template v-if=\"canDelete\">\n <div class=\"separation\"></div>\n <div class=\"magic-editor-content-menu-item\" @click=\"() => remove()\">删除</div>\n </template>\n <div class=\"separation\"></div>\n <div class=\"magic-editor-content-menu-item\" @click=\"clearGuides\">清空参考线</div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, onMounted, ref, watch } from 'vue';\n\nimport type StageCore from '@tmagic/stage';\n\nimport { LayerOffset, Layout, Services } from '@editor/type';\nimport { COPY_STORAGE_KEY } from '@editor/utils/editor';\n\nexport default defineComponent({\n name: 'magic-editor-ui-viewer-menu',\n\n setup() {\n const services = inject<Services>('services');\n const editorService = services?.editorService;\n const menu = ref<HTMLDivElement>();\n const canPaste = ref(false);\n const canCenter = ref(false);\n\n const node = computed(() => editorService?.get('node'));\n const parent = computed(() => editorService?.get('parent'));\n\n onMounted(() => {\n const data = globalThis.localStorage.getItem(COPY_STORAGE_KEY);\n canPaste.value = data !== 'undefined' && !!data;\n });\n\n watch(\n parent,\n async () => {\n if (!parent.value || !editorService) return (canCenter.value = false);\n const layout = await editorService.getLayout(parent.value);\n canCenter.value =\n [Layout.ABSOLUTE, Layout.FIXED].includes(layout) && !['app', 'page', 'pop'].includes(`${node.value?.type}`);\n },\n { immediate: true },\n );\n\n return {\n menu,\n canPaste,\n\n canDelete: computed(() => node.value?.type !== 'page'),\n canMoveZPos: computed(() => node.value?.type !== 'page'),\n canCenter,\n\n center() {\n node.value && editorService?.alignCenter(node.value);\n },\n\n copy() {\n node.value && editorService?.copy(node.value);\n canPaste.value = true;\n },\n\n paste() {\n const top = menu.value?.offsetTop || 0;\n const left = menu.value?.offsetLeft || 0;\n editorService?.paste({ left, top });\n },\n\n remove() {\n node.value && editorService?.remove(node.value);\n },\n\n top() {\n editorService?.moveLayer(LayerOffset.TOP);\n },\n\n bottom() {\n editorService?.moveLayer(LayerOffset.BOTTOM);\n },\n\n topItem() {\n editorService?.moveLayer(1);\n },\n\n bottomItem() {\n editorService?.moveLayer(-1);\n },\n\n clearGuides() {\n editorService?.get<StageCore>('stage').clearGuides();\n },\n };\n },\n});\n</script>\n","<template>\n <div class=\"m-editor-stage\">\n <div\n class=\"m-editor-stage-container\"\n ref=\"stageContainer\"\n :style=\"stageStyle\"\n @contextmenu=\"contextmenuHandler\"\n ></div>\n <teleport to=\"body\">\n <viewer-menu ref=\"menu\" :style=\"menuStyle\"></viewer-menu>\n </teleport>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport {\n computed,\n defineComponent,\n inject,\n onMounted,\n onUnmounted,\n PropType,\n ref,\n toRaw,\n watch,\n watchEffect,\n} from 'vue';\nimport { cloneDeep } from 'lodash-es';\n\nimport type { MApp, MNode, MPage } from '@tmagic/schema';\nimport type { MoveableOptions, Runtime, SortEventData, UpdateEventData } from '@tmagic/stage';\nimport StageCore from '@tmagic/stage';\n\nimport type { Services } from '@editor/type';\n\nimport ViewerMenu from './ViewerMenu.vue';\n\nconst useMenu = () => {\n const menu = ref<InstanceType<typeof ViewerMenu>>();\n const menuStyle = ref({\n display: 'none',\n left: '0',\n top: '0',\n });\n\n onMounted(() => {\n document.addEventListener(\n 'click',\n () => {\n menuStyle.value.display = 'none';\n },\n true,\n );\n });\n\n return {\n menu,\n menuStyle,\n\n contextmenuHandler(e: MouseEvent) {\n e.preventDefault();\n\n const menuHeight = menu.value?.$el.clientHeight;\n let top = e.clientY;\n if (menuHeight + e.clientY > document.body.clientHeight) {\n top = document.body.clientHeight - menuHeight;\n }\n menuStyle.value = {\n display: 'block',\n top: `${top}px`,\n left: `${e.clientX}px`,\n };\n },\n };\n};\n\nexport default defineComponent({\n name: 'magic-stage',\n\n components: {\n ViewerMenu,\n },\n\n props: {\n render: {\n type: Function as PropType<() => HTMLDivElement>,\n },\n\n runtimeUrl: String,\n\n root: {\n type: Object as PropType<MApp>,\n },\n\n page: {\n type: Object as PropType<MPage>,\n },\n\n node: {\n type: Object as PropType<MNode>,\n },\n\n uiSelectMode: {\n type: Boolean,\n },\n\n zoom: {\n type: Number,\n },\n\n canSelect: {\n type: Function as PropType<(el: HTMLElement) => boolean | Promise<boolean>>,\n default: (el: HTMLElement) => Boolean(el.id),\n },\n\n moveableOptions: {\n type: [Object, Function] as PropType<MoveableOptions | ((core?: StageCore) => MoveableOptions)>,\n default: () => (core?: StageCore) => ({\n container: core?.renderer?.contentWindow?.document.getElementById('app'),\n }),\n },\n },\n\n emits: ['select', 'update', 'sort'],\n\n setup(props, { emit }) {\n const services = inject<Services>('services');\n const stageContainer = ref<HTMLDivElement>();\n\n const stageStyle = computed(() => ({\n ...services?.uiService.get<Record<string, string | number>>('stageStyle'),\n transform: `scale(${props.zoom}) translate3d(0, -50%, 0)`,\n }));\n\n let stage: StageCore | null = null;\n let runtime: Runtime | null = null;\n\n watchEffect(() => {\n if (stage) return;\n\n if (!stageContainer.value) return;\n if (!(props.runtimeUrl || props.render) || !props.root) return;\n\n stage = new StageCore({\n render: props.render,\n runtimeUrl: props.runtimeUrl,\n zoom: props.zoom,\n canSelect: (el, stop) => {\n const elCanSelect = props.canSelect(el);\n // 在组件联动过程中不能再往下选择,返回并触发 ui-select\n if (props.uiSelectMode && elCanSelect) {\n document.dispatchEvent(new CustomEvent('ui-select', { detail: el }));\n return stop();\n }\n\n return elCanSelect;\n },\n moveableOptions: props.moveableOptions,\n });\n\n services?.editorService.set('stage', stage);\n\n stage?.mount(stageContainer.value);\n\n stage?.on('select', (el: HTMLElement) => emit('select', el));\n\n stage?.on('update', (ev: UpdateEventData) => {\n emit('update', { id: ev.el.id, style: ev.style });\n });\n\n stage?.on('sort', (ev: SortEventData) => {\n emit('sort', ev);\n });\n\n stage?.on('changeGuides', () => {\n services?.uiService.set('showGuides', true);\n });\n\n if (!props.node?.id) return;\n stage?.on('runtime-ready', (rt) => {\n runtime = rt;\n // toRaw返回的值是一个引用而非快照,需要cloneDeep\n props.root && runtime?.updateRootConfig(cloneDeep(toRaw(props.root)));\n props.page?.id && runtime?.updatePageId?.(props.page.id);\n setTimeout(() => {\n props.node && stage?.select(toRaw(props.node.id));\n });\n });\n });\n\n watch(\n () => props.zoom,\n (zoom) => {\n if (!stage || !zoom) return;\n stage?.setZoom(zoom);\n },\n );\n\n watch(\n () => props.root,\n (root) => {\n if (runtime && root) {\n runtime.updateRootConfig(cloneDeep(toRaw(root)));\n }\n },\n );\n\n onUnmounted(() => {\n stage?.destroy();\n services?.editorService.set('stage', null);\n });\n\n return {\n stageStyle,\n ...useMenu(),\n\n stageContainer,\n };\n },\n});\n</script>\n","<template>\n <div class=\"m-editor-workspace\">\n <magic-stage\n :key=\"page?.id\"\n :runtime-url=\"runtimeUrl\"\n :render=\"render\"\n :ui-select-mode=\"uiSelectMode\"\n :root=\"root\"\n :page=\"page\"\n :node=\"node\"\n :zoom=\"zoom\"\n :moveable-options=\"moveableOptions\"\n :can-select=\"canSelect\"\n @select=\"selectHandler\"\n @update=\"updateNodeHandler\"\n @sort=\"sortNodeHandler\"\n ></magic-stage>\n\n <slot name=\"workspace-content\"></slot>\n\n <page-bar>\n <template #page-bar-title=\"{ page }\"><slot name=\"page-bar-title\" :page=\"page\"></slot></template>\n <template #page-bar-popover=\"{ page }\"><slot name=\"page-bar-popover\" :page=\"page\"></slot></template>\n </page-bar>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, nextTick, PropType, watch } from 'vue';\n\nimport type { MApp, MComponent, MContainer, MNode, MPage } from '@tmagic/schema';\nimport type { MoveableOptions, SortEventData } from '@tmagic/stage';\nimport StageCore from '@tmagic/stage';\n\nimport type { Services } from '@editor/type';\n\nimport PageBar from './PageBar.vue';\nimport MagicStage from './Stage.vue';\n\nexport default defineComponent({\n name: 'm-editor-workspace',\n\n components: {\n PageBar,\n MagicStage,\n },\n\n props: {\n runtimeUrl: String,\n\n render: {\n type: Function as PropType<() => HTMLDivElement>,\n },\n\n moveableOptions: {\n type: [Object, Function] as PropType<MoveableOptions | ((core?: StageCore) => MoveableOptions)>,\n },\n\n canSelect: {\n type: Function as PropType<(el: HTMLElement) => boolean | Promise<boolean>>,\n },\n },\n\n setup() {\n const services = inject<Services>('services');\n const node = computed(() => services?.editorService.get<MNode>('node'));\n const stage = computed(() => services?.editorService.get<StageCore>('stage'));\n\n watch([() => node.value?.id, stage], ([id, stage]) => {\n nextTick(() => {\n // 等待相关dom变更完成后,再select,适用大多数场景\n id && stage?.select(id);\n });\n });\n\n return {\n uiSelectMode: computed(() => services?.uiService.get<boolean>('uiSelectMode')),\n root: computed(() => services?.editorService.get<MApp>('root')),\n page: computed(() => services?.editorService.get<MPage>('page')),\n zoom: computed(() => services?.uiService.get<number>('zoom')),\n\n node,\n\n selectHandler(el: HTMLElement) {\n services?.editorService.select(el.id);\n },\n\n updateNodeHandler(node: MComponent | MContainer | MPage) {\n services?.editorService.update(node);\n },\n\n sortNodeHandler(ev: SortEventData) {\n services?.editorService.sort(ev.src, ev.dist);\n },\n };\n },\n});\n</script>\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { reactive } from 'vue';\n\nimport type { ComponentGroup, ComponentGroupState } from '@editor/type';\n\nimport BaseService from './BaseService';\n\nclass ComponentList extends BaseService {\n private state = reactive<ComponentGroupState>({\n list: [],\n });\n\n constructor() {\n super([]);\n }\n\n /**\n * @param componentGroupList 组件列表配置\n */\n public setList(componentGroupList: ComponentGroup[]) {\n this.state.list = componentGroupList;\n }\n\n public getList() {\n return this.state.list;\n }\n}\n\nexport type ComponentListService = ComponentList;\n\nexport default new ComponentList();\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { reactive, toRaw } from 'vue';\n\nimport type StageCore from '@tmagic/stage';\n\nimport editorService from '@editor/services/editor';\nimport { GetColumnWidth, SetColumnWidth, UiState } from '@editor/type';\n\nimport BaseService from './BaseService';\n\nconst state = reactive<UiState>({\n uiSelectMode: false,\n showSrc: false,\n zoom: 1,\n stageStyle: {},\n columnWidth: {\n left: 310,\n center: globalThis.document.body.clientWidth - 310 - 400,\n right: 400,\n },\n showGuides: true,\n showRule: true,\n});\n\nclass Ui extends BaseService {\n constructor() {\n super([]);\n globalThis.addEventListener('resize', () => {\n this.setColumnWidth({\n center: 'auto',\n });\n });\n }\n\n public set<T = any>(name: keyof UiState, value: T) {\n const mask = editorService.get<StageCore>('stage')?.mask;\n\n if (name === 'columnWidth') {\n this.setColumnWidth(value as unknown as SetColumnWidth);\n return;\n }\n\n if (name === 'showGuides') {\n mask?.showGuides(value as unknown as boolean);\n }\n\n if (name === 'showRule') {\n mask?.showRule(value as unknown as boolean);\n }\n\n (state as any)[name] = value;\n }\n\n public get<T>(name: keyof typeof state): T {\n return (state as any)[name];\n }\n\n private setColumnWidth({ left, center, right }: SetColumnWidth) {\n const columnWidth = {\n ...toRaw(this.get<GetColumnWidth>('columnWidth')),\n };\n\n if (left) {\n columnWidth.left = left;\n }\n\n if (right) {\n columnWidth.right = right;\n }\n\n if (!center || center === 'auto') {\n const bodyWidth = globalThis.document.body.clientWidth;\n columnWidth.center = bodyWidth - (columnWidth?.left || 0) - (columnWidth?.right || 0);\n } else {\n columnWidth.center = center;\n }\n\n state.columnWidth = columnWidth;\n }\n}\n\nexport type UiService = Ui;\n\nexport default new Ui();\n","<template>\n <framework>\n <template #nav>\n <slot name=\"nav\" :editorService=\"editorService\"><nav-menu :data=\"menu\"></nav-menu></slot>\n </template>\n\n <template #sidebar>\n <slot name=\"sidebar\" :editorService=\"editorService\">\n <sidebar :data=\"sidebar\"></sidebar>\n </slot>\n </template>\n\n <template #workspace :editorService=\"editorService\">\n <slot name=\"workspace\">\n <workspace\n :runtime-url=\"runtimeUrl\"\n :render=\"render\"\n :moveable-options=\"moveableOptions\"\n :can-select=\"canSelect\"\n >\n <template #workspace-content><slot name=\"workspace-content\" :editorService=\"editorService\"></slot></template>\n <template #page-bar-title=\"{ page }\"><slot name=\"page-bar-title\" :page=\"page\"></slot></template>\n <template #page-bar-popover=\"{ page }\"><slot name=\"page-bar-popover\" :page=\"page\"></slot></template>\n </workspace>\n </slot>\n </template>\n\n <template #propsPanel>\n <slot name=\"propsPanel\">\n <props-panel ref=\"propsPanel\" @mounted=\"(instance) => $emit('props-panel-mounted', instance)\"></props-panel>\n </slot>\n </template>\n\n <template #empty><slot name=\"empty\" :editorService=\"editorService\"></slot></template>\n </framework>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onUnmounted, PropType, provide, toRaw, watch } from 'vue';\n\nimport { EventOption } from '@tmagic/core';\nimport type { FormConfig } from '@tmagic/form';\nimport type { MApp, MNode } from '@tmagic/schema';\nimport type StageCore from '@tmagic/stage';\nimport type { MoveableOptions } from '@tmagic/stage';\n\nimport Framework from '@editor/layouts/Framework.vue';\nimport NavMenu from '@editor/layouts/NavMenu.vue';\nimport PropsPanel from '@editor/layouts/PropsPanel.vue';\nimport Sidebar from '@editor/layouts/sidebar/Sidebar.vue';\nimport Workspace from '@editor/layouts/workspace/Workspace.vue';\nimport componentListService from '@editor/services/componentList';\nimport editorService from '@editor/services/editor';\nimport eventsService from '@editor/services/events';\nimport historyService from '@editor/services/history';\nimport propsService from '@editor/services/props';\nimport uiService from '@editor/services/ui';\nimport type { ComponentGroup, MenuBarData, Services, SideBarData } from '@editor/type';\n\nexport default defineComponent({\n name: 'm-editor',\n\n components: {\n NavMenu,\n Sidebar,\n Workspace,\n PropsPanel,\n Framework,\n },\n\n props: {\n /** 页面初始值 */\n modelValue: {\n type: Object as PropType<MApp>,\n default: () => ({}),\n require: true,\n },\n\n /** 左侧面板中的组件列表 */\n componentGroupList: {\n type: Array as PropType<ComponentGroup[]>,\n default: () => [],\n },\n\n /** 左侧面板配置 */\n sidebar: {\n type: Object as PropType<SideBarData>,\n },\n\n /** 顶部工具栏配置 */\n menu: {\n type: Object as PropType<MenuBarData>,\n default: () => ({ left: [], right: [] }),\n },\n\n /** 中间工作区域中画布渲染的内容 */\n render: {\n type: Function as PropType<() => HTMLDivElement>,\n },\n\n /** 中间工作区域中画布通过iframe渲染时的页面url */\n runtimeUrl: String,\n\n /** 组件的属性配置表单的dsl */\n propsConfigs: {\n type: Object as PropType<Record<string, FormConfig>>,\n default: () => ({}),\n },\n\n /** 添加组件时的默认值 */\n propsValues: {\n type: Object as PropType<Record<string, MNode>>,\n default: () => ({}),\n },\n\n /** 组件联动事件选项列表 */\n eventMethodList: {\n type: Object,\n default: () => ({}),\n },\n\n /** 画布中组件选中框的移动范围 */\n moveableOptions: {\n type: [Object, Function] as PropType<MoveableOptions | ((core?: StageCore) => MoveableOptions)>,\n },\n\n /** 编辑器初始化时默认选中的组件ID */\n defaultSelected: {\n type: [Number, String],\n },\n\n canSelect: {\n type: Function as PropType<(el: HTMLElement) => boolean | Promise<boolean>>,\n },\n\n stageStyle: {\n type: [String, Object] as PropType<Record<string, string | number>>,\n },\n },\n\n emits: ['props-panel-mounted', 'update:modelValue'],\n\n setup(props, { emit }) {\n editorService.on('root-change', () => {\n const node = editorService.get<MNode | null>('node') || props.defaultSelected;\n node && editorService.select(node);\n emit('update:modelValue', toRaw(editorService.get('root')));\n });\n\n // 初始值变化,重新设置节点信息\n watch(\n () => props.modelValue,\n (modelValue) => editorService.set('root', modelValue),\n {\n immediate: true,\n },\n );\n\n watch(\n () => props.componentGroupList,\n (componentGroupList) => componentListService.setList(componentGroupList),\n {\n immediate: true,\n },\n );\n\n watch(\n () => props.propsConfigs,\n (configs) => propsService.setPropsConfigs(configs),\n {\n immediate: true,\n },\n );\n\n watch(\n () => props.propsValues,\n (values) => propsService.setPropsValues(values),\n {\n immediate: true,\n },\n );\n\n watch(\n () => props.eventMethodList,\n (eventMethodList) => {\n const eventsList: Record<string, EventOption[]> = {};\n const methodsList: Record<string, EventOption[]> = {};\n\n Object.keys(eventMethodList).forEach((type: string) => {\n eventsList[type] = eventMethodList[type].events;\n methodsList[type] = eventMethodList[type].methods;\n });\n\n eventsService.setEvents(eventsList);\n eventsService.setMethods(methodsList);\n },\n {\n immediate: true,\n },\n );\n\n watch(\n () => props.defaultSelected,\n (defaultSelected) => defaultSelected && editorService.select(defaultSelected),\n {\n immediate: true,\n },\n );\n\n watch(\n () => props.stageStyle,\n (stageStyle) => uiService.set('stageStyle', stageStyle),\n {\n immediate: true,\n },\n );\n\n onUnmounted(() => editorService.destroy());\n\n const services: Services = {\n componentListService,\n eventsService,\n historyService,\n propsService,\n editorService,\n uiService,\n };\n\n provide('services', services);\n\n return services;\n },\n});\n</script>\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { App } from 'vue';\n\nimport Code from './fields/Code.vue';\nimport CodeLink from './fields/CodeLink.vue';\nimport uiSelect from './fields/UISelect.vue';\nimport CodeEditor from './layouts/CodeEditor.vue';\nimport { setConfig } from './utils/config';\nimport Editor from './Editor.vue';\nimport type { InstallOptions } from './type';\n\nimport './theme/index.scss';\n\nexport type { MoveableOptions } from '@tmagic/stage';\nexport * from './type';\nexport * from './utils';\nexport { default as TMagicEditor } from './Editor.vue';\nexport { default as TMagicCodeEditor } from './layouts/CodeEditor.vue';\nexport { default as editorService } from './services/editor';\nexport { default as propsService } from './services/props';\nexport { default as historyService } from './services/history';\nexport { default as eventsService } from './services/events';\nexport { default as uiService } from './services/ui';\nexport { default as ComponentListPanel } from './layouts/sidebar/ComponentListPanel.vue';\nexport { default as LayerPanel } from './layouts/sidebar/LayerPanel.vue';\nexport { default as PropsPanel } from './layouts/PropsPanel.vue';\n\nconst defaultInstallOpt: InstallOptions = {\n // @todo, 自定义图片上传方法等编辑器依赖的外部选项\n};\n\nexport default {\n install: (app: App, opt?: InstallOptions): void => {\n const option = Object.assign(defaultInstallOpt, opt || {});\n\n // eslint-disable-next-line no-param-reassign\n app.config.globalProperties.$TMAGIC_EDITOR = option;\n setConfig(option);\n\n app.component(Editor.name, Editor);\n app.component(uiSelect.name, uiSelect);\n app.component(CodeLink.name, CodeLink);\n app.component(Code.name, Code);\n app.component(CodeEditor.name, CodeEditor);\n },\n};\n"],"names":["_sfc_main","_openBlock","_createBlock","_hoisted_1","_hoisted_2","_hoisted_3","EventEmitter","Editor","_createElementBlock","_withCtx","__assign","Gesto","_Fragment","_createVNode","_createElementVNode","_createTextVNode","_toDisplayString","_normalizeClass","_createCommentVNode","_renderSlot"],"mappings":"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"}