From cc43f004346cd2e37c82c25600c83004e8f96354 Mon Sep 17 00:00:00 2001 From: sunshinesmilelk <1176136681@qq.com> Date: Fri, 7 Feb 2025 23:00:04 +0800 Subject: [PATCH] chore: add archive --- .eslintignore | 1 + .prettierignore | 1 + .../libro-sample-umi}/.npmrc | 0 .../libro-sample-umi}/.umirc.ts | 0 .../libro-sample-umi}/package-lock.json | 0 .../libro-sample-umi}/package.json | 0 .../libro-sample-umi}/src/assets/yay.jpg | Bin .../libro-sample-umi}/src/global.less | 0 .../src/modules/app.module.ts | 0 .../libro-editor-demo-cell-contribution.ts | 0 .../libro-editor-demo-cell-model.ts | 0 .../libro-editor-demo-cell-protocol.ts | 0 .../libro-editor-demo-cell-view.tsx | 0 .../libro-editor-demo-cell/module.ts | 0 .../libro-general-demo-cell/index.ts | 0 .../libro-general-demo-cell-contribution.ts | 0 .../libro-general-demo-cell-model.ts | 0 .../libro-general-demo-cell-protocol.ts | 0 .../libro-general-demo-cell-view.tsx | 0 .../libro-general-demo-cell/module.ts | 0 .../libro-command-demo-service.ts | 0 .../libro-demo-command-contribution.ts | 0 .../libro-command/libro-demo-command.ts | 0 .../src/modules/libro-command/module.ts | 0 .../src/modules/libro-editor/app.ts | 0 .../libro-content-contribution.ts | 0 .../src/modules/libro-editor/libro-demo.json | 0 .../src/modules/libro-editor/module.ts | 0 .../libro-demo-keybind-command.ts | 0 .../libro-demo-keybind-contribution.ts | 0 .../src/modules/libro-keybind/module.ts | 0 .../src/modules/libro-lab/app.ts | 0 .../src/modules/libro-lab/module.ts | 0 .../libro-demo-toolbar-commands.ts | 0 .../libro-demo-toolbar-contribution.ts | 0 .../src/modules/libro-toolbar/module.ts | 0 .../libro-sample-umi}/src/pages/docs.tsx | 0 .../libro-sample-umi}/src/pages/index.tsx | 0 .../src/pages/libro-cell/index.less | 0 .../src/pages/libro-cell/index.tsx | 0 .../src/pages/libro-command/index.less | 0 .../src/pages/libro-command/index.tsx | 0 .../libro-command/libro-command-demo.tsx | 0 .../src/pages/libro-editor/index.tsx | 0 .../src/pages/libro-editor/libro-editor.tsx | 0 .../src/pages/libro-keybind/index.tsx | 0 .../libro-keybind/libro-keybind-demo.tsx | 0 .../src/pages/libro-lab/index.less | 0 .../src/pages/libro-lab/index.tsx | 0 .../src/pages/libro-toolbar/index.tsx | 0 .../src/pages/libro-toolbar/libro-toolbar.tsx | 0 .../libro-sample-umi}/tsconfig.json | 0 .../libro-sample-umi}/typings.d.ts | 0 .../libro-server}/.python-version | 0 .../libro-server}/.vscode/settings.json | 0 .../libro-server}/CONTRIBUTING.md | 0 .../libro-server}/Dockerfile | 0 .../libro-server}/README.md | 0 .../docker/jupyter_server_config.py | 0 .../libro-server}/docker/start.sh | 0 .../examples/Lenna_(test_image).png | Bin .../examples/Magics_and_rpy2.ipynb | 0 .../examples/OutputExamples.ipynb | 0 .../libro-server}/examples/Python.ipynb | 0 .../libro-server}/examples/execute.ipynb | 0 .../libro-server}/examples/libro.ipynb | 0 .../libro-server}/examples/llm.ipynb | 0 .../libro-server}/examples/main.py | 0 .../examples/parameterized.ipynb | 0 .../libro-server}/examples/pyproject.toml | 0 .../examples/sql_cell_example.ipynb | 0 .../examples/sql_cell_example_en.ipynb | 0 .../libro-server}/lab/.editorconfig | 0 .../libro-server}/lab/.gitignore | 0 .../libro-server}/lab/.prettierignore | 0 .../libro-server}/lab/.prettierrc.json | 0 .../libro-server}/lab/.stylelintignore | 0 .../libro-server}/lab/.stylelintrc | 0 .../libro-server}/lab/.umirc.ts | 0 .../libro-server}/lab/README.md | 0 .../libro-server}/lab/dumi-plugin-nodenext.ts | 0 .../libro-server}/lab/package.json | 0 .../libro-server}/lab/routes.ts | 0 .../libro-server}/lab/src/app.ts | 0 .../lab/src/modules/app.module.ts | 0 .../libro-server}/lab/src/pages/dbgpt/app.ts | 0 .../lab/src/pages/dbgpt/dbgbt-layout.tsx | 0 .../dbgpt/dbgpt-current-file-footer-view.tsx | 0 .../src/pages/dbgpt/dbgpt-welcome-view.tsx | 0 .../lab/src/pages/dbgpt/index.less | 0 .../lab/src/pages/dbgpt/index.tsx | 0 .../lab/src/pages/dbgpt/logo.tsx | 0 .../lab/src/pages/dbgpt/prompt-script.ts | 0 .../dbgpt/schema-form-widget/contribution.ts | 0 .../pages/dbgpt/schema-form-widget/index.less | 0 .../pages/dbgpt/schema-form-widget/index.ts | 0 .../pages/dbgpt/schema-form-widget/view.tsx | 0 .../lab/src/pages/execution/app.ts | 0 .../pages/execution/default-dnd-content.tsx | 0 .../pages/execution/dnd-cell-item-render.tsx | 0 .../src/pages/execution/execution-file.tsx | 0 .../src/pages/execution/execution-view.tsx | 0 .../lab/src/pages/execution/index.less | 0 .../lab/src/pages/execution/index.tsx | 0 .../lab/src/pages/execution/layout.tsx | 0 .../src/pages/execution/libro-app-view.tsx | 0 .../lab/src/pages/interaction/app.ts | 0 .../pages/interaction/default-dnd-content.tsx | 0 .../interaction/dnd-cell-item-render.tsx | 0 .../src/pages/interaction/execution-file.tsx | 0 .../src/pages/interaction/execution-view.tsx | 0 .../lab/src/pages/interaction/index.less | 0 .../lab/src/pages/interaction/index.tsx | 0 .../lab/src/pages/interaction/layout.tsx | 0 .../src/pages/interaction/libro-app-view.tsx | 0 .../libro-server}/lab/src/pages/libro/app.ts | 0 .../lab/src/pages/libro/index.less | 0 .../lab/src/pages/libro/index.tsx | 0 .../lab/src/pages/libro/libro-config.ts | 0 .../lab/src/pages/libro/prompt-script.ts | 0 .../libro/schema-form-widget/contribution.ts | 0 .../pages/libro/schema-form-widget/index.less | 0 .../pages/libro/schema-form-widget/index.ts | 0 .../pages/libro/schema-form-widget/view.tsx | 0 .../libro-server}/lab/tsconfig.json | 0 .../libro-server}/lab/typings.d.ts | 0 .../libro-server}/lab/typings/index.d.ts | 0 .../libro-server}/lab/umi-plugin-router.ts | 0 .../libro-server}/libro-ai/.gitignore | 0 .../libro-server}/libro-ai/.python-version | 0 .../libro-server}/libro-ai/README.md | 0 .../libro-server}/libro-ai/pyproject.toml | 0 .../libro-ai/src/libro_ai/__init__.py | 0 .../libro-ai/src/libro_ai/_version.py | 0 .../libro-ai/src/libro_ai/chat/__init__.py | 0 .../src/libro_ai/chat/chat_message.py | 0 .../libro-ai/src/libro_ai/chat/chat_record.py | 0 .../src/libro_ai/chat/debug_executor.py | 0 .../src/libro_ai/chat/debug_provider.py | 0 .../libro-ai/src/libro_ai/chat/executor.py | 0 .../src/libro_ai/chat/interpreter_executor.py | 0 .../src/libro_ai/chat/interpreter_provider.py | 0 .../libro-ai/src/libro_ai/chat/item.py | 0 .../src/libro_ai/chat/langchain_variable.py | 0 .../chat/langchain_variable_executor.py | 0 .../libro-ai/src/libro_ai/chat/object.py | 0 .../src/libro_ai/chat/object_manager.py | 0 .../src/libro_ai/chat/openai_chat_executor.py | 0 .../src/libro_ai/chat/openai_chat_provider.py | 0 .../libro-ai/src/libro_ai/chat/provider.py | 0 .../src/libro_ai/chat/qwen_chat_executor.py | 0 .../src/libro_ai/chat/qwen_chat_provider.py | 0 .../libro-ai/src/libro_ai/chat/source.py | 0 .../libro-ai/src/libro_ai/chat/utils.py | 0 .../libro-ai/src/libro_ai/extensions.py | 0 .../libro-ai/src/libro_ai/magics/__init__.py | 0 .../libro-ai/src/libro_ai/magics/exception.py | 0 .../src/libro_ai/magics/prompt_magic.py | 0 .../libro-ai/src/libro_ai/utils/__init__.py | 0 .../libro-ai/src/libro_ai/utils/base.py | 0 .../libro-ai/src/libro_ai/utils/inspector.py | 0 .../libro-ai/src/libro_ai/utils/langchain.py | 0 .../libro-server}/libro-core/.gitignore | 0 .../libro-server}/libro-core/.python-version | 0 .../libro-server}/libro-core/README.md | 0 .../libro-server}/libro-core/pyproject.toml | 0 .../libro-core/src/libro_core/__init__.py | 0 .../libro-core/src/libro_core/_version.py | 0 .../libro-core/src/libro_core/config.py | 0 .../libro-server}/libro-flow/.gitignore | 0 .../libro-server}/libro-flow/.python-version | 0 .../libro-server}/libro-flow/README.md | 0 .../libro-server}/libro-flow/pyproject.toml | 0 .../libro-flow/src/libro_flow/__init__.py | 0 .../libro-flow/src/libro_flow/_version.py | 0 .../src/libro_flow/execution_handler.py | 0 .../libro-flow/src/libro_flow/libro_client.py | 0 .../src/libro_flow/libro_execution.py | 0 .../libro_flow/libro_schema_form_widget.py | 0 .../libro-server}/libro-server/.gitignore | 0 .../libro-server}/libro-server/.npmrc | 0 .../libro-server/.python-version | 0 .../libro-server}/libro-server/README.md | 0 .../libro-server}/libro-server/package.json | 0 .../libro-server}/libro-server/pyproject.toml | 0 .../src/dev-config/jupyter_server_config.py | 0 .../libro-server/src/libro_server/__init__.py | 0 .../libro-server/src/libro_server/_version.py | 0 .../libro-server/src/libro_server/app.py | 0 .../src/libro_server/entrypoint.py | 0 .../src/libro_server/generate_libro_config.py | 0 .../src/libro_server/jupyter_config.py | 0 .../src/libro_server/libro_ai_handler.py | 0 .../src/libro_server/libro_kernel_manager.py | 0 .../src/libro_server/static_handler.py | 0 .../src/libro_server/templates/error.html | 0 .../src/libro_server/templates/libro.html | 0 .../src/libro_server/templates/page.html | 0 .../src/libro_server/workspace_handler.py | 0 .../libro-server}/libro-sql/.gitignore | 0 .../libro-server}/libro-sql/.python-version | 0 .../libro-server}/libro-sql/README.md | 0 .../libro-server}/libro-sql/pyproject.toml | 0 .../libro-sql/src/libro_sql/__init__.py | 0 .../libro-sql/src/libro_sql/_version.py | 0 .../libro-sql/src/libro_sql/database.py | 0 .../libro-sql/src/libro_sql/exception.py | 0 .../libro-sql/src/libro_sql/extensions.py | 0 .../libro-sql/src/libro_sql/sql_magic.py | 0 .../libro-server}/libro/.gitignore | 0 .../libro-server}/libro/.python-version | 0 .../libro-server}/libro/README.md | 0 .../libro-server}/libro/pyproject.toml | 0 .../libro-server}/libro/src/libro/__init__.py | 0 .../libro-server}/libro/src/libro/_version.py | 0 .../libro-server}/pyproject.toml | 0 .../libro-server}/requirements-dev.lock | 0 .../libro-server}/requirements.lock | 0 .../opensumi-module-libro}/.dumirc.ts | 0 .../opensumi-module-libro}/.editorconfig | 0 .../opensumi-module-libro}/.eslintignore | 0 .../opensumi-module-libro}/.eslintrc.js | 0 .../opensumi-module-libro}/.fatherrc.ts | 0 .../opensumi-module-libro}/.husky/commit-msg | 0 .../opensumi-module-libro}/.husky/pre-commit | 0 .../opensumi-module-libro}/.node-version | 0 .../opensumi-module-libro}/.npmrc | 0 .../opensumi-module-libro}/.prettierignore | 0 .../opensumi-module-libro}/.prettierrc.js | 0 .../opensumi-module-libro}/.stylelintignore | 0 .../opensumi-module-libro}/.stylelintrc | 0 .../.vscode/launch.json | 0 .../.vscode/settings.json | 0 .../opensumi-module-libro}/LICENSE | 0 .../opensumi-module-libro}/README.md | 0 .../opensumi-module-libro}/assets/arch.png | Bin .../opensumi-module-libro}/assets/image.png | Bin .../opensumi-module-libro}/docs/guide.md | 0 .../opensumi-module-libro}/docs/index.md | 0 .../docs/opensumi-demo-app/index.md | 0 .../docker/productionDependencies.json | 0 .../example/configs/webpack.browser.config.js | 0 .../configs/webpack.ext-host.config.js | 0 .../example/configs/webpack.node.config.js | 0 .../example/configs/webpack.webview.config.js | 0 .../configs/webpack.worker-host.config.js | 0 .../example/notebook.ipynb | 0 .../example/public/index.html | 0 .../example/src/browser/common-modules.ts | 0 .../example/src/browser/i18n/en-US.lang.ts | 0 .../example/src/browser/i18n/index.ts | 0 .../example/src/browser/i18n/setup.ts | 0 .../example/src/browser/i18n/zh-CN.lang.ts | 0 .../example/src/browser/index.ts | 0 .../example/src/browser/mana-application.tsx | 0 .../example/src/browser/mana/demo-module.ts | 0 .../src/browser/mana/libro-application.ts | 0 .../example/src/browser/mana/test.json | 0 .../example/src/browser/render-app.ts | 0 .../status-bar/status-bar.contribution.ts | 0 .../example/src/browser/styles.less | 0 .../example/src/extension/ext-host.js | 0 .../example/src/node/common-modules.ts | 0 .../example/src/node/index.ts | 0 .../example/src/node/start-server.ts | 0 .../example/templates/index.html | 0 .../opensumi-module-libro}/example/test.ipynb | 0 .../example/tsconfig.json | 0 .../example/workspace/fakeDB.jsonconfig | 0 .../example/workspace/index.antd-theme | 0 .../example/workspace/notebook.ipynb | 0 .../opensumi-module-libro}/jest.setup.node.js | 0 .../opensumi-module-libro}/package.json | 0 .../scripts/download.js | 0 .../scripts/extensions.json | 0 .../src/browser/index.ts | 0 .../collapse/collapse-content.tsx | 0 .../browser/kernel-panel/collapse/icon.tsx | 0 .../browser/kernel-panel/collapse/index.less | 0 .../browser/kernel-panel/collapse/index.tsx | 0 .../collapse/kernel-collapse-content-item.tsx | 0 .../collapse/kernel-collapse-content.tsx | 0 .../collapse/page-collapse-content.tsx | 0 .../src/browser/kernel-panel/index.less | 0 .../src/browser/kernel-panel/index.ts | 0 .../kernel-panel/kernel-panel-view.tsx | 0 .../kernel-panel/kernel.panel.color.tokens.ts | 0 .../kernel-panel/kernel.panel.contribution.ts | 0 .../kernel-panel/kernel.panel.protocol.ts | 0 .../src/browser/libro-keybind-contribution.ts | 0 .../src/browser/libro-opener.ts | 0 .../src/browser/libro.color.tokens.ts | 0 .../src/browser/libro.command.ts | 0 .../src/browser/libro.contribution.ts | 0 .../src/browser/libro.module.less | 0 .../src/browser/libro.protocol.ts | 0 .../src/browser/libro.service.ts | 0 .../src/browser/libro.view.tracker.ts | 0 .../src/browser/libro.view.tsx | 0 .../notebook-document-content-provider.ts | 0 .../src/browser/notebook.service.ts | 0 .../src/browser/toc/index.ts | 0 .../src/browser/toc/toc.contribution.ts | 0 .../src/browser/toc/toc.module.less | 0 .../src/browser/toc/toc.panel.color.tokens.ts | 0 .../src/browser/toc/toc.panel.tsx | 0 .../src/common/index.ts | 0 .../opensumi-module-libro}/src/index.ts | 0 .../src/mana/editor/editor-contribution.ts | 0 .../src/mana/editor/index.less | 0 .../src/mana/editor/keybind-handler.ts | 0 .../src/mana/editor/module.ts | 0 .../src/mana/editor/opensumi-editor.ts | 0 .../opensumi-module-libro}/src/mana/index.ts | 0 .../libro-opensumi-content-contribution.ts | 0 ...ibro-opensumi-save-content-contribution.ts | 0 .../src/mana/mana-module.ts | 0 .../opensumi-module-libro}/tsconfig.json | 0 .../typings/style/index.d.ts | 0 .../opensumi-module-libro}/workspace/test.py | 0 .../umi-plugin-mana/.eslintrc.js | 0 .../umi-plugin-mana/.fatherrc.ts | 0 .../umi-plugin-mana/CHANGELOG.md | 0 .../umi-plugin-mana/README.md | 0 .../umi-plugin-mana}/babel.config.json | 0 .../umi-plugin-mana/jest.config.js | 0 .../umi-plugin-mana/package.json | 0 .../umi-plugin-mana/src/decorator.ts | 0 .../umi-plugin-mana/src/index.spec.ts | 0 .../umi-plugin-mana/src/index.ts | 0 .../umi-plugin-mana/src/mana-runtime.ts | 0 .../umi-plugin-mana/src/nodenext.ts | 0 .../umi-plugin-mana/src/router-base.ts | 0 .../umi-plugin-mana/tsconfig.json | 0 libro-server/lab/.eslintignore | 7 - libro-server/lab/.eslintrc.json | 3 - mana/.changeset/README.md | 8 - mana/.changeset/config.json | 12 - mana/.commitlintrc.js | 1 - mana/.editorconfig | 14 - mana/.eslintignore | 11 - mana/.eslintrc.js | 97 -- mana/.eslintrc.node.js | 7 - mana/.gitattributes | 46 - mana/.husky/commit-msg | 4 - mana/.husky/pre-commit | 10 - mana/.lintstagedrc.js | 5 - mana/.npmrc | 10 - mana/.prettierignore | 28 - mana/.prettierrc.json | 14 - mana/.stylelintignore | 2 - mana/.stylelintrc | 9 - mana/.vscode/cspell.json | 13 - mana/.vscode/extensions.json | 9 - mana/.vscode/launch.json | 63 - mana/.vscode/settings.json | 112 -- mana/CONTRIBUTING.md | 11 - mana/LEGAL.md | 7 - mana/LICENSE | 21 - mana/README.md | 47 - mana/README.zh-CN.md | 47 - .../theme/componets/banner/background.png | Bin 129776 -> 0 bytes .../.dumi/theme/componets/banner/index.less | 286 ---- .../.dumi/theme/componets/banner/index.tsx | 67 - .../.dumi/theme/componets/title/index.less | 9 - .../.dumi/theme/componets/title/index.tsx | 18 - .../.dumi/theme/lang/bundle.l10n.en-US.json | 10 - .../.dumi/theme/lang/bundle.l10n.zh-CN.json | 10 - mana/apps/docs/.dumi/theme/lang/index.ts | 9 - .../docs/.dumi/theme/layouts/DocLayout.less | 27 - .../docs/.dumi/theme/layouts/DocLayout.tsx | 43 - mana/apps/docs/.dumi/theme/modules/github.ts | 23 - mana/apps/docs/.dumi/theme/modules/module.ts | 14 - .../docs/.dumi/theme/slots/Footer/index.less | 112 -- .../docs/.dumi/theme/slots/Footer/index.tsx | 59 - .../.dumi/theme/slots/Header/default.less | 112 -- .../docs/.dumi/theme/slots/Header/index.less | 112 -- .../docs/.dumi/theme/slots/Header/index.tsx | 171 -- mana/apps/docs/.dumi/theme/styles/heti.less | 1119 -------------- mana/apps/docs/.dumi/theme/styles/utils.less | 76 - .../docs/.dumi/theme/styles/variables.less | 39 - mana/apps/docs/.dumi/theme/tailwind.out.css | 1369 ----------------- mana/apps/docs/.dumi/tsconfig.json | 4 - mana/apps/docs/.dumirc.ts | 70 - mana/apps/docs/.eslintrc.mjs | 3 - mana/apps/docs/CHANGELOG.md | 384 ----- .../docs/docs/examples/application-react.md | 8 - .../docs/examples/application-react.zh-CN.md | 8 - mana/apps/docs/docs/examples/command.md | 31 - mana/apps/docs/docs/examples/command.zh-CN.md | 30 - mana/apps/docs/docs/examples/file-tree.md | 9 - .../docs/docs/examples/file-tree.zh-CN.md | 9 - mana/apps/docs/docs/examples/keybind.md | 28 - mana/apps/docs/docs/examples/keybind.zh-CN.md | 28 - mana/apps/docs/docs/examples/menu.md | 20 - mana/apps/docs/docs/examples/menu.zh-CN.md | 20 - mana/apps/docs/docs/examples/modal.md | 17 - mana/apps/docs/docs/examples/modal.zh-CN.md | 17 - mana/apps/docs/docs/examples/modular.md | 18 - mana/apps/docs/docs/examples/modular.zh-CN.md | 18 - mana/apps/docs/docs/index.md | 5 - mana/apps/docs/docs/index.zh-CN.md | 5 - .../docs/docs/introduction/dependencies.md | 133 -- .../docs/introduction/dependencies.zh-CN.md | 140 -- mana/apps/docs/docs/introduction/index.md | 206 --- .../docs/docs/introduction/index.zh-CN.md | 209 --- mana/apps/docs/docs/introduction/layout.md | 184 --- .../docs/docs/introduction/layout.zh-CN.md | 193 --- mana/apps/docs/docs/introduction/state.md | 247 --- .../docs/docs/introduction/state.zh-CN.md | 247 --- mana/apps/docs/dumi-plugin-alias.ts | 20 - mana/apps/docs/package.json | 37 - mana/apps/docs/public/ding-qrcode.png | Bin 51724 -> 0 bytes mana/apps/docs/public/mana.svg | 82 - .../antd-menu/antd-menu-view.tsx | 34 - .../src/application-react/antd-menu/index.ts | 14 - .../command-palette/command-palette-app.ts | 148 -- .../command-palette/command-palette-view.tsx | 37 - .../command-palette/command-tab.tsx | 25 - .../command-palette/index.ts | 32 - .../content/content-view.tsx | 61 - .../content/index.module.less | 13 - .../src/application-react/content/index.ts | 7 - .../file/file-application.ts | 27 - .../file/file-open-handler.ts | 33 - .../application-react/file/file-protocol.ts | 31 - .../file/file-view/file-view.tsx | 98 -- .../file/file-view/index.module.less | 7 - .../application-react/file/file-view/index.ts | 1 - .../docs/src/application-react/file/index.ts | 21 - .../src/application-react/index.module.less | 3 - .../apps/docs/src/application-react/index.tsx | 40 - .../application-react/logo/index.module.less | 16 - .../docs/src/application-react/logo/index.ts | 15 - .../src/application-react/logo/logo-view.tsx | 26 - .../docs/src/application-react/logo/mana.svg | 82 - .../setting-editor/configs.ts | 160 -- .../default-configuration-contribution.tsx | 57 - .../application-react/setting-editor/index.ts | 21 - .../application-react/theme-switcher/index.ts | 29 - .../theme-switcher/storage-view/index.tsx | 43 - .../theme-select-view/index.module.less | 3 - .../theme-select-view/index.tsx | 63 - .../docs/src/application-react/user/index.ts | 18 - .../user/user-avatar-view/index.module.less | 3 - .../user/user-avatar-view/index.tsx | 30 - .../workbench/command/common-command.ts | 27 - .../src/application-react/workbench/index.ts | 58 - .../workbench/layout/app-layout.tsx | 32 - .../workbench/layout/index.module.less | 24 - .../workbench/layout/workbench-layout.tsx | 46 - .../workbench/menu/common-menu.ts | 31 - .../workbench/menu/mana-menubar/index.tsx | 75 - .../workbench/menu/menu-bar-view.tsx | 31 - .../workbench/menu/render.tsx | 69 - mana/apps/docs/src/command/simple/command.ts | 41 - mana/apps/docs/src/command/simple/index.tsx | 51 - .../docs/src/file-tree/file-application.ts | 27 - mana/apps/docs/src/file-tree/file-command.tsx | 104 -- mana/apps/docs/src/file-tree/file-protocol.ts | 31 - .../src/file-tree/file-view/file-view.tsx | 77 - .../docs/src/file-tree/file-view/index.less | 4 - .../docs/src/file-tree/file-view/index.ts | 1 - mana/apps/docs/src/file-tree/index.tsx | 14 - .../docs/src/file-tree/mock-file-service.ts | 106 -- mana/apps/docs/src/file-tree/module.ts | 24 - mana/apps/docs/src/keybind/context/command.ts | 83 - .../src/keybind/context/context-service.ts | 26 - mana/apps/docs/src/keybind/context/index.tsx | 81 - .../src/keybind/event-propagation/command.ts | 71 - .../src/keybind/event-propagation/index.tsx | 65 - mana/apps/docs/src/keybind/simple/command.ts | 71 - mana/apps/docs/src/keybind/simple/index.tsx | 55 - .../docs/src/menu/antd-context-menu/index.tsx | 95 -- .../docs/src/menu/antd-context-menu/menu.tsx | 120 -- .../apps/docs/src/menu/context-menu/index.tsx | 43 - mana/apps/docs/src/menu/context-menu/menu.tsx | 120 -- mana/apps/docs/src/menu/menubar/index.tsx | 25 - mana/apps/docs/src/menu/menubar/menu.tsx | 120 -- mana/apps/docs/src/modal/antd-modal/index.tsx | 27 - .../modal/antd-modal/modal-container-view.tsx | 28 - .../modal/antd-modal/modal-contribution.tsx | 32 - .../docs/src/modal/custom-modal/index.tsx | 35 - .../custom-modal/modal-container-view.tsx | 36 - .../modal/custom-modal/modal-contribution.tsx | 51 - .../modal/custom-modal/my-modal-service.tsx | 20 - mana/apps/docs/src/modular-basic/content.tsx | 81 - mana/apps/docs/src/modular-basic/index.tsx | 14 - mana/apps/docs/src/modular-basic/layout.tsx | 52 - .../apps/docs/src/modular-dynamic/content.tsx | 81 - mana/apps/docs/src/modular-dynamic/index.tsx | 38 - mana/apps/docs/src/modular-dynamic/layout.tsx | 52 - mana/apps/docs/src/typings/index.d.ts | 2 - mana/apps/docs/tsconfig.json | 11 - mana/apps/react-example/.eslintrc.json | 37 - mana/apps/react-example/.gitattributes | 3 - mana/apps/react-example/.gitignore | 89 -- mana/apps/react-example/.prettierrc | 5 - mana/apps/react-example/CHANGELOG.md | 43 - mana/apps/react-example/README.md | 9 - mana/apps/react-example/assets/icons/LICENSE | 3 - .../react-example/assets/icons/chrome.png | Bin 1334 -> 0 bytes mana/apps/react-example/assets/icons/erwt.png | Bin 3435 -> 0 bytes .../react-example/assets/icons/license.png | Bin 1020 -> 0 bytes .../react-example/assets/icons/nodejs.png | Bin 1189 -> 0 bytes .../apps/react-example/assets/icons/react.png | Bin 1053 -> 0 bytes .../react-example/assets/icons/typescript.png | Bin 2641 -> 0 bytes .../react-example/assets/icons/webpack.png | Bin 3143 -> 0 bytes .../apps/react-example/assets/images/logo.png | Bin 3435 -> 0 bytes .../assets/images/screenshot.png | Bin 31606 -> 0 bytes mana/apps/react-example/babel.config.json | 3 - mana/apps/react-example/package.json | 53 - .../src/components/Application.scss | 245 --- .../src/components/Application.tsx | 129 -- .../react-example/src/components/Icons.tsx | 19 - .../react-example/src/components/Theme.scss | 140 -- mana/apps/react-example/src/index.d.ts | 4 - mana/apps/react-example/src/index.html | 10 - mana/apps/react-example/src/main.tsx | 23 - mana/apps/react-example/src/module.ts | 5 - mana/apps/react-example/src/state.ts | 13 - .../tools/webpack/webpack.aliases.js | 13 - .../tools/webpack/webpack.config.dev.js | 29 - .../tools/webpack/webpack.config.prod.js | 39 - .../tools/webpack/webpack.helpers.js | 27 - .../tools/webpack/webpack.plugins.js | 21 - .../tools/webpack/webpack.rules.js | 51 - mana/apps/react-example/tsconfig.json | 23 - mana/apps/umi-example/.gitignore | 9 - mana/apps/umi-example/.umirc.ts | 14 - mana/apps/umi-example/CHANGELOG.md | 33 - mana/apps/umi-example/package.json | 22 - mana/apps/umi-example/src/assets/yay.jpg | Bin 180902 -> 0 bytes mana/apps/umi-example/src/layouts/index.less | 11 - mana/apps/umi-example/src/layouts/index.tsx | 19 - .../umi-example/src/modules/app.module.ts | 7 - mana/apps/umi-example/src/modules/state.ts | 7 - mana/apps/umi-example/src/pages/docs.tsx | 9 - mana/apps/umi-example/src/pages/index.tsx | 22 - mana/apps/umi-example/tsconfig.json | 6 - mana/apps/umi-example/typings.d.ts | 1 - mana/jest.config.js | 31 - mana/nx.json | 118 -- mana/package.json | 87 -- .../umi-plugin-mana/babel.config.json | 20 - mana/pnpm-workspace.yaml | 4 - mana/scripts/bootstrap.sh | 18 - mana/scripts/release-snapshot.sh | 4 - mana/tsconfig.base.json | 41 - 549 files changed, 2 insertions(+), 11858 deletions(-) rename {libro-sample-umi => archive/libro-sample-umi}/.npmrc (100%) rename {libro-sample-umi => archive/libro-sample-umi}/.umirc.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/package-lock.json (100%) rename {libro-sample-umi => archive/libro-sample-umi}/package.json (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/assets/yay.jpg (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/global.less (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/app.module.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-contribution.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-model.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-protocol.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-view.tsx (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-cell/libro-editor-demo-cell/module.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-cell/libro-general-demo-cell/index.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-contribution.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-model.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-protocol.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-view.tsx (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-cell/libro-general-demo-cell/module.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-command/libro-command-demo-service.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-command/libro-demo-command-contribution.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-command/libro-demo-command.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-command/module.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-editor/app.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-editor/libro-content-contribution.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-editor/libro-demo.json (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-editor/module.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-keybind/libro-demo-keybind-command.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-keybind/libro-demo-keybind-contribution.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-keybind/module.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-lab/app.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-lab/module.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-toolbar/libro-demo-toolbar-commands.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-toolbar/libro-demo-toolbar-contribution.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/modules/libro-toolbar/module.ts (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/docs.tsx (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/index.tsx (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/libro-cell/index.less (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/libro-cell/index.tsx (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/libro-command/index.less (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/libro-command/index.tsx (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/libro-command/libro-command-demo.tsx (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/libro-editor/index.tsx (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/libro-editor/libro-editor.tsx (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/libro-keybind/index.tsx (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/libro-keybind/libro-keybind-demo.tsx (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/libro-lab/index.less (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/libro-lab/index.tsx (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/libro-toolbar/index.tsx (100%) rename {libro-sample-umi => archive/libro-sample-umi}/src/pages/libro-toolbar/libro-toolbar.tsx (100%) rename {libro-sample-umi => archive/libro-sample-umi}/tsconfig.json (100%) rename {libro-sample-umi => archive/libro-sample-umi}/typings.d.ts (100%) rename {libro-server => archive/libro-server}/.python-version (100%) rename {libro-server => archive/libro-server}/.vscode/settings.json (100%) rename {libro-server => archive/libro-server}/CONTRIBUTING.md (100%) rename {libro-server => archive/libro-server}/Dockerfile (100%) rename {libro-server => archive/libro-server}/README.md (100%) rename {libro-server => archive/libro-server}/docker/jupyter_server_config.py (100%) rename {libro-server => archive/libro-server}/docker/start.sh (100%) rename {libro-server => archive/libro-server}/examples/Lenna_(test_image).png (100%) rename {libro-server => archive/libro-server}/examples/Magics_and_rpy2.ipynb (100%) rename {libro-server => archive/libro-server}/examples/OutputExamples.ipynb (100%) rename {libro-server => archive/libro-server}/examples/Python.ipynb (100%) rename {libro-server => archive/libro-server}/examples/execute.ipynb (100%) rename {libro-server => archive/libro-server}/examples/libro.ipynb (100%) rename {libro-server => archive/libro-server}/examples/llm.ipynb (100%) rename {libro-server => archive/libro-server}/examples/main.py (100%) rename {libro-server => archive/libro-server}/examples/parameterized.ipynb (100%) rename {libro-server => archive/libro-server}/examples/pyproject.toml (100%) rename {libro-server => archive/libro-server}/examples/sql_cell_example.ipynb (100%) rename {libro-server => archive/libro-server}/examples/sql_cell_example_en.ipynb (100%) rename {libro-server => archive/libro-server}/lab/.editorconfig (100%) rename {libro-server => archive/libro-server}/lab/.gitignore (100%) rename {libro-server => archive/libro-server}/lab/.prettierignore (100%) rename {libro-server => archive/libro-server}/lab/.prettierrc.json (100%) rename {libro-server => archive/libro-server}/lab/.stylelintignore (100%) rename {libro-server => archive/libro-server}/lab/.stylelintrc (100%) rename {libro-server => archive/libro-server}/lab/.umirc.ts (100%) rename {libro-server => archive/libro-server}/lab/README.md (100%) rename {libro-server => archive/libro-server}/lab/dumi-plugin-nodenext.ts (100%) rename {libro-server => archive/libro-server}/lab/package.json (100%) rename {libro-server => archive/libro-server}/lab/routes.ts (100%) rename {libro-server => archive/libro-server}/lab/src/app.ts (100%) rename {libro-server => archive/libro-server}/lab/src/modules/app.module.ts (100%) rename {libro-server => archive/libro-server}/lab/src/pages/dbgpt/app.ts (100%) rename {libro-server => archive/libro-server}/lab/src/pages/dbgpt/dbgbt-layout.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/dbgpt/dbgpt-current-file-footer-view.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/dbgpt/dbgpt-welcome-view.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/dbgpt/index.less (100%) rename {libro-server => archive/libro-server}/lab/src/pages/dbgpt/index.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/dbgpt/logo.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/dbgpt/prompt-script.ts (100%) rename {libro-server => archive/libro-server}/lab/src/pages/dbgpt/schema-form-widget/contribution.ts (100%) rename {libro-server => archive/libro-server}/lab/src/pages/dbgpt/schema-form-widget/index.less (100%) rename {libro-server => archive/libro-server}/lab/src/pages/dbgpt/schema-form-widget/index.ts (100%) rename {libro-server => archive/libro-server}/lab/src/pages/dbgpt/schema-form-widget/view.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/execution/app.ts (100%) rename {libro-server => archive/libro-server}/lab/src/pages/execution/default-dnd-content.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/execution/dnd-cell-item-render.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/execution/execution-file.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/execution/execution-view.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/execution/index.less (100%) rename {libro-server => archive/libro-server}/lab/src/pages/execution/index.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/execution/layout.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/execution/libro-app-view.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/interaction/app.ts (100%) rename {libro-server => archive/libro-server}/lab/src/pages/interaction/default-dnd-content.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/interaction/dnd-cell-item-render.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/interaction/execution-file.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/interaction/execution-view.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/interaction/index.less (100%) rename {libro-server => archive/libro-server}/lab/src/pages/interaction/index.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/interaction/layout.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/interaction/libro-app-view.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/libro/app.ts (100%) rename {libro-server => archive/libro-server}/lab/src/pages/libro/index.less (100%) rename {libro-server => archive/libro-server}/lab/src/pages/libro/index.tsx (100%) rename {libro-server => archive/libro-server}/lab/src/pages/libro/libro-config.ts (100%) rename {libro-server => archive/libro-server}/lab/src/pages/libro/prompt-script.ts (100%) rename {libro-server => archive/libro-server}/lab/src/pages/libro/schema-form-widget/contribution.ts (100%) rename {libro-server => archive/libro-server}/lab/src/pages/libro/schema-form-widget/index.less (100%) rename {libro-server => archive/libro-server}/lab/src/pages/libro/schema-form-widget/index.ts (100%) rename {libro-server => archive/libro-server}/lab/src/pages/libro/schema-form-widget/view.tsx (100%) rename {libro-server => archive/libro-server}/lab/tsconfig.json (100%) rename {libro-server => archive/libro-server}/lab/typings.d.ts (100%) rename {libro-server => archive/libro-server}/lab/typings/index.d.ts (100%) rename {libro-server => archive/libro-server}/lab/umi-plugin-router.ts (100%) rename {libro-server => archive/libro-server}/libro-ai/.gitignore (100%) rename {libro-server => archive/libro-server}/libro-ai/.python-version (100%) rename {libro-server => archive/libro-server}/libro-ai/README.md (100%) rename {libro-server => archive/libro-server}/libro-ai/pyproject.toml (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/__init__.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/_version.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/__init__.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/chat_message.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/chat_record.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/debug_executor.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/debug_provider.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/executor.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/interpreter_executor.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/interpreter_provider.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/item.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/langchain_variable.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/langchain_variable_executor.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/object.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/object_manager.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/openai_chat_executor.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/openai_chat_provider.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/provider.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/qwen_chat_executor.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/qwen_chat_provider.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/source.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/chat/utils.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/extensions.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/magics/__init__.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/magics/exception.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/magics/prompt_magic.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/utils/__init__.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/utils/base.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/utils/inspector.py (100%) rename {libro-server => archive/libro-server}/libro-ai/src/libro_ai/utils/langchain.py (100%) rename {libro-server => archive/libro-server}/libro-core/.gitignore (100%) rename {libro-server => archive/libro-server}/libro-core/.python-version (100%) rename {libro-server => archive/libro-server}/libro-core/README.md (100%) rename {libro-server => archive/libro-server}/libro-core/pyproject.toml (100%) rename {libro-server => archive/libro-server}/libro-core/src/libro_core/__init__.py (100%) rename {libro-server => archive/libro-server}/libro-core/src/libro_core/_version.py (100%) rename {libro-server => archive/libro-server}/libro-core/src/libro_core/config.py (100%) rename {libro-server => archive/libro-server}/libro-flow/.gitignore (100%) rename {libro-server => archive/libro-server}/libro-flow/.python-version (100%) rename {libro-server => archive/libro-server}/libro-flow/README.md (100%) rename {libro-server => archive/libro-server}/libro-flow/pyproject.toml (100%) rename {libro-server => archive/libro-server}/libro-flow/src/libro_flow/__init__.py (100%) rename {libro-server => archive/libro-server}/libro-flow/src/libro_flow/_version.py (100%) rename {libro-server => archive/libro-server}/libro-flow/src/libro_flow/execution_handler.py (100%) rename {libro-server => archive/libro-server}/libro-flow/src/libro_flow/libro_client.py (100%) rename {libro-server => archive/libro-server}/libro-flow/src/libro_flow/libro_execution.py (100%) rename {libro-server => archive/libro-server}/libro-flow/src/libro_flow/libro_schema_form_widget.py (100%) rename {libro-server => archive/libro-server}/libro-server/.gitignore (100%) rename {libro-server => archive/libro-server}/libro-server/.npmrc (100%) rename {libro-server => archive/libro-server}/libro-server/.python-version (100%) rename {libro-server => archive/libro-server}/libro-server/README.md (100%) rename {libro-server => archive/libro-server}/libro-server/package.json (100%) rename {libro-server => archive/libro-server}/libro-server/pyproject.toml (100%) rename {libro-server => archive/libro-server}/libro-server/src/dev-config/jupyter_server_config.py (100%) rename {libro-server => archive/libro-server}/libro-server/src/libro_server/__init__.py (100%) rename {libro-server => archive/libro-server}/libro-server/src/libro_server/_version.py (100%) rename {libro-server => archive/libro-server}/libro-server/src/libro_server/app.py (100%) rename {libro-server => archive/libro-server}/libro-server/src/libro_server/entrypoint.py (100%) rename {libro-server => archive/libro-server}/libro-server/src/libro_server/generate_libro_config.py (100%) rename {libro-server => archive/libro-server}/libro-server/src/libro_server/jupyter_config.py (100%) rename {libro-server => archive/libro-server}/libro-server/src/libro_server/libro_ai_handler.py (100%) rename {libro-server => archive/libro-server}/libro-server/src/libro_server/libro_kernel_manager.py (100%) rename {libro-server => archive/libro-server}/libro-server/src/libro_server/static_handler.py (100%) rename {libro-server => archive/libro-server}/libro-server/src/libro_server/templates/error.html (100%) rename {libro-server => archive/libro-server}/libro-server/src/libro_server/templates/libro.html (100%) rename {libro-server => archive/libro-server}/libro-server/src/libro_server/templates/page.html (100%) rename {libro-server => archive/libro-server}/libro-server/src/libro_server/workspace_handler.py (100%) rename {libro-server => archive/libro-server}/libro-sql/.gitignore (100%) rename {libro-server => archive/libro-server}/libro-sql/.python-version (100%) rename {libro-server => archive/libro-server}/libro-sql/README.md (100%) rename {libro-server => archive/libro-server}/libro-sql/pyproject.toml (100%) rename {libro-server => archive/libro-server}/libro-sql/src/libro_sql/__init__.py (100%) rename {libro-server => archive/libro-server}/libro-sql/src/libro_sql/_version.py (100%) rename {libro-server => archive/libro-server}/libro-sql/src/libro_sql/database.py (100%) rename {libro-server => archive/libro-server}/libro-sql/src/libro_sql/exception.py (100%) rename {libro-server => archive/libro-server}/libro-sql/src/libro_sql/extensions.py (100%) rename {libro-server => archive/libro-server}/libro-sql/src/libro_sql/sql_magic.py (100%) rename {libro-server => archive/libro-server}/libro/.gitignore (100%) rename {libro-server => archive/libro-server}/libro/.python-version (100%) rename {libro-server => archive/libro-server}/libro/README.md (100%) rename {libro-server => archive/libro-server}/libro/pyproject.toml (100%) rename {libro-server => archive/libro-server}/libro/src/libro/__init__.py (100%) rename {libro-server => archive/libro-server}/libro/src/libro/_version.py (100%) rename {libro-server => archive/libro-server}/pyproject.toml (100%) rename {libro-server => archive/libro-server}/requirements-dev.lock (100%) rename {libro-server => archive/libro-server}/requirements.lock (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.dumirc.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.editorconfig (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.eslintignore (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.eslintrc.js (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.fatherrc.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.husky/commit-msg (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.husky/pre-commit (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.node-version (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.npmrc (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.prettierignore (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.prettierrc.js (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.stylelintignore (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.stylelintrc (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.vscode/launch.json (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/.vscode/settings.json (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/LICENSE (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/README.md (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/assets/arch.png (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/assets/image.png (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/docs/guide.md (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/docs/index.md (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/docs/opensumi-demo-app/index.md (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/configs/docker/productionDependencies.json (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/configs/webpack.browser.config.js (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/configs/webpack.ext-host.config.js (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/configs/webpack.node.config.js (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/configs/webpack.webview.config.js (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/configs/webpack.worker-host.config.js (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/notebook.ipynb (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/public/index.html (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/browser/common-modules.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/browser/i18n/en-US.lang.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/browser/i18n/index.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/browser/i18n/setup.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/browser/i18n/zh-CN.lang.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/browser/index.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/browser/mana-application.tsx (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/browser/mana/demo-module.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/browser/mana/libro-application.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/browser/mana/test.json (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/browser/render-app.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/browser/status-bar/status-bar.contribution.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/browser/styles.less (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/extension/ext-host.js (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/node/common-modules.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/node/index.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/src/node/start-server.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/templates/index.html (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/test.ipynb (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/tsconfig.json (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/workspace/fakeDB.jsonconfig (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/workspace/index.antd-theme (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/example/workspace/notebook.ipynb (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/jest.setup.node.js (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/package.json (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/scripts/download.js (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/scripts/extensions.json (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/index.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/kernel-panel/collapse/collapse-content.tsx (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/kernel-panel/collapse/icon.tsx (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/kernel-panel/collapse/index.less (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/kernel-panel/collapse/index.tsx (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/kernel-panel/collapse/kernel-collapse-content-item.tsx (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/kernel-panel/collapse/kernel-collapse-content.tsx (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/kernel-panel/collapse/page-collapse-content.tsx (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/kernel-panel/index.less (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/kernel-panel/index.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/kernel-panel/kernel-panel-view.tsx (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/kernel-panel/kernel.panel.color.tokens.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/kernel-panel/kernel.panel.contribution.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/kernel-panel/kernel.panel.protocol.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/libro-keybind-contribution.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/libro-opener.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/libro.color.tokens.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/libro.command.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/libro.contribution.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/libro.module.less (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/libro.protocol.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/libro.service.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/libro.view.tracker.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/libro.view.tsx (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/notebook-document-content-provider.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/notebook.service.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/toc/index.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/toc/toc.contribution.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/toc/toc.module.less (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/toc/toc.panel.color.tokens.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/browser/toc/toc.panel.tsx (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/common/index.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/index.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/mana/editor/editor-contribution.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/mana/editor/index.less (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/mana/editor/keybind-handler.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/mana/editor/module.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/mana/editor/opensumi-editor.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/mana/index.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/mana/libro-opensumi-content-contribution.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/mana/libro-opensumi-save-content-contribution.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/src/mana/mana-module.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/tsconfig.json (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/typings/style/index.d.ts (100%) rename {opensumi-module-libro => archive/opensumi-module-libro}/workspace/test.py (100%) rename {mana/packages => archive}/umi-plugin-mana/.eslintrc.js (100%) rename {mana/packages => archive}/umi-plugin-mana/.fatherrc.ts (100%) rename {mana/packages => archive}/umi-plugin-mana/CHANGELOG.md (100%) rename {mana/packages => archive}/umi-plugin-mana/README.md (100%) rename {mana => archive/umi-plugin-mana}/babel.config.json (100%) rename {mana/packages => archive}/umi-plugin-mana/jest.config.js (100%) rename {mana/packages => archive}/umi-plugin-mana/package.json (100%) rename {mana/packages => archive}/umi-plugin-mana/src/decorator.ts (100%) rename {mana/packages => archive}/umi-plugin-mana/src/index.spec.ts (100%) rename {mana/packages => archive}/umi-plugin-mana/src/index.ts (100%) rename {mana/packages => archive}/umi-plugin-mana/src/mana-runtime.ts (100%) rename {mana/packages => archive}/umi-plugin-mana/src/nodenext.ts (100%) rename {mana/packages => archive}/umi-plugin-mana/src/router-base.ts (100%) rename {mana/packages => archive}/umi-plugin-mana/tsconfig.json (100%) delete mode 100644 libro-server/lab/.eslintignore delete mode 100644 libro-server/lab/.eslintrc.json delete mode 100644 mana/.changeset/README.md delete mode 100644 mana/.changeset/config.json delete mode 100644 mana/.commitlintrc.js delete mode 100644 mana/.editorconfig delete mode 100644 mana/.eslintignore delete mode 100644 mana/.eslintrc.js delete mode 100644 mana/.eslintrc.node.js delete mode 100644 mana/.gitattributes delete mode 100755 mana/.husky/commit-msg delete mode 100755 mana/.husky/pre-commit delete mode 100644 mana/.lintstagedrc.js delete mode 100644 mana/.npmrc delete mode 100644 mana/.prettierignore delete mode 100644 mana/.prettierrc.json delete mode 100644 mana/.stylelintignore delete mode 100644 mana/.stylelintrc delete mode 100644 mana/.vscode/cspell.json delete mode 100644 mana/.vscode/extensions.json delete mode 100644 mana/.vscode/launch.json delete mode 100644 mana/.vscode/settings.json delete mode 100644 mana/CONTRIBUTING.md delete mode 100644 mana/LEGAL.md delete mode 100644 mana/LICENSE delete mode 100644 mana/README.md delete mode 100644 mana/README.zh-CN.md delete mode 100644 mana/apps/docs/.dumi/theme/componets/banner/background.png delete mode 100644 mana/apps/docs/.dumi/theme/componets/banner/index.less delete mode 100644 mana/apps/docs/.dumi/theme/componets/banner/index.tsx delete mode 100644 mana/apps/docs/.dumi/theme/componets/title/index.less delete mode 100644 mana/apps/docs/.dumi/theme/componets/title/index.tsx delete mode 100644 mana/apps/docs/.dumi/theme/lang/bundle.l10n.en-US.json delete mode 100644 mana/apps/docs/.dumi/theme/lang/bundle.l10n.zh-CN.json delete mode 100644 mana/apps/docs/.dumi/theme/lang/index.ts delete mode 100644 mana/apps/docs/.dumi/theme/layouts/DocLayout.less delete mode 100644 mana/apps/docs/.dumi/theme/layouts/DocLayout.tsx delete mode 100644 mana/apps/docs/.dumi/theme/modules/github.ts delete mode 100644 mana/apps/docs/.dumi/theme/modules/module.ts delete mode 100644 mana/apps/docs/.dumi/theme/slots/Footer/index.less delete mode 100644 mana/apps/docs/.dumi/theme/slots/Footer/index.tsx delete mode 100644 mana/apps/docs/.dumi/theme/slots/Header/default.less delete mode 100644 mana/apps/docs/.dumi/theme/slots/Header/index.less delete mode 100644 mana/apps/docs/.dumi/theme/slots/Header/index.tsx delete mode 100644 mana/apps/docs/.dumi/theme/styles/heti.less delete mode 100644 mana/apps/docs/.dumi/theme/styles/utils.less delete mode 100644 mana/apps/docs/.dumi/theme/styles/variables.less delete mode 100644 mana/apps/docs/.dumi/theme/tailwind.out.css delete mode 100644 mana/apps/docs/.dumi/tsconfig.json delete mode 100644 mana/apps/docs/.dumirc.ts delete mode 100644 mana/apps/docs/.eslintrc.mjs delete mode 100644 mana/apps/docs/CHANGELOG.md delete mode 100644 mana/apps/docs/docs/examples/application-react.md delete mode 100644 mana/apps/docs/docs/examples/application-react.zh-CN.md delete mode 100644 mana/apps/docs/docs/examples/command.md delete mode 100644 mana/apps/docs/docs/examples/command.zh-CN.md delete mode 100644 mana/apps/docs/docs/examples/file-tree.md delete mode 100644 mana/apps/docs/docs/examples/file-tree.zh-CN.md delete mode 100644 mana/apps/docs/docs/examples/keybind.md delete mode 100644 mana/apps/docs/docs/examples/keybind.zh-CN.md delete mode 100644 mana/apps/docs/docs/examples/menu.md delete mode 100644 mana/apps/docs/docs/examples/menu.zh-CN.md delete mode 100644 mana/apps/docs/docs/examples/modal.md delete mode 100644 mana/apps/docs/docs/examples/modal.zh-CN.md delete mode 100644 mana/apps/docs/docs/examples/modular.md delete mode 100644 mana/apps/docs/docs/examples/modular.zh-CN.md delete mode 100644 mana/apps/docs/docs/index.md delete mode 100644 mana/apps/docs/docs/index.zh-CN.md delete mode 100644 mana/apps/docs/docs/introduction/dependencies.md delete mode 100644 mana/apps/docs/docs/introduction/dependencies.zh-CN.md delete mode 100644 mana/apps/docs/docs/introduction/index.md delete mode 100644 mana/apps/docs/docs/introduction/index.zh-CN.md delete mode 100644 mana/apps/docs/docs/introduction/layout.md delete mode 100644 mana/apps/docs/docs/introduction/layout.zh-CN.md delete mode 100644 mana/apps/docs/docs/introduction/state.md delete mode 100644 mana/apps/docs/docs/introduction/state.zh-CN.md delete mode 100644 mana/apps/docs/dumi-plugin-alias.ts delete mode 100644 mana/apps/docs/package.json delete mode 100644 mana/apps/docs/public/ding-qrcode.png delete mode 100644 mana/apps/docs/public/mana.svg delete mode 100644 mana/apps/docs/src/application-react/antd-menu/antd-menu-view.tsx delete mode 100644 mana/apps/docs/src/application-react/antd-menu/index.ts delete mode 100644 mana/apps/docs/src/application-react/command-palette/command-palette-app.ts delete mode 100644 mana/apps/docs/src/application-react/command-palette/command-palette-view.tsx delete mode 100644 mana/apps/docs/src/application-react/command-palette/command-tab.tsx delete mode 100644 mana/apps/docs/src/application-react/command-palette/index.ts delete mode 100644 mana/apps/docs/src/application-react/content/content-view.tsx delete mode 100644 mana/apps/docs/src/application-react/content/index.module.less delete mode 100644 mana/apps/docs/src/application-react/content/index.ts delete mode 100644 mana/apps/docs/src/application-react/file/file-application.ts delete mode 100644 mana/apps/docs/src/application-react/file/file-open-handler.ts delete mode 100644 mana/apps/docs/src/application-react/file/file-protocol.ts delete mode 100644 mana/apps/docs/src/application-react/file/file-view/file-view.tsx delete mode 100644 mana/apps/docs/src/application-react/file/file-view/index.module.less delete mode 100644 mana/apps/docs/src/application-react/file/file-view/index.ts delete mode 100644 mana/apps/docs/src/application-react/file/index.ts delete mode 100644 mana/apps/docs/src/application-react/index.module.less delete mode 100644 mana/apps/docs/src/application-react/index.tsx delete mode 100644 mana/apps/docs/src/application-react/logo/index.module.less delete mode 100644 mana/apps/docs/src/application-react/logo/index.ts delete mode 100644 mana/apps/docs/src/application-react/logo/logo-view.tsx delete mode 100644 mana/apps/docs/src/application-react/logo/mana.svg delete mode 100644 mana/apps/docs/src/application-react/setting-editor/configs.ts delete mode 100644 mana/apps/docs/src/application-react/setting-editor/default-configuration-contribution.tsx delete mode 100644 mana/apps/docs/src/application-react/setting-editor/index.ts delete mode 100644 mana/apps/docs/src/application-react/theme-switcher/index.ts delete mode 100644 mana/apps/docs/src/application-react/theme-switcher/storage-view/index.tsx delete mode 100644 mana/apps/docs/src/application-react/theme-switcher/theme-select-view/index.module.less delete mode 100644 mana/apps/docs/src/application-react/theme-switcher/theme-select-view/index.tsx delete mode 100644 mana/apps/docs/src/application-react/user/index.ts delete mode 100644 mana/apps/docs/src/application-react/user/user-avatar-view/index.module.less delete mode 100644 mana/apps/docs/src/application-react/user/user-avatar-view/index.tsx delete mode 100644 mana/apps/docs/src/application-react/workbench/command/common-command.ts delete mode 100644 mana/apps/docs/src/application-react/workbench/index.ts delete mode 100644 mana/apps/docs/src/application-react/workbench/layout/app-layout.tsx delete mode 100644 mana/apps/docs/src/application-react/workbench/layout/index.module.less delete mode 100644 mana/apps/docs/src/application-react/workbench/layout/workbench-layout.tsx delete mode 100644 mana/apps/docs/src/application-react/workbench/menu/common-menu.ts delete mode 100644 mana/apps/docs/src/application-react/workbench/menu/mana-menubar/index.tsx delete mode 100644 mana/apps/docs/src/application-react/workbench/menu/menu-bar-view.tsx delete mode 100644 mana/apps/docs/src/application-react/workbench/menu/render.tsx delete mode 100644 mana/apps/docs/src/command/simple/command.ts delete mode 100644 mana/apps/docs/src/command/simple/index.tsx delete mode 100644 mana/apps/docs/src/file-tree/file-application.ts delete mode 100644 mana/apps/docs/src/file-tree/file-command.tsx delete mode 100644 mana/apps/docs/src/file-tree/file-protocol.ts delete mode 100644 mana/apps/docs/src/file-tree/file-view/file-view.tsx delete mode 100644 mana/apps/docs/src/file-tree/file-view/index.less delete mode 100644 mana/apps/docs/src/file-tree/file-view/index.ts delete mode 100644 mana/apps/docs/src/file-tree/index.tsx delete mode 100644 mana/apps/docs/src/file-tree/mock-file-service.ts delete mode 100644 mana/apps/docs/src/file-tree/module.ts delete mode 100644 mana/apps/docs/src/keybind/context/command.ts delete mode 100644 mana/apps/docs/src/keybind/context/context-service.ts delete mode 100644 mana/apps/docs/src/keybind/context/index.tsx delete mode 100644 mana/apps/docs/src/keybind/event-propagation/command.ts delete mode 100644 mana/apps/docs/src/keybind/event-propagation/index.tsx delete mode 100644 mana/apps/docs/src/keybind/simple/command.ts delete mode 100644 mana/apps/docs/src/keybind/simple/index.tsx delete mode 100644 mana/apps/docs/src/menu/antd-context-menu/index.tsx delete mode 100644 mana/apps/docs/src/menu/antd-context-menu/menu.tsx delete mode 100644 mana/apps/docs/src/menu/context-menu/index.tsx delete mode 100644 mana/apps/docs/src/menu/context-menu/menu.tsx delete mode 100644 mana/apps/docs/src/menu/menubar/index.tsx delete mode 100644 mana/apps/docs/src/menu/menubar/menu.tsx delete mode 100644 mana/apps/docs/src/modal/antd-modal/index.tsx delete mode 100644 mana/apps/docs/src/modal/antd-modal/modal-container-view.tsx delete mode 100644 mana/apps/docs/src/modal/antd-modal/modal-contribution.tsx delete mode 100644 mana/apps/docs/src/modal/custom-modal/index.tsx delete mode 100644 mana/apps/docs/src/modal/custom-modal/modal-container-view.tsx delete mode 100644 mana/apps/docs/src/modal/custom-modal/modal-contribution.tsx delete mode 100644 mana/apps/docs/src/modal/custom-modal/my-modal-service.tsx delete mode 100644 mana/apps/docs/src/modular-basic/content.tsx delete mode 100644 mana/apps/docs/src/modular-basic/index.tsx delete mode 100644 mana/apps/docs/src/modular-basic/layout.tsx delete mode 100644 mana/apps/docs/src/modular-dynamic/content.tsx delete mode 100644 mana/apps/docs/src/modular-dynamic/index.tsx delete mode 100644 mana/apps/docs/src/modular-dynamic/layout.tsx delete mode 100644 mana/apps/docs/src/typings/index.d.ts delete mode 100644 mana/apps/docs/tsconfig.json delete mode 100644 mana/apps/react-example/.eslintrc.json delete mode 100644 mana/apps/react-example/.gitattributes delete mode 100644 mana/apps/react-example/.gitignore delete mode 100644 mana/apps/react-example/.prettierrc delete mode 100644 mana/apps/react-example/CHANGELOG.md delete mode 100644 mana/apps/react-example/README.md delete mode 100644 mana/apps/react-example/assets/icons/LICENSE delete mode 100644 mana/apps/react-example/assets/icons/chrome.png delete mode 100644 mana/apps/react-example/assets/icons/erwt.png delete mode 100644 mana/apps/react-example/assets/icons/license.png delete mode 100644 mana/apps/react-example/assets/icons/nodejs.png delete mode 100644 mana/apps/react-example/assets/icons/react.png delete mode 100644 mana/apps/react-example/assets/icons/typescript.png delete mode 100644 mana/apps/react-example/assets/icons/webpack.png delete mode 100644 mana/apps/react-example/assets/images/logo.png delete mode 100644 mana/apps/react-example/assets/images/screenshot.png delete mode 100644 mana/apps/react-example/babel.config.json delete mode 100644 mana/apps/react-example/package.json delete mode 100644 mana/apps/react-example/src/components/Application.scss delete mode 100644 mana/apps/react-example/src/components/Application.tsx delete mode 100644 mana/apps/react-example/src/components/Icons.tsx delete mode 100644 mana/apps/react-example/src/components/Theme.scss delete mode 100644 mana/apps/react-example/src/index.d.ts delete mode 100644 mana/apps/react-example/src/index.html delete mode 100644 mana/apps/react-example/src/main.tsx delete mode 100644 mana/apps/react-example/src/module.ts delete mode 100644 mana/apps/react-example/src/state.ts delete mode 100644 mana/apps/react-example/tools/webpack/webpack.aliases.js delete mode 100644 mana/apps/react-example/tools/webpack/webpack.config.dev.js delete mode 100644 mana/apps/react-example/tools/webpack/webpack.config.prod.js delete mode 100644 mana/apps/react-example/tools/webpack/webpack.helpers.js delete mode 100644 mana/apps/react-example/tools/webpack/webpack.plugins.js delete mode 100644 mana/apps/react-example/tools/webpack/webpack.rules.js delete mode 100644 mana/apps/react-example/tsconfig.json delete mode 100644 mana/apps/umi-example/.gitignore delete mode 100644 mana/apps/umi-example/.umirc.ts delete mode 100644 mana/apps/umi-example/CHANGELOG.md delete mode 100644 mana/apps/umi-example/package.json delete mode 100644 mana/apps/umi-example/src/assets/yay.jpg delete mode 100644 mana/apps/umi-example/src/layouts/index.less delete mode 100644 mana/apps/umi-example/src/layouts/index.tsx delete mode 100644 mana/apps/umi-example/src/modules/app.module.ts delete mode 100644 mana/apps/umi-example/src/modules/state.ts delete mode 100644 mana/apps/umi-example/src/pages/docs.tsx delete mode 100644 mana/apps/umi-example/src/pages/index.tsx delete mode 100644 mana/apps/umi-example/tsconfig.json delete mode 100644 mana/apps/umi-example/typings.d.ts delete mode 100644 mana/jest.config.js delete mode 100644 mana/nx.json delete mode 100644 mana/package.json delete mode 100644 mana/packages/umi-plugin-mana/babel.config.json delete mode 100644 mana/pnpm-workspace.yaml delete mode 100755 mana/scripts/bootstrap.sh delete mode 100644 mana/scripts/release-snapshot.sh delete mode 100644 mana/tsconfig.base.json diff --git a/.eslintignore b/.eslintignore index 55985ce7..b470d723 100644 --- a/.eslintignore +++ b/.eslintignore @@ -7,4 +7,5 @@ **/dist/**/*.mjs /libro-server/** /mana/** +/archive/** diff --git a/.prettierignore b/.prettierignore index cad95cdf..af4264a2 100644 --- a/.prettierignore +++ b/.prettierignore @@ -14,6 +14,7 @@ pnpm-lock.yaml **/.dumi/tmp-production **/.dumi/theme **/.docusaurus +/archive/** /libro-server/** /mana/** diff --git a/libro-sample-umi/.npmrc b/archive/libro-sample-umi/.npmrc similarity index 100% rename from libro-sample-umi/.npmrc rename to archive/libro-sample-umi/.npmrc diff --git a/libro-sample-umi/.umirc.ts b/archive/libro-sample-umi/.umirc.ts similarity index 100% rename from libro-sample-umi/.umirc.ts rename to archive/libro-sample-umi/.umirc.ts diff --git a/libro-sample-umi/package-lock.json b/archive/libro-sample-umi/package-lock.json similarity index 100% rename from libro-sample-umi/package-lock.json rename to archive/libro-sample-umi/package-lock.json diff --git a/libro-sample-umi/package.json b/archive/libro-sample-umi/package.json similarity index 100% rename from libro-sample-umi/package.json rename to archive/libro-sample-umi/package.json diff --git a/libro-sample-umi/src/assets/yay.jpg b/archive/libro-sample-umi/src/assets/yay.jpg similarity index 100% rename from libro-sample-umi/src/assets/yay.jpg rename to archive/libro-sample-umi/src/assets/yay.jpg diff --git a/libro-sample-umi/src/global.less b/archive/libro-sample-umi/src/global.less similarity index 100% rename from libro-sample-umi/src/global.less rename to archive/libro-sample-umi/src/global.less diff --git a/libro-sample-umi/src/modules/app.module.ts b/archive/libro-sample-umi/src/modules/app.module.ts similarity index 100% rename from libro-sample-umi/src/modules/app.module.ts rename to archive/libro-sample-umi/src/modules/app.module.ts diff --git a/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-contribution.ts b/archive/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-contribution.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-contribution.ts rename to archive/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-contribution.ts diff --git a/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-model.ts b/archive/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-model.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-model.ts rename to archive/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-model.ts diff --git a/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-protocol.ts b/archive/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-protocol.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-protocol.ts rename to archive/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-protocol.ts diff --git a/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-view.tsx b/archive/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-view.tsx similarity index 100% rename from libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-view.tsx rename to archive/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/libro-editor-demo-cell-view.tsx diff --git a/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/module.ts b/archive/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/module.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/module.ts rename to archive/libro-sample-umi/src/modules/libro-cell/libro-editor-demo-cell/module.ts diff --git a/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/index.ts b/archive/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/index.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/index.ts rename to archive/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/index.ts diff --git a/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-contribution.ts b/archive/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-contribution.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-contribution.ts rename to archive/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-contribution.ts diff --git a/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-model.ts b/archive/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-model.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-model.ts rename to archive/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-model.ts diff --git a/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-protocol.ts b/archive/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-protocol.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-protocol.ts rename to archive/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-protocol.ts diff --git a/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-view.tsx b/archive/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-view.tsx similarity index 100% rename from libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-view.tsx rename to archive/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/libro-general-demo-cell-view.tsx diff --git a/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/module.ts b/archive/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/module.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/module.ts rename to archive/libro-sample-umi/src/modules/libro-cell/libro-general-demo-cell/module.ts diff --git a/libro-sample-umi/src/modules/libro-command/libro-command-demo-service.ts b/archive/libro-sample-umi/src/modules/libro-command/libro-command-demo-service.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-command/libro-command-demo-service.ts rename to archive/libro-sample-umi/src/modules/libro-command/libro-command-demo-service.ts diff --git a/libro-sample-umi/src/modules/libro-command/libro-demo-command-contribution.ts b/archive/libro-sample-umi/src/modules/libro-command/libro-demo-command-contribution.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-command/libro-demo-command-contribution.ts rename to archive/libro-sample-umi/src/modules/libro-command/libro-demo-command-contribution.ts diff --git a/libro-sample-umi/src/modules/libro-command/libro-demo-command.ts b/archive/libro-sample-umi/src/modules/libro-command/libro-demo-command.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-command/libro-demo-command.ts rename to archive/libro-sample-umi/src/modules/libro-command/libro-demo-command.ts diff --git a/libro-sample-umi/src/modules/libro-command/module.ts b/archive/libro-sample-umi/src/modules/libro-command/module.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-command/module.ts rename to archive/libro-sample-umi/src/modules/libro-command/module.ts diff --git a/libro-sample-umi/src/modules/libro-editor/app.ts b/archive/libro-sample-umi/src/modules/libro-editor/app.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-editor/app.ts rename to archive/libro-sample-umi/src/modules/libro-editor/app.ts diff --git a/libro-sample-umi/src/modules/libro-editor/libro-content-contribution.ts b/archive/libro-sample-umi/src/modules/libro-editor/libro-content-contribution.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-editor/libro-content-contribution.ts rename to archive/libro-sample-umi/src/modules/libro-editor/libro-content-contribution.ts diff --git a/libro-sample-umi/src/modules/libro-editor/libro-demo.json b/archive/libro-sample-umi/src/modules/libro-editor/libro-demo.json similarity index 100% rename from libro-sample-umi/src/modules/libro-editor/libro-demo.json rename to archive/libro-sample-umi/src/modules/libro-editor/libro-demo.json diff --git a/libro-sample-umi/src/modules/libro-editor/module.ts b/archive/libro-sample-umi/src/modules/libro-editor/module.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-editor/module.ts rename to archive/libro-sample-umi/src/modules/libro-editor/module.ts diff --git a/libro-sample-umi/src/modules/libro-keybind/libro-demo-keybind-command.ts b/archive/libro-sample-umi/src/modules/libro-keybind/libro-demo-keybind-command.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-keybind/libro-demo-keybind-command.ts rename to archive/libro-sample-umi/src/modules/libro-keybind/libro-demo-keybind-command.ts diff --git a/libro-sample-umi/src/modules/libro-keybind/libro-demo-keybind-contribution.ts b/archive/libro-sample-umi/src/modules/libro-keybind/libro-demo-keybind-contribution.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-keybind/libro-demo-keybind-contribution.ts rename to archive/libro-sample-umi/src/modules/libro-keybind/libro-demo-keybind-contribution.ts diff --git a/libro-sample-umi/src/modules/libro-keybind/module.ts b/archive/libro-sample-umi/src/modules/libro-keybind/module.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-keybind/module.ts rename to archive/libro-sample-umi/src/modules/libro-keybind/module.ts diff --git a/libro-sample-umi/src/modules/libro-lab/app.ts b/archive/libro-sample-umi/src/modules/libro-lab/app.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-lab/app.ts rename to archive/libro-sample-umi/src/modules/libro-lab/app.ts diff --git a/libro-sample-umi/src/modules/libro-lab/module.ts b/archive/libro-sample-umi/src/modules/libro-lab/module.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-lab/module.ts rename to archive/libro-sample-umi/src/modules/libro-lab/module.ts diff --git a/libro-sample-umi/src/modules/libro-toolbar/libro-demo-toolbar-commands.ts b/archive/libro-sample-umi/src/modules/libro-toolbar/libro-demo-toolbar-commands.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-toolbar/libro-demo-toolbar-commands.ts rename to archive/libro-sample-umi/src/modules/libro-toolbar/libro-demo-toolbar-commands.ts diff --git a/libro-sample-umi/src/modules/libro-toolbar/libro-demo-toolbar-contribution.ts b/archive/libro-sample-umi/src/modules/libro-toolbar/libro-demo-toolbar-contribution.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-toolbar/libro-demo-toolbar-contribution.ts rename to archive/libro-sample-umi/src/modules/libro-toolbar/libro-demo-toolbar-contribution.ts diff --git a/libro-sample-umi/src/modules/libro-toolbar/module.ts b/archive/libro-sample-umi/src/modules/libro-toolbar/module.ts similarity index 100% rename from libro-sample-umi/src/modules/libro-toolbar/module.ts rename to archive/libro-sample-umi/src/modules/libro-toolbar/module.ts diff --git a/libro-sample-umi/src/pages/docs.tsx b/archive/libro-sample-umi/src/pages/docs.tsx similarity index 100% rename from libro-sample-umi/src/pages/docs.tsx rename to archive/libro-sample-umi/src/pages/docs.tsx diff --git a/libro-sample-umi/src/pages/index.tsx b/archive/libro-sample-umi/src/pages/index.tsx similarity index 100% rename from libro-sample-umi/src/pages/index.tsx rename to archive/libro-sample-umi/src/pages/index.tsx diff --git a/libro-sample-umi/src/pages/libro-cell/index.less b/archive/libro-sample-umi/src/pages/libro-cell/index.less similarity index 100% rename from libro-sample-umi/src/pages/libro-cell/index.less rename to archive/libro-sample-umi/src/pages/libro-cell/index.less diff --git a/libro-sample-umi/src/pages/libro-cell/index.tsx b/archive/libro-sample-umi/src/pages/libro-cell/index.tsx similarity index 100% rename from libro-sample-umi/src/pages/libro-cell/index.tsx rename to archive/libro-sample-umi/src/pages/libro-cell/index.tsx diff --git a/libro-sample-umi/src/pages/libro-command/index.less b/archive/libro-sample-umi/src/pages/libro-command/index.less similarity index 100% rename from libro-sample-umi/src/pages/libro-command/index.less rename to archive/libro-sample-umi/src/pages/libro-command/index.less diff --git a/libro-sample-umi/src/pages/libro-command/index.tsx b/archive/libro-sample-umi/src/pages/libro-command/index.tsx similarity index 100% rename from libro-sample-umi/src/pages/libro-command/index.tsx rename to archive/libro-sample-umi/src/pages/libro-command/index.tsx diff --git a/libro-sample-umi/src/pages/libro-command/libro-command-demo.tsx b/archive/libro-sample-umi/src/pages/libro-command/libro-command-demo.tsx similarity index 100% rename from libro-sample-umi/src/pages/libro-command/libro-command-demo.tsx rename to archive/libro-sample-umi/src/pages/libro-command/libro-command-demo.tsx diff --git a/libro-sample-umi/src/pages/libro-editor/index.tsx b/archive/libro-sample-umi/src/pages/libro-editor/index.tsx similarity index 100% rename from libro-sample-umi/src/pages/libro-editor/index.tsx rename to archive/libro-sample-umi/src/pages/libro-editor/index.tsx diff --git a/libro-sample-umi/src/pages/libro-editor/libro-editor.tsx b/archive/libro-sample-umi/src/pages/libro-editor/libro-editor.tsx similarity index 100% rename from libro-sample-umi/src/pages/libro-editor/libro-editor.tsx rename to archive/libro-sample-umi/src/pages/libro-editor/libro-editor.tsx diff --git a/libro-sample-umi/src/pages/libro-keybind/index.tsx b/archive/libro-sample-umi/src/pages/libro-keybind/index.tsx similarity index 100% rename from libro-sample-umi/src/pages/libro-keybind/index.tsx rename to archive/libro-sample-umi/src/pages/libro-keybind/index.tsx diff --git a/libro-sample-umi/src/pages/libro-keybind/libro-keybind-demo.tsx b/archive/libro-sample-umi/src/pages/libro-keybind/libro-keybind-demo.tsx similarity index 100% rename from libro-sample-umi/src/pages/libro-keybind/libro-keybind-demo.tsx rename to archive/libro-sample-umi/src/pages/libro-keybind/libro-keybind-demo.tsx diff --git a/libro-sample-umi/src/pages/libro-lab/index.less b/archive/libro-sample-umi/src/pages/libro-lab/index.less similarity index 100% rename from libro-sample-umi/src/pages/libro-lab/index.less rename to archive/libro-sample-umi/src/pages/libro-lab/index.less diff --git a/libro-sample-umi/src/pages/libro-lab/index.tsx b/archive/libro-sample-umi/src/pages/libro-lab/index.tsx similarity index 100% rename from libro-sample-umi/src/pages/libro-lab/index.tsx rename to archive/libro-sample-umi/src/pages/libro-lab/index.tsx diff --git a/libro-sample-umi/src/pages/libro-toolbar/index.tsx b/archive/libro-sample-umi/src/pages/libro-toolbar/index.tsx similarity index 100% rename from libro-sample-umi/src/pages/libro-toolbar/index.tsx rename to archive/libro-sample-umi/src/pages/libro-toolbar/index.tsx diff --git a/libro-sample-umi/src/pages/libro-toolbar/libro-toolbar.tsx b/archive/libro-sample-umi/src/pages/libro-toolbar/libro-toolbar.tsx similarity index 100% rename from libro-sample-umi/src/pages/libro-toolbar/libro-toolbar.tsx rename to archive/libro-sample-umi/src/pages/libro-toolbar/libro-toolbar.tsx diff --git a/libro-sample-umi/tsconfig.json b/archive/libro-sample-umi/tsconfig.json similarity index 100% rename from libro-sample-umi/tsconfig.json rename to archive/libro-sample-umi/tsconfig.json diff --git a/libro-sample-umi/typings.d.ts b/archive/libro-sample-umi/typings.d.ts similarity index 100% rename from libro-sample-umi/typings.d.ts rename to archive/libro-sample-umi/typings.d.ts diff --git a/libro-server/.python-version b/archive/libro-server/.python-version similarity index 100% rename from libro-server/.python-version rename to archive/libro-server/.python-version diff --git a/libro-server/.vscode/settings.json b/archive/libro-server/.vscode/settings.json similarity index 100% rename from libro-server/.vscode/settings.json rename to archive/libro-server/.vscode/settings.json diff --git a/libro-server/CONTRIBUTING.md b/archive/libro-server/CONTRIBUTING.md similarity index 100% rename from libro-server/CONTRIBUTING.md rename to archive/libro-server/CONTRIBUTING.md diff --git a/libro-server/Dockerfile b/archive/libro-server/Dockerfile similarity index 100% rename from libro-server/Dockerfile rename to archive/libro-server/Dockerfile diff --git a/libro-server/README.md b/archive/libro-server/README.md similarity index 100% rename from libro-server/README.md rename to archive/libro-server/README.md diff --git a/libro-server/docker/jupyter_server_config.py b/archive/libro-server/docker/jupyter_server_config.py similarity index 100% rename from libro-server/docker/jupyter_server_config.py rename to archive/libro-server/docker/jupyter_server_config.py diff --git a/libro-server/docker/start.sh b/archive/libro-server/docker/start.sh similarity index 100% rename from libro-server/docker/start.sh rename to archive/libro-server/docker/start.sh diff --git a/libro-server/examples/Lenna_(test_image).png b/archive/libro-server/examples/Lenna_(test_image).png similarity index 100% rename from libro-server/examples/Lenna_(test_image).png rename to archive/libro-server/examples/Lenna_(test_image).png diff --git a/libro-server/examples/Magics_and_rpy2.ipynb b/archive/libro-server/examples/Magics_and_rpy2.ipynb similarity index 100% rename from libro-server/examples/Magics_and_rpy2.ipynb rename to archive/libro-server/examples/Magics_and_rpy2.ipynb diff --git a/libro-server/examples/OutputExamples.ipynb b/archive/libro-server/examples/OutputExamples.ipynb similarity index 100% rename from libro-server/examples/OutputExamples.ipynb rename to archive/libro-server/examples/OutputExamples.ipynb diff --git a/libro-server/examples/Python.ipynb b/archive/libro-server/examples/Python.ipynb similarity index 100% rename from libro-server/examples/Python.ipynb rename to archive/libro-server/examples/Python.ipynb diff --git a/libro-server/examples/execute.ipynb b/archive/libro-server/examples/execute.ipynb similarity index 100% rename from libro-server/examples/execute.ipynb rename to archive/libro-server/examples/execute.ipynb diff --git a/libro-server/examples/libro.ipynb b/archive/libro-server/examples/libro.ipynb similarity index 100% rename from libro-server/examples/libro.ipynb rename to archive/libro-server/examples/libro.ipynb diff --git a/libro-server/examples/llm.ipynb b/archive/libro-server/examples/llm.ipynb similarity index 100% rename from libro-server/examples/llm.ipynb rename to archive/libro-server/examples/llm.ipynb diff --git a/libro-server/examples/main.py b/archive/libro-server/examples/main.py similarity index 100% rename from libro-server/examples/main.py rename to archive/libro-server/examples/main.py diff --git a/libro-server/examples/parameterized.ipynb b/archive/libro-server/examples/parameterized.ipynb similarity index 100% rename from libro-server/examples/parameterized.ipynb rename to archive/libro-server/examples/parameterized.ipynb diff --git a/libro-server/examples/pyproject.toml b/archive/libro-server/examples/pyproject.toml similarity index 100% rename from libro-server/examples/pyproject.toml rename to archive/libro-server/examples/pyproject.toml diff --git a/libro-server/examples/sql_cell_example.ipynb b/archive/libro-server/examples/sql_cell_example.ipynb similarity index 100% rename from libro-server/examples/sql_cell_example.ipynb rename to archive/libro-server/examples/sql_cell_example.ipynb diff --git a/libro-server/examples/sql_cell_example_en.ipynb b/archive/libro-server/examples/sql_cell_example_en.ipynb similarity index 100% rename from libro-server/examples/sql_cell_example_en.ipynb rename to archive/libro-server/examples/sql_cell_example_en.ipynb diff --git a/libro-server/lab/.editorconfig b/archive/libro-server/lab/.editorconfig similarity index 100% rename from libro-server/lab/.editorconfig rename to archive/libro-server/lab/.editorconfig diff --git a/libro-server/lab/.gitignore b/archive/libro-server/lab/.gitignore similarity index 100% rename from libro-server/lab/.gitignore rename to archive/libro-server/lab/.gitignore diff --git a/libro-server/lab/.prettierignore b/archive/libro-server/lab/.prettierignore similarity index 100% rename from libro-server/lab/.prettierignore rename to archive/libro-server/lab/.prettierignore diff --git a/libro-server/lab/.prettierrc.json b/archive/libro-server/lab/.prettierrc.json similarity index 100% rename from libro-server/lab/.prettierrc.json rename to archive/libro-server/lab/.prettierrc.json diff --git a/libro-server/lab/.stylelintignore b/archive/libro-server/lab/.stylelintignore similarity index 100% rename from libro-server/lab/.stylelintignore rename to archive/libro-server/lab/.stylelintignore diff --git a/libro-server/lab/.stylelintrc b/archive/libro-server/lab/.stylelintrc similarity index 100% rename from libro-server/lab/.stylelintrc rename to archive/libro-server/lab/.stylelintrc diff --git a/libro-server/lab/.umirc.ts b/archive/libro-server/lab/.umirc.ts similarity index 100% rename from libro-server/lab/.umirc.ts rename to archive/libro-server/lab/.umirc.ts diff --git a/libro-server/lab/README.md b/archive/libro-server/lab/README.md similarity index 100% rename from libro-server/lab/README.md rename to archive/libro-server/lab/README.md diff --git a/libro-server/lab/dumi-plugin-nodenext.ts b/archive/libro-server/lab/dumi-plugin-nodenext.ts similarity index 100% rename from libro-server/lab/dumi-plugin-nodenext.ts rename to archive/libro-server/lab/dumi-plugin-nodenext.ts diff --git a/libro-server/lab/package.json b/archive/libro-server/lab/package.json similarity index 100% rename from libro-server/lab/package.json rename to archive/libro-server/lab/package.json diff --git a/libro-server/lab/routes.ts b/archive/libro-server/lab/routes.ts similarity index 100% rename from libro-server/lab/routes.ts rename to archive/libro-server/lab/routes.ts diff --git a/libro-server/lab/src/app.ts b/archive/libro-server/lab/src/app.ts similarity index 100% rename from libro-server/lab/src/app.ts rename to archive/libro-server/lab/src/app.ts diff --git a/libro-server/lab/src/modules/app.module.ts b/archive/libro-server/lab/src/modules/app.module.ts similarity index 100% rename from libro-server/lab/src/modules/app.module.ts rename to archive/libro-server/lab/src/modules/app.module.ts diff --git a/libro-server/lab/src/pages/dbgpt/app.ts b/archive/libro-server/lab/src/pages/dbgpt/app.ts similarity index 100% rename from libro-server/lab/src/pages/dbgpt/app.ts rename to archive/libro-server/lab/src/pages/dbgpt/app.ts diff --git a/libro-server/lab/src/pages/dbgpt/dbgbt-layout.tsx b/archive/libro-server/lab/src/pages/dbgpt/dbgbt-layout.tsx similarity index 100% rename from libro-server/lab/src/pages/dbgpt/dbgbt-layout.tsx rename to archive/libro-server/lab/src/pages/dbgpt/dbgbt-layout.tsx diff --git a/libro-server/lab/src/pages/dbgpt/dbgpt-current-file-footer-view.tsx b/archive/libro-server/lab/src/pages/dbgpt/dbgpt-current-file-footer-view.tsx similarity index 100% rename from libro-server/lab/src/pages/dbgpt/dbgpt-current-file-footer-view.tsx rename to archive/libro-server/lab/src/pages/dbgpt/dbgpt-current-file-footer-view.tsx diff --git a/libro-server/lab/src/pages/dbgpt/dbgpt-welcome-view.tsx b/archive/libro-server/lab/src/pages/dbgpt/dbgpt-welcome-view.tsx similarity index 100% rename from libro-server/lab/src/pages/dbgpt/dbgpt-welcome-view.tsx rename to archive/libro-server/lab/src/pages/dbgpt/dbgpt-welcome-view.tsx diff --git a/libro-server/lab/src/pages/dbgpt/index.less b/archive/libro-server/lab/src/pages/dbgpt/index.less similarity index 100% rename from libro-server/lab/src/pages/dbgpt/index.less rename to archive/libro-server/lab/src/pages/dbgpt/index.less diff --git a/libro-server/lab/src/pages/dbgpt/index.tsx b/archive/libro-server/lab/src/pages/dbgpt/index.tsx similarity index 100% rename from libro-server/lab/src/pages/dbgpt/index.tsx rename to archive/libro-server/lab/src/pages/dbgpt/index.tsx diff --git a/libro-server/lab/src/pages/dbgpt/logo.tsx b/archive/libro-server/lab/src/pages/dbgpt/logo.tsx similarity index 100% rename from libro-server/lab/src/pages/dbgpt/logo.tsx rename to archive/libro-server/lab/src/pages/dbgpt/logo.tsx diff --git a/libro-server/lab/src/pages/dbgpt/prompt-script.ts b/archive/libro-server/lab/src/pages/dbgpt/prompt-script.ts similarity index 100% rename from libro-server/lab/src/pages/dbgpt/prompt-script.ts rename to archive/libro-server/lab/src/pages/dbgpt/prompt-script.ts diff --git a/libro-server/lab/src/pages/dbgpt/schema-form-widget/contribution.ts b/archive/libro-server/lab/src/pages/dbgpt/schema-form-widget/contribution.ts similarity index 100% rename from libro-server/lab/src/pages/dbgpt/schema-form-widget/contribution.ts rename to archive/libro-server/lab/src/pages/dbgpt/schema-form-widget/contribution.ts diff --git a/libro-server/lab/src/pages/dbgpt/schema-form-widget/index.less b/archive/libro-server/lab/src/pages/dbgpt/schema-form-widget/index.less similarity index 100% rename from libro-server/lab/src/pages/dbgpt/schema-form-widget/index.less rename to archive/libro-server/lab/src/pages/dbgpt/schema-form-widget/index.less diff --git a/libro-server/lab/src/pages/dbgpt/schema-form-widget/index.ts b/archive/libro-server/lab/src/pages/dbgpt/schema-form-widget/index.ts similarity index 100% rename from libro-server/lab/src/pages/dbgpt/schema-form-widget/index.ts rename to archive/libro-server/lab/src/pages/dbgpt/schema-form-widget/index.ts diff --git a/libro-server/lab/src/pages/dbgpt/schema-form-widget/view.tsx b/archive/libro-server/lab/src/pages/dbgpt/schema-form-widget/view.tsx similarity index 100% rename from libro-server/lab/src/pages/dbgpt/schema-form-widget/view.tsx rename to archive/libro-server/lab/src/pages/dbgpt/schema-form-widget/view.tsx diff --git a/libro-server/lab/src/pages/execution/app.ts b/archive/libro-server/lab/src/pages/execution/app.ts similarity index 100% rename from libro-server/lab/src/pages/execution/app.ts rename to archive/libro-server/lab/src/pages/execution/app.ts diff --git a/libro-server/lab/src/pages/execution/default-dnd-content.tsx b/archive/libro-server/lab/src/pages/execution/default-dnd-content.tsx similarity index 100% rename from libro-server/lab/src/pages/execution/default-dnd-content.tsx rename to archive/libro-server/lab/src/pages/execution/default-dnd-content.tsx diff --git a/libro-server/lab/src/pages/execution/dnd-cell-item-render.tsx b/archive/libro-server/lab/src/pages/execution/dnd-cell-item-render.tsx similarity index 100% rename from libro-server/lab/src/pages/execution/dnd-cell-item-render.tsx rename to archive/libro-server/lab/src/pages/execution/dnd-cell-item-render.tsx diff --git a/libro-server/lab/src/pages/execution/execution-file.tsx b/archive/libro-server/lab/src/pages/execution/execution-file.tsx similarity index 100% rename from libro-server/lab/src/pages/execution/execution-file.tsx rename to archive/libro-server/lab/src/pages/execution/execution-file.tsx diff --git a/libro-server/lab/src/pages/execution/execution-view.tsx b/archive/libro-server/lab/src/pages/execution/execution-view.tsx similarity index 100% rename from libro-server/lab/src/pages/execution/execution-view.tsx rename to archive/libro-server/lab/src/pages/execution/execution-view.tsx diff --git a/libro-server/lab/src/pages/execution/index.less b/archive/libro-server/lab/src/pages/execution/index.less similarity index 100% rename from libro-server/lab/src/pages/execution/index.less rename to archive/libro-server/lab/src/pages/execution/index.less diff --git a/libro-server/lab/src/pages/execution/index.tsx b/archive/libro-server/lab/src/pages/execution/index.tsx similarity index 100% rename from libro-server/lab/src/pages/execution/index.tsx rename to archive/libro-server/lab/src/pages/execution/index.tsx diff --git a/libro-server/lab/src/pages/execution/layout.tsx b/archive/libro-server/lab/src/pages/execution/layout.tsx similarity index 100% rename from libro-server/lab/src/pages/execution/layout.tsx rename to archive/libro-server/lab/src/pages/execution/layout.tsx diff --git a/libro-server/lab/src/pages/execution/libro-app-view.tsx b/archive/libro-server/lab/src/pages/execution/libro-app-view.tsx similarity index 100% rename from libro-server/lab/src/pages/execution/libro-app-view.tsx rename to archive/libro-server/lab/src/pages/execution/libro-app-view.tsx diff --git a/libro-server/lab/src/pages/interaction/app.ts b/archive/libro-server/lab/src/pages/interaction/app.ts similarity index 100% rename from libro-server/lab/src/pages/interaction/app.ts rename to archive/libro-server/lab/src/pages/interaction/app.ts diff --git a/libro-server/lab/src/pages/interaction/default-dnd-content.tsx b/archive/libro-server/lab/src/pages/interaction/default-dnd-content.tsx similarity index 100% rename from libro-server/lab/src/pages/interaction/default-dnd-content.tsx rename to archive/libro-server/lab/src/pages/interaction/default-dnd-content.tsx diff --git a/libro-server/lab/src/pages/interaction/dnd-cell-item-render.tsx b/archive/libro-server/lab/src/pages/interaction/dnd-cell-item-render.tsx similarity index 100% rename from libro-server/lab/src/pages/interaction/dnd-cell-item-render.tsx rename to archive/libro-server/lab/src/pages/interaction/dnd-cell-item-render.tsx diff --git a/libro-server/lab/src/pages/interaction/execution-file.tsx b/archive/libro-server/lab/src/pages/interaction/execution-file.tsx similarity index 100% rename from libro-server/lab/src/pages/interaction/execution-file.tsx rename to archive/libro-server/lab/src/pages/interaction/execution-file.tsx diff --git a/libro-server/lab/src/pages/interaction/execution-view.tsx b/archive/libro-server/lab/src/pages/interaction/execution-view.tsx similarity index 100% rename from libro-server/lab/src/pages/interaction/execution-view.tsx rename to archive/libro-server/lab/src/pages/interaction/execution-view.tsx diff --git a/libro-server/lab/src/pages/interaction/index.less b/archive/libro-server/lab/src/pages/interaction/index.less similarity index 100% rename from libro-server/lab/src/pages/interaction/index.less rename to archive/libro-server/lab/src/pages/interaction/index.less diff --git a/libro-server/lab/src/pages/interaction/index.tsx b/archive/libro-server/lab/src/pages/interaction/index.tsx similarity index 100% rename from libro-server/lab/src/pages/interaction/index.tsx rename to archive/libro-server/lab/src/pages/interaction/index.tsx diff --git a/libro-server/lab/src/pages/interaction/layout.tsx b/archive/libro-server/lab/src/pages/interaction/layout.tsx similarity index 100% rename from libro-server/lab/src/pages/interaction/layout.tsx rename to archive/libro-server/lab/src/pages/interaction/layout.tsx diff --git a/libro-server/lab/src/pages/interaction/libro-app-view.tsx b/archive/libro-server/lab/src/pages/interaction/libro-app-view.tsx similarity index 100% rename from libro-server/lab/src/pages/interaction/libro-app-view.tsx rename to archive/libro-server/lab/src/pages/interaction/libro-app-view.tsx diff --git a/libro-server/lab/src/pages/libro/app.ts b/archive/libro-server/lab/src/pages/libro/app.ts similarity index 100% rename from libro-server/lab/src/pages/libro/app.ts rename to archive/libro-server/lab/src/pages/libro/app.ts diff --git a/libro-server/lab/src/pages/libro/index.less b/archive/libro-server/lab/src/pages/libro/index.less similarity index 100% rename from libro-server/lab/src/pages/libro/index.less rename to archive/libro-server/lab/src/pages/libro/index.less diff --git a/libro-server/lab/src/pages/libro/index.tsx b/archive/libro-server/lab/src/pages/libro/index.tsx similarity index 100% rename from libro-server/lab/src/pages/libro/index.tsx rename to archive/libro-server/lab/src/pages/libro/index.tsx diff --git a/libro-server/lab/src/pages/libro/libro-config.ts b/archive/libro-server/lab/src/pages/libro/libro-config.ts similarity index 100% rename from libro-server/lab/src/pages/libro/libro-config.ts rename to archive/libro-server/lab/src/pages/libro/libro-config.ts diff --git a/libro-server/lab/src/pages/libro/prompt-script.ts b/archive/libro-server/lab/src/pages/libro/prompt-script.ts similarity index 100% rename from libro-server/lab/src/pages/libro/prompt-script.ts rename to archive/libro-server/lab/src/pages/libro/prompt-script.ts diff --git a/libro-server/lab/src/pages/libro/schema-form-widget/contribution.ts b/archive/libro-server/lab/src/pages/libro/schema-form-widget/contribution.ts similarity index 100% rename from libro-server/lab/src/pages/libro/schema-form-widget/contribution.ts rename to archive/libro-server/lab/src/pages/libro/schema-form-widget/contribution.ts diff --git a/libro-server/lab/src/pages/libro/schema-form-widget/index.less b/archive/libro-server/lab/src/pages/libro/schema-form-widget/index.less similarity index 100% rename from libro-server/lab/src/pages/libro/schema-form-widget/index.less rename to archive/libro-server/lab/src/pages/libro/schema-form-widget/index.less diff --git a/libro-server/lab/src/pages/libro/schema-form-widget/index.ts b/archive/libro-server/lab/src/pages/libro/schema-form-widget/index.ts similarity index 100% rename from libro-server/lab/src/pages/libro/schema-form-widget/index.ts rename to archive/libro-server/lab/src/pages/libro/schema-form-widget/index.ts diff --git a/libro-server/lab/src/pages/libro/schema-form-widget/view.tsx b/archive/libro-server/lab/src/pages/libro/schema-form-widget/view.tsx similarity index 100% rename from libro-server/lab/src/pages/libro/schema-form-widget/view.tsx rename to archive/libro-server/lab/src/pages/libro/schema-form-widget/view.tsx diff --git a/libro-server/lab/tsconfig.json b/archive/libro-server/lab/tsconfig.json similarity index 100% rename from libro-server/lab/tsconfig.json rename to archive/libro-server/lab/tsconfig.json diff --git a/libro-server/lab/typings.d.ts b/archive/libro-server/lab/typings.d.ts similarity index 100% rename from libro-server/lab/typings.d.ts rename to archive/libro-server/lab/typings.d.ts diff --git a/libro-server/lab/typings/index.d.ts b/archive/libro-server/lab/typings/index.d.ts similarity index 100% rename from libro-server/lab/typings/index.d.ts rename to archive/libro-server/lab/typings/index.d.ts diff --git a/libro-server/lab/umi-plugin-router.ts b/archive/libro-server/lab/umi-plugin-router.ts similarity index 100% rename from libro-server/lab/umi-plugin-router.ts rename to archive/libro-server/lab/umi-plugin-router.ts diff --git a/libro-server/libro-ai/.gitignore b/archive/libro-server/libro-ai/.gitignore similarity index 100% rename from libro-server/libro-ai/.gitignore rename to archive/libro-server/libro-ai/.gitignore diff --git a/libro-server/libro-ai/.python-version b/archive/libro-server/libro-ai/.python-version similarity index 100% rename from libro-server/libro-ai/.python-version rename to archive/libro-server/libro-ai/.python-version diff --git a/libro-server/libro-ai/README.md b/archive/libro-server/libro-ai/README.md similarity index 100% rename from libro-server/libro-ai/README.md rename to archive/libro-server/libro-ai/README.md diff --git a/libro-server/libro-ai/pyproject.toml b/archive/libro-server/libro-ai/pyproject.toml similarity index 100% rename from libro-server/libro-ai/pyproject.toml rename to archive/libro-server/libro-ai/pyproject.toml diff --git a/libro-server/libro-ai/src/libro_ai/__init__.py b/archive/libro-server/libro-ai/src/libro_ai/__init__.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/__init__.py rename to archive/libro-server/libro-ai/src/libro_ai/__init__.py diff --git a/libro-server/libro-ai/src/libro_ai/_version.py b/archive/libro-server/libro-ai/src/libro_ai/_version.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/_version.py rename to archive/libro-server/libro-ai/src/libro_ai/_version.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/__init__.py b/archive/libro-server/libro-ai/src/libro_ai/chat/__init__.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/__init__.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/__init__.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/chat_message.py b/archive/libro-server/libro-ai/src/libro_ai/chat/chat_message.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/chat_message.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/chat_message.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/chat_record.py b/archive/libro-server/libro-ai/src/libro_ai/chat/chat_record.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/chat_record.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/chat_record.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/debug_executor.py b/archive/libro-server/libro-ai/src/libro_ai/chat/debug_executor.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/debug_executor.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/debug_executor.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/debug_provider.py b/archive/libro-server/libro-ai/src/libro_ai/chat/debug_provider.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/debug_provider.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/debug_provider.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/executor.py b/archive/libro-server/libro-ai/src/libro_ai/chat/executor.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/executor.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/executor.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/interpreter_executor.py b/archive/libro-server/libro-ai/src/libro_ai/chat/interpreter_executor.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/interpreter_executor.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/interpreter_executor.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/interpreter_provider.py b/archive/libro-server/libro-ai/src/libro_ai/chat/interpreter_provider.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/interpreter_provider.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/interpreter_provider.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/item.py b/archive/libro-server/libro-ai/src/libro_ai/chat/item.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/item.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/item.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/langchain_variable.py b/archive/libro-server/libro-ai/src/libro_ai/chat/langchain_variable.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/langchain_variable.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/langchain_variable.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/langchain_variable_executor.py b/archive/libro-server/libro-ai/src/libro_ai/chat/langchain_variable_executor.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/langchain_variable_executor.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/langchain_variable_executor.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/object.py b/archive/libro-server/libro-ai/src/libro_ai/chat/object.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/object.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/object.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/object_manager.py b/archive/libro-server/libro-ai/src/libro_ai/chat/object_manager.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/object_manager.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/object_manager.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/openai_chat_executor.py b/archive/libro-server/libro-ai/src/libro_ai/chat/openai_chat_executor.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/openai_chat_executor.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/openai_chat_executor.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/openai_chat_provider.py b/archive/libro-server/libro-ai/src/libro_ai/chat/openai_chat_provider.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/openai_chat_provider.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/openai_chat_provider.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/provider.py b/archive/libro-server/libro-ai/src/libro_ai/chat/provider.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/provider.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/provider.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/qwen_chat_executor.py b/archive/libro-server/libro-ai/src/libro_ai/chat/qwen_chat_executor.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/qwen_chat_executor.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/qwen_chat_executor.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/qwen_chat_provider.py b/archive/libro-server/libro-ai/src/libro_ai/chat/qwen_chat_provider.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/qwen_chat_provider.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/qwen_chat_provider.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/source.py b/archive/libro-server/libro-ai/src/libro_ai/chat/source.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/source.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/source.py diff --git a/libro-server/libro-ai/src/libro_ai/chat/utils.py b/archive/libro-server/libro-ai/src/libro_ai/chat/utils.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/chat/utils.py rename to archive/libro-server/libro-ai/src/libro_ai/chat/utils.py diff --git a/libro-server/libro-ai/src/libro_ai/extensions.py b/archive/libro-server/libro-ai/src/libro_ai/extensions.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/extensions.py rename to archive/libro-server/libro-ai/src/libro_ai/extensions.py diff --git a/libro-server/libro-ai/src/libro_ai/magics/__init__.py b/archive/libro-server/libro-ai/src/libro_ai/magics/__init__.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/magics/__init__.py rename to archive/libro-server/libro-ai/src/libro_ai/magics/__init__.py diff --git a/libro-server/libro-ai/src/libro_ai/magics/exception.py b/archive/libro-server/libro-ai/src/libro_ai/magics/exception.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/magics/exception.py rename to archive/libro-server/libro-ai/src/libro_ai/magics/exception.py diff --git a/libro-server/libro-ai/src/libro_ai/magics/prompt_magic.py b/archive/libro-server/libro-ai/src/libro_ai/magics/prompt_magic.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/magics/prompt_magic.py rename to archive/libro-server/libro-ai/src/libro_ai/magics/prompt_magic.py diff --git a/libro-server/libro-ai/src/libro_ai/utils/__init__.py b/archive/libro-server/libro-ai/src/libro_ai/utils/__init__.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/utils/__init__.py rename to archive/libro-server/libro-ai/src/libro_ai/utils/__init__.py diff --git a/libro-server/libro-ai/src/libro_ai/utils/base.py b/archive/libro-server/libro-ai/src/libro_ai/utils/base.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/utils/base.py rename to archive/libro-server/libro-ai/src/libro_ai/utils/base.py diff --git a/libro-server/libro-ai/src/libro_ai/utils/inspector.py b/archive/libro-server/libro-ai/src/libro_ai/utils/inspector.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/utils/inspector.py rename to archive/libro-server/libro-ai/src/libro_ai/utils/inspector.py diff --git a/libro-server/libro-ai/src/libro_ai/utils/langchain.py b/archive/libro-server/libro-ai/src/libro_ai/utils/langchain.py similarity index 100% rename from libro-server/libro-ai/src/libro_ai/utils/langchain.py rename to archive/libro-server/libro-ai/src/libro_ai/utils/langchain.py diff --git a/libro-server/libro-core/.gitignore b/archive/libro-server/libro-core/.gitignore similarity index 100% rename from libro-server/libro-core/.gitignore rename to archive/libro-server/libro-core/.gitignore diff --git a/libro-server/libro-core/.python-version b/archive/libro-server/libro-core/.python-version similarity index 100% rename from libro-server/libro-core/.python-version rename to archive/libro-server/libro-core/.python-version diff --git a/libro-server/libro-core/README.md b/archive/libro-server/libro-core/README.md similarity index 100% rename from libro-server/libro-core/README.md rename to archive/libro-server/libro-core/README.md diff --git a/libro-server/libro-core/pyproject.toml b/archive/libro-server/libro-core/pyproject.toml similarity index 100% rename from libro-server/libro-core/pyproject.toml rename to archive/libro-server/libro-core/pyproject.toml diff --git a/libro-server/libro-core/src/libro_core/__init__.py b/archive/libro-server/libro-core/src/libro_core/__init__.py similarity index 100% rename from libro-server/libro-core/src/libro_core/__init__.py rename to archive/libro-server/libro-core/src/libro_core/__init__.py diff --git a/libro-server/libro-core/src/libro_core/_version.py b/archive/libro-server/libro-core/src/libro_core/_version.py similarity index 100% rename from libro-server/libro-core/src/libro_core/_version.py rename to archive/libro-server/libro-core/src/libro_core/_version.py diff --git a/libro-server/libro-core/src/libro_core/config.py b/archive/libro-server/libro-core/src/libro_core/config.py similarity index 100% rename from libro-server/libro-core/src/libro_core/config.py rename to archive/libro-server/libro-core/src/libro_core/config.py diff --git a/libro-server/libro-flow/.gitignore b/archive/libro-server/libro-flow/.gitignore similarity index 100% rename from libro-server/libro-flow/.gitignore rename to archive/libro-server/libro-flow/.gitignore diff --git a/libro-server/libro-flow/.python-version b/archive/libro-server/libro-flow/.python-version similarity index 100% rename from libro-server/libro-flow/.python-version rename to archive/libro-server/libro-flow/.python-version diff --git a/libro-server/libro-flow/README.md b/archive/libro-server/libro-flow/README.md similarity index 100% rename from libro-server/libro-flow/README.md rename to archive/libro-server/libro-flow/README.md diff --git a/libro-server/libro-flow/pyproject.toml b/archive/libro-server/libro-flow/pyproject.toml similarity index 100% rename from libro-server/libro-flow/pyproject.toml rename to archive/libro-server/libro-flow/pyproject.toml diff --git a/libro-server/libro-flow/src/libro_flow/__init__.py b/archive/libro-server/libro-flow/src/libro_flow/__init__.py similarity index 100% rename from libro-server/libro-flow/src/libro_flow/__init__.py rename to archive/libro-server/libro-flow/src/libro_flow/__init__.py diff --git a/libro-server/libro-flow/src/libro_flow/_version.py b/archive/libro-server/libro-flow/src/libro_flow/_version.py similarity index 100% rename from libro-server/libro-flow/src/libro_flow/_version.py rename to archive/libro-server/libro-flow/src/libro_flow/_version.py diff --git a/libro-server/libro-flow/src/libro_flow/execution_handler.py b/archive/libro-server/libro-flow/src/libro_flow/execution_handler.py similarity index 100% rename from libro-server/libro-flow/src/libro_flow/execution_handler.py rename to archive/libro-server/libro-flow/src/libro_flow/execution_handler.py diff --git a/libro-server/libro-flow/src/libro_flow/libro_client.py b/archive/libro-server/libro-flow/src/libro_flow/libro_client.py similarity index 100% rename from libro-server/libro-flow/src/libro_flow/libro_client.py rename to archive/libro-server/libro-flow/src/libro_flow/libro_client.py diff --git a/libro-server/libro-flow/src/libro_flow/libro_execution.py b/archive/libro-server/libro-flow/src/libro_flow/libro_execution.py similarity index 100% rename from libro-server/libro-flow/src/libro_flow/libro_execution.py rename to archive/libro-server/libro-flow/src/libro_flow/libro_execution.py diff --git a/libro-server/libro-flow/src/libro_flow/libro_schema_form_widget.py b/archive/libro-server/libro-flow/src/libro_flow/libro_schema_form_widget.py similarity index 100% rename from libro-server/libro-flow/src/libro_flow/libro_schema_form_widget.py rename to archive/libro-server/libro-flow/src/libro_flow/libro_schema_form_widget.py diff --git a/libro-server/libro-server/.gitignore b/archive/libro-server/libro-server/.gitignore similarity index 100% rename from libro-server/libro-server/.gitignore rename to archive/libro-server/libro-server/.gitignore diff --git a/libro-server/libro-server/.npmrc b/archive/libro-server/libro-server/.npmrc similarity index 100% rename from libro-server/libro-server/.npmrc rename to archive/libro-server/libro-server/.npmrc diff --git a/libro-server/libro-server/.python-version b/archive/libro-server/libro-server/.python-version similarity index 100% rename from libro-server/libro-server/.python-version rename to archive/libro-server/libro-server/.python-version diff --git a/libro-server/libro-server/README.md b/archive/libro-server/libro-server/README.md similarity index 100% rename from libro-server/libro-server/README.md rename to archive/libro-server/libro-server/README.md diff --git a/libro-server/libro-server/package.json b/archive/libro-server/libro-server/package.json similarity index 100% rename from libro-server/libro-server/package.json rename to archive/libro-server/libro-server/package.json diff --git a/libro-server/libro-server/pyproject.toml b/archive/libro-server/libro-server/pyproject.toml similarity index 100% rename from libro-server/libro-server/pyproject.toml rename to archive/libro-server/libro-server/pyproject.toml diff --git a/libro-server/libro-server/src/dev-config/jupyter_server_config.py b/archive/libro-server/libro-server/src/dev-config/jupyter_server_config.py similarity index 100% rename from libro-server/libro-server/src/dev-config/jupyter_server_config.py rename to archive/libro-server/libro-server/src/dev-config/jupyter_server_config.py diff --git a/libro-server/libro-server/src/libro_server/__init__.py b/archive/libro-server/libro-server/src/libro_server/__init__.py similarity index 100% rename from libro-server/libro-server/src/libro_server/__init__.py rename to archive/libro-server/libro-server/src/libro_server/__init__.py diff --git a/libro-server/libro-server/src/libro_server/_version.py b/archive/libro-server/libro-server/src/libro_server/_version.py similarity index 100% rename from libro-server/libro-server/src/libro_server/_version.py rename to archive/libro-server/libro-server/src/libro_server/_version.py diff --git a/libro-server/libro-server/src/libro_server/app.py b/archive/libro-server/libro-server/src/libro_server/app.py similarity index 100% rename from libro-server/libro-server/src/libro_server/app.py rename to archive/libro-server/libro-server/src/libro_server/app.py diff --git a/libro-server/libro-server/src/libro_server/entrypoint.py b/archive/libro-server/libro-server/src/libro_server/entrypoint.py similarity index 100% rename from libro-server/libro-server/src/libro_server/entrypoint.py rename to archive/libro-server/libro-server/src/libro_server/entrypoint.py diff --git a/libro-server/libro-server/src/libro_server/generate_libro_config.py b/archive/libro-server/libro-server/src/libro_server/generate_libro_config.py similarity index 100% rename from libro-server/libro-server/src/libro_server/generate_libro_config.py rename to archive/libro-server/libro-server/src/libro_server/generate_libro_config.py diff --git a/libro-server/libro-server/src/libro_server/jupyter_config.py b/archive/libro-server/libro-server/src/libro_server/jupyter_config.py similarity index 100% rename from libro-server/libro-server/src/libro_server/jupyter_config.py rename to archive/libro-server/libro-server/src/libro_server/jupyter_config.py diff --git a/libro-server/libro-server/src/libro_server/libro_ai_handler.py b/archive/libro-server/libro-server/src/libro_server/libro_ai_handler.py similarity index 100% rename from libro-server/libro-server/src/libro_server/libro_ai_handler.py rename to archive/libro-server/libro-server/src/libro_server/libro_ai_handler.py diff --git a/libro-server/libro-server/src/libro_server/libro_kernel_manager.py b/archive/libro-server/libro-server/src/libro_server/libro_kernel_manager.py similarity index 100% rename from libro-server/libro-server/src/libro_server/libro_kernel_manager.py rename to archive/libro-server/libro-server/src/libro_server/libro_kernel_manager.py diff --git a/libro-server/libro-server/src/libro_server/static_handler.py b/archive/libro-server/libro-server/src/libro_server/static_handler.py similarity index 100% rename from libro-server/libro-server/src/libro_server/static_handler.py rename to archive/libro-server/libro-server/src/libro_server/static_handler.py diff --git a/libro-server/libro-server/src/libro_server/templates/error.html b/archive/libro-server/libro-server/src/libro_server/templates/error.html similarity index 100% rename from libro-server/libro-server/src/libro_server/templates/error.html rename to archive/libro-server/libro-server/src/libro_server/templates/error.html diff --git a/libro-server/libro-server/src/libro_server/templates/libro.html b/archive/libro-server/libro-server/src/libro_server/templates/libro.html similarity index 100% rename from libro-server/libro-server/src/libro_server/templates/libro.html rename to archive/libro-server/libro-server/src/libro_server/templates/libro.html diff --git a/libro-server/libro-server/src/libro_server/templates/page.html b/archive/libro-server/libro-server/src/libro_server/templates/page.html similarity index 100% rename from libro-server/libro-server/src/libro_server/templates/page.html rename to archive/libro-server/libro-server/src/libro_server/templates/page.html diff --git a/libro-server/libro-server/src/libro_server/workspace_handler.py b/archive/libro-server/libro-server/src/libro_server/workspace_handler.py similarity index 100% rename from libro-server/libro-server/src/libro_server/workspace_handler.py rename to archive/libro-server/libro-server/src/libro_server/workspace_handler.py diff --git a/libro-server/libro-sql/.gitignore b/archive/libro-server/libro-sql/.gitignore similarity index 100% rename from libro-server/libro-sql/.gitignore rename to archive/libro-server/libro-sql/.gitignore diff --git a/libro-server/libro-sql/.python-version b/archive/libro-server/libro-sql/.python-version similarity index 100% rename from libro-server/libro-sql/.python-version rename to archive/libro-server/libro-sql/.python-version diff --git a/libro-server/libro-sql/README.md b/archive/libro-server/libro-sql/README.md similarity index 100% rename from libro-server/libro-sql/README.md rename to archive/libro-server/libro-sql/README.md diff --git a/libro-server/libro-sql/pyproject.toml b/archive/libro-server/libro-sql/pyproject.toml similarity index 100% rename from libro-server/libro-sql/pyproject.toml rename to archive/libro-server/libro-sql/pyproject.toml diff --git a/libro-server/libro-sql/src/libro_sql/__init__.py b/archive/libro-server/libro-sql/src/libro_sql/__init__.py similarity index 100% rename from libro-server/libro-sql/src/libro_sql/__init__.py rename to archive/libro-server/libro-sql/src/libro_sql/__init__.py diff --git a/libro-server/libro-sql/src/libro_sql/_version.py b/archive/libro-server/libro-sql/src/libro_sql/_version.py similarity index 100% rename from libro-server/libro-sql/src/libro_sql/_version.py rename to archive/libro-server/libro-sql/src/libro_sql/_version.py diff --git a/libro-server/libro-sql/src/libro_sql/database.py b/archive/libro-server/libro-sql/src/libro_sql/database.py similarity index 100% rename from libro-server/libro-sql/src/libro_sql/database.py rename to archive/libro-server/libro-sql/src/libro_sql/database.py diff --git a/libro-server/libro-sql/src/libro_sql/exception.py b/archive/libro-server/libro-sql/src/libro_sql/exception.py similarity index 100% rename from libro-server/libro-sql/src/libro_sql/exception.py rename to archive/libro-server/libro-sql/src/libro_sql/exception.py diff --git a/libro-server/libro-sql/src/libro_sql/extensions.py b/archive/libro-server/libro-sql/src/libro_sql/extensions.py similarity index 100% rename from libro-server/libro-sql/src/libro_sql/extensions.py rename to archive/libro-server/libro-sql/src/libro_sql/extensions.py diff --git a/libro-server/libro-sql/src/libro_sql/sql_magic.py b/archive/libro-server/libro-sql/src/libro_sql/sql_magic.py similarity index 100% rename from libro-server/libro-sql/src/libro_sql/sql_magic.py rename to archive/libro-server/libro-sql/src/libro_sql/sql_magic.py diff --git a/libro-server/libro/.gitignore b/archive/libro-server/libro/.gitignore similarity index 100% rename from libro-server/libro/.gitignore rename to archive/libro-server/libro/.gitignore diff --git a/libro-server/libro/.python-version b/archive/libro-server/libro/.python-version similarity index 100% rename from libro-server/libro/.python-version rename to archive/libro-server/libro/.python-version diff --git a/libro-server/libro/README.md b/archive/libro-server/libro/README.md similarity index 100% rename from libro-server/libro/README.md rename to archive/libro-server/libro/README.md diff --git a/libro-server/libro/pyproject.toml b/archive/libro-server/libro/pyproject.toml similarity index 100% rename from libro-server/libro/pyproject.toml rename to archive/libro-server/libro/pyproject.toml diff --git a/libro-server/libro/src/libro/__init__.py b/archive/libro-server/libro/src/libro/__init__.py similarity index 100% rename from libro-server/libro/src/libro/__init__.py rename to archive/libro-server/libro/src/libro/__init__.py diff --git a/libro-server/libro/src/libro/_version.py b/archive/libro-server/libro/src/libro/_version.py similarity index 100% rename from libro-server/libro/src/libro/_version.py rename to archive/libro-server/libro/src/libro/_version.py diff --git a/libro-server/pyproject.toml b/archive/libro-server/pyproject.toml similarity index 100% rename from libro-server/pyproject.toml rename to archive/libro-server/pyproject.toml diff --git a/libro-server/requirements-dev.lock b/archive/libro-server/requirements-dev.lock similarity index 100% rename from libro-server/requirements-dev.lock rename to archive/libro-server/requirements-dev.lock diff --git a/libro-server/requirements.lock b/archive/libro-server/requirements.lock similarity index 100% rename from libro-server/requirements.lock rename to archive/libro-server/requirements.lock diff --git a/opensumi-module-libro/.dumirc.ts b/archive/opensumi-module-libro/.dumirc.ts similarity index 100% rename from opensumi-module-libro/.dumirc.ts rename to archive/opensumi-module-libro/.dumirc.ts diff --git a/opensumi-module-libro/.editorconfig b/archive/opensumi-module-libro/.editorconfig similarity index 100% rename from opensumi-module-libro/.editorconfig rename to archive/opensumi-module-libro/.editorconfig diff --git a/opensumi-module-libro/.eslintignore b/archive/opensumi-module-libro/.eslintignore similarity index 100% rename from opensumi-module-libro/.eslintignore rename to archive/opensumi-module-libro/.eslintignore diff --git a/opensumi-module-libro/.eslintrc.js b/archive/opensumi-module-libro/.eslintrc.js similarity index 100% rename from opensumi-module-libro/.eslintrc.js rename to archive/opensumi-module-libro/.eslintrc.js diff --git a/opensumi-module-libro/.fatherrc.ts b/archive/opensumi-module-libro/.fatherrc.ts similarity index 100% rename from opensumi-module-libro/.fatherrc.ts rename to archive/opensumi-module-libro/.fatherrc.ts diff --git a/opensumi-module-libro/.husky/commit-msg b/archive/opensumi-module-libro/.husky/commit-msg similarity index 100% rename from opensumi-module-libro/.husky/commit-msg rename to archive/opensumi-module-libro/.husky/commit-msg diff --git a/opensumi-module-libro/.husky/pre-commit b/archive/opensumi-module-libro/.husky/pre-commit similarity index 100% rename from opensumi-module-libro/.husky/pre-commit rename to archive/opensumi-module-libro/.husky/pre-commit diff --git a/opensumi-module-libro/.node-version b/archive/opensumi-module-libro/.node-version similarity index 100% rename from opensumi-module-libro/.node-version rename to archive/opensumi-module-libro/.node-version diff --git a/opensumi-module-libro/.npmrc b/archive/opensumi-module-libro/.npmrc similarity index 100% rename from opensumi-module-libro/.npmrc rename to archive/opensumi-module-libro/.npmrc diff --git a/opensumi-module-libro/.prettierignore b/archive/opensumi-module-libro/.prettierignore similarity index 100% rename from opensumi-module-libro/.prettierignore rename to archive/opensumi-module-libro/.prettierignore diff --git a/opensumi-module-libro/.prettierrc.js b/archive/opensumi-module-libro/.prettierrc.js similarity index 100% rename from opensumi-module-libro/.prettierrc.js rename to archive/opensumi-module-libro/.prettierrc.js diff --git a/opensumi-module-libro/.stylelintignore b/archive/opensumi-module-libro/.stylelintignore similarity index 100% rename from opensumi-module-libro/.stylelintignore rename to archive/opensumi-module-libro/.stylelintignore diff --git a/opensumi-module-libro/.stylelintrc b/archive/opensumi-module-libro/.stylelintrc similarity index 100% rename from opensumi-module-libro/.stylelintrc rename to archive/opensumi-module-libro/.stylelintrc diff --git a/opensumi-module-libro/.vscode/launch.json b/archive/opensumi-module-libro/.vscode/launch.json similarity index 100% rename from opensumi-module-libro/.vscode/launch.json rename to archive/opensumi-module-libro/.vscode/launch.json diff --git a/opensumi-module-libro/.vscode/settings.json b/archive/opensumi-module-libro/.vscode/settings.json similarity index 100% rename from opensumi-module-libro/.vscode/settings.json rename to archive/opensumi-module-libro/.vscode/settings.json diff --git a/opensumi-module-libro/LICENSE b/archive/opensumi-module-libro/LICENSE similarity index 100% rename from opensumi-module-libro/LICENSE rename to archive/opensumi-module-libro/LICENSE diff --git a/opensumi-module-libro/README.md b/archive/opensumi-module-libro/README.md similarity index 100% rename from opensumi-module-libro/README.md rename to archive/opensumi-module-libro/README.md diff --git a/opensumi-module-libro/assets/arch.png b/archive/opensumi-module-libro/assets/arch.png similarity index 100% rename from opensumi-module-libro/assets/arch.png rename to archive/opensumi-module-libro/assets/arch.png diff --git a/opensumi-module-libro/assets/image.png b/archive/opensumi-module-libro/assets/image.png similarity index 100% rename from opensumi-module-libro/assets/image.png rename to archive/opensumi-module-libro/assets/image.png diff --git a/opensumi-module-libro/docs/guide.md b/archive/opensumi-module-libro/docs/guide.md similarity index 100% rename from opensumi-module-libro/docs/guide.md rename to archive/opensumi-module-libro/docs/guide.md diff --git a/opensumi-module-libro/docs/index.md b/archive/opensumi-module-libro/docs/index.md similarity index 100% rename from opensumi-module-libro/docs/index.md rename to archive/opensumi-module-libro/docs/index.md diff --git a/opensumi-module-libro/docs/opensumi-demo-app/index.md b/archive/opensumi-module-libro/docs/opensumi-demo-app/index.md similarity index 100% rename from opensumi-module-libro/docs/opensumi-demo-app/index.md rename to archive/opensumi-module-libro/docs/opensumi-demo-app/index.md diff --git a/opensumi-module-libro/example/configs/docker/productionDependencies.json b/archive/opensumi-module-libro/example/configs/docker/productionDependencies.json similarity index 100% rename from opensumi-module-libro/example/configs/docker/productionDependencies.json rename to archive/opensumi-module-libro/example/configs/docker/productionDependencies.json diff --git a/opensumi-module-libro/example/configs/webpack.browser.config.js b/archive/opensumi-module-libro/example/configs/webpack.browser.config.js similarity index 100% rename from opensumi-module-libro/example/configs/webpack.browser.config.js rename to archive/opensumi-module-libro/example/configs/webpack.browser.config.js diff --git a/opensumi-module-libro/example/configs/webpack.ext-host.config.js b/archive/opensumi-module-libro/example/configs/webpack.ext-host.config.js similarity index 100% rename from opensumi-module-libro/example/configs/webpack.ext-host.config.js rename to archive/opensumi-module-libro/example/configs/webpack.ext-host.config.js diff --git a/opensumi-module-libro/example/configs/webpack.node.config.js b/archive/opensumi-module-libro/example/configs/webpack.node.config.js similarity index 100% rename from opensumi-module-libro/example/configs/webpack.node.config.js rename to archive/opensumi-module-libro/example/configs/webpack.node.config.js diff --git a/opensumi-module-libro/example/configs/webpack.webview.config.js b/archive/opensumi-module-libro/example/configs/webpack.webview.config.js similarity index 100% rename from opensumi-module-libro/example/configs/webpack.webview.config.js rename to archive/opensumi-module-libro/example/configs/webpack.webview.config.js diff --git a/opensumi-module-libro/example/configs/webpack.worker-host.config.js b/archive/opensumi-module-libro/example/configs/webpack.worker-host.config.js similarity index 100% rename from opensumi-module-libro/example/configs/webpack.worker-host.config.js rename to archive/opensumi-module-libro/example/configs/webpack.worker-host.config.js diff --git a/opensumi-module-libro/example/notebook.ipynb b/archive/opensumi-module-libro/example/notebook.ipynb similarity index 100% rename from opensumi-module-libro/example/notebook.ipynb rename to archive/opensumi-module-libro/example/notebook.ipynb diff --git a/opensumi-module-libro/example/public/index.html b/archive/opensumi-module-libro/example/public/index.html similarity index 100% rename from opensumi-module-libro/example/public/index.html rename to archive/opensumi-module-libro/example/public/index.html diff --git a/opensumi-module-libro/example/src/browser/common-modules.ts b/archive/opensumi-module-libro/example/src/browser/common-modules.ts similarity index 100% rename from opensumi-module-libro/example/src/browser/common-modules.ts rename to archive/opensumi-module-libro/example/src/browser/common-modules.ts diff --git a/opensumi-module-libro/example/src/browser/i18n/en-US.lang.ts b/archive/opensumi-module-libro/example/src/browser/i18n/en-US.lang.ts similarity index 100% rename from opensumi-module-libro/example/src/browser/i18n/en-US.lang.ts rename to archive/opensumi-module-libro/example/src/browser/i18n/en-US.lang.ts diff --git a/opensumi-module-libro/example/src/browser/i18n/index.ts b/archive/opensumi-module-libro/example/src/browser/i18n/index.ts similarity index 100% rename from opensumi-module-libro/example/src/browser/i18n/index.ts rename to archive/opensumi-module-libro/example/src/browser/i18n/index.ts diff --git a/opensumi-module-libro/example/src/browser/i18n/setup.ts b/archive/opensumi-module-libro/example/src/browser/i18n/setup.ts similarity index 100% rename from opensumi-module-libro/example/src/browser/i18n/setup.ts rename to archive/opensumi-module-libro/example/src/browser/i18n/setup.ts diff --git a/opensumi-module-libro/example/src/browser/i18n/zh-CN.lang.ts b/archive/opensumi-module-libro/example/src/browser/i18n/zh-CN.lang.ts similarity index 100% rename from opensumi-module-libro/example/src/browser/i18n/zh-CN.lang.ts rename to archive/opensumi-module-libro/example/src/browser/i18n/zh-CN.lang.ts diff --git a/opensumi-module-libro/example/src/browser/index.ts b/archive/opensumi-module-libro/example/src/browser/index.ts similarity index 100% rename from opensumi-module-libro/example/src/browser/index.ts rename to archive/opensumi-module-libro/example/src/browser/index.ts diff --git a/opensumi-module-libro/example/src/browser/mana-application.tsx b/archive/opensumi-module-libro/example/src/browser/mana-application.tsx similarity index 100% rename from opensumi-module-libro/example/src/browser/mana-application.tsx rename to archive/opensumi-module-libro/example/src/browser/mana-application.tsx diff --git a/opensumi-module-libro/example/src/browser/mana/demo-module.ts b/archive/opensumi-module-libro/example/src/browser/mana/demo-module.ts similarity index 100% rename from opensumi-module-libro/example/src/browser/mana/demo-module.ts rename to archive/opensumi-module-libro/example/src/browser/mana/demo-module.ts diff --git a/opensumi-module-libro/example/src/browser/mana/libro-application.ts b/archive/opensumi-module-libro/example/src/browser/mana/libro-application.ts similarity index 100% rename from opensumi-module-libro/example/src/browser/mana/libro-application.ts rename to archive/opensumi-module-libro/example/src/browser/mana/libro-application.ts diff --git a/opensumi-module-libro/example/src/browser/mana/test.json b/archive/opensumi-module-libro/example/src/browser/mana/test.json similarity index 100% rename from opensumi-module-libro/example/src/browser/mana/test.json rename to archive/opensumi-module-libro/example/src/browser/mana/test.json diff --git a/opensumi-module-libro/example/src/browser/render-app.ts b/archive/opensumi-module-libro/example/src/browser/render-app.ts similarity index 100% rename from opensumi-module-libro/example/src/browser/render-app.ts rename to archive/opensumi-module-libro/example/src/browser/render-app.ts diff --git a/opensumi-module-libro/example/src/browser/status-bar/status-bar.contribution.ts b/archive/opensumi-module-libro/example/src/browser/status-bar/status-bar.contribution.ts similarity index 100% rename from opensumi-module-libro/example/src/browser/status-bar/status-bar.contribution.ts rename to archive/opensumi-module-libro/example/src/browser/status-bar/status-bar.contribution.ts diff --git a/opensumi-module-libro/example/src/browser/styles.less b/archive/opensumi-module-libro/example/src/browser/styles.less similarity index 100% rename from opensumi-module-libro/example/src/browser/styles.less rename to archive/opensumi-module-libro/example/src/browser/styles.less diff --git a/opensumi-module-libro/example/src/extension/ext-host.js b/archive/opensumi-module-libro/example/src/extension/ext-host.js similarity index 100% rename from opensumi-module-libro/example/src/extension/ext-host.js rename to archive/opensumi-module-libro/example/src/extension/ext-host.js diff --git a/opensumi-module-libro/example/src/node/common-modules.ts b/archive/opensumi-module-libro/example/src/node/common-modules.ts similarity index 100% rename from opensumi-module-libro/example/src/node/common-modules.ts rename to archive/opensumi-module-libro/example/src/node/common-modules.ts diff --git a/opensumi-module-libro/example/src/node/index.ts b/archive/opensumi-module-libro/example/src/node/index.ts similarity index 100% rename from opensumi-module-libro/example/src/node/index.ts rename to archive/opensumi-module-libro/example/src/node/index.ts diff --git a/opensumi-module-libro/example/src/node/start-server.ts b/archive/opensumi-module-libro/example/src/node/start-server.ts similarity index 100% rename from opensumi-module-libro/example/src/node/start-server.ts rename to archive/opensumi-module-libro/example/src/node/start-server.ts diff --git a/opensumi-module-libro/example/templates/index.html b/archive/opensumi-module-libro/example/templates/index.html similarity index 100% rename from opensumi-module-libro/example/templates/index.html rename to archive/opensumi-module-libro/example/templates/index.html diff --git a/opensumi-module-libro/example/test.ipynb b/archive/opensumi-module-libro/example/test.ipynb similarity index 100% rename from opensumi-module-libro/example/test.ipynb rename to archive/opensumi-module-libro/example/test.ipynb diff --git a/opensumi-module-libro/example/tsconfig.json b/archive/opensumi-module-libro/example/tsconfig.json similarity index 100% rename from opensumi-module-libro/example/tsconfig.json rename to archive/opensumi-module-libro/example/tsconfig.json diff --git a/opensumi-module-libro/example/workspace/fakeDB.jsonconfig b/archive/opensumi-module-libro/example/workspace/fakeDB.jsonconfig similarity index 100% rename from opensumi-module-libro/example/workspace/fakeDB.jsonconfig rename to archive/opensumi-module-libro/example/workspace/fakeDB.jsonconfig diff --git a/opensumi-module-libro/example/workspace/index.antd-theme b/archive/opensumi-module-libro/example/workspace/index.antd-theme similarity index 100% rename from opensumi-module-libro/example/workspace/index.antd-theme rename to archive/opensumi-module-libro/example/workspace/index.antd-theme diff --git a/opensumi-module-libro/example/workspace/notebook.ipynb b/archive/opensumi-module-libro/example/workspace/notebook.ipynb similarity index 100% rename from opensumi-module-libro/example/workspace/notebook.ipynb rename to archive/opensumi-module-libro/example/workspace/notebook.ipynb diff --git a/opensumi-module-libro/jest.setup.node.js b/archive/opensumi-module-libro/jest.setup.node.js similarity index 100% rename from opensumi-module-libro/jest.setup.node.js rename to archive/opensumi-module-libro/jest.setup.node.js diff --git a/opensumi-module-libro/package.json b/archive/opensumi-module-libro/package.json similarity index 100% rename from opensumi-module-libro/package.json rename to archive/opensumi-module-libro/package.json diff --git a/opensumi-module-libro/scripts/download.js b/archive/opensumi-module-libro/scripts/download.js similarity index 100% rename from opensumi-module-libro/scripts/download.js rename to archive/opensumi-module-libro/scripts/download.js diff --git a/opensumi-module-libro/scripts/extensions.json b/archive/opensumi-module-libro/scripts/extensions.json similarity index 100% rename from opensumi-module-libro/scripts/extensions.json rename to archive/opensumi-module-libro/scripts/extensions.json diff --git a/opensumi-module-libro/src/browser/index.ts b/archive/opensumi-module-libro/src/browser/index.ts similarity index 100% rename from opensumi-module-libro/src/browser/index.ts rename to archive/opensumi-module-libro/src/browser/index.ts diff --git a/opensumi-module-libro/src/browser/kernel-panel/collapse/collapse-content.tsx b/archive/opensumi-module-libro/src/browser/kernel-panel/collapse/collapse-content.tsx similarity index 100% rename from opensumi-module-libro/src/browser/kernel-panel/collapse/collapse-content.tsx rename to archive/opensumi-module-libro/src/browser/kernel-panel/collapse/collapse-content.tsx diff --git a/opensumi-module-libro/src/browser/kernel-panel/collapse/icon.tsx b/archive/opensumi-module-libro/src/browser/kernel-panel/collapse/icon.tsx similarity index 100% rename from opensumi-module-libro/src/browser/kernel-panel/collapse/icon.tsx rename to archive/opensumi-module-libro/src/browser/kernel-panel/collapse/icon.tsx diff --git a/opensumi-module-libro/src/browser/kernel-panel/collapse/index.less b/archive/opensumi-module-libro/src/browser/kernel-panel/collapse/index.less similarity index 100% rename from opensumi-module-libro/src/browser/kernel-panel/collapse/index.less rename to archive/opensumi-module-libro/src/browser/kernel-panel/collapse/index.less diff --git a/opensumi-module-libro/src/browser/kernel-panel/collapse/index.tsx b/archive/opensumi-module-libro/src/browser/kernel-panel/collapse/index.tsx similarity index 100% rename from opensumi-module-libro/src/browser/kernel-panel/collapse/index.tsx rename to archive/opensumi-module-libro/src/browser/kernel-panel/collapse/index.tsx diff --git a/opensumi-module-libro/src/browser/kernel-panel/collapse/kernel-collapse-content-item.tsx b/archive/opensumi-module-libro/src/browser/kernel-panel/collapse/kernel-collapse-content-item.tsx similarity index 100% rename from opensumi-module-libro/src/browser/kernel-panel/collapse/kernel-collapse-content-item.tsx rename to archive/opensumi-module-libro/src/browser/kernel-panel/collapse/kernel-collapse-content-item.tsx diff --git a/opensumi-module-libro/src/browser/kernel-panel/collapse/kernel-collapse-content.tsx b/archive/opensumi-module-libro/src/browser/kernel-panel/collapse/kernel-collapse-content.tsx similarity index 100% rename from opensumi-module-libro/src/browser/kernel-panel/collapse/kernel-collapse-content.tsx rename to archive/opensumi-module-libro/src/browser/kernel-panel/collapse/kernel-collapse-content.tsx diff --git a/opensumi-module-libro/src/browser/kernel-panel/collapse/page-collapse-content.tsx b/archive/opensumi-module-libro/src/browser/kernel-panel/collapse/page-collapse-content.tsx similarity index 100% rename from opensumi-module-libro/src/browser/kernel-panel/collapse/page-collapse-content.tsx rename to archive/opensumi-module-libro/src/browser/kernel-panel/collapse/page-collapse-content.tsx diff --git a/opensumi-module-libro/src/browser/kernel-panel/index.less b/archive/opensumi-module-libro/src/browser/kernel-panel/index.less similarity index 100% rename from opensumi-module-libro/src/browser/kernel-panel/index.less rename to archive/opensumi-module-libro/src/browser/kernel-panel/index.less diff --git a/opensumi-module-libro/src/browser/kernel-panel/index.ts b/archive/opensumi-module-libro/src/browser/kernel-panel/index.ts similarity index 100% rename from opensumi-module-libro/src/browser/kernel-panel/index.ts rename to archive/opensumi-module-libro/src/browser/kernel-panel/index.ts diff --git a/opensumi-module-libro/src/browser/kernel-panel/kernel-panel-view.tsx b/archive/opensumi-module-libro/src/browser/kernel-panel/kernel-panel-view.tsx similarity index 100% rename from opensumi-module-libro/src/browser/kernel-panel/kernel-panel-view.tsx rename to archive/opensumi-module-libro/src/browser/kernel-panel/kernel-panel-view.tsx diff --git a/opensumi-module-libro/src/browser/kernel-panel/kernel.panel.color.tokens.ts b/archive/opensumi-module-libro/src/browser/kernel-panel/kernel.panel.color.tokens.ts similarity index 100% rename from opensumi-module-libro/src/browser/kernel-panel/kernel.panel.color.tokens.ts rename to archive/opensumi-module-libro/src/browser/kernel-panel/kernel.panel.color.tokens.ts diff --git a/opensumi-module-libro/src/browser/kernel-panel/kernel.panel.contribution.ts b/archive/opensumi-module-libro/src/browser/kernel-panel/kernel.panel.contribution.ts similarity index 100% rename from opensumi-module-libro/src/browser/kernel-panel/kernel.panel.contribution.ts rename to archive/opensumi-module-libro/src/browser/kernel-panel/kernel.panel.contribution.ts diff --git a/opensumi-module-libro/src/browser/kernel-panel/kernel.panel.protocol.ts b/archive/opensumi-module-libro/src/browser/kernel-panel/kernel.panel.protocol.ts similarity index 100% rename from opensumi-module-libro/src/browser/kernel-panel/kernel.panel.protocol.ts rename to archive/opensumi-module-libro/src/browser/kernel-panel/kernel.panel.protocol.ts diff --git a/opensumi-module-libro/src/browser/libro-keybind-contribution.ts b/archive/opensumi-module-libro/src/browser/libro-keybind-contribution.ts similarity index 100% rename from opensumi-module-libro/src/browser/libro-keybind-contribution.ts rename to archive/opensumi-module-libro/src/browser/libro-keybind-contribution.ts diff --git a/opensumi-module-libro/src/browser/libro-opener.ts b/archive/opensumi-module-libro/src/browser/libro-opener.ts similarity index 100% rename from opensumi-module-libro/src/browser/libro-opener.ts rename to archive/opensumi-module-libro/src/browser/libro-opener.ts diff --git a/opensumi-module-libro/src/browser/libro.color.tokens.ts b/archive/opensumi-module-libro/src/browser/libro.color.tokens.ts similarity index 100% rename from opensumi-module-libro/src/browser/libro.color.tokens.ts rename to archive/opensumi-module-libro/src/browser/libro.color.tokens.ts diff --git a/opensumi-module-libro/src/browser/libro.command.ts b/archive/opensumi-module-libro/src/browser/libro.command.ts similarity index 100% rename from opensumi-module-libro/src/browser/libro.command.ts rename to archive/opensumi-module-libro/src/browser/libro.command.ts diff --git a/opensumi-module-libro/src/browser/libro.contribution.ts b/archive/opensumi-module-libro/src/browser/libro.contribution.ts similarity index 100% rename from opensumi-module-libro/src/browser/libro.contribution.ts rename to archive/opensumi-module-libro/src/browser/libro.contribution.ts diff --git a/opensumi-module-libro/src/browser/libro.module.less b/archive/opensumi-module-libro/src/browser/libro.module.less similarity index 100% rename from opensumi-module-libro/src/browser/libro.module.less rename to archive/opensumi-module-libro/src/browser/libro.module.less diff --git a/opensumi-module-libro/src/browser/libro.protocol.ts b/archive/opensumi-module-libro/src/browser/libro.protocol.ts similarity index 100% rename from opensumi-module-libro/src/browser/libro.protocol.ts rename to archive/opensumi-module-libro/src/browser/libro.protocol.ts diff --git a/opensumi-module-libro/src/browser/libro.service.ts b/archive/opensumi-module-libro/src/browser/libro.service.ts similarity index 100% rename from opensumi-module-libro/src/browser/libro.service.ts rename to archive/opensumi-module-libro/src/browser/libro.service.ts diff --git a/opensumi-module-libro/src/browser/libro.view.tracker.ts b/archive/opensumi-module-libro/src/browser/libro.view.tracker.ts similarity index 100% rename from opensumi-module-libro/src/browser/libro.view.tracker.ts rename to archive/opensumi-module-libro/src/browser/libro.view.tracker.ts diff --git a/opensumi-module-libro/src/browser/libro.view.tsx b/archive/opensumi-module-libro/src/browser/libro.view.tsx similarity index 100% rename from opensumi-module-libro/src/browser/libro.view.tsx rename to archive/opensumi-module-libro/src/browser/libro.view.tsx diff --git a/opensumi-module-libro/src/browser/notebook-document-content-provider.ts b/archive/opensumi-module-libro/src/browser/notebook-document-content-provider.ts similarity index 100% rename from opensumi-module-libro/src/browser/notebook-document-content-provider.ts rename to archive/opensumi-module-libro/src/browser/notebook-document-content-provider.ts diff --git a/opensumi-module-libro/src/browser/notebook.service.ts b/archive/opensumi-module-libro/src/browser/notebook.service.ts similarity index 100% rename from opensumi-module-libro/src/browser/notebook.service.ts rename to archive/opensumi-module-libro/src/browser/notebook.service.ts diff --git a/opensumi-module-libro/src/browser/toc/index.ts b/archive/opensumi-module-libro/src/browser/toc/index.ts similarity index 100% rename from opensumi-module-libro/src/browser/toc/index.ts rename to archive/opensumi-module-libro/src/browser/toc/index.ts diff --git a/opensumi-module-libro/src/browser/toc/toc.contribution.ts b/archive/opensumi-module-libro/src/browser/toc/toc.contribution.ts similarity index 100% rename from opensumi-module-libro/src/browser/toc/toc.contribution.ts rename to archive/opensumi-module-libro/src/browser/toc/toc.contribution.ts diff --git a/opensumi-module-libro/src/browser/toc/toc.module.less b/archive/opensumi-module-libro/src/browser/toc/toc.module.less similarity index 100% rename from opensumi-module-libro/src/browser/toc/toc.module.less rename to archive/opensumi-module-libro/src/browser/toc/toc.module.less diff --git a/opensumi-module-libro/src/browser/toc/toc.panel.color.tokens.ts b/archive/opensumi-module-libro/src/browser/toc/toc.panel.color.tokens.ts similarity index 100% rename from opensumi-module-libro/src/browser/toc/toc.panel.color.tokens.ts rename to archive/opensumi-module-libro/src/browser/toc/toc.panel.color.tokens.ts diff --git a/opensumi-module-libro/src/browser/toc/toc.panel.tsx b/archive/opensumi-module-libro/src/browser/toc/toc.panel.tsx similarity index 100% rename from opensumi-module-libro/src/browser/toc/toc.panel.tsx rename to archive/opensumi-module-libro/src/browser/toc/toc.panel.tsx diff --git a/opensumi-module-libro/src/common/index.ts b/archive/opensumi-module-libro/src/common/index.ts similarity index 100% rename from opensumi-module-libro/src/common/index.ts rename to archive/opensumi-module-libro/src/common/index.ts diff --git a/opensumi-module-libro/src/index.ts b/archive/opensumi-module-libro/src/index.ts similarity index 100% rename from opensumi-module-libro/src/index.ts rename to archive/opensumi-module-libro/src/index.ts diff --git a/opensumi-module-libro/src/mana/editor/editor-contribution.ts b/archive/opensumi-module-libro/src/mana/editor/editor-contribution.ts similarity index 100% rename from opensumi-module-libro/src/mana/editor/editor-contribution.ts rename to archive/opensumi-module-libro/src/mana/editor/editor-contribution.ts diff --git a/opensumi-module-libro/src/mana/editor/index.less b/archive/opensumi-module-libro/src/mana/editor/index.less similarity index 100% rename from opensumi-module-libro/src/mana/editor/index.less rename to archive/opensumi-module-libro/src/mana/editor/index.less diff --git a/opensumi-module-libro/src/mana/editor/keybind-handler.ts b/archive/opensumi-module-libro/src/mana/editor/keybind-handler.ts similarity index 100% rename from opensumi-module-libro/src/mana/editor/keybind-handler.ts rename to archive/opensumi-module-libro/src/mana/editor/keybind-handler.ts diff --git a/opensumi-module-libro/src/mana/editor/module.ts b/archive/opensumi-module-libro/src/mana/editor/module.ts similarity index 100% rename from opensumi-module-libro/src/mana/editor/module.ts rename to archive/opensumi-module-libro/src/mana/editor/module.ts diff --git a/opensumi-module-libro/src/mana/editor/opensumi-editor.ts b/archive/opensumi-module-libro/src/mana/editor/opensumi-editor.ts similarity index 100% rename from opensumi-module-libro/src/mana/editor/opensumi-editor.ts rename to archive/opensumi-module-libro/src/mana/editor/opensumi-editor.ts diff --git a/opensumi-module-libro/src/mana/index.ts b/archive/opensumi-module-libro/src/mana/index.ts similarity index 100% rename from opensumi-module-libro/src/mana/index.ts rename to archive/opensumi-module-libro/src/mana/index.ts diff --git a/opensumi-module-libro/src/mana/libro-opensumi-content-contribution.ts b/archive/opensumi-module-libro/src/mana/libro-opensumi-content-contribution.ts similarity index 100% rename from opensumi-module-libro/src/mana/libro-opensumi-content-contribution.ts rename to archive/opensumi-module-libro/src/mana/libro-opensumi-content-contribution.ts diff --git a/opensumi-module-libro/src/mana/libro-opensumi-save-content-contribution.ts b/archive/opensumi-module-libro/src/mana/libro-opensumi-save-content-contribution.ts similarity index 100% rename from opensumi-module-libro/src/mana/libro-opensumi-save-content-contribution.ts rename to archive/opensumi-module-libro/src/mana/libro-opensumi-save-content-contribution.ts diff --git a/opensumi-module-libro/src/mana/mana-module.ts b/archive/opensumi-module-libro/src/mana/mana-module.ts similarity index 100% rename from opensumi-module-libro/src/mana/mana-module.ts rename to archive/opensumi-module-libro/src/mana/mana-module.ts diff --git a/opensumi-module-libro/tsconfig.json b/archive/opensumi-module-libro/tsconfig.json similarity index 100% rename from opensumi-module-libro/tsconfig.json rename to archive/opensumi-module-libro/tsconfig.json diff --git a/opensumi-module-libro/typings/style/index.d.ts b/archive/opensumi-module-libro/typings/style/index.d.ts similarity index 100% rename from opensumi-module-libro/typings/style/index.d.ts rename to archive/opensumi-module-libro/typings/style/index.d.ts diff --git a/opensumi-module-libro/workspace/test.py b/archive/opensumi-module-libro/workspace/test.py similarity index 100% rename from opensumi-module-libro/workspace/test.py rename to archive/opensumi-module-libro/workspace/test.py diff --git a/mana/packages/umi-plugin-mana/.eslintrc.js b/archive/umi-plugin-mana/.eslintrc.js similarity index 100% rename from mana/packages/umi-plugin-mana/.eslintrc.js rename to archive/umi-plugin-mana/.eslintrc.js diff --git a/mana/packages/umi-plugin-mana/.fatherrc.ts b/archive/umi-plugin-mana/.fatherrc.ts similarity index 100% rename from mana/packages/umi-plugin-mana/.fatherrc.ts rename to archive/umi-plugin-mana/.fatherrc.ts diff --git a/mana/packages/umi-plugin-mana/CHANGELOG.md b/archive/umi-plugin-mana/CHANGELOG.md similarity index 100% rename from mana/packages/umi-plugin-mana/CHANGELOG.md rename to archive/umi-plugin-mana/CHANGELOG.md diff --git a/mana/packages/umi-plugin-mana/README.md b/archive/umi-plugin-mana/README.md similarity index 100% rename from mana/packages/umi-plugin-mana/README.md rename to archive/umi-plugin-mana/README.md diff --git a/mana/babel.config.json b/archive/umi-plugin-mana/babel.config.json similarity index 100% rename from mana/babel.config.json rename to archive/umi-plugin-mana/babel.config.json diff --git a/mana/packages/umi-plugin-mana/jest.config.js b/archive/umi-plugin-mana/jest.config.js similarity index 100% rename from mana/packages/umi-plugin-mana/jest.config.js rename to archive/umi-plugin-mana/jest.config.js diff --git a/mana/packages/umi-plugin-mana/package.json b/archive/umi-plugin-mana/package.json similarity index 100% rename from mana/packages/umi-plugin-mana/package.json rename to archive/umi-plugin-mana/package.json diff --git a/mana/packages/umi-plugin-mana/src/decorator.ts b/archive/umi-plugin-mana/src/decorator.ts similarity index 100% rename from mana/packages/umi-plugin-mana/src/decorator.ts rename to archive/umi-plugin-mana/src/decorator.ts diff --git a/mana/packages/umi-plugin-mana/src/index.spec.ts b/archive/umi-plugin-mana/src/index.spec.ts similarity index 100% rename from mana/packages/umi-plugin-mana/src/index.spec.ts rename to archive/umi-plugin-mana/src/index.spec.ts diff --git a/mana/packages/umi-plugin-mana/src/index.ts b/archive/umi-plugin-mana/src/index.ts similarity index 100% rename from mana/packages/umi-plugin-mana/src/index.ts rename to archive/umi-plugin-mana/src/index.ts diff --git a/mana/packages/umi-plugin-mana/src/mana-runtime.ts b/archive/umi-plugin-mana/src/mana-runtime.ts similarity index 100% rename from mana/packages/umi-plugin-mana/src/mana-runtime.ts rename to archive/umi-plugin-mana/src/mana-runtime.ts diff --git a/mana/packages/umi-plugin-mana/src/nodenext.ts b/archive/umi-plugin-mana/src/nodenext.ts similarity index 100% rename from mana/packages/umi-plugin-mana/src/nodenext.ts rename to archive/umi-plugin-mana/src/nodenext.ts diff --git a/mana/packages/umi-plugin-mana/src/router-base.ts b/archive/umi-plugin-mana/src/router-base.ts similarity index 100% rename from mana/packages/umi-plugin-mana/src/router-base.ts rename to archive/umi-plugin-mana/src/router-base.ts diff --git a/mana/packages/umi-plugin-mana/tsconfig.json b/archive/umi-plugin-mana/tsconfig.json similarity index 100% rename from mana/packages/umi-plugin-mana/tsconfig.json rename to archive/umi-plugin-mana/tsconfig.json diff --git a/libro-server/lab/.eslintignore b/libro-server/lab/.eslintignore deleted file mode 100644 index 1f8c84bc..00000000 --- a/libro-server/lab/.eslintignore +++ /dev/null @@ -1,7 +0,0 @@ -!.dumi -.dumi/tmp -.dumi/tmp-production - -**/dist/**/*.js -**/dist/**/*.cjs -**/dist/**/*.mjs diff --git a/libro-server/lab/.eslintrc.json b/libro-server/lab/.eslintrc.json deleted file mode 100644 index 4bcc6cb1..00000000 --- a/libro-server/lab/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["../../.eslintrc.js"] -} diff --git a/mana/.changeset/README.md b/mana/.changeset/README.md deleted file mode 100644 index e5b6d8d6..00000000 --- a/mana/.changeset/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Changesets - -Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works -with multi-package repos, or single-package repos to help you version and publish your code. You can -find the full documentation for it [in our repository](https://github.com/changesets/changesets) - -We have a quick list of common questions to get you started engaging with this project in -[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/mana/.changeset/config.json b/mana/.changeset/config.json deleted file mode 100644 index 6f1fbadd..00000000 --- a/mana/.changeset/config.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", - "changelog": ["@changesets/changelog-github", { "repo": "difizen/mana" }], - "linked": [["@difizen/*"]], - "access": "public", - "baseBranch": "main", - "commit": false, - "fixed": [], - "updateInternalDependencies": "patch", - "ignore": [], - "useCalculatedVersion": true -} diff --git a/mana/.commitlintrc.js b/mana/.commitlintrc.js deleted file mode 100644 index 422b1944..00000000 --- a/mana/.commitlintrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = { extends: ['@commitlint/config-conventional'] }; diff --git a/mana/.editorconfig b/mana/.editorconfig deleted file mode 100644 index 38138259..00000000 --- a/mana/.editorconfig +++ /dev/null @@ -1,14 +0,0 @@ -# http://editorconfig.org -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true -max_line_length=88 - -[Makefile] -indent_style = tab diff --git a/mana/.eslintignore b/mana/.eslintignore deleted file mode 100644 index a24b9375..00000000 --- a/mana/.eslintignore +++ /dev/null @@ -1,11 +0,0 @@ -!.dumi -.dumi/tmp -.dumi/tmp-production -.umi -.umi-production - -**/dist/**/*.js -**/dist/**/*.cjs -**/dist/**/*.mjs - -tailwind.out.css diff --git a/mana/.eslintrc.js b/mana/.eslintrc.js deleted file mode 100644 index 111f3a3f..00000000 --- a/mana/.eslintrc.js +++ /dev/null @@ -1,97 +0,0 @@ -module.exports = { - root: true, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react/recommended', - 'plugin:react-hooks/recommended', - 'plugin:promise/recommended', - 'prettier', - ], - plugins: ['import'], - - env: { - node: true, - }, - settings: { - react: { - version: '18', - }, - }, - - rules: { - // common pitfalls - eqeqeq: 'error', - curly: 'error', - - // stricter type correctness - 'no-unused-vars': [ - 'warn', - { - vars: 'local', - args: 'none', - destructuredArrayIgnorePattern: '^_', - ignoreRestSiblings: true, - argsIgnorePattern: '^_', - caughtErrors: 'none', - }, - ], - '@typescript-eslint/no-namespace': 'off', - '@typescript-eslint/no-explicit-any': ['warn', { ignoreRestArgs: true }], - '@typescript-eslint/no-shadow': [ - 'warn', - { - ignoreTypeValueShadow: true, - }, - ], - - // react rules - 'react-hooks/exhaustive-deps': 'error', - 'react-hooks/rules-of-hooks': 'error', - 'react/jsx-uses-react': 'off', - 'react/react-in-jsx-scope': 'off', - - // no sloppiness - 'no-console': ['error', { allow: ['error', 'warn', 'info'] }], - - // import rules and fixes - '@typescript-eslint/consistent-type-imports': 'error', - 'import/newline-after-import': 'warn', - 'import/order': [ - 'warn', - { - pathGroups: [ - { - pattern: '@/**', - group: 'internal', - position: 'before', - }, - ], - distinctGroup: false, - groups: [ - 'builtin', - 'external', - 'internal', - 'parent', - 'sibling', - 'index', - 'object', - ], - 'newlines-between': 'always', - alphabetize: { - order: 'asc', - caseInsensitive: true, - }, - }, - ], - }, - - overrides: [ - { - files: ['*.js', '*.cjs', '*.mjs', '*.jsx'], - rules: { - '@typescript-eslint/no-var-requires': 'off', - }, - }, - ], -}; diff --git a/mana/.eslintrc.node.js b/mana/.eslintrc.node.js deleted file mode 100644 index 3a2f015a..00000000 --- a/mana/.eslintrc.node.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - root: true, - extends: [require.resolve('./.eslintrc.js')], - rules: { - 'no-console': 'off', - }, -}; diff --git a/mana/.gitattributes b/mana/.gitattributes deleted file mode 100644 index c1f2c838..00000000 --- a/mana/.gitattributes +++ /dev/null @@ -1,46 +0,0 @@ -# Fix end-of-lines in Git versions older than 2.10 -# https://github.com/git/git/blob/master/Documentation/RelNotes/2.10.0.txt#L248 # https://github.com/git/git/blob/master/Documentation/RelNotes/2.10.0.txt#L248 -* text=auto eol=lf - -# === -# Binary Files (don't diff, don't fix line endings) -# === - -# Images -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.tiff binary - -# Fonts -*.oft binary -*.ttf binary -*.eot binary -*.woff binary -*.woff2 binary - -# Videos -*.mov binary -*.mp4 binary -*.webm binary -*.ogg binary -*.mpg binary -*.3gp binary -*.avi binary -*.wmv binary -*.flv binary -*.asf binary - -# Audio -*.mp3 binary -*.wav binary -*.flac binary - -# Compressed -*.gz binary -*.zip binary -*.7z binary -*.tar.gz binary -*.tgz binary diff --git a/mana/.husky/commit-msg b/mana/.husky/commit-msg deleted file mode 100755 index 97681ced..00000000 --- a/mana/.husky/commit-msg +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - -pnpm exec commitlint --edit ${1} diff --git a/mana/.husky/pre-commit b/mana/.husky/pre-commit deleted file mode 100755 index c923d5d6..00000000 --- a/mana/.husky/pre-commit +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - -# 1) Validate committer email - -EMAIL=$(git config user.email) - -# 2) Lint staged files - -pnpm exec lint-staged diff --git a/mana/.lintstagedrc.js b/mana/.lintstagedrc.js deleted file mode 100644 index 1e378695..00000000 --- a/mana/.lintstagedrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - '*': ['prettier --ignore-unknown --check'], - '*.{css,less}': ['stylelint'], - '*.{js,jsx,ts,tsx,mjs,mts,cjs,cts,mtsx,ctsx,mjsx,cjsx}': ['eslint'], -}; diff --git a/mana/.npmrc b/mana/.npmrc deleted file mode 100644 index c418d2b1..00000000 --- a/mana/.npmrc +++ /dev/null @@ -1,10 +0,0 @@ -registry=https://registry.npmjs.org/ - -link-workspace-packages=deep - -# PNPM -strict-peer-dependencies=false -save-workspace-protocol=rolling - -# pnpm deploy workaround https://github.com/pnpm/pnpm/issues/6437#issuecomment-1549409913 -dedupe-peer-dependents=false diff --git a/mana/.prettierignore b/mana/.prettierignore deleted file mode 100644 index 1f74cf5e..00000000 --- a/mana/.prettierignore +++ /dev/null @@ -1,28 +0,0 @@ -pnpm-lock.yaml -**/node_modules -**/.venv - -# build artifacts -**/build -**/_build -**/dist -**/coverage - -# generated code -**/.dumi/tmp -**/.dumi/tmp-production -**/.umi -**/.umi-production -**/.docusaurus - -# protobuf -**/*_pb.ts -**/*_connect.ts - -**/*/keyboard/layouts/** -**/*/mana-react/src/** -tinyColor.less - -.changeset - -tailwind.out.css diff --git a/mana/.prettierrc.json b/mana/.prettierrc.json deleted file mode 100644 index f742d4b2..00000000 --- a/mana/.prettierrc.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "printWidth": 88, - "singleQuote": true, - "trailingComma": "all", - "proseWrap": "always", - "overrides": [ - { - "files": ["**/*.md", "**/*.mdx", ".github/**/*.yml"], - "options": { - "proseWrap": "preserve" - } - } - ] -} diff --git a/mana/.stylelintignore b/mana/.stylelintignore deleted file mode 100644 index 2b7bc0b1..00000000 --- a/mana/.stylelintignore +++ /dev/null @@ -1,2 +0,0 @@ -tinyColor.less -tailwind.out.css diff --git a/mana/.stylelintrc b/mana/.stylelintrc deleted file mode 100644 index 8571dff9..00000000 --- a/mana/.stylelintrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "@umijs/lint/dist/config/stylelint", - "rules": { - "function-no-unknown": null, - "selector-class-pattern": "^([_a-zA-Z][A-Za-z0-9]*)(-[A-Za-z0-9]+)*", - "custom-property-pattern": "^([_a-zA-Z][A-Za-z0-9]*)(-[A-Za-z0-9]+)*", - "color-function-notation": "legacy" - } -} diff --git a/mana/.vscode/cspell.json b/mana/.vscode/cspell.json deleted file mode 100644 index afc4f8a8..00000000 --- a/mana/.vscode/cspell.json +++ /dev/null @@ -1,13 +0,0 @@ -// cSpell Settings -{ - // Version of the setting file. Always 0.2 - "version": "0.2", - // language - current active spelling language - "language": "en", - // words - list of words to be always considered correct - "words": ["difizen", "dumi", "dumirc", "mana"], - // flagWords - list of words to be always considered incorrect - // This is useful for offensive words and common spelling errors. - // For example "hte" should be "the" - "flagWords": ["hte"] -} diff --git a/mana/.vscode/extensions.json b/mana/.vscode/extensions.json deleted file mode 100644 index 15129cab..00000000 --- a/mana/.vscode/extensions.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "recommendations": [ - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "stylelint.vscode-stylelint", - "streetsidesoftware.code-spell-checker" - ], - "unwantedRecommendations": [] -} diff --git a/mana/.vscode/launch.json b/mana/.vscode/launch.json deleted file mode 100644 index f21786e6..00000000 --- a/mana/.vscode/launch.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - // Use IntelliSense to learn about possible Node.js debug attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Debug ALL Jest Tests", - "type": "node", - "request": "launch", - "runtimeArgs": [ - "--inspect-brk", - "${workspaceRoot}/node_modules/jest/bin/jest.js", - "--runInBand" - ], - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "port": 9229 - }, - { - "name": "Debug mana-common Jest Tests", - "type": "node", - "request": "launch", - "runtimeArgs": [ - "--inspect-brk", - "${workspaceRoot}/node_modules/jest/bin/jest.js", - "--runInBand", - "./packages/mana-common" - ], - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "port": 9229 - }, - { - "name": "Debug mana-syringe Jest Tests", - "type": "node", - "request": "launch", - "runtimeArgs": [ - "--inspect-brk", - "${workspaceRoot}/node_modules/jest/bin/jest.js", - "--runInBand", - "./packages/mana-syringe" - ], - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "port": 9229 - }, - { - "name": "Debug mana-observable Jest Tests", - "type": "node", - "request": "launch", - "runtimeArgs": [ - "--inspect-brk", - "${workspaceRoot}/node_modules/jest/bin/jest.js", - "--runInBand", - "./packages/mana-observable" - ], - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "port": 9229 - } - ] -} diff --git a/mana/.vscode/settings.json b/mana/.vscode/settings.json deleted file mode 100644 index 6acd7c7d..00000000 --- a/mana/.vscode/settings.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "files.associations": { - // Turborepo - "turbo.json": "jsonc", - // Nx - "nx.json": "jsonc", - "project.json": "jsonc", - // tsconfig - "**/tooling/tsconfig/*.json": "jsonc", - "**/tooling/tsconfig/package.json": "json", - "tsconfig.*.json": "jsonc", - "tsconfig.json": "jsonc", - // rye - "requirements.lock": "pip-requirements", - "requirements-dev.lock": "pip-requirements" - }, - "cSpell.allowCompoundWords": true, - "cSpell.enabled": true, - "editor.rulers": [88], - "editor.formatOnSave": true, - "editor.insertSpaces": true, - "files.insertFinalNewline": true, - "black-formatter.args": ["--config", "pyproject.toml"], - "typescript.tsdk": "node_modules/typescript/lib", - "eslint.validate": [ - "javascript", - "javascriptreact", - "typescript", - "typescriptreact", - "mdx" - ], - "yaml.schemas": { - "https://json.schemastore.org/github-issue-config.json": ".github/ISSUE_TEMPLATE/config.yml" - }, - "[python]": { - "editor.codeActionsOnSave": { - "source.organizeImports": "never", - "source.fixAll": "explicit" - }, - "editor.defaultFormatter": "ms-python.black-formatter" - }, - "[typescriptreact]": { - "editor.tabSize": 2, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - } - }, - "[typescript]": { - "editor.tabSize": 2, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - } - }, - "[javascriptreact]": { - "editor.tabSize": 2, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - } - }, - "[javascript]": { - "editor.tabSize": 2, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - } - }, - "[json]": { - "editor.tabSize": 2, - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[jsonc]": { - "editor.tabSize": 2, - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[markdown]": { - "editor.quickSuggestions": { - "other": true, - "comments": true, - "strings": true - } - }, - "[mdx]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[css]": { - "editor.tabSize": 2, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.codeActionsOnSave": { - "source.fixAll.stylelint": "explicit" - } - }, - "[less]": { - "editor.tabSize": 2, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.codeActionsOnSave": { - "source.fixAll.stylelint": "explicit" - } - }, - "[css][less]": { - "editor.codeActionsOnSave": { - "source.fixAll.stylelint": "explicit" - } - }, - "[javascript][javascriptreact][typescript][typescriptreact]": { - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - } - } -} diff --git a/mana/CONTRIBUTING.md b/mana/CONTRIBUTING.md deleted file mode 100644 index dfe26307..00000000 --- a/mana/CONTRIBUTING.md +++ /dev/null @@ -1,11 +0,0 @@ -# 开发 - -``` -pnpm bootstrap -``` - -# 启动示例站点 - -``` -pnpm run docs -``` diff --git a/mana/LEGAL.md b/mana/LEGAL.md deleted file mode 100644 index dfc32858..00000000 --- a/mana/LEGAL.md +++ /dev/null @@ -1,7 +0,0 @@ -Legal Disclaimer - -Within this source code, the comments in Chinese shall be the original, governing version. Any comment in other languages are for reference only. In the event of any conflict between the Chinese language version comments and other language version comments, the Chinese language version shall prevail. - -法律免责声明 - -关于代码注释部分,中文注释为官方版本,其它语言注释仅做参考。中文注释可能与其它语言注释存在不一致,当中文注释与其它语言注释存在不一致时,请以中文注释为准。 diff --git a/mana/LICENSE b/mana/LICENSE deleted file mode 100644 index 2fb31840..00000000 --- a/mana/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023-present Difizen Team - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/mana/README.md b/mana/README.md deleted file mode 100644 index f93659f5..00000000 --- a/mana/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# mana - -[![codecov](https://codecov.io/gh/difizen/mana/graph/badge.svg?token=VGJDF8511R)](https://codecov.io/gh/difizen/mana) - -A modular and extensible front-end framework designed for workbench products. - -**English** · [简体中文](./README.zh-CN.md) - -## Features - -- Complete module isolation, state management, and dependency inversion solutions, making it a truly suitable framework for large-scale engineering -- Integration with the react ecosystem, with innovative page view management and state tracking capabilities, perfectly combining frontend projects with a modular structure -- Built-in modules such as themes, commands, shortcuts, toolbars, configurations, internationalization, etc., to help you quickly start your project - -## Applicable Scenarios - -- If you intend to develop IDE-style productivity tool products -- If you are looking for a thoroughly modular, architecturally advanced frontend engineering solution to solve team collaboration and long-term maintenance issues -- If your project requires rich scene customization capabilities, allowing downstream producers to do kernel-level customization and develop a module ecosystem - -Please try mana 🌟🌟🌟 - -### Official Website - -💡 Please visit https://mana.difizen.net/ - -### Submit Issues - -😊 We recommend using [github issue](https://github.com/difizen/mana/issues) to submit your questions, and we usually respond within two days. - -### Contribute Code - -🤝 Please refer to [CONTRIBUTING.md](./CONTRIBUTING.md) - -### Contributors - -💪 Thanks to all the contributors - - - List of Contributors - - -### Contact Us - -🤗 Join our DingTalk Q&A group to contact us. - - diff --git a/mana/README.zh-CN.md b/mana/README.zh-CN.md deleted file mode 100644 index fc593a8e..00000000 --- a/mana/README.zh-CN.md +++ /dev/null @@ -1,47 +0,0 @@ -# mana - -[![codecov](https://codecov.io/gh/difizen/mana/graph/badge.svg?token=VGJDF8511R)](https://codecov.io/gh/difizen/mana) - -一个模块化可扩展前端框架,为工作台产品设计。 - -[English](./README.md) · **简体中文** - -## 特性 - -- 完整的模块隔离、状态管理、依赖倒置方案,是真正适合大型工程的框架 -- 集成 react 生态,创造性的页面视图管理、状态追踪能力,让前端项目与模块化结构完美结合 -- 内置主题、命令、快捷键、工具栏、配置、国际化...等模块,帮助您快速启动项目 - -## 适用场景 - -- 如果您打算开发 IDE 型的生产力工具产品 -- 如果您正在寻找彻底模块化、架构先进的前端工程方案,解决团队的协作和长期维护问题 -- 如果您的项目需要丰富的场景定制能力,允许下游生产者做内核级的定制,发展模块生态 - -请尝试 mana 🌟🌟🌟 - -### 官网 - -💡 请访问 https://mana.difizen.net/ - -### 提交issue - -😊 我们建议您使用[github issue](https://github.com/difizen/mana/issues) 提交您的疑问, 我们通常会在2日内回复。 - -### 贡献代码 - -🤝 请查阅 [CONTRIBUTING.md](./CONTRIBUTING.md) - -### 贡献者 - -💪 感谢所有的贡献者 - - - List of Contributors - - -### 联系我们 - -🤗 加入我们的钉钉答疑群与我们联系。 - - diff --git a/mana/apps/docs/.dumi/theme/componets/banner/background.png b/mana/apps/docs/.dumi/theme/componets/banner/background.png deleted file mode 100644 index 82ada528acc680a26b3806a40066750e459e933e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129776 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 z 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 Snp+LemGmLBV_h)myhUD>NYe!#v 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 { - const [animate, setAnimate] = useState({ - imgOpacity: 0, - imgTranslate: 'none', - }); - const { themeConfig } = useSiteData(); - - useEffect(() => { - setAnimate({ - imgOpacity: 1, - imgTranslate: ` translateY(-14px)`, - }); - }, []); - - return ( -
-
-
-
-
-
-
-
-
-
-
-
-
-
-

- mana -

-

- {l10n.t('A modular and extensible front-end framework')} -

- - - - { - message.success(l10n.t('Copied')); - }} - > - - -
-
-
-
-
- ); -}; - -export default Banner; diff --git a/mana/apps/docs/.dumi/theme/componets/title/index.less b/mana/apps/docs/.dumi/theme/componets/title/index.less deleted file mode 100644 index c7fb36ce..00000000 --- a/mana/apps/docs/.dumi/theme/componets/title/index.less +++ /dev/null @@ -1,9 +0,0 @@ -.difizen-dumi-title { - margin-top: 80px; - margin-bottom: 40px; - line-height: 50px; - font-weight: 500; - text-align: center; - transition: all 0.3s ease; - font-size: 24px; -} diff --git a/mana/apps/docs/.dumi/theme/componets/title/index.tsx b/mana/apps/docs/.dumi/theme/componets/title/index.tsx deleted file mode 100644 index 4a04a4ee..00000000 --- a/mana/apps/docs/.dumi/theme/componets/title/index.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import type { ReactElement } from 'react'; -import './index.less'; - -export function Title({ - marginTop, - marginBottom, - children, -}: { - children: ReactElement | string; - marginTop?: number; - marginBottom?: number; -}) { - return ( -

- {children} -

- ); -} diff --git a/mana/apps/docs/.dumi/theme/lang/bundle.l10n.en-US.json b/mana/apps/docs/.dumi/theme/lang/bundle.l10n.en-US.json deleted file mode 100644 index f8a789f1..00000000 --- a/mana/apps/docs/.dumi/theme/lang/bundle.l10n.en-US.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Contact Us": "Contact Us", - "Copied": "Copied", - "Related": "Related", - "Community": "Community", - "feedback issues": "feedback issues", - "release notes": "release notes", - "A modular and extensible front-end framework": "A modular and extensible front-end framework", - "Designed for workbench products": "Designed for workbench products" -} diff --git a/mana/apps/docs/.dumi/theme/lang/bundle.l10n.zh-CN.json b/mana/apps/docs/.dumi/theme/lang/bundle.l10n.zh-CN.json deleted file mode 100644 index 2fb5b158..00000000 --- a/mana/apps/docs/.dumi/theme/lang/bundle.l10n.zh-CN.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Contact Us": "联系我们", - "Copied": "已复制", - "Related": "相关资源", - "Community": "社区", - "feedback issues": "反馈问题", - "release notes": "发布日志", - "A modular and extensible front-end framework": "一个模块化的可扩展前端应用框架", - "Designed for workbench products": "为工作台产品设计" -} diff --git a/mana/apps/docs/.dumi/theme/lang/index.ts b/mana/apps/docs/.dumi/theme/lang/index.ts deleted file mode 100644 index 55cd13b0..00000000 --- a/mana/apps/docs/.dumi/theme/lang/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { LanguageBundles } from '@difizen/mana-l10n'; - -import langENUS from './bundle.l10n.en-US'; -import langZHCN from './bundle.l10n.zh-CN'; - -export const langBundles: LanguageBundles = { - 'zh-CN': langZHCN, - 'en-US': langENUS, -}; diff --git a/mana/apps/docs/.dumi/theme/layouts/DocLayout.less b/mana/apps/docs/.dumi/theme/layouts/DocLayout.less deleted file mode 100644 index 506204eb..00000000 --- a/mana/apps/docs/.dumi/theme/layouts/DocLayout.less +++ /dev/null @@ -1,27 +0,0 @@ -.difizen-dumi-layout { - height: 100%; - - a { - text-decoration: none; - } - - main { - .dumi-default-content { - min-height: calc(100vh - 61px); - } - } -} - -.dumi-default-content { - &:not([data-no-sidebar]) { - padding: 48px 0 0; - - > article { - padding: 0 48px; - } - - .dumi-default-content-footer { - padding: 0 48px; - } - } -} diff --git a/mana/apps/docs/.dumi/theme/layouts/DocLayout.tsx b/mana/apps/docs/.dumi/theme/layouts/DocLayout.tsx deleted file mode 100644 index c0d03f7c..00000000 --- a/mana/apps/docs/.dumi/theme/layouts/DocLayout.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { ManaComponents } from '@difizen/mana-app'; -import { Helmet, useLocation, useSiteData } from 'dumi'; -import DefaultLayout from 'dumi/theme-default/layouts/DocLayout'; -import React from 'react'; - -import Banner from '../componets/banner/index.js'; -import { DumiPreset } from '../modules/module.js'; -import Footer from '../slots/Footer/index.js'; -import Header from '../slots/Header/index.js'; -import './DocLayout.less'; - -const HomeLayout: React.FC = () => { - const { themeConfig } = useSiteData(); - - return ( -
- - {themeConfig.name} - -
- -
-
- ); -}; - -const DocLayout = () => { - const { pathname } = useLocation(); - - return ( - - {pathname === '/' || pathname === '/zh-CN' || pathname === '/zh-CN/' ? ( - - ) : ( -
- -
- )} -
- ); -}; - -export default DocLayout; diff --git a/mana/apps/docs/.dumi/theme/modules/github.ts b/mana/apps/docs/.dumi/theme/modules/github.ts deleted file mode 100644 index 0efc1c23..00000000 --- a/mana/apps/docs/.dumi/theme/modules/github.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { prop, singleton } from '@difizen/mana-app'; -import { Octokit } from 'octokit'; - -@singleton() -export class Github { - @prop() - stars: number; - - protected octokit = new Octokit({}); - - getRepoStars = async (owner: string, repo: string) => { - try { - const { data } = await this.octokit.rest.repos.get({ - owner, - repo, - }); - const stars = data.stargazers_count; - return stars; - } catch (error) { - return undefined; - } - }; -} diff --git a/mana/apps/docs/.dumi/theme/modules/module.ts b/mana/apps/docs/.dumi/theme/modules/module.ts deleted file mode 100644 index 1fe06bc7..00000000 --- a/mana/apps/docs/.dumi/theme/modules/module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ManaAppPreset, ManaModule } from '@difizen/mana-app'; -import { l10n } from '@difizen/mana-l10n'; - -import { langBundles } from '../lang/index.js'; - -import { Github } from './github.js'; - -export const DumiPreset = ManaModule.create() - .preload(() => { - l10n.loadLangBundles(langBundles); - return Promise.resolve(); - }) - .register(Github) - .dependOn(ManaAppPreset); diff --git a/mana/apps/docs/.dumi/theme/slots/Footer/index.less b/mana/apps/docs/.dumi/theme/slots/Footer/index.less deleted file mode 100644 index f4bc30fa..00000000 --- a/mana/apps/docs/.dumi/theme/slots/Footer/index.less +++ /dev/null @@ -1,112 +0,0 @@ -.difizen-dumi-footer { - padding: 0 48px; - margin: 0; - overflow: hidden; - - @media only screen and (max-width: 1280px) { - width: 100%; - box-sizing: border-box; - padding-inline: 40px; - } - - @media only screen and (max-width: 767px) { - padding-inline: 0; - } - - &-content { - max-width: 800px; - padding: 50px 0 28px; - margin: auto; - display: flex; - justify-content: space-between; - - &:last-child { - align-self: flex-end; - } - } - - &-text-group { - padding: 8px; - - @media only screen and (max-width: 768px) { - padding: 0 24px; - } - } - - &-text-group + &-text-group { - margin-left: 16px; - } - - &-img { - max-width: 80px; - padding: 16px 0; - } - - &-title { - font-size: 16px; - font-weight: 500; - } - - &-item { - font-size: 14px; - margin: 12px 0; - - a { - display: inline-block; - height: 17px; - color: #8590a0; - - @{dark-selector} & { - color: #bdc0c4; - } - } - } - - &-image-text { - font-size: 14px; - line-height: 25px; - padding: 0 0 12px; - width: 240px; - } - - &-image-group { - display: flex; - flex-direction: column; - align-items: center; - color: #8590a0; - - @{dark-selector} & { - color: #bdc0c4; - } - } - - &-extra { - padding: 12px; - font-size: 12px; - color: #8590a0; - border-top: 1px solid #eee; - text-align: center; - - @{dark-selector} & { - color: #bdc0c4; - border-top: 1px solid #bdc0c4; - } - } - - &-logo { - a { - display: flex; - flex-direction: column; - align-items: center; - color: #000; - - @{dark-selector} & { - color: #fff; - } - } - - .difizen-dumi-header-logo-img { - margin-right: 0; - } - } -} diff --git a/mana/apps/docs/.dumi/theme/slots/Footer/index.tsx b/mana/apps/docs/.dumi/theme/slots/Footer/index.tsx deleted file mode 100644 index 994941fb..00000000 --- a/mana/apps/docs/.dumi/theme/slots/Footer/index.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { l10n } from '@difizen/mana-l10n'; -import { useSiteData, Link } from 'dumi'; -import React from 'react'; -import './index.less'; - -type DatumType = { - title: string; - itemList: { - name: string; - link: string; - }[]; -}; - -const Footer: React.FC = () => { - const { themeConfig } = useSiteData(); - const qrcodes = themeConfig.qrcodes; - - return ( -
- - -
{themeConfig.footer}
-
- ); -}; - -export default Footer; diff --git a/mana/apps/docs/.dumi/theme/slots/Header/default.less b/mana/apps/docs/.dumi/theme/slots/Header/default.less deleted file mode 100644 index 3e017bbd..00000000 --- a/mana/apps/docs/.dumi/theme/slots/Header/default.less +++ /dev/null @@ -1,112 +0,0 @@ -@import (reference) '../../styles/variables.less'; - -.@{prefix}-header { - position: relative; - z-index: 10; - - &:not([data-static]) { - top: 0; - position: sticky; - background-color: fadeout(@c-site-bg, 10%); - backdrop-filter: blur(6px); - - @{dark-selector} & { - background-color: fadeout(@c-site-bg-dark, 10%); - } - - // to avoid backdrop filter conflict with navbar overlay - &[data-mobile-active] { - background-color: @c-site-bg; - backdrop-filter: none; - - @{dark-selector} & { - background-color: @c-site-bg-dark; - } - } - } - - &-content { - display: flex; - align-items: center; - margin: 0 auto; - padding: 0 24px; - max-width: @s-content-width; - height: @s-header-height; - box-sizing: border-box; - - @media @mobile { - height: @s-header-height-m; - } - } - - &-right { - flex: 1; - display: flex; - justify-content: space-between; - - &-aside { - display: flex; - align-items: center; - - @media @mobile { - margin: 8px 16px; - padding-top: 24px; - justify-content: center; - border-top: 1px solid @c-border-light; - - @{dark-selector} & { - border-top-color: @c-border-less-dark; - } - } - } - - @media @mobile { - position: fixed; - top: @s-header-height-m; - left: 0; - right: 0; - height: calc(100vh - @s-header-height-m); - display: block; - background-color: fadeout(@c-site-bg, 40%); - border-top: 1px solid @c-border-light; - backdrop-filter: blur(30px); - box-sizing: border-box; - transition: all 0.2s; - - @{dark-selector} & { - background-color: fadeout(@c-site-bg-dark, 40%); - border-top: 1px solid @c-border-less-dark; - } - - .@{prefix}-header:not([data-mobile-active]) & { - opacity: 0; - visibility: hidden; - padding-top: 20px; - } - } - } - - &-menu-btn { - position: absolute; - top: 50%; - inset-inline-end: 24px; - padding: 0; - border: 0; - background: transparent; - transform: translateY(-50%); - display: none; - - @media @mobile { - display: block; - } - - > svg { - width: 20px; - fill: @c-text-secondary; - - @{dark-selector} & { - fill: @c-text-secondary-dark; - } - } - } -} diff --git a/mana/apps/docs/.dumi/theme/slots/Header/index.less b/mana/apps/docs/.dumi/theme/slots/Header/index.less deleted file mode 100644 index d31048af..00000000 --- a/mana/apps/docs/.dumi/theme/slots/Header/index.less +++ /dev/null @@ -1,112 +0,0 @@ -@import (reference) '../../styles/variables.less'; - -a { - text-decoration: inherit; -} - -.difizen-dumi-header { - .ant-menu-overflow { - background-color: transparent; - width: 100%; - - .ant-menu-overflow-item { - display: flex; - align-items: center; - height: 60px; - } - } - - &-left { - height: 100%; - padding-right: 32px; - } - - &-logo { - height: 100%; - - a { - font-weight: 700; - font-size: 24px; - align-items: center; - display: inline-flex; - margin-right: 32px; - height: 100%; - color: #000; - - @{dark-selector} & { - color: #fff; - } - } - - &-img { - height: 32px; - margin-right: 16px; - } - } - - &-right { - height: 100%; - display: flex; - align-items: center; - - .ant-btn, - .ant-btn-text { - color: #000; - - &:hover { - color: #69b1ff; - } - - @{dark-selector} & { - color: #fff; - - &:hover { - color: #69b1ff; - } - } - } - - &-github-logo { - width: 24px; - margin-right: 12px; - vertical-align: middle; - } - - &-github { - &-btn { - .ant-btn-icon { - font-size: 20px; - } - - color: inherit; - - &-hint { - padding: 2px 5px; - border-radius: 4px; - margin-right: 5px; - background-image: linear-gradient(119deg, #5b7eaf 0%, #294d81 100%); - color: #fff; - font-size: 12px; - } - - &:hover { - color: #69b1ff; - } - } - - &-star { - display: flex; - flex-direction: row; - align-items: center; - padding: 2px 5px; - border-radius: 4px; - background-color: #edf4ff; - box-shadow: 0 1px 3px 0 #5b7eaf; - - @{dark-selector} & { - box-shadow: 0 1px 3px 0 #ccdbf4; - } - } - } - } -} diff --git a/mana/apps/docs/.dumi/theme/slots/Header/index.tsx b/mana/apps/docs/.dumi/theme/slots/Header/index.tsx deleted file mode 100644 index aee587c1..00000000 --- a/mana/apps/docs/.dumi/theme/slots/Header/index.tsx +++ /dev/null @@ -1,171 +0,0 @@ -import { GithubOutlined, MoonOutlined, SunOutlined } from '@ant-design/icons'; -import { CloseOutlined, MenuOutlined } from '@ant-design/icons'; -import { ThemeService, useInject } from '@difizen/mana-app'; -import { l10n, L10nLang } from '@difizen/mana-l10n'; -import { Button } from 'antd'; -import { useRouteMeta, Link, usePrefersColor, useSiteData, history } from 'dumi'; -import type { SocialTypes } from 'dumi/dist/client/theme-api/types.js'; -import HeaderExtra from 'dumi/theme/slots/HeaderExtra'; -import Navbar from 'dumi/theme/slots/Navbar'; -import SearchBar from 'dumi/theme/slots/SearchBar'; -import SocialIcon from 'dumi/theme/slots/SocialIcon'; -import React, { useEffect, useMemo, useState } from 'react'; - -import { Github } from '../../modules/github.js'; - -import './default.less'; -import './index.less'; - -const Header: React.FC = () => { - const { frontmatter } = useRouteMeta(); - const [showMenu, setShowMenu] = useState(false); - const { themeConfig } = useSiteData(); - const [stars, setStars] = useState(undefined); - const github = useInject(Github); - const theme = useInject(ThemeService); - const currentTheme = theme.getCurrentTheme(); - - const { - prefersColor: { default: defaultColor }, - gitRepo, - } = themeConfig; - const [, prefersColor = defaultColor, setPrefersColor] = usePrefersColor(); - - useEffect(() => { - const currentLang = l10n.getLang(); - const urlPath = window.location.pathname; - const urlLang = urlPath.startsWith(`/${L10nLang.zhCN}`) - ? L10nLang.zhCN - : L10nLang.enUS; - if (currentLang !== urlLang) { - const newUrl = - currentLang === L10nLang.enUS - ? urlPath.replace(`/${urlLang}`, '') - : `/${currentLang}${urlPath}`; - history.push({ - pathname: newUrl ? newUrl : '/', - }); - } - }, []); - - useEffect(() => { - if (prefersColor !== currentTheme.type) { - setPrefersColor(currentTheme.type); - } - }, [currentTheme.type, prefersColor, setPrefersColor]); - - useEffect(() => { - github - .getRepoStars(gitRepo.owner, gitRepo.name) - .then((currentStars: number | undefined) => { - return setStars(currentStars); - }) - .catch(console.error); - }, [gitRepo.name, gitRepo.owner, github]); - - const socialIcons = useMemo( - () => - themeConfig.socialLinks - ? Object.keys(themeConfig.socialLinks) - .slice(0, 5) - .map((key) => ({ - icon: key as SocialTypes, - link: themeConfig.socialLinks[key as SocialTypes], - })) - : [], - [themeConfig.socialLinks], - ); - - return ( -
setShowMenu(false)} - > -
-
-
- {themeConfig.logo && ( - - - {themeConfig.name} - - )} -
-
-
- -
- - - {themeConfig.prefersColor.switch && ( - - )} - {socialIcons.map((item) => ( - - ))} - - -
- -
-
-
- ); -}; - -export default Header; diff --git a/mana/apps/docs/.dumi/theme/styles/heti.less b/mana/apps/docs/.dumi/theme/styles/heti.less deleted file mode 100644 index 17a7ab03..00000000 --- a/mana/apps/docs/.dumi/theme/styles/heti.less +++ /dev/null @@ -1,1119 +0,0 @@ -/*! - * Project: Heti - * URL: https://github.com/sivan/heti - * Author: Sivan [sun.sivan@gmail.com] - */ -@font-face { - font-family: 'Heti Hei'; - src: 'Heti Hei SC', 'Heti Hei TC', 'Heti Hei JP', 'Heti Hei KR'; -} - -@font-face { - font-family: 'Heti Hei SC'; - src: local('PingFang SC Regular'), local('Heiti SC Regular'), - local('Microsoft YaHei'), local('Source Han Sans CN Regular'), - local('Noto Sans CJK SC Regular'), local('WenQuanYi Micro Hei'), - local('Droid Sans Fallback'); -} - -@font-face { - font-family: 'Heti Hei TC'; - src: local('PingFang TC Regular'), local('Heiti TC Regular'), - local('Microsoft Jhenghei'), local('Source Han Sans HK Regular'), - local('Source Han Sans TW Regular'), local('Noto Sans CJK TC Regular'), - local('WenQuanYi Micro Hei'), local('Droid Sans Fallback'); -} - -@font-face { - font-family: 'Heti Hei JP'; - src: local('Hiragino Sans GB W3'), local('Source Han Sans JP Regular'), - local('Noto Sans CJK JP Regular'), local('Droid Sans Fallback'); -} - -@font-face { - font-family: 'Heti Hei KR'; - src: local('Source Han Sans KR Regular'), local('Noto Sans CJK KR Regular'), - local('Droid Sans Fallback'); -} - -@font-face { - font-family: 'Heti Hei'; - font-weight: 200; - src: 'Heti Hei SC Light', 'Heti Hei TC Light', 'Heti Hei JP Light', - 'Heti Hei KR Light'; -} - -@font-face { - font-family: 'Heti Hei SC Light'; - font-weight: 200; - src: local('PingFang SC Light'), local('Heiti SC Light'), - 'Heti Hei SC Light Fallback', local('Source Han Sans CN Light'), - local('Noto Sans CJK SC Light'); -} - -@font-face { - font-family: 'Heti Hei TC Light'; - font-weight: 200; - src: local('PingFang TC Light'), local('Heiti TC Light'), - local('Microsoft Jhenghei Light'), local('Source Han Sans HK Light'), - local('Source Han Sans TW Light'), local('Noto Sans CJK TC Light'); -} - -@font-face { - font-family: 'Heti Hei JP Light'; - font-weight: 200; - src: local('Source Han Sans JP Light'), local('Noto Sans CJK JP Light'); -} - -@font-face { - font-family: 'Heti Hei KR Light'; - font-weight: 200; - src: local('Source Han Sans KR Light'), local('Noto Sans CJK KR Light'); -} - -@font-face { - font-family: 'Heti Hei SC Light Fallback'; - font-weight: 200; - src: local('Microsoft YaHei'), local('Droid Sans Fallback'); -} - -@font-face { - font-family: 'Heti Hei'; - font-weight: 600; - src: 'Heti Hei SC Bold', 'Heti Hei TC Bold', 'Heti Hei JP Bold', 'Heti Hei KR Bold'; -} - -@font-face { - font-family: 'Heti Hei SC Bold'; - font-weight: 600; - src: local('PingFang SC Medium'), local('Heiti SC Medium'), - 'Heti Hei SC Bold Fallback', local('Source Han Sans CN Bold'), - local('Noto Sans CJK SC Bold'); -} - -@font-face { - font-family: 'Heti Hei TC Bold'; - font-weight: 600; - src: local('PingFang TC Medium'), local('Heiti TC Medium'), - local('Microsoft Jhenghei Bold'), local('Source Han Sans HK Bold'), - local('Source Han Sans TW Bold'), local('Noto Sans CJK TC Bold'); -} - -@font-face { - font-family: 'Heti Hei JP Bold'; - font-weight: 600; - src: local('Hiragino Sans GB W6'), local('Source Han Sans JP Bold'), - local('Noto Sans CJK JP Bold'); -} - -@font-face { - font-family: 'Heti Hei KR Bold'; - font-weight: 600; - src: local('Source Han Sans KR Bold'), local('Noto Sans CJK KR Bold'); -} - -@font-face { - font-family: 'Heti Hei SC Bold Fallback'; - font-weight: 600; - src: local('Microsoft YaHei'), local('Droid Sans Fallback'); -} - -@font-face { - font-family: 'Heti Hei Black'; - font-weight: 800; - src: 'Heti Hei SC Black', 'Heti Hei TC Black', 'Heti Hei JP Black', - 'Heti Hei KR Black'; -} - -@font-face { - font-family: 'Heti Hei SC Black'; - font-weight: 800; - src: local('Lantinghei SC Heavy'), local('PingFang SC Semibold'), - local('Heiti SC Medium'), 'Heti Hei SC Black Fallback', - local('Source Han Sans CN Heavy'), local('Noto Sans CJK SC Heavy'); -} - -@font-face { - font-family: 'Heti Hei TC Black'; - font-weight: 800; - src: local('Lantinghei TC Heavy'), local('PingFang TC Semibold'), - local('Heiti TC Medium'), local('Microsoft Jhenghei Bold'), - local('Source Han Sans HK Heavy'), local('Source Han Sans TW Heavy'), - local('Noto Sans CJK TC Heavy'); -} - -@font-face { - font-family: 'Heti Hei JP Black'; - font-weight: 800; - src: local('Hiragino Sans GB W6'), local('Source Han Sans JP Heavy'), - local('Noto Sans CJK JP Heavy'); -} - -@font-face { - font-family: 'Heti Hei KR Black'; - font-weight: 800; - src: local('Source Han Sans KR Heavy'), local('Noto Sans CJK KR Heavy'); -} - -@font-face { - font-family: 'Heti Hei SC Black Fallback'; - font-weight: 800; - src: local('Microsoft YaHei'), local('Droid Sans Fallback'); -} - -@font-face { - font-family: 'Heti Song'; - src: local('Songti SC Regular'), local('Songti TC Regular'), local('SimSun'); -} - -@font-face { - font-family: 'Heti Song'; - font-weight: 200; - src: local('Songti SC Light'), local('Songti TC Light'), 'Heti Song Light Fallback'; -} - -@font-face { - font-family: 'Heti Song Light Fallback'; - font-weight: 200; - src: local('SimSun'); -} - -@font-face { - font-family: 'Heti Song'; - font-weight: 600; - src: local('Songti SC Bold'), local('Songti TC Bold'), 'Heti Song Bold Fallback'; -} - -@font-face { - font-family: 'Heti Song Bold Fallback'; - font-weight: 600; - src: local('SimSun'); -} - -@font-face { - font-family: 'Heti Song Black'; - font-weight: 800; - src: local('Songti SC Black'), local('SimSun'); -} - -@font-face { - font-family: 'Heti Kai'; - src: local('Kaiti SC Regular'), local('Kaiti TC Regular'), local('STKaiti'), - local('Kaiti'), local('BiauKai'); -} - -@font-face { - font-family: 'Heti Kai'; - font-weight: 600; - src: local('Kaiti SC Bold'), local('Kaiti TC Bold'); -} - -@font-face { - font-family: 'Heti Kai Bold Fallback'; - font-weight: 600; - src: - local('STKaiti'), - local('Kaiti') local('BiauKai'); -} - -@font-face { - font-family: 'Heti Kai Black'; - font-weight: 800; - src: local('Kaiti SC Black'), local('Kaiti TC Black'), local('STKaiti'), - local('Kaiti'); -} - -.markdown { - max-width: 100%; - font-size: 16px; - font-weight: 400; - -webkit-font-smoothing: subpixel-antialiased; - line-height: 1.5; - overflow-wrap: break-word; - word-wrap: break-word; - hyphens: auto; - letter-spacing: 0.02em; -} - -.markdown::before, -.markdown::after { - content: ''; - display: table; -} - -.markdown::after { - clear: both; -} - -.markdown > *:first-child, -.markdown section > *:first-child, -.markdown td > *:first-child { - margin-block-start: 0 !important; -} - -.markdown > *:last-child, -.markdown section > *:last-child, -.markdown td > *:last-child { - margin-block-end: 0 !important; -} - -.markdown blockquote { - margin-block-start: 12px; - margin-block-end: 24px; - margin-inline-start: 32px; - margin-inline-end: 32px; - padding-block-start: 12px; - padding-block-end: 12px; - padding-inline-start: 16px; - padding-inline-end: 16px; - background-color: rgba(0, 0, 0, 5.4%); -} - -@media (prefers-color-scheme: dark) { - .markdown blockquote { - background-color: rgba(255, 255, 255, 5.4%); - } -} - -.markdown figure { - display: block; - text-align: center; -} - -.markdown figure > img { - display: block; - margin-inline-start: auto; - margin-inline-end: auto; -} - -.markdown hr { - width: 30%; - height: 1px; - margin-block-start: 48px; - margin-block-end: 47px; - margin-inline-start: auto; - margin-inline-end: auto; - border: 0; - background-color: #ccc; -} - -@media (prefers-color-scheme: dark) { - .markdown hr { - background-color: #404040; - } -} - -.markdown p { - margin-block-start: 12px; - margin-block-end: 24px; - text-align: justify; -} - -.markdown p:not(:lang(zh)):not(:lang(ja)):not(:lang(ko)), -.markdown p:not(:lang(zh)) { - text-align: start; -} - -.markdown pre { - margin-block-start: 12px; - margin-block-end: 12px; - margin-inline-start: 0; - margin-inline-end: 0; - padding-block-start: 12px; - padding-block-end: 12px; - padding-inline-start: 16px; - padding-inline-end: 16px; - overflow: auto; - font-family: SFMono-Regular, consolas, 'Liberation Mono', menlo, courier, monospace, - 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; - white-space: pre; - word-wrap: normal; - border-radius: 4px; - background-color: rgba(0, 0, 0, 5.4%); -} - -@media (prefers-color-scheme: dark) { - .markdown pre { - background-color: rgba(255, 255, 255, 5.4%); - } -} - -.markdown pre code { - margin: 0; - padding: 0; - border: 0; - border-radius: 0; - background-color: rgba(0, 0, 0, 0%); - color: inherit; -} - -.markdown:not(:lang(zh)):not(:lang(ja)):not(:lang(ko)), -.markdown:not(:lang(zh)) { - letter-spacing: 0; -} - -.markdown a, -.markdown abbr, -.markdown code, -.markdown heti-spacing, -.markdown [lang='en-US'] { - letter-spacing: normal; -} - -.markdown h1, -.markdown h2, -.markdown h3, -.markdown h4, -.markdown h5, -.markdown h6 { - position: relative; - margin: 0; - margin-block-start: 24px; - margin-block-end: 12px; - font-weight: 600; -} - -.markdown h1 { - margin-block-end: 24px; - font-size: 32px; - line-height: 48px; -} - -.markdown h2 { - font-size: 24px; - line-height: 36px; -} - -.markdown h3 { - font-size: 20px; - line-height: 36px; -} - -.markdown h4 { - font-size: 18px; - line-height: 24px; -} - -.markdown h5 { - font-size: 16px; - line-height: 24px; -} - -.markdown h6 { - font-size: 14px; - line-height: 24px; -} - -.markdown h1, -.markdown h2, -.markdown h3 { - letter-spacing: 0.05em; -} - -.markdown h1:not(:lang(zh)):not(:lang(ja)):not(:lang(ko)), -.markdown h1:not(:lang(zh)), -.markdown h2:not(:lang(zh)):not(:lang(ja)):not(:lang(ko)), -.markdown h2:not(:lang(zh)), -.markdown h3:not(:lang(zh)):not(:lang(ja)):not(:lang(ko)), -.markdown h3:not(:lang(zh)) { - letter-spacing: 0; -} - -.markdown h1 + h2, -.markdown h2 + h3, -.markdown h3 + h4, -.markdown h4 + h5, -.markdown h5 + h6 { - margin-block-start: 12px; -} - -.markdown ul, -.markdown ol, -.markdown dl { - margin-block-start: 12px; - margin-block-end: 24px; -} - -.markdown ul, -.markdown ol { - padding-inline-start: 32px; -} - -.markdown ul ul, -.markdown ul ol, -.markdown ol ul, -.markdown ol ol { - margin-block-start: 0; - margin-block-end: 0; -} - -.markdown ul { - list-style-type: disc; -} - -.markdown ol { - list-style-type: decimal; -} - -.markdown ul ul, -.markdown ol ul { - list-style-type: circle; -} - -.markdown ul ul ul, -.markdown ul ol ul, -.markdown ol ul ul, -.markdown ol ol ul { - list-style-type: square; -} - -.markdown li { - list-style-type: unset; -} - -.markdown table { - box-sizing: border-box; - table-layout: fixed; - margin-block-start: 12px; - margin-block-end: 24px; - margin-inline-start: auto; - margin-inline-end: auto; - border-collapse: collapse; - border-width: 1px; - border-style: solid; - border-color: #ccc; - word-break: break-word; -} - -@media (prefers-color-scheme: dark) { - .markdown table { - border-color: #404040; - } -} - -.markdown th, -.markdown td { - padding-block-start: 6px; - padding-block-end: 6px; - padding-inline-start: 8px; - padding-inline-end: 8px; - border-width: 1px; - border-style: solid; - border-color: #ccc; -} - -@media (prefers-color-scheme: dark) { - .markdown th, - .markdown td { - border-color: #404040; - } -} - -.markdown caption { - caption-side: bottom; - margin-block-start: 2px; - margin-block-end: -4px; - font-size: 14px; - line-height: 24px; -} - -.markdown a { - text-decoration: none; -} - -.markdown a:hover { - padding-block-end: 1px; - border-block-end: 1px solid currentcolor; - text-decoration: none; -} - -.markdown abbr[title] { - padding-block-end: 1px; - border-block-end: 1px dotted; - text-decoration: none; - cursor: help; -} - -.markdown b, -.markdown strong { - font-weight: 600; -} - -.markdown code { - margin-inline-start: 0.25em; - margin-inline-end: 0.25em; - font-family: SFMono-Regular, consolas, 'Liberation Mono', menlo, courier, monospace, - 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; - font-size: 0.875em; -} - -.markdown dfn { - font-weight: 600; -} - -.markdown dfn:not(:lang(zh)):not(:lang(ja)):not(:lang(ko)), -.markdown dfn:not(:lang(zh)) { - font-weight: 400; -} - -.markdown em { - font-weight: 600; -} - -.markdown figcaption { - display: inline-block; - vertical-align: top; - font-size: 14px; - text-align: start; -} - -.markdown i { - font-style: italic; -} - -.markdown ins, -.markdown u { - padding-block-end: 1px; - border-block-end: 1px solid; - text-decoration: none; -} - -.markdown mark { - padding-block-start: 2px; - padding-block-end: 2px; - padding-inline-start: 1px; - padding-inline-end: 1px; - margin-inline-start: 1px; - margin-inline-end: 1px; - background-color: rgba(255, 247, 0, 88%); - color: inherit; -} - -@media (prefers-color-scheme: dark) { - .markdown mark { - background-color: rgba(77, 74, 0, 88%); - } -} - -.markdown q { - quotes: '「' '」' '『' '』'; -} - -.markdown q:not(:lang(zh)):not(:lang(ja)):not(:lang(ko)), -.markdown q:not(:lang(zh)) { - quotes: initial; - quotes: auto; -} - -.markdown rt { - font-size: 0.875em; - font-weight: 400; -} - -.markdown small { - font-size: 0.875em; -} - -.markdown strong { - font-weight: 600; -} - -.markdown sub, -.markdown sup { - position: relative; - margin-inline-start: 0.25em; - margin-inline-end: 0.25em; - font-size: 0.75em; - font-family: 'Helvetica Neue', helvetica, arial, 'Heti Hei', sans-serif, - 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; - font-style: normal; - line-height: 1; - vertical-align: baseline; -} - -.markdown sub { - bottom: -0.25em; -} - -.markdown sup { - top: -0.5em; -} - -.markdown sup:target, -.markdown sup a:target { - background-color: #dbedff; -} - -@media (prefers-color-scheme: dark) { - .markdown sup:target, - .markdown sup a:target { - background-color: #3a6188; - } -} - -.markdown summary { - padding-inline-start: 1em; - outline: 0; - cursor: pointer; -} - -.markdown summary::-webkit-details-marker { - width: 0.6em; - margin-inline-end: 0.4em; -} - -.markdown u[title] { - cursor: help; - border-block-end: 3px double rgba(0, 0, 0, 54%); -} - -@media (prefers-color-scheme: dark) { - .markdown u[title] { - border-block-end-color: rgba(255, 255, 255, 54%); - } -} - -.markdown address, -.markdown cite, -.markdown dfn, -.markdown dt, -.markdown em { - font-style: normal; -} - -.markdown address:not(:lang(zh)):not(:lang(ja)):not(:lang(ko)), -.markdown address:not(:lang(zh)), -.markdown cite:not(:lang(zh)):not(:lang(ja)):not(:lang(ko)), -.markdown cite:not(:lang(zh)), -.markdown dfn:not(:lang(zh)):not(:lang(ja)):not(:lang(ko)), -.markdown dfn:not(:lang(zh)), -.markdown dt:not(:lang(zh)):not(:lang(ja)):not(:lang(ko)), -.markdown dt:not(:lang(zh)), -.markdown em:not(:lang(zh)):not(:lang(ja)):not(:lang(ko)), -.markdown em:not(:lang(zh)) { - font-style: italic; -} - -.markdown abbr[title], -.markdown del, -.markdown ins, -.markdown s, -.markdown u { - margin-inline-start: 1px; - margin-inline-end: 1px; -} - -.markdown, -.markdown--sans { - font-family: 'Helvetica Neue', helvetica, arial, 'Heti Hei', sans-serif, - 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; -} - -.markdown--serif { - font-family: 'Times New Roman', times, 'Heti Song', serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol'; -} - -.markdown--classic { - font-family: 'Times New Roman', times, 'Heti Song', serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol'; -} - -.markdown--classic h1, -.markdown--classic h2, -.markdown--classic h3, -.markdown--classic h4, -.markdown--classic h5, -.markdown--classic h6 { - font-family: 'Times New Roman', times, 'Heti Kai Black', serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol'; - font-weight: 800; -} - -.markdown--classic blockquote, -.markdown--classic cite, -.markdown--classic q { - font-family: 'Times New Roman', times, 'Heti Kai', serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol'; -} - -.markdown--classic figcaption, -.markdown--classic caption, -.markdown--classic th { - font-family: 'Helvetica Neue', helvetica, arial, 'Heti Hei', sans-serif, - 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; -} - -.markdown--hei { - font-family: 'Helvetica Neue', helvetica, arial, 'Heti Hei', sans-serif, - 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; -} - -.markdown--song { - font-family: 'Times New Roman', times, 'Heti Song', serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol'; -} - -.markdown--kai { - font-family: 'Times New Roman', times, 'Heti Kai', serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol'; -} - -.markdown--columns-1, -.markdown--columns-2, -.markdown--columns-3, -.markdown--columns-4, -.markdown--columns-16em, -.markdown--columns-20em, -.markdown--columns-24em, -.markdown--columns-28em, -.markdown--columns-32em, -.markdown--columns-36em, -.markdown--columns-40em, -.markdown--columns-44em, -.markdown--columns-48em, -.markdown comma { - max-width: none; - column-gap: 2em; -} - -.markdown--columns-1 p, -.markdown--columns-2 p, -.markdown--columns-3 p, -.markdown--columns-4 p, -.markdown--columns-16em p, -.markdown--columns-20em p, -.markdown--columns-24em p, -.markdown--columns-28em p, -.markdown--columns-32em p, -.markdown--columns-36em p, -.markdown--columns-40em p, -.markdown--columns-44em p, -.markdown--columns-48em p, -.markdown comma p { - margin-block-start: 6px; - margin-block-end: 12px; - text-indent: 2em; -} - -.markdown--columns-1 { - column-count: 1; -} - -.markdown--columns-2 { - column-count: 2; -} - -.markdown--columns-3 { - column-count: 3; -} - -.markdown--columns-4 { - column-count: 4; -} - -.markdown--columns-16em { - column-width: 16em; -} - -.markdown--columns-20em { - column-width: 20em; -} - -.markdown--columns-24em { - column-width: 24em; -} - -.markdown--columns-28em { - column-width: 28em; -} - -.markdown--columns-32em { - column-width: 32em; -} - -.markdown--columns-36em { - column-width: 36em; -} - -.markdown--columns-40em { - column-width: 40em; -} - -.markdown--columns-44em { - column-width: 44em; -} - -.markdown--columns-48em { - column-width: 48em; -} - -.markdown--vertical { - max-width: none; - max-height: 100%; - writing-mode: vertical-rl; - letter-spacing: 0.125em; -} - -.markdown--vertical h1, -.markdown--vertical h2, -.markdown--vertical h3, -.markdown--vertical h4, -.markdown--vertical h5, -.markdown--vertical h6 { - text-align: start; -} - -.markdown--vertical q { - quotes: '「' '」' '『' '』'; -} - -.markdown--ancient, -.markdown--poetry { - font-family: 'Times New Roman', times, 'Heti Song', serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol'; -} - -.markdown--ancient h1, -.markdown--ancient h2, -.markdown--ancient h3, -.markdown--ancient h4, -.markdown--ancient h5, -.markdown--ancient h6, -.markdown--poetry h1, -.markdown--poetry h2, -.markdown--poetry h3, -.markdown--poetry h4, -.markdown--poetry h5, -.markdown--poetry h6 { - font-family: 'Times New Roman', times, 'Heti Kai Black', serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol'; - font-weight: 800; - text-align: center; -} - -.markdown--ancient h1 .markdown-meta, -.markdown--ancient h2 .markdown-meta, -.markdown--ancient h3 .markdown-meta, -.markdown--ancient h4 .markdown-meta, -.markdown--ancient h5 .markdown-meta, -.markdown--ancient h6 .markdown-meta, -.markdown--poetry h1 .markdown-meta, -.markdown--poetry h2 .markdown-meta, -.markdown--poetry h3 .markdown-meta, -.markdown--poetry h4 .markdown-meta, -.markdown--poetry h5 .markdown-meta, -.markdown--poetry h6 .markdown-meta { - font-weight: 400; -} - -@media screen and (min-width: 640px) { - .markdown--ancient h1 .markdown-meta, - .markdown--ancient h2 .markdown-meta, - .markdown--ancient h3 .markdown-meta, - .markdown--ancient h4 .markdown-meta, - .markdown--ancient h5 .markdown-meta, - .markdown--ancient h6 .markdown-meta, - .markdown--poetry h1 .markdown-meta, - .markdown--poetry h2 .markdown-meta, - .markdown--poetry h3 .markdown-meta, - .markdown--poetry h4 .markdown-meta, - .markdown--poetry h5 .markdown-meta, - .markdown--poetry h6 .markdown-meta { - position: absolute; - line-height: inherit; - text-indent: 0; - display: inline; - margin-block-start: 4px; - margin-inline-start: 8px; - } -} - -.markdown--ancient .markdown-meta, -.markdown--poetry .markdown-meta { - line-height: 24px; - text-align: center; - text-indent: 0; -} - -.markdown--ancient p { - text-indent: 2em; -} - -.markdown--poetry p { - text-align: center; - text-indent: 0; -} - -.markdown--annotation p { - margin-block-start: 0; - margin-block-end: 0; - line-height: 2.25; - text-indent: 2em; -} - -.markdown--annotation em { - // -webkit-text-emphasis: filled circle; - // -webkit-text-emphasis-position: under; - text-emphasis: filled circle; - text-emphasis-position: under right; - font-weight: 400; -} - -.markdown--annotation em:not(:lang(zh)):not(:lang(ja)):not(:lang(ko)), -.markdown--annotation em:not(:lang(zh)) { - // -webkit-text-emphasis: none; - text-emphasis: none; -} - -.markdown--annotation .markdown-meta { - margin-block-start: 12px; - margin-block-end: 24px; -} - -.markdown .markdown-meta { - display: block; - text-indent: 0; -} - -.markdown .markdown-verse { - text-align: center; - text-indent: 0; -} - -.markdown .markdown-large { - font-size: 18px; - line-height: 24px; -} - -.markdown .markdown-x-large { - font-size: 20px; - line-height: 30px; - letter-spacing: 0.05em; -} - -.markdown .markdown-small { - font-size: 14px; - line-height: 24px; -} - -.markdown .markdown-x-small { - font-size: 12px; - line-height: 18px; -} - -.markdown .markdown-list-latin { - list-style-type: upper-latin; -} - -.markdown .markdown-list-latin ol { - list-style-type: lower-roman; -} - -.markdown .markdown-list-latin ol ol { - list-style-type: lower-latin; -} - -.markdown .markdown-list-han { - list-style-type: cjk-ideographic; -} - -.markdown .markdown-list-han ol { - list-style-type: decimal; -} - -.markdown .markdown-list-han ol ol { - list-style-type: decimal-leading-zero; -} - -.markdown .markdown-fn { - margin-block-start: 59px; - border-block-start: 1px solid; - border-block-start-color: #ccc; - font-size: 14px; - font-family: 'Helvetica Neue', helvetica, arial, 'Heti Hei', sans-serif, - 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; - line-height: 24px; -} - -@media (prefers-color-scheme: dark) { - .markdown .markdown-fn { - border-block-start-color: #404040; - } -} - -.markdown .markdown-fn ol { - margin-block-start: 12px; - margin-block-end: 0; -} - -.markdown .markdown-fn li:target { - background-color: #dbedff; -} - -@media (prefers-color-scheme: dark) { - .markdown .markdown-fn li:target { - background-color: #3a6188; - } -} - -.markdown .markdown-hang { - position: absolute; - line-height: inherit; - text-indent: 0; -} - -.markdown .markdown-em { - // -webkit-text-emphasis: filled circle; - // -webkit-text-emphasis-position: under; - text-emphasis: filled circle; - text-emphasis-position: under right; -} - -.markdown .markdown-em:not(:lang(zh)):not(:lang(ja)):not(:lang(ko)), -.markdown .markdown-em:not(:lang(zh)) { - // -webkit-text-emphasis: none; - text-emphasis: none; -} - -.markdown .markdown-ruby--inline { - display: inline-flex; - flex-direction: column-reverse; - height: 1.5em; - vertical-align: top; -} - -.markdown .markdown-ruby--inline rt { - display: inline; - line-height: 1; - text-align: center; -} - -.markdown heti-spacing { - display: inline; -} - -.markdown heti-spacing + sup, -.markdown heti-spacing + sub { - margin-inline-start: 0; -} - -.markdown .heti-spacing-start { - margin-inline-end: 0.25em; -} - -.markdown .heti-spacing-end { - margin-inline-start: 0.25em; -} - -.markdown heti-adjacent { - display: inline; -} - -.markdown .heti-adjacent-half { - margin-inline-end: -0.5em; -} - -.markdown .heti-adjacent-quarter { - margin-inline-end: -0.25em; -} diff --git a/mana/apps/docs/.dumi/theme/styles/utils.less b/mana/apps/docs/.dumi/theme/styles/utils.less deleted file mode 100644 index 24b14768..00000000 --- a/mana/apps/docs/.dumi/theme/styles/utils.less +++ /dev/null @@ -1,76 +0,0 @@ -[data-dumi-tooltip] { - position: relative; - - &::before, - &::after { - position: absolute; - bottom: 100%; - left: 50%; - transform: translateX(-50%); - display: inline-block; - opacity: 0.7; - pointer-events: none; - transition: all 0.2s; - } - - &::before { - content: attr(data-dumi-tooltip); - min-width: 30px; - margin-bottom: 8px; - padding: 5px 8px; - color: #fff; - font-size: 13px; - line-height: 1.1; - white-space: nowrap; - background-color: #000; - border-radius: 2px; - box-shadow: 0 4px 10px rgba(0, 0, 0, 10%); - box-sizing: border-box; - - @{dark-selector} & { - background-color: #222; - } - } - - &::after { - content: ''; - width: 0; - height: 0; - border: 4px solid transparent; - border-top-color: #000; - - @{dark-selector} & { - border-top-color: #222; - } - } - - &:not(:hover) { - &::before, - &::after { - visibility: hidden; - opacity: 0; - } - } - - &[data-dumi-tooltip-bottom] { - &::before, - &::after { - bottom: auto; - top: 100%; - } - - &::before { - margin-top: 8px; - margin-bottom: 0; - } - - &::after { - border-top-color: transparent; - border-bottom-color: #000; - - @{dark-selector} & { - border-bottom-color: #222; - } - } - } -} diff --git a/mana/apps/docs/.dumi/theme/styles/variables.less b/mana/apps/docs/.dumi/theme/styles/variables.less deleted file mode 100644 index 271383c6..00000000 --- a/mana/apps/docs/.dumi/theme/styles/variables.less +++ /dev/null @@ -1,39 +0,0 @@ -@prefix: dumi-default; - -@s-content-width: 1392px; -@s-content-padding: 48px; -@s-sidebar-width: 184px; -@s-header-height: 76px; -@s-header-height-m: 52px; - -// default theme colors -@c-primary: #1677ff; -@c-warning: #d59200; -@c-success: #208a41; -@c-error: #ce1f31; -@c-text: #30363f; -@c-text-secondary: #4f5866; -@c-text-note: #8a9099; -@c-border: #d0d5d8; -@c-border-light: #e4e9ec; -@c-site-bg: #f7f9fb; - -// dark theme colors -// @dark-selector be injected by less-loader in feature/theme/index.ts -@dark-solid-amount: 15%; -@dark-light-amount: 22%; -@dark-border-amount: 71%; -@c-primary-dark: darken(@c-primary, @dark-solid-amount); -@c-warning-dark: darken(@c-warning, @dark-solid-amount); -@c-success-dark: darken(@c-success, @dark-solid-amount); -@c-error-dark: darken(@c-error, @dark-solid-amount); -@c-text-dark: lighten(@c-text-note, @dark-light-amount); -@c-text-secondary-dark: lighten(@c-text-secondary, @dark-light-amount); -@c-text-note-dark: lighten(@c-text, @dark-light-amount); -@c-border-dark: darken(@c-border, @dark-border-amount); -@c-border-less-dark: darken(@c-border-light, @dark-border-amount); -@c-site-bg-dark: darken(@c-site-bg, 95%); - -@mobile: ~'only screen and (max-width: 767px)'; -@tablet: ~'only screen and (min-width: 768px) and (max-width: 1024px)'; -@desktop: ~'only screen and (min-width: 1025px)'; diff --git a/mana/apps/docs/.dumi/theme/tailwind.out.css b/mana/apps/docs/.dumi/theme/tailwind.out.css deleted file mode 100644 index 9179e356..00000000 --- a/mana/apps/docs/.dumi/theme/tailwind.out.css +++ /dev/null @@ -1,1369 +0,0 @@ -/* -! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com -*/ - -/* -1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) -2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) -*/ -.difizen-dumi-banner { - /* -1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) -2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) - This can trigger a poorly considered lint error in some tools but is included by design. -*/ - - img, - svg, - video, - canvas, - audio, - iframe, - embed, - object { - display: block; - - /* 1 */ - vertical-align: middle; - - /* 2 */ - } -} - -*, -::before, -::after { - box-sizing: border-box; - - /* 1 */ - border-width: 0; - - /* 2 */ - border-style: solid; - - /* 2 */ - border-color: #e5e7eb; - - /* 2 */ -} - -::before, -::after { - --tw-content: ''; -} - -/* -1. Use a consistent sensible line-height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -3. Use a more readable tab size. -4. Use the user's configured `sans` font-family by default. -5. Use the user's configured `sans` font-feature-settings by default. -6. Use the user's configured `sans` font-variation-settings by default. -7. Disable tap highlights on iOS -*/ - -html, -:host { - line-height: 1.5; - - /* 1 */ - - text-size-adjust: 100%; - - /* 2 */ - - /* 3 */ - tab-size: 4; - - /* 3 */ - - font-family: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; - - /* 4 */ - - font-feature-settings: normal; - - /* 5 */ - - font-variation-settings: normal; - - /* 6 */ - - -webkit-tap-highlight-color: transparent; - - /* 7 */ -} - -/* -1. Remove the margin in all browsers. -2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. -*/ - -body { - margin: 0; - - /* 1 */ - line-height: inherit; - - /* 2 */ -} - -/* -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -3. Ensure horizontal rules are visible by default. -*/ - -hr { - height: 0; - - /* 1 */ - - color: inherit; - - /* 2 */ - - border-top-width: 1px; - - /* 3 */ -} - -/* -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr:where([title]) { - text-decoration: underline dotted; -} - -/* -Remove the default font size and weight for headings. -*/ - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/* -Reset links to optimize for opt-in styling instead of opt-out. -*/ - -a { - color: inherit; - text-decoration: inherit; -} - -/* -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/* -1. Use the user's configured `mono` font-family by default. -2. Use the user's configured `mono` font-feature-settings by default. -3. Use the user's configured `mono` font-variation-settings by default. -4. Correct the odd `em` font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', - 'Courier New', monospace; - - /* 1 */ - - font-feature-settings: normal; - - /* 2 */ - - font-variation-settings: normal; - - /* 3 */ - - font-size: 1em; - - /* 4 */ -} - -/* -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/* -Prevent `sub` and `sup` elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -3. Remove gaps between table borders by default. -*/ - -table { - text-indent: 0; - - /* 1 */ - border-color: inherit; - - /* 2 */ - border-collapse: collapse; - - /* 3 */ -} - -/* -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -3. Remove default padding in all browsers. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; - - /* 1 */ - - font-feature-settings: inherit; - - /* 1 */ - - font-variation-settings: inherit; - - /* 1 */ - - font-size: 100%; - - /* 1 */ - - font-weight: inherit; - - /* 1 */ - - line-height: inherit; - - /* 1 */ - - letter-spacing: inherit; - - /* 1 */ - - color: inherit; - - /* 1 */ - - margin: 0; - - /* 2 */ - - padding: 0; - - /* 3 */ -} - -/* -Remove the inheritance of text transform in Edge and Firefox. -*/ - -button, -select { - text-transform: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Remove default button styles. -*/ - -button, -input:where([type='button']), -input:where([type='reset']), -input:where([type='submit']) { - appearance: button; - - /* 1 */ - background-color: transparent; - - /* 2 */ - background-image: none; - - /* 2 */ -} - -/* -Use the modern Firefox focus style for all focusable elements. -*/ - -:-moz-focusring { - outline: auto; -} - -/* -Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/* -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/* -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/* -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - appearance: textfield; - - /* 1 */ - outline-offset: -2px; - - /* 2 */ -} - -/* -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - appearance: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to `inherit` in Safari. -*/ - -::-webkit-file-upload-button { - appearance: button; - - /* 1 */ - font: inherit; - - /* 2 */ -} - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -} - -/* -Removes the default spacing and border for appropriate elements. -*/ - -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} - -fieldset { - margin: 0; - padding: 0; -} - -legend { - padding: 0; -} - -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} - -/* -Reset default styling for dialogs. -*/ - -dialog { - padding: 0; -} - -/* -Prevent resizing textareas horizontally by default. -*/ - -textarea { - resize: vertical; -} - -/* -1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) -2. Set the default placeholder color to the user's configured gray 400 color. -*/ - -input::placeholder, -textarea::placeholder { - opacity: 1; - - /* 1 */ - - color: #9ca3af; - - /* 2 */ -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - - /* 1 */ - color: #9ca3af; - - /* 2 */ -} - -/* -Set the default cursor for buttons. -*/ - -button, -[role='button'] { - cursor: pointer; -} - -/* -Make sure disabled buttons don't get the pointer cursor. -*/ - -:disabled { - cursor: default; -} - -/* -Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) -*/ - -img, -video { - max-width: 100%; - height: auto; -} - -/* Make elements with the HTML hidden attribute stay hidden by default */ - -[hidden] { - display: none; -} - -:root { - --background: 0 0% 100%; - --foreground: 240 10% 3.9%; - --card: 0 0% 100%; - --card-foreground: 240 10% 3.9%; - --popover: 0 0% 100%; - --popover-foreground: 240 10% 3.9%; - --primary: 240 5.9% 10%; - --primary-foreground: 0 0% 98%; - --secondary: 240 4.8% 95.9%; - --secondary-foreground: 240 5.9% 10%; - --muted: 240 4.8% 95.9%; - --muted-foreground: 240 3.8% 46.1%; - --accent: 240 4.8% 95.9%; - --accent-foreground: 240 5.9% 10%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - --border: 240 5.9% 90%; - --input: 240 5.9% 90%; - --ring: 240 10% 3.9%; - --radius: 0.5rem; - --chart-1: 12 76% 61%; - --chart-2: 173 58% 39%; - --chart-3: 197 37% 24%; - --chart-4: 43 74% 66%; - --chart-5: 27 87% 67%; -} - -.dark { - --background: 240 10% 3.9%; - --foreground: 0 0% 98%; - --card: 240 10% 3.9%; - --card-foreground: 0 0% 98%; - --popover: 240 10% 3.9%; - --popover-foreground: 0 0% 98%; - --primary: 0 0% 98%; - --primary-foreground: 240 5.9% 10%; - --secondary: 240 3.7% 15.9%; - --secondary-foreground: 0 0% 98%; - --muted: 240 3.7% 15.9%; - --muted-foreground: 240 5% 64.9%; - --accent: 240 3.7% 15.9%; - --accent-foreground: 0 0% 98%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; - --border: 240 3.7% 15.9%; - --input: 240 3.7% 15.9%; - --ring: 240 4.9% 83.9%; - --chart-1: 220 70% 50%; - --chart-2: 160 60% 45%; - --chart-3: 30 80% 55%; - --chart-4: 280 65% 60%; - --chart-5: 340 75% 55%; -} - -* { - border-color: hsl(var(--border)); -} - -body { - background-color: hsl(var(--background)); - color: hsl(var(--foreground)); -} - -*, -::before, -::after { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 50%); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; - --tw-contain-size: ; - --tw-contain-layout: ; - --tw-contain-paint: ; - --tw-contain-style: ; -} - -::backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 50%); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; - --tw-contain-size: ; - --tw-contain-layout: ; - --tw-contain-paint: ; - --tw-contain-style: ; -} - -.container { - width: 100%; - margin-right: auto; - margin-left: auto; - padding-right: 2rem; - padding-left: 2rem; -} - -@media (min-width: 1400px) { - .container { - max-width: 1400px; - } -} - -.absolute { - position: absolute; -} - -.relative { - position: relative; -} - -.inset-0 { - inset: 0; -} - -.bottom-0 { - bottom: 0; -} - -.left-0 { - left: 0; -} - -.right-0 { - right: 0; -} - -.top-0 { - top: 0; -} - -.z-0 { - z-index: 0; -} - -.z-10 { - z-index: 10; -} - -.order-1 { - order: 1; -} - -.order-2 { - order: 2; -} - -.mx-auto { - margin-left: auto; - margin-right: auto; -} - -.mb-16 { - margin-bottom: 4rem; -} - -.mb-6 { - margin-bottom: 1.5rem; -} - -.mb-8 { - margin-bottom: 2rem; -} - -.mt-2 { - margin-top: 0.5rem; -} - -.mt-4 { - margin-top: 1rem; -} - -.mt-6 { - margin-top: 1.5rem; -} - -.mt-8 { - margin-top: 2rem; -} - -.block { - display: block; -} - -.inline { - display: inline; -} - -.flex { - display: flex; -} - -.inline-flex { - display: inline-flex; -} - -.grid { - display: grid; -} - -.hidden { - display: none; -} - -.h-10 { - height: 2.5rem; -} - -.h-8 { - height: 2rem; -} - -.h-9 { - height: 2.25rem; -} - -.w-9 { - width: 2.25rem; -} - -.w-full { - width: 100%; -} - -.max-w-2xl { - max-width: 42rem; -} - -.max-w-3xl { - max-width: 48rem; -} - -.max-w-7xl { - max-width: 80rem; -} - -.shrink { - flex-shrink: 1; -} - -.transform { - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) - rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) - scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.resize { - resize: both; -} - -.grid-cols-1 { - grid-template-columns: repeat(1, minmax(0, 1fr)); -} - -.flex-col { - flex-direction: column; -} - -.items-center { - align-items: center; -} - -.justify-center { - justify-content: center; -} - -.gap-16 { - gap: 4rem; -} - -.gap-4 { - gap: 1rem; -} - -.gap-8 { - gap: 2rem; -} - -.whitespace-nowrap { - white-space: nowrap; -} - -.rounded { - border-radius: 0.25rem; -} - -.rounded-md { - border-radius: calc(var(--radius) - 2px); -} - -.rounded-xl { - border-radius: 0.75rem; -} - -.border { - border-width: 1px; -} - -.border-input { - border-color: hsl(var(--input)); -} - -.bg-background { - background-color: hsl(var(--background)); -} - -.bg-destructive { - background-color: hsl(var(--destructive)); -} - -.bg-primary { - background-color: hsl(var(--primary)); -} - -.bg-secondary { - background-color: hsl(var(--secondary)); -} - -.bg-\[url\(\'\/_convertfast\/gradient-bg-0\.svg\'\)\] { - background-image: url('/_convertfast/gradient-bg-0.svg'); -} - -.bg-gradient-to-t { - background-image: linear-gradient(to top, var(--tw-gradient-stops)); -} - -.from-zinc-50 { - --tw-gradient-from: #fafafa var(--tw-gradient-from-position); - --tw-gradient-to: rgb(250 250 250 / 0%) var(--tw-gradient-to-position); - --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); -} - -.to-black { - --tw-gradient-to: #000 var(--tw-gradient-to-position); -} - -.to-white { - --tw-gradient-to: #fff var(--tw-gradient-to-position); -} - -.bg-auto { - background-size: auto; -} - -.bg-no-repeat { - background-repeat: no-repeat; -} - -.p-1 { - padding: 0.25rem; -} - -.px-3 { - padding-left: 0.75rem; - padding-right: 0.75rem; -} - -.px-4 { - padding-left: 1rem; - padding-right: 1rem; -} - -.px-8 { - padding-left: 2rem; - padding-right: 2rem; -} - -.py-16 { - padding-top: 4rem; - padding-bottom: 4rem; -} - -.py-2 { - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.py-20 { - padding-top: 5rem; - padding-bottom: 5rem; -} - -.text-center { - text-align: center; -} - -.text-3xl { - font-size: 1.875rem; - line-height: 2.25rem; -} - -.text-4xl { - font-size: 2.25rem; - line-height: 2.5rem; -} - -.text-base { - font-size: 1rem; - line-height: 1.5rem; -} - -.text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} - -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} - -.text-xl { - font-size: 1.25rem; - line-height: 1.75rem; -} - -.text-xs { - font-size: 0.75rem; - line-height: 1rem; -} - -.font-bold { - font-weight: 700; -} - -.font-medium { - font-weight: 500; -} - -.font-semibold { - font-weight: 600; -} - -.leading-7 { - line-height: 1.75rem; -} - -.leading-8 { - line-height: 2rem; -} - -.tracking-tight { - letter-spacing: -0.025em; -} - -.text-destructive-foreground { - color: hsl(var(--destructive-foreground)); -} - -.text-gray-500 { - --tw-text-opacity: 1; - - color: rgb(107 114 128 / var(--tw-text-opacity)); -} - -.text-gray-900 { - --tw-text-opacity: 1; - - color: rgb(17 24 39 / var(--tw-text-opacity)); -} - -.text-muted-foreground { - color: hsl(var(--muted-foreground)); -} - -.text-primary { - color: hsl(var(--primary)); -} - -.text-primary-foreground { - color: hsl(var(--primary-foreground)); -} - -.text-secondary-foreground { - color: hsl(var(--secondary-foreground)); -} - -.underline-offset-4 { - text-underline-offset: 4px; -} - -.shadow { - --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 10%), 0 1px 2px -1px rgb(0 0 0 / 10%); - --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), - 0 1px 2px -1px var(--tw-shadow-color); - - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), - var(--tw-shadow); -} - -.shadow-2xl { - --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 25%); - --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); - - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), - var(--tw-shadow); -} - -.shadow-sm { - --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 5%); - --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); - - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), - var(--tw-shadow); -} - -.shadow-xl { - --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 10%), 0 8px 10px -6px rgb(0 0 0 / 10%); - --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), - 0 8px 10px -6px var(--tw-shadow-color); - - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), - var(--tw-shadow); -} - -.outline { - outline-style: solid; -} - -.ring-1 { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) - var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) - var(--tw-ring-color); - - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), - var(--tw-shadow, 0 0 #0000); -} - -.ring-gray-400\/10 { - --tw-ring-color: rgb(156 163 175 / 10%); -} - -.drop-shadow-md { - --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 7%)) - drop-shadow(0 2px 2px rgb(0 0 0 / 6%)); - - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) - var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) - var(--tw-drop-shadow); -} - -.grayscale { - --tw-grayscale: grayscale(100%); - - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) - var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) - var(--tw-drop-shadow); -} - -.filter { - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) - var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) - var(--tw-drop-shadow); -} - -.transition { - transition-property: - color, - background-color, - border-color, - text-decoration-color, - fill, - stroke, - opacity, - box-shadow, - transform, - filter, - -webkit-backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, - fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; - transition-property: - color, - background-color, - border-color, - text-decoration-color, - fill, - stroke, - opacity, - box-shadow, - transform, - filter, - backdrop-filter, - -webkit-backdrop-filter; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.transition-colors { - transition-property: color, background-color, border-color, text-decoration-color, - fill, stroke; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.ease-out { - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); - animation-timing-function: cubic-bezier(0, 0, 0.2, 1); -} - -@keyframes enter { - from { - opacity: var(--tw-enter-opacity, 1); - transform: translate3d( - var(--tw-enter-translate-x, 0), - var(--tw-enter-translate-y, 0), - 0 - ) - scale3d( - var(--tw-enter-scale, 1), - var(--tw-enter-scale, 1), - var(--tw-enter-scale, 1) - ) - rotate(var(--tw-enter-rotate, 0)); - } -} - -@keyframes exit { - to { - opacity: var(--tw-exit-opacity, 1); - transform: translate3d( - var(--tw-exit-translate-x, 0), - var(--tw-exit-translate-y, 0), - 0 - ) - scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) - rotate(var(--tw-exit-rotate, 0)); - } -} - -.hover\:bg-accent:hover { - background-color: hsl(var(--accent)); -} - -.hover\:bg-destructive\/90:hover { - background-color: hsl(var(--destructive) / 90%); -} - -.hover\:bg-primary\/90:hover { - background-color: hsl(var(--primary) / 90%); -} - -.hover\:bg-secondary\/80:hover { - background-color: hsl(var(--secondary) / 80%); -} - -.hover\:text-accent-foreground:hover { - color: hsl(var(--accent-foreground)); -} - -.hover\:underline:hover { - text-decoration-line: underline; -} - -.focus-visible\:outline-none:focus-visible { - outline: 2px solid transparent; - outline-offset: 2px; -} - -.focus-visible\:ring-1:focus-visible { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) - var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) - var(--tw-ring-color); - - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), - var(--tw-shadow, 0 0 #0000); -} - -.focus-visible\:ring-ring:focus-visible { - --tw-ring-color: hsl(var(--ring)); -} - -.disabled\:pointer-events-none:disabled { - pointer-events: none; -} - -.disabled\:opacity-50:disabled { - opacity: 0.5; -} - -.dark\:block:is(.dark *) { - display: block; -} - -.dark\:hidden:is(.dark *) { - display: none; -} - -.dark\:from-zinc-950:is(.dark *) { - --tw-gradient-from: #09090b var(--tw-gradient-from-position); - --tw-gradient-to: rgb(9 9 11 / 0%) var(--tw-gradient-to-position); - --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); -} - -@media (min-width: 640px) { - .sm\:mt-12 { - margin-top: 3rem; - } - - .sm\:w-auto { - width: auto; - } - - .sm\:flex-row { - flex-direction: row; - } - - .sm\:px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; - } - - .sm\:py-24 { - padding-top: 6rem; - padding-bottom: 6rem; - } - - .sm\:text-2xl { - font-size: 1.5rem; - line-height: 2rem; - } - - .sm\:text-4xl { - font-size: 2.25rem; - line-height: 2.5rem; - } - - .sm\:text-5xl { - font-size: 3rem; - line-height: 1; - } -} - -@media (min-width: 768px) { - .md\:order-1 { - order: 1; - } - - .md\:order-2 { - order: 2; - } - - .md\:grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .md\:gap-24 { - gap: 6rem; - } -} - -@media (min-width: 1024px) { - .lg\:px-8 { - padding-left: 2rem; - padding-right: 2rem; - } - - .lg\:py-32 { - padding-top: 8rem; - padding-bottom: 8rem; - } - - .lg\:text-6xl { - font-size: 3.75rem; - line-height: 1; - } -} diff --git a/mana/apps/docs/.dumi/tsconfig.json b/mana/apps/docs/.dumi/tsconfig.json deleted file mode 100644 index a32dd4f2..00000000 --- a/mana/apps/docs/.dumi/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../tsconfig.json", - "include": ["**/*"] -} diff --git a/mana/apps/docs/.dumirc.ts b/mana/apps/docs/.dumirc.ts deleted file mode 100644 index 743e6047..00000000 --- a/mana/apps/docs/.dumirc.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { defineConfig } from 'dumi'; - -export default defineConfig({ - themeConfig: { - hd: { rules: [] }, - name: 'mana', - link: '/', - logo: '/mana.svg', - footer: `Open-source MIT Licensed | Copyright © 2023-present`, - prefersColor: { default: 'light' }, - links: [ - { - title: 'Related', - itemList: [ - { - name: 'Difizen', - link: 'https://github.com/difizen', - }, - { - name: 'Difizen|libro', - link: 'https://github.com/difizen/libro', - }, - { - name: 'Difizen|mana', - link: 'https://github.com/difizen/mana', - }, - { - name: 'Difizen|magent', - link: 'https://github.com/difizen/magent', - }, - ], - }, - { - title: 'Community', - itemList: [ - { - name: 'feedback issues', - link: 'https://github.com/difizen/mana/issues', - }, - { - name: 'release notes', - link: 'https://github.com/difizen/mana/releases', - }, - ], - }, - ], - qrcodes: [ - { - name: '钉钉', - qrcode: '/ding-qrcode.png', - }, - ], - gitRepo: { owner: 'difizen', name: 'mana' }, - }, - locales: [ - { id: 'en-US', name: 'EN' }, - { id: 'zh-CN', name: '中文' }, - ], - favicons: ['/mana.svg'], - plugins: ['@difizen/umi-plugin-mana', './dumi-plugin-alias'], - mana: { - decorator: true, - nodenext: true, - }, - exportStatic: {}, - resolve: { - docDirs: ['docs'], - codeBlockMode: 'passive', - }, -}); diff --git a/mana/apps/docs/.eslintrc.mjs b/mana/apps/docs/.eslintrc.mjs deleted file mode 100644 index ffd7daa9..00000000 --- a/mana/apps/docs/.eslintrc.mjs +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: require.resolve('../../.eslintrc.js'), -}; diff --git a/mana/apps/docs/CHANGELOG.md b/mana/apps/docs/CHANGELOG.md deleted file mode 100644 index 68fccb6f..00000000 --- a/mana/apps/docs/CHANGELOG.md +++ /dev/null @@ -1,384 +0,0 @@ -# @difizen/mana-docs - -## 0.1.32 - -### Patch Changes - -- [#88](https://github.com/difizen/mana/pull/88) [`efec026`](https://github.com/difizen/mana/commit/efec02698841de45108da24897040b528d2c3ec2) Thanks [@sunshinesmilelk](https://github.com/sunshinesmilelk)! - feat: add onWillStart hook for ApplicationComponent - -- Updated dependencies [[`efec026`](https://github.com/difizen/mana/commit/efec02698841de45108da24897040b528d2c3ec2)]: - - @difizen/mana-app@0.1.32 - - @difizen/mana-configuration-panel@0.1.32 - - @difizen/mana-l10n@0.1.32 - - @difizen/mana-react@0.1.32 - - @difizen/umi-plugin-mana@0.1.32 - -## 0.1.31 - -### Patch Changes - -- [#79](https://github.com/difizen/mana/pull/79) [`0365365`](https://github.com/difizen/mana/commit/03653659a7400430493903e33f44dc2f048576df) Thanks [@lulusir](https://github.com/lulusir)! - fix: localStorage is not defined. - -- Updated dependencies [[`0365365`](https://github.com/difizen/mana/commit/03653659a7400430493903e33f44dc2f048576df)]: - - @difizen/umi-plugin-mana@0.1.31 - - @difizen/mana-react@0.1.31 - - @difizen/mana-l10n@0.1.31 - - @difizen/mana-app@0.1.31 - -## 0.1.30 - -### Patch Changes - -- [#76](https://github.com/difizen/mana/pull/76) [`14ea61a`](https://github.com/difizen/mana/commit/14ea61ac7ecc717b3091687b9ea4ac0aaf1e6ecf) Thanks [@BroKun](https://github.com/BroKun)! - Use a consistent version. - -- [#78](https://github.com/difizen/mana/pull/78) [`92f3efc`](https://github.com/difizen/mana/commit/92f3efcc9852ff7230d9e029e25fdacd9d529d55) Thanks [@sunshinesmilelk](https://github.com/sunshinesmilelk)! - fix text color for some components - -- Updated dependencies [[`14ea61a`](https://github.com/difizen/mana/commit/14ea61ac7ecc717b3091687b9ea4ac0aaf1e6ecf), [`92f3efc`](https://github.com/difizen/mana/commit/92f3efcc9852ff7230d9e029e25fdacd9d529d55)]: - - @difizen/umi-plugin-mana@0.1.30 - - @difizen/mana-react@0.1.30 - - @difizen/mana-l10n@0.1.30 - - @difizen/mana-app@0.1.30 - -## 0.1.28 - -### Patch Changes - -- [#71](https://github.com/difizen/mana/pull/71) [`24b70a0`](https://github.com/difizen/mana/commit/24b70a036be7f4d85548db720ea5859b5a3e5b41) Thanks [@BroKun](https://github.com/BroKun)! - [syringe] Developing multi-instance data structures becomes easier with auto factory. - -- Updated dependencies [[`24b70a0`](https://github.com/difizen/mana/commit/24b70a036be7f4d85548db720ea5859b5a3e5b41)]: - - @difizen/umi-plugin-mana@0.1.28 - - @difizen/mana-react@0.1.28 - - @difizen/mana-l10n@0.1.28 - - @difizen/mana-app@0.1.28 - -## 0.1.27 - -### Patch Changes - -- [#62](https://github.com/difizen/mana/pull/62) [`812915f`](https://github.com/difizen/mana/commit/812915f4681c44982cefa5800d6f11ec27a81a20) Thanks [@sunshinesmilelk](https://github.com/sunshinesmilelk)! - fix(umi-plugin): update mana runtime plugin dir name - -- Updated dependencies [[`812915f`](https://github.com/difizen/mana/commit/812915f4681c44982cefa5800d6f11ec27a81a20)]: - - @difizen/umi-plugin-mana@0.1.27 - - @difizen/mana-app@0.1.27 - - @difizen/mana-l10n@0.1.27 - - @difizen/mana-react@0.1.27 - -## 0.1.26 - -### Patch Changes - -- [#60](https://github.com/difizen/mana/pull/60) [`a23732f`](https://github.com/difizen/mana/commit/a23732f365a76f719ac59f2c87de3920f70b1dd7) Thanks [@zhanba](https://github.com/zhanba)! - fix: support query parse in uri - -- Updated dependencies [[`a23732f`](https://github.com/difizen/mana/commit/a23732f365a76f719ac59f2c87de3920f70b1dd7)]: - - @difizen/mana-app@0.1.26 - - @difizen/mana-react@0.1.26 - - @difizen/umi-plugin-mana@0.1.26 - -## 0.1.25 - -### Patch Changes - -- [#58](https://github.com/difizen/mana/pull/58) [`df976cb`](https://github.com/difizen/mana/commit/df976cba6bcf49b979dc001ffe68b4e0953522ff) Thanks [@BroKun](https://github.com/BroKun)! - Theme support empty prefix - -- Updated dependencies [[`df976cb`](https://github.com/difizen/mana/commit/df976cba6bcf49b979dc001ffe68b4e0953522ff)]: - - @difizen/umi-plugin-mana@0.1.25 - - @difizen/mana-react@0.1.25 - - @difizen/mana-app@0.1.25 - -## 0.1.24 - -### Patch Changes - -- [#56](https://github.com/difizen/mana/pull/56) [`02f92a6`](https://github.com/difizen/mana/commit/02f92a6da23fc653e52c0192c3547ed956a44a22) Thanks [@BroKun](https://github.com/BroKun)! - Support custom css variable prefix - -- Updated dependencies [[`02f92a6`](https://github.com/difizen/mana/commit/02f92a6da23fc653e52c0192c3547ed956a44a22)]: - - @difizen/umi-plugin-mana@0.1.24 - - @difizen/mana-react@0.1.24 - - @difizen/mana-app@0.1.24 - -## 0.1.23 - -### Patch Changes - -- [#53](https://github.com/difizen/mana/pull/53) [`c76098a`](https://github.com/difizen/mana/commit/c76098abd7eeae0ea7885d00402a47e15197e2a0) Thanks [@BroKun](https://github.com/BroKun)! - Fix slot view initialization in some cases. - -- [#53](https://github.com/difizen/mana/pull/53) [`c24e597`](https://github.com/difizen/mana/commit/c24e5974abd064d3af1d27f321745daa48183a74) Thanks [@BroKun](https://github.com/BroKun)! - Export color protocol. - -- [#53](https://github.com/difizen/mana/pull/53) [`8174a13`](https://github.com/difizen/mana/commit/8174a1355b9aca974d7ba68fc6087aef923b757c) Thanks [@BroKun](https://github.com/BroKun)! - Always serialize when storing. - -- [#53](https://github.com/difizen/mana/pull/53) [`06bdadd`](https://github.com/difizen/mana/commit/06bdadd00e143151c0b25f63354dab3579d5ee1f) Thanks [@BroKun](https://github.com/BroKun)! - Use modal service api without full modal item - -- Updated dependencies [[`c76098a`](https://github.com/difizen/mana/commit/c76098abd7eeae0ea7885d00402a47e15197e2a0), [`c24e597`](https://github.com/difizen/mana/commit/c24e5974abd064d3af1d27f321745daa48183a74), [`8174a13`](https://github.com/difizen/mana/commit/8174a1355b9aca974d7ba68fc6087aef923b757c), [`06bdadd`](https://github.com/difizen/mana/commit/06bdadd00e143151c0b25f63354dab3579d5ee1f)]: - - @difizen/umi-plugin-mana@0.1.23 - - @difizen/mana-react@0.1.23 - - @difizen/mana-app@0.1.23 - -## 0.1.22 - -### Patch Changes - -- ec0b517: Fix core module compatibility -- Updated dependencies [ec0b517] - - @difizen/umi-plugin-mana@0.1.22 - - @difizen/mana-react@0.1.22 - - @difizen/mana-app@0.1.22 - -## 0.1.21 - -### Patch Changes - -- 007af7f: Dark mode support for menu. -- 32133c3: Add notification feature. -- Updated dependencies [007af7f] -- Updated dependencies [32133c3] - - @difizen/umi-plugin-mana@0.1.21 - - @difizen/mana-react@0.1.21 - - @difizen/mana-app@0.1.21 - -## 0.1.20 - -### Patch Changes - -- 690a2aa: Added umi plug-in, now you can use mana in umi project more easily. -- Updated dependencies [690a2aa] - - @difizen/umi-plugin-mana@0.1.20 - - @difizen/mana-react@0.1.20 - - @difizen/mana-app@0.1.20 - -## 0.1.19 - -### Patch Changes - -- 43f310a: Remove global style css -- Updated dependencies [43f310a] - - @difizen/mana-react@0.1.19 - - @difizen/mana-app@0.1.19 - -## 0.1.18 - -### Patch Changes - -- 02ef50f: basic styles no longer affect global styles. -- Updated dependencies [02ef50f] - - @difizen/mana-react@0.1.18 - - @difizen/mana-app@0.1.18 - -## 0.1.17 - -### Patch Changes - -- 1acf757: feat: add onInitialized hooks for ApplicationComponent -- Updated dependencies [1acf757] - - @difizen/mana-app@0.1.17 - - @difizen/mana-react@0.1.17 - -## 0.1.16 - -### Patch Changes - -- 84f7cd8: No longer import font-awesome styles through less file. -- Updated dependencies [84f7cd8] - - @difizen/mana-react@0.1.16 - - @difizen/mana-app@0.1.16 - -## 0.1.15 - -### Patch Changes - -- 95eb30c: chore: add father config -- Updated dependencies [95eb30c] - - @difizen/mana-app@0.1.15 - - @difizen/mana-react@0.1.15 - -## 0.1.14 - -### Patch Changes - -- 1b880fe: fix: attributes in ContributionOptionConfig -- Updated dependencies [1b880fe] - - @difizen/mana-app@0.1.14 - - @difizen/mana-react@0.1.14 - -## 0.1.13 - -### Patch Changes - -- 76745bd: feat: add ContributionOptionConfig -- Updated dependencies [76745bd] - - @difizen/mana-app@0.1.13 - - @difizen/mana-react@0.1.13 - -## 0.1.12 - -### Patch Changes - -- 8eee617: chore: update the peerDependencies about react -- Updated dependencies [8eee617] - - @difizen/mana-react@0.1.12 - - @difizen/mana-app@0.1.12 - -## 0.1.11 - -### Patch Changes - -- 6fb1d96: mana-observable: Allows defining properties that should not be observed. -- 67e2969: Add mana-ui package -- c1cf9c7: Compatible with disposable-collection old API -- Updated dependencies [6fb1d96] -- Updated dependencies [67e2969] -- Updated dependencies [c1cf9c7] - - @difizen/mana-react@0.1.11 - - @difizen/mana-app@0.1.11 - -## 0.1.10 - -### Patch Changes - -- 9f85eb3: App: No longer use proxy to operate tree nodes to improve performance. -- 5c2f9f3: Workaround on Illegal invocation errors -- 1e70032: Fix: Object.prototype methods should not be called directly on the object -- 4cb40cf: Avoid adjacent dividing lines in menus. -- f090577: No longer proxies access to forzen objects -- 9fed876: Allow custom modal rendering logic. -- 395394b: Observable: Allows users to add custom exclusion rules for observable transformations -- 36bd4ee: Readonly & non-configurable property should return the actual value -- Updated dependencies [9f85eb3] -- Updated dependencies [5c2f9f3] -- Updated dependencies [1e70032] -- Updated dependencies [4cb40cf] -- Updated dependencies [f090577] -- Updated dependencies [9fed876] -- Updated dependencies [395394b] -- Updated dependencies [36bd4ee] - - @difizen/mana-react@0.1.10 - - @difizen/mana-app@0.1.10 - -## 0.1.9 - -### Patch Changes - -- b5ec5a9: Fix: Divider display between menu groups. -- 4d9bc01: 1. Once a menu is activated, clicking it again will no longer deactivate it. 2. Even with proxy objects, the original notifier can be found. -- 4722513: The file tree can be accessed contextually via the file tree menu -- Updated dependencies [b5ec5a9] -- Updated dependencies [4d9bc01] -- Updated dependencies [4722513] - - @difizen/mana-react@0.1.9 - - @difizen/mana-app@0.1.9 - -## 0.1.8 - -### Patch Changes - -- 9c87e44: 1. Once a menu is activated, clicking it again will no longer deactivate it. 2. Even with proxy objects, the original notifier can be found. -- Updated dependencies [9c87e44] - - @difizen/mana-react@0.1.8 - - @difizen/mana-app@0.1.8 - -## 0.1.7 - -### Patch Changes - -- 1650890: add simple mode for uri which not escape & unescape -- Updated dependencies [1650890] - - @difizen/mana-app@0.1.7 - - @difizen/mana-react@0.1.7 - -## 0.1.6 - -### Patch Changes - -- b6bac8e: add vscode uri and add parameters in parse function -- Updated dependencies [b6bac8e] - - @difizen/mana-app@0.1.6 - - @difizen/mana-react@0.1.6 - -## 0.1.5 - -### Patch Changes - -- 530df5c: Get notifier before observable transform. -- Updated dependencies [530df5c] - - @difizen/mana-app@0.1.5 - - @difizen/mana-react@0.1.5 - -## 0.1.4 - -### Patch Changes - -- d36870f: 1. Add slot related events. 2. Add implementation of basic stateful views. -- Updated dependencies [d36870f] - - @difizen/mana-app@0.1.4 - - @difizen/mana-react@0.1.4 - -## 0.1.3 - -### Patch Changes - -- Performance optimization of view rendering and issue fixing of file tree -- Updated dependencies - - @difizen/mana-app@0.1.3 - - @difizen/mana-react@0.1.3 - -## 0.1.2 - -### Patch Changes - -- 1. [observable] Do not track dom element object. -- Updated dependencies - - @difizen/mana-app@0.1.2 - - @difizen/mana-react@0.1.2 - -## 0.1.1 - -### Patch Changes - -- 1. [observable] Optimize the handling of frozen objects and some built-in types. - 2. [observable] Support pausing property change events. - 3. Support tab props & support multi-parameter method to handle menu status. -- Updated dependencies - - @difizen/mana-app@0.1.1 - - @difizen/mana-react@0.1.1 - -## 0.1.0 - -### Minor Changes - -- - [observable] remove `Reactable` and use `notifier` as message trigger. - - [observable] better event handling. - - [syringe] the syringe module now supports setting dependencies. - -### Patch Changes - -- c137209: 1. (core) add onActiveChange event in DefaultSlotView. 2. (observable) update - Notifier api & increased coverage. -- c9b0853: 1. The syringe module now supports setting dependencies. 2. Observable has - been refactored with fewer entities and better event handling. 3. Fixed some other - issues and improved code quality. -- Updated dependencies -- Updated dependencies [c137209] -- Updated dependencies [c9b0853] -- Updated dependencies [3f50036] - - @difizen/mana-app@0.1.0 - - @difizen/mana-react@0.1.0 - -## 0.0.2-alpha.3 - -### Patch Changes - -- 1. (core) add onActiveChange event in DefaultSlotView. - 2. (observable) update Notifier api & increased coverage. -- Updated dependencies - - @difizen/mana-react@0.0.2-alpha.3 - - @difizen/mana-app@0.0.2-alpha.3 - -## 0.0.2-alpha.2 - -### Patch Changes - -- 1. The syringe module now supports setting dependencies. - 2. Observable has been refactored with fewer entities and better event handling. - 3. Fixed some other issues and improved code quality. -- Updated dependencies - - @difizen/mana-app@0.0.2-alpha.2 - - @difizen/mana-react@0.0.2-alpha.2 diff --git a/mana/apps/docs/docs/examples/application-react.md b/mana/apps/docs/docs/examples/application-react.md deleted file mode 100644 index 2a16548e..00000000 --- a/mana/apps/docs/docs/examples/application-react.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Workbench -order: 100 ---- - -# Workbench Example - - diff --git a/mana/apps/docs/docs/examples/application-react.zh-CN.md b/mana/apps/docs/docs/examples/application-react.zh-CN.md deleted file mode 100644 index 23c3b4f4..00000000 --- a/mana/apps/docs/docs/examples/application-react.zh-CN.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: 工作台 -order: 100 ---- - -# 工作台示例 - - diff --git a/mana/apps/docs/docs/examples/command.md b/mana/apps/docs/docs/examples/command.md deleted file mode 100644 index 74b76c2f..00000000 --- a/mana/apps/docs/docs/examples/command.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Commands -order: 1 - -nav: - title: Example - order: 3 ---- - -# Commands - -The command system is a very fundamental system that supports a manager for callable methods. By standardizing command registration, we address the unified response across different UI entry points such as shortcuts, menus, toolbars, and command panels. This also provides a simpler internal method invocation entry point for external systems of plugins. - -## Simple Usage - - - -Users can complete the registration and consumption of commands using `CommandRegistry`. We also provide the `CommandContribution` extension point. - -```typescript -export type CommandContribution = { - registerCommands: (commands: CommandRegistry) => void; -}; -``` - -We offer two methods of registering commands on the `CommandRegistry` - -```typescript -registerCommand(command: Command, handler?: CommandHandler): Disposable -registerCommandWithContext(command: Command, ctx: T, handler?: CommandHandlerWithContext): Disposable -``` diff --git a/mana/apps/docs/docs/examples/command.zh-CN.md b/mana/apps/docs/docs/examples/command.zh-CN.md deleted file mode 100644 index 47de1cdc..00000000 --- a/mana/apps/docs/docs/examples/command.zh-CN.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: 命令 -order: 7 -nav: - title: 示例 - order: 3 ---- - -# 命令 - -命令系统是非常基础的一个系统,其本身支持对可调用方法的管理器,我们通过统一的命令注册,来解决快捷键、菜单、工具栏、命令面板等不同 UI 入口的统一响应问题,也给插件得外部系统更浅的内部方法调用入口。 - -## 简单使用 - - - -用户可以 `CommandRegistry` 完成命令的注册和消费,我们也提供了 `CommandContribution` 扩展点。 - -```typescript -export type CommandContribution = { - registerCommands: (commands: CommandRegistry) => void; -}; -``` - -我们在 `CommandRegistry` 上提供两种注册命令的形式 - -```typescript -registerCommand(command: Command, handler?: CommandHandler): Disposable -registerCommandWithContext(command: Command, ctx: T, handler?: CommandHandlerWithContext): Disposable -``` diff --git a/mana/apps/docs/docs/examples/file-tree.md b/mana/apps/docs/docs/examples/file-tree.md deleted file mode 100644 index f76e7b33..00000000 --- a/mana/apps/docs/docs/examples/file-tree.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: FileTree -order: 9 -toc: file-tree ---- - -# FileTree - - diff --git a/mana/apps/docs/docs/examples/file-tree.zh-CN.md b/mana/apps/docs/docs/examples/file-tree.zh-CN.md deleted file mode 100644 index 80b9ac60..00000000 --- a/mana/apps/docs/docs/examples/file-tree.zh-CN.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: 文件树 -order: 9 -toc: file-tree ---- - -# 文件树 - - diff --git a/mana/apps/docs/docs/examples/keybind.md b/mana/apps/docs/docs/examples/keybind.md deleted file mode 100644 index 4eaa2ed5..00000000 --- a/mana/apps/docs/docs/examples/keybind.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Shortcuts -order: 7 -nav: - order: 3 ---- - -# Shortcuts - -## Registering Command Shortcuts - -By default, we register shortcuts associated with commands. - -It supports various keyboard combinations: - -- Single key `a` -- Combination keys `shift+up` -- Sequential keys `d d` - - - -## Context Switching for Shortcuts - - - -## Default Prevention - - diff --git a/mana/apps/docs/docs/examples/keybind.zh-CN.md b/mana/apps/docs/docs/examples/keybind.zh-CN.md deleted file mode 100644 index 7eacada0..00000000 --- a/mana/apps/docs/docs/examples/keybind.zh-CN.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: 快捷键 -order: 7 -nav: - order: 3 ---- - -# 快捷键 - -## 注册命令快捷键 - -我们默认注册快捷键与注册命令关联 - -支持多种键盘组合方式: - -- 单一按键 `a` -- 组合按键 `shift+up` -- 连续按键 `d d` - - - -## 快捷键的上下文切换 - - - -## 默认阻止 - - diff --git a/mana/apps/docs/docs/examples/menu.md b/mana/apps/docs/docs/examples/menu.md deleted file mode 100644 index bb97a280..00000000 --- a/mana/apps/docs/docs/examples/menu.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Menus -order: 8 -nav: - order: 3 ---- - -# Menus - -## Menu Bar - - - -## Context Menu - - - -## Antd Menu - - diff --git a/mana/apps/docs/docs/examples/menu.zh-CN.md b/mana/apps/docs/docs/examples/menu.zh-CN.md deleted file mode 100644 index 59f7f633..00000000 --- a/mana/apps/docs/docs/examples/menu.zh-CN.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: 菜单 -order: 8 -nav: - order: 3 ---- - -# 菜单 - -## 菜单栏 - - - -## 右键菜单 - - - -## antd 菜单 - - diff --git a/mana/apps/docs/docs/examples/modal.md b/mana/apps/docs/docs/examples/modal.md deleted file mode 100644 index 6e4864b3..00000000 --- a/mana/apps/docs/docs/examples/modal.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: Modal -order: 9 -toc: modal -nav: - order: 3 ---- - -# Modals - -## Antd Modals - - - -## Custom Modals Theme and Display Logic - - diff --git a/mana/apps/docs/docs/examples/modal.zh-CN.md b/mana/apps/docs/docs/examples/modal.zh-CN.md deleted file mode 100644 index 23f00955..00000000 --- a/mana/apps/docs/docs/examples/modal.zh-CN.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: 对话框 -order: 8 -toc: modal -nav: - order: 3 ---- - -# 对话框 - -## antd 对话框 - - - -## 自定义对话框主题和显示逻辑 - - diff --git a/mana/apps/docs/docs/examples/modular.md b/mana/apps/docs/docs/examples/modular.md deleted file mode 100644 index 769d2259..00000000 --- a/mana/apps/docs/docs/examples/modular.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Module -order: 20 -nav: - order: 3 ---- - -# Module Example - -A simple module example that includes two modules: layout and content. The views of the content module are displayed in the center and top, and they share data state. - - - -# Dynamic Module - -We can dynamically load modules and then use the views within them. - - diff --git a/mana/apps/docs/docs/examples/modular.zh-CN.md b/mana/apps/docs/docs/examples/modular.zh-CN.md deleted file mode 100644 index 966b759b..00000000 --- a/mana/apps/docs/docs/examples/modular.zh-CN.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: 模块 -order: 20 -nav: - order: 3 ---- - -# 模块示例 - -简单的模块示例,包含布局和内容两个模块,内容模块的 view 展示在中部和顶部,并共享数据状态。 - - - -# 动态模块 - -我们可以动态加载模块以后,再使用其中的 view。 - - diff --git a/mana/apps/docs/docs/index.md b/mana/apps/docs/docs/index.md deleted file mode 100644 index d06e4ff1..00000000 --- a/mana/apps/docs/docs/index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -hero: - title: mana - description: ---- diff --git a/mana/apps/docs/docs/index.zh-CN.md b/mana/apps/docs/docs/index.zh-CN.md deleted file mode 100644 index d06e4ff1..00000000 --- a/mana/apps/docs/docs/index.zh-CN.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -hero: - title: mana - description: ---- diff --git a/mana/apps/docs/docs/introduction/dependencies.md b/mana/apps/docs/docs/introduction/dependencies.md deleted file mode 100644 index f8e16ab0..00000000 --- a/mana/apps/docs/docs/introduction/dependencies.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -title: Dependency management -order: 9 - -nav: - title: Introduction ---- - -Frontend development is becoming increasingly complex, from Gmail as an engineering model to Office online and now WebIDE for everyone. Our focus in engineering has become more macroscopic, evolving from closures and data flow to layering, modularization, and micro-frontends. Many concepts from traditional software engineering are repeatedly practiced and innovated in the frontend. Mastering methods is less important than mastering principles, and understanding principles is less important than understanding ideas. Today, I want to discuss the most basic concepts, starting with the concept of dependency, to explore frontend engineering practices. - -# Preface - -Why do we have engineering? Because there is more code, and projects are getting larger, we categorize strategies to cope with these situations as engineering methods. Why do more code and larger projects become a problem, and why do we need to address this? Because humans are involved in engineering, and the [short-term memory](https://en.wikipedia.org/wiki/Short-term_memory) of the human brain can only handle about seven objects. Therefore, when the information volume of a system increases, we need methods to effectively manage this information. Thus, thinking about engineering methods is essentially thinking about human cognitive patterns. If you have read "Coders at Work," you might find that these experts often do not care much about engineering methods. Within the cognitive space that human thinking can support, engineering methods are not important. For most people, when faced with a pile of disordered information, we are at a loss; but when faced with organized and regular information, we can retrieve it efficiently. We naturally rely on summarizing rules and deductive reasoning to understand the world. The same information, organized in different ways, leads to different levels of acceptance. Information that we can efficiently receive often exhibits characteristics that align with cognitive patterns, such as classification and layering. These structures help us judge information from different perspectives, form habits, and carry expectations, thereby better mastering and using them. The human brain is limited, and engineering methods enable our brains to effectively handle the issue of information volume, which is why extensibility is an eternal theme. Whether it's data flow control or modularization and micro-frontends, they all aim to help people involved in engineering understand design ideas, reduce maintenance costs, and combat the forgetting curve. When our mental energy is no longer spent organizing information, we can delve deeper into a field, explore its depths, and extend our chains of reasoning. - -# The Essence of Dependency - -The operation of a program relies on executing statements one by one. We aggregate multiple statements into methods, and then methods call each other, resulting in dependencies. Calling a method means depending on it. In fact, the execution order of these statements is also a dependency condition. In modern software systems, we generally consider `calls` as the root of dependency generation. From this perspective, dependencies are unavoidable unless the code is not executed, in which case it will inevitably form dependency relationships. Dependencies generated through calls usually manifest in the code. The languages we use generally have explicit dependency declaration statements, such as `import`. However, in actual programs, calling a program does not necessarily have to follow the formal language and engineering tool conventions. Broadly speaking, we might say frontend code depends on backend interfaces, but we cannot `import` backend interfaces because languages and engineering systems are not interoperable. So, we call through the textual `http protocol`. On a smaller scale, when using data flow solutions like `redux`, calling methods also requires textual agreements like `action`. These dependencies are not reflected in the code and do not affect packaging, but they have a real impact on the code of the user, requiring us to consult API documentation or view type definitions to complete the call, which is also a form of dependency. - -```typescript -import func -fetch('/func') -store.dispatch({type:'func'}) -``` - -The dependencies we focus on are not the specific code syntax but the mental dependencies in a practical sense. Programs with multiple execution steps will inevitably generate internal dependencies due to existing agreements. These agreements may sometimes be explicitly defined, while simpler ones might be temporarily stored in the mind. These agreements are the essence of dependencies. - -# Forms of Dependency - -## The Simplest Dependency - -The simplest dependency relationship is A depends on B. When we import a method from one file into another, we create this kind of dependency. The question is, under what circumstances do we establish such a dependency? - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*gVb0QI9FMUcAAAAAAAAAAAAADjOxAQ/original) - -### Extracting Commonality - -The most primitive scenario is when a program's steps increase, we separate the repeated parts into an independent process that can be `called`. In this process, dependency is formed, and the dependency relationship at this time is the form of A depends on B. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*eispSob6cMgAAAAAAAAAAAAADjOxAQ/original) - -This is a very common process, so common that we almost do it without thinking. Often, the internal drive for handling it this way is the [DRY principle](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself). Establishing this kind of dependency also simplifies the program's information volume, making it easier for us to understand the program. This process is essentially about extracting common parts. - -### Decomposing Parts - -In some scenarios, we establish such a dependency relationship not to extract commonality but, for example, to separate a popup in a page into an independent component. What is the essence of these operations? Looking at the code forming parts A and B in the above figure, they are not equivalent. The generated dependency is unidirectional. Here, B is actually a part of A. The relationship is always one of whole and part. Therefore, this relationship also appears in our process of decomposing parts, which is more common in code than extracting commonality. - -The process from page to component is generally one of decomposing parts and extracting commonality. In the figure below, `Item` is the extracted commonality, while others are decomposed parts. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*JVu-Trzxy6AAAAAAAAAAAAAADjOxAQ/original) - -## Dependency and Control - -When a dependency relationship is established by decomposing parts, it should mean that the decomposed part replaces all the original details of that part. Extracting commonality should be when that part is used repeatedly. In this process, the whole should control the part, and then the part controls even smaller parts, thereby achieving a step-by-step thinking method. But our actual code is not like this. For example, in the process of breaking down a page into components, we often generate a concept like `layout`. The diagram above might be decomposed into the following form: - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*kYamRrUhDRwAAAAAAAAAAAAADjOxAQ/original) - -All layout details are masked by `layout`, but `App` directly depends on the details displayed within the layout—it directly manages the content of `Content`, which is `Item`. I'm sure the corresponding code is familiar to everyone: - -```typescript -const App = () => { - return ( - - - - - - ); -}; -``` - -For `Layout`, from the overall-part structure, the `Item` that should have been controlled by it becomes `Children` obtained from the context. In our design, we handed over this part of the dependency that belongs to `Layout` to upper-level control. What does this operation achieve? Greater reusability of `Layout`, which is a kind of intermediate-level reusability. - -This is not an uncommon design. Various Props exposed on components, especially component-type Props; parameters designed for functions, especially function-type parameters; attributes designed in Classes, especially Class-type attributes. The reason driving us to design this way is the need to extract a unit in the dependency relationship that is at an intermediate level. These forms of design, which can be controlled by the upper layer, are often in pursuit of greater flexibility and reusability. And the essence of this design is [Inversion of Control](https://en.wikipedia.org/wiki/Inversion_of_control). - -The definition of Inversion of Control on Wiki is relatively narrow, mainly focusing on the reversal of object creation within the object-oriented system. I think the generalization here is applicable. By inverting controls, parts hand over more control rights to gain greater flexibility and reusability, allowing us to decompose and reuse dependencies that are at intermediate levels. - -### Dependency During Inversion of Control - -At this time, if we look at the dependency relationship formed from a more detailed perspective, we will find that while parts are handing over control rights, they will certainly impose their constraints. The children of a component are just coincidentally omitted due to the framework's definition, but when we pass components through props, or when this inversion occurs in a function or class, these constraints are often explicit, and they will eventually form the following dependency structure. At runtime, the agreement B relies on will become an entity, so B is the intermediate layer in the logical structure. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*lQ8HQ4XpoL4AAAAAAAAAAAAADjOxAQ/original) - -If you're familiar with the [SOLID](https://en.wikipedia.org/wiki/SOLID) principles, you'll find that for the Dependency Inversion Principle "High-level modules should not depend on low-level modules. Both should depend on abstractions," we satisfy the latter part. - -## Dependency and Extensibility - -Suppose a scenario where the layout needed by our page is no longer singular but multiple, showing differently under different routes. How should we design it? - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*37s2QqfeyucAAAAAAAAAAAAADjOxAQ/original) - -The simplest way is to have the dependency structure as shown above, where all possible layouts appear as dependencies of the App, and then the App decides which layout to use based on context information such as routes. However, we can clearly see the issue of extensibility here, meaning when I need to add a layout, I need to add both the layout code and modify the App code. If you're familiar with the [SOLID](https://en.wikipedia.org/wiki/SOLID) principles, this violates the [Open/Closed Principle](https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle). So how can we make layout extension easier and prevent the App from changing with layout changes? We need to separate the logic about layout handling within the App, and then you will find that the separated logic is actually only related to interfaces and context. Actually, we just need to materialize the interface, allowing it to provide constraints while collecting implementations of these constraints. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*e5FRRKHXtOYAAAAAAAAAAAAADjOxAQ/original) - -The specific implementation can provide a `manager` as a registration center, where each `layout` registers its information into the `manager`, and then the `App` only relies on the `manager` to get the Layout needed for the current use. If you compare it with the implementation of routing in umi, you will find that umi writes the information corresponding to the layout and routing into a configuration, which is then read by the manager in umi and applied in the App. Due to the framework's conventions on engineering structure, umi omits the code for manually registering Layouts. In fact, this is the core difference between various implementations of different extensions, in how they collect abstract implementations that meet constraints. - -In addition to registration and configuration methods, we can also use dependency injection containers and other ways to collect them. The writing methods vary, but they all aim to accomplish the same thing. At this point, we can finally write a common dependency relationship that satisfies extensibility. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*aD5_RbM22KgAAAAAAAAAAAAADjOxAQ/original) - -In most cases, our code is a combination of the previous forms of dependency, stacking the entire project like Lego blocks. General dependency forms, and a certain degree of inversion of control, are relatively unconscious in the code-writing process because their driver comes from solving current problems. In contrast, completing extensibility designs through control often requires conscious design because the problem it solves is about future maintenance, and the current code does not decrease and may even increase. - -# Coupling and Cohesion - -In fact, the concept of [coupling]() is closely related to dependency, referring to the degree of information or parameter dependency between modules in a program. So wherever there is dependency, there is coupling. However, it is important to note that coupling is a subject-verb equal concept, whereas dependency is directional. So often, saying A couples B is less precise than saying A depends on B. Coupling has multiple forms of expression, with coupling levels ranging from high to low being content coupling, common coupling, control coupling, stamp coupling, data coupling, and non-direct coupling. The ways dependencies are generated that we've mentioned often match one form of coupling, such as extracting commonality, which often corresponds to common coupling. Coupling is often an evaluation of the relationship between modules, so what we pursue is low coupling, which actually means minimizing inter-module dependencies. Here, "minimizing" is substantive, not formal. It refers to the descriptive capability of the exposed contract, not the number of contracts. Therefore, when dependencies arise between two modules, we should make this connection simple. When it is a type constraint, it should also be the simplest type constraint, which corresponds to the [Interface Segregation Principle](https://en.wikipedia.org/wiki/Interface_segregation_principle) in SOLID. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*Yx4DS7jom3QAAAAAAAAAAAAADjOxAQ/original) - -At the module level, we can further discuss cohesion. High cohesion and low coupling go hand in hand. In fact, a program always has tightly coupled and loosely coupled parts. When we compress tightly coupled parts together to form a module, dependencies between these modules decrease, and low coupling appears. At this time, the modules we have divided out are highly cohesive. Cohesion also has many forms of expression, with levels of cohesion ranging from low to high being accidental cohesion, logical cohesion, temporal cohesion, procedural cohesion, communicational cohesion, sequential cohesion, and functional cohesion. Cohesion is the other side of coupling, and I won't delve into the scholarly introduction of different cohesion forms here, as I don't agree with some of them... - -# Common Frontend Scenarios - -## Routing - -In fact, we have already given a routing example in the previous example. Let's expand on it. For routing, it needs to handle not just the dynamism of `layout` but the combination of `layout``content`, and even nesting. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*nrCTRKGvaWcAAAAAAAAAAAAADjOxAQ/original) - -If you look at the code, we may not explicitly quote anything on the page. But in reality, the framework completes it for us, and when we write page-level components, we inevitably use Props from the Route definition, which is actually still a form of dependency. - -## Stateless - -Since the rise of functional programming, statelessness has become increasingly popular. Why do we like statelessness? A stateless function can guarantee stable performance when called by different dependents. From a dependency perspective, if a dependency is stateless, it will have a small side effect when extracted as a common dependency, and practical examples like utility functions won't burden us with extraction. However, if we extract a common dependency that is stateful, its runtime performance will have many uncertainties. These uncertainties are what we dislike and are the risks of common coupling. - -## Events - -The event model is also a common means of managing dependencies. For example, when implementing modules bound to each other in a chain, because dependency direction can only be one way, assuming A depends on B, an event can be implemented in B to allow B to affect A. Here, it can actually be considered that A/B both depend on the abstract definition of the event, only that this definition is merged into B. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*mzadQZ0moWkAAAAAAAAAAAAADjOxAQ/original) - -# Summary - -Dependencies are inevitable. In the case of unchanged code entities, we can organize them through different forms of dependency relationships. The purpose of adjusting these dependency relationships should be to aggregate these entities into different modules, achieving high cohesion within modules and low coupling between modules, thereby enhancing the efficiency of information reception by those involved in engineering and better maintaining and extending the engineering project. diff --git a/mana/apps/docs/docs/introduction/dependencies.zh-CN.md b/mana/apps/docs/docs/introduction/dependencies.zh-CN.md deleted file mode 100644 index 89d482f7..00000000 --- a/mana/apps/docs/docs/introduction/dependencies.zh-CN.md +++ /dev/null @@ -1,140 +0,0 @@ ---- -title: 依赖关系管理 -order: 9 -nav: - title: 介绍 ---- - -前端的工程正在越来越复杂,从 Gmail 成为工程典范,到 Office online 再到人手 WebIDE,我们在工程中关注的东西也越来越宏观,从闭包、数据流再到分层、模块、微前端。传统软件工程中的很多概念在前端一次次被实践和创新。掌握方法不如掌握原理,理解原理不如理解思想,今天想跟大家聊一下的是最基础的概念,我们从依赖概念开始,去看一看前端的工程实践。 - -# 前言 - -为什么会有工程,因为代码越来越多,项目越来越大,我们把应对这种情况的方法都归为工程方法。为什么代码多项目大会成为问题,为什么需要应对这种情况?因为参与工程的是人,人脑的[短期记忆](https://zh.wikipedia.org/wiki/%E7%9F%AD%E6%9C%9F%E8%AE%B0%E5%BF%86)只能支持 7 个左右的对象,所以当一个系统的信息量变大的时候,我们就需要一些方法来有效的处理这些信息,所以对工程方法发思考,实际上是对人的认知规律的思考。如果大家读过《Coders at Work》,可能会发现这些大佬对于工程方法多半是不在意的,在人的思维能够支持的空间内,工程方法并不重要。 -对于一般人面对一堆杂乱的信息,我们会无从下手;面对一些有规律的、整齐的信息时,我们就能高效检索。我们本来就是靠总结规律,推理演绎来认识世界,同样的信息,在不同的组织方式下,我们会有不同的接受程度,而能够让我们高效接收的信息,往往呈现一些符合认知规律的特点,比如分类、分层。这些结构帮助我们能够从不同的角度对信息做出判断,形成习惯,带有预期,从而更好的掌握他们,使用他们。 -人脑是有限的,而工程方法让我们的大脑有效的应对信息量的问题,这也是为什么扩展性成为永恒的主题。不论是数据流的控制还是模块化、微前端化,都是为了便于参与工程的人理解设计思路,从而降低维护成本,对抗遗忘规律。当我们的脑力不再耗费在信息的整理上时,我们也就能更加深入一个领域,去探索他的深度,让推理的链条变得更长。 - -# 依赖的实质 - -程序的运行是靠执行一条条语句来完成的,我们将多条语句聚合成方法,然后方法之间再产生调用,这个过程里依赖就产生了,调用一个方法也就依赖了一个方法。实际上,一条条执行的语句也是有依赖的,他们的执行顺序本身就是他们的依赖条件。现代的软件体系里,我们一般把`调用`看过依赖产生的根源,从这个角度看,依赖是不可避免的,除非代码不参与执行,否则他一定会产生依赖关系。 -通过调用产生的依赖,一般会体现在代码里,我们使用的语言一般会有明确的依赖声明语句,比如`import`,但实际的程序里,调用一个程序并不尽然要通过这种语言及工程工具约定的形式,往大了讲我们会说前端代码是依赖后端接口的,但是我们无法`import`后端接口,因为语言和工程体系并不互通,所以我们通过文本化的`http protocol`来调用;往小了讲,当我们在使用`redux`等数据流方案时,调用方法也要通过文本约定的`action`来完成,这些依赖并没有体现在代码里,也不对打包产生影响,却实实在在的影响了使用方的代码,让我们在写代码的时候,需要通过查阅 api 文档,或者查看类型定义来完成调用,这也是一种依赖。 - -```typescript -import func -fetch('/func) -store.dispatch({type:'func'}) -``` - -我们关注的依赖并不是代码里的具体写法,而是实际意义上的心智依赖,一个存在多个执行步骤的程序必定会在内部生成依赖关系,因为他们之间存在着约定,这种约定有时候会被具象化的定义出来,简单的则会暂存在头脑中,这些约定就是依赖的实质。 - -# 依赖的形式 - -## 最简单的依赖 - -最简单的依赖关系就是 A 依赖 B,当我们从一个文件中引入另一个文件的方法,就产生了这样的依赖关系。问题是什么样的场景下我们会去建立这样的依赖关系。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*gVb0QI9FMUcAAAAAAAAAAAAADjOxAQ/original) - -### 提取公共 - -最原始的场景是,当一个程序的步骤变多,我们将其中重复的部分独立起来,成为可以被`调用`的过程,这个过程里形成了依赖,这个时候的依赖关系,就是 A 依赖 B 形式。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*eispSob6cMgAAAAAAAAAAAAADjOxAQ/original) - -这是一个非常常见的过程,常见到我们几乎不需要思考就会去做,很多时候我们这样去处理的内在驱动里就是 [DRY 原则](https://zh.wikipedia.org/wiki/%E4%B8%80%E6%AC%A1%E4%B8%94%E4%BB%85%E4%B8%80%E6%AC%A1)。这种依赖的建立,也实际上简化了程序的信息量,让我们更容易读懂程序,这个过程实际上就是在提取公共部分。 - -### 分解局部 - -也有些场景下,我们虽然会建立这种依赖关系,却并不出于提取公共,比如把页面里的弹窗分离到一个独立的组件里。这些操作的实质又是在做什么呢?我们看上图形成 A 和 B 两个部分的代码,实际上他们并不是对等的,依赖的产生是单向的,在这里 B 实际是 A 的局部,他们跟 A 关系始终是一个总体和局部的关系。所以这种关系还会出现在我们分解局部的过程里,这在代码里比提取公共部分还要常见。 - -页面到组件的过程,一般就是分解局部和提取公共的过程。下图中`Item`是提取了公共,其他的是分解了局部。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*JVu-Trzxy6AAAAAAAAAAAAAADjOxAQ/original) - -## 依赖与控制 - -当一个依赖关系是靠着分解局部来建立的,那应该意味着被分解出来的局部,代替了这个局部原有的所有细节,而通过提取公共应当是恰好这个局部被反复使用。这个过程里,整体应该控制局部,再有局部去控制更小粒度的局部,从而达到思维方式上的层层递进。 -但我们实际的代码并不是这样,例如在页面分解到组件的过程中,我们经常会产生`layout`这样一个概念,上图有可能被分解为如下形式 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*kYamRrUhDRwAAAAAAAAAAAAADjOxAQ/original) - -所有的布局细节都被`layout`屏蔽,但是`App`直接依赖了展示在 layout 中的细节——它直接管理的`Content`的内容`Item`。我想对应的代码大家一定也不陌生 - -```typescript -const App = () => { - return ( - - - - - - ); -}; -``` - -对于`Layout`而言,本来从整体局部的结构上,处于被自己控制层次内的`Item`变成了从上下文中获得的`Children`,我们在设计上,将属于`Layout`的这部分依赖,交给了上层控制,这样的操作获得了什么呢?`Layout`更高的复用性,这是一种处于中间层的复用性。 - -这并不是一种很少见的设计,我们在组件上暴露的各种 Prop,尤其是组件类型的 Prop;我们设计的函数的参数,尤其是函数类型的参数;我们设计的 Class 中的属性,尤其是 Class 类型的属性。推动我们产生这样设计的原因,是我们需要提取一个依赖关系中处于中间层次的单元,这些可以被上层控制的形式的设计,往往就是为了追求更高的灵活度和复用性。而这种设计的本质,就是[控制反转](https://zh.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC)。 - -Wiki 上对于控制反转的定义相对狭义,主要是在面向对象的体系内,对于对象的创建这件事情的反转,我觉得这里的推广是适用的,局部通过控制反转的方式,交出了更多的控制权,从而获得更高的灵活度和复用性,也让我们可以分解和复用处于中间层次的依赖。 - -### 控制反转时的依赖 - -这个时候,我们从更加细微的视角来看他们形成的依赖关系,就会发现,局部在交出控制权的同时一定会对这部分的提出自己的约束,组件的 children 只是恰好跟框架的定义重合所以被省略了,但是当我们将组件通过 prop 传递,或者这种反转在 function 或者 class 中发生时,这种约束往往是显性的,他们最终也将形成如下的依赖结构。在实际运行时,B 所以来的约定会成为实体,所以 B 是逻辑结构中的中间层。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*lQ8HQ4XpoL4AAAAAAAAAAAAADjOxAQ/original) - -如果熟悉 [SOLID]() 原则的话,我们会发现,对于依赖反转原则“高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口”,我们满足了后半句。 - -## 依赖与扩展性 - -假设这样一个场景,我们页面需要的 layout 不再是单一的,而是有多个,在不同的路由下做不同的展示,我们该如何设计? - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*37s2QqfeyucAAAAAAAAAAAAADjOxAQ/original) - -最简单的我们可以有如上图的依赖结构,将所有可能的 layout 全部作为 App 的依赖出现,然后在 App 内根据路由等上下文信息,做出判断决定使用哪个 layout。但是这里我们可以明显的发现其扩展性的问题,也就是当我需要增加一种 layout 时,需要既增加 layout 的代码,也修改 App 的代码,如果熟悉 [SOLID]() 原则的话,这就违反了[开闭原则](https://zh.wikipedia.org/wiki/%E5%BC%80%E9%97%AD%E5%8E%9F%E5%88%99)。那么如何才能让 layout 的扩展变得容易,让 App 不再跟随 layout 变化呢? -我们需要将 App 内关于 layout 处理的逻辑分离出来,然后你就会发现,分离出来的逻辑实际上只跟 interface 以及上下文有关。实际上,我们只要将 interface 实体化,让他在提供约束的同时,能够收集这些约束的实现即可。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*e5FRRKHXtOYAAAAAAAAAAAAADjOxAQ/original) - -具体的实现可以是,提供一个`manager`作为注册中心,各个 `layout` 将自己的信息注册到 `manager`中,然后 `App` 只依赖 `manager` 就可以拿到当前需要用的 Layout。我们再对照一下 umi 中路由的实现,你就会发现 umi 是将 layout 跟路由对应的信息先写成配置,然后被 umi 中的 manager 读取,然后生效在 App 中,由于框架对工程结构的约定,umi 省略了手动将 Layout 注册的代码,实际上,这也是各种不同的扩展实现的核心差异,如何收集符合约束的抽象实现。 - -除了注册式、配置式以外,我们还可以使用依赖注入容器等方式做采集,写法各不相同,但是都为了完成同样的事情。在这个时候,我们也终于可以写出一个常见的,满足扩展性的依赖关系 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*aD5_RbM22KgAAAAAAAAAAAAADjOxAQ/original) - -大部分情况下,我们的代码就是对前面几种依赖形式的组合,像乐高一样把整个项目越堆越大,其中一般依赖形式,和一定程度控制反转,是代码编写过程中,相对无意识就会使用,因为他们的驱动力来自于解决当前的问题,而通过控制完成完成扩展性设计,则往往需要有意识的设计,因为他解决的问题是面向未来的维护,而当前的代码并没有减少,甚至还要增加。 - -# 耦合、内聚 - -实际上[耦合性]()的概念与依赖是息息相关的,是指一程序中,模块及模块之间信息或参数依赖的程度。所以有依赖就会有耦合,但是这里要注意,耦合是一个主谓对等的概念,而依赖是有方向的,所以很多时候,我们说 A 耦合 B ,不如 A 依赖 B 来得精确。 -耦合有多种表现形式,耦合程度由高到低分别是内容耦合、公共耦合、控制耦合、标记耦合、数据耦合、非直接耦合,我们前面提到的一些依赖产生的方式,往往也会匹配到一种耦合形式上,如提取公共,往往对应着公共耦合。 -耦合性往往是评价模块间关系的,所以我们追求的低耦合,实际上是让模块间的依赖尽量少,而这里的少又是实质上的,而不是形式上的,他应该是指的暴露出来的约定的描述能力,而不是约定的个数,所以当两个模块间的产生依赖时,我们应该让这种联系变简单,当它是类型约束的时候,也应该是最简单的类型约束,这也就对应到了 SOLID 中的[接口隔离原则](https://zh.wikipedia.org/wiki/%E6%8E%A5%E5%8F%A3%E9%9A%94%E7%A6%BB%E5%8E%9F%E5%88%99)。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*Yx4DS7jom3QAAAAAAAAAAAAADjOxAQ/original) - -在模块的尺度上,我们可以进一步的讨论内聚,高内聚和低耦合是伴生的,实际上一个程序总有紧耦合和松耦合的部分,当我们把紧耦合的部分都收缩在一起成为模块时,这些模块相互间的依赖就变少了,低耦合就出现了,这个时候,我们分割出来的模块,就是高内聚的。 -内聚也有多种表现形式,内聚程度由低到高分别是偶然内聚、逻辑内聚、时间性内聚、程序内聚、联系内聚/信息内聚/通信内聚、依序内聚/顺序内聚、功能内聚。内聚是耦合的另一面,这里不再学究的介绍不同的内聚形式,因为有些我也不是很认可... - -# 前端常见场景 - -## 路由 - -其实在前面的例子里,我们已经举了路由的例子,这里再发散一下,对于路由而言,他要操作的不仅仅是`layout`的动态性,而是`layout``content`的组合,甚至还有嵌套。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*nrCTRKGvaWcAAAAAAAAAAAAADjOxAQ/original) - -如果看代码的话,我们可能并没有显式的在页面中引用什么,但实际上,这是框架帮我们完成了,而我们编写页面级别的组件时,也不免的会用到来自 Route 定义的 Prop,这实际上依然是一种依赖。 - -## 无状态 - -自从函数式大行其道,无状态也就越来越受欢迎了,我们为什么会喜欢无状态?一个无状态的函数,可以保证在被不同的依赖方调用时,有着稳定的表现。从依赖的角度看,一个被依赖项是无状态的,那么当这个依赖被抽取公共的时候,他形成公共耦合的副作用就很小,实际的例子如工具函数,我们不会因为提取工具函数而产生负担,但是如果我们提取的公共依赖是有状态的,那他在运行时的表现就会有很多的不确定性,这种不确定性是我们所不喜欢的,也是公共耦合的风险所在。 - -## 事件 - -事件模型其实也是一种依赖管理的常见手段。例如在实现链各个互相绑定的模块时,因为依赖方向只能有一个,假设 A 依赖 B,那么为了让 B 可以影响到 A,就可以 B 中实现事件。这里实际上可以认为 A/B 都依赖了事件的抽象定义,只是这个定义被合并在了 B 中。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*mzadQZ0moWkAAAAAAAAAAAAADjOxAQ/original) - -# 总结 - -依赖是必然的,在代码中实体不变的情况下,我们可以通过不同的依赖关系形式来组织他们,而调整这些依赖关系的目的,应该是为了让这些实体聚合成不同的模块,达到模块内的高内聚和模块间的低耦合,从而提高接触工程的人信息接收的效率,更好的维护和扩展工程。 diff --git a/mana/apps/docs/docs/introduction/index.md b/mana/apps/docs/docs/introduction/index.md deleted file mode 100644 index e41b79ee..00000000 --- a/mana/apps/docs/docs/introduction/index.md +++ /dev/null @@ -1,206 +0,0 @@ ---- -nav: - title: Introduction - -title: Mana Introduction -order: 1 ---- - -# Mana Introduction - -## 1. Why Mana - -With the development of web-based productivity tools (hereafter referred to as IDE-style products), we realized that IDE-style workstation applications share commonalities. They are all designed to create value, focus on efficiency, and pursue an immersive experience. While there are some similarities in product form, actual integration is not easy. - -- Technology stack issues: There is a significant gap between the technical systems of traditional IDEs and current mainstream front-end technologies. Both vscode and notebook systems are relatively closed. -- Lack of reuse standards: Core modules (canvas, editor) support extensions, but the way extensibility is defined varies, as do the reuse methods (components, plugins, modules). Especially in IDE-style workstations, the ability to reuse often comes from logic rather than components (e.g., command mode, shortcuts). -- Lack of best practices: There are various practices for common parts of IDE products (menus, layout saving), but since they are not core modules, they receive less attention in the early stages of development, leading to integration difficulties. - -Large front-end applications also face long-standing problems: - -- Large components are hard to reuse: Business components naturally require reuse, but packaging large and flexible components is not easy. The more scenarios a component can adapt to, the more complex it becomes, making it less straightforward to use and diminishing the reuse effect. -- Large applications are hard to maintain: Adding and removing features often requires changes to multiple pieces of code, involving other parts of the logic, causing a ripple effect. Newcomers cannot quickly get up to speed. - -Objectively, some existing IDE technology solutions are relatively friendly to customization and are verified feasible routes. The collision of different technical systems allows us to see the possibility of solving application construction problems, leading us to this idea: - -- Combine the most familiar React technology stack with IDE construction ideas to address compatibility in IDE development and reuse capabilities of IDE-style workstations. -- Standardize the definitions and reuse methods of extension capabilities across different technical fields, with built-in best practices for common parts of IDE-style workstations. - -This idea eventually materialized as Mana. - -## 2. Problem Definition - -### 2.1 Code Difficult to Maintain Long-Term - -In many cases, we do not know how to build an application that is maintainable in the long term and has good extensibility. Existing mid-platform application development practices, as they grow larger and more complex, tend to encounter the following issues: - -#### 2.1.1 Incorrect Dependency Relationships - -Why do large components become difficult to reuse and maintain? We believe the root lies in the fact that under traditional development models, we have not correctly handled dependency relationships. - -- Large components depend entirely on small functions - - The larger the component, the more details it has. Once these details require configuration and dynamics, configurations generated locally must be moved up to the global scope and exposed as props. When the parent component attempts to control and understand these details defined by child components, it essentially forms a global-to-local dependency. - -- Parent components depend on child components - - Continuing from this perspective, JSX syntax always appears in a form of global dependency on local components. Large components need to introduce various possible subcomponents, and due to configurations exposed by subcomponents, some logic coupled with local components appears in the overall structure. The global nature of parent components causes logic from different parts of the application to converge, often resulting in maintenance disasters. This form of global dependency on local components essentially requires a god's-eye view, where users must consider every detail. Once it reaches a certain scale, it becomes difficult to understand, and with the passage of time, the forgetting curve makes it difficult to maintain. - -#### 2.1.2 Unreasonable Code Organization - -In general mid-platform applications, although they appear as single-page applications, the connection between functions is not strong. This is also why the micro-frontend model is popular. However, in productivity workstation applications, each part of the page is closely connected. Continuing to organize code from the UI perspective in such cases creates numerous problems. - -- Leakage of Local Concepts - - When different parts of the same function are displayed in multiple places on the page, they are organized in different locations based on the UI. This requires the state, hooks, and other content serving them to be elevated to a global level or at least exposed to a location they can all access. However, they are essentially used locally. The excessive exposure of these contents leads to global concept confusion. - -- Not Conducive to Division of Labor - - In large-scale applications, we cannot perform division of labor from the perspective of UI location because every location has concepts from multiple business backgrounds. However, if we continue to organize code from the UI location perspective, it will cause different teams to maintain the same code, creating maintenance issues. - -#### 2.1.3 Lack of State Layering - -We generally have only two types of states: local state within components and global state. This does not adequately meet business customization needs because business customization is often effective locally, and different business customizations may conflict with each other. We hope such customizations will neither pollute the global state nor affect each other. - -### 2.2 Good Practices Are Hard to Replicate - -Sometimes, when we see advanced IDE-style workstation features, such as command panels, dynamic shortcuts, themes, and savable layouts, we cannot quickly incorporate them: - -- They come from different technology stacks and cannot be easily reused. For instance, the abstraction of savable layouts in vscode cannot serve React components. -- Some practices need to be based on standards, and the more people follow them, the better. For example, the command panel component is straightforward, but everyone must adhere to it for it to be used effectively. - -## 3. How to Solve - -### 3.1 Write Maintainable Code - -Mana helps users write maintainable code by providing modular code organization, clear extension point definitions, layered data domains, and a dynamic view system. Compared to the component model, modularization cohesively integrates UI and logic, and with clear extension point definitions, it turns implicit interface dependencies into explicit token relationships, helping users organize code and form reasonable module dependencies. Data domains and the dynamic view system help users solve business customization challenges, allowing business customization without intruding on the original code. - -#### 3.1.1 Modularization - -Code should be organized based on domain modules, meaning different components, states, and logic serving the same function should be organized together. They must have a unified organizational form and external exposure standards. In this part, we borrow practices from IoC containers, requiring each element within a module to have a corresponding token as an internal identifier. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*xHO1RoYR-6kAAAAAAAAAAAAADjOxAQ/original) - -```typescript -// Module details -export default Module.create().register(CompoA, CompoB, StateA, StateB); -export CompA; -``` - -```typescript -// Module arbitrary combination - -``` - -#### 3.1.2 Extension Points - -To avoid the problem of component configuration being passed layer by layer from global to local, we expose entities at different levels all on the same plane in the form of tokens. IoC practices provide a design idea we can learn from. We combine this approach with React's context capabilities, allowing any level of content to be replaced and configured within a context range based on conventions. On this basis, we introduce the concept of extension points to solve the one-to-many extension model. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*gVmhS7GuA7gAAAAAAAAAAAAADjOxAQ/original) - -When consuming extension points, multiple implementations can be used through competition, selection, iteration, etc., effectively solving the problem of code coupled with local components appearing in the overall structure. - -#### 3.1.3 Data Domain - -Modularization and extension points allow us to combine multiple modules and modify the behavior of original modules in new modules, facilitating business customization. On this basis, we add the concept of data domains to further meet diverse customization needs, allowing business customizations to be effective locally and not affect each other. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*oDUVT6ds59AAAAAAAAAAAAAADjOxAQ/original) - -The data domain in Mana relies on React Context to be effective within components and can also be managed independently. By managing data domains, we can effectively isolate the impacts of different customizations, allowing different implementations to be easily integrated, which is very effective for modules that change frequently, such as tree component customization, toolbar customization, etc. - -#### 3.1.4 View System - -In a system assembled from basic modules, we want the assembled modules to have a default view organization form, i.e., a default product form; we also want users to be able to flexibly modify the product form and reorganize views to serve new products. To this end, we designed a new view system that allows us to default to these flexible customization capabilities. - -- View: An independent view unit that can be flexibly configured to display in various positions. -- Slot: A slot used to define configurable positions on the page. -- SlotView: A special kind of view for managing multiple views in one position. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*Em-BSqXI9P0AAAAAAAAAAAAADjOxAQ/original) - -```typescript -// Use slot for layout -
- -
- - -
-
-// Use slotview for layout management -createSlotPreference( - { slot:'header', view: FlexView }, - { slot:'left', view: SideTab }, - { slot:'main', view: CardTab }, -) -// Place views in corresponding positions -createViewPreference( - { slot:'left', view: FileTree }, - { slot:'main', view: Editor }, -) - -``` - -### 3.2 Composable IDE-Style Workstation Capabilities - -Mana collects many mature modules from IDE-style workstation development to help IDE-style workstations start quickly. - -- Command: A common execution API exposure form in IDEs that, through a unified calling standard, supports different methods such as UI, keys, plugins, etc., and can create command panels and other components based on command metadata. -- Toolbar, Menu: Through unified enable, visible, and active logic, help commands support performance in the UI, solving the problem that centralized configuration is difficult to maintain. -- Configuration: Provide a unified configuration exposure and usage standard for modules, facilitating the integration of global and local configuration items, and can create configuration panels and other supporting components based on unified configuration metadata. -- Shortcuts: Built-in support for different keyboards, unifying key mappings across different systems, providing dynamic shortcut capabilities associated with focus and context, and can create configurable shortcut panels, shortcut hit prompts, and other components based on unified shortcut metadata. -- Theme: Define basic theme metadata, provide built-in color processing capabilities, allow consumption in the form of CSS variables, CSS in JS, etc., and help other modules respond to theme states. -- Layout Saving: Provide basic interfaces that need to be followed to achieve automatic layout saving capabilities. If an application wants to achieve automatic layout saving capabilities, it can implement them by following these interfaces. - -These basic modules are often less important than the core work capability modules of IDE-style workstations, so in different IDE-style workstation development processes, these support modules vary, and a lot of time is wasted on technical selection. In Mana, these capabilities are provided with standard solutions, and in the construction of other modules, we will also introduce and follow these standards. - -- 🌰 The Cofine editor complies with Mana's theme and configuration capabilities, making it easy to integrate Cofine's configuration items into the reference configuration when a Mana application introduces Cofine. -- 🌰 Libro notebook is completely based on Mana's basic modules, allowing for a very fast development pace. - -Mana's modules are composable. For applications, the more capabilities combined, the more focused the work will be, and the more user-friendly the overall system will become. - -### 3.3 Define Your Business Abstractions - -With the previous two, business applications follow the same development plan and organize the basic modules actually used in their business according to their actual business needs. They can replace component and global binary relationships with module dependency relationships, facilitating logical layering in business. Businesses can also extract their domain models and extensible abstractions in business as the cornerstone of business development, which is very helpful for the overall maintainability and scalability of business systems. - -## 4. System Advantages - -We have also summarized some advantages of using the entire system in practice. - -### 4.1 Assembly Model - -The commonly used component model is very successful, like building with Lego blocks. Since each piece has the same interface, assembling them is very free, which brings tremendous flexibility. However, when the scale becomes very large, assembling small Lego components becomes very tedious and difficult, and the system becomes fragile. - -When building large applications, we want to introduce an "assembly model," characterized as follows: - -- Foolproof Interface: Each module exposes different tokens externally. For the system, they are like foolproof interfaces. The interfaces exposed by a module are limited, but when interfacing, we don't need to consider their assembly methods anymore. These specialized interfaces can only operate in the way the interface definer expects. -- Automatic Assembly: Since each module is foolproof, we can achieve automatic assembly. The process of combining modules is merely listing them. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*1l7hT6zqrCMAAAAAAAAAAAAADjOxAQ/original) - -### 4.2 Incremental Development - -Modules in the Mana system have strong secondary development capabilities, allowing us to modify the behavior of basic modules using additional code, not only adding features but also removing and modifying them, i.e., incremental development mode. - -- High Development Efficiency: With the management of data domains, new capabilities can be developed quickly without worrying about external impacts. -- Promote Upstream Updates: Since downstream modules can easily perform secondary development on upstream module capabilities, when upstream modules do not meet usage scenarios, we can first implement them in our modules and then feedback to the upstream after they mature. - -A practical example is in the construction of Libro notebook, where multiple products have introduced Libro's core modules, and then developed their cells and file read/write services in an incremental development form. In a productivity context, you might have to deal with different read/write methods, such as reading actual files and fake files in databases, and then we need to continue packaging it into modules that can be integrated into openSumi. These customizations inevitably lead to a bloat in core packages. But currently, the Libro core package has hardly expanded its definitions, and the addition of new modes does not affect the original chain in any way. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*CZxfTKBI7mYAAAAAAAAAAAAADjOxAQ/original) - -### 4.3 Domain Abstraction - -Based on business capability modularization, it is often matched with the domain model of the application in practice. The extension point definitions allow us to have a comprehensive understanding of what horizontal extension capabilities a system has. This makes us more focused on domain models and abstract interfaces than ever before. The contrast and differences in domain models between front-end and back-end also make it easier for the front-end and back-end to understand each other's capabilities in overall design (privacy computing platform case). For businesses, the stability of core models far exceeds that of UI stability, providing a stable pillar for application construction. - -## 5. System Design - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*PVXyQ51zfOYAAAAAAAAAAAAADjOxAQ/original) - -Mana can be divided into three layers: General Layer, Specification Layer, and Practice Layer: - -- General Layer: Mainly includes dependency injection container and reactive state management, which are basic tool modules in Mana that can be used independently. - - Dependency Injection Container: Mana requires a container that can manage tokens and perform registration, replacement, collection, etc. The current selection is mainly related to the need to be compatible with IDE modules in the early stages of Mana construction. On this basis, we have added dynamic modules, declarative usage methods, etc. - - Reactive State: Mana's data changes and consumers are relatively complex. On one hand, the data system needs to be used independently of the UI, and on the other hand, abstract definitions of extension points include behavior abstractions, which are the basis for optimizing this part. We decided early on to base it on reactive state management. -- Specification Layer: Mana provides users with what constitutes a module, what constitutes an extension point, and what constitutes a view, and constrains users' writing methods. This part is key to Mana solving application construction problems. -- Practice Layer: Built-in various commonly used modules for IDE-style workstations, providing best practices for product development. diff --git a/mana/apps/docs/docs/introduction/index.zh-CN.md b/mana/apps/docs/docs/introduction/index.zh-CN.md deleted file mode 100644 index 8e123f96..00000000 --- a/mana/apps/docs/docs/introduction/index.zh-CN.md +++ /dev/null @@ -1,209 +0,0 @@ ---- - -nav: 介绍 -nav: - title: 介绍 - -title: Mana 简介 -order: 1 ---- - -# Mana 简介 - -## 1. 为什么做 mana - -随着网页端生产力工具型产品(以下我们称为 IDE 式产品)的发展,我们意识到 IDE 式工作台应用是有共性的,它们都是为了创造价值,关注使用效率,追求沉浸式体验,产品形态上存在一些相似,但实际的融合并不容易。 - -- 技术栈问题:传统 IDE 的技术体系与当前的主流前端技术存在比较大的隔阂,不论是 vscode 还是 notebook 体系,都相对封闭。 -- 缺少复用规范:在核心模块(画布、编辑器)上都支持了扩展,但是对扩展性的定义方式不同,复用方式也不同(组件、插件、模块),尤其是 IDE 式工作台很多时候复用的能力来自逻辑而不是组件(如命令模式、快捷键)。 -- 缺少最佳实践:IDE 产品上的共性部分(菜单、布局保存)有多种实践,但由于不是核心模块,在建设初期关注较少,导致融合困难。 - -大型的前端应用中也有一些问题长期困扰我们: - -- 大组件难复用:业务组件天然存在复用的需求,但是封装大而灵活的组件并不容易,一个组件适应的场景越多,往往就越复杂,使用起来也不再简单,复用效果大打折扣。 -- 大应用难维护:新加和删除功能往往需要改动多处代码,而且不免牵扯其他部分的逻辑,牵一发而动全身,新同学无法快速上手。 - -客观上,一些现有的 IDE 的技术方案是对定制比较友好的,也是经过验证的可行路线,不同技术体系的碰撞,让我们看到了解决应用建设问题的可能,所以我们萌生了这样的想法: - -- 把大家最熟悉的 react 技术栈和 IDE 建设的思路结合起来,解决对 IDE 的开发兼容和 IDE 式工作台能力复用的问题。 -- 统一不同技术领域下扩展能力的定义方式和复用方式,IDE 式工作台共性的部分内置最佳实践。 - -这个想法最后落地的就是 mana。 - -## 2. 定义问题 - -### 2.1 代码难以长期维护 - -很多情况下我们不知道一个可以长期维护,有好的扩展性的应用该如何建设。现有的中台应用研发实践,在体量越来越大,内容越来越复杂时,容易遇到如下几个问题: - -#### 2.1.1 错误的依赖关系 - -为什么大组件会出现难复用和难维护的问题?我们认为根源在于传统的研发模式下我们没有正确的处理依赖关系。 - -- 大组件整体依赖小功能 - - 组件越大细节就越多,这些细节一旦需要配置和动态性,就需要把在局部产生的配置上移到全局里透出 prop,而父组件一旦尝试去控制和理解子组件定义的这些细节,也就实际上形成了一种全局对局部的依赖。 - -- 父组件依赖子组件 - - 从这个角度继续看,JSX 语法也总是以全局依赖局部的形式出现,大的组件要引入各种可能用到的子组件,并且因为子组件向上暴露的配置,而在整体中出现一些与局部耦合的逻辑,父组件的全局性又会导致来自不同部分的逻辑出现在一处,这些逻辑往往就是维护的灾难。 - 这种全局依赖局部的形式,本质上是需要一个上帝视角的,用户必须站在上帝视角,去关系每一处细节,这种处理方式一旦到达一定的体量,就会理解困难,再加上一定时间过后遗忘规律的影响,就会难以维护。 - -#### 2.1.2 不合理的代码组织 - -在一般的中台应用中,虽然整体是单页应用的表现形式,但是功能与功能之间的联系并不强,这也是微前端模式能够大行其道的原因。但是在生产力工作台应用中,页面的每个部分联系非常紧密,这个时候继续以 UI 视角来组织代码,就会产生很多问题。 - -- 局部概念泄露 - - 当同一功能的不同部分显示在显示在页面多处时,他们会基于 UI 被分别组织在不同的位置,这样就需要将服务于他们的状态、hooks 等内容,提升到全局,或者至少可以暴露在他们可以共同访问的位置。但他们本质上是局部使用的。这些内容的过度暴露,就会造成全局概念的混乱。 - -- 不利于分工 - - 在大型应用中,我们实际上无法以 UI 位置的视角进行分工,因为每一个位置都有多种业务背景的概念出现,但是如果继续以 UI 位置的视角做代码组织,就会造成不同分工的同学维护同一份代码的问题。 - -#### 2.1.3 状态缺少分层 - -我们一般只有组件内的局部状态和全局状态两类状态,这没有办法很好的满足业务定制的需求,因为业务定制往往是局部生效的,而且不同的业务定制之间还可能互斥,我们希望这种定制既不会污染全局,也不会互相影响。 - -### 2.2 好的实践难以复制 - -有时候当我们看到一个高级的 IDE 式工作台特性,如命令面板、动态快捷键、主题、可保存布局等等,但是我们无法快速的引入他们: - -- 来自不同的技术栈,无法简单复用。如 vscode 可保存布局的抽象无法服务 react 组件。 -- 一些实践需要基于规范,而且越多人遵守越好。如命令面板组件很简单,但是大家都遵守它,才能把它用起来,变得好用。 - -## 3. 如何解决 - -### 3.1 写出可维护的代码 - -mana 通过给出模块化代码组织、明确的扩展点定义、分层的数据域、动态的视图系统,来帮助用户写出可维护的代码。模块化相比起组件模式,将 UI 和逻辑内聚在一起,加上明确的扩展点定义,将隐式的接口依赖转变为显式的 Token 关系,帮助用户整理好代码,形成合理的模块依赖关系。数据域和动态视图系统帮助用户解决业务定制难题,可以对原代码无侵入的做到业务定制效果。 - -#### 3.1.1 模块化 - -代码应当基于领域模块组织,这就意味着我们需要把为同一个功能服务的不同组件、状态、逻辑组织在一起,他们必须有统一的组织形式,以及对外暴露的规范。这部分我们借鉴了 IoC 容器的实践,要求模块内的每个元素都有一个对应的 token,作为内部的标识。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*xHO1RoYR-6kAAAAAAAAAAAAADjOxAQ/original) - -```typescript -// 模块隐层细节 -export default Module.create().register(CompoA, CompoB, StateA, StateB); -export CompA; -``` - -```typescript -// 模块任意组合 - -``` - -#### 3.1.2 扩展点 - -为了避免组件配置从整体到局部层层传递的问题,我们将不同层次暴露出来的实体,都以Token的形式暴露在同一个平面上,IoC 的实践为我们提供了可以借鉴的设计思路,我们将这样的处理方式与 React 体系下的上下文能力结合起来,可以根据约定在上下文范围内替换和配置任意层次的内容。 -在此基础上,我们引入了扩展点的概念来解决一对多的扩展模式. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*gVmhS7GuA7gAAAAAAAAAAAAADjOxAQ/original) - -消费扩展点的时候,决定将其对应的多个实现通过竞争、选取、遍历等方式使用,有效的解决了整体中出现耦合于局部的代码的问题。 - -#### 3.1.3 数据域 - -模块化和扩展点让我们可以将多个模块组合起来,也可以在新模块中对原有模块的表现做出修改,这方便了业务的定制。在此的基础上,我们增加了数据域的概念来进一步的满足多样的定制需求。让业务定制既可以在局部生效,定制之间又互不影响。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*oDUVT6ds59AAAAAAAAAAAAAADjOxAQ/original) - -mana 的数据域本身依赖ReactContext在组件中生效,也可以独立管理。基于对数据域的管理,我们可以有效的隔离不同定制互相影响,可以将不同的实现方便整合在一起,这对于多变的模块非常有效,如树形组件定制,toolbar 定制等。 - -#### 3.1.4 视图系统 - -在一个由基础模块拼装的系统里,我们希望拼装起来的模块带有默认的视图组织形式,也就是默认的产品形态;又希望使用方能够灵活的修改产品形态,重新组合视图为新产品服务。为此我们设计了新的视图系统,让我们能够默认获得这些灵活定制的能力。 - -- view:独立使用的视图单元,可以被灵活配置显示在各种位置。 -- slot:插槽,用来定义页面中可以被配置的位置。 -- slotView:一种特殊的 view,用来管一个位置的多个视图。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*Em-BSqXI9P0AAAAAAAAAAAAADjOxAQ/original) - -```typescript -// 使用 slot 做布局 -
- -
- - -
-
-// 使用 slotview 做布局管理 -createSlotPreference( - { slot:'header', view: FlexView }, - { slot:'left', view: SideTab }, - { slot:'main', view: CardTab }, -) -// 将视图放在对应位置 -createViewPreference( - { slot:'left', view: FileTree }, - { slot:'main', view: Editor }, -) -``` - -### 3.2 可组合的 IDE 式工作台能力 - -mana 收集了很多 IDE 式工作台建设中的成熟模块,帮助 IDE 式工作台快速启动。 - -- 命令:IDE 中常见的执行 API 暴露形式,过统一的调用规范,支持 UI、按键、插件等不同方式,可以基于命令的元信息制作命令面板等组件。 -- 工具栏、菜单:通过统一的 enable、visible、active 逻辑,帮助命令支持在 UI 中的表现,解决集中式配置难以维护的问题。 -- 配置:为模块提供统一的配置暴露和使用规范,方便整合全局、局部配置项,基于统一的配置元信息,可以制作配置面板等配套组件。 -- 快捷键:内置对不同键盘的支持,统一不同系统的键位映射,提供与焦点和上下文关联的动态快捷键能力,基于统一的快捷键元信息,可以制作可配置快捷键面板、快捷键命中提示等组件。 -- 主题:定义基础的主题元信息,提供内置的颜色处理能力,允许以 css 变量、css in js 等形式消费,帮助其他模块响应主题状态。 -- 布局保存:提供了完成布局保存需要遵循的基础接口,如果应用希望完成布局自动保存的能力,可以通过遵循这些接口来实现。 - -这些基础模块,重要程度往往低于 IDE 式工作台的核心工作能力模块,所以在不同的 IDE 式工作台建设过程中在这些支持模块上各不相同,技术选型上也会浪费很多时间。在 mana 中,这些能力都给出了标准方案,在其他模块的建设中,我们也会引入并遵循这些规范。 - -- 🌰 cofine 编辑器遵守 mana 的主题和配置能力,当一个 mana 应用在引入 cofine 的时候,就很方便可以将 cofine 的配置项集成到引用配置里。 -- 🌰 libro notebook 完全基于 mana 基础模块制作,开发节奏进入的非常快。 - -mana 的模块是可组合的,对于应用而言,组合越多的能力,工作会越聚焦,整体会越好用。 - -### 3.3 定义自己的业务抽象 - -有了前面两者,业务应用遵循相同的开发方案,根据自己的实际业务需求,整理出自己业务中实际使用的基础模块,可以用模块依赖关系,代替组件、全局的二元关系,方便业务上的逻辑分层。 -业务也可以提炼自己的领域模型和业务上的可扩展抽象,作为业务建设的基石,这对于业务系统整体的维护性和扩展性有非常大的帮助。 - -## 4. 系统优势 - -我们也在实践中总结了整个体系使用的一些优势。 - -### 4.1 装配模式 - -我们常用的组件模式是非常成功的,它就像乐高一样,由于每个元件都有着相同的接口,所以搭建的时候非常的自由,这带来了巨大的灵活性,但是当体量变得非常大时,使用乐高的小组件完成搭建,就会变得非常繁琐困难,系统也会变得脆弱。 -在构建大型应用时,我们希望引入的是“装配模式”,它的特点如下: - -- 防呆接口:每个模块都对外暴露了不同的Token,对于系统而言,他们就像一个个防呆接口,一个模块对外暴露的接口是有限的,但是在对接时我们不需要再考虑他们的拼接方式,这些特异化的接口仅能以接口定义者期望的方式运行。 -- 自动装配:由于每个模块都是防呆的,我们就可以做到自动装配,组合模块的过程就是把模块列举出来。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*1l7hT6zqrCMAAAAAAAAAAAAADjOxAQ/original) - -### 4.2 增量开发 - -mana 体系下的模块,具有强大的二次开发能力,我们可以使用新增代码的方式来需改基础模块的表现,不仅可以添加功能,还可以删除和修改功能,即增量开发模式。 - -- 开发效率高:配合上数据域的管理,可以非常快速的完成新能力的开发,同时不用担心对外部的影响。 -- 推动上游更新:由于下游模块可以方便的二次开发上游模块能力,在上游模块不满足使用场景时,我们可以在自己的模块内先实现,然后成熟后反馈给上游。 - -一个实践中的例子是,在 libro notebook 建设中,多个产品都引入了 libro 核心模块,然后通过增量开发的形式开发自己的 cell 和文件读写服务。 在一个产品力可能要面对读取实际文件和数据库里的假文件等不同读写方式,然后我们在这个基础上还要继续封装成可以被 openSumi 集成的模块,这些定制势必会造成核心包的臃肿。但是当前 Libro 核心包几乎没有扩充过定义, 新模式的增加对原有链路不造成任何影响。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*CZxfTKBI7mYAAAAAAAAAAAAADjOxAQ/original) - -### 4.3 领域抽象 - -基于业务能力的模块化,往往在实践中与应用的领域模型匹配在一起。其中的扩展点定义,让我们对一个系统具备哪些横向扩展能力有了一个整体的了解。这让我们比以往任何时候都关注领域模型和抽象接口,前端后端领域模型的对照和差异,也让前后端在整体设计上更加容易理解对方提供的能力(隐私计算平台案例)。对于业务而言,核心模型的稳定性远大于 UI 的稳定性,让我们的应用建设有了稳定的支柱。 - -## 5. 系统设计 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*PVXyQ51zfOYAAAAAAAAAAAAADjOxAQ/original) - -mana 可以分为通用层、规范层、实践层三层: - -- 通用层:主要包含依赖注入容器和响应式状态管理两部分,是 mana 里面可以独立使用的基础工具模块。 - - 依赖注入容器:mana 需要一个能够管理 token,并可以完成注册、替换、收集等功能的容器,当前选型主要跟 mana 建设早期需要兼容 IDE 模块有关,我们在此基础上增加了动态模块,声明式使用方式等。 - - 响应式状态:mana 的数据变更和消费方比较复杂,一方面需要数据系统可以独立于 UI 使用,另一方面扩展点等抽象定义中包含行为抽象,能够在执行过程中收集对数据的消费依赖,是这部分优化的基础。我们比较早就选定了以响应式状态管理为基础。 -- 规范层:mana 通过规范层给出用户什么是模块,什么是扩展点,什么是视图,以及约束用户编写方式。这部分是 mana 解决应用建设问题的关键。 -- 实践层:内置了 IDE 式工作台常用的多种模块,为产品建设提供最佳实践。 diff --git a/mana/apps/docs/docs/introduction/layout.md b/mana/apps/docs/docs/introduction/layout.md deleted file mode 100644 index b9df696b..00000000 --- a/mana/apps/docs/docs/introduction/layout.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -title: Layout and view system -order: 2 - -nav: - title: Introduction ---- - -# Preface - -Frontend applications cannot do without layout and components. Layout is the skeleton of the application, while components are its flesh. Viewed from another angle, layout is also a special kind of component. Mana must solve the following issues for the system: - -- Add components to the application through extension modules -- Modify and replace layouts through extensions -- Save and restore page layout states - -# Concepts - -## View - -Mana is based on React component rendering. However, for the application's context, we are not concerned with all levels of components. For instance, when we activate an editor tab, in terms of DOM and React components, the focus is actually on the tab. However, our toolbar is actually concerned with the editor panel being open, not the tab containing it. When executing quick actions, we must also respond based on the current editor panel. Here, the difference between the tab and the editor panel is treated as the difference between layout and view. - -We organize the components we truly care about into views. A page should consist of both layout and view. In the application's context, we no longer concern ourselves with specific components beyond layout and view; they merely serve as sources of user interaction events. A view `View` is a data structure with certain data definitions and lifecycle expressions. The simplified data structure is defined as follows: - -```typescript -export interface View { - id: string; - view: React.FC; -} -``` - -Based on the above structure, it can be seen that in actual internal management, data appears prior to components. We first complete management capabilities based on data, and React components can be regarded as factory functions for the DOM, managed by the data module. Views also exhibit certain lifecycles throughout the application's lifetime, and these lifecycles serve as the common definition of views: - -- Instantiation -- Addition -- Activation -- Rendering -- Events -- Destruction - -Through view decorators, we can very conveniently and quickly register views on data structures that meet the requirements. - -```typescript -@singleton() -@view(FactoryId) -class MyView extends BaseView {} -``` - -## Slots and Areas - -To achieve the separation of layout and components, we introduced `Slot` into the layout. A layout is divided into several areas, each with an area ID, and each area contains multiple views. The slot mechanism completes the rendering of areas. To understand the design of Slot, one must first understand areas. The image below shows a commonly used workspace layout area division. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*C3yLQbmY67EAAAAAAAAAAAAADjOxAQ/original) - -- Areas serve as view elements, providing layout capabilities. - Since the areas represented by slots are also a kind of view element, views opened within a slot can render new slots, thereby achieving layout nesting. In the area division shown in the image above, main and bottom can also be merged into main, and further divided into main-top and main-bottom. How to divide them specifically depends on the layout components used by the user themselves. - Furthermore, because layouts can be nested, the entire application itself is also a large Slot, and we use default area IDs to render it. - -```typescript - -``` - -- Areas act as view containers, allowing one or more views to open in this area. - In a typical workspace, areas like left and bottom in the layout above will offer tabs with different forms and behaviors. We might open a file tree in the left area, open a welcome page in the main area, and open outputs in the bottom area. Sometimes, the left area does not appear in the form of tabs but uses an accordion layout. These different view management methods within areas provide users with various interactions for managing views within an area. Tabs can switch focus through tabs, accordions through expansion, or perhaps the areas we provide do not offer the usual view display and switching capabilities, only displaying the current view. When areas serve as view containers, they have different internal behaviors but can have a unified external representation, such as adding views, removing views, activating views, etc. This is the layout view, which we will introduce later. - -Slots serve as entities of areas within React components. Their main role is to proactively open the corresponding layout views during rendering. Unlike general views such as the welcome page, which rely on application lifecycle-triggered checks to decide whether to open proactively, the view containers corresponding to Slots are uniformly triggered to create during rendering. - -## View Factory and View Management - -On the same page, we sometimes open several views of the same type. For example, we might use tabs in multiple places for layout views, and for functional views, we might open multiple editors. To facilitate the management of views, we designed a view factory. Each specific view should be opened through the view manager using the view factory. The simplified definition is as follows: - -```typescript -export interface ViewFactory { - readonly id: string; - createView: (options?: any) => MaybePromise; -} -``` - -Each view created by the view factory should have a unique ID, but for the view manager, the ViewFactory ID + options constitute the view's ID. Each module registers its view factory to provide its view creation capabilities to the view manager, which then creates specific views through the view manager. This provides the foundation for a tracking mechanism and unified behavior for views. - -## Slot View - -Slot views are primarily views as well, but with additional behaviors and lifecycle operations for slot layouts. A simplified definition is as follows: - -```typescript -export interface SlotView extends View { - addView: (view: View, option: LayoutViewOption) => Promise; -} -``` - -When layout components like tabs and accordions occupy a certain area, they need to be implemented based on the data structure of the layout view. When registering, layout views are the same as general views. To further enhance layout extensibility, a competitive mechanism is used to determine the rendering method of the area's layout, and layout views can handle priority through configuration. - -# Mechanism - -## Build Order - -By default, the build order of layouts and entity graphs is as follows. -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*Vk7hQZDsGuoAAAAAAAAAAAAADjOxAQ/original) - -## View Context - -To facilitate the development of views and view content, we provide a view context mechanism, which is useful when developing multiple instances of views on a page. The action of creating a view can simultaneously provide an independent context for the view. We inject information such as the view's data module itself and the view's creation configuration into this context by default. The simplified code is as follows: - -```typescript -const container = ctx.container.createChild(); // Create a child container -container.load(...some module); // Load the modules needed by the view -const current = container.get(view); // Create a View instance -container.register({ token: ViewOption, useValue: option }); // Register instance information -container.register({ token: ViewInstance, useValue: current }); // Register instance information -current.view = ViewRender(current.view, container); // Higher-order component associates component with context -return current; -``` - -In this way, within the view component, we can easily complete the linkage between data and UI through the injected information. There is no longer a need to consider how to locate oneself within multiple views, thus achieving the "dimensionality reduction" from array to singleton. - -```typescript -export function Component() { - const view = useInject(ViewInstance); - const option = useInject(ViewOption); - return
{view.info}
; -} -``` - -Why choose `Container` instead of `React Context` to pass instance information? One consideration is that behind a View there might be a complex business module. The information initialized when creating a view might not be all the data needed by the view. By using isolated child containers and the modules registered within them, we can effectively achieve on-demand initialization of these data structures. We won't elaborate on the context design here. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*GvQHRa9ZVmsAAAAAAAAAAAAADjOxAQ/original) - -## Active View - -In the example code in the view context section, a higher-order component is used to provide a context mechanism to the view. In fact, besides providing context, a higher-order component can also add an actual DOM wrapper to the view, thereby associating the DOM with the View data structure. This makes it convenient to track the activation state of a view through user interaction, which is useful in scenarios where shortcut key responses need to switch based on focus. In reality, the active view is a logical concept, meaning the view of the last opportunity. Imagine a scenario where we open a right-click menu from the editor; technically, no view is active at this... - -```typescript -{ - "__mana_deafult_layout__": { - id: 'left-right-layout'; - area: { - left: { - id: 'left-right-layout'; - contents: [{ - id: 'file-tree', - }], - }, - right: { - id: 'tab'; - contents: [{ - id: 'code-editor', - options: {uri:'xxx'} - }], - } - } - } -} -``` - -When the page is restored, the previously saved layout information can be traversed again to complete the actions of opening and adding views, thus completing the restoration. Both page saving and restoring can be integrated with the application's lifecycle. - -## View and Slot Settings - -We have built-in extension points for view and slot configurations, allowing users to easily declare configurations for views and slots within a module and set their priorities. Slot configuration refers to what kind of view is used to manage other views, while view configuration refers to default information such as the default location and parameters for view creation. - -```typescript -// View Configuration -export interface ViewPreference { - autoCreate?: boolean; // Create an instance when the application starts - slot?: string; // Default open location - priority?: number; // Priority - options?: any; // Default configuration -} - -// Slot Configuration -export interface SlotPreference { - factory: string; // Default slot view for the slot - priority?: number; // Priority - options?: any; // Default configuration -} - -// module -createViewPreference(ViewPreference); -createSlotPreference(SlotPreference); -``` - -# Others - -In a typical React application, components are organized from top to bottom, meaning the top level of the application acts as a component that relies on specific layouts, and the layouts rely on detailed components within them. This nested structure is composed of a holistic dependency on details at every step, which means each layer becomes coupled to the others. This coupling is the root of many problems. Components that serve as layouts need to know the potential components that may appear within them to render selectively. Modifying the location of components often requires changes at the layout level. The fundamental goal of layout and component design here is to allow layouts to remain layouts and components to remain components, thus enabling better reusability. diff --git a/mana/apps/docs/docs/introduction/layout.zh-CN.md b/mana/apps/docs/docs/introduction/layout.zh-CN.md deleted file mode 100644 index bfc8af06..00000000 --- a/mana/apps/docs/docs/introduction/layout.zh-CN.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -title: 布局与视图系统 -order: 2 -nav: - title: 介绍 ---- - -# 前言 - -前端应用离不开布局与组件,布局是应用的骨架而组件是其上的血肉,但是从另一个角度看布局也是一种特殊的组件。mana 必须为体系解决如下几个问题: - -- 通过扩展模块为应用添加组件 -- 通过扩展来修改和替换布局 -- 保存与恢复页面布局状态 - -# 概念 - -## 视图 - -mana 基于 react 组件渲染,但是对于应用的上下文,我们并不关心所有层次的组件,例如当我们激活一个编辑器页签时,对于 dom 和 react 组件,实际是 focus 在页签上,但是我们的工具栏实际关心的是打开了编辑器面板,而不是容纳他的 tab,在执行快捷动作时,我们也要根据当前的编辑器面板做反应。这里 tab 页签和编辑器面板的差异我们处理为布局和视图的差异。 -我们将真正关心的组件组织成视图,一个页面应该由布局和视图组成,在应用的上下文里我们不再关心布局和视图以外的具体组件,他们仅仅作为用户交互的事件源。 -视图`View`就是带有一定数据定义和生命期表现的数据结构,简化后的数据结构定义如下: - -```typescript -export interface View { - id: string; - view: React.FC; -} -``` - -基于以上结构可以看出,在实际的内部管理中,数据是优先于组件出现的,我们先基于数据完成管理能力,React 组件可以视作 dom 的工厂函数,是被数据模块所管理的。 -视图在整个应用的生命期内也表现出一定的生命期,这些生命期也作为视图的公共定义 - -- 实例化 -- 添加 -- 激活 -- 渲染 -- 事件 -- 销毁 - 通过视图装饰器我们可以非常方便的在满足要求的数据结构上快速注册视图 - -```typescript -@singleton() -@view(FactoryId) -class MyView extends BaseView {} -``` - -## 插槽和区域 - -为了完成布局与组件的分离,我们在布局中引入了插槽`Slot`,一个布局会被区分为几个区域,每个区域会有一个区域 id,一个区域内会包含多个视图,由插槽机制完成区域的渲染。要理解 Slot 的设计,首先要理解区域,下图是一个较为常用的工作台布局区域划分。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*C3yLQbmY67EAAAAAAAAAAAAADjOxAQ/original) - -- 区域作为视图元素,提供布局能力。 - 由于插槽所代表的区域本身也是一种视图元素,所以在插槽内打开的视图,也可以渲染出新的插槽,从而完成布局的嵌套,上图所示的区域划分,其中 main 和 bottom 也可以合并为 main ,并在其中进一步划分为 main-top main-bottom,具体如何划分取决于用户使用的布局组件本身。 - 进一步的因为布局是可以嵌套的,所以整个应用本身也就是一个大的 Slot,我们使用默认的区域 id 来渲染。 - -```typescript - -``` - -- 区域作为视图容器,允许一个或多个视图打开在此区域。 - 在一般的工作台中,上面布局里的 left、bottom 等区域会提供形态和行为各异的 tab,我们会文件树打开在 left 区域;将欢迎使用打开在 main 区域;将输出打开在 bottom 区域。有时候 left 区域内并不以 tab 形式出现,而是使用手风琴布局,这些不同的区域内视图管理方式,为用户提供了不同的区域内视图管理的交互,tab 可以通过页签切换焦点,手风琴则通过展开,也或者我们提供的区域不提供以往视图的展示和切换能力,仅提供当前视图的显示。当区域作为视图容器时,他们对内有不同的表现,但是对外可以有统一表现,如添加视图、移除视图、激活视图等,这就是布局视图,我们在后面介绍。 - -Slot 作为区域在 React 组件内实体,他起到的主要作用是在渲染时主动打开相应的布局视图,不同于一般的视图比如欢迎使用,是依靠应用生命期触发的检查来决定是否主动打开,Slot 对应的视图容器统一在渲染是触发创建。 - -## 视图工厂与视图管理 - -在同一个页面上,我们有时会打开几个相同类型的视图,比如布局视图我们可能在多处使用 tab,功能视图我们可能会在打开多个编辑器。为了方便视图的管理,我们设计了视图工厂,每一个具体的视图都应该经过通过视图管理器用视图工厂打开,简化的定义如下 - -```typescript -export interface ViewFactory { - readonly id: string; - createView: (options?: any) => MaybePromise; -} -``` - -经过视图工厂创建出来的视图每个应有独一无二的 id,但是对于视图管理器而言,ViewFactory id + options 就是视图的 id。 -各个模块通过注册视图工厂来将自己的视图创建能力提供给视图管理器,然后在通过视图管理器创建具体的视图,这为视图提供追踪机制和统一的行为表现提供了基础。 - -## 插槽视图 - -插槽视图首先也是视图,只是增加了用于插槽布局时的行为和生命期操作,一个简化的定义如下 - -```typescript -export interface SlotView extends View { - addView: (view: View, option: LayoutViewOption) => Promise; -} -``` - -Tab、手风琴等布局组件,在占据一定区域的时候,需要基于布局视图的数据结构来实现。 -布局视图在注册的时候与一般视图是一样的,为了进一步的提升布局的扩展性,通过竞争机制来决定区域的布局的渲染方式,布局视图可以通过配置处理优先级。 - -# 机制 - -## 构建顺序 - -默认情况下布局和实体图的构建顺序如下。 -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*Vk7hQZDsGuoAAAAAAAAAAAAADjOxAQ/original) - -## 视图上下文 - -为了方便视图及视图内容的研发,我们提供了视图的上下文机制,这在页面上存在多例的视图研发时会比较有用。创建视图的动作可以同时为视图提供一个独立的上下文,我们将视图的数据模块本身,视图的创建配置等信息默认注入到这个上下文内。简化代码如下 - -```typescript -const container = ctx.container.createChild(); // 创建子容器 -container.load(...some module); // 加载视图需要的模块 -const current = container.get(view); // 创建 View 实例 -container.register({ token: ViewOption, useValue: option }); // 注册实例信息 -container.register({ token: ViewInstance, useValue: current }); // 注册实例信息 -current.view = ViewRender(current.view, container); // 高阶组件关联组件与上下文 -return current; -``` - -这样我们在视图组件内,可以方便的通过注入的信息完成数据与 UI 的联动,不再需要考虑如何从多个视图内定位自己的问题,从而完成数组到单例的"降维"。 - -```typescript -export function Component() { - const view = useInject(ViewInstance); - const option = useInject(ViewOption); - return
{view.info}
; -} -``` - -这里为什么选择了 `Container` 而非不是 `React Context` 上下文来传递实例信息呢?其中一个考虑是 View 背后可能是一个复杂的业务模块在,我们在创建视图时初始化的信息并不一定是视图所需的全部数据,通过隔离的子容器及其内部注册的模块,可以很好的完成这些数据结构的按需初始化。关于上下文的设计这里不再展开。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*GvQHRa9ZVmsAAAAAAAAAAAAADjOxAQ/original) - -## 活跃视图 - -在视图上下文那里示例代码里给出通过高阶组件来给视图提供上下文的机制,实际上除了这个位置除了提供上下文,也可以通过高阶组件给视图增加实际的 dom 包裹,从而完成 dom 到 View 数据结构的关联,方便通过用户交互来追踪视图的激活状态,这在需要根据焦点而切换快捷键响应等场景下很有用。 -实际上活跃视图是一个逻辑概念,真正的含义是最后一个机会的视图,设想一个这样的场景,当我们从编辑器里打开右键菜单,实际上这时候没有任何视图是激活状态,因为焦点在右键菜单上,但是我们认为激活的是编辑器面板,因为这是最后一个激活的视图。 - -## 页面保存与恢复 - -有了上述机制以后,页面的保存和恢复变得简单了,用户页面状态的保存的实现,实现就是结构化的保存下来布局与视图的嵌套关系,及其打开条件。而他们之间也只有包含关系一种。在页面保存时,我们只需按照现有的包含结构遍历,将视图 factory id,配置信息,子视图以及区域信息保存起来即可,视图为可保存视图时,再调用其保存方法,进一步获取视图的自定义信息。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*6Ww2Srfh_msAAAAAAAAAAAAADjOxAQ/original) - -```typescript -{ - "__mana_deafult_layout__": { - id: 'left-right-layout'; - area: { - left: { - id: 'left-right-layout'; - contents: [{ - id: 'file-tree', - }], - }, - right: { - id: 'tab'; - contents: [{ - id: 'code-editor', - options: {uri:'xxx'} - }], - } - } - } -} -``` - -而当页面恢复时,可以从已经保存的布局信息中重新遍历完成对视图的打开和添加动作,即可完成恢复。 -页面的保存和恢复均可配合应用生命期完成。 - -## 视图与插槽设置 - -我们内置了视图和插槽配置的扩展点,用户可以在模块内方便的声明对视图和插槽的配置,并设置其优先级。 -其中插槽的配置指的是插槽使用什么样的视图做其他视图的管理,视图的配置指的是在默认情况下,视图创建的默认位置和参数等信息。 - -```typescript -// 视图配置 -export interface ViewPreference { - autoCreate?: boolean; // 在应用启动时创建实例 - slot?: string; // 默认打开位置 - priority?: number; // 优先级 - options?: any; // 默认配置 -} -// 插槽配置 -export interface SlotPreference { - factory: string; // 插槽默认的插槽视图 - priority?: number; // 优先级 - options?: any; // 默认配置 -} - -// module -createViewPreference(ViewPreference); -createSlotPreference(SlotPreference); -``` - -# 其他 - -在一般在 React 应用中,我们是自上而下的组织组件的,也就是应用顶层作为一个组件,其依赖具体的布局,布局再依赖其中的细节的组件,这种层层嵌套的结构,每一步都由一个整体依赖细节的关系所组成,这样就意味着其其中的每一层都变得耦合,这种耦合是很多问题的根源。起到布局作用的组件,实际上要知道其中可能出现的组件,进行有选择的渲染;而修改组件出现的位置等,也往往要去布局层次修改。这里的布局和组件设计,根本的目的可能是让布局回归布局,让组件回归组件,从而允许他们被更好的重用。 diff --git a/mana/apps/docs/docs/introduction/state.md b/mana/apps/docs/docs/introduction/state.md deleted file mode 100644 index a6f9c785..00000000 --- a/mana/apps/docs/docs/introduction/state.md +++ /dev/null @@ -1,247 +0,0 @@ ---- -title: State management design -order: 2 - -nav: - title: Introduction ---- - -# The State Management We Need - -First, let's look at what the state in mana looks like. If we differentiate the state in mana based on whether it affects the UI, we quickly find that they are intertwined, so we cannot isolate a set of states that affect the UI within mana. Most of the data states in mana are concentrated together according to business and abstraction, and much of their logic is not solely for the UI. Therefore, in mana, we hope to separate logic from UI, allowing states to be organized in logic regardless of whether they drive the UI, without needing excessive changes or rewriting business logic to drive the UI. - -- Can we use data structures similar to [immer](https://github.com/immerjs/immer)? We find that due to the need for functional composition, object references within mana are stable, which is similar to why [immer cannot integrate with mobx](https://github.com/immerjs/immer/issues/29). -- Can we use the [mobx](https://mobx.js.org/README.html) solution? For mana, the mobx approach is still too demanding, as we must consider whether a module will eventually drive the UI before writing it, which is usually not the case in mana. - Ultimately, we chose to build a reactive data structure suitable for OOP scenarios, using dependency tracking to achieve two-way binding with the UI, drawing on concepts from [vue](https://cn.vuejs.org/) and mobx. - -# Simple Data Management - -## Basic Types - -The most basic situation is support for basic types. - -```typescript -class State { - @prop() - count: number = 0; -} -const state = new State(); -``` - -The `prop` decorator converts properties into observable properties, and the usage of properties is completely consistent with usual cases. Use it in React as follows: - -```typescript -export default () => { - const observableState = useObserve(state); - return ( - - ); -}; -``` - -When we manipulate the `count` property outside the component, it can also trigger UI changes. - -## Basic Data Structures - -In addition to basic types, we need support for basic data structures. Currently, Array, Map, and PlainObject are supported. With these data structures, general data state management can be satisfied. - -```typescript -class State { - @prop() - list: string[] = []; -} -const state = new State(); - -export default () => { - const observableState = useObserve(state); - return <>observableState.list.length; -}; -``` - -To support basic data structures, we support reactive transformations of basic data structures, allowing independent data structures to be used reactively in components. - -```typescript -export default () => { - const observableArrary = useObserveState([]); - return ( - - ); -}; -``` - -## Nesting - -Generally, our state is completed by nesting the above states, whether it is the nesting of the basic data structures themselves or the nesting of basic data structures with objects. We can complete dependency collection and data binding in nested states, so examples will not be provided here. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*HveHQLgAfH0AAAAAAAAAAAAADjOxAQ/original) - -We achieve data binding by converting them into observable objects for UI rendering. - -# Complex Situations and Performance Optimization - -In addition to the basic situations mentioned above, we also need to consider complex UI scenarios, providing support or clarifying usage for certain scenarios. - -## Sharing - -Whether it is an object or a basic data structure, they are converted into observable objects for use by the UI. Just like stable references, we ensure this transformation is stable. The observable object of an object is still itself, and its observability is mainly reflected in its properties. We can use the observable API to obtain observable objects. - -```typescript -observableState = observable(state); -observable(state) === observableState; // true -observable(observableState) === observableState; // true -``` - -On this basis, we can complete the sharing of observable properties. - -```typescript -const basic = observable({ - count: 0, -}); - -class StateFoo { - @prop() basic = basic; -} -class StateBar { - @prop() basic = basic; -} -``` - -If the observable properties of the above-linked classes are used in the UI, any change to the value of `basic` will refresh the entire UI. - -## Passing - -Although the change of observable objects is stable, when using them to drive the UI, we do not directly use observable objects because we need to accurately manage the relationship between changes in observable objects and the specific UI context. This requires a second layer of transformation, which needs to be completed in the rendering context. `useObserve` not only completes the change of the observable object but also completes the binding with the rendering context. -However, this binding relationship affects how objects are used when passed between components: - -```typescript -export default () => { - const observableState = useObserve(state); - return ( - - ); -}; - -const ChildRender = (props) => { - const { state } = props; // count change will refresh the parent component - const state = useObserve(props.state); // count change will only refresh the child component - return ( -
state.count
- ); -} -``` - -As in the example above, when passing observable objects between components, we should use `useObserve` again to rebind the rendering context. Otherwise, using dependencies will trigger refreshes at the original context, expanding the refresh scope. - -In fact, we encourage avoiding parameter passing between components as much as possible and instead obtaining public references of state objects. In mana, we use data state management in conjunction with dependency injection and achieve state management with almost no parameter passing through context management. On this basis, since the consumption of states is more through stable references, we can confidently use `React.memo` for all components to further isolate the impact of parent component refreshes on child components. - -## Collect on Demand - -In mana-observable, we collect the observable objects and their properties that users actually use during rendering. We believe that only properties actually used in the last render need to trigger the next update when their values change. In actual rendering, starting from an observable object, the data it can access and its nested structures can be viewed as a tree. Only when nodes accessed on this tree change will the next rendering be triggered. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*YG2TSqr1ntYAAAAAAAAAAAAADjOxAQ/original) - -Suppose there is an object relationship tree as shown above, where the properties of colored nodes are accessed during rendering. Then changes in their values will trigger re-rendering, while changes in the properties of the gray parts will not trigger re-rendering since they were not used in rendering. - -In principle, unless basic data structures are used directly, the trigger for re-rendering will always reflect changes in a property. Here, changes within basic data structures are also elevated to changes in their top-level properties and considered as changes to trigger UI changes. - -## Transform on Demand - -To further improve performance and simplify writing, our observable data transformation occurs when an object is first attempted to be observed. - -```typescript -const arr: number[] = []; -class State { - @prop() - arr: number[] = arr; -} -const state = new State(); - -// before render -state.arr = arr; // true - -// after render - -state.arr = arr; // false -state.arr = observable(arr); // true -``` - -Generally, we do not need to pay attention to this change or its timing, because it does not affect the API for external alignment access. - -# Principle - -Generally, we hope the logic of UI rendering can be simple and pure, ideally expressed as $f(state)=>UI$. In actual scenarios, the state is constantly changing, so we hope to find a method to drive UI changes based on state changes. - -- Immutable Data Structure + Dirty Checking - One approach is to reflect changes within the state as changes in the state itself, leading to the emergence of immutable data structure-driven methods. In this approach, both state and UI are decomposed layer by layer, so the cost of rebuilding the state in each layer is not too high. Changes in data are always passed to the previous layer, using whole-layer changes to drive the UI. When the State is separated into a large Store, dirty checking at different levels is often required. -- Mutable Data Structure + Dependency Tracking - Another approach is to respond to specific changes within the state, binding changes to the UI levels that use it. To locate the relationship between data and UI consumption, this method of locating is dependency tracking, focusing on the context of data consumption and forming associations based on it. In this way, when data changes, data change events are collected and mapped to different UI level refreshes. - -mana-observable is implemented using the mutable data structure + dependency tracking approach for reactivity, and its principles are similar to the reactive principles in mobx or vue. If you understand the reactive principles of these, you should be able to quickly grasp the reactive processing done by mana-observable. - -- Mutable Data Structure - We have two kinds of mutable data structures: object properties and basic data structures, with object properties being the absolute mainstay. In the simple data management section earlier, we have introduced them and demonstrated their nested relationships. - - Object properties are transformed into getter/setter definitions. - - Basic data structures are accessed through proxies, reflecting changes layer by layer as top-level changes or changes in the properties they serve. -- Dependency Tracking - The purpose of dependency tracking is to establish links between traced properties or data structures and the current UI, allowing their changes to trigger UI updates. The specific UI update action is obtained from the UI context. Since dependency tracking needs to track deeply across multiple levels, the update actions obtained from the context must be passed through multiple levels. We use proxies to complete dependency tracking, and users build the first layer of proxies for tracking in the UI context. The next layer of properties accessed by it will also be wrapped as proxies based on the context held, thus achieving deep tracking. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*8rRlSqJptGkAAAAAAAAAAAAADjOxAQ/original) - -We complete the reactive data flow as shown in the figure above. During UI rendering, Render obtains observable objects from the context and accesses their properties. The access process is proxied by Tracker and the usage of properties in the current context is recorded in Notifier. UI and data models operate property values in the same way, and changes in property values notify the corresponding Notifier, which triggers Render to re-render, entering the next response cycle. - -# Cross-Framework - -In the principle introduction section, we abstracted rendering into the form of $f(state)=>UI$, which is not limited to the React framework. The data cycle, after simplification, is actually a cycle of the Render method and data changes. In theory, frameworks that update UI in the following form can be supported. - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*f-MwTKSVBDEAAAAAAAAAAAAADjOxAQ/original) - -We tried data-driven approaches on the [lumino](https://github.com/jupyterlab/lumino) component library, which is relied upon by [jupyterlab](https://github.com/jupyterlab/jupyterlab), and [phosphor](https://phosphorjs.github.io/), which is relied upon by [theia](https://github.com/eclipse-theia/theia). - -```typescript -class ObservableWidget extends Widget { - stateDiv: HTMLDivElement; - selfDiv: HTMLDivElement; - @prop() count: number = 0; - constructor(options?: Widget.IOptions) { - super(options); - this.stateDiv = document.createElement('div'); - this.selfDiv = document.createElement('div'); - this.node.appendChild(this.stateDiv); - this.node.appendChild(this.selfDiv); - this.update(); - } - update(): void { - const self = this.observe(this); - const observableInstance = this.observe(instance); - this.stateDiv.innerHTML = `State count: ${observableInstance.count}`; - this.selfDiv.innerHTML = `ObservableWidget count: ${self.count}`; - } - observe(state: T): T { - return Tracker.track(state, this.update.bind(this)); - } -} -``` - -# Combined with Dependency Injection - -The design oriented towards OOP is very suitable for use in complex scenarios with dependency injection (DI) systems. In a dependency injection system, due to the high cost of instance reconstruction, introducing global instances for functional composition is easier and is a scenario very suitable for mana-observable. We provide the `useInject` method to support the use of injectable elements in components in a Hooks manner and provide the `ObservableContext` context for switching the context of the dependency injection container. - -```typescript -const Render = () => { - const state = useInject(State); - return <>state.count; -}; -``` - -For dependency injection containers, we recommend the mana-syringe solution, which can be compatible with other dependency injection solutions by supporting the following context interface. - -```typescript -type Container = { - get: (identifier: Token) => T; - createChild: () => Container; -}; -``` - -Dependency injection can provide strong context-switching support for mana-observable. Combined with concepts like child containers, it can greatly reduce application logic complexity in multi-dimensional data structures. diff --git a/mana/apps/docs/docs/introduction/state.zh-CN.md b/mana/apps/docs/docs/introduction/state.zh-CN.md deleted file mode 100644 index 54be9b75..00000000 --- a/mana/apps/docs/docs/introduction/state.zh-CN.md +++ /dev/null @@ -1,247 +0,0 @@ ---- -title: 状态管理设计 -order: 2 -nav: - title: 介绍 ---- - -# 我们需要的状态管理 - -我们先来看 mana 里的状态是什么样子的?如果我们按照是否作用于 UI 来区分 mana 里的状态,很快会发现他们是纠缠在一起的,所以我们无法在 mana 里独立出作用于 UI 的状态集合,mana 里的数据状态大部分情况系是按照业务和抽象集中在一起的,他们的很多运行逻辑并不仅仅是为 UI 服务的。 -所以在 mana 里我们希望逻辑与 UI 可以分离,不管一个状态是否驱动 UI,他都可以按照一般写法组织在逻辑里,不需要为了驱动 UI 而做出过多改变以至于重写业务逻辑。 - -- 是否可以使用类似 [immer](https://github.com/immerjs/immer) 的数据结构?我们会发现出于功能组合的需求,mana 内的对象引用是稳定的,这与 [immer 为什么不能集成到 mobx ](https://github.com/immerjs/immer/issues/29)是有相似之处的。 -- 是否可以使用 [mobx](https://mobx.js.org/README.html) 方案?对 mana 来说,mobx 写法要求依然过多,我们必须在写一个模块之前就考虑到他最终是否会驱动 UI,在 mana 里通常不是这样的。 - 我们最终选择构建一套适用于 OOP 场景的响应式数据结构,采用依赖追踪的方式对 UI 做双向绑定,实现思路上参考了 [vue](https://cn.vuejs.org/) 和 mobx。 - -# 简单的数据管理 - -## 基本类型 - -最基础的情况是对基本类型的支持 - -```typescript -class State { - @prop() - count: number = 0; -} -const state = new State(); -``` - -通过 `prop` 装饰器将属性转换为可观察属性,此外对于属性的使用与一般情况完全一致,在 React 中使用如下 - -```typescript -export default () => { - const observableState = useObserve(state); - return ( - - ); -}; -``` - -当我们在组件之外对 `count` 属性进行操作时,也可以触发 UI 的变化。 - -## 基础数据结构 - -除了基本类型以外,我们还需要支持基础数据结构,当前支持 ArrayMapPlainObject, 有了这些数据结构的支持,一般的数据状态管理就可以满足了。 - -```typescript -class State { - @prop() - list: string[] = []; -} -const state = new State(); - -export default () => { - const observableState = useObserve(state); - return <>observableState.list.length; -}; -``` - -为了完成对基础数据结构的支持,我们支持了对基础数据结构的响应式变换,所以独立的数据结构也可以在组件里以响应式的方式使用 - -```typescript -export default () => { - const observableArrary = useObserveState([]); - return ( - - ); -}; -``` - -## 嵌套 - -一般情况下,我们的状态就是由上述状态的嵌套来完成的,不管是基础数据结构本身的嵌套,还是基础数据结构与对象的嵌套,我们都可以完成在嵌套状态下的依赖收集与数据绑定,这里不再给出例子。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*HveHQLgAfH0AAAAAAAAAAAAADjOxAQ/original) - -我们通过将他们转换为可观察对象,用于 UI 渲染从而完成数据绑定。 - -# 复杂情况与性能优化 - -除了上述基本情况,我们还要考虑到 UI 的复杂场景,对一些场景给出支持,或者明确用法。 - -## 共享 - -不管是对象还是基础数据结构,都是转换为可观察对象以后再给 UI 使用的,就像引用的稳定一样,我们保证这种变换是稳定的,对象的可观察对象仍然是其本身,其可观察性主要体现在属性上。我们可以使用 observable API 来获取可观察对象。 - -```typescript -observableState = observable(state); -observable(state) === observableState; // true -observable(observableState) === observableState; // true -``` - -在此基础上,我们可以完成可观察属性的共享。 - -```typescript -const basic = observable({ - count: 0, -}); - -class StateFoo { - @prop() basic = basic; -} -class StateBar { - @prop() basic = basic; -} -``` - -如果在 UI 中使用了上述链各个类的可观察属性,则无论从哪个改变了 basic 的值,UI 全部都会刷新。 - -## 传递 - -虽然可观察对象的变化是稳定的,但是在使用驱动 UI 时,我们并不是直接使用了可观察对象,因为我们需要准确的管理可观察对象的变化与具体的 UI 上下文之间的关系,这就需要第二层变换,这层变换需要在渲染上下文中完成。useObserve 不仅完成了可观察对象变化,也同时完成了与渲染上下文的绑定。 -但是这种绑定关系会影响到对象在组件间传递的使用方式: - -```typescript -export default () => { - const observableState = useObserve(state); - return ( - - ); -}; - -const ChildRender = (props) => { - const { state } = props; // count 变化会让父组件刷新 - const state = useObserve(props.state); // count 变化会只会让子组件刷新 - return ( -
state.count
- ); -} -``` - -如上面例子里,当组件间进行可观察对象传递时,我们应当再次使用 useObserve 来重新绑定渲染上下文,否则对依赖的使用,会触发到原上下文的位置,从而造成刷新范围扩大。 - -实际上,我们鼓励尽量不适用组件间参数传递,应当尽量拿到状态对象的公共引用。在 mana 中,我们将数据状态管理与依赖注入一起使用,并通过上下文管理做到几乎不使用参数传递的状态管理。在此基础上,由于对状态的消费更多是通过稳定的引用来进行,我们可以放心的对所有组件使用 React.memo 来进一步隔离父组件刷新对子组件的影响。 - -## 按需收集 - -在 mana-observable 中,我们会在渲染过程中收集用户实际使用到可观察对象及其属性,我们认为只有上一次渲染中实际使用到的属性,才有需要在值变更的时候触发下一次更新。实际渲染中从一个可观察对象开始,他可以访问的数据和嵌套结构,可以看做一棵树,只有树上被访问的节点发生变化时,才会触发下一次渲染。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*YG2TSqr1ntYAAAAAAAAAAAAADjOxAQ/original) - -假设存在上图中的对象关系树,带有颜色的节点的属性是在渲染中访问到的属性信息,那么其值的变更会触发重新渲染,而灰色部分由于在渲染中没有用到,则对应的属性值或者其内部的信息变更时,不会触发重新渲染。 - -从原理上将,除非直接使用基础数据结构,否则重新渲染的触发一定反映在某个属性的变更上,这里我们将基础数据结构内部的变更,也上升到其顶层属性的变更,认为是变更的一种,从而触发 UI 变化。 - -## 按需转换 - -为了进一步的提升性能和简化写法,我们的可观察数据转换发生在第一次尝试观察对象时 - -```typescript -const arr: number[] = []; -class State { - @prop() - arr: number[] = arr; -} -const state = new State(); - -// before render -state.arr = arr; // true - -// after render - -state.arr = arr; // false -state.arr = observable(arr); // true -``` - -一般而言,我们不用关注这种变化及其发生的时机,因为这种变化并不影响外部对齐访问的 API。 - -# 原理 - -一般的,我们希望 UI 渲染的逻辑能够简单纯粹,最好可以表达为 $f(state)=>UI$ 的形式,实际场景中 state 是一直在变的,于是我们希望找到 state 变更驱动 UI 变化的方法。 - -- 不可变数据结构 + 脏检查 - 一种思路是将 state 内部的变化,反应为 state 本身的变化,于是不可变数据结构的驱动方式出现了,这种思路下 state 与 UI 都逐层的分解,让每一层里重建 state 的成本不至于过高,数据的变更总是传递到上一层,用整层的变更来驱动 UI,当 State 被分离为一个大的 Store 时,往往要配合不同层次的脏检查; -- 可变数据结构 + 依赖追踪 - 另一种思路是响应 state 中具体的变化,将变更绑定在使用它的 UI 层次上,为了定位到数据与 UI 的消费关系,这种定位方法就是依赖追踪,在数据消费的时候关注数据消费时的上下文,并据此形成关联。这样在数据变更时,收集数据变更的事件,将其映射到不同 UI 层次的刷新上。 - -mana-observable 是使用可变数据结构+依赖追踪的方式来实现响应式的,其原理与 mobx 或者 vue 中的响应式原理有很多相似之处,如果对他们的响应式原理有所了解,应该能够快速的理解 mana-observable 所做的响应式处理。 - -- 可变数据结构 - 我们的可变数据结构有两种,对象属性和基础数据结构,其中对象属性应该是绝对主力。在前文简单的数据管理部分,已经对他们进行了介绍。并展示了他们的嵌套关系。 - - 对象属性,我们将其转化为 getter/setter 定义。 - - 基础数据结构,通过 proxy 访问,逐层的将其变更反应为顶层的变更,或者是其所服务的属性的变更。 -- 依赖追踪 - 依赖追踪目的是建立被追踪的属性或数据结构,与当前 UI 之前的联系,让他们的变更可以触发 UI 的更新,这里具体 UI 的更新动作是从 UI 上下文中获取的。依赖追踪需要在多个层次里深度追踪的,那么就要把上文里获取的更新动作,在多个层次间传递,我们这里使用 proxy 完成依赖追踪,用户在 UI 的上下文里构建用于追踪的第一层 proxy,通过其访问的下一层属性,符合条件的时候也会基于持有的上下文包装成 proxy,从而实现深层追踪。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*8rRlSqJptGkAAAAAAAAAAAAADjOxAQ/original) - -我们完成响应式的数据流如上图所示,Render 在渲染 UI 时,从上下文中获得可观察对象,并访问其属性,访问过程被 Tracker 代理,并将当前上下文对属性的使用记录在 Notifier 中,UI 和数据模型以相同的数据变更方式操作属性值,属性值的变更,将通知到对应的属性的 Notifier,由其触发 Render 重新渲染,进入下一轮的响应周期。 - -# 跨框架 - -在原理介绍的部分,我们将渲染抽象为了 $f(state)=>UI$ 的形式,这里并不限定在 React 框架,而数据循环经过简化,实际上是 Render 方法和数据变更的循环,理论上以如下形式进行 UI 更新的框架都可以支持。 - -![](https://mdn.alipayobjects.com/huamei_hdnzbp/afts/img/A*f-MwTKSVBDEAAAAAAAAAAAAADjOxAQ/original) - -我们尝试了在 [jupyterlab](https://github.com/jupyterlab/jupyterlab) 依赖的 [lumino](https://github.com/jupyterlab/lumino) 组件库上进行数据驱动,[theia](https://github.com/eclipse-theia/theia) 依赖的 [phosphor](https://phosphorjs.github.io/) 同理。 - -```typescript -class ObservableWidget extends Widget { - stateDiv: HTMLDivElement; - selfDiv: HTMLDivElement; - @prop() count: number = 0; - constructor(options?: Widget.IOptions) { - super(options); - this.stateDiv = document.createElement('div'); - this.selfDiv = document.createElement('div'); - this.node.appendChild(this.stateDiv); - this.node.appendChild(this.selfDiv); - this.update(); - } - update(): void { - const self = this.observe(this); - const observableInstance = this.observe(instance); - this.stateDiv.innerHTML = `State count: ${observableInstance.count}`; - this.selfDiv.innerHTML = `ObservableWidget count: ${self.count}`; - } - observe(state: T): T { - return Tracker.track(state, this.update.bind(this)); - } -} -``` - -# 配合依赖注入 - -面向 OOP 的设计,非常适合在复杂场景下配合依赖注入(DI)体系使用,在依赖注入体系中,由于实例的重建成本较高,全局实例的引入进行功能组合更加容易,是非常适合 mana-observable 的场景。我们提供了 useInject 方法来支持在组件中以 Hooks 的方式使用可注入元素,并提供了 ObservableContext 上下文,用于切换依赖注入容器的上下文。 - -```typescript -const Render = () => { - const state = useInject(State); - return <>state.count; -}; -``` - -对于依赖注入容器,我们推荐 mana-syringe 方案,可以通过如下上下文接口的支持来兼容其他太依赖注入方案。 - -```typescript -type Container = { - get: (identifier: Token) => T; - createChild: () => Container; -}; -``` - -依赖注入可以为 mana-observable 提供强大的上下文切换支持,配合子容器等概念,可以极大的降低多维数据结构下的应用逻辑复杂度。 diff --git a/mana/apps/docs/dumi-plugin-alias.ts b/mana/apps/docs/dumi-plugin-alias.ts deleted file mode 100644 index e8f2c14c..00000000 --- a/mana/apps/docs/dumi-plugin-alias.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { IApi } from 'dumi'; -import execa from 'execa'; - -export default (api: IApi) => { - api.modifyWebpackConfig(async (memo) => { - const { stdout } = execa.commandSync('pnpm m ls --json --depth=-1'); - try { - const list = JSON.parse(stdout); - list.forEach((item) => { - if (memo.resolve?.alias) { - memo.resolve.alias[`${item.name}/es/mock`] = `${item.path}/src/mock`; - memo.resolve.alias[item.name] = `${item.path}/src/index.js`; - } - }); - } catch (_e) { - // - } - return memo; - }); -}; diff --git a/mana/apps/docs/package.json b/mana/apps/docs/package.json deleted file mode 100644 index 3f69ec81..00000000 --- a/mana/apps/docs/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "@difizen/mana-docs", - "version": "0.1.32", - "private": true, - "license": "MIT", - "description": "Document site for mana", - "type": "module", - "scripts": { - "start": "dumi dev", - "analyze": "ANALYZE=1 dumi build", - "build": "dumi build" - }, - "devDependencies": { - "@types/react": "^18.2.0", - "dumi": "^2.2.13", - "execa": "^5.1.1" - }, - "engines": { - "node": ">=16.20.0" - }, - "packageManager": "pnpm@9.7.1", - "peerDependencies": { - "react": "^18.2.0" - }, - "dependencies": { - "@ant-design/icons": "^5.1.0", - "@difizen/mana-app": "^0.1.32", - "@difizen/mana-configuration-panel": "0.1.32", - "@difizen/mana-l10n": "^0.1.32", - "@difizen/mana-react": "^0.1.32", - "@difizen/umi-plugin-mana": "^0.1.32", - "antd": "^5.8.6", - "moment": "^2.30.1", - "octokit": "^3", - "react-copy-to-clipboard": "^5.1.0" - } -} diff --git a/mana/apps/docs/public/ding-qrcode.png b/mana/apps/docs/public/ding-qrcode.png deleted file mode 100644 index dc509dcc7c80f396c0841e796e131e98c191e44a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51724 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 diff --git a/mana/apps/docs/public/mana.svg b/mana/apps/docs/public/mana.svg deleted file mode 100644 index b802c8b9..00000000 --- a/mana/apps/docs/public/mana.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mana/apps/docs/src/application-react/antd-menu/antd-menu-view.tsx b/mana/apps/docs/src/application-react/antd-menu/antd-menu-view.tsx deleted file mode 100644 index 636850b4..00000000 --- a/mana/apps/docs/src/application-react/antd-menu/antd-menu-view.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { MacCommandOutlined } from '@ant-design/icons'; -import { MAIN_MENU_BAR } from '@difizen/mana-app'; -import { BaseView, view } from '@difizen/mana-app'; -import { singleton } from '@difizen/mana-app'; -import { prop } from '@difizen/mana-app'; -import * as React from 'react'; -import { forwardRef } from 'react'; - -import { MenuRender } from '../workbench/menu/render.js'; - -export const ManaMenubarComponent = forwardRef(function ManaMenubarComponent( - props, - ref: React.ForwardedRef, -) { - return ( -
- -
- ); -}); - -@singleton() -@view('AntdMenuView') -export class AntdMenuView extends BaseView { - override view = ManaMenubarComponent; - @prop() - count = 0; - constructor() { - super(); - this.title.icon = MacCommandOutlined; - this.title.label = 'Antd 菜单'; - this.id = 'antd-menu'; - } -} diff --git a/mana/apps/docs/src/application-react/antd-menu/index.ts b/mana/apps/docs/src/application-react/antd-menu/index.ts deleted file mode 100644 index 4cdbfb1b..00000000 --- a/mana/apps/docs/src/application-react/antd-menu/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { createViewPreference, ManaModule } from '@difizen/mana-app'; - -import { WorkbenchLayoutArea } from '../workbench/layout/workbench-layout.js'; - -import { AntdMenuView } from './antd-menu-view.js'; - -export const AntdMenuModule = ManaModule.create().register( - AntdMenuView, - createViewPreference({ - view: AntdMenuView, - slot: WorkbenchLayoutArea.main, - autoCreate: true, - }), -); diff --git a/mana/apps/docs/src/application-react/command-palette/command-palette-app.ts b/mana/apps/docs/src/application-react/command-palette/command-palette-app.ts deleted file mode 100644 index efb56336..00000000 --- a/mana/apps/docs/src/application-react/command-palette/command-palette-app.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { - PlusOutlined, - MinusOutlined, - MinusCircleOutlined, - RightOutlined, -} from '@ant-design/icons'; -import type { Command, CommandRegistry, ToolbarRegistry } from '@difizen/mana-app'; -import { CardTabView } from '@difizen/mana-app'; -import { SlotView } from '@difizen/mana-app'; -import { SlotViewManager } from '@difizen/mana-app'; -import { ViewManager } from '@difizen/mana-app'; -import { - ApplicationContribution, - ToolbarContribution, - CommandContribution, -} from '@difizen/mana-app'; -import { equals, getOrigin } from '@difizen/mana-app'; -import { inject, singleton } from '@difizen/mana-app'; - -import { WorkbenchLayoutArea } from '../workbench/layout/workbench-layout.js'; - -import { CommandPaletteView, CommandSlot } from './command-palette-view.js'; - -export const INCREASE_COUNT: Command = { - id: 'command.palette.increase', - icon: PlusOutlined, - label: 'INCREASE', -}; - -export const DECREACE_COUNT: Command = { - id: 'command.palette.decreace', - icon: MinusOutlined, - label: 'DECREACE', -}; - -export const MOVE_VIEW: Command = { - id: 'command.palette.move', - icon: RightOutlined, - label: '移动', -}; - -@singleton({ - contrib: [ApplicationContribution, CommandContribution, ToolbarContribution], -}) -export class CommandPaletteApplication - implements ApplicationContribution, CommandContribution, ToolbarContribution -{ - protected readonly viewManager: ViewManager; - protected readonly slotViewManager: SlotViewManager; - - constructor( - @inject(SlotViewManager) slotViewManager: SlotViewManager, - @inject(ViewManager) viewManager: ViewManager, - ) { - this.viewManager = viewManager; - this.slotViewManager = slotViewManager; - } - registerCommands(command: CommandRegistry): void { - command.registerCommand(INCREASE_COUNT, { - execute: async () => { - const view = - await this.viewManager.getView(CommandPaletteView); - if (view) { - view.count += 1; - } - }, - isVisible: (data: any, container: any) => { - const view = this.slotViewManager.getSlotView(CommandSlot.first); - return equals(view, container) && container instanceof CardTabView; - }, - }); - command.registerHandler(INCREASE_COUNT.id, { - execute: async () => { - const view = - await this.viewManager.getView(CommandPaletteView); - if (view) { - view.count += 1; - } - }, - isVisible: (data: any, container: any) => { - const view = this.slotViewManager.getSlotView(CommandSlot.first); - return ( - equals(view, container) && - container instanceof CardTabView && - container.children.length < 2 - ); - }, - }); - command.registerCommand(DECREACE_COUNT, { - isVisible: (data: any) => data instanceof CommandPaletteView, - isEnabled: (data: any) => data instanceof CommandPaletteView && data.count > 0, - execute: async () => { - const view = - await this.viewManager.getView(CommandPaletteView); - if (view) { - view.count -= 1; - } - }, - }); - command.registerCommand(MOVE_VIEW, { - isVisible: (data: any) => data instanceof CommandPaletteView && data.count > 0, - isEnabled: (data: any) => data instanceof CommandPaletteView && data.count > 0, - execute: async (data: CommandPaletteView) => { - const view = getOrigin(data); - if (view instanceof CommandPaletteView) { - const rightView = this.slotViewManager.getSlotView(WorkbenchLayoutArea.right); - const leftView = this.slotViewManager.getSlotView(WorkbenchLayoutArea.left); - if (SlotView.is(leftView) && SlotView.is(rightView)) { - if (leftView.contains(view)) { - leftView.removeView(view); - rightView.addView(view); - return; - } - if (rightView.contains(view)) { - rightView.removeView(view); - leftView.addView(view); - return; - } - } - } - }, - }); - } - registerToolbarItems(registry: ToolbarRegistry): void { - registry.registerItem({ - id: INCREASE_COUNT.id, - command: INCREASE_COUNT.id, - tooltip: '增加', - }); - registry.registerItem({ - id: DECREACE_COUNT.id, - command: DECREACE_COUNT.id, - icon: MinusCircleOutlined, - }); - registry.registerItem({ - id: MOVE_VIEW.id, - command: MOVE_VIEW.id, - }); - registry.registerItem({ - id: `${INCREASE_COUNT.id}-group`, - command: INCREASE_COUNT.id, - group: ['group1'], - }); - } - onStart() { - // - } -} diff --git a/mana/apps/docs/src/application-react/command-palette/command-palette-view.tsx b/mana/apps/docs/src/application-react/command-palette/command-palette-view.tsx deleted file mode 100644 index 4dedecf5..00000000 --- a/mana/apps/docs/src/application-react/command-palette/command-palette-view.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { MacCommandOutlined } from '@ant-design/icons'; -import { BaseView, Slot, view, ViewInstance } from '@difizen/mana-app'; -import { singleton } from '@difizen/mana-app'; -import { prop, useInject } from '@difizen/mana-app'; -import * as React from 'react'; -import { forwardRef } from 'react'; - -export enum CommandSlot { - first = 'CommandSlot-first', -} - -export const CommandPaletteComponent = forwardRef(function CommandPaletteComponent( - props, - ref: React.ForwardedRef, -) { - const instance = useInject(ViewInstance); - return ( -
- {instance.count} - -
- ); -}); - -@singleton() -@view('CommandPlatte') -export class CommandPaletteView extends BaseView { - override view = CommandPaletteComponent; - @prop() - count = 0; - constructor() { - super(); - this.title.icon = MacCommandOutlined; - this.title.label = '命令面板'; - this.id = 'command-palette'; - } -} diff --git a/mana/apps/docs/src/application-react/command-palette/command-tab.tsx b/mana/apps/docs/src/application-react/command-palette/command-tab.tsx deleted file mode 100644 index 407b5b46..00000000 --- a/mana/apps/docs/src/application-react/command-palette/command-tab.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { MacCommandOutlined } from '@ant-design/icons'; -import { BaseView, view } from '@difizen/mana-app'; -import { singleton } from '@difizen/mana-app'; -import * as React from 'react'; -import { forwardRef } from 'react'; - -export const CommandTabViewComponent = forwardRef(function CommandTabViewComponent( - props, - ref: React.ForwardedRef, -) { - return
; -}); - -@singleton() -@view('Commandtab') -export class CommandTabView extends BaseView { - override view = CommandTabViewComponent; - - constructor() { - super(); - this.title.icon = MacCommandOutlined; - this.title.label = 'tab1'; - this.id = 'command-palette-tab1'; - } -} diff --git a/mana/apps/docs/src/application-react/command-palette/index.ts b/mana/apps/docs/src/application-react/command-palette/index.ts deleted file mode 100644 index f8f6184f..00000000 --- a/mana/apps/docs/src/application-react/command-palette/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { - createSlotPreference, - createViewPreference, - ManaModule, -} from '@difizen/mana-app'; -import { CardTabView } from '@difizen/mana-app'; - -import { WorkbenchLayoutArea } from '../workbench/layout/workbench-layout.js'; - -import { CommandPaletteApplication } from './command-palette-app.js'; -import { CommandPaletteView, CommandSlot } from './command-palette-view.js'; -import { CommandTabView } from './command-tab.js'; - -export const CommandPalette = ManaModule.create().register( - CommandPaletteView, - CommandPaletteApplication, - CommandTabView, - createViewPreference({ - view: CommandPaletteView, - slot: WorkbenchLayoutArea.left, - autoCreate: true, - }), - createSlotPreference({ - slot: CommandSlot.first, - view: CardTabView, - }), - createViewPreference({ - view: CommandTabView, - slot: CommandSlot.first, - autoCreate: true, - }), -); diff --git a/mana/apps/docs/src/application-react/content/content-view.tsx b/mana/apps/docs/src/application-react/content/content-view.tsx deleted file mode 100644 index b0edfc67..00000000 --- a/mana/apps/docs/src/application-react/content/content-view.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { FileOutlined } from '@ant-design/icons'; -import type { NavigatableView } from '@difizen/mana-app'; -import { BaseView, view, ViewInstance, ViewOption } from '@difizen/mana-app'; -import { inject, transient } from '@difizen/mana-app'; -import { prop, useInject } from '@difizen/mana-app'; -import { URI } from '@difizen/mana-app'; -import * as React from 'react'; -import { forwardRef } from 'react'; - -import styles from './index.module.less'; - -export const Logo = forwardRef(function Logo( - props, - ref: React.ForwardedRef, -) { - const viewInstance = useInject(ViewInstance); - return ( -
-
${viewInstance.filePath}
-
- ); -}); - -export const Lable = () => { - const viewInstance = useInject(ViewInstance); - return ( -
- {viewInstance.filePath} - {viewInstance.time} -
- ); -}; - -@transient() -@view('content-view') -export class ContentView extends BaseView implements NavigatableView { - @prop() filePath?: string; - @prop() time = 0; - protected options: any; - override view = Logo; - constructor(@inject(ViewOption) options: any) { - super(); - this.options = options; - this.title.icon = FileOutlined; - this.filePath = options.path; - this.title.label = Lable; - this.title.caption = options.path; - this.title.className = styles.title; - if (this.filePath?.endsWith('.py')) { - setInterval(() => { - this.time += 1; - }, 1000); - } - } - getResourceUri(): URI | undefined { - return new URI(this.options.path); - } - createMoveToUri(resourceUri: URI): URI | undefined { - return resourceUri; - } -} diff --git a/mana/apps/docs/src/application-react/content/index.module.less b/mana/apps/docs/src/application-react/content/index.module.less deleted file mode 100644 index 9b607a58..00000000 --- a/mana/apps/docs/src/application-react/content/index.module.less +++ /dev/null @@ -1,13 +0,0 @@ -.content { - display: flex; - align-items: center; - - span { - font-weight: 400; - font-size: 16px; - } -} - -.title { - display: flex; -} diff --git a/mana/apps/docs/src/application-react/content/index.ts b/mana/apps/docs/src/application-react/content/index.ts deleted file mode 100644 index 7f43dded..00000000 --- a/mana/apps/docs/src/application-react/content/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ManaModule } from '@difizen/mana-app'; - -import { ContentView } from './content-view.js'; - -export * from './content-view.js'; - -export const ContentModule = ManaModule.create().register(ContentView); diff --git a/mana/apps/docs/src/application-react/file/file-application.ts b/mana/apps/docs/src/application-react/file/file-application.ts deleted file mode 100644 index 599023ec..00000000 --- a/mana/apps/docs/src/application-react/file/file-application.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ApplicationContribution, ViewManager, ViewStorage } from '@difizen/mana-app'; -import { inject, singleton } from '@difizen/mana-app'; -import { URI } from '@difizen/mana-app'; - -import { FileView } from './file-view/index.js'; - -@singleton({ contrib: ApplicationContribution }) -export class FileApplication implements ApplicationContribution { - protected readonly viewManager: ViewManager; - readonly viewStorage: ViewStorage; - - constructor( - @inject(ViewManager) viewManager: ViewManager, - @inject(ViewStorage) viewStorage: ViewStorage, - ) { - this.viewManager = viewManager; - this.viewStorage = viewStorage; - } - - async onViewStart() { - const view = await this.viewManager.getOrCreateView(FileView); - if (!this.viewStorage.canStoreView) { - view.model.rootVisible = false; - view.model.location = new URI('file:///'); - } - } -} diff --git a/mana/apps/docs/src/application-react/file/file-open-handler.ts b/mana/apps/docs/src/application-react/file/file-open-handler.ts deleted file mode 100644 index 96c093d3..00000000 --- a/mana/apps/docs/src/application-react/file/file-open-handler.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import type { URI } from '@difizen/mana-app'; -import type { ViewOpenHandlerOptions } from '@difizen/mana-app'; -import { Priority } from '@difizen/mana-app'; -import { OpenHandler } from '@difizen/mana-app'; -import { NavigatableViewOpenHandler } from '@difizen/mana-app'; -import { singleton } from '@difizen/mana-app'; - -import type { ContentView } from '../content/index.js'; -import { WorkbenchLayoutArea } from '../workbench/layout/workbench-layout.js'; - -@singleton({ contrib: OpenHandler }) -export class FileOpenHandler extends NavigatableViewOpenHandler { - id = 'content-view'; - - canHandle(uri: URI, options?: ViewOpenHandlerOptions) { - if (uri.scheme === 'file') { - return Priority.PRIOR; - } - return Priority.IDLE; - } - - override async open(uri: URI, options?: ViewOpenHandlerOptions) { - return super.open(uri, { - slot: WorkbenchLayoutArea.main, - viewOptions: { - path: uri.path.toString(), - }, - reveal: true, - ...options, - }); - } -} diff --git a/mana/apps/docs/src/application-react/file/file-protocol.ts b/mana/apps/docs/src/application-react/file/file-protocol.ts deleted file mode 100644 index bf8672b1..00000000 --- a/mana/apps/docs/src/application-react/file/file-protocol.ts +++ /dev/null @@ -1,31 +0,0 @@ -export enum FileType { - Unknown = 0, - File = 1, - Directory = 2, - SymbolicLink = 64, -} -export type DirItem = [string, FileType]; - -export interface Stat { - dev: number; - mode: number; - nlink: number; - uid: number; - gid: number; - rdev: number; - blksize: number; - ino: number; - size: number; - blocks: number; - atimeMs: number; - mtimeMs: number; - ctimeMs: number; - birthtimeMs: number; - atime: string; - mtime: string; - ctime: string; - birthtime: string; - isDirectory: boolean; - isFile: boolean; - isSymbolicLink: boolean; -} diff --git a/mana/apps/docs/src/application-react/file/file-view/file-view.tsx b/mana/apps/docs/src/application-react/file/file-view/file-view.tsx deleted file mode 100644 index de8bc2fa..00000000 --- a/mana/apps/docs/src/application-react/file/file-view/file-view.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import type { TreeNode } from '@difizen/mana-app'; -import { CommandRegistry, view, SelectionService } from '@difizen/mana-app'; -import { URI } from '@difizen/mana-app'; -import { TreeViewComponent } from '@difizen/mana-app'; -import { isOSX, FileTreeModel } from '@difizen/mana-app'; -import { - FileTreeView, - TreeProps, - TreeViewDecorator, - LabelProvider, - TreeDecoratorService, - FileStatNode, - FileTreeViewModule, -} from '@difizen/mana-app'; -import { singleton, inject } from '@difizen/mana-app'; -import React, { forwardRef } from 'react'; - -import { FileOpenHandler } from '../file-open-handler.js'; - -import styles from './index.module.less'; - -export const FileViewFactoryId = '1-mana-file-tree'; -export const FileTreeComponent = forwardRef( - function FileTreeComponent(props, containerRef: React.ForwardedRef) { - return ( -
-
文件
-
- -
-
- ); - }, -); -@singleton() -@view(FileViewFactoryId, FileTreeViewModule) -export class FileView extends FileTreeView { - override id = FileViewFactoryId; - // view = FileTreeComponent as any; - protected command: CommandRegistry; - override readonly props: TreeProps; - override readonly model: FileTreeModel; - override readonly treeViewDecorator: TreeViewDecorator; - override readonly selectionService: SelectionService; - protected readonly fileOpenHandler: FileOpenHandler; - override readonly labelProvider: LabelProvider; - protected override readonly decoratorService: TreeDecoratorService; - - constructor( - @inject(CommandRegistry) command: CommandRegistry, - @inject(TreeProps) props: TreeProps, - @inject(FileTreeModel) model: FileTreeModel, - @inject(TreeViewDecorator) treeViewDecorator: TreeViewDecorator, - @inject(SelectionService) selectionService: SelectionService, - @inject(FileOpenHandler) fileOpenHandler: FileOpenHandler, - @inject(LabelProvider) labelProvider: LabelProvider, - @inject(TreeDecoratorService) - decoratorService: TreeDecoratorService, - ) { - super( - props, - model, - treeViewDecorator, - selectionService, - labelProvider, - decoratorService, - ); - this.command = command; - this.props = props; - this.model = model; - this.treeViewDecorator = treeViewDecorator; - this.selectionService = selectionService; - this.fileOpenHandler = fileOpenHandler; - this.labelProvider = labelProvider; - this.decoratorService = decoratorService; - - this.toDispose.push(this.model.onOpenNode(this.openNode)); - this.className += ` ${styles.fileTree}`; - } - - openNode = (treeNode: TreeNode) => { - if (FileStatNode.is(treeNode) && treeNode.fileStat.isFile) { - this.fileOpenHandler.open(new URI(treeNode.uri.toString())); - } - }; - override handleClickEvent( - node: TreeNode | undefined, - event: React.MouseEvent, - ): void { - const modifierKeyCombined: boolean = isOSX - ? event.shiftKey || event.metaKey - : event.shiftKey || event.ctrlKey; - if (!modifierKeyCombined && node && FileStatNode.is(node) && node.fileStat.isFile) { - this.model.openNode(node); - } - super.handleClickEvent(node, event); - } -} diff --git a/mana/apps/docs/src/application-react/file/file-view/index.module.less b/mana/apps/docs/src/application-react/file/file-view/index.module.less deleted file mode 100644 index ef7d812e..00000000 --- a/mana/apps/docs/src/application-react/file/file-view/index.module.less +++ /dev/null @@ -1,7 +0,0 @@ -.fileTree { - height: 100%; - - .content { - height: calc(100% - 48px); - } -} diff --git a/mana/apps/docs/src/application-react/file/file-view/index.ts b/mana/apps/docs/src/application-react/file/file-view/index.ts deleted file mode 100644 index a38c2828..00000000 --- a/mana/apps/docs/src/application-react/file/file-view/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './file-view.js'; diff --git a/mana/apps/docs/src/application-react/file/index.ts b/mana/apps/docs/src/application-react/file/index.ts deleted file mode 100644 index df93648b..00000000 --- a/mana/apps/docs/src/application-react/file/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { createViewPreference, ManaModule } from '@difizen/mana-app'; -import { FileTreeModule } from '@difizen/mana-app'; - -import { WorkbenchLayoutArea } from '../workbench/layout/workbench-layout.js'; - -import { FileApplication } from './file-application.js'; -import { FileOpenHandler } from './file-open-handler.js'; -import { FileView } from './file-view/index.js'; - -export const FileModule = ManaModule.create() - .register( - FileView, - FileApplication, - FileOpenHandler, - createViewPreference({ - view: FileView, - autoCreate: true, - slot: WorkbenchLayoutArea.left, - }), - ) - .dependOn(FileTreeModule); diff --git a/mana/apps/docs/src/application-react/index.module.less b/mana/apps/docs/src/application-react/index.module.less deleted file mode 100644 index 8cdcde8c..00000000 --- a/mana/apps/docs/src/application-react/index.module.less +++ /dev/null @@ -1,3 +0,0 @@ -.appContainer { - height: (100vh - 256px); -} diff --git a/mana/apps/docs/src/application-react/index.tsx b/mana/apps/docs/src/application-react/index.tsx deleted file mode 100644 index 4615eb2b..00000000 --- a/mana/apps/docs/src/application-react/index.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { ManaComponents } from '@difizen/mana-app'; -import { ManaAppPreset, Loading } from '@difizen/mana-app'; -import { langBundles, l10n, L10nLang } from '@difizen/mana-l10n'; - -import { AntdMenuModule } from './antd-menu/index.js'; -import { CommandPalette } from './command-palette/index.js'; -import { ContentModule } from './content/index.js'; -import { FileModule } from './file/index.js'; -import styles from './index.module.less'; -import { LogoModule } from './logo/index.js'; -import { ConfigurtionMenuModule } from './setting-editor/index.js'; -import { ThemeSwitcherModule } from './theme-switcher/index.js'; -import { UerModule } from './user/index.js'; -import { WorkbenchModule } from './workbench/index.js'; - -l10n.loadLangBundles(langBundles); -l10n.changeLang(L10nLang.enUS); - -export default function App(): JSX.Element { - return ( -
- } - /> -
- ); -} diff --git a/mana/apps/docs/src/application-react/logo/index.module.less b/mana/apps/docs/src/application-react/logo/index.module.less deleted file mode 100644 index 8bbf2b5e..00000000 --- a/mana/apps/docs/src/application-react/logo/index.module.less +++ /dev/null @@ -1,16 +0,0 @@ -.logo { - display: flex; - align-items: center; - height: 48px; - - img { - width: 32px; - height: 32px; - margin: 0 8px; - } - - span { - font-weight: 400; - font-size: 16px; - } -} diff --git a/mana/apps/docs/src/application-react/logo/index.ts b/mana/apps/docs/src/application-react/logo/index.ts deleted file mode 100644 index d9580017..00000000 --- a/mana/apps/docs/src/application-react/logo/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { createViewPreference, ManaModule } from '@difizen/mana-app'; -import { HeaderArea } from '@difizen/mana-app'; -import { Priority } from '@difizen/mana-app'; - -import { LogoView } from './logo-view.js'; - -export const LogoModule = ManaModule.create().register( - LogoView, - createViewPreference({ - view: LogoView, - autoCreate: true, - slot: HeaderArea.left, - priority: Priority.DEFAULT, - }), -); diff --git a/mana/apps/docs/src/application-react/logo/logo-view.tsx b/mana/apps/docs/src/application-react/logo/logo-view.tsx deleted file mode 100644 index df19d621..00000000 --- a/mana/apps/docs/src/application-react/logo/logo-view.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { BaseView, view } from '@difizen/mana-app'; -import { singleton } from '@difizen/mana-app'; -import * as React from 'react'; - -import styles from './index.module.less'; -import manaLogo from './mana.svg'; - -export const Logo = React.forwardRef(function Logo( - props, - ref: React.ForwardedRef, -) { - return ( -
- - - - Mana-Workbench -
- ); -}); - -@singleton() -@view('logo-view') -export class LogoView extends BaseView { - override view = Logo; -} diff --git a/mana/apps/docs/src/application-react/logo/mana.svg b/mana/apps/docs/src/application-react/logo/mana.svg deleted file mode 100644 index b802c8b9..00000000 --- a/mana/apps/docs/src/application-react/logo/mana.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mana/apps/docs/src/application-react/setting-editor/configs.ts b/mana/apps/docs/src/application-react/setting-editor/configs.ts deleted file mode 100644 index d8b95849..00000000 --- a/mana/apps/docs/src/application-react/setting-editor/configs.ts +++ /dev/null @@ -1,160 +0,0 @@ -import type { ConfigurationNode } from '@difizen/mana-app'; -import { LocalConfigurationStorage } from '@difizen/mana-app'; -import { l10n } from '@difizen/mana-l10n'; - -export const FontSize: ConfigurationNode = { - id: 'libro.user.codeeditor.fontsize', - description: l10n.t('代码编辑区域字体大小'), - title: l10n.t('代码字号'), - type: 'inputnumber', - defaultValue: 13, - schema: { - type: 'number', - }, -}; - -export const LineHeight: ConfigurationNode = { - id: 'libro.user.codeeditor.lineheight', - description: l10n.t('代码编辑区域字体行高'), - title: l10n.t('代码行高'), - type: 'inputnumber', - defaultValue: 20, - schema: { - type: 'number', - }, -}; - -export const TabSize: ConfigurationNode = { - id: 'libro.user.codeeditor.tabsize', - description: l10n.t('tab转换为几个空格大小'), - title: l10n.t('tab大小'), - type: 'inputnumber', - defaultValue: 4, - schema: { - type: 'number', - }, -}; - -export const InsertSpaces: ConfigurationNode = { - id: 'libro.user.codeeditor.insertspaces', - description: l10n.t('输入tab是否转换为空格'), - title: l10n.t('tab转空格'), - type: 'checkbox', - defaultValue: true, - schema: { - type: 'boolean', - }, -}; - -export const LineWarp: ConfigurationNode<'wordWrapColumn' | 'off' | 'on' | 'bounded'> = - { - id: 'libro.user.codeeditor.linewarp', - description: l10n.t(`自动换行策略: - - "off", lines will never wrap. - - "on", lines will wrap at the viewport border. - - "wordWrapColumn", lines will wrap at 'wordWrapColumn'. - - "bounded", lines will wrap at minimum between viewport width and wordWrapColumn.`), - title: l10n.t('自动换行'), - type: 'select', - defaultValue: 'off', - schema: { - type: 'string', - enum: ['off', 'on', 'wordWrapColumn', 'bounded'], - }, - }; - -export const WordWrapColumn: ConfigurationNode = { - id: 'libro.user.codeeditor.wordWrapColumn', - description: l10n.t('开启自动换行后,自动换行的列数'), - title: l10n.t('自动换行列数'), - type: 'inputnumber', - defaultValue: 80, - schema: { - type: 'number', - }, -}; - -export const LSPEnabled: ConfigurationNode = { - id: 'libro.user.codeeditor.lspenabled', - description: l10n.t( - '开启语言服务后,编辑器能提供更多辅助编码能力,包括:自动提示、代码诊断、hover提示、格式化、代码跳转、重命名等等', - ), - title: l10n.t('开启语言服务'), - type: 'checkbox', - defaultValue: false, - schema: { - type: 'boolean', - }, -}; - -export const DemoStringConfig: ConfigurationNode = { - id: 'test.demostring', - description: 'input string', - title: 'input', - type: 'input', - defaultValue: 'this value stored in localstorage', - schema: { - type: 'string', - }, - storage: LocalConfigurationStorage, -}; - -export const DemoNumberConfig: ConfigurationNode = { - id: 'test.demonumber', - description: 'input a number', - title: 'inputnumber', - type: 'inputnumber', - defaultValue: 5, - schema: { - type: 'integer', - minimum: 0, - maximum: 10, - }, -}; - -export const DemoBooleanConfig: ConfigurationNode = { - id: 'test.democheckbox', - description: 'select checkbox', - title: 'checkbox', - type: 'checkbox', - defaultValue: false, - schema: { - type: 'boolean', - }, -}; - -export const mockOptions = ['banana', 'grapes', 'orange']; - -export const DemoSelectConfig: ConfigurationNode = { - id: 'test.demoselect', - description: 'select an option', - title: 'select', - type: 'select', - defaultValue: 'banana', - schema: { - type: 'string', - enum: mockOptions, - }, -}; - -export const DemoSwitchConfig: ConfigurationNode = { - id: 'test.demoswitch', - description: 'switch it', - title: 'switch', - type: 'switch', - defaultValue: false, - schema: { - type: 'boolean', - }, -}; - -export const DemoDateConfig: ConfigurationNode = { - id: 'test.datepicker', - description: 'select date', - title: 'datepicker', - type: 'datepicker', - defaultValue: '2022/10/1', - schema: { - type: 'string', - }, -}; diff --git a/mana/apps/docs/src/application-react/setting-editor/default-configuration-contribution.tsx b/mana/apps/docs/src/application-react/setting-editor/default-configuration-contribution.tsx deleted file mode 100644 index 311de1a4..00000000 --- a/mana/apps/docs/src/application-react/setting-editor/default-configuration-contribution.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import type { ConfigurationNode } from '@difizen/mana-app'; -import { inject, singleton } from '@difizen/mana-app'; -import { - ConfigurationContribution, - ConfigurationService, - ApplicationContribution, -} from '@difizen/mana-app'; - -import { - DemoBooleanConfig, - DemoDateConfig, - DemoNumberConfig, - DemoSelectConfig, - DemoStringConfig, - DemoSwitchConfig, - FontSize, - InsertSpaces, - LineHeight, - LineWarp, - LSPEnabled, - TabSize, - WordWrapColumn, -} from './configs.js'; - -@singleton({ contrib: [ConfigurationContribution, ApplicationContribution] }) -export class DefaultConfigurationContribution - implements ConfigurationContribution, ApplicationContribution -{ - @inject(ConfigurationService) - protected readonly configurationService: ConfigurationService; - - async onViewStart() { - /** - * 改变初始配置 - */ - // await this.configurationService.set(DemoBooleanConfig, true); - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - registerConfigurations(): ConfigurationNode[] { - return [ - FontSize, - TabSize, - InsertSpaces, - LineHeight, - LineWarp, - WordWrapColumn, - LSPEnabled, - DemoStringConfig, - DemoNumberConfig, - DemoBooleanConfig, - DemoSelectConfig, - DemoSwitchConfig, - DemoDateConfig, - ]; - } -} diff --git a/mana/apps/docs/src/application-react/setting-editor/index.ts b/mana/apps/docs/src/application-react/setting-editor/index.ts deleted file mode 100644 index 6dbf31cd..00000000 --- a/mana/apps/docs/src/application-react/setting-editor/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { createViewPreference, ManaModule } from '@difizen/mana-app'; -import { - SettingEditorModule, - SettingEditorView, -} from '@difizen/mana-configuration-panel'; - -import { WorkbenchLayoutArea } from '../workbench/layout/workbench-layout.js'; - -import { DefaultConfigurationContribution } from './default-configuration-contribution.js'; - -export const ConfigurtionMenuModule = ManaModule.create() - .register( - SettingEditorView, - createViewPreference({ - view: SettingEditorView, - slot: WorkbenchLayoutArea.main, - autoCreate: true, - }), - ) - .register(DefaultConfigurationContribution) - .dependOn(SettingEditorModule); diff --git a/mana/apps/docs/src/application-react/theme-switcher/index.ts b/mana/apps/docs/src/application-react/theme-switcher/index.ts deleted file mode 100644 index 3cec889d..00000000 --- a/mana/apps/docs/src/application-react/theme-switcher/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { createViewPreference, ManaModule } from '@difizen/mana-app'; -import { HeaderArea } from '@difizen/mana-app'; -import { Priority } from '@difizen/mana-app'; - -import { StorageViewSwitchView } from './storage-view/index.js'; -import { ThemeSelectView } from './theme-select-view/index.js'; - -export const ThemeSwitcherModule = ManaModule.create().register( - ThemeSelectView, - createViewPreference({ - view: ThemeSelectView, - autoCreate: true, - slot: HeaderArea.right, - priority: Priority.DEFAULT, - openOptions: { - order: 'a1', - }, - }), - StorageViewSwitchView, - createViewPreference({ - view: StorageViewSwitchView, - autoCreate: true, - slot: HeaderArea.right, - priority: Priority.DEFAULT, - openOptions: { - order: 'a2', - }, - }), -); diff --git a/mana/apps/docs/src/application-react/theme-switcher/storage-view/index.tsx b/mana/apps/docs/src/application-react/theme-switcher/storage-view/index.tsx deleted file mode 100644 index 8532816d..00000000 --- a/mana/apps/docs/src/application-react/theme-switcher/storage-view/index.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { BaseView, view, ViewInstance } from '@difizen/mana-app'; -import { singleton, inject } from '@difizen/mana-app'; -import { useInject } from '@difizen/mana-app'; -import { ViewStorage } from '@difizen/mana-app'; -import { Switch } from 'antd'; -import * as React from 'react'; - -export const StorageViewSwitch: React.ForwardRefExoticComponent = React.forwardRef( - function StorageViewSwitch(props, ref: React.ForwardedRef) { - const viewInstance = useInject(ViewInstance); - const viewStorage = useInject(ViewStorage); - return ( -
- viewInstance.change(val)} - /> -
- ); - }, -); - -@singleton() -@view('view-storage-switch') -export class StorageViewSwitchView extends BaseView { - override view = StorageViewSwitch; - readonly viewStorage: ViewStorage; - constructor( - @inject(ViewStorage) - viewStorage: ViewStorage, - ) { - super(); - this.viewStorage = viewStorage; - } - - change(val: boolean) { - if (val) { - this.viewStorage.enableStoreView(); - } else { - this.viewStorage.disableStoreView(); - } - } -} diff --git a/mana/apps/docs/src/application-react/theme-switcher/theme-select-view/index.module.less b/mana/apps/docs/src/application-react/theme-switcher/theme-select-view/index.module.less deleted file mode 100644 index 8ec7ec61..00000000 --- a/mana/apps/docs/src/application-react/theme-switcher/theme-select-view/index.module.less +++ /dev/null @@ -1,3 +0,0 @@ -.themeSelect { - margin-left: 8px !important; -} diff --git a/mana/apps/docs/src/application-react/theme-switcher/theme-select-view/index.tsx b/mana/apps/docs/src/application-react/theme-switcher/theme-select-view/index.tsx deleted file mode 100644 index a8a4ff29..00000000 --- a/mana/apps/docs/src/application-react/theme-switcher/theme-select-view/index.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { BaseView, view, ViewInstance } from '@difizen/mana-app'; -import { singleton, inject } from '@difizen/mana-app'; -import { prop, useInject } from '@difizen/mana-app'; -import { ThemeService } from '@difizen/mana-app'; -import type { Theme } from '@difizen/mana-app'; -import { Select } from 'antd'; -import * as React from 'react'; - -import styles from './index.module.less'; - -export const ThemeSelect: React.ForwardRefExoticComponent = React.forwardRef( - function ThemeSelect(props, ref: React.ForwardedRef) { - const viewInstance = useInject(ViewInstance); - return ( -
- -
- ); - }, -); - -@singleton() -@view('theme-select') -export class ThemeSelectView extends BaseView { - override view = ThemeSelect; - - @prop() - public currentTheme: Theme; - - @prop() - public themes: Theme[] = []; - - protected readonly themeService: ThemeService; - - constructor( - @inject(ThemeService) - themeService: ThemeService, - ) { - super(); - this.themeService = themeService; - this.themes = themeService.getThemes(); - this.currentTheme = themeService.getCurrentTheme(); - } - - changeCurrentTheme(themeId: string) { - const theme = this.themes.find((item) => item.id === themeId); - if (theme) { - this.themeService.setCurrentTheme(themeId); - this.currentTheme = theme; - } - } -} diff --git a/mana/apps/docs/src/application-react/user/index.ts b/mana/apps/docs/src/application-react/user/index.ts deleted file mode 100644 index 815566b8..00000000 --- a/mana/apps/docs/src/application-react/user/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { createViewPreference, ManaModule } from '@difizen/mana-app'; -import { HeaderArea } from '@difizen/mana-app'; -import { Priority } from '@difizen/mana-app'; - -import { UserAvatarView } from './user-avatar-view/index.js'; - -export const UerModule = ManaModule.create().register( - UserAvatarView, - createViewPreference({ - view: UserAvatarView, - autoCreate: true, - slot: HeaderArea.right, - priority: Priority.DEFAULT, - openOptions: { - order: 'a0', - }, - }), -); diff --git a/mana/apps/docs/src/application-react/user/user-avatar-view/index.module.less b/mana/apps/docs/src/application-react/user/user-avatar-view/index.module.less deleted file mode 100644 index bf6a05cf..00000000 --- a/mana/apps/docs/src/application-react/user/user-avatar-view/index.module.less +++ /dev/null @@ -1,3 +0,0 @@ -.user { - position: relative; -} diff --git a/mana/apps/docs/src/application-react/user/user-avatar-view/index.tsx b/mana/apps/docs/src/application-react/user/user-avatar-view/index.tsx deleted file mode 100644 index 50f24197..00000000 --- a/mana/apps/docs/src/application-react/user/user-avatar-view/index.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { UserOutlined } from '@ant-design/icons'; -import { singleton } from '@difizen/mana-app'; -import { ACCOUNTS_MENU, BaseView, view } from '@difizen/mana-app'; -import { Avatar } from 'antd'; -// import { Dropdown } from '@difizen/mana-react'; -import { Dropdown } from 'antd'; -import * as React from 'react'; -import { forwardRef } from 'react'; - -import { MenuRender } from '../../workbench/menu/render.js'; - -import styles from './index.module.less'; - -export const UserAvatar: React.ForwardRefExoticComponent = forwardRef( - function UserAvatar(props, ref: React.ForwardedRef) { - return ( -
- }> - } /> - -
- ); - }, -); - -@singleton() -@view('user-avatar') -export class UserAvatarView extends BaseView { - override view = UserAvatar; -} diff --git a/mana/apps/docs/src/application-react/workbench/command/common-command.ts b/mana/apps/docs/src/application-react/workbench/command/common-command.ts deleted file mode 100644 index 4d8e06c7..00000000 --- a/mana/apps/docs/src/application-react/workbench/command/common-command.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-disable max-len, @typescript-eslint/indent */ -import type { Command } from '@difizen/mana-app'; -import { inject, singleton } from '@difizen/mana-app'; -import { CommandContribution, CommandRegistry } from '@difizen/mana-app'; - -export namespace CommonCommands { - export const ABOUT_COMMAND: Command = { - id: 'core.about', - label: 'About', - }; -} - -@singleton({ contrib: [CommandContribution] }) -export class CommonCommand implements CommandContribution { - protected readonly commandRegistry: CommandRegistry; - - constructor(@inject(CommandRegistry) commandRegistry: CommandRegistry) { - this.commandRegistry = commandRegistry; - } - registerCommands(command: CommandRegistry): void { - command.registerCommand(CommonCommands.ABOUT_COMMAND, { - execute: () => { - // console.log('execute about command'); - }, - }); - } -} diff --git a/mana/apps/docs/src/application-react/workbench/index.ts b/mana/apps/docs/src/application-react/workbench/index.ts deleted file mode 100644 index 9030a782..00000000 --- a/mana/apps/docs/src/application-react/workbench/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - ManaModule, - createSlotPreference, - createViewPreference, -} from '@difizen/mana-app'; -import { Priority } from '@difizen/mana-app'; -import { SideTabView, HeaderView, CardTabView, HeaderArea } from '@difizen/mana-app'; -import { RootSlotId } from '@difizen/mana-app'; - -import { CommonCommand } from './command/common-command.js'; -import { AppLayoutView, AppLayoutArea } from './layout/app-layout.js'; -import { WorkbenchLayoutArea, WorkbenchLayoutView } from './layout/workbench-layout.js'; -import { CommonMenu } from './menu/common-menu.js'; -import { MenuBarView } from './menu/menu-bar-view.js'; - -export const WorkbenchModule = ManaModule.create().register( - CommonCommand, - AppLayoutView, - - MenuBarView, - CommonMenu, - createViewPreference({ - view: MenuBarView, - slot: HeaderArea.middle, - autoCreate: true, - }), - createSlotPreference({ - slot: RootSlotId, - view: AppLayoutView, - }), - createSlotPreference({ - slot: AppLayoutArea.header, - view: HeaderView, - }), - WorkbenchLayoutView, - createSlotPreference({ - slot: AppLayoutArea.content, - view: WorkbenchLayoutView, - }), - createSlotPreference({ - slot: WorkbenchLayoutArea.left, - view: SideTabView, - priority: Priority.DEFAULT, - }), - createSlotPreference({ - slot: WorkbenchLayoutArea.right, - view: SideTabView, - priority: Priority.DEFAULT, - options: { - tabPosition: 'right', - }, - }), - createSlotPreference({ - slot: WorkbenchLayoutArea.main, - view: CardTabView, - priority: Priority.DEFAULT, - }), -); diff --git a/mana/apps/docs/src/application-react/workbench/layout/app-layout.tsx b/mana/apps/docs/src/application-react/workbench/layout/app-layout.tsx deleted file mode 100644 index 87083425..00000000 --- a/mana/apps/docs/src/application-react/workbench/layout/app-layout.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { singleton } from '@difizen/mana-app'; -import { Slot, DefaultSlotView, view } from '@difizen/mana-app'; -import { BoxPanel } from '@difizen/mana-react'; -import React from 'react'; - -import styles from './index.module.less'; - -export enum AppLayoutArea { - header = 'header', - content = 'content', -} - -const BaseLayout: React.ForwardRefExoticComponent = React.forwardRef( - function BaseLayout(props, ref: React.ForwardedRef) { - return ( - - - - - - - - - ); - }, -); - -@singleton() -@view('app-layout') -export class AppLayoutView extends DefaultSlotView { - override view = BaseLayout; -} diff --git a/mana/apps/docs/src/application-react/workbench/layout/index.module.less b/mana/apps/docs/src/application-react/workbench/layout/index.module.less deleted file mode 100644 index 6a868711..00000000 --- a/mana/apps/docs/src/application-react/workbench/layout/index.module.less +++ /dev/null @@ -1,24 +0,0 @@ -.workbench { - width: 100%; - height: 100%; - - .content { - height: 100%; - - .splitContent { - height: 100%; - } - } -} - -.left { - border-right: 1px solid #e5e9ed; -} - -.bottom { - border-top: 1px solid #e5e9ed; -} - -.right { - border-left: 1px solid #e5e9ed; -} diff --git a/mana/apps/docs/src/application-react/workbench/layout/workbench-layout.tsx b/mana/apps/docs/src/application-react/workbench/layout/workbench-layout.tsx deleted file mode 100644 index fc0704f7..00000000 --- a/mana/apps/docs/src/application-react/workbench/layout/workbench-layout.tsx +++ /dev/null @@ -1,46 +0,0 @@ -/* eslint-disable @typescript-eslint/no-use-before-define */ -import { singleton } from '@difizen/mana-app'; -import { Slot, DefaultSlotView, view } from '@difizen/mana-app'; -import { SplitPanel } from '@difizen/mana-react'; -import React from 'react'; - -import styles from './index.module.less'; - -export enum WorkbenchLayoutArea { - left = 'workbench-left', - main = 'workbench-main', - bottom = 'workbench-bottom', - right = 'workbench-right', -} - -const WorkbenchLayout = React.forwardRef(function WorkbenchLayout( - props, - ref: React.ForwardedRef, -) { - return ( - - - - - - - - - - - - - - - - - - - ); -}); - -@singleton() -@view('base-layout') -export class WorkbenchLayoutView extends DefaultSlotView { - override view = WorkbenchLayout; -} diff --git a/mana/apps/docs/src/application-react/workbench/menu/common-menu.ts b/mana/apps/docs/src/application-react/workbench/menu/common-menu.ts deleted file mode 100644 index 70cf39b7..00000000 --- a/mana/apps/docs/src/application-react/workbench/menu/common-menu.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* eslint-disable max-len, @typescript-eslint/indent */ - -import type { MenuRegistry } from '@difizen/mana-app'; -import { singleton } from '@difizen/mana-app'; -import { SETTINGS_MENU, MAIN_MENU_BAR } from '@difizen/mana-app'; -import { MenuContribution } from '@difizen/mana-app'; - -import { CommonCommands } from '../command/common-command.js'; - -export namespace CommonMenus { - export const SETTING = [...MAIN_MENU_BAR, '5_settings']; - export const VIEW = [...MAIN_MENU_BAR, '4_view']; - export const HELP = [...MAIN_MENU_BAR, '9_help']; - - export const SETTINGS_OPEN = [...SETTINGS_MENU, '1_settings_open']; - export const SETTINGS__THEME = [...SETTINGS_MENU, '2_settings_theme']; -} - -@singleton({ contrib: [MenuContribution] }) -export class CommonMenu implements MenuContribution { - registerMenus(menu: MenuRegistry) { - menu.registerSubmenu(CommonMenus.HELP, { label: '帮助' }); - menu.registerSubmenu(CommonMenus.SETTING, { label: '设置' }); - menu.registerSubmenu(CommonMenus.VIEW, { label: '查看' }); - menu.registerMenuAction(CommonMenus.HELP, { - id: CommonCommands.ABOUT_COMMAND.id, - command: CommonCommands.ABOUT_COMMAND.id, - label: '关于', - }); - } -} diff --git a/mana/apps/docs/src/application-react/workbench/menu/mana-menubar/index.tsx b/mana/apps/docs/src/application-react/workbench/menu/mana-menubar/index.tsx deleted file mode 100644 index 37054866..00000000 --- a/mana/apps/docs/src/application-react/workbench/menu/mana-menubar/index.tsx +++ /dev/null @@ -1,75 +0,0 @@ -/* eslint-disable @typescript-eslint/no-use-before-define */ -import { - MenuRegistry, - ActionMenuItem, - renderNode, - GeneralMenuItem, -} from '@difizen/mana-app'; -import { useInject } from '@difizen/mana-app'; -import type { MenuNode, MenuPath, MenuItem } from '@difizen/mana-app'; -import { Menubar, Menu } from '@difizen/mana-react'; -import * as React from 'react'; -import type { ReactNode } from 'react'; - -export interface MenuProps { - path?: MenuPath; -} - -export interface MenuItemProps { - node: MenuItem; -} - -export const ManaMenubar = (props: MenuProps) => { - const { path = [] } = props; - const menu = useInject(MenuRegistry); - const node = menu.getMenu(path); - const renderMenuItem = (menuNode: MenuNode): JSX.Element | React.ReactFragment => { - if (ActionMenuItem.is(menuNode)) { - return {menuNode.label as ReactNode}; - } - if (GeneralMenuItem.is(menuNode)) { - if (menuNode.isSubmenu) { - return ( - - {renderMenuList(menuNode.children, true)} - - ); - } - return renderMenuList(menuNode.children, true); - } - return {menuNode.label as ReactNode}; - }; - - const renderMenuList = (list: readonly MenuItem[], inMenu = false) => { - const childNodes: React.ReactNode[] = []; - list.forEach((child, index) => { - if (GeneralMenuItem.is(child)) { - if (index !== 0) { - childNodes.push(); - } - } else if (list[index - 1] && GeneralMenuItem.is(list[index - 1])) { - childNodes.push(); - } - childNodes.push(renderMenuItem(child)); - }); - if (inMenu) { - return childNodes; - } - return {childNodes}; - }; - return ( - - {GeneralMenuItem.is(node) && - node.children.map((child) => { - if (GeneralMenuItem.is(child)) { - return ( - - {renderMenuList(child.children)} - - ); - } - return ; - })} - - ); -}; diff --git a/mana/apps/docs/src/application-react/workbench/menu/menu-bar-view.tsx b/mana/apps/docs/src/application-react/workbench/menu/menu-bar-view.tsx deleted file mode 100644 index f347d63f..00000000 --- a/mana/apps/docs/src/application-react/workbench/menu/menu-bar-view.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { MacCommandOutlined } from '@ant-design/icons'; -import { BaseView, view } from '@difizen/mana-app'; -import { singleton } from '@difizen/mana-app'; -import { prop } from '@difizen/mana-app'; -import { MenuBarRender, MAIN_MENU_BAR } from '@difizen/mana-app'; -import * as React from 'react'; - -export const ManaMenubarComponent = React.forwardRef(function ManaMenubarComponent( - props, - ref: React.ForwardedRef, -) { - return ( -
- -
- ); -}); - -@singleton() -@view('MenuBarView') -export class MenuBarView extends BaseView { - override view = ManaMenubarComponent; - @prop() - count = 0; - constructor() { - super(); - this.title.icon = MacCommandOutlined; - this.title.label = '菜单'; - this.id = 'menu-bar'; - } -} diff --git a/mana/apps/docs/src/application-react/workbench/menu/render.tsx b/mana/apps/docs/src/application-react/workbench/menu/render.tsx deleted file mode 100644 index 8f736965..00000000 --- a/mana/apps/docs/src/application-react/workbench/menu/render.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { - MenuRegistry, - GeneralMenuItem, - ActionMenuItem, - CommandRegistry, -} from '@difizen/mana-app'; -import { useInject } from '@difizen/mana-app'; -import type { MenuNode, MenuPath, MenuItem } from '@difizen/mana-app'; -import { Menu } from 'antd'; -import type { ReactNode } from 'react'; - -export interface MenuProps { - path?: MenuPath; - mode?: MenuNode; -} - -export interface MenuItemProps { - node: MenuItem; -} - -export const MenuRender = (props: MenuProps) => { - const { path = [], mode } = props; - const menu = useInject(MenuRegistry); - const command = useInject(CommandRegistry); - const node = menu.getMenu(path); - const renderMenuItem = (menuNode: MenuNode) => { - const renderMenuList = (list: readonly MenuNode[]) => { - return list.map((child) => { - if (GeneralMenuItem.is(child)) { - return renderMenuItem(child); - } - if (ActionMenuItem.is(child)) { - return {child.label as ReactNode}; - } - return null; - }); - }; - if (GeneralMenuItem.is(menuNode)) { - if (menuNode.isSubmenu) { - return ( - - {renderMenuList(menuNode.children)} - - ); - } - return ( - - {renderMenuList(menuNode.children)} - - ); - } - if (ActionMenuItem.is(menuNode)) { - return {menuNode.label as ReactNode}; - } - return {menuNode.label as ReactNode}; - }; - return ( - { - command.executeCommand(e.key); - }} - mode={mode as any} - > - {GeneralMenuItem.is(node) && node.children.map((child) => renderMenuItem(child))} - - ); -}; diff --git a/mana/apps/docs/src/command/simple/command.ts b/mana/apps/docs/src/command/simple/command.ts deleted file mode 100644 index 7f826586..00000000 --- a/mana/apps/docs/src/command/simple/command.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { PlusOutlined, MinusOutlined } from '@ant-design/icons'; -import type { CommandRegistry } from '@difizen/mana-app'; -import { prop } from '@difizen/mana-app'; -import { ManaModule, singleton, CommandContribution } from '@difizen/mana-app'; - -export const CommonCommand = { - INCREASE_COUNT: { - id: 'common.command.increase', - icon: PlusOutlined, - label: 'INCREASE', - }, - DECREACE_COUNT: { - id: 'common.command.decreace', - icon: MinusOutlined, - label: 'DECREACE', - }, -}; - -@singleton({ contrib: CommandContribution }) -export class MyCommand implements CommandContribution { - @prop() count = 0; - - registerCommands(command: CommandRegistry): void { - command.registerCommand(CommonCommand.INCREASE_COUNT, { - execute: () => { - this.count += 1; - }, - isVisible: (data: any) => data instanceof MyCommand, - isEnabled: (data: any) => data instanceof MyCommand && data.count < 10, - }); - command.registerCommandWithContext(CommonCommand.DECREACE_COUNT, this, { - execute: () => { - this.count -= 1; - }, - isVisible: (ctx) => ctx.count > -1, - isEnabled: (ctx) => ctx.count > 0, - }); - } -} - -export const CommonCommandModule = ManaModule.create().register(MyCommand); diff --git a/mana/apps/docs/src/command/simple/index.tsx b/mana/apps/docs/src/command/simple/index.tsx deleted file mode 100644 index df5a7333..00000000 --- a/mana/apps/docs/src/command/simple/index.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { ManaAppPreset, useInject } from '@difizen/mana-app'; -import { CommandRegistry, ManaComponents, ManaModule } from '@difizen/mana-app'; -import { Button, Divider } from 'antd'; - -import { CommonCommand, MyCommand } from './command.js'; - -const BaseModule = ManaModule.create().register(MyCommand); - -const MyCommandRender = () => { - const command = useInject(CommandRegistry); - const myCommand = useInject(MyCommand); - return ( -
- {command.isVisible(CommonCommand.INCREASE_COUNT.id, myCommand) && ( - - )} - - {command.isVisible(CommonCommand.DECREACE_COUNT.id, myCommand) && ( - - )} -
- ); -}; - -const App = (): JSX.Element => { - return ( - - - - ); -}; - -export default App; diff --git a/mana/apps/docs/src/file-tree/file-application.ts b/mana/apps/docs/src/file-tree/file-application.ts deleted file mode 100644 index a6e13be7..00000000 --- a/mana/apps/docs/src/file-tree/file-application.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { URI } from '@difizen/mana-app'; -import { ApplicationContribution, ViewManager, ViewStorage } from '@difizen/mana-app'; -import { inject, singleton } from '@difizen/mana-app'; - -import { FileView } from './file-view/index.js'; - -@singleton({ contrib: ApplicationContribution }) -export class FileApplication implements ApplicationContribution { - protected readonly viewManager: ViewManager; - readonly viewStorage: ViewStorage; - - constructor( - @inject(ViewManager) viewManager: ViewManager, - @inject(ViewStorage) viewStorage: ViewStorage, - ) { - this.viewManager = viewManager; - this.viewStorage = viewStorage; - } - - async onViewStart() { - const view = await this.viewManager.getOrCreateView(FileView); - if (!this.viewStorage.canStoreView) { - view.model.rootVisible = false; - view.model.location = new URI('file:///'); - } - } -} diff --git a/mana/apps/docs/src/file-tree/file-command.tsx b/mana/apps/docs/src/file-tree/file-command.tsx deleted file mode 100644 index dd3c260f..00000000 --- a/mana/apps/docs/src/file-tree/file-command.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import type { CommandRegistry, MenuPath, MenuRegistry } from '@difizen/mana-app'; -import { ViewManager } from '@difizen/mana-app'; -import { - CommandContribution, - FileStatNode, - inject, - MenuContribution, - OpenerService, - singleton, -} from '@difizen/mana-app'; -import { message } from 'antd'; - -import { FileView } from './file-view/index.js'; - -const FileCommands = { - CREATE_FILE: { - id: 'fileTree.command.createfile', - label: '新建文件', - }, - OPEN_FILE: { - id: 'fileTree.command.openfile', - label: '打开', - }, -}; -export const FileTreeContextMenuPath: MenuPath = ['file-tree-context-menu']; - -@singleton({ - contrib: [CommandContribution, MenuContribution], -}) -export class FileCommandContribution implements CommandContribution, MenuContribution { - protected viewManager: ViewManager; - @inject(OpenerService) protected openService!: OpenerService; - fileView?: FileView; - lastAction?: 'COPY' | 'CUT'; - lastActionNode?: FileStatNode; - - constructor(@inject(ViewManager) viewManager: ViewManager) { - this.viewManager = viewManager; - this.viewManager - .getOrCreateView(FileView) - .then((view) => { - this.fileView = view; - return; - }) - .catch(() => { - // - }); - } - - registerMenus(menu: MenuRegistry) { - menu.registerMenuAction(FileTreeContextMenuPath, { - id: FileCommands.OPEN_FILE.id, - command: FileCommands.OPEN_FILE.id, - order: 'a', - }); - menu.registerMenuAction(FileTreeContextMenuPath, { - id: FileCommands.CREATE_FILE.id, - command: FileCommands.CREATE_FILE.id, - order: 'b', - }); - } - registerCommands(command: CommandRegistry): void { - command.registerCommand(FileCommands.OPEN_FILE, { - execute: (node) => { - try { - if (node.fileStat.isFile) { - this.openService - .getOpener(node.uri) - .then((opener) => { - if (opener) { - opener.open(node.uri, { - viewOptions: { - name: node.fileStat.name, - }, - }); - } - return; - }) - .catch((e) => { - throw e; - }); - } - } catch { - message.error('文件打开失败'); - } - }, - isVisible: (node) => { - return FileStatNode.is(node) && node.fileStat.isFile; - }, - }); - - command.registerCommand(FileCommands.CREATE_FILE, { - execute: async (data) => { - let path = this.fileView?.model.location?.path.toString() || '/'; - if (FileStatNode.is(data)) { - path = data.fileStat.isDirectory - ? data.uri.path.toString() - : data.uri.path.dir.toString(); - } - console.info('create file at', path); - }, - }); - } -} diff --git a/mana/apps/docs/src/file-tree/file-protocol.ts b/mana/apps/docs/src/file-tree/file-protocol.ts deleted file mode 100644 index bf8672b1..00000000 --- a/mana/apps/docs/src/file-tree/file-protocol.ts +++ /dev/null @@ -1,31 +0,0 @@ -export enum FileType { - Unknown = 0, - File = 1, - Directory = 2, - SymbolicLink = 64, -} -export type DirItem = [string, FileType]; - -export interface Stat { - dev: number; - mode: number; - nlink: number; - uid: number; - gid: number; - rdev: number; - blksize: number; - ino: number; - size: number; - blocks: number; - atimeMs: number; - mtimeMs: number; - ctimeMs: number; - birthtimeMs: number; - atime: string; - mtime: string; - ctime: string; - birthtime: string; - isDirectory: boolean; - isFile: boolean; - isSymbolicLink: boolean; -} diff --git a/mana/apps/docs/src/file-tree/file-view/file-view.tsx b/mana/apps/docs/src/file-tree/file-view/file-view.tsx deleted file mode 100644 index aaf0592e..00000000 --- a/mana/apps/docs/src/file-tree/file-view/file-view.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import type { TreeNode } from '@difizen/mana-app'; -import { FileTreeViewFactory } from '@difizen/mana-app'; -import { isOSX, FileTreeModel } from '@difizen/mana-app'; -import { - FileTreeView, - TreeProps, - TreeViewDecorator, - LabelProvider, - TreeDecoratorService, - FileStatNode, - FileTreeViewModule, -} from '@difizen/mana-app'; -import { CommandRegistry, view, SelectionService } from '@difizen/mana-app'; -import { singleton, inject } from '@difizen/mana-app'; - -import './index.less'; - -@singleton() -@view(FileTreeViewFactory, FileTreeViewModule) -export class FileView extends FileTreeView { - override id = FileTreeViewFactory; - protected command: CommandRegistry; - override readonly props: TreeProps; - override readonly model: FileTreeModel; - override readonly treeViewDecorator: TreeViewDecorator; - override readonly selectionService: SelectionService; - override readonly labelProvider: LabelProvider; - protected override readonly decoratorService: TreeDecoratorService; - - constructor( - @inject(CommandRegistry) command: CommandRegistry, - @inject(TreeProps) props: TreeProps, - @inject(FileTreeModel) model: FileTreeModel, - @inject(TreeViewDecorator) treeViewDecorator: TreeViewDecorator, - @inject(SelectionService) selectionService: SelectionService, - @inject(LabelProvider) labelProvider: LabelProvider, - @inject(TreeDecoratorService) - decoratorService: TreeDecoratorService, - ) { - super( - props, - model, - treeViewDecorator, - selectionService, - labelProvider, - decoratorService, - ); - this.command = command; - this.props = props; - this.model = model; - this.treeViewDecorator = treeViewDecorator; - this.selectionService = selectionService; - this.labelProvider = labelProvider; - this.decoratorService = decoratorService; - - this.toDispose.push(this.model.onOpenNode(this.openNode)); - this.className += ` mana-example-file-tree`; - } - - openNode = (treeNode: TreeNode) => { - if (FileStatNode.is(treeNode) && treeNode.fileStat.isFile) { - console.info('openNode', treeNode); - } - }; - override handleClickEvent( - node: TreeNode | undefined, - event: React.MouseEvent, - ): void { - const modifierKeyCombined: boolean = isOSX - ? event.shiftKey || event.metaKey - : event.shiftKey || event.ctrlKey; - if (!modifierKeyCombined && node && FileStatNode.is(node) && node.fileStat.isFile) { - this.model.openNode(node); - } - super.handleClickEvent(node, event); - } -} diff --git a/mana/apps/docs/src/file-tree/file-view/index.less b/mana/apps/docs/src/file-tree/file-view/index.less deleted file mode 100644 index 211a7f3f..00000000 --- a/mana/apps/docs/src/file-tree/file-view/index.less +++ /dev/null @@ -1,4 +0,0 @@ -.mana-example-file-tree { - height: 100%; - min-height: 200px; -} diff --git a/mana/apps/docs/src/file-tree/file-view/index.ts b/mana/apps/docs/src/file-tree/file-view/index.ts deleted file mode 100644 index a38c2828..00000000 --- a/mana/apps/docs/src/file-tree/file-view/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './file-view.js'; diff --git a/mana/apps/docs/src/file-tree/index.tsx b/mana/apps/docs/src/file-tree/index.tsx deleted file mode 100644 index 70045c42..00000000 --- a/mana/apps/docs/src/file-tree/index.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { ManaAppPreset, ManaComponents } from '@difizen/mana-app'; - -import { FileModule } from './module.js'; - -const App = (): JSX.Element => { - return ( - - ); -}; - -export default App; diff --git a/mana/apps/docs/src/file-tree/mock-file-service.ts b/mana/apps/docs/src/file-tree/mock-file-service.ts deleted file mode 100644 index 29ac62f2..00000000 --- a/mana/apps/docs/src/file-tree/mock-file-service.ts +++ /dev/null @@ -1,106 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import type { FileStatWithMetadata, ResolveFileOptions } from '@difizen/mana-app'; -import { singleton, URI } from '@difizen/mana-app'; -import { FileService } from '@difizen/mana-app'; - -const defaultFileMeta = { - mtime: 0, - ctime: 0, - etag: '', - size: 0, - isFile: false, - isDirectory: false, - isSymbolicLink: false, -}; -@singleton() -export class MockFileService extends FileService { - override async resolve( - resource: URI, - options?: ResolveFileOptions | undefined, - ): Promise { - if (resource.path.isRoot) { - return { - ...defaultFileMeta, - isDirectory: true, - name: resource.displayName, - resource, - children: [ - { - ...defaultFileMeta, - isFile: true, - name: 'a.sql', - resource: URI.resolve(resource, 'a.sql'), - }, - { - ...defaultFileMeta, - isFile: true, - name: 'b.py', - resource: URI.resolve(resource, 'b.py'), - }, - { - ...defaultFileMeta, - isFile: true, - name: 'c.ipynb', - resource: URI.resolve(resource, 'c.ipynb'), - }, - { - ...defaultFileMeta, - isDirectory: true, - name: 'dir', - resource: URI.resolve(resource, 'dir'), - }, - ], - }; - } - if (resource.path.name.includes('.')) { - return { - mtime: 0, - ctime: 0, - etag: '', - size: 0, - isFile: true, - isDirectory: false, - isSymbolicLink: false, - name: resource.displayName, - resource, - }; - } - return { - mtime: 0, - ctime: 0, - etag: '', - size: 0, - isFile: false, - isDirectory: true, - isSymbolicLink: false, - name: resource.displayName, - resource, - children: [ - { - ...defaultFileMeta, - isFile: true, - name: 'a.sql', - resource: URI.resolve(resource, 'a.sql'), - }, - { - ...defaultFileMeta, - isFile: true, - name: 'b.py', - resource: URI.resolve(resource, 'b.py'), - }, - { - ...defaultFileMeta, - isFile: true, - name: 'c.ipynb', - resource: URI.resolve(resource, 'c.ipynb'), - }, - { - ...defaultFileMeta, - isDirectory: true, - name: 'dir', - resource: URI.resolve(resource, 'dir'), - }, - ], - }; - } -} diff --git a/mana/apps/docs/src/file-tree/module.ts b/mana/apps/docs/src/file-tree/module.ts deleted file mode 100644 index 7c2ef0d2..00000000 --- a/mana/apps/docs/src/file-tree/module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { FileService, FileTreeModule, RootSlotId } from '@difizen/mana-app'; -import { createViewPreference, ManaModule } from '@difizen/mana-app'; - -import { FileApplication } from './file-application'; -import { FileCommandContribution } from './file-command'; -import { FileView } from './file-view/index'; -import { MockFileService } from './mock-file-service'; - -export const FileModule = ManaModule.create() - .register( - FileView, - FileApplication, - FileCommandContribution, - { - token: FileService, - useClass: MockFileService, - }, - createViewPreference({ - view: FileView, - autoCreate: true, - slot: RootSlotId, - }), - ) - .dependOn(FileTreeModule); diff --git a/mana/apps/docs/src/keybind/context/command.ts b/mana/apps/docs/src/keybind/context/command.ts deleted file mode 100644 index e0889694..00000000 --- a/mana/apps/docs/src/keybind/context/command.ts +++ /dev/null @@ -1,83 +0,0 @@ -import type { CommandRegistry, KeybindingRegistry } from '@difizen/mana-app'; -import { prop } from '@difizen/mana-app'; -import { - ManaModule, - singleton, - CommandContribution, - KeybindingContribution, -} from '@difizen/mana-app'; -import { message } from 'antd'; - -export const CommonCommand = { - INCREASE_COUNT: { - id: 'common.command.increase', - label: 'INCREASE', - }, - DECREACE_COUNT: { - id: 'common.command.decreace', - label: 'DECREACE', - }, - DOUBLE_COUNT: { - id: 'common.command.double', - label: 'INCREASE', - }, -}; - -@singleton({ contrib: [CommandContribution, KeybindingContribution] }) -export class MyCommand implements CommandContribution, KeybindingContribution { - @prop() count = 0; - - registerKeybindings(keybindings: KeybindingRegistry): void { - keybindings.registerKeybinding({ - command: CommonCommand.INCREASE_COUNT.id, - keybinding: 'shift+up', - when: 'shiftMode', - }); - keybindings.registerKeybinding({ - command: CommonCommand.DECREACE_COUNT.id, - keybinding: 'shift+down', - when: 'shiftMode', - }); - keybindings.registerKeybinding({ - command: CommonCommand.INCREASE_COUNT.id, - keybinding: 'ctrlcmd+shift+up', - when: 'ctrlcmdMode', - }); - keybindings.registerKeybinding({ - command: CommonCommand.DECREACE_COUNT.id, - keybinding: 'ctrlcmd+shift+down', - when: 'ctrlcmdMode', - }); - keybindings.registerKeybinding({ - command: CommonCommand.DOUBLE_COUNT.id, - keybinding: 'd d', - }); - keybindings.onMatchChange((match) => { - if (match?.binding.keybinding) { - message.info( - `[mana] keybinding match change: ${match?.binding.keybinding}, when: ${match?.binding.when}`, - ); - } - }); - } - - registerCommands(command: CommandRegistry): void { - command.registerCommand(CommonCommand.INCREASE_COUNT, { - execute: () => { - this.count += 1; - }, - }); - command.registerCommand(CommonCommand.DECREACE_COUNT, { - execute: () => { - this.count -= 1; - }, - }); - command.registerCommand(CommonCommand.DOUBLE_COUNT, { - execute: () => { - this.count = this.count * 2; - }, - }); - } -} - -export const CommonCommandModule = ManaModule.create().register(MyCommand); diff --git a/mana/apps/docs/src/keybind/context/context-service.ts b/mana/apps/docs/src/keybind/context/context-service.ts deleted file mode 100644 index 3439c1e3..00000000 --- a/mana/apps/docs/src/keybind/context/context-service.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { IContextKey } from '@difizen/mana-app'; -import { ContextKeyService } from '@difizen/mana-app'; -import { inject, postConstruct, singleton } from '@difizen/mana-app'; - -@singleton() -export class Context { - @inject(ContextKeyService) - protected readonly contextKeyService!: ContextKeyService; - - protected _shiftMode!: IContextKey; - get shiftMode(): IContextKey { - return this._shiftMode; - } - - protected _ctrlcmdMode!: IContextKey; - /** True if Explorer view has keyboard focus. */ - get ctrlcmdMode(): IContextKey { - return this._ctrlcmdMode; - } - - @postConstruct() - protected init(): void { - this._shiftMode = this.contextKeyService.createKey('shiftMode', false); - this._ctrlcmdMode = this.contextKeyService.createKey('ctrlcmdMode', false); - } -} diff --git a/mana/apps/docs/src/keybind/context/index.tsx b/mana/apps/docs/src/keybind/context/index.tsx deleted file mode 100644 index c8cbd2f9..00000000 --- a/mana/apps/docs/src/keybind/context/index.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import { ManaAppPreset, useInject } from '@difizen/mana-app'; -import { CommandRegistry, ManaComponents, ManaModule } from '@difizen/mana-app'; -import { Button, Checkbox, Divider, Statistic } from 'antd'; - -import { CommonCommand, MyCommand } from './command.js'; -import { Context } from './context-service.js'; - -const BaseModule = ManaModule.create().register(MyCommand, Context); - -const MyCommandRender = () => { - const command = useInject(CommandRegistry); - const myCommand = useInject(MyCommand); - const context = useInject(Context); - const shiftMode = context.shiftMode.get(); - const ctrlcmdMode = context.ctrlcmdMode.get(); - return ( -
-
- -
- - { - context.shiftMode.set(e.target.checked); - }} - > - shift mode - - { - context.ctrlcmdMode.set(e.target.checked); - }} - > - ctrlcmd mode - - -
- - - - - -
-
- ); -}; - -const App = (): JSX.Element => { - return ( - - - - ); -}; - -export default App; diff --git a/mana/apps/docs/src/keybind/event-propagation/command.ts b/mana/apps/docs/src/keybind/event-propagation/command.ts deleted file mode 100644 index 293b2f55..00000000 --- a/mana/apps/docs/src/keybind/event-propagation/command.ts +++ /dev/null @@ -1,71 +0,0 @@ -import type { CommandRegistry, KeybindingRegistry } from '@difizen/mana-app'; -import { prop } from '@difizen/mana-app'; -import { - ManaModule, - singleton, - CommandContribution, - KeybindingContribution, -} from '@difizen/mana-app'; -import { message } from 'antd'; - -export const CommonCommand = { - INCREASE_COUNT: { - id: 'common.command.increase', - label: 'INCREASE', - }, - DECREACE_COUNT: { - id: 'common.command.decreace', - label: 'DECREACE', - }, - DOUBLE_COUNT: { - id: 'common.command.double', - label: '', - }, -}; - -@singleton({ contrib: [CommandContribution, KeybindingContribution] }) -export class MyCommand implements CommandContribution, KeybindingContribution { - @prop() count = 0; - registerKeybindings(keybindings: KeybindingRegistry): void { - keybindings.registerKeybinding({ - command: CommonCommand.INCREASE_COUNT.id, - keybinding: 'shift+ctrlcmd+m', - }); - keybindings.registerKeybinding({ - command: CommonCommand.DECREACE_COUNT.id, - keybinding: 'shift+ctrlcmd+-', - }); - keybindings.registerKeybinding({ - command: CommonCommand.DOUBLE_COUNT.id, - keybinding: 'ctrlcmd+s', - }); - keybindings.onMatchChange((match) => { - if (match?.binding.keybinding) { - message.info( - `[mana] keybinding match change: ${match?.binding.keybinding}, when: ${match?.binding.when}`, - ); - } - }); - } - - registerCommands(command: CommandRegistry): void { - command.registerCommand(CommonCommand.INCREASE_COUNT, { - execute: () => { - this.count += 1; - }, - }); - command.registerCommand(CommonCommand.DECREACE_COUNT, { - execute: () => { - this.count -= 1; - }, - }); - command.registerCommand(CommonCommand.DOUBLE_COUNT, { - execute: () => { - // console.log(this); - this.count = this.count * 2; - }, - }); - } -} - -export const CommonCommandModule = ManaModule.create().register(MyCommand); diff --git a/mana/apps/docs/src/keybind/event-propagation/index.tsx b/mana/apps/docs/src/keybind/event-propagation/index.tsx deleted file mode 100644 index c788a9ea..00000000 --- a/mana/apps/docs/src/keybind/event-propagation/index.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { inject, ManaAppPreset, singleton, useInject } from '@difizen/mana-app'; -import { ApplicationContribution } from '@difizen/mana-app'; -import { CommandRegistry, ManaComponents, ManaModule } from '@difizen/mana-app'; -import { KeybindingRegistry } from '@difizen/mana-app'; -import { Button, Divider, Statistic } from 'antd'; -import { CommonCommand, MyCommand } from './command'; - -@singleton({ contrib: ApplicationContribution }) -class KeybindEvent implements ApplicationContribution { - constructor(@inject(KeybindingRegistry) registry: KeybindingRegistry) { - registry.preventDefault = true; - registry.stopPropagation = true; - } -} - -const BaseModule = ManaModule.create().register(MyCommand, KeybindEvent); - -const MyCommandRender = () => { - const command = useInject(CommandRegistry); - const myCommand = useInject(MyCommand); - return ( -
-
- -
- -
- - - - - -
-
- ); -}; - -const App = (): JSX.Element => { - return ( - - - - ); -}; - -export default App; diff --git a/mana/apps/docs/src/keybind/simple/command.ts b/mana/apps/docs/src/keybind/simple/command.ts deleted file mode 100644 index d32d7558..00000000 --- a/mana/apps/docs/src/keybind/simple/command.ts +++ /dev/null @@ -1,71 +0,0 @@ -import type { CommandRegistry, KeybindingRegistry } from '@difizen/mana-app'; -import { prop } from '@difizen/mana-app'; -import { - ManaModule, - singleton, - CommandContribution, - KeybindingContribution, -} from '@difizen/mana-app'; -import { message } from 'antd'; - -export const CommonCommand = { - INCREASE_COUNT: { - id: 'common.command.increase', - label: 'INCREASE', - }, - DECREACE_COUNT: { - id: 'common.command.decreace', - label: 'DECREACE', - }, - DOUBLE_COUNT: { - id: 'common.command.double', - label: 'INCREASE', - }, -}; - -@singleton({ contrib: [CommandContribution, KeybindingContribution] }) -export class MyCommand implements CommandContribution, KeybindingContribution { - @prop() count = 0; - registerKeybindings(keybindings: KeybindingRegistry): void { - keybindings.registerKeybinding({ - command: CommonCommand.INCREASE_COUNT.id, - keybinding: 'shift+up', - }); - keybindings.registerKeybinding({ - command: CommonCommand.DECREACE_COUNT.id, - keybinding: 'shift+down', - }); - keybindings.registerKeybinding({ - command: CommonCommand.DOUBLE_COUNT.id, - keybinding: 'd d', - }); - keybindings.onMatchChange((match) => { - if (match?.binding.keybinding) { - message.info( - `[mana] keybinding match change: ${match?.binding.keybinding}, when: ${match?.binding.when}`, - ); - } - }); - } - - registerCommands(command: CommandRegistry): void { - command.registerCommand(CommonCommand.INCREASE_COUNT, { - execute: () => { - this.count += 1; - }, - }); - command.registerCommand(CommonCommand.DECREACE_COUNT, { - execute: () => { - this.count -= 1; - }, - }); - command.registerCommand(CommonCommand.DOUBLE_COUNT, { - execute: () => { - // console.log(this); - this.count = this.count * 2; - }, - }); - } -} - -export const CommonCommandModule = ManaModule.create().register(MyCommand); diff --git a/mana/apps/docs/src/keybind/simple/index.tsx b/mana/apps/docs/src/keybind/simple/index.tsx deleted file mode 100644 index d5d1b7a2..00000000 --- a/mana/apps/docs/src/keybind/simple/index.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { ManaAppPreset, useInject } from '@difizen/mana-app'; -import { CommandRegistry, ManaComponents, ManaModule } from '@difizen/mana-app'; -import { Button, Divider, Statistic } from 'antd'; -import { CommonCommand, MyCommand } from './command'; - -const BaseModule = ManaModule.create().register(MyCommand); - -const MyCommandRender = () => { - const command = useInject(CommandRegistry); - const myCommand = useInject(MyCommand); - return ( -
-
- -
- -
- - - - - -
-
- ); -}; - -const App = (): JSX.Element => { - return ( - - - - ); -}; - -export default App; diff --git a/mana/apps/docs/src/menu/antd-context-menu/index.tsx b/mana/apps/docs/src/menu/antd-context-menu/index.tsx deleted file mode 100644 index 0503d21b..00000000 --- a/mana/apps/docs/src/menu/antd-context-menu/index.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import type { MenuItemRenderProps, Menu as ManaMenu } from '@difizen/mana-app'; -import { ManaModule } from '@difizen/mana-app'; -import { - ManaAppPreset, - useInject, - ManaComponents, - MAIN_MENU_BAR, - MenuItem, - MenuInstance, - MenuRender, -} from '@difizen/mana-app'; -import { Menu, Dropdown } from 'antd'; -import type { ItemType } from 'antd/es/menu/interface.js'; -import type { MenuProps } from 'antd/lib/menu'; - -import { Menus, Model } from './menu.js'; - -export const BaseModule = ManaModule.create().register(Menus, Model); - -const MenuItemToProps = (item: MenuItem, menu: ManaMenu): ItemType | undefined => { - if (MenuItem.isGeneralMenuItem(item)) { - let children: ItemType[] = []; - if (item.children) { - children = [...item.children] - .sort(menu.sort) - .map((child) => MenuItemToProps(child, menu)) - .filter((i): i is ItemType => !!i); - } - if (children.filter((i) => !!i).length === 0) { - return undefined; - } - if (item.isSubmenu) { - return { - key: item.key, - label: item.renderTitle(), - icon: item.renderIcon(), - children, - }; - } else { - return { - key: item.key, - label: item.renderTitle(), - type: 'group', - children, - }; - } - } - if (MenuItem.isActionMenuItem(item)) { - if (!menu.isVisible(item)) { - return undefined; - } - return { - key: item.key, - label: item.renderTitle(), - icon: item.renderIcon(), - disabled: !menu.isEnable(item), - onClick: () => menu.execute(item), - }; - } - return undefined; -}; - -const MenuItemRender = (props: MenuItemRenderProps) => { - const { item, root } = props; - const menu = useInject(MenuInstance); - if (!root || !MenuItem.isGeneralMenuItem(item)) { - return null; - } - const menuProps: MenuProps['items'] = [...item.children] - .sort(menu.sort) - .map((i) => MenuItemToProps(i, menu)) - .filter((i): i is ItemType => !!i); - - return ( - -
- -
-
- ); -}; - -const App = (): JSX.Element => { - return ( - - - - ); -}; - -export default App; diff --git a/mana/apps/docs/src/menu/antd-context-menu/menu.tsx b/mana/apps/docs/src/menu/antd-context-menu/menu.tsx deleted file mode 100644 index 4d3deb17..00000000 --- a/mana/apps/docs/src/menu/antd-context-menu/menu.tsx +++ /dev/null @@ -1,120 +0,0 @@ -/* eslint-disable max-len, @typescript-eslint/indent */ - -import { - EyeInvisibleOutlined, - EyeOutlined, - StopOutlined, - CheckCircleOutlined, -} from '@ant-design/icons'; -import type { CommandRegistry, MenuRegistry } from '@difizen/mana-app'; -import { inject } from '@difizen/mana-app'; -import { - MAIN_MENU_BAR, - MenuContribution, - singleton, - prop, - CommandContribution, -} from '@difizen/mana-app'; - -@singleton() -export class Model { - @prop() - visible = false; - @prop() - enable = false; -} -export const Commands = { - SHOW: { - id: 'common.command.show', - icon: EyeOutlined, - label: '显示菜单项', - }, - HIDE: { - id: 'common.command.hide', - icon: EyeInvisibleOutlined, - label: '隐藏菜单项', - }, - ENABLE: { - id: 'common.command.enable', - icon: CheckCircleOutlined, - label: '激活菜单项', - }, - DISABLE: { - id: 'common.command.disable', - icon: StopOutlined, - label: '菜单项失效', - }, -}; -export namespace CommonMenus { - export const MAIN_MENU = [...MAIN_MENU_BAR, 'a_main_menu']; - export const SUB = [...MAIN_MENU, 'main_submenu']; - export const HELP = [...MAIN_MENU_BAR, 'b_help_menus']; - export const ACTION_GROUP = [...MAIN_MENU, 'action_group']; - export const ENABLE_GROUP = [...MAIN_MENU, 'enable_group']; -} - -@singleton({ contrib: [MenuContribution, CommandContribution] }) -export class Menus implements MenuContribution, CommandContribution { - @inject(Model) model!: Model; - registerCommands(command: CommandRegistry): void { - command.registerCommand(Commands.SHOW, { - execute: () => { - this.model.visible = true; - }, - }); - command.registerCommandWithContext(Commands.HIDE, this, { - execute: () => { - this.model.visible = false; - }, - isVisible: (ctx: Menus) => { - return ctx.model.visible; - }, - }); - command.registerCommand(Commands.ENABLE, { - execute: () => { - this.model.enable = true; - }, - }); - command.registerCommandWithContext(Commands.DISABLE, this, { - execute: () => { - this.model.enable = false; - }, - isEnabled: (ctx: Menus) => { - return ctx.model.enable; - }, - }); - } - registerMenus(menu: MenuRegistry) { - menu.registerGroupMenu(CommonMenus.ACTION_GROUP, {}); - menu.registerGroupMenu(CommonMenus.ENABLE_GROUP, {}); - menu.registerSubmenu(CommonMenus.MAIN_MENU, { label: '主菜单' }); - menu.registerSubmenu(CommonMenus.SUB, { label: '子菜单' }); - menu.registerSubmenu(CommonMenus.HELP, { label: '帮助' }); - - menu.registerMenuAction(CommonMenus.SUB, { - id: Commands.ENABLE.id + 'sub', - command: Commands.ENABLE.id, - }); - menu.registerMenuAction(CommonMenus.SUB, { - id: Commands.DISABLE.id + 'sub', - command: Commands.DISABLE.id, - }); - - menu.registerMenuAction(CommonMenus.ACTION_GROUP, { - id: Commands.SHOW.id + 'group', - command: Commands.SHOW.id, - }); - menu.registerMenuAction(CommonMenus.ACTION_GROUP, { - id: Commands.HIDE.id + 'group', - command: Commands.HIDE.id, - }); - menu.registerMenuAction(CommonMenus.ENABLE_GROUP, { - id: Commands.ENABLE.id + 'group', - command: Commands.ENABLE.id, - }); - menu.registerMenuAction(CommonMenus.ENABLE_GROUP, { - id: Commands.DISABLE.id + 'group', - command: Commands.DISABLE.id, - }); - } -} diff --git a/mana/apps/docs/src/menu/context-menu/index.tsx b/mana/apps/docs/src/menu/context-menu/index.tsx deleted file mode 100644 index f18b4f14..00000000 --- a/mana/apps/docs/src/menu/context-menu/index.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { - ManaModule, - ManaAppPreset, - useInject, - ManaComponents, - MenuRender, - MAIN_MENU_BAR, -} from '@difizen/mana-app'; -import { Dropdown } from '@difizen/mana-react'; - -import { Menus, Model } from './menu'; - -export const BaseModule = ManaModule.create().register(Menus, Model); - -const MyMenu = () => { - const model = useInject(Model); - return ; -}; - -const App = (): JSX.Element => { - return ( - - }> -
- Right click me! -
-
-
- ); -}; - -export default App; diff --git a/mana/apps/docs/src/menu/context-menu/menu.tsx b/mana/apps/docs/src/menu/context-menu/menu.tsx deleted file mode 100644 index eb129f88..00000000 --- a/mana/apps/docs/src/menu/context-menu/menu.tsx +++ /dev/null @@ -1,120 +0,0 @@ -/* eslint-disable max-len, @typescript-eslint/indent */ - -import { - EyeInvisibleOutlined, - EyeOutlined, - StopOutlined, - CheckCircleOutlined, -} from '@ant-design/icons'; -import type { CommandRegistry, MenuRegistry } from '@difizen/mana-app'; -import { - MAIN_MENU_BAR, - MenuContribution, - singleton, - prop, - CommandContribution, -} from '@difizen/mana-app'; - -@singleton() -export class Model { - @prop() - visible = false; - @prop() - enable = false; -} -export const Commands = { - SHOW: { - id: 'common.command.show', - icon: EyeOutlined, - label: '显示菜单项', - }, - HIDE: { - id: 'common.command.hide', - icon: EyeInvisibleOutlined, - label: '隐藏菜单项', - }, - ENABLE: { - id: 'common.command.enable', - icon: CheckCircleOutlined, - label: '激活菜单项', - }, - DISABLE: { - id: 'common.command.disable', - icon: StopOutlined, - label: '菜单项失效', - }, -}; -export namespace CommonMenus { - export const MAIN_MENU = [...MAIN_MENU_BAR, 'a_main_menu']; - export const SUB = [...MAIN_MENU, 'a_main_submenu']; - export const HELP = [...MAIN_MENU_BAR, 'b_help_menus']; - export const TEST_GROUP = [...MAIN_MENU, 'b_test_group']; - export const ACTION_GROUP = [...MAIN_MENU, 'c_action_group']; - export const ENABLE_GROUP = [...MAIN_MENU, 'd_enable_group']; -} - -@singleton({ contrib: [MenuContribution, CommandContribution] }) -export class Menus implements MenuContribution, CommandContribution { - registerCommands(command: CommandRegistry): void { - command.registerCommand(Commands.SHOW, { - execute: (model: Model) => { - model.visible = true; - }, - }); - command.registerCommand(Commands.HIDE, { - execute: (model: Model) => { - model.visible = false; - }, - isVisible: (model: Model) => { - return model.visible; - }, - }); - command.registerCommand(Commands.ENABLE, { - execute: (model: Model) => { - model.enable = true; - }, - }); - command.registerCommand(Commands.DISABLE, { - execute: (model: Model) => { - model.enable = false; - }, - isEnabled: (model: Model) => { - return model.enable; - }, - }); - } - registerMenus(menu: MenuRegistry) { - menu.registerGroupMenu(CommonMenus.ACTION_GROUP, {}); - menu.registerGroupMenu(CommonMenus.ENABLE_GROUP, {}); - menu.registerGroupMenu(CommonMenus.TEST_GROUP, {}); - menu.registerSubmenu(CommonMenus.MAIN_MENU, { label: '主菜单' }); - menu.registerSubmenu(CommonMenus.SUB, { label: '子菜单' }); - menu.registerSubmenu(CommonMenus.HELP, { label: '帮助' }); - - menu.registerMenuAction(CommonMenus.SUB, { - id: Commands.ENABLE.id + 'sub', - command: Commands.ENABLE.id, - }); - menu.registerMenuAction(CommonMenus.SUB, { - id: Commands.DISABLE.id + 'sub', - command: Commands.DISABLE.id, - }); - - menu.registerMenuAction(CommonMenus.ACTION_GROUP, { - id: Commands.SHOW.id + 'group', - command: Commands.SHOW.id, - }); - menu.registerMenuAction(CommonMenus.ACTION_GROUP, { - id: Commands.HIDE.id + 'group', - command: Commands.HIDE.id, - }); - menu.registerMenuAction(CommonMenus.ENABLE_GROUP, { - id: Commands.ENABLE.id + 'group', - command: Commands.ENABLE.id, - }); - menu.registerMenuAction(CommonMenus.ENABLE_GROUP, { - id: Commands.DISABLE.id + 'group', - command: Commands.DISABLE.id, - }); - } -} diff --git a/mana/apps/docs/src/menu/menubar/index.tsx b/mana/apps/docs/src/menu/menubar/index.tsx deleted file mode 100644 index e7e09f7b..00000000 --- a/mana/apps/docs/src/menu/menubar/index.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { - ManaModule, - ManaAppPreset, - ManaComponents, - MenuBarRender, - MAIN_MENU_BAR, -} from '@difizen/mana-app'; - -import { Menus, Model } from './menu'; - -export const BaseModule = ManaModule.create().register(Menus, Model); - -const App = (): JSX.Element => { - return ( - - - - ); -}; - -export default App; diff --git a/mana/apps/docs/src/menu/menubar/menu.tsx b/mana/apps/docs/src/menu/menubar/menu.tsx deleted file mode 100644 index 4d3deb17..00000000 --- a/mana/apps/docs/src/menu/menubar/menu.tsx +++ /dev/null @@ -1,120 +0,0 @@ -/* eslint-disable max-len, @typescript-eslint/indent */ - -import { - EyeInvisibleOutlined, - EyeOutlined, - StopOutlined, - CheckCircleOutlined, -} from '@ant-design/icons'; -import type { CommandRegistry, MenuRegistry } from '@difizen/mana-app'; -import { inject } from '@difizen/mana-app'; -import { - MAIN_MENU_BAR, - MenuContribution, - singleton, - prop, - CommandContribution, -} from '@difizen/mana-app'; - -@singleton() -export class Model { - @prop() - visible = false; - @prop() - enable = false; -} -export const Commands = { - SHOW: { - id: 'common.command.show', - icon: EyeOutlined, - label: '显示菜单项', - }, - HIDE: { - id: 'common.command.hide', - icon: EyeInvisibleOutlined, - label: '隐藏菜单项', - }, - ENABLE: { - id: 'common.command.enable', - icon: CheckCircleOutlined, - label: '激活菜单项', - }, - DISABLE: { - id: 'common.command.disable', - icon: StopOutlined, - label: '菜单项失效', - }, -}; -export namespace CommonMenus { - export const MAIN_MENU = [...MAIN_MENU_BAR, 'a_main_menu']; - export const SUB = [...MAIN_MENU, 'main_submenu']; - export const HELP = [...MAIN_MENU_BAR, 'b_help_menus']; - export const ACTION_GROUP = [...MAIN_MENU, 'action_group']; - export const ENABLE_GROUP = [...MAIN_MENU, 'enable_group']; -} - -@singleton({ contrib: [MenuContribution, CommandContribution] }) -export class Menus implements MenuContribution, CommandContribution { - @inject(Model) model!: Model; - registerCommands(command: CommandRegistry): void { - command.registerCommand(Commands.SHOW, { - execute: () => { - this.model.visible = true; - }, - }); - command.registerCommandWithContext(Commands.HIDE, this, { - execute: () => { - this.model.visible = false; - }, - isVisible: (ctx: Menus) => { - return ctx.model.visible; - }, - }); - command.registerCommand(Commands.ENABLE, { - execute: () => { - this.model.enable = true; - }, - }); - command.registerCommandWithContext(Commands.DISABLE, this, { - execute: () => { - this.model.enable = false; - }, - isEnabled: (ctx: Menus) => { - return ctx.model.enable; - }, - }); - } - registerMenus(menu: MenuRegistry) { - menu.registerGroupMenu(CommonMenus.ACTION_GROUP, {}); - menu.registerGroupMenu(CommonMenus.ENABLE_GROUP, {}); - menu.registerSubmenu(CommonMenus.MAIN_MENU, { label: '主菜单' }); - menu.registerSubmenu(CommonMenus.SUB, { label: '子菜单' }); - menu.registerSubmenu(CommonMenus.HELP, { label: '帮助' }); - - menu.registerMenuAction(CommonMenus.SUB, { - id: Commands.ENABLE.id + 'sub', - command: Commands.ENABLE.id, - }); - menu.registerMenuAction(CommonMenus.SUB, { - id: Commands.DISABLE.id + 'sub', - command: Commands.DISABLE.id, - }); - - menu.registerMenuAction(CommonMenus.ACTION_GROUP, { - id: Commands.SHOW.id + 'group', - command: Commands.SHOW.id, - }); - menu.registerMenuAction(CommonMenus.ACTION_GROUP, { - id: Commands.HIDE.id + 'group', - command: Commands.HIDE.id, - }); - menu.registerMenuAction(CommonMenus.ENABLE_GROUP, { - id: Commands.ENABLE.id + 'group', - command: Commands.ENABLE.id, - }); - menu.registerMenuAction(CommonMenus.ENABLE_GROUP, { - id: Commands.DISABLE.id + 'group', - command: Commands.DISABLE.id, - }); - } -} diff --git a/mana/apps/docs/src/modal/antd-modal/index.tsx b/mana/apps/docs/src/modal/antd-modal/index.tsx deleted file mode 100644 index af3c7ffc..00000000 --- a/mana/apps/docs/src/modal/antd-modal/index.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { - createSlotPreference, - ManaComponents, - ManaModule, - RootSlotId, - ManaAppPreset, -} from '@difizen/mana-app'; - -import { ModalContainerView } from './modal-container-view.js'; -import { DemoModalContribution } from './modal-contribution.js'; - -const BaseModule = ManaModule.create().register( - ModalContainerView, - createSlotPreference({ - view: ModalContainerView, - slot: RootSlotId, - }), - DemoModalContribution, -); - -const App = (): JSX.Element => { - return ( - - ); -}; - -export default App; diff --git a/mana/apps/docs/src/modal/antd-modal/modal-container-view.tsx b/mana/apps/docs/src/modal/antd-modal/modal-container-view.tsx deleted file mode 100644 index 707cee2f..00000000 --- a/mana/apps/docs/src/modal/antd-modal/modal-container-view.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { BaseView, view } from '@difizen/mana-app'; -import { singleton } from '@difizen/mana-app'; -import { ModalService, useInject } from '@difizen/mana-app'; -import { Button } from 'antd'; -import React from 'react'; - -import { demoModal } from './modal-contribution.js'; - -export const ModalContainerComponent: React.FC = () => { - const modalService = useInject(ModalService); - return ( -
- -
- ); -}; - -@singleton() -@view('modal-container') -export class ModalContainerView extends BaseView { - override view = ModalContainerComponent; -} diff --git a/mana/apps/docs/src/modal/antd-modal/modal-contribution.tsx b/mana/apps/docs/src/modal/antd-modal/modal-contribution.tsx deleted file mode 100644 index ddae9e8f..00000000 --- a/mana/apps/docs/src/modal/antd-modal/modal-contribution.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import type { ModalItem, ModalItemProps } from '@difizen/mana-app'; -import { ModalContribution, singleton } from '@difizen/mana-app'; -import { Modal } from 'antd'; - -export const DemoModal = (props: ModalItemProps) => { - const { visible, data, close } = props; - return ( - { - close(); - }} - onCancel={() => { - close(); - }} - > -
{data}
-
- ); -}; - -export const demoModal: ModalItem = { - id: 'demo-modal', - component: DemoModal, -}; - -@singleton({ contrib: ModalContribution }) -export class DemoModalContribution implements ModalContribution { - registerModals(): ModalItem[] { - return [demoModal]; - } -} diff --git a/mana/apps/docs/src/modal/custom-modal/index.tsx b/mana/apps/docs/src/modal/custom-modal/index.tsx deleted file mode 100644 index 492cda7a..00000000 --- a/mana/apps/docs/src/modal/custom-modal/index.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { - createSlotPreference, - ManaComponents, - ManaModule, - RootSlotId, - ManaAppPreset, - ModalService, - Syringe, -} from '@difizen/mana-app'; - -import { ModalContainerView } from './modal-container-view.js'; -import { DemoModalContribution } from './modal-contribution.js'; -import { MyModalService } from './my-modal-service.js'; - -const BaseModule = ManaModule.create().register( - ModalContainerView, - { - token: ModalService, - useClass: MyModalService, - lifecycle: Syringe.Lifecycle.singleton, - }, - createSlotPreference({ - view: ModalContainerView, - slot: RootSlotId, - }), - DemoModalContribution, -); - -const App = (): JSX.Element => { - return ( - - ); -}; - -export default App; diff --git a/mana/apps/docs/src/modal/custom-modal/modal-container-view.tsx b/mana/apps/docs/src/modal/custom-modal/modal-container-view.tsx deleted file mode 100644 index bd015cd9..00000000 --- a/mana/apps/docs/src/modal/custom-modal/modal-container-view.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { BaseView, view } from '@difizen/mana-app'; -import { singleton } from '@difizen/mana-app'; -import { ModalService, useInject } from '@difizen/mana-app'; -import { Button } from 'antd'; -import React from 'react'; - -import { fooModal, barModal } from './modal-contribution.js'; - -export const ModalContainerComponent: React.FC = () => { - const modalService = useInject(ModalService); - return ( -
- - - -
- ); -}; - -@singleton() -@view('modal-container') -export class ModalContainerView extends BaseView { - override view = ModalContainerComponent; -} diff --git a/mana/apps/docs/src/modal/custom-modal/modal-contribution.tsx b/mana/apps/docs/src/modal/custom-modal/modal-contribution.tsx deleted file mode 100644 index ab13a947..00000000 --- a/mana/apps/docs/src/modal/custom-modal/modal-contribution.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import type { ModalItem, ModalItemProps } from '@difizen/mana-app'; -import { ModalContribution, singleton } from '@difizen/mana-app'; -import { ConfigProvider, Modal } from 'antd'; - -export const DemoModal = (props: ModalItemProps) => { - const { visible, data, close } = props; - return ( - { - close(); - }} - onCancel={() => { - close(); - }} - > -
{data}
-
- ); -}; - -export const fooModal: ModalItem = { - id: 'foo-modal', - component: DemoModal, -}; -export const barModal: ModalItem = { - id: 'bar-modal', - component: DemoModal, - render: (props) => { - return ( - - {' '} - - ); - }, -}; - -@singleton({ contrib: ModalContribution }) -export class DemoModalContribution implements ModalContribution { - registerModals(): ModalItem[] { - return [fooModal, barModal]; - } -} diff --git a/mana/apps/docs/src/modal/custom-modal/my-modal-service.tsx b/mana/apps/docs/src/modal/custom-modal/my-modal-service.tsx deleted file mode 100644 index 27c6147d..00000000 --- a/mana/apps/docs/src/modal/custom-modal/my-modal-service.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import type { ModalItemView } from '@difizen/mana-app'; -import { singleton } from '@difizen/mana-app'; -import { ModalService } from '@difizen/mana-app'; -import { ConfigProvider, theme } from 'antd'; -import React from 'react'; - -@singleton() -export class MyModalService extends ModalService { - override renderModal(itemView: ModalItemView): React.ReactNode { - const children = super.renderModal(itemView); - if (itemView.modalData === 'a new modal!') { - return ( - - {children} - - ); - } - return children; - } -} diff --git a/mana/apps/docs/src/modular-basic/content.tsx b/mana/apps/docs/src/modular-basic/content.tsx deleted file mode 100644 index b8dd0837..00000000 --- a/mana/apps/docs/src/modular-basic/content.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import { HeaderArea } from '@difizen/mana-app'; -import { - createViewPreference, - DefaultSlotView, - ManaModule, - view, -} from '@difizen/mana-app'; -import { prop, useInject } from '@difizen/mana-app'; -import { inject, singleton } from '@difizen/mana-app'; -import { Tabs, Select } from 'antd'; - -import { AppLayoutArea } from './layout.js'; - -export const TabsConf = [{ name: 'Tab 1' }, { name: 'Tab 2' }, { name: 'Tab 3' }]; - -@singleton() -export class ContentModel { - @prop() active: string = TabsConf[0].name; - setActive = (active: string) => { - this.active = active; - }; -} - -const ContentView = () => { - const model = useInject(ContentModel); - return ( - ({ - key: item.name, - label: item.name, - children: <>Tab Content: {item.name}, - }))} - > - ); -}; - -@singleton() -@view('app-content') -export class Content extends DefaultSlotView { - @inject(ContentModel) model!: ContentModel; - override view = ContentView; -} - -const HeaderSelector = () => { - const model = useInject(ContentModel); - return ( - - ); -}; - -@singleton() -@view('app-header-selector') -export class Selector extends DefaultSlotView { - override view = HeaderSelector; -} - -export const ContentModule = ManaModule.create().register( - Content, - ContentModel, - Selector, - createViewPreference({ - view: Content, - slot: AppLayoutArea.content, - autoCreate: true, - }), - createViewPreference({ - view: Selector, - slot: HeaderArea.right, - autoCreate: true, - }), -); diff --git a/mana/apps/docs/src/modular-basic/index.tsx b/mana/apps/docs/src/modular-basic/index.tsx deleted file mode 100644 index 397f6842..00000000 --- a/mana/apps/docs/src/modular-basic/index.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { ManaComponents } from '@difizen/mana-app'; -import { ManaAppPreset } from '@difizen/mana-app'; - -import { ContentModule } from './content.js'; -import { LayoutModule } from './layout.js'; - -export default function Basic(): JSX.Element { - return ( - - ); -} diff --git a/mana/apps/docs/src/modular-basic/layout.tsx b/mana/apps/docs/src/modular-basic/layout.tsx deleted file mode 100644 index e21c2110..00000000 --- a/mana/apps/docs/src/modular-basic/layout.tsx +++ /dev/null @@ -1,52 +0,0 @@ -/* eslint-disable @typescript-eslint/no-use-before-define */ -import { singleton } from '@difizen/mana-app'; -import { - Slot, - DefaultSlotView, - view, - ManaModule, - createSlotPreference, - RootSlotId, -} from '@difizen/mana-app'; -import { HeaderView } from '@difizen/mana-app'; -import { BoxPanel } from '@difizen/mana-react'; -import React, { forwardRef } from 'react'; - -export enum AppLayoutArea { - header = 'header', - content = 'content', -} - -const BaseLayout: React.ForwardRefExoticComponent = forwardRef(function BaseLayout( - props, - ref: React.ForwardedRef, -) { - return ( - - - - - - - - - ); -}); - -@singleton() -@view('app-layout') -export class AppLayoutView extends DefaultSlotView { - override view = BaseLayout; -} - -export const LayoutModule = ManaModule.create().register( - AppLayoutView, - createSlotPreference({ - slot: RootSlotId, - view: AppLayoutView, - }), - createSlotPreference({ - slot: AppLayoutArea.header, - view: HeaderView, - }), -); diff --git a/mana/apps/docs/src/modular-dynamic/content.tsx b/mana/apps/docs/src/modular-dynamic/content.tsx deleted file mode 100644 index a0839448..00000000 --- a/mana/apps/docs/src/modular-dynamic/content.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import { HeaderArea } from '@difizen/mana-app'; -import { - createViewPreference, - DefaultSlotView, - ManaModule, - view, -} from '@difizen/mana-app'; -import { prop, useInject } from '@difizen/mana-app'; -import { inject, singleton } from '@difizen/mana-app'; -import { Tabs, Select } from 'antd'; - -import { AppLayoutArea } from './layout.js'; - -export const TabsConf = [{ name: 'Tab 1' }, { name: 'Tab 2' }, { name: 'Tab 3' }]; - -@singleton() -export class ContentModel { - @prop() active: string = TabsConf[0].name; - setActive = (active: string) => { - this.active = active; - }; -} - -const ContentView = () => { - const model = useInject(ContentModel); - return ( - - {TabsConf.map((item) => { - return ( - - Tab Content: {item.name} - - ); - })} - - ); -}; - -@singleton() -@view('app-content') -export class Content extends DefaultSlotView { - @inject(ContentModel) model!: ContentModel; - override view = ContentView; -} - -const HeaderSelector = () => { - const model = useInject(ContentModel); - return ( - - ); -}; - -@singleton() -@view('app-header-selector') -export class Selector extends DefaultSlotView { - override view = HeaderSelector; -} - -export const ContentModule = ManaModule.create().register( - Content, - ContentModel, - Selector, - createViewPreference({ - view: Content, - slot: AppLayoutArea.content, - autoCreate: true, - }), - createViewPreference({ - view: Selector, - slot: HeaderArea.right, - autoCreate: true, - }), -); diff --git a/mana/apps/docs/src/modular-dynamic/index.tsx b/mana/apps/docs/src/modular-dynamic/index.tsx deleted file mode 100644 index 0d1eb2d2..00000000 --- a/mana/apps/docs/src/modular-dynamic/index.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import type { Syringe } from '@difizen/mana-app'; -import { ManaComponents, SlotViewManager, ViewManager } from '@difizen/mana-app'; -import { HeaderArea } from '@difizen/mana-app'; -import { ManaAppPreset } from '@difizen/mana-app'; -import { Button } from 'antd'; -import React, { useState } from 'react'; - -import { Content, ContentModule, Selector } from './content.js'; -import { AppLayoutArea, LayoutModule } from './layout.js'; - -export default function Dynamic(): JSX.Element { - const [ctx, setCTX] = useState(undefined); - const dynamicLoad = async () => { - const container = ctx?.container; - if (container) { - container.load(ContentModule); - const viewManager = container.get(ViewManager); - const slotViewManager = container.get(SlotViewManager); - const content = await viewManager.getOrCreateView(Content); - slotViewManager.addView(content, AppLayoutArea.content); - - const selector = await viewManager.getOrCreateView(Selector); - slotViewManager.addView(selector, HeaderArea.right); - } - }; - return ( -
- - { - setCTX(c); - }} - /> -
- ); -} diff --git a/mana/apps/docs/src/modular-dynamic/layout.tsx b/mana/apps/docs/src/modular-dynamic/layout.tsx deleted file mode 100644 index e21c2110..00000000 --- a/mana/apps/docs/src/modular-dynamic/layout.tsx +++ /dev/null @@ -1,52 +0,0 @@ -/* eslint-disable @typescript-eslint/no-use-before-define */ -import { singleton } from '@difizen/mana-app'; -import { - Slot, - DefaultSlotView, - view, - ManaModule, - createSlotPreference, - RootSlotId, -} from '@difizen/mana-app'; -import { HeaderView } from '@difizen/mana-app'; -import { BoxPanel } from '@difizen/mana-react'; -import React, { forwardRef } from 'react'; - -export enum AppLayoutArea { - header = 'header', - content = 'content', -} - -const BaseLayout: React.ForwardRefExoticComponent = forwardRef(function BaseLayout( - props, - ref: React.ForwardedRef, -) { - return ( - - - - - - - - - ); -}); - -@singleton() -@view('app-layout') -export class AppLayoutView extends DefaultSlotView { - override view = BaseLayout; -} - -export const LayoutModule = ManaModule.create().register( - AppLayoutView, - createSlotPreference({ - slot: RootSlotId, - view: AppLayoutView, - }), - createSlotPreference({ - slot: AppLayoutArea.header, - view: HeaderView, - }), -); diff --git a/mana/apps/docs/src/typings/index.d.ts b/mana/apps/docs/src/typings/index.d.ts deleted file mode 100644 index fb59b4d9..00000000 --- a/mana/apps/docs/src/typings/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare module '*.less'; -declare module '*.svg'; diff --git a/mana/apps/docs/tsconfig.json b/mana/apps/docs/tsconfig.json deleted file mode 100644 index 18f19a1c..00000000 --- a/mana/apps/docs/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "rootDirs": ["./src", ".dumi"], - "outDir": "es", - "declarationDir": "es" - }, - "types": ["jest"], - "exclude": ["node_modules"], - "include": ["src", ".dumi"] -} diff --git a/mana/apps/react-example/.eslintrc.json b/mana/apps/react-example/.eslintrc.json deleted file mode 100644 index d73e5403..00000000 --- a/mana/apps/react-example/.eslintrc.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "env": { - "browser": true, - "es6": true, - "node": true - }, - "extends": [ - "eslint:recommended", - "plugin:react/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:import/errors", - "plugin:import/warnings" - ], - "parser": "@typescript-eslint/parser", - "settings": { - "import/resolver": { - "node": { - "extensions": [".js", ".jsx", ".ts", ".tsx"] - }, - "alias": { - "map": [ - ["@src", "./src"], - ["@assets", "./assets"] - ], - "extensions": [".js", ".jsx", ".ts", ".tsx"] - } - }, - "react": { - "version": "latest" - } - }, - "rules": { - "react/prop-types": "off", - "@typescript-eslint/no-var-requires": "off" - } -} diff --git a/mana/apps/react-example/.gitattributes b/mana/apps/react-example/.gitattributes deleted file mode 100644 index eaeecc53..00000000 --- a/mana/apps/react-example/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ -*.scss linguist-detectable=false -*.sass linguist-detectable=false -*.js linguist-detectable=false \ No newline at end of file diff --git a/mana/apps/react-example/.gitignore b/mana/apps/react-example/.gitignore deleted file mode 100644 index 22fa0742..00000000 --- a/mana/apps/react-example/.gitignore +++ /dev/null @@ -1,89 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock -.DS_Store - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# Webpack -.webpack/ - -# Distributions -dist/ \ No newline at end of file diff --git a/mana/apps/react-example/.prettierrc b/mana/apps/react-example/.prettierrc deleted file mode 100644 index ed08195f..00000000 --- a/mana/apps/react-example/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all", - "jsxSingleQuote": true -} diff --git a/mana/apps/react-example/CHANGELOG.md b/mana/apps/react-example/CHANGELOG.md deleted file mode 100644 index 554774db..00000000 --- a/mana/apps/react-example/CHANGELOG.md +++ /dev/null @@ -1,43 +0,0 @@ -# @difizen/mana-react-example - -## 0.1.32 - -### Patch Changes - -- [#88](https://github.com/difizen/mana/pull/88) [`efec026`](https://github.com/difizen/mana/commit/efec02698841de45108da24897040b528d2c3ec2) Thanks [@sunshinesmilelk](https://github.com/sunshinesmilelk)! - feat: add onWillStart hook for ApplicationComponent - -- Updated dependencies [[`efec026`](https://github.com/difizen/mana/commit/efec02698841de45108da24897040b528d2c3ec2)]: - - @difizen/babel-preset-mana@0.1.32 - - @difizen/mana-app@0.1.32 - -## 0.1.31 - -### Patch Changes - -- [#79](https://github.com/difizen/mana/pull/79) [`0365365`](https://github.com/difizen/mana/commit/03653659a7400430493903e33f44dc2f048576df) Thanks [@lulusir](https://github.com/lulusir)! - fix: localStorage is not defined. - -- Updated dependencies [[`0365365`](https://github.com/difizen/mana/commit/03653659a7400430493903e33f44dc2f048576df)]: - - @difizen/babel-preset-mana@0.1.31 - - @difizen/mana-app@0.1.31 - -## 0.1.30 - -### Patch Changes - -- [#76](https://github.com/difizen/mana/pull/76) [`14ea61a`](https://github.com/difizen/mana/commit/14ea61ac7ecc717b3091687b9ea4ac0aaf1e6ecf) Thanks [@BroKun](https://github.com/BroKun)! - Use a consistent version. - -- [#78](https://github.com/difizen/mana/pull/78) [`92f3efc`](https://github.com/difizen/mana/commit/92f3efcc9852ff7230d9e029e25fdacd9d529d55) Thanks [@sunshinesmilelk](https://github.com/sunshinesmilelk)! - fix text color for some components - -- Updated dependencies [[`14ea61a`](https://github.com/difizen/mana/commit/14ea61ac7ecc717b3091687b9ea4ac0aaf1e6ecf), [`92f3efc`](https://github.com/difizen/mana/commit/92f3efcc9852ff7230d9e029e25fdacd9d529d55)]: - - @difizen/babel-preset-mana@0.1.30 - - @difizen/mana-app@0.1.30 - -## 0.1.28 - -### Patch Changes - -- [#71](https://github.com/difizen/mana/pull/71) [`24b70a0`](https://github.com/difizen/mana/commit/24b70a036be7f4d85548db720ea5859b5a3e5b41) Thanks [@BroKun](https://github.com/BroKun)! - [syringe] Developing multi-instance data structures becomes easier with auto factory. - -- Updated dependencies [[`24b70a0`](https://github.com/difizen/mana/commit/24b70a036be7f4d85548db720ea5859b5a3e5b41)]: - - @difizen/babel-preset-mana@0.1.28 - - @difizen/mana-app@0.1.28 diff --git a/mana/apps/react-example/README.md b/mana/apps/react-example/README.md deleted file mode 100644 index 3c5643f5..00000000 --- a/mana/apps/react-example/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# React Webpack Typescript (RWT) - -React Webpack Typescript Boilerplate with custom webpack configurations for hot reloading. - -A minimal secure boilerplate for writing Web Applications using [React](https://reactjs.org/), [Webpack](https://webpack.js.org/) & [TypeScript](https://www.typescriptlang.org/).
This project makes use of latest packages and configurations to serve the best environment for development. - -fored from git@github.com:codesbiome/react-webpack-typescript-2023.git - -
diff --git a/mana/apps/react-example/assets/icons/LICENSE b/mana/apps/react-example/assets/icons/LICENSE deleted file mode 100644 index 45a8fbba..00000000 --- a/mana/apps/react-example/assets/icons/LICENSE +++ /dev/null @@ -1,3 +0,0 @@ -# Attribution - -Thanks to Flaticon \ No newline at end of file diff --git a/mana/apps/react-example/assets/icons/chrome.png b/mana/apps/react-example/assets/icons/chrome.png deleted file mode 100644 index 8232091b957141aec5d38d0059abfee21a8a4a15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1334 zcmV-61bJ{KduwXu!SNVT0Akea9#0T5bHRpg^S&1fFrctzI#GyMa7Tqb)=t|P#=6W4E z6E)~GQb1e;C;$|I8_{dUzw~QN|2n|FAwl8DO}5&z*W=cPMA$OpLAyW!26QFM1JpdA zg9XI!08jv~M}=95&<6_WDM(j13erSJUMlQ4NuXVz0HZq~H3r>0Aj(I;I@~aL0~jKq zm{Wi~GeOalPxAaU_zp14B>>lStHo>D)uFQvaO5Oe9l0qaCvubFK7xb?IRYsF6kwfI zz>4FqnYL}uMi)(N&!)+lT$+B`P1s3K!F9R;uao>5$=hi9Hj-Z@`4wFlE|Zw?r$zy* zW))f@SDFF_EUzyQe&+bA;)>dGG~^o5kzw>q&g3*b$?aS6aPQ1X4ENo^@bEBaXy7*P zcb!1*g>2Xxbg-Y*5^C7bL=q8joK~UlTm+nrYB6BI)Ai-Tvifo?KUR+P&+_m`QZ%ln z#PDrra>wf>TdA$q_1Q8 zwPmO(ipTGXI<(SR+h}r0{>zn794;&z)#!os76=$%4}og^5dgOf=~* z-XsO6S%BGpKy8T_Qd^3Ux>78yD}%CfBbtpGG{WqQw9 zTQLSr#VE-~5JB>Fp6SEh6S3;ue((GIY(Ej2j67*fvO_O`Kp2-7$6thJV6BEtgKp`GEu!-}q#CMyp@XIVL{9*&A`c#~MIS)|2 zF{`g*l2|3#6roJ~(0(^=c_w12QfA7hY`t=JU&m~bB$N=DNRA}+QdPj^LB!8LM*EoD zD;J5`{~%$D1PVf&A!Sr=sJZ|_-{fFP zWjfl=YyHWs^2z5MAT1J_2$4$}RUW?1!Oprknb@=C7L_R7aK6@@1K1*AFd-0TLSzBY seVgGGyO@+dWC$VPg#rc42mc5B4SXfk)Xeok&;S4c07*qoM6N<$f_#g8dH?_b diff --git a/mana/apps/react-example/assets/icons/erwt.png b/mana/apps/react-example/assets/icons/erwt.png deleted file mode 100644 index 4a3f4922a12a0be17728d0cbb42187adb7fd5487..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3435 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 N002ovPDHLkV1n6$(8~Y- diff --git a/mana/apps/react-example/assets/icons/license.png b/mana/apps/react-example/assets/icons/license.png deleted file mode 100644 index 6161c428ba95bd76ff715a8ec61c0b2d299bff3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1020 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 X=T}y$S0MnI00000NkvXXu0mjfhMUpp diff --git a/mana/apps/react-example/assets/icons/typescript.png b/mana/apps/react-example/assets/icons/typescript.png deleted file mode 100644 index 90ef114bda56311488cbcb9cd4a57df9e21af4ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2641 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 N002ovPDHLkV1n6$(8~Y- diff --git a/mana/apps/react-example/assets/images/screenshot.png b/mana/apps/react-example/assets/images/screenshot.png deleted file mode 100644 index 8715ec1e5fb57acfa6aae892f3230a5747d150c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31606 zcmeFYS6owD^e&2hqhf)L2neVkNS7MvB2AEON0QSM>iXhE+8OX0YeArBq2ei zDJ66Q2_y3U<-tKwGZ)UZ*<{ER%HOBXiZzVo5H{v=gaF&CE zgUk4Vz9k38iB}vP$8G;Q&EB)T{127g90OSz-RG!BUt48wob=K))8*i3Oh0${>=b*O z^Th)P5C_MF?mxd{{lLoS930`v#`?O};V$I)b5E_8idZZQ?!S&@a@_F#&26cB{mnxB zn^V$mHE$j`mh%O)2QnNd>v3U-0CF3`5i=FmUWXgBaD?c{GBMb5zL0we?>em1Q{CGJ zUrKe4IdXsg>zEklu@hn}q8f2%C@)Vb%UBUsOs^5jQ^ODox3wfjz-UnMkE+T_Z(jEB zIIjO4jD#Hf^Y6wz?!W$P@Bg3n|JQcNw0it_Yz>(p0RUhkmVW=fTO!Ij&bG)(L|t9r zS$9@|k57=x_iNzeG5!mH7eDWDUA=QX|70e|pL38V<;8)d^)^Z%X@jPv*j>Ce^RrPt zQ=5J01F$i4??H@kfGDT3|L2Y2KTbE=Za_JI6FKUot@`Kz2Yb)UqgMwpxcgn;t*xz2 zF#8OSgA;3etMTfbErd%O=db^{rb}NvRrm9##H;@fi>w_~#Yc|3;Jd`$Tq&s}RTxH| z|8wNVx1xK0TIPjN=41!Y|MBfVHu>MRw*QxpTr4^~jHU{`bXm<|?EEfG#Gfh2@f50> zFSnsX>;_$YcTOA1jKx^U*?w`VKQKF3PN0s0@cq~00Wpp`h@iqYCjCrkKeh8!fYfA1 z4RCZA<65=qm3jxm2mCDQw>`$hBFR26M8QEDobCQ0R)*vj6SKr!v_B_%(1UEnf9Bwe zd8~7gvNN9!vBGug8slSfV>jc2p3r|-tRSM+U(zW3e^0b4`$Bd>k$WUM38oITx2}#@ z-<*efiR`E4)N3zrnZ8)*!p}=J#w_IP;OYxg@nS6n2)dOKVI5N#!LnBJpx=RQbhcLe^-_S1k-xW+gxofI2Z zgWCUBqG`T;acLB%jN@x+Hf_Oq4=I%HC zVz^SZFP^t?+GDK`$a)A^Y8XFb#{E``H~(lvXB^Y;wm3;V{70dWRL$-u@6s7O^Xi?L z-}W&x*J=&}4k)tVm8y>W(DxNv$A_6ex$?p0DB~p5^UP9T;Patx4b1x{&?RZsa7Djj6J7t{y_zOP6;g~-gBR>twyTAEOp@GB)YWfieUZ)~-? z%n_tc=3Q_x`fytau5+7n{foj2?)JwPKBz?Mn{Pqc`P%Nq2(5k3C{*G5f6w#>ZZ)k( zN_ek*0<66zL2K6cpf9iPuJ%Nn{Xl$s@^qQn?U$%ef$eQtFl*NXguKswNrErUC~zVK zXlj=P7>bc+u~IW4GTn0uK!TRL$xp5u?_-g%1p@sxKAYjd7g7$|hUUlj zP>N)iFmM9*my~swYkJpA?EqayLDKH+ec7WP|LpbHhdSP(#yU-)g6X=$dTl1ybqX%Z z)4GvUFf=Cwpjefta6WC#iCvgDpgb(#z<$KX9=ar*yp!Djp|K5%E2jER1T|}!1n%^; z zc1`8Pu>PWY4Bf$M`C-=Es5o^u{JUTkO1Sx;5Olvb^W zV7hltOGG}I>-fu~6tPS92sVV;b=9rP@ozpJ*scJWub`bbDbVNJDNIGDpJn*OaK0nl zq=w?)o0%=_CiM+L_>TE^JFezy{I-Tvuz(mF!n+2o<{bAcXmKjov2LyEutS^d8{AV(fBb98buxzabh_nNY>e86 zMBiz0guO+Vm>Gl+AVB0wvJW40%C=z{66Sw$eSfrw>RT^Vs!()&Xjd%JD$ztA9)!a6 z#HY7<<8E?%d&z#75}UiwNBhGPp+k&0pL19IB7IU-nFDx7pUJZYr)<&FX0L|1`d6WY zQd6BwA6c`_LT7sA6sUo0_e-Ptcz*AdwFAi|^(`z2`<#09is|SMII1lAitE$NY8{}G zv5lSNB4ipZs{?#+fkAFqQZkJbwl!tUa zPC$-uyc~MVcFKaY#MNYs_1cVxolhR1viS-+|HC(Iz>_5#TR{SLpUQHX{2@rsNU$VZf<2A!*@=?rS0HlRESwEt8G%ohXMKC;5d2$hY;!%1nq zQVq`a2v$S{9lxt$Oq`h7&qrOST`K|cZA?{!LNutypDdzJrUQ&b`gM zy-~o4byX3$^>5ofV#|QxYt_yp@`D4-waF6iY9a{r%E-p!_gK2ze|@lM)H;E7*>RYs zcaQi+7FE3?6x9)D0w?Eu;;SQkvZ?$v9#7iK9F~*=C_MJM3lfSbPoC-k|8?< z2cC$`oQJZonEHod+BG6Z#DaQ3uXi<@t)WSu{>HVe_cEmlRWaATo^((%^jeF|TDQ)d z{COn5tKUp8l#TMwO0#h(8*%Z~Hl!Yx^J6*R%TkWnoWF%_J?Jko2{Cm$SZa{5B0HSh z1?uc)P!2YB-kCuW3!06{A~XZhKr&*r+KaNnyHJPSDJ4m!KeS1(aI8W=WT_XW{`ftx zDCfyh1h3s{vW0e)1QH`JeAuR~(V&lu4NulS$g|Ggx^EM6Lp7ZhN|42iah?TMkNWR1X&)EHa0q^SMR4we^$_r`%43lQ#jpbgOK0encRm;u=rSnHX zhI^fWQ9;iTV60_rwuQG~-~VqGe~FIiTbBueCe3 z05J1;Dt3o}*W{FE=*|5&8`^z~9SD$S>0)vrOX@a&w9%c2A`0ZQi7Wx`I2@$I`>Y^B z3dN777F&hJz@UZ_Qj?v=9#|F@BpLbMpBiiW9)GPto=NP+=IA(@9Fe>te=0REW?I`t zFYIkcb=Aw`?>I*WRiQ!#g`O-iZfwA|p?>-?ztPZ<;w7wgLBoJa;9vH!5=Ar61iR_V zbtHHd2ROyD*TeWtcBALN2!>3w7}hbywv-!zJ-0%1Fm%dM>AD=V`(jtQBdY1)E1fQ? z&d7p`Pb^PEP(co}Ut(trqS|ji5jp{gEeAq0hn>HsVUe0oiZ9}~Y-Ae(r{9d-@}0Zf zacgy-XTVjn5=e+CsMjQ!Y3-(_lO|YRjt9)M9L&Gi`5vk)usw%Gtl0fd36?!_3QkWH zQauv4G4ru#|YTm4RARGZj#mgp|V!{Q+Q%=n}1f=Al>RRwYX;BpLuNC zIAi@Y_J>Mnyw317n#chCd-#Q{?n9HUYCCRE&OAZC|gtZGs zDJcySjor!WvdlTat`jIbCt9u7qPTp~_xO8h{Nz!|5_rfhO z@Zp+rKVHGQH-rwJs;{5yxRO;Fs>jpOmp$0BI;`mY!sZMle)vfBgW7pfe5l<|g~%7W zu)Inqn6TUJ*ZFGO)c#M);sw^bhBUAca0(1i_FI?& z^vAY0n4q)F;H)a&B@4t8ljBj8QyeYve-eS_U$I)bqwa3~ur98dy#?kb_^$;Qu(xxO zF*jk!l>mCuN`5mS_hfEgq#AuTt5P2#L7zZB-TLzd<*1XaVoizV^p>o=M} z1ik?aE)=YLJPkC8jUQ$Pd^yD0z;A8r&0x;7*1{b;Y#=1Y>OcO%Wui}Zvk|SGZBEJ5 zqqe}c4E@jaC`!Dq%9ZrdlT?shkwofXj*k^n-+6y*D7NxA$EEZ?#-6N9fY{Y7zw7#i zxj=QPT>bQ;D76PyE&{B5eDv?R5Trb5Zl~F+wdTV^04pjwK}PEnjXs41vd7%#WK--= zW@meHPRTb~9~YKewbdjwT=bl~*KGFSRchOi&HnA?15rfh2>DTXT(#78D=GbAMR?d) zuzP7^NcHl5exWD*s*T@jE(HV4%7$;IAr{nUUU_-PjswAA!x0O`S)y`I*9fM99B(gY z-s6aw;2CVKt9Qx`-7^33O&@-J7!@ZEG)%6iGYSOdrgFQwjNv<~^K|)h zD&GX>++Cs{P66{zQgc?N&aM6K`-NAKDG13Df0w7P;7lnn5DirP5f=12VGrju*I%RD z2zycxi#OE!E-^&Iq>t{zqgt-x`YSgj=Yueo0an?8j05gnYdZz4ibwI1O0diDRcFui zb^IEG^I};tIt!aHU4<>o0`Ww}v%MklkAbsOHICtdCjy6lf+qw-#-MAS*(F_f>h<#b zDyXCLI&KwPzWwWpyM~O2iJD zFI0sR_m9l`P=PXy8!-)PqR^bkl2rBP+@Op-|8}FT6Do$(vw|q!0 z=A&sf;q>`s6~HySPlD`ZKBAgM5IX2F>MCadu1$1+=gT1s>Y3ehi29Of3vi4_V!iN0 zrCEA|ug2KWKSUR7ohR9Dw^|vuvmib-Ej?_Zr~kZ7#GSjMUB}`@!E&nFLfBW<(=)NY zTD`y%(56+dE<3Yl?A3V~96g<$!Th>I1&%j@u8^dWya_v%aA@@{NJ}ZGf!P1#;^25LR#947 zIu#|NzP~TD`r!`+b-y{v_Pa)I2yoR2{skTS!M*9Jc5Kzgp;@Tr|HP zd7hAYjLmW;MP7(hVvoz{Ipf=V--y)IRJ;cJqVV|mcswF}wlle3=xcFr(U+%lociq~ z|Kr|7i)gmXJU3A#@lRTf3bIE#^1UzqDw|eC-VA-4Hmz6L^`ZR+r+&$QqvZI0fxXt) zo~9SAkb1;MX7kmeeCBd(?9%}s1OGv#;dRIAuu)^{>ju-b3j^`&=M-x~hC$bal* z{jB2q2oYr5=|2Om^A`h(y<~Uw*Y5d$`Hio$d*%3-oq+s5+RRk_+Q z{zQ2Wj!W8;oG-6t-V2eI>tNqi#~WDmTK!TaPwdU(^YutApHL`KmcetG-HWdJHqT|T zS1~7aE?-X3c(t^k$i{Gn#~VqH$5hPK>dS%BX&tkT#(Oz)vLC}=BB+H>MO0D zyYt_(yUwYfzLu2it}2gbcf(p6P(QJIX~$FS)k=_)82e_B`}3!fLR~y>T*{QX&b)u9 zrx!=Bk1{Ln(x(b6#%w5eZkcGoQE0|w+qi?sG-J?jchG2BdK=bMW!)SY-qknN(lBRi zI6R&}0N8A`bw#!LHPt(B$*s~&c1c3`50sw)ei;!A!z&n}zb(W|cLo}Srw-!q{pPD5 znb|px&@o0aW?aH`_qB&zv`iTJV9tH-b+PM#U+D1k^Mq!L_0@dwHZ0@<0+U&lsMEhp zCKY#0@4BH?JUZH-NrD6w2`F)KsE={VhzZfibpL>a@E{&Oetd`@Jk9+DA5Y*s-&b^R zM}WCj>eJSH^vV$)Qbmt+NhQjSCwOH?@;rx{(7(Ss1>b+|uxtTRcewra>u%)a`U#c@ zgK~FVwOG-0%3Esb90^hqa|<9)>CyN?`y4!KR-wV<8^y ztd@y)i2@TdA6_@|3}X@I{spd64dmEi!{b+91R@X0wE~eE$6D5=b$ka_O*pKaB-l?z zTxr0=F30TCLfh&&RX=v_W9w7i3y)3{`U<=9%jMf#A^Q(Ar{D zV}m@}FzE(pzNE%Q;F0(Rk=0bH>jRFlKWo+Q2d#IaYKGP`Sg#StZ17nege)1({l)F6Pepa8y_R?Qhi`SNTrCvBe<)grq?;n2#6-636 zB#O}18d`U9<)w*p^!LAq0G)C2Mqf6*OA9h8v>GJ6(x(M+u@%_9v3z@eO*1c7w5l5G zWIAbZ*w&aIgBxAguFgq$pzf>1gWu9k2D*#u(oYXR^0lpU@%lW! zQh#pMbu3%rJU|`-lad%H9LCbV-5@A8tYR!s%ZxctgZ}_+>t($@=+VxTS#M$N%*+as zT7&NP0~C{%UlLKmU9fR?BE4a3piZ=9rRlr%ky2T zK>PB`j-uUjBSgdepUSA(?DWnL<2}pqugreVMGVqwC#QcUyG@)iCB567v(L(Zoy)`t zyP{XZ@`Cj%-bh=Fs%pzSd(yLo+8^Hv$dQg9^fZ*|%Coi}BcB4z&0)4Cr3}ngoz63- z0rBEb)X4+_q`tw})}McqWaeZzO6zsIe)D$m&CI@A?{2Nw>$l&Ak8sm-0Y#~~9ed5u z9;S1F@~F914`H1j>jx6v?G6^s_d0t95SB)AZ+gLVZR-8zkw>{kA-XLosKvmZez)3A zNqR1jVcBc7u$kr$#08aH5`48}@h07LVM5JNbRnNdog}oZVSD6rlcYkOnr_>37p2Td zJnWR~^&_Z!&F*ADq>=sLI;FYr+q-VJ_OF4aam%67+I?8x)c zI$hcJgL(KX-L`7h`nGV)fdO)FAsK7+BBLJW*_npyn5g=TOR@x7<=$VVI3kvouElf5 ztO^b5xL+OdSfdPLpHLZ%wdP$1Czutp0M(H=>$%STbl%*Wsy5qJ#E^QyKuC~rovrqv zbRBMq6({mb&Tp>cA=k_mNun_CP=_HVMFYx*j1V8`a=;YA2A$I!`jh2_C-(L+E2aNv z;c5N36SMWtcB}C&(i+of2+YkRq%DYchaA+0*iPfu`C=U`Jf(yV^Rle(iBWP;8mSs9 z8w)j^C_IM@og{}0IE4iz`a<@3m}_kK+|FB8U?#K?;f3@RQaJ_p#>;TkM9gZvjx~$g z4IWoC^quC~WDuPDR0IfrOWKXnZkZ%WbSa_7PIZ&!$!$Tcm2=X1>-L3hy1z9fo=sXshwvG~SbTeOvdXqPNFe%-j zy|a5wlrd`^4MaH^H0aap)(_Q+#fvSA95+b=*HtqIfVBDYyy~QNji_2;>Nw^55nwxA zz-^k^lWj2(#HF;Is?D1S%gEPsuSVZiuZqhEm)3D@euy9UbX4_1jteVMrb2Ms-~h$V zO|+Da;mE%JCgzhq86h6Nn1JL)EGu(aMNIfb{<;{31u3`gUqpAxQ(LXhl(^@)v>z&X z=4ycq*9D4XhC{_yqVF)mY;8Q0h3B`y`2wX7K3dJ87DzepQ5;C~I7Y49X+r8;3jq+j zbw~#tWH!Q!5i!;Ga}P> za3Y%3-`#_D_|_o8ZILG|N95ccL!O1=hM9_16hb^<8mOYjU18jCl8)3dxgUYcN?lRuzlHTSI6!);{pVMv!%8>S1IJ^BiN#f#g=|2>yWNViTaZ5u5JXg{a#M%Dq&ep_&hpX?DLG zJbg;Qec)&%()GE~NC~aa>Yo(%Zr4~KA)+5U^+7L#4A^eC*r^x#AR$evZEpOBfLHxZ zMl>e>2lY;W)AH0z?7*9@LtTdU?0awoMvodAFdAB0=Xd}4q3F?~Z`(Xyg6;ykG0chW z4$Cf(WM##rSLo|!wETh6?;k2=rm@=u4KoR zIJYfp3Ed&;F1y5xzx%Q73OKD@E2A|qN4~jxiE;eDWKHcT`GsSHu)FR2#@1Qp&oj#x z2?M!Pk3#C@Qfxo1slZ!1Id&E80!0cJ7{GDc{9_r< z8jkk4fQ+T&_EusdBGTq}~)M++UQw z!*(PXzh&)Z{7~3FtfQJMHxJ^4L@?Sy5JR) zu;XhMhcE-6lWJC;gzfk8;Xe!}6r3D&{YpDYF8Ljd+e;DB&@gfAmrVRK-T2W!SA&@x zM0j-c(wy9lASN1>Du>Oxc|&y`B-0kQEl2xG9}_EGOg@2rT+*`n?z5ATzrAPUGYNB< zF8(WO4gMa;F)eW5`|NP##aYt5=P*%;Z0QQmGF5EMnvKMuOBu!s-GJ6$BJj79Zk3K2R3oOt~AlTXl`O@r0e`#bD?`a`7^`hq)y%iqb# z4dKe)D|Wl}-&mpkQ`FO*!l4$a=ZB1ehn2tromVuvlsfvbp(AhwMM~uCl_rXS(%p+g z|GxTkP5`xtG3U4IEGz@@wFRg%T|2cSA@=H?U5#UdQ87fXjKEv+rkCJFT>M#HifmT|I;}&jbDv)+Ukb1-S9);zN!Mf?^Bk&PpC^* zT1*)pTBfQ-df1j}TmHJ;&FK2UQXH#w$ZYLG9i(T!lePkb<9qa;-m3kqd1UVLkV}0W zc0%O4?N+j~di{7LvM$@xseau!G%ZZIcp*ex^@0ym5pmS&`+}P#Xi0FMZ8QPiWsLMC zv#Dp4UV@hM>io;d+nKL+W^ zDQ54##Wwp(Jqo;>R{8O}wHyyb{fkcO663T=U{%=BHC%EL^X>id_J$ynH^wluB@wp{ zD29klKbLt*+j~Yq$x8WnP5*LyUH6=L@~~6a$2cSSFncBi<(ww%H1y6yrEY~QASmA# z7L-jf_voqVQq4xXqGZgrZN8bR3AAb6v;t1GkWNsp_49tEl(=PEJao#{(H2z_d#AB^ zw>R-x&E7zDOx?U)txxXWL*CB>ZhF9$*eY6qRbfr6%y!Vcbs;Ibt-;h?^tN(l0Iz9#-%f}q+3)s8Yy+m+%y2e3VdisG z>1=dlI@AZDdO&^2Yc>%T?Mk&kg{Aea&o3}v+ZFAfAgeMHO@F1(@i?8H=K5VG3R9VZ zDxTAXa?jYt6+Xyw&T9R+rGRbkWjrRvkyi@cB3{dDJuEv5@y$Y&|bdsI|f{;g);0K)HvV6f?GtzgLD zk^vUAmFRs+`*!_0wG&n{ti6@%QC{T~31qS{RH;go84PG_dJ>1%+1y+mIK0bm<(Xd| zRuXn%bj2Isv! zK{E9XOks3Yf(9o8k76eKj%t;RTUnjK=*t9=q)DQ#>3FV3nRwM)VZYM! zzNc3g{FeQud-+Ii+tt@Pt)z2$rLODsnSovh+>QKrWu#=u)GDLdS=u(x=6O{@m}<5E z^sW3=S@)mQyw#FblRudStznjv%Ibqdl`F^7I`r0Po7vNL7F9!kj~T|aV% zR0d~CE3(|iDhF+5dx=%Q-^-Rc;$OEqS_d=T=pDAjAK|S!)6FXQoljYF0dr4Edoc)) zTFo+Zzu3cCU!?JZ`akgID zzTQ;qV52nr0#x^1#iI-TZa#4-8!Iqt%2PA3Jd}v0%5;k~pjFRLjIFdbM{x-#e~(Hy zO2X^LZL&EnjDP@^S$-iBX*qoKhH-wdDfF0%!Vb4{L?Ltq?kJaA40)7p7Zt~C<5J;> zzf~8r5#;e=@#4J)yu7zsGjw&jssG7~{vVVZn}QqG9cvi7_BRJd`F+snQTpP65pxcTuJYne%i_whnNfB%Ctco9~!Ij`@WVB7MIg$Y)p7XoT}SK|89P zg>SlJ);j`BA>4q!W38hlTTi2yBWcF7N#*$W!iyL!WA}ntm^X zQcm8U3pDf$@>o&En08(%slEhynmQNRi4`p5@?<7gsCcKQj-3$(jA4UR^EyMn{!Qh9 zTN|N26;GcV@!-&kW9J3bArYo*)Th!+Z5x|oksl+4R;%Hl?#q;vV;pcZa{~i|8oGAK z*7i0MywV^bAkYcc>WQ_A{&iWFwGS^pTO2?G82K$w%+6rCW zo|d`b>`u;~Y6PF-^Xtjk)8Gw*@u6BZY2*f3%#!;Y-7rM!H8SgSc(j>Qo>k5ukB;^S z{~!{sLdEZs+8A>o2NrEn9^JOOe9ea(EChSe2<43c-Kte$D)QW_@5Z5hGPLr2A(6P8 z7lnlp3Bbe)ChfI*G42C-FDfJg5AiCVW}t<1o5Js?OQY@hKPje zj`t7J^7a;grx8NKHnbD7LXLWAL0Cn@c1UUnY~J-pzj&kR*sg@X$(;7NIaa87iV>}m zS0}wBO1memUtlVwBi)hqsJF~g{%<$Mx?=h&0>Vb(2fE>+j5U&^=Gza6> zFi&L62Gc`}AS`hq-1&jLg}H~Ja;F|%&ZRWAgI|g=zRjoIBz8!~k=w@o^`0J*$MwD5 zQ|%?zA&|M2n1C0()Qc>YJI?!&38keEevP{B?v?2x{~kG6>Pp(=flP`G-zEK9eWJKk zsz_On7rUrc=E-^#Yns~`aP&n!>R|x@IK7;I+&Ox{Qsr)*&XNq4CXRYoSE7eH3ja+Vp4e4`|?rcM9tJT^r=D)7$tWteZ(kCL3+nj!u zhUgxb8LYZGdr}b&l$(wwG=tH5&!Cn&qYt%!M4=Z|YPP+RjC;>r#e(Unv~UK#53{FG zeKqP{y2jvV1x2gecV~1M_U#inRGH!13fbx!NI+_{)?%NJZ?Um|QIqh5L$lmtj~&7W;eml#mHxJ;{$qTKL{1io4_h7ANY3-~uuZ6*AQ8 z-FYc9dyn;eTRmdfzT=)o3`1CWzI*?>KQO`BOPpxlCxf%bP_%q+P{Y*V%V8|HT zEMq&pz3lWmz@(b#T87nu5eFuhxyIg{FkG5(;dOLJ|-}GbyQqAtoh5Ao7 zZuzMYw7WZ7ZM(%?E4PlJyao)ND+lH7R>`7O*mc@4+&^hJ6)$hE9VZ&JL23idLuV@| z1FKI5wqmq3QfHT|_u;AnM79TNT=X1%Lpg`IC^6hAMww}GMo$uLt3i^+`5n=r{jpwo zR!Q?Q4(bf4VdbTm6|jnD-%y(dSyhb82MBa0Hsy)sPxhCTWOXtpX{|SYs$W5#ZnHt* zUwIv8=oE9FHv~QUP{Yn?7aW08b({?yzzk{msg}~1CyT7t^q=Zl%}5t_bRcV6%UzCM zM_PAA5mSalmd^Ei6P^&-H_Sm}?A-sXw_N^XSlCJsVGoY+wRTnhR{J9uW7oyxCpe!_ zVq#gH-VSQu~&_U=@i;NWv{=)wd1!^m+bjl)!-CZQL zvM+64m`e8>cA>`f9S&Abz-2vk&I_)RS+tGZ&;-@@?oOJq!2?Um*V5i$Ye7Zw+Q-F& zYkqqa1nk8D`N`TM*d&r9JS4v*#^7)-6ovSgJe{UE4J2H01ilW_{3TDSsrI=&{TJb@ z_sCH?&m#&vbi^CcHTG|jA#OK?Dz}iP<8Q~DN%XXsUY*j~>~9FMgeB1_!Gi^1czs=B z(>zV3aa+udDnM|4D39jJ;nz6AheJ#?Hh=nEDS51>5f#|Vo9mf3;-3q3_MKkstz>C_ z9uEM&W~e(Kn!$SNmG=)*(to}5>wW>0*RKa1A)+$;o+8|i{iiL1=LZ}ugzQ~nZQ0RG zOp+FOI4$O%St*h3#p6{0!PD+MWsQ8kVJ(U_)t5bOf{aUZ-x{(i8PA>M7y-f0BZ7vP z=XQIgYV%BrB`i59dx~Y%;Jk;>f;?`iKE-5Y(m-=yoe z^*Up-oy`(^R|!G zsjb;=1Qr%WwBB_Wx+^l?7izaos=wQj)xIu-Sg3v7M>rxoi-r(*;IdXAnK2P(fdlYX>)psMHg2Sv&V;r+KTs=x`hIj5Bv>~=}k1F(x;v8Q+m%3Z*G~b+l zEaY$YtO!~IM`^DW@)ub#@)f~v4^tj6AZuTv`WAzu5(Z+R<>6Qxlz1uBMS%hD775n!~ z!!!UPfU4~S=2yzKZ%j*1K2L)@&2mT&K-KQaYe8i;c9nfk1vq|-ERxS1iU^ttuj(WF z^k#qURQTFIEIERg4RV#~wQ$b??_VY3#?ufsiC7!7@_3(_BgT;)xhgi6;rWr1WPzA> zm^n@7N2+a_%?_)`EqZS0dQ>VCb7Vn+OQ0tiJFNtVlLwb0&lq$~gCoxbSdvRRiwT~? zqbdB$HVz+(g62OL_?Q=cnq`BEJ!7ejNUapUQH{zm>!^ob!*?x+*+LV`yQFzxP2x}( z#@)rLpxt}P7W{e-uZxqjn@78=lLplCNiu%57yRd{{@ILcC6JgSwAhuMq=>q9Z5$5Y zmz6ItFaH%8XBgE0>bd9_#U?c|W7c<#F)m7&B5)tOAY?j~je1PaPs<*jzNJKNSFsAq=4&K}gfu=ulO*m~xQ7PH0p%R2WEmzjvMg zvsMWDW%mI;cMuQll!WdGVy#NhM-9C6qPO2Kc^R|TkfLxk2nIC1?v*BsnQ<<=4D^}H%8BEa=l^*-5` zpi*HDTkd@C^x0|zxKjcO7!rIjrwXvyL*D>7*SaqH$*mS6PH6yERt%DnWK~88Be*VH zp=tUhv#`U0D{45k$dN2lk!?*ozaVbrWbUw`;B5KXIh}Q2Q<0M4SA_%BE6z~b(ySgG z-a6l`MNlpJ1k3HGb&)rB@`!WH=|7=Z^D4x0%KRdHb&#)Rz4#vW1M@$91^D<_!|opS zWGU{h&as~ivi8ntt4@OCHtWbKXQrNRbtETta1p1Q#)y9IIPA{I{Tv9UFM`?8JXYe) z)nVOZJ25Vx(FYgfSE#0^W{+CF6x$iIzoJ{=_#?DR+m7J+4%qm$J?{Rx(uEC|HK~u6JY)ijmQ66^YQ;_d(;3b(_sTZ%k65z z9(oZf9f8QH&iaYJf%Xkn5zc~31*N2QRhjQ0=N_ssM1L?!W9C9#*zjz93X6cK_or3~ zszkj5d}zO_;s{W0EdCYbr$jkOLihSMXccSy=<74`ERZ%{E@aN2BO-4RHPW`!*hqCbqO>#hlB? znut7g&>kstV}@3NT1pstJ$)jnSIW?x(_IF9&qQBmAep_UlhDSS2!RQIX$w;nc8}3f8 zGwT?9_u0&NF{Us^4P`jko-(?yqN%&&QkK678d4YaP$=Uboc*j7nUdL#dGKDF(xEm- zPR^N=ldpHO{c_ZFlcA$7_sqe#arwt>mvI^CDb-s-dX5z5{FQ4utj!nni8r$N&*kL5 z-fr#n(e`tGC98PVD#6Lj!p|0E3YWEVUOQJ%ueGehgd7s)CH#~nBI}K&$2@DHnV&@p zL-SPj(mz_Ee>s+RFEpGBEEI4jWrM{Glhkdx-AQ z2{%)B(KO~u6RFgKRI8LYS$U#ueiV$5E_(9Q(w7dE!0>G#zIM1Ey=now5AS%I-h6>e z788-(9nunsSU0k(5+A;6BC+r~V$B7V6EvN|o%NSydA6VHwvmu_uCePLGPW3+ zCRkAw0aZk|=!~Y_hTaDq0U3@odJGo3s zDa!E3i;3vFG&OyCXx6i{+`$$efOSuQ<_4Qz^g6p5(7Z&c_{u;&3&LH#PTowtR#PR= zG1ZsK4@9@m+GI<;xdw4uPIoT#v}z3PlMn*Ri@z4JX{BBZ83>(DT>0$1q!TQBp~E_P zM0y%`rgO2#xE7lAS!6x5{C-p?=*QB#=BHg6L+iQeHY)uzlZiXo1>4?(wqTKR)Uy3* zTF^p7K(5_KzXsS$y9LtcCh=`^+Jl8($zD;hrb$j0p)2FYQ7tl&=%NZ~Ie{w(idsMH zyO?yw%)r#AnUGf?=AXd7C9-AQDjnA9Uk7*#we#i8h)2h3K&EE0%9&)4-?4M z=`K1$p@R^#8U}e8-+FW9Ft`CEw5ZcHe>K%b9w$@bT696kMh3-B{$UO@ZP#^EHQc+X zks35=Ky#YrlMH13*v?zrOp(l@OWMPktE<0NWLlLm%=07J@b+<_(93!~?!R`foN={D zZTM$N{0v@%`lpl~cj1;TWi3sN^>rlaW#}i~J27ssKG&ttlq|S|m7`nsl>R4y$IqpF zauLYKhAwUVmYW;OQ4*{C!)$ovt?R_fft&?v{aE_E-OHW!-ZJ%?=fItSASYNMG|Jqg z$~vo`PolO=X>DgsI4fnAIl7vrX!*y2YiIL>2p^dC)^7a>4|8FvEoI(E@$H)C`M2t} z&9#xaRhsB{W|AOZ#@gZ9 z2j!8cUe@L%LJj@gh2zFc$wbBVv?ayD?obgI#bqKf9NHyB zJo~bkU4h#Xpa7}@KTVrmpdl$Hxd-7DifwLg)dkLAK+oq9=UM#iMHdwCM{^ldsCb4L zlR2=25X>L`_bb_X>p$@JLSup%3HNAiHFN&h+z*guz%WG#F2EM)wwmw8nK(M=_-sn< zZANq+>#CYO-9Z^A@YA+JvJo)%PUFbs5g_dLJ7}SC;d2~bvKiy4#>viOPt(z*NG1Ef zOEyB3r?DEYIEK;#0C|x;k^U|$j^}CYuy5vX(5-3|EXB)cksg=%4qN0KweF9_3GC}d zZM@Bdf8|%PG{EDEZM%s4vW^G~cR6Yj;U0+k(<9nQ;ub?T0)94=5fBl~Ghw|ABOFzr z1oK9RWRlrDh3#J|7AA~l!yK39oBp+-E*@8lIgPj9TlwYF_L#gqvk8)p65+0ab!Hjf zYW-^ahe;Zz9Wqgcx^qpbw^f2_1dzUiRI%6Wh@{>L&c%GY(QI#$6ANA^FDkxd$c%Lyy))sjU~G4BmFj@*JSO_l>g{F zONnnJ2h;NCr~n~Nl(w#iTv1H+w$se(4tYoD>iBo%GEb6}E3h*|9M>4LEL&EjmPEcI zI-wD0-lRzTHWQZ5T&Hp=#fqF1EBE0kYFqGNmt6ZK$PL%gpt#NL-s!COD`I_xIL+3X zk~iYQan{)EQGTC6ezEZob`@hxZ#iqpr6FLX^2k<@zxN48#g8hMJ#I@s%9v|>`sjS- z50%{b7fS)qM#mWzG5CoR|W7s|FD=6{> zBA8t_`P^`}f{z_wD$T0rT|XEr$&dMab&`u-#F^VdSA-@XS9F_?#5WJ`c)_$Vw|2}| z-U#N*FgzI0cCAms(gk%Up7~53@{NfR|9(ka^P;I0)cF5u?>nQKTDx^Y++YI{!~z6V znwugbB@`)&C>^9rNfbnS?}Si9L_|P9Kzi>2(rbt)5IO{ePy1ExiJrOQ!>#3n%}Fqe zH=1+xU*Txc=ZJ>nbzquy4Hg|SJ8Whx3-MpmFVz_v7ACbfqW27b9yQPEd>$nFPI@LT zL%340#Fqzs9uUs)ZEc+-j6bShxT4Y2Su~s$g&J5$`bvFb*pI2LZrS^wvwz{$)OMWv zGbg8b56Ah1a_7P+xdlxZQixenX+a(cK$`Nc4^V=0(!3isu;Yb5mT#KXicQFViMo{^ zQ38^Z{@4^au~1&{_hwQh0~hA)a&fB%qRd3Z%RjM?yt~`Ftq^h4=IFB+;MVi$Z}2L` zroGcK55QZ3S3T5ce6tdrSSy@`(coDU^X_?};39&a@7UTY%y?QTNrAxWVv=W`ESo@O zo_M6+n=p>BZ&^=fWk9>}FH3D1v>mif;zfQyxTiBD^g*FCv{ToAjyN2DB`jSS_O$%W zZwQc|WjYi=ZSf%bNHZ)1VNhIZX2N}qwE2I#`6i!?N^|9;im z+q?Vk4s+an9=y*4R3p5VJ@p-^`Xi^16J6%Mg`AXJ(8zevZJoZ=2b6A9Ob{ud^o;XU zfbh)RSFclM;JIX_lj;SMJS=u_aL}i9Z{hVt8YSro+2FGC9lKCTlKWUY`kj$h6w6re6Vt*vV)G}m@6KX)#C z)mL8a#Wg~m`rbzmY}w6t>;l|Avq_+J1ECx=Y8>}1E$x2Pbuw*j3Kg;4N!51{QUqU; z;tjDq|BoN-OjbbWY4Ty1aqihHuL%KX%pTODB%9C1SDA)p^9Ad-daVD`y}c<3Zvq1% zn=>SLK{l+4^c7(Qd3uSmK+k7bY9 zG*JFg%6|8&uAiT`Z-~1)y}v#k&Fdk~%c{9NT8Z>*jCz4?t?WceU*)`g_%44L85=LF z=P|@F-_zZz@4(R90CAsXHU0Ek6|qH_qD4Oj9#{g22q2of zp{$w^J8Ux^3+bktjN%%@2p#jXAG1x+rbBN-HdrWm4b0aUdL!G3sc8`+UupY#|0aYN z0xO;KxW(!3;4!r02DVqiGN;@7nT3U|6fF_d5Zf52%tB|{9%N~mQBQe6dntwYYwe!X zX7ORN_#F>p+<rr7V=2JceH zKJrD4K~%OCgcgm*j=O}bEvmIvp>CT?#N_J@(vEQvd0}hfwjrDXi66c`SUx7Sr_44h z(8bo2<6dNN-_Y26m9eUvv-I935XBu#2R|OG9yW+@)LVt~({5Bd?k+C4WHJRLv)5>6 zIvXxTj0_+Pwdg=V{6R{KU)v#pkMF*O1HtW(9vHQ zSr0nQwzm%~c}ub%1(}v^FSzKbbj+4){g#!K+Pb?Cn1kFnq<%^=UhE$YB%Xh-npPeF ze|<%ydBmKr`8~O6Q*34xNj#-=6<|E7HVk(ETyf5t-OkmLwc4>=A+Iq|^f{7d@GbS7 zkb9j5U#85eoij&$IWNnK5NxY>{$7<&q6DIWHbzRK408=N5)+6fJFFcIF2B?8oC0wR?5vC zrxBDXkGcr^VQCk*kMF`p)rKcpPHC%Y%Yp?tfOFrh$*dUG)f&p_I__#hz^IvmJ=Djn z0>`1+>9Pf(UPw&GRr#z)(Li0V@Uhj!VtTFnM|eXqic4ROP)lP~KX?3Du{370kZlks zs3K9?t*Pr#KcE(Yy|6wk7fr(qz}T0m#RB-58XcQ-Xu*SyEssJ5?~RdfuLGh|JQGdL z5br&syAfD26X>w_Qmyw_cX`j{&26@GF1|T@`^oBW)pl|QY3{()n&DcCNt&5+ys*+B z>icMw_#Y91e<~FGsF33xx`^=F$m2S2ilX4fCG8bPOL$Nzdt?FX`~@MddrFNmGLs&^ z8;qQ$D`p*KieUW>x5V$8Z6sY%7OMDd=%0i;u8y%A>FK(9vCcA}6|$4EBx2I2IQC^i zt;ZSjb4|5+1y)n+8JqMe*$r%L7gVD*tBzRgvyvXXtuDmVdpyPuB0iQ`=h%yrJ059+ z25OpkrV>KOTdX5n+J8#HBr{`V24nIwxYHA?L@Tj!NxRj|WzMXxR;tDO3|s@CbzW&4 z8j}s*9WK3KRT2o!sjLlJc0!8^Bx>$=jH$EEidV!ylAKO8s8%iy?K?`u?r)@%J|ZLJ z``2kbS>u$l&P#AfFaOjPyu*z@hBb_BGQTpJIDeV8 zh+bTw6g~m)lTe1G;v0&XH+IqS1hxz8a~DcwhVsZRh_ds7@ArP_SY$P>M0wh*jqkIy zC6*8I8?KUUMP$U59XrOaV!TPDv$C_=c!?L-vO@fOgJk3Nf!WPyhh=jq**M6ZQ9YZR z1rMoPXD1QE^_u!;k>aGb%wYN{#4sj1E_r_y=l5pouJ;B*P2sY@WbM&W564}DTy@cr z<*P1Y6=sIAYZmOEjq_$IW-E{zeyUcT0pC(f$^63a0~(k4$=vVTlUZ|9Yi?cnWLo(Y zea(bq7u3>v+2L)_QhF0_6ePFzXW~g8FRLGqn_o|M@A7I~u=Sxc~#T`D6uP2G1PrKz8UlUbt)o56s6JrEPq7Ae= zON33gqxr&(KinCqTpJA#0_o8)EUtN6MCPEN_p`pY`H_xFJJ*4124o(<{$Fb!R>DR;?GUVK=?DUQR`S*g^{>V6Wap7bH(0o1F%EJTqzil=p~J zE+w_K&z{6k)C#r1#Z@~(DW-nm+8K@p@E=0 zFe-pLjW=|9M!};9CQ>_}a&zic1{X)gUU+Tq(HR4I{Ge9%N>R?Bu^|Tm33cUXw3uf=sSe<-FszrHUWZ zuyctr&#uhJPGK&teXjE!g6U=RIqC^X)F{DDs;IcrN=0!gzG=4644%60IJ*WW zqV`-l;1hBIQnbeb5gE};_5Jtdr68;3^h%r%P4%-J&GbRE$gASXwjfXE{m3oJv-wOX|9l7_!1I7Bse+`CR?^-$ z>r#}`~-)zoa-Byta*Q*~f-1@Q(5sx%uptgEFf%-BLu z>CNykYv2iZB zS-8o5``!mz*ozj^aOBeZyZk4Oh}gvA@_lL-T#8WVtHmcEFt|xmP-}REHF2hN@1)xk z{Qm+CDXFPI(H-E84coe?ETv50(NHPH3c8>GqXe56@r333AQy$=oSa*X+(utm1+;NW zGnba?GW6QA9>@mHI~h_NjjTiwrfgS{8py^KZx=P33rRh{>8PV=I!32l^%RWd1o7}P zJKY4b%UI6jJy7{$;$gmQ@@})8O|$&OD;JU$>!J#5GJ{z%NKU2x{ zhVJAhkZ2{;36fh}TrA4U3U(<&-;{E8JoZG@k9vdJ1!Y5hRiKw543EIEv6WJf;IZ0gj+Sv+r`L z>(R}i>8B6=0>B3xjGmnTr%V8x2mNIx-R++**kwFEslQ4r@l~%Bzd$o21t>hI<`x%s z!!R<3%8?RISO%|S)pVxOt+5abQJ59;73H@Vwy|DOj_qsjXz4t$Lv4ZsyOz--RQ$Gf;S6P4K~ z3=i9Y2fc)>S>-@CM^?AT62G0DZn?@U8@!2PWnWSISh)_PJQI+WEF43P%Q^+} zbxI{7TAnSf7~75GswEG193-9(Js;hi$WPSwOv27ia7%5egQ5&mX#$-ehTY+M`h_!f zabkAHUNSjrw?bTLfq`jACUj>HwII+g-{y*o+Lp}=DC)UteB0;wlup&+;!=_C&Rxk( z`GWX8bLdfZd9)z`PI%1u!3J=FbYHL_d#PLAY?*F}YgAHG;Qn0DYJDj+4|(CsPtjI# zCTaKW?CqeT8|h#?UCJI>$Irvsxf`y7i#SU3&AgR}!wO^!Am3VV4j35rq?Rc3$$z0*7B-!cXh+Sfd=_d^4o!f&U%TR z*+kpls3*2KRJi?Oe;8@#>cG$6-=k}@Tm^?B^AgTqv3;;ut0$W&D|zp3z@#f9=NRRQ z^iKH2;jbRyuuNH-)k3YlK>y{ih}6+?OI@J-A0TJ(5c2UpW^5_v@gUp{Pbf#uc?x@CP5&-)p){OY8h`*x0l< zO;ilB!ao)joXLY-33%*gh|AAJ+Z5^Z(1pdnW^L@ma1fF*H@zW5_{aI~3AIzSS&BE$ zo^A?u3V0dcns{tktJ$dSUuq;Hmto+r$(^t}sXyExSexNjZmR9``&ojG@p=L&TTo`| z$Z@!}GM|6qsBL6&Q-^7Drj2A=Lz?Ka3G!&kTF!KiA70#!<=5Ln##*<7lXnIkAiY~3 zkota0>Hd9SN~PR#}2ZaYqhiaoArK2H(yR9Vv9q|Bt-AC;S=Ns|9f{#dR9UhCN z`7*Vmz*)>CVJmbgH(n8lV2n4B;=OFV96^W9>>-r4Q>=4F|Y$8V1o zh9RN-o*Kss3yIgcM<@<2daO?=F#z!{i!P%KkKLV5yU`Q&e=;|Y;>4m|?OIVhs~-QsXqD8}C)Ie=^5?I5%LVB6V-=YZ z13Toi&hV}I0c#)IN~(hwR7Vq3KEltblOem=qMf? zv9n(3n0LvKSU5P4SP;rT+C1QJdT1xq8)*OppF|6;;4-4Df#}+jvSTto{~+Y0;9%u7 z@3G3;EO~VggPIGBo+SFjNG05vm+64qa?y1cUu1R3xGTmUsdhv;NJSxZ#QgrSK%X_Y zZ29b4LhStfa+BC&>=^@|j?f6ou_=!-UJvw9@Bqobn!m?lqp`J%BFOub7=3(Gdrt>@ z-vX>o)!8|^ShZP8$wRX$DK)7gEhIGkmr-Q#*Kr?Ev60zHprH7E8lKnA*j&m`8S&Bu z)28ZN9WokXnuR?D%@I{v7MeU=OB^U4?GzgkuSPdFGuJNc8?UGS!rBub+ zkg`cv+a#>d(`a{79ijTYPYSNxG_{=7NV`>UW~

A+-Khi^cQ(9+P7c3p+tn2Oodf zhlu7>-1HJQ?+ETzLn?nG_v^7^va{yeUSY1=wSC7j@~wQ|`i$s1F11_7Gh2B!j%ac1 zOx5V-HtRp!(pwiV^r1giwP6cCk7!viS8J3TCp5k$Ex4>&NGZhQ1LWLRElNR@2Cwqm zN{4(&PXpdHV~15eIScx~H&dy%SbwtN7?pCrK&cSoXDX1&?kG8V-G^ili7kh#S)-un z)-}b|F07*5kEzWG#AL<2C`mTR)S(9NL?mB0k*Uuav3Q}bUqx%la(T0L`B8mo$@pxZ z1loSHY!_SboOR&yLBZ3=`IHj%quFdW?>^pJKY)0?NhVAKjXdXYCf{G@vgZSln`hk1=078^Yo5* zYybL+%HYLaQ;D06bo_*O^%r@4vLv%^Ll?>`ek*jh1ci$Wqa)}9T6`v0IfD`rTaykc zqR|;9FK_iCjOshQ6{_`!(Y48<{>IH7z?R$q;(Aw2_T#B#5!L0xa*9M9(zm#n^$k|h zHG_VsbZ6?x2_`E^*ncFXjl2q-n6X}aJkA2L$J$GYY)v)P#n21M~H%!|qV50;*Na~>NP zCfgyq@f)D^D+oBr3GQ%2#f1*SH6p1iiiTv;y@bU{n=gI7yGW>ubV)t?)DcYMtX5L> z%RP=GeO}vSNqH?xIkS@bbWD3DxATZTp@sx<@x#wgaEHZ6lf8d~kh!C6yWWr24yvJ# z#*Ns{y48Hcyw73O7R`H=0V^q7^A@IIPo+P2dL)jl zGDnZYJS6Ro&xlZtLF^tBYgwR6G7HTxm5;?$}w zoroJ~c;iy6P#yf}tH5G;#nW{T#sT~fIYn06%s(W!&oQKpG4g2TPpUDS8Io66Nvryx zQq5*9%oRSLD=#gJehf~Fz`Omn2z3q7;*NbJ*@yNQrzYZ(r;zsvTu-2Z8vQOEvy3%^ zG+ZW5abkmQk}jR{Jhl^l?B1Mv3f51Rjzt=Obk>uHmDL8TUoD@T@q;=l2%tS@y)2Vy zm;pKwcdCvBVbd#1-ceL2?nefw_G_Ued>3um5)w)c{j}o_dYfHFmf5J8DKUTeIAmOc z?SDUB&>;#7tO^<(>nID8KTIVn)yTy9br|*lVaT@K+y&>%MyL?$*6R%^w%Dm#yLSY4 z<&_%@grri`dsYx`I%zIF%O6~my_!M&k2*#5)bw_BEp53GWHPUzyqD`lqpiCf3$!1ViU(6)gzt(~j3))ooQG3_yM#F6WC z(uGadqxluQG)#r4D*8E_HaIlFrh!ozS7OBxA&2 z@1P6y;@~awl$6P%WBsoW!hU#CjxUyO|E2{M!!3@Wux^eKOCuIYKEVrB-ZksE5an4l0;;2!Kz$Ml9n1W9My@35YD}05Brt z$4q>Zvm{PIKA-NcA!P zC;|}O(1$HK6~G&l-~STh10?@wf|&s)>F;s4>o1BLgaNrd`f|(coiTx}{nC&d@Q1@r z$G}9u(*DOIo)_q9vH`gN4}^DY#6Ee_XQgofz^%T@O-2q5rMomOQO~jvC#NDZWogkk z^__Ccw)*^>H{=8(llbDkJr4-`C*=(6#s644lm9AJ{_iR0AxTp+v(c3J+{DByE@!?A zgTcl!{QT~knw|pl%z^DU{X;X}E5FeJnCE?_z>`N%fEiATgGQ~2v zy~AcT&olp0VY&9fgQ@G@5n~~_Aobiuy~@fLR_&eY#y6SJSLT@!4}98h2ERNZwI*yJ zj`0FFKpZ?$Mos73-f1!e7iyAaqUAkd>iWF>pCd<44_Ar}CxBiuhj*PmxkBjzv(mj2 zATzW|J2?yzd&rq10xXKo@-z-u&512C-}>*5N?pgjJfgT{JiPtrv?n(QOtj_WZ~tY5 zOHsIc;ORmeh)F@vwgO3J`#^Q*^9^c_wdnoaBj?`=br|Fwjc7Q&b_2S3I^A4>riNAR z2J^i_v%JJaBfNf)N>~ZFs?wPH-B>d4_yD(#rV}Tu-sLQn=swe=>kzp?)rN7Cx6Geg zy0)cb3+vLn6XUmrlZof+f{=IEccJiX$Ryd8uG~tthQV(os1t%2Xct0L5fE<&{Dl6TKhV0xLQ#m+PFwB@&ml(Kgfru*;LgbEI~;u^OTJRNyh zQpP$Y3y%OX#Ctl^H59pMEP=`%=>n#lpr4gHUX5`JQ&$J;E@UFwA1zM!2YnB~$;4V+ zS&B*M+T+_c(fSR&$g};cv*T#?CYv$5^8&s-ee>HAOs})bN1kE~-H=@(q8u!fC#6v| z1Q=jVpKEJW!^AyRdiQ4v)O;$8$p>MO{K>CpM-{clh|M#vG!{^bC7T1_nX-W|Z1JW9 zxZLqPAE{X14^otfvK(pk+eYQG#TdzjJ|os#o!O4rDj#~Ne|X^gawcX|?^nn9+ypMO z2S0nK*xYG|GFGze~3E$Nz2h+U9-44?oai3_ST5SN2lQ0akuzsu3 zp*)EH3e@-40uW$Mr=Vx}$8vq9rhpxNa|$qH@4a;|YQNBQfm*5a$VkC0@v6Qu)8pQw zS4B%{Poty-aR`a(#*IKjdFW!dg38$8> zTAfFXlM5jCFv^>O>h)hd3w_G#d1kDwFZa@ryPDsoVpk0a|I=cHrmRJQSPL$5^NLdK8(=ociihz|z0 zK`yMwmmtR`e5qme8|DH9yem>x97{U~^JWE{Qky)yN3XkT@3?O;au^e7_}_I#9^&Uh z22@bywN(PXhsho8&JPw_x-c2adnJkn90>1~mBXGCHDNm3{#J$UTf?0yl>^eKbWwS5ppQzb019%R&dh3A5cTGzw)T6)NW0#!)_(HN zpWCL!PfY-ZnCNtny^JQ3D3^gwHa%kF!lPR#}qJVf)%O^JopHv?w3-0_nI z7OV8n4w0sLbEyaw`l2){x3svjp_QroQ)9b3LepXH|EQTP)dG~ z`Su^PZeY>EXBAPA{s^n=iXR_1wnpF~gZCP@<+ha_2=Y|-zEZ23$>rv_slbBSsRE?9 zNpp3dNnMJy%F5u({TtLIl@CKVlgTO zwH49CxTMl2E@i{H44W=phlxpU7rlKPI?m_#3_-d!<;C1J70Y6ECghmw?Nn;)@VTUy zqq(wkp2IB3cZTVTIIe07JcxCpNDj;-w6cvm?gaKFI{pR;?Il zL=M~**;Ck4=x1~(a#KoHcg$~YeBdI%q??TAm}}VHqCq^x%(a5wt8dm1ipU1~BDLB0 z16bjt1}3E6BY~C}y^zOgt5}4COrXh;4qNBeg-N>@^&h$G&PG2tqS)uO@E63ax63BW zr_&Wf-R0KhEYHR54sO!8C)#TLUAu|< zvB~xbJKFb5bbUPo-xm~jwOvobeWx8679gt0xz9qDWr{CXGm2Gza@9`hyI5qT4yyq5 z2yEuH)P}dkDk{99KizIT?{&MWeB4V^)%}Z!lc=JXumCD0ohZT>gN#O5i0h-=byj<% zA2mpV!7%(BKy#GNI6ONr%O`9r|9ss_~D z-=u1h0^hY2f8ZZ!dgRA4EMeQZJXnVag$ZS_M7(}aOQw< zYtpAb0=`FA)d@Xh*3U1fpxV~?HtG_GkVV+PTx8}_I87X&OQdwwPORczJ<^c#;G@3C zGTgXJ%O-MWkCD^ujN*wGsnc=udjy~x4KRG3H;=;0M-9A9O&!_Jys*jitJKP9YCfgO z`8`JZk;{<2+q>WYpaOvlFcA~=mm#X`}wv7C@Z6qJ2 zpRTK^@jdDKN<$F%xu<^~&e8=w0fS0Z%k=}^km4{PALk?k^&e9her}HdQ*4np=gdwJ zTUJn3;A|bxx^k>ozwiv8-9(cWQ|;w%R{zAGH-w8rnAjoy`s8G@mg~P`N%toov*4_d zGSYrKd93$|2uA+6hbJHLiTF9f<3n)-WhBCrdx2K2H+q2-YMS7W08RzQ|59o0Kj-~( zpWeJBQ0ZJgT@=O^iB_B#gqn)>qwzd~f7{>x E0zPBV2><{9 diff --git a/mana/apps/react-example/babel.config.json b/mana/apps/react-example/babel.config.json deleted file mode 100644 index f5dcd1eb..00000000 --- a/mana/apps/react-example/babel.config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["@difizen/babel-preset-mana"] -} diff --git a/mana/apps/react-example/package.json b/mana/apps/react-example/package.json deleted file mode 100644 index f1c8dd3d..00000000 --- a/mana/apps/react-example/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "private": true, - "name": "@difizen/mana-react-example", - "version": "0.1.32", - "description": "Minimal boilerplate for writing Web Applications using React, Webpack, TypeScript with best practices", - "license": "MIT", - "scripts": { - "start": "cross-env NODE_ENV=development webpack serve --config tools/webpack/webpack.config.dev.js", - "build": "cross-env NODE_ENV=production webpack --config tools/webpack/webpack.config.prod.js", - "serve": "cross-env NODE_ENV=production webpack --config tools/webpack/webpack.config.prod.js && cross-env serve dist/", - "lint": "eslint --ext .js,.jsx,.ts,.tsx src/" - }, - "devDependencies": { - "@marshallofsound/webpack-asset-relocator-loader": "^0.5.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.8", - "@types/node": "^18.11.5", - "@types/react": "^18.0.23", - "@types/react-dom": "^18.0.7", - "@types/webpack-env": "^1.18.0", - "@typescript-eslint/eslint-plugin": "^5.41.0", - "@typescript-eslint/parser": "^5.41.0", - "babel-plugin-parameter-decorator": "^1.0.16", - "cross-env": "^7.0.3", - "css-loader": "^6.7.1", - "eslint": "^8.26.0", - "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-react": "^7.31.10", - "file-loader": "^6.2.0", - "fork-ts-checker-webpack-plugin": "^7.2.13", - "html-webpack-plugin": "^5.5.0", - "less": "^4.1.3", - "less-loader": "11.1.0", - "mini-css-extract-plugin": "^2.6.1", - "react-refresh": "^0.14.0", - "sass": "^1.55.0", - "sass-loader": "^13.1.0", - "serve": "^14.0.1", - "style-loader": "^3.3.1", - "ts-loader": "9.4.1", - "typescript": "^4.9.5", - "webpack": "^5.74.0", - "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.11.1" - }, - "dependencies": { - "@difizen/mana-app": "^0.1.32", - "@difizen/babel-preset-mana": "^0.1.32", - "babel-loader": "^9.2.1", - "react": "^18.2.0", - "react-dom": "^18.2.0" - } -} diff --git a/mana/apps/react-example/src/components/Application.scss b/mana/apps/react-example/src/components/Application.scss deleted file mode 100644 index 5477bb04..00000000 --- a/mana/apps/react-example/src/components/Application.scss +++ /dev/null @@ -1,245 +0,0 @@ -/** - * Licensed under the MIT License. See LICENSE file in the project root for license information. - * Copyright (c) 2022 Codesbiome, guasam - * - * @author : guasam - * @project : ERWT Boilerplate - * @package : Application Sass Stylesheet -*/ - -@import './Theme.scss'; - -/** - *========================================================================== - * Application Specific Stylesheet - *========================================================================== - * - * Here we use the codes to apply application specific style - */ - -::selection { - background: var(--selection-bgcolor); - color: var(--selection-color); -} - -::-webkit-scrollbar { - width: var(--scroll-width); - - &-track { - background: var(--scroll-track-bgcolor); - } - - &-thumb { - background: var(--scroll-thumb-bgcolor); - } - - &-thumb:hover { - background: var(--scroll-thumb-hover-bgcolor); - } -} - -html, -body, -#app { - height: 100%; -} - -body { - margin: 0; - font-size: var(--app-font-size); - font-family: var(--app-font-family); - color: var(--app-color); - background: var(--app-bgcolor); - line-height: 1.5; -} - -h1 { - margin: 0; -} - -#app { - display: flex; - flex-direction: column; - box-sizing: border-box; - user-select: none; - align-items: center; - justify-content: center; - - &.has-border { - border: var(--app-border-color); - } -} - -button { - background: var(--button-bgcolor); - color: var(--button-color); - font-weight: normal; - text-shadow: 0px 1px var(--button-shadow-color); - font-family: var(--app-font-family); - border: var(--button-border); - padding: 0.5rem 1rem; - border-radius: 6px; - font-size: 0.875rem; - cursor: pointer; - display: inline-flex; - justify-content: space-around; - align-items: center; - outline: none; - min-width: 140px; - - &:hover { - background: var(--button-hover-bgcolor); - } - &:active { - background: var(--button-active-bgcolor); - } - & > span { - color: var(--button-badge-color); - background-color: var(--button-badge-bgcolor); - font-size: 12px; - width: 24px; - height: 24px; - border-radius: 50%; - display: inline-flex; - align-items: center; - justify-content: center; - display: none; - } - - img { - width: 22px; - opacity: 0.8; - } -} - -.rotate { - animation: rotate 4.5s linear infinite; -} - -@keyframes rotate { - to { - transform: rotate(360deg); - } -} - -.main-heading { - display: flex; - align-items: center; - justify-content: center; - margin-bottom: 3rem; - - img { - margin-right: 1rem; - } - - h1 { - font-size: 1.5rem; - font-weight: 300; - color: var(--erwt-heading-color); - line-height: 1; - text-transform: uppercase; - } -} - -.hidden { - display: none !important; -} - -.center { - text-align: center; -} - -.main-teaser { - position: relative; - display: flex; - line-height: 25px; - font-size: 15px; - color: gray; - width: 70%; - margin: 0 auto; - margin-bottom: 3rem; - text-align: center; - padding-left: 1rem; - background: #191919; - padding-top: 1rem; - padding-bottom: 10px; - padding-right: 1rem; - border-radius: 0 0 8px 8px; - box-shadow: 0 8px 10px 0px rgba(0, 0, 0, 0.0117647059); -} - -.main-teaser:after { - content: ''; - position: absolute; - top: 0; - width: calc(100% + 40px); - height: 2px; - background: var(--app-accent-color); - left: -20px; - box-shadow: 0 10px 20px #000000e3; - border-radius: 8px; -} - -.versions { - display: flex; - justify-content: space-between; - gap: 1rem; - flex-wrap: wrap; - border-radius: 10px; - box-shadow: 0 0 20px inset rgb(0 0 0 / 3%); - width: 70%; - margin: 0 auto; -} - -.versions .item { - background: #1c1c1c; - color: #d1d1d1; - width: calc(33.33% - 1rem); - padding: 4px 12px; - display: flex; - justify-content: space-between; - font-size: 14px; - margin: 0; - box-sizing: border-box; - border-radius: 4px; - - & > * { - display: flex; - align-items: center; - } - - &-icon { - width: 16px; - height: 16px; - margin-right: 10px; - opacity: 0.8; - } - - & > span { - color: gray; - text-align: right; - } -} - -#erwt { - // user-select: none; - display: flex; - flex-direction: column; - max-height: 800px; - justify-content: space-between; - background: var(--erwt-bgcolor); - margin: 0 auto; - border-radius: 10px; - box-shadow: 0 0 20px 4px #00000000; - - .header { - padding: 3rem 2rem 0rem 2rem; - max-width: 700px; - margin: 0 auto; - } - .footer { - margin-top: 1rem; - padding: 2rem; - background: var(--app-footer-bgColor); - } -} diff --git a/mana/apps/react-example/src/components/Application.tsx b/mana/apps/react-example/src/components/Application.tsx deleted file mode 100644 index 49c29560..00000000 --- a/mana/apps/react-example/src/components/Application.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import { useInject } from '@difizen/mana-app'; -import React, { useEffect } from 'react'; - -import { State } from '../state'; - -import './Application.scss'; -import { icons } from './Icons'; - -const Application: React.FC = () => { - const state = useInject(State); - - const counter = state.counter; - - /** - * On component mount - */ - useEffect(() => { - const useDarkTheme = parseInt(localStorage.getItem('dark-mode')); - if (isNaN(useDarkTheme)) { - state.darkTheme = true; - } else if (useDarkTheme === 1) { - state.darkTheme = true; - } else if (useDarkTheme === 0) { - state.darkTheme = false; - } - }, [state]); - - /** - * On Dark theme change - */ - useEffect(() => { - if (state.darkTheme) { - localStorage.setItem('dark-mode', '1'); - document.body.classList.add('dark-mode'); - } else { - localStorage.setItem('dark-mode', '0'); - document.body.classList.remove('dark-mode'); - } - }, [state.darkTheme]); - - /** - * Toggle Theme - */ - function toggleTheme() { - state.darkTheme = !state.darkTheme; - } - - return ( -

-
-
-

React Webpack Typescript

-
-
-
- Robust boilerplate for Desktop Applications with Electron and ReactJS. Hot - Reloading is used in this project for fast development experience. -
- If you think the project is useful enough, just spread the word around! -
-
-
-
-
- ERWT -
-
-
-
- Typescript -
-
-
-
- React -
-
-
-
- Webpack -
-
-
-
- Chrome -
-
-
-
- License -
-
-
-
- -
-
- -       - -       - -
-
-
- ); -}; - -export default Application; diff --git a/mana/apps/react-example/src/components/Icons.tsx b/mana/apps/react-example/src/components/Icons.tsx deleted file mode 100644 index 9960dcea..00000000 --- a/mana/apps/react-example/src/components/Icons.tsx +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable import/no-unresolved */ - -import chrome from '@assets/icons/chrome.png'; -import erwt from '@assets/icons/erwt.png'; -import license from '@assets/icons/license.png'; -import nodejs from '@assets/icons/nodejs.png'; -import react from '@assets/icons/react.png'; -import typescript from '@assets/icons/typescript.png'; -import webpack from '@assets/icons/webpack.png'; - -export const icons = { - chrome, - react, - typescript, - erwt, - nodejs, - webpack, - license, -}; diff --git a/mana/apps/react-example/src/components/Theme.scss b/mana/apps/react-example/src/components/Theme.scss deleted file mode 100644 index ddefcfa0..00000000 --- a/mana/apps/react-example/src/components/Theme.scss +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Licensed under the MIT License. See LICENSE file in the project root for license information. - * Copyright (c) 2022 Codesbiome, guasam - * - * @author : guasam - * @project : ERWT Boilerplate - * @package : Application Theme Colors Stylesheet -*/ - -/* - *========================================================================= - * ERWT Dark Theme - *========================================================================= - * - * Here we define the Dark Theme (stylesheet) for application. - */ - -:root { - // Application - --app-accent-color: #32639f; - --app-font-size: 16px; - --app-font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, - Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; - --app-bgcolor: #202020; - --app-border-color: #3b3f44; - - // Scrollbar - --scroll-width: 10px; - --scroll-track-bgcolor: #2f2f2f52; - --scroll-thumb-bgcolor: rgba(59, 59, 59, 0.747); - --scroll-thumb-hover-bgcolor: #555; - - // Selection - --selection-bgcolor: var(--app-accent-color); - --selection-color: #fff; - - // Button - --button-color: #fff; - --button-border: 1px solid #222424; - --button-bgcolor: hsl(0, 0%, 22%); - --button-hover-bgcolor: hsl(0, 0%, 24%); - --button-active-bgcolor: hsl(0deg 0% 20%); - --button-shadow-color: #00000078; - - // Titlebar - --titlebar-bgcolor: hsl(0deg 0% 10%); - --titlebar-color: hsl(0, 0%, 85%); - --titlebar-title-color: hsl(0, 0%, 85%); - --titlebar-menu-border-color: #2d2c2c; - --titlebar-menu-title-hover-bgcolor: hsl(0deg 0% 12%); - --titlebar-menu-title-active-bgcolor: hsl(0deg 0% 14%); - --titlebar-menu-title-active-border-color: var(--titlebar-menu-border-color); - --titlebar-menu-separator-bgcolor: var(--titlebar-menu-border-color); - --titlebar-popup-bgcolor: hsl(0deg 0% 14%); - --titlebar-popup-border: 1px solid var(--titlebar-menu-border-color); - --titlebar-popup-shadow: 4px 10px 10px rgba(0, 0, 0, 0.2); - --titlebar-popup-item-name-color: hsl(0, 0%, 75%); - --titlebar-popup-item-shortcut-color: hsla(0, 0%, 55%, 0.8); - --titlebar-popup-item-hover-color: hsl(0, 0%, 85%); - --titlebar-popup-item-hover-bgcolor: hsl(0deg 0% 18%); - --titlebar-popup-item-hover-shortcut-color: var(--app-accent-color); - --titlebar-popup-item-name-shadow-color: #151515; - - // ERWT - --erwt-bgcolor: #262626; - --erwt-heading-color: #dddddd; -} - -/* - *========================================================================= - * ERWT Light Theme - *========================================================================= - * - * Light theme for ERWT application. - */ - -body:not(.dark-mode) { - // Application - --app-accent-color: #2f77ca; - --app-bgcolor: #f1f0f0; - - // Selection - --selection-bgcolor: var(--app-accent-color); - --selection-color: #fff; - - // Scrollbar - --scroll-track-bgcolor: #2f2f2f1f; - --scroll-thumb-bgcolor: rgb(59 59 59 / 30%); - --scroll-thumb-hover-bgcolor: var(--app-accent-color); - - // Button - --button-border: 1px solid #eaeaea; - --button-bgcolor: #fff; - --button-color: #424242; - --button-shadow-color: white; - --button-hover-bgcolor: hsl(0, 0%, 98%); - --button-active-bgcolor: hsl(0, 0%, 96%); - - // Titlebar - --titlebar-bgcolor: #dcddde; - --titlebar-color: #1f1f1f; - --titlebar-title-color: var(--titlebar-color); - --titlebar-menu-title-hover-bgcolor: #e6e6e6; - --titlebar-popup-item-hover-bgcolor: hsl(210deg 16% 92%); - --titlebar-popup-bgcolor: hsl(0deg 0% 99%); - --titlebar-menu-title-active-bgcolor: hsl(0deg 0% 99%); - --titlebar-menu-title-active-border-color: #d3d6d8; - --titlebar-popup-border: 1px solid #d3d6d8; - --titlebar-menu-separator-bgcolor: #d3d6d8; - --titlebar-popup-item-hover-bgcolor: #d6dade; - --titlebar-popup-item-name-color: #0e0e0e; - --titlebar-popup-item-name-shadow-color: rgba(255, 255, 255, 0.8); - --titlebar-popup-item-hover-color: #000000; - --titlebar-popup-item-hover-shortcut-color: var(--app-accent-color); - --titlebar-popup-item-hover-bgcolor: #e6e6e6; - - // ERWT - --erwt-bgcolor: #f8f8f8; - --erwt-heading-color: #282828; - - // Overrides - .main-teaser { - background: #fff; - color: #747474; - - &:after { - box-shadow: none; - } - } - - .versions .item { - color: #656565; - background: #fff; - box-shadow: 0 2px 4px #00000005; - - & > span { - color: #999999; - } - } -} diff --git a/mana/apps/react-example/src/index.d.ts b/mana/apps/react-example/src/index.d.ts deleted file mode 100644 index de67a001..00000000 --- a/mana/apps/react-example/src/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.css'; -declare module '*.png'; -declare module '*.jpg'; -declare module '*.jpeg'; diff --git a/mana/apps/react-example/src/index.html b/mana/apps/react-example/src/index.html deleted file mode 100644 index 1fbefd09..00000000 --- a/mana/apps/react-example/src/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - React Webpack Typescript - - -
- - diff --git a/mana/apps/react-example/src/main.tsx b/mana/apps/react-example/src/main.tsx deleted file mode 100644 index 6d749df6..00000000 --- a/mana/apps/react-example/src/main.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { ManaAppPreset, ManaComponents } from '@difizen/mana-app'; -import React from 'react'; -import { createRoot } from 'react-dom/client'; - -import Application from './components/Application'; -import { BaseModule } from './module'; - -// Say something -console.warn('[ERWT] : Renderer execution started'); - -// Application to Render -const app = ( - - - -); - -// Render application in DOM -createRoot(document.getElementById('app')).render(app); diff --git a/mana/apps/react-example/src/module.ts b/mana/apps/react-example/src/module.ts deleted file mode 100644 index b9373b9c..00000000 --- a/mana/apps/react-example/src/module.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ManaModule } from '@difizen/mana-app'; - -import { State } from './state'; - -export const BaseModule = ManaModule.create().register(State); diff --git a/mana/apps/react-example/src/state.ts b/mana/apps/react-example/src/state.ts deleted file mode 100644 index 21c4db5e..00000000 --- a/mana/apps/react-example/src/state.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { prop, singleton } from '@difizen/mana-app'; - -@singleton() -export class State { - // const [counter, setCounter] = useState(0); - // const [darkTheme, setDarkTheme] = useState(true); - - @prop() - counter = 0; - - @prop() - darkTheme: boolean; -} diff --git a/mana/apps/react-example/tools/webpack/webpack.aliases.js b/mana/apps/react-example/tools/webpack/webpack.aliases.js deleted file mode 100644 index b5ab9762..00000000 --- a/mana/apps/react-example/tools/webpack/webpack.aliases.js +++ /dev/null @@ -1,13 +0,0 @@ -const { createWebpackAliases } = require('./webpack.helpers'); - -/** - * Export Webpack Aliases - * - * Tip: Some text editors will show the errors or invalid intellisense reports - * based on these webpack aliases, make sure to update `tsconfig.json` file also - * to match the `paths` we using in here for aliases in project. - */ -module.exports = createWebpackAliases({ - '@assets': 'assets', - '@src': 'src', -}); diff --git a/mana/apps/react-example/tools/webpack/webpack.config.dev.js b/mana/apps/react-example/tools/webpack/webpack.config.dev.js deleted file mode 100644 index 9d3adea8..00000000 --- a/mana/apps/react-example/tools/webpack/webpack.config.dev.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = { - mode: 'development', - entry: ['./src/main.tsx'], - module: { - rules: require('./webpack.rules'), - }, - output: { - filename: '[name].js', - chunkFilename: '[name].chunk.js', - }, - plugins: require('./webpack.plugins'), - resolve: { - extensions: ['.js', '.ts', '.jsx', '.tsx', '.css'], - alias: require('./webpack.aliases'), - }, - stats: 'errors-warnings', - devtool: 'cheap-module-source-map', - devServer: { - open: true, - }, - optimization: { - splitChunks: { - chunks: 'all', - }, - }, - performance: { - hints: false, - }, -}; diff --git a/mana/apps/react-example/tools/webpack/webpack.config.prod.js b/mana/apps/react-example/tools/webpack/webpack.config.prod.js deleted file mode 100644 index 0e53bb93..00000000 --- a/mana/apps/react-example/tools/webpack/webpack.config.prod.js +++ /dev/null @@ -1,39 +0,0 @@ -module.exports = { - mode: 'production', - entry: ['./src/main.tsx'], - module: { - rules: require('./webpack.rules'), - }, - output: { - filename: '[name].[chunkhash].js', - chunkFilename: '[name].[chunkhash].chunk.js', - clean: true, - }, - plugins: [...require('./webpack.plugins')], - resolve: { - extensions: ['.js', '.ts', '.jsx', '.tsx', '.css'], - alias: { - // Custom Aliases - ...require('./webpack.aliases'), - }, - }, - stats: 'errors-warnings', - optimization: { - minimize: true, - sideEffects: true, - concatenateModules: true, - runtimeChunk: 'single', - splitChunks: { - chunks: 'all', - maxInitialRequests: 10, - minSize: 0, - cacheGroups: { - vendor: { - name: 'vendors', - test: /[\\/]node_modules[\\/]/, - chunks: 'all', - }, - }, - }, - }, -}; diff --git a/mana/apps/react-example/tools/webpack/webpack.helpers.js b/mana/apps/react-example/tools/webpack/webpack.helpers.js deleted file mode 100644 index 1cac215e..00000000 --- a/mana/apps/react-example/tools/webpack/webpack.helpers.js +++ /dev/null @@ -1,27 +0,0 @@ -const path = require('path'); - -const cwd = process.cwd(); - -/** - * Are we in development mode? - */ -function inDev() { - return process.env.NODE_ENV === 'development'; -} - -/** - * Create webpack aliases - */ -function createWebpackAliases(aliases) { - const result = {}; - for (const name in aliases) { - result[name] = path.join(cwd, aliases[name]); - } - return result; -} - -// Export helpers -module.exports = { - inDev, - createWebpackAliases, -}; diff --git a/mana/apps/react-example/tools/webpack/webpack.plugins.js b/mana/apps/react-example/tools/webpack/webpack.plugins.js deleted file mode 100644 index 01b1c36c..00000000 --- a/mana/apps/react-example/tools/webpack/webpack.plugins.js +++ /dev/null @@ -1,21 +0,0 @@ -const webpack = require('webpack'); -const { inDev } = require('./webpack.helpers'); -const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); - -module.exports = [ - new ForkTsCheckerWebpackPlugin(), - inDev() && new webpack.HotModuleReplacementPlugin(), - inDev() && new ReactRefreshWebpackPlugin(), - new HtmlWebpackPlugin({ - template: 'src/index.html', - favicon: 'assets/images/logo.png', - inject: true, - }), - new MiniCssExtractPlugin({ - filename: '[name].[chunkhash].css', - chunkFilename: '[name].[chunkhash].chunk.css', - }), -].filter(Boolean); diff --git a/mana/apps/react-example/tools/webpack/webpack.rules.js b/mana/apps/react-example/tools/webpack/webpack.rules.js deleted file mode 100644 index df7eebe2..00000000 --- a/mana/apps/react-example/tools/webpack/webpack.rules.js +++ /dev/null @@ -1,51 +0,0 @@ -const { inDev } = require('./webpack.helpers'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); - -module.exports = [ - { - // Typescript loader - test: /\.tsx?$/, - exclude: /(node_modules|\.webpack)/, - use: { - loader: 'babel-loader', - // options: { - // transpileOnly: true, - // }, - }, - }, - { - // CSS Loader - test: /\.css$/, - use: [ - { loader: inDev() ? 'style-loader' : MiniCssExtractPlugin.loader }, - { loader: 'css-loader' }, - ], - }, - { - // SCSS (SASS) Loader - test: /\.s[ac]ss$/i, - use: [ - { loader: inDev() ? 'style-loader' : MiniCssExtractPlugin.loader }, - { loader: 'css-loader' }, - { loader: 'sass-loader' }, - ], - }, - { - // Less loader - test: /\.less$/, - use: [ - { loader: inDev() ? 'style-loader' : MiniCssExtractPlugin.loader }, - { loader: 'css-loader' }, - { loader: 'less-loader' }, - ], - }, - { - // Assets loader - // More information here https://webpack.js.org/guides/asset-modules/ - test: /\.(gif|jpe?g|tiff|png|webp|bmp|svg|eot|ttf|woff|woff2)$/i, - type: 'asset', - generator: { - filename: 'assets/[hash][ext][query]', - }, - }, -]; diff --git a/mana/apps/react-example/tsconfig.json b/mana/apps/react-example/tsconfig.json deleted file mode 100644 index b8d9eefa..00000000 --- a/mana/apps/react-example/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "jsx": "react", - "allowJs": true, - "target": "ES6", - "module": "ESNext", - "skipLibCheck": true, - "esModuleInterop": true, - "noImplicitAny": true, - "sourceMap": true, - "baseUrl": ".", - "outDir": "dist", - "moduleResolution": "node", - "resolveJsonModule": true, - "experimentalDecorators": true, - "paths": { - "*": ["node_modules/*"], - "@assets/*": ["./assets/*"], - "@src/*": ["./src/*"] - } - }, - "include": ["src/**/*", "tools/**/*", "typings"] -} diff --git a/mana/apps/umi-example/.gitignore b/mana/apps/umi-example/.gitignore deleted file mode 100644 index 0dc2a3f9..00000000 --- a/mana/apps/umi-example/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -/node_modules -/.env.local -/.umirc.local.ts -/config/config.local.ts -/src/.umi -/src/.umi-production -/src/.umi-test -/dist -.swc diff --git a/mana/apps/umi-example/.umirc.ts b/mana/apps/umi-example/.umirc.ts deleted file mode 100644 index f0baf993..00000000 --- a/mana/apps/umi-example/.umirc.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from 'umi'; - -export default defineConfig({ - routes: [ - { path: '/', component: 'index' }, - { path: '/docs', component: 'docs' }, - ], - npmClient: 'pnpm', - plugins: ['@difizen/umi-plugin-mana'], - mana: { - decorator: true, - runtime: true, - }, -}); diff --git a/mana/apps/umi-example/CHANGELOG.md b/mana/apps/umi-example/CHANGELOG.md deleted file mode 100644 index b78680b5..00000000 --- a/mana/apps/umi-example/CHANGELOG.md +++ /dev/null @@ -1,33 +0,0 @@ -# @difizen/mana-umi-example - -## 0.1.32 - -### Patch Changes - -- [#88](https://github.com/difizen/mana/pull/88) [`efec026`](https://github.com/difizen/mana/commit/efec02698841de45108da24897040b528d2c3ec2) Thanks [@sunshinesmilelk](https://github.com/sunshinesmilelk)! - feat: add onWillStart hook for ApplicationComponent - -- Updated dependencies [[`efec026`](https://github.com/difizen/mana/commit/efec02698841de45108da24897040b528d2c3ec2)]: - - @difizen/mana-app@0.1.32 - - @difizen/umi-plugin-mana@0.1.32 - -## 0.1.31 - -### Patch Changes - -- [#79](https://github.com/difizen/mana/pull/79) [`0365365`](https://github.com/difizen/mana/commit/03653659a7400430493903e33f44dc2f048576df) Thanks [@lulusir](https://github.com/lulusir)! - fix: localStorage is not defined. - -- Updated dependencies [[`0365365`](https://github.com/difizen/mana/commit/03653659a7400430493903e33f44dc2f048576df)]: - - @difizen/umi-plugin-mana@0.1.31 - - @difizen/mana-app@0.1.31 - -## 0.1.30 - -### Patch Changes - -- [#76](https://github.com/difizen/mana/pull/76) [`14ea61a`](https://github.com/difizen/mana/commit/14ea61ac7ecc717b3091687b9ea4ac0aaf1e6ecf) Thanks [@BroKun](https://github.com/BroKun)! - Use a consistent version. - -- [#78](https://github.com/difizen/mana/pull/78) [`92f3efc`](https://github.com/difizen/mana/commit/92f3efcc9852ff7230d9e029e25fdacd9d529d55) Thanks [@sunshinesmilelk](https://github.com/sunshinesmilelk)! - fix text color for some components - -- Updated dependencies [[`14ea61a`](https://github.com/difizen/mana/commit/14ea61ac7ecc717b3091687b9ea4ac0aaf1e6ecf), [`92f3efc`](https://github.com/difizen/mana/commit/92f3efcc9852ff7230d9e029e25fdacd9d529d55)]: - - @difizen/umi-plugin-mana@0.1.30 - - @difizen/mana-app@0.1.30 diff --git a/mana/apps/umi-example/package.json b/mana/apps/umi-example/package.json deleted file mode 100644 index 9c193d8c..00000000 --- a/mana/apps/umi-example/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "private": true, - "version": "0.1.32", - "name": "@difizen/mana-umi-example", - "author": "brokun ", - "scripts": { - "dev": "umi dev", - "build": "umi build", - "setup": "umi setup", - "start": "npm run dev" - }, - "dependencies": { - "@difizen/umi-plugin-mana": "^0.1.32", - "@difizen/mana-app": "^0.1.32", - "umi": "^4.3.20" - }, - "devDependencies": { - "@types/react": "^18.0.33", - "@types/react-dom": "^18.0.11", - "typescript": "^5.0.3" - } -} diff --git a/mana/apps/umi-example/src/assets/yay.jpg b/mana/apps/umi-example/src/assets/yay.jpg deleted file mode 100644 index e72bd8ffaecc9de0e74a2bd7fa3e741efde4aa99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180902 zcmeFa2Ut|ivM9R9StKeFC5pr$2gzALvPgCqhRh5(!zd~$DoB)|AW1SPIfxhmiITGj zsN|gE+%=%+zt4a6+4tP{-re7MF1}f-y1Kf$y1P28u3iPYA3a7rsN(Bj3jo^Mz%M2e3gr;z2!;c|4*p89gbrb95bnS20N{d8Oxii{!4ArW`6J%D1^`?qe?Ap#kk)V( zU3;V_(!(C<%A%yiA|wbAVL7J_g*hNFNNxZ`h)F>NrG!LSAP^}bNhwhw0Kk0+00ba! zTtOir$kQKX#N_rA`)9s5gimpP!q^cYE#|_fl}BX)o~_{5a)@QLn6&jX}~WwKJz2C&czz=^{UU~>&ahaLiM0;Gh5ghYg-L`0+% zB*Y{XG~}eD1bn6DLkkV{Rv?kCIUQ zD-6)D0SZFkHt-Y&ixt48z`~)xLXUujBu2l-k^`m0!#cb`fiV{js5Q8F_ymMR#3We% z7>Na7m^Zk5Kq z@BX@$S@xml+xlf&@6fns<@LSaH^kM9?R;)O%BpDSo7|)Tu(3gDaSvr8z{e9k6yYp{ z5*L)fjg<;d=z1hIMuIo`9ZSOO)?@A=QA!3hFb|Ps4t$IN1e~I8J3%4RPuZv#iFv}u zk45;;CE)rc0(uZ2#W~EA0+0jN4Wl$TxY?sLE^4qx=|`E!80XoHO~NL6%$SDcr7hKi zGHPJi??QKi%Ut$(_Kl0{c1Cl&bl)}3$S7ug9&UOO-xqggK#w2F(Bo0e)VGtrx4+eo z29_O$ISUvRrw24_Y7ShDe4aHsG&`XIu0R_{#kjpRYnhj zR5LUX4bP?Z3dpq&dLqqTz=@S8d63;Se9xN!Y8+wqj$WN%*Q_l44)POB*TSVjijHHpX}-01dqEh;kGSn9b!kHZp~vdPy%ocgZ@t8N>w( z8-Lx%@3reJTHIt-G2OW<*U`75l4)_jxV-;eRRmV6>%xhrx%^WWVohX{G>;!F(we~w zITn5KlIDDew!?#h@5w1l2jA{oL#Y;B1IIobd2ENVX@^t2k2KgHUX0RUkI4WVK@R=t zM`OhBS6B0h4SJWVS!=M*JDK)2CvVma)(cN(Jab?%h-tQ(j+3pZ|1v~hZdU*O0EwDS z&v=%l|7r&EE<3`g-QIadF0d30SQPZ%h`jxvI|pGYN%NKVAZ$srYwv`T+}oZS55Bba z)C2O4y0x6@R)o*MW2WzAag^V0q}LX1)Yd&N;guA!e^=g=UpKsLnHGG{sse0M(+2TX zfd;#&`8v*a)q937BA%+BVOeP4_TN%}uG*R;H8E8W!*fofFX?TnEqz}5s-Zl>rNUx* zVEf<(o!ypzUf8W5qjl51vaO=PJ5KIn3oB$F(?SQ(0HVP1b{Axc?8YaWuMfN6g*1;| zGJf8)GT;f=A5E}ZMSVd7s`p~Mmn{qu>w{8n&U3W-rVh?~1b0oFM4*ARTAhxa*zAR? ziE(J4=fG<1(dqX+56XM|cfvUxB#cQQ?z{vpr+_{wnTC!4?HC*99i3g73THGxc;hlh ztofYn`YEHTg#Z&HuiKjKIXh+owwjh`U}R`IIKsLpvNPM8E3YeW$Sk5R>*ZX2RmSwC z(QP@QJo+7;WsB*Z(T#oA>4g5?vfi)$?H|(}T;O$?#Xdr{YsT}t+B&&|LP1>nDZz4s za*C}7k=Lc}x>SyB`_?TOoy}$~YS=Vu$t&tyJ!SCd%2HIh}-j zo|kohHDW5DRo!U+gT2 zc@5Wr=;e~E@8-M6blDnYzD$k%)q*$eOfx}9eKeriy&<=Dzho^rHan84+rpEWK`G0! zaOUD8^&+8{EG?~XcAvZ`zhDA$O6e$`O`0#Ruh;>5GFYz?h0h{YE6hdpHP}O9Ky}SR zcYvB|GLXf_#?qllGL!SPUvvNbCZo6c2BLP?see)B{#wdR@DrA2^A#ORJ{B-Xm&tS^)D))H5mzI{%QH*FIm3x6(->OunqbA~%E5(|wU)4S3Mx;+j$PBhQLI-lx-e&b%lcLj16%eqB_ z*~C{VCBYxsI(PEi$WFj{@scB*i61je%Js|M62G*82Ckuj3MwI6NCY0$j?%$;H1j#3 zNH*D%I;44%sWTm;`)Lj1!t)Uxye~!LM2G@rZFZ6$rh7Ph^-9B&Z`2tVE_V7~oM+U* z;i2r1?|e2VBB3UiURYi+B^^+wHiri8nSY2#7d|m8Rp46O+U9aUx1sD>?+##Rmh~%Qu;RD8LuNQ8x~Jn8>B}K0=`Pzb{&H<5GXr~r z_ZL|8vwdlzKS1Iq>QAVLt-Ge|SP5j#2p33n3ne}sf%ddfV&RN>3~i5ggDqnBtmG0O zf<7Nw_NEP$iw3f)cCIXKIIr!iZ~9v%QJ%7jdIOKsJhMWUR$C5ulh98+AGPR{Sxk)| zLUjhm6@5C08+z_~iKEZt?uJ@-=XXod8 z#WvNcSaWd=2+~FattH4V(^@V<=+)wa%px}dUypl@{KDjZPZphm3f+TYdWCboDowlM z`bNc8Q7*aneZ-2FCaW7ttIxFFaH6Y9-tpCR!%;z;?)j zyx=vRi%4(ZPF(NCu0RkPu-ia|>~l>KXje&;i(SLBnQAdJ*CaonXcF@M5CskXesscq4~dvXyC;O*#K zDp=b=ny6*I0eHI(e)y4CP)4Zf~K-|t{kyqmVt%X^=h5PqQ z4$8J?A}GTBaNO^TTfMx1V|Vg7z=|7IHya$bEpgiL`QYZ{;OnbmtuduFt4`5IlKdl} zc(roAkGb)L*Gcy;4;bkQ~sOgmznIRc73p8MsR;Q=>IWx?%&+OssyzF58r0J?$ zf_Cs^K;4(bqP5Qn2`+U`Est&E=F>t`I?Dm>EvteKW z>(w$27rX+aWItiS)Lr4>aOcQ8%bn$e?p^O7fuPTc<(m`ZdarZAetI7X-7f2H_o#b* z3pO7-#78?0y{1wge79kw0v>^!HFGl^IVh-GN|}<;bh@(oJt1HBzO@MDL$1)e{LYVn zbDMH>t(OyYRKY2ext2FK>2XD4Xh!&CgxOTh_Wm|%DLB?CcsD^sweKVNHl?p2 zeWe}^a4&lInASaCtERWg-7lvrC<>SlxKC~?gUSf5uh_$vmJvgxD@u|#w$~Sa8dTCO zfS=ejg%-lByx%%yCQr`UP0Q$P$!V|W1*hjnoVv$|^^`i{1`p@XLUCP*kp??tX_jG} z;T>m%Z1pr^@!PA>ExwdYK2>*Q^aA2F{obA7J~ZIiU^+U-hE0e|M-Xy7)~tRwOnyDD z%R!K-GpPIH{^F9=QcB}Gr6!b}H!!T2XVgTBvC!e<_e%HXGr>1HboDVSC9sQi{aUjs zG&ZL*lohdq>yuOiERPZ9Dzl)`UeqVM$(+IQrsT0^Q}t~;&CIe=0zJDL_6Kb*_jv|I zT-tmVOT3%G)gR6Q`5LW$Sb|AJbn@GlhmhqF-0riz@j^11UWF+;?b&Ex_@k1H(6E22 z?}@8VMM5VAJHN<9HRB8}YL8ag<)MKuzxZg@BAQxf1US+vi!BWIW6B>GOMOVuL0IKA@BAfA_$aC*`}17qhe zZMY?6tD0hKFoE*kED2Z4Uz(A}abTa0G4|kT5~CmNpn=R&nN^mI=H;U*;NIY(30w>8 z%_O}*eDI!A-HD0jVmR3+n9^47QC@=F?<;}Hb(mPKdbdBT3du4y88y)Gy1c~HP}Mdp zS61g#msDJLX%G!OHa?k3PeDU3#ZN0=JKW?t&(9f_bgkh|(Dj1#VL7ksH8ZIxz3ZrP zhaJbhxjj9F%m<<&^9Sh~>*8qO*}6s5V#T(1kla%82ROS6A8qkM3R%7!8~LV}SDEkp z-d-4H*_WKPcPh^~>#|f+Fd9(e%dog*J^(YxK?65xU(A=q?2b;O`keOpv~ru9p2Tl< zzzW|wSShCRF$7-i#`FcY# zeC+j&B_4^gvHAK&X#}!{Y2(gFX^(xO_)FRQbXcm`*5HQ{vb@1{ z?0YeqxRFL253}(vvA8C-p}G-HD5u(l2EL47Iu*P9Ccs3gYTWyulJEJ z83}r@ZnietSljNre=7JMYhT6m!LE!-&Sfv!3x*oG6CW;zG@RbCOkQ*uLiwlY;hb-A z=8g6^jkirxGuXlZqJ_5~&t(&wzEPd~?O8h_3d2r?&FcLdj$a`OCJ$Of7vC1tI2XT` zzp>q2HsRegvSSPnkW*Wev0AdNt=w8%d$G{CtE`i5u&+;Wuih$81zdRDUyHu%AKQBW z_716BVxw5(ZedwXPS!!$tO*+MKK(#jRPRb|9C5##=qtIGi=R;|pYQIKcIXWiR?jr! zx3snu@xG`R7c6cR8?Y zd|g&)x-X^+D@^4%UypaehAmg#?OYt1xnhn6bYKS|9NxxGKHXn7S}3KNhXaCRy~S5& zQMKZyQ1!ygP&Cj8mP|pCv{OTIXf~%6mf2f(+3-!(!m5*;#{msE#(^DNLBnmm(I?hr z59GKPQkn-XVL_H}lvl{&I5`X}DM!x84UQU&E)0N6#QO(sCi0o!;^ZQ@a*sM%x%d7k zWVBoEMGJP}Af>3_iTx%y$Gr9h4UH)IT?MlWWB7M7Ua5iGyWbs+V&SW7P*pf2J4>W~br!FUHsr~v$reQO`Y&XAT z7oojT9y|?ZFHlzU`hfX!T<)bPg2CA(x!aqW8`Uq#$M&bVrPL2a)~BOkBHE4EWY4(E ziLab>xQSta?prr})Re=XHIwnALz>mLb-MUP;Ehp7t|8jFZB|VUd8h zlNbOK0!Uol!Tm-ZFHcu5PcVqt_5^f2JPoXoNasTe4TL8gj_`89L}1{84OOlff+%W00dN4^0Tw_PygL90z!QKUhR*@o02F|M zcmseNllli+U3VnX)&TD5<*H-t2m{fihe?qD60il?7=Xz=0WZMyFbT2iF*O)Ilv~l+ z6Y)cCQfn^^UtzL9oJspq;4>0}|hEmDZ z6Y;aCfReMd`*A?u&O`e+pyZBF`V~NU{t9SWJ9`|*T(a}@J`Sk3I4d6qz}o)BS`p@C z_oE^Xiw6MuYKlsrG~jkM2-~o**dV>E<&j@7!NW_<9q}J8=d*gknl?D5S2PuE$T^!N3?|@QD!{ z(1P0@vH6E=4Z+>;zsuGD=6rbLS7UoP*tnn`J0R?SR^JIsggz*f zBGS_n>Eet;*!@UC`ZES2!f$x8pLl%-JNw@wNPb3uvK`Z7dKAw5kqkd}!?Axp4|^Nu zVcdxynSu|wYd`uZ*&z5juphg??=!$gO7@P>7$rJ(Hqa}odOx1hov(ykw3 z)d2xpTQJ5Myo3Au;Dz-AlbVoti~-FDAl?+b|D+K;#9%c42j-CH78nLFJq!J}7tRzW z`fsDq|0i*WbwP;X{j(op%Y(%Pe?RJt2?HHkC64;-8B7od(|eDk#{>b4#RCV!1qbj0 z2NpjN`q5!9vB%eMI1Kf%o#gKbj&Z++2LR#aj2Y`N<1W56(hFhZ@ejQd<_Q7g4u@=v zN+0VDi2Mh=0~C+-^GFQ+WA!^M2)>820}SqQ*;xzIfw2CP58h!Mh^7R81cw0)<=^rm zuyaRxx&8%(k92pib2uIwRSYoPbq;YL4>G8iCsGZLfV)FI;Wi)wF!Xc%IROwK5o0iz z7>%Q8;Q#IN<9N9{|CmO8v>K-J|BBJ}u=_dH9MRxIojnbqc7LHd0fU3-;J%(39_ohL zT0e&=!k_5B5EI!W-Tf7u9qfMA6!}r%)qkSF3Lvn7+d{n#hfN}HxVz`ykYE0Z{wq0& zwVe{u8R`C8i8-6yA6V00AQa5#Ong5 zK}+8sOW+?%;2%riA4}jLOW+?%;2%riA4}jLOW+?%;2%riA4}jLOW+?%;2%riA4}jL zOW+?%;2%pMXc_$1EP;pnZfC)rHUO{yf8a+ApnVLqrP+XHFl*2RhOwvFgRm#~^EiaS zZF|s6_0K6-044B`1rP!R0SF+1VSKdXceIaA0DiAi+I< z1OH2gFn=eQqz$W_EXxI7DPI>?7q};s#n;6d;UVQK!+OYE3WPCe0alhn5>F=?*2C`z zSgvU6vM3?l;Vh#3qI@txAqb1OBtJw{R9sw$_wdUJ0YQiWM3@gEDJ3EzB`C=9<6;GK zbGNaT(pOgfkrx<}Vf|4kA0HonA7Or^yPW_;Qc_YtP)I;Xh!3RT^YBA>LVfuV9&A53 zD8oHq?hc2RKo$%~(8}fIDZ>g%dQ=1#*JHMSTUS2`ZD7ZAuHeS@Vdge40k|{V1&;9a z0P7WkDgIBU+Sz&L;`6g^7!ZL*YV#$J~xgI#B1|xniWU0XagTLNH+w zF-bllL18GLh=eVK4+@i%;Dg%;N`jpWE+#A{#LDt3UoE&D6y~R)YpA5`Up912&oP?|2O*CD0^q>);GV zc!1_?77Z08F^Hs?7@rV71k>+8alvX;cklr9#P3H>Hh{bRfSesz4pm+X3d7jvWmsVt zje^^-{y;nYO>_Kf1wUfz16q~;sgfO$c_3{)eW31e1v{|m{xwY&_|Hn<0rmdp@{3AB zp*9jwQ9g*MkRYE393}=TfUPi}m>674RLE9LT+mkRXZin5eu(gIo#ekQ|BniW*+UU_ zaB#2}VEylxNEiYU5fv7L@>xSAg!x1S;bNdRLt%V^P!NPe;nw0Ju>Yh)hdmi0A_Wop z*^~djC=m>az}WhJwUaB<9X#mb33vC9VYPKfy0Ac9T|t{F6r+>^-Uyo?6X$VnV(~<> z{5E*}r&VVIcX#+r9e&T|SO%8=Co}vnwNDaiYXcP(6y+0@gh9YzL&BO5DkLt>CnO;P z6%@3!l@t_~{I_bW|FT5?+VK3h)Z)gFdP4^BA8Q_%n3WO0=L(bL}3+81S1OK`1bDm@8zZx;jf)KiehCOsn6t^$E^sJ#6c!hA9+BM>4ztI&Ljhq@cSC*fY&q@) z&>;e;-EXk1c37P-^xRa(U;%0Lml8SeoTcPU;ib+G39>_{FWa- zCcooN9v0=J1GFp{t%iXIV!hm1Jir}gI1ArDD)E0i;csI7CI>J0wgY#EgYOkAmq9H9 zKO6v?8)4&sd1+^HK>TGZ>NgJm&1AoEz<@`34FXgd2LQDdKX9_08o-%v0dT2E037pV zFb3Q4ewyP01OnHAP~aZ$5Qqg5 zffOJE$N>t0VxR(e3A_R7fo9+n&;twsUx07GEU*M@0K1?E9Re&eEGjHIEM_bYEFLT& zED0=GEEOy*EPX5!tgBddSO_dHtU#`QU}( z#o;}}E5rMM*Ms*BZv!76pBA4BUmRZ@-vr+gKLGze{uBHn{MYy$_!Ic+1Oxgrl^kneKq?1)A z`%bP?P*FfAbSPXX?o;Gae59D7B%tJ^RH3w?yh)i(`Hpge3Wth~N{I?ab%QE{>I2m` zYJ6%gY7J^f>U-1$)NRyDG?X+VG?!_7X_9DaX}-|n&~nmh&^psb&=%A7((asMJf(07 ze(LV2!c(26Hc!)^mOl+Y9d^3tbkFG>Iu<$=Iw!hFx(d3HGq`8YpV2$xb0+!Bhck2Z z)b!HyF#0h1V){V_Y=-j;`V0XK=?pCl>x@i{YK*Ro35@R;=a^`jQk8AiG**Up$ zZs*d@b#vo$OK>}JKjHp#9{arLdHeH8=i7O(dBk`ec%JZd@Z#}G@*;TCc>DNB`4srP z`SSS2_-XmI_(S+B_!k7&1xy7Z1sVhn1Vsg%1v3PPAe4}ckPt{UWJTz_5KJgZs9Ts! zSXCG$Tq(RP!Xp9~NfzlBr4rQ^y)F7ybYDzd%w4QdY+9UM{Hpk4@jeM^30;Z%5{;60 zl8TZj$(NGbQesk`QpHk>(tOfR(z()87q~9KFJxSpkYSa9%B0GCk!6v+D*IISi`-c` zs9c)dxICM@jr=qDNd;~NM}>Ta1w}zccf~TrO(iL%Af?yJILd0uVajbPlqyCli7KB} zSyk;+^Hi7AMAZV+UaRA&YpO@8_h~R{z%+6+mM)5447&JUlT_0{Gf{I~>%5k`R<$;^ z_C@Vz?cqxtmk^gKbO0R~ z!y%({MqWm5FOy$3znpV<(^%O!%J|C_fh$2*noZ7_IG9wL5|~~#eP+6DreYRr_RU<> zJk-3`g3H3!;-lpmOJ~bkD{?ESRmoMntHxJzukJy0plQ%`YYpqi)=MxY*dy4ijl4~a z%`{vF9tEGYm9dSoowAd$i?*A#m$Q$vpL0-hNOV|sRCi2q+;q}$%5p+G8#@=d5V~A- zsX|a9oDlDkOh{j3hbxb3sOuLuDYsa+C3j8tXC7D{79N$J)Zk*O#p|5cEw3?eS??t8 zEuYIiCB78C2;UaJ^L}^zCjC|YGXrn~U;%Ff&jwx(91BtiN)5&ewhn%aVnf|TeY>W1 zE&Dq0b*JmCA%Y=MA!|2`Z&cr8ym{^B#4WX3d7&pl-9!6sOW#hpgL}u}PTO7Ky9sv> z!fe8t?g`$DySH~AcE9NXr1wN_WK<1oSa;S z+=x8vJg>azeDnNI1h9aR^r-d0Ojm(}psWW7B5GO3oPHsTfWtDCRTb^dkhuU%iyy|H^U z@z(0?(7P+|y5H-)Z~LJ6p|M`I{#}DYLtUdxM?oHoimTJ%NiOYNBQSj)J<_|ODwV)m=Y*S&8yzmt8Bn`EBMnG%|M zIjuVVX~t~k+pO#C?p)|R#r)%ia|@-5@{27?SC+mlyDy_x?yu6VX03^=y$69&7r)QFUwxo?FpPEqzt;QZlTRL83mp06JMwtHX0&5MOrAk@F{(_>!+euUP*D|EgPk+F zY<#BpZRhxk%?;1!oAC6KcU=?Q61J;e=Ov}oH7DBY%SD)QoK< zj$I1=@+YW%#oqT$e0F7H|J0VGhKYmU-GrQ~j|0=&=cO*1I{Jqt=2kZi&g}fv?ceCc zX!WM$=0a^>?QW6RV({!pz#qiFOMO_OKmBQ+e`EEuLU;VnZXYkyR?21sI4Jl}?ng}S z$!vKo)S}uamKR3?icsa4QKM*k4`sDEdPsAy-}mZsEoyr4U0;#cXdOrk(iMV!e#}1K z%{t@t>Lmk{0>M54)rC5R0p0|{7D%@ZE_ZfcBo&V#S)xzq48x7Ea zP4-D|uy(PFk?s!N=ka-&TfOlOYEg+nlhu&ZbWVFVp%FAH7DhDQmTBW}&tLf#d*`{? zu7Qi4kM9RQm(QvPVbMCJOUzHCGNKwz<`f1AoG$_u%SzSNSC8NZg=I*2Lv(bO6mn;1t*dU=-P5ET6>@~XNm@dr1+zK zO0~H8gB4T8vQ&tXlNPI}YR`zUy5?Phn9Q8DPWXxhqGRE_@!bb;#dZS{jMpEehc_4( z=8Q+|UV4{e3yaxEvf4g}lxMz}#=O;=zE`cY+cu-HL#wu$g9ZRb@#cZLrL^S1(jmKo zp2s^~A&6&Abi*v$PyHjfKfZp>FPk_^11aQNEN=_Txnz)07`gRphR>uj12IA6um?9H4?WvBltlq<~zBNa*v zkx?U#D6X{_RolBeZ51WW#8f}c|88jidg;I(jaOyDx3CH_Q&y8C`pV}Cg!Zce9_JoD z_t3V`(Gd$hL7mQXGHCuu?+SuUS3zF%A1(+#tIWU)Jg`D$nf3?X+m2qX znM^@$(7xHSsw|dKTJ9_K;a9Q?Z>YE98Yo#LEj$m?)=Mh-+}+ z@)GqY9yXLZ^V_nq*rF%e@`OtkZ}wW{9>v*F^;^6cpeuS9#N_U2I5eYFD^6goar0S0 z_C>FJt!Eo)4TzU~ju&oSb)Z=mR&U15FV-O8?j4(N=X+_DRr? zr;THi!|4pgZ@0`oee9CNG*SJ0$Jc?(eg4+o%a7Xtia*NSQo&`p%zO!lYd@kr7gTLq z>FruDk8oMx^;+h43pZOROM_yo&p-QMC)A(tA*wJb;M>wF!aQHUsPO!QtdMJpGaa>N zB+S;xr{A93MAeYo@bZ_){YoD9&=U>Rmg!`vUvQ~kL*2`|P4p!YbPT(FYIVwZrv2-w z9`M}TD_K*YBFDfxqkcq`MItfVrnN6_7G*>ISehq=M3bUXc6+unWjs;!B{w`Mld;Xh zJ*!B*%$MuEAso{)*u|p`zPj!?$i`*#K7a9`sC|3g@rl|JY;03SMN6t?BFkugrb&hw znUXg|9gyO!Ht`KLI#DARzK~S{^g6!to}8VN^mvJQ6uWb8;5763PpFq+kCPxPI3 zd2C5!hV4f?ugbmkf20xlv@t6#q&%)zR<+t;JOS0vegEymkg(aXS$V=2PoyFt=-_&~ zzmVmLmx53=8c@D*fYUv?!Msen(We70(exinZ7QRIufg?AJ;wTrT7i^C9V$wU_9>(p_)xaJGo<-*vprEZoYH_29qx6Nu)(E0psMCGVpCd@Ni6b3#-~pJATnX< z+BnN9_9RDa{#h3yF(TE&@=Uk}(_`QD!jyWly3Spy?WBzpod*`u5dq(&SZ_b8p$Jx# zcQ3Zv>5O1gQZU9J%$%M7U?g)%%?oy(jE&dpt1BO5JSH3Fr&JFt)+My88nUI{ zl2>GW4w9?gCAZ$V#MzW^#-&TMR=CHyx>~GDkJnGjMVXJGMI@45Ib%!RM75VkXu^08|bMW*1@02Ssp=V%Y4+TmYwephfVIu|(3xmASj& z^aw34WfQl{meUjdVs21xUU{>!+ZDslZZ8X!whwG?2i7%r7-c^mR#@xVc>vRv=xe-B z-n_joyv^5Z%f409E7+I#?D~ecLn@7R=Y20G(2J^PjZGs#2C5SOwra|yYkaSn#@gM^ zM!f6iC%fQ(F{@95C2ac>#fEWCbWDa@?JD(ol=7Ya9ml8mDHjqCEG$k{4&~q!1#DW* ze%|k^-u&@~@qY_}?*1P!=;M1S+j$!)U$(V9Yh0XT7TM=WU9)daO-zDQz+l`Egle%vssNZ;oYnYPvtp*O~ zdAjfR=WpI^4ouu+Vr-i{#gLEsA~1dMXk(HQZ?n+4d?*bzehc`z%=I9uyNy6ePL!RolL#u4e5I2jrE zA~8rS#Ij<@<%@d#bzMPxU>9i6!=G&FtC*XmihqjKda-L3@s-<3wg@)Ck2-60uN|6q z9-edK6d!fBrLmo$+U028hYi_LFG90$$)DCSjn}#J^35;s@{ir;X*w+m(JxIs2qKrM zs!I+Cn3c@neG$uJ-dUDS(8VAn61Pd`#j$3-yI7njmPx}o^7fKL@wUCCe^}}BsC!KG z^{<$7OmZ{ulu$NjD`dZ(Q2EyHqmem`G&aiDqUQe6=I*qD6EP?Sc(g;b%ihu4igu`u z)ucV3IlZ5;H1$BoK+k}u-9V&_N?lWfx2>~r4prLr^#yXduBwVHT-5LZcJ>#1V6W1P zOwx}oS&g^ht|Zs$L{}k!yKQ-EpdSp)r^F@3;<4~<|X6T9xcX4gaP?qLB=}-;BJ_3TTYVo`NC5(}kmu3blwN}q(R1u3r zd0sL)PaQvLRL6mv-Mbl1-}~9SwsYle8ATPa_cCvF|A~!kYi01-5T8Jf5-YY^d;9iU z{)TZ!mN}D1Bptg-3(|}$A>_3ohM}ZNI5)n_ww20XH4MvPkRlQuVea$W zDKAJmxkf`NmV>(0&Os_v@u|e%!!D5W(MTU9zQOZi((>wyJBk(1Pp-Y96x)vv2G?j` zeQgcdfk~U%KV1Igd1K>x#K0%*;r*fIh%fC{M#xtk!<7#r9%P%OedwU0=dP{D3=-l& z5e)V#uzg#NeH4jv=WS;f0i~e^seB`4vrh{{pZklZdCruL?DXy~oO#I$1e*EfwJDFr zJe;r_EV=H9e|Hal6P_*Y<0IEzG%5MGaeY$W<>jLWxlrc!?DdEz^G~AE9*C>T(!KO@ zMHIYKn#lg_M|(>{+6uougpNbGv0FXld>O?DhvJnCCpSNq6wjyU(;IiLzfoIDym>!+ zWu}0y_xnZVOuoR6V5eyR3YqbLg$xCq?EBk|$r+)6bi|7WO{<43iT zN1b;pgo?62VO)o5V_g*u$Ocme-knL_Y7Km_g-j@XgP8xwpjj(+i_uaj{E@Fg*Lglp z$EbU=Ey=-VkKx9`uss zYKXOtk6!LIkGDw`p_>;;=i~YI?M8T*Q=rcQOiuJt`v4kXaldjcOr3qml9j0p;YDStRwKA$?TxGwyeQwXn$xZgLRJ0`0&Ly|?^Z0Go zC(TWxopQHV#yY|_n5R_!ecn8J{;y9$#+Xed@_~_|@BvY>TOYcf8B67!Nez6e|B3cY zqs=-AKP);X^C#37uN?O}N?Z6?xlg z-K}z5J>%5cM|y0+iDAvkE9Uc$+y_QDIF*zRP$fB5$hz|3dFz@o|M%}!nVv@I^_p*d zdE??N6FfFNkgq!YdOT;ah&!p>CVOcs(B=FUnM+Ds4-=Ea!k=iI@?$i#nw>w-);JTH zYIgykk!#Mpc?GpVygkj<6b@Mh4DX{e>+k;#i7@d`&D8&cz2yB2+s zDag6=>kmV)vYIavboZZB5ABN;&wF@!i16WdRo7neXqmqf|D*%c1#RsqJXA8l>eQ_T z@-02@?xKQd=I#`VU6KGp2vn=)Mlj5K-HBr^>J^Xkyv*JlLZ!oQXSry4ZcLKN$ii4U zie;OdZ6hi@E>6-toDnvm=jsJ+a5=yhxgHyNoU3 zi9}$|^-qyypd)-W3%twAWYf!&mEL={pX~;>3leGuWFIZ_o7TYY%GZ6(L<8@JDBby{ zn9~EOnB(DS;OtCut;HgT=$iy!ypuN3P91ETcLAQ^Lj`a02ZAN+?~i&Yz;=~?^SeMJWwL7=&A77e@rch^CKo#`$b z5Vnf7i1_^E8R`+&2j{K{A<;DrgOwYl*-S9)67SfH1|JPxq&DiShezls7^c)ya;fDw z#zR6>R{B^QA15@Y7%ne}bB7(oUx0*s^~YJ-Te%RSaLHzrb%-w$ujF;tU3SBB2S&0= zb6FP=x29yPx2B(Gi;-K5>&L~h#M0&WTvXxo@%(-P%GGM;6iMCP)1*LA4}>O4t5LE7 zY4%~%x3JX?z*)_B&qyj{ag%71DX_}nrNY$F_o>rj`IdjpGBi^r3toS4EeAdo& zlxsz0O^mpBZ=B$B7;#j?0}=yfd%$=;%YeBez^1p?*r$t_C?2mU-t>VLl)YjHAI)Jm+U_#O) zsEKSIa@Wex$Vg<8WRLjjPc0L=L+RDiegUQ9KRcqo*qZWvq(UmiORhoZ&Mx$odSGUY z@y818WoblIjoUm~?348d4t}kx{k=%CcKNBm_-Z1`^ZHRi-weq~v1FY>Lc&d{Y0OZpn7g>0NOA># zwE5GWf`*AqqN2n;QMvac4WF12Zy^0_PMs>q)j2zTQ1r-n{pK5}cP}%2MfrEOQ`cTY zv!|E)134)}qG|4YfK9Vq$+3r24xYZ6o|=|*SFwRwJv)pSV0wdSXDbc=+NiC;nUNwD zJ=^gdOCGrDIVCT*SO@+$koN%vQlr`l=A3NeIvZ7iUYx2a2a-mwqt9{87+;an+4;PY zk)CnKe#VhJUXHEHK#AtP3-$8t`^yAu&t9rF4f+ykZ3W^BGfScYAA>H|CV_o+ad5!6 z>bp@KRKGK=Xl~IsBjL!725x7R4_S`bekgFBP?fz(eDFDDV+c z=ZLLs5kYnT@e&OVZe-SVo1!hcy*FY7RLJ?N6-1G%HzVugTdF4_ifiztTJASqC{oZ) z7^YANYt|Hw3O&E}EaM?1W5FBefzRi9xj1z$CZd6)ZOfw#f&A?TSd?e}8wIJQrMajV#F9eY_J*OdOoy_DZIpx>Pgg=A~j?^q{ z%VQ6|il5y{9^WmoOhY3>vET72MW8M|IrvfOE8C4=t9<|QXIWd%K2DK6Ejm3U5f;*_ z#=I2PxfOWAB>S6%*Y>&Mgaqx0Y<27md+`B3+b)-Dyl%IUVl1be{SvSG1LvfO7tN0CU)7a@^<7 zUYE10hBZRZou9DM7iHuS)Bvtx)s@IJ+gDT;Cy%iEemj4$xP<3&d=9~_z;Nze{}U#w zs#A|XY4YT~Jμ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

J>?r<- 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 -

- -
- ); -} diff --git a/mana/apps/umi-example/src/modules/app.module.ts b/mana/apps/umi-example/src/modules/app.module.ts deleted file mode 100644 index e0a2604c..00000000 --- a/mana/apps/umi-example/src/modules/app.module.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ManaModule } from '@difizen/mana-app'; - -import { State } from './state'; - -export const AppModule = ManaModule.create().register(State); - -export default AppModule; diff --git a/mana/apps/umi-example/src/modules/state.ts b/mana/apps/umi-example/src/modules/state.ts deleted file mode 100644 index b253400a..00000000 --- a/mana/apps/umi-example/src/modules/state.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { prop, singleton } from '@difizen/mana-app'; - -@singleton() -export class State { - @prop() - count = 0; -} diff --git a/mana/apps/umi-example/src/pages/docs.tsx b/mana/apps/umi-example/src/pages/docs.tsx deleted file mode 100644 index a9b00701..00000000 --- a/mana/apps/umi-example/src/pages/docs.tsx +++ /dev/null @@ -1,9 +0,0 @@ -const DocsPage = () => { - return ( -
-

This is umi docs.

-
- ); -}; - -export default DocsPage; diff --git a/mana/apps/umi-example/src/pages/index.tsx b/mana/apps/umi-example/src/pages/index.tsx deleted file mode 100644 index ed41ed26..00000000 --- a/mana/apps/umi-example/src/pages/index.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { useInject } from '@difizen/mana-app'; - -import { State } from '@/modules/state'; - -export default function HomePage() { - const state = useInject(State); - return ( -
-

Yay! Welcome to mana umi example!

-

- To get started, edit pages/index.tsx and save to reload. -

- -
- ); -} diff --git a/mana/apps/umi-example/tsconfig.json b/mana/apps/umi-example/tsconfig.json deleted file mode 100644 index 21b5a905..00000000 --- a/mana/apps/umi-example/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "./src/.umi/tsconfig.json", - "compilerOptions": { - "experimentalDecorators": true - } -} diff --git a/mana/apps/umi-example/typings.d.ts b/mana/apps/umi-example/typings.d.ts deleted file mode 100644 index 9ae2fc42..00000000 --- a/mana/apps/umi-example/typings.d.ts +++ /dev/null @@ -1 +0,0 @@ -import 'umi/typings'; diff --git a/mana/jest.config.js b/mana/jest.config.js deleted file mode 100644 index 6324da22..00000000 --- a/mana/jest.config.js +++ /dev/null @@ -1,31 +0,0 @@ -const { defaults } = require('jest-config'); - -module.exports = { - moduleFileExtensions: [...defaults.moduleFileExtensions, 'js', 'ts', 'tsx'], - verbose: true, - testRegex: '(/__test__/.*|(\\.|/)(test|spec))\\.tsx?$', - transform: { - '^.+\\.(ts|tsx)?$': 'babel-jest', - '^.+\\.(js|jsx)$': 'babel-jest', - }, - coveragePathIgnorePatterns: [ - '/lib/', - '/es/', - '/node_modules/', - '/mock/', - '/docs/', - '/scripts/mock/', - ], - collectCoverageFrom: [ - 'packages/**/*/src/**/*.{js,jsx,ts,tsx}', - 'src/**/*.{js,jsx,ts,tsx}', - ], - moduleDirectories: ['node_modules', 'lib', 'es', 'dist'], - moduleNameMapper: { - '\\.(less|css)$': 'jest-less-loader', - }, - extensionsToTreatAsEsm: ['.ts'], - testEnvironment: 'jsdom', - coverageProvider: 'v8', - coverageReporters: ['text-summary', 'json-summary', 'json', 'lcov'], -}; diff --git a/mana/nx.json b/mana/nx.json deleted file mode 100644 index 3b532931..00000000 --- a/mana/nx.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - // We are using Nx for monorepo task orchestration - // See https://nx.dev/concepts/mental-model to understand more - "$schema": "https://cdn.jsdelivr.net/npm/nx@latest/schemas/nx-schema.json", - // Inputs affect when Nx will re-run a task - // If inputs are not changed then Nx will skip re-run and replay cached results - // For example, we want to re-run ESLint whenever eslintrc is updated - // This guarantees that tasks are always correct and up-to-date - // - // Named inputs defined here are to be referenced in targetDefaults - // See https://nx.dev/concepts/mental-model#computation-hashing-and-caching - // and https://nx.dev/reference/nx-json#inputs-&-namedinputs - // - // workspaceRoot means the root of the monorepo - // projectRoot means the root of the package in which the task is defined - "namedInputs": { - ":default": ["{projectRoot}/**/*"], - ":eslint": [ - "{workspaceRoot}/.eslintrc.{js,cjs}", - "{workspaceRoot}/.eslintrc.*.{js,cjs}", - "{workspaceRoot}/.eslintignore", - "{projectRoot}/.eslintrc.{js,cjs}" - ], - ":stylelint": [ - "{workspaceRoot}/.stylelintrc.{js,cjs}", - "{workspaceRoot}/.stylelintignore", - "{projectRoot}/.stylelint.{js,cjs}" - ], - ":prettier": [ - "{workspaceRoot}/.prettierrc.json", - "{workspaceRoot}/.prettierignore" - ], - ":tsc": [ - "{workspaceRoot}/tsconfig.json", - "{workspaceRoot}/tsconfig.*.json", - "{projectRoot}/**/tsconfig.json", - "{projectRoot}/**/tsconfig.*.json" - ], - ":vitest": ["{workspaceRoot}/vitest.config.mts", "{projectRoot}/vitest.config.mts"], - ":jest": [ - "{workspaceRoot}/jest.config.js", - "{workspaceRoot}/babel.config.js", - "{projectRoot}/jest.config.js", - "{projectRoot}/babel.config.js" - ] - }, - // targetDefaults configure default options for each task - // such as inputs, outputs and dependencies - // See https://nx.dev/reference/nx-json#target-defaults - // The actual commands are defined in the `scripts` section in each package's package.json - "targetDefaults": { - "setup": { - "outputs": ["{projectRoot}/dist", "{projectRoot}/es", "{projectRoot}/lib"], - "dependsOn": ["^setup"] - }, - "build": { - "outputs": ["{projectRoot}/dist", "{projectRoot}/es", "{projectRoot}/lib"], - "dependsOn": ["^build"] - }, - "lint:eslint": { - "inputs": [":default", ":eslint"] - }, - "lint:stylelint": { - "inputs": [":default", ":stylelint"] - }, - "lint:prettier": { - "inputs": [":default", ":prettier"] - }, - "typecheck:tsc": { - "inputs": [":default", ":tsc"] - }, - "lint": { - "dependsOn": ["lint:eslint", "lint:stylelint", "lint:prettier"] - }, - "test:vitest": { - "inputs": [":default", ":vitest"] - }, - "test:jest": { - "inputs": [":default", ":jest"] - }, - "test": { - "dependsOn": ["test:jest"] - }, - "coverage:vitest": { - "outputs": ["{projectRoot}/coverage"], - "inputs": [":default", ":vitest"] - }, - "coverage:jest": { - "outputs": ["{projectRoot}/coverage"], - "inputs": [":default", ":jest"] - }, - "coverage": { - "dependsOn": ["coverage:jest"] - } - }, - "tasksRunnerOptions": { - "default": { - "runner": "nx/tasks-runners/default", - "options": { - "parallel": 6, - "cacheableOperations": [ - "setup", - "build", - "lint:eslint", - "lint:stylelint", - "lint:prettier", - "lint:tsc", - "lint", - "typecheck:tsc", - "test:vitest", - "test", - "coverage:vitest", - "coverage" - ] - } - } - } -} diff --git a/mana/package.json b/mana/package.json deleted file mode 100644 index 28e27b6d..00000000 --- a/mana/package.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "name": "mana", - "version": "0.0.1", - "private": true, - "license": "MIT", - "description": "Difizen mana", - "scripts": { - "bootstrap": "./scripts/bootstrap.sh", - "test:jest": "jest", - "coverage": "nx run-many --target=coverage", - "coverage:jest": "jest --coverage", - "postinstall": "is-ci || husky install", - "setup": "nx run-many --target=setup", - "build": "nx run-many --target=build", - "lint": "nx run-many --target=lint:prettier,lint", - "lint:prettier": "prettier --check --ignore-unknown .", - "prettier": "prettier --ignore-unknown . --write", - "lint-staged": "lint-staged", - "test": "nx run-many --target=test", - "check": "nx run-many -t lint:prettier -t lint:eslint -t lint:stylelint -t typecheck:tsc -t test:jest", - "ci:setup": "nx run-many --target=setup", - "ci:build": "nx run-many --target=build", - "ci:check": "nx run-many -t lint:prettier -t lint:eslint -t lint:stylelint -t typecheck:tsc -t coverage:jest", - "ci:publish": "changeset publish && nx run-many --nx-bail -t publish", - "docs": "nx run @difizen/mana-docs:start", - "docs:build": "nx run @difizen/mana-docs:build", - "changeset": "changeset", - "clean": "git clean -fX ." - }, - "devDependencies": { - "@babel/plugin-proposal-decorators": "^7.23.2", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-flow-strip-types": "^7.22.5", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/preset-env": "^7.23.2", - "@babel/preset-react": "^7.22.15", - "@babel/preset-typescript": "^7.23.2", - "@changesets/changelog-github": "^0.5.0", - "@changesets/cli": "^2.27.7", - "@commitlint/cli": "^17.7.2", - "@commitlint/config-conventional": "^17.7.0", - "@types/jest": "^29.5.5", - "@types/node": "^20.8.3", - "@types/react": "^18.2.0", - "@types/react-dom": "^18.2.0", - "@types/react-test-renderer": "^18.0.3", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", - "@umijs/lint": "^4.0.83", - "babel-jest": "^29.7.0", - "babel-plugin-parameter-decorator": "^1.0.16", - "dotenv-cli": "^7.3.0", - "eslint": "^8.51.0", - "eslint-config-prettier": "^8.10.0", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-mdx": "^2.2.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0", - "father": "4.3.1", - "husky": "^8.0.3", - "is-ci": "^3.0.1", - "jest": "^29.7.0", - "jest-config": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "jest-less-loader": "^0.2.0", - "lint-staged": "^13.3.0", - "nx": "^16.10.0", - "postcss-less": "^6.0.0", - "prettier": "^3.4.0", - "react": "^18.2.0", - "react-test-renderer": "^18.2.0", - "stylelint": "^14.16.1", - "typescript": "^4.9.5" - }, - "engines": { - "node": ">=16.20.0" - }, - "packageManager": "pnpm@9.7.1", - "nx": { - "includedScripts": [ - "lint:prettier", - "coverage:jest" - ] - } -} diff --git a/mana/packages/umi-plugin-mana/babel.config.json b/mana/packages/umi-plugin-mana/babel.config.json deleted file mode 100644 index efd12242..00000000 --- a/mana/packages/umi-plugin-mana/babel.config.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - [ - "@babel/preset-react", - { - "runtime": "automatic" - } - ], - "@babel/preset-typescript" - ], - "plugins": [ - ["@babel/plugin-proposal-decorators", { "legacy": true }], - ["@babel/plugin-transform-flow-strip-types", { "allowDeclareFields": true }], - ["@babel/plugin-transform-private-methods", { "loose": true }], - ["@babel/plugin-transform-private-property-in-object", { "loose": true }], - ["@babel/plugin-transform-class-properties", { "loose": true }], - "babel-plugin-parameter-decorator" - ] -} diff --git a/mana/pnpm-workspace.yaml b/mana/pnpm-workspace.yaml deleted file mode 100644 index 7cb5eff6..00000000 --- a/mana/pnpm-workspace.yaml +++ /dev/null @@ -1,4 +0,0 @@ -packages: - - 'apps/*' - - 'packages/*' - - 'docs' diff --git a/mana/scripts/bootstrap.sh b/mana/scripts/bootstrap.sh deleted file mode 100755 index e8c77e74..00000000 --- a/mana/scripts/bootstrap.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -# Bootstrap this monorepo for development - -set -e -u -o pipefail - -RED='\033[0;31m' -ORANGE='\033[0;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -NC='\033[0m' # No Color - -# Install Node dependencies -# pnpm install --frozen-lockfile -pnpm install - -# Run setup tasks across all packages -pnpm run setup diff --git a/mana/scripts/release-snapshot.sh b/mana/scripts/release-snapshot.sh deleted file mode 100644 index 6fa11963..00000000 --- a/mana/scripts/release-snapshot.sh +++ /dev/null @@ -1,4 +0,0 @@ -# release snapshot version for test, should do in separate branch, not need to merge back -# first need `pnpm changeset` -pnpm changeset version --snapshot snapshot -pnpm changeset publish --tag snapshot --no-git-tag --snapshot diff --git a/mana/tsconfig.base.json b/mana/tsconfig.base.json deleted file mode 100644 index 50c81ec1..00000000 --- a/mana/tsconfig.base.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - /* interop */ - "allowJs": true, - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "isolatedModules": true, - - /* code quality */ - "strict": true, - "strictPropertyInitialization": false, - - "exactOptionalPropertyTypes": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": false, - // "noUncheckedIndexedAccess": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitOverride": true, - "skipLibCheck": true, - - /* modules */ - "module": "ESNext", - "moduleResolution": "nodenext", - "resolveJsonModule": true, - - /* features */ - "downlevelIteration": true, - "experimentalDecorators": true, - "declaration": true, - "declarationMap": true, - "jsx": "react-jsx", - "lib": ["ESNext", "DOM", "DOM.Iterable"], - "target": "ESNext", - - /* dev */ - "preserveWatchOutput": true - } -}