lianghongjie 1 рік тому
батько
коміт
19a3975642
30 змінених файлів з 328 додано та 135 видалено
  1. 2 0
      package.json
  2. 0 8
      src/modules/design/actions/init.ts
  3. 0 0
      src/modules/design/components/UI/Container.tsx
  4. 0 11
      src/modules/design/components/UI/Image.tsx
  5. 0 0
      src/modules/design/components/UI/Textarea.tsx
  6. 0 7
      src/modules/design/components/UI/index.ts
  7. 0 19
      src/modules/design/components/Viewport/index.tsx
  8. 0 4
      src/modules/design/components/index.ts
  9. 0 12
      src/modules/design/index.ts
  10. 0 14
      src/modules/design/objects/DesignTemp/DesignComp.ts
  11. 0 13
      src/modules/design/objects/DesignTemp/index.ts
  12. 0 8
      src/modules/design/store.ts
  13. 4 0
      src/modules/editor/actions.ts
  14. 27 0
      src/modules/editor/components/CompUI/baseUI/Image.tsx
  15. 6 3
      src/modules/editor/components/CompUI/baseUI/Text.tsx
  16. 45 0
      src/modules/editor/components/CompUI/baseUI/Textarea.tsx
  17. 4 3
      src/modules/editor/components/CompUI/baseUI/View.tsx
  18. 22 0
      src/modules/editor/components/CompUI/customUI/Card.tsx
  19. 11 0
      src/modules/editor/components/CompUI/index.ts
  20. 7 0
      src/modules/editor/components/Panels/UIPanel/index.tsx
  21. 11 2
      src/modules/editor/components/Viewport/Canvas/index.tsx
  22. 5 1
      src/modules/editor/components/Viewport/Slider/index.tsx
  23. 0 13
      src/modules/editor/components/Viewport/index.tsx
  24. 2 2
      src/modules/editor/components/index.ts
  25. 2 6
      src/modules/editor/index.ts
  26. 15 0
      src/modules/editor/objects/DesignTemp/DesignComp.ts
  27. 13 0
      src/modules/editor/objects/DesignTemp/index.ts
  28. 5 0
      src/modules/editor/store.ts
  29. 7 6
      src/pages/editor/EditPage/index.tsx
  30. 140 3
      yarn.lock

+ 2 - 0
package.json

@@ -43,6 +43,7 @@
     "proto.gl": "^1.0.0",
     "queen3d": "^0.0.80",
     "queenjs": "^1.0.0-beta.72",
+    "quill": "^1.3.7",
     "rimraf": "^3.0.2",
     "scp2": "^0.5.0",
     "swiper": "^8.4.4",
@@ -57,6 +58,7 @@
     "@queenjs/webpack-loader": "^0.0.2",
     "@types/color-convert": "^2.0.0",
     "@types/lodash": "^4.14.186",
+    "@types/quill": "^2.0.10",
     "@types/three": "^0.146.0",
     "@typescript-eslint/eslint-plugin": "^5.4.0",
     "@typescript-eslint/parser": "^5.4.0",

+ 0 - 8
src/modules/design/actions/init.ts

@@ -1,8 +0,0 @@
-import { DesignModule } from "..";
-import { DesignTemp } from "../objects/DesignTemp";
-
-export const initActions = DesignModule.action({
-  initTemp(tempData: DesignTemp["data"]) {
-    this.store.designTemp.initData(tempData);
-  },
-});

+ 0 - 0
src/modules/design/components/UI/Container.tsx


+ 0 - 11
src/modules/design/components/UI/Image.tsx

@@ -1,11 +0,0 @@
-import { defineUI } from "queenjs";
-import { string } from "vue-types";
-
-export default defineUI({
-  props: {
-    value: string(),
-  },
-  setup(props) {
-    return () => <img src={props.value} />;
-  },
-});

+ 0 - 0
src/modules/design/components/UI/Textarea.tsx


+ 0 - 7
src/modules/design/components/UI/index.ts

@@ -1,7 +0,0 @@
-import Text from "./Text";
-import Image from "./Image";
-
-export default {
-  Text,
-  Image,
-};

+ 0 - 19
src/modules/design/components/Viewport/index.tsx

@@ -1,19 +0,0 @@
-import { defineUI } from "queenjs";
-import { useDesign } from "../..";
-
-export default defineUI({
-  setup() {
-    const { components, store } = useDesign();
-    return () => (
-      <div style={store.designTemp.data.pageStyle}>
-        {store.designTemp.data.content.map((d) => {
-          const Comp = components.UI[d.compKey];
-          if (Comp) {
-            return <Comp key={d.id} {...d.props} />;
-          }
-          return null;
-        })}
-      </div>
-    );
-  },
-});

+ 0 - 4
src/modules/design/components/index.ts

@@ -1,4 +0,0 @@
-import UI from "./UI";
-import Viewport from "./Viewport";
-
-export default { Viewport, UI };

+ 0 - 12
src/modules/design/index.ts

@@ -1,12 +0,0 @@
-import { ModuleRoot } from "queenjs";
-import { initActions } from "./actions/init";
-import components from "./components";
-import { store } from "./store";
-
-export class DesignModule extends ModuleRoot {
-  store = this.createStore(store);
-  components = this.useComponents(components);
-  actions = this.createActions([initActions]);
-}
-
-export const { useDesign, initDesign } = DesignModule.hook("Design");

+ 0 - 14
src/modules/design/objects/DesignTemp/DesignComp.ts

@@ -1,14 +0,0 @@
-import { nanoid } from "nanoid";
-import components from "../../components";
-
-export class DesignComp {
-  id = nanoid();
-  compKey: keyof typeof components.UI;
-  props: any = {};
-  constructor(
-    data: Partial<Omit<DesignComp, "id">> & Pick<DesignComp, "compKey">
-  ) {
-    this.compKey = data.compKey;
-    Object.assign(this, data);
-  }
-}

+ 0 - 13
src/modules/design/objects/DesignTemp/index.ts

@@ -1,13 +0,0 @@
-import { DesignComp } from "./DesignComp";
-
-export class DesignTemp {
-  data = {
-    title: "",
-    pageStyle: {} as any,
-    content: [] as DesignComp[],
-  };
-
-  initData(data: DesignTemp["data"]) {
-    this.data = data;
-  }
-}

+ 0 - 8
src/modules/design/store.ts

@@ -1,8 +0,0 @@
-import { DesignModule } from ".";
-import { DesignTemp } from "./objects/DesignTemp";
-
-export const store = DesignModule.store({
-  state: () => ({
-    designTemp: new DesignTemp(),
-  }),
-});

+ 4 - 0
src/modules/editor/actions.ts

@@ -1,6 +1,10 @@
 import { EditorModule } from ".";
+import { DesignTemp } from "./objects/DesignTemp";
 
 export const actions = EditorModule.action({
+  initData(tempData: DesignTemp) {
+    this.store.initDesignData(tempData);
+  },
   switchEditMode(v: string) {
     this.store.setEditMode(v);
   },

+ 27 - 0
src/modules/editor/components/CompUI/baseUI/Image.tsx

@@ -0,0 +1,27 @@
+import { useEditor } from "@/modules/editor";
+import { defineComponent } from "vue";
+import { string } from "vue-types";
+import View from "./View";
+
+export default defineComponent({
+  props: {
+    value: string(),
+  },
+  emits: ["update:value"],
+  setup(props, { emit }) {
+    const { store } = useEditor();
+    async function changeVal() {
+      alert("选择模型");
+      emit("update:value", Math.random().toString());
+    }
+    return () => (
+      <View>
+        <img
+          class="w-1/1 h-1/1"
+          src={props.value}
+          onClick={store.editMode === "edit" ? changeVal : undefined}
+        />
+      </View>
+    );
+  },
+});

+ 6 - 3
src/modules/design/components/UI/Text.tsx → src/modules/editor/components/CompUI/baseUI/Text.tsx

@@ -1,15 +1,18 @@
 import { useEditor } from "@/modules/editor";
-import { defineUI } from "queenjs";
+import { defineComponent } from "vue";
 import { string } from "vue-types";
+import View from "./View";
 
-export default defineUI({
+export default defineComponent({
   props: {
     value: string(),
   },
   setup(props) {
     const { store } = useEditor();
     return () => (
-      <div contenteditable={store.editMode === "edit"}>{props.value}</div>
+      <View>
+        <div contenteditable={store.editMode === "edit"}>{props.value}</div>
+      </View>
     );
   },
 });

+ 45 - 0
src/modules/editor/components/CompUI/baseUI/Textarea.tsx

@@ -0,0 +1,45 @@
+import { useEditor } from "@/modules/editor";
+import Quill from "quill";
+import "quill/dist/quill.bubble.css";
+import { defineComponent, onMounted, ref, watchEffect } from "vue";
+import { string } from "vue-types";
+import View from "./View";
+
+export default defineComponent({
+  props: {
+    value: string().def("{}"),
+  },
+  emits: ["update:value"],
+  setup(props, { emit }) {
+    const domRef = ref();
+    const { store } = useEditor();
+    let quill: Quill | undefined = undefined;
+    onMounted(() => {
+      quill = new Quill(domRef.value, {
+        theme: "bubble",
+      });
+      store.editMode !== "edit" && quill.disable();
+      quill.focus();
+      quill.on("text-change", () => {
+        emit("update:value", quill?.getContents());
+      });
+      try {
+        quill.setContents(JSON.parse(props.value));
+      } catch (error) {
+        quill.setText("初始化数据失败");
+      }
+    });
+    watchEffect(() => {
+      if (store.editMode === "edit") {
+        quill?.enable();
+      } else {
+        quill?.disable();
+      }
+    });
+    return () => (
+      <View>
+        <div class="w-1/1 h-1/1" ref={domRef}></div>
+      </View>
+    );
+  },
+});

+ 4 - 3
src/modules/editor/components/EditItem/index.tsx → src/modules/editor/components/CompUI/baseUI/View.tsx

@@ -1,14 +1,15 @@
+import { useEditor } from "@/modules/editor";
 import { css } from "@linaria/core";
 import { defineComponent } from "vue";
-import { useEditor } from "../..";
 
 export default defineComponent({
-  setup(props, { slots }) {
+  emits: ["click"],
+  setup(props, { emit, slots }) {
     const { store } = useEditor();
     return () => (
       <div
         class={[store.editMode === "edit" && editStyle]}
-        onClick={(e) => console.log(e)}
+        onClick={() => emit("click")}
       >
         {slots.default?.()}
       </div>

+ 22 - 0
src/modules/editor/components/CompUI/customUI/Card.tsx

@@ -0,0 +1,22 @@
+import { defineComponent } from "vue";
+import { any } from "vue-types";
+import Image from "../baseUI/Image";
+import Textarea from "../baseUI/Textarea";
+import View from "../baseUI/View";
+
+export default defineComponent({
+  props: {
+    value: any<{
+      title1: string;
+      title2: string;
+    }>().isRequired,
+  },
+  setup(props) {
+    return () => (
+      <View>
+        <Image v-model={[props.value.title1, "value"]} />
+        <Textarea v-model={[props.value.title2, "value"]} />
+      </View>
+    );
+  },
+});

+ 11 - 0
src/modules/editor/components/CompUI/index.ts

@@ -0,0 +1,11 @@
+import Image from "./baseUI/Image";
+import Text from "./baseUI/Text";
+import Textarea from "./baseUI/Textarea";
+import Card from "./customUI/Card";
+
+export default {
+  Text,
+  Textarea,
+  Image,
+  Card,
+};

+ 7 - 0
src/modules/editor/components/Panels/UIPanel/index.tsx

@@ -0,0 +1,7 @@
+import { defineUI } from "queenjs";
+
+export default defineUI({
+  setup() {
+    return;
+  },
+});

+ 11 - 2
src/modules/editor/components/Viewport/Canvas/index.tsx

@@ -3,10 +3,19 @@ import { defineUI } from "queenjs";
 
 export default defineUI({
   setup() {
-    const { design } = useEditor().modules;
+    const editor = useEditor();
+    const { store, components } = editor;
     return () => (
       <div class="h-1/1 text-center overflow-y-auto scrollbar">
-        <design.components.Viewport class="inline-block w-375px min-h-750px" />
+        <div
+          class="inline-block w-375px min-h-750px"
+          style={store.designData.pageStyle}
+        >
+          {store.designData.content.map((d) => {
+            const Comp = components.CompUI[d.compKey];
+            return <Comp {...d.props} v-model={[d.props.value, "value"]} />;
+          })}
+        </div>
       </div>
     );
   },

+ 5 - 1
src/modules/editor/components/Viewport/Slider/index.tsx

@@ -1,7 +1,11 @@
+import { useEditor } from "@/modules/editor";
 import { defineUI } from "queenjs";
 
 export default defineUI({
   setup() {
-    return () => <div>slider</div>;
+    const { store } = useEditor();
+    return () => (
+      <div class="break-all">{JSON.stringify(store.designData)}</div>
+    );
   },
 });

+ 0 - 13
src/modules/editor/components/Viewport/index.tsx

@@ -1,6 +1,4 @@
-import { mapValues } from "lodash";
 import { defineUI } from "queenjs";
-import { useEditor } from "../..";
 import Canvas from "./Canvas";
 import Header from "./Header";
 import Slider from "./Slider";
@@ -13,17 +11,6 @@ export default defineUI({
     Canvas,
   },
   setup(props, { slots }) {
-    const { modules, components } = useEditor();
-    const { design } = modules;
-
-    design.components.UI = mapValues(design.components.UI, (Comp) => {
-      return (props: any) => (
-        <components.EditItem>
-          <Comp {...props} />
-        </components.EditItem>
-      );
-    }) as any;
-
     return () => (
       <div class="flex flex-col h-1/1">
         <slots.Header class="p-16px border-bottom bg-component" />

+ 2 - 2
src/modules/editor/components/index.ts

@@ -1,7 +1,7 @@
-import EditItem from "./EditItem";
+import CompUI from "./CompUI";
 import Viewport from "./Viewport";
 
 export default {
   Viewport,
-  EditItem
+  CompUI,
 };

+ 2 - 6
src/modules/editor/index.ts

@@ -1,17 +1,13 @@
 import { ModuleRoot } from "queenjs";
-import { initDesign } from "../design";
+import { actions } from "./actions";
 import components from "./components";
 import { store } from "./store";
-import { actions } from "./actions";
 
 export class EditorModule extends ModuleRoot {
-  actions = this.createActions(actions)
+  actions = this.createActions(actions);
   store = this.createStore(store);
 
   components = this.useComponents(components);
-  modules = this.useModules({
-    design: initDesign,
-  });
 }
 
 export const { useEditor, initEditor } = EditorModule.hook("Editor");

+ 15 - 0
src/modules/editor/objects/DesignTemp/DesignComp.ts

@@ -0,0 +1,15 @@
+import { nanoid } from "nanoid";
+import components from "../../components";
+
+export class DesignComp {
+  id = nanoid();
+  compKey: keyof typeof components.CompUI = "Text";
+  props = {
+    value: undefined as any
+  };
+
+  constructor(data?: Partial<DesignComp>) {
+    if (!data) return;
+    Object.assign(this, data);
+  }
+}

+ 13 - 0
src/modules/editor/objects/DesignTemp/index.ts

@@ -0,0 +1,13 @@
+import { DesignComp } from "./DesignComp";
+
+export class DesignTemp {
+  title = "";
+  pageStyle?: any;
+  content: DesignComp[] = [];
+  
+  constructor(data?: Partial<DesignTemp>) {
+    if (!data) return;
+    data.content = data.content?.map((d) => new DesignComp(d)) || [];
+    Object.assign(this, data);
+  }
+}

+ 5 - 0
src/modules/editor/store.ts

@@ -1,12 +1,17 @@
 import { EditorModule } from ".";
+import { DesignTemp } from "./objects/DesignTemp";
 
 export const store = EditorModule.store({
   state: () => ({
     editMode: "edit",
+    designData: new DesignTemp(),
   }),
   actions: {
     setEditMode(v: string) {
       this.store.editMode = v;
     },
+    initDesignData(data: Partial<DesignTemp>) {
+      this.store.designData = new DesignTemp(data);
+    },
   },
 });

+ 7 - 6
src/pages/editor/EditPage/index.tsx

@@ -3,21 +3,22 @@ import { defineComponent } from "vue";
 
 export default defineComponent(() => {
   const editor = initEditor();
-  editor.modules.design.actions.initTemp({
+  editor.actions.initData({
     title: "123",
     pageStyle: {
       backgroundColor: "#fff",
     },
-    content: Array.from({ length: 5 }, (d, i) => ({
+    content: Array.from({ length: 1 }, () => ({
       id: Math.random().toString(),
-      compKey: i % 2 === 0 ? "Text" : "Image",
+      compKey: "Card",
       props: {
-        value: "xxdx",
+        value: {
+          title1: "xxd324xxx2",
+          title2: "",
+        },
       },
     })),
   });
 
-  console.log(editor.modules.design.store.designTemp.data.content);
-
   return () => <editor.components.Viewport class="!h-100vh" />;
 });

+ 140 - 3
yarn.lock

@@ -1498,6 +1498,14 @@
   resolved "http://124.70.149.18:4873/@types%2fqs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
   integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
 
+"@types/quill@^2.0.10":
+  version "2.0.10"
+  resolved "http://124.70.149.18:4873/@types%2fquill/-/quill-2.0.10.tgz#bd3df7b59e0cfeb90f3d38892e4d1866261e7c0e"
+  integrity sha512-L6OHONEj2v4NRbWQOsn7j1N0SyzhRR3M4g1M6j/uuIwIsIW2ShWHhwbqNvH8hSmVktzqu0lITfdnqVOQ4qkrhA==
+  dependencies:
+    parchment "^1.1.2"
+    quill-delta "^4.0.1"
+
 "@types/range-parser@*":
   version "1.2.4"
   resolved "http://124.70.149.18:4873/@types%2frange-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
@@ -2887,6 +2895,11 @@ clone@^1.0.2:
   resolved "http://124.70.149.18:4873/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
   integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
 
+clone@^2.1.1:
+  version "2.1.2"
+  resolved "http://124.70.149.18:4873/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+  integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
 co@^4.6.0:
   version "4.6.0"
   resolved "http://124.70.149.18:4873/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -3288,6 +3301,18 @@ debug@^3.2.6, debug@^3.2.7:
   dependencies:
     ms "^2.1.1"
 
+deep-equal@^1.0.1:
+  version "1.1.1"
+  resolved "http://124.70.149.18:4873/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
+  integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
+  dependencies:
+    is-arguments "^1.0.4"
+    is-date-object "^1.0.1"
+    is-regex "^1.0.4"
+    object-is "^1.0.1"
+    object-keys "^1.1.1"
+    regexp.prototype.flags "^1.2.0"
+
 deep-is@^0.1.3, deep-is@~0.1.3:
   version "0.1.4"
   resolved "http://124.70.149.18:4873/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
@@ -3334,7 +3359,7 @@ define-lazy-prop@^2.0.0:
   resolved "http://124.70.149.18:4873/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
   integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
 
-define-properties@^1.1.4:
+define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0:
   version "1.2.0"
   resolved "http://124.70.149.18:4873/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5"
   integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==
@@ -3817,6 +3842,11 @@ event-pubsub@4.3.0:
   resolved "http://124.70.149.18:4873/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e"
   integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==
 
+eventemitter3@^2.0.3:
+  version "2.0.3"
+  resolved "http://124.70.149.18:4873/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba"
+  integrity sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=
+
 eventemitter3@^4.0.0, eventemitter3@^4.0.7:
   version "4.0.7"
   resolved "http://124.70.149.18:4873/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
@@ -3912,12 +3942,22 @@ extend-shallow@^2.0.1:
   dependencies:
     is-extendable "^0.1.0"
 
+extend@^3.0.2:
+  version "3.0.2"
+  resolved "http://124.70.149.18:4873/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+  integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
 fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
   version "3.1.3"
   resolved "http://124.70.149.18:4873/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
   integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
 
-fast-diff@^1.1.2:
+fast-diff@1.1.2:
+  version "1.1.2"
+  resolved "http://124.70.149.18:4873/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154"
+  integrity sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==
+
+fast-diff@1.2.0, fast-diff@^1.1.2:
   version "1.2.0"
   resolved "http://124.70.149.18:4873/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
   integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
@@ -4148,6 +4188,11 @@ functional-red-black-tree@^1.0.1:
   resolved "http://124.70.149.18:4873/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
   integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
 
+functions-have-names@^1.2.3:
+  version "1.2.3"
+  resolved "http://124.70.149.18:4873/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+  integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
 gensync@^1.0.0-beta.2:
   version "1.0.0-beta.2"
   resolved "http://124.70.149.18:4873/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
@@ -4320,11 +4365,18 @@ has-property-descriptors@^1.0.0:
   dependencies:
     get-intrinsic "^1.1.1"
 
-has-symbols@^1.0.3:
+has-symbols@^1.0.2, has-symbols@^1.0.3:
   version "1.0.3"
   resolved "http://124.70.149.18:4873/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
   integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
 
+has-tostringtag@^1.0.0:
+  version "1.0.0"
+  resolved "http://124.70.149.18:4873/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+  integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+  dependencies:
+    has-symbols "^1.0.2"
+
 has@^1.0.3:
   version "1.0.3"
   resolved "http://124.70.149.18:4873/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
@@ -4596,6 +4648,14 @@ ipaddr.js@^2.0.1:
   resolved "http://124.70.149.18:4873/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0"
   integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==
 
+is-arguments@^1.0.4:
+  version "1.1.1"
+  resolved "http://124.70.149.18:4873/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
+  integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
+  dependencies:
+    call-bind "^1.0.2"
+    has-tostringtag "^1.0.0"
+
 is-arrayish@^0.2.1:
   version "0.2.1"
   resolved "http://124.70.149.18:4873/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
@@ -4627,6 +4687,13 @@ is-core-module@^2.11.0:
   dependencies:
     has "^1.0.3"
 
+is-date-object@^1.0.1:
+  version "1.0.5"
+  resolved "http://124.70.149.18:4873/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+  integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+  dependencies:
+    has-tostringtag "^1.0.0"
+
 is-docker@^2.0.0, is-docker@^2.1.1:
   version "2.2.1"
   resolved "http://124.70.149.18:4873/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
@@ -4715,6 +4782,14 @@ is-promise@^2.1.0:
   resolved "http://124.70.149.18:4873/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
   integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
 
+is-regex@^1.0.4:
+  version "1.1.4"
+  resolved "http://124.70.149.18:4873/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+  integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+  dependencies:
+    call-bind "^1.0.2"
+    has-tostringtag "^1.0.0"
+
 is-stream@^1.1.0:
   version "1.1.0"
   resolved "http://124.70.149.18:4873/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
@@ -5064,6 +5139,11 @@ lodash-es@^4.17.15:
   resolved "http://124.70.149.18:4873/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
   integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
 
+lodash.clonedeep@^4.5.0:
+  version "4.5.0"
+  resolved "http://124.70.149.18:4873/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+  integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
+
 lodash.debounce@^4.0.8:
   version "4.0.8"
   resolved "http://124.70.149.18:4873/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
@@ -5074,6 +5154,11 @@ lodash.defaultsdeep@^4.6.1:
   resolved "http://124.70.149.18:4873/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6"
   integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==
 
+lodash.isequal@^4.5.0:
+  version "4.5.0"
+  resolved "http://124.70.149.18:4873/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+  integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
+
 lodash.kebabcase@^4.1.1:
   version "4.1.1"
   resolved "http://124.70.149.18:4873/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
@@ -5545,6 +5630,14 @@ object-inspect@^1.9.0:
   resolved "http://124.70.149.18:4873/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
   integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
 
+object-is@^1.0.1:
+  version "1.1.5"
+  resolved "http://124.70.149.18:4873/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
+  integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.1.3"
+
 object-keys@^1.1.1:
   version "1.1.1"
   resolved "http://124.70.149.18:4873/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
@@ -5756,6 +5849,11 @@ param-case@^3.0.4:
     dot-case "^3.0.4"
     tslib "^2.0.3"
 
+parchment@^1.1.2, parchment@^1.1.4:
+  version "1.1.4"
+  resolved "http://124.70.149.18:4873/parchment/-/parchment-1.1.4.tgz#aeded7ab938fe921d4c34bc339ce1168bc2ffde5"
+  integrity sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==
+
 parent-module@^1.0.0:
   version "1.0.1"
   resolved "http://124.70.149.18:4873/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -6308,6 +6406,36 @@ queue-microtask@^1.2.2:
   resolved "http://124.70.149.18:4873/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
   integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
 
+quill-delta@^3.6.2:
+  version "3.6.3"
+  resolved "http://124.70.149.18:4873/quill-delta/-/quill-delta-3.6.3.tgz#b19fd2b89412301c60e1ff213d8d860eac0f1032"
+  integrity sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==
+  dependencies:
+    deep-equal "^1.0.1"
+    extend "^3.0.2"
+    fast-diff "1.1.2"
+
+quill-delta@^4.0.1:
+  version "4.2.2"
+  resolved "http://124.70.149.18:4873/quill-delta/-/quill-delta-4.2.2.tgz#015397d046e0a3bed087cd8a51f98c11a1b8f351"
+  integrity sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==
+  dependencies:
+    fast-diff "1.2.0"
+    lodash.clonedeep "^4.5.0"
+    lodash.isequal "^4.5.0"
+
+quill@^1.3.7:
+  version "1.3.7"
+  resolved "http://124.70.149.18:4873/quill/-/quill-1.3.7.tgz#da5b2f3a2c470e932340cdbf3668c9f21f9286e8"
+  integrity sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==
+  dependencies:
+    clone "^2.1.1"
+    deep-equal "^1.0.1"
+    eventemitter3 "^2.0.3"
+    extend "^3.0.2"
+    parchment "^1.1.4"
+    quill-delta "^3.6.2"
+
 randombytes@^2.1.0:
   version "2.1.0"
   resolved "http://124.70.149.18:4873/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@@ -6432,6 +6560,15 @@ regenerator-transform@^0.15.1:
   dependencies:
     "@babel/runtime" "^7.8.4"
 
+regexp.prototype.flags@^1.2.0:
+  version "1.5.0"
+  resolved "http://124.70.149.18:4873/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb"
+  integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    functions-have-names "^1.2.3"
+
 regexpp@^3.1.0:
   version "3.2.0"
   resolved "http://124.70.149.18:4873/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"