From eafde036ec7f7daa7fad6b0eb4fece8848e6e056 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E8=BF=82=E8=BF=82?= Date: Thu, 11 Jan 2024 10:31:15 +0800 Subject: [PATCH 1/6] refactor: bump @dtinsight/molecule's version to 2.0.0.alpha.0 --- website/package.json | 5 +- website/pnpm-lock.yaml | 601 +++++++++++------ website/public/MapleMono.ttf | Bin 0 -> 34168 bytes website/public/icons-carbon.json | 626 ++++++++++++++++++ website/public/icons-carbon.woff | Bin 0 -> 18128 bytes website/public/molecule-logo.png | Bin 0 -> 84734 bytes website/src/App.tsx | 61 +- website/src/components/icon/helper.tsx | 41 ++ website/src/components/icon/index.tsx | 161 +++++ website/src/const/index.ts | 27 + website/src/extensions/Null.tsx | 3 + website/src/extensions/actions/index.ts | 14 + .../extensions/actions/quickExecuteAction.ts | 62 ++ .../src/extensions/actions/quickSaveAction.ts | 34 + website/src/extensions/default/index.tsx | 233 +++++++ website/src/extensions/index.ts | 5 + website/src/extensions/view/index.ts | 30 + website/src/extensions/workbench/common.ts | 27 - website/src/extensions/workbench/index.tsx | 56 -- website/src/extensions/workbench/sidebar.tsx | 176 ----- website/src/hooks/useEdit.ts | 22 + website/src/index.css | 21 +- website/src/main.tsx | 7 +- website/src/storage/content/index.ts | 24 + website/src/storage/task/index.ts | 43 ++ website/src/storage/tmp/index.ts | 16 + website/src/storage/view/index.ts | 23 + website/src/types.ts | 4 + website/src/workbench/editor/index.tsx | 38 ++ website/src/workbench/editor/styled.tsx | 7 + website/src/workbench/language/index.tsx | 10 + website/src/workbench/path/index.tsx | 15 + website/src/workbench/path/styled.ts | 7 + website/src/workbench/powerBy/index.tsx | 69 ++ website/src/workbench/powerBy/styled.ts | 61 ++ website/src/workbench/sidebar/index.tsx | 13 + website/src/workbench/sidebar/styled.tsx | 21 + website/src/workbench/tab/index.tsx | 136 ++++ website/src/workbench/tab/styled.tsx | 49 ++ website/src/workbench/tree/index.tsx | 57 ++ website/src/workbench/tree/styled.ts | 21 + website/tsconfig.json | 1 - website/vite.config.ts | 7 +- 43 files changed, 2349 insertions(+), 485 deletions(-) create mode 100644 website/public/MapleMono.ttf create mode 100644 website/public/icons-carbon.json create mode 100644 website/public/icons-carbon.woff create mode 100644 website/public/molecule-logo.png create mode 100644 website/src/components/icon/helper.tsx create mode 100644 website/src/components/icon/index.tsx create mode 100644 website/src/const/index.ts create mode 100644 website/src/extensions/Null.tsx create mode 100644 website/src/extensions/actions/index.ts create mode 100644 website/src/extensions/actions/quickExecuteAction.ts create mode 100644 website/src/extensions/actions/quickSaveAction.ts create mode 100644 website/src/extensions/default/index.tsx create mode 100644 website/src/extensions/index.ts create mode 100644 website/src/extensions/view/index.ts delete mode 100644 website/src/extensions/workbench/common.ts delete mode 100644 website/src/extensions/workbench/index.tsx delete mode 100644 website/src/extensions/workbench/sidebar.tsx create mode 100644 website/src/hooks/useEdit.ts create mode 100644 website/src/storage/content/index.ts create mode 100644 website/src/storage/task/index.ts create mode 100644 website/src/storage/tmp/index.ts create mode 100644 website/src/storage/view/index.ts create mode 100644 website/src/types.ts create mode 100644 website/src/workbench/editor/index.tsx create mode 100644 website/src/workbench/editor/styled.tsx create mode 100644 website/src/workbench/language/index.tsx create mode 100644 website/src/workbench/path/index.tsx create mode 100644 website/src/workbench/path/styled.ts create mode 100644 website/src/workbench/powerBy/index.tsx create mode 100644 website/src/workbench/powerBy/styled.ts create mode 100644 website/src/workbench/sidebar/index.tsx create mode 100644 website/src/workbench/sidebar/styled.tsx create mode 100644 website/src/workbench/tab/index.tsx create mode 100644 website/src/workbench/tab/styled.tsx create mode 100644 website/src/workbench/tree/index.tsx create mode 100644 website/src/workbench/tree/styled.ts diff --git a/website/package.json b/website/package.json index 55d76b42..3fcf6920 100644 --- a/website/package.json +++ b/website/package.json @@ -10,18 +10,19 @@ "preview": "vite preview" }, "dependencies": { - "@dtinsight/molecule": "^1.3.4", + "@dtinsight/molecule": "2.0.0-alpha.0", "@esbuild-plugins/node-globals-polyfill": "^0.2.3", "@esbuild-plugins/node-modules-polyfill": "^0.2.2", "@jcubic/lips": "^0.20.3", "assert": "link:rollup-plugin-node-polyfills/polyfills/assert", "buffer": "^6.0.3", + "idb-keyval": "^6.2.1", "monaco-editor": "0.31.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "reflect-metadata": "^0.1.13", "rollup-plugin-node-polyfills": "^0.2.1", "rollup-plugin-polyfill-node": "^0.12.0", + "styled-components": "^6.1.6", "util": "link:rollup-plugin-node-polyfills/polyfills/util", "vite-plugin-commonjs": "^0.7.1" }, diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml index 05d1d782..f36ddbf9 100644 --- a/website/pnpm-lock.yaml +++ b/website/pnpm-lock.yaml @@ -1,7 +1,7 @@ lockfileVersion: 5.3 specifiers: - '@dtinsight/molecule': ^1.3.4 + '@dtinsight/molecule': 2.0.0-alpha.0 '@esbuild-plugins/node-globals-polyfill': ^0.2.3 '@esbuild-plugins/node-modules-polyfill': ^0.2.2 '@jcubic/lips': ^0.20.3 @@ -16,30 +16,32 @@ specifiers: eslint: ^8.38.0 eslint-plugin-react-hooks: ^4.6.0 eslint-plugin-react-refresh: ^0.3.4 + idb-keyval: ^6.2.1 monaco-editor: 0.31.0 react: ^18.2.0 react-dom: ^18.2.0 - reflect-metadata: ^0.1.13 rollup-plugin-node-polyfills: ^0.2.1 rollup-plugin-polyfill-node: ^0.12.0 + styled-components: ^6.1.6 typescript: ^5.0.2 util: link:rollup-plugin-node-polyfills/polyfills/util vite: ^4.3.9 vite-plugin-commonjs: ^0.7.1 dependencies: - '@dtinsight/molecule': 1.3.4_f00573bd3726c9f289cfe34c027997e4 + '@dtinsight/molecule': 2.0.0-alpha.0_f00573bd3726c9f289cfe34c027997e4 '@esbuild-plugins/node-globals-polyfill': 0.2.3 '@esbuild-plugins/node-modules-polyfill': 0.2.2 '@jcubic/lips': 0.20.3 assert: link:rollup-plugin-node-polyfills/polyfills/assert buffer: 6.0.3 + idb-keyval: 6.2.1 monaco-editor: 0.31.0 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 - reflect-metadata: 0.1.13 rollup-plugin-node-polyfills: 0.2.1 rollup-plugin-polyfill-node: 0.12.0 + styled-components: 6.1.6_react-dom@18.2.0+react@18.2.0 util: link:rollup-plugin-node-polyfills/polyfills/util vite-plugin-commonjs: 0.7.1 @@ -247,11 +249,11 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true - /@babel/runtime/7.22.5: - resolution: {integrity: sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==} + /@babel/runtime/7.23.7: + resolution: {integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.13.11 + regenerator-runtime: 0.14.1 dev: false /@babel/template/7.21.9: @@ -290,43 +292,57 @@ packages: to-fast-properties: 2.0.0 dev: true - /@dtinsight/dt-utils/1.1.2: - resolution: {integrity: sha512-jPGRUBD96+4ZLiI4LE2+mhG4wOVq8GveiDZH4HfZTQlVy+NjPmcWXZWYc9cIiTYK9WqyEOJNgW87zgf+rz5S+g==} + /@dtinsight/dt-utils/1.3.1: + resolution: {integrity: sha512-bV3xfCUthEtPkBpsCV/798J/Fz9xhxq9QybAaXhOtfGlZRuqPrb4Irdp2ySj7UaFB4VmmDg0wTIyxv0HMyGctQ==} dependencies: - dayjs: 1.11.8 + dayjs: 1.11.10 lodash: 4.17.21 standard-version: 9.5.0 dev: false - /@dtinsight/molecule/1.3.4_f00573bd3726c9f289cfe34c027997e4: - resolution: {integrity: sha512-w18xVeursLCOJHdexcPxdquj9kDxSjpumWg5LCJAWPlE18dNnGgvZYhbKmUMVF1xlpe9HX03tZA22pOvfzDRVw==} - requiresBuild: true + /@dtinsight/molecule/2.0.0-alpha.0_f00573bd3726c9f289cfe34c027997e4: + resolution: {integrity: sha512-a43k5SOgtxGMFY3KcMCp+VZ18844CalIAWACSb8Sh31ORpXCx95O25JzrAiZBmrck+KZyz+UqG86uykhHf31XQ==} peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' + react: '>=16.13.1' + react-dom: '>=16.13.1' dependencies: - '@dtinsight/dt-utils': 1.1.2 - '@vscode/codicons': 0.0.26 - immutability-helper: 3.1.1 - lodash: 4.17.21 + '@dtinsight/dt-utils': 1.3.1 + '@vscode/codicons': 0.0.33 + immer: 10.0.3 + lodash-es: 4.17.21 monaco-editor: 0.31.0 - rc-dialog: 8.9.0_react-dom@18.2.0+react@18.2.0 - rc-textarea: 0.3.7_react-dom@18.2.0+react@18.2.0 - rc-tooltip: 5.3.1_react-dom@18.2.0+react@18.2.0 - rc-util: 5.33.0_react-dom@18.2.0+react@18.2.0 + normalize.css: 8.0.1 + rc-dropdown: 4.1.0_react-dom@18.2.0+react@18.2.0 + rc-menu: 9.12.4_react-dom@18.2.0+react@18.2.0 react: 18.2.0 react-dnd: 16.0.1_a5670010d83c4da6dfe751a35739cb3c react-dnd-html5-backend: 16.0.1 react-dom: 18.2.0_react@18.2.0 - react-scrollbars-custom: 4.1.1_react-dom@18.2.0+react@18.2.0 + react-use: 17.4.2_react-dom@18.2.0+react@18.2.0 reflect-metadata: 0.1.13 - tsyringe: 4.5.0 + tapable: 2.2.1 + tsyringe: 4.8.0 + use-sync-external-store: 1.2.0_react@18.2.0 transitivePeerDependencies: - '@types/hoist-non-react-statics' - '@types/node' - '@types/react' dev: false + /@emotion/is-prop-valid/1.2.1: + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + dependencies: + '@emotion/memoize': 0.8.1 + dev: false + + /@emotion/memoize/0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false + + /@emotion/unitless/0.8.0: + resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} + dev: false + /@esbuild-plugins/node-globals-polyfill/0.2.3: resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} peerDependencies: @@ -660,6 +676,37 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + /@rc-component/portal/1.1.2_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.7 + classnames: 2.5.1 + rc-util: 5.38.1_react-dom@18.2.0+react@18.2.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /@rc-component/trigger/1.18.2_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-jRLYgFgjLEPq3MvS87fIhcfuywFSRDaDrYw1FLku7Cm4esszvzTbA0JBsyacAyLrK9rF3TiHFcvoEDMzoD3CTA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.7 + '@rc-component/portal': 1.1.2_react-dom@18.2.0+react@18.2.0 + classnames: 2.5.1 + rc-motion: 2.9.0_react-dom@18.2.0+react@18.2.0 + rc-resize-observer: 1.4.0_react-dom@18.2.0+react@18.2.0 + rc-util: 5.38.1_react-dom@18.2.0+react@18.2.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + /@react-dnd/asap/5.0.2: resolution: {integrity: sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==} dev: false @@ -704,19 +751,23 @@ packages: resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} dev: false + /@types/js-cookie/2.2.7: + resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} + dev: false + /@types/json-schema/7.0.12: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} dev: true - /@types/minimist/1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + /@types/minimist/1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: false /@types/node/20.2.5: resolution: {integrity: sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==} - /@types/normalize-package-data/2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + /@types/normalize-package-data/2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: false /@types/prop-types/15.7.5: @@ -742,6 +793,10 @@ packages: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true + /@types/stylis/4.2.0: + resolution: {integrity: sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==} + dev: false + /@typescript-eslint/eslint-plugin/5.59.8_3b4f51ca606e75917ec30cda7acb4efd: resolution: {integrity: sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -887,8 +942,12 @@ packages: - supports-color dev: true - /@vscode/codicons/0.0.26: - resolution: {integrity: sha512-GrYFJPbZ+hRM3NUVdAIpDepWkYCizVb13a6pJDAhckElDvaf4UCmNpuBS4MSydXNK63Ccts0XpvJ6JOW+/aU1g==} + /@vscode/codicons/0.0.33: + resolution: {integrity: sha512-VdgpnD75swH9hpXjd34VBgQ2w2quK63WljodlUcOoJDPKiV+rPjHrcUc2sjLCNKxhl6oKqmsZgwOWcDAY2GKKQ==} + dev: false + + /@xobotyi/scrollbar-width/1.9.5: + resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} dev: false /JSONStream/1.3.5: @@ -1023,6 +1082,10 @@ packages: engines: {node: '>=6'} dev: false + /camelize/1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + dev: false + /caniuse-lite/1.0.30001492: resolution: {integrity: sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==} dev: true @@ -1043,8 +1106,8 @@ packages: supports-color: 7.2.0 dev: true - /classnames/2.3.2: - resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + /classnames/2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} dev: false /cliui/7.0.4: @@ -1055,15 +1118,6 @@ packages: wrap-ansi: 7.0.0 dev: false - /clsx/1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} - dev: false - - /cnbuilder/3.1.0: - resolution: {integrity: sha512-9sxWwwprkPNTVQnx92WYPEWCmyZRqbf9VWUYABU4rl0mLL17VAV2MvvOApkMA6bQVXRLJ8jN//8Yp6drElpLWA==} - dev: false - /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1204,7 +1258,7 @@ packages: dependencies: conventional-commits-filter: 2.0.7 dateformat: 3.0.3 - handlebars: 4.7.7 + handlebars: 4.7.8 json-stringify-safe: 5.0.1 lodash: 4.17.21 meow: 8.1.2 @@ -1270,6 +1324,12 @@ packages: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true + /copy-to-clipboard/3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + dev: false + /core-util-is/1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: false @@ -1283,6 +1343,33 @@ packages: which: 2.0.2 dev: true + /css-color-keywords/1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + dev: false + + /css-in-js-utils/3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + dependencies: + hyphenate-style-name: 1.0.4 + dev: false + + /css-to-react-native/3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + dev: false + + /css-tree/1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: false + /csstype/3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} @@ -1295,8 +1382,8 @@ packages: resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} dev: false - /dayjs/1.11.8: - resolution: {integrity: sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==} + /dayjs/1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} dev: false /debug/4.3.4: @@ -1360,10 +1447,6 @@ packages: esutils: 2.0.3 dev: true - /dom-align/1.12.4: - resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} - dev: false - /dot-prop/5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -1393,6 +1476,12 @@ packages: is-arrayish: 0.2.1 dev: false + /error-stack-parser/2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + dependencies: + stackframe: 1.3.4 + dev: false + /es-module-lexer/1.2.1: resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} dev: false @@ -1592,6 +1681,18 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-loops/1.1.3: + resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} + dev: false + + /fast-shallow-equal/1.0.0: + resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} + dev: false + + /fastest-stable-stringify/2.0.2: + resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} + dev: false + /fastq/1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: @@ -1670,8 +1771,8 @@ packages: dev: true optional: true - /function-bind/1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind/1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: false /gensync/1.0.0-beta.2: @@ -1790,8 +1891,8 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true - /handlebars/4.7.7: - resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + /handlebars/4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} hasBin: true dependencies: @@ -1817,11 +1918,11 @@ packages: engines: {node: '>=8'} dev: true - /has/1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + /hasown/2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 dev: false /hoist-non-react-statics/3.3.2: @@ -1841,6 +1942,14 @@ packages: lru-cache: 6.0.0 dev: false + /hyphenate-style-name/1.0.4: + resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} + dev: false + + /idb-keyval/6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + dev: false + /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: false @@ -1850,8 +1959,8 @@ packages: engines: {node: '>= 4'} dev: true - /immutability-helper/3.1.1: - resolution: {integrity: sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ==} + /immer/10.0.3: + resolution: {integrity: sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==} dev: false /import-fresh/3.3.0: @@ -1886,14 +1995,21 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: false + /inline-style-prefixer/7.0.0: + resolution: {integrity: sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ==} + dependencies: + css-in-js-utils: 3.1.0 + fast-loops: 1.1.3 + dev: false + /is-arrayish/0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: false - /is-core-module/2.12.1: - resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + /is-core-module/2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - has: 1.0.3 + hasown: 2.0.0 dev: false /is-extglob/2.1.1: @@ -1945,6 +2061,10 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true + /js-cookie/2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + dev: false + /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2048,6 +2168,10 @@ packages: dependencies: p-locate: 5.0.0 + /lodash-es/4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + /lodash.ismatch/4.4.0: resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} dev: false @@ -2102,11 +2226,15 @@ packages: engines: {node: '>=8'} dev: false + /mdn-data/2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: false + /meow/8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} dependencies: - '@types/minimist': 1.2.2 + '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 decamelize-keys: 1.1.1 hard-rejection: 2.1.0 @@ -2166,11 +2294,28 @@ packages: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true + /nano-css/5.6.1_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-T2Mhc//CepkTa3X4pUhKgbEheJHYAxD0VptuqFhDbGMUWVV2m+lkNiW/Ieuj35wrfC8Zm0l7HvssQh7zcEttSw==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + css-tree: 1.1.3 + csstype: 3.1.2 + fastest-stable-stringify: 2.0.2 + inline-style-prefixer: 7.0.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + rtl-css-js: 1.16.1 + stacktrace-js: 2.0.2 + stylis: 4.3.1 + dev: false + /nanoid/3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: true /natural-compare-lite/1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -2192,8 +2337,8 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.2 - semver: 5.7.1 + resolve: 1.22.8 + semver: 5.7.2 validate-npm-package-license: 3.0.4 dev: false @@ -2202,14 +2347,13 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.12.1 + is-core-module: 2.13.1 semver: 7.5.1 validate-npm-package-license: 3.0.4 dev: false - /object-assign/4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + /normalize.css/8.0.1: + resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==} dev: false /once/1.4.0: @@ -2349,7 +2493,6 @@ packages: /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true /picomatch/2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -2365,6 +2508,10 @@ packages: engines: {node: '>=4'} dev: false + /postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: false + /postcss/8.4.24: resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} engines: {node: ^10 || ^12 || >=14} @@ -2374,6 +2521,15 @@ packages: source-map-js: 1.0.2 dev: true + /postcss/8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -2383,14 +2539,6 @@ packages: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false - /prop-types/15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - dev: false - /punycode/2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -2409,116 +2557,87 @@ packages: engines: {node: '>=8'} dev: false - /rc-align/4.0.15_react-dom@18.2.0+react@18.2.0: - resolution: {integrity: sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.22.5 - classnames: 2.3.2 - dom-align: 1.12.4 - rc-util: 5.33.0_react-dom@18.2.0+react@18.2.0 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - resize-observer-polyfill: 1.5.1 - dev: false - - /rc-dialog/8.9.0_react-dom@18.2.0+react@18.2.0: - resolution: {integrity: sha512-Cp0tbJnrvPchJfnwIvOMWmJ4yjX3HWFatO6oBFD1jx8QkgsQCR0p8nUWAKdd3seLJhEC39/v56kZaEjwp9muoQ==} + /rc-dropdown/4.1.0_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==} peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + react: '>=16.11.0' + react-dom: '>=16.11.0' dependencies: - '@babel/runtime': 7.22.5 - classnames: 2.3.2 - rc-motion: 2.7.3_react-dom@18.2.0+react@18.2.0 - rc-util: 5.33.0_react-dom@18.2.0+react@18.2.0 + '@babel/runtime': 7.23.7 + '@rc-component/trigger': 1.18.2_react-dom@18.2.0+react@18.2.0 + classnames: 2.5.1 + rc-util: 5.38.1_react-dom@18.2.0+react@18.2.0 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 dev: false - /rc-motion/2.7.3_react-dom@18.2.0+react@18.2.0: - resolution: {integrity: sha512-2xUvo8yGHdOHeQbdI8BtBsCIrWKchEmFEIskf0nmHtJsou+meLd/JE+vnvSX2JxcBrJtXY2LuBpxAOxrbY/wMQ==} + /rc-menu/9.12.4_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-t2NcvPLV1mFJzw4F21ojOoRVofK2rWhpKPx69q2raUsiHPDP6DDevsBILEYdsIegqBeSXoWs2bf6CueBKg3BFg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.22.5 - classnames: 2.3.2 - rc-util: 5.33.0_react-dom@18.2.0+react@18.2.0 + '@babel/runtime': 7.23.7 + '@rc-component/trigger': 1.18.2_react-dom@18.2.0+react@18.2.0 + classnames: 2.5.1 + rc-motion: 2.9.0_react-dom@18.2.0+react@18.2.0 + rc-overflow: 1.3.2_react-dom@18.2.0+react@18.2.0 + rc-util: 5.38.1_react-dom@18.2.0+react@18.2.0 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 dev: false - /rc-resize-observer/1.3.1_react-dom@18.2.0+react@18.2.0: - resolution: {integrity: sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==} + /rc-motion/2.9.0_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.22.5 - classnames: 2.3.2 - rc-util: 5.33.0_react-dom@18.2.0+react@18.2.0 + '@babel/runtime': 7.23.7 + classnames: 2.5.1 + rc-util: 5.38.1_react-dom@18.2.0+react@18.2.0 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 - resize-observer-polyfill: 1.5.1 dev: false - /rc-textarea/0.3.7_react-dom@18.2.0+react@18.2.0: - resolution: {integrity: sha512-yCdZ6binKmAQB13hc/oehh0E/QRwoPP1pjF21aHBxlgXO3RzPF6dUu4LG2R4FZ1zx/fQd2L1faktulrXOM/2rw==} + /rc-overflow/1.3.2_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.22.5 - classnames: 2.3.2 - rc-resize-observer: 1.3.1_react-dom@18.2.0+react@18.2.0 - rc-util: 5.33.0_react-dom@18.2.0+react@18.2.0 + '@babel/runtime': 7.23.7 + classnames: 2.5.1 + rc-resize-observer: 1.4.0_react-dom@18.2.0+react@18.2.0 + rc-util: 5.38.1_react-dom@18.2.0+react@18.2.0 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 - shallowequal: 1.1.0 dev: false - /rc-tooltip/5.3.1_react-dom@18.2.0+react@18.2.0: - resolution: {integrity: sha512-e6H0dMD38EPaSPD2XC8dRfct27VvT2TkPdoBSuNl3RRZ5tspiY/c5xYEmGC0IrABvMBgque4Mr2SMZuliCvoiQ==} + /rc-resize-observer/1.4.0_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.22.5 - classnames: 2.3.2 - rc-trigger: 5.3.4_react-dom@18.2.0+react@18.2.0 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - dev: false - - /rc-trigger/5.3.4_react-dom@18.2.0+react@18.2.0: - resolution: {integrity: sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.22.5 - classnames: 2.3.2 - rc-align: 4.0.15_react-dom@18.2.0+react@18.2.0 - rc-motion: 2.7.3_react-dom@18.2.0+react@18.2.0 - rc-util: 5.33.0_react-dom@18.2.0+react@18.2.0 + '@babel/runtime': 7.23.7 + classnames: 2.5.1 + rc-util: 5.38.1_react-dom@18.2.0+react@18.2.0 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 + resize-observer-polyfill: 1.5.1 dev: false - /rc-util/5.33.0_react-dom@18.2.0+react@18.2.0: - resolution: {integrity: sha512-mq2NkEAnHklq4fgU/JqjiE0PS8+8u33gEWw2bDUNDPck3OroPpSgw/8oEyuFrvPgaZEmt9BgQdh59JfQt2cU+w==} + /rc-util/5.38.1_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-e4ZMs7q9XqwTuhIK7zBIVFltUtMSjphuPPQXHoHlzRzNdOwUxDejo0Zls5HYaJfRKNURcsS/ceKVULlhjBrxng==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.22.5 + '@babel/runtime': 7.23.7 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 - react-is: 16.13.1 + react-is: 18.2.0 dev: false /react-dnd-html5-backend/16.0.1: @@ -2562,38 +2681,51 @@ packages: scheduler: 0.23.0 dev: false - /react-draggable/4.4.5_react-dom@18.2.0+react@18.2.0: - resolution: {integrity: sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==} - peerDependencies: - react: '>= 16.3.0' - react-dom: '>= 16.3.0' - dependencies: - clsx: 1.2.1 - prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - dev: false - /react-is/16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false + /react-is/18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: false + /react-refresh/0.14.0: resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} engines: {node: '>=0.10.0'} dev: true - /react-scrollbars-custom/4.1.1_react-dom@18.2.0+react@18.2.0: - resolution: {integrity: sha512-FOI1EMrdN5qziwvFAuH4saOo0+ggxeTuKLPpy6nezNdLUnDW1vCHGq0VSSfTSRstDgfXgwff5TMP9NeJ8NiFOQ==} + /react-universal-interface/0.6.2_react@18.2.0+tslib@2.6.2: + resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} peerDependencies: - react: '>=16.0.0' + react: '*' + tslib: '*' dependencies: - cnbuilder: 3.1.0 react: 18.2.0 - react-draggable: 4.4.5_react-dom@18.2.0+react@18.2.0 - zoom-level: 2.5.0 - transitivePeerDependencies: - - react-dom + tslib: 2.6.2 + dev: false + + /react-use/17.4.2_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-1jPtmWLD8OJJNYCdYLJEH/HM+bPDfJuyGwCYeJFgPmWY8ttwpgZnW5QnzgM55CYUByUiTjHxsGOnEpLl6yQaoQ==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@types/js-cookie': 2.2.7 + '@xobotyi/scrollbar-width': 1.9.5 + copy-to-clipboard: 3.3.3 + fast-deep-equal: 3.1.3 + fast-shallow-equal: 1.0.0 + js-cookie: 2.2.1 + nano-css: 5.6.1_react-dom@18.2.0+react@18.2.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-universal-interface: 0.6.2_react@18.2.0+tslib@2.6.2 + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + set-harmonic-interval: 1.0.1 + throttle-debounce: 3.0.1 + ts-easing: 0.2.0 + tslib: 2.6.2 dev: false /react/18.2.0: @@ -2633,7 +2765,7 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} dependencies: - '@types/normalize-package-data': 2.4.1 + '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 @@ -2671,15 +2803,15 @@ packages: /redux/4.2.1: resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} dependencies: - '@babel/runtime': 7.22.5 + '@babel/runtime': 7.23.7 dev: false /reflect-metadata/0.1.13: resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} dev: false - /regenerator-runtime/0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + /regenerator-runtime/0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} dev: false /require-directory/2.1.1: @@ -2696,11 +2828,11 @@ packages: engines: {node: '>=4'} dev: true - /resolve/1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + /resolve/1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.12.1 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: false @@ -2753,6 +2885,12 @@ packages: fsevents: 2.3.2 dev: true + /rtl-css-js/1.16.1: + resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + dependencies: + '@babel/runtime': 7.23.7 + dev: false + /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -2772,8 +2910,13 @@ packages: loose-envify: 1.4.0 dev: false - /semver/5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + /screenfull/5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + dev: false + + /semver/5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true dev: false @@ -2788,6 +2931,11 @@ packages: dependencies: lru-cache: 6.0.0 + /set-harmonic-interval/1.0.1: + resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} + engines: {node: '>=6.9'} + dev: false + /shallowequal/1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} dev: false @@ -2812,7 +2960,11 @@ packages: /source-map-js/1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - dev: true + + /source-map/0.5.6: + resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} + engines: {node: '>=0.10.0'} + dev: false /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} @@ -2828,7 +2980,7 @@ packages: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 + spdx-license-ids: 3.0.16 dev: false /spdx-exceptions/2.3.0: @@ -2839,11 +2991,11 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 + spdx-license-ids: 3.0.16 dev: false - /spdx-license-ids/3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + /spdx-license-ids/3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} dev: false /split/1.0.1: @@ -2858,6 +3010,31 @@ packages: readable-stream: 3.6.2 dev: false + /stack-generator/2.0.10: + resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + dependencies: + stackframe: 1.3.4 + dev: false + + /stackframe/1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + dev: false + + /stacktrace-gps/3.1.2: + resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} + dependencies: + source-map: 0.5.6 + stackframe: 1.3.4 + dev: false + + /stacktrace-js/2.0.2: + resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + dependencies: + error-stack-parser: 2.1.4 + stack-generator: 2.0.10 + stacktrace-gps: 3.1.2 + dev: false + /standard-version/9.5.0: resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} engines: {node: '>=10'} @@ -2928,6 +3105,30 @@ packages: engines: {node: '>=8'} dev: true + /styled-components/6.1.6_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-DgTLULSC29xpabJ24bbn1+hulU6vvGFQf4RPwBOJrm8WJFnN42yXpo5voBt3jDSJBa5tBd1L6PqswJjQ0wRKdg==} + engines: {node: '>= 16'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + dependencies: + '@emotion/is-prop-valid': 1.2.1 + '@emotion/unitless': 0.8.0 + '@types/stylis': 4.2.0 + css-to-react-native: 3.2.0 + csstype: 3.1.2 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + shallowequal: 1.1.0 + stylis: 4.3.1 + tslib: 2.5.0 + dev: false + + /stylis/4.3.1: + resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + dev: false + /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -2946,6 +3147,11 @@ packages: engines: {node: '>= 0.4'} dev: false + /tapable/2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: false + /text-extensions/1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} @@ -2955,6 +3161,11 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true + /throttle-debounce/3.0.1: + resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} + engines: {node: '>=10'} + dev: false + /through/2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: false @@ -2983,14 +3194,30 @@ packages: dependencies: is-number: 7.0.0 + /toggle-selection/1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + dev: false + /trim-newlines/3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} dev: false + /ts-easing/0.2.0: + resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} + dev: false + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + /tslib/2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: false + + /tslib/2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + /tsutils/3.21.0_typescript@5.0.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -3001,8 +3228,8 @@ packages: typescript: 5.0.4 dev: true - /tsyringe/4.5.0: - resolution: {integrity: sha512-XvYgdUxkmGQfpCkKyr/ybJx71OLSnNec1SO0xdohMjaS2UOEyKi76YfKx92XUXgc1TocypHENg6y4wCyYyMKag==} + /tsyringe/4.8.0: + resolution: {integrity: sha512-YB1FG+axdxADa3ncEtRnQCFq/M0lALGLxSZeVNbTU8NqhOVc51nnv2CISTcvc1kyv6EGPtXVr0v6lWeDxiijOA==} engines: {node: '>= 6.0.0'} dependencies: tslib: 1.14.1 @@ -3070,6 +3297,14 @@ packages: punycode: 2.3.0 dev: true + /use-sync-external-store/1.2.0_react@18.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false @@ -3198,7 +3433,3 @@ packages: /yocto-queue/0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - - /zoom-level/2.5.0: - resolution: {integrity: sha512-7UlRWU4Q3uCMCeDVMOm7eBrIu145OqsIJ3p6zq58l8UsSYwKWxc6zEapC5YA9tIeh0oheb4cT9Kk2Wq353loFg==} - dev: false diff --git a/website/public/MapleMono.ttf b/website/public/MapleMono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..859e69e7f2494080d34993726396c9967e2d167f GIT binary patch literal 34168 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 MCDzvd1&>pGfjo2<1ONa4 literal 0 HcmV?d00001 diff --git a/website/public/molecule-logo.png b/website/public/molecule-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..784233dec6bc135530cb5f23c67867a9006e43f9 GIT binary patch literal 84734 zcmd3OZVsurXg_A|WAROMm&SgoK2``t*8^hWI4;LeUQKhU}yy z^$DqTl>7j3^Vw8G+DuLki5_wN90@t-JJPeKM-Z>qh!+wPAPX4@fOtoK`Ya3OzrRIc z%>w-2>!%0f7;=9iA&DYMe-=}5M?P)=m0QoL($p%n<#}bYUgG*-Nd`+(4e?f>7iRUY zSFlxD=YKu!CX9)HzJtH@4NnqH_T8s^lr0o8B~#e9fR27qgWnas64`~M{vi}`vLC`_ zLfc>cVdXZJ={I?Y@siAXXx{U#^$u(TT+>`Tb#cvXy&Loa+O5r5%^g+E=^bfXok7!G zZWr#H+fJ1#KL7?q*`u-k|9Vqr2dpFrHl%4IW=0MGP#(GsnlrDeFzb4{91LB_%;{R) z)EqZ3L?yM>sXy2sj5Zf}KP)^BzG#FRlc>7JAXcN!3uy3b=v1(mXCc)f1AwMQnvTy} zDy~oODr$_kc%UQa9PruT28I2^nwxX@k61)YbsU_~QxUj@4{E z+oujP0#iuvXjpM&P$-hLG03vuVY6P!uA&aAKXs~IXvp!t868X7bM@kq#Qe_)F@DSK z8a=t`ftZ4?Z+O* z5BaLWUVeiG=~(4i#Mxfy?Q)UPIWGwP-XNw3ut{oY2)X>&nR9Eho3PWnf*V=A@C7Z_ z&tx45%@N>)#P|IxS}d|Tl7imo8L(ZeYZsO5WeWvoGi|kO!Yy0A;^xcO58@*IQHy&< zddUh#qF)kC-jecS0;+O+3E~i1(;h|=zWPxYQSE_D=yKJGhO(XDRb0U6xtz67k-S!uLQ`Pz( zBeQ>oc3n4tpM@cfm~n}*uN}pSh_yg;UIaI-x4?6Os1WMUmNv5QzIQE2_y?x`nq7mr zDJ?W)FUP}s_$Lz`5vIV%5v^d5$R{m_xDH1484I)1E1w(p@lSneCp!C*$VN+rA#&04 zDA)!y47NYis!b#F&$5G9@zkQlqrb}|&sw@Lup}?2{|CBV%o&?IJl&#$#D?0f?DfeqHU+bn|?OiKYfteaCnG z`NH9M#-Tx~$69EN%fC5dBh2;t^8qu&4KE-a%4*CwZ@*3#VmV*EH$L@pJ}Zo5U4?!W zsh!Di!@_j+TFBxm`ALwd>02JwgwR(A6EGO|g%)yR^1N4bs_OI~(0laBsXfT@H{M*5 zyd(oA6T2H)30;?b)1-ZJ_;J=~vgE*MYZ`=ga*QV#zRVVq_#jC}ynm=n80Ytw2}QPm z#8Zk#rX}Q;kYhSEx?7>#NuKD-lZZG*$|Cy#QLaND|r)}T_=sukH(l3(OfDeqtRO-QqU_%g-Y5I_T>wHd3EOzOhdS^OMI4C2@ySD60Ke~hoRZsz z2$7Rr|6ipMpo-S2C*`x-BOz46=bOe!{p18mnJs0*W(w0n!K?h6yE&)d0wd&Xe!V3h z=%VR~@cbbTbSXdc#$eAJ)X3B~1)Bd;(f@MX+FyRe&X2VZ?&z7(22uF8q~6xQZzlu) z8p@FoZ)k3XgfW=pk=>m2uZdam4nG+RBO6}E67z!6Q@mRmZ3jZDWEMd4Z{h@PF8l~- zQ6HnqaY?y97)o!%5!aw*yj7vuG|yx(ceVY<<3gD!noCdm6gmb)h5ZUt{yb#>87zbM z6A1!`yApQj_!a`VHp26_Bbd&X;u0>){q>p^2ETFH+_ran9tNJiien;LH0YPbiBMiU z5y$zrHtjbnaNv?@b1>sH_SfZ>dO@X#*Sm*95!3VS({)i|Ma8;M36kD#r?NY zL<@jrA2eBc7TxHt$sC~U;^k4z<*%9cE6lsYNNNp-qnACKvK z3R-DT;b&Cw9l}(Q?5NWZ^i&&t=DUOOTd;pde2K4dnn3%zC`(0QB)YcHyKj9r=za9% zkJ*zCOBo_uM#_+m?P<>k>&{@BbbERh3Nmj#P%H=E#}TS+(8+8wY?fExho=&IEm_n) zb~SA4A5wS;@t$FE@aUQ~*z3 z*gVt2gG1yh7QWTrKkyVC6cUi3OxG$W7c_kk7H3?te7@CuaY%+5g{i{Xeb#Kbn~}BVeUBk`X--i#)*( z_eNlcgV>H9`d2-vRPafiBZMsReKH4>EWihQKIK)_j0!J(53xFt?n7mtjsOAV;OTo-b@)J4C)MY+ysfa)2sx=US zwuf8~-k)MDjW_2UAGa2G%iLW6fRo8s*6e_@TF4q=xX`^ero9$w&%Ggj6OK*F8-K{> zlq9!!r$l(!AY^TOD%DsZ4SDRk%P-^$8h4;y5P0P>1e#eHaDO{_qp($9Ehg4AcM_8k z#>?fiFKmAFK(SNg>eDJ%w-lBbALkcgwl0(iCuW2{!d!=LsNh?^4Gw-v4`d#$pOVFtQ>o)0178K*+qLgu7h#e|RrB9@SRAm4(Oh(g5lH5A zbmW1PCN}P}mmPt2h?(GfSHv^eq1{7tQl>|PZ{O|+A|u8$ z8cv`Hi4nmsIf2&&*qdbxUbE=n!B{M70zj9!-s<-Ot5i1|VQ=5XZVL{j%;NfV%KaXf z4Pxo*y&41b`CX#N<{goz=MlpraNSq=X*Jv{yL&$gudy}E*^Sz6xeybB4>`RrS}*fP z$SSv-xIi{QQ)x8r5Wg3DCx9bZ3bAcBlVM65$)BC_jOr{>o{!c|rH5qR*HSQ%?@v$4 zV*s>96$b2`lC}GgR{0m#K=W$5J8&Ch_Uh>OanzK5f=Zaqi(t2HaiyybRBK-?r3Y_A zSbggvnKfW{iSWgrtm+BXB&yMV6Ex_#^b8$}+6BDa$LnAtxWK{T3fX1Jhx1s|Dbjvg z)>NOsTA(*1gP3tu{+VS zxcV{joIsT?Y(p{9Gp>lae=<9_xPfXfrwv+nOv?f9k)KT+L1O2TVJ}a?S|^hfX@O&C z+b6aC!8tlDB$(Y+#XD5*EoW(Z3{5W^wmTMzZs9CVMc#%>-4Q*E<T zZK%xAa-EVvLnZ=@Tn!m|!H^fXz#nmArEz{;PoRH;oO<&QNxjPX5_9Xt_}lXJH%ir{ z8}hy7t-H8#jQhD=MiK9<$%xvD;;Bh_rO`acKsKy_-8J}BK?!Y%?XgnE*ccJmGAr{) z&$Q2z$e~tiiYbol<(gP&E5#ez7O{TqNIuEM2@|SHc{J__1n#h2BptZ;jP|As zySNMTVw%fk!*+2z$YrTSoEl^($<|Dzs}A$rPK_{GuP04Tpn^9ni0;)tkI%xBGn3aY z8Ns$PRLr@jL901_{u20hPQ(6y9WJJu7-5D;7GyxrT5o$@IPaVlW9`Snnm4$M8@!XG z-!z!!uibW@7rhn3$XtD@GSWT(T5Jpgb*dFLeAts>^4vX`a|+4G;}nB)45KG#dR;En z2kT(L=?^0IDSiKIXy60uoYr_&jXFE=_dRs>WA_RR(^@omVf^Avw<;^q(fW~a&;N{1 zaoILvI;O3%7$07WdN6|P`7niD@uQ7f;?gaS&u}&cZa_68$$`iX5yC>+!u1^Ht2NaQ z_|(c|apkjC=`=b=uDV&-Tz?m}wh76=DL3i=Y?prwUO!>5`d%!iO%InW((q3sTD6B^ zWZ#SS9THlwRjcj*gqT>YGhDy#D2im3C&vmvz9!4?ei|L&HlagpPj-+^p*%mjI$UjlSdrD!6 z@T-+ai$QVr@(x6WX6COjI*WUPy5e&Hc8f+AqQ0ncUC-4_es5-v`3k%_CZTJ2S9XU= zygN(#KPu_(Xw`se>#^6xlx?8+29HQRa#9=B$GL&lO{Z#pkG$AQ2JY`s>?96@%2Q3N zo?P23Gn0H}^fdKYfJL~^g~-|wkL%mYf5d@^XBb#% z;xOVN&^GO*DzPt`xy|CT3d=LAIjhcR2GNgQXr|>8r!dvp)~~y5^CO=BS3;dLWgXXJ zWTUN9c6t`-Q6uIK##-eTRH~8_gY5`h^b3s=>SI^2_B;4g0W>i^!iA6XurMwqM)68*J>C8YDP-F zJB<>~2z+7#^868lr$t^>ujF{!)~S~YyH&-U?*~6;YW-#uQ7Z7NKl`)JH{2s$iW3k8 zRqc)6(|1z4+Zlx50z-;6vh}2fMvq^FqK;^KrrGm7 z)InJKK{S=v_yb48NY375AE#yAb&=EnFZGi@@O&n!(tz!0OBs9^qB9a*0EPypiLY3q z!SX?_9**$zT7ou>I1v0tAL9uU7ipQ$$JR5sk&j<8SS>nfjjq0tKpU7kh+pH~v%Yjon zQpaIgfpcN5#izRf&Zz&^IqjwfNOuKIC&D#$cX>u-ICl(93O73`G)vHe)uQ2IuUBX4 zu9?4tbeI=}EX~SR_14-b?g|*(09R68EFY5^leAIhiF?B%Lh%K?w^D>+|18lc(UInd#*d*J|mP`mDHu29R>hLiTp z5E9v~oRz%LmAtPFb12K&uvCUCVTsqhFGYGvL{2l6Z*T2tsw~SKp==}D_%hK=2$;XJ zL+J+ckOi9Y{LhN=V*HwpgQ{fi)Q z5Ua7L=CF@i$%FZfoht9p5-Di2ZWKg>9VD(2VDh_Z%Bi5f z30>cM{vuEj-zy!@HC9Qr`R;G57aD*ha}k)IL(5r;Ib*ytoRY~XVh=u5PCh-LyE}uv z7tnTF^wszDL>q}|U1L9T*`aO%`3&}^cga0bZEs24>9LwuPL+ufDp~?sT6T44w32@3 zAzv(i?w>BToHgz6tWR3NH!`J~2WF9Y33GJ4ZM=l$?Fn;Xr5dlTcTwJ{F9bP(MkU>w z(nqSu1SbK3v$~vH6t{+JJo7<77IGw6Wd!Sh@WS@*#s~uzS$gDq6x{6w9zIXSu;z4@ zvgM%w7r)@emru5MX)e`+bS6%wb0W-D^{BD{6o2R#X;TPcmh-wg6gh4y)melyEe*8V zU!mQhhUXs%e``$F9uzr%9lki1PeQEaiI|czUO#coY_x~fS@WEC4&*VrR2c&Hb~|lb z;uOrid8oY8%$MW$M_YbcL0U+=!c893b#Ce&RT};-yWZ$WoRiHa+swQ7c6k__?K(QZ z6-tvwUYG?%%zMKXUhF1P{}W-d?#yvcR-33lkC-J!DzWu5l^?~};>*pV#5d6wDu0<; z>$3R4qWI8>#HQ=2GAL{YZbiC)$Dl5v8>w2sdJgN z@4sYAUYs8&gll>BQg}J99{oH5iQZbRT5+9GD&k-yl$-ZWplxgtHxCg@ph@OSXGzdN zaSliC5zDgI<3k&ho9!vEko2MZPn32*nKG>H)@R}iWMk_T{26>Ss68aI0G)t%{CH_7 zBJgkf*9$m&AE)6)cLg3ItqL2vW7vThu{ER{%z&>9GPPnt{I$vVn#7CbCsbDM%QJud z*=@77)lZNaL}s3|G#ssJ!5(&3@>rWk=peR9(58rUZEo{#eXOyiO?iUGd$W+yWaD-I zrvIEYgcGACD7e<;|zS`@Ac$+uP2xF3?zs8KA6qE7{_FiK<@lg;E8 zXedLGc=ylf^gT{z<-nuKBOWg>1Qy4vH+E46*y^yCSno#oC`r_xP9mNJpaSX@fVB(F z`?*mg08{JF#a~3I6&7+KeqkEjmSM*(R|H_tSJ)d3J4L3)RVCQ$E)EX&AM0V!z`BUq z&+=oE9Vd(7__WyAI1MOz)=VTCfe<6>KDICgoYl|_~T-*e$K_u0)q5`(htEKIE z)Y|cQHdxZYD(E##zB4ZGw=VFMsW+*%2v6Dv^tb%vNd#RQot#dUQ!D&7&|T}cIas~~ z)_yGD-+C)Dzf>7_@^9wy8Gib8xK&0GW)r_{BHX)@Ub`g7`3__Ioju$3*LctPN^QF+ zaB-1Q0v=2p>GOv6aGS;JIz4uyNd2Z_3~Jqv?p0G(C@$cN3{OvnFYV8Jt%l7d z%pCg-PUu}Tnbl9cogQXSjpgE>4hTe_SWj92B$nSB0SUAn_IYjje|Ubdl#B8qG~hw9 zai%#z3x_GEhFFw2_~V_RKXg$Wi9Zijt{pv97J%|3QPzWvnIQFxw0A@Vt*)eNq7i%_3+U(HKxBrHvo;#;%=K>BM|X_HZIT)zBFs#-NlT_O|H|{k~?{}JD!sj z_%-$AzDi*m-OoPdG>zYFCJQ@JwbtI4+cp~-WJn~0kjIoOqp6^V>IHLBvcw#*sJ zz(PZX_qt9a`U%V+%PNt-BE#;Vee8cPb!+bMhwR{50hM8)H}sQAPsHy)`!AAvmq*nD zgwOi;+yg_8>X>e2$daLvNnU@RaW4PxUYS$nBYFJ{%VBC zwz-cqkAlOQWj{(}K%W#0j`Mo!zF+Lq)DDri)vLBu z5Mt`^Jp|kQD0j(H+>>12nF9B@M&O@cM!-6yX@^x97gUVDOehE|)^XC_AqT<`0oXz( zU6c=oJq&nUv%2y=z!<)9Z=4R9lg|8#7ykLyRb{bbXq8O;jMkiqed&J?!I8l_Px-DZ z3x$x_+~P3I+HdwX#p4{91w_@u5|M z2Hth zL@!f>i&etx@ZXNshhwehp$I#{@WV(>l?`JetvDLf!E0a84HK=20F4Fj7~QaDgX=9h z`tmbF->-=A_6T6*XdF9N2e=n|&omrGUFD%g-eC-zGdIuflE?mLcQD1saXM5MR|p}##XBBFRJzP_1JzKOgBk4xMoQ2 z^{th6WjOjBtskzOzHWz1<)m3HfTEXS_t?R3?$wiOAw-L*nk!6BIyLCE zz~Fi_8Eq_$6bjti^J?eyae?x@vmI2y&Z=I_9o1hk^YdModZ5||aX}{Qe@NZk;K!Gv zS8j<>r@&6f>z3P-iLxqGh-qTEzMc4^(j)%?OU>EDz2~7plSy*aDd;zZ?8?s$!NSIo z%!@>o-IxF9nF~$aYDB|5EW9(bnY$6VuWP*waXAhGvrMk77!!vL)T;p{$ETq(xAkmc zPM`Ec3E6Z(jCTcF3+>lX5klO&+S!oFfnQ$<1mC?Xt?3Fxfm>DuZgvo{Sww}VMbffK z>YBeN4aREDTVragy34J!Q&4?;6SbTv4A}`GuTj_OPd?5yw$-j2+f(2fx7mTfx^~tC zA982a5-&bTXO;lTDKfjqgG{zCQP zCihwEV8HHMa#kBgejZr+dVm4j>OO3SVhAm;tNq)o+I%saC`{4?OiEcrd2cwFJ+MVk_`7DXl7LY_SmSJF$EW7t02}jL>?4?m-;Ic0iVM&8jJ(2G z=?MQo=0lfHe%}@J!s3JujgPr!^WUQv!e#Q}r+C-m6(|7+l}6l7?*O(&!gBFn&O5tI z5uAMWX(K6rNV#L7-x~vEL2g%ho~O95+aF^&*XGg-H6&X-%b3fk9P&8f6#|M*>7ot& zY%^*&GWlB(ZiM_D?V%{Jv1fpin{fYk>rE7QzcSl*a?=P`6klHCRfMG&{PSZWr>(;q~6H%L7wHzsfGO ziD|8@h;MA+tr+x^A?#Oiqi{L~|NK1xp@rLAg3Q(3_MTC<^laZ~`(KZG1**Ij)+9L` z`V(F4z3>IuXc<{{Y?Az1F7bGgLtQ?6o_^U!v)gcK0C7FcuLyJ+0BT8Uj0J0GLkW?eWx;bQOG7F0}F7BjBkoIw6q7RekA=1TYeCS$ut zCr;*uu?PGtWbC;f0AD;)K5D@bu7?Y1H)rfjtsGVE#ifA~HO?&#VDxov8FqUtES-5co!3`(?_JcnXJyDA-p8)7yxuS0@BP)l z9KKX|_EQAxehE>a=nAh4Gco9BFI&aVEHBrZBIEPMyAYqVNgHy|0!Hul} zxblHV6F=%@v64#$pT$;BE`^R5XHIN(PuSWlF41Vk-W!z`+-t*I;ku-`s6&`js~YbVq0uaXpx7SIV{EV4&DJz;Av zasFA=x>=FxxhB7q61O|l)7Eu%7bSe_Q~VsDvys~Mb1a4Gc4T4}tR7XlWFAS_ES}^G z!E)8Qj^)6DJoix2cAn$JQ?4$|zU}L0pKU$gMNY0b534S;B+7HeYQPfSOo>IY0FH*N zFds{M5xqkJZgn*b6oJ={i?o(&ZOZ7iTnO<=$w-GMVjNJJ z()hxQhSzM-Rv6r<(YQ;e`ry2zwsnPg^iI$IvW)vGA-vqCc-2Rp4q*r6Si>^)3Lf%S zBdVcCW|VyZ?XWPuk!GUa*Om-{kQw28y+d>Z>{17v>|HMMY=>e+7E&NR(c>M)7h>q& zuvXu(S+7j3Gql|6Td$8~N}{ZKJ~);o8)7U?CJQQCKP5l|S=g@v62TbW+xXea}HD(=ea4Lg#j zMRw*{1HflPT4%~utL@HK6oT%lj4?9l-;n+iH^hyWzEZm}gt6rk83tk^8#&5E{A#5V zy^eBB_kFmg?Pl7G4>~dMZKJno$o-%ip`(hDI?rrf&6oHnb#Zzto2QFx)mUDCMT3=DzR zg*#yFaUU%tYuV{I6Lh=#^|cQi&+pWhml2L2iliV4%0 zj-Silc#+PG)+3hc%A?8k>c>n!KdA;KfD5QA`fK)wU@e;SWD$|1YfWDHBu0^zunjhZ zeprmVCxoP1%uiloj%KkDW`dCDsm(u&X<0j~U(b!RnAA}Gh$xU)uH12P&^Og$i08V3 zL!=4VCg+kT3P=NGCn)i%qYlSlg3*q~uN2bV5hO$NGPm;RE)nbaP1M{oGcX;S&1sJF z=Pv6(H^nXp*HY{oB;0RTt3U6Ptm!}{tcWH>D^r72T&wT8c0yw@zdb29kqnaia3--= zl)Wdp7C#gvid)ZBG_Wnwuf{8~q}04d!+EDW6FHYzDl>0E{3TtQ(yEUa*hR@WYGdD& zw)u;P^@svOfd7`6M(LSFA4a4E>+wZ%@mImk6}rt0!O%IQVr;@0+b{}C!=MlciX36i zH{r^a1PuaawrqinOTE4}2GMc1n>YU6cR%k`bajw&(It6ztgg|$&hth9AKx$|6&{Pq z{_6_tYZsl1fRmWWd$#pUE6n_jSyyU*;W|x!8RZiz#p@OfQ&bb2ZZ0iOY}>3Md0<)4 z&Ayl%dmS27Te?u_M5%UJCh24k;!*ug-;KpocYJqAG286-onY%S!Yla0?{89?(9aYm zcoFK|0J5bCbnbWy%7>hZc|Vt%*a%FHLR=(2(>yp1&tP5e zbft+9nb^`tmt~Z5(U!SR-p@M%rBAzQ+bKNFs_FFo}k>L3Gd;hlF2y zN^hm8wXvyTM)zwu z(-mEUkze;p0QG1EQ3B+>$4%13fv`{$1gBL-J;!-(S#c9CfaZE%>p=JpES?vjbF0CS zXu0?c>6%A3r?l%=S;`XcYJ6RsUu&}!n}bYuJ-*mGOAf%drt%($6wZ{b@Zgar)y5CU z$G6z?%(qP9h#9{oSqBzsS_m;E&Fb&AL?FA?KhHBPC~3sdz9<2a$+-4NV5e_N3T@A} zp$_^)w;2%#Ajf~L_-T%9`mu4e>1H)=7LjFLaD(V{-{5};{qlMG6RFF1n8H3S26{gx z#FVn<5-F5{9JtR%{#zmb2#K7`CRAG4;xiV6i+R0p!dFv6?h>ZYXMIZ&+Sd3$D{_7e6DpVqv31)aXX z(_*~Ep{ciW6??eZd%H4<;u&9^_`7_3Ps}u>rCQX#t58k3ZWQj#?WM!a(6&a+PzHb0 zAd(IUIU<HNv1Vn4C0_Ou$(cL~RBxKUpxV$sLN zLDZe!p>xeu6msv$mWJAk8l#eIeb9*ocNi~~*ooPz0TRPASq5b2eH}?KwITgebFjei z!BF4KFd|9|0Hic!j=)Dbik?y}&L_TpA@#GXwG6X>!Av=UEZ3A+==nKmDWuiyDiu1c+JzPmu7IplKrin-OF{HPEB_bR#y9k$OhW^N!x*k>bFFQ z8vUZMlbk1qb?}jh(xEdS?KU44O134P=XszlT!A3oFU)0~@WZMdy_XK_#*wcPwnNlB0htvvBicqZ3Q0O=2NsO1LwiBUu%MGb4= z4okSVrohL=?L5z)>a0ZzbIaYZ#@Kc6tWbfR^6;U#g&bpOSwAWe+TP* zPR7FSU+1#ny2yTwH}ZjgUMXX2K%oGsE{p?#$sFX=Q~V2sZ(2{_t2 zh`gI_=}359$on#1e*$2gqoKqr9LtpU2|1K~vg{n)tbkLaw+isciQa2N(IU5m3|mp2 zf5jYO1t4_)`FM7lX|C^iEhvyFzA|E0-gcPzU2q}FZ=tMb6xzpNev9fO)Eba{lNX@? z;Sp*c1LI%8zj(| z44$($*{g{&Lj7;ER}c*to6{vZoi{FZy821Si}XGbE>LV5k*U!Yu3EYpt6?8!I}Lp( zxKklvT|n@-tz%QXH0ij;xJ7N`gNHKSM&wDF44g|T9c-}m|ROBKqmUlxz?Ueeb` zcDEwP-mPUP$;PR9_p{X(*2--2T|cMOm+Lmrl43Z(El?fSfn%`UpPaGEShQl=lzLbi>N)5jHrshHY23tUWrnju(NjlNN z3S`S9*NDo5ENYH5{-Yt|`vo~)*$20ku|&!yu(^Sr`NYS$1t~h*`K>{pvus7$%>Y_! z6HQJn*$=Y)-vhfeXzUvC4styH2vn}x+|5vs0Oly%>b3>@86+_bk@LPhC&_Sns>e_ zYi4#F(A@MKnc&17c2;|ZHf1v}9@4t9+PSL}K|L$Q6Vv9ql`U6!$~xu84aeQ#ra{Ot zu-0LKrJxC`nxk9D6(|&PWaX1ua{{h>KSybQ#y*FepVJ|8(aH!3l6H^o#O-R1U)cCZkq+j zx3S~}(TQ{}R2fW;6q@MTq92otB6?YgPgY>&Uy;`D8-ViQlBf4D6jT#Hq&7f z>6r=CR|v?L_&9AneZo(6KctR&MMO23-P=Qa)2T>|CHALj@ucTPi(XFqwHCP+D2+UR z!u{E6*_<5NLw#6V#lA{Zc$I~i^e(Xv_c^YKpDQV5HOGd-(-S!|TP$@+W?BQ^O4Yhg%F$KaQ}2vs2V zo3QumY)IfaBe5kEemV)zEk+O3mi{x(?u=INmYcc;J0N6rRix6%F|S3h(NQnx!i|LG zQUq^r&-5@Yd^F{1E#Z!=tc(GEaGJ@oFHc80&x*EcJ2&_DA)UK$18l@>9PY|y&lJA3 zgSv^CBsJ&%*!}@DIQwA~NYb&hPq`*_t9LW284SR0xF7wCH3%dc}6I%H=IQgVoNTBP0Ji9r> ziBj_FCqcxyUH!%AaRrnhoBO-{Cr27f<%<5&mtD0#NI$vGoN|X^r$fHGfxz{~*Fog^ z6G4@f`!6Z}x=|R(=g{$tU$eD#=uNGUSq3kHoSZeg~gFCRk_$Kdlj)+Mg(@!el>l?5Y&`AGO ze+%z%(s7`)OuvfH8hpdG?7r5iX@Qe}u?hK3x>!PyoA30|W%50mN$te>J1^}z*9YY@ z*tLU{3Rf}Lxa$<&V0cdLaS4IvTy|{pbK##|F|2)~Cna6Ri_KX_{HmO@dgl$n3QO8A zfDgYE^^*l8H_5}dp9>D-SVvG(JqxBE$Tu$VB;Ks2aVWKR5ZuVMzF`a8Ud(%?*44($ zy;E^H(==zdy~pKK25)3vgENtxzu@zXcr1UYb1D^VFr3tv_oEH2QQ$^fJ?AB23j+K^ z4&r_ct&qG#A5`75rGrb~sb3F>v)jiay0uEnWcE(L^j$YS6&ffUdnJC;riMx^CVC>X z(}62YG6@i=dOS+vFe4_urXNWP?KKsg{Tu96M@7p@u%jZlrE2}lxveXS%yw;O*UZrB z(%18>W%kTiA9b(&YzsdZn>a>}ipRjkj4h$+h78QzQNO|ZJ1o}Z$`y~(a~VxAUXeRz zZv_KZLvMr1ROp}GQ7vNh5PR;=m`Je!Vf=#~QY3|tZ7EQCc%isAmkv>2$_onqig)Ce z2WWt(Y1Qxodwd2WOFj$^_ken206y$v`&f9D9HjgJ-sISXeHzG10rqQHUyy1NvdJf95Fm;IVF>Pcjs#A4_lN5r~0A4VwyCy&UFBm(1TM7Ke?djwVg4+5t7QG ze<22FgYf0aFHSsh#_K4&PPJ6JtT?^SaoE7ta`XJhZh~%O#=A^7Ahk{eGku@fL^i$n z%g5!EDxYMCk&L5l6Z}6lIKZT-nY4T``HuyxI8}VEdv%RRohvSlll&;@|EP`@+wT=$UMd@-avA$l-xl6)!egl_w zj);)CMLXwW+wLGN*kKH4XD`?9vj=a~H| zQeIBQ{K&3o(<25PuzlMW*07lNL|S(sIi4`LwMrhGHAJwns&ggV+lZQIp%)wEZ=g3> zF8&Z9OXfRJr23RluD3iR78{exB_8P?Avt8-0yCABPKB(qsKXc`?n@a*pJ_{(Y;nOV3 z89u}+LXVA1ArhNA6BcXAv>Qx+^Uf@(&#P#&^sWRT`CvQlB(_-xFXg@3Ut)?12`RRco#H#VoZDYVo^q~n`Xy60{jCsG&a844JJ z8IY}K<4LhOvrzOwj))vNy89u#)TD=HVs$bnin=kmG(+3!1rvi!h@vq&vWy_Bm^z#D z&#ul)>?wc(WuI&hDL*%^;ePYE(6C7Fag+97SAE5H9Emww(a;Ez2 zU1HZSEG$IFrf;o^jXaPept@X_K~5)KTkmsARb4RfAR#xcZ>yL@W=hklF}7N_Nb2I- zmJr3?@hRD0G1eVjW~b8Mhu@_-s4COnS1*xe_cZutR}BJ?^u{Au3Mm9S>myaq%Sbrd zdn+W00h`IWr}~3!M$6s>4$hx;wz*m1^-bSO7awem$9*oQWj-kLPdAr;TawxP#C5V7 z4123fl8$ANJr&lf^t<+*^);n#37}YSU-0fQ|H5q_Z;Ca8)}Q}gG`qo}w0A&tueHe+ zp{TaHyD;u3?Zf7j>6cFLK)HDBjPAzK1L^K&bZ#)lz0db?|Neu$&g;6)opBt`gdbn2T7ErR2jK0dee8M8 z%d3d4#V5**cs%_p2l9oaGxa=_8 zPeQxC-6hImrs>KKwd5y_>tAc2QZ2(>*Kz(6cww&)BfDigEep#admIRasb0{l7!#cH z?k|E7q65##MC|u40;cbgKf44CBr1NKyw0{Mla=-72Tezrmf5?*nD%KwWd;$^A5CP4 z`Vb!AML~z|iRURvOWnr3Ym5G)@oURm0CRU(M@*cKKrC zgFa_7sBIP6k_e?>QkZGJGP5PfF1ciCJ(sk=Oi%$ zc9_3q7An%&HF(Edm@gfn=(+Zz;^FEA{%aE6Y_~?|XRN>8#cPf*ISsw(%u&M;W~Q2; z!!er=IzP_UJ3shb7?Im2VzAWpqRs;sw6*za-CULcWAa$*YT+rNuiK4kC0R9}8!=FQ zZ5-amb*CO405#xR^&bM`QaP3tqw@53fCE2jBK3(na}9XImn!yOha@l~#*aXWD*+d`r5<=O*i21V=u5|jq;pwCc80BPj-Fxy^8<|p zdR!v+t2El@-;$)HE$nQ5D>(o8aKw??0B>g7)R_78s6XPFbN|yu@&`8X``qbc6zupn z3mWR4UH5t7&o>B1L5$jEQ${{=!l6N?!DM^{f|7O%;Exn$N>ohH>uK~y3jYcpyZ`YaP*&P<$ zEcAJ`205K9CyCqt#Cf9q-Pi6#kGsL_Oqp8fFpM+fQC6`p+7(-vf=Z3QLuBK1IpZ@Isf~6fnsqfF0+GB#^)J{*LN{|s*gi(Rgu3N>4j%P8ChvF=XVyPMXq-H zJk-Kntw8|zISa-ylj6&l{Vhs;J%hQN&ECG!V)Gf<7?aF1vWEhL=T8}-{yKta9OM1E z8}fdaM9>lY4QWeV%Ub8h+fvvm-3Xkqab(Ulf>d_e;FDXB_C}$;5^gxQcIg z5m7N;A{bD%0yMKw#up2%3CtXbEx@$bRK4BcW8D*k@X_0@-!YU*9|x|W?#8(9T^H$W z3Q_^?m=?p8kvh#}_xg!+4NS+M%I0ZMlJ>lkb!^S=FRV;wpMrW_0VRDp z7L7}0E>i6Qo&^ihYazC<`vCPVj{p3J6{3giKlgyx{Q!WU06%Muz8B|j4DT8#9a4_s369*%pe{C+y4 z>-9Fl&0rJ_9J>4djN^hyZ%mL@;VNM(Eb~qQluWJ=!qQDrZbyOcYvxTYZ*?37*5HA3 z<43UqG->DN+5uuW-&8WRN{8Ug`voCYDP@Gs`%KfX2&B{B(y7f2J=>qxqFRb|fBL9t z_N`(f>xghtw5`)&sT)|+?|+zf)>U*AGQhFv@*zNZ_&BfSKgO9y4%G94*5isB);wGt zeK_QGc87f^J8z~NxYopBjDp(vS#T%ADP$o+SNhGfzqTUJ1gn1F|HaJ`p``i8*K!!a z#(bWO{-Z8luke0RO|LusKk@=PR;RxgSnQ7aD+~B}XTQ^k6$vuo*+P~}?bAKH{T0tc z4>VZLQgB%0(Sotyz-SY`f!}eUD6jQlCR5R>obEDeqFAcCf?13pzWEm7RHlF~`i}@- z`ji${!(6s;87Wo0%6IrEIfA>v{eJZXM_jh59$ zb-ob4SCyoH2%UCiP$6@S?7=_##@$TU+5f~i3^4scSD}ITHbQ>}7X+073-~>&zpuK; zrbCFm#!RG)^bLT~KZug9KE@&h46`z5x5tUnS&l_S$b?=l8d%arMDl;kp_;e$AhPEf z0oFVZt<1r?Y!KS0NVoMJVvX`n4SJG^2xG7^>@XUl*^8lipLH{E3Y^`Wk9 zSEAZwd5{`E)G^99;)|=nJQLSr-a{;k4Q(p2ml6?Y90+(-eH-}@v_6*>7mchpb>oL& zo9Hb{&m}Df%6|OH9jFIFs9YB|Pw+fy`g6wnsU>`MdMR{6QB#|Cp@Ss&Uw=`I_hA*- z`^eE3QF~k`mi}hg98kay;OJLvwd{<+%? zaa)J~mz4y^b$^1s>)IAo;}0@^c}vh ziI&-_+WY-&v6oiKofBP_W%m@eBH{nAB)aW9CM0t){Dn&_-i1LJVL0-Xw|zD~2Bw(J z#1@KN$`S#oIIWLzbEg0tlOBzypx+*F052uj3^-ntV95dxnQBB5*VP9Oc@Dv3^xHTS z=JN_>Z2z(=e*px0z@gu*ZD6SCuy{d4E=F2#w917$w`j zyfWf_2Ozvz!nI;)#m-akfjE!3bHqz0&@Os*TjQ zQ|Frmf>)IQzYP@$%nUot7Vs3iIg*P>2BzvN^K2;ME=^(B^EjX*?)rt<9y3Pry=*o& zw}#m=-NwKbz26xqE&Wva$XR%(>9bI&HJW%sSbi@sPPO>+ir4S%>cm=Aof(CGwtiV34QC|)i$&Z1`1>h99-fdS+xF~< zHgl@yH+Q`ODQm}g#{4Qr9Q4BtGJGzDX>I*Jd3Wb}7Z4PM6A(pyU+cPNWLXEYJRAro zl(%}){aW^Ki{`gqx#5+I%q7kA4_M~7e zj=Yb?w?0dQsN8c$@IrNOrbdNfxH9e@p~%c+!K|s;*3)dK3w4Psl(RUd28V==_20}0 z^`F+)FT*o{5W4uVT(q%3t+eP+A>qtUrRnxzL;?)hN z-&F~dsH%H+R6fitT6tP#uM{8UbR*}3Ty5EkFAZ%+yP(bShqJr(2*j`YPp@BBm!DXA zfNN_WWa+jNvVYxcxS~_^;_hAwp3e@PE{(M}Wh%^dd42w6iBfu+X(Le+$Do`wt?9uQ zrp}t>r&jK^g2UEX*>1Wg{ElB`T>ts$u_H&?4WnL8muf0%VYGh!M`r~KbCDXwb+d{6 z9vNFQtCFp7pb&+d^-(OjnB9@6BQ0pD3pEpAv!VAGvdeo^v8?7Gd7DP>!1xQB&*>IP zHyrTzFP&)nEpMPS?1PXYOfxTpr}dMr+V;CkzVMuC$oOSwHPVpH{Hot1q zh4&nl4PH&C8uYxZqBeay_u;PRVW&7_mWI|}V?QJdE(1l0Xc2`dQ z*IN& zMrl`4Cfdg(KhL-eFGK~jbU4&+d(93JEX z9nQ{s@fSYl$Ta2+sxy(tFc0RqqX7PQ6+(W8Ghyzg@p(Wpglle|rmNq){P#0(gW8d-}0fjGGJbk^NL)+|BrzM z#BmK7$vU`;vYepu4L+;Grn)C3F+s^l;quh~=+^8dgkFdKmZ8$BC*KztB$pKo$=nt~ zd@piN^k)2X>zo_a>qSNjLd5p(q)SKjtL1}^_Day|&BGL})y}Y1$LhzQS9_~wT1%L= zL1?{qxr&#qm4CyV_9M+s0$utDPF6V zBk0@gmWJ_e?y~G)N=5V%*O6pH@Nga1m3FGnyb~%+nE=B5Ge~jyK>=1hYnnH)i=#F8 z&x9Fj8k{ee;#f*t=Cdth5fS}UZmfr?s97qnr!%B$*>C!C!A2ScjDc?ukVHSR|jJ$cq5e|aPjqPWwm6nM7VqZ(~u{Ndc?H{=9WZa zZdK}bPfXk-7FX%19Qt8pL5js|3_F>Ou&!9O^Z>DqZc> zYxj?*>W?ewXs!mqw(snzm!fZRvL#yU!=z(4Y`7_PI5sV@T@07$S-`VQh9gWh)C%Y8 ziaTl)>$Ap$UkJm5-mBm{WMzLNA z`YYG6nV&GSso-3|WNrk~*u9={sVh8QNF5U^CdNA(tZlkAgdY+VLf+^-(Z!m=7I5VRq~ zb>?Yc1W7~MM@d(UWy=KzJU4&-v{-^dr4Fr6s!0H~1i$6;*PyU`$1`oQ*?nM*TGLh# z&mt=eo}!Y6`Ult{VTEY}_52@o;_T=<4dRaN-<7)F{!yisRjxl*cBdXsj~-?_L9^95 zi-+B~Pw*=^ync^D$LtOE4cO+jb9|EUf1j{`ri)C!aSP>MN#+C0*QcrAJst75${S?# zwW6gySMZwUjvK0npr3%=YGZ>qfE_J`xoMC<5dWXL)_MH?wV~VEg~7hm_fAbaQhSfy zxw{F@d448n%uIp6fEm*MdhgF%L$_bpinCyjU%TZDLLe1iL-<;|1cuGFZ=nv3-SOCM zHw(OV3LRvM(_-r;y^vC7fFU~fi7IB_j;r-JDbLFJu$at44AH$`BWS~zoEZL! zJMjJwK(*=$ST=82H*Toz#htKN$<1?}sXlzBkgy>IAbj~yBQxRI3nF*gfS_|X(igpE z_z-`$N8M|BE5c~D zUp2&pERM325Qk_afsY6iYX0-R!r$b)_tmi%Vmlk)d|jrxHQ3gpIQ*F`NrcORRltkNfQ2p=PQ=tM(7LaB{DlkG9pI93x;d6Q9XYv3M+(@kj4=4xV#!u|=k+npyP^`TZ) z5HshBmRrg#LwDPtX5v*U^BPfN_c?joOR(!J3zNK$-gYEnj1JW<=I^_+P~|Y&Fz={KK=T zj_!UFaFy_0rVJF8M!I#cvtIE2;ubMu`Q&(awE1LhtaKA5*~I&0w04Ea4e{jtIDg^j zcOy|bdmgRbWhVP=p36?!5HhEK@5d|Souh<8`tvh=vJ(UqdHcQlJ@bV(?Ubu^WGT@zXZ$`k-T8*aTF&0yW^f%|K zq|!qPql(0F%o=>!M^4Ny>}O}Cncraj$a8|U9sF0(PAt|sZFm}tO^HFr2+p8);x!7H z7e^U)?%M{ec46K5!_X0J@?kw4C49k*ib4fPmcD=S)OS++=~{QL--P)N_f-M6R%G<; zAgnO^0U$q~)zP6i!q!0H8b}+QkYZxUh!`PO`r|{l(}{M78(+Ol9y%=Zs+5L`e>#rp zN4eQ`ustC`zN_d9AHEL;5NvrVX?RV@_x-~gV~&B7e&ww#Ww3?DT<0fYe*s}HFSJ4O z%qde*&96j9Ux}jG)ULmpDE<$4(tU| zH}rRaLE^G-D^WSz7^~*gEsQrLujeG%Z_YMkv`WpLwVD z&Nr6T@UK+Fp?RCS4(qJa5#GYNj)VwdgBFwaiRrl<5WS z$~GWSTpylZ2mEAbEUCV&PmhQ2d5re{9y&k66sSWab`jzDZwQY8*hAG-Vz@`z!FR%| zpDlb;^8xMOXCGSB&PwD(!ZGj@Bxqk&z5e8_NvS)LTRkpl*CdA2em#u8hLTiwfd6n@ z%|;>1t&BYO+;%#QjDPZLvEE&yypmBtoOF8+aOFEi9)970|A*2^C(Df}zizVk}3{p4ke;ALWUOZqxB13C^->58*4K;6y77ZdBCqlWY?{T_^ zpQX*sNez22T|OTb0zX#yWpIU3CJ*AeIlFe_s!P4&&~gppuP6^Evk@`sjMly6L;&E-9W9=in9sjTT;>J(59RxRi z%G^#*atbo~I2)d5|57_B`2C$~I?m)L93>NKGd}Hhr{m_Qfs&?wgWQ~}F21eY40s%I zU=F?E|3CEGl|J{d?akm6DAjWwp3X@PU5|loe4*(JE8_1#*=GWlxo_TT*_W8HWeM$KGWXJW;c8U>H5F4D2@y5 zXE(5J6K+PT2MW?Q0=Hk^Y*81_YqlZCiOTZ?SEFbP5`)MNkXFGMzDjhn1-|#ZJl-7} zzPLp=%2`HhC!xBeK&dIwvHINS%&R0cO-ZR5Zu*USCRho{MR`aGC{!n!xrpF3!a!Aj z2$(hC>&_jK_092!SS@J%@0C|tF<$OIiNWm!PXDeT#?>aTpfr*fcG%dq6(lglX6H5| zW~(yL3k@yzXNlk1H{%aAF%VNb6)|P#qqa-~Xn&4fdP$G}MCbPfX61l0?0lvm%@pz> zS}y4p8}ur2e^1Hv@|Ohs*u*%TK7AOR$ZKrI2~vufmN6M4dE@TZfO9!|t&Zl4L+`?xFFwX7zp4FEK3NxSSGi{|oj80))CN|m~RA258 z*0l^1kDbFQ<3%XSTg4V5Ts*W_+k<(a$7WKX*IswCekK99qUPF9`gmeplv<;S)5*%B zyA|vNo1GGg6ZbL4-TzbBgjBD|zWzpT`Q@^SpLu<%jO~lVAiS5%|wSO2VR@X$Fb%7_Zsc zr?uu;s}p4(o$cuHu^0v1NRQQ~!3{43`dRiP(Y>|6OA~r^k2=*9eUHvwuXKuE5y$3O zb90bm|H&79RS=x7pRMwfrzT}f4M-03SqQZGnW=DJu=W2^cE1)5+qMyq>j+RTbuPhE znUlW$DOJFLMIvWb=Kp0Q-N!KhSSWm7Qq!m_b51+gMIVYG{{HWB^bTcaZJDBH7JqJWoFxcBL*AMG(_)rHC?*&ec=7W|VKB2cO+lF^ zuwi)lMRSJ?=1<{v`F^y`HzKnY^647y)Uu?-+PbhN>=R){GhIVi2-q||x7lFZJaA>} zOQDVp&J)8cD>}TF+;-J<8_m)?v`sk1I`%@LOxLGo(w|cno9+pD+cs+q2V5Ydx{eY! z0sc|=+tk|`fh_!Gx`3@Mh9@>G<6}9zjOfPddChwKyE3&dL2En9rF19pmLr2n`^;Ca77I}Ux^gPrLmzK*rVaz<0NGxJVH=`E9HBi zc2*%>^sBZ}d;_j|KxGLC2@BAB_tT$$O8V zk&rP7g>M*0^DyM@x^P4)x!zv2;bv78k!+vRwOQcsFilxxr2YLv!&%8A=w_8~clPKl zsqdPr)$ZySKI-o;tAFa*Q564I_BxvNDK^ew!t7J7q_W0u+s4)}sBjwde*K6$j;&@s z|5TeXeg5B{H;wqA=>(*~Lc#wv>@+td8bAS0{!3ak%lG<~n>%muMBsL8`Si*=rz6LG zwr$+E({~`}wC%Rd%5mlLq+`w}r{UJfx6*&r^#nPl%k>+iL2D35`OZm`G!Q7BC6u;3 zo}dhPe^KsrR+72JkY2Eg)lb*f5AZxe8_5-YEPP*Ut(% zwlu|E-4BCAIlHVNB%j(B%=%u6$Eg}>Q~K?z=szj}aWh#a#^;0cI@jwC3kA3@CtA>MplZrYVU*rGmbk4pWN5d(jJ>#cQ*%poXv*7 zJMVKMF0x-p=x$XTA2*&_PB�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 literal 0 HcmV?d00001 diff --git a/website/src/App.tsx b/website/src/App.tsx index 51ecc1da..994bbf20 100644 --- a/website/src/App.tsx +++ b/website/src/App.tsx @@ -1,31 +1,56 @@ -import 'reflect-metadata'; -import React, { useEffect, useRef, useState } from 'react'; -import { create, Workbench } from '@dtinsight/molecule'; -import InstanceService from '@dtinsight/molecule/esm/services/instanceService'; -import { ExtendsWorkbench } from './extensions/workbench'; +import React, { useEffect, useRef } from 'react'; +import { create } from '@dtinsight/molecule'; +import extensions from './extensions'; import './languages'; - -import '@dtinsight/molecule/esm/style/mo.css'; import './App.css'; +const instance = create({ + extensions, + defaultLocale: 'zh-CN' +}); + function App(): React.ReactElement { - const refMoInstance = useRef(); - const [MyWorkbench, setMyWorkbench] = useState(); + const container = useRef(null); useEffect(() => { - if (!refMoInstance.current) { - refMoInstance.current = create({ - extensions: [ExtendsWorkbench] + // FIXME: Molecule Should support font-face + fetch('icons-carbon.json') + .then((res) => res.json()) + .then((value) => { + const style = Array.from(document.querySelectorAll('style')).find((ele) => + ele.textContent?.includes('font-family: "codicon"') + ); + if (!style) return; + const rules: string[] = []; + value.fonts.forEach(({ id, src, weight, style }: any) => { + const fontWeight = weight ? `font-weight: ${weight};` : ''; + const fontStyle = style ? `font-style: ${style};` : ''; + const srcString = src + .map((item: any) => `url(${item.path}) format('${item.format}')`) + .join(', '); + rules.push( + `@font-face { src: ${srcString}; font-family: ${id};${fontWeight}${fontStyle} font-display: block; }` + ); + Object.keys(value.iconDefinitions).forEach((key) => { + rules.push( + `.codicon-${key}:before { content: '${value.iconDefinitions[key].fontCharacter}' !important; font-family: "${id}" }` + ); + }); + }); + style.textContent += rules.join('\n'); }); - if (refMoInstance.current) { - const IDE = () => refMoInstance.current?.render(); - setMyWorkbench(IDE); - } - } }, []); - return
{MyWorkbench}
; + useEffect(() => { + instance.render(container.current); + + return () => { + instance.dispose(); + }; + }, []); + + return
; } export default App; diff --git a/website/src/components/icon/helper.tsx b/website/src/components/icon/helper.tsx new file mode 100644 index 00000000..bff75670 --- /dev/null +++ b/website/src/components/icon/helper.tsx @@ -0,0 +1,41 @@ +import { LanguageIdEnum } from 'monaco-sql-languages/out/esm/main.js'; +import { + FlinkIcon, + HiveIcon, + ImpalaIcon, + MysqlIcon, + PostgreSqlIcon, + SparkIcon, + TrinoIcon +} from '.'; +import React from 'react'; + +export function helper(id?: string) { + if (!id) return React.Fragment; + switch (id) { + case LanguageIdEnum.FLINK: { + return FlinkIcon; + } + case LanguageIdEnum.SPARK: { + return SparkIcon; + } + case LanguageIdEnum.HIVE: { + return HiveIcon; + } + case LanguageIdEnum.MYSQL: { + return MysqlIcon; + } + case LanguageIdEnum.TRINO: { + return TrinoIcon; + } + case LanguageIdEnum.PG: { + return PostgreSqlIcon; + } + case LanguageIdEnum.IMPALA: { + return ImpalaIcon; + } + + default: + return React.Fragment; + } +} diff --git a/website/src/components/icon/index.tsx b/website/src/components/icon/index.tsx new file mode 100644 index 00000000..0c4f1f38 --- /dev/null +++ b/website/src/components/icon/index.tsx @@ -0,0 +1,161 @@ +export const FlinkIcon = () => { + return ( + + + + + + + ); +}; + +export const SparkIcon = () => { + return ( + + + + + + ); +}; + +export const HiveIcon = () => { + return ( + + + + + + + ); +}; + +export const MysqlIcon = () => { + return ( + + + + + + ); +}; + +export const TrinoIcon = () => { + return ( + + + + + + + + ); +}; + +export const PostgreSqlIcon = () => { + return ( + + + + + + + + + + ); +}; + +export const ImpalaIcon = () => { + return ( + + + + + + ); +}; diff --git a/website/src/const/index.ts b/website/src/const/index.ts new file mode 100644 index 00000000..a0ef9502 --- /dev/null +++ b/website/src/const/index.ts @@ -0,0 +1,27 @@ +import { LanguageIdEnum } from 'monaco-sql-languages/out/esm/main.js'; + +export const SUPPORT_LANGUAGES = [ + LanguageIdEnum.FLINK, + LanguageIdEnum.SPARK, + LanguageIdEnum.HIVE, + LanguageIdEnum.MYSQL, + LanguageIdEnum.TRINO, + LanguageIdEnum.PG, + LanguageIdEnum.IMPALA +]; + +export const CREATE_TASK_ID = 'create.task.id'; + +export const RUN_SQL_ID = 'editor.run.sql'; + +export const TASK_TYPE = 'task.type'; + +export const TASK_PATH = 'task.path'; + +export const POWERED_BY = 'powered.by'; + +export const DELETE_TASK_ID = 'delete.task.id'; + +export const EVENTS = { + UPDATE_NAME: 'update.name' +} as const; diff --git a/website/src/extensions/Null.tsx b/website/src/extensions/Null.tsx new file mode 100644 index 00000000..36799698 --- /dev/null +++ b/website/src/extensions/Null.tsx @@ -0,0 +1,3 @@ +export default function Null() { + return null; +} diff --git a/website/src/extensions/actions/index.ts b/website/src/extensions/actions/index.ts new file mode 100644 index 00000000..6fb70780 --- /dev/null +++ b/website/src/extensions/actions/index.ts @@ -0,0 +1,14 @@ +import { IContributeType, IExtension } from '@dtinsight/molecule'; +import QuickSaveAction from './quickSaveAction'; +import QuickExecuteAction from './quickExecuteAction'; + +export const actionsExt: IExtension = { + id: 'actionsExt', + name: 'actionsExt', + contributes: { + [IContributeType.Commands]: [QuickSaveAction, QuickExecuteAction] + }, + activate() { + // TODO + } +}; diff --git a/website/src/extensions/actions/quickExecuteAction.ts b/website/src/extensions/actions/quickExecuteAction.ts new file mode 100644 index 00000000..c060bce2 --- /dev/null +++ b/website/src/extensions/actions/quickExecuteAction.ts @@ -0,0 +1,62 @@ +import { IMoleculeContext, KeybindingWeight } from '@dtinsight/molecule'; +// FIXME: 直接从根目录导出 +import { BaseAction } from '@dtinsight/molecule/esm/glue'; +import { KeyChord, KeyCode, KeyMod } from '@dtinsight/molecule/esm/monaco'; +import lips from '@jcubic/lips'; +import { RUN_SQL_ID } from '../../const'; + +export default class QuickExecuteAction extends BaseAction { + static readonly ID = 'workbench.action.quickExecute'; + + constructor(private molecule: IMoleculeContext) { + super({ + id: QuickExecuteAction.ID, + title: '快速执行', + alias: 'execute', + precondition: undefined, + f1: true, + keybinding: { + when: undefined, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyChord(KeyMod.CtrlCmd | KeyCode.Enter) + } + }); + } + + run() { + const molecule = this.molecule; + // TODO + const group = molecule.editor.getCurrentGroup(); + // FIXME: 这个函数应该支持范型 + const tab = molecule.editor.getCurrentTab(); + if (!group?.editorInstance || !tab) return; + const instance = group.editorInstance; + // 获取全部文本 + const text = instance.getModel()?.getValue() || ''; + molecule.editor.updateToolbar({ + id: RUN_SQL_ID, + icon: 'loading~spin' + }); + import('monaco-sql-languages/out/esm/languageService') + .then(({ LanguageService }) => { + const languageService = new LanguageService(); + return languageService.parserTreeToString(tab.language!, text); + }) + .then((res) => { + const pre = res?.replace(/(\(|\))/g, '$1\n'); + const format = new lips.Formatter(pre); + const formatted = format.format({ + indent: 2, + offset: 2 + }); + molecule.layout.setPanel(true); + molecule.output.append(formatted); + }) + .finally(() => { + molecule.editor.updateToolbar({ + id: RUN_SQL_ID, + icon: 'run' + }); + }); + } +} diff --git a/website/src/extensions/actions/quickSaveAction.ts b/website/src/extensions/actions/quickSaveAction.ts new file mode 100644 index 00000000..5adbec28 --- /dev/null +++ b/website/src/extensions/actions/quickSaveAction.ts @@ -0,0 +1,34 @@ +// FIXME: 直接从根目录导出 +import { IMoleculeContext, KeybindingWeight } from '@dtinsight/molecule'; +import { BaseAction } from '@dtinsight/molecule/esm/glue'; +import { KeyChord, KeyCode, KeyMod } from '@dtinsight/molecule/esm/monaco'; +import * as content from '../../storage/content'; + +export default class QuickSaveAction extends BaseAction { + static readonly ID = 'workbench.action.quickSave'; + + constructor(private molecule: IMoleculeContext) { + super({ + id: QuickSaveAction.ID, + title: '快速保存', + alias: 'Save', + precondition: undefined, + f1: true, + keybinding: { + when: undefined, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KeyS) + } + }); + } + + run() { + const molecule = this.molecule; + const tab = molecule.editor.getCurrentTab(); + const groupId = molecule.editor.getCurrent(); + if (tab && groupId) { + molecule.editor.updateTab({ id: tab.id, modified: false }, groupId); + content.set(tab.id as string, tab.value || ''); + } + } +} diff --git a/website/src/extensions/default/index.tsx b/website/src/extensions/default/index.tsx new file mode 100644 index 00000000..83059f1f --- /dev/null +++ b/website/src/extensions/default/index.tsx @@ -0,0 +1,233 @@ +import { IContributeType, IEditorTab, IExtension, UniqueId, utils } from '@dtinsight/molecule'; +import { + CREATE_TASK_ID, + DELETE_TASK_ID, + EVENTS, + POWERED_BY, + RUN_SQL_ID, + SUPPORT_LANGUAGES, + TASK_PATH, + TASK_TYPE +} from '../../const'; +import type { IExplorerPanelItem } from '@dtinsight/molecule/esm/models/explorer'; +import Tree from '../../workbench/tree'; +import * as content from '../../storage/content'; +import * as task from '../../storage/task'; +import { TreeNodeModel } from '@dtinsight/molecule/esm/utils/tree'; +import Language from '../../workbench/language'; +import Path from '../../workbench/path'; +import { subscribe } from '../../storage/tmp'; +import { LanguageIdEnum } from 'monaco-sql-languages/out/esm/main.js'; +import PoweredBy from '../../workbench/powerBy'; +import QuickExecuteAction from '../actions/quickExecuteAction'; + +export const defaultExt: IExtension = { + id: 'defaultExt', + name: 'defaultExt', + contributes: { + [IContributeType.Modules]: { + // FIXME: Molecule 应该支持传 null 表示不渲染某组件 + menuBar: import('../Null'), + activityBar: import('../Null'), + sidebar: import('../../workbench/sidebar'), + editor: import('../../workbench/editor') + } + }, + activate(molecule) { + molecule.editor.setOptions({ + fontFamily: 'Maple Mono' + }); + // 默认不展示 Panel + molecule.layout.setPanel(false); + // 设置 sidebar 的默认值 + molecule.layout.setPaneSize(['280px', 'auto']); + // 重置 toolbar + molecule.editor.dispatch((draft) => { + draft.toolbar = [ + { + id: RUN_SQL_ID, + group: 'inline', + icon: 'run' + } + ]; + }); + molecule.statusBar.add({ + id: TASK_TYPE, + name: '编辑器语言', + alignment: 'right', + sortIndex: 12, + render: () => + }); + // FIXME: 空状态不应该有宽度 + molecule.statusBar.add({ + id: TASK_PATH, + name: '路径', + alignment: 'left', + sortIndex: 2, + render: () => + }); + molecule.statusBar.add({ + id: POWERED_BY, + name: '关于', + alignment: 'left', + sortIndex: 1, + render: () => + }); + + const items = SUPPORT_LANGUAGES.map( + (key) => + ({ + id: key, + name: key, + toolbar: [ + { + id: CREATE_TASK_ID, + name: '新建任务', + group: 'inline', + icon: 'new-file' + } + ], + render: () => ( + { + if (treeNode.id !== molecule.editor.getCurrentTab()?.id) { + closeCurrentTab(); + openTab(treeNode); + } + }} + onCreate={async () => { + const item = await create(key); + closeCurrentTab(); + await openTab(item); + }} + onContextMenu={(pos, treeNode) => { + molecule.contextMenu.open( + [ + { + id: DELETE_TASK_ID, + name: '删除任务' + } + ], + pos, + { id: treeNode.data?.language, treeId: treeNode.id } + ); + }} + /> + ) + } as IExplorerPanelItem) + ); + molecule.explorer.reset(); + molecule.explorer.add(items); + molecule.explorer.setActive(items.map((item) => item.id)); + + molecule.explorer.onPanelToolbarClick(async (toolbar, panel) => { + if (toolbar.id === CREATE_TASK_ID) { + const item = await create(panel as LanguageIdEnum); + closeCurrentTab(); + await openTab(item); + } + }); + + molecule.editor.onToolbarClick((item) => { + if (item.id === RUN_SQL_ID) { + molecule.action.execute(QuickExecuteAction.ID); + } + }); + + molecule.contextMenu.onClick((item) => { + const scope = molecule.contextMenu.getScope<{ id: LanguageIdEnum; treeId: UniqueId }>(); + switch (item.id) { + case DELETE_TASK_ID: { + const tab = molecule.editor.getCurrentTab(); + if (tab?.id === scope.treeId) { + closeCurrentTab(); + } + content.remove(scope.treeId as string); + task.update(scope.id, (prev) => { + const next = prev?.concat() || []; + const idx = next.findIndex(utils.searchById(scope.treeId)); + if (idx === -1) return next; + next.splice(idx, 1); + return next; + }); + break; + } + + default: + break; + } + }); + + molecule.contextMenu.onClick((menu) => { + if (SUPPORT_LANGUAGES.includes(menu.id as LanguageIdEnum)) { + molecule.explorer.togglePanel(menu.id); + } + }); + + // FIXME:MOLECULE 应该支持自定义事件 + subscribe(EVENTS.UPDATE_NAME, (value: string) => { + const tab = molecule.editor.getCurrentTab(); + const groupId = molecule.editor.getCurrent(); + if (tab && groupId) { + molecule.editor.updateTab({ id: tab.id, name: value }, groupId); + task.update(tab.language as string, (prev) => { + const next = prev?.concat() || []; + const idx = next.findIndex(utils.searchById(tab.id)); + if (idx === -1) return next; + next[idx].name = value; + return next; + }); + } + }); + + // FIXME: Molecule 应该支持 closeTab 的事件 + function onCloseTab(tab: IEditorTab) { + content.set(tab.id as string, tab.value || ''); + } + + async function create(key: LanguageIdEnum) { + const id = new Date().valueOf().toString(); + const name = `默认_${key}_任务`; + const item = new TreeNodeModel<{ language: LanguageIdEnum }>( + id, + name, + 'File', + undefined, + undefined, + false, + { + language: key + } + ); + await task.update(key, (prev) => { + if (Array.isArray(prev)) { + return [...prev, item]; + } + + return [item]; + }); + + return item; + } + + async function openTab(tree: TreeNodeModel<{ language: string }>) { + const value = await content.get(tree.id as string); + molecule.editor.open({ + id: tree.id, + name: tree.name, + value, + language: tree.data?.language + }); + } + + function closeCurrentTab() { + const tab = molecule.editor.getCurrentTab(); + if (tab) { + onCloseTab(tab); + molecule.editor.closeTab(tab.id, molecule.editor.getCurrentGroup()!.id); + } + } + } +}; diff --git a/website/src/extensions/index.ts b/website/src/extensions/index.ts new file mode 100644 index 00000000..fd8b9db2 --- /dev/null +++ b/website/src/extensions/index.ts @@ -0,0 +1,5 @@ +import { actionsExt } from './actions'; +import { defaultExt } from './default'; +import { viewExt } from './view'; + +export default [defaultExt, actionsExt, viewExt]; diff --git a/website/src/extensions/view/index.ts b/website/src/extensions/view/index.ts new file mode 100644 index 00000000..10d1d081 --- /dev/null +++ b/website/src/extensions/view/index.ts @@ -0,0 +1,30 @@ +import { IExtension } from '@dtinsight/molecule'; +import * as view from '../../storage/view'; + +export const viewExt: IExtension = { + id: 'viewExt', + name: 'viewExt', + activate(molecule) { + // FIXME:如果调用了 dispose 方法这里就不需要调用了 + molecule.explorer.onCollapseChange(() => { + window.setTimeout(() => { + view.set(molecule); + }, 0); + }); + + view.get().then((viewState) => { + if (viewState?.explorer) { + molecule.explorer.setActive(viewState.explorer.active); + } + if (viewState?.layout) { + molecule.layout.setState(viewState.layout); + } + }); + }, + dispose(molecule) { + // FIXME: Molecule 的实例调用 dispose 应该把每一个插件的 dispose 方法都调用一次 + // window.setTimeout(() => { + // view.set(molecule); + // }, 0); + } +}; diff --git a/website/src/extensions/workbench/common.ts b/website/src/extensions/workbench/common.ts deleted file mode 100644 index f06a97c1..00000000 --- a/website/src/extensions/workbench/common.ts +++ /dev/null @@ -1,27 +0,0 @@ -export const defaultLanguage = 'FlinkSQL'; - -export const defaultEditorTab = { - id: `fixedTab`, - name: defaultLanguage, - data: { - value: ``, - language: defaultLanguage.toLowerCase() - } -}; - -export const defaultLanguageStatusItem = { - id: `fixedStatusItem`, - name: defaultLanguage, - sortIndex: 3 -}; - -export const languages = [ - 'FlinkSQL', - 'SparkSQL', - 'HiveSQL', - 'MySQL', - 'PgSQL', - 'SQL', - 'TrinoSQL', - 'ImpalaSQL' -]; diff --git a/website/src/extensions/workbench/index.tsx b/website/src/extensions/workbench/index.tsx deleted file mode 100644 index 833d20af..00000000 --- a/website/src/extensions/workbench/index.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import molecule from '@dtinsight/molecule'; -import { Float } from '@dtinsight/molecule/esm/model'; -import { IExtension } from '@dtinsight/molecule/esm/model/extension'; -import Sidebar from './sidebar'; -import { defaultEditorTab, defaultLanguageStatusItem } from './common'; - -export const ExtendsWorkbench: IExtension = { - id: 'ExtendWorkbench', - name: 'ExtendWorkbench', - - activate() { - const ParserSidebar = { - id: 'ParserSidebar', - title: 'Sidebar', - render() { - return ; - } - }; - - molecule.sidebar.add(ParserSidebar); - molecule.sidebar.setState({ - current: ParserSidebar.id - }); - - const parserActivityBarItem = { - id: 'OnlineParser', - icon: 'beaker', - title: 'SQL Languages Online Parse' - }; - - const githubPageActivityBarItem = { - id: 'GotoGithub', - icon: 'github', - title: 'Go To Github' - }; - - molecule.activityBar.remove('sidebar.explore.title'); - molecule.activityBar.remove('sidebar.search.title'); - - molecule.activityBar.add([parserActivityBarItem, githubPageActivityBarItem]); - molecule.activityBar.setState({ - selected: parserActivityBarItem.id - }); - - molecule.activityBar.onClick((id) => { - if (id === githubPageActivityBarItem.id) { - window.location.href = 'https://github.com/DTStack/monaco-sql-languages'; - } - }); - - molecule.editor.open(defaultEditorTab); - - molecule.statusBar.add(defaultLanguageStatusItem, Float.right); - }, - dispose() {} -}; diff --git a/website/src/extensions/workbench/sidebar.tsx b/website/src/extensions/workbench/sidebar.tsx deleted file mode 100644 index 46f54fd7..00000000 --- a/website/src/extensions/workbench/sidebar.tsx +++ /dev/null @@ -1,176 +0,0 @@ -import React from 'react'; -import * as monaco from 'monaco-editor'; - -import lips from '@jcubic/lips'; -import molecule from '@dtinsight/molecule'; -import { Button } from '@dtinsight/molecule/esm/components'; -import { Select, Option } from '@dtinsight/molecule/esm/components/select'; -import { IEditorTab, IProblemsItem, MarkerSeverity } from '@dtinsight/molecule/esm/model'; - -import { defaultLanguage, defaultEditorTab, defaultLanguageStatusItem, languages } from './common'; -import { LanguageService } from 'monaco-sql-languages/out/esm/languageService'; -import { debounce } from 'monaco-sql-languages/out/esm/common/utils'; - -export default class Sidebar extends React.Component { - private _language = defaultLanguage; - private languageService: LanguageService; - constructor(props: any) { - super(props); - this.languageService = new LanguageService(); - } - - componentDidMount() { - molecule.editor.onUpdateTab(this.analyseProblems); - - monaco.editor.setTheme('sql-dark'); - } - - private get language(): string { - return this._language.toLowerCase(); - } - - onClick = (e: any, item: any) => { - console.log('onClick:', e, item); - }; - - onChangeLanguage = (e: any, option: any) => { - if (option && option.value) { - this._language = option.value; - this.updateLanguage(option.value); - } - }; - - analyseProblems = debounce((tab: any) => { - const sql = tab.data.value; - this.languageService.valid(this.language, sql).then((res) => { - molecule.problems.reset(); - const problems = this.convertMsgToProblemItem(tab, sql, res); - molecule.problems.add(problems); - }); - }, 200); - - convertMsgToProblemItem = (tab: IEditorTab, code: string, msgs = []): IProblemsItem => { - const rootId = tab.id; - const rootName = `${tab.name || ''}`; - const languageProblems: IProblemsItem = { - id: rootId, - name: rootName, - isLeaf: false, - value: { - code: rootName, - message: '', - startLineNumber: 0, - startColumn: 1, - endLineNumber: 0, - endColumn: 1, - status: MarkerSeverity.Hint - }, - children: [] - }; - - languageProblems.children = msgs.map((msg: any, index: number) => { - return { - id: `${rootId}-${index}`, - name: msg.code || '', - isLeaf: true, - value: { - code: msg.code, - message: msg.message, - startLineNumber: Number(msg.startLine), - startColumn: Number(msg.startCol), - endLineNumber: Number(msg.endLine), - endColumn: Number(msg.endCol), - status: MarkerSeverity.Error - }, - children: [] - }; - }); - - return languageProblems; - }; - - updateLanguage(language: string) { - const languageId = this.language; - - const nextTab = Object.assign(defaultEditorTab, { - name: language, - data: { language: languageId, value: '' } - }); - const group = molecule.editor.getState().current?.id || -1; - molecule.editor.updateTab(nextTab, group); - const model = molecule.editor.editorInstance.getModel(); - if (model) { - monaco.editor.setModelLanguage(model, languageId); - } - - const nextStatusItem = Object.assign(defaultLanguageStatusItem, { - name: language, - sortIndex: 3 - }); - this.analyseProblems(nextTab); - molecule.statusBar.update(nextStatusItem); - } - - parse = () => { - this.setupOutputLanguage(); - const sql = molecule.editor.editorInstance.getValue(); - molecule.panel.cleanOutput(); - - this.languageService.parserTreeToString(this.language, sql).then((res) => { - const pre = res?.replace(/(\(|\))/g, '$1\n'); - const format = new lips.Formatter(pre); - const formatted = format.format({ - indent: 2, - offset: 2 - }); - const panel = - molecule.panel.getPanel(molecule.builtin.getConstants().PANEL_OUTPUT ?? '') ?? - ({} as any); - molecule.panel.update({ - ...panel, - data: formatted - }); - molecule.panel.appendOutput(''); - }); - }; - - async setupOutputLanguage() { - const model = await molecule.panel.outputEditorInstance?.getModel(); - if (model) { - monaco.editor.setModelLanguage(model, 'clojure'); - } - } - - renderColorThemes() { - const options = languages.map((language: string) => { - return ( - - ); - }); - return ( - - ); - } - - render() { - return ( -
-
-

- Select a language:{' '} -

- {this.renderColorThemes()} - -
-
- ); - } -} diff --git a/website/src/hooks/useEdit.ts b/website/src/hooks/useEdit.ts new file mode 100644 index 00000000..583ed0e7 --- /dev/null +++ b/website/src/hooks/useEdit.ts @@ -0,0 +1,22 @@ +import { useState } from 'react'; + +export default function useEdit() { + const [data, setData] = useState(''); + const [editing, setEditing] = useState(false); + + function start(initialValue: string) { + setEditing(true); + setData(initialValue); + } + + function stop() { + setEditing(false); + setData(''); + } + + function dispatch(value: string) { + setData(value); + } + + return { editing, data, start, stop, dispatch }; +} diff --git a/website/src/index.css b/website/src/index.css index 3cc15d31..e6de1465 100644 --- a/website/src/index.css +++ b/website/src/index.css @@ -1,15 +1,10 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; +@font-family { + font-family: 'Maple Mono'; + src: url('/MapleMono.tff') format('truetype'); +} - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; +body { + font-family: 'Maple Mono', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, + Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji'; + background-color: var(--editor-background); } diff --git a/website/src/main.tsx b/website/src/main.tsx index 419d05cd..716ee3a4 100644 --- a/website/src/main.tsx +++ b/website/src/main.tsx @@ -1,10 +1,5 @@ -import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App.tsx'; import './index.css'; -ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - -); +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(); diff --git a/website/src/storage/content/index.ts b/website/src/storage/content/index.ts new file mode 100644 index 00000000..5e5fe540 --- /dev/null +++ b/website/src/storage/content/index.ts @@ -0,0 +1,24 @@ +import * as idb from 'idb-keyval'; + +const tableName = `dtinsight/content`; + +export function set(id: string, content: string) { + return idb.update>(tableName, (prev) => { + const next = prev || new Map(); + next.set(id, content); + return next; + }); +} + +export async function get(id: string) { + const value = await idb.get>(tableName); + return value?.get(id); +} + +export async function remove(id: string) { + return idb.update>(tableName, (prev) => { + const next = prev || new Map(); + next.delete(id); + return next; + }); +} diff --git a/website/src/storage/task/index.ts b/website/src/storage/task/index.ts new file mode 100644 index 00000000..5cdb385e --- /dev/null +++ b/website/src/storage/task/index.ts @@ -0,0 +1,43 @@ +import * as idb from 'idb-keyval'; +import { useEffect, useState } from 'react'; +import { TreeNode } from '../../types'; + +type Updater = (oldValue?: TreeNode[]) => TreeNode[]; + +const trigger: (() => void)[] = []; + +export async function set(id: string, value: TreeNode[]) { + await idb.set(`dtinsight/${id}`, value); + trigger.forEach((fn) => fn()); +} + +export function get(id: string) { + return idb.get(`dtinsight/${id}`); +} + +export async function update(id: string, updater: Updater) { + await idb.update(`dtinsight/${id}`, updater); + trigger.forEach((fn) => fn()); +} + +export function useTask(id: string) { + const [data, setData] = useState([]); + + function update() { + get(id) + .then((values) => { + setData(values || []); + }) + .catch((error) => { + console.error(error); + setData([]); + }); + } + + useEffect(() => { + update(); + trigger.push(update); + }, []); + + return data; +} diff --git a/website/src/storage/tmp/index.ts b/website/src/storage/tmp/index.ts new file mode 100644 index 00000000..9147f14d --- /dev/null +++ b/website/src/storage/tmp/index.ts @@ -0,0 +1,16 @@ +/* eslint-disable @typescript-eslint/ban-types */ +import EventEmitter from '@dtinsight/molecule/esm/glue/eventEmitter'; + +const ee = new EventEmitter(); + +export function emit(name: string, ...args: any) { + ee.emit(name, ...args); +} + +export function subscribe(name: string, listener: Function) { + ee.subscribe(name, listener); +} + +export function unsubscribe(name: string, listener: Function) { + ee.unsubscribe(name, listener); +} diff --git a/website/src/storage/view/index.ts b/website/src/storage/view/index.ts new file mode 100644 index 00000000..a8d04017 --- /dev/null +++ b/website/src/storage/view/index.ts @@ -0,0 +1,23 @@ +import { IMoleculeContext } from '@dtinsight/molecule'; +import { ExplorerModel } from '@dtinsight/molecule/esm/models/explorer'; +import { LayoutModel } from '@dtinsight/molecule/esm/models/layout'; +import * as idb from 'idb-keyval'; + +const tableName = `dtinsight/view`; + +type ViewState = { + layout: LayoutModel; + explorer: Pick; +}; + +export function set(molecule: IMoleculeContext) { + const data: ViewState = { + layout: molecule.layout.getState(), + explorer: { active: molecule.explorer.getState().active } + }; + return idb.set(tableName, data); +} + +export async function get() { + return idb.get(tableName); +} diff --git a/website/src/types.ts b/website/src/types.ts new file mode 100644 index 00000000..f192610e --- /dev/null +++ b/website/src/types.ts @@ -0,0 +1,4 @@ +import { TreeNodeModel } from '@dtinsight/molecule/esm/utils/tree'; +import { LanguageIdEnum } from 'monaco-sql-languages/out/esm/main.js'; + +export type TreeNode = TreeNodeModel<{ language: LanguageIdEnum }>; diff --git a/website/src/workbench/editor/index.tsx b/website/src/workbench/editor/index.tsx new file mode 100644 index 00000000..ad61a3c4 --- /dev/null +++ b/website/src/workbench/editor/index.tsx @@ -0,0 +1,38 @@ +import { hooks, components, utils } from '@dtinsight/molecule'; +import { Container } from './styled'; +import Tab from '../tab'; +import { useMemo } from 'react'; +import { IEditorController } from '@dtinsight/molecule/esm/controllers/editor'; + +export default function Editor({ onMount, onModelMount, onToolbarClick }: IEditorController) { + const editor = hooks.useConnector('editor'); + const settings = hooks.useSettings(); + const options = useMemo( + () => ({ + ...settings.editor, + ...editor.options + }), + [editor.options, settings.editor] + ); + + const group = editor.groups.find(utils.searchById(editor.current)); + const tab = group?.data.find(utils.searchById(group.activeTab)); + return ( + + + {tab ? ( + + ) : ( + editor.entry || + )} + + ); +} diff --git a/website/src/workbench/editor/styled.tsx b/website/src/workbench/editor/styled.tsx new file mode 100644 index 00000000..20321e86 --- /dev/null +++ b/website/src/workbench/editor/styled.tsx @@ -0,0 +1,7 @@ +import styled from 'styled-components'; + +export const Container = styled.div` + background: var(--editor-background); + height: 100%; + width: 100%; +`; diff --git a/website/src/workbench/language/index.tsx b/website/src/workbench/language/index.tsx new file mode 100644 index 00000000..bd92af24 --- /dev/null +++ b/website/src/workbench/language/index.tsx @@ -0,0 +1,10 @@ +import { hooks, utils } from '@dtinsight/molecule'; + +export default function Language() { + const editor = hooks.useConnector('editor'); + const group = editor.groups.find(utils.searchById(editor.current)); + const tab = group?.data.find(utils.searchById(group.activeTab)); + if (!tab) return null; + + return <>{tab.language}; +} diff --git a/website/src/workbench/path/index.tsx b/website/src/workbench/path/index.tsx new file mode 100644 index 00000000..b723542b --- /dev/null +++ b/website/src/workbench/path/index.tsx @@ -0,0 +1,15 @@ +import { hooks, utils } from '@dtinsight/molecule'; +import { Text } from './styled'; + +export default function Path() { + const editor = hooks.useConnector('editor'); + const group = editor.groups.find(utils.searchById(editor.current)); + const tab = group?.data.find(utils.searchById(group.activeTab)); + if (!tab) return null; + + return ( + + ~/{tab.language}/{tab.name} + + ); +} diff --git a/website/src/workbench/path/styled.ts b/website/src/workbench/path/styled.ts new file mode 100644 index 00000000..eb5900a9 --- /dev/null +++ b/website/src/workbench/path/styled.ts @@ -0,0 +1,7 @@ +import styled from 'styled-components'; + +export const Text = styled.div` + max-width: 200px; + overflow: hidden; + text-overflow: ellipsis; +`; diff --git a/website/src/workbench/powerBy/index.tsx b/website/src/workbench/powerBy/index.tsx new file mode 100644 index 00000000..ee630142 --- /dev/null +++ b/website/src/workbench/powerBy/index.tsx @@ -0,0 +1,69 @@ +import { components } from '@dtinsight/molecule'; +import { useCallback, useEffect, useState } from 'react'; +import websitePkg from '../../../package.json'; +import pkg from '../../../../package.json'; +import { createPortal } from 'react-dom'; +import { Container, Dialog, Boxen, Row, Link, Text, ButtonRow } from './styled'; + +export default function PoweredBy() { + const [open, setOpen] = useState(false); + + const handleKeyDown = useCallback((e: any) => { + if (e.key === 'Escape') { + setOpen(false); + } + }, []); + + const handleOpen = () => { + setOpen(true); + }; + + useEffect(() => { + window.addEventListener('keydown', handleKeyDown, { once: true }); + return () => window.removeEventListener('keydown', handleKeyDown); + }, [open]); + + return ( + <> + + + + {createPortal( + e.target === e.currentTarget && setOpen(false)}> + + + + + + Molecule: {websitePkg.dependencies['@dtinsight/molecule']} + + + monaco-sql-languages: {pkg.version} + + + fonts: Maple Mono + + + + + setOpen(false)} + size="large" + > + 确认 + + + + , + document.body + )} + + ); +} diff --git a/website/src/workbench/powerBy/styled.ts b/website/src/workbench/powerBy/styled.ts new file mode 100644 index 00000000..38524450 --- /dev/null +++ b/website/src/workbench/powerBy/styled.ts @@ -0,0 +1,61 @@ +import styled from 'styled-components'; + +export const Container = styled.div` + display: flex; + align-items: center; + .codicon { + font-size: 20px; + } +`; + +export const Dialog = styled.dialog` + position: fixed; + left: 0; + top: 0; + z-index: 2600; + background: rgba(0, 0, 0, 0.3); + width: 100vw; + height: 100vh; + cursor: default; + margin: 0; + padding: 0; +`; + +export const Boxen = styled.div` + background: var(--editor-background); + width: fit-content; + min-width: 500px; + max-width: 90vw; + border-radius: 5px; + padding: 10px; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); +`; + +export const Row = styled.div` + display: flex; + padding: 20px 10px 10px; + gap: 16px; +`; + +export const Text = styled.div` + flex: 1; + text-align: center; + line-height: 40px; + display: flex; + flex-direction: column; +`; + +export const ButtonRow = styled.div` + display: flex; + white-space: nowrap; + padding: 20px 10px 10px; + justify-content: flex-end; +`; + +export const Link = styled.a` + font-size: 16px; + color: var(--foreground); +`; diff --git a/website/src/workbench/sidebar/index.tsx b/website/src/workbench/sidebar/index.tsx new file mode 100644 index 00000000..5b7cc538 --- /dev/null +++ b/website/src/workbench/sidebar/index.tsx @@ -0,0 +1,13 @@ +import { hooks } from '@dtinsight/molecule'; +import { Container, Content, Title } from './styled'; + +export default function SideBar() { + const Explorer = hooks.useDynamic('explorer'); + + return ( + + monaco-sql-languages + {Explorer} + + ); +} diff --git a/website/src/workbench/sidebar/styled.tsx b/website/src/workbench/sidebar/styled.tsx new file mode 100644 index 00000000..b3ef808f --- /dev/null +++ b/website/src/workbench/sidebar/styled.tsx @@ -0,0 +1,21 @@ +import styled from 'styled-components'; + +export const Container = styled.div` + background-color: var(--sideBar-background); + height: 100%; + border-right: 1px solid var(--sideBar-border); + color: var(--sideBar-foreground); + outline-color: var(--sideBar-border); +`; + +export const Title = styled.div` + height: 35px; + text-align: center; + line-height: 35px; + user-select: none; + font-size: 14px; +`; + +export const Content = styled.div` + height: calc(100% - 35px); +`; diff --git a/website/src/workbench/tab/index.tsx b/website/src/workbench/tab/index.tsx new file mode 100644 index 00000000..e31c53a1 --- /dev/null +++ b/website/src/workbench/tab/index.tsx @@ -0,0 +1,136 @@ +import { IEditorTab, IMenuItemProps, UniqueId, components, controllers } from '@dtinsight/molecule'; +import { Actions, Container, EditorWrapper, Header, Name, Text, Title } from './styled'; +import { editor } from 'monaco-editor'; +import { createElement, useEffect, useMemo, useRef } from 'react'; +import useEdit from '../../hooks/useEdit'; +import { emit } from '../../storage/tmp'; +import { EVENTS } from '../../const'; +import { helper } from '../../components/icon/helper'; + +interface ITabProps + extends Pick< + controllers.editor.IEditorController, + 'onMount' | 'onModelMount' | 'onToolbarClick' + > { + data: IEditorTab; + groupId: UniqueId; + options: editor.IEditorOptions; + toolbar: IMenuItemProps[]; +} + +export default function Tab({ + data, + groupId, + toolbar, + options, + onModelMount, + onMount, + onToolbarClick +}: ITabProps) { + const edit = useEdit(); + const ref = useRef(null); + + const viewState = useRef(new WeakMap()); + const handleMount = (editor: editor.IStandaloneCodeEditor) => { + onMount?.(groupId, editor); + + editor.onDidChangeModel(() => { + const model = editor.getModel(); + if (model) { + const state = viewState.current.get(model); + if (state) { + editor.restoreViewState(state); + editor.focus(); + } + } + }); + + editor.onDidBlurEditorText(() => { + const model = editor.getModel(); + if (model) { + viewState.current.set(model, editor.saveViewState()); + } + }); + }; + + const handleModelMount = (model: editor.ITextModel) => { + if (!data) return; + if (!data.model) { + onModelMount?.(data.id, groupId, model); + } + }; + + const handleSubmit = () => { + // FIXME: Molecule 应该支持把事件抛出去 + edit.stop(); + if (ref.current) { + ref.current.style.removeProperty('width'); + } + emit(EVENTS.UPDATE_NAME, edit.data); + }; + + const handleEdit = () => { + // 由于 Input 的内容会内陷,实现 input 的宽度和 text 的文案宽度保持一致 + if (ref.current) { + const { width } = ref.current.getBoundingClientRect(); + ref.current.style.setProperty('width', `${width}px`); + } + edit.start(data.name || ''); + }; + + useEffect(() => { + edit.stop(); + if (ref.current) { + ref.current.style.removeProperty('width'); + } + }, [data]); + + const icon = useMemo(() => { + return createElement(helper(data.language)); + }, [data]); + + return ( + +
+ + <components.icon.default type={icon} /> + <Name ref={ref}> + {edit.editing ? ( + <components.input.Input + autoFocus + value={edit.data} + onChange={edit.dispatch} + onBlur={handleSubmit} + onSubmit={handleSubmit} + /> + ) : ( + <Text title={data.name} onClick={handleEdit}> + {data.name} + </Text> + )} + </Name> + {data.modified && <components.icon.default type="primitive-dot" />} + + + onToolbarClick?.(item, groupId)} + /> + +
+ + + +
+ ); +} diff --git a/website/src/workbench/tab/styled.tsx b/website/src/workbench/tab/styled.tsx new file mode 100644 index 00000000..793c1bd4 --- /dev/null +++ b/website/src/workbench/tab/styled.tsx @@ -0,0 +1,49 @@ +import styled from 'styled-components'; + +export const Container = styled.div` + height: 100%; + position: relative; + width: 100%; +`; + +export const Title = styled.div` + line-height: 24px; + font-size: 14px; + padding: 6px 0; + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + flex: 1; +`; + +export const EditorWrapper = styled.div` + height: calc(100% - 38px); +`; + +export const Actions = styled.div` + padding: 0 6px; +`; + +export const Header = styled.div` + display: flex; + width: 100%; +`; + +export const Name = styled.div` + cursor: pointer; + max-width: 400px; +`; + +export const Text = styled.div` + border: 1px solid transparent; + padding: 0 6px; + border-radius: 5px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + &:hover { + border-color: var(--inputOption-activeBorder); + } +`; diff --git a/website/src/workbench/tree/index.tsx b/website/src/workbench/tree/index.tsx new file mode 100644 index 00000000..d5eccfba --- /dev/null +++ b/website/src/workbench/tree/index.tsx @@ -0,0 +1,57 @@ +import { IMoleculeContext, hooks, components, utils, IPosition } from '@dtinsight/molecule'; +import { useTask } from '../../storage/task'; +import { Empty, TreeContainer } from './styled'; +import { createElement, useMemo } from 'react'; +import { helper } from '../../components/icon/helper'; +import { TreeNode } from '../../types'; + +interface ITreeProps { + id: string; + molecule: IMoleculeContext; + onSelect: components.tree.ITreeProps['onSelect']; + onCreate: () => void; + onContextMenu: (pos: IPosition, treeNode: TreeNode) => void; +} + +export default function Tree({ id, onSelect, onCreate, onContextMenu }: ITreeProps) { + const editor = hooks.useConnector('editor'); + const rawData = useTask(id); + + const activeKey = editor.groups.find(utils.searchById(editor.current))?.activeTab; + + const data = useMemo( + () => + rawData.map((item) => ({ ...item, icon: createElement(helper(item.data?.language)) })), + [rawData] + ); + + return ( + + + {data.length ? ( + + onContextMenu(pos, treeNode)} + /> + + ) : ( + + 暂无数据 + + 点击新建 SQL 文件 + + + )} + + + ); +} diff --git a/website/src/workbench/tree/styled.ts b/website/src/workbench/tree/styled.ts new file mode 100644 index 00000000..edf85061 --- /dev/null +++ b/website/src/workbench/tree/styled.ts @@ -0,0 +1,21 @@ +import { styled } from 'styled-components'; + +export const Empty = styled.div` + padding: 12px; + font-size: 14px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 8px; +`; + +export const TreeContainer = styled.div` + .mo-tree .mo-tree__treenode { + height: 30px; + font-size: 14px; + gap: 6px; + + // FIXME: treenode text-overflow + } +`; diff --git a/website/tsconfig.json b/website/tsconfig.json index d9051027..6189cf53 100644 --- a/website/tsconfig.json +++ b/website/tsconfig.json @@ -1,6 +1,5 @@ { "compilerOptions": { - "baseUrl": ".", "target": "ES2020", "useDefineForClassFields": true, "lib": ["ES2020", "DOM", "DOM.Iterable"], diff --git a/website/vite.config.ts b/website/vite.config.ts index e5b2ae0c..14ec7f0c 100644 --- a/website/vite.config.ts +++ b/website/vite.config.ts @@ -9,7 +9,12 @@ import commonjs from 'vite-plugin-commonjs'; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [commonjs(), react()], + plugins: [ + commonjs(), + react({ + jsxRuntime: 'automatic' + }) + ], define: { 'process.env': process.env }, From beb5a8e7298658fa21f9c01f4e658ec2a6c4ee55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E8=BF=82=E8=BF=82?= Date: Thu, 29 Feb 2024 11:35:29 +0800 Subject: [PATCH 2/6] feat: bump @dtinsight/molecule to alpha.1 --- website/package.json | 2 +- website/pnpm-lock.yaml | 19 +++++++++++++++---- website/src/extensions/Null.tsx | 3 --- .../extensions/actions/quickExecuteAction.ts | 13 +++++-------- .../src/extensions/actions/quickSaveAction.ts | 6 ++---- website/src/extensions/default/index.tsx | 7 +++---- website/src/extensions/view/index.ts | 12 +----------- website/src/workbench/editor/index.tsx | 5 +++-- website/src/workbench/powerBy/index.tsx | 6 +++--- website/src/workbench/tab/index.tsx | 13 ++++++++----- website/src/workbench/tree/index.tsx | 16 ++++++++-------- website/src/workbench/tree/styled.ts | 2 -- 12 files changed, 49 insertions(+), 55 deletions(-) delete mode 100644 website/src/extensions/Null.tsx diff --git a/website/package.json b/website/package.json index 3fcf6920..4d1d5314 100644 --- a/website/package.json +++ b/website/package.json @@ -10,7 +10,7 @@ "preview": "vite preview" }, "dependencies": { - "@dtinsight/molecule": "2.0.0-alpha.0", + "@dtinsight/molecule": "2.0.0-alpha.1", "@esbuild-plugins/node-globals-polyfill": "^0.2.3", "@esbuild-plugins/node-modules-polyfill": "^0.2.2", "@jcubic/lips": "^0.20.3", diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml index f36ddbf9..08985280 100644 --- a/website/pnpm-lock.yaml +++ b/website/pnpm-lock.yaml @@ -1,7 +1,7 @@ lockfileVersion: 5.3 specifiers: - '@dtinsight/molecule': 2.0.0-alpha.0 + '@dtinsight/molecule': 2.0.0-alpha.1 '@esbuild-plugins/node-globals-polyfill': ^0.2.3 '@esbuild-plugins/node-modules-polyfill': ^0.2.2 '@jcubic/lips': ^0.20.3 @@ -29,7 +29,7 @@ specifiers: vite-plugin-commonjs: ^0.7.1 dependencies: - '@dtinsight/molecule': 2.0.0-alpha.0_f00573bd3726c9f289cfe34c027997e4 + '@dtinsight/molecule': 2.0.0-alpha.1_f00573bd3726c9f289cfe34c027997e4 '@esbuild-plugins/node-globals-polyfill': 0.2.3 '@esbuild-plugins/node-modules-polyfill': 0.2.2 '@jcubic/lips': 0.20.3 @@ -300,8 +300,8 @@ packages: standard-version: 9.5.0 dev: false - /@dtinsight/molecule/2.0.0-alpha.0_f00573bd3726c9f289cfe34c027997e4: - resolution: {integrity: sha512-a43k5SOgtxGMFY3KcMCp+VZ18844CalIAWACSb8Sh31ORpXCx95O25JzrAiZBmrck+KZyz+UqG86uykhHf31XQ==} + /@dtinsight/molecule/2.0.0-alpha.1_f00573bd3726c9f289cfe34c027997e4: + resolution: {integrity: sha512-UnoZC5S855WSGVYUpkGl/y89czoGcD5ozm6kwxQ1+4PB9ZUG3vU8Mn/qtufMMyhMVP0i+lJSs+kVeGozZwdw2g==} peerDependencies: react: '>=16.13.1' react-dom: '>=16.13.1' @@ -320,6 +320,7 @@ packages: react-dom: 18.2.0_react@18.2.0 react-use: 17.4.2_react-dom@18.2.0+react@18.2.0 reflect-metadata: 0.1.13 + sonner: 1.4.2_react-dom@18.2.0+react@18.2.0 tapable: 2.2.1 tsyringe: 4.8.0 use-sync-external-store: 1.2.0_react@18.2.0 @@ -2957,6 +2958,16 @@ packages: engines: {node: '>=8'} dev: true + /sonner/1.4.2_react-dom@18.2.0+react@18.2.0: + resolution: {integrity: sha512-x3Kfzfhb56V/ErvUnH5dZcsu6QkZpyIlRAogO4vAbN+AkBsA/8CFqOV+5djqbE5pQCpejtO4JBWL1zRj2sO/Vg==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + /source-map-js/1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} diff --git a/website/src/extensions/Null.tsx b/website/src/extensions/Null.tsx deleted file mode 100644 index 36799698..00000000 --- a/website/src/extensions/Null.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Null() { - return null; -} diff --git a/website/src/extensions/actions/quickExecuteAction.ts b/website/src/extensions/actions/quickExecuteAction.ts index c060bce2..5657928b 100644 --- a/website/src/extensions/actions/quickExecuteAction.ts +++ b/website/src/extensions/actions/quickExecuteAction.ts @@ -1,11 +1,10 @@ -import { IMoleculeContext, KeybindingWeight } from '@dtinsight/molecule'; -// FIXME: 直接从根目录导出 -import { BaseAction } from '@dtinsight/molecule/esm/glue'; +import { IMoleculeContext, KeybindingWeight, glue } from '@dtinsight/molecule'; import { KeyChord, KeyCode, KeyMod } from '@dtinsight/molecule/esm/monaco'; import lips from '@jcubic/lips'; import { RUN_SQL_ID } from '../../const'; +import type { TreeNode } from '../../types'; -export default class QuickExecuteAction extends BaseAction { +export default class QuickExecuteAction extends glue.BaseAction { static readonly ID = 'workbench.action.quickExecute'; constructor(private molecule: IMoleculeContext) { @@ -25,10 +24,8 @@ export default class QuickExecuteAction extends BaseAction { run() { const molecule = this.molecule; - // TODO const group = molecule.editor.getCurrentGroup(); - // FIXME: 这个函数应该支持范型 - const tab = molecule.editor.getCurrentTab(); + const tab = molecule.editor.getCurrentTab(); if (!group?.editorInstance || !tab) return; const instance = group.editorInstance; // 获取全部文本 @@ -40,7 +37,7 @@ export default class QuickExecuteAction extends BaseAction { import('monaco-sql-languages/out/esm/languageService') .then(({ LanguageService }) => { const languageService = new LanguageService(); - return languageService.parserTreeToString(tab.language!, text); + return languageService.parserTreeToString(tab.language || 'sql', text); }) .then((res) => { const pre = res?.replace(/(\(|\))/g, '$1\n'); diff --git a/website/src/extensions/actions/quickSaveAction.ts b/website/src/extensions/actions/quickSaveAction.ts index 5adbec28..11254adb 100644 --- a/website/src/extensions/actions/quickSaveAction.ts +++ b/website/src/extensions/actions/quickSaveAction.ts @@ -1,10 +1,8 @@ -// FIXME: 直接从根目录导出 -import { IMoleculeContext, KeybindingWeight } from '@dtinsight/molecule'; -import { BaseAction } from '@dtinsight/molecule/esm/glue'; +import { IMoleculeContext, KeybindingWeight, glue } from '@dtinsight/molecule'; import { KeyChord, KeyCode, KeyMod } from '@dtinsight/molecule/esm/monaco'; import * as content from '../../storage/content'; -export default class QuickSaveAction extends BaseAction { +export default class QuickSaveAction extends glue.BaseAction { static readonly ID = 'workbench.action.quickSave'; constructor(private molecule: IMoleculeContext) { diff --git a/website/src/extensions/default/index.tsx b/website/src/extensions/default/index.tsx index 83059f1f..6b1ef46a 100644 --- a/website/src/extensions/default/index.tsx +++ b/website/src/extensions/default/index.tsx @@ -26,9 +26,8 @@ export const defaultExt: IExtension = { name: 'defaultExt', contributes: { [IContributeType.Modules]: { - // FIXME: Molecule 应该支持传 null 表示不渲染某组件 - menuBar: import('../Null'), - activityBar: import('../Null'), + menuBar: null, + activityBar: null, sidebar: import('../../workbench/sidebar'), editor: import('../../workbench/editor') } @@ -40,7 +39,7 @@ export const defaultExt: IExtension = { // 默认不展示 Panel molecule.layout.setPanel(false); // 设置 sidebar 的默认值 - molecule.layout.setPaneSize(['280px', 'auto']); + // molecule.layout.setPaneSize([280, 'auto']); // 重置 toolbar molecule.editor.dispatch((draft) => { draft.toolbar = [ diff --git a/website/src/extensions/view/index.ts b/website/src/extensions/view/index.ts index 10d1d081..3a13f97b 100644 --- a/website/src/extensions/view/index.ts +++ b/website/src/extensions/view/index.ts @@ -5,13 +5,6 @@ export const viewExt: IExtension = { id: 'viewExt', name: 'viewExt', activate(molecule) { - // FIXME:如果调用了 dispose 方法这里就不需要调用了 - molecule.explorer.onCollapseChange(() => { - window.setTimeout(() => { - view.set(molecule); - }, 0); - }); - view.get().then((viewState) => { if (viewState?.explorer) { molecule.explorer.setActive(viewState.explorer.active); @@ -22,9 +15,6 @@ export const viewExt: IExtension = { }); }, dispose(molecule) { - // FIXME: Molecule 的实例调用 dispose 应该把每一个插件的 dispose 方法都调用一次 - // window.setTimeout(() => { - // view.set(molecule); - // }, 0); + view.set(molecule); } }; diff --git a/website/src/workbench/editor/index.tsx b/website/src/workbench/editor/index.tsx index ad61a3c4..8dd79533 100644 --- a/website/src/workbench/editor/index.tsx +++ b/website/src/workbench/editor/index.tsx @@ -19,11 +19,12 @@ export default function Editor({ onMount, onModelMount, onToolbarClick }: IEdito const tab = group?.data.find(utils.searchById(group.activeTab)); return ( - + {tab ? ( ) : ( - editor.entry || + editor.entry || )} ); diff --git a/website/src/workbench/powerBy/index.tsx b/website/src/workbench/powerBy/index.tsx index ee630142..9321bdbd 100644 --- a/website/src/workbench/powerBy/index.tsx +++ b/website/src/workbench/powerBy/index.tsx @@ -26,7 +26,7 @@ export default function PoweredBy() { return ( <> - + {createPortal( e.target === e.currentTarget && setOpen(false)}> @@ -52,13 +52,13 @@ export default function PoweredBy() { - setOpen(false)} size="large" > 确认 - + , diff --git a/website/src/workbench/tab/index.tsx b/website/src/workbench/tab/index.tsx index e31c53a1..2ef7a2db 100644 --- a/website/src/workbench/tab/index.tsx +++ b/website/src/workbench/tab/index.tsx @@ -13,6 +13,7 @@ interface ITabProps 'onMount' | 'onModelMount' | 'onToolbarClick' > { data: IEditorTab; + instance?: editor.IStandaloneCodeEditor; groupId: UniqueId; options: editor.IEditorOptions; toolbar: IMenuItemProps[]; @@ -22,6 +23,7 @@ export default function Tab({ data, groupId, toolbar, + instance, options, onModelMount, onMount, @@ -93,10 +95,10 @@ export default function Tab({
- <components.icon.default type={icon} /> + <components.Icon type={icon} /> <Name ref={ref}> {edit.editing ? ( - <components.input.Input + <components.Input autoFocus value={edit.data} onChange={edit.dispatch} @@ -109,21 +111,22 @@ export default function Tab({ </Text> )} </Name> - {data.modified && <components.icon.default type="primitive-dot" />} + {data.modified && <components.Icon type="primitive-dot" />} - onToolbarClick?.(item, groupId)} />
- void; onContextMenu: (pos: IPosition, treeNode: TreeNode) => void; } @@ -26,16 +26,16 @@ export default function Tree({ id, onSelect, onCreate, onContextMenu }: ITreePro ); return ( - - + {data.length ? ( - 暂无数据 - + 点击新建 SQL 文件 - + )} - - + + ); } diff --git a/website/src/workbench/tree/styled.ts b/website/src/workbench/tree/styled.ts index edf85061..c350e6ba 100644 --- a/website/src/workbench/tree/styled.ts +++ b/website/src/workbench/tree/styled.ts @@ -15,7 +15,5 @@ export const TreeContainer = styled.div` height: 30px; font-size: 14px; gap: 6px; - - // FIXME: treenode text-overflow } `; From d18cfa2ca252d2313214eb04f918db306406a263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E8=BF=82=E8=BF=82?= Date: Thu, 29 Feb 2024 19:04:04 +0800 Subject: [PATCH 3/6] chore(website): bump monaco-editor's version to 0.31.1 --- website/package.json | 2 +- website/pnpm-lock.yaml | 10 +++++----- website/src/extensions/default/index.tsx | 2 -- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/website/package.json b/website/package.json index 4d1d5314..f9bc2d2a 100644 --- a/website/package.json +++ b/website/package.json @@ -17,7 +17,7 @@ "assert": "link:rollup-plugin-node-polyfills/polyfills/assert", "buffer": "^6.0.3", "idb-keyval": "^6.2.1", - "monaco-editor": "0.31.0", + "monaco-editor": "0.31.1", "react": "^18.2.0", "react-dom": "^18.2.0", "rollup-plugin-node-polyfills": "^0.2.1", diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml index 08985280..782a012b 100644 --- a/website/pnpm-lock.yaml +++ b/website/pnpm-lock.yaml @@ -17,7 +17,7 @@ specifiers: eslint-plugin-react-hooks: ^4.6.0 eslint-plugin-react-refresh: ^0.3.4 idb-keyval: ^6.2.1 - monaco-editor: 0.31.0 + monaco-editor: 0.31.1 react: ^18.2.0 react-dom: ^18.2.0 rollup-plugin-node-polyfills: ^0.2.1 @@ -36,7 +36,7 @@ dependencies: assert: link:rollup-plugin-node-polyfills/polyfills/assert buffer: 6.0.3 idb-keyval: 6.2.1 - monaco-editor: 0.31.0 + monaco-editor: 0.31.1 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 rollup-plugin-node-polyfills: 0.2.1 @@ -310,7 +310,7 @@ packages: '@vscode/codicons': 0.0.33 immer: 10.0.3 lodash-es: 4.17.21 - monaco-editor: 0.31.0 + monaco-editor: 0.31.1 normalize.css: 8.0.1 rc-dropdown: 4.1.0_react-dom@18.2.0+react@18.2.0 rc-menu: 9.12.4_react-dom@18.2.0+react@18.2.0 @@ -2287,8 +2287,8 @@ packages: engines: {node: '>=0.10.0'} dev: false - /monaco-editor/0.31.0: - resolution: {integrity: sha512-H3QmysEwxxY8oxmFhIFcY9JkuwilUDa6txdAxb797cVr7XFZX27a3SDwcGJmTlV9iGPwdh132r3KKCS5aNL4Gg==} + /monaco-editor/0.31.1: + resolution: {integrity: sha512-FYPwxGZAeP6mRRyrr5XTGHD9gRXVjy7GUzF4IPChnyt3fS5WrNxIkS8DNujWf6EQy0Zlzpxw8oTVE+mWI2/D1Q==} dev: false /ms/2.1.2: diff --git a/website/src/extensions/default/index.tsx b/website/src/extensions/default/index.tsx index 6b1ef46a..b49b9b11 100644 --- a/website/src/extensions/default/index.tsx +++ b/website/src/extensions/default/index.tsx @@ -38,8 +38,6 @@ export const defaultExt: IExtension = { }); // 默认不展示 Panel molecule.layout.setPanel(false); - // 设置 sidebar 的默认值 - // molecule.layout.setPaneSize([280, 'auto']); // 重置 toolbar molecule.editor.dispatch((draft) => { draft.toolbar = [ From f46486e2380bb248c16c098df54fa1e9cc526dee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E8=BF=82=E8=BF=82?= Date: Thu, 29 Feb 2024 19:29:51 +0800 Subject: [PATCH 4/6] feat: improve custom event --- website/src/components/space/index.tsx | 10 +++++++ website/src/components/space/styled.tsx | 8 ++++++ website/src/const/index.ts | 2 +- website/src/extensions/default/index.tsx | 33 +++++++++++++++++------- website/src/workbench/editor/index.tsx | 10 ++++++- website/src/workbench/tab/index.tsx | 9 +++---- 6 files changed, 55 insertions(+), 17 deletions(-) create mode 100644 website/src/components/space/index.tsx create mode 100644 website/src/components/space/styled.tsx diff --git a/website/src/components/space/index.tsx b/website/src/components/space/index.tsx new file mode 100644 index 00000000..0de27fe9 --- /dev/null +++ b/website/src/components/space/index.tsx @@ -0,0 +1,10 @@ +import { PropsWithChildren } from 'react'; +import { Container } from './styled'; + +interface ISpaceProps { + size?: number; +} + +export default function Space({ children, size = 8 }: PropsWithChildren) { + return {children}; +} diff --git a/website/src/components/space/styled.tsx b/website/src/components/space/styled.tsx new file mode 100644 index 00000000..74bd6e5b --- /dev/null +++ b/website/src/components/space/styled.tsx @@ -0,0 +1,8 @@ +import styled from 'styled-components'; + +export const Container = styled.div<{ gap: number }>` + display: flex; + align-items: center; + justify-content: center; + gap: ${({ gap }) => `${gap}px`}; +`; diff --git a/website/src/const/index.ts b/website/src/const/index.ts index a0ef9502..197f2415 100644 --- a/website/src/const/index.ts +++ b/website/src/const/index.ts @@ -23,5 +23,5 @@ export const POWERED_BY = 'powered.by'; export const DELETE_TASK_ID = 'delete.task.id'; export const EVENTS = { - UPDATE_NAME: 'update.name' + EDITOR_UPDATE_NAME: 'editor.update.name' } as const; diff --git a/website/src/extensions/default/index.tsx b/website/src/extensions/default/index.tsx index b49b9b11..739a9096 100644 --- a/website/src/extensions/default/index.tsx +++ b/website/src/extensions/default/index.tsx @@ -1,4 +1,11 @@ -import { IContributeType, IEditorTab, IExtension, UniqueId, utils } from '@dtinsight/molecule'; +import { + IContributeType, + IEditorTab, + IExtension, + UniqueId, + utils, + components +} from '@dtinsight/molecule'; import { CREATE_TASK_ID, DELETE_TASK_ID, @@ -20,6 +27,7 @@ import { subscribe } from '../../storage/tmp'; import { LanguageIdEnum } from 'monaco-sql-languages/out/esm/main.js'; import PoweredBy from '../../workbench/powerBy'; import QuickExecuteAction from '../actions/quickExecuteAction'; +import Space from '../../components/space'; export const defaultExt: IExtension = { id: 'defaultExt', @@ -75,7 +83,13 @@ export const defaultExt: IExtension = { (key) => ({ id: key, - name: key, + // FIXME: Should Support ReactNode + name: ( + + + {key} + + ) as any, toolbar: [ { id: CREATE_TASK_ID, @@ -133,6 +147,12 @@ export const defaultExt: IExtension = { } }); + molecule.editor.onClose((tabs) => { + tabs.forEach((tab) => { + content.set(tab.id as string, tab.value || ''); + }); + }); + molecule.contextMenu.onClick((item) => { const scope = molecule.contextMenu.getScope<{ id: LanguageIdEnum; treeId: UniqueId }>(); switch (item.id) { @@ -163,8 +183,7 @@ export const defaultExt: IExtension = { } }); - // FIXME:MOLECULE 应该支持自定义事件 - subscribe(EVENTS.UPDATE_NAME, (value: string) => { + molecule.editor.subscribe(EVENTS.EDITOR_UPDATE_NAME, (value: string) => { const tab = molecule.editor.getCurrentTab(); const groupId = molecule.editor.getCurrent(); if (tab && groupId) { @@ -179,11 +198,6 @@ export const defaultExt: IExtension = { } }); - // FIXME: Molecule 应该支持 closeTab 的事件 - function onCloseTab(tab: IEditorTab) { - content.set(tab.id as string, tab.value || ''); - } - async function create(key: LanguageIdEnum) { const id = new Date().valueOf().toString(); const name = `默认_${key}_任务`; @@ -222,7 +236,6 @@ export const defaultExt: IExtension = { function closeCurrentTab() { const tab = molecule.editor.getCurrentTab(); if (tab) { - onCloseTab(tab); molecule.editor.closeTab(tab.id, molecule.editor.getCurrentGroup()!.id); } } diff --git a/website/src/workbench/editor/index.tsx b/website/src/workbench/editor/index.tsx index 8dd79533..29703f43 100644 --- a/website/src/workbench/editor/index.tsx +++ b/website/src/workbench/editor/index.tsx @@ -3,8 +3,9 @@ import { Container } from './styled'; import Tab from '../tab'; import { useMemo } from 'react'; import { IEditorController } from '@dtinsight/molecule/esm/controllers/editor'; +import { EVENTS } from '../../const'; -export default function Editor({ onMount, onModelMount, onToolbarClick }: IEditorController) { +export default function Editor({ onMount, onModelMount, onToolbarClick, emit }: IEditorController) { const editor = hooks.useConnector('editor'); const settings = hooks.useSettings(); const options = useMemo( @@ -17,6 +18,12 @@ export default function Editor({ onMount, onModelMount, onToolbarClick }: IEdito const group = editor.groups.find(utils.searchById(editor.current)); const tab = group?.data.find(utils.searchById(group.activeTab)); + + const handleSubmit = (taskName: string) => { + // 借助 controller 的 emit 事件触发订阅事件 + emit(EVENTS.EDITOR_UPDATE_NAME, taskName); + }; + return ( @@ -30,6 +37,7 @@ export default function Editor({ onMount, onModelMount, onToolbarClick }: IEdito onMount={onMount} onModelMount={onModelMount} onToolbarClick={onToolbarClick} + onSubmit={handleSubmit} /> ) : ( editor.entry || diff --git a/website/src/workbench/tab/index.tsx b/website/src/workbench/tab/index.tsx index 2ef7a2db..58165bd7 100644 --- a/website/src/workbench/tab/index.tsx +++ b/website/src/workbench/tab/index.tsx @@ -3,8 +3,6 @@ import { Actions, Container, EditorWrapper, Header, Name, Text, Title } from './ import { editor } from 'monaco-editor'; import { createElement, useEffect, useMemo, useRef } from 'react'; import useEdit from '../../hooks/useEdit'; -import { emit } from '../../storage/tmp'; -import { EVENTS } from '../../const'; import { helper } from '../../components/icon/helper'; interface ITabProps @@ -17,6 +15,7 @@ interface ITabProps groupId: UniqueId; options: editor.IEditorOptions; toolbar: IMenuItemProps[]; + onSubmit?: (taskName: string) => void; } export default function Tab({ @@ -27,7 +26,8 @@ export default function Tab({ options, onModelMount, onMount, - onToolbarClick + onToolbarClick, + onSubmit }: ITabProps) { const edit = useEdit(); const ref = useRef(null); @@ -63,12 +63,11 @@ export default function Tab({ }; const handleSubmit = () => { - // FIXME: Molecule 应该支持把事件抛出去 edit.stop(); if (ref.current) { ref.current.style.removeProperty('width'); } - emit(EVENTS.UPDATE_NAME, edit.data); + onSubmit?.(edit.data); }; const handleEdit = () => { From bffeabc4d83747d6650676b9786bd250f8c275bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E8=BF=82=E8=BF=82?= Date: Thu, 29 Feb 2024 19:32:21 +0800 Subject: [PATCH 5/6] feat: remove tmp storage --- website/src/extensions/default/index.tsx | 10 +--------- website/src/storage/tmp/index.ts | 16 ---------------- 2 files changed, 1 insertion(+), 25 deletions(-) delete mode 100644 website/src/storage/tmp/index.ts diff --git a/website/src/extensions/default/index.tsx b/website/src/extensions/default/index.tsx index 739a9096..1ef72e4d 100644 --- a/website/src/extensions/default/index.tsx +++ b/website/src/extensions/default/index.tsx @@ -1,11 +1,4 @@ -import { - IContributeType, - IEditorTab, - IExtension, - UniqueId, - utils, - components -} from '@dtinsight/molecule'; +import { IContributeType, IExtension, UniqueId, utils, components } from '@dtinsight/molecule'; import { CREATE_TASK_ID, DELETE_TASK_ID, @@ -23,7 +16,6 @@ import * as task from '../../storage/task'; import { TreeNodeModel } from '@dtinsight/molecule/esm/utils/tree'; import Language from '../../workbench/language'; import Path from '../../workbench/path'; -import { subscribe } from '../../storage/tmp'; import { LanguageIdEnum } from 'monaco-sql-languages/out/esm/main.js'; import PoweredBy from '../../workbench/powerBy'; import QuickExecuteAction from '../actions/quickExecuteAction'; diff --git a/website/src/storage/tmp/index.ts b/website/src/storage/tmp/index.ts deleted file mode 100644 index 9147f14d..00000000 --- a/website/src/storage/tmp/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-types */ -import EventEmitter from '@dtinsight/molecule/esm/glue/eventEmitter'; - -const ee = new EventEmitter(); - -export function emit(name: string, ...args: any) { - ee.emit(name, ...args); -} - -export function subscribe(name: string, listener: Function) { - ee.subscribe(name, listener); -} - -export function unsubscribe(name: string, listener: Function) { - ee.unsubscribe(name, listener); -} From 5d37578fb2e2ac4ceab001fb93a6085f24e912c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E8=BF=82=E8=BF=82?= Date: Fri, 1 Mar 2024 17:31:48 +0800 Subject: [PATCH 6/6] feat: support Quick Github --- website/src/components/space/index.tsx | 12 ++++--- website/src/components/space/styled.tsx | 1 - website/src/const/index.ts | 2 ++ website/src/extensions/default/index.tsx | 37 ++------------------- website/src/extensions/index.ts | 3 +- website/src/extensions/status.tsx | 42 ++++++++++++++++++++++++ website/src/workbench/github/index.tsx | 15 +++++++++ 7 files changed, 71 insertions(+), 41 deletions(-) create mode 100644 website/src/extensions/status.tsx create mode 100644 website/src/workbench/github/index.tsx diff --git a/website/src/components/space/index.tsx b/website/src/components/space/index.tsx index 0de27fe9..66eca90b 100644 --- a/website/src/components/space/index.tsx +++ b/website/src/components/space/index.tsx @@ -1,10 +1,14 @@ -import { PropsWithChildren } from 'react'; +import { HTMLAttributes, PropsWithChildren } from 'react'; import { Container } from './styled'; -interface ISpaceProps { +interface ISpaceProps extends HTMLAttributes { size?: number; } -export default function Space({ children, size = 8 }: PropsWithChildren) { - return {children}; +export default function Space({ children, size = 8, ...rest }: PropsWithChildren) { + return ( + + {children} + + ); } diff --git a/website/src/components/space/styled.tsx b/website/src/components/space/styled.tsx index 74bd6e5b..56041cc4 100644 --- a/website/src/components/space/styled.tsx +++ b/website/src/components/space/styled.tsx @@ -3,6 +3,5 @@ import styled from 'styled-components'; export const Container = styled.div<{ gap: number }>` display: flex; align-items: center; - justify-content: center; gap: ${({ gap }) => `${gap}px`}; `; diff --git a/website/src/const/index.ts b/website/src/const/index.ts index 197f2415..c0262588 100644 --- a/website/src/const/index.ts +++ b/website/src/const/index.ts @@ -20,6 +20,8 @@ export const TASK_PATH = 'task.path'; export const POWERED_BY = 'powered.by'; +export const QUICK_GITHUB = 'quick.github'; + export const DELETE_TASK_ID = 'delete.task.id'; export const EVENTS = { diff --git a/website/src/extensions/default/index.tsx b/website/src/extensions/default/index.tsx index 1ef72e4d..233c7c7a 100644 --- a/website/src/extensions/default/index.tsx +++ b/website/src/extensions/default/index.tsx @@ -1,23 +1,11 @@ import { IContributeType, IExtension, UniqueId, utils, components } from '@dtinsight/molecule'; -import { - CREATE_TASK_ID, - DELETE_TASK_ID, - EVENTS, - POWERED_BY, - RUN_SQL_ID, - SUPPORT_LANGUAGES, - TASK_PATH, - TASK_TYPE -} from '../../const'; +import { CREATE_TASK_ID, DELETE_TASK_ID, EVENTS, RUN_SQL_ID, SUPPORT_LANGUAGES } from '../../const'; import type { IExplorerPanelItem } from '@dtinsight/molecule/esm/models/explorer'; import Tree from '../../workbench/tree'; import * as content from '../../storage/content'; import * as task from '../../storage/task'; import { TreeNodeModel } from '@dtinsight/molecule/esm/utils/tree'; -import Language from '../../workbench/language'; -import Path from '../../workbench/path'; import { LanguageIdEnum } from 'monaco-sql-languages/out/esm/main.js'; -import PoweredBy from '../../workbench/powerBy'; import QuickExecuteAction from '../actions/quickExecuteAction'; import Space from '../../components/space'; @@ -48,28 +36,6 @@ export const defaultExt: IExtension = { } ]; }); - molecule.statusBar.add({ - id: TASK_TYPE, - name: '编辑器语言', - alignment: 'right', - sortIndex: 12, - render: () => - }); - // FIXME: 空状态不应该有宽度 - molecule.statusBar.add({ - id: TASK_PATH, - name: '路径', - alignment: 'left', - sortIndex: 2, - render: () => - }); - molecule.statusBar.add({ - id: POWERED_BY, - name: '关于', - alignment: 'left', - sortIndex: 1, - render: () => - }); const items = SUPPORT_LANGUAGES.map( (key) => @@ -82,6 +48,7 @@ export const defaultExt: IExtension = { {key} ) as any, + title: key, toolbar: [ { id: CREATE_TASK_ID, diff --git a/website/src/extensions/index.ts b/website/src/extensions/index.ts index fd8b9db2..9591603e 100644 --- a/website/src/extensions/index.ts +++ b/website/src/extensions/index.ts @@ -1,5 +1,6 @@ import { actionsExt } from './actions'; import { defaultExt } from './default'; +import { statusExt } from './status'; import { viewExt } from './view'; -export default [defaultExt, actionsExt, viewExt]; +export default [defaultExt, actionsExt, viewExt, statusExt]; diff --git a/website/src/extensions/status.tsx b/website/src/extensions/status.tsx new file mode 100644 index 00000000..39cd334e --- /dev/null +++ b/website/src/extensions/status.tsx @@ -0,0 +1,42 @@ +import { IExtension } from '@dtinsight/molecule'; +import { POWERED_BY, QUICK_GITHUB, TASK_PATH, TASK_TYPE } from '../const'; +import Language from '../workbench/language'; +import Path from '../workbench/path'; +import PoweredBy from '../workbench/powerBy'; +import QuickGithub from '../workbench/github'; + +export const statusExt: IExtension = { + id: 'statusExt', + name: 'statusExt', + activate(molecule) { + molecule.statusBar.add({ + id: TASK_TYPE, + name: '编辑器语言', + alignment: 'right', + sortIndex: 12, + render: () => + }); + // FIXME: 空状态不应该有宽度 + molecule.statusBar.add({ + id: TASK_PATH, + name: '路径', + alignment: 'left', + sortIndex: 2, + render: () => + }); + molecule.statusBar.add({ + id: POWERED_BY, + name: '关于', + alignment: 'left', + sortIndex: 1, + render: () => + }); + molecule.statusBar.add({ + id: QUICK_GITHUB, + name: 'Github', + alignment: 'right', + sortIndex: 3, + render: () => + }); + } +}; diff --git a/website/src/workbench/github/index.tsx b/website/src/workbench/github/index.tsx new file mode 100644 index 00000000..ce9a4a80 --- /dev/null +++ b/website/src/workbench/github/index.tsx @@ -0,0 +1,15 @@ +import Space from '../../components/space'; +import { components } from '@dtinsight/molecule'; + +export default function QuickGithub() { + return ( + window.open('https://github.com/DTStack/monaco-sql-languages')} + > + + Github + + ); +}