浏览代码

feat[pc-components]: loading & editor

chenlei 1 年之前
父节点
当前提交
5120b472d7

+ 7 - 0
packages/backend-cli/CHANGELOG.md

@@ -1,5 +1,12 @@
 # @dage/backend-cli
 
+## 1.2.6
+
+### Patch Changes
+
+- Updated dependencies
+  - @dage/pc-components@1.3.0
+
 ## 1.2.3
 
 ### Patch Changes

+ 1 - 1
packages/backend-cli/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@dage/backend-cli",
-  "version": "1.2.5",
+  "version": "1.2.6",
   "description": "创建后台模板",
   "main": "index.js",
   "files": [

+ 7 - 0
packages/backend-cli/template/CHANGELOG.md

@@ -1,5 +1,12 @@
 # @dage/backend-template
 
+## 1.0.11
+
+### Patch Changes
+
+- Updated dependencies
+  - @dage/pc-components@1.3.0
+
 ## 1.0.10
 
 ### Patch Changes

+ 1 - 1
packages/backend-cli/template/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@dage/backend-template",
-  "version": "1.0.10",
+  "version": "1.0.11",
   "private": true,
   "dependencies": {
     "@ant-design/icons": "^5.1.4",

+ 2 - 2
packages/backend-cli/template/src/App.tsx

@@ -2,7 +2,7 @@ import React from "react";
 import { Route, Routes } from "react-router-dom";
 import { ConfigProvider } from "antd";
 import zhCN from "antd/lib/locale/zh_CN";
-import { MemoSpinLoding } from "./components";
+import { DageLoading } from "@dage/pc-components";
 import theme from "./theme.scss";
 import "./App.scss";
 import "./configure";
@@ -26,7 +26,7 @@ function App() {
         locale={Zhlocale}
         theme={{ token: { colorPrimary: theme.primaryColor } }}
       >
-        <React.Suspense fallback={<MemoSpinLoding />}>
+        <React.Suspense fallback={<DageLoading />}>
           <Routes>
             <Route path="/login" Component={Login} />
             <Route path="/*" Component={Layout} />

+ 0 - 12
packages/backend-cli/template/src/components/SpinLoding/index.module.scss

@@ -1,12 +0,0 @@
-.SpinLoding {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  background-color: #fff;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  z-index: 9999;
-}

+ 0 - 11
packages/backend-cli/template/src/components/SpinLoding/index.tsx

@@ -1,11 +0,0 @@
-import styles from "./index.module.scss";
-import { Spin } from "antd";
-import React from "react";
-function SpinLoding() {
-  return (
-    <div className={styles.SpinLoding}>
-      <Spin size="large" />
-    </div>
-  );
-}
-export const MemoSpinLoding = React.memo(SpinLoding);

+ 0 - 1
packages/backend-cli/template/src/components/index.ts

@@ -1,2 +1 @@
-export * from "./SpinLoding";
 export * from "./FormPageFooter";

+ 2 - 3
packages/backend-cli/template/src/pages/Layout/index.tsx

@@ -3,13 +3,12 @@ import { App, Layout } from "antd";
 import { useSelector } from "react-redux";
 import { Route, Routes, useNavigate, Navigate } from "react-router-dom";
 import { Content } from "antd/es/layout/layout";
-import { hasToken, getTokenInfo } from "@dage/pc-components";
+import { hasToken, getTokenInfo, DageLoading } from "@dage/pc-components";
 import store from "@/store";
 import { LayoutMenu, LayoutHeader } from "./components";
 import { RootState } from "@/store";
 import LogoImage from "@/assets/images/logo.png";
 import { DEFAULT_ADMIN_MENU, DEFAULT_MENU, DageRouteItem } from "@/router";
-import { MemoSpinLoding } from "@/components";
 import "./index.scss";
 
 const NotFound = React.lazy(() => import("@/components/NotFound"));
@@ -76,7 +75,7 @@ export default function CustomLayout() {
               borderRadius: 4,
             }}
           >
-            <Suspense fallback={<MemoSpinLoding />}>
+            <Suspense fallback={<DageLoading />}>
               {menuList.length && (
                 <Routes>
                   <Route

+ 5 - 0
packages/docs/.umirc.ts

@@ -65,9 +65,14 @@ export default defineConfig({
           "/components/Upload",
           "/components/FileCheckbox",
           "/components/Map",
+          "/components/Editor",
         ],
       },
       {
+        title: "反馈",
+        children: ["/components/Loading"],
+      },
+      {
         title: "工具",
         children: [
           /**

+ 34 - 0
packages/docs/docs/components/Editor/index.md

@@ -0,0 +1,34 @@
+## DageEditor 富文本
+
+默认排除了 `codeBlock` 和 `group-video` 功能,可以通过 `excludeKeys=[]` 恢复
+
+### 基本用法
+
+```tsx
+import React, { useState } from "react";
+import { DageEditor } from "@dage/pc-components";
+// 接口初始化
+import "../../configure";
+
+export default () => {
+  const [value, setValue] = useState("");
+
+  return (
+    <>
+      <DageEditor
+        action="/api/cms/goods/upload"
+        value={value}
+        onChange={setValue}
+      />
+
+      <div style={{ marginTop: 15 }}>value: {value}</div>
+    </>
+  );
+};
+```
+
+## API
+
+[详细 API 参考 wangeditor](https://www.wangeditor.com/v5/toolbar-config.html#toolbarkeys)
+
+<API hideTitle exports='["DageEditor"]' src='@dage/pc-components/index.d.ts'></API>

+ 20 - 0
packages/docs/docs/components/Loading/index.md

@@ -0,0 +1,20 @@
+## DageLoading 加载中
+
+### 基本用法
+
+```tsx
+import React from "react";
+import { DageLoading } from "@dage/pc-components";
+
+export default () => {
+  return (
+    <div style={{ position: "relative", height: 200 }}>
+      <DageLoading />
+    </div>
+  );
+};
+```
+
+## API
+
+<API hideTitle exports='["DageLoading"]' src='@dage/pc-components/index.d.ts'></API>

+ 7 - 0
packages/docs/docs/log/BACKEND-CLI_CHANGELOG.md

@@ -1,5 +1,12 @@
 # @dage/backend-cli
 
+## 1.2.6
+
+### Patch Changes
+
+- Updated dependencies
+  - @dage/pc-components@1.3.0
+
 ## 1.2.3
 
 ### Patch Changes

+ 6 - 0
packages/docs/docs/log/PC-COMPONENTS_CHANGELOG.md

@@ -1,5 +1,11 @@
 # @dage/pc-components
 
+## 1.3.0
+
+### Minor Changes
+
+- 新增 `DageLoading` 和 `DageEditor` 组件
+
 ## 1.2.10
 
 ### Patch Changes

+ 6 - 0
packages/pc-components/CHANGELOG.md

@@ -1,5 +1,11 @@
 # @dage/pc-components
 
+## 1.3.0
+
+### Minor Changes
+
+- 新增 `DageLoading` 和 `DageEditor` 组件
+
 ## 1.2.10
 
 ### Patch Changes

+ 3 - 1
packages/pc-components/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@dage/pc-components",
-  "version": "1.2.10",
+  "version": "1.3.0",
   "description": "PC 端组件库",
   "module": "dist/index.js",
   "main": "dist/index.js",
@@ -41,6 +41,8 @@
     "@amap/amap-react": "^0.1.5",
     "@dage/service": "workspace:^",
     "@dage/utils": "workspace:^",
+    "@wangeditor/editor": "^5.1.23",
+    "@wangeditor/editor-for-react": "^1.0.6",
     "styled-components": "^6.0.7"
   }
 }

+ 170 - 0
packages/pc-components/src/components/DageEditor/index.tsx

@@ -0,0 +1,170 @@
+import { FC, useEffect, useState } from "react";
+import { message } from "antd";
+import { Editor, Toolbar } from "@wangeditor/editor-for-react";
+import { IDomEditor, IEditorConfig, IToolbarConfig } from "@wangeditor/editor";
+import { getBaseURL, requestByPost } from "@dage/service";
+import { DageFileAPIResponseType, DageUploadType } from "../DageUpload";
+import { ACCEPT, validateFileType } from "../DageUpload/utils";
+import { DageEditorProps, InsertFnType } from "./types";
+import "@wangeditor/editor/dist/css/style.css";
+import { DageLoading } from "../DageLoading";
+import { LoadingOutlined } from "@ant-design/icons";
+import { assign } from "lodash";
+
+export const DageEditor: FC<DageEditorProps> = ({
+  value,
+  style,
+  className,
+  action,
+  readOnly,
+  fieldName = "file",
+  maxImgSize = 2,
+  maxVideoSize = 100,
+  placeholder = "请输入内容",
+  onChange,
+  onCreated,
+  onDestroyed,
+  onFocus,
+  onBlur,
+  customPaste,
+  ...tbConfig
+}) => {
+  const [uploadLoading, setUploadLoading] = useState(false);
+  const [editor, setEditor] = useState<IDomEditor | null>(null);
+
+  const validateFile = (file: File, type: DageUploadType) => {
+    if (!validateFileType(file, ACCEPT[type])) {
+      message.error("选择的文件类型不正确!");
+      return false;
+    }
+
+    const size = type === DageUploadType.IMG ? maxImgSize : maxVideoSize;
+    // 校验文件大小
+    const isLtM = file.size / 1024 / 1024 < size;
+    if (!isLtM) {
+      message.error(`最大支持 ${size}M!`);
+      return false;
+    }
+
+    return true;
+  };
+
+  const uploadFile = async (file: File, type: DageUploadType) => {
+    const formData = new FormData();
+
+    formData.append("type", type);
+
+    if (file instanceof Blob) {
+      formData.append(fieldName, file, (file as any).name);
+    } else {
+      formData.append(fieldName, file);
+    }
+
+    const data = await requestByPost<DageFileAPIResponseType>(action, formData);
+
+    return data;
+  };
+
+  // 工具栏配置
+  const toolbarConfig: Partial<IToolbarConfig> = assign(
+    {
+      excludeKeys: ["codeBlock", "group-video"],
+    },
+    tbConfig
+  );
+
+  // 编辑器配置
+  const editorConfig: Partial<IEditorConfig> = {
+    readOnly,
+    placeholder,
+    MENU_CONF: {
+      uploadImage: {
+        async customUpload(file: File, insertFn: InsertFnType) {
+          if (!validateFile(file, DageUploadType.IMG)) return;
+
+          try {
+            setUploadLoading(true);
+
+            const baseUrl = getBaseURL();
+            const data = await uploadFile(file, DageUploadType.IMG);
+
+            insertFn(
+              `${baseUrl}${data.filePath}`,
+              data.fileName,
+              data.filePath
+            );
+          } finally {
+            setUploadLoading(false);
+          }
+        },
+      },
+      uploadVideo: {
+        async customUpload(file: File, insertFn: InsertFnType) {
+          if (!validateFile(file, DageUploadType.VIDEO)) return;
+
+          try {
+            setUploadLoading(true);
+
+            const baseUrl = getBaseURL();
+            const data = await uploadFile(file, DageUploadType.VIDEO);
+
+            insertFn(
+              `${baseUrl}${data.filePath}`,
+              data.fileName,
+              data.filePath
+            );
+          } finally {
+            setUploadLoading(false);
+          }
+        },
+      },
+    },
+    onCreated,
+    onDestroyed,
+    onFocus,
+    onBlur,
+    customPaste,
+  };
+
+  useEffect(() => {
+    return () => {
+      if (editor == null) return;
+      editor.destroy();
+      setEditor(null);
+    };
+  }, [editor]);
+
+  return (
+    <div
+      className={className}
+      style={{
+        position: "relative",
+        border: "1px solid var(--w-e-toolbar-border-color)",
+        ...style,
+      }}
+    >
+      <Toolbar
+        editor={editor}
+        defaultConfig={toolbarConfig}
+        mode="default"
+        style={{ borderBottom: "1px solid var(--w-e-toolbar-border-color)" }}
+      />
+      <Editor
+        defaultConfig={editorConfig}
+        value={value}
+        onCreated={setEditor}
+        onChange={(editor) => onChange?.(editor.getHtml())}
+        mode="default"
+        style={{ height: "500px", overflowY: "hidden" }}
+      />
+
+      {uploadLoading && (
+        <DageLoading
+          indicator={<LoadingOutlined style={{ fontSize: 30 }} spin />}
+        />
+      )}
+    </div>
+  );
+};
+
+export * from "./types";

+ 58 - 0
packages/pc-components/src/components/DageEditor/types.ts

@@ -0,0 +1,58 @@
+import { IDomEditor, IToolbarConfig } from "@wangeditor/editor";
+import { CSSProperties } from "react";
+
+export interface DageEditorProps extends Partial<IToolbarConfig> {
+  style?: CSSProperties;
+  className?: string;
+  value?: string;
+  /**
+   * @default 请输入内容
+   */
+  placeholder?: string;
+  /**
+   * 只读
+   */
+  readOnly?: boolean;
+  /**
+   * 文件上传地址
+   */
+  action: string;
+  /**
+   * form-data fieldName
+   * @default file
+   */
+  fieldName?: string;
+  /**
+   * 单个图片的最大体积限制,单位 M
+   * @default 2
+   */
+  maxImgSize?: number;
+  /**
+   * 单个视频的最大体积限制,单位 M
+   * @default 100
+   */
+  maxVideoSize?: number;
+  /**
+   * 编辑器创建完毕时的回调函数
+   */
+  onCreated?(editor: IDomEditor): void;
+  /**
+   * 编辑器销毁时的回调函数
+   */
+  onDestroyed?(editor: IDomEditor): void;
+  /**
+   * 编辑器 focus 时的回调函数
+   */
+  onFocus?(editor: IDomEditor): void;
+  /**
+   * 编辑器 blur 时的回调函数
+   */
+  onBlur?(editor: IDomEditor): void;
+  /**
+   * 自定义粘贴。可阻止编辑器的默认粘贴,实现自己的粘贴逻辑
+   */
+  customPaste?(editor: IDomEditor, event: ClipboardEvent): boolean;
+  onChange?(v: string): void;
+}
+
+export type InsertFnType = (url: string, alt: string, href: string) => void;

+ 32 - 0
packages/pc-components/src/components/DageLoading/index.tsx

@@ -0,0 +1,32 @@
+import React, { FC } from "react";
+import { Spin, SpinProps } from "antd";
+
+export interface DageLoadingProps extends SpinProps {
+  style?: React.CSSProperties;
+  className?: string;
+}
+
+export const DageLoading: FC<DageLoadingProps> = React.memo(
+  ({ style, className, ...rest }) => {
+    return (
+      <div
+        className={className}
+        style={{
+          position: "absolute",
+          top: 0,
+          left: 0,
+          right: 0,
+          bottom: 0,
+          backgroundColor: "rgba(255,255,255,.8)",
+          display: "flex",
+          justifyContent: "center",
+          alignItems: "center",
+          zIndex: 9999,
+          ...style,
+        }}
+      >
+        <Spin size="large" {...rest} />
+      </div>
+    );
+  }
+);

+ 3 - 24
packages/pc-components/src/components/DageUpload/index.tsx

@@ -23,7 +23,7 @@ import {
 } from "./style";
 import { DageUploadContext } from "./context";
 import { DageUploadItemActions } from "./ItemActions";
-import { getImageSize } from "./utils";
+import { ACCEPT, getImageSize, validateFileType } from "./utils";
 
 const getBase64 = (file: RcFile): Promise<string> =>
   new Promise((resolve, reject) => {
@@ -66,22 +66,7 @@ export const DageUpload: FC<DageUploadProps> = ({
   const isPictureCard = uploadListType === "picture-card";
 
   // 可选文件类型
-  const accept = useMemo(() => {
-    switch (dType) {
-      case DageUploadType.IMG:
-        return ".jpg,.jpeg,.png,.gif";
-      case DageUploadType.MOBILE_MODEL:
-        return ".zip";
-      case DageUploadType.MODEL:
-        return ".4dage";
-      case DageUploadType.VIDEO:
-        return ".mp4";
-      case DageUploadType.AUDIO:
-        return ".mp3";
-      default:
-        return "*";
-    }
-  }, [dType]);
+  const accept = useMemo(() => ACCEPT[dType] || "*", [dType]);
 
   useEffect(() => {
     if (!value) return;
@@ -89,13 +74,7 @@ export const DageUpload: FC<DageUploadProps> = ({
   }, [value]);
 
   const beforeUpload = (file: RcFile) => {
-    let passFileType = false;
-
-    // 校验文件类型
-    const fileName = file.name.toLowerCase();
-    const fileExtension = fileName.substring(fileName.lastIndexOf("."));
-    passFileType = accept.split(",").includes(fileExtension);
-    if (!passFileType) {
+    if (!validateFileType(file, accept)) {
       message.error(tips || "选择的文件类型不正确!");
       return Upload.LIST_IGNORE;
     }

+ 22 - 0
packages/pc-components/src/components/DageUpload/utils.ts

@@ -1,4 +1,26 @@
 import { RcFile } from "antd/es/upload";
+import { DageUploadType } from "./types";
+
+/**
+ * 可选文件类型
+ */
+export const ACCEPT: Record<string, string> = {
+  [DageUploadType.IMG]: ".jpg,.jpeg,.png,.gif",
+  [DageUploadType.MOBILE_MODEL]: ".zip",
+  [DageUploadType.MODEL]: ".4dage",
+  [DageUploadType.VIDEO]: ".mp4",
+  [DageUploadType.AUDIO]: ".mp3",
+};
+
+/**
+ * 校验文件类型
+ */
+export const validateFileType = (file: File, accept: string) => {
+  const fileName = file.name.toLowerCase();
+  const fileExtension = fileName.substring(fileName.lastIndexOf("."));
+
+  return accept.split(",").includes(fileExtension);
+};
 
 export async function getImageSize(
   file: RcFile

+ 2 - 0
packages/pc-components/src/components/index.ts

@@ -2,3 +2,5 @@ export * from "./DageFileCheckbox";
 export * from "./DageMap";
 export * from "./DageUpload";
 export * from "./DageTableActions";
+export * from "./DageEditor";
+export * from "./DageLoading";

+ 426 - 0
pnpm-lock.yaml

@@ -371,6 +371,12 @@ importers:
       '@dage/utils':
         specifier: workspace:^
         version: link:../utils
+      '@wangeditor/editor':
+        specifier: ^5.1.23
+        version: registry.npmmirror.com/@wangeditor/editor@5.1.23
+      '@wangeditor/editor-for-react':
+        specifier: ^1.0.6
+        version: registry.npmmirror.com/@wangeditor/editor-for-react@1.0.6(@wangeditor/core@1.1.19)(@wangeditor/editor@5.1.23)(react-dom@18.2.0)(react@18.2.0)
       antd:
         specifier: 5.*
         version: registry.npmmirror.com/antd@5.6.4(react-dom@18.2.0)(react@18.2.0)
@@ -5812,6 +5818,12 @@ packages:
     engines: {node: '>= 6'}
     dev: false
 
+  registry.npmmirror.com/@transloadit/prettier-bytes@0.0.7:
+    resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz}
+    name: '@transloadit/prettier-bytes'
+    version: 0.0.7
+    dev: false
+
   registry.npmmirror.com/@trysound/sax@0.2.0:
     resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz}
     name: '@trysound/sax'
@@ -5959,6 +5971,12 @@ packages:
     name: '@types/estree'
     version: 1.0.1
 
+  registry.npmmirror.com/@types/event-emitter@0.3.5:
+    resolution: {integrity: sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.5.tgz}
+    name: '@types/event-emitter'
+    version: 0.3.5
+    dev: false
+
   registry.npmmirror.com/@types/events@3.0.0:
     resolution: {integrity: sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/events/-/events-3.0.0.tgz}
     name: '@types/events'
@@ -7421,6 +7439,274 @@ packages:
       '@umijs/deps': registry.npmmirror.com/@umijs/deps@3.5.41
     dev: false
 
+  registry.npmmirror.com/@uppy/companion-client@2.2.2:
+    resolution: {integrity: sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz}
+    name: '@uppy/companion-client'
+    version: 2.2.2
+    dependencies:
+      '@uppy/utils': registry.npmmirror.com/@uppy/utils@4.1.3
+      namespace-emitter: registry.npmmirror.com/namespace-emitter@2.0.1
+    dev: false
+
+  registry.npmmirror.com/@uppy/core@2.3.4:
+    resolution: {integrity: sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz}
+    name: '@uppy/core'
+    version: 2.3.4
+    dependencies:
+      '@transloadit/prettier-bytes': registry.npmmirror.com/@transloadit/prettier-bytes@0.0.7
+      '@uppy/store-default': registry.npmmirror.com/@uppy/store-default@2.1.1
+      '@uppy/utils': registry.npmmirror.com/@uppy/utils@4.1.3
+      lodash.throttle: registry.npmmirror.com/lodash.throttle@4.1.1
+      mime-match: registry.npmmirror.com/mime-match@1.0.2
+      namespace-emitter: registry.npmmirror.com/namespace-emitter@2.0.1
+      nanoid: registry.npmmirror.com/nanoid@3.3.6
+      preact: registry.npmmirror.com/preact@10.19.2
+    dev: false
+
+  registry.npmmirror.com/@uppy/store-default@2.1.1:
+    resolution: {integrity: sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz}
+    name: '@uppy/store-default'
+    version: 2.1.1
+    dev: false
+
+  registry.npmmirror.com/@uppy/utils@4.1.3:
+    resolution: {integrity: sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz}
+    name: '@uppy/utils'
+    version: 4.1.3
+    dependencies:
+      lodash.throttle: registry.npmmirror.com/lodash.throttle@4.1.1
+    dev: false
+
+  registry.npmmirror.com/@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4):
+    resolution: {integrity: sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz}
+    id: registry.npmmirror.com/@uppy/xhr-upload/2.1.3
+    name: '@uppy/xhr-upload'
+    version: 2.1.3
+    peerDependencies:
+      '@uppy/core': ^2.3.3
+    dependencies:
+      '@uppy/companion-client': registry.npmmirror.com/@uppy/companion-client@2.2.2
+      '@uppy/core': registry.npmmirror.com/@uppy/core@2.3.4
+      '@uppy/utils': registry.npmmirror.com/@uppy/utils@4.1.3
+      nanoid: registry.npmmirror.com/nanoid@3.3.6
+    dev: false
+
+  registry.npmmirror.com/@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1):
+    resolution: {integrity: sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz}
+    id: registry.npmmirror.com/@wangeditor/basic-modules/1.1.7
+    name: '@wangeditor/basic-modules'
+    version: 1.1.7
+    peerDependencies:
+      '@wangeditor/core': 1.x
+      dom7: ^3.0.0
+      lodash.throttle: ^4.1.1
+      nanoid: ^3.2.0
+      slate: ^0.72.0
+      snabbdom: ^3.1.0
+    dependencies:
+      '@wangeditor/core': registry.npmmirror.com/@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
+      dom7: registry.npmmirror.com/dom7@3.0.0
+      is-url: registry.npmmirror.com/is-url@1.2.4
+      lodash.throttle: registry.npmmirror.com/lodash.throttle@4.1.1
+      nanoid: registry.npmmirror.com/nanoid@3.3.6
+      slate: registry.npmmirror.com/slate@0.72.8
+      snabbdom: registry.npmmirror.com/snabbdom@3.5.1
+    dev: false
+
+  registry.npmmirror.com/@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.5.1):
+    resolution: {integrity: sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz}
+    id: registry.npmmirror.com/@wangeditor/code-highlight/1.0.3
+    name: '@wangeditor/code-highlight'
+    version: 1.0.3
+    peerDependencies:
+      '@wangeditor/core': 1.x
+      dom7: ^3.0.0
+      slate: ^0.72.0
+      snabbdom: ^3.1.0
+    dependencies:
+      '@wangeditor/core': registry.npmmirror.com/@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
+      dom7: registry.npmmirror.com/dom7@3.0.0
+      prismjs: registry.npmmirror.com/prismjs@1.29.0
+      slate: registry.npmmirror.com/slate@0.72.8
+      snabbdom: registry.npmmirror.com/snabbdom@3.5.1
+    dev: false
+
+  registry.npmmirror.com/@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1):
+    resolution: {integrity: sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz}
+    id: registry.npmmirror.com/@wangeditor/core/1.1.19
+    name: '@wangeditor/core'
+    version: 1.1.19
+    peerDependencies:
+      '@uppy/core': ^2.1.1
+      '@uppy/xhr-upload': ^2.0.3
+      dom7: ^3.0.0
+      is-hotkey: ^0.2.0
+      lodash.camelcase: ^4.3.0
+      lodash.clonedeep: ^4.5.0
+      lodash.debounce: ^4.0.8
+      lodash.foreach: ^4.5.0
+      lodash.isequal: ^4.5.0
+      lodash.throttle: ^4.1.1
+      lodash.toarray: ^4.4.0
+      nanoid: ^3.2.0
+      slate: ^0.72.0
+      snabbdom: ^3.1.0
+    dependencies:
+      '@types/event-emitter': registry.npmmirror.com/@types/event-emitter@0.3.5
+      '@uppy/core': registry.npmmirror.com/@uppy/core@2.3.4
+      '@uppy/xhr-upload': registry.npmmirror.com/@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4)
+      dom7: registry.npmmirror.com/dom7@3.0.0
+      event-emitter: registry.npmmirror.com/event-emitter@0.3.5
+      html-void-elements: registry.npmmirror.com/html-void-elements@2.0.1
+      i18next: registry.npmmirror.com/i18next@20.6.1
+      is-hotkey: registry.npmmirror.com/is-hotkey@0.2.0
+      lodash.camelcase: registry.npmmirror.com/lodash.camelcase@4.3.0
+      lodash.clonedeep: registry.npmmirror.com/lodash.clonedeep@4.5.0
+      lodash.debounce: registry.npmmirror.com/lodash.debounce@4.0.8
+      lodash.foreach: registry.npmmirror.com/lodash.foreach@4.5.0
+      lodash.isequal: registry.npmmirror.com/lodash.isequal@4.5.0
+      lodash.throttle: registry.npmmirror.com/lodash.throttle@4.1.1
+      lodash.toarray: registry.npmmirror.com/lodash.toarray@4.4.0
+      nanoid: registry.npmmirror.com/nanoid@3.3.6
+      scroll-into-view-if-needed: registry.npmmirror.com/scroll-into-view-if-needed@2.2.31
+      slate: registry.npmmirror.com/slate@0.72.8
+      slate-history: registry.npmmirror.com/slate-history@0.66.0(slate@0.72.8)
+      snabbdom: registry.npmmirror.com/snabbdom@3.5.1
+    dev: false
+
+  registry.npmmirror.com/@wangeditor/editor-for-react@1.0.6(@wangeditor/core@1.1.19)(@wangeditor/editor@5.1.23)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-KJNSfgMr5Blzae3oyaiz20flMKHZHnvsz4bCYQKDCUs/qkvC+xNTnwedlCmhGP187oPWPEypCIYI8Zg6sz0psQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@wangeditor/editor-for-react/-/editor-for-react-1.0.6.tgz}
+    id: registry.npmmirror.com/@wangeditor/editor-for-react/1.0.6
+    name: '@wangeditor/editor-for-react'
+    version: 1.0.6
+    peerDependencies:
+      '@wangeditor/core': '>=1.1.0'
+      '@wangeditor/editor': '>=5.1.0'
+      react: '>=17.0.2'
+      react-dom: '>=17.0.2'
+    dependencies:
+      '@wangeditor/core': registry.npmmirror.com/@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
+      '@wangeditor/editor': registry.npmmirror.com/@wangeditor/editor@5.1.23
+      react: registry.npmmirror.com/react@18.2.0
+      react-dom: registry.npmmirror.com/react-dom@18.2.0(react@18.2.0)
+    dev: false
+
+  registry.npmmirror.com/@wangeditor/editor@5.1.23:
+    resolution: {integrity: sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz}
+    name: '@wangeditor/editor'
+    version: 5.1.23
+    dependencies:
+      '@uppy/core': registry.npmmirror.com/@uppy/core@2.3.4
+      '@uppy/xhr-upload': registry.npmmirror.com/@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4)
+      '@wangeditor/basic-modules': registry.npmmirror.com/@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
+      '@wangeditor/code-highlight': registry.npmmirror.com/@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.5.1)
+      '@wangeditor/core': registry.npmmirror.com/@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
+      '@wangeditor/list-module': registry.npmmirror.com/@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.5.1)
+      '@wangeditor/table-module': registry.npmmirror.com/@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
+      '@wangeditor/upload-image-module': registry.npmmirror.com/@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/basic-modules@1.1.7)(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.5.1)
+      '@wangeditor/video-module': registry.npmmirror.com/@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/core@1.1.19)(dom7@3.0.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
+      dom7: registry.npmmirror.com/dom7@3.0.0
+      is-hotkey: registry.npmmirror.com/is-hotkey@0.2.0
+      lodash.camelcase: registry.npmmirror.com/lodash.camelcase@4.3.0
+      lodash.clonedeep: registry.npmmirror.com/lodash.clonedeep@4.5.0
+      lodash.debounce: registry.npmmirror.com/lodash.debounce@4.0.8
+      lodash.foreach: registry.npmmirror.com/lodash.foreach@4.5.0
+      lodash.isequal: registry.npmmirror.com/lodash.isequal@4.5.0
+      lodash.throttle: registry.npmmirror.com/lodash.throttle@4.1.1
+      lodash.toarray: registry.npmmirror.com/lodash.toarray@4.4.0
+      nanoid: registry.npmmirror.com/nanoid@3.3.6
+      slate: registry.npmmirror.com/slate@0.72.8
+      snabbdom: registry.npmmirror.com/snabbdom@3.5.1
+    dev: false
+
+  registry.npmmirror.com/@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.5.1):
+    resolution: {integrity: sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz}
+    id: registry.npmmirror.com/@wangeditor/list-module/1.0.5
+    name: '@wangeditor/list-module'
+    version: 1.0.5
+    peerDependencies:
+      '@wangeditor/core': 1.x
+      dom7: ^3.0.0
+      slate: ^0.72.0
+      snabbdom: ^3.1.0
+    dependencies:
+      '@wangeditor/core': registry.npmmirror.com/@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
+      dom7: registry.npmmirror.com/dom7@3.0.0
+      slate: registry.npmmirror.com/slate@0.72.8
+      snabbdom: registry.npmmirror.com/snabbdom@3.5.1
+    dev: false
+
+  registry.npmmirror.com/@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1):
+    resolution: {integrity: sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz}
+    id: registry.npmmirror.com/@wangeditor/table-module/1.1.4
+    name: '@wangeditor/table-module'
+    version: 1.1.4
+    peerDependencies:
+      '@wangeditor/core': 1.x
+      dom7: ^3.0.0
+      lodash.isequal: ^4.5.0
+      lodash.throttle: ^4.1.1
+      nanoid: ^3.2.0
+      slate: ^0.72.0
+      snabbdom: ^3.1.0
+    dependencies:
+      '@wangeditor/core': registry.npmmirror.com/@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
+      dom7: registry.npmmirror.com/dom7@3.0.0
+      lodash.isequal: registry.npmmirror.com/lodash.isequal@4.5.0
+      lodash.throttle: registry.npmmirror.com/lodash.throttle@4.1.1
+      nanoid: registry.npmmirror.com/nanoid@3.3.6
+      slate: registry.npmmirror.com/slate@0.72.8
+      snabbdom: registry.npmmirror.com/snabbdom@3.5.1
+    dev: false
+
+  registry.npmmirror.com/@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/basic-modules@1.1.7)(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.5.1):
+    resolution: {integrity: sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz}
+    id: registry.npmmirror.com/@wangeditor/upload-image-module/1.0.2
+    name: '@wangeditor/upload-image-module'
+    version: 1.0.2
+    peerDependencies:
+      '@uppy/core': ^2.0.3
+      '@uppy/xhr-upload': ^2.0.3
+      '@wangeditor/basic-modules': 1.x
+      '@wangeditor/core': 1.x
+      dom7: ^3.0.0
+      lodash.foreach: ^4.5.0
+      slate: ^0.72.0
+      snabbdom: ^3.1.0
+    dependencies:
+      '@uppy/core': registry.npmmirror.com/@uppy/core@2.3.4
+      '@uppy/xhr-upload': registry.npmmirror.com/@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4)
+      '@wangeditor/basic-modules': registry.npmmirror.com/@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
+      '@wangeditor/core': registry.npmmirror.com/@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
+      dom7: registry.npmmirror.com/dom7@3.0.0
+      lodash.foreach: registry.npmmirror.com/lodash.foreach@4.5.0
+      slate: registry.npmmirror.com/slate@0.72.8
+      snabbdom: registry.npmmirror.com/snabbdom@3.5.1
+    dev: false
+
+  registry.npmmirror.com/@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/core@1.1.19)(dom7@3.0.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1):
+    resolution: {integrity: sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz}
+    id: registry.npmmirror.com/@wangeditor/video-module/1.1.4
+    name: '@wangeditor/video-module'
+    version: 1.1.4
+    peerDependencies:
+      '@uppy/core': ^2.1.4
+      '@uppy/xhr-upload': ^2.0.7
+      '@wangeditor/core': 1.x
+      dom7: ^3.0.0
+      nanoid: ^3.2.0
+      slate: ^0.72.0
+      snabbdom: ^3.1.0
+    dependencies:
+      '@uppy/core': registry.npmmirror.com/@uppy/core@2.3.4
+      '@uppy/xhr-upload': registry.npmmirror.com/@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4)
+      '@wangeditor/core': registry.npmmirror.com/@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1)
+      dom7: registry.npmmirror.com/dom7@3.0.0
+      nanoid: registry.npmmirror.com/nanoid@3.3.6
+      slate: registry.npmmirror.com/slate@0.72.8
+      snabbdom: registry.npmmirror.com/snabbdom@3.5.1
+    dev: false
+
   registry.npmmirror.com/@webassemblyjs/ast@1.11.1:
     resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.1.tgz}
     name: '@webassemblyjs/ast'
@@ -10271,6 +10557,12 @@ packages:
       - supports-color
     dev: false
 
+  registry.npmmirror.com/compute-scroll-into-view@1.0.20:
+    resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz}
+    name: compute-scroll-into-view
+    version: 1.0.20
+    dev: false
+
   registry.npmmirror.com/compute-scroll-into-view@3.0.3:
     resolution: {integrity: sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz}
     name: compute-scroll-into-view
@@ -11633,6 +11925,14 @@ packages:
       entities: registry.npmmirror.com/entities@2.2.0
     dev: false
 
+  registry.npmmirror.com/dom7@3.0.0:
+    resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz}
+    name: dom7
+    version: 3.0.0
+    dependencies:
+      ssr-window: registry.npmmirror.com/ssr-window@3.0.0
+    dev: false
+
   registry.npmmirror.com/domain-browser@1.2.0:
     resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/domain-browser/-/domain-browser-1.2.0.tgz}
     name: domain-browser
@@ -14875,6 +15175,12 @@ packages:
     version: 1.0.5
     dev: false
 
+  registry.npmmirror.com/html-void-elements@2.0.1:
+    resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz}
+    name: html-void-elements
+    version: 2.0.1
+    dev: false
+
   registry.npmmirror.com/html-webpack-plugin@5.5.0(webpack@5.64.4):
     resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz}
     id: registry.npmmirror.com/html-webpack-plugin/5.5.0
@@ -15107,6 +15413,14 @@ packages:
     version: 2.0.1
     dev: false
 
+  registry.npmmirror.com/i18next@20.6.1:
+    resolution: {integrity: sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz}
+    name: i18next
+    version: 20.6.1
+    dependencies:
+      '@babel/runtime': registry.npmmirror.com/@babel/runtime@7.22.10
+    dev: false
+
   registry.npmmirror.com/iconv-lite@0.4.24:
     resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz}
     name: iconv-lite
@@ -15693,6 +16007,12 @@ packages:
     name: is-hexadecimal
     version: 1.0.4
 
+  registry.npmmirror.com/is-hotkey@0.2.0:
+    resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz}
+    name: is-hotkey
+    version: 0.2.0
+    dev: false
+
   registry.npmmirror.com/is-installed-globally@0.1.0:
     resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz}
     name: is-installed-globally
@@ -15825,6 +16145,13 @@ packages:
       isobject: registry.npmmirror.com/isobject@3.0.1
     dev: true
 
+  registry.npmmirror.com/is-plain-object@5.0.0:
+    resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz}
+    name: is-plain-object
+    version: 5.0.0
+    engines: {node: '>=0.10.0'}
+    dev: false
+
   registry.npmmirror.com/is-posix-bracket@0.1.1:
     resolution: {integrity: sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz}
     name: is-posix-bracket
@@ -15965,6 +16292,12 @@ packages:
     engines: {node: '>=10'}
     dev: true
 
+  registry.npmmirror.com/is-url@1.2.4:
+    resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz}
+    name: is-url
+    version: 1.2.4
+    dev: false
+
   registry.npmmirror.com/is-weakmap@2.0.1:
     resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.1.tgz}
     name: is-weakmap
@@ -18516,17 +18849,35 @@ packages:
     version: 4.3.0
     dev: false
 
+  registry.npmmirror.com/lodash.clonedeep@4.5.0:
+    resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz}
+    name: lodash.clonedeep
+    version: 4.5.0
+    dev: false
+
   registry.npmmirror.com/lodash.debounce@4.0.8:
     resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz}
     name: lodash.debounce
     version: 4.0.8
 
+  registry.npmmirror.com/lodash.foreach@4.5.0:
+    resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz}
+    name: lodash.foreach
+    version: 4.5.0
+    dev: false
+
   registry.npmmirror.com/lodash.get@4.4.2:
     resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.get/-/lodash.get-4.4.2.tgz}
     name: lodash.get
     version: 4.4.2
     dev: true
 
+  registry.npmmirror.com/lodash.isequal@4.5.0:
+    resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz}
+    name: lodash.isequal
+    version: 4.5.0
+    dev: false
+
   registry.npmmirror.com/lodash.memoize@4.1.2:
     resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz}
     name: lodash.memoize
@@ -18555,6 +18906,12 @@ packages:
     version: 4.1.1
     dev: false
 
+  registry.npmmirror.com/lodash.toarray@4.4.0:
+    resolution: {integrity: sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz}
+    name: lodash.toarray
+    version: 4.4.0
+    dev: false
+
   registry.npmmirror.com/lodash.truncate@4.4.2:
     resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz}
     name: lodash.truncate
@@ -19271,6 +19628,14 @@ packages:
     version: 1.52.0
     engines: {node: '>= 0.6'}
 
+  registry.npmmirror.com/mime-match@1.0.2:
+    resolution: {integrity: sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz}
+    name: mime-match
+    version: 1.0.2
+    dependencies:
+      wildcard: registry.npmmirror.com/wildcard@1.1.2
+    dev: false
+
   registry.npmmirror.com/mime-types@2.1.35:
     resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz}
     name: mime-types
@@ -19565,6 +19930,12 @@ packages:
     version: 0.0.7
     dev: false
 
+  registry.npmmirror.com/namespace-emitter@2.0.1:
+    resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz}
+    name: namespace-emitter
+    version: 2.0.1
+    dev: false
+
   registry.npmmirror.com/nan@2.17.0:
     resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nan/-/nan-2.17.0.tgz}
     name: nan
@@ -22211,6 +22582,12 @@ packages:
       source-map-js: registry.npmmirror.com/source-map-js@1.0.2
     dev: false
 
+  registry.npmmirror.com/preact@10.19.2:
+    resolution: {integrity: sha512-UA9DX/OJwv6YwP9Vn7Ti/vF80XL+YA5H2l7BpCtUr3ya8LWHFzpiO5R+N7dN16ujpIxhekRFuOOF82bXX7K/lg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/preact/-/preact-10.19.2.tgz}
+    name: preact
+    version: 10.19.2
+    dev: false
+
   registry.npmmirror.com/preferred-pm@3.0.3:
     resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/preferred-pm/-/preferred-pm-3.0.3.tgz}
     name: preferred-pm
@@ -25081,6 +25458,14 @@ packages:
       ajv-keywords: registry.npmmirror.com/ajv-keywords@5.1.0(ajv@8.12.0)
     dev: false
 
+  registry.npmmirror.com/scroll-into-view-if-needed@2.2.31:
+    resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz}
+    name: scroll-into-view-if-needed
+    version: 2.2.31
+    dependencies:
+      compute-scroll-into-view: registry.npmmirror.com/compute-scroll-into-view@1.0.20
+    dev: false
+
   registry.npmmirror.com/scroll-into-view-if-needed@3.0.10:
     resolution: {integrity: sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz}
     name: scroll-into-view-if-needed
@@ -25411,6 +25796,28 @@ packages:
     engines: {node: '>=12'}
     dev: false
 
+  registry.npmmirror.com/slate-history@0.66.0(slate@0.72.8):
+    resolution: {integrity: sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz}
+    id: registry.npmmirror.com/slate-history/0.66.0
+    name: slate-history
+    version: 0.66.0
+    peerDependencies:
+      slate: '>=0.65.3'
+    dependencies:
+      is-plain-object: registry.npmmirror.com/is-plain-object@5.0.0
+      slate: registry.npmmirror.com/slate@0.72.8
+    dev: false
+
+  registry.npmmirror.com/slate@0.72.8:
+    resolution: {integrity: sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz}
+    name: slate
+    version: 0.72.8
+    dependencies:
+      immer: registry.npmmirror.com/immer@9.0.21
+      is-plain-object: registry.npmmirror.com/is-plain-object@5.0.0
+      tiny-warning: registry.npmmirror.com/tiny-warning@1.0.3
+    dev: false
+
   registry.npmmirror.com/slice-ansi@4.0.0:
     resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz}
     name: slice-ansi
@@ -25444,6 +25851,13 @@ packages:
       yargs: registry.npmmirror.com/yargs@15.4.1
     dev: true
 
+  registry.npmmirror.com/snabbdom@3.5.1:
+    resolution: {integrity: sha512-wHMNIOjkm/YNE5EM3RCbr/+DVgPg6AqQAX1eOxO46zYNvCXjKP5Y865tqQj3EXnaMBjkxmQA5jFuDpDK/dbfiA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/snabbdom/-/snabbdom-3.5.1.tgz}
+    name: snabbdom
+    version: 3.5.1
+    engines: {node: '>=8.3.0'}
+    dev: false
+
   registry.npmmirror.com/snapdragon-node@2.1.1:
     resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz}
     name: snapdragon-node
@@ -25760,6 +26174,12 @@ packages:
       tweetnacl: registry.npmmirror.com/tweetnacl@0.14.5
     dev: true
 
+  registry.npmmirror.com/ssr-window@3.0.0:
+    resolution: {integrity: sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz}
+    name: ssr-window
+    version: 3.0.0
+    dev: false
+
   registry.npmmirror.com/ssri@4.1.6:
     resolution: {integrity: sha512-WUbCdgSAMQjTFZRWvSPpauryvREEA+Krn19rx67UlJEJx/M192ZHxMmJXjZ4tkdFm+Sb0SXGlENeQVlA5wY7kA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ssri/-/ssri-4.1.6.tgz}
     name: ssri
@@ -28157,6 +28577,12 @@ packages:
       string-width: registry.npmmirror.com/string-width@2.1.1
     dev: false
 
+  registry.npmmirror.com/wildcard@1.1.2:
+    resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz}
+    name: wildcard
+    version: 1.1.2
+    dev: false
+
   registry.npmmirror.com/word-wrap@1.2.5:
     resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz}
     name: word-wrap