From 7cdaecc04b9ceba0b18f9b4c38a7eed6ea69cd20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=8F=E7=81=BF=E6=96=8C?= <15815221751@163.com> Date: Wed, 19 Nov 2025 10:58:34 +0800 Subject: [PATCH] first commit --- .browserslistrc | 5 + .env.base | 23 + .env.dev | 41 + .env.gitee | 41 + .env.pro | 41 + .env.test | 41 + .github/workflows/auto-merge.yml | 131 + .github/workflows/release.yml | 19 + .gitignore | 9 + .husky/commit-msg | 1 + .husky/lintstagedrc.cjs | 9 + .husky/pre-commit | 2 + .prettierignore | 9 + .stylelintignore | 6 + .vscode/extensions.json | 3 + .vscode/settings.json | 19 + CHANGELOG.md | 1421 ++ Dockerfile.dev | 13 + LICENSE | 21 + README.md | 148 + README.zh-CN.md | 148 + commitlint.config.cjs | 28 + docker-compose.dev.yaml | 10 + eslint.config.mjs | 82 + index.html | 142 + mock/_createProductionServer.ts | 18 + mock/analysis/index.mock.ts | 87 + mock/department/index.mock.ts | 206 + mock/dict/index.mock.ts | 60 + mock/menu/index.mock.ts | 357 + mock/request/index.mock.ts | 72 + mock/role/index.mock.ts | 1235 ++ mock/table/index.mock.ts | 319 + mock/user/index.mock.ts | 90 + mock/workplace/index.mock.ts | 169 + package.json | 139 + plop/component/component.hbs | 11 + plop/component/index.hbs | 3 + plop/component/prompt.cjs | 38 + plop/view/prompt.cjs | 37 + plop/view/view.hbs | 7 + plopfile.cjs | 7 + pnpm-lock.yaml | 11876 ++++++++++++++++ postcss.config.cjs | 5 + prettier.config.cjs | 19 + public/favicon.ico | Bin 0 -> 4286 bytes public/logo.png | Bin 0 -> 9193 bytes scripts/icon.ts | 73 + src/App.vue | 59 + src/api/common/index.ts | 11 + src/api/dashboard/analysis/index.ts | 23 + src/api/dashboard/analysis/types.ts | 22 + src/api/dashboard/workplace/index.ts | 22 + src/api/dashboard/workplace/types.ts | 30 + src/api/department/index.ts | 30 + src/api/department/types.ts | 32 + src/api/login/index.ts | 34 + src/api/login/types.ts | 11 + src/api/menu/index.ts | 5 + src/api/request/index.ts | 38 + src/api/request/types.ts | 3 + src/api/role/index.ts | 5 + src/api/table/index.ts | 26 + src/api/table/types.ts | 9 + src/assets/imgs/avatar.jpg | Bin 0 -> 6264 bytes src/assets/imgs/logo.png | Bin 0 -> 9193 bytes src/assets/imgs/personal-center-bg.jpg | Bin 0 -> 185776 bytes src/assets/svgs/403.svg | 1 + src/assets/svgs/404.svg | 1 + src/assets/svgs/500.svg | 1 + src/assets/svgs/icon.svg | 1 + src/assets/svgs/login-bg.svg | 1 + src/assets/svgs/login-box-bg.svg | 1 + src/assets/svgs/message.svg | 1 + src/assets/svgs/money.svg | 1 + src/assets/svgs/peoples.svg | 1 + src/assets/svgs/shopping.svg | 1 + src/axios/config.ts | 53 + src/axios/index.ts | 42 + src/axios/service.ts | 77 + src/axios/types/index.ts | 31 + src/components/Avatars/index.ts | 4 + src/components/Avatars/src/Avatars.vue | 79 + src/components/Avatars/src/types/index.ts | 4 + src/components/Backtop/index.ts | 3 + src/components/Backtop/src/Backtop.vue | 15 + src/components/Breadcrumb/index.ts | 3 + src/components/Breadcrumb/src/Breadcrumb.vue | 126 + src/components/Breadcrumb/src/helper.ts | 30 + src/components/Button/index.ts | 3 + src/components/Button/src/Button.vue | 121 + src/components/CodeEditor/index.ts | 3 + src/components/CodeEditor/src/CodeEditor.vue | 119 + .../CodeEditor/src/config/config.ts | 129 + src/components/Collapse/index.ts | 3 + src/components/Collapse/src/Collapse.vue | 34 + src/components/ConfigGlobal/index.ts | 5 + .../ConfigGlobal/src/ConfigGlobal.vue | 62 + .../ConfigGlobal/src/types/index.ts | 5 + src/components/ContentDetailWrap/index.ts | 3 + .../src/ContentDetailWrap.vue | 25 + src/components/ContentWrap/index.ts | 3 + .../ContentWrap/src/ContentWrap.vue | 36 + src/components/ContextMenu/index.ts | 12 + .../ContextMenu/src/ContextMenu.vue | 72 + src/components/ContextMenu/src/types/index.ts | 7 + src/components/CountTo/index.ts | 3 + src/components/CountTo/src/CountTo.vue | 180 + src/components/Descriptions/index.ts | 5 + .../Descriptions/src/Descriptions.vue | 197 + .../Descriptions/src/types/index.ts | 15 + src/components/Dialog/hooks/useResize.ts | 178 + src/components/Dialog/index.ts | 3 + src/components/Dialog/src/Dialog.vue | 145 + src/components/Dialog/src/ResizeDialog.vue | 73 + src/components/Echart/index.ts | 3 + src/components/Echart/src/Echart.vue | 115 + src/components/Editor/index.ts | 8 + src/components/Editor/src/Editor.vue | 135 + src/components/Error/index.ts | 3 + src/components/Error/src/Error.vue | 57 + src/components/Footer/index.ts | 3 + src/components/Footer/src/Footer.vue | 22 + src/components/Form/index.ts | 48 + src/components/Form/src/Form.vue | 443 + .../Form/src/components/useRenderCheckbox.tsx | 31 + .../Form/src/components/useRenderRadio.tsx | 31 + .../Form/src/components/useRenderSelect.tsx | 58 + .../Form/src/helper/componentMap.ts | 59 + src/components/Form/src/helper/index.ts | 169 + src/components/Form/src/types/index.ts | 670 + src/components/Highlight/index.ts | 3 + src/components/Highlight/src/Highlight.vue | 65 + src/components/IAgree/index.ts | 4 + src/components/IAgree/src/IAgree.vue | 41 + src/components/IAgree/src/types/index.ts | 10 + src/components/Icon/index.ts | 5 + src/components/Icon/src/Icon.vue | 79 + src/components/Icon/src/types/index.ts | 6 + src/components/IconPicker/index.ts | 3 + src/components/IconPicker/src/IconPicker.vue | 193 + .../IconPicker/src/data/icons.ant-design.ts | 836 ++ .../IconPicker/src/data/icons.ep.ts | 299 + .../IconPicker/src/data/icons.tdesign.ts | 1209 ++ src/components/ImageCropping/index.ts | 3 + .../ImageCropping/src/ImageCropping.vue | 259 + src/components/ImageViewer/index.ts | 33 + .../ImageViewer/src/ImageViewer.vue | 34 + src/components/ImageViewer/src/types/index.ts | 9 + src/components/Infotip/index.ts | 5 + src/components/Infotip/src/Infotip.vue | 53 + src/components/Infotip/src/types/index.ts | 4 + src/components/InputPassword/index.ts | 3 + .../InputPassword/src/InputPassword.vue | 142 + src/components/JsonEditor/index.ts | 4 + src/components/JsonEditor/src/JsonEditor.vue | 98 + src/components/JsonEditor/src/types/index.ts | 23 + src/components/LocaleDropdown/index.ts | 5 + .../LocaleDropdown/src/LocaleDropdown.vue | 52 + .../LocaleDropdown/src/types/index.ts | 10 + src/components/Logo/index.ts | 3 + src/components/Logo/src/Logo.vue | 80 + src/components/Menu/index.ts | 3 + src/components/Menu/src/Menu.vue | 278 + .../Menu/src/components/useRenderMenuItem.tsx | 59 + .../src/components/useRenderMenuTitle.tsx | 27 + src/components/Menu/src/helper.ts | 54 + src/components/Permission/index.ts | 4 + src/components/Permission/src/Permission.vue | 29 + src/components/Permission/src/utils.ts | 14 + src/components/Qrcode/index.ts | 5 + src/components/Qrcode/src/Qrcode.vue | 252 + src/components/Qrcode/src/types/index.ts | 9 + src/components/Screenfull/index.ts | 3 + src/components/Screenfull/src/Screenfull.vue | 30 + src/components/Search/index.ts | 15 + src/components/Search/src/Search.vue | 271 + .../Search/src/components/ActionButton.vue | 59 + src/components/Search/src/types/index.ts | 16 + src/components/Setting/index.ts | 3 + src/components/Setting/src/Setting.vue | 251 + .../src/components/ColorRadioPicker.vue | 65 + .../src/components/InterfaceDisplay.vue | 227 + .../src/components/LayoutRadioPicker.vue | 171 + src/components/SizeDropdown/index.ts | 3 + .../SizeDropdown/src/SizeDropdown.vue | 39 + src/components/TabMenu/index.ts | 3 + src/components/TabMenu/src/TabMenu.vue | 251 + src/components/TabMenu/src/helper.ts | 51 + src/components/Table/index.ts | 21 + src/components/Table/src/Table.vue | 587 + .../Table/src/components/ColumnSetting.vue | 166 + .../Table/src/components/TableActions.vue | 105 + src/components/Table/src/helper/index.ts | 8 + src/components/Table/src/types/index.ts | 98 + src/components/TagsView/index.ts | 3 + src/components/TagsView/src/TagsView.vue | 590 + src/components/TagsView/src/helper.ts | 21 + src/components/ThemeSwitch/index.ts | 3 + .../ThemeSwitch/src/ThemeSwitch.vue | 56 + src/components/Tree/index.ts | 3 + src/components/Tree/src/Tree.vue | 147 + src/components/UserInfo/index.ts | 3 + src/components/UserInfo/src/UserInfo.vue | 103 + .../UserInfo/src/components/LockDialog.vue | 120 + .../UserInfo/src/components/LockPage.vue | 281 + src/components/VideoPlayer/index.ts | 27 + .../VideoPlayer/src/VideoPlayer.vue | 59 + src/components/VideoPlayerViewer/index.ts | 3 + .../src/VideoPlayerViewer.vue | 49 + src/components/Waterfall/index.ts | 3 + src/components/Waterfall/src/Waterfall.vue | 234 + src/components/index.ts | 10 + src/constants/index.ts | 39 + src/directives/index.ts | 10 + src/directives/permission/hasPermi.ts | 37 + src/hooks/event/useEventBus.ts | 26 + src/hooks/event/useScrollTo.ts | 62 + src/hooks/web/useClipboard.ts | 47 + src/hooks/web/useConfigGlobal.ts | 10 + src/hooks/web/useCrudSchemas.ts | 163 + src/hooks/web/useDesign.ts | 18 + src/hooks/web/useForm.ts | 149 + src/hooks/web/useGuide.ts | 49 + src/hooks/web/useI18n.ts | 52 + src/hooks/web/useIcon.ts | 7 + src/hooks/web/useLocale.ts | 35 + src/hooks/web/useMonacoEditor.ts | 129 + src/hooks/web/useNProgress.ts | 34 + src/hooks/web/useNetwork.ts | 21 + src/hooks/web/useNow.ts | 60 + src/hooks/web/usePageLoading.ts | 20 + src/hooks/web/useSearch.ts | 91 + src/hooks/web/useStorage.ts | 46 + src/hooks/web/useTable.ts | 195 + src/hooks/web/useTagsView.ts | 63 + src/hooks/web/useTimeAgo.ts | 50 + src/hooks/web/useTitle.ts | 25 + src/hooks/web/useValidator.ts | 109 + src/hooks/web/useWatermark.ts | 55 + src/layout/Layout.vue | 74 + src/layout/components/AppView.vue | 37 + src/layout/components/ToolHeader.vue | 82 + src/layout/components/useRenderLayout.tsx | 306 + src/locales/en.ts | 584 + src/locales/zh-CN.ts | 572 + src/main.ts | 58 + src/permission.ts | 64 + src/plugins/animate.css/index.ts | 1 + src/plugins/echarts/index.ts | 41 + src/plugins/elementPlus/index.ts | 24 + src/plugins/svgIcon/index.ts | 1 + src/plugins/unocss/index.ts | 1 + src/plugins/vueI18n/helper.ts | 3 + src/plugins/vueI18n/index.ts | 42 + src/router/index.ts | 753 + src/store/index.ts | 13 + src/store/modules/app.ts | 340 + src/store/modules/locale.ts | 59 + src/store/modules/lock.ts | 48 + src/store/modules/permission.ts | 104 + src/store/modules/tagsView.ts | 163 + src/store/modules/user.ts | 102 + src/styles/index.less | 7 + src/styles/var.css | 69 + src/styles/variables.module.less | 10 + src/utils/color.ts | 172 + src/utils/dateUtil.ts | 17 + src/utils/domUtils.ts | 289 + src/utils/index.ts | 136 + src/utils/is.ts | 117 + src/utils/propTypes.ts | 24 + src/utils/routerHelper.ts | 197 + src/utils/tree.ts | 207 + src/utils/tsxHelper.ts | 16 + .../Authorization/Department/Department.vue | 341 + .../Department/components/Detail.vue | 20 + .../Department/components/Write.vue | 59 + src/views/Authorization/Menu/Menu.vue | 212 + .../Menu/components/AddButtonPermission.vue | 68 + .../Authorization/Menu/components/Detail.vue | 173 + .../Authorization/Menu/components/Write.vue | 409 + src/views/Authorization/Role/Role.vue | 173 + .../Authorization/Role/components/Detail.vue | 106 + .../Authorization/Role/components/Write.vue | 181 + src/views/Authorization/User/User.vue | 384 + .../Authorization/User/components/Detail.vue | 20 + .../Authorization/User/components/Write.vue | 60 + src/views/Components/Avatars.vue | 53 + src/views/Components/CountTo.vue | 100 + src/views/Components/Descriptions.vue | 192 + src/views/Components/Dialog.vue | 165 + src/views/Components/Echart.vue | 36 + src/views/Components/Editor/CodeEditor.vue | 23 + src/views/Components/Editor/Editor.vue | 32 + src/views/Components/Editor/JsonEditor.vue | 36 + src/views/Components/Form/DefaultForm.vue | 1863 +++ src/views/Components/Form/UseFormDemo.vue | 470 + src/views/Components/Highlight.vue | 20 + src/views/Components/IAgree.vue | 21 + src/views/Components/Icon.vue | 61 + src/views/Components/IconPicker.vue | 16 + src/views/Components/ImageCropping.vue | 43 + src/views/Components/ImageViewer.vue | 29 + src/views/Components/Infotip.vue | 33 + src/views/Components/InputPassword.vue | 21 + src/views/Components/Qrcode.vue | 108 + src/views/Components/Search.vue | 363 + src/views/Components/Table/CardTable.vue | 80 + src/views/Components/Table/DefaultTable.vue | 105 + .../Components/Table/TableImagePreview.vue | 87 + .../Components/Table/TableVideoPreview.vue | 71 + src/views/Components/Table/TreeTable.vue | 117 + src/views/Components/Table/UseTableDemo.vue | 283 + src/views/Components/Tree.vue | 252 + src/views/Components/VideoPlayer.vue | 24 + src/views/Components/Waterfall.vue | 62 + src/views/Dashboard/Analysis.vue | 127 + src/views/Dashboard/Workplace.vue | 293 + src/views/Dashboard/components/PanelGroup.vue | 200 + src/views/Dashboard/echarts-data.ts | 309 + src/views/Error/403.vue | 17 + src/views/Error/404.vue | 17 + src/views/Error/500.vue | 17 + src/views/Example/Dialog/ExampleDialog.vue | 340 + .../Example/Dialog/components/Detail.vue | 20 + src/views/Example/Dialog/components/Write.vue | 63 + src/views/Example/Page/ExampleAdd.vue | 51 + src/views/Example/Page/ExampleDetail.vue | 37 + src/views/Example/Page/ExampleEdit.vue | 66 + src/views/Example/Page/ExamplePage.vue | 297 + src/views/Example/Page/components/Detail.vue | 69 + src/views/Example/Page/components/Write.vue | 154 + src/views/Function/MultipleTabs.vue | 18 + src/views/Function/MultipleTabsDemo.vue | 19 + src/views/Function/Request.vue | 173 + src/views/Function/Test.vue | 70 + src/views/Guide/Guide.vue | 19 + src/views/Level/Menu111.vue | 20 + src/views/Level/Menu12.vue | 20 + src/views/Level/Menu2.vue | 20 + src/views/Login/Login.vue | 116 + src/views/Login/components/LoginForm.vue | 313 + src/views/Login/components/RegisterForm.vue | 218 + src/views/Login/components/index.ts | 4 + .../PersonalCenter/PersonalCenter.vue | 148 + .../PersonalCenter/components/EditInfo.vue | 96 + .../components/EditPassword.vue | 110 + .../components/UploadAvatar.vue | 30 + src/views/Redirect/Redirect.vue | 30 + src/views/hooks/useClipboard.vue | 26 + src/views/hooks/useCrudSchemas.vue | 186 + src/views/hooks/useNetwork.vue | 12 + src/views/hooks/useTagsView.vue | 59 + src/views/hooks/useValidator.vue | 80 + src/views/hooks/useWatermark.vue | 31 + stylelint.config.cjs | 231 + tsconfig.json | 37 + types/components.d.ts | 9 + types/env.d.ts | 14 + types/global.d.ts | 87 + types/router.d.ts | 78 + uno.config.ts | 146 + vite.config.ts | 181 + 364 files changed, 47824 insertions(+) create mode 100644 .browserslistrc create mode 100644 .env.base create mode 100644 .env.dev create mode 100644 .env.gitee create mode 100644 .env.pro create mode 100644 .env.test create mode 100644 .github/workflows/auto-merge.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 .husky/commit-msg create mode 100644 .husky/lintstagedrc.cjs create mode 100644 .husky/pre-commit create mode 100644 .prettierignore create mode 100644 .stylelintignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 CHANGELOG.md create mode 100644 Dockerfile.dev create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README.zh-CN.md create mode 100644 commitlint.config.cjs create mode 100644 docker-compose.dev.yaml create mode 100644 eslint.config.mjs create mode 100644 index.html create mode 100644 mock/_createProductionServer.ts create mode 100644 mock/analysis/index.mock.ts create mode 100644 mock/department/index.mock.ts create mode 100644 mock/dict/index.mock.ts create mode 100644 mock/menu/index.mock.ts create mode 100644 mock/request/index.mock.ts create mode 100644 mock/role/index.mock.ts create mode 100644 mock/table/index.mock.ts create mode 100644 mock/user/index.mock.ts create mode 100644 mock/workplace/index.mock.ts create mode 100644 package.json create mode 100644 plop/component/component.hbs create mode 100644 plop/component/index.hbs create mode 100644 plop/component/prompt.cjs create mode 100644 plop/view/prompt.cjs create mode 100644 plop/view/view.hbs create mode 100644 plopfile.cjs create mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.cjs create mode 100644 prettier.config.cjs create mode 100644 public/favicon.ico create mode 100644 public/logo.png create mode 100644 scripts/icon.ts create mode 100644 src/App.vue create mode 100644 src/api/common/index.ts create mode 100644 src/api/dashboard/analysis/index.ts create mode 100644 src/api/dashboard/analysis/types.ts create mode 100644 src/api/dashboard/workplace/index.ts create mode 100644 src/api/dashboard/workplace/types.ts create mode 100644 src/api/department/index.ts create mode 100644 src/api/department/types.ts create mode 100644 src/api/login/index.ts create mode 100644 src/api/login/types.ts create mode 100644 src/api/menu/index.ts create mode 100644 src/api/request/index.ts create mode 100644 src/api/request/types.ts create mode 100644 src/api/role/index.ts create mode 100644 src/api/table/index.ts create mode 100644 src/api/table/types.ts create mode 100644 src/assets/imgs/avatar.jpg create mode 100644 src/assets/imgs/logo.png create mode 100644 src/assets/imgs/personal-center-bg.jpg create mode 100644 src/assets/svgs/403.svg create mode 100644 src/assets/svgs/404.svg create mode 100644 src/assets/svgs/500.svg create mode 100644 src/assets/svgs/icon.svg create mode 100644 src/assets/svgs/login-bg.svg create mode 100644 src/assets/svgs/login-box-bg.svg create mode 100644 src/assets/svgs/message.svg create mode 100644 src/assets/svgs/money.svg create mode 100644 src/assets/svgs/peoples.svg create mode 100644 src/assets/svgs/shopping.svg create mode 100644 src/axios/config.ts create mode 100644 src/axios/index.ts create mode 100644 src/axios/service.ts create mode 100644 src/axios/types/index.ts create mode 100644 src/components/Avatars/index.ts create mode 100644 src/components/Avatars/src/Avatars.vue create mode 100644 src/components/Avatars/src/types/index.ts create mode 100644 src/components/Backtop/index.ts create mode 100644 src/components/Backtop/src/Backtop.vue create mode 100644 src/components/Breadcrumb/index.ts create mode 100644 src/components/Breadcrumb/src/Breadcrumb.vue create mode 100644 src/components/Breadcrumb/src/helper.ts create mode 100644 src/components/Button/index.ts create mode 100644 src/components/Button/src/Button.vue create mode 100644 src/components/CodeEditor/index.ts create mode 100644 src/components/CodeEditor/src/CodeEditor.vue create mode 100644 src/components/CodeEditor/src/config/config.ts create mode 100644 src/components/Collapse/index.ts create mode 100644 src/components/Collapse/src/Collapse.vue create mode 100644 src/components/ConfigGlobal/index.ts create mode 100644 src/components/ConfigGlobal/src/ConfigGlobal.vue create mode 100644 src/components/ConfigGlobal/src/types/index.ts create mode 100644 src/components/ContentDetailWrap/index.ts create mode 100644 src/components/ContentDetailWrap/src/ContentDetailWrap.vue create mode 100644 src/components/ContentWrap/index.ts create mode 100644 src/components/ContentWrap/src/ContentWrap.vue create mode 100644 src/components/ContextMenu/index.ts create mode 100644 src/components/ContextMenu/src/ContextMenu.vue create mode 100644 src/components/ContextMenu/src/types/index.ts create mode 100644 src/components/CountTo/index.ts create mode 100644 src/components/CountTo/src/CountTo.vue create mode 100644 src/components/Descriptions/index.ts create mode 100644 src/components/Descriptions/src/Descriptions.vue create mode 100644 src/components/Descriptions/src/types/index.ts create mode 100644 src/components/Dialog/hooks/useResize.ts create mode 100644 src/components/Dialog/index.ts create mode 100644 src/components/Dialog/src/Dialog.vue create mode 100644 src/components/Dialog/src/ResizeDialog.vue create mode 100644 src/components/Echart/index.ts create mode 100644 src/components/Echart/src/Echart.vue create mode 100644 src/components/Editor/index.ts create mode 100644 src/components/Editor/src/Editor.vue create mode 100644 src/components/Error/index.ts create mode 100644 src/components/Error/src/Error.vue create mode 100644 src/components/Footer/index.ts create mode 100644 src/components/Footer/src/Footer.vue create mode 100644 src/components/Form/index.ts create mode 100644 src/components/Form/src/Form.vue create mode 100644 src/components/Form/src/components/useRenderCheckbox.tsx create mode 100644 src/components/Form/src/components/useRenderRadio.tsx create mode 100644 src/components/Form/src/components/useRenderSelect.tsx create mode 100644 src/components/Form/src/helper/componentMap.ts create mode 100644 src/components/Form/src/helper/index.ts create mode 100644 src/components/Form/src/types/index.ts create mode 100644 src/components/Highlight/index.ts create mode 100644 src/components/Highlight/src/Highlight.vue create mode 100644 src/components/IAgree/index.ts create mode 100644 src/components/IAgree/src/IAgree.vue create mode 100644 src/components/IAgree/src/types/index.ts create mode 100644 src/components/Icon/index.ts create mode 100644 src/components/Icon/src/Icon.vue create mode 100644 src/components/Icon/src/types/index.ts create mode 100644 src/components/IconPicker/index.ts create mode 100644 src/components/IconPicker/src/IconPicker.vue create mode 100644 src/components/IconPicker/src/data/icons.ant-design.ts create mode 100644 src/components/IconPicker/src/data/icons.ep.ts create mode 100644 src/components/IconPicker/src/data/icons.tdesign.ts create mode 100644 src/components/ImageCropping/index.ts create mode 100644 src/components/ImageCropping/src/ImageCropping.vue create mode 100644 src/components/ImageViewer/index.ts create mode 100644 src/components/ImageViewer/src/ImageViewer.vue create mode 100644 src/components/ImageViewer/src/types/index.ts create mode 100644 src/components/Infotip/index.ts create mode 100644 src/components/Infotip/src/Infotip.vue create mode 100644 src/components/Infotip/src/types/index.ts create mode 100644 src/components/InputPassword/index.ts create mode 100644 src/components/InputPassword/src/InputPassword.vue create mode 100644 src/components/JsonEditor/index.ts create mode 100644 src/components/JsonEditor/src/JsonEditor.vue create mode 100644 src/components/JsonEditor/src/types/index.ts create mode 100644 src/components/LocaleDropdown/index.ts create mode 100644 src/components/LocaleDropdown/src/LocaleDropdown.vue create mode 100644 src/components/LocaleDropdown/src/types/index.ts create mode 100644 src/components/Logo/index.ts create mode 100644 src/components/Logo/src/Logo.vue create mode 100644 src/components/Menu/index.ts create mode 100644 src/components/Menu/src/Menu.vue create mode 100644 src/components/Menu/src/components/useRenderMenuItem.tsx create mode 100644 src/components/Menu/src/components/useRenderMenuTitle.tsx create mode 100644 src/components/Menu/src/helper.ts create mode 100644 src/components/Permission/index.ts create mode 100644 src/components/Permission/src/Permission.vue create mode 100644 src/components/Permission/src/utils.ts create mode 100644 src/components/Qrcode/index.ts create mode 100644 src/components/Qrcode/src/Qrcode.vue create mode 100644 src/components/Qrcode/src/types/index.ts create mode 100644 src/components/Screenfull/index.ts create mode 100644 src/components/Screenfull/src/Screenfull.vue create mode 100644 src/components/Search/index.ts create mode 100644 src/components/Search/src/Search.vue create mode 100644 src/components/Search/src/components/ActionButton.vue create mode 100644 src/components/Search/src/types/index.ts create mode 100644 src/components/Setting/index.ts create mode 100644 src/components/Setting/src/Setting.vue create mode 100644 src/components/Setting/src/components/ColorRadioPicker.vue create mode 100644 src/components/Setting/src/components/InterfaceDisplay.vue create mode 100644 src/components/Setting/src/components/LayoutRadioPicker.vue create mode 100644 src/components/SizeDropdown/index.ts create mode 100644 src/components/SizeDropdown/src/SizeDropdown.vue create mode 100644 src/components/TabMenu/index.ts create mode 100644 src/components/TabMenu/src/TabMenu.vue create mode 100644 src/components/TabMenu/src/helper.ts create mode 100644 src/components/Table/index.ts create mode 100644 src/components/Table/src/Table.vue create mode 100644 src/components/Table/src/components/ColumnSetting.vue create mode 100644 src/components/Table/src/components/TableActions.vue create mode 100644 src/components/Table/src/helper/index.ts create mode 100644 src/components/Table/src/types/index.ts create mode 100644 src/components/TagsView/index.ts create mode 100644 src/components/TagsView/src/TagsView.vue create mode 100644 src/components/TagsView/src/helper.ts create mode 100644 src/components/ThemeSwitch/index.ts create mode 100644 src/components/ThemeSwitch/src/ThemeSwitch.vue create mode 100644 src/components/Tree/index.ts create mode 100644 src/components/Tree/src/Tree.vue create mode 100644 src/components/UserInfo/index.ts create mode 100644 src/components/UserInfo/src/UserInfo.vue create mode 100644 src/components/UserInfo/src/components/LockDialog.vue create mode 100644 src/components/UserInfo/src/components/LockPage.vue create mode 100644 src/components/VideoPlayer/index.ts create mode 100644 src/components/VideoPlayer/src/VideoPlayer.vue create mode 100644 src/components/VideoPlayerViewer/index.ts create mode 100644 src/components/VideoPlayerViewer/src/VideoPlayerViewer.vue create mode 100644 src/components/Waterfall/index.ts create mode 100644 src/components/Waterfall/src/Waterfall.vue create mode 100644 src/components/index.ts create mode 100644 src/constants/index.ts create mode 100644 src/directives/index.ts create mode 100644 src/directives/permission/hasPermi.ts create mode 100644 src/hooks/event/useEventBus.ts create mode 100644 src/hooks/event/useScrollTo.ts create mode 100644 src/hooks/web/useClipboard.ts create mode 100644 src/hooks/web/useConfigGlobal.ts create mode 100644 src/hooks/web/useCrudSchemas.ts create mode 100644 src/hooks/web/useDesign.ts create mode 100644 src/hooks/web/useForm.ts create mode 100644 src/hooks/web/useGuide.ts create mode 100644 src/hooks/web/useI18n.ts create mode 100644 src/hooks/web/useIcon.ts create mode 100644 src/hooks/web/useLocale.ts create mode 100644 src/hooks/web/useMonacoEditor.ts create mode 100644 src/hooks/web/useNProgress.ts create mode 100644 src/hooks/web/useNetwork.ts create mode 100644 src/hooks/web/useNow.ts create mode 100644 src/hooks/web/usePageLoading.ts create mode 100644 src/hooks/web/useSearch.ts create mode 100644 src/hooks/web/useStorage.ts create mode 100644 src/hooks/web/useTable.ts create mode 100644 src/hooks/web/useTagsView.ts create mode 100644 src/hooks/web/useTimeAgo.ts create mode 100644 src/hooks/web/useTitle.ts create mode 100644 src/hooks/web/useValidator.ts create mode 100644 src/hooks/web/useWatermark.ts create mode 100644 src/layout/Layout.vue create mode 100644 src/layout/components/AppView.vue create mode 100644 src/layout/components/ToolHeader.vue create mode 100644 src/layout/components/useRenderLayout.tsx create mode 100644 src/locales/en.ts create mode 100644 src/locales/zh-CN.ts create mode 100644 src/main.ts create mode 100644 src/permission.ts create mode 100644 src/plugins/animate.css/index.ts create mode 100644 src/plugins/echarts/index.ts create mode 100644 src/plugins/elementPlus/index.ts create mode 100644 src/plugins/svgIcon/index.ts create mode 100644 src/plugins/unocss/index.ts create mode 100644 src/plugins/vueI18n/helper.ts create mode 100644 src/plugins/vueI18n/index.ts create mode 100644 src/router/index.ts create mode 100644 src/store/index.ts create mode 100644 src/store/modules/app.ts create mode 100644 src/store/modules/locale.ts create mode 100644 src/store/modules/lock.ts create mode 100644 src/store/modules/permission.ts create mode 100644 src/store/modules/tagsView.ts create mode 100644 src/store/modules/user.ts create mode 100644 src/styles/index.less create mode 100644 src/styles/var.css create mode 100644 src/styles/variables.module.less create mode 100644 src/utils/color.ts create mode 100644 src/utils/dateUtil.ts create mode 100644 src/utils/domUtils.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/is.ts create mode 100644 src/utils/propTypes.ts create mode 100644 src/utils/routerHelper.ts create mode 100644 src/utils/tree.ts create mode 100644 src/utils/tsxHelper.ts create mode 100644 src/views/Authorization/Department/Department.vue create mode 100644 src/views/Authorization/Department/components/Detail.vue create mode 100644 src/views/Authorization/Department/components/Write.vue create mode 100644 src/views/Authorization/Menu/Menu.vue create mode 100644 src/views/Authorization/Menu/components/AddButtonPermission.vue create mode 100644 src/views/Authorization/Menu/components/Detail.vue create mode 100644 src/views/Authorization/Menu/components/Write.vue create mode 100644 src/views/Authorization/Role/Role.vue create mode 100644 src/views/Authorization/Role/components/Detail.vue create mode 100644 src/views/Authorization/Role/components/Write.vue create mode 100644 src/views/Authorization/User/User.vue create mode 100644 src/views/Authorization/User/components/Detail.vue create mode 100644 src/views/Authorization/User/components/Write.vue create mode 100644 src/views/Components/Avatars.vue create mode 100644 src/views/Components/CountTo.vue create mode 100644 src/views/Components/Descriptions.vue create mode 100644 src/views/Components/Dialog.vue create mode 100644 src/views/Components/Echart.vue create mode 100644 src/views/Components/Editor/CodeEditor.vue create mode 100644 src/views/Components/Editor/Editor.vue create mode 100644 src/views/Components/Editor/JsonEditor.vue create mode 100644 src/views/Components/Form/DefaultForm.vue create mode 100644 src/views/Components/Form/UseFormDemo.vue create mode 100644 src/views/Components/Highlight.vue create mode 100644 src/views/Components/IAgree.vue create mode 100644 src/views/Components/Icon.vue create mode 100644 src/views/Components/IconPicker.vue create mode 100644 src/views/Components/ImageCropping.vue create mode 100644 src/views/Components/ImageViewer.vue create mode 100644 src/views/Components/Infotip.vue create mode 100644 src/views/Components/InputPassword.vue create mode 100644 src/views/Components/Qrcode.vue create mode 100644 src/views/Components/Search.vue create mode 100644 src/views/Components/Table/CardTable.vue create mode 100644 src/views/Components/Table/DefaultTable.vue create mode 100644 src/views/Components/Table/TableImagePreview.vue create mode 100644 src/views/Components/Table/TableVideoPreview.vue create mode 100644 src/views/Components/Table/TreeTable.vue create mode 100644 src/views/Components/Table/UseTableDemo.vue create mode 100644 src/views/Components/Tree.vue create mode 100644 src/views/Components/VideoPlayer.vue create mode 100644 src/views/Components/Waterfall.vue create mode 100644 src/views/Dashboard/Analysis.vue create mode 100644 src/views/Dashboard/Workplace.vue create mode 100644 src/views/Dashboard/components/PanelGroup.vue create mode 100644 src/views/Dashboard/echarts-data.ts create mode 100644 src/views/Error/403.vue create mode 100644 src/views/Error/404.vue create mode 100644 src/views/Error/500.vue create mode 100644 src/views/Example/Dialog/ExampleDialog.vue create mode 100644 src/views/Example/Dialog/components/Detail.vue create mode 100644 src/views/Example/Dialog/components/Write.vue create mode 100644 src/views/Example/Page/ExampleAdd.vue create mode 100644 src/views/Example/Page/ExampleDetail.vue create mode 100644 src/views/Example/Page/ExampleEdit.vue create mode 100644 src/views/Example/Page/ExamplePage.vue create mode 100644 src/views/Example/Page/components/Detail.vue create mode 100644 src/views/Example/Page/components/Write.vue create mode 100644 src/views/Function/MultipleTabs.vue create mode 100644 src/views/Function/MultipleTabsDemo.vue create mode 100644 src/views/Function/Request.vue create mode 100644 src/views/Function/Test.vue create mode 100644 src/views/Guide/Guide.vue create mode 100644 src/views/Level/Menu111.vue create mode 100644 src/views/Level/Menu12.vue create mode 100644 src/views/Level/Menu2.vue create mode 100644 src/views/Login/Login.vue create mode 100644 src/views/Login/components/LoginForm.vue create mode 100644 src/views/Login/components/RegisterForm.vue create mode 100644 src/views/Login/components/index.ts create mode 100644 src/views/Personal/PersonalCenter/PersonalCenter.vue create mode 100644 src/views/Personal/PersonalCenter/components/EditInfo.vue create mode 100644 src/views/Personal/PersonalCenter/components/EditPassword.vue create mode 100644 src/views/Personal/PersonalCenter/components/UploadAvatar.vue create mode 100644 src/views/Redirect/Redirect.vue create mode 100644 src/views/hooks/useClipboard.vue create mode 100644 src/views/hooks/useCrudSchemas.vue create mode 100644 src/views/hooks/useNetwork.vue create mode 100644 src/views/hooks/useTagsView.vue create mode 100644 src/views/hooks/useValidator.vue create mode 100644 src/views/hooks/useWatermark.vue create mode 100644 stylelint.config.cjs create mode 100644 tsconfig.json create mode 100644 types/components.d.ts create mode 100644 types/env.d.ts create mode 100644 types/global.d.ts create mode 100644 types/router.d.ts create mode 100644 uno.config.ts create mode 100644 vite.config.ts diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..e7c12fd --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,5 @@ +Android 4.1 +IOS 7.1 +Chrome > 31 +ff > 31 +ie >= 11 \ No newline at end of file diff --git a/.env.base b/.env.base new file mode 100644 index 0000000..23fc7a4 --- /dev/null +++ b/.env.base @@ -0,0 +1,23 @@ +# 环境 +VITE_NODE_ENV=development + +# 接口前缀 +VITE_API_BASE_PATH= + +# 打包路径 +VITE_BASE_PATH=/ + +# 标题 +VITE_APP_TITLE=ElementAdmin + +# 是否全量引入element-plus样式 +VITE_USE_ALL_ELEMENT_PLUS_STYLE=true + +# 是否开启mock +VITE_USE_MOCK=true + +# 是否使用在线图标 +VITE_USE_ONLINE_ICON=true + +# 是否隐藏全局设置按钮 +VITE_HIDE_GLOBAL_SETTING=false diff --git a/.env.dev b/.env.dev new file mode 100644 index 0000000..792c9ea --- /dev/null +++ b/.env.dev @@ -0,0 +1,41 @@ +# 环境 +VITE_NODE_ENV=production + +# 接口前缀 +VITE_API_BASE_PATH= + +# 打包路径 +VITE_BASE_PATH=/dist-dev/ + +# 是否删除debugger +VITE_DROP_DEBUGGER=false + +# 是否删除console.log +VITE_DROP_CONSOLE=false + +# 是否sourcemap +VITE_SOURCEMAP=true + +# 输出路径 +VITE_OUT_DIR=dist-dev + +# 标题 +VITE_APP_TITLE=ElementAdmin + +# 是否包分析 +VITE_USE_BUNDLE_ANALYZER=false + +# 是否全量引入element-plus样式 +VITE_USE_ALL_ELEMENT_PLUS_STYLE=false + +# 是否开启mock +VITE_USE_MOCK=true + +# 是否切割css +VITE_USE_CSS_SPLIT=true + +# 是否使用在线图标 +VITE_USE_ONLINE_ICON=true + +# 是否隐藏全局设置按钮 +VITE_HIDE_GLOBAL_SETTING=false diff --git a/.env.gitee b/.env.gitee new file mode 100644 index 0000000..5536574 --- /dev/null +++ b/.env.gitee @@ -0,0 +1,41 @@ +# 环境 +VITE_NODE_ENV=production + +# 接口前缀 +VITE_API_BASE_PATH= + +# 打包路径 +VITE_BASE_PATH=/vue-element-plus-admin/ + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=true + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 输出路径 +VITE_OUT_DIR=dist-pro + +# 标题 +VITE_APP_TITLE=ElementAdmin + +# 是否包分析 +VITE_USE_BUNDLE_ANALYZER=false + +# 是否全量引入element-plus样式 +VITE_USE_ALL_ELEMENT_PLUS_STYLE=false + +# 是否开启mock +VITE_USE_MOCK=true + +# 是否切割css +VITE_USE_CSS_SPLIT=true + +# 是否使用在线图标 +VITE_USE_ONLINE_ICON=true + +# 是否隐藏全局设置按钮 +VITE_HIDE_GLOBAL_SETTING=false diff --git a/.env.pro b/.env.pro new file mode 100644 index 0000000..7db3d27 --- /dev/null +++ b/.env.pro @@ -0,0 +1,41 @@ +# 环境 +VITE_NODE_ENV=production + +# 接口前缀 +VITE_API_BASE_PATH= + +# 打包路径 +VITE_BASE_PATH=/ + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=true + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 输出路径 +VITE_OUT_DIR=dist-pro + +# 标题 +VITE_APP_TITLE=ElementAdmin + +# 是否包分析 +VITE_USE_BUNDLE_ANALYZER=true + +# 是否全量引入element-plus样式 +VITE_USE_ALL_ELEMENT_PLUS_STYLE=false + +# 是否开启mock +VITE_USE_MOCK=true + +# 是否切割css +VITE_USE_CSS_SPLIT=true + +# 是否使用在线图标 +VITE_USE_ONLINE_ICON=false + +# 是否隐藏全局设置按钮 +VITE_HIDE_GLOBAL_SETTING=false diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..e589b03 --- /dev/null +++ b/.env.test @@ -0,0 +1,41 @@ +# 环境 +VITE_NODE_ENV=production + +# 接口前缀 +VITE_API_BASE_PATH= + +# 打包路径 +VITE_BASE_PATH=/dist-test/ + +# 是否删除debugger +VITE_DROP_DEBUGGER=false + +# 是否删除console.log +VITE_DROP_CONSOLE=false + +# 是否sourcemap +VITE_SOURCEMAP=true + +# 输出路径 +VITE_OUT_DIR=dist-test + +# 标题 +VITE_APP_TITLE=ElementAdmin + +# 是否包分析 +VITE_USE_BUNDLE_ANALYZER=false + +# 是否全量引入element-plus样式 +VITE_USE_ALL_ELEMENT_PLUS_STYLE=false + +# 是否开启mock +VITE_USE_MOCK=true + +# 是否切割css +VITE_USE_CSS_SPLIT=false + +# 是否使用在线图标 +VITE_USE_ONLINE_ICON=true + +# 是否隐藏全局设置按钮 +VITE_HIDE_GLOBAL_SETTING=false diff --git a/.github/workflows/auto-merge.yml b/.github/workflows/auto-merge.yml new file mode 100644 index 0000000..f9cd3d7 --- /dev/null +++ b/.github/workflows/auto-merge.yml @@ -0,0 +1,131 @@ +name: Automerge + +on: + pull_request: + types: + - labeled + - unlabeled + - synchronize + - opened + - edited + - ready_for_review + - reopened + - unlocked + pull_request_review: + types: + - submitted + status: {} + +jobs: + # 合并发布版本的 pr 到 master + auto-merge: + runs-on: ubuntu-latest + steps: + - name: Automerge + uses: 'pascalgn/automerge-action@v0.14.3' + env: + BASE_BRANCHES: 'release' + GITHUB_TOKEN: '${{ secrets.TOKEN }}' + MERGE_LABELS: '' + MERGE_FILTER_AUTHOR: 'kailong321200875' + + push-to-gh-pages: + needs: [auto-merge] + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup Pnpm + uses: pnpm/action-setup@v2 + with: + version: latest + + - name: use Node.js 18 + uses: actions/setup-node@v2.1.2 + with: + node-version: '18.x' + + - name: Set SSH Environment + env: + DOCS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }} + run: | + mkdir -p ~/.ssh/ + echo "$ACTIONS_DEPLOY_KEY" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa + ssh-keyscan github.com > ~/.ssh/known_hosts + chmod 700 ~/.ssh && chmod 600 ~/.ssh/* + git config --local user.email "321200875@qq.com" + git config --local user.name "kailong321200875" + + # 发布到 github + - name: Build Github + run: | + pnpm install --no-frozen-lockfile + pnpm run build:pro + + - name: Deploy Github + uses: peaceiris/actions-gh-pages@v3 + with: + deploy_key: ${{secrets.ACTIONS_DEPLOY_KEY}} + publish_branch: gh-pages + publish_dir: ./dist-pro + force_orphan: true + cname: element-plus-admin.cn + + push-to-gh-pages-gitee: + needs: [auto-merge] + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup Pnpm + uses: pnpm/action-setup@v2 + with: + version: latest + + - name: use Node.js 18 + uses: actions/setup-node@v2.1.2 + with: + node-version: '18.x' + + - name: Set SSH Environment + env: + DOCS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }} + run: | + mkdir -p ~/.ssh/ + echo "$ACTIONS_DEPLOY_KEY" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa + ssh-keyscan github.com > ~/.ssh/known_hosts + chmod 700 ~/.ssh && chmod 600 ~/.ssh/* + git config --local user.email "321200875@qq.com" + git config --local user.name "kailong321200875" + + - name: Build Gitee + run: | + pnpm install --no-frozen-lockfile + pnpm run build:gitee + + # 发布到 gitee + - name: Deploy Gitee + uses: peaceiris/actions-gh-pages@v3 + with: + deploy_key: ${{secrets.ACTIONS_DEPLOY_KEY}} + publish_branch: gh-pages-gitee + publish_dir: ./dist-pro + force_orphan: true + + - name: Sync Github Repos To Gitee # 名字随便起 + uses: Yikun/hub-mirror-action@v1.1 # 使用Yikun/hub-mirror-action + with: + src: github/kailong321200875 # 源端账户名(github) + dst: gitee/kailong110120130 # 目的端账户名(gitee) + dst_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} # SSH密钥对中的私钥 + dst_token: ${{ secrets.GITEE_TOKEN }} # Gitee账户的私人令牌 + account_type: user # 账户类型 + clone_style: 'https' # 使用https方式进行clone,也可以使用ssh + debug: true # 启用后会显示所有执行命令 + force_update: true # 启用后,强制同步,即强制覆盖目的端仓库 + static_list: 'vue-element-plus-admin' # 静态同步列表,在此填写需要同步的仓库名称,可填写多个 + timeout: '600s' # git超时设置,超时后会自动重试git操作 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..2c11444 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,19 @@ +on: + push: + branches: + - release + +name: Release + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - uses: GoogleCloudPlatform/release-please-action@v3 + id: release + with: + token: ${{ secrets.TOKEN }} + default-branch: release + release-type: node + package-name: standard-version + changelog-types: '[{"type": "types", "section":"Types", "hidden": false},{"type": "revert", "section":"Reverts", "hidden": false},{"type": "feat", "section": "Features", "hidden": false},{"type": "fix", "section": "Bug Fixes", "hidden": false},{"type": "improvement", "section": "Feature Improvements", "hidden": false},{"type": "docs", "section":"Docs", "hidden": false},{"type": "style", "section":"Styling", "hidden": false},{"type": "refactor", "section":"Code Refactoring", "hidden": false},{"type": "perf", "section":"Performance Improvements", "hidden": false},{"type": "test", "section":"Tests", "hidden": false},{"type": "build", "section":"Build System", "hidden": false},{"type": "ci", "section":"CI", "hidden":false}]' diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2c274c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local +/dist* +pnpm-debug +stats.html +.idea diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 0000000..34eed8b --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1 @@ +npx --no -- commitlint --edit $1 \ No newline at end of file diff --git a/.husky/lintstagedrc.cjs b/.husky/lintstagedrc.cjs new file mode 100644 index 0000000..fd96fcb --- /dev/null +++ b/.husky/lintstagedrc.cjs @@ -0,0 +1,9 @@ +module.exports = { + '*.{js,jsx,ts,tsx}': ['eslint --fix', 'prettier --write'], + '{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': ['prettier --parser json --write'], + 'package.json': ['prettier --write'], + '*.vue': ['prettier --write', 'stylelint --fix'], + '*.{scss,less,styl,css,html}': ['stylelint --fix', 'prettier --write'], + '*.md': ['prettier --write'], + '*.hbs': ['prettier --write'] +} diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..d96ed69 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,2 @@ +npm run ts:check +npm run lint:lint-staged \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..4ff8c9d --- /dev/null +++ b/.prettierignore @@ -0,0 +1,9 @@ +/node_modules/** +/dist/ +/dist* +/public/* +/docs/* +/src/types/env.d.ts +/docs/**/* +/plop/**/* +CHANGELOG diff --git a/.stylelintignore b/.stylelintignore new file mode 100644 index 0000000..aa605b4 --- /dev/null +++ b/.stylelintignore @@ -0,0 +1,6 @@ +/dist/* +/public/* +public/* +/dist* +/src/types/env.d.ts +/docs/**/* diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..62a1b22 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["vue.volar", "lokalise.i18n-ally"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c6be8a8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,19 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib", + "prettier.enable": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + }, + "[vue]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "i18n-ally.localesPaths": ["src/locales"], + "i18n-ally.keystyle": "nested", + "i18n-ally.sortKeys": true, + "i18n-ally.namespace": false, + "i18n-ally.enabledParsers": ["ts"], + "i18n-ally.sourceLanguage": "en", + "i18n-ally.displayLanguage": "zh-CN", + "i18n-ally.enabledFrameworks": ["vue", "react"], + "god.tsconfig": "./tsconfig.json" +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9d8dadd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,1421 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [2.9.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.8.1...v2.9.0) (2024-09-07) + + +### Features + +* The dialog supports custom-defined window size. [#527](https://github.com/kailong321200875/vue-element-plus-admin/issues/527) ([e6affad](https://github.com/kailong321200875/vue-element-plus-admin/commit/e6affad67fed5e815563396e7ce6ab816ee737ce)) +* 全局默认box-sizing: border-box;降低元素布局难度。 ([a27b14e](https://github.com/kailong321200875/vue-element-plus-admin/commit/a27b14e7ffeeeae6a212f262d20303db02b017f1)) + + +### Bug Fixes + +* VideoPlayer 的实例未赋值 [#524](https://github.com/kailong321200875/vue-element-plus-admin/issues/524) ([0e99f83](https://github.com/kailong321200875/vue-element-plus-admin/commit/0e99f8374a6c4aac19da9105c9b0c1f4950f87c7)) +* 修复husky问题 ([7b8e58e](https://github.com/kailong321200875/vue-element-plus-admin/commit/7b8e58e0ec81e99517cbca41e04930f013773380)) +* 修复isUrl判断错误bug [#526](https://github.com/kailong321200875/vue-element-plus-admin/issues/526) ([3cd89bd](https://github.com/kailong321200875/vue-element-plus-admin/commit/3cd89bdd09ee45d97d1ea41a5ee7686ca56c4ff2)) +* 修复在表格中给按钮添加link属性后,字体颜色变成白色 [#490](https://github.com/kailong321200875/vue-element-plus-admin/issues/490) ([5d9ca8a](https://github.com/kailong321200875/vue-element-plus-admin/commit/5d9ca8ac629adeb3d9c5fbf908502e597da7a168)) +* 修复新增权限时 id 缺失前端判断错误问题 ([88a0440](https://github.com/kailong321200875/vue-element-plus-admin/commit/88a04404d429e0a7e258fc8974e328dcbc04ae7a)) +* 修复示例图标错误 ([a07f4e9](https://github.com/kailong321200875/vue-element-plus-admin/commit/a07f4e9925ba15b3a94ddbea1908e42c2184b4cb)) +* 修复非一级子菜单显示位置错误;修改滚动条样式和系统滚动条样式一致 ([e0596ef](https://github.com/kailong321200875/vue-element-plus-admin/commit/e0596ef9f1f3ed022396961bf2a82665bebaecf7)) +* 左侧菜单收起后,组件菜单的子菜单显示不全 ([574055c](https://github.com/kailong321200875/vue-element-plus-admin/commit/574055c2749b9a183af44a0aaacab45f898cfff2)) + + +### Docs + +* 修改readme ([367b350](https://github.com/kailong321200875/vue-element-plus-admin/commit/367b3508e8efaf4b2b8383f44c3fea0e1dd09e8e)) + + +### Performance Improvements + +* 移除scrollbar__view高度限定。 ([18b08e2](https://github.com/kailong321200875/vue-element-plus-admin/commit/18b08e2983c116228de5282cd6e0c84884b24238)) + +## [2.8.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.8.0...v2.8.1) (2024-06-20) + + +### Bug Fixes + +* [#458](https://github.com/kailong321200875/vue-element-plus-admin/issues/458) ([49451ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/49451ae606009d1f5ab0b98f84535892d3fd7646)) +* [#481](https://github.com/kailong321200875/vue-element-plus-admin/issues/481) ([c77586c](https://github.com/kailong321200875/vue-element-plus-admin/commit/c77586c5670cdc63978b032bbda694a14e875838)) +* 修复 search组件的收起展开 和重置 Bug ([9a5c7bc](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a5c7bcb5b51e76eac6bc1d3aebc287593b13ca1)) +* 修复css前缀无法应用问题([#482](https://github.com/kailong321200875/vue-element-plus-admin/issues/482)) ([4b43c87](https://github.com/kailong321200875/vue-element-plus-admin/commit/4b43c87949fe4a68b4be004a06dfff4c7f87fbd4)) +* 修复表格default-expand-all属性无效BUG ([6657bbc](https://github.com/kailong321200875/vue-element-plus-admin/commit/6657bbc9f11f22cbfb04a57f5629bc810575496e)) +* 修复表格合计报错问题 ([9c44006](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c44006ec26bee446dc5c90b6a4546cdd84ba4dc)) + + +### Styling + +* 修改登录页样式 ([9f98b7b](https://github.com/kailong321200875/vue-element-plus-admin/commit/9f98b7be266825612f93135c460d7db2d6a8beb0)) + + +### Performance Improvements + +* 优化使用离线图标后运行慢问题 ([7e9c4a6](https://github.com/kailong321200875/vue-element-plus-admin/commit/7e9c4a6109b417a577d9ac9ecf02db52eb1964af)) + +## [2.8.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.7.0...v2.8.0) (2024-06-01) + + +### Types + +* 修复Table类型错误 ([79b917a](https://github.com/kailong321200875/vue-element-plus-admin/commit/79b917af4957aa4b47db46e034385477828f5fca)) + + +### Features + +* Add a new component CodeEditor ([#466](https://github.com/kailong321200875/vue-element-plus-admin/issues/466)) ([00989b7](https://github.com/kailong321200875/vue-element-plus-admin/commit/00989b7ac9b92685be495c15c1f11dd2546eb6be)) + + +### Bug Fixes + +* [#427](https://github.com/kailong321200875/vue-element-plus-admin/issues/427) ([a00d76e](https://github.com/kailong321200875/vue-element-plus-admin/commit/a00d76e4149b430e19c985a78b9d89ce992dba3f)) +* [#428](https://github.com/kailong321200875/vue-element-plus-admin/issues/428) ([97a1cd4](https://github.com/kailong321200875/vue-element-plus-admin/commit/97a1cd41de82dad8855c95cec6bb106541fd53a7)) +* [#432](https://github.com/kailong321200875/vue-element-plus-admin/issues/432) ([df5b716](https://github.com/kailong321200875/vue-element-plus-admin/commit/df5b7166b48b7e0e77a1fb10ab6dd353d186547e)) +* [#438](https://github.com/kailong321200875/vue-element-plus-admin/issues/438) ([f977fdb](https://github.com/kailong321200875/vue-element-plus-admin/commit/f977fdb05d018ee07baeb6db454b9a77acb89f07)) +* [#451](https://github.com/kailong321200875/vue-element-plus-admin/issues/451) ([08665a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/08665a35ac606549322039d073daf8072053eef4)) +* [#465](https://github.com/kailong321200875/vue-element-plus-admin/issues/465) ([8996e01](https://github.com/kailong321200875/vue-element-plus-admin/commit/8996e01ca35bfad8c13bef321f86bdd711202e12)) +* less 变量命名与 css 关键字冲突 [#475](https://github.com/kailong321200875/vue-element-plus-admin/issues/475) ([1c56e13](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c56e13c5523a86d77464eccee26b5408db028c7)) +* 修复 lint-staged 中 prettier 以 json 格式美化代码的无效命令问题 ([7b2eae1](https://github.com/kailong321200875/vue-element-plus-admin/commit/7b2eae1d6aa813e162c3ad4a0553d2df480c765f)) +* 修复 Transfer 组件 optionApi 不生效 ([198718b](https://github.com/kailong321200875/vue-element-plus-admin/commit/198718b8749a036263d756f928b5dd38cfb47701)) +* 修复富文本编辑器初始化时, 报错 Error: Cannot find a descendant at path [0,1] in node ([a65d5fd](https://github.com/kailong321200875/vue-element-plus-admin/commit/a65d5fd20334307a56cb469361e8f9bd838510c9)) +* 修复组件-查询界面:收起和展开功能bug [#473](https://github.com/kailong321200875/vue-element-plus-admin/issues/473) ([8e58eae](https://github.com/kailong321200875/vue-element-plus-admin/commit/8e58eaeed6ea9beb749afaed75edc5a4f6d9867a)) + + +### Docs + +* 更新群二维码 ([2c89dbc](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c89dbc884c38511d40c92480f65aef46511cefb)) + + +### Performance Improvements + +* 已经是 FormData 对象的不用再次转换 ([d582ad4](https://github.com/kailong321200875/vue-element-plus-admin/commit/d582ad428f4b378014d063635c4afbbad944a71a)) + +## [2.7.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.6.0...v2.7.0) (2024-02-29) + + +### Features + +* IAgree ([abb6906](https://github.com/kailong321200875/vue-element-plus-admin/commit/abb69064dfdb979e2843e3a1b62a2510f6ed3637)) +* 头像列表 ([3bf28a5](https://github.com/kailong321200875/vue-element-plus-admin/commit/3bf28a5d4555bf2a10754474db81d70b04ee432a)) +* 新增个人中心页 ([4146716](https://github.com/kailong321200875/vue-element-plus-admin/commit/4146716655bfbe4ae5b780e5b52a6377efd914ec)) + + +### Bug Fixes + +* 修复启动慢问题 ([61d7ef6](https://github.com/kailong321200875/vue-element-plus-admin/commit/61d7ef642a027e9e1f942bc84322233be3ca9a82)) +* 修复第四种布局样式层级问题([#424](https://github.com/kailong321200875/vue-element-plus-admin/issues/424)) ([78aeb89](https://github.com/kailong321200875/vue-element-plus-admin/commit/78aeb897fc93cfb998f94578d1fbe4480426843f)) + + +### Docs + +* 更新群二维码 ([c8c1a1b](https://github.com/kailong321200875/vue-element-plus-admin/commit/c8c1a1b6357105da73e23adff968c3f2fad7d837)) + +## [2.6.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.6...v2.6.0) (2024-02-07) + + +### Features + +* add vite-plugin-url-copy ([f5ab977](https://github.com/kailong321200875/vue-element-plus-admin/commit/f5ab9776a90e0136b243601571f4619c20da3ccd)) + + +### Bug Fixes + +* Table组件中size属性的validator设置错误 ([f30e37e](https://github.com/kailong321200875/vue-element-plus-admin/commit/f30e37ee777d4f30d4ae58c4a016a1392d41c25f)) +* Table组件注册为全局组件报错问题,存在对pinia的提前引用 ([1e209a7](https://github.com/kailong321200875/vue-element-plus-admin/commit/1e209a702a5114943a615063eefd0c00f1a6a003)) +* Table组件设置 align="center" 导致横向滚动条位置错误问题 ([22f071d](https://github.com/kailong321200875/vue-element-plus-admin/commit/22f071d9268806f7abd23ab2d08e9392e377a426)) +* 修复 element-plus 2.5版本以上,el-form-item inline模式下,select宽度问题 ([f44e48d](https://github.com/kailong321200875/vue-element-plus-admin/commit/f44e48d08d3f8dd347b829166107dd62e5e18c72)) +* 修复 prettier 报错 ([f5f08f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/f5f08f8f87b063d489f55ea8f19c7c802acf15f7)) +* 修复 useCrudSchemas 详情组件数据结构文案不匹配问题 ([d94fc0a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d94fc0a701bcbc9343ab3e7b630e3db8f6d61623)) +* 修复cutMenu布局刷新样式问题 ([03580b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/03580b0ca0c8d088589ae1d8426b1535f654361b)) +* 修复Menu组件缩略菜单弹窗内样式不统一问题 ([d5dc4e3](https://github.com/kailong321200875/vue-element-plus-admin/commit/d5dc4e32d5978fcd271e841832c9cbf1e0c87db7)) +* 修复TagsView右键菜单逻辑错误 ([901c891](https://github.com/kailong321200875/vue-element-plus-admin/commit/901c891872ef6164e3517eb8e798d6039b7b7f4e)) +* 修复test打包VITE_USE_ONLINE_ICON无效问题 ([a3436a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/a3436a32c6fd746e9e2af67c3cc5a8872aabf919)) +* 修复本地化图标空白问题 ([14ff83a](https://github.com/kailong321200875/vue-element-plus-admin/commit/14ff83affcd267fbdb405d2f46e9f929a1fbfaeb)) +* 修复请求示例中,mock开启时无法取消单个请求的问题 ([d6d70a4](https://github.com/kailong321200875/vue-element-plus-admin/commit/d6d70a443cccb2fe12161b57a1f227d1ed63384a)) +* 修改兼容方式,兼容Form 组件中contentMap中类输入框或下拉选择的所有组件,特殊兼容 InputNumber 组件 ([ab98ceb](https://github.com/kailong321200875/vue-element-plus-admin/commit/ab98ceb85f52c5f7b87c2114997c63f1b80f216f)) +* 更换判断条件 ([b5cb626](https://github.com/kailong321200875/vue-element-plus-admin/commit/b5cb626bfac4df8b1a0741b5000d5b22f6cd4555)) + + +### Docs + +* 修改群二维码 ([395ff68](https://github.com/kailong321200875/vue-element-plus-admin/commit/395ff68412ff71a9b8ce670c2399da285cfed67d)) +* 更新群二维码 ([c8ccaa8](https://github.com/kailong321200875/vue-element-plus-admin/commit/c8ccaa8d49b5bf7a2784a29af6e126657ce54cda)) + + +### Styling + +* 添加TabMenu边框 ([feb3d9a](https://github.com/kailong321200875/vue-element-plus-admin/commit/feb3d9a8d07f6444c39ca89f6eb63245c06783a0)) + +## [2.5.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.5...v2.5.6) (2024-01-18) + + +### Bug Fixes + +* [#396](https://github.com/kailong321200875/vue-element-plus-admin/issues/396) ([9b2b4d4](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b2b4d42a6d5fffd5012506b7cac3892774c8595)) +* [#399](https://github.com/kailong321200875/vue-element-plus-admin/issues/399) ([59d4ed4](https://github.com/kailong321200875/vue-element-plus-admin/commit/59d4ed4dd9d6b6f0d5881b4d466e7a621770ad75)) +* 修复Form组件设置了hidden还是会出现占位空白 ([0f531fd](https://github.com/kailong321200875/vue-element-plus-admin/commit/0f531fd1d0469ddd56327b0a9a7956a0d6076c91)) +* 修复无法登录问题 ([8ce00ab](https://github.com/kailong321200875/vue-element-plus-admin/commit/8ce00ab247de4061cb56f9c2f6d3079abd39aefd)) +* 修复菜单管理回显问题 ([d9ca9ba](https://github.com/kailong321200875/vue-element-plus-admin/commit/d9ca9ba5e8111b7cc3758a8bba14f7fac45c9446)) +* 升级依赖,修复vue警告 ([eafb507](https://github.com/kailong321200875/vue-element-plus-admin/commit/eafb5075d587feac0501a1adae90a176a72c240f)) + + +### Docs + +* 更新README ([28bd10f](https://github.com/kailong321200875/vue-element-plus-admin/commit/28bd10f26373ad6e139b412e08d1e2afacc4ab92)) + + +### Styling + +* 调整样式 ([09b96c7](https://github.com/kailong321200875/vue-element-plus-admin/commit/09b96c75425cd2d931e7df4ef3f330b78bf74f9e)) + + +### Performance Improvements + +* request请求根据ContentType自动转换数据 ([ef9aa62](https://github.com/kailong321200875/vue-element-plus-admin/commit/ef9aa625724b754afc565b8b1f2589376f4d5c50)) +* 使用flex布局,优化section区域min-height的繁琐计算 ([fbb6f9a](https://github.com/kailong321200875/vue-element-plus-admin/commit/fbb6f9ad4b6d5fac9bb95d0a9250b5a318680d99)) + +## [2.5.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.4...v2.5.5) (2024-01-06) + + +### Bug Fixes + +* [#276](https://github.com/kailong321200875/vue-element-plus-admin/issues/276) ([6fbc2b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/6fbc2b0243e4aec0463a734c37591dc3de40f7db)) +* el-button组件和其他部分使用到相关变量的组件无法适配主题色变化问题 ([00cac6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/00cac6a831c2a0bb2f8a9df8b9264f1cad13ddde)) + + +### Styling + +* 菜单支持超出省略号 ([a926c56](https://github.com/kailong321200875/vue-element-plus-admin/commit/a926c5607a162145f77d35762b3d6730d67b23f6)) +* 菜单背景支持跟随暗黑模式 ([b34aeba](https://github.com/kailong321200875/vue-element-plus-admin/commit/b34aeba10a464a0f92752fc966386286443df53a)) + + +### Performance Improvements + +* 优化ImageCropping ([069777c](https://github.com/kailong321200875/vue-element-plus-admin/commit/069777c8801c51ab28c070b2ba3f10000e9c91b4)) +* 图标选择器逻辑优化 ([c2dde25](https://github.com/kailong321200875/vue-element-plus-admin/commit/c2dde252297c94036221d5d9971781182bc2998e)) +* 表格组件预览字段拆分 ([8c5858e](https://github.com/kailong321200875/vue-element-plus-admin/commit/8c5858e2c5d42db1de37d5290ea2ca784f4d4612)) + +## [2.5.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.3...v2.5.4) (2023-12-26) + + +### Types + +* 修复全局组件属性类型无法推导 ([94160c0](https://github.com/kailong321200875/vue-element-plus-admin/commit/94160c0418816e560f440e259e1f0fd4742e0143)) + + +### Bug Fixes + +* Menu菜单组件显示bug,renderMenuItem返回的数组存在undefined数据,导致省略菜单显示问题 ([1c63757](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c63757d55076d15ffdf21d647de393ca3c6b0be)) +* useClipboard在ip地址下不能使用问题 ([f3593c4](https://github.com/kailong321200875/vue-element-plus-admin/commit/f3593c453a8b8d5eb8cbd0ed5402132b027461b9)) +* 修复request请求自定义headers类型错误 ([bf2cd72](https://github.com/kailong321200875/vue-element-plus-admin/commit/bf2cd720d0e5801603848a0b1520a928443ac549)) +* 修复切换主题色缓存失败 ([1074520](https://github.com/kailong321200875/vue-element-plus-admin/commit/10745207e64d2d444636cb9d877cec9a0bebf1eb)) +* 修复非正式环境打包报错 ([3a5db42](https://github.com/kailong321200875/vue-element-plus-admin/commit/3a5db42c97f382f3fc701b8f113385b38a214583)) + + +### Styling + +* 本地化图标 ([608bf50](https://github.com/kailong321200875/vue-element-plus-admin/commit/608bf50e1cae49b7f97587395f794ae351f833f0)) +* 添加常见问题链接 ([16b9375](https://github.com/kailong321200875/vue-element-plus-admin/commit/16b93757d32c8ce2f611a62d6015072b0ecfc09a)) + + +### Code Refactoring + +* 新增列设置 ([7314065](https://github.com/kailong321200875/vue-element-plus-admin/commit/7314065c907f8ef4d184c1f3c724b67c30410ab9)) +* 重写useEventBus ([8035151](https://github.com/kailong321200875/vue-element-plus-admin/commit/80351516ced0ec2d67c30405d4a644aca8ca4bc2)) + + +### Performance Improvements + +* 优化启动速度 ([379b340](https://github.com/kailong321200875/vue-element-plus-admin/commit/379b340750eb0d4f7816f5d7c25cbd2983fd33b9)) +* 还原mock.js ([83de387](https://github.com/kailong321200875/vue-element-plus-admin/commit/83de387e2a0124804a9c99080ac841a9d6676fca)) + +## [2.5.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.2...v2.5.3) (2023-12-17) + + +### Bug Fixes + +* [#374](https://github.com/kailong321200875/vue-element-plus-admin/issues/374) ([30fb2de](https://github.com/kailong321200875/vue-element-plus-admin/commit/30fb2de6f37fe0bb00b0f364da31b07a292d59a1)) +* 修复cutMenu布局和top布局内容高度计算错误问题 ([8badd48](https://github.com/kailong321200875/vue-element-plus-admin/commit/8badd48a699aabd8fe510052d098fa6848ff5cbd)) +* 修复动态路由多开标签页404问题 ([1c5b16f](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c5b16f529d2e60a1eefcadf3f416585d1adb93b)) +* 修复类型推导错误 ([649fb17](https://github.com/kailong321200875/vue-element-plus-admin/commit/649fb17d000c0d500ffcfe1f9ab6ddd73ab7ecfa)) +* 修复项目配置清楚缓存无效 ([a09ee60](https://github.com/kailong321200875/vue-element-plus-admin/commit/a09ee60bb123f5bc4bbe6d80539145d5c4b94cb8)) + + +### Code Refactoring + +* 重构描述组件样式 ([c7658d8](https://github.com/kailong321200875/vue-element-plus-admin/commit/c7658d8c70618045a7527156444ba1d564963325)) + + +### Performance Improvements + +* 优化登录记住我流程 ([2009594](https://github.com/kailong321200875/vue-element-plus-admin/commit/2009594f089722151b739598dbad5ee7fb062b6e)) + +## [2.5.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.1...v2.5.2) (2023-12-10) + + +### Bug Fixes + +* 修复mock无法使用问题 ([319aaef](https://github.com/kailong321200875/vue-element-plus-admin/commit/319aaef7eec6287a0e80f25a479918d43c051810)) + +## [2.5.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.0...v2.5.1) (2023-12-10) + + +### Bug Fixes + +* 修复表单回车刷新页面 ([2f64836](https://github.com/kailong321200875/vue-element-plus-admin/commit/2f6483652b5d130057b4422b0f3350542b4b4b1d)) +* 表单布局方式为top时,查询组件按钮位置错位 ([ca98359](https://github.com/kailong321200875/vue-element-plus-admin/commit/ca983590da72cb13392cb8897f4045fbacbc6c8d)) + + +### Docs + +* 更新Readme ([81d2dc6](https://github.com/kailong321200875/vue-element-plus-admin/commit/81d2dc6a43df8fd5799461cdafc1b7e6054cf1e1)) + + +### Styling + +* 修改视频表格样式 ([93767b6](https://github.com/kailong321200875/vue-element-plus-admin/commit/93767b65aa7c41e28a8a79a82edd2a91d20bd176)) +* 抽离BaseButton,支持按钮修改主题色 ([69539ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/69539ee2d34ddfcb83cbfb25e218b94891196e76)) + + +### Performance Improvements + +* [#344](https://github.com/kailong321200875/vue-element-plus-admin/issues/344) ([7fa533b](https://github.com/kailong321200875/vue-element-plus-admin/commit/7fa533b8ba0d886c0009b350a3b5fe4b027a9126)) + +## [2.5.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.4.1...v2.5.0) (2023-12-03) + + +### Types + +* 删除无用类型 ([30e4214](https://github.com/kailong321200875/vue-element-plus-admin/commit/30e421438793b8283a0113ba50eb9aef90cfed4e)) + + +### Features + +* VideoPlayer ([7b5bbed](https://github.com/kailong321200875/vue-element-plus-admin/commit/7b5bbedbccf56049ff611005ba17a0f07b07034d)) +* 持久化缓存 ([893459d](https://github.com/kailong321200875/vue-element-plus-admin/commit/893459da7cf819b6b94477cd76fdfeeecacc287f)) +* 新增ImageCropping ([b0a43a7](https://github.com/kailong321200875/vue-element-plus-admin/commit/b0a43a70e6c93690ba4b0779527316f40297a45d)) +* 新增userStore ([77c962e](https://github.com/kailong321200875/vue-element-plus-admin/commit/77c962ea91de68299a01680a7941cf7a73c7e4a7)) +* 新增表格视频预览 ([cfc2d54](https://github.com/kailong321200875/vue-element-plus-admin/commit/cfc2d54586e73353295e7b73e2bf39e4e4d03c96)) +* 替换mock-server插件 ([b8f9a99](https://github.com/kailong321200875/vue-element-plus-admin/commit/b8f9a9940d5eb3f532421b1b85aeb1f3d9afb4b1)) +* 替换mockjs ([7c76d94](https://github.com/kailong321200875/vue-element-plus-admin/commit/7c76d945be8c46b427fe65c728ae0e70ab7a5e91)) +* 重新整理目录结构,mock请求 ([179ab26](https://github.com/kailong321200875/vue-element-plus-admin/commit/179ab2672fe7fff55c8a9c55fae22a4b6c362623)) + + +### Bug Fixes + +* [#367](https://github.com/kailong321200875/vue-element-plus-admin/issues/367) ([c8400ab](https://github.com/kailong321200875/vue-element-plus-admin/commit/c8400abd9f37405127890be1c9a559edf9f251f8)) + + +### Styling + +* 格式化代码 ([31ea31d](https://github.com/kailong321200875/vue-element-plus-admin/commit/31ea31dde8a149f4fc805c08e4fca4e755c36752)) +* 表单项宽度默认100% ([416de2b](https://github.com/kailong321200875/vue-element-plus-admin/commit/416de2b4d644f68d7db379c7cb1139c8a17f64d7)) + + +### Performance Improvements + +* 新增token过期示例 ([bdc8d35](https://github.com/kailong321200875/vue-element-plus-admin/commit/bdc8d358a1ca8f5fc6b43990899834791364e4f2)) + +## [2.4.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.4.0...v2.4.1) (2023-11-12) + + +### Bug Fixes + +* [#361](https://github.com/kailong321200875/vue-element-plus-admin/issues/361) ([2e7797b](https://github.com/kailong321200875/vue-element-plus-admin/commit/2e7797be68b2469d979231e6588b43d0b5bdb88b)) +* Default currentSize ([af583c7](https://github.com/kailong321200875/vue-element-plus-admin/commit/af583c71b0d1760ba4ed4cfa12458820c3f4db52)) +* 修复瀑布流示例图片无法展示 ([3477173](https://github.com/kailong321200875/vue-element-plus-admin/commit/3477173b7649eb43a1e64c91135b0e657a3c7888)) +* 修复自动格式化无效 ([bd82108](https://github.com/kailong321200875/vue-element-plus-admin/commit/bd8210858126f945bad31b3f1e0416aa178afef1)) + + +### Styling + +* 修改样式 ([92d436b](https://github.com/kailong321200875/vue-element-plus-admin/commit/92d436b8bb95c94831fcfe30678d384c3debc052)) + + +### Performance Improvements + +* 优化权限管理 ([efc1c25](https://github.com/kailong321200875/vue-element-plus-admin/commit/efc1c25db86d28438a2c324a3dc302501e1fdf8f)) +* 优化瀑布流组件 ([82eb7f1](https://github.com/kailong321200875/vue-element-plus-admin/commit/82eb7f16ad3f663be602a747b55a78f6b986da30)) + +## [2.4.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.3.0...v2.4.0) (2023-10-14) + + +### Types + +* 修改类型错误 ([4760733](https://github.com/kailong321200875/vue-element-plus-admin/commit/4760733bbe39b547285894555754bae6539190f9)) + + +### Features + +* Waterfall ([d543e56](https://github.com/kailong321200875/vue-element-plus-admin/commit/d543e56efb3b3e5800ab3ec24eda25565311eda2)) + + +### Bug Fixes + +* [#342](https://github.com/kailong321200875/vue-element-plus-admin/issues/342) ([1c51221](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c512216453b17c64a09f97263fd481816badf7c)) +* [#346](https://github.com/kailong321200875/vue-element-plus-admin/issues/346) ([d392868](https://github.com/kailong321200875/vue-element-plus-admin/commit/d392868c2799c2066ba606b0cdad95c011399559)) +* [#355](https://github.com/kailong321200875/vue-element-plus-admin/issues/355) ([03d5e13](https://github.com/kailong321200875/vue-element-plus-admin/commit/03d5e130146a662a8a312e6c49f995f85ea0f9d3)) +* **Descriptions:** Add a default value ([83b09f0](https://github.com/kailong321200875/vue-element-plus-admin/commit/83b09f09ffafb2a6273a1c5274e22f842c202c32)) +* table column 中定义 selectable 无效 ([b8e043c](https://github.com/kailong321200875/vue-element-plus-admin/commit/b8e043c09c74fe00521ac0d7390331b9f223c797)) +* Table的addColumn不能添加首列 ([240178f](https://github.com/kailong321200875/vue-element-plus-admin/commit/240178fd380402571fc056ddb9c8ae44ccb1e265)) +* 修复Waterfall列数错误BUG ([1c2befa](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c2befa4ddc76c625774100e3f5dd5a68a6faa45)) +* 去除控制台警告 ([4d14246](https://github.com/kailong321200875/vue-element-plus-admin/commit/4d14246de50d2ba9d652ec5ef038f4fd3597006a)) + + +### Styling + +* Descriptions样式调整 ([be73f4d](https://github.com/kailong321200875/vue-element-plus-admin/commit/be73f4da3e4bbbacf3f748f7ebfd70f825e0d15e)) +* formDemo集成图标选择器 ([99ffe6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/99ffe6a86ac9961ad5b9be0171b01acdfa0cf994)) +* 修改 Search 组件图标错误 ([7c93b74](https://github.com/kailong321200875/vue-element-plus-admin/commit/7c93b74e8f3e69d6c88ef2891eb6accc99a6a1e8)) + + +### Performance Improvements + +* IconPicker新增搜索功能 ([a4d1391](https://github.com/kailong321200875/vue-element-plus-admin/commit/a4d1391390bb33d498f2ec2cc64965f1a0b0aaab)) +* useClipboard ([1db2248](https://github.com/kailong321200875/vue-element-plus-admin/commit/1db22482b43f6fb7ca8321b838fb41a5b0aff62e)) +* useNetwork ([88be3ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/88be3eea10196054596945af0eb9910e998dfd42)) +* 优化请求例子 ([6b3d2e1](https://github.com/kailong321200875/vue-element-plus-admin/commit/6b3d2e14985c1a7a3c68001e17820d0e7a833a56)) +* 完善demo ([2c4ff7d](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c4ff7d190c816a92d92f9c2dbe048436b2bf964)) +* 新增请求示例 ([2762aaf](https://github.com/kailong321200875/vue-element-plus-admin/commit/2762aaf09b3616944476797a6e112c350c12a0ec)) + +## [2.3.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.2.0...v2.3.0) (2023-09-24) + + +### Features + +* IconPicker ([4490d5e](https://github.com/kailong321200875/vue-element-plus-admin/commit/4490d5eeeb4389f94f90c9c45a30343324db2250)) +* 表格工具栏新增列设置功能 ([9d10ba8](https://github.com/kailong321200875/vue-element-plus-admin/commit/9d10ba821feca414b9b020322859ca4a47291005)) + + +### Bug Fixes + +* [#326](https://github.com/kailong321200875/vue-element-plus-admin/issues/326) ([c95a4e0](https://github.com/kailong321200875/vue-element-plus-admin/commit/c95a4e0763838e843cf5ce174110a01f2baa8000)) +* default interceptor response return ([c3d8540](https://github.com/kailong321200875/vue-element-plus-admin/commit/c3d8540ab284312f24d9355072f6fb4506ed6d1d)) +* 修复IconPicker BUG ([1e3aa78](https://github.com/kailong321200875/vue-element-plus-admin/commit/1e3aa789260773b1caecdaa32e1cafede22733e3)) +* 修复useCrudSchemas无法自定义label ([aa5deb1](https://github.com/kailong321200875/vue-element-plus-admin/commit/aa5deb13904e45e7cb6ec7285e936b9ebae57273)) + + +### Docs + +* 更新README ([4947c82](https://github.com/kailong321200875/vue-element-plus-admin/commit/4947c82d6770f0dce2845682f0c41d853268cf82)) +* 更新README ([c3624ce](https://github.com/kailong321200875/vue-element-plus-admin/commit/c3624cee588457e7fedaab360746500337c1b2a7)) +* 更新群二维码 ([ead1ab8](https://github.com/kailong321200875/vue-element-plus-admin/commit/ead1ab8c88c05593d539b56a811809382675faf5)) + + +### Styling + +* 修复样式层级问题 ([f92d2b6](https://github.com/kailong321200875/vue-element-plus-admin/commit/f92d2b60a956e1963b63e23b446a9d42096704e0)) +* 修改登录样式 ([bdd31f0](https://github.com/kailong321200875/vue-element-plus-admin/commit/bdd31f0621712af89d89b87ac439c3e0b398605a)) + +## [2.2.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.1.0...v2.2.0) (2023-08-27) + + +### Features + +* JsonEditor ([c0f4517](https://github.com/kailong321200875/vue-element-plus-admin/commit/c0f4517b87de5a0172a057fb9da141f758cca1fa)) +* 新增 useCrudSchemas demo ([ae0628e](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae0628e3af3466c7c9d7b593b825f776843de5ec)) +* 新增useTagsView ([a869a45](https://github.com/kailong321200875/vue-element-plus-admin/commit/a869a457e6a8052531ce3040ae0d332d7afbb478)) + + +### Bug Fixes + +* [#316](https://github.com/kailong321200875/vue-element-plus-admin/issues/316) ([7582e4d](https://github.com/kailong321200875/vue-element-plus-admin/commit/7582e4d12f18ae86f5ef4ff36211c364afca5763)) +* [#317](https://github.com/kailong321200875/vue-element-plus-admin/issues/317) ([2095caa](https://github.com/kailong321200875/vue-element-plus-admin/commit/2095caaa854b686b57f47ee183419f42563a5a95)) +* [#318](https://github.com/kailong321200875/vue-element-plus-admin/issues/318) ([4169e52](https://github.com/kailong321200875/vue-element-plus-admin/commit/4169e52baaaa43765848c29c5ce222d019e81c35)) +* [#319](https://github.com/kailong321200875/vue-element-plus-admin/issues/319) ([b6ee4e5](https://github.com/kailong321200875/vue-element-plus-admin/commit/b6ee4e5d48deb3a07f289366ed3700baa3674cd6)) +* 修复useValidator报错 ([4912f6c](https://github.com/kailong321200875/vue-element-plus-admin/commit/4912f6c0586249b3de7ac7d365c8ea98af7923c7)) +* 修复动态路由无效 ([1452a1a](https://github.com/kailong321200875/vue-element-plus-admin/commit/1452a1afc77eb3f64cd3de91a05ddc15e40f4a06)) + + +### Docs + +* 更新README ([5b4defa](https://github.com/kailong321200875/vue-element-plus-admin/commit/5b4defa8c4be2de894b2cb50ae9ea739a10cf7d9)) +* 更新群二维码 ([13aa71c](https://github.com/kailong321200875/vue-element-plus-admin/commit/13aa71c5bd5b5076599501961a24a171a9133c57)) +* 更新群二维码 ([ae29e97](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae29e974bfed2214d1beda703b976cdfa63070ab)) + + +### Styling + +* 修改Descriptions样式 ([cd0e05a](https://github.com/kailong321200875/vue-element-plus-admin/commit/cd0e05a6b9146af7ae64be62613724cd58e6c2a3)) + + +### Code Refactoring + +* 重构useValidator ([b8849da](https://github.com/kailong321200875/vue-element-plus-admin/commit/b8849dabe2b306831f69e84db167a367570d992a)) + + +### Performance Improvements + +* 优化动态路由 ([8793588](https://github.com/kailong321200875/vue-element-plus-admin/commit/879358821d02d5e4575dfee0d189b9fee7f2e217)) +* 完善useTagsView ([e0c55f4](https://github.com/kailong321200875/vue-element-plus-admin/commit/e0c55f40d4c1c47e29de6c4c7e9433efa978bf7f)) +* 完善useTagsView ([175abd0](https://github.com/kailong321200875/vue-element-plus-admin/commit/175abd0aa3388e8473f6ecbf63e28133fce55bd3)) +* 更新demo ([2c99cd2](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c99cd20f0c25a740ac7a3a8319f7a112e69c0d3)) + +## [2.1.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.0.0...v2.1.0) (2023-08-12) + + +### Features + +* 新增多开标签页Demo ([5c253ce](https://github.com/kailong321200875/vue-element-plus-admin/commit/5c253ce803a9ef7ce03534ddd5f0865db4602378)) + + +### Bug Fixes + +* [#307](https://github.com/kailong321200875/vue-element-plus-admin/issues/307) ([4ce07e1](https://github.com/kailong321200875/vue-element-plus-admin/commit/4ce07e150c0bd3903cc5f43fcd88c2cb292d7690)) +* [#311](https://github.com/kailong321200875/vue-element-plus-admin/issues/311) ([bdde4cc](https://github.com/kailong321200875/vue-element-plus-admin/commit/bdde4ccd39d5d698d68b299c6e80546d4a8be89f)) +* 修复eslint错误 ([b5e47e0](https://github.com/kailong321200875/vue-element-plus-admin/commit/b5e47e04d8f5f889e0c46a2dced108d058ded94e)) +* 修复Table插槽传参错误 ([97344e6](https://github.com/kailong321200875/vue-element-plus-admin/commit/97344e68f5abb144d9e5d4ad273108858dbcfba2)) +* 修复Table组件插槽传参错误 ([c83a026](https://github.com/kailong321200875/vue-element-plus-admin/commit/c83a026d559e2854fead17d2e28fbebcf25490de)) + + +### Docs + +* 修改Readme ([ee059b7](https://github.com/kailong321200875/vue-element-plus-admin/commit/ee059b7619ad01ded9d3be20287086ddbcce3253)) +* 修改Readme ([e05f5a7](https://github.com/kailong321200875/vue-element-plus-admin/commit/e05f5a77edc175daa267e4fc6abbcfc8fec2e291)) +* 修改Readme ([b0e561d](https://github.com/kailong321200875/vue-element-plus-admin/commit/b0e561d8acd36e8780087e317cc34257956981fd)) +* 修改Readme ([fced2e0](https://github.com/kailong321200875/vue-element-plus-admin/commit/fced2e0087694445a89cf360e5e3e3013d8ca604)) +* 修改README ([dce76f0](https://github.com/kailong321200875/vue-element-plus-admin/commit/dce76f042d5243039540828a3fd982af25f37531)) +* 更新群二维码 ([607ef58](https://github.com/kailong321200875/vue-element-plus-admin/commit/607ef585d010c9ade6f54d96c2a12b36099ece74)) + + +### Styling + +* 修改TabMenu样式 ([e8cd6f9](https://github.com/kailong321200875/vue-element-plus-admin/commit/e8cd6f9e1c4387c582e461cde4d59796bf17c1bd)) + +## [2.0.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.10.0...v2.0.0) (2023-08-06) + + +### ⚠ BREAKING CHANGES + +* 重构完成 + +### Features + +* 重构完成 ([76e971e](https://github.com/kailong321200875/vue-element-plus-admin/commit/76e971ef96ad4f5cc7df58abd0559898ce70207d)) + + +### Code Refactoring + +* 重构完成 ([85f8cda](https://github.com/kailong321200875/vue-element-plus-admin/commit/85f8cda19d8cafb951f211b845aad970a661dd1e)) +* 重构完成 ([5d55597](https://github.com/kailong321200875/vue-element-plus-admin/commit/5d55597cca6c9d2bc6cb6211a01c161fa5f086ba)) + +## [1.10.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.9...v1.10.0) (2023-08-06) + + +### Types + +* Form类型调整 ([a0f4aeb](https://github.com/kailong321200875/vue-element-plus-admin/commit/a0f4aebc5a685366cd56b1a7bb39fa614976e3bb)) +* Form类型调整 ([674d760](https://github.com/kailong321200875/vue-element-plus-admin/commit/674d760029b451c0c6fc23a2aeac5c83992a0b27)) +* 修改类型 ([c3ac191](https://github.com/kailong321200875/vue-element-plus-admin/commit/c3ac1915045d4d59bca09ec6d19151bc5da342f1)) +* 修改类型 ([7d0476f](https://github.com/kailong321200875/vue-element-plus-admin/commit/7d0476f47c5858019db871cff2bdd19f0210f0d4)) +* 类型优化 ([283bc58](https://github.com/kailong321200875/vue-element-plus-admin/commit/283bc58d46151a8954bb81ee6bf8f499177b15fc)) +* 调整类型 ([24c8af9](https://github.com/kailong321200875/vue-element-plus-admin/commit/24c8af91835fb2c8c00e7c2673fff01f098c9944)) +* 迁移types ([ccbec86](https://github.com/kailong321200875/vue-element-plus-admin/commit/ccbec865568b1c9b3c3321d7071c164fdc350a0f)) +* 迁移types ([46b35e4](https://github.com/kailong321200875/vue-element-plus-admin/commit/46b35e48b3e7876c74159625b5149ef663396f5c)) + + +### Features + +* axios 改造 ([3238140](https://github.com/kailong321200875/vue-element-plus-admin/commit/32381408bbe418eeaca2a975305bac80ddaa03f5)) +* axios 改造 ([5807db1](https://github.com/kailong321200875/vue-element-plus-admin/commit/5807db1dc12a7ff2dbf66801a742a78974ad8f9c)) +* Descriptions组件重构 ([49e415d](https://github.com/kailong321200875/vue-element-plus-admin/commit/49e415d27788cb468c96f2a828f1df7ae65b7a3c)) +* Dialog组件重构 ([3701a04](https://github.com/kailong321200875/vue-element-plus-admin/commit/3701a04231af02ec7f7ef73533f3a22e707380fb)) +* Form useForm 完成 ([3e4e27c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3e4e27c21fd59c944229856bee929f005d2ee140)) +* Form改造 ([9c724dc](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c724dc9aad18397d5ecd00e53c3c24e142a34b5)) +* Icon改版 ([882f162](https://github.com/kailong321200875/vue-element-plus-admin/commit/882f162ff21c74239b638f284f52161e5791722d)) +* Radio改造 ([deeee73](https://github.com/kailong321200875/vue-element-plus-admin/commit/deeee73bcb3ad912844fddee62b1155d95d4b42b)) +* Radio改造 ([83513d5](https://github.com/kailong321200875/vue-element-plus-admin/commit/83513d519d4b6b8fbfd48db266b9bd7b3a998d63)) +* Search组件重构 ([a7f3702](https://github.com/kailong321200875/vue-element-plus-admin/commit/a7f370214481577ab82bf2871191dda717c7978a)) +* SelectV2改造完成 ([4d04734](https://github.com/kailong321200875/vue-element-plus-admin/commit/4d04734e13f6926c16aeee421feecb0d339534f0)) +* Table重构 ([94800b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/94800b0120ee05ca7d534dda3e59653f38d7fda0)) +* 完善search组件demo ([cdf44a4](https://github.com/kailong321200875/vue-element-plus-admin/commit/cdf44a43a05010dbcba3a3ec0cb7c8251f16fce3)) +* 拖拽表格 ([b69b8ed](https://github.com/kailong321200875/vue-element-plus-admin/commit/b69b8ed1bde36100fc86e51fcc63805d4ea21210)) +* 新增TreeSelect表单项 ([de0cb43](https://github.com/kailong321200875/vue-element-plus-admin/commit/de0cb43566b9065250abbc71548ffeca4c8e8bf1)) +* 新增Uload ([c181887](https://github.com/kailong321200875/vue-element-plus-admin/commit/c181887f7f0c5eecc9584edfe99e9065440bdc56)) +* 新增useStorage ([dfea91c](https://github.com/kailong321200875/vue-element-plus-admin/commit/dfea91c7e1d18fa299067c62557cac61723ea861)) +* 新增权限测试页 ([3fe40ba](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fe40ba62df29c2ffea9adfd65fc559489481e24)) +* 新增锁屏功能 ([e2fd349](https://github.com/kailong321200875/vue-element-plus-admin/commit/e2fd349070147c57f9400fa9a413260b7707bda2)) +* 用户列表重构 ([755cea0](https://github.com/kailong321200875/vue-element-plus-admin/commit/755cea0990d9e3b64c936f29c02e4053393a1a19)) +* 登录页改造 ([5312951](https://github.com/kailong321200875/vue-element-plus-admin/commit/5312951359b5d919b6c1a03783aa6bbaf8ec0044)) +* 综合示例重构 ([9a0259d](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a0259de5c47970502db95f4dda24998ad5d9efe)) +* 菜单管理 ([c72b3a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/c72b3a33aab7d3605770a64d23b8a84ef4ad68d2)) +* 角色管理 ([47016a5](https://github.com/kailong321200875/vue-element-plus-admin/commit/47016a535f2b7a22ab498bee197bc30a983f507d)) +* 部门管理 ([28d0785](https://github.com/kailong321200875/vue-element-plus-admin/commit/28d0785be842022cae7808c23e1f19eaab5fb996)) +* 重构Dialog组件示例 ([9a78ac9](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a78ac977eb0cfb3bd6c2a9b96e69d9f010017f4)) + + +### Bug Fixes + +* mock数据 ([8bdac71](https://github.com/kailong321200875/vue-element-plus-admin/commit/8bdac7152f463cd98c50c9893a46bb6c111fd428)) +* 修复Form已知问题 ([097b32e](https://github.com/kailong321200875/vue-element-plus-admin/commit/097b32e1a9d92a609a66179d68b3dabe12f96b66)) +* 修复Table组件已知问题 ([b1a83f6](https://github.com/kailong321200875/vue-element-plus-admin/commit/b1a83f601838cb82fb29c036654a4cdc729997cd)) +* 修复类型错误 ([26dc886](https://github.com/kailong321200875/vue-element-plus-admin/commit/26dc886f8ccb5cf1ffc10e1d9601c827a1f960c2)) +* 样式问题修复 ([cdc7c76](https://github.com/kailong321200875/vue-element-plus-admin/commit/cdc7c76eb5ac3ccb79f5f55ff5b7ce6b8c4955e1)) +* 解决类型检测报错 ([9d93496](https://github.com/kailong321200875/vue-element-plus-admin/commit/9d9349600b3d2008e4216d49c9fa1c1b9995fa79)) +* 解决类型检测报错 ([513108c](https://github.com/kailong321200875/vue-element-plus-admin/commit/513108c00e622812e2e70dfe833435f6b5462d6e)) +* 解决类型检测报错 ([28bf8be](https://github.com/kailong321200875/vue-element-plus-admin/commit/28bf8bee45e3cc8575a356623abdbe56e30991f8)) + + +### Styling + +* Table样式修改 ([5fc57bd](https://github.com/kailong321200875/vue-element-plus-admin/commit/5fc57bdb08488f6898eafd6f28289b0567d6d9e2)) +* Table样式修改 ([411c0f7](https://github.com/kailong321200875/vue-element-plus-admin/commit/411c0f792ae8359c49e81974d8193f049120985b)) +* Table样式修改 ([d487c6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d487c6a93ec0281d76a3938e6e23ea2a4a7940c1)) +* Table样式修改 ([c7d21e3](https://github.com/kailong321200875/vue-element-plus-admin/commit/c7d21e36d012377ba863ac848d77abb5db4f475a)) +* Table样式修改 ([7f5078a](https://github.com/kailong321200875/vue-element-plus-admin/commit/7f5078a436c4d5abcaf7a420df35d2be9b3680c5)) +* 修改Dialog样式 ([e451bfc](https://github.com/kailong321200875/vue-element-plus-admin/commit/e451bfcde6e5a47d4b3022e240ffcc0576ebb9a8)) +* 修改样式 ([207c5b3](https://github.com/kailong321200875/vue-element-plus-admin/commit/207c5b3fc4e52bb06baa36cd4b659e14893785ba)) +* 完善角色管理 ([c4576bd](https://github.com/kailong321200875/vue-element-plus-admin/commit/c4576bd57bcf504733f20188202ea7d33ab1c184)) +* 布局样式优化 ([962689a](https://github.com/kailong321200875/vue-element-plus-admin/commit/962689a8bd0ed5eb17d946b8a21dec4a197f13a7)) +* 样式布局调整完成 ([7193176](https://github.com/kailong321200875/vue-element-plus-admin/commit/719317694f71e22692256bb557070343f034ffe5)) +* 用户管理样式修改 ([57a5fa7](https://github.com/kailong321200875/vue-element-plus-admin/commit/57a5fa7b82ae9f3d7a1f8ec5391f14b1d1cd32e8)) +* 移除不必要样式 ([7ef1d1e](https://github.com/kailong321200875/vue-element-plus-admin/commit/7ef1d1e3013cc5bf7fc574e67c2004f50792e66d)) +* 移除不必要样式 ([366db45](https://github.com/kailong321200875/vue-element-plus-admin/commit/366db4528254d18659e6a922817702b5b92a57b0)) +* 调整Icon悬停样式 ([64c7e48](https://github.com/kailong321200875/vue-element-plus-admin/commit/64c7e48bd18ba83e605daccbc4c2f4cc6b58695d)) +* 调整工作台样式错乱 ([cc18f29](https://github.com/kailong321200875/vue-element-plus-admin/commit/cc18f297ef50655d5773d01fcfddabc365dc53e7)) + + +### Performance Improvements + +* Dialog默认高度修改 ([0e04fce](https://github.com/kailong321200875/vue-element-plus-admin/commit/0e04fce4367d6829e8de97a249318b0309e06fd5)) +* Form Table Search Descriptions 支持嵌套赋值 ([46ddf62](https://github.com/kailong321200875/vue-element-plus-admin/commit/46ddf62d2d4ce1a653f47695cb0bb3475aa16bd8)) +* ImageViewer组件优化 ([3b9c3d8](https://github.com/kailong321200875/vue-element-plus-admin/commit/3b9c3d8b757646eaf74625403112a969bfd15e55)) +* 优化Form事件传递 ([69cafb3](https://github.com/kailong321200875/vue-element-plus-admin/commit/69cafb3b7b2ce7ecbd9f2e8ef09e250817e9a55c)) +* 优化Search组件 ([e548668](https://github.com/kailong321200875/vue-element-plus-admin/commit/e548668ccef8c41d9ac7d9fe39ffe66471d160d2)) +* 优化表单组件 ([77a3866](https://github.com/kailong321200875/vue-element-plus-admin/commit/77a38662488ab9ff4cbe5ff3cf9b65eea34abca1)) +* 优化锁屏组件 ([4f8330a](https://github.com/kailong321200875/vue-element-plus-admin/commit/4f8330a4faf6cc98a9bac17bd3e1719ae1b30c81)) + +## [1.9.9](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.8...v1.9.9) (2023-04-13) + + +### Bug Fixes + +* 使用动态路由时,多级路由只有一个子路且父路由未使用alwaysShow时,子路由未添加至路由中 ([9b330a1](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b330a1f513d3af9233b9a9dde6bdfeeefbc3393)) + +## [1.9.8](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.7...v1.9.8) (2023-04-12) + + +### Bug Fixes + +* 修复已知问题 ([0a6f306](https://github.com/kailong321200875/vue-element-plus-admin/commit/0a6f306686ea024e30bcdccac34e485b8526e38f)) + +## [1.9.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.6...v1.9.7) (2023-03-28) + + +### Bug Fixes + +* 修复表格与搜索框字段不能不一致的问题 ([5c1cd29](https://github.com/kailong321200875/vue-element-plus-admin/commit/5c1cd298defefb36b858adc766b776a0a7b9bd66)) + +## [1.9.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.5...v1.9.6) (2023-03-22) + + +### Bug Fixes + +* 修改 Editor 的 z-index 使其不会遮挡『综合示例 - 新增』界面的下拉菜单 ([c046e45](https://github.com/kailong321200875/vue-element-plus-admin/commit/c046e4554ba8fd99614484d8fb636650072b833e)) + +## [1.9.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.4...v1.9.5) (2023-03-13) + + +### Bug Fixes + +* 面包屑:1.修复使用动态路由的时候,无法显示的bug ([8790c8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/8790c8cbd8d63ea0f8f276fd5af006f39b06e7d3)) + +## [1.9.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.3...v1.9.4) (2023-03-03) + + +### Bug Fixes + +* 修复已知BUG ([782b8e2](https://github.com/kailong321200875/vue-element-plus-admin/commit/782b8e2f94c867c3ee282287c37c888fff93fc55)) + +## [1.9.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.2...v1.9.3) (2023-03-01) + + +### Types + +* 修复类型错误 ([297b2c6](https://github.com/kailong321200875/vue-element-plus-admin/commit/297b2c69a239b487126c3b9316645a1b5f06bb7c)) + + +### Styling + +* 抽屉弹出样式问题 ([16a3eef](https://github.com/kailong321200875/vue-element-plus-admin/commit/16a3eef85a1ffb296bd44f67d89a911ecaf1c25e)) +* 调整主题切换样式 ([6e6beef](https://github.com/kailong321200875/vue-element-plus-admin/commit/6e6beefc3c380f7297985adcabcf966fbd2c5197)) + +## [1.9.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.1...v1.9.2) (2023-01-16) + + +### Bug Fixes + +* 修复TS类型错误 ([1c06a27](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c06a27b900a891cd0b47098062cebc984ff6505)) + +## [1.9.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.0...v1.9.1) (2023-01-11) + + +### Bug Fixes + +* dark mode toggle ([bbc7646](https://github.com/kailong321200875/vue-element-plus-admin/commit/bbc764601ec864c2fdbe3ad78c083c5ae80615e0)) + +## [1.9.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.7...v1.9.0) (2022-12-28) + + +### Features + +* 添加打包进度条 ([354e87f](https://github.com/kailong321200875/vue-element-plus-admin/commit/354e87f7c533ad8e93ef484b47d0fe16f17048c9)) + + +### Bug Fixes + +* husky ([6fe5b2e](https://github.com/kailong321200875/vue-element-plus-admin/commit/6fe5b2e6c781b251bff5f0ac936c04dcfe5ef95f)) + +## [1.8.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.6...v1.8.7) (2022-12-05) + + +### Bug Fixes + +* 解决iframe无法正常工作 ([4fcc46f](https://github.com/kailong321200875/vue-element-plus-admin/commit/4fcc46fccf747b47909e2079c4f2abc5dbfb1a0c)) + +## [1.8.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.5...v1.8.6) (2022-11-21) + + +### Bug Fixes + +* 修复Search组件无法默认值 ([3368fda](https://github.com/kailong321200875/vue-element-plus-admin/commit/3368fda251bd3ff5a8e0059b3b33f9c0339d236b)) + +## [1.8.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.4...v1.8.5) (2022-11-17) + + +### Bug Fixes + +* 修复Form赋值问题 ([f37cc1b](https://github.com/kailong321200875/vue-element-plus-admin/commit/f37cc1b5801add3ada168dbbcf4cd2c340f0e30d)) + +## [1.8.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.3...v1.8.4) (2022-11-07) + + +### Bug Fixes + +* 修复option禁用属性无效 ([0b671e9](https://github.com/kailong321200875/vue-element-plus-admin/commit/0b671e914e396c7666ad5e34768a6e29f7dfbd33)) + + +### Styling + +* input默认宽度与select对齐 ([0b671e9](https://github.com/kailong321200875/vue-element-plus-admin/commit/0b671e914e396c7666ad5e34768a6e29f7dfbd33)) + +## [1.8.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.2...v1.8.3) (2022-10-28) + + +### Performance Improvements + +* 优化描述组件 ([73ecc98](https://github.com/kailong321200875/vue-element-plus-admin/commit/73ecc98671d430013920246d98ce9ab1752e56eb)) + +## [1.8.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.1...v1.8.2) (2022-10-18) + + +### Bug Fixes + +* Correct spelling of words(aciton →action) ([eb405b2](https://github.com/kailong321200875/vue-element-plus-admin/commit/eb405b2a9041ca0ad4455db79bf617ec910dc485)) +* Correct spelling of words(tigger →trigger) ([c2ca2d7](https://github.com/kailong321200875/vue-element-plus-admin/commit/c2ca2d736c92e02380923a6741450844acb41a38)) + +## [1.8.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.0...v1.8.1) (2022-10-11) + + +### Bug Fixes + +* 修复cutMenu收起时 ([993af6b](https://github.com/kailong321200875/vue-element-plus-admin/commit/993af6bb6576249e66e0c0ea592ebf851f65ab8c)) + + +### Styling + +* cutMenu层级样式 ([32d2408](https://github.com/kailong321200875/vue-element-plus-admin/commit/32d2408588c487cff2cf73e3cc132e5105ff4459)) + +## [1.8.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.7.1...v1.8.0) (2022-10-10) + + +### Features + +* types优化 ([3351155](https://github.com/kailong321200875/vue-element-plus-admin/commit/33511553cd9055b036b2d7491f9c2eda123f8b22)) + + +### Styling + +* 优化第四种布局 ([122fa62](https://github.com/kailong321200875/vue-element-plus-admin/commit/122fa62d859413d16175e0d97c7bf13f232dbb3a)) + +## [1.7.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.7.0...v1.7.1) (2022-10-10) + + +### Bug Fixes + +* 修正types提示错误 ([ef3e006](https://github.com/kailong321200875/vue-element-plus-admin/commit/ef3e006859dcd8b93ffb7cffcaeae24cbb330f2a)) + +## [1.7.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.6...v1.7.0) (2022-10-09) + + +### Features + +* type抽离 ([8b4fa1a](https://github.com/kailong321200875/vue-element-plus-admin/commit/8b4fa1aa21aa2c1379288315ccd64a6f3375be51)) + +## [1.6.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.5...v1.6.6) (2022-10-09) + + +### Bug Fixes + +* table search params ([a62929a](https://github.com/kailong321200875/vue-element-plus-admin/commit/a62929a8dac21028d3dd1cddf98189492c33b093)) + +## [1.6.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.4...v1.6.5) (2022-10-08) + + +### Bug Fixes + +* The attribute of option does not work ([d946920](https://github.com/kailong321200875/vue-element-plus-admin/commit/d946920e61ed81beacf9f1f8be7ee1f50505f64d)) + + +### Performance Improvements + +* perf store ([d416178](https://github.com/kailong321200875/vue-element-plus-admin/commit/d416178d69ca6100be4b635922b1a22d27629f08)) +* token test ([b320e65](https://github.com/kailong321200875/vue-element-plus-admin/commit/b320e658d1a559a6eaebdf374d63649c223c2ecd)) + +## [1.6.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.3...v1.6.4) (2022-09-21) + + +### Bug Fixes + +* fix bug ([da39f3b](https://github.com/kailong321200875/vue-element-plus-admin/commit/da39f3bc904ca2d80f432a31709725f9a57deb19)) + +## [1.6.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.2...v1.6.3) (2022-08-20) + + +### Bug Fixes + +* 修复重定向错误 ([89d03fd](https://github.com/kailong321200875/vue-element-plus-admin/commit/89d03fd067e7aca565ceb84ea9276f340bbfcb60)) + + +### Styling + +* 调整样式 ([d29e151](https://github.com/kailong321200875/vue-element-plus-admin/commit/d29e151f8a660031a685f6ef9f789532b1b7b58b)) + +## [1.6.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.1...v1.6.2) (2022-08-13) + + +### Styling + +* Misspelling ([c43e833](https://github.com/kailong321200875/vue-element-plus-admin/commit/c43e833582e4f14ac78b0683f1eb3bdeb9fb4821)) +* perfect tableDemo ([c589edd](https://github.com/kailong321200875/vue-element-plus-admin/commit/c589edd960b23ad0c8b56d2c7880b61014114d45)) + + +### Code Refactoring + +* refactor axios ([0980640](https://github.com/kailong321200875/vue-element-plus-admin/commit/0980640f65fc80e3e58ba49e98db10b7b1b80077)) + +## [1.6.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.0...v1.6.1) (2022-07-30) + + +### Bug Fixes + +* fix menu active bug ([ff59fc7](https://github.com/kailong321200875/vue-element-plus-admin/commit/ff59fc7e133202945360a7e210f9cdf3a4a89dd7)) +* Pie chart data not updated ([55d4ce7](https://github.com/kailong321200875/vue-element-plus-admin/commit/55d4ce7e35ff9a0c5590bc3589160cfd304d3ae5)) + + +### Performance Improvements + +* add static router ([55522b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/55522b0661a8df3ad3c8afafcc9f8fcb162c5a00)) + + +### Styling + +* tagviews styles update ([bff7d93](https://github.com/kailong321200875/vue-element-plus-admin/commit/bff7d9370db7a9c171828721bb99643dac2f235d)) + +## [1.6.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.4...v1.6.0) (2022-07-18) + + +### Features + +* 添加按钮权限 ([7bef662](https://github.com/kailong321200875/vue-element-plus-admin/commit/7bef662db1e91aa8164e9f7a92de3fe4480a3c3b)) + + +### Performance Improvements + +* 移除md5依赖 ([a123097](https://github.com/kailong321200875/vue-element-plus-admin/commit/a123097f1f38eac45e945c7d3fdccafc16ea9b69)) + + +### Styling + +* 压缩图片尺寸 ([ae3c565](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae3c5657b604ffbdae5ce3ce3603626ad4acc5e5)) + + +### Docs + +* vite2 to vite3 ([b3918b9](https://github.com/kailong321200875/vue-element-plus-admin/commit/b3918b9c3c5de4b48811ec95967851cfb3c231e1)) +* vite2 to vite3 ([aaf07de](https://github.com/kailong321200875/vue-element-plus-admin/commit/aaf07de77aa600332880a894faa35757f787c012)) + +## [1.6.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.4...v1.6.0) (2022-07-18) + + +### Features + +* 添加按钮权限 ([7bef662](https://github.com/kailong321200875/vue-element-plus-admin/commit/7bef662db1e91aa8164e9f7a92de3fe4480a3c3b)) + + +### Performance Improvements + +* 移除md5依赖 ([a123097](https://github.com/kailong321200875/vue-element-plus-admin/commit/a123097f1f38eac45e945c7d3fdccafc16ea9b69)) + + +### Styling + +* 压缩图片尺寸 ([ae3c565](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae3c5657b604ffbdae5ce3ce3603626ad4acc5e5)) + + +### Docs + +* vite2 to vite3 ([b3918b9](https://github.com/kailong321200875/vue-element-plus-admin/commit/b3918b9c3c5de4b48811ec95967851cfb3c231e1)) +* vite2 to vite3 ([aaf07de](https://github.com/kailong321200875/vue-element-plus-admin/commit/aaf07de77aa600332880a894faa35757f787c012)) + +## [1.5.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.3...v1.5.4) (2022-07-16) + + +### Bug Fixes + +* fix build:test error ([14530cf](https://github.com/kailong321200875/vue-element-plus-admin/commit/14530cf790bfbbe37c72fa831f0376bbb4209e9d)) + +## [1.5.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.2...v1.5.3) (2022-07-01) + + +### Bug Fixes + +* fix useCrudSchemas not work ([0a855b9](https://github.com/kailong321200875/vue-element-plus-admin/commit/0a855b93e282dfe7863b3fce31dde5d7e0d3e2b6)) + +## [1.5.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.1...v1.5.2) (2022-07-01) + + +### Performance Improvements + +* add useCrudSchemas demo ([ca3ce54](https://github.com/kailong321200875/vue-element-plus-admin/commit/ca3ce54630b723d87415b14c642440d6734876ff)) + +## [1.5.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.0...v1.5.1) (2022-07-01) + + +### Bug Fixes + +* change showMainRoute to canTo ([5e292f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/5e292f8a2b2ded7297a2a76893e113ac81517d23)) + + +### Performance Improvements + +* dialog combine with form ([34aefb6](https://github.com/kailong321200875/vue-element-plus-admin/commit/34aefb64ab9237521a1225925264818eebff9ad3)) +* dynamic options demo ([1acb4d7](https://github.com/kailong321200875/vue-element-plus-admin/commit/1acb4d7e8f449ba342699f1b4387ac2404a4c1fb)) +* dynamic options demo ([9a3b617](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a3b6177aa0fbc99c86c5073a1c6c696e1eaf890)) +* useCrudSchemas cutom label ([7864d83](https://github.com/kailong321200875/vue-element-plus-admin/commit/7864d830e2134d814609e722b7bad1754ea9460e)) + +## [1.5.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.5...v1.5.0) (2022-06-25) + + +### Features + +* refactoring API ([37b7583](https://github.com/kailong321200875/vue-element-plus-admin/commit/37b75839a591648b145065432efb1dc8c7a3b917)) + + +### Bug Fixes + +* 修复axios已知问题 ([537af57](https://github.com/kailong321200875/vue-element-plus-admin/commit/537af57a0aaa24c88ebe75acf52dc0403a58b04b)) + + +### Performance Improvements + +* perf axios config ([39edd84](https://github.com/kailong321200875/vue-element-plus-admin/commit/39edd84023109a84683c21ea33e41bd024756520)) + +## [1.4.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.4...v1.4.5) (2022-06-09) + + +### Bug Fixes + +* fix tagsview not work ([d88e051](https://github.com/kailong321200875/vue-element-plus-admin/commit/d88e0514349e877f1c5280a48f9b1bd2bfd622bf)) +* fix tagsview not work ([1bf2d4c](https://github.com/kailong321200875/vue-element-plus-admin/commit/1bf2d4c77287fdca7ed1cb8c9998a53f1375dc6f)) + + +### Types + +* fix types error ([586486a](https://github.com/kailong321200875/vue-element-plus-admin/commit/586486a68d4bf2a024e50a79945b4007324f642d)) + +## [1.4.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.3...v1.4.4) (2022-06-06) + + +### Types + +* fix type error ([d66f12e](https://github.com/kailong321200875/vue-element-plus-admin/commit/d66f12e0e77f6acf485bae06509d9ea4abcd1eaa)) + +### [1.4.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.2...v1.4.3) (2022-06-01) + + +### Bug Fixes + +* multiple requests when pageSize change and currentPage isn't 1 ([f71a250](https://github.com/kailong321200875/vue-element-plus-admin/commit/f71a2503bc521c01e7102feecf4ec39a5224a6bb)) + +### [1.4.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.1...v1.4.2) (2022-05-15) + + +### Styling + +* fix dark mode bug ([2f9fd5d](https://github.com/kailong321200875/vue-element-plus-admin/commit/2f9fd5d21550d771ec12ae3540b975e2eebcd25b)) + +### [1.4.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.0...v1.4.1) (2022-05-12) + + +### Bug Fixes + +* the warning of VSCode extensions ([a368c21](https://github.com/kailong321200875/vue-element-plus-admin/commit/a368c21fb9c41f98f31f51586a2023076a8a9132)) + +## [1.4.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.3.2...v1.4.0) (2022-05-10) + + +### Features + +* add dark mode ([0758a6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/0758a6a9d83170e53d45d39c3313e52ff5885746)) + +### [1.3.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.3.1...v1.3.2) (2022-05-07) + + +### Bug Fixes + +* fix the problem that the page is stuck in top mode ([8d01f48](https://github.com/kailong321200875/vue-element-plus-admin/commit/8d01f48d5098195b10c03b3cb3a0f485ebc9e018)) + +### [1.3.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.3.0...v1.3.1) (2022-05-06) + + +### Bug Fixes + +* spelling 'useRenderChcekbox' ([ee92f03](https://github.com/kailong321200875/vue-element-plus-admin/commit/ee92f039bea4307ccfb819728d3e2ed04fa00e03)) + +## [1.3.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.13...v1.3.0) (2022-04-26) + + +### Features + +* add useCrudSchemas hook ([00d947e](https://github.com/kailong321200875/vue-element-plus-admin/commit/00d947e2f81105194b0622d33768f999e37ad28a)) + + +### Bug Fixes + +* fix Table slot warning ([0eac05d](https://github.com/kailong321200875/vue-element-plus-admin/commit/0eac05d4f973ff7b15e00973f6e96595a3cd6d43)) + + +### Code Refactoring + +* refactor useAxios ([185f1e6](https://github.com/kailong321200875/vue-element-plus-admin/commit/185f1e6e210ecaac28ebfdee4198b7ca2eaa0933)) + + +### Build System + +* add url ([ab0f59a](https://github.com/kailong321200875/vue-element-plus-admin/commit/ab0f59ac91a077cf060923fa76e6d57e05d0b21b)) +* update plugins ([c475a61](https://github.com/kailong321200875/vue-element-plus-admin/commit/c475a610c19094034306f2dc665e240c7c117f87)) +* update plugins ([dfedbc7](https://github.com/kailong321200875/vue-element-plus-admin/commit/dfedbc74fdb2c819a96b6263849bdaab59b9e337)) + +### [1.2.13](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.12...v1.2.13) (2022-04-18) + + +### Performance Improvements + +* Editor component support v-model ([d77f8e3](https://github.com/kailong321200875/vue-element-plus-admin/commit/d77f8e334d77ee43c9ee0f411733f7397b278bc0)) + +### [1.2.12](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.11...v1.2.12) (2022-04-17) + + +### Bug Fixes + +* fixed spelling 'ElememtPlusSzie' ([5dbbc60](https://github.com/kailong321200875/vue-element-plus-admin/commit/5dbbc608640d93fe68fec6f58fdb30a43e02aada)) + +### [1.2.11](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.10...v1.2.11) (2022-04-14) + + +### Bug Fixes + +* fix the error reported by the Editor component ([7dc6d8a](https://github.com/kailong321200875/vue-element-plus-admin/commit/7dc6d8a9d7289bfaf27f972e9ca1773c0a1ddd7d)) +* fix the error reported by the Editor component ([90ef985](https://github.com/kailong321200875/vue-element-plus-admin/commit/90ef9856a0885fa812339cb7047ecc98b86c7b73)) + + +### Performance Improvements + +* add tagsViewIcon setting ([d395f03](https://github.com/kailong321200875/vue-element-plus-admin/commit/d395f03a57a9265f1d39b3220fc7c9b983efee30)) +* add uniqueopened setting ([b060319](https://github.com/kailong321200875/vue-element-plus-admin/commit/b0603199a5ae0ee923483dad449f49220d36f444)) + + +### Build System + +* update plugins ([2ee4954](https://github.com/kailong321200875/vue-element-plus-admin/commit/2ee49549e7b601af26ef5204f7648d271f3348f2)) + + +### Styling + +* add layout background color ([9b614fe](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b614fe89288538197c50f164586aeed7836b7a8)) + +### [1.2.10](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.9...v1.2.10) (2022-04-12) + + +### Bug Fixes + +* fix bug ([327522f](https://github.com/kailong321200875/vue-element-plus-admin/commit/327522f2b73ae0e11f8ebbc39394b06029ce0b65)) + + +### Styling + +* modify the commitlint package manager ([ba7e722](https://github.com/kailong321200875/vue-element-plus-admin/commit/ba7e7224ab58612548519415f5429c32827a61de)) + +### [1.2.9](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.8...v1.2.9) (2022-04-12) + + +### Docs + +* update changlog ([e37273d](https://github.com/kailong321200875/vue-element-plus-admin/commit/e37273d95d29a3bb752604658d550264aacdc979)) + +### [1.2.8](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.7...v1.2.8) (2022-04-11) + +### Build System + +- update plugins ([00a573a](https://github.com/kailong321200875/vue-element-plus-admin/commit/00a573af3f455395b4ee2ab99a03f3103d466e9c)) + +### Docs + +- update changlog ([62fc183](https://github.com/kailong321200875/vue-element-plus-admin/commit/62fc1839fdff3a4d06a7db4cf3f8ce2cb9aee681)) + +### [1.2.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.6...v1.2.7) (2022-04-10) + +### Build System + +- update plugins ([f13a91d](https://github.com/kailong321200875/vue-element-plus-admin/commit/f13a91dd460b1dcdbd17aef723ab3ca2b01c34f0)) + +### Styling + +- .bhs code formatting ([57b2707](https://github.com/kailong321200875/vue-element-plus-admin/commit/57b27071e9a33423c46542a5d0e5d5c2e9a3b718)) + +### [1.2.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.5...v1.2.6) (2022-04-08) + +### Build System + +- update plugins ([d645892](https://github.com/kailong321200875/vue-element-plus-admin/commit/d645892cde2f7f43215a2ba1776ee94a322437bf)) + +### [1.2.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.4...v1.2.5) (2022-04-08) + +### Performance Improvements + +- add plop ([fa54a17](https://github.com/kailong321200875/vue-element-plus-admin/commit/fa54a1704ffd93f7b42dbeb1229bc4868d2d3a6a)) + +### Build System + +- update plugins ([18c6bd8](https://github.com/kailong321200875/vue-element-plus-admin/commit/18c6bd868622d954b51ea34e37516361ad4eb540)) + +### Styling + +- fix padding and background color ([f8c9d54](https://github.com/kailong321200875/vue-element-plus-admin/commit/f8c9d54687edafd92f5b61bf5288bb1188c73f01)) + +### [1.2.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.3...v1.2.4) (2022-04-06) + +### Bug Fixes + +- add Sticky props comment ([46133b3](https://github.com/kailong321200875/vue-element-plus-admin/commit/46133b3ff39d48d11cbcaa1f20a271118f48eb29)) +- fix bug ([179ca06](https://github.com/kailong321200875/vue-element-plus-admin/commit/179ca064ba8adbb3b063d9798ec1930ccc68e459)) +- fix remove unnecessary variables ([ca01cbf](https://github.com/kailong321200875/vue-element-plus-admin/commit/ca01cbfd98b63a0d76190fe8d43097fdc9df74e6)) +- fix style ([17c8fea](https://github.com/kailong321200875/vue-element-plus-admin/commit/17c8fea93811d9d9b708808484f5c907d761fcf1)) +- remove ContentDetailWrap style ([4ceaa9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/4ceaa9d7816369d0dcaf3e18e4cdbbd6165cef88)) + +### [1.2.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.2...v1.2.3) (2022-03-31) + +### Bug Fixes + +- fix refresh with query ([e94020f](https://github.com/kailong321200875/vue-element-plus-admin/commit/e94020ff541a061599486c0003258f1dbf13aba8)) + +### [1.2.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.1...v1.2.2) (2022-03-30) + +### Bug Fixes + +- fix avatar height bug ([cd4ab76](https://github.com/kailong321200875/vue-element-plus-admin/commit/cd4ab767018941777174d7837045f5259d1cc403)) +- fix parmas to params ([2c7211c](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c7211c89d7299ffc0a36bef8999b3c201dbaf4a)) + +### [1.2.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.0...v1.2.1) (2022-03-29) + +### Bug Fixes + +- fix invalid paging ([ad184ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/ad184ee9c0619da36f1ca3f26e67f18f88488523)) + +### Build System + +- update plugins ([0c7276f](https://github.com/kailong321200875/vue-element-plus-admin/commit/0c7276feadaedef83e6a4ad9d457e26d408698a8)) + +## [1.2.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.14...v1.2.0) (2022-03-27) + +### Features + +- add hooks demo ([c43f39e](https://github.com/kailong321200875/vue-element-plus-admin/commit/c43f39efef296266c64cc24690717d07fa0bcb85)) +- add inputPassword demo ([8f8b126](https://github.com/kailong321200875/vue-element-plus-admin/commit/8f8b1260e75df6998ebea617f62d4ab6be81d721)) + +### Docs + +- update LICENSE ([69d3dcc](https://github.com/kailong321200875/vue-element-plus-admin/commit/69d3dcc7edf69e9b4e3042ddb11faa85ec7d39e2)) + +### Styling + +- modify the function name to make it more semantic ([046ae51](https://github.com/kailong321200875/vue-element-plus-admin/commit/046ae512f02df2d3f08134949b9376a061c1eef3)) +- update Footer component presentation ([d4a9ba3](https://github.com/kailong321200875/vue-element-plus-admin/commit/d4a9ba3aa6758b8aac18b30e1a6b9501baff826c)) +- update Icon demo ([8597122](https://github.com/kailong321200875/vue-element-plus-admin/commit/85971227cd3055ea280cf493c7c42b250c1515da)) + +### Tests + +- test push first commit ([a67bb48](https://github.com/kailong321200875/vue-element-plus-admin/commit/a67bb48f269651a2dcd01b9e33d10f20c42d76ee)) + +### Build System + +- update plugins ([9c13d92](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c13d92b36a2a7c95b9edb7821367fc8f0ac6658)) +- update server port ([d2be8c1](https://github.com/kailong321200875/vue-element-plus-admin/commit/d2be8c1a307a3c5daf363bd7f1d21e574598de5c)) + +### [1.1.14](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.13...v1.1.14) (2022-03-22) + +### Bug Fixes + +- fix the bug that the form search function is invalid of the example-dialog page ([9ec30e7](https://github.com/kailong321200875/vue-element-plus-admin/commit/9ec30e719f89865497dbb1321be1df906f59f14e)) + +### [1.1.13](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.12...v1.1.13) (2022-03-17) + +### Build System + +- update plugins ([a2d0313](https://github.com/kailong321200875/vue-element-plus-admin/commit/a2d03137899f9b16fc1d4a09a23576cd74e7950e)) + +### [1.1.12](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.11...v1.1.12) (2022-03-15) + +### Build System + +- update plugins ([fee2252](https://github.com/kailong321200875/vue-element-plus-admin/commit/fee2252930b05b709d0c012e809568c4ed32bd89)) + +### [1.1.11](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.10...v1.1.11) (2022-03-15) + +### Bug Fixes + +- fix the problem of blank bar when toggle the TagsView component ([b1d9771](https://github.com/kailong321200875/vue-element-plus-admin/commit/b1d9771c750709fe45061d13299a85dbbd6ead25)) +- fix the problem that no reaction when copy setting config in http page ([61e0e33](https://github.com/kailong321200875/vue-element-plus-admin/commit/61e0e33c64d6a889fe6ed80d27a10cf8b201d21a)) + +### [1.1.10](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.9...v1.1.10) (2022-03-13) + +### Build System + +- update plugins ([0b525c8](https://github.com/kailong321200875/vue-element-plus-admin/commit/0b525c875075a28288e92243b205b337f85ab550)) + +### [1.1.9](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.8...v1.1.9) (2022-03-07) + +### Build System + +- update plugins ([1456fd4](https://github.com/kailong321200875/vue-element-plus-admin/commit/1456fd49ec9abbfe1f25aeadfe5fed54fec07394)) + +### [1.1.8](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.7...v1.1.8) (2022-03-07) + +### Docs + +- update changelog ([bf09441](https://github.com/kailong321200875/vue-element-plus-admin/commit/bf09441852e59b0d07d4949a33de75958696817f)) + +### [1.1.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.6...v1.1.7) (2022-03-06) + +### Styling + +- add labelMessage attribute to Form component ([8c42790](https://github.com/kailong321200875/vue-element-plus-admin/commit/8c427907843ccb2dfd882d27c1e8a894c5616487)) + +### [1.1.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.5...v1.1.6) (2022-03-04) + +### Bug Fixes + +- fix the problem that the tree data of Table component cannot be displayed ([bf83d3e](https://github.com/kailong321200875/vue-element-plus-admin/commit/bf83d3efbad9097f245c32cc07d1178580cec4e3)) + +### [1.1.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.4...v1.1.5) (2022-03-02) + +### Bug Fixes + +- fix the problem of tagsview error when loginout ([835d76a](https://github.com/kailong321200875/vue-element-plus-admin/commit/835d76ae87b950106f957976ebc8f6f2e8842ddf)) + +### Build System + +- update plugins ([de34bb1](https://github.com/kailong321200875/vue-element-plus-admin/commit/de34bb193d6c844dbc1cec38db5f61b3f95e19f2)) + +### Styling + +- fix tabMenu z-index bug ([8b3be02](https://github.com/kailong321200875/vue-element-plus-admin/commit/8b3be02368a1bddb7dc78f18adbea7f4ebfe75d6)) +- fix tags-view style bug ([ebff817](https://github.com/kailong321200875/vue-element-plus-admin/commit/ebff81777b9c0b839256b83e321ecbdbff25fc73)) + +### [1.1.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.3...v1.1.4) (2022-03-01) + +### CI + +- update workflow ([0490d18](https://github.com/kailong321200875/vue-element-plus-admin/commit/0490d18145cb0d9c4b066ab01a2c10cb527e38ba)) +- update workflow ([51f7bca](https://github.com/kailong321200875/vue-element-plus-admin/commit/51f7bca6034902b251d081ee383b0d796782d434)) + +### [1.1.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.2...v1.1.3) (2022-03-01) + +### CI + +- update workflow ([91cc5c5](https://github.com/kailong321200875/vue-element-plus-admin/commit/91cc5c595cadc5695d8f54bdc4922d8f04439f24)) + +### [1.1.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.1...v1.1.2) (2022-03-01) + +### Workflows + +- update workflow ([d9708aa](https://github.com/kailong321200875/vue-element-plus-admin/commit/d9708aae5bc0cb795bb0fbf8d17df753cc88ba1d)) + +### [1.1.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.0...v1.1.1) (2022-03-01) + +### Workflows + +- update workflow ([085328a](https://github.com/kailong321200875/vue-element-plus-admin/commit/085328aba8c4f356bf7915a6bbdc1ec4f46ceeda)) + +## [1.1.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.0.3...v1.1.0) (2022-03-01) + +### Features + +- 🎸 layout 三种布局重构完成 ([429e428](https://github.com/kailong321200875/vue-element-plus-admin/commit/429e42809cef33a33662e41ad50297217d128b8c)) +- 🎸 layout 布局重构 �[bd24b92](https://github.com/kailong321200875/vue-element-plus-admin/commit/bd24b92acb279343dbaf83b74f1ed2a3f57f1003)) +- 🎸 Table 组件重构完成并给出相应示 �[35879f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/35879f8ecc0ffa76122a336e2eaa93ecfb408c1d)) +- 🎸 v0.0.4 发布 ([a58dc1b](https://github.com/kailong321200875/vue-element-plus-admin/commit/a58dc1b1c2774974782ef6d116b8805975b82b1c)) +- 🎸 初始化项 �[26d4c7c](https://github.com/kailong321200875/vue-element-plus-admin/commit/26d4c7c56894cf2031b3a7cce08d53c37f4a49e3)) +- 🎸 初版完成 ([5bfe4d2](https://github.com/kailong321200875/vue-element-plus-admin/commit/5bfe4d236fd9c2841da100f34c980b4572b67b20)) +- 🎸 新增 Detail 详情组件并给出相应示 �[e77a931](https://github.com/kailong321200875/vue-element-plus-admin/commit/e77a931ef2d2967a9717e27b187d68512c01284f)) +- 🎸 新增二维码组 �[85555ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/85555eef7dc7d72cb701bdd81044ba8fb8e72acc)) +- 🎸 新增全局配置 ([f8405a6](https://github.com/kailong321200875/vue-element-plus-admin/commit/f8405a63c9b1288fbe95bae235b65a08e8fae8d2)) +- 🎸 新增固定 � 级菜单配 �[4c4903e](https://github.com/kailong321200875/vue-element-plus-admin/commit/4c4903e806c8818e320108cc3e5279d728061c29)) +- 🎸 新增权限管理及相关示例文 �[32b6583](https://github.com/kailong321200875/vue-element-plus-admin/commit/32b6583099646b2ee622ac7b35388468769b91b8)) +- 🎸 显示更多组建 � 发中 ([fa9f24d](https://github.com/kailong321200875/vue-element-plus-admin/commit/fa9f24d5da8d2e40d7c3661eabacb8f0474a7bf2)) +- 🎸 权限管理 � 发中 ([38f5211](https://github.com/kailong321200875/vue-element-plus-admin/commit/38f521174ba9eba750fee4516141d7a267f1c4ce)) +- 🎸 权限管理 � 发中 ([6d7ea66](https://github.com/kailong321200875/vue-element-plus-admin/commit/6d7ea6694d8299332018a6689bcd82502a9a552c)) +- 🎸 综合实例重构 �[5142e6e](https://github.com/kailong321200875/vue-element-plus-admin/commit/5142e6e323cb20c89a97398bf41d32c93ce42cad)) +- 🎸 重构 layout ([7ede021](https://github.com/kailong321200875/vue-element-plus-admin/commit/7ede02141e258ab4c88e9b4daad966513d4dbe68)) +- 🎸 重构 layout-classic 布局 ([29d9c98](https://github.com/kailong321200875/vue-element-plus-admin/commit/29d9c988605b822195900268da6bc3f3b0b9c770)) +- 🎸 重构 sider 组件 �[51313d7](https://github.com/kailong321200875/vue-element-plus-admin/commit/51313d7116c7ab2ded7e3a65514ea9ac413edecd)) +- Add analysis api ([83327ea](https://github.com/kailong321200875/vue-element-plus-admin/commit/83327ea763ebb233bb540513276ffa288fbcb4a1)) +- Add analysis demo ([cd06934](https://github.com/kailong321200875/vue-element-plus-admin/commit/cd069340fc5157535fdc82e792c6b6dce7d7a97e)) +- Add count-to demo ([d3fbd3a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d3fbd3a06c3b802fc863b4dc8013122c14bd16f2)) +- Add Descriptions component and add Descriptions demo ([7ad46f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/7ad46f828d626a87699cd4d3a959a5634577d580)) +- Add Dialog component and add dailog demo ([a18ad8f](https://github.com/kailong321200875/vue-element-plus-admin/commit/a18ad8f4a89b78c73e57d8d2543494243f656d05)) +- add doucment link ([53201ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/53201ae97a425714871d99e8847a3672ba0d389f)) +- Add dynamic route ([9d926b2](https://github.com/kailong321200875/vue-element-plus-admin/commit/9d926b2760b75e1d8e71a68dc7ff6c5026223a43)) +- Add Editor component and add editor demo ([3fb3e8d](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fb3e8da39d816bcf4aedb65d40c7052bdb6d8bf)) +- Add Error component ([7411dbc](https://github.com/kailong321200875/vue-element-plus-admin/commit/7411dbc9fd8f122187c86a11523b49c88cc71a8c)) +- Add example-dialog demo ([262f421](https://github.com/kailong321200875/vue-element-plus-admin/commit/262f4211cf53aef30a32f4b88e88fb1b9246ffcb)) +- Add example-page demo ([1492f91](https://github.com/kailong321200875/vue-element-plus-admin/commit/1492f9119aa2960cc05956218e6d151c8b316875)) +- Add form demo ([472f574](https://github.com/kailong321200875/vue-element-plus-admin/commit/472f574f42f8f31c4e6047043ac755ba5fb35b7b)) +- Add form demo ([e6f9580](https://github.com/kailong321200875/vue-element-plus-admin/commit/e6f95803316bb5df2d1060285c1d591a79340721)) +- Add form demo ([543156f](https://github.com/kailong321200875/vue-element-plus-admin/commit/543156f328350bd12e71a41c872e547e41cda7fe)) +- Add form demo ([7795d2a](https://github.com/kailong321200875/vue-element-plus-admin/commit/7795d2a4fe3dbc9849ddc7c1d3e2d9215dc66f56)) +- Add guide demo ([0832194](https://github.com/kailong321200875/vue-element-plus-admin/commit/0832194e6131051416edff7c2eac6b0a016ffd80)) +- Add highlight demo ([eb206b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/eb206b0cc31ac7da3dfd8b3d4b874061c5c91d53)) +- Add Icon demo ([e4b7a76](https://github.com/kailong321200875/vue-element-plus-admin/commit/e4b7a769126d6f0fca424007c294ff229eefcb35)) +- Add ImageViewer component and add ImageViewer demo ([af9fc0a](https://github.com/kailong321200875/vue-element-plus-admin/commit/af9fc0a4aded3ec08746ddeaeabac4c3cfa9463d)) +- Add Infotip component ([e4b7a76](https://github.com/kailong321200875/vue-element-plus-admin/commit/e4b7a769126d6f0fca424007c294ff229eefcb35)) +- Add infotip demo ([dbf3b0f](https://github.com/kailong321200875/vue-element-plus-admin/commit/dbf3b0f5a333ccef524bbac825035b0c6dc78ec9)) +- Add Qrcode component and add qrcode demo ([535a31b](https://github.com/kailong321200875/vue-element-plus-admin/commit/535a31b35eb6a76589f602fd96dcf91f46f349b0)) +- Add Search component and add search demo ([33eca8a](https://github.com/kailong321200875/vue-element-plus-admin/commit/33eca8a97d59f5cc453e1a60ee81b1519527d0f1)) +- Add Table component and add useTable hook ([17e8e7c](https://github.com/kailong321200875/vue-element-plus-admin/commit/17e8e7cda9a009818f11cfa0429ce0f9adc00be5)) +- Add useScrollTo hook ([7d7fd9e](https://github.com/kailong321200875/vue-element-plus-admin/commit/7d7fd9ed646d2b68cec0547ad8e65b0404bb95bb)) +- Add useWatermark hook and add useWatermark demo ([d3fbd3a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d3fbd3a06c3b802fc863b4dc8013122c14bd16f2)) +- Add workplace api ([cb558f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/cb558f8af9dfef2ba2879f021db395ee79e8c8d4)) +- **Animate:** Add animate.css ([1436543](https://github.com/kailong321200875/vue-element-plus-admin/commit/1436543a5c599f651ed7805165ea83b9ebcddef5)) +- **Breadcrumbe:** Add Breadcrumb component ([4612e55](https://github.com/kailong321200875/vue-element-plus-admin/commit/4612e5544bcd626d686972e5cb874d0aa4af08b3)) +- **component:** Add CountTo component and Echart component ([e20fa76](https://github.com/kailong321200875/vue-element-plus-admin/commit/e20fa76cad0894a69fd04c81c2108faabf392684)) +- **component:** Add Footer component ([dad7330](https://github.com/kailong321200875/vue-element-plus-admin/commit/dad733063413c79eca61c6cb5ff671b35933a85f)) +- **component:** Add Footer component ([f81e996](https://github.com/kailong321200875/vue-element-plus-admin/commit/f81e996a426538aeaa2aa37a540395dcf360a09c)) +- **Component:** Add Highlight component ([c53fa56](https://github.com/kailong321200875/vue-element-plus-admin/commit/c53fa562e540447df082e35c7f26e56f2426e430)) +- **component:** Add namespace of class ([d847ccb](https://github.com/kailong321200875/vue-element-plus-admin/commit/d847ccb098edc72fe55c1f8459bf149453a3b73d)) +- **Component:** Setting component add copy button ([e496096](https://github.com/kailong321200875/vue-element-plus-admin/commit/e496096539e6a56b0761a625c9d59210facc5432)) +- **ContextMenu:** Add ContextMenu component ([349ac9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/349ac9d3989d77e5246cecf0006dd8d83c489990)) +- Detail 组件重构完成 ([7f5ef99](https://github.com/kailong321200875/vue-element-plus-admin/commit/7f5ef99ccc32b03f7be21f70c333bb8e679c7d93)) +- Highlight 组件重构 ([34221f3](https://github.com/kailong321200875/vue-element-plus-admin/commit/34221f387f5e15a08cdc21edd76ce8d8c5c20fbc)) +- **hooks:** Add useIntro hook ([0832194](https://github.com/kailong321200875/vue-element-plus-admin/commit/0832194e6131051416edff7c2eac6b0a016ffd80)) +- **hooks:** Add useTimeAgo hook ([c53fa56](https://github.com/kailong321200875/vue-element-plus-admin/commit/c53fa562e540447df082e35c7f26e56f2426e430)) +- **I18n:** Add Ii8n ([3810b8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3810b8c3b26f86c27aa7db479dfb7b0d283d970f)) +- **Layout:** Add classic layout ([839b601](https://github.com/kailong321200875/vue-element-plus-admin/commit/839b6015b8e31bf70e6f0bf0608fa729b028729b)) +- **Layout:** Add cutMenu layout ([ff4dd3a](https://github.com/kailong321200875/vue-element-plus-admin/commit/ff4dd3afbf5c0c7a439c71b0c494b81e0f2c70d4)) +- **Layout:** Add topLeft layout ([71b1c5e](https://github.com/kailong321200875/vue-element-plus-admin/commit/71b1c5e10cade8d1c018d0c5f63c98ba9357bab8)) +- **LocaleDropdown:** Add LocaleDropdown Component ([3810b8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3810b8c3b26f86c27aa7db479dfb7b0d283d970f)) +- **Logo:** Add Logo component ([958edef](https://github.com/kailong321200875/vue-element-plus-admin/commit/958edefe7bc2bf3ae77520a5d885a9d47e8a37b9)) +- **mock:** Add mock ([3fc7d4d](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fc7d4d39a72056fcf419fe19a9d41d90f945bad)) +- **router:** Add dynamic routing ([b218ccc](https://github.com/kailong321200875/vue-element-plus-admin/commit/b218ccc9cce2ce1363c4a21d22b4d69c43c7b2dc)) +- Search component add expand attribute and expandField attribute ([9b4b317](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b4b31781765d31dec50acc40e2eed91401502d4)) +- **store:** Add localeStore ([3810b8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3810b8c3b26f86c27aa7db479dfb7b0d283d970f)) +- **store:** Add tagsView store ([349ac9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/349ac9d3989d77e5246cecf0006dd8d83c489990)) +- Table 组件重构 ([07adefb](https://github.com/kailong321200875/vue-element-plus-admin/commit/07adefb89b7555280e6217e09cf81ba7aa5b93c2)) +- **TagsView:** Add TagsView component ([349ac9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/349ac9d3989d77e5246cecf0006dd8d83c489990)) +- **useForm:** Add useForm ([357fc44](https://github.com/kailong321200875/vue-element-plus-admin/commit/357fc44e519c5829567c17f611fcaadee3f9f933)) +- **useNProgress:** Add useNProgress ([c5ab359](https://github.com/kailong321200875/vue-element-plus-admin/commit/c5ab3599c8ea001ff7831b72fefc9e274163fbbb)) +- **useTitle:** Add useTitle ([c5ab359](https://github.com/kailong321200875/vue-element-plus-admin/commit/c5ab3599c8ea001ff7831b72fefc9e274163fbbb)) +- **utils:** Add color utils ([71dfba2](https://github.com/kailong321200875/vue-element-plus-admin/commit/71dfba21c5bc0276689b5aecf0d75e53efdda09f)) +- **VForm:** Add VForm component ([448ac52](https://github.com/kailong321200875/vue-element-plus-admin/commit/448ac5293e48a03840df2bb0b399a8f02aae666e)) +- **VInputPassword:** Add VInputPassword Component ([a1bf7e9](https://github.com/kailong321200875/vue-element-plus-admin/commit/a1bf7e9b552f75d3b87c64904ac9e7c99fc936a5)) +- **Workplace:** Add wrokplace demo ([c53fa56](https://github.com/kailong321200875/vue-element-plus-admin/commit/c53fa562e540447df082e35c7f26e56f2426e430)) +- 综合实例、权限管理重 �[a4bd206](https://github.com/kailong321200875/vue-element-plus-admin/commit/a4bd2068a5d40d146b5b45cb3727ced990147b68)) +- 部分组件重构完成 ([3d96229](https://github.com/kailong321200875/vue-element-plus-admin/commit/3d9622978dc234ef12dbce63e18caf3440563aa0)) + +### Bug Fixes + +- 🐛 删除 Editor 双向绑定,改 �props 传参 ([c395e27](https://github.com/kailong321200875/vue-element-plus-admin/commit/c395e27f67af9f60b151a5484ab5a3c90c4c1d1e)) +- fix Form component setProps not work bug ([48ffc52](https://github.com/kailong321200875/vue-element-plus-admin/commit/48ffc52ca8fa26d8e6a5fa4b8b3001701a1f0732)) +- fix useScrollTo not work bug ([53201ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/53201ae97a425714871d99e8847a3672ba0d389f)) +- 修复 tagsView 无动画效 �[0e3eb4b](https://github.com/kailong321200875/vue-element-plus-admin/commit/0e3eb4ba8b1503e1d221dfda59a3a0001dbdcb56)) + +### Performance Improvements + +- update useForm hook ([8a958cd](https://github.com/kailong321200875/vue-element-plus-admin/commit/8a958cd71d9afbd32b243aac0814bfa3281477cd)) + +### Code Refactoring + +- 💡 综合实例查看详情重构 ([9c26edd](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c26edd5d599b5fb5a832fb547e3d95b6bfa9a98)) + +### Build System + +- Add conventional-changelog-cli plugin ([384485f](https://github.com/kailong321200875/vue-element-plus-admin/commit/384485f6994c6ac33abee506508ab9d35fe658a9)) +- Add conventional-github-releaser plugin ([3cd5c71](https://github.com/kailong321200875/vue-element-plus-admin/commit/3cd5c71899dde3ac3910aef0180d8b39fad51f1b)) +- Add standard-version plugin ([110ce25](https://github.com/kailong321200875/vue-element-plus-admin/commit/110ce257841648e29b247a0338624a188694b6e9)) +- Add vite-plugin-html plugin ([d5b6e2a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d5b6e2a7770eb59aa32839f69da5be37397e3538)) +- delete useless plugin ([c756761](https://github.com/kailong321200875/vue-element-plus-admin/commit/c756761dfc3200156acb228474d3539197ef413b)) +- **pinia:** Add pinia ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf)) +- **types:** Add vue-types ([2c41826](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c41826c572268b74a663a6966c548628ac7e280)) +- **unplugin-auto-import:** Delete unplugin-auto-import ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf)) +- **unplugin-vue-components:** Delete unplugin-vue-components ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf)) +- update plugin ([8d08bc6](https://github.com/kailong321200875/vue-element-plus-admin/commit/8d08bc6fc92258674abdd12834eaa4530ec276dd)) +- update plugins ([3c58042](https://github.com/kailong321200875/vue-element-plus-admin/commit/3c580420a20121845f02c0dd3caca5a74f06a89d)) +- **vite-plugin-style-import:** Add vite-plugin-style-import ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf)) +- **vite-plugin-vue-setup-extend:** Delete vite-plugin-vue-setup-extend ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf)) +- 修改 vite 配置 ([9991fb4](https://github.com/kailong321200875/vue-element-plus-admin/commit/9991fb4e5c46b9e4016beaade7232e28dc272797)) +- 设置多语 �([45e879e](https://github.com/kailong321200875/vue-element-plus-admin/commit/45e879edeef677b6aa1d2cfe4dd8dc5b76c83c59)) +- 配置代码格式 �[ffdb556](https://github.com/kailong321200875/vue-element-plus-admin/commit/ffdb556a096db247306eae8eecc1b85718314cdd)) +- 集成基础配置 ([ced99de](https://github.com/kailong321200875/vue-element-plus-admin/commit/ced99de9b113a01d9d0b190f6d2c6adc983a3102)) +- 集成基础配置 ([5dbcf23](https://github.com/kailong321200875/vue-element-plus-admin/commit/5dbcf2397ccdec80c695c113f49e8aa9bb6d012c)) + +### Styling + +- 💄 优化 layout 样式 ([37ec378](https://github.com/kailong321200875/vue-element-plus-admin/commit/37ec378f0b2bf83d73ddf0e472aada6aab248f09)) +- 💄 微调样式 ([612b486](https://github.com/kailong321200875/vue-element-plus-admin/commit/612b48673c3389779ccfdd161e2ca80b21d265b2)) +- Add elNamespace ([d847ccb](https://github.com/kailong321200875/vue-element-plus-admin/commit/d847ccb098edc72fe55c1f8459bf149453a3b73d)) +- **appStore:** code style ([641ed68](https://github.com/kailong321200875/vue-element-plus-admin/commit/641ed684fefeb52e2f91e8baab7b610fc74c8d88)) +- **Breadcrumb:** fix Breadcrumb style bug ([8755c86](https://github.com/kailong321200875/vue-element-plus-admin/commit/8755c862b837d90a25b27c01fabe64abf81fc4a2)) +- **breadcrumb:** update disabled text color ([1522e92](https://github.com/kailong321200875/vue-element-plus-admin/commit/1522e925bae37cb9df4de2252d81f717788f4537)) +- change function to arrow function ([4612e55](https://github.com/kailong321200875/vue-element-plus-admin/commit/4612e5544bcd626d686972e5cb874d0aa4af08b3)) +- delete console.log ([49a6bfe](https://github.com/kailong321200875/vue-element-plus-admin/commit/49a6bfe9d81a40e2f5f15b68d7289e1787e89b54)) +- **Icon:** delete default color ([95a2bd8](https://github.com/kailong321200875/vue-element-plus-admin/commit/95a2bd884dd9846a56cda7c4c3ee4a41ce631b7c)) +- level demo style beautification ([dbf3b0f](https://github.com/kailong321200875/vue-element-plus-admin/commit/dbf3b0f5a333ccef524bbac825035b0c6dc78ec9)) +- lint code style ([b292419](https://github.com/kailong321200875/vue-element-plus-admin/commit/b2924190b8996e8208f951e3fadbcb09baddb8df)) +- **Login:** update login styles ([eb68f1d](https://github.com/kailong321200875/vue-element-plus-admin/commit/eb68f1d919e13c07b7d200e9aec53804b2a6dc7b)) +- modify menu z-index attribute ([0d7a778](https://github.com/kailong321200875/vue-element-plus-admin/commit/0d7a7781ce0b5e39f01355d3acdb3f364cabf76d)) +- **TagView:** Vertical center tag ([41281c4](https://github.com/kailong321200875/vue-element-plus-admin/commit/41281c4d541a2744e5df5dff2764cc85465b6a4c)) + +### Types + +- add ImportMetaEnv ([38e0257](https://github.com/kailong321200875/vue-element-plus-admin/commit/38e0257487e4138a74ad1bb4ee4ba004abcfaa12)) +- Adding BfFrom Component types ([8e036f5](https://github.com/kailong321200875/vue-element-plus-admin/commit/8e036f54b56ce8521eb8ec4b7ca21aa9c24f43f2)) +- **BfForm:** Adding BfForm types ([bc9195b](https://github.com/kailong321200875/vue-element-plus-admin/commit/bc9195b21eeb79629a82a04d90e2ac5aa6592928)) +- **BfForm:** Adding BfForm types ([184b468](https://github.com/kailong321200875/vue-element-plus-admin/commit/184b468cd41dcd1cdae11477b9ee2d6e17de1481)) +- **BfForm:** Adding BfForm types ([58cb24d](https://github.com/kailong321200875/vue-element-plus-admin/commit/58cb24d9f8a50be80b5ea793387d582a77a59137)) +- delete useless types ([3fc79c0](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fc79c0ae7acd0929f47e33f96c8d45a90d8f762)) +- **VForm:** Adding VForm types ([7528fe6](https://github.com/kailong321200875/vue-element-plus-admin/commit/7528fe6da60368213d28d9f1b6310d02d3d53282)) + +### Docs + +- ✏️ 修改 readme ([8edb2a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/8edb2a3493dca975036859b5d2c52afaa91f5dbb)) +- ✏️ 更新 readme ([62eeb55](https://github.com/kailong321200875/vue-element-plus-admin/commit/62eeb55330dd4af2a46801c7a19f38a3ef312bbf)) +- Add README.md ([21dcf88](https://github.com/kailong321200875/vue-element-plus-admin/commit/21dcf88ba31957bbdb50c6207d010650daab70fc)) +- Error modifying readme name ([25d5c84](https://github.com/kailong321200875/vue-element-plus-admin/commit/25d5c84e92e68aa72362a14f55aacd946fa5b1b2)) +- update description ([be6ff98](https://github.com/kailong321200875/vue-element-plus-admin/commit/be6ff9899b25cc00519210950d27ee56ac5112e6)) +- update description ([c15aa87](https://github.com/kailong321200875/vue-element-plus-admin/commit/c15aa8755c9c937512c7380a6d03c4d877ef4d87)) +- update README ([27979dc](https://github.com/kailong321200875/vue-element-plus-admin/commit/27979dc6def7d9d8cea62a08d49a6c828be2258b)) +- update README.md ([53201ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/53201ae97a425714871d99e8847a3672ba0d389f)) +- update README.md ([c11823a](https://github.com/kailong321200875/vue-element-plus-admin/commit/c11823abd8a033e14b4c20d17ac941195d39bcfe)) +- 修改 README ([b79a567](https://github.com/kailong321200875/vue-element-plus-admin/commit/b79a56753df55976e749c4494266df052d315416)) diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 0000000..106259c --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,13 @@ +FROM node:18.0.0 + +WORKDIR /app + +RUN npm install -g pnpm@8.1.0 + +COPY package.json . + +RUN pnpm install + +COPY . . + +CMD [ "pnpm", "run", "dev" ] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9861118 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-present Archer + +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/README.md b/README.md new file mode 100644 index 0000000..ab94ab3 --- /dev/null +++ b/README.md @@ -0,0 +1,148 @@ +


+ +[![license](https://img.shields.io/github/license/kailong321200875/vue-element-plus-admin.svg)](LICENSE) [![repo-size](https://img.shields.io/github/repo-size/kailong321200875/vue-element-plus-admin.svg)](repo-size) [![last-commit](https://img.shields.io/github/last-commit/kailong321200875/vue-element-plus-admin.svg)](last-commit) [![stars](https://img.shields.io/github/stars/kailong321200875/vue-element-plus-admin.svg)](stars) [![forks](https://img.shields.io/github/forks/kailong321200875/vue-element-plus-admin.svg)](forks) [![release](https://img.shields.io/github/release/kailong321200875/vue-element-plus-admin.svg)](release) [![watchers](https://img.shields.io/github/watchers/kailong321200875/vue-element-plus-admin.svg)](watchers) + +

vue-element-plus-admin

+
+ +**English** | [中文](./README.zh-CN.md) + +## Introduction + +vue-element-plus-admin is a free and open source middle and background template based on `element-plus`. Developed using the latest mainstream technologies such as `vue3`, `vite` and `typescript`, the out of the box middle and background front-end solution can be used as the starting template of the project and learning reference. And always pay attention to the latest technological trends and update them as soon as possible. + +vue-element-plus-admin is positioned as a background integration scheme, which is not suitable for secondary development as a basic template. Because it integrates many functions that you may not use, it will cause a lot of code redundancy. If your project doesn't pay attention to this problem, you can also directly carry out secondary development based on it. + +If you need a basic template, please switch to the `mini` branch. `mini` simply integrates some common layout functions such as layout and dynamic menu, which is more suitable for developers to carry out secondary development. + +## Feature + +- **State of The Art Development**:Use front-end front-end technology development such as Vue3/vite4 +- **TypeScript**: Application-level JavaScript language +- **Theming**: Configurable themes +- **International**:Built-in complete internationalization program +- **Mock Server** Built-in mock data scheme +- **Authority** Built-in complete dynamic routing permission generation scheme. +- **Component** Multiple commonly used components are encapsulated twice +- **Examples** Built-in rich examples + +## Preview + +- [vue-element-plus-admin](https://element-plus-admin.cn/) - Full version of the github site +- [vue-element-plus-admin](https://kailong110120130.gitee.io/vue-element-plus-admin) - Full version of the gitee site + +account: **admin/admin** + +Online examples do not apply to menu filtering by default, but directly use Static routing + +## Documentation + +[Document Github](https://element-plus-admin-doc.cn/) + +[Document Gitee](https://kailong110120130.gitee.io/vue-element-plus-admin-doc) + +## Preparation + +- [node](http://nodejs.org/) and [git](https://git-scm.com/) - Project development environment +- [Vite](https://vitejs.dev/) - Familiar with vite features +- [Vue3](https://v3.vuejs.org/) - Familiar with Vue basic syntax +- [TypeScript](https://www.typescriptlang.org/) - Familiar with the basic syntax of `TypeScript` +- [Es6+](http://es6.ruanyifeng.com/) - Familiar with es6 basic syntax +- [Vue-Router-Next](https://next.router.vuejs.org/) - Familiar with the basic use of vue-router +- [Element-Plus](https://element-plus.org/) - Familiar with the basic use of element-plus +- [Mock.js](https://github.com/nuysoft/Mock) - mockjs basic syntax + +## Install and use + +- Get the project code + +```bash +git clone https://github.com/kailong321200875/vue-element-plus-admin.git +``` + +- Installation dependencies + +```bash +cd vue-element-plus-admin + +pnpm install + +``` + +- run + +```bash +pnpm run dev +``` + +- build + +```bash +pnpm run build:pro +``` + +## Change Log + +[CHANGELOG](./CHANGELOG.md) + +## How to contribute + + + + + +You can [Raise an issue](https://github.com/kailong321200875/vue-element-plus-admin/issues/new) Or submit a Pull Request. + +**Pull Request:** + +1. Fork code +2. Create your own branch: `git checkout -b feat/xxxx` +3. Submit your changes: `git commit -am 'feat(function): add xxxxx'` +4. Push your branch: `git push origin feat/xxxx` +5. submit `pull request` + +## Git Contribution submission specification + +- `feat` New features +- `fix` Fix bugs +- `docs` document +- `style` Format and style (changes that do not affect code operation) +- `refactor` Refactor +- `perf` Optimize related, such as improving performance and experience +- `test` Add test +- `build` Compilation related modifications, changes to project construction or dependencies +- `ci` Continuous integration modification +- `chore` Changes in the construction process or auxiliary tools +- `revert` Rollback to previous version +- `workflow` Workflow improvement +- `mod` Uncertain modification classification +- `wip` Under development +- `types` type + +## Browser support + +The `Chrome 80+` browser is recommended for local development + +Support modern browsers, not IE + +| [ Edge](http://godban.github.io/browsers-support-badges/)
IE | [ Edge](http://godban.github.io/browsers-support-badges/)
Edge | [Firefox](http://godban.github.io/browsers-support-badges/)
Firefox | [Chrome](http://godban.github.io/browsers-support-badges/)
Chrome | [Safari](http://godban.github.io/browsers-support-badges/)
Safari | +| :-: | :-: | :-: | :-: | :-: | +| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions | + +## Donate + +If you find this project helpful, welcome sponsorship to show your support~ + +[Paypal Me](https://www.paypal.com/paypalme/ckl94) + + + +### My QR code + +If you have any project cooperation or outsourcing, please scan the code to add me as a friend and leave a note of your purpose. + + + +## License + +[MIT](./LICENSE) diff --git a/README.zh-CN.md b/README.zh-CN.md new file mode 100644 index 0000000..2b153a6 --- /dev/null +++ b/README.zh-CN.md @@ -0,0 +1,148 @@ +


+ +[![license](https://img.shields.io/github/license/kailong321200875/vue-element-plus-admin.svg)](LICENSE) [![repo-size](https://img.shields.io/github/repo-size/kailong321200875/vue-element-plus-admin.svg)](repo-size) [![last-commit](https://img.shields.io/github/last-commit/kailong321200875/vue-element-plus-admin.svg)](last-commit) [![stars](https://img.shields.io/github/stars/kailong321200875/vue-element-plus-admin.svg)](stars) [![forks](https://img.shields.io/github/forks/kailong321200875/vue-element-plus-admin.svg)](forks) [![release](https://img.shields.io/github/release/kailong321200875/vue-element-plus-admin.svg)](release) [![watchers](https://img.shields.io/github/watchers/kailong321200875/vue-element-plus-admin.svg)](watchers) + +

vue-element-plus-admin

+
+ +[English](./README.md) | **中文** + +## 介绍 + +vue-element-plus-admin 是一个基于 `element-plus` 免费开源的中后台模版。使用了最新的`vue3`,`vite`,`TypeScript`等主流技术开发,开箱即用的中后台前端解决方案,可以用来作为项目的启动模版,也可用于学习参考。并且时刻关注着最新技术动向,尽可能的第一时间更新。 + +vue-element-plus-admin 的定位是后台集成方案,不太适合当基础模板来进行二次开发。因为集成了很多你可能用不到的功能,会造成不少的代码冗余。如果你的项目不关注这方面的问题,也可以直接基于它进行二次开发。 + +如需要基础模版,请切换到 `mini` 分支,`mini` 只简单集成了一些如:布局、动态菜单等常用布局功能,更适合开发者进行二次开发。 + +## 特性 + +- **最新技术栈**:使用 Vue3/vite4 等前端前沿技术开发 +- **TypeScript**: 应用程序级 JavaScript 的语言 +- **主题**: 可配置的主题 +- **国际化**:内置完善的国际化方案 +- **自定义数据** 内置 Mock 数据方案 +- **权限** 内置完善的动态路由权限生成方案 +- **组件** 二次封装了多个常用的组件 +- **示例** 内置丰富的示例 + +## 预览 + +- [vue-element-plus-admin](https://element-plus-admin.cn/) - 完整版 github 站点 +- [vue-element-plus-admin](https://kailong110120130.gitee.io/vue-element-plus-admin) - 完整版 gitee 站点 + +帐号:**admin/admin** + +在线例子默认不适用菜单过滤,而是直接使用静态路由表 + +## 文档 + +[文档地址 Github](https://element-plus-admin-doc.cn/) + +[文档地址 Gitee](https://kailong110120130.gitee.io/vue-element-plus-admin-doc) + +## 前序准备 + +- [node](http://nodejs.org/) 和 [git](https://git-scm.com/) - 项目开发环境 +- [Vite](https://vitejs.dev/) - 熟悉 vite 特性 +- [Vue3](https://v3.vuejs.org/) - 熟悉 Vue 基础语法 +- [TypeScript](https://www.typescriptlang.org/) - 熟悉 `TypeScript` 基本语法 +- [Es6+](http://es6.ruanyifeng.com/) - 熟悉 es6 基本语法 +- [Vue-Router-Next](https://next.router.vuejs.org/) - 熟悉 vue-router 基本使用 +- [Element-Plus](https://element-plus.org/) - element-plus 基本使用 +- [Mock.js](https://github.com/nuysoft/Mock) - mockjs 基本语法 + +## 安装和使用 + +- 获取代码 + +```bash +git clone https://github.com/kailong321200875/vue-element-plus-admin.git +``` + +- 安装依赖 + +```bash +cd vue-element-plus-admin + +pnpm install + +``` + +- 运行 + +```bash +pnpm run dev +``` + +- 打包 + +```bash +pnpm run build:pro +``` + +## 更新日志 + +[更新日志](./CHANGELOG.md) + +## 如何贡献 + + + + + +你可以[提一个 issue](https://github.com/kailong321200875/vue-element-plus-admin/issues/new) 或者提交一个 Pull Request。 + +**Pull Request:** + +1. Fork 代码 +2. 创建自己的分支: `git checkout -b feat/xxxx` +3. 提交你的修改: `git commit -am 'feat(function): add xxxxx'` +4. 推送您的分支: `git push origin feat/xxxx` +5. 提交 `pull request` + +## Git 贡献提交规范 + +- `feat` 新功能 +- `fix` 修补 bug +- `docs` 文档 +- `style` 格式、样式(不影响代码运行的变动) +- `refactor` 重构(即不是新增功能,也不是修改 BUG 的代码) +- `perf` 优化相关,比如提升性能、体验 +- `test` 添加测试 +- `build` 编译相关的修改,对项目构建或者依赖的改动 +- `ci` 持续集成修改 +- `chore` 构建过程或辅助工具的变动 +- `revert` 回滚到上一个版本 +- `workflow` 工作流改进 +- `mod` 不确定分类的修改 +- `wip` 开发中 +- `types` 类型 + +## 浏览器支持 + +本地开发推荐使用 `Chrome 80+` 浏览器 + +支持现代浏览器, 不支持 IE + +| [ Edge](http://godban.github.io/browsers-support-badges/)
IE | [ Edge](http://godban.github.io/browsers-support-badges/)
Edge | [Firefox](http://godban.github.io/browsers-support-badges/)
Firefox | [Chrome](http://godban.github.io/browsers-support-badges/)
Chrome | [Safari](http://godban.github.io/browsers-support-badges/)
Safari | +| :-: | :-: | :-: | :-: | :-: | +| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions | + +## Donate + +如果你觉得这个项目有帮助,欢迎赞助以示支持~ + +[Paypal Me](https://www.paypal.com/paypalme/ckl94) + + + +### 我的二维码 + +如有项目合作或项目外包,扫码加我好友,请备注来意。 + + + +## 许可证 + +[MIT](./LICENSE) diff --git a/commitlint.config.cjs b/commitlint.config.cjs new file mode 100644 index 0000000..78d145d --- /dev/null +++ b/commitlint.config.cjs @@ -0,0 +1,28 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], + rules: { + 'type-enum': [ + 2, + 'always', + [ + 'feat', // 新功能(feature) + 'fix', // 修补bug + 'docs', // 文档(documentation) + 'style', // 格式、样式(不影响代码运行的变动) + 'refactor', // 重构(即不是新增功能,也不是修改BUG的代码) + 'perf', // 优化相关,比如提升性能、体验 + 'test', // 添加测试 + 'ci', // 持续集成修改 + 'chore', // 构建过程或辅助工具的变动 + 'revert', // 回滚到上一个版本 + 'workflow', // 工作流改进 + 'mod', // 不确定分类的修改 + 'wip', // 开发中 + 'types', // 类型修改 + 'release' // 版本发布 + ] + ], + 'subject-full-stop': [0, 'never'], + 'subject-case': [0, 'never'] + } +} diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml new file mode 100644 index 0000000..b6fd3e1 --- /dev/null +++ b/docker-compose.dev.yaml @@ -0,0 +1,10 @@ +services: + vue-element-plus-admin: + build: + context: . + dockerfile: Dockerfile.dev + ports: + - "4000:4000" + volumes: + - /app/node_modules + - .:/app \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..67bc096 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,82 @@ +// 引入vue模版的eslint +import pluginVue from 'eslint-plugin-vue' +import eslint from '@eslint/js' +// ts-eslint解析器,使 eslint 可以解析 ts 语法 +import tseslint from 'typescript-eslint' +// vue文件解析器 +import vueParser from 'vue-eslint-parser' +import prettier from 'eslint-plugin-prettier' + +export default tseslint.config({ + // ignores: ['node_modules', 'prettier.config.cjs', 'dist*'], + files: ['src/**/*.ts', 'src/**/*.tsx', 'src/**/*.vue'], + // tseslint.config添加了extends扁平函数,直接用。否则是eslint9.0版本是没有extends的 + extends: [ + eslint.configs.recommended, + ...tseslint.configs.recommended, + ...pluginVue.configs['flat/essential'] + ], + plugins: { + prettier + }, + languageOptions: { + parser: vueParser, // 使用vue解析器,这个可以识别vue文件 + parserOptions: { + parser: tseslint.parser, // 在vue文件上使用ts解析器 + sourceType: 'module', + ecmaVersion: 2020, + ecmaFeatures: { + jsx: true + } + } + }, + rules: { + 'prettier/prettier': 'error', + 'no-useless-escape': 0, + 'no-undef': 0, + '@typescript-eslint/no-unused-expressions': 0, + '@typescript-eslint/no-unsafe-function-type': 0, + 'vue/no-setup-props-destructure': 0, + 'vue/script-setup-uses-vars': 1, + 'vue/no-reserved-component-names': 0, + '@typescript-eslint/ban-ts-ignore': 0, + '@typescript-eslint/explicit-function-return-type': 0, + '@typescript-eslint/no-explicit-any': 0, + '@typescript-eslint/no-var-requires': 0, + '@typescript-eslint/no-empty-function': 0, + 'vue/custom-event-name-casing': 0, + 'no-use-before-define': 0, + '@typescript-eslint/no-use-before-define': 0, + '@typescript-eslint/ban-ts-comment': 0, + '@typescript-eslint/ban-types': 0, + '@typescript-eslint/no-non-null-assertion': 0, + '@typescript-eslint/explicit-module-boundary-types': 0, + '@typescript-eslint/no-unused-vars': 0, + 'no-unused-vars': 0, + 'space-before-function-paren': 0, + 'vue/attributes-order': 0, + 'vue/one-component-per-file': 0, + 'vue/html-closing-bracket-newline': 0, + 'vue/max-attributes-per-line': 0, + 'vue/multiline-html-element-content-newline': 0, + 'vue/singleline-html-element-content-newline': 0, + 'vue/attribute-hyphenation': 0, + 'vue/require-default-prop': 0, + 'vue/require-explicit-emits': 0, + 'vue/html-self-closing': [ + 1, + { + html: { + void: 'always', + normal: 'never', + component: 'always' + }, + svg: 'always', + math: 'always' + } + ], + 'vue/multi-word-component-names': 0, + 'vue/no-v-html': 0, + 'vue/require-toggle-inside-transition': 0 + } +}) diff --git a/index.html b/index.html new file mode 100644 index 0000000..507d616 --- /dev/null +++ b/index.html @@ -0,0 +1,142 @@ + + + + + + + <%= title %> + + +
+ +
+
+
+ +
<%= title %>
+
+
+
+
+
+
+
+
+ + + diff --git a/mock/_createProductionServer.ts b/mock/_createProductionServer.ts new file mode 100644 index 0000000..598ac64 --- /dev/null +++ b/mock/_createProductionServer.ts @@ -0,0 +1,18 @@ +import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer' + +const modules = import.meta.glob('./**/*.mock.ts', { + import: 'default', + eager: true +}) + +const mockModules: any[] = [] +Object.keys(modules).forEach(async (key) => { + if (key.includes('_')) { + return + } + mockModules.push(...(modules[key] as any)) +}) + +export function setupProdMockServer() { + createProdMockServer(mockModules) +} diff --git a/mock/analysis/index.mock.ts b/mock/analysis/index.mock.ts new file mode 100644 index 0000000..195f367 --- /dev/null +++ b/mock/analysis/index.mock.ts @@ -0,0 +1,87 @@ +import { SUCCESS_CODE } from '@/constants' +import { MockMethod } from 'vite-plugin-mock' + +const timeout = 1000 + +export default [ + // 分析页统计接口 + { + url: '/mock/analysis/total', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: { + users: 102400, + messages: 81212, + moneys: 9280, + shoppings: 13600 + } + } + } + }, + // 用户来源 + { + url: '/mock/analysis/userAccessSource', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: [ + { value: 1000, name: 'analysis.directAccess' }, + { value: 310, name: 'analysis.mailMarketing' }, + { value: 234, name: 'analysis.allianceAdvertising' }, + { value: 135, name: 'analysis.videoAdvertising' }, + { value: 1548, name: 'analysis.searchEngines' } + ] + } + } + }, + // 每周用户活跃量 + { + url: '/mock/analysis/weeklyUserActivity', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: [ + { value: 13253, name: 'analysis.monday' }, + { value: 34235, name: 'analysis.tuesday' }, + { value: 26321, name: 'analysis.wednesday' }, + { value: 12340, name: 'analysis.thursday' }, + { value: 24643, name: 'analysis.friday' }, + { value: 1322, name: 'analysis.saturday' }, + { value: 1324, name: 'analysis.sunday' } + ] + } + } + }, + // 每月销售额 + { + url: '/mock/analysis/monthlySales', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: [ + { estimate: 100, actual: 120, name: 'analysis.january' }, + { estimate: 120, actual: 82, name: 'analysis.february' }, + { estimate: 161, actual: 91, name: 'analysis.march' }, + { estimate: 134, actual: 154, name: 'analysis.april' }, + { estimate: 105, actual: 162, name: 'analysis.may' }, + { estimate: 160, actual: 140, name: 'analysis.june' }, + { estimate: 165, actual: 145, name: 'analysis.july' }, + { estimate: 114, actual: 250, name: 'analysis.august' }, + { estimate: 163, actual: 134, name: 'analysis.september' }, + { estimate: 185, actual: 56, name: 'analysis.october' }, + { estimate: 118, actual: 99, name: 'analysis.november' }, + { estimate: 123, actual: 123, name: 'analysis.december' } + ] + } + } + } +] as MockMethod[] diff --git a/mock/department/index.mock.ts b/mock/department/index.mock.ts new file mode 100644 index 0000000..443907e --- /dev/null +++ b/mock/department/index.mock.ts @@ -0,0 +1,206 @@ +import { toAnyString } from '@/utils' +import Mock from 'mockjs' +import { SUCCESS_CODE } from '@/constants' + +const departmentList: any = [] + +const citys = ['厦门总公司', '北京分公司', '上海分公司', '福州分公司', '深圳分公司', '杭州分公司'] + +for (let i = 0; i < 5; i++) { + departmentList.push({ + // 部门名称 + departmentName: citys[i], + id: toAnyString(), + createTime: '@datetime', + // 状态 + status: Mock.Random.integer(0, 1), + // 备注 + remark: '@cword(10, 15)', + children: [ + { + // 部门名称 + departmentName: '研发部', + id: toAnyString(), + createTime: '@datetime', + // 状态 + status: Mock.Random.integer(0, 1), + // 备注 + remark: '@cword(10, 15)' + }, + { + // 部门名称 + departmentName: '产品部', + id: toAnyString(), + createTime: '@datetime', + // 状态 + status: Mock.Random.integer(0, 1), + // 备注 + remark: '@cword(10, 15)' + }, + { + // 部门名称 + departmentName: '运营部', + id: toAnyString(), + createTime: '@datetime', + // 状态 + status: Mock.Random.integer(0, 1), + // 备注 + remark: '@cword(10, 15)' + }, + { + // 部门名称 + departmentName: '市场部', + id: toAnyString(), + createTime: '@datetime', + // 状态 + status: Mock.Random.integer(0, 1), + // 备注 + remark: '@cword(10, 15)' + }, + { + // 部门名称 + departmentName: '销售部', + id: toAnyString(), + createTime: '@datetime', + // 状态 + status: Mock.Random.integer(0, 1), + // 备注 + remark: '@cword(10, 15)' + }, + { + // 部门名称 + departmentName: '客服部', + id: toAnyString(), + createTime: '@datetime', + // 状态 + status: Mock.Random.integer(0, 1), + // 备注 + remark: '@cword(10, 15)' + } + ] + }) +} + +export default [ + // 列表接口 + { + url: '/mock/department/list', + method: 'get', + response: () => { + return { + code: SUCCESS_CODE, + data: { + list: departmentList + } + } + } + }, + { + url: '/mock/department/table/list', + method: 'get', + response: () => { + return { + code: SUCCESS_CODE, + data: { + list: departmentList, + total: 5 + } + } + } + }, + { + url: '/mock/department/users', + method: 'get', + timeout: 1000, + response: ({ query }) => { + const { pageSize } = query + // 根据pageSize来创建数据 + const mockList: any = [] + for (let i = 0; i < pageSize; i++) { + mockList.push( + Mock.mock({ + // 用户名 + username: '@cname', + // 账号 + account: '@first', + // 邮箱 + email: '@EMAIL', + // 创建时间 + createTime: '@datetime', + // 用户id + id: toAnyString() + }) + ) + } + return { + code: SUCCESS_CODE, + data: { + total: 100, + list: mockList + } + } + } + }, + // 保存接口 + { + url: '/mock/department/user/save', + method: 'post', + timeout: 1000, + response: () => { + return { + code: SUCCESS_CODE, + data: 'success' + } + } + }, + // 删除接口 + { + url: '/mock/department/user/delete', + method: 'post', + response: ({ body }) => { + const ids = body.ids + if (!ids) { + return { + code: 500, + message: '请选择需要删除的数据' + } + } else { + return { + code: SUCCESS_CODE, + data: 'success' + } + } + } + }, + // 保存接口 + { + url: '/mock/department/save', + method: 'post', + timeout: 1000, + response: () => { + return { + code: SUCCESS_CODE, + data: 'success' + } + } + }, + // 删除接口 + { + url: '/mock/department/delete', + method: 'post', + response: ({ body }) => { + const ids = body.ids + if (!ids) { + return { + code: 500, + message: '请选择需要删除的数据' + } + } else { + return { + code: SUCCESS_CODE, + data: 'success' + } + } + } + } +] diff --git a/mock/dict/index.mock.ts b/mock/dict/index.mock.ts new file mode 100644 index 0000000..29042c6 --- /dev/null +++ b/mock/dict/index.mock.ts @@ -0,0 +1,60 @@ +import { SUCCESS_CODE } from '@/constants' + +const timeout = 1000 + +const dictObj: Recordable = { + importance: [ + { + value: 0, + label: 'tableDemo.commonly' + }, + { + value: 1, + label: 'tableDemo.good' + }, + { + value: 2, + label: 'tableDemo.important' + } + ] +} + +export default [ + // 字典接口 + { + url: '/mock/dict/list', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: dictObj + } + } + }, + // 获取某个字典 + { + url: '/mock/dict/one', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: [ + { + label: 'test1', + value: 0 + }, + { + label: 'test2', + value: 1 + }, + { + label: 'test3', + value: 2 + } + ] + } + } + } +] diff --git a/mock/menu/index.mock.ts b/mock/menu/index.mock.ts new file mode 100644 index 0000000..2823692 --- /dev/null +++ b/mock/menu/index.mock.ts @@ -0,0 +1,357 @@ +import Mock from 'mockjs' +import { SUCCESS_CODE } from '@/constants' + +const timeout = 1000 + +export default [ + // 列表接口 + { + url: '/mock/menu/list', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: { + list: [ + { + path: '/dashboard', + component: '#', + redirect: '/dashboard/analysis', + name: 'Dashboard', + status: Mock.Random.integer(0, 1), + id: 1, + type: 0, + parentId: undefined, + title: '首页', + meta: { + title: '首页', + icon: 'vi-ant-design:dashboard-filled', + alwaysShow: true + }, + children: [ + { + path: 'analysis', + component: 'views/Dashboard/Analysis', + name: 'Analysis', + status: Mock.Random.integer(0, 1), + id: 2, + type: 1, + parentId: 1, + title: '分析页', + permissionList: [ + { + id: 1, + label: '新增', + value: 'add' + }, + { + id: 2, + label: '编辑', + value: 'edit' + } + ], + meta: { + title: '分析页', + noCache: true, + permission: ['add', 'edit'] + } + }, + { + path: 'workplace', + component: 'views/Dashboard/Workplace', + name: 'Workplace', + status: Mock.Random.integer(0, 1), + id: 3, + type: 1, + parentId: 1, + title: '工作台', + permissionList: [ + { + id: 1, + label: '新增', + value: 'add' + }, + { + id: 2, + label: '编辑', + value: 'edit' + }, + { + id: 3, + label: '删除', + value: 'delete' + } + ], + meta: { + title: '工作台', + noCache: true + } + } + ] + }, + { + path: '/external-link', + component: '#', + meta: { + title: '文档', + icon: 'vi-clarity:document-solid' + }, + name: 'ExternalLink', + status: Mock.Random.integer(0, 1), + id: 4, + type: 0, + parentId: undefined, + title: '文档', + children: [ + { + path: 'https://element-plus-admin-doc.cn/', + name: 'DocumentLink', + status: Mock.Random.integer(0, 1), + id: 5, + type: 1, + parentId: 4, + title: '文档', + meta: { + title: '文档' + } + } + ] + }, + { + path: '/level', + component: '#', + redirect: '/level/menu1/menu1-1/menu1-1-1', + name: 'Level', + status: Mock.Random.integer(0, 1), + id: 6, + type: 0, + parentId: undefined, + title: '菜单', + meta: { + title: '菜单', + icon: 'vi-carbon:skill-level-advanced' + }, + children: [ + { + path: 'menu1', + name: 'Menu1', + component: '##', + status: Mock.Random.integer(0, 1), + id: 7, + type: 0, + parentId: 6, + title: '菜单1', + redirect: '/level/menu1/menu1-1/menu1-1-1', + meta: { + title: '菜单1' + }, + children: [ + { + path: 'menu1-1', + name: 'Menu11', + component: '##', + status: Mock.Random.integer(0, 1), + id: 8, + type: 0, + parentId: 7, + title: '菜单1-1', + redirect: '/level/menu1/menu1-1/menu1-1-1', + meta: { + title: '菜单1-1', + alwaysShow: true + }, + children: [ + { + path: 'menu1-1-1', + name: 'Menu111', + component: 'views/Level/Menu111', + status: Mock.Random.integer(0, 1), + id: 9, + type: 1, + parentId: 8, + title: '菜单1-1-1', + meta: { + title: '菜单1-1-1' + } + } + ] + }, + { + path: 'menu1-2', + name: 'Menu12', + component: 'views/Level/Menu12', + status: Mock.Random.integer(0, 1), + id: 10, + type: 1, + parentId: 7, + title: '菜单1-2', + meta: { + title: '菜单1-2' + } + } + ] + }, + { + path: 'menu2', + name: 'Menu2Demo', + component: 'views/Level/Menu2', + status: Mock.Random.integer(0, 1), + id: 11, + type: 1, + parentId: 6, + title: '菜单2', + meta: { + title: '菜单2' + } + } + ] + }, + { + path: '/example', + component: '#', + redirect: '/example/example-dialog', + name: 'Example', + status: Mock.Random.integer(0, 1), + id: 12, + type: 0, + parentId: undefined, + title: '综合示例', + meta: { + title: '综合示例', + icon: 'vi-ep:management', + alwaysShow: true + }, + children: [ + { + path: 'example-dialog', + component: 'views/Example/Dialog/ExampleDialog', + name: 'ExampleDialog', + status: Mock.Random.integer(0, 1), + id: 13, + type: 1, + parentId: 12, + title: '综合示例-弹窗', + permissionList: [ + { + id: 1, + label: '新增', + value: 'add' + }, + { + id: 2, + label: '编辑', + value: 'edit' + }, + { + id: 3, + label: '删除', + value: 'delete' + }, + { + id: 4, + label: '查看', + value: 'view' + } + ], + meta: { + title: '综合示例-弹窗' + } + }, + { + path: 'example-page', + component: 'views/Example/Page/ExamplePage', + name: 'ExamplePage', + status: Mock.Random.integer(0, 1), + id: 14, + type: 1, + parentId: 12, + title: '综合示例-页面', + permissionList: [ + { + id: 1, + label: '新增', + value: 'add' + }, + { + id: 2, + label: '编辑', + value: 'edit' + }, + { + id: 3, + label: '删除', + value: 'delete' + }, + { + id: 4, + label: '查看', + value: 'view' + } + ], + meta: { + title: '综合示例-页面' + } + }, + { + path: 'example-add', + component: 'views/Example/Page/ExampleAdd', + name: 'ExampleAdd', + status: Mock.Random.integer(0, 1), + id: 15, + type: 1, + parentId: 12, + title: '综合示例-新增', + meta: { + title: '综合示例-新增', + noTagsView: true, + noCache: true, + hidden: true, + showMainRoute: true, + activeMenu: '/example/example-page' + } + }, + { + path: 'example-edit', + component: 'views/Example/Page/ExampleEdit', + name: 'ExampleEdit', + status: Mock.Random.integer(0, 1), + id: 16, + type: 1, + parentId: 12, + title: '综合示例-编辑', + meta: { + title: '综合示例-编辑', + noTagsView: true, + noCache: true, + hidden: true, + showMainRoute: true, + activeMenu: '/example/example-page' + } + }, + { + path: 'example-detail', + component: 'views/Example/Page/ExampleDetail', + name: 'ExampleDetail', + status: Mock.Random.integer(0, 1), + id: 17, + type: 1, + parentId: 12, + title: '综合示例-详情', + meta: { + title: '综合示例-详情', + noTagsView: true, + noCache: true, + hidden: true, + showMainRoute: true, + activeMenu: '/example/example-page' + } + } + ] + } + ] + } + } + } + } +] diff --git a/mock/request/index.mock.ts b/mock/request/index.mock.ts new file mode 100644 index 0000000..bfaa266 --- /dev/null +++ b/mock/request/index.mock.ts @@ -0,0 +1,72 @@ +import { SUCCESS_CODE } from '@/constants' + +const timeout = 600000 + +export default [ + { + url: '/mock/request/1', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: 'request-1' + } + } + }, + { + url: '/mock/request/2', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: 'request-2' + } + } + }, + { + url: '/mock/request/3', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: 'request-3' + } + } + }, + { + url: '/mock/request/4', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: 'request-4' + } + } + }, + { + url: '/mock/request/5', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: 'request-5' + } + } + }, + { + url: '/mock/request/expired', + method: 'get', + timeout: 0, + response: () => { + return { + code: 401, + message: 'token expired' + } + } + } +] diff --git a/mock/role/index.mock.ts b/mock/role/index.mock.ts new file mode 100644 index 0000000..910b2cc --- /dev/null +++ b/mock/role/index.mock.ts @@ -0,0 +1,1235 @@ +import Mock from 'mockjs' +import { SUCCESS_CODE } from '@/constants' +import { toAnyString } from '@/utils' + +const timeout = 1000 + +const adminList = [ + { + path: '/dashboard', + component: '#', + redirect: '/dashboard/analysis', + name: 'Dashboard', + meta: { + title: 'router.dashboard', + icon: 'vi-ant-design:dashboard-filled', + alwaysShow: true + }, + children: [ + { + path: 'analysis', + component: 'views/Dashboard/Analysis', + name: 'Analysis', + meta: { + title: 'router.analysis', + noCache: true, + affix: true + } + }, + { + path: 'workplace', + component: 'views/Dashboard/Workplace', + name: 'Workplace', + meta: { + title: 'router.workplace', + noCache: true, + affix: true + } + } + ] + }, + { + path: '/external-link', + component: '#', + meta: {}, + name: 'ExternalLink', + children: [ + { + path: 'https://element-plus-admin-doc.cn/', + name: 'DocumentLink', + meta: { + title: 'router.document', + icon: 'vi-clarity:document-solid' + } + } + ] + }, + { + path: '/guide', + component: '#', + name: 'Guide', + meta: {}, + children: [ + { + path: 'index', + component: 'views/Guide/Guide', + name: 'GuideDemo', + meta: { + title: 'router.guide', + icon: 'vi-cib:telegram-plane' + } + } + ] + }, + { + path: '/components', + component: '#', + redirect: '/components/form/default-form', + name: 'ComponentsDemo', + meta: { + title: 'router.component', + icon: 'vi-bx:bxs-component', + alwaysShow: true + }, + children: [ + { + path: 'form', + component: '##', + name: 'Form', + meta: { + title: 'router.form', + alwaysShow: true + }, + children: [ + { + path: 'default-form', + component: 'views/Components/Form/DefaultForm', + name: 'DefaultForm', + meta: { + title: 'router.defaultForm' + } + }, + { + path: 'use-form', + component: 'views/Components/Form/UseFormDemo', + name: 'UseForm', + meta: { + title: 'UseForm' + } + } + ] + }, + { + path: 'table', + component: '##', + redirect: '/components/table/default-table', + name: 'TableDemo', + meta: { + title: 'router.table', + alwaysShow: true + }, + children: [ + { + path: 'default-table', + component: 'views/Components/Table/DefaultTable', + name: 'DefaultTable', + meta: { + title: 'router.defaultTable' + } + }, + { + path: 'use-table', + component: 'views/Components/Table/UseTableDemo', + name: 'UseTable', + meta: { + title: 'UseTable' + } + }, + { + path: 'tree-table', + component: 'views/Components/Table/TreeTable', + name: 'TreeTable', + meta: { + title: 'TreeTable' + } + }, + { + path: 'table-image-preview', + component: 'views/Components/Table/TableImagePreview', + name: 'TableImagePreview', + meta: { + title: 'router.PicturePreview' + } + }, + { + path: 'table-video-preview', + component: 'views/Components/Table/TableVideoPreview', + name: 'TableVideoPreview', + meta: { + title: 'router.tableVideoPreview' + } + }, + { + path: 'card-table', + component: 'views/Components/Table/CardTable', + name: 'CardTable', + meta: { + title: 'router.cardTable' + } + } + // { + // path: 'ref-table', + // component: 'views/Components/Table/RefTable', + // name: 'RefTable', + // meta: { + // title: 'RefTable' + // } + // } + ] + }, + { + path: 'editor-demo', + component: '##', + redirect: '/components/editor-demo/editor', + name: 'EditorDemo', + meta: { + title: 'router.editor', + alwaysShow: true + }, + children: [ + { + path: 'editor', + component: 'views/Components/Editor/Editor', + name: 'Editor', + meta: { + title: 'router.richText' + } + }, + { + path: 'json-editor', + component: 'views/Components/Editor/JsonEditor', + name: 'JsonEditor', + meta: { + title: 'router.jsonEditor' + } + }, + { + path: 'code-editor', + component: 'views/Components/Editor/CodeEditor', + name: 'CodeEditor', + meta: { + title: 'router.codeEditor' + } + } + ] + }, + { + path: 'search', + component: 'views/Components/Search', + name: 'Search', + meta: { + title: 'router.search' + } + }, + { + path: 'descriptions', + component: 'views/Components/Descriptions', + name: 'Descriptions', + meta: { + title: 'router.descriptions' + } + }, + { + path: 'image-viewer', + component: 'views/Components/ImageViewer', + name: 'ImageViewer', + meta: { + title: 'router.imageViewer' + } + }, + { + path: 'dialog', + component: 'views/Components/Dialog', + name: 'Dialog', + meta: { + title: 'router.dialog' + } + }, + { + path: 'icon', + component: 'views/Components/Icon', + name: 'Icon', + meta: { + title: 'router.icon' + } + }, + { + path: 'icon-picker', + component: 'views/Components/IconPicker', + name: 'IconPicker', + meta: { + title: 'router.iconPicker' + } + }, + { + path: 'echart', + component: 'views/Components/Echart', + name: 'Echart', + meta: { + title: 'router.echart' + } + }, + { + path: 'count-to', + component: 'views/Components/CountTo', + name: 'CountTo', + meta: { + title: 'router.countTo' + } + }, + { + path: 'qrcode', + component: 'views/Components/Qrcode', + name: 'Qrcode', + meta: { + title: 'router.qrcode' + } + }, + { + path: 'highlight', + component: 'views/Components/Highlight', + name: 'Highlight', + meta: { + title: 'router.highlight' + } + }, + { + path: 'infotip', + component: 'views/Components/Infotip', + name: 'Infotip', + meta: { + title: 'router.infotip' + } + }, + { + path: 'input-password', + component: 'views/Components/InputPassword', + name: 'InputPassword', + meta: { + title: 'router.inputPassword' + } + }, + { + path: 'waterfall', + component: 'views/Components/Waterfall', + name: 'Waterfall', + meta: { + title: 'router.waterfall' + } + }, + { + path: 'image-cropping', + component: 'views/Components/ImageCropping', + name: 'ImageCropping', + meta: { + title: 'router.imageCropping' + } + }, + { + path: 'video-player', + component: 'views/Components/VideoPlayer', + name: 'VideoPlayer', + meta: { + title: 'router.videoPlayer' + } + }, + { + path: 'avatars', + component: 'views/Components/Avatars', + name: 'Avatars', + meta: { + title: 'router.avatars' + } + }, + { + path: 'i-agree', + component: 'views/Components/IAgree', + name: 'IAgree', + meta: { + title: 'router.iAgree' + } + }, + { + path: 'tree', + component: 'views/Components/Tree', + name: 'Tree', + meta: { + title: 'router.tree' + } + } + ] + }, + { + path: '/function', + component: '#', + redirect: '/function/multipleTabs', + name: 'Function', + meta: { + title: 'router.function', + icon: 'vi-ri:function-fill', + alwaysShow: true + }, + children: [ + { + path: 'multipleTabs', + component: 'views/Function/MultipleTabs', + name: 'MultipleTabs', + meta: { + title: 'router.multipleTabs' + } + }, + { + path: 'multiple-tabs-demo/:id', + component: 'views/Function/MultipleTabsDemo', + name: 'MultipleTabsDemo', + meta: { + hidden: true, + title: 'router.details', + canTo: true + } + }, + { + path: 'request', + component: 'views/Function/Request', + name: 'Request', + meta: { + title: 'router.request' + } + }, + { + path: 'test', + component: 'views/Function/Test', + name: 'Test', + meta: { + title: 'router.permission', + permission: ['add', 'edit', 'delete'] + } + } + ] + }, + { + path: '/hooks', + component: '#', + redirect: '/hooks/useWatermark', + name: 'Hooks', + meta: { + title: 'hooks', + icon: 'vi-ic:outline-webhook', + alwaysShow: true + }, + children: [ + { + path: 'useWatermark', + component: 'views/hooks/useWatermark', + name: 'UseWatermark', + meta: { + title: 'useWatermark' + } + }, + { + path: 'useTagsView', + component: 'views/hooks/useTagsView', + name: 'UseTagsView', + meta: { + title: 'useTagsView' + } + }, + { + path: 'useValidator', + component: 'views/hooks/useValidator', + name: 'UseValidator', + meta: { + title: 'useValidator' + } + }, + { + path: 'useCrudSchemas', + component: 'views/hooks/useCrudSchemas', + name: 'UseCrudSchemas', + meta: { + title: 'useCrudSchemas' + } + }, + { + path: 'useClipboard', + component: 'views/hooks/useClipboard', + name: 'UseClipboard', + meta: { + title: 'useClipboard' + } + }, + { + path: 'useNetwork', + component: 'views/hooks/useNetwork', + name: 'UseNetwork', + meta: { + title: 'useNetwork' + } + } + ] + }, + { + path: '/level', + component: '#', + redirect: '/level/menu1/menu1-1/menu1-1-1', + name: 'Level', + meta: { + title: 'router.level', + icon: 'vi-carbon:skill-level-advanced' + }, + children: [ + { + path: 'menu1', + name: 'Menu1', + component: '##', + redirect: '/level/menu1/menu1-1/menu1-1-1', + meta: { + title: 'router.menu1' + }, + children: [ + { + path: 'menu1-1', + name: 'Menu11', + component: '##', + redirect: '/level/menu1/menu1-1/menu1-1-1', + meta: { + title: 'router.menu11', + alwaysShow: true + }, + children: [ + { + path: 'menu1-1-1', + name: 'Menu111', + component: 'views/Level/Menu111', + meta: { + title: 'router.menu111' + } + } + ] + }, + { + path: 'menu1-2', + name: 'Menu12', + component: 'views/Level/Menu12', + meta: { + title: 'router.menu12' + } + } + ] + }, + { + path: 'menu2', + name: 'Menu2Demo', + component: 'views/Level/Menu2', + meta: { + title: 'router.menu2' + } + } + ] + }, + { + path: '/example', + component: '#', + redirect: '/example/example-dialog', + name: 'Example', + meta: { + title: 'router.example', + icon: 'vi-ep:management', + alwaysShow: true + }, + children: [ + { + path: 'example-dialog', + component: 'views/Example/Dialog/ExampleDialog', + name: 'ExampleDialog', + meta: { + title: 'router.exampleDialog' + } + }, + { + path: 'example-page', + component: 'views/Example/Page/ExamplePage', + name: 'ExamplePage', + meta: { + title: 'router.examplePage' + } + }, + { + path: 'example-add', + component: 'views/Example/Page/ExampleAdd', + name: 'ExampleAdd', + meta: { + title: 'router.exampleAdd', + noTagsView: true, + noCache: true, + hidden: true, + showMainRoute: true, + activeMenu: '/example/example-page' + } + }, + { + path: 'example-edit', + component: 'views/Example/Page/ExampleEdit', + name: 'ExampleEdit', + meta: { + title: 'router.exampleEdit', + noTagsView: true, + noCache: true, + hidden: true, + showMainRoute: true, + activeMenu: '/example/example-page' + } + }, + { + path: 'example-detail', + component: 'views/Example/Page/ExampleDetail', + name: 'ExampleDetail', + meta: { + title: 'router.exampleDetail', + noTagsView: true, + noCache: true, + hidden: true, + showMainRoute: true, + activeMenu: '/example/example-page' + } + } + ] + }, + { + path: '/error', + component: '#', + redirect: '/error/404', + name: 'Error', + meta: { + title: 'router.errorPage', + icon: 'vi-ci:error', + alwaysShow: true + }, + children: [ + { + path: '404-demo', + component: 'views/Error/404', + name: '404Demo', + meta: { + title: '404' + } + }, + { + path: '403-demo', + component: 'views/Error/403', + name: '403Demo', + meta: { + title: '403' + } + }, + { + path: '500-demo', + component: 'views/Error/500', + name: '500Demo', + meta: { + title: '500' + } + } + ] + }, + { + path: '/authorization', + component: '#', + redirect: '/authorization/user', + name: 'Authorization', + meta: { + title: 'router.authorization', + icon: 'vi-eos-icons:role-binding', + alwaysShow: true + }, + children: [ + { + path: 'department', + component: 'views/Authorization/Department/Department', + name: 'Department', + meta: { + title: 'router.department' + } + }, + { + path: 'user', + component: 'views/Authorization/User/User', + name: 'User', + meta: { + title: 'router.user' + } + }, + { + path: 'menu', + component: 'views/Authorization/Menu/Menu', + name: 'Menu', + meta: { + title: 'router.menuManagement' + } + }, + { + path: 'role', + component: 'views/Authorization/Role/Role', + name: 'Role', + meta: { + title: 'router.role' + } + } + ] + } +] + +const testList: string[] = [ + '/dashboard', + '/dashboard/analysis', + '/dashboard/workplace', + 'external-link', + 'https://element-plus-admin-doc.cn/', + '/guide', + '/guide/index', + '/components', + '/components/form', + '/components/form/default-form', + '/components/form/use-form', + '/components/form/ref-form', + '/components/table', + '/components/table/default-table', + '/components/table/use-table', + '/components/table/tree-table', + '/components/table/table-image-preview', + '/components/table/table-video-preview', + '/components/table/ref-table', + '/components/table/card-table', + '/components/editor-demo', + '/components/editor-demo/editor', + '/components/editor-demo/json-editor', + '/components/editor-demo/code-editor', + '/components/search', + '/components/descriptions', + '/components/image-viewer', + '/components/dialog', + '/components/icon', + '/components/iconPicker', + '/components/echart', + '/components/count-to', + '/components/qrcode', + '/components/highlight', + '/components/infotip', + '/components/input-password', + '/components/waterfall', + '/components/image-cropping', + '/components/video-player', + '/components/avatars', + '/components/i-agree', + 'function', + '/function/multiple-tabs', + '/function/multiple-tabs-demo/:id', + '/function/request', + '/function/test', + '/hooks', + '/hooks/useWatermark', + '/hooks/useTagsView', + '/hooks/useValidator', + '/hooks/useCrudSchemas', + '/hooks/useClipboard', + '/hooks/useNetwork', + '/level', + '/level/menu1', + '/level/menu1/menu1-1', + '/level/menu1/menu1-1/menu1-1-1', + '/level/menu1/menu1-2', + '/level/menu2', + '/example', + '/example/example-dialog', + '/example/example-page', + '/example/example-add', + '/example/example-edit', + '/example/example-detail', + '/authorization', + '/authorization/department', + '/authorization/user', + '/authorization/role', + '/authorization/menu', + '/error', + '/error/404-demo', + '/error/403-demo', + '/error/500-demo' +] + +const List: any[] = [] + +const roleNames = ['超级管理员', '管理员', '普通用户', '游客'] +const menus = [ + [ + { + path: '/dashboard', + component: '#', + redirect: '/dashboard/analysis', + name: 'Dashboard', + status: Mock.Random.integer(0, 1), + id: 1, + meta: { + title: '首页', + icon: 'vi-ant-design:dashboard-filled', + alwaysShow: true + }, + children: [ + { + path: 'analysis', + component: 'views/Dashboard/Analysis', + name: 'Analysis', + status: Mock.Random.integer(0, 1), + id: 2, + meta: { + title: '分析页', + noCache: true + } + }, + { + path: 'workplace', + component: 'views/Dashboard/Workplace', + name: 'Workplace', + status: Mock.Random.integer(0, 1), + id: 3, + meta: { + title: '工作台', + noCache: true + } + } + ] + }, + { + path: '/external-link', + component: '#', + meta: { + title: '文档', + icon: 'vi-clarity:document-solid' + }, + name: 'ExternalLink', + status: Mock.Random.integer(0, 1), + id: 4, + children: [ + { + path: 'https://element-plus-admin-doc.cn/', + name: 'DocumentLink', + status: Mock.Random.integer(0, 1), + id: 5, + meta: { + title: '文档' + } + } + ] + }, + { + path: '/level', + component: '#', + redirect: '/level/menu1/menu1-1/menu1-1-1', + name: 'Level', + status: Mock.Random.integer(0, 1), + id: 6, + meta: { + title: '菜单', + icon: 'vi-carbon:skill-level-advanced' + }, + children: [ + { + path: 'menu1', + name: 'Menu1', + component: '##', + status: Mock.Random.integer(0, 1), + id: 7, + redirect: '/level/menu1/menu1-1/menu1-1-1', + meta: { + title: '菜单1' + }, + children: [ + { + path: 'menu1-1', + name: 'Menu11', + component: '##', + status: Mock.Random.integer(0, 1), + id: 8, + redirect: '/level/menu1/menu1-1/menu1-1-1', + meta: { + title: '菜单1-1', + alwaysShow: true + }, + children: [ + { + path: 'menu1-1-1', + name: 'Menu111', + component: 'views/Level/Menu111', + status: Mock.Random.integer(0, 1), + id: 9, + permission: ['edit', 'add', 'delete'], + meta: { + title: '菜单1-1-1', + permission: ['edit', 'add', 'delete'] + } + } + ] + }, + { + path: 'menu1-2', + name: 'Menu12', + component: 'views/Level/Menu12', + status: Mock.Random.integer(0, 1), + id: 10, + permission: ['edit', 'add', 'delete'], + meta: { + title: '菜单1-2', + permission: ['edit', 'add', 'delete'] + } + } + ] + }, + { + path: 'menu2', + name: 'Menu2Demo', + component: 'views/Level/Menu2', + status: Mock.Random.integer(0, 1), + id: 11, + permission: ['edit', 'add', 'delete'], + meta: { + title: '菜单2', + permission: ['edit', 'add', 'delete'] + } + } + ] + }, + { + path: '/example', + component: '#', + redirect: '/example/example-dialog', + name: 'Example', + status: Mock.Random.integer(0, 1), + id: 12, + meta: { + title: '综合示例', + icon: 'vi-ep:management', + alwaysShow: true + }, + children: [ + { + path: 'example-dialog', + component: 'views/Example/Dialog/ExampleDialog', + name: 'ExampleDialog', + status: Mock.Random.integer(0, 1), + id: 13, + permission: ['edit', 'add', 'delete'], + meta: { + title: '综合示例-弹窗', + permission: ['edit', 'add', 'delete'] + } + }, + { + path: 'example-page', + component: 'views/Example/Page/ExamplePage', + name: 'ExamplePage', + status: Mock.Random.integer(0, 1), + id: 14, + permission: ['edit', 'add', 'delete'], + meta: { + title: '综合示例-页面', + permission: ['edit', 'add', 'delete'] + } + }, + { + path: 'example-add', + component: 'views/Example/Page/ExampleAdd', + name: 'ExampleAdd', + status: Mock.Random.integer(0, 1), + id: 15, + permission: ['edit', 'add', 'delete'], + meta: { + title: '综合示例-新增', + noTagsView: true, + noCache: true, + hidden: true, + showMainRoute: true, + activeMenu: '/example/example-page', + permission: ['edit', 'add', 'delete'] + } + }, + { + path: 'example-edit', + component: 'views/Example/Page/ExampleEdit', + name: 'ExampleEdit', + status: Mock.Random.integer(0, 1), + id: 16, + permission: ['edit', 'add', 'delete'], + meta: { + title: '综合示例-编辑', + noTagsView: true, + noCache: true, + hidden: true, + showMainRoute: true, + activeMenu: '/example/example-page', + permission: ['edit', 'add', 'delete'] + } + }, + { + path: 'example-detail', + component: 'views/Example/Page/ExampleDetail', + name: 'ExampleDetail', + status: Mock.Random.integer(0, 1), + id: 17, + permission: ['edit', 'add', 'delete'], + meta: { + title: '综合示例-详情', + noTagsView: true, + noCache: true, + hidden: true, + showMainRoute: true, + activeMenu: '/example/example-page', + permission: ['edit', 'add', 'delete'] + } + } + ] + } + ], + [ + { + path: '/dashboard', + component: '#', + redirect: '/dashboard/analysis', + name: 'Dashboard', + status: Mock.Random.integer(0, 1), + id: 1, + meta: { + title: '首页', + icon: 'vi-ant-design:dashboard-filled', + alwaysShow: true + }, + children: [ + { + path: 'analysis', + component: 'views/Dashboard/Analysis', + name: 'Analysis', + status: Mock.Random.integer(0, 1), + id: 2, + meta: { + title: '分析页', + noCache: true + } + }, + { + path: 'workplace', + component: 'views/Dashboard/Workplace', + name: 'Workplace', + status: Mock.Random.integer(0, 1), + id: 3, + meta: { + title: '工作台', + noCache: true + } + } + ] + } + ], + [ + { + path: '/external-link', + component: '#', + meta: { + title: '文档', + icon: 'vi-clarity:document-solid' + }, + name: 'ExternalLink', + status: Mock.Random.integer(0, 1), + id: 4, + children: [ + { + path: 'https://element-plus-admin-doc.cn/', + name: 'DocumentLink', + status: Mock.Random.integer(0, 1), + id: 5, + meta: { + title: '文档' + } + } + ] + }, + { + path: '/level', + component: '#', + redirect: '/level/menu1/menu1-1/menu1-1-1', + name: 'Level', + status: Mock.Random.integer(0, 1), + id: 6, + meta: { + title: '菜单', + icon: 'vi-carbon:skill-level-advanced' + }, + children: [ + { + path: 'menu1', + name: 'Menu1', + component: '##', + status: Mock.Random.integer(0, 1), + id: 7, + redirect: '/level/menu1/menu1-1/menu1-1-1', + meta: { + title: '菜单1' + }, + children: [ + { + path: 'menu1-1', + name: 'Menu11', + component: '##', + status: Mock.Random.integer(0, 1), + id: 8, + redirect: '/level/menu1/menu1-1/menu1-1-1', + meta: { + title: '菜单1-1', + alwaysShow: true + }, + children: [ + { + path: 'menu1-1-1', + name: 'Menu111', + component: 'views/Level/Menu111', + status: Mock.Random.integer(0, 1), + id: 9, + permission: ['edit', 'add', 'delete'], + meta: { + title: '菜单1-1-1', + permission: ['edit', 'add', 'delete'] + } + } + ] + }, + { + path: 'menu1-2', + name: 'Menu12', + component: 'views/Level/Menu12', + status: Mock.Random.integer(0, 1), + id: 10, + permission: ['edit', 'add', 'delete'], + meta: { + title: '菜单1-2', + permission: ['edit', 'add', 'delete'] + } + } + ] + }, + { + path: 'menu2', + name: 'Menu2Demo', + component: 'views/Level/Menu2', + status: Mock.Random.integer(0, 1), + id: 11, + permission: ['edit', 'add', 'delete'], + meta: { + title: '菜单2', + permission: ['edit', 'add', 'delete'] + } + } + ] + } + ], + [ + { + path: '/example', + component: '#', + redirect: '/example/example-dialog', + name: 'Example', + status: Mock.Random.integer(0, 1), + id: 12, + meta: { + title: '综合示例', + icon: 'vi-ep:management', + alwaysShow: true + }, + children: [ + { + path: 'example-detail', + component: 'views/Example/Page/ExampleDetail', + name: 'ExampleDetail', + status: Mock.Random.integer(0, 1), + id: 17, + permission: ['edit', 'add', 'delete'], + meta: { + title: '综合示例-详情', + noTagsView: true, + noCache: true, + hidden: true, + showMainRoute: true, + activeMenu: '/example/example-page', + permission: ['edit', 'add', 'delete'] + } + } + ] + } + ] +] + +for (let i = 0; i < 4; i++) { + List.push( + Mock.mock({ + id: toAnyString(), + // timestamp: +Mock.Random.date('T'), + roleName: roleNames[i], + role: '@first', + status: Mock.Random.integer(0, 1), + createTime: '@datetime', + remark: '@cword(10, 15)', + menu: menus[i] + }) + ) +} + +export default [ + // 列表接口 + { + url: '/mock/role/list', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: adminList + } + } + }, + { + url: '/mock/role/table', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: { + list: List, + total: 4 + } + } + } + }, + // 列表接口 + { + url: '/mock/role/list2', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: testList + } + } + }, + { + url: '/mock/role/table', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: { + list: List, + total: 4 + } + } + } + } +] diff --git a/mock/table/index.mock.ts b/mock/table/index.mock.ts new file mode 100644 index 0000000..a83ed14 --- /dev/null +++ b/mock/table/index.mock.ts @@ -0,0 +1,319 @@ +import Mock from 'mockjs' +import { SUCCESS_CODE } from '@/constants' +import { toAnyString } from '@/utils' + +const timeout = 1000 +const count = 100 + +const baseContent = + '

I am testing data, I am testing data.

' + +interface ListProps { + id: string + author: string + title: string + content: string + importance: number + display_time: any + pageviews: number + image_uri: string + video_uri?: string +} + +interface TreeListProps { + id: string + author: string + title: string + content: string + importance: number + display_time: any + image_uri: string + pageviews: number + video_uri?: string + children?: TreeListProps[] +} + +let List: ListProps[] = [] + +for (let i = 0; i < count; i++) { + List.push( + Mock.mock({ + id: toAnyString(), + // timestamp: +Mock.Random.date('T'), + author: '@first', + title: '@title(5, 10)', + content: baseContent, + importance: '@integer(1, 3)', + display_time: '@datetime', + pageviews: '@integer(100, 500)', + image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)'), + video_uri: + '//sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-720p.mp4' + }) + ) +} + +const treeList: TreeListProps[] = [] + +for (let i = 0; i < count; i++) { + treeList.push( + Mock.mock({ + id: toAnyString(), + // timestamp: +Mock.Random.date('T'), + author: '@first', + title: '@title(5, 10)', + content: baseContent, + importance: '@integer(1, 3)', + display_time: '@datetime', + pageviews: '@integer(300, 5000)', + image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)'), + children: [ + { + id: toAnyString(), + // timestamp: +Mock.Random.date('T'), + author: '@first', + title: '@title(5, 10)', + content: baseContent, + importance: '@integer(1, 3)', + display_time: '@datetime', + pageviews: '@integer(300, 5000)', + image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)'), + children: [ + { + id: toAnyString(), + // timestamp: +Mock.Random.date('T'), + author: '@first', + title: '@title(5, 10)', + content: baseContent, + importance: '@integer(1, 3)', + display_time: '@datetime', + pageviews: '@integer(300, 5000)', + image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)') + }, + { + id: toAnyString(), + // timestamp: +Mock.Random.date('T'), + author: '@first', + title: '@title(5, 10)', + content: baseContent, + importance: '@integer(1, 3)', + display_time: '@datetime', + pageviews: '@integer(300, 5000)', + image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)') + } + ] + }, + { + id: toAnyString(), + // timestamp: +Mock.Random.date('T'), + author: '@first', + title: '@title(5, 10)', + content: baseContent, + importance: '@integer(1, 3)', + display_time: '@datetime', + pageviews: '@integer(300, 5000)', + image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)') + }, + { + id: toAnyString(), + // timestamp: +Mock.Random.date('T'), + author: '@first', + title: '@title(5, 10)', + content: baseContent, + importance: '@integer(1, 3)', + display_time: '@datetime', + pageviews: '@integer(300, 5000)', + image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)') + }, + { + id: toAnyString(), + // timestamp: +Mock.Random.date('T'), + author: '@first', + title: '@title(5, 10)', + content: baseContent, + importance: '@integer(1, 3)', + display_time: '@datetime', + pageviews: '@integer(300, 5000)', + image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)') + } + ] + // image_uri + }) + ) +} + +const cardList = [ + { + logo: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', + name: 'Alipay', + desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' + }, + { + logo: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', + name: 'Angular', + desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' + }, + { + logo: 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', + name: 'Bootstrap', + desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' + }, + { + logo: 'https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png', + name: 'React', + desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' + }, + { + logo: 'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', + name: 'Vue', + desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' + }, + { + logo: 'https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png', + name: 'Webpack', + desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' + } +] + +export default [ + // 树形列表接口 + { + url: '/mock/example/treeList', + method: 'get', + timeout, + response: ({ query }) => { + const { title, pageIndex, pageSize } = query + const mockList = treeList.filter((item) => { + if (title && item.title.indexOf(title) < 0) return false + return true + }) + const pageList = mockList.filter( + (_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1) + ) + return { + code: SUCCESS_CODE, + data: { + total: mockList.length, + list: pageList + } + } + } + }, + // 列表接口 + { + url: '/mock/example/list', + method: 'get', + timeout, + response: ({ query }) => { + const { title, pageIndex, pageSize } = query + const mockList = List.filter((item) => { + if (title && item.title.indexOf(title) < 0) return false + return true + }) + const pageList = mockList.filter( + (_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1) + ) + return { + code: SUCCESS_CODE, + data: { + total: mockList.length, + list: pageList + } + } + } + }, + // 保存接口 + { + url: '/mock/example/save', + method: 'post', + timeout, + response: ({ body }) => { + if (!body.id) { + List = [ + Object.assign(body, { + id: toAnyString() + }) + ].concat(List) + return { + code: SUCCESS_CODE, + data: 'success' + } + } else { + List.map((item) => { + if (item.id === body.id) { + for (const key in item) { + item[key] = body[key] + } + } + }) + return { + code: SUCCESS_CODE, + data: 'success' + } + } + } + }, + // 详情接口 + { + url: '/mock/example/detail', + method: 'get', + response: ({ query }) => { + const { id } = query + for (const example of List) { + if (example.id === id) { + return { + code: SUCCESS_CODE, + data: example + } + } + } + } + }, + // 删除接口 + { + url: '/mock/example/delete', + method: 'post', + response: ({ body }) => { + const ids = body.ids + if (!ids) { + return { + code: 500, + message: '请选择需要删除的数据' + } + } else { + let i = List.length + while (i--) { + if (ids.indexOf(List[i].id) !== -1) { + List.splice(i, 1) + } + } + return { + code: SUCCESS_CODE, + data: 'success' + } + } + } + }, + { + url: '/mock/card/list', + method: 'get', + timeout, + response: ({ query }) => { + const { name, pageIndex, pageSize } = query + const mockList = cardList.filter((item) => { + if (name && item.name.indexOf(name) < 0) return false + return true + }) + const pageList = mockList.filter( + (_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1) + ) + return { + code: SUCCESS_CODE, + data: { + total: mockList.length, + list: pageList + } + } + } + } +] diff --git a/mock/user/index.mock.ts b/mock/user/index.mock.ts new file mode 100644 index 0000000..4e5918c --- /dev/null +++ b/mock/user/index.mock.ts @@ -0,0 +1,90 @@ +import { SUCCESS_CODE } from '@/constants' + +const timeout = 1000 + +const List: { + username: string + password: string + role: string + roleId: string + permissions: string | string[] +}[] = [ + { + username: 'admin', + password: 'admin', + role: 'admin', + roleId: '1', + permissions: ['*.*.*'] + }, + { + username: 'test', + password: 'test', + role: 'test', + roleId: '2', + permissions: ['example:dialog:create', 'example:dialog:delete'] + } +] + +export default [ + // 列表接口 + { + url: '/mock/user/list', + method: 'get', + response: ({ query }) => { + const { username, pageIndex, pageSize } = query + + const mockList = List.filter((item) => { + if (username && item.username.indexOf(username) < 0) return false + return true + }) + const pageList = mockList.filter( + (_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1) + ) + + return { + code: SUCCESS_CODE, + data: { + total: mockList.length, + list: pageList + } + } + } + }, + // 登录接口 + { + url: '/mock/user/login', + method: 'post', + timeout, + response: ({ body }) => { + const data = body + let hasUser = false + for (const user of List) { + if (user.username === data.username && user.password === data.password) { + hasUser = true + return { + code: SUCCESS_CODE, + data: user + } + } + } + if (!hasUser) { + return { + code: 500, + message: '账号或密码错误' + } + } + } + }, + // 退出接口 + { + url: '/mock/user/loginOut', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: null + } + } + } +] diff --git a/mock/workplace/index.mock.ts b/mock/workplace/index.mock.ts new file mode 100644 index 0000000..593ba27 --- /dev/null +++ b/mock/workplace/index.mock.ts @@ -0,0 +1,169 @@ +import { SUCCESS_CODE } from '@/constants' + +const timeout = 1000 + +export default [ + // 获取统计 + { + url: '/mock/workplace/total', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: { + project: 40, + access: 2340, + todo: 10 + } + } + } + }, + // 获取项目 + { + url: '/mock/workplace/project', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: [ + { + name: 'Github', + icon: 'akar-icons:github-fill', + message: 'workplace.introduction', + personal: 'Archer', + time: new Date() + }, + { + name: 'Vue', + icon: 'logos:vue', + message: 'workplace.introduction', + personal: 'Archer', + time: new Date() + }, + { + name: 'Angular', + icon: 'logos:angular-icon', + message: 'workplace.introduction', + personal: 'Archer', + time: new Date() + }, + { + name: 'React', + icon: 'logos:react', + message: 'workplace.introduction', + personal: 'Archer', + time: new Date() + }, + { + name: 'Webpack', + icon: 'logos:webpack', + message: 'workplace.introduction', + personal: 'Archer', + time: new Date() + }, + { + name: 'Vite', + icon: 'vscode-icons:file-type-vite', + message: 'workplace.introduction', + personal: 'Archer', + time: new Date() + } + ] + } + } + }, + // 获取动态 + { + url: '/mock/workplace/dynamic', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: [ + { + keys: ['workplace.push', 'Github'], + time: new Date() + }, + { + keys: ['workplace.push', 'Github'], + time: new Date() + }, + { + keys: ['workplace.push', 'Github'], + time: new Date() + }, + { + keys: ['workplace.push', 'Github'], + time: new Date() + }, + { + keys: ['workplace.push', 'Github'], + time: new Date() + }, + { + keys: ['workplace.push', 'Github'], + time: new Date() + } + ] + } + } + }, + // 获取团队信息 + { + url: '/mock/workplace/team', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: [ + { + name: 'Github', + icon: 'akar-icons:github-fill' + }, + { + name: 'Vue', + icon: 'logos:vue' + }, + { + name: 'Angular', + icon: 'logos:angular-icon' + }, + { + name: 'React', + icon: 'logos:react' + }, + { + name: 'Webpack', + icon: 'logos:webpack' + }, + { + name: 'Vite', + icon: 'vscode-icons:file-type-vite' + } + ] + } + } + }, + // 获取指数 + { + url: '/mock/workplace/radar', + method: 'get', + timeout, + response: () => { + return { + code: SUCCESS_CODE, + data: [ + { name: 'workplace.quote', max: 65, personal: 42, team: 50 }, + { name: 'workplace.contribution', max: 160, personal: 30, team: 140 }, + { name: 'workplace.hot', max: 300, personal: 20, team: 28 }, + { name: 'workplace.yield', max: 130, personal: 35, team: 35 }, + { name: 'workplace.follow', max: 100, personal: 80, team: 90 } + ] + } + } + } +] diff --git a/package.json b/package.json new file mode 100644 index 0000000..d452fa9 --- /dev/null +++ b/package.json @@ -0,0 +1,139 @@ +{ + "name": "vue-element-plus-admin", + "version": "2.9.0", + "description": "一套基于vue3、element-plus、typesScript、vite4的后台集成方案。", + "author": "Archer <502431556@qq.com>", + "private": false, + "type": "module", + "scripts": { + "i": "pnpm install", + "dev": "pnpm vite --mode base", + "ts:check": "pnpm vue-tsc --noEmit --skipLibCheck", + "build:pro": "pnpm vite build --mode pro", + "build:gitee": "pnpm vite build --mode gitee", + "build:dev": "pnpm vite build --mode dev", + "build:test": "pnpm vite build --mode test", + "serve:pro": "pnpm vite preview --mode pro", + "serve:dev": "pnpm vite preview --mode dev", + "serve:test": "pnpm vite preview --mode test", + "npm:check": "pnpx npm-check-updates -u", + "clean": "pnpx rimraf node_modules", + "clean:cache": "pnpx rimraf node_modules/.cache", + "lint:eslint": "eslint . --fix \"src/**/*.{js,ts,tsx,vue,html}\"", + "lint:format": "prettier --write --loglevel warn \"src/**/*.{js,ts,json,tsx,css,less,vue,html,md}\"", + "lint:style": "stylelint --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/", + "lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.cjs", + "prepare": "husky install", + "p": "plop", + "icon": "esno ./scripts/icon.ts" + }, + "dependencies": { + "@iconify/iconify": "^3.1.1", + "@iconify/vue": "^4.3.0", + "@vueuse/core": "^12.3.0", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^5.1.10", + "@zxcvbn-ts/core": "^3.0.4", + "animate.css": "^4.1.1", + "axios": "^1.7.9", + "cropperjs": "^1.6.2", + "dayjs": "^1.11.13", + "driver.js": "^1.3.1", + "echarts": "^5.6.0", + "echarts-wordcloud": "^2.1.0", + "element-plus": "2.9.2", + "lodash-es": "^4.17.21", + "mitt": "^3.0.1", + "monaco-editor": "^0.52.2", + "nprogress": "^0.2.0", + "pinia": "^2.3.0", + "pinia-plugin-persistedstate": "^4.2.0", + "qrcode": "^1.5.4", + "qs": "^6.13.1", + "url": "^0.11.4", + "vue": "3.5.13", + "vue-draggable-plus": "^0.6.0", + "vue-i18n": "11.0.1", + "vue-json-pretty": "^2.4.0", + "vue-router": "^4.5.0", + "vue-types": "^5.1.3", + "xgplayer": "^3.0.20" + }, + "devDependencies": { + "@commitlint/cli": "^19.6.1", + "@commitlint/config-conventional": "^19.6.0", + "@iconify/json": "^2.2.293", + "@intlify/unplugin-vue-i18n": "^6.0.3", + "@types/fs-extra": "^11.0.4", + "@types/inquirer": "^9.0.7", + "@types/lodash-es": "^4.17.12", + "@types/mockjs": "^1.0.10", + "@types/node": "^22.10.5", + "@types/nprogress": "^0.2.3", + "@types/qrcode": "^1.5.5", + "@types/qs": "^6.9.17", + "@types/sortablejs": "^1.15.8", + "@typescript-eslint/eslint-plugin": "^8.19.1", + "@typescript-eslint/parser": "^8.19.1", + "@unocss/transformer-variant-group": "^0.65.4", + "@vitejs/plugin-legacy": "^6.0.0", + "@vitejs/plugin-vue": "^5.2.1", + "@vitejs/plugin-vue-jsx": "^4.1.1", + "autoprefixer": "^10.4.20", + "chalk": "^5.4.1", + "consola": "^3.3.3", + "eslint": "^9.17.0", + "eslint-config-prettier": "^9.1.0", + "eslint-define-config": "^2.1.0", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-vue": "^9.32.0", + "esno": "^4.8.0", + "fs-extra": "^11.2.0", + "husky": "^9.1.7", + "inquirer": "^12.3.0", + "less": "^4.2.1", + "lint-staged": "^15.3.0", + "mockjs": "^1.1.0", + "plop": "^4.0.1", + "postcss": "^8.4.49", + "postcss-html": "^1.7.0", + "postcss-less": "^6.0.0", + "prettier": "^3.4.2", + "rimraf": "^6.0.1", + "rollup": "^4.30.1", + "rollup-plugin-visualizer": "^5.14.0", + "stylelint": "^16.12.0", + "stylelint-config-html": "^1.1.0", + "stylelint-config-recommended": "^14.0.1", + "stylelint-config-standard": "^36.0.1", + "stylelint-order": "^6.0.4", + "terser": "^5.37.0", + "typescript": "5.7.3", + "typescript-eslint": "^8.19.1", + "unocss": "^0.65.4", + "vite": "6.0.7", + "vite-plugin-ejs": "^1.7.0", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-mock": "2.9.6", + "vite-plugin-progress": "^0.0.7", + "vite-plugin-purge-icons": "^0.10.0", + "vite-plugin-style-import": "2.0.0", + "vite-plugin-svg-icons": "^2.0.1", + "vite-plugin-url-copy": "^1.1.4", + "vue-tsc": "^2.2.0" + }, + "packageManager": "pnpm@9.15.3", + "engines": { + "node": ">=18.0.0", + "pnpm": ">=8.1.0" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/kailong321200875/vue-element-plus-admin.git" + }, + "bugs": { + "url": "https://github.com/kailong321200875/vue-element-plus-admin/issues" + }, + "homepage": "https://github.com/kailong321200875/vue-element-plus-admin" +} diff --git a/plop/component/component.hbs b/plop/component/component.hbs new file mode 100644 index 0000000..21e5653 --- /dev/null +++ b/plop/component/component.hbs @@ -0,0 +1,11 @@ + + + diff --git a/plop/component/index.hbs b/plop/component/index.hbs new file mode 100644 index 0000000..aca6f0a --- /dev/null +++ b/plop/component/index.hbs @@ -0,0 +1,3 @@ +import {{ upperFirstName }} from './src/{{ upperFirstName }}.vue' + +export { {{ upperFirstName }} } diff --git a/plop/component/prompt.cjs b/plop/component/prompt.cjs new file mode 100644 index 0000000..98a852f --- /dev/null +++ b/plop/component/prompt.cjs @@ -0,0 +1,38 @@ +const toUpperCase = (str) => str.charAt(0).toUpperCase() + str.slice(1) + +module.exports = { + description: 'Create vue component', + prompts: [ + { + type: 'input', + name: 'name', + message: '请输入组件名称(Please enter the component name)' + } + ], + actions: (data) => { + const { name } = data + const upperFirstName = toUpperCase(name) + + const actions = [] + if (name) { + actions.push({ + type: 'add', + path: `./src/components/${upperFirstName}/src/${upperFirstName}.vue`, + templateFile: './plop/component/component.hbs', + data: { + name, + upperFirstName + } + }, { + type: 'add', + path: `./src/components/${upperFirstName}/index.ts`, + templateFile: './plop/component/index.hbs', + data: { + upperFirstName + } + }) + } + + return actions + } +} diff --git a/plop/view/prompt.cjs b/plop/view/prompt.cjs new file mode 100644 index 0000000..dbf324f --- /dev/null +++ b/plop/view/prompt.cjs @@ -0,0 +1,37 @@ +const toUpperCase = (str) => str.charAt(0).toUpperCase() + str.slice(1) + +module.exports = { + description: 'Create vue view', + prompts: [ + { + type: 'input', + name: 'path', + message: '请输入路径(Please enter a path)', + default: 'views' + }, + { + type: 'input', + name: 'name', + message: '请输入模块名称(Please enter module name)' + } + ], + actions: (data) => { + const { name, path } = data + const upperFirstName = toUpperCase(name) + + const actions = [] + if (name) { + actions.push({ + type: 'add', + path: `./src/${path}/${upperFirstName}.vue`, + templateFile: './plop/view/view.hbs', + data: { + name, + upperFirstName + } + }) + } + + return actions + } +} diff --git a/plop/view/view.hbs b/plop/view/view.hbs new file mode 100644 index 0000000..0ae9c15 --- /dev/null +++ b/plop/view/view.hbs @@ -0,0 +1,7 @@ + + + diff --git a/plopfile.cjs b/plopfile.cjs new file mode 100644 index 0000000..ad90fa1 --- /dev/null +++ b/plopfile.cjs @@ -0,0 +1,7 @@ +const viewGenerator = require('./plop/view/prompt.cjs') +const componentGenerator = require('./plop/component/prompt.cjs') + +module.exports = function (plop) { + plop.setGenerator('view', viewGenerator) + plop.setGenerator('component', componentGenerator) +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..f0a6f4e --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,11876 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@iconify/iconify': + specifier: ^3.1.1 + version: 3.1.1 + '@iconify/vue': + specifier: ^4.3.0 + version: 4.3.0(vue@3.5.13(typescript@5.7.3)) + '@vueuse/core': + specifier: ^12.3.0 + version: 12.3.0(typescript@5.7.3) + '@wangeditor/editor': + specifier: ^5.1.23 + version: 5.1.23 + '@wangeditor/editor-for-vue': + specifier: ^5.1.10 + version: 5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.13(typescript@5.7.3)) + '@zxcvbn-ts/core': + specifier: ^3.0.4 + version: 3.0.4 + animate.css: + specifier: ^4.1.1 + version: 4.1.1 + axios: + specifier: ^1.7.9 + version: 1.7.9 + cropperjs: + specifier: ^1.6.2 + version: 1.6.2 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + driver.js: + specifier: ^1.3.1 + version: 1.3.1 + echarts: + specifier: ^5.6.0 + version: 5.6.0 + echarts-wordcloud: + specifier: ^2.1.0 + version: 2.1.0(echarts@5.6.0) + element-plus: + specifier: 2.9.2 + version: 2.9.2(vue@3.5.13(typescript@5.7.3)) + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + mitt: + specifier: ^3.0.1 + version: 3.0.1 + monaco-editor: + specifier: ^0.52.2 + version: 0.52.2 + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + pinia: + specifier: ^2.3.0 + version: 2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)) + pinia-plugin-persistedstate: + specifier: ^4.2.0 + version: 4.2.0(pinia@2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)))(rollup@4.30.1) + qrcode: + specifier: ^1.5.4 + version: 1.5.4 + qs: + specifier: ^6.13.1 + version: 6.13.1 + url: + specifier: ^0.11.4 + version: 0.11.4 + vue: + specifier: 3.5.13 + version: 3.5.13(typescript@5.7.3) + vue-draggable-plus: + specifier: ^0.6.0 + version: 0.6.0(@types/sortablejs@1.15.8) + vue-i18n: + specifier: 11.0.1 + version: 11.0.1(vue@3.5.13(typescript@5.7.3)) + vue-json-pretty: + specifier: ^2.4.0 + version: 2.4.0(vue@3.5.13(typescript@5.7.3)) + vue-router: + specifier: ^4.5.0 + version: 4.5.0(vue@3.5.13(typescript@5.7.3)) + vue-types: + specifier: ^5.1.3 + version: 5.1.3(vue@3.5.13(typescript@5.7.3)) + xgplayer: + specifier: ^3.0.20 + version: 3.0.20(core-js@3.40.0) + devDependencies: + '@commitlint/cli': + specifier: ^19.6.1 + version: 19.6.1(@types/node@22.10.5)(typescript@5.7.3) + '@commitlint/config-conventional': + specifier: ^19.6.0 + version: 19.6.0 + '@iconify/json': + specifier: ^2.2.293 + version: 2.2.293 + '@intlify/unplugin-vue-i18n': + specifier: ^6.0.3 + version: 6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.17.0(jiti@2.4.2))(rollup@4.30.1)(typescript@5.7.3)(vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3)) + '@types/fs-extra': + specifier: ^11.0.4 + version: 11.0.4 + '@types/inquirer': + specifier: ^9.0.7 + version: 9.0.7 + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 + '@types/mockjs': + specifier: ^1.0.10 + version: 1.0.10 + '@types/node': + specifier: ^22.10.5 + version: 22.10.5 + '@types/nprogress': + specifier: ^0.2.3 + version: 0.2.3 + '@types/qrcode': + specifier: ^1.5.5 + version: 1.5.5 + '@types/qs': + specifier: ^6.9.17 + version: 6.9.17 + '@types/sortablejs': + specifier: ^1.15.8 + version: 1.15.8 + '@typescript-eslint/eslint-plugin': + specifier: ^8.19.1 + version: 8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': + specifier: ^8.19.1 + version: 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3) + '@unocss/transformer-variant-group': + specifier: ^0.65.4 + version: 0.65.4 + '@vitejs/plugin-legacy': + specifier: ^6.0.0 + version: 6.0.0(terser@5.37.0)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@vitejs/plugin-vue': + specifier: ^5.2.1 + version: 5.2.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) + '@vitejs/plugin-vue-jsx': + specifier: ^4.1.1 + version: 4.1.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.49) + chalk: + specifier: ^5.4.1 + version: 5.4.1 + consola: + specifier: ^3.3.3 + version: 3.3.3 + eslint: + specifier: ^9.17.0 + version: 9.17.0(jiti@2.4.2) + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.17.0(jiti@2.4.2)) + eslint-define-config: + specifier: ^2.1.0 + version: 2.1.0 + eslint-plugin-prettier: + specifier: ^5.2.1 + version: 5.2.1(@types/eslint@8.56.12)(eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2))(prettier@3.4.2) + eslint-plugin-vue: + specifier: ^9.32.0 + version: 9.32.0(eslint@9.17.0(jiti@2.4.2)) + esno: + specifier: ^4.8.0 + version: 4.8.0 + fs-extra: + specifier: ^11.2.0 + version: 11.2.0 + husky: + specifier: ^9.1.7 + version: 9.1.7 + inquirer: + specifier: ^12.3.0 + version: 12.3.0(@types/node@22.10.5) + less: + specifier: ^4.2.1 + version: 4.2.1 + lint-staged: + specifier: ^15.3.0 + version: 15.3.0 + mockjs: + specifier: ^1.1.0 + version: 1.1.0 + plop: + specifier: ^4.0.1 + version: 4.0.1 + postcss: + specifier: ^8.4.49 + version: 8.4.49 + postcss-html: + specifier: ^1.7.0 + version: 1.7.0 + postcss-less: + specifier: ^6.0.0 + version: 6.0.0(postcss@8.4.49) + prettier: + specifier: ^3.4.2 + version: 3.4.2 + rimraf: + specifier: ^6.0.1 + version: 6.0.1 + rollup: + specifier: ^4.30.1 + version: 4.30.1 + rollup-plugin-visualizer: + specifier: ^5.14.0 + version: 5.14.0(rollup@4.30.1) + stylelint: + specifier: ^16.12.0 + version: 16.12.0(typescript@5.7.3) + stylelint-config-html: + specifier: ^1.1.0 + version: 1.1.0(postcss-html@1.7.0)(stylelint@16.12.0(typescript@5.7.3)) + stylelint-config-recommended: + specifier: ^14.0.1 + version: 14.0.1(stylelint@16.12.0(typescript@5.7.3)) + stylelint-config-standard: + specifier: ^36.0.1 + version: 36.0.1(stylelint@16.12.0(typescript@5.7.3)) + stylelint-order: + specifier: ^6.0.4 + version: 6.0.4(stylelint@16.12.0(typescript@5.7.3)) + terser: + specifier: ^5.37.0 + version: 5.37.0 + typescript: + specifier: 5.7.3 + version: 5.7.3 + typescript-eslint: + specifier: ^8.19.1 + version: 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3) + unocss: + specifier: ^0.65.4 + version: 0.65.4(postcss@8.4.49)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) + vite: + specifier: 6.0.7 + version: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite-plugin-ejs: + specifier: ^1.7.0 + version: 1.7.0(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite-plugin-eslint: + specifier: ^1.8.1 + version: 1.8.1(eslint@9.17.0(jiti@2.4.2))(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite-plugin-mock: + specifier: 2.9.6 + version: 2.9.6(mockjs@1.1.0)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite-plugin-progress: + specifier: ^0.0.7 + version: 0.0.7(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite-plugin-purge-icons: + specifier: ^0.10.0 + version: 0.10.0(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite-plugin-style-import: + specifier: 2.0.0 + version: 2.0.0(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite-plugin-svg-icons: + specifier: ^2.0.1 + version: 2.0.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite-plugin-url-copy: + specifier: ^1.1.4 + version: 1.1.4(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vue-tsc: + specifier: ^2.2.0 + version: 2.2.0(typescript@5.7.3) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@antfu/install-pkg@0.4.1': + resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==} + + '@antfu/utils@0.7.10': + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.3': + resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.3': + resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.9': + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.26.3': + resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.3': + resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.25.9': + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.25.9': + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.25.9': + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.3': + resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.26.0': + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.25.9': + resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.25.9': + resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.25.9': + resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.25.9': + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.26.0': + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.25.9': + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.25.9': + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.25.9': + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.25.9': + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.25.9': + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.25.9': + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.26.3': + resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.25.9': + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.25.9': + resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.25.9': + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.25.9': + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.25.9': + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.25.9': + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.25.9': + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.25.9': + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.26.3': + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.25.9': + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.25.9': + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.25.9': + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9': + resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.25.9': + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.25.9': + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.25.9': + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.25.9': + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.25.9': + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.25.9': + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.25.9': + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.25.9': + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.25.9': + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.25.9': + resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.26.0': + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.25.9': + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.25.9': + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.25.9': + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.25.9': + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.25.9': + resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.25.9': + resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.26.3': + resolution: {integrity: sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.25.9': + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.25.9': + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.25.9': + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9': + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.26.0': + resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + + '@babel/standalone@7.26.4': + resolution: {integrity: sha512-SF+g7S2mhTT1b7CHyfNjDkPU1corxg4LPYsyP0x5KuCl+EbtBQHRLqr9N3q7e7+x7NQ5LYxQf8mJ2PmzebLr0A==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.4': + resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.3': + resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + engines: {node: '>=6.9.0'} + + '@commitlint/cli@19.6.1': + resolution: {integrity: sha512-8hcyA6ZoHwWXC76BoC8qVOSr8xHy00LZhZpauiD0iO0VYbVhMnED0da85lTfIULxl7Lj4c6vZgF0Wu/ed1+jlQ==} + engines: {node: '>=v18'} + hasBin: true + + '@commitlint/config-conventional@19.6.0': + resolution: {integrity: sha512-DJT40iMnTYtBtUfw9ApbsLZFke1zKh6llITVJ+x9mtpHD08gsNXaIRqHTmwTZL3dNX5+WoyK7pCN/5zswvkBCQ==} + engines: {node: '>=v18'} + + '@commitlint/config-validator@19.5.0': + resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} + engines: {node: '>=v18'} + + '@commitlint/ensure@19.5.0': + resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==} + engines: {node: '>=v18'} + + '@commitlint/execute-rule@19.5.0': + resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} + engines: {node: '>=v18'} + + '@commitlint/format@19.5.0': + resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==} + engines: {node: '>=v18'} + + '@commitlint/is-ignored@19.6.0': + resolution: {integrity: sha512-Ov6iBgxJQFR9koOupDPHvcHU9keFupDgtB3lObdEZDroiG4jj1rzky60fbQozFKVYRTUdrBGICHG0YVmRuAJmw==} + engines: {node: '>=v18'} + + '@commitlint/lint@19.6.0': + resolution: {integrity: sha512-LRo7zDkXtcIrpco9RnfhOKeg8PAnE3oDDoalnrVU/EVaKHYBWYL1DlRR7+3AWn0JiBqD8yKOfetVxJGdEtZ0tg==} + engines: {node: '>=v18'} + + '@commitlint/load@19.6.1': + resolution: {integrity: sha512-kE4mRKWWNju2QpsCWt428XBvUH55OET2N4QKQ0bF85qS/XbsRGG1MiTByDNlEVpEPceMkDr46LNH95DtRwcsfA==} + engines: {node: '>=v18'} + + '@commitlint/message@19.5.0': + resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==} + engines: {node: '>=v18'} + + '@commitlint/parse@19.5.0': + resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==} + engines: {node: '>=v18'} + + '@commitlint/read@19.5.0': + resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==} + engines: {node: '>=v18'} + + '@commitlint/resolve-extends@19.5.0': + resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} + engines: {node: '>=v18'} + + '@commitlint/rules@19.6.0': + resolution: {integrity: sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw==} + engines: {node: '>=v18'} + + '@commitlint/to-lines@19.5.0': + resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==} + engines: {node: '>=v18'} + + '@commitlint/top-level@19.5.0': + resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==} + engines: {node: '>=v18'} + + '@commitlint/types@19.5.0': + resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} + engines: {node: '>=v18'} + + '@csstools/css-parser-algorithms@3.0.4': + resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-tokenizer@3.0.3': + resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + engines: {node: '>=18'} + + '@csstools/media-query-list-parser@4.0.2': + resolution: {integrity: sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/selector-specificity@5.0.0': + resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@dual-bundle/import-meta-resolve@4.1.0': + resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} + + '@element-plus/icons-vue@2.3.1': + resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==} + peerDependencies: + vue: ^3.2.0 + + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.19.1': + resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.9.1': + resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.17.0': + resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.5': + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.4': + resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + + '@iconify/iconify@2.1.2': + resolution: {integrity: sha512-QcUzFeEWkE/mW+BVtEGmcWATClcCOIJFiYUD/PiCWuTcdEA297o8D4oN6Ra44WrNOHu1wqNW4J0ioaDIiqaFOQ==} + + '@iconify/iconify@3.1.1': + resolution: {integrity: sha512-1nemfyD/OJzh9ALepH7YfuuP8BdEB24Skhd8DXWh0hzcOxImbb1ZizSZkpCzAwSZSGcJFmscIBaBQu+yLyWaxQ==} + + '@iconify/json@2.2.293': + resolution: {integrity: sha512-eMRJNfQa+MXmE7I9noABNSVPxwsCkgmfgzeh84IKS2Su1cdQhi5FtsZa6YjEXK8y1cpbfv6pYk7KKJ6fV3mvOw==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.2.1': + resolution: {integrity: sha512-0/7J7hk4PqXmxo5PDBDxmnecw5PxklZJfNjIVG9FM0mEfVrvfudS22rYWsqVk6gR3UJ/mSYS90X4R3znXnqfNA==} + + '@iconify/vue@4.3.0': + resolution: {integrity: sha512-Xq0h6zMrHBbrW8jXJ9fISi+x8oDQllg5hTDkDuxnWiskJ63rpJu9CvJshj8VniHVTbsxCg9fVoPAaNp3RQI5OQ==} + peerDependencies: + vue: '>=3' + + '@inquirer/checkbox@4.0.4': + resolution: {integrity: sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/confirm@5.1.1': + resolution: {integrity: sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/core@10.1.2': + resolution: {integrity: sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==} + engines: {node: '>=18'} + + '@inquirer/editor@4.2.1': + resolution: {integrity: sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/expand@4.0.4': + resolution: {integrity: sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/figures@1.0.9': + resolution: {integrity: sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==} + engines: {node: '>=18'} + + '@inquirer/input@4.1.1': + resolution: {integrity: sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/number@3.0.4': + resolution: {integrity: sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/password@4.0.4': + resolution: {integrity: sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/prompts@7.2.1': + resolution: {integrity: sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/rawlist@4.0.4': + resolution: {integrity: sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/search@3.0.4': + resolution: {integrity: sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/select@4.0.4': + resolution: {integrity: sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/type@3.0.2': + resolution: {integrity: sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@intlify/bundle-utils@10.0.0': + resolution: {integrity: sha512-BR5yLOkF2dzrARTbAg7RGAIPcx9Aark7p1K/0O285F7rfzso9j2dsa+S4dA67clZ0rToZ10NSSTfbyUptVu7Bg==} + engines: {node: '>= 18'} + peerDependencies: + petite-vue-i18n: '*' + vue-i18n: '*' + peerDependenciesMeta: + petite-vue-i18n: + optional: true + vue-i18n: + optional: true + + '@intlify/core-base@11.0.1': + resolution: {integrity: sha512-NAmhw1l/llM0HZRpagR/ChJTNymW4ll6/4EDSJML5c8L5Hl/+k6UyF8EIgE6DeHpfheQujkSRngauViHqq6jJQ==} + engines: {node: '>= 16'} + + '@intlify/message-compiler@11.0.0-rc.1': + resolution: {integrity: sha512-TGw2uBfuTFTegZf/BHtUQBEKxl7Q/dVGLoqRIdw8lFsp9g/53sYn5iD+0HxIzdYjbWL6BTJMXCPUHp9PxDTRPw==} + engines: {node: '>= 16'} + + '@intlify/message-compiler@11.0.1': + resolution: {integrity: sha512-5RFH8x+Mn3mbjcHXnb6KCXGiczBdiQkWkv99iiA0JpKrNuTAQeW59Pjq/uObMB0eR0shnKYGTkIJxum+DbL3sw==} + engines: {node: '>= 16'} + + '@intlify/shared@11.0.0-rc.1': + resolution: {integrity: sha512-8tR1xe7ZEbkabTuE/tNhzpolygUn9OaYp9yuYAF4MgDNZg06C3Qny80bes2/e9/Wm3aVkPUlCw6WgU7mQd0yEg==} + engines: {node: '>= 16'} + + '@intlify/shared@11.0.1': + resolution: {integrity: sha512-lH164+aDDptHZ3dBDbIhRa1dOPQUp+83iugpc+1upTOWCnwyC1PVis6rSWNMMJ8VQxvtHQB9JMib48K55y0PvQ==} + engines: {node: '>= 16'} + + '@intlify/unplugin-vue-i18n@6.0.3': + resolution: {integrity: sha512-9ZDjBlhUHtgjRl23TVcgfJttgu8cNepwVhWvOv3mUMRDAhjW0pur1mWKEUKr1I8PNwE4Gvv2IQ1xcl4RL0nG0g==} + engines: {node: '>= 18'} + peerDependencies: + petite-vue-i18n: '*' + vue: ^3.2.25 + vue-i18n: '*' + peerDependenciesMeta: + petite-vue-i18n: + optional: true + vue-i18n: + optional: true + + '@intlify/vue-i18n-extensions@8.0.0': + resolution: {integrity: sha512-w0+70CvTmuqbskWfzeYhn0IXxllr6mU+IeM2MU0M+j9OW64jkrvqY+pYFWrUnIIC9bEdij3NICruicwd5EgUuQ==} + engines: {node: '>= 18'} + peerDependencies: + '@intlify/shared': ^9.0.0 || ^10.0.0 || ^11.0.0 + '@vue/compiler-dom': ^3.0.0 + vue: ^3.0.0 + vue-i18n: ^9.0.0 || ^10.0.0 || ^11.0.0 + peerDependenciesMeta: + '@intlify/shared': + optional: true + '@vue/compiler-dom': + optional: true + vue: + optional: true + vue-i18n: + optional: true + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=} + engines: {node: '>= 8'} + + '@nuxt/kit@3.15.1': + resolution: {integrity: sha512-7cVWjzfz3L6CsZrg6ppDZa7zGrZxCSfZjEQDIvVFn4mFKtJlK9k2izf5EewL6luzWwIQojkZAC3iq/1wtgI0Xw==} + engines: {node: '>=18.20.5'} + + '@nuxt/schema@3.15.1': + resolution: {integrity: sha512-n5kOHt8uUyUM9z4Wu/8tIZkBYh3KTCGvyruG6oD9bfeT4OaS21+X3M7XsTXFMe+eYBZA70IFFlWn1JJZIPsKeA==} + engines: {node: ^14.18.0 || >=16.10.0} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@polka/url@1.0.0-next.28': + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + + '@purge-icons/core@0.10.0': + resolution: {integrity: sha512-AtJbZv5Yy+vWX5v32DPTr+CW7AkSK8HJx52orDbrYt/9s4lGM2t4KKAmwaTQEH2HYr2HVh1mlqs54/S1s3WT1g==} + + '@purge-icons/generated@0.10.0': + resolution: {integrity: sha512-I+1yN7/yDy/eZzfhAZqKF8Z6FM8D/O1vempbPrHJ0m9HlZwvf8sWXOArPJ2qRQGB6mJUVSpaXkoGBuoz1GQX5A==} + + '@rollup/plugin-node-resolve@13.3.0': + resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^2.42.0 + + '@rollup/pluginutils@3.1.0': + resolution: {integrity: sha1-cGtFJO5tyLEDs8mVUz5a1oDAK5s=} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.30.1': + resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.30.1': + resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.30.1': + resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.30.1': + resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.30.1': + resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.30.1': + resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.30.1': + resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.30.1': + resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-s390x-gnu@4.30.1': + resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.30.1': + resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.30.1': + resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.30.1': + resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.30.1': + resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.30.1': + resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} + cpu: [x64] + os: [win32] + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@sxzz/popperjs-es@2.11.7': + resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + + '@transloadit/prettier-bytes@0.0.7': + resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==} + + '@trysound/sax@0.2.0': + resolution: {integrity: sha1-zMqrdYr1Z2Hre/N69vA/Mm3XmK0=} + engines: {node: '>=10.13.0'} + + '@types/conventional-commits-parser@5.0.1': + resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + + '@types/eslint@8.56.12': + resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} + + '@types/estree@0.0.39': + resolution: {integrity: sha1-4Xfmme4bjCLSMXTKqnQiZEOJUJ8=} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/event-emitter@0.3.5': + resolution: {integrity: sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==} + + '@types/fined@1.1.5': + resolution: {integrity: sha512-2N93vadEGDFhASTIRbizbl4bNqpMOId5zZfj6hHqYZfEzEfO9onnU4Im8xvzo8uudySDveDHBOOSlTWf38ErfQ==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/inquirer@9.0.7': + resolution: {integrity: sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/liftoff@4.0.3': + resolution: {integrity: sha512-UgbL2kR5pLrWICvr8+fuSg0u43LY250q7ZMkC+XKC3E+rs/YBDEnQIzsnhU5dYsLlwMi3R75UvCL87pObP1sxw==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.14': + resolution: {integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==} + + '@types/mockjs@1.0.10': + resolution: {integrity: sha512-SXgrhajHG7boLv6oU93CcmdDm0HYRiceuz6b+7z+/2lCJPTWDv0V5YiwFHT2ejE4bQqgSXQiVPQYPWv7LGsK1g==} + + '@types/node@10.17.60': + resolution: {integrity: sha1-NfPWIT2u2V2n8Pc+dbzGmA6QWXs=} + + '@types/node@22.10.5': + resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} + + '@types/nprogress@0.2.3': + resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} + + '@types/qrcode@1.5.5': + resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==} + + '@types/qs@6.9.17': + resolution: {integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==} + + '@types/resolve@1.17.1': + resolution: {integrity: sha1-Ov1q2JZ8d+Q3bFmKgt3Vj0bsRdY=} + + '@types/sortablejs@1.15.8': + resolution: {integrity: sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==} + + '@types/svgo@2.6.4': + resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} + + '@types/through@0.0.33': + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + + '@types/web-bluetooth@0.0.16': + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@typescript-eslint/eslint-plugin@8.19.1': + resolution: {integrity: sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/parser@8.19.1': + resolution: {integrity: sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/scope-manager@8.19.1': + resolution: {integrity: sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.19.1': + resolution: {integrity: sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/types@8.19.1': + resolution: {integrity: sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.19.1': + resolution: {integrity: sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/utils@8.19.1': + resolution: {integrity: sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/visitor-keys@8.19.1': + resolution: {integrity: sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@unocss/astro@0.65.4': + resolution: {integrity: sha512-ex1CJOQ6yeftBEPcbA9/W47/YoV+mhQnrAoc8MA1VVrvvFKDitICFU62+nSt3NWRe53XL/fXnQbcbCb8AAgKlA==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 + peerDependenciesMeta: + vite: + optional: true + + '@unocss/cli@0.65.4': + resolution: {integrity: sha512-D/4hY5Hezh3QETscl4i+ojb+q8YU9Cl9AYJ8v3gsjc/GjTmEuIOD5V4x+/aN25vY5wjqgoApOgaIDGCV3b+2Ig==} + engines: {node: '>=14'} + hasBin: true + + '@unocss/config@0.65.4': + resolution: {integrity: sha512-/vCt4AXnJ4p4Ow6xqsYwdrelF9533yhZjzkg3SQmL3rKeSkicPayKpeq8nkYECdhDI03VTCVD+6oh5Y/26Hg7A==} + engines: {node: '>=14'} + + '@unocss/core@0.65.4': + resolution: {integrity: sha512-a2JOoFutrhqd5RgPhIR5FIXrDoHDU3gwCbPrpT6KYTjsqlSc/fv02yZ+JGOZFN3MCFhCmaPTs+idDFtwb3xU8g==} + + '@unocss/extractor-arbitrary-variants@0.65.4': + resolution: {integrity: sha512-GbvTgsDaHplfWfsQtOY8RrvEZvptmvR9k9NwQ5NsZBNIG1JepYVel93CVQvsxT5KioKcoWngXxTYLNOGyxLs0g==} + + '@unocss/inspector@0.65.4': + resolution: {integrity: sha512-byg9x549Ul17U4Ety7ufDwC0UOygypoq4QnLEPzhlZ0KJG1f7WmXKYanOhupeg3h4qCj6Nc/xdZYMGbHl9QRIg==} + + '@unocss/postcss@0.65.4': + resolution: {integrity: sha512-8peDRo0+rNQsnKh/H2uZEVy67sV2cC16rAeSLpgbVJUMNfZlmF0rC2DNGsOV17uconUXSwz7+mGcHKNiv+8YlQ==} + engines: {node: '>=14'} + peerDependencies: + postcss: ^8.4.21 + + '@unocss/preset-attributify@0.65.4': + resolution: {integrity: sha512-zxE9hJJ5b37phjdzDdZsxX559ZlmH9rFlY5LVEcQySTnsfY0znviHxPbD2iRpCBCRd+YC5HfFd2jb3XlnTKMJQ==} + + '@unocss/preset-icons@0.65.4': + resolution: {integrity: sha512-5sSzTN72X2Ag3VH48xY1pYudeWnql9jqdMiwgZuLJcmvETBNGelXy2wGxm7tsUUEx/l40Yr04Ck8XRPGT9jLBw==} + + '@unocss/preset-mini@0.65.4': + resolution: {integrity: sha512-dcO2PzSl87qN1KdQWcfZDIKEhpdFeImWbYfiXtE7k6pi1393FJkdHEopgI/1ZciIQN1CkTvQJ5c7EpEVWftYRA==} + + '@unocss/preset-tagify@0.65.4': + resolution: {integrity: sha512-qll6koqdFEkvmz594vKnxj9+3nfM3ugkJxYHrTkqtwx7DAnTgtM8fInFFGZelvjwUzR3o3+Zw6uMhFkLTVTfvg==} + + '@unocss/preset-typography@0.65.4': + resolution: {integrity: sha512-Dl940ATrviWD9Vh+4fcN0QZXb6wA7al+c7QkdVAzW7I+NtdN2ELvLcN0cY22KnLRpwztzmg52Qp2J/1QnqrLTw==} + + '@unocss/preset-uno@0.65.4': + resolution: {integrity: sha512-56bdBtf476i+soQCQmT36uGzcF2z+7DGCnG1hwWiw6XAbL6gmRMQsubwi1c8z8TcTQNBsOFUnOziFil0gbWufw==} + + '@unocss/preset-web-fonts@0.65.4': + resolution: {integrity: sha512-UB/MvXHUTqMNVH1bbiKZ/ZtZUI5tsYlTYAvBrnXPO1Cztuwr8hJKSi4RCfI9g+YYtKHX4uYuxUbW5bcN85gmBQ==} + + '@unocss/preset-wind@0.65.4': + resolution: {integrity: sha512-0rbNbw5E8Lvh2yf4R1Mq+lxI/wL5Tm6+r+crE0uAAhCPe9kxPHW4k+x1cWKDIwq6Vudlm3cNX85N49wN5tYgdA==} + + '@unocss/reset@0.65.4': + resolution: {integrity: sha512-m685H0KFvVMz6R2i5GDIFv4RS9Z7y2G8hJK7xg2OWli+7w8l2ZMihYvXKofPsst4q/ms8EgKXpWc/qqUOTucvA==} + + '@unocss/rule-utils@0.65.4': + resolution: {integrity: sha512-+EzdJEWcqGcO6HwbBTe7vEdBRpuKkBiz4MycQeLD6GEio04T45y6VHHO7/WTqxltbO4YwwW9/s2TKRMxKtoG8g==} + engines: {node: '>=14'} + + '@unocss/transformer-attributify-jsx@0.65.4': + resolution: {integrity: sha512-n438EzWdTKlLCOlAUSpFjmH6FflctqzIReMzMZSJDkmkorymc+C5GpjN3Nty2cKRJXIl6Vwq0oxPuB59RT+FIw==} + + '@unocss/transformer-compile-class@0.65.4': + resolution: {integrity: sha512-n1yHDC/iIbcj/9fBUTXkSoASKfLBuRoCN7P1a0ecPc8Gu+uOGfoxafOhrlqC+tpD3hlQGoL+0h74BHSKh+L23Q==} + + '@unocss/transformer-directives@0.65.4': + resolution: {integrity: sha512-zkoDEwzPkgXi6ohW7P11gbArwfTRMZ9knYSUYoPEltQz+UZYzeRQ85exiAmdz5MsbCAuhQEr577Kd/CWfhjEuA==} + + '@unocss/transformer-variant-group@0.65.4': + resolution: {integrity: sha512-ggO6xMGeOeoD5GHS2xXBJrYFuzqyiZ25tM0zHAMJn9QU9GIu1NwWvcXluvLCF/MRIygBJGPpAE98aEICI6ifEA==} + + '@unocss/vite@0.65.4': + resolution: {integrity: sha512-02pRcVLfb5UUxMJwudnjS/0ZQdSlskjuXVHdpZpLBZCA8hhoru2uEOsPbUOBRNNMjDj6ld00pmgk/+im07M35Q==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 + + '@uppy/companion-client@2.2.2': + resolution: {integrity: sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==} + + '@uppy/core@2.3.4': + resolution: {integrity: sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==} + + '@uppy/store-default@2.1.1': + resolution: {integrity: sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==} + + '@uppy/utils@4.1.3': + resolution: {integrity: sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==} + + '@uppy/xhr-upload@2.1.3': + resolution: {integrity: sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==} + peerDependencies: + '@uppy/core': ^2.3.3 + + '@vitejs/plugin-legacy@6.0.0': + resolution: {integrity: sha512-pWt9cWaGJAKYw+67VLpN8hSP+G+yAQnrf5Pqh/NzSDKFl/4KpxTtwb5OLQezHoZOxghahO/ha3IpvblBbX/t6A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + peerDependencies: + terser: ^5.16.0 + vite: ^6.0.0 + + '@vitejs/plugin-vue-jsx@4.1.1': + resolution: {integrity: sha512-uMJqv/7u1zz/9NbWAD3XdjaY20tKTf17XVfQ9zq4wY1BjsB/PjpJPMe2xiG39QpP4ZdhYNhm4Hvo66uJrykNLA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.0.0 + + '@vitejs/plugin-vue@5.2.1': + resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.11': + resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} + + '@volar/source-map@2.4.11': + resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==} + + '@volar/typescript@2.4.11': + resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==} + + '@vue/babel-helper-vue-transform-on@1.2.5': + resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==} + + '@vue/babel-plugin-jsx@1.2.5': + resolution: {integrity: sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.2.5': + resolution: {integrity: sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/language-core@2.2.0': + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + + '@vueuse/core@12.3.0': + resolution: {integrity: sha512-cnV8QDKZrsyKC7tWjPbeEUz2cD9sa9faxF2YkR8QqNwfofgbOhmfIgvSYmkp+ttSvfOw4E6hLcQx15mRPr0yBA==} + + '@vueuse/core@9.13.0': + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + + '@vueuse/metadata@12.3.0': + resolution: {integrity: sha512-M/iQHHjMffOv2npsw2ihlUx1CTiBwPEgb7DzByLq7zpg1+Ke8r7s9p5ybUWc5OIeGewtpY4Xy0R2cKqFqM8hFg==} + + '@vueuse/metadata@9.13.0': + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + + '@vueuse/shared@12.3.0': + resolution: {integrity: sha512-X3YD35GUeW0d5Gajcwv9jdLAJTV2Jdb/Ll6Ii2JIYcKLYZqv5wxyLeKtiQkqWmHg3v0J0ZWjDUMVOw2E7RCXfA==} + + '@vueuse/shared@9.13.0': + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + + '@wangeditor/basic-modules@1.1.7': + resolution: {integrity: sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.throttle: ^4.1.1 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/code-highlight@1.0.3': + resolution: {integrity: sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/core@1.1.19': + resolution: {integrity: sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==} + peerDependencies: + '@uppy/core': ^2.1.1 + '@uppy/xhr-upload': ^2.0.3 + dom7: ^3.0.0 + is-hotkey: ^0.2.0 + lodash.camelcase: ^4.3.0 + lodash.clonedeep: ^4.5.0 + lodash.debounce: ^4.0.8 + lodash.foreach: ^4.5.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + lodash.toarray: ^4.4.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/editor-for-vue@5.1.12': + resolution: {integrity: sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==} + peerDependencies: + '@wangeditor/editor': '>=5.1.0' + vue: ^3.0.5 + + '@wangeditor/editor@5.1.23': + resolution: {integrity: sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==} + + '@wangeditor/list-module@1.0.5': + resolution: {integrity: sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/table-module@1.1.4': + resolution: {integrity: sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/upload-image-module@1.0.2': + resolution: {integrity: sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==} + peerDependencies: + '@uppy/core': ^2.0.3 + '@uppy/xhr-upload': ^2.0.3 + '@wangeditor/basic-modules': 1.x + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.foreach: ^4.5.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/video-module@1.1.4': + resolution: {integrity: sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==} + peerDependencies: + '@uppy/core': ^2.1.4 + '@uppy/xhr-upload': ^2.0.7 + '@wangeditor/core': 1.x + dom7: ^3.0.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@zxcvbn-ts/core@3.0.4': + resolution: {integrity: sha512-aQeiT0F09FuJaAqNrxynlAwZ2mW/1MdXakKWNmGM1Qp/VaY6CnB/GfnMS2T8gB2231Esp1/maCWd8vTG4OuShw==} + + JSONStream@1.3.5: + resolution: {integrity: sha1-MgjB8I06TZkmGrZPkjArwV4RHKA=} + hasBin: true + + acorn-jsx@5.3.2: + resolution: {integrity: sha1-ftW7VZCLOy8bxVxq8WU7rafweTc=} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + aggregate-error@4.0.1: + resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} + engines: {node: '>=12'} + + ajv@6.12.6: + resolution: {integrity: sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} + + animate.css@4.1.1: + resolution: {integrity: sha1-YU7FqBEx1+TcNipYFD90BqvWgHU=} + + ansi-escapes@4.3.2: + resolution: {integrity: sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4=} + engines: {node: '>=8'} + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@2.1.1: + resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=} + engines: {node: '>=0.10.0'} + + ansi-styles@4.3.0: + resolution: {integrity: sha1-7dgDYornHATIWuegkG7a00tkiTc=} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=} + + arr-diff@4.0.0: + resolution: {integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=} + engines: {node: '>=0.10.0'} + + arr-flatten@1.1.0: + resolution: {integrity: sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=} + engines: {node: '>=0.10.0'} + + arr-union@3.1.0: + resolution: {integrity: sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=} + engines: {node: '>=0.10.0'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-each@1.0.1: + resolution: {integrity: sha1-p5SvDAWrF1KEbudTofIRoFugxE8=} + engines: {node: '>=0.10.0'} + + array-ify@1.0.0: + resolution: {integrity: sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=} + + array-slice@1.1.0: + resolution: {integrity: sha1-42jqFfibxwaff/uJrsOmx9SsItQ=} + engines: {node: '>=0.10.0'} + + array-union@2.1.0: + resolution: {integrity: sha1-t5hCCtvrHego2ErNii4j0+/oXo0=} + engines: {node: '>=8'} + + array-unique@0.3.2: + resolution: {integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=} + engines: {node: '>=0.10.0'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assign-symbols@1.0.0: + resolution: {integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=} + engines: {node: '>=0.10.0'} + + astral-regex@2.0.0: + resolution: {integrity: sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=} + engines: {node: '>=8'} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} + + atob@2.1.2: + resolution: {integrity: sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=} + engines: {node: '>= 4.5.0'} + hasBin: true + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios@0.26.1: + resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} + + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + + babel-plugin-polyfill-corejs2@0.4.12: + resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.6: + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.3: + resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=} + + balanced-match@2.0.0: + resolution: {integrity: sha1-3HD5INeNuLhYU1eVhnv0j4IGM9k=} + + base64-js@1.5.1: + resolution: {integrity: sha1-GxtEAWClv3rUC2UPCVljSBkDkwo=} + + base@0.11.2: + resolution: {integrity: sha1-e95c7RRbbVUakNuH+DxVi060io8=} + engines: {node: '>=0.10.0'} + + big.js@5.2.2: + resolution: {integrity: sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha1-RRU1JkGCvsL7vIOmKrmM8R2fezo=} + + bluebird@3.7.2: + resolution: {integrity: sha1-nyKcFb4nJFT/qXOs4NvueaGww28=} + + boolbase@1.0.0: + resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} + + brace-expansion@1.1.11: + resolution: {integrity: sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=} + + brace-expansion@2.0.1: + resolution: {integrity: sha1-HtxFng8MVISG7Pn8mfIiE2S5oK4=} + + braces@2.3.2: + resolution: {integrity: sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=} + engines: {node: '>=0.10.0'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist-to-esbuild@2.1.1: + resolution: {integrity: sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + browserslist: '*' + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U=} + + buffer@5.7.1: + resolution: {integrity: sha1-umLnwTEzBTWCGXFghRqPZI6Z7tA=} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + c12@2.0.1: + resolution: {integrity: sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==} + peerDependencies: + magicast: ^0.3.5 + peerDependenciesMeta: + magicast: + optional: true + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cache-base@1.0.1: + resolution: {integrity: sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=} + engines: {node: '>=0.10.0'} + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha1-lygHKpVPgFIoIlpt7qazhGHhvVo=} + + camelcase@5.3.1: + resolution: {integrity: sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001690: + resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} + + capital-case@1.0.4: + resolution: {integrity: sha1-nRMCkjU8kkn2sA+lhSvuOKcX5mk=} + + chalk@1.1.3: + resolution: {integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=} + engines: {node: '>=0.10.0'} + + chalk@4.1.2: + resolution: {integrity: sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + change-case@4.1.2: + resolution: {integrity: sha1-/t/F8TYEXiOYwEEO5EH5VwRkHhI=} + + chardet@0.7.0: + resolution: {integrity: sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@2.0.0: + resolution: {integrity: sha1-Fb++U9LqtM9w8YqM1o6+Wzyx3s4=} + engines: {node: '>=10'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + class-utils@0.3.6: + resolution: {integrity: sha1-+TNprouafOAv1B+q0MqDAzGQxGM=} + engines: {node: '>=0.10.0'} + + clean-stack@4.2.0: + resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} + engines: {node: '>=12'} + + cli-cursor@3.1.0: + resolution: {integrity: sha1-JkMFp65JDR0Dvwybp8kl0XU68wc=} + engines: {node: '>=8'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} + + cliui@6.0.0: + resolution: {integrity: sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE=} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha1-2jCcwmPfFZlMaIypAheco8fNfH4=} + engines: {node: '>=0.8'} + + clone@2.1.2: + resolution: {integrity: sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=} + engines: {node: '>=0.8'} + + collection-visit@1.0.0: + resolution: {integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=} + engines: {node: '>=0.10.0'} + + color-convert@2.0.1: + resolution: {integrity: sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=} + engines: {node: '>= 0.8'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@13.0.0: + resolution: {integrity: sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=} + + commander@7.2.0: + resolution: {integrity: sha1-o2y1fQtQHOEI5NIFWaFQo5HZerc=} + engines: {node: '>= 10'} + + compare-func@2.0.0: + resolution: {integrity: sha1-+2XnXtvd/S5WhVTotbBf/3pR/LM=} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + + concat-map@0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + connect@3.7.0: + resolution: {integrity: sha1-XUk0iRDKpeB6AYALAw0MNfIEhPg=} + engines: {node: '>= 0.10.0'} + + consola@3.3.3: + resolution: {integrity: sha512-Qil5KwghMzlqd51UXM0b6fyaGHtOC22scxrwrz4A2882LyUMwQjnvaedN1HAeXzphspQ6CpHkzMAWxBTUruDLg==} + engines: {node: ^14.18.0 || >=16.10.0} + + console@0.7.2: + resolution: {integrity: sha1-+aQzEkkpFZG3v5v/qOIFNW8gqfA=} + + constant-case@3.0.4: + resolution: {integrity: sha1-O4Sprq9M8x7EXmv13pG9+wWJ+vE=} + + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} + + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + + copy-descriptor@0.1.1: + resolution: {integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=} + engines: {node: '>=0.10.0'} + + core-js-compat@3.40.0: + resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==} + + core-js@3.40.0: + resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} + + cors@2.8.5: + resolution: {integrity: sha1-6sEdpRWS3Ya58G9uesKTs9+HXSk=} + engines: {node: '>= 0.10'} + + cosmiconfig-typescript-loader@6.1.0: + resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} + engines: {node: '>=v18'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=9' + typescript: '>=5' + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cropperjs@1.6.2: + resolution: {integrity: sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA==} + + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-functions-list@3.2.3: + resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} + engines: {node: '>=12 || >=16'} + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-tree@1.1.3: + resolution: {integrity: sha1-60hw+2/XcHMn7JXC/yqwm16NuR0=} + engines: {node: '>=8.0.0'} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=} + engines: {node: '>=4'} + hasBin: true + + csso@4.2.0: + resolution: {integrity: sha1-6jpWE0bo3J9UbW/r7dUBh884lSk=} + engines: {node: '>=8.0.0'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + danmu.js@1.1.13: + resolution: {integrity: sha512-knFd0/cB2HA4FFWiA7eB2suc5vCvoHdqio33FyyCSfP7C+1A+zQcTvnvwfxaZhrxsGj4qaQI2I8XiTqedRaVmg==} + + dargs@8.1.0: + resolution: {integrity: sha1-o0hZ6lCcvORUheWqNW/vcL/McnI=} + engines: {node: '>=12'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + de-indent@1.0.2: + resolution: {integrity: sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=} + + debug@2.6.9: + resolution: {integrity: sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=} + engines: {node: '>=0.10.0'} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + deep-is@0.1.4: + resolution: {integrity: sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE=} + + deep-pick-omit@1.2.1: + resolution: {integrity: sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha1-P3rkIRKbyqrJvHSQXJigAJ7J7n8=} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + define-property@0.2.5: + resolution: {integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=} + engines: {node: '>=0.10.0'} + + define-property@1.0.0: + resolution: {integrity: sha1-dp66rz9KY6rTr56NMEybvnm/sOY=} + engines: {node: '>=0.10.0'} + + define-property@2.0.2: + resolution: {integrity: sha1-1Flono1lS6d+AqgX+HENcCyxbp0=} + engines: {node: '>=0.10.0'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + del@7.1.0: + resolution: {integrity: sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==} + engines: {node: '>=14.16'} + + delayed-stream@1.0.0: + resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} + engines: {node: '>=0.4.0'} + + delegate@3.2.0: + resolution: {integrity: sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=} + + destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + + detect-file@1.0.0: + resolution: {integrity: sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=} + engines: {node: '>=0.10.0'} + + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + + dir-glob@3.0.1: + resolution: {integrity: sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=} + engines: {node: '>=8'} + + dom-serializer@0.2.2: + resolution: {integrity: sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + dom7@3.0.0: + resolution: {integrity: sha1-uGHOXWemvs16qjrQKUL/FLEkAzE=} + + domelementtype@1.3.1: + resolution: {integrity: sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@2.4.2: + resolution: {integrity: sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@1.7.0: + resolution: {integrity: sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=} + + domutils@2.8.0: + resolution: {integrity: sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU=} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dot-case@3.0.4: + resolution: {integrity: sha1-mytnDQCkMWZ6inW6Kc0bmICc51E=} + + dot-prop@5.3.0: + resolution: {integrity: sha1-kMzOcIzZzYLMTcjD3dmr3VWyDog=} + engines: {node: '>=8'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + downloadjs@1.4.7: + resolution: {integrity: sha1-9p+W+UDg0FU9rCkROYZaPNAQHjw=} + + driver.js@1.3.1: + resolution: {integrity: sha512-MvUdXbqSgEsgS/H9KyWb5Rxy0aE6BhOVT4cssi2x2XjmXea6qQfgdx32XKVLLSqTaIw7q/uxU5Xl3NV7+cN6FQ==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer@0.1.2: + resolution: {integrity: sha1-Or5DrvODX4rgd9E23c4PJ2sEAOY=} + + eastasianwidth@0.2.0: + resolution: {integrity: sha1-aWzi7Aqg5uqTo5f/zySqeEDIJ8s=} + + echarts-wordcloud@2.1.0: + resolution: {integrity: sha512-Kt1JmbcROgb+3IMI48KZECK2AP5lG6bSsOEs+AsuwaWJxQom31RTNd6NFYI01E/YaI1PFZeueaupjlmzSQasjQ==} + peerDependencies: + echarts: ^5.0.1 + + echarts@5.6.0: + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} + + ee-first@1.1.1: + resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.79: + resolution: {integrity: sha512-nYOxJNxQ9Om4EC88BE4pPoNI8xwSFf8pU/BAeOl4Hh/b/i6V4biTAzwV7pXi3ARKeoYO5JZKMIXTryXSVer5RA==} + + element-plus@2.9.2: + resolution: {integrity: sha512-HS+Cc5mmy70DixJuoN3cMxPPoNWXkjHzUw2PcGmysk6NHQzzUtwi2Vc+dlmbmRxj3eNqgC1xpPQV5Nf9uDtQRg==} + peerDependencies: + vue: ^3.2.0 + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=} + + emoji-regex@9.2.2: + resolution: {integrity: sha1-hAyIA7DYBH9P8M+WMXazLU7z7XI=} + + emojis-list@3.0.0: + resolution: {integrity: sha1-VXBmIEatKeLpFucariYKvf9Pang=} + engines: {node: '>= 4'} + + encodeurl@1.0.2: + resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=} + engines: {node: '>= 0.8'} + + entities@1.1.2: + resolution: {integrity: sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=} + + entities@2.2.0: + resolution: {integrity: sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha1-QgOZ1BbOH76bwKB8Yvpo1n/Q+PI=} + engines: {node: '>=6'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + errno@0.1.8: + resolution: {integrity: sha1-i7Ppx9Rjvkl2/4iPdrSAnrwugR8=} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha1-tKxAZIEH/c3PriQvQovqihTU8b8=} + + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@0.9.3: + resolution: {integrity: sha1-bxPbAMw4QXE32vdDZvU1yOtDjxk=} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha1-p96IkUGgWpSwhUQDstCg+/qY87c=} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + esbuild@0.11.3: + resolution: {integrity: sha1-tXFluQe+T/umUfZFBTjOjYwdXrA=} + hasBin: true + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha1-RoMSa1ALYXYvLb66zhgG6L4xscg=} + engines: {node: '>=12'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-define-config@2.1.0: + resolution: {integrity: sha512-QUp6pM9pjKEVannNAbSJNeRuYwW3LshejfyBBpjeMGaJjaDUpVps4C6KVR8R7dWZnD3i0synmrE36znjTkJvdQ==} + engines: {node: '>=18.0.0', npm: '>=9.0.0', pnpm: '>=8.6.0'} + + eslint-plugin-prettier@5.2.1: + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-vue@9.32.0: + resolution: {integrity: sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.17.0: + resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + esno@4.8.0: + resolution: {integrity: sha512-acMtooReAQGzLU0zcuEDHa8S62meh5aIyi8jboYxyvAePdmuWx2Mpwmt0xjwO0bs9/SXf+dvXJ0QJoDWw814Iw==} + hasBin: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha1-eteWTWeauyi+5yzsY3WLHF0smSE=} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha1-LupSkHAvJquP5TcDcP+GyWXSESM=} + engines: {node: '>=4.0'} + + estree-walker@1.0.1: + resolution: {integrity: sha1-MbxdYSyWtwQQa0d+bdXYqhOMtwA=} + + estree-walker@2.0.2: + resolution: {integrity: sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw=} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=} + engines: {node: '>= 0.6'} + + event-emitter@0.3.5: + resolution: {integrity: sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=} + + eventemitter3@4.0.7: + resolution: {integrity: sha1-Lem2j2Uo1WRO9cWVJqG0oHMGFp8=} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + expand-brackets@2.1.4: + resolution: {integrity: sha1-t3c14xXOMPa27/D4OwQVGiJEliI=} + engines: {node: '>=0.10.0'} + + expand-tilde@2.0.2: + resolution: {integrity: sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=} + engines: {node: '>=0.10.0'} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=} + engines: {node: '>=0.10.0'} + + extend-shallow@3.0.2: + resolution: {integrity: sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=} + + external-editor@3.1.0: + resolution: {integrity: sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=} + engines: {node: '>=4'} + + extglob@2.0.4: + resolution: {integrity: sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} + + fast-uri@3.0.5: + resolution: {integrity: sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + file-entry-cache@9.1.0: + resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==} + engines: {node: '>=18'} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@4.0.0: + resolution: {integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=} + engines: {node: '>=0.10.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.1.2: + resolution: {integrity: sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=} + engines: {node: '>= 0.8'} + + find-up@4.1.0: + resolution: {integrity: sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha1-TJKBnstwg1YeT0okCoa+UZj1Nvw=} + engines: {node: '>=10'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + findup-sync@5.0.0: + resolution: {integrity: sha1-VDgK2WWn7coAzI9jETVZqtxUG9I=} + engines: {node: '>= 10.13.0'} + + fined@2.0.0: + resolution: {integrity: sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==} + engines: {node: '>= 10.13.0'} + + flagged-respawn@2.0.0: + resolution: {integrity: sha1-q/OXGdz+GsBshslGYIHFQcaCmHs=} + engines: {node: '>= 10.13.0'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flat-cache@5.0.0: + resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} + engines: {node: '>=18'} + + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha1-abRH6IoKXTLD5whPPxcQA0shN24=} + + for-in@1.0.2: + resolution: {integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=} + engines: {node: '>=0.10.0'} + + for-own@1.0.0: + resolution: {integrity: sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=} + engines: {node: '>=0.10.0'} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fragment-cache@0.2.1: + resolution: {integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=} + engines: {node: '>=0.10.0'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-minipass@2.1.0: + resolution: {integrity: sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs=} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + + get-value@2.0.6: + resolution: {integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=} + engines: {node: '>=0.10.0'} + + giget@1.2.3: + resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} + hasBin: true + + git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha1-bSN9mQg5UMeSkPJMdkKj3poo+eM=} + engines: {node: '>=10.13.0'} + + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + global-modules@1.0.0: + resolution: {integrity: sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=} + engines: {node: '>=0.10.0'} + + global-modules@2.0.0: + resolution: {integrity: sha1-mXYFrSNF8n9RU5vqJldEISFcd4A=} + engines: {node: '>=6'} + + global-prefix@1.0.2: + resolution: {integrity: sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=} + engines: {node: '>=0.10.0'} + + global-prefix@3.0.0: + resolution: {integrity: sha1-/IX3MGTfafUEIfR/iD/luRO6m5c=} + engines: {node: '>=6'} + + globals@11.12.0: + resolution: {integrity: sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} + engines: {node: '>=18'} + + globjoin@0.1.4: + resolution: {integrity: sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gzip-size@6.0.0: + resolution: {integrity: sha1-BlNn/VDCOcBnHLy61b4+LusQ5GI=} + engines: {node: '>=10'} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-ansi@2.0.0: + resolution: {integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=} + engines: {node: '>=0.10.0'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@1.0.0: + resolution: {integrity: sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=} + engines: {node: '>=0.10.0'} + + has-flag@4.0.0: + resolution: {integrity: sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-value@0.3.1: + resolution: {integrity: sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=} + engines: {node: '>=0.10.0'} + + has-value@1.0.0: + resolution: {integrity: sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=} + engines: {node: '>=0.10.0'} + + has-values@0.1.4: + resolution: {integrity: sha1-bWHeldkd/Km5oCCJrThL/49it3E=} + engines: {node: '>=0.10.0'} + + has-values@1.0.0: + resolution: {integrity: sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=} + engines: {node: '>=0.10.0'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha1-hK5l+n6vsWX922FWauFLrwVmTw8=} + hasBin: true + + header-case@2.0.4: + resolution: {integrity: sha1-WkLmO1UXc0nPQFvrjXdayruSwGM=} + + homedir-polyfill@1.0.3: + resolution: {integrity: sha1-dDKYzvTlrz4ZQWH7rcwhUdOgWOg=} + engines: {node: '>=0.10.0'} + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + + htmlparser2@3.10.1: + resolution: {integrity: sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + + i18next@20.6.1: + resolution: {integrity: sha1-U15fbluutoXH0l33DbY788wKo0U=} + + iconv-lite@0.4.24: + resolution: {integrity: sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha1-pS+AvzjaGVLrXGgXkHGYcaGnJQE=} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I=} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@6.0.2: + resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} + engines: {node: '>= 4'} + + ignore@7.0.0: + resolution: {integrity: sha512-lcX8PNQygAa22u/0BysEY8VhaFRzlOkvdlKczDPnJvrkJD1EuqzEky5VYYKM2iySIuaVIDv9N190DfSreSLw2A==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=} + engines: {node: '>=0.10.0'} + hasBin: true + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + import-fresh@3.3.0: + resolution: {integrity: sha1-NxYsJfy566oublPVtNiM4X2eDCs=} + engines: {node: '>=6'} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + importx@0.5.1: + resolution: {integrity: sha512-YrRaigAec1sC2CdIJjf/hCH1Wp9Ii8Cq5ROw4k5nJ19FVl2FcJUHZ5gGIb1vs8+JNYIyOJpc2fcufS2330bxDw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} + engines: {node: '>=0.8.19'} + + indent-string@5.0.0: + resolution: {integrity: sha1-T9KYD8yvhiLRTGTWlPTPM8gZUaU=} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + + inherits@2.0.4: + resolution: {integrity: sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=} + + ini@1.3.8: + resolution: {integrity: sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw=} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inquirer@12.3.0: + resolution: {integrity: sha512-3NixUXq+hM8ezj2wc7wC37b32/rHq1MwNZDYdvx+d6jokOD+r+i8Q4Pkylh9tISYP114A128LCX8RKhopC5RfQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + inquirer@9.3.7: + resolution: {integrity: sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==} + engines: {node: '>=18'} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + is-absolute@1.0.0: + resolution: {integrity: sha1-OV4a6EsR8mrReV5zwXN45IowFXY=} + engines: {node: '>=0.10.0'} + + is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} + + is-async-function@2.1.0: + resolution: {integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=} + engines: {node: '>=8'} + + is-boolean-object@1.2.1: + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha1-76ouqdqg16suoTqXsritUf776L4=} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + + is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao=} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha1-kAk6oxBid9inelkQ265xdH4VogA=} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha1-+uMWfHKedGP4RhzlErCApJJoqog=} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=} + engines: {node: '>=0.10.0'} + + is-hotkey@0.2.0: + resolution: {integrity: sha1-GDWmgXGpHlyUYIadljNpR8g0DO8=} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@1.0.0: + resolution: {integrity: sha1-zqbmrlyHCnsKAAQHC3tYfgJSkS4=} + engines: {node: '>=8'} + + is-interactive@2.0.0: + resolution: {integrity: sha1-QMV2FFk4JtoRAK3mBZd41ZfxbpA=} + engines: {node: '>=12'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-module@1.0.0: + resolution: {integrity: sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@3.0.0: + resolution: {integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI=} + engines: {node: '>=8'} + + is-path-cwd@3.0.0: + resolution: {integrity: sha1-iJtB5VyFiLHrKpamHQV0CmdFIcc=} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-path-inside@4.0.0: + resolution: {integrity: sha1-gFrrYsR8GxL8P9E7+z7R50MAcds=} + engines: {node: '>=12'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha1-caUMhCnfync8kqOQpKA7OfzVHT4=} + engines: {node: '>=0.10.0'} + + is-plain-object@2.0.4: + resolution: {integrity: sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=} + engines: {node: '>=0.10.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-relative@1.0.0: + resolution: {integrity: sha1-obtpNc6MXboei5dUubLcwCDiJg0=} + engines: {node: '>=0.10.0'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@3.0.0: + resolution: {integrity: sha1-5r/XqmvvafT0cs6btoHj5XtDGaw=} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-text-path@2.0.0: + resolution: {integrity: sha1-skhOK3IKYz/rLoW2fcGT/3LHVjY=} + engines: {node: '>=8'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unc-path@1.0.0: + resolution: {integrity: sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=} + engines: {node: '>=0.10.0'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc=} + engines: {node: '>=10'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-url@1.2.4: + resolution: {integrity: sha1-BKTfRtKMTP89c9Af8Gq+sxihqlI=} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.0: + resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-what@3.14.1: + resolution: {integrity: sha1-4SIvRt3ahd6tD9HJ3xMXYOd3VcE=} + + is-windows@1.0.2: + resolution: {integrity: sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE=} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + is64bit@2.0.0: + resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + engines: {node: '>=18'} + + isarray@1.0.0: + resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} + + isarray@2.0.5: + resolution: {integrity: sha1-ivHkwSISRMxiRZ+vOJQNTmRKVyM=} + + isbinaryfile@5.0.4: + resolution: {integrity: sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + + isobject@2.1.0: + resolution: {integrity: sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=} + engines: {node: '>=0.10.0'} + + isobject@3.0.1: + resolution: {integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8=} + engines: {node: '>=0.10.0'} + + jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} + engines: {node: 20 || >=22} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + js-base64@2.6.4: + resolution: {integrity: sha1-9OaGxd4eofhn28rT1G2WlCjfmMQ=} + + js-tokens@4.0.0: + resolution: {integrity: sha1-GSA/tZmR35jjoocFDUZHzerzJJk=} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha1-wftl+PUBeQHN0slRhkuhhFihBgI=} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha1-u4sJpll7pCZCXy5KByRcPQC5ND4=} + engines: {node: '>=6'} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha1-kziAKjDTtmBfvgYT4JQAjKjAWhM=} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0=} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha1-afaofZUTq4u4/mO9sJecRI5oRmA=} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-eslint-parser@2.4.0: + resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + jsonfile@6.1.0: + resolution: {integrity: sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4=} + + jsonparse@1.3.1: + resolution: {integrity: sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=} + engines: {'0': node >= 0.2.0} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@3.2.2: + resolution: {integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=} + engines: {node: '>=0.10.0'} + + kind-of@4.0.0: + resolution: {integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc=} + engines: {node: '>=0.10.0'} + + kind-of@5.1.0: + resolution: {integrity: sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=} + engines: {node: '>=0.10.0'} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + knitwork@1.2.0: + resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==} + + known-css-properties@0.35.0: + resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + less@4.2.1: + resolution: {integrity: sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg==} + engines: {node: '>=6'} + hasBin: true + + levn@0.4.1: + resolution: {integrity: sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=} + engines: {node: '>= 0.8.0'} + + liftoff@4.0.0: + resolution: {integrity: sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==} + engines: {node: '>=10.13.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha1-7KKE910pZQeTCdwK2SVauy68FjI=} + + lint-staged@15.3.0: + resolution: {integrity: sha512-vHFahytLoF2enJklgtOtCtIjZrKD/LoxlaUusd5nh7dWv/dkKQJY74ndFSzxCdv7g0ueGg1ORgTSt4Y9LPZn9A==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.2.5: + resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + engines: {node: '>=18.0.0'} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + locate-path@5.0.0: + resolution: {integrity: sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha1-VTIeswn+u8WcSAHZMackUqaB0oY=} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha1-Q+YmxG5lkbd1C+srUBFzkMYJ4+4=} + + lodash-unified@1.0.3: + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + + lodash.camelcase@4.3.0: + resolution: {integrity: sha1-soqmKIorn8ZRA1x3EfZathkDMaY=} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=} + + lodash.debounce@4.0.8: + resolution: {integrity: sha1-gteb/zCmfEAF/9XiUVMArZyk168=} + + lodash.foreach@4.5.0: + resolution: {integrity: sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=} + + lodash.get@4.4.2: + resolution: {integrity: sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=} + + lodash.isequal@4.5.0: + resolution: {integrity: sha1-QVxEePK8wwEgwizhDtMib30+GOA=} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha1-hImxyw0p/4gZXM7KRI/21swpXDY=} + + lodash.merge@4.6.2: + resolution: {integrity: sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha1-YXEh+JrFX1kEfHrsHM1mVMZZD1U=} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=} + + lodash.startcase@4.4.0: + resolution: {integrity: sha1-lDbjTtJgk+1/+uGTYUQ1CRXZrdg=} + + lodash.throttle@4.1.1: + resolution: {integrity: sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=} + + lodash.toarray@4.4.0: + resolution: {integrity: sha1-JMS/zWsvuji/0FlNsRedjptlZWE=} + + lodash.truncate@4.4.2: + resolution: {integrity: sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=} + + lodash.uniq@4.5.0: + resolution: {integrity: sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=} + + lodash@4.17.21: + resolution: {integrity: sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=} + + log-symbols@4.1.0: + resolution: {integrity: sha1-P727lbRoOsn8eFER55LlWNSr1QM=} + engines: {node: '>=10'} + + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + lower-case@2.0.2: + resolution: {integrity: sha1-b6I3xj29xKgsoP2ILkci3F5jTig=} + + lru-cache@11.0.2: + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + make-dir@2.1.0: + resolution: {integrity: sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=} + engines: {node: '>=6'} + + make-iterator@1.0.1: + resolution: {integrity: sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=} + engines: {node: '>=0.10.0'} + + map-cache@0.2.2: + resolution: {integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=} + engines: {node: '>=0.10.0'} + + map-visit@1.0.0: + resolution: {integrity: sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=} + engines: {node: '>=0.10.0'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mathml-tag-names@2.1.3: + resolution: {integrity: sha1-TdrdZzCOeAzxakdoWHjuJ7c2oKM=} + + mdn-data@2.0.14: + resolution: {integrity: sha1-cRP8QoGRfWPOKbQ0RvcB5owlulA=} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + memoize-one@6.0.0: + resolution: {integrity: sha1-slkbhx7YKUiu5HJ9xqvO7qyMEEU=} + + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + merge-options@1.0.1: + resolution: {integrity: sha1-KmSyRFe+zU5NxggoMkfpTOWJqjI=} + engines: {node: '>=4'} + + merge-stream@2.0.0: + resolution: {integrity: sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=} + + merge2@1.4.1: + resolution: {integrity: sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=} + engines: {node: '>= 8'} + + micromatch@3.1.0: + resolution: {integrity: sha1-UQLU6vILaZfWAI46z+HESj+oFeI=} + engines: {node: '>=0.10.0'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-match@1.0.2: + resolution: {integrity: sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha1-YKkFUNXLCyOcymXYk7GlOymHHsw=} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha1-6Q00Zrogm5MkUVCKEc49NjIUWTE=} + engines: {node: '>= 8'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mixin-deep@1.3.2: + resolution: {integrity: sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=} + engines: {node: '>=0.10.0'} + + mkdirp@1.0.4: + resolution: {integrity: sha1-PrXtYmInVteaXw4qIh3+utdcL34=} + engines: {node: '>=10'} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.7.3: + resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} + + mockjs@1.1.0: + resolution: {integrity: sha1-5qDDeOkZBtuv8gkRzAJzs8fXWwY=} + hasBin: true + + monaco-editor@0.52.2: + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} + + ms@2.1.3: + resolution: {integrity: sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + + namespace-emitter@2.0.1: + resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanomatch@1.2.13: + resolution: {integrity: sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=} + engines: {node: '>=0.10.0'} + + natural-compare@1.4.0: + resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} + + needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha1-tKr7k+OustgXTKU88WOrfXMIMF8=} + + next-tick@1.1.0: + resolution: {integrity: sha1-GDbuMK1W1n7ygbIr0Zn3CUSbNes=} + + no-case@3.0.4: + resolution: {integrity: sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0=} + + node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-plop@0.32.0: + resolution: {integrity: sha512-lKFSRSRuDHhwDKMUobdsvaWCbbDRbV3jMUSMiajQSQux1aNUevAZVxUHc2JERI//W8ABPRbi3ebYuSuIzkNIpQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-path@3.0.0: + resolution: {integrity: sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=} + engines: {node: '>=0.10.0'} + + normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nprogress@0.2.0: + resolution: {integrity: sha1-y480xTIT2JVyP8urkH6UIq28r7E=} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nypm@0.3.12: + resolution: {integrity: sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} + engines: {node: '>=0.10.0'} + + object-copy@0.1.0: + resolution: {integrity: sha1-fn2Fi3gb18mRpBupde04EnVOmYw=} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha1-HEfyct8nfzsdrwYWd9nILiMixg4=} + engines: {node: '>= 0.4'} + + object-visit@1.0.1: + resolution: {integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=} + engines: {node: '>=0.10.0'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.defaults@1.1.0: + resolution: {integrity: sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=} + engines: {node: '>=0.10.0'} + + object.map@1.0.1: + resolution: {integrity: sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=} + engines: {node: '>=0.10.0'} + + object.pick@1.3.0: + resolution: {integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=} + engines: {node: '>=0.10.0'} + + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + ohash@1.1.4: + resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} + + on-finished@2.3.0: + resolution: {integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + + onetime@5.1.2: + resolution: {integrity: sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha1-fCTBjtH9LpvKS9JoBqM2E8d9NLQ=} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha1-GyZ4Qmr0rEpQkAjl5KyemVnbnhg=} + engines: {node: '>=10'} + + ora@8.1.1: + resolution: {integrity: sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==} + engines: {node: '>=18'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=} + engines: {node: '>=0.10.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@2.3.0: + resolution: {integrity: sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs=} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha1-kUr2VE7TK/pUZwsGHK/L0EmEtkQ=} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@4.1.0: + resolution: {integrity: sha1-o0KLtwiLOmApL2aRkni3wpetTwc=} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha1-g8gxXGeFAF470CGDlBHJ4RDm2DQ=} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha1-PamknUk0uQEIncozAvpl3FoFwE8=} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@5.5.0: + resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} + engines: {node: '>=12'} + + p-try@2.2.0: + resolution: {integrity: sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@0.2.8: + resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} + + param-case@3.0.4: + resolution: {integrity: sha1-fRf+SqEr3jTUp32RrPtiGcqtAcU=} + + parent-module@1.0.1: + resolution: {integrity: sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=} + engines: {node: '>=6'} + + parse-filepath@1.0.2: + resolution: {integrity: sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=} + engines: {node: '>=0.8'} + + parse-json@5.2.0: + resolution: {integrity: sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80=} + engines: {node: '>=8'} + + parse-node-version@1.0.1: + resolution: {integrity: sha1-4rXb7eAOf6m8NjYH9TMn6LBzGJs=} + engines: {node: '>= 0.10'} + + parse-passwd@1.0.0: + resolution: {integrity: sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=} + engines: {node: '>=0.10.0'} + + parseurl@1.3.3: + resolution: {integrity: sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs=} + + pascalcase@0.1.1: + resolution: {integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=} + engines: {node: '>=0.10.0'} + + path-browserify@1.0.1: + resolution: {integrity: sha1-2YRUqcN1PVeQhg8W9ohnueRr4f0=} + + path-case@3.0.4: + resolution: {integrity: sha1-kWhkUzTrlCZYN1xW+AtMDLX4LG8=} + + path-exists@4.0.0: + resolution: {integrity: sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha1-pqrZSJIAsh+rMeSc8JJ35RFvuec=} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha1-KVWI3DruZBVPh3rbnXgLgcVUvxg=} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=} + + path-root-regex@0.1.2: + resolution: {integrity: sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=} + engines: {node: '>=0.10.0'} + + path-root@0.1.1: + resolution: {integrity: sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=} + engines: {node: '>=0.10.0'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-type@4.0.0: + resolution: {integrity: sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=} + engines: {node: '>=8'} + + path-type@5.0.0: + resolution: {integrity: sha1-FLAe166n3fnHw/RhgdTQT5x4W7g=} + engines: {node: '>=12'} + + pathe@0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.0: + resolution: {integrity: sha512-G7n4uhtk9qJt2hlD+UFfsIGY854wpF+zs2bUbQ3CQEUTcn7v25LRsrmurOxTo4bJgjE4qkyshd9ldsEuY9M6xg==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pify@4.0.1: + resolution: {integrity: sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=} + engines: {node: '>=6'} + + pinia-plugin-persistedstate@4.2.0: + resolution: {integrity: sha512-3buhA7ac+ssbOIx3VRCC8oHkoFwhDM9oHRCjo7nj+O8WUqnW+jRqh7eYT5eS/DNa3H28zp3dYf/nd/Vc8zj8eQ==} + peerDependencies: + '@pinia/nuxt': '>=0.9.0' + pinia: '>=2.3.0' + peerDependenciesMeta: + '@pinia/nuxt': + optional: true + pinia: + optional: true + + pinia@2.3.0: + resolution: {integrity: sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==} + peerDependencies: + typescript: '>=4.4.4' + vue: ^2.7.0 || ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + pkg-types@1.3.0: + resolution: {integrity: sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg==} + + plop@4.0.1: + resolution: {integrity: sha512-5n8QU93kvL/ObOzBcPAB1siVFtAH1TZM6TntJ3JK5kXT0jIgnQV+j+uaOWWFJlg1cNkzLYm8klgASF65K36q9w==} + engines: {node: '>=18'} + hasBin: true + + pngjs@5.0.0: + resolution: {integrity: sha1-553SshV2f9nARWHAEjbflgvOf7s=} + engines: {node: '>=10.13.0'} + + posix-character-classes@0.1.1: + resolution: {integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=} + engines: {node: '>=0.10.0'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-html@1.7.0: + resolution: {integrity: sha512-MfcMpSUIaR/nNgeVS8AyvyDugXlADjN9AcV7e5rDfrF1wduIAGSkL4q2+wgrZgA3sHVAHLDO9FuauHhZYW2nBw==} + engines: {node: ^12 || >=14} + + postcss-less@6.0.0: + resolution: {integrity: sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==} + engines: {node: '>=12'} + peerDependencies: + postcss: ^8.3.5 + + postcss-prefix-selector@1.16.1: + resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==} + peerDependencies: + postcss: '>4 <9' + + postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + + postcss-safe-parser@6.0.0: + resolution: {integrity: sha1-u0wpiUFxqUvFyZa5owMX70Aq2qE=} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.3.3 + + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-selector-parser@7.0.0: + resolution: {integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==} + engines: {node: '>=4'} + + postcss-sorting@8.0.2: + resolution: {integrity: sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==} + peerDependencies: + postcss: ^8.4.20 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@5.2.18: + resolution: {integrity: sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=} + engines: {node: '>=0.12'} + + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + + posthtml-parser@0.2.1: + resolution: {integrity: sha1-NdUw3jhnQMK6JP8usvrznM3ycd0=} + + posthtml-rename-id@1.0.12: + resolution: {integrity: sha1-z39us3FGvxr6wx5o8YxswZrmFDM=} + + posthtml-render@1.4.0: + resolution: {integrity: sha1-QBFAcMRYgcrLkzR9rj7/U6+8/xM=} + engines: {node: '>=10'} + + posthtml-svg-mode@1.0.3: + resolution: {integrity: sha1-q9VU+s6BIjyrDLNn4Y5O/SpOdLA=} + + posthtml@0.9.2: + resolution: {integrity: sha1-9MBtufZ7Yf0XxOJW5+PZUVv3Jv0=} + engines: {node: '>=0.10.0'} + + preact@10.25.4: + resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==} + + prelude-ls@1.2.1: + resolution: {integrity: sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha1-0j1B/hN1ZG3i0BBNNFSjAIgCz3s=} + engines: {node: '>=6.0.0'} + + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} + hasBin: true + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + progress@2.0.3: + resolution: {integrity: sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=} + engines: {node: '>=0.4.0'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha1-4QLxbKNVQkhldV0sno6k8k1Yw+I=} + + prr@1.0.1: + resolution: {integrity: sha1-0/wRS6BplaRexok/SEzrHXj19HY=} + + punycode@1.4.1: + resolution: {integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4=} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + + qs@6.13.1: + resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==} + engines: {node: '>=0.6'} + + query-string@4.3.4: + resolution: {integrity: sha1-u7aTucqRXCMlFbIosaArYJBD2+s=} + engines: {node: '>=0.10.0'} + + queue-microtask@1.2.3: + resolution: {integrity: sha1-SSkii7xyTfrEPg77BYyve2z7YkM=} + + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + + rd@2.0.1: + resolution: {integrity: sha1-4YqK9bL3RAwNsVI8oExuD5ZgAD8=} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=} + engines: {node: '>=8.10.0'} + + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} + + rechoir@0.8.0: + resolution: {integrity: sha1-Sfhm4NMhRhQto62PDv81KzIV/yI=} + engines: {node: '>= 10.13.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo=} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regex-not@1.0.2: + resolution: {integrity: sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=} + engines: {node: '>=0.10.0'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + + repeat-element@1.1.4: + resolution: {integrity: sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek=} + engines: {node: '>=0.10.0'} + + repeat-string@1.6.1: + resolution: {integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc=} + engines: {node: '>=0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=} + + resolve-dir@1.0.1: + resolution: {integrity: sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha1-w1IlhD3493bfIcV1V7wIfp39/Gk=} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve-url@0.2.1: + resolution: {integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha1-OfZ8VLOnpYzqUjbZXPADQjljH34=} + engines: {node: '>=8'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + ret@0.1.15: + resolution: {integrity: sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=} + engines: {node: '>=0.12'} + + reusify@1.0.4: + resolution: {integrity: sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@3.0.2: + resolution: {integrity: sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=} + hasBin: true + + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + + rollup-plugin-purge-icons@0.10.0: + resolution: {integrity: sha512-GD2ftg4L9G/sagIhtCmBn5vdyzePOisniythubpbywP0Q3ix9rZuDeFvgXTPemOsc22pvH7t22ryYQIl0rwGog==} + engines: {node: '>= 12'} + + rollup-plugin-visualizer@5.14.0: + resolution: {integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + rolldown: 1.x + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rolldown: + optional: true + rollup: + optional: true + + rollup@2.79.2: + resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} + engines: {node: '>=10.0.0'} + hasBin: true + + rollup@4.30.1: + resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-regex@1.1.0: + resolution: {integrity: sha1-QKNmnzsHfR6UPURinhV91IAjvy4=} + + safer-buffer@2.1.2: + resolution: {integrity: sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + sentence-case@3.0.4: + resolution: {integrity: sha1-NkWnuMEXx4f96HAgViJbtipFEx8=} + + set-blocking@2.0.0: + resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + set-value@2.0.1: + resolution: {integrity: sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sirv@3.0.0: + resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + engines: {node: '>=18'} + + slash@3.0.0: + resolution: {integrity: sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha1-JCI3IXbExsWt214q2oha+YSzlqc=} + engines: {node: '>=12'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slate-history@0.66.0: + resolution: {integrity: sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==} + peerDependencies: + slate: '>=0.65.3' + + slate@0.72.8: + resolution: {integrity: sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==} + + slice-ansi@4.0.0: + resolution: {integrity: sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms=} + engines: {node: '>=10'} + + slice-ansi@5.0.0: + resolution: {integrity: sha1-tzBjxXqpb5zYgWVLFSlNldKFxCo=} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + snabbdom@3.6.2: + resolution: {integrity: sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==} + engines: {node: '>=12.17.0'} + + snake-case@3.0.4: + resolution: {integrity: sha1-Tyu9Vo6ZNavf1ZPzTGkdrbScRSw=} + + snapdragon-node@2.1.1: + resolution: {integrity: sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=} + engines: {node: '>=0.10.0'} + + snapdragon-util@3.0.1: + resolution: {integrity: sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=} + engines: {node: '>=0.10.0'} + + snapdragon@0.8.2: + resolution: {integrity: sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-resolve@0.5.3: + resolution: {integrity: sha1-GQhmvs51U+H48mei7oLGBrVQmho=} + + source-map-support@0.5.21: + resolution: {integrity: sha1-BP58f54e0tZiIzwoyys1ufY/bk8=} + + source-map-url@0.4.1: + resolution: {integrity: sha1-CvZmBadFpaL5HPG7+KevvCg97FY=} + + source-map@0.5.7: + resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha1-dHIq8y6WFOnCh6jQu95IteLxomM=} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=} + + split-string@3.1.0: + resolution: {integrity: sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=} + engines: {node: '>=0.10.0'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + ssr-window@3.0.0: + resolution: {integrity: sha1-/VuCgBY4lD4MxwTEaRgBQ1r3rDc=} + + stable@0.1.8: + resolution: {integrity: sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=} + + static-extend@0.1.2: + resolution: {integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=} + engines: {node: '>=0.10.0'} + + statuses@1.5.0: + resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=} + engines: {node: '>= 0.6'} + + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + strict-uri-encode@1.1.0: + resolution: {integrity: sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=} + engines: {node: '>=0.10.0'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4=} + + strip-ansi@3.0.1: + resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha1-UolMMT+/8xiDUoCu1g/3Hr8SuP0=} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=} + engines: {node: '>=8'} + + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + + stylelint-config-html@1.1.0: + resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==} + engines: {node: ^12 || >=14} + peerDependencies: + postcss-html: ^1.0.0 + stylelint: '>=14.0.0' + + stylelint-config-recommended@14.0.1: + resolution: {integrity: sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 + + stylelint-config-standard@36.0.1: + resolution: {integrity: sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 + + stylelint-order@6.0.4: + resolution: {integrity: sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==} + peerDependencies: + stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1 + + stylelint@16.12.0: + resolution: {integrity: sha512-F8zZ3L/rBpuoBZRvI4JVT20ZanPLXfQLzMOZg1tzPflRVh9mKpOZ8qcSIhh1my3FjAjZWG4T2POwGnmn6a6hbg==} + engines: {node: '>=18.12.0'} + hasBin: true + + supports-color@2.0.0: + resolution: {integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=} + engines: {node: '>=0.8.0'} + + supports-color@3.2.3: + resolution: {integrity: sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=} + engines: {node: '>=0.8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=} + engines: {node: '>=8'} + + supports-hyperlinks@3.1.0: + resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} + engines: {node: '>=14.18'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-baker@1.7.0: + resolution: {integrity: sha1-g2f3jYdVUMUv5HVvcwPVxdfC6ac=} + + svg-tags@1.0.0: + resolution: {integrity: sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=} + + svgo@2.8.0: + resolution: {integrity: sha1-T/gMzmcQ3CeV8MfHQQHmdkz8zSQ=} + engines: {node: '>=10.13.0'} + hasBin: true + + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + + system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} + + systemjs@6.15.1: + resolution: {integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==} + + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + terser@5.37.0: + resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} + engines: {node: '>=10'} + hasBin: true + + text-extensions@2.4.0: + resolution: {integrity: sha1-oc/MUM802kG/0EfMdE+ATRaA6jQ=} + engines: {node: '>=8'} + + through@2.3.8: + resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} + + tiny-warning@1.0.3: + resolution: {integrity: sha1-lKMNtFPfTGQ9D9VmBg1gqHXYR1Q=} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + + title-case@3.0.3: + resolution: {integrity: sha1-vGibRvAuQR8dHh0IH3w97KBImYI=} + + tmp@0.0.33: + resolution: {integrity: sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=} + engines: {node: '>=0.6.0'} + + to-object-path@0.3.0: + resolution: {integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=} + engines: {node: '>=0.10.0'} + + to-regex-range@2.1.1: + resolution: {integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=} + engines: {node: '>=0.10.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=} + engines: {node: '>=8.0'} + + to-regex@3.0.2: + resolution: {integrity: sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=} + engines: {node: '>=0.10.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} + + traverse@0.6.10: + resolution: {integrity: sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==} + engines: {node: '>= 0.4'} + + ts-api-utils@2.0.0: + resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tslib@2.3.0: + resolution: {integrity: sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc=} + engines: {node: '>=10'} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typedarray.prototype.slice@1.0.5: + resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.19.1: + resolution: {integrity: sha512-LKPUQpdEMVOeKluHi8md7rwLcoXHhwvWp3x+sJkMuq3gGm9yaYJtPo8sRZSblMFJ5pcOGCAak/scKf1mvZDlQw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + unc-path-regex@0.1.2: + resolution: {integrity: sha1-5z3T17DXxe2G+6xrCufYxqadUPo=} + engines: {node: '>=0.10.0'} + + unconfig@0.6.0: + resolution: {integrity: sha512-4C67J0nIF2QwSXty2kW3zZx1pMZ3iXabylvJWWgHybWVUcMf9pxwsngoQt0gC+AVstRywFqrRBp3qOXJayhpOw==} + + unctx@2.4.1: + resolution: {integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha1-VP0W4OyxZ88Ezx91a9zJLrp5dsM=} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unimport@3.14.5: + resolution: {integrity: sha512-tn890SwFFZxqaJSKQPPd+yygfKSATbM8BZWW1aCR2TJBTs1SDrmLamBueaFtYsGjHtQaRgqEbQflOjN2iW12gA==} + + union-value@1.0.1: + resolution: {integrity: sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=} + engines: {node: '>=0.10.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unocss@0.65.4: + resolution: {integrity: sha512-KUCW5OzI20Ik6j1zXkkrpWhxZ59TwSKl6+DvmYHEzMfaEcrHlBZaFSApAoSt2CYSvo6SluGiKyr+Im1UTkd4KA==} + engines: {node: '>=14'} + peerDependencies: + '@unocss/webpack': 0.65.4 + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 + peerDependenciesMeta: + '@unocss/webpack': + optional: true + vite: + optional: true + + unpipe@1.0.0: + resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} + engines: {node: '>= 0.8'} + + unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} + + unplugin@2.1.2: + resolution: {integrity: sha512-Q3LU0e4zxKfRko1wMV2HmP8lB9KWislY7hxXpxd+lGx0PRInE4vhMBVEZwpdVYHvtqzhSrzuIfErsob6bQfCzw==} + engines: {node: '>=18.12.0'} + + unset-value@1.0.0: + resolution: {integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=} + engines: {node: '>=0.10.0'} + + untyped@1.5.2: + resolution: {integrity: sha512-eL/8PlhLcMmlMDtNPKhyyz9kEBDS3Uk4yMu/ewlkT2WFbtzScjHWPJLdQLmaGPUKjXzwe9MumOtOgc4Fro96Kg==} + hasBin: true + + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + upper-case-first@2.0.2: + resolution: {integrity: sha1-mSwyc/iCq9GdHgKJTMFHEX+EQyQ=} + + upper-case@2.0.2: + resolution: {integrity: sha1-2JgQgj+qsd8VSbfZenb4Ziuub3o=} + + uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + + uri-js@4.4.1: + resolution: {integrity: sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=} + + urix@0.1.0: + resolution: {integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=} + + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + + use@3.1.1: + resolution: {integrity: sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=} + engines: {node: '>=0.10.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} + + utils-merge@1.0.1: + resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} + engines: {node: '>= 0.4.0'} + + v8flags@4.0.1: + resolution: {integrity: sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==} + engines: {node: '>= 10.13.0'} + + vary@1.1.2: + resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} + engines: {node: '>= 0.8'} + + vite-plugin-ejs@1.7.0: + resolution: {integrity: sha512-JNP3zQDC4mSbfoJ3G73s5mmZITD8NGjUmLkq4swxyahy/W0xuokK9U9IJGXw7KCggq6UucT6hJ0p+tQrNtqTZw==} + peerDependencies: + vite: '>=5.0.0' + + vite-plugin-eslint@1.8.1: + resolution: {integrity: sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==} + peerDependencies: + eslint: '>=7' + vite: '>=2' + + vite-plugin-mock@2.9.6: + resolution: {integrity: sha512-/Rm59oPppe/ncbkSrUuAxIQihlI2YcBmnbR4ST1RA2VzM1C0tEQc1KlbQvnUGhXECAGTaQN2JyasiwXP6EtKgg==} + engines: {node: '>=12.0.0'} + peerDependencies: + mockjs: '>=1.1.0' + vite: '>=2.0.0' + + vite-plugin-progress@0.0.7: + resolution: {integrity: sha512-zyvKdcc/X+6hnw3J1HVV1TKrlFKC4Rh8GnDnWG/2qhRXjqytTcM++xZ+SAPnoDsSyWl8O93ymK0wZRgHAoglEQ==} + engines: {node: '>=14', pnpm: '>=7.0.0'} + peerDependencies: + vite: '>2.0.0-0' + + vite-plugin-purge-icons@0.10.0: + resolution: {integrity: sha512-4fMJKQuBu9lAPJWjqGEytRaxty1pP9bWgQLA68dwbbaCXu6NBrOUb/3kMaUc7TP09kerEk+qTriCk05OZXpjwA==} + engines: {node: '>= 12'} + peerDependencies: + vite: '>=2' + + vite-plugin-style-import@2.0.0: + resolution: {integrity: sha512-qtoHQae5dSUQPo/rYz/8p190VU5y19rtBaeV7ryLa/AYAU/e9CG89NrN/3+k7MR8mJy/GPIu91iJ3zk9foUOSA==} + peerDependencies: + vite: '>=2.0.0' + + vite-plugin-svg-icons@2.0.1: + resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==} + peerDependencies: + vite: '>=2.0.0' + + vite-plugin-url-copy@1.1.4: + resolution: {integrity: sha512-LuNI0RHdg3gfbyIiY4yzJaIxhq2fAapUTV31eskHIV56CxioddReH+H+bZtRkEdcgr3XkFBdetUVRzBSJjNEyg==} + peerDependencies: + vite: '>=4.0.0' + + vite@6.0.7: + resolution: {integrity: sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-draggable-plus@0.6.0: + resolution: {integrity: sha512-G5TSfHrt9tX9EjdG49InoFJbt2NYk0h3kgjgKxkFWr3ulIUays0oFObr5KZ8qzD4+QnhtALiRwIqY6qul4egqw==} + peerDependencies: + '@types/sortablejs': ^1.15.0 + '@vue/composition-api': '*' + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue-flow-layout@0.1.1: + resolution: {integrity: sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==} + peerDependencies: + vue: ^3.4.37 + + vue-i18n@11.0.1: + resolution: {integrity: sha512-pWAT8CusK8q9/EpN7V3oxwHwxWm6+Kp2PeTZmRGvdZTkUzMQDpbbmHp0TwQ8xw04XKm23cr6B4GL72y3W8Yekg==} + engines: {node: '>= 16'} + peerDependencies: + vue: ^3.0.0 + + vue-json-pretty@2.4.0: + resolution: {integrity: sha512-e9bP41DYYIc2tWaB6KuwqFJq5odZ8/GkE6vHQuGcbPn37kGk4a3n1RNw3ZYeDrl66NWXgTlOfS+M6NKkowmkWw==} + engines: {node: '>= 10.0.0', npm: '>= 5.0.0'} + peerDependencies: + vue: '>=3.0.0' + + vue-router@4.5.0: + resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==} + peerDependencies: + vue: ^3.2.0 + + vue-tsc@2.2.0: + resolution: {integrity: sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue-types@5.1.3: + resolution: {integrity: sha512-3Wy6QcZl0VusCCHX3vYrWSILFlrOB2EQDoySnuYmASM5cUp1FivJGfkS5lp1CutDgyRb41g32r/1QCmiBj5i1Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + vue: ^2.0.0 || ^3.0.0 + peerDependenciesMeta: + vue: + optional: true + + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + wcwidth@1.0.1: + resolution: {integrity: sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=} + + webidl-conversions@3.0.1: + resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=} + engines: {node: '>= 8'} + hasBin: true + + wildcard@1.1.2: + resolution: {integrity: sha1-pwIEUwhNjNLv5wup02liY94XEKU=} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=} + + wrap-ansi@6.2.0: + resolution: {integrity: sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + xgplayer-subtitles@3.0.20: + resolution: {integrity: sha512-I1bjsIY+aKOrhYQspLdneOkYg+Vf4cJVGPnDSFnNebnxXl9Mhz5SEpWGzYizMYxL9UvsQ9pgjeEY0o4hkwM+kQ==} + peerDependencies: + core-js: '>=3.12.1' + + xgplayer@3.0.20: + resolution: {integrity: sha512-UNKZJRyODOZGdka83ao8fI18xdhzOV8qG4aNEOOkuOQbXFXfXsJMr/dazRHFP+uXmTqiCXr568euee3ch7CS7g==} + peerDependencies: + core-js: '>=3.12.1' + + xml-name-validator@4.0.0: + resolution: {integrity: sha1-eaAG4uYxSahgDxVDDwpHJdFSSDU=} + engines: {node: '>=12'} + + y18n@4.0.3: + resolution: {integrity: sha1-tfJZyCzW4zaSHv17/Yv1YN6e7t8=} + + y18n@5.0.8: + resolution: {integrity: sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=} + + yallist@4.0.0: + resolution: {integrity: sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=} + + yaml-eslint-parser@1.2.3: + resolution: {integrity: sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==} + engines: {node: ^14.17.0 || >=16.0.0} + + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + engines: {node: '>= 14'} + hasBin: true + + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@18.1.3: + resolution: {integrity: sha1-vmjEl1xrKr9GkjawyHA2L6sJp7A=} + engines: {node: '>=6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@15.4.1: + resolution: {integrity: sha1-DYehbeAa7p2L7Cv7909nhRcw9Pg=} + engines: {node: '>=8'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha1-ApTrPe4FAo0x7hpfosVWpqrxChs=} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + + zrender@5.6.1: + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@antfu/install-pkg@0.4.1': + dependencies: + package-manager-detector: 0.2.8 + tinyexec: 0.3.2 + + '@antfu/utils@0.7.10': {} + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.3': {} + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.3': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.26.3 + + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.3 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.26.4 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.2.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.4.0 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.26.3 + + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helper-wrap-function@7.25.9': + dependencies: + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 + + '@babel/parser@7.26.3': + dependencies: + '@babel/types': 7.26.3 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.26.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.25.9 + + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typescript@7.26.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/preset-env@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/compat-data': 7.26.3 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.0) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.40.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.26.3 + esutils: 2.0.3 + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/standalone@7.26.4': {} + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + + '@babel/traverse@7.26.4': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.3': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@commitlint/cli@19.6.1(@types/node@22.10.5)(typescript@5.7.3)': + dependencies: + '@commitlint/format': 19.5.0 + '@commitlint/lint': 19.6.0 + '@commitlint/load': 19.6.1(@types/node@22.10.5)(typescript@5.7.3) + '@commitlint/read': 19.5.0 + '@commitlint/types': 19.5.0 + tinyexec: 0.3.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/config-conventional@19.6.0': + dependencies: + '@commitlint/types': 19.5.0 + conventional-changelog-conventionalcommits: 7.0.2 + + '@commitlint/config-validator@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + ajv: 8.17.1 + + '@commitlint/ensure@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + + '@commitlint/execute-rule@19.5.0': {} + + '@commitlint/format@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + chalk: 5.4.1 + + '@commitlint/is-ignored@19.6.0': + dependencies: + '@commitlint/types': 19.5.0 + semver: 7.6.3 + + '@commitlint/lint@19.6.0': + dependencies: + '@commitlint/is-ignored': 19.6.0 + '@commitlint/parse': 19.5.0 + '@commitlint/rules': 19.6.0 + '@commitlint/types': 19.5.0 + + '@commitlint/load@19.6.1(@types/node@22.10.5)(typescript@5.7.3)': + dependencies: + '@commitlint/config-validator': 19.5.0 + '@commitlint/execute-rule': 19.5.0 + '@commitlint/resolve-extends': 19.5.0 + '@commitlint/types': 19.5.0 + chalk: 5.4.1 + cosmiconfig: 9.0.0(typescript@5.7.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@22.10.5)(cosmiconfig@9.0.0(typescript@5.7.3))(typescript@5.7.3) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/message@19.5.0': {} + + '@commitlint/parse@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + + '@commitlint/read@19.5.0': + dependencies: + '@commitlint/top-level': 19.5.0 + '@commitlint/types': 19.5.0 + git-raw-commits: 4.0.0 + minimist: 1.2.8 + tinyexec: 0.3.2 + + '@commitlint/resolve-extends@19.5.0': + dependencies: + '@commitlint/config-validator': 19.5.0 + '@commitlint/types': 19.5.0 + global-directory: 4.0.1 + import-meta-resolve: 4.1.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + + '@commitlint/rules@19.6.0': + dependencies: + '@commitlint/ensure': 19.5.0 + '@commitlint/message': 19.5.0 + '@commitlint/to-lines': 19.5.0 + '@commitlint/types': 19.5.0 + + '@commitlint/to-lines@19.5.0': {} + + '@commitlint/top-level@19.5.0': + dependencies: + find-up: 7.0.0 + + '@commitlint/types@19.5.0': + dependencies: + '@types/conventional-commits-parser': 5.0.1 + chalk: 5.4.1 + + '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-tokenizer@3.0.3': {} + + '@csstools/media-query-list-parser@4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.0.0)': + dependencies: + postcss-selector-parser: 7.0.0 + + '@ctrl/tinycolor@3.6.1': {} + + '@dual-bundle/import-meta-resolve@4.1.0': {} + + '@element-plus/icons-vue@2.3.1(vue@3.5.13(typescript@5.7.3))': + dependencies: + vue: 3.5.13(typescript@5.7.3) + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.24.2': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-arm@0.24.2': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/android-x64@0.24.2': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.24.2': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.24.2': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.24.2': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.24.2': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.24.2': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-arm@0.24.2': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.24.2': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.24.2': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.24.2': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.24.2': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.24.2': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.24.2': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.24.2': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.24.2': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.24.2': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.24.2': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + + '@esbuild/win32-x64@0.24.2': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@2.4.2))': + dependencies: + eslint: 9.17.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.19.1': + dependencies: + '@eslint/object-schema': 2.1.5 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.9.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.2.0': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.17.0': {} + + '@eslint/object-schema@2.1.5': {} + + '@eslint/plugin-kit@0.2.4': + dependencies: + levn: 0.4.1 + + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/utils@0.2.9': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.1': {} + + '@iconify/iconify@2.1.2': + dependencies: + cross-fetch: 3.2.0 + transitivePeerDependencies: + - encoding + + '@iconify/iconify@3.1.1': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/json@2.2.293': + dependencies: + '@iconify/types': 2.0.0 + pathe: 1.1.2 + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.2.1': + dependencies: + '@antfu/install-pkg': 0.4.1 + '@antfu/utils': 0.7.10 + '@iconify/types': 2.0.0 + debug: 4.4.0 + globals: 15.14.0 + kolorist: 1.8.0 + local-pkg: 0.5.1 + mlly: 1.7.3 + transitivePeerDependencies: + - supports-color + + '@iconify/vue@4.3.0(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@iconify/types': 2.0.0 + vue: 3.5.13(typescript@5.7.3) + + '@inquirer/checkbox@4.0.4(@types/node@22.10.5)': + dependencies: + '@inquirer/core': 10.1.2(@types/node@22.10.5) + '@inquirer/figures': 1.0.9 + '@inquirer/type': 3.0.2(@types/node@22.10.5) + '@types/node': 22.10.5 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/confirm@5.1.1(@types/node@22.10.5)': + dependencies: + '@inquirer/core': 10.1.2(@types/node@22.10.5) + '@inquirer/type': 3.0.2(@types/node@22.10.5) + '@types/node': 22.10.5 + + '@inquirer/core@10.1.2(@types/node@22.10.5)': + dependencies: + '@inquirer/figures': 1.0.9 + '@inquirer/type': 3.0.2(@types/node@22.10.5) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + transitivePeerDependencies: + - '@types/node' + + '@inquirer/editor@4.2.1(@types/node@22.10.5)': + dependencies: + '@inquirer/core': 10.1.2(@types/node@22.10.5) + '@inquirer/type': 3.0.2(@types/node@22.10.5) + '@types/node': 22.10.5 + external-editor: 3.1.0 + + '@inquirer/expand@4.0.4(@types/node@22.10.5)': + dependencies: + '@inquirer/core': 10.1.2(@types/node@22.10.5) + '@inquirer/type': 3.0.2(@types/node@22.10.5) + '@types/node': 22.10.5 + yoctocolors-cjs: 2.1.2 + + '@inquirer/figures@1.0.9': {} + + '@inquirer/input@4.1.1(@types/node@22.10.5)': + dependencies: + '@inquirer/core': 10.1.2(@types/node@22.10.5) + '@inquirer/type': 3.0.2(@types/node@22.10.5) + '@types/node': 22.10.5 + + '@inquirer/number@3.0.4(@types/node@22.10.5)': + dependencies: + '@inquirer/core': 10.1.2(@types/node@22.10.5) + '@inquirer/type': 3.0.2(@types/node@22.10.5) + '@types/node': 22.10.5 + + '@inquirer/password@4.0.4(@types/node@22.10.5)': + dependencies: + '@inquirer/core': 10.1.2(@types/node@22.10.5) + '@inquirer/type': 3.0.2(@types/node@22.10.5) + '@types/node': 22.10.5 + ansi-escapes: 4.3.2 + + '@inquirer/prompts@7.2.1(@types/node@22.10.5)': + dependencies: + '@inquirer/checkbox': 4.0.4(@types/node@22.10.5) + '@inquirer/confirm': 5.1.1(@types/node@22.10.5) + '@inquirer/editor': 4.2.1(@types/node@22.10.5) + '@inquirer/expand': 4.0.4(@types/node@22.10.5) + '@inquirer/input': 4.1.1(@types/node@22.10.5) + '@inquirer/number': 3.0.4(@types/node@22.10.5) + '@inquirer/password': 4.0.4(@types/node@22.10.5) + '@inquirer/rawlist': 4.0.4(@types/node@22.10.5) + '@inquirer/search': 3.0.4(@types/node@22.10.5) + '@inquirer/select': 4.0.4(@types/node@22.10.5) + '@types/node': 22.10.5 + + '@inquirer/rawlist@4.0.4(@types/node@22.10.5)': + dependencies: + '@inquirer/core': 10.1.2(@types/node@22.10.5) + '@inquirer/type': 3.0.2(@types/node@22.10.5) + '@types/node': 22.10.5 + yoctocolors-cjs: 2.1.2 + + '@inquirer/search@3.0.4(@types/node@22.10.5)': + dependencies: + '@inquirer/core': 10.1.2(@types/node@22.10.5) + '@inquirer/figures': 1.0.9 + '@inquirer/type': 3.0.2(@types/node@22.10.5) + '@types/node': 22.10.5 + yoctocolors-cjs: 2.1.2 + + '@inquirer/select@4.0.4(@types/node@22.10.5)': + dependencies: + '@inquirer/core': 10.1.2(@types/node@22.10.5) + '@inquirer/figures': 1.0.9 + '@inquirer/type': 3.0.2(@types/node@22.10.5) + '@types/node': 22.10.5 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/type@3.0.2(@types/node@22.10.5)': + dependencies: + '@types/node': 22.10.5 + + '@intlify/bundle-utils@10.0.0(vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3)))': + dependencies: + '@intlify/message-compiler': 11.0.0-rc.1 + '@intlify/shared': 11.0.0-rc.1 + acorn: 8.14.0 + escodegen: 2.1.0 + estree-walker: 2.0.2 + jsonc-eslint-parser: 2.4.0 + mlly: 1.7.3 + source-map-js: 1.2.1 + yaml-eslint-parser: 1.2.3 + optionalDependencies: + vue-i18n: 11.0.1(vue@3.5.13(typescript@5.7.3)) + + '@intlify/core-base@11.0.1': + dependencies: + '@intlify/message-compiler': 11.0.1 + '@intlify/shared': 11.0.1 + + '@intlify/message-compiler@11.0.0-rc.1': + dependencies: + '@intlify/shared': 11.0.0-rc.1 + source-map-js: 1.2.1 + + '@intlify/message-compiler@11.0.1': + dependencies: + '@intlify/shared': 11.0.1 + source-map-js: 1.2.1 + + '@intlify/shared@11.0.0-rc.1': {} + + '@intlify/shared@11.0.1': {} + + '@intlify/unplugin-vue-i18n@6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.17.0(jiti@2.4.2))(rollup@4.30.1)(typescript@5.7.3)(vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.2)) + '@intlify/bundle-utils': 10.0.0(vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3))) + '@intlify/shared': 11.0.1 + '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.0.1)(@vue/compiler-dom@3.5.13)(vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3)) + '@rollup/pluginutils': 5.1.4(rollup@4.30.1) + '@typescript-eslint/scope-manager': 8.19.1 + '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.3) + debug: 4.4.0 + fast-glob: 3.3.3 + js-yaml: 4.1.0 + json5: 2.2.3 + pathe: 1.1.2 + picocolors: 1.1.1 + source-map-js: 1.2.1 + unplugin: 1.16.1 + vue: 3.5.13(typescript@5.7.3) + optionalDependencies: + vue-i18n: 11.0.1(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - '@vue/compiler-dom' + - eslint + - rollup + - supports-color + - typescript + + '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.0.1)(@vue/compiler-dom@3.5.13)(vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@babel/parser': 7.26.3 + optionalDependencies: + '@intlify/shared': 11.0.1 + '@vue/compiler-dom': 3.5.13 + vue: 3.5.13(typescript@5.7.3) + vue-i18n: 11.0.1(vue@3.5.13(typescript@5.7.3)) + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.18.0 + + '@nuxt/kit@3.15.1(rollup@4.30.1)': + dependencies: + '@nuxt/schema': 3.15.1 + c12: 2.0.1 + consola: 3.3.3 + defu: 6.1.4 + destr: 2.0.3 + globby: 14.0.2 + ignore: 7.0.0 + jiti: 2.4.2 + klona: 2.0.6 + knitwork: 1.2.0 + mlly: 1.7.3 + ohash: 1.1.4 + pathe: 2.0.0 + pkg-types: 1.3.0 + scule: 1.3.0 + semver: 7.6.3 + ufo: 1.5.4 + unctx: 2.4.1 + unimport: 3.14.5(rollup@4.30.1) + untyped: 1.5.2 + transitivePeerDependencies: + - magicast + - rollup + - supports-color + + '@nuxt/schema@3.15.1': + dependencies: + consola: 3.3.3 + defu: 6.1.4 + pathe: 2.0.0 + std-env: 3.8.0 + + '@pkgr/core@0.1.1': {} + + '@polka/url@1.0.0-next.28': {} + + '@purge-icons/core@0.10.0': + dependencies: + '@iconify/iconify': 2.1.2 + axios: 0.26.1(debug@4.4.0) + debug: 4.4.0 + fast-glob: 3.3.3 + fs-extra: 10.1.0 + transitivePeerDependencies: + - encoding + - supports-color + + '@purge-icons/generated@0.10.0': + dependencies: + '@iconify/iconify': 3.1.1 + + '@rollup/plugin-node-resolve@13.3.0(rollup@4.30.1)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@4.30.1) + '@types/resolve': 1.17.1 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.10 + rollup: 4.30.1 + + '@rollup/pluginutils@3.1.0(rollup@4.30.1)': + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 4.30.1 + + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + + '@rollup/pluginutils@5.1.4(rollup@4.30.1)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.30.1 + + '@rollup/rollup-android-arm-eabi@4.30.1': + optional: true + + '@rollup/rollup-android-arm64@4.30.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.30.1': + optional: true + + '@rollup/rollup-darwin-x64@4.30.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.30.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.30.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.30.1': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.30.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.30.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.30.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.30.1': + optional: true + + '@sindresorhus/merge-streams@2.3.0': {} + + '@sxzz/popperjs-es@2.11.7': {} + + '@transloadit/prettier-bytes@0.0.7': {} + + '@trysound/sax@0.2.0': {} + + '@types/conventional-commits-parser@5.0.1': + dependencies: + '@types/node': 22.10.5 + + '@types/eslint@8.56.12': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + + '@types/estree@0.0.39': {} + + '@types/estree@1.0.6': {} + + '@types/event-emitter@0.3.5': {} + + '@types/fined@1.1.5': {} + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 22.10.5 + + '@types/inquirer@9.0.7': + dependencies: + '@types/through': 0.0.33 + rxjs: 7.8.1 + + '@types/json-schema@7.0.15': {} + + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 22.10.5 + + '@types/liftoff@4.0.3': + dependencies: + '@types/fined': 1.1.5 + '@types/node': 22.10.5 + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.14 + + '@types/lodash@4.17.14': {} + + '@types/mockjs@1.0.10': {} + + '@types/node@10.17.60': {} + + '@types/node@22.10.5': + dependencies: + undici-types: 6.20.0 + + '@types/nprogress@0.2.3': {} + + '@types/qrcode@1.5.5': + dependencies: + '@types/node': 22.10.5 + + '@types/qs@6.9.17': {} + + '@types/resolve@1.17.1': + dependencies: + '@types/node': 22.10.5 + + '@types/sortablejs@1.15.8': {} + + '@types/svgo@2.6.4': + dependencies: + '@types/node': 22.10.5 + + '@types/through@0.0.33': + dependencies: + '@types/node': 22.10.5 + + '@types/web-bluetooth@0.0.16': {} + + '@types/web-bluetooth@0.0.20': {} + + '@typescript-eslint/eslint-plugin@8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.19.1 + '@typescript-eslint/type-utils': 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.19.1 + eslint: 9.17.0(jiti@2.4.2) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.19.1 + '@typescript-eslint/types': 8.19.1 + '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.19.1 + debug: 4.4.0 + eslint: 9.17.0(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.19.1': + dependencies: + '@typescript-eslint/types': 8.19.1 + '@typescript-eslint/visitor-keys': 8.19.1 + + '@typescript-eslint/type-utils@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.3) + '@typescript-eslint/utils': 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3) + debug: 4.4.0 + eslint: 9.17.0(jiti@2.4.2) + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.19.1': {} + + '@typescript-eslint/typescript-estree@8.19.1(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 8.19.1 + '@typescript-eslint/visitor-keys': 8.19.1 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.19.1 + '@typescript-eslint/types': 8.19.1 + '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.3) + eslint: 9.17.0(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.19.1': + dependencies: + '@typescript-eslint/types': 8.19.1 + eslint-visitor-keys: 4.2.0 + + '@unocss/astro@0.65.4(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@unocss/core': 0.65.4 + '@unocss/reset': 0.65.4 + '@unocss/vite': 0.65.4(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) + optionalDependencies: + vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + transitivePeerDependencies: + - rollup + - supports-color + - vue + + '@unocss/cli@0.65.4(rollup@4.30.1)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.4(rollup@4.30.1) + '@unocss/config': 0.65.4 + '@unocss/core': 0.65.4 + '@unocss/preset-uno': 0.65.4 + cac: 6.7.14 + chokidar: 3.6.0 + colorette: 2.0.20 + consola: 3.3.3 + magic-string: 0.30.17 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + tinyglobby: 0.2.10 + transitivePeerDependencies: + - rollup + - supports-color + + '@unocss/config@0.65.4': + dependencies: + '@unocss/core': 0.65.4 + unconfig: 0.6.0 + transitivePeerDependencies: + - supports-color + + '@unocss/core@0.65.4': {} + + '@unocss/extractor-arbitrary-variants@0.65.4': + dependencies: + '@unocss/core': 0.65.4 + + '@unocss/inspector@0.65.4(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@unocss/core': 0.65.4 + '@unocss/rule-utils': 0.65.4 + colorette: 2.0.20 + gzip-size: 6.0.0 + sirv: 3.0.0 + vue-flow-layout: 0.1.1(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - vue + + '@unocss/postcss@0.65.4(postcss@8.4.49)': + dependencies: + '@unocss/config': 0.65.4 + '@unocss/core': 0.65.4 + '@unocss/rule-utils': 0.65.4 + css-tree: 3.1.0 + postcss: 8.4.49 + tinyglobby: 0.2.10 + transitivePeerDependencies: + - supports-color + + '@unocss/preset-attributify@0.65.4': + dependencies: + '@unocss/core': 0.65.4 + + '@unocss/preset-icons@0.65.4': + dependencies: + '@iconify/utils': 2.2.1 + '@unocss/core': 0.65.4 + ofetch: 1.4.1 + transitivePeerDependencies: + - supports-color + + '@unocss/preset-mini@0.65.4': + dependencies: + '@unocss/core': 0.65.4 + '@unocss/extractor-arbitrary-variants': 0.65.4 + '@unocss/rule-utils': 0.65.4 + + '@unocss/preset-tagify@0.65.4': + dependencies: + '@unocss/core': 0.65.4 + + '@unocss/preset-typography@0.65.4': + dependencies: + '@unocss/core': 0.65.4 + '@unocss/preset-mini': 0.65.4 + + '@unocss/preset-uno@0.65.4': + dependencies: + '@unocss/core': 0.65.4 + '@unocss/preset-mini': 0.65.4 + '@unocss/preset-wind': 0.65.4 + '@unocss/rule-utils': 0.65.4 + + '@unocss/preset-web-fonts@0.65.4': + dependencies: + '@unocss/core': 0.65.4 + ofetch: 1.4.1 + + '@unocss/preset-wind@0.65.4': + dependencies: + '@unocss/core': 0.65.4 + '@unocss/preset-mini': 0.65.4 + '@unocss/rule-utils': 0.65.4 + + '@unocss/reset@0.65.4': {} + + '@unocss/rule-utils@0.65.4': + dependencies: + '@unocss/core': 0.65.4 + magic-string: 0.30.17 + + '@unocss/transformer-attributify-jsx@0.65.4': + dependencies: + '@unocss/core': 0.65.4 + + '@unocss/transformer-compile-class@0.65.4': + dependencies: + '@unocss/core': 0.65.4 + + '@unocss/transformer-directives@0.65.4': + dependencies: + '@unocss/core': 0.65.4 + '@unocss/rule-utils': 0.65.4 + css-tree: 3.1.0 + + '@unocss/transformer-variant-group@0.65.4': + dependencies: + '@unocss/core': 0.65.4 + + '@unocss/vite@0.65.4(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.4(rollup@4.30.1) + '@unocss/config': 0.65.4 + '@unocss/core': 0.65.4 + '@unocss/inspector': 0.65.4(vue@3.5.13(typescript@5.7.3)) + chokidar: 3.6.0 + magic-string: 0.30.17 + tinyglobby: 0.2.10 + vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + transitivePeerDependencies: + - rollup + - supports-color + - vue + + '@uppy/companion-client@2.2.2': + dependencies: + '@uppy/utils': 4.1.3 + namespace-emitter: 2.0.1 + + '@uppy/core@2.3.4': + dependencies: + '@transloadit/prettier-bytes': 0.0.7 + '@uppy/store-default': 2.1.1 + '@uppy/utils': 4.1.3 + lodash.throttle: 4.1.1 + mime-match: 1.0.2 + namespace-emitter: 2.0.1 + nanoid: 3.3.8 + preact: 10.25.4 + + '@uppy/store-default@2.1.1': {} + + '@uppy/utils@4.1.3': + dependencies: + lodash.throttle: 4.1.1 + + '@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4)': + dependencies: + '@uppy/companion-client': 2.2.2 + '@uppy/core': 2.3.4 + '@uppy/utils': 4.1.3 + nanoid: 3.3.8 + + '@vitejs/plugin-legacy@6.0.0(terser@5.37.0)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + dependencies: + '@babel/core': 7.26.0 + '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + browserslist: 4.24.4 + browserslist-to-esbuild: 2.1.1(browserslist@4.24.4) + core-js: 3.40.0 + magic-string: 0.30.17 + regenerator-runtime: 0.14.1 + systemjs: 6.15.1 + terser: 5.37.0 + vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue-jsx@4.1.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0) + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0) + vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vue: 3.5.13(typescript@5.7.3) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@5.2.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))': + dependencies: + vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vue: 3.5.13(typescript@5.7.3) + + '@volar/language-core@2.4.11': + dependencies: + '@volar/source-map': 2.4.11 + + '@volar/source-map@2.4.11': {} + + '@volar/typescript@2.4.11': + dependencies: + '@volar/language-core': 2.4.11 + path-browserify: 1.0.1 + vscode-uri: 3.0.8 + + '@vue/babel-helper-vue-transform-on@1.2.5': {} + + '@vue/babel-plugin-jsx@1.2.5(@babel/core@7.26.0)': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + '@vue/babel-helper-vue-transform-on': 1.2.5 + '@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.26.0) + html-tags: 3.3.1 + svg-tags: 1.0.0 + optionalDependencies: + '@babel/core': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.26.0)': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/parser': 7.26.3 + '@vue/compiler-sfc': 3.5.13 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.26.3 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.26.3 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.4.49 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/devtools-api@6.6.4': {} + + '@vue/language-core@2.2.0(typescript@5.7.3)': + dependencies: + '@volar/language-core': 2.4.11 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.13 + alien-signals: 0.4.14 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.7.3 + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.7.3) + + '@vue/shared@3.5.13': {} + + '@vueuse/core@12.3.0(typescript@5.7.3)': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 12.3.0 + '@vueuse/shared': 12.3.0(typescript@5.7.3) + vue: 3.5.13(typescript@5.7.3) + transitivePeerDependencies: + - typescript + + '@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.5.13(typescript@5.7.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@12.3.0': {} + + '@vueuse/metadata@9.13.0': {} + + '@vueuse/shared@12.3.0(typescript@5.7.3)': + dependencies: + vue: 3.5.13(typescript@5.7.3) + transitivePeerDependencies: + - typescript + + '@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.7.3))': + dependencies: + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + is-url: 1.2.4 + lodash.throttle: 4.1.1 + nanoid: 3.3.8 + slate: 0.72.8 + snabbdom: 3.6.2 + + '@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + prismjs: 1.29.0 + slate: 0.72.8 + snabbdom: 3.6.2 + + '@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)': + dependencies: + '@types/event-emitter': 0.3.5 + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + dom7: 3.0.0 + event-emitter: 0.3.5 + html-void-elements: 2.0.1 + i18next: 20.6.1 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 3.3.8 + scroll-into-view-if-needed: 2.2.31 + slate: 0.72.8 + slate-history: 0.66.0(slate@0.72.8) + snabbdom: 3.6.2 + + '@wangeditor/editor-for-vue@5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@wangeditor/editor': 5.1.23 + vue: 3.5.13(typescript@5.7.3) + + '@wangeditor/editor@5.1.23': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/code-highlight': 1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/list-module': 1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/table-module': 1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/upload-image-module': 1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/video-module': 1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 3.3.8 + slate: 0.72.8 + snabbdom: 3.6.2 + + '@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + slate: 0.72.8 + snabbdom: 3.6.2 + + '@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + nanoid: 3.3.8 + slate: 0.72.8 + snabbdom: 3.6.2 + + '@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2)': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + lodash.foreach: 4.5.0 + slate: 0.72.8 + snabbdom: 3.6.2 + + '@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + nanoid: 3.3.8 + slate: 0.72.8 + snabbdom: 3.6.2 + + '@zxcvbn-ts/core@3.0.4': + dependencies: + fastest-levenshtein: 1.0.16 + + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + aggregate-error@4.0.1: + dependencies: + clean-stack: 4.2.0 + indent-string: 5.0.0 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.5 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + alien-signals@0.4.14: {} + + animate.css@4.1.1: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@2.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@2.2.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@2.0.1: {} + + arr-diff@4.0.0: {} + + arr-flatten@1.1.0: {} + + arr-union@3.1.0: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + is-array-buffer: 3.0.5 + + array-each@1.0.1: {} + + array-ify@1.0.0: {} + + array-slice@1.1.0: {} + + array-union@2.1.0: {} + + array-unique@0.3.2: {} + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + is-array-buffer: 3.0.5 + + assign-symbols@1.0.0: {} + + astral-regex@2.0.0: {} + + async-validator@4.2.5: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + atob@2.1.2: {} + + autoprefixer@10.4.20(postcss@8.4.49): + dependencies: + browserslist: 4.24.4 + caniuse-lite: 1.0.30001690 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + axios@0.26.1(debug@4.4.0): + dependencies: + follow-redirects: 1.15.9(debug@4.4.0) + transitivePeerDependencies: + - debug + + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9(debug@4.4.0) + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): + dependencies: + '@babel/compat-data': 7.26.3 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.40.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + balanced-match@1.0.2: {} + + balanced-match@2.0.0: {} + + base64-js@1.5.1: {} + + base@0.11.2: + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bluebird@3.7.2: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@2.3.2: + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist-to-esbuild@2.1.1(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + meow: 13.2.0 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.79 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builtin-modules@3.3.0: {} + + bundle-require@5.1.0(esbuild@0.24.2): + dependencies: + esbuild: 0.24.2 + load-tsconfig: 0.2.5 + + c12@2.0.1: + dependencies: + chokidar: 4.0.3 + confbox: 0.1.8 + defu: 6.1.4 + dotenv: 16.4.7 + giget: 1.2.3 + jiti: 2.4.2 + mlly: 1.7.3 + ohash: 1.1.4 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.3.0 + rc9: 2.1.2 + + cac@6.7.14: {} + + cache-base@1.0.1: + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + + callsites@3.1.0: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + + camelcase@5.3.1: {} + + caniuse-lite@1.0.30001690: {} + + capital-case@1.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + upper-case-first: 2.0.2 + + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + change-case@4.1.2: + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.8.1 + + chardet@0.7.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.0.2 + + chownr@2.0.0: {} + + citty@0.1.6: + dependencies: + consola: 3.3.3 + + class-utils@0.3.6: + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + + clean-stack@4.2.0: + dependencies: + escape-string-regexp: 5.0.0 + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cli-width@4.1.0: {} + + clipboardy@4.0.0: + dependencies: + execa: 8.0.1 + is-wsl: 3.1.0 + is64bit: 2.0.0 + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: {} + + clone@2.1.2: {} + + collection-visit@1.0.0: + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colord@2.9.3: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@12.1.0: {} + + commander@13.0.0: {} + + commander@2.20.3: {} + + commander@7.2.0: {} + + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + + component-emitter@1.3.1: {} + + compute-scroll-into-view@1.0.20: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + + consola@3.3.3: {} + + console@0.7.2: {} + + constant-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + upper-case: 2.0.2 + + conventional-changelog-angular@7.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-conventionalcommits@7.0.2: + dependencies: + compare-func: 2.0.0 + + conventional-commits-parser@5.0.0: + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + + convert-source-map@2.0.0: {} + + copy-anything@2.0.6: + dependencies: + is-what: 3.14.1 + + copy-descriptor@0.1.1: {} + + core-js-compat@3.40.0: + dependencies: + browserslist: 4.24.4 + + core-js@3.40.0: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig-typescript-loader@6.1.0(@types/node@22.10.5)(cosmiconfig@9.0.0(typescript@5.7.3))(typescript@5.7.3): + dependencies: + '@types/node': 22.10.5 + cosmiconfig: 9.0.0(typescript@5.7.3) + jiti: 2.4.2 + typescript: 5.7.3 + + cosmiconfig@9.0.0(typescript@5.7.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.7.3 + + cropperjs@1.6.2: {} + + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-functions-list@3.2.3: {} + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + csso@4.2.0: + dependencies: + css-tree: 1.1.3 + + csstype@3.1.3: {} + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + danmu.js@1.1.13: + dependencies: + event-emitter: 0.3.5 + + dargs@8.1.0: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + dayjs@1.11.13: {} + + de-indent@1.0.2: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} + + decode-uri-component@0.2.2: {} + + deep-is@0.1.4: {} + + deep-pick-omit@1.2.1: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + define-property@0.2.5: + dependencies: + is-descriptor: 0.1.7 + + define-property@1.0.0: + dependencies: + is-descriptor: 1.0.3 + + define-property@2.0.2: + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + + defu@6.1.4: {} + + del@7.1.0: + dependencies: + globby: 13.2.2 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 3.0.0 + is-path-inside: 4.0.0 + p-map: 5.5.0 + rimraf: 3.0.2 + slash: 4.0.0 + + delayed-stream@1.0.0: {} + + delegate@3.2.0: {} + + destr@2.0.3: {} + + detect-file@1.0.0: {} + + dijkstrajs@1.0.3: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dom-serializer@0.2.2: + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + dom7@3.0.0: + dependencies: + ssr-window: 3.0.0 + + domelementtype@1.3.1: {} + + domelementtype@2.3.0: {} + + domhandler@2.4.2: + dependencies: + domelementtype: 1.3.1 + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@1.7.0: + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + dotenv@16.4.7: {} + + downloadjs@1.4.7: {} + + driver.js@1.3.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + echarts-wordcloud@2.1.0(echarts@5.6.0): + dependencies: + echarts: 5.6.0 + + echarts@5.6.0: + dependencies: + tslib: 2.3.0 + zrender: 5.6.1 + + ee-first@1.1.1: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-to-chromium@1.5.79: {} + + element-plus@2.9.2(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@ctrl/tinycolor': 3.6.1 + '@element-plus/icons-vue': 2.3.1(vue@3.5.13(typescript@5.7.3)) + '@floating-ui/dom': 1.6.13 + '@popperjs/core': '@sxzz/popperjs-es@2.11.7' + '@types/lodash': 4.17.14 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.7.3)) + async-validator: 4.2.5 + dayjs: 1.11.13 + escape-html: 1.0.3 + lodash: 4.17.21 + lodash-es: 4.17.21 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.5.13(typescript@5.7.3) + transitivePeerDependencies: + - '@vue/composition-api' + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojis-list@3.0.0: {} + + encodeurl@1.0.2: {} + + entities@1.1.2: {} + + entities@2.2.0: {} + + entities@4.5.0: {} + + env-paths@2.2.1: {} + + environment@1.1.0: {} + + errno@0.1.8: + dependencies: + prr: 1.0.1 + optional: true + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.9: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.0 + math-intrinsics: 1.1.0 + object-inspect: 1.13.3 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@0.9.3: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + esbuild@0.11.3: {} + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + esbuild@0.24.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.2)): + dependencies: + eslint: 9.17.0(jiti@2.4.2) + + eslint-define-config@2.1.0: {} + + eslint-plugin-prettier@5.2.1(@types/eslint@8.56.12)(eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2))(prettier@3.4.2): + dependencies: + eslint: 9.17.0(jiti@2.4.2) + prettier: 3.4.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.2 + optionalDependencies: + '@types/eslint': 8.56.12 + eslint-config-prettier: 9.1.0(eslint@9.17.0(jiti@2.4.2)) + + eslint-plugin-vue@9.32.0(eslint@9.17.0(jiti@2.4.2)): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.2)) + eslint: 9.17.0(jiti@2.4.2) + globals: 13.24.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.6.3 + vue-eslint-parser: 9.4.3(eslint@9.17.0(jiti@2.4.2)) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.17.0(jiti@2.4.2): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.1 + '@eslint/core': 0.9.1 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.17.0 + '@eslint/plugin-kit': 0.2.4 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.2 + transitivePeerDependencies: + - supports-color + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + esno@4.8.0: + dependencies: + tsx: 4.19.2 + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + + espree@9.6.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@1.0.1: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + eventemitter3@4.0.7: {} + + eventemitter3@5.0.1: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + expand-brackets@2.1.4: + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + expand-tilde@2.0.2: + dependencies: + homedir-polyfill: 1.0.3 + + ext@1.7.0: + dependencies: + type: 2.7.3 + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend-shallow@3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + extend@3.0.2: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + extglob@2.0.4: + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.5: {} + + fastest-levenshtein@1.0.16: {} + + fastq@1.18.0: + dependencies: + reusify: 1.0.4 + + fdir@6.4.2(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + file-entry-cache@9.1.0: + dependencies: + flat-cache: 5.0.0 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + fill-range@4.0.0: + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + + findup-sync@5.0.0: + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.8 + resolve-dir: 1.0.1 + + fined@2.0.0: + dependencies: + expand-tilde: 2.0.2 + is-plain-object: 5.0.0 + object.defaults: 1.1.0 + object.pick: 1.3.0 + parse-filepath: 1.0.2 + + flagged-respawn@2.0.0: {} + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + + flat-cache@5.0.0: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + + flatted@3.3.2: {} + + follow-redirects@1.15.9(debug@4.4.0): + optionalDependencies: + debug: 4.4.0 + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + for-in@1.0.2: {} + + for-own@1.0.0: + dependencies: + for-in: 1.0.2 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fraction.js@4.3.7: {} + + fragment-cache@0.2.1: + dependencies: + map-cache: 0.2.2 + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.3.0: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.0.0 + + get-stream@8.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + + get-tsconfig@4.8.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + get-value@2.0.6: {} + + giget@1.2.3: + dependencies: + citty: 0.1.6 + consola: 3.3.3 + defu: 6.1.4 + node-fetch-native: 1.6.4 + nypm: 0.3.12 + ohash: 1.1.4 + pathe: 1.1.2 + tar: 6.2.1 + + git-raw-commits@4.0.0: + dependencies: + dargs: 8.1.0 + meow: 12.1.1 + split2: 4.2.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@11.0.0: + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.2 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + + global-modules@1.0.0: + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@1.0.2: + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@14.0.0: {} + + globals@15.14.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 4.0.0 + + globby@14.0.2: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 5.3.2 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + + globjoin@0.1.4: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + + has-bigints@1.1.0: {} + + has-flag@1.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + has-value@0.3.1: + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + + has-value@1.0.0: + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + + has-values@0.1.4: {} + + has-values@1.0.0: + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + header-case@2.0.4: + dependencies: + capital-case: 1.0.4 + tslib: 2.8.1 + + homedir-polyfill@1.0.3: + dependencies: + parse-passwd: 1.0.0 + + html-tags@3.3.1: {} + + html-void-elements@2.0.1: {} + + htmlparser2@3.10.1: + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + human-signals@5.0.0: {} + + husky@9.1.7: {} + + i18next@20.6.1: + dependencies: + '@babel/runtime': 7.26.0 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + ignore@6.0.2: {} + + ignore@7.0.0: {} + + image-size@0.5.5: {} + + immer@9.0.21: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@4.1.0: {} + + importx@0.5.1: + dependencies: + bundle-require: 5.1.0(esbuild@0.24.2) + debug: 4.4.0 + esbuild: 0.24.2 + jiti: 2.4.2 + pathe: 1.1.2 + tsx: 4.19.2 + transitivePeerDependencies: + - supports-color + + imurmurhash@0.1.4: {} + + indent-string@5.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@4.1.1: {} + + inquirer@12.3.0(@types/node@22.10.5): + dependencies: + '@inquirer/core': 10.1.2(@types/node@22.10.5) + '@inquirer/prompts': 7.2.1(@types/node@22.10.5) + '@inquirer/type': 3.0.2(@types/node@22.10.5) + '@types/node': 22.10.5 + ansi-escapes: 4.3.2 + mute-stream: 2.0.0 + run-async: 3.0.0 + rxjs: 7.8.1 + + inquirer@9.3.7: + dependencies: + '@inquirer/figures': 1.0.9 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + external-editor: 3.1.0 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + interpret@3.1.1: {} + + is-absolute@1.0.0: + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + + is-accessor-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-descriptor@0.1.7: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-descriptor@1.0.3: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.3 + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.3.0 + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hotkey@0.2.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@1.0.0: {} + + is-interactive@2.0.0: {} + + is-map@2.0.3: {} + + is-module@1.0.0: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-number@3.0.0: + dependencies: + kind-of: 3.2.2 + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-path-cwd@3.0.0: {} + + is-path-inside@4.0.0: {} + + is-plain-obj@1.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-plain-object@5.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-relative@1.0.0: + dependencies: + is-unc-path: 1.0.0 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.3 + + is-stream@3.0.0: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-text-path@2.0.0: + dependencies: + text-extensions: 2.4.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + + is-unc-path@1.0.0: + dependencies: + unc-path-regex: 0.1.2 + + is-unicode-supported@0.1.0: {} + + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + + is-url@1.2.4: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.0: + dependencies: + call-bound: 1.0.3 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + + is-what@3.14.1: {} + + is-windows@1.0.2: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + is64bit@2.0.0: + dependencies: + system-architecture: 0.1.0 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isbinaryfile@5.0.4: {} + + isexe@2.0.0: {} + + isobject@2.1.0: + dependencies: + isarray: 1.0.0 + + isobject@3.0.1: {} + + jackspeak@4.0.2: + dependencies: + '@isaacs/cliui': 8.0.2 + + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jiti@2.4.2: {} + + js-base64@2.6.4: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.0.2: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsonc-eslint-parser@2.4.0: + dependencies: + acorn: 8.14.0 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + semver: 7.6.3 + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonparse@1.3.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kind-of@4.0.0: + dependencies: + is-buffer: 1.1.6 + + kind-of@5.1.0: {} + + kind-of@6.0.3: {} + + klona@2.0.6: {} + + knitwork@1.2.0: {} + + known-css-properties@0.35.0: {} + + kolorist@1.8.0: {} + + less@4.2.1: + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.8.1 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.3.1 + source-map: 0.6.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + liftoff@4.0.0: + dependencies: + extend: 3.0.2 + findup-sync: 5.0.0 + fined: 2.0.0 + flagged-respawn: 2.0.0 + is-plain-object: 5.0.0 + object.map: 1.0.1 + rechoir: 0.8.0 + resolve: 1.22.10 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + lint-staged@15.3.0: + dependencies: + chalk: 5.4.1 + commander: 12.1.0 + debug: 4.4.0 + execa: 8.0.1 + lilconfig: 3.1.3 + listr2: 8.2.5 + micromatch: 4.0.8 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.6.1 + transitivePeerDependencies: + - supports-color + + listr2@8.2.5: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + load-tsconfig@0.2.5: {} + + loader-utils@1.4.2: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + + local-pkg@0.5.1: + dependencies: + mlly: 1.7.3 + pkg-types: 1.3.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash-es@4.17.21: {} + + lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.17.21 + lodash-es: 4.17.21 + + lodash.camelcase@4.3.0: {} + + lodash.clonedeep@4.5.0: {} + + lodash.debounce@4.0.8: {} + + lodash.foreach@4.5.0: {} + + lodash.get@4.4.2: {} + + lodash.isequal@4.5.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.kebabcase@4.1.1: {} + + lodash.merge@4.6.2: {} + + lodash.mergewith@4.6.2: {} + + lodash.snakecase@4.1.1: {} + + lodash.startcase@4.4.0: {} + + lodash.throttle@4.1.1: {} + + lodash.toarray@4.4.0: {} + + lodash.truncate@4.4.2: {} + + lodash.uniq@4.5.0: {} + + lodash.upperfirst@4.3.1: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-symbols@6.0.0: + dependencies: + chalk: 5.4.1 + is-unicode-supported: 1.3.0 + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@11.0.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.25.9: + dependencies: + sourcemap-codec: 1.4.8 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + optional: true + + make-iterator@1.0.1: + dependencies: + kind-of: 6.0.3 + + map-cache@0.2.2: {} + + map-visit@1.0.0: + dependencies: + object-visit: 1.0.1 + + math-intrinsics@1.1.0: {} + + mathml-tag-names@2.1.3: {} + + mdn-data@2.0.14: {} + + mdn-data@2.12.2: {} + + memoize-one@6.0.0: {} + + meow@12.1.1: {} + + meow@13.2.0: {} + + merge-options@1.0.1: + dependencies: + is-plain-obj: 1.1.0 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@3.1.0: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 1.0.0 + extend-shallow: 2.0.1 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 5.1.0 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-match@1.0.2: + dependencies: + wildcard: 1.1.2 + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: + optional: true + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mitt@3.0.1: {} + + mixin-deep@1.3.2: + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + + mkdirp@1.0.4: {} + + mkdirp@3.0.1: {} + + mlly@1.7.3: + dependencies: + acorn: 8.14.0 + pathe: 1.1.2 + pkg-types: 1.3.0 + ufo: 1.5.4 + + mockjs@1.1.0: + dependencies: + commander: 13.0.0 + + monaco-editor@0.52.2: {} + + mrmime@2.0.0: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + mute-stream@1.0.0: {} + + mute-stream@2.0.0: {} + + namespace-emitter@2.0.1: {} + + nanoid@3.3.8: {} + + nanomatch@1.2.13: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + natural-compare@1.4.0: {} + + needle@3.3.1: + dependencies: + iconv-lite: 0.6.3 + sax: 1.4.1 + optional: true + + neo-async@2.6.2: {} + + next-tick@1.1.0: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-fetch-native@1.6.4: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-plop@0.32.0: + dependencies: + '@types/inquirer': 9.0.7 + change-case: 4.1.2 + del: 7.1.0 + globby: 13.2.2 + handlebars: 4.7.8 + inquirer: 9.3.7 + isbinaryfile: 5.0.4 + lodash.get: 4.4.2 + lower-case: 2.0.2 + mkdirp: 3.0.1 + resolve: 1.22.10 + title-case: 3.0.3 + upper-case: 2.0.2 + + node-releases@2.0.19: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + normalize-wheel-es@1.2.0: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nypm@0.3.12: + dependencies: + citty: 0.1.6 + consola: 3.3.3 + execa: 8.0.1 + pathe: 1.1.2 + pkg-types: 1.3.0 + ufo: 1.5.4 + + object-assign@4.1.1: {} + + object-copy@0.1.0: + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + + object-inspect@1.13.3: {} + + object-keys@1.1.1: {} + + object-visit@1.0.1: + dependencies: + isobject: 3.0.1 + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.defaults@1.1.0: + dependencies: + array-each: 1.0.1 + array-slice: 1.1.0 + for-own: 1.0.0 + isobject: 3.0.1 + + object.map@1.0.1: + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + + object.pick@1.3.0: + dependencies: + isobject: 3.0.1 + + ofetch@1.4.1: + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.4 + + ohash@1.1.4: {} + + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + ora@8.1.1: + dependencies: + chalk: 5.4.1 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + os-tmpdir@1.0.2: {} + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@5.5.0: + dependencies: + aggregate-error: 4.0.1 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + package-manager-detector@0.2.8: {} + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-filepath@1.0.2: + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-node-version@1.0.1: {} + + parse-passwd@1.0.0: {} + + parseurl@1.3.3: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + pascalcase@0.1.1: {} + + path-browserify@1.0.1: {} + + path-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-root-regex@0.1.2: {} + + path-root@0.1.1: + dependencies: + path-root-regex: 0.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.2 + minipass: 7.1.2 + + path-to-regexp@6.3.0: {} + + path-type@4.0.0: {} + + path-type@5.0.0: {} + + pathe@0.2.0: {} + + pathe@1.1.2: {} + + pathe@2.0.0: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pidtree@0.6.0: {} + + pify@4.0.1: + optional: true + + pinia-plugin-persistedstate@4.2.0(pinia@2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)))(rollup@4.30.1): + dependencies: + '@nuxt/kit': 3.15.1(rollup@4.30.1) + deep-pick-omit: 1.2.1 + defu: 6.1.4 + destr: 2.0.3 + optionalDependencies: + pinia: 2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - magicast + - rollup + - supports-color + + pinia@2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.13(typescript@5.7.3) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - '@vue/composition-api' + + pkg-types@1.3.0: + dependencies: + confbox: 0.1.8 + mlly: 1.7.3 + pathe: 1.1.2 + + plop@4.0.1: + dependencies: + '@types/liftoff': 4.0.3 + chalk: 5.4.1 + interpret: 3.1.1 + liftoff: 4.0.0 + minimist: 1.2.8 + node-plop: 0.32.0 + ora: 8.1.1 + v8flags: 4.0.1 + + pngjs@5.0.0: {} + + posix-character-classes@0.1.1: {} + + possible-typed-array-names@1.0.0: {} + + postcss-html@1.7.0: + dependencies: + htmlparser2: 8.0.2 + js-tokens: 9.0.1 + postcss: 8.4.49 + postcss-safe-parser: 6.0.0(postcss@8.4.49) + + postcss-less@6.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + + postcss-prefix-selector@1.16.1(postcss@5.2.18): + dependencies: + postcss: 5.2.18 + + postcss-resolve-nested-selector@0.1.6: {} + + postcss-safe-parser@6.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + + postcss-safe-parser@7.0.1(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.0.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-sorting@8.0.2(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + + postcss-value-parser@4.2.0: {} + + postcss@5.2.18: + dependencies: + chalk: 1.1.3 + js-base64: 2.6.4 + source-map: 0.5.7 + supports-color: 3.2.3 + + postcss@8.4.49: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + posthtml-parser@0.2.1: + dependencies: + htmlparser2: 3.10.1 + isobject: 2.1.0 + + posthtml-rename-id@1.0.12: + dependencies: + escape-string-regexp: 1.0.5 + + posthtml-render@1.4.0: {} + + posthtml-svg-mode@1.0.3: + dependencies: + merge-options: 1.0.1 + posthtml: 0.9.2 + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + + posthtml@0.9.2: + dependencies: + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + + preact@10.25.4: {} + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.4.2: {} + + prismjs@1.29.0: {} + + progress@2.0.3: {} + + proxy-from-env@1.1.0: {} + + prr@1.0.1: + optional: true + + punycode@1.4.1: {} + + punycode@2.3.1: {} + + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + qs@6.13.1: + dependencies: + side-channel: 1.1.0 + + query-string@4.3.4: + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + + queue-microtask@1.2.3: {} + + rc9@2.1.2: + dependencies: + defu: 6.1.4 + destr: 2.0.3 + + rd@2.0.1: + dependencies: + '@types/node': 10.17.60 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.0.2: {} + + rechoir@0.8.0: + dependencies: + resolve: 1.22.10 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.14.1: {} + + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.26.0 + + regex-not@1.0.2: + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpu-core@6.2.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + + regjsgen@0.8.0: {} + + regjsparser@0.12.0: + dependencies: + jsesc: 3.0.2 + + repeat-element@1.1.4: {} + + repeat-string@1.6.1: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + require-main-filename@2.0.0: {} + + resolve-dir@1.0.1: + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve-url@0.2.1: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + ret@0.1.15: {} + + reusify@1.0.4: {} + + rfdc@1.4.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rimraf@6.0.1: + dependencies: + glob: 11.0.0 + package-json-from-dist: 1.0.1 + + rollup-plugin-purge-icons@0.10.0: + dependencies: + '@purge-icons/core': 0.10.0 + '@purge-icons/generated': 0.10.0 + transitivePeerDependencies: + - encoding + - supports-color + + rollup-plugin-visualizer@5.14.0(rollup@4.30.1): + dependencies: + open: 8.4.2 + picomatch: 4.0.2 + source-map: 0.7.4 + yargs: 17.7.2 + optionalDependencies: + rollup: 4.30.1 + + rollup@2.79.2: + optionalDependencies: + fsevents: 2.3.3 + + rollup@4.30.1: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.30.1 + '@rollup/rollup-android-arm64': 4.30.1 + '@rollup/rollup-darwin-arm64': 4.30.1 + '@rollup/rollup-darwin-x64': 4.30.1 + '@rollup/rollup-freebsd-arm64': 4.30.1 + '@rollup/rollup-freebsd-x64': 4.30.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 + '@rollup/rollup-linux-arm-musleabihf': 4.30.1 + '@rollup/rollup-linux-arm64-gnu': 4.30.1 + '@rollup/rollup-linux-arm64-musl': 4.30.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 + '@rollup/rollup-linux-riscv64-gnu': 4.30.1 + '@rollup/rollup-linux-s390x-gnu': 4.30.1 + '@rollup/rollup-linux-x64-gnu': 4.30.1 + '@rollup/rollup-linux-x64-musl': 4.30.1 + '@rollup/rollup-win32-arm64-msvc': 4.30.1 + '@rollup/rollup-win32-ia32-msvc': 4.30.1 + '@rollup/rollup-win32-x64-msvc': 4.30.1 + fsevents: 2.3.3 + + run-async@3.0.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.8.1 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-regex@1.1.0: + dependencies: + ret: 0.1.15 + + safer-buffer@2.1.2: {} + + sax@1.4.1: + optional: true + + scroll-into-view-if-needed@2.2.31: + dependencies: + compute-scroll-into-view: 1.0.20 + + scule@1.3.0: {} + + semver@5.7.2: + optional: true + + semver@6.3.1: {} + + semver@7.6.3: {} + + sentence-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + upper-case-first: 2.0.2 + + set-blocking@2.0.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + + set-value@2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sirv@3.0.0: + dependencies: + '@polka/url': 1.0.0-next.28 + mrmime: 2.0.0 + totalist: 3.0.1 + + slash@3.0.0: {} + + slash@4.0.0: {} + + slash@5.1.0: {} + + slate-history@0.66.0(slate@0.72.8): + dependencies: + is-plain-object: 5.0.0 + slate: 0.72.8 + + slate@0.72.8: + dependencies: + immer: 9.0.21 + is-plain-object: 5.0.0 + tiny-warning: 1.0.3 + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + snabbdom@3.6.2: {} + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + snapdragon-node@2.1.1: + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + + snapdragon-util@3.0.1: + dependencies: + kind-of: 3.2.2 + + snapdragon@0.8.2: + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + + source-map-js@1.2.1: {} + + source-map-resolve@0.5.3: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-url@0.4.1: {} + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + sourcemap-codec@1.4.8: {} + + split-string@3.1.0: + dependencies: + extend-shallow: 3.0.2 + + split2@4.2.0: {} + + ssr-window@3.0.0: {} + + stable@0.1.8: {} + + static-extend@0.1.2: + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + + statuses@1.5.0: {} + + std-env@3.8.0: {} + + stdin-discarder@0.2.2: {} + + strict-uri-encode@1.1.0: {} + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.0.0 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + + stylelint-config-html@1.1.0(postcss-html@1.7.0)(stylelint@16.12.0(typescript@5.7.3)): + dependencies: + postcss-html: 1.7.0 + stylelint: 16.12.0(typescript@5.7.3) + + stylelint-config-recommended@14.0.1(stylelint@16.12.0(typescript@5.7.3)): + dependencies: + stylelint: 16.12.0(typescript@5.7.3) + + stylelint-config-standard@36.0.1(stylelint@16.12.0(typescript@5.7.3)): + dependencies: + stylelint: 16.12.0(typescript@5.7.3) + stylelint-config-recommended: 14.0.1(stylelint@16.12.0(typescript@5.7.3)) + + stylelint-order@6.0.4(stylelint@16.12.0(typescript@5.7.3)): + dependencies: + postcss: 8.4.49 + postcss-sorting: 8.0.2(postcss@8.4.49) + stylelint: 16.12.0(typescript@5.7.3) + + stylelint@16.12.0(typescript@5.7.3): + dependencies: + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + '@csstools/media-query-list-parser': 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.0.0) + '@dual-bundle/import-meta-resolve': 4.1.0 + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 9.0.0(typescript@5.7.3) + css-functions-list: 3.2.3 + css-tree: 3.1.0 + debug: 4.4.0 + fast-glob: 3.3.3 + fastest-levenshtein: 1.0.16 + file-entry-cache: 9.1.0 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 6.0.2 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.35.0 + mathml-tag-names: 2.1.3 + meow: 13.2.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-resolve-nested-selector: 0.1.6 + postcss-safe-parser: 7.0.1(postcss@8.4.49) + postcss-selector-parser: 7.0.0 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + supports-hyperlinks: 3.1.0 + svg-tags: 1.0.0 + table: 6.9.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + - typescript + + supports-color@2.0.0: {} + + supports-color@3.2.3: + dependencies: + has-flag: 1.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@3.1.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-baker@1.7.0: + dependencies: + bluebird: 3.7.2 + clone: 2.1.2 + he: 1.2.0 + image-size: 0.5.5 + loader-utils: 1.4.2 + merge-options: 1.0.1 + micromatch: 3.1.0 + postcss: 5.2.18 + postcss-prefix-selector: 1.16.1(postcss@5.2.18) + posthtml-rename-id: 1.0.12 + posthtml-svg-mode: 1.0.3 + query-string: 4.3.4 + traverse: 0.6.10 + transitivePeerDependencies: + - supports-color + + svg-tags@1.0.0: {} + + svgo@2.8.0: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.1.1 + stable: 0.1.8 + + synckit@0.9.2: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.8.1 + + system-architecture@0.1.0: {} + + systemjs@6.15.1: {} + + table@6.9.0: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + terser@5.37.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-extensions@2.4.0: {} + + through@2.3.8: {} + + tiny-warning@1.0.3: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.10: + dependencies: + fdir: 6.4.2(picomatch@4.0.2) + picomatch: 4.0.2 + + title-case@3.0.3: + dependencies: + tslib: 2.8.1 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-object-path@0.3.0: + dependencies: + kind-of: 3.2.2 + + to-regex-range@2.1.1: + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + to-regex@3.0.2: + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + + totalist@3.0.1: {} + + tr46@0.0.3: {} + + traverse@0.6.10: + dependencies: + gopd: 1.2.0 + typedarray.prototype.slice: 1.0.5 + which-typed-array: 1.1.18 + + ts-api-utils@2.0.0(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + + tslib@2.3.0: {} + + tslib@2.8.1: {} + + tsx@4.19.2: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.8.1 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type@2.7.3: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.10 + + typedarray.prototype.slice@1.0.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-proto: 1.0.1 + math-intrinsics: 1.1.0 + typed-array-buffer: 1.0.3 + typed-array-byte-offset: 1.0.4 + + typescript-eslint@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.17.0(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + typescript@5.7.3: {} + + ufo@1.5.4: {} + + uglify-js@3.19.3: + optional: true + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + unc-path-regex@0.1.2: {} + + unconfig@0.6.0: + dependencies: + '@antfu/utils': 0.7.10 + defu: 6.1.4 + importx: 0.5.1 + transitivePeerDependencies: + - supports-color + + unctx@2.4.1: + dependencies: + acorn: 8.14.0 + estree-walker: 3.0.3 + magic-string: 0.30.17 + unplugin: 2.1.2 + + undici-types@6.20.0: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.2.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + unicorn-magic@0.1.0: {} + + unimport@3.14.5(rollup@4.30.1): + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.30.1) + acorn: 8.14.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + fast-glob: 3.3.3 + local-pkg: 0.5.1 + magic-string: 0.30.17 + mlly: 1.7.3 + pathe: 1.1.2 + picomatch: 4.0.2 + pkg-types: 1.3.0 + scule: 1.3.0 + strip-literal: 2.1.1 + unplugin: 1.16.1 + transitivePeerDependencies: + - rollup + + union-value@1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + + universalify@2.0.1: {} + + unocss@0.65.4(postcss@8.4.49)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@unocss/astro': 0.65.4(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) + '@unocss/cli': 0.65.4(rollup@4.30.1) + '@unocss/core': 0.65.4 + '@unocss/postcss': 0.65.4(postcss@8.4.49) + '@unocss/preset-attributify': 0.65.4 + '@unocss/preset-icons': 0.65.4 + '@unocss/preset-mini': 0.65.4 + '@unocss/preset-tagify': 0.65.4 + '@unocss/preset-typography': 0.65.4 + '@unocss/preset-uno': 0.65.4 + '@unocss/preset-web-fonts': 0.65.4 + '@unocss/preset-wind': 0.65.4 + '@unocss/transformer-attributify-jsx': 0.65.4 + '@unocss/transformer-compile-class': 0.65.4 + '@unocss/transformer-directives': 0.65.4 + '@unocss/transformer-variant-group': 0.65.4 + '@unocss/vite': 0.65.4(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) + optionalDependencies: + vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + transitivePeerDependencies: + - postcss + - rollup + - supports-color + - vue + + unpipe@1.0.0: {} + + unplugin@1.16.1: + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + + unplugin@2.1.2: + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + + unset-value@1.0.0: + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + + untyped@1.5.2: + dependencies: + '@babel/core': 7.26.0 + '@babel/standalone': 7.26.4 + '@babel/types': 7.26.3 + citty: 0.1.6 + defu: 6.1.4 + jiti: 2.4.2 + knitwork: 1.2.0 + scule: 1.3.0 + transitivePeerDependencies: + - supports-color + + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + upper-case-first@2.0.2: + dependencies: + tslib: 2.8.1 + + upper-case@2.0.2: + dependencies: + tslib: 2.8.1 + + uqr@0.1.2: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + urix@0.1.0: {} + + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.13.1 + + use@3.1.1: {} + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + v8flags@4.0.1: {} + + vary@1.1.2: {} + + vite-plugin-ejs@1.7.0(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + dependencies: + ejs: 3.1.10 + vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + + vite-plugin-eslint@1.8.1(eslint@9.17.0(jiti@2.4.2))(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + dependencies: + '@rollup/pluginutils': 4.2.1 + '@types/eslint': 8.56.12 + eslint: 9.17.0(jiti@2.4.2) + rollup: 2.79.2 + vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + + vite-plugin-mock@2.9.6(mockjs@1.1.0)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + dependencies: + '@rollup/plugin-node-resolve': 13.3.0(rollup@4.30.1) + '@types/mockjs': 1.0.10 + chalk: 4.1.2 + chokidar: 3.6.0 + connect: 3.7.0 + debug: 4.4.0 + esbuild: 0.11.3 + fast-glob: 3.3.3 + mockjs: 1.1.0 + path-to-regexp: 6.3.0 + vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + transitivePeerDependencies: + - rollup + - supports-color + + vite-plugin-progress@0.0.7(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + dependencies: + picocolors: 1.1.1 + progress: 2.0.3 + rd: 2.0.1 + vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + + vite-plugin-purge-icons@0.10.0(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + dependencies: + '@purge-icons/core': 0.10.0 + '@purge-icons/generated': 0.10.0 + rollup-plugin-purge-icons: 0.10.0 + vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + transitivePeerDependencies: + - encoding + - supports-color + + vite-plugin-style-import@2.0.0(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + dependencies: + '@rollup/pluginutils': 4.2.1 + change-case: 4.1.2 + console: 0.7.2 + es-module-lexer: 0.9.3 + fs-extra: 10.1.0 + magic-string: 0.25.9 + pathe: 0.2.0 + vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + + vite-plugin-svg-icons@2.0.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + dependencies: + '@types/svgo': 2.6.4 + cors: 2.8.5 + debug: 4.4.0 + etag: 1.8.1 + fs-extra: 10.1.0 + pathe: 0.2.0 + svg-baker: 1.7.0 + svgo: 2.8.0 + vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + transitivePeerDependencies: + - supports-color + + vite-plugin-url-copy@1.1.4(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + dependencies: + clipboardy: 4.0.0 + consola: 3.3.3 + uqr: 0.1.2 + vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + + vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0): + dependencies: + esbuild: 0.24.2 + postcss: 8.4.49 + rollup: 4.30.1 + optionalDependencies: + '@types/node': 22.10.5 + fsevents: 2.3.3 + jiti: 2.4.2 + less: 4.2.1 + terser: 5.37.0 + tsx: 4.19.2 + yaml: 2.7.0 + + vscode-uri@3.0.8: {} + + vue-demi@0.14.10(vue@3.5.13(typescript@5.7.3)): + dependencies: + vue: 3.5.13(typescript@5.7.3) + + vue-draggable-plus@0.6.0(@types/sortablejs@1.15.8): + dependencies: + '@types/sortablejs': 1.15.8 + + vue-eslint-parser@9.4.3(eslint@9.17.0(jiti@2.4.2)): + dependencies: + debug: 4.4.0 + eslint: 9.17.0(jiti@2.4.2) + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + lodash: 4.17.21 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + vue-flow-layout@0.1.1(vue@3.5.13(typescript@5.7.3)): + dependencies: + vue: 3.5.13(typescript@5.7.3) + + vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@intlify/core-base': 11.0.1 + '@intlify/shared': 11.0.1 + '@vue/devtools-api': 6.6.4 + vue: 3.5.13(typescript@5.7.3) + + vue-json-pretty@2.4.0(vue@3.5.13(typescript@5.7.3)): + dependencies: + vue: 3.5.13(typescript@5.7.3) + + vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.13(typescript@5.7.3) + + vue-tsc@2.2.0(typescript@5.7.3): + dependencies: + '@volar/typescript': 2.4.11 + '@vue/language-core': 2.2.0(typescript@5.7.3) + typescript: 5.7.3 + + vue-types@5.1.3(vue@3.5.13(typescript@5.7.3)): + dependencies: + is-plain-object: 5.0.0 + optionalDependencies: + vue: 3.5.13(typescript@5.7.3) + + vue@3.5.13(typescript@5.7.3): + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3)) + '@vue/shared': 3.5.13 + optionalDependencies: + typescript: 5.7.3 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + webidl-conversions@3.0.1: {} + + webpack-virtual-modules@0.6.2: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.1 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.0 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.0 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-module@2.0.1: {} + + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wildcard@1.1.2: {} + + word-wrap@1.2.5: {} + + wordwrap@1.0.0: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + xgplayer-subtitles@3.0.20(core-js@3.40.0): + dependencies: + core-js: 3.40.0 + eventemitter3: 4.0.7 + + xgplayer@3.0.20(core-js@3.40.0): + dependencies: + core-js: 3.40.0 + danmu.js: 1.1.13 + delegate: 3.2.0 + downloadjs: 1.4.7 + eventemitter3: 4.0.7 + xgplayer-subtitles: 3.0.20(core-js@3.40.0) + + xml-name-validator@4.0.0: {} + + y18n@4.0.3: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml-eslint-parser@1.2.3: + dependencies: + eslint-visitor-keys: 3.4.3 + lodash: 4.17.21 + yaml: 2.7.0 + + yaml@2.6.1: {} + + yaml@2.7.0: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@21.1.1: {} + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yocto-queue@1.1.1: {} + + yoctocolors-cjs@2.1.2: {} + + zrender@5.6.1: + dependencies: + tslib: 2.3.0 diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 0000000..961986e --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {} + } +} diff --git a/prettier.config.cjs b/prettier.config.cjs new file mode 100644 index 0000000..b46239f --- /dev/null +++ b/prettier.config.cjs @@ -0,0 +1,19 @@ +module.exports = { + printWidth: 100, + tabWidth: 2, + useTabs: false, + semi: false, + vueIndentScriptAndStyle: false, + singleQuote: true, + quoteProps: 'as-needed', + bracketSpacing: true, + trailingComma: 'none', + jsxSingleQuote: false, + arrowParens: 'always', + insertPragma: false, + requirePragma: false, + proseWrap: 'never', + htmlWhitespaceSensitivity: 'strict', + endOfLine: 'auto', + rangeStart: 0 +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5a7de08267811feb034bb0c54ab38ca417731aab GIT binary patch literal 4286 zcmcJTdr*|u8OGm?f3Tad7j|KHxq~xpVq;A@HfgF7QY~O)Go9%q6O&2POq*#slbPnf zwzf$$rcG^ZYDE+@N@~3q7I49+L1DRyKt#F7{U!nn%U;+^j39aYobU7VmKqZ!%ltTJ zSayHU`<%1G3`F1^k7e(&;Z`VJu(?k;=T7X%N)jqMq!dMyZeDC3iF!z6rw+67kxV&jDKh*=XMMH7BzC%0ZZgW^F*GR;m`LJ8Nxh;MnV_2 zo#Aeu7~L8}V>!_RD+rBki)NV^cA^7!L1e&FY)JDI!(TGDXW-mnR@`bh?a0EnGI=P9 zy>>$Z2m|CjGIt$Z+!8}0*)asCbu>FBggr}a!3yv^PwX`@<_>sE4e5ZqN9V>rmTRUF zbU(T+S`C+7@m92s-#UA`Fo4_`PSqdlNi_8Le1D!YO<=@vm4O z$%$c4iIKfW(ZR8ZbU?mO?%glC2lvBQG7OL4g2E>3CE|D(x!lD@#>|2OxWk0scT#t^ zS6+JEa8?X~2srB%*M&`SJoL{S_(0yf@}t;S27g&Z0Hpg)z+Z89e{|ZcvsAWtlnyU! zrooK~1ov;@oE;J_FsSek>;)U+*tyTdzLW6F6!^;ZVSuI_-@Jq7m6vJu4@{*G56tUW zpGZTSVx!<}kX-N$2;dyp7%$QPemsxlS=d(&zn~%_Fjb*XpK`!o{mnXPeP))mj8zZ^lWb$NF4{~3AH+q%ce-ErK%W3!iN7WAAnu?S-NPqStq)-K z^r;$jQ1|uDpfTeToz0w~uIE_Ym=?0w^$yVAEIfqUV+#(N3e zk2~QhGcbJDsny&3bvhLwfBl_1IF%8kGpjCBvvt~9zrr8d9#JR!m$M(Jd}05>Eb4nd zJ`&DTz3>To1b>z3MIY{C28N5L>h#j;Kcx$R41YcR4PV_s^-rhhbVi8kGeYX7r!U!S zQoWp`s}X+Qa=*iY4)hJLtt9w=1?Lsv?f#1(Q9@*K9WgR|GWA#mr*$@egH|Q{flqJW zfn&Lc>e2!ND{_P?Q{22wTP^vKVHzF$V&C_+Q16C#BfNFp?VUHBP>oj2B zhz=UjK_mQU{=dKMNf%Wv_mX3|SB)O*b?E`FSmwIXFFL5s)z(Cu`t>S;|CO%wi8Gz> zcD{3+@uDaWG)hk4Wq*?l=C;AD68_*>&6hq4$5NbB{u8&riVPuS;Bxqt{>2%98FcW< z-UZpz{a%6r-kQ#JN!+2ZHi^e>j@Xfb z(FH3R_9nI5>KFImbdI(Z5j@?YYO33 z34gFFoDTl5j|!g{5?GNTRI+4*l?*4In&hHK`i1Yt`Ne(~9lZ9R?`G5acM|n*SGN8s znFXUbf8oK55?7tV%W!hALlXom0foB5=@9%tUGVsTz3@jvj0}t(u4OpB%*i{yd6`D*|GZP1pkYzYvxb4teMYa#Zj_Lo>g|rUJiD`FX%!C-Qg-g2Nw4TGLa#a|M&na z8A`8a_#|~g>R_v;>eddvKnJhy{!TWvy`7|kyQ1Zf^VxYMQp~8#D(_{d@N%#l^n?dP zJ>eOEc0bbbz}_Ep9p1mVhmnEN1LG{D9z=$tSMNjqf-V*rZoG@=pcx%l%Ab3d&aIih z8eE{+mp&i+1G+xk}WiODJh<6N)JDmfKzAKZd|2|w0ncYeRMI&V=sBLj;JI14`X znA}4Vday6K$fZk1`Dluh#aSF*>g2+Oy}Ud24Cm@=8E1fdP!-j*CXKqY;$HSP>1S?o zig|DLDt@t+^XG}oKAp^97_-1JPiEbH%mN~Xwb-w{LX;}_oG4M?Bhm>5iNXX9qIrUK L_}7DgzT)vecywrn literal 0 HcmV?d00001 diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b76c71b6ba9a0f73203fbf745fe93d240a3c7802 GIT binary patch literal 9193 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 X5_)J=A58xJn+`(LK;w&=?YsX2HuGA3 literal 0 HcmV?d00001 diff --git a/scripts/icon.ts b/scripts/icon.ts new file mode 100644 index 0000000..724342e --- /dev/null +++ b/scripts/icon.ts @@ -0,0 +1,73 @@ +import path from 'path' +import fs from 'fs-extra' +import inquirer from 'inquirer' +import chalk from 'chalk' +import pkg from '../package.json' +import { ICON_PREFIX } from '../src/constants' + +interface Icon { + name: string + prefix: string + icons: string[] +} + +async function generateIcon() { + const dir = path.resolve(process.cwd(), 'node_modules/@iconify/json') + + const raw = await fs.readJSON(path.join(dir, 'collections.json')) + + const collections = Object.entries(raw).map(([id, v]) => ({ + ...(v as any), + id + })) + + const choices = collections.map((item) => ({ key: item.id, value: item.id, name: item.name })) + + inquirer + .prompt([ + // { + // type: 'list', + // name: 'useType', + // choices: [ + // { key: 'local', value: 'local', name: 'Local' }, + // { key: 'onLine', value: 'onLine', name: 'OnLine' } + // ], + // message: 'How to use icons?' + // }, + { + type: 'list', + name: 'iconSet', + choices: choices, + message: 'Select the icon set that needs to be generated?' + } + ]) + // ↓命令行问答的答案 + .then(async (answers) => { + const { iconSet } = answers + // const isOnLine = useType === 'onLine' + const outputDir = path.resolve(process.cwd(), 'src/components/IconPicker/src/data') + fs.ensureDir(outputDir) + const genCollections = collections.filter((item) => [iconSet].includes(item.id)) + const prefixSet: string[] = [] + for (const info of genCollections) { + const data = await fs.readJSON(path.join(dir, 'json', `${info.id}.json`)) + if (data) { + const { prefix } = data + const prefixName = `${ICON_PREFIX}${prefix}` + const icons = Object.keys(data.icons).map((item) => `${prefixName}:${item}`) + + await fs.writeFileSync( + path.join('src/components/IconPicker/src/data', `icons.${prefix}.ts`), + `export default ${JSON.stringify({ name: info.name, prefix: prefixName, icons })}` + ) + // ↓分类处理完成,push类型名称 + prefixSet.push(prefix) + } + } + console.log( + `✨ ${chalk.cyan(`[${pkg.name}]`)}` + ' - Icon generated successfully:' + `[${prefixSet}]` + ) + }) +} + +generateIcon() diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..e3301d9 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/src/api/common/index.ts b/src/api/common/index.ts new file mode 100644 index 0000000..b8c986c --- /dev/null +++ b/src/api/common/index.ts @@ -0,0 +1,11 @@ +import request from '@/axios' + +// 获取所有字典 +export const getDictApi = () => { + return request.get({ url: '/mock/dict/list' }) +} + +// 模拟获取某个字典 +export const getDictOneApi = async () => { + return request.get({ url: '/mock/dict/one' }) +} diff --git a/src/api/dashboard/analysis/index.ts b/src/api/dashboard/analysis/index.ts new file mode 100644 index 0000000..f559dc9 --- /dev/null +++ b/src/api/dashboard/analysis/index.ts @@ -0,0 +1,23 @@ +import request from '@/axios' +import type { + AnalysisTotalTypes, + UserAccessSource, + WeeklyUserActivity, + MonthlySales +} from './types' + +export const getCountApi = (): Promise> => { + return request.get({ url: '/mock/analysis/total' }) +} + +export const getUserAccessSourceApi = (): Promise> => { + return request.get({ url: '/mock/analysis/userAccessSource' }) +} + +export const getWeeklyUserActivityApi = (): Promise> => { + return request.get({ url: '/mock/analysis/weeklyUserActivity' }) +} + +export const getMonthlySalesApi = (): Promise> => { + return request.get({ url: '/mock/analysis/monthlySales' }) +} diff --git a/src/api/dashboard/analysis/types.ts b/src/api/dashboard/analysis/types.ts new file mode 100644 index 0000000..4a239f5 --- /dev/null +++ b/src/api/dashboard/analysis/types.ts @@ -0,0 +1,22 @@ +export type AnalysisTotalTypes = { + users: number + messages: number + moneys: number + shoppings: number +} + +export type UserAccessSource = { + value: number + name: string +} + +export type WeeklyUserActivity = { + value: number + name: string +} + +export type MonthlySales = { + name: string + estimate: number + actual: number +} diff --git a/src/api/dashboard/workplace/index.ts b/src/api/dashboard/workplace/index.ts new file mode 100644 index 0000000..062f351 --- /dev/null +++ b/src/api/dashboard/workplace/index.ts @@ -0,0 +1,22 @@ +import request from '@/axios' +import type { WorkplaceTotal, Project, Dynamic, Team, RadarData } from './types' + +export const getCountApi = (): Promise> => { + return request.get({ url: '/mock/workplace/total' }) +} + +export const getProjectApi = (): Promise> => { + return request.get({ url: '/mock/workplace/project' }) +} + +export const getDynamicApi = (): Promise> => { + return request.get({ url: '/mock/workplace/dynamic' }) +} + +export const getTeamApi = (): Promise> => { + return request.get({ url: '/mock/workplace/team' }) +} + +export const getRadarApi = (): Promise> => { + return request.get({ url: '/mock/workplace/radar' }) +} diff --git a/src/api/dashboard/workplace/types.ts b/src/api/dashboard/workplace/types.ts new file mode 100644 index 0000000..da23e74 --- /dev/null +++ b/src/api/dashboard/workplace/types.ts @@ -0,0 +1,30 @@ +export type WorkplaceTotal = { + project: number + access: number + todo: number +} + +export type Project = { + name: string + icon: string + message: string + personal: string + time: Date | number | string +} + +export type Dynamic = { + keys: string[] + time: Date | number | string +} + +export type Team = { + name: string + icon: string +} + +export type RadarData = { + personal: number + team: number + max: number + name: string +} diff --git a/src/api/department/index.ts b/src/api/department/index.ts new file mode 100644 index 0000000..eb583ac --- /dev/null +++ b/src/api/department/index.ts @@ -0,0 +1,30 @@ +import request from '@/axios' +import { DepartmentListResponse, DepartmentUserParams, DepartmentUserResponse } from './types' + +export const getDepartmentApi = () => { + return request.get({ url: '/mock/department/list' }) +} + +export const getUserByIdApi = (params: DepartmentUserParams) => { + return request.get({ url: '/mock/department/users', params }) +} + +export const deleteUserByIdApi = (ids: string[] | number[]) => { + return request.post({ url: '/mock/department/user/delete', data: { ids } }) +} + +export const saveUserApi = (data: any) => { + return request.post({ url: '/mock/department/user/save', data }) +} + +export const saveDepartmentApi = (data: any) => { + return request.post({ url: '/mock/department/save', data }) +} + +export const deleteDepartmentApi = (ids: string[] | number[]) => { + return request.post({ url: '/mock/department/delete', data: { ids } }) +} + +export const getDepartmentTableApi = (params: any) => { + return request.get({ url: '/mock/department/table/list', params }) +} diff --git a/src/api/department/types.ts b/src/api/department/types.ts new file mode 100644 index 0000000..027a628 --- /dev/null +++ b/src/api/department/types.ts @@ -0,0 +1,32 @@ +export interface DepartmentItem { + id: string + departmentName: string + children?: DepartmentItem[] +} + +export interface DepartmentListResponse { + list: DepartmentItem[] +} + +export interface DepartmentUserParams { + pageSize: number + pageIndex: number + id: string + username?: string + account?: string +} + +export interface DepartmentUserItem { + id: string + username: string + account: string + email: string + createTime: string + role: string + department: DepartmentItem +} + +export interface DepartmentUserResponse { + list: DepartmentUserItem[] + total: number +} diff --git a/src/api/login/index.ts b/src/api/login/index.ts new file mode 100644 index 0000000..b5012b2 --- /dev/null +++ b/src/api/login/index.ts @@ -0,0 +1,34 @@ +import request from '@/axios' +import type { UserType } from './types' + +interface RoleParams { + roleName: string +} + +export const loginApi = (data: UserType): Promise> => { + return request.post({ url: '/mock/user/login', data }) +} + +export const loginOutApi = (): Promise => { + return request.get({ url: '/mock/user/loginOut' }) +} + +export const getUserListApi = ({ params }: AxiosConfig) => { + return request.get<{ + code: string + data: { + list: UserType[] + total: number + } + }>({ url: '/mock/user/list', params }) +} + +export const getAdminRoleApi = ( + params: RoleParams +): Promise> => { + return request.get({ url: '/mock/role/list', params }) +} + +export const getTestRoleApi = (params: RoleParams): Promise> => { + return request.get({ url: '/mock/role/list2', params }) +} diff --git a/src/api/login/types.ts b/src/api/login/types.ts new file mode 100644 index 0000000..31bb526 --- /dev/null +++ b/src/api/login/types.ts @@ -0,0 +1,11 @@ +export interface UserLoginType { + username: string + password: string +} + +export interface UserType { + username: string + password: string + role: string + roleId: string +} diff --git a/src/api/menu/index.ts b/src/api/menu/index.ts new file mode 100644 index 0000000..a2b934c --- /dev/null +++ b/src/api/menu/index.ts @@ -0,0 +1,5 @@ +import request from '@/axios' + +export const getMenuListApi = () => { + return request.get({ url: '/mock/menu/list' }) +} diff --git a/src/api/request/index.ts b/src/api/request/index.ts new file mode 100644 index 0000000..207f913 --- /dev/null +++ b/src/api/request/index.ts @@ -0,0 +1,38 @@ +import request from '@/axios' +import { RequestResponse } from './types' + +export const request1 = () => { + return request.get>({ + url: '/mock/request/1' + }) +} + +export const request2 = () => { + return request.get>({ + url: '/mock/request/2' + }) +} + +export const request3 = () => { + return request.get>({ + url: '/mock/request/3' + }) +} + +export const request4 = () => { + return request.get>({ + url: '/mock/request/4' + }) +} + +export const request5 = () => { + return request.get>({ + url: '/mock/request/5' + }) +} + +export const expired = () => { + return request.get>({ + url: '/mock/request/expired' + }) +} diff --git a/src/api/request/types.ts b/src/api/request/types.ts new file mode 100644 index 0000000..9a2063f --- /dev/null +++ b/src/api/request/types.ts @@ -0,0 +1,3 @@ +export interface RequestResponse { + data: string +} diff --git a/src/api/role/index.ts b/src/api/role/index.ts new file mode 100644 index 0000000..ecbf9d9 --- /dev/null +++ b/src/api/role/index.ts @@ -0,0 +1,5 @@ +import request from '@/axios' + +export const getRoleListApi = () => { + return request.get({ url: '/mock/role/table' }) +} diff --git a/src/api/table/index.ts b/src/api/table/index.ts new file mode 100644 index 0000000..c870f25 --- /dev/null +++ b/src/api/table/index.ts @@ -0,0 +1,26 @@ +import request from '@/axios' +import type { TableData } from './types' + +export const getTableListApi = (params: any) => { + return request.get({ url: '/mock/example/list', params }) +} + +export const getCardTableListApi = (params: any) => { + return request.get({ url: '/mock/card/list', params }) +} + +export const getTreeTableListApi = (params: any) => { + return request.get({ url: '/mock/example/treeList', params }) +} + +export const saveTableApi = (data: Partial): Promise => { + return request.post({ url: '/mock/example/save', data }) +} + +export const getTableDetApi = (id: string): Promise> => { + return request.get({ url: '/mock/example/detail', params: { id } }) +} + +export const delTableListApi = (ids: string[] | number[]): Promise => { + return request.post({ url: '/mock/example/delete', data: { ids } }) +} diff --git a/src/api/table/types.ts b/src/api/table/types.ts new file mode 100644 index 0000000..876c111 --- /dev/null +++ b/src/api/table/types.ts @@ -0,0 +1,9 @@ +export type TableData = { + id: string + author: string + title: string + content: string + importance: number + display_time: string + pageviews: number +} diff --git a/src/assets/imgs/avatar.jpg b/src/assets/imgs/avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d46a70a46430e31744420865138cc7eedb8b77e1 GIT binary patch literal 6264 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 BLq7lj literal 0 HcmV?d00001 diff --git a/src/assets/imgs/logo.png b/src/assets/imgs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b76c71b6ba9a0f73203fbf745fe93d240a3c7802 GIT binary patch literal 9193 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 X5_)J=A58xJn+`(LK;w&=?YsX2HuGA3 literal 0 HcmV?d00001 diff --git a/src/assets/imgs/personal-center-bg.jpg b/src/assets/imgs/personal-center-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b8ce80b94a95af74ee513572a8b1c186819d46b6 GIT binary patch literal 185776 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

h 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%0AHHkAynEvhCNrm7ITFY)#C8>@;qMb& z>J}2mse+ewftFBu{I%fPmE&p}l-DfVm6+q{UDRnSm{EgoQl8E?Hc2NrsbiVok!40I z!0<;}S3AE7fST=5IwcF9=isY940zE~P4OH#W5AVuS06)LJ|q2_^}A(juLs{IqZd_% zQW8Ktj&N(qd=066gISI?a)J6Ediz^N@iTpy5=PF^`PUXEq|^6Vlc?hPPlI*84fuz{ za)>qC2`t$6VU_&FV(vBe{{V_FZ8gyLH*u@0WDJV=55*b`njWUmD*om2RQ45ETw8iG zcsuTL?E6V4rG1P0BK#%N{9Aph_~XVlNqeK)$0en_GK{2>$@iQ70zX>#+Taf?6p|?cNfo^aJuCI$HJN_V zCK&MCbJOYRUVrgd;bwvHZ%JoJqqFfe3;vCI2H!UW{Zzzt1n?WReEw6!RU`YV`mX-~ z=6(MF7I<9GIlROPi||;?sUBy!`HLxm&7Q>RR>aQ+@+c-^scsNv4Y6Gok-0)a_)L< zp19h4LAPO?VEW>@-G9U@aTtm=#yLLq=X%Xi|5g2Fjlc+brK#P+XIb8Tg998pG=w$P7}6m1wCay@soQrHG91*$R_(Ng*SnK*zN(W-Nv>2Lw2{`A=GZrRF}#%NjRxM{7puxY19!Y+`Xo0I+uvGn-2}> zQJM7(R^mHrc)-bNC19)g0&Dsf@F#$@kAuGs^k0TL9t>JkTkd3Dvt7%~?#I4gr?xT0 zep&v)J_xtg{wQDg?^TFNZ{bT|U^vSCvSYR~GtjDn!1V{3{av2q&doEPSd(9zaegt* zYKqxv&$8j%B2o5?%+)UZm`Uz<1M6CLN_6cgXZ}7eIVZn0&!}BPR7-X_jvtw;qHBod zxi0)i7s@?2uaZ$pC(z$pBUebVj?GQo$=jYzYZp<}&bO!~vN!rXM<>#;b-ixp^nH@g zJ33?|b&$Qk%TwFQFu+4nq`$2xvdS}7dWbl82 z1X_=bC0t7<5?j~?=vx^EVl##4y-j(y$6wnf&el7h2K*0mBaqSDYm70Bf(W%=Zqgs9 zug=KQStWa$hiPY(i#(1?J25#d%zBn4zT+p!T{` z$5Y~D5-2eG-;U|XAOcLiB(pYA&^`+bkKcvZ1=DosW` zPjTU6Mn3V_+-f>ywaC)^Eo6${#WVAP(~5^uz0)*1SHITh2#Lujf={roJMiYM28pA| zt7_ARcI8(*vsaGzlU~$(Reo--T&xP&jv>&0_3NgN1-Ge`@$pMTs@J|L>pHBBYvIBD zpJ&J}05drC$>=MASl(F-(=nPta$SjHPp(Zq3vdoGiqH_AxUZn0gi%@}=COH%r7g;! zbqAlVTDQD5kLC+#ZhzUCODE(Aq-ae*(46MFJ(4h|iIdpxEIu#%LD3=*=o49KY1{19 zR_NdN(FMO+&|iOms^}t2r@D=5(nLk=@mT~LtSXIL&bw;yYPiT|kSC6k@ z`$RhAvY$hOf0bn)ioX%98z0(j{{RA2BlQ*MHg`7`O}aD3aBHPW>~#qEV3PW01pOD= z#=jIiOAmy61*bLr^r~J*C(DN3CE=x-Q}UuNd1m9cdistnEA|%n0KQ+2^&78^-ZX~> zOHC;GdOT7NspbX(PIxDA9CWTsU3E|0S8uXAaM9+~zr6Vozu^P%3zg7hy@E&JBdW>) z`mb7}d+@{J9lCw0%SE`qwdx)y&g^@weSZG{w@s*(bf1Uc4m4i@*fHB1!3s*sIt|-W zF_G)f*0OaU+7IJdxHH)5_BSEEWsR*-Lj&A%l0O>rV~xc}>|52H?+Hpv-IdRWE``RQ zH<78^OJ^WBD>5<=e=Jl>Dz^aF*q2|l?~kO-myP@@rE0eC!z`BA+�ATt2IL@L$H@ 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

  • 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

    wmW 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𝔧(>zOTi@WUisy=wn9XgR;j&Vl{ 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�A{>i zX&P5DImu&Nn$+`6ITAT+XRUMX_lMHGs#L75bIFNFdQ#FJmD1jXjG~GwFdPmj-A$sM Lz$l`MK!5+)N!~U3 literal 0 HcmV?d00001 diff --git a/src/assets/svgs/403.svg b/src/assets/svgs/403.svg new file mode 100644 index 0000000..4500596 --- /dev/null +++ b/src/assets/svgs/403.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/404.svg b/src/assets/svgs/404.svg new file mode 100644 index 0000000..5244d8d --- /dev/null +++ b/src/assets/svgs/404.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/500.svg b/src/assets/svgs/500.svg new file mode 100644 index 0000000..9c02092 --- /dev/null +++ b/src/assets/svgs/500.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/icon.svg b/src/assets/svgs/icon.svg new file mode 100644 index 0000000..7024bec --- /dev/null +++ b/src/assets/svgs/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/login-bg.svg b/src/assets/svgs/login-bg.svg new file mode 100644 index 0000000..bbe06c1 --- /dev/null +++ b/src/assets/svgs/login-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/login-box-bg.svg b/src/assets/svgs/login-box-bg.svg new file mode 100644 index 0000000..ab10040 --- /dev/null +++ b/src/assets/svgs/login-box-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/message.svg b/src/assets/svgs/message.svg new file mode 100644 index 0000000..14ca817 --- /dev/null +++ b/src/assets/svgs/message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/money.svg b/src/assets/svgs/money.svg new file mode 100644 index 0000000..c1580de --- /dev/null +++ b/src/assets/svgs/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/peoples.svg b/src/assets/svgs/peoples.svg new file mode 100644 index 0000000..aab852e --- /dev/null +++ b/src/assets/svgs/peoples.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/shopping.svg b/src/assets/svgs/shopping.svg new file mode 100644 index 0000000..f395bc7 --- /dev/null +++ b/src/assets/svgs/shopping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/axios/config.ts b/src/axios/config.ts new file mode 100644 index 0000000..f17f2e4 --- /dev/null +++ b/src/axios/config.ts @@ -0,0 +1,53 @@ +import { AxiosResponse, InternalAxiosRequestConfig } from './types' +import { ElMessage } from 'element-plus' +import qs from 'qs' +import { SUCCESS_CODE, TRANSFORM_REQUEST_DATA } from '@/constants' +import { useUserStoreWithOut } from '@/store/modules/user' +import { objToFormData } from '@/utils' + +const defaultRequestInterceptors = (config: InternalAxiosRequestConfig) => { + if ( + config.method === 'post' && + config.headers['Content-Type'] === 'application/x-www-form-urlencoded' + ) { + config.data = qs.stringify(config.data) + } else if ( + TRANSFORM_REQUEST_DATA && + config.method === 'post' && + config.headers['Content-Type'] === 'multipart/form-data' && + !(config.data instanceof FormData) + ) { + config.data = objToFormData(config.data) + } + if (config.method === 'get' && config.params) { + let url = config.url as string + url += '?' + const keys = Object.keys(config.params) + for (const key of keys) { + if (config.params[key] !== void 0 && config.params[key] !== null) { + url += `${key}=${encodeURIComponent(config.params[key])}&` + } + } + url = url.substring(0, url.length - 1) + config.params = {} + config.url = url + } + return config +} + +const defaultResponseInterceptors = (response: AxiosResponse) => { + if (response?.config?.responseType === 'blob') { + // 如果是文件流,直接过 + return response + } else if (response.data.code === SUCCESS_CODE) { + return response.data + } else { + ElMessage.error(response?.data?.message) + if (response?.data?.code === 401) { + const userStore = useUserStoreWithOut() + userStore.logout() + } + } +} + +export { defaultResponseInterceptors, defaultRequestInterceptors } diff --git a/src/axios/index.ts b/src/axios/index.ts new file mode 100644 index 0000000..60b46c0 --- /dev/null +++ b/src/axios/index.ts @@ -0,0 +1,42 @@ +import service from './service' +import { CONTENT_TYPE } from '@/constants' +import { useUserStoreWithOut } from '@/store/modules/user' + +const request = (option: AxiosConfig) => { + const { url, method, params, data, headers, responseType } = option + + const userStore = useUserStoreWithOut() + return service.request({ + url: url, + method, + params, + data: data, + responseType: responseType, + headers: { + 'Content-Type': CONTENT_TYPE, + [userStore.getTokenKey ?? 'Authorization']: userStore.getToken ?? '', + ...headers + } + }) +} + +export default { + get: (option: AxiosConfig) => { + return request({ method: 'get', ...option }) as Promise> + }, + post: (option: AxiosConfig) => { + return request({ method: 'post', ...option }) as Promise> + }, + delete: (option: AxiosConfig) => { + return request({ method: 'delete', ...option }) as Promise> + }, + put: (option: AxiosConfig) => { + return request({ method: 'put', ...option }) as Promise> + }, + cancelRequest: (url: string | string[]) => { + return service.cancelRequest(url) + }, + cancelAllRequest: () => { + return service.cancelAllRequest() + } +} diff --git a/src/axios/service.ts b/src/axios/service.ts new file mode 100644 index 0000000..a392522 --- /dev/null +++ b/src/axios/service.ts @@ -0,0 +1,77 @@ +import axios, { AxiosError } from 'axios' +import { defaultRequestInterceptors, defaultResponseInterceptors } from './config' + +import { AxiosInstance, InternalAxiosRequestConfig, RequestConfig, AxiosResponse } from './types' +import { ElMessage } from 'element-plus' +import { REQUEST_TIMEOUT } from '@/constants' + +export const PATH_URL = import.meta.env.VITE_API_BASE_PATH + +const abortControllerMap: Map = new Map() + +const axiosInstance: AxiosInstance = axios.create({ + timeout: REQUEST_TIMEOUT, + baseURL: PATH_URL +}) + +axiosInstance.interceptors.request.use((res: InternalAxiosRequestConfig) => { + const controller = new AbortController() + const url = res.url || '' + res.signal = controller.signal + abortControllerMap.set( + import.meta.env.VITE_USE_MOCK === 'true' ? url.replace('/mock', '') : url, + controller + ) + return res +}) + +axiosInstance.interceptors.response.use( + (res: AxiosResponse) => { + const url = res.config.url || '' + abortControllerMap.delete(url) + // 这里不能做任何处理,否则后面的 interceptors 拿不到完整的上下文了 + return res + }, + (error: AxiosError) => { + console.log('err: ' + error) // for debug + ElMessage.error(error.message) + return Promise.reject(error) + } +) + +axiosInstance.interceptors.request.use(defaultRequestInterceptors) +axiosInstance.interceptors.response.use(defaultResponseInterceptors) + +const service = { + request: (config: RequestConfig) => { + return new Promise((resolve, reject) => { + if (config.interceptors?.requestInterceptors) { + config = config.interceptors.requestInterceptors(config as any) + } + + axiosInstance + .request(config) + .then((res) => { + resolve(res) + }) + .catch((err: any) => { + reject(err) + }) + }) + }, + cancelRequest: (url: string | string[]) => { + const urlList = Array.isArray(url) ? url : [url] + for (const _url of urlList) { + abortControllerMap.get(_url)?.abort() + abortControllerMap.delete(_url) + } + }, + cancelAllRequest() { + for (const [_, controller] of abortControllerMap) { + controller.abort() + } + abortControllerMap.clear() + } +} + +export default service diff --git a/src/axios/types/index.ts b/src/axios/types/index.ts new file mode 100644 index 0000000..b70eb26 --- /dev/null +++ b/src/axios/types/index.ts @@ -0,0 +1,31 @@ +import type { + InternalAxiosRequestConfig, + AxiosResponse, + AxiosRequestConfig, + AxiosInstance, + AxiosRequestHeaders, + AxiosError +} from 'axios' + +interface RequestInterceptors { + // 请求拦截 + requestInterceptors?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig + requestInterceptorsCatch?: (err: any) => any + // 响应拦截 + responseInterceptors?: (config: T) => T + responseInterceptorsCatch?: (err: any) => any +} + +interface RequestConfig extends AxiosRequestConfig { + interceptors?: RequestInterceptors +} + +export { + AxiosResponse, + RequestInterceptors, + RequestConfig, + AxiosInstance, + InternalAxiosRequestConfig, + AxiosRequestHeaders, + AxiosError +} diff --git a/src/components/Avatars/index.ts b/src/components/Avatars/index.ts new file mode 100644 index 0000000..5eaa329 --- /dev/null +++ b/src/components/Avatars/index.ts @@ -0,0 +1,4 @@ +import Avatars from './src/Avatars.vue' + +export type { AvatarItem } from './src/types' +export { Avatars } diff --git a/src/components/Avatars/src/Avatars.vue b/src/components/Avatars/src/Avatars.vue new file mode 100644 index 0000000..1f3619c --- /dev/null +++ b/src/components/Avatars/src/Avatars.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/src/components/Avatars/src/types/index.ts b/src/components/Avatars/src/types/index.ts new file mode 100644 index 0000000..c2554ee --- /dev/null +++ b/src/components/Avatars/src/types/index.ts @@ -0,0 +1,4 @@ +export interface AvatarItem { + url: string + name?: string +} diff --git a/src/components/Backtop/index.ts b/src/components/Backtop/index.ts new file mode 100644 index 0000000..96de88d --- /dev/null +++ b/src/components/Backtop/index.ts @@ -0,0 +1,3 @@ +import Backtop from './src/Backtop.vue' + +export { Backtop } diff --git a/src/components/Backtop/src/Backtop.vue b/src/components/Backtop/src/Backtop.vue new file mode 100644 index 0000000..4619017 --- /dev/null +++ b/src/components/Backtop/src/Backtop.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components/Breadcrumb/index.ts b/src/components/Breadcrumb/index.ts new file mode 100644 index 0000000..93ffe70 --- /dev/null +++ b/src/components/Breadcrumb/index.ts @@ -0,0 +1,3 @@ +import Breadcrumb from './src/Breadcrumb.vue' + +export { Breadcrumb } diff --git a/src/components/Breadcrumb/src/Breadcrumb.vue b/src/components/Breadcrumb/src/Breadcrumb.vue new file mode 100644 index 0000000..cc79f1b --- /dev/null +++ b/src/components/Breadcrumb/src/Breadcrumb.vue @@ -0,0 +1,126 @@ + + + diff --git a/src/components/Breadcrumb/src/helper.ts b/src/components/Breadcrumb/src/helper.ts new file mode 100644 index 0000000..690cff9 --- /dev/null +++ b/src/components/Breadcrumb/src/helper.ts @@ -0,0 +1,30 @@ +import { pathResolve } from '@/utils/routerHelper' + +export const filterBreadcrumb = ( + routes: AppRouteRecordRaw[], + parentPath = '' +): AppRouteRecordRaw[] => { + const res: AppRouteRecordRaw[] = [] + + for (const route of routes) { + const meta = route?.meta + if (meta.hidden && !meta.canTo) { + continue + } + + const data: AppRouteRecordRaw = + !meta.alwaysShow && route.children?.length === 1 + ? { ...route.children[0], path: pathResolve(route.path, route.children[0].path) } + : { ...route } + + data.path = pathResolve(parentPath, data.path) + + if (data.children) { + data.children = filterBreadcrumb(data.children, data.path) + } + if (data) { + res.push(data) + } + } + return res +} diff --git a/src/components/Button/index.ts b/src/components/Button/index.ts new file mode 100644 index 0000000..6ae43b1 --- /dev/null +++ b/src/components/Button/index.ts @@ -0,0 +1,3 @@ +import BaseButton from './src/Button.vue' + +export { BaseButton } diff --git a/src/components/Button/src/Button.vue b/src/components/Button/src/Button.vue new file mode 100644 index 0000000..709f4a7 --- /dev/null +++ b/src/components/Button/src/Button.vue @@ -0,0 +1,121 @@ + + + diff --git a/src/components/CodeEditor/index.ts b/src/components/CodeEditor/index.ts new file mode 100644 index 0000000..5bf3e9e --- /dev/null +++ b/src/components/CodeEditor/index.ts @@ -0,0 +1,3 @@ +import CodeEditor from './src/CodeEditor.vue' + +export { CodeEditor } diff --git a/src/components/CodeEditor/src/CodeEditor.vue b/src/components/CodeEditor/src/CodeEditor.vue new file mode 100644 index 0000000..3ec2495 --- /dev/null +++ b/src/components/CodeEditor/src/CodeEditor.vue @@ -0,0 +1,119 @@ + + + diff --git a/src/components/CodeEditor/src/config/config.ts b/src/components/CodeEditor/src/config/config.ts new file mode 100644 index 0000000..4fa7b30 --- /dev/null +++ b/src/components/CodeEditor/src/config/config.ts @@ -0,0 +1,129 @@ +export const languageOptions = [ + { label: 'plaintext', value: 'plaintext' }, + { label: 'abap', value: 'abap' }, + { label: 'apex', value: 'apex' }, + { label: 'azcli', value: 'azcli' }, + { label: 'bat', value: 'bat' }, + { label: 'bicep', value: 'bicep' }, + { label: 'cameligo', value: 'cameligo' }, + { label: 'clojure', value: 'clojure' }, + { label: 'coffeescript', value: 'coffeescript' }, + { label: 'c', value: 'c' }, + { label: 'cpp', value: 'cpp' }, + { label: 'csharp', value: 'csharp' }, + { label: 'csp', value: 'csp' }, + { label: 'css', value: 'css' }, + { label: 'cypher', value: 'cypher' }, + { label: 'dart', value: 'dart' }, + { label: 'dockerfile', value: 'dockerfile' }, + { label: 'ecl', value: 'ecl' }, + { label: 'elixir', value: 'elixir' }, + { label: 'flow9', value: 'flow9' }, + { label: 'fsharp', value: 'fsharp' }, + { label: 'freemarker2', value: 'freemarker2' }, + { + label: 'freemarker2.tag-angle.interpolation-dollar', + value: 'freemarker2.tag-angle.interpolation-dollar' + }, + { + label: 'freemarker2.tag-bracket.interpolation-dollar', + value: 'freemarker2.tag-bracket.interpolation-dollar' + }, + { + label: 'freemarker2.tag-angle.interpolation-bracket', + value: 'freemarker2.tag-angle.interpolation-bracket' + }, + { + label: 'freemarker2.tag-bracket.interpolation-bracket', + value: 'freemarker2.tag-bracket.interpolation-bracket' + }, + { + label: 'freemarker2.tag-auto.interpolation-dollar', + value: 'freemarker2.tag-auto.interpolation-dollar' + }, + { + label: 'freemarker2.tag-auto.interpolation-bracket', + value: 'freemarker2.tag-auto.interpolation-bracket' + }, + { label: 'go', value: 'go' }, + { label: 'graphql', value: 'graphql' }, + { label: 'handlebars', value: 'handlebars' }, + { label: 'hcl', value: 'hcl' }, + { label: 'html', value: 'html' }, + { label: 'ini', value: 'ini' }, + { label: 'java', value: 'java' }, + { label: 'javascript', value: 'javascript' }, + { label: 'julia', value: 'julia' }, + { label: 'kotlin', value: 'kotlin' }, + { label: 'less', value: 'less' }, + { label: 'lexon', value: 'lexon' }, + { label: 'lua', value: 'lua' }, + { label: 'liquid', value: 'liquid' }, + { label: 'm3', value: 'm3' }, + { label: 'markdown', value: 'markdown' }, + { label: 'mdx', value: 'mdx' }, + { label: 'mips', value: 'mips' }, + { label: 'msdax', value: 'msdax' }, + { label: 'mysql', value: 'mysql' }, + { label: 'objective-c', value: 'objective-c' }, + { label: 'pascal', value: 'pascal' }, + { label: 'pascaligo', value: 'pascaligo' }, + { label: 'perl', value: 'perl' }, + { label: 'pgsql', value: 'pgsql' }, + { label: 'php', value: 'php' }, + { label: 'pla', value: 'pla' }, + { label: 'postiats', value: 'postiats' }, + { label: 'powerquery', value: 'powerquery' }, + { label: 'powershell', value: 'powershell' }, + { label: 'proto', value: 'proto' }, + { label: 'pug', value: 'pug' }, + { label: 'python', value: 'python' }, + { label: 'qsharp', value: 'qsharp' }, + { label: 'r', value: 'r' }, + { label: 'razor', value: 'razor' }, + { label: 'redis', value: 'redis' }, + { label: 'redshift', value: 'redshift' }, + { label: 'restructuredtext', value: 'restructuredtext' }, + { label: 'ruby', value: 'ruby' }, + { label: 'rust', value: 'rust' }, + { label: 'sb', value: 'sb' }, + { label: 'scala', value: 'scala' }, + { label: 'scheme', value: 'scheme' }, + { label: 'scss', value: 'scss' }, + { label: 'shell', value: 'shell' }, + { label: 'sol', value: 'sol' }, + { label: 'aes', value: 'aes' }, + { label: 'sparql', value: 'sparql' }, + { label: 'sql', value: 'sql' }, + { label: 'st', value: 'st' }, + { label: 'swift', value: 'swift' }, + { label: 'systemverilog', value: 'systemverilog' }, + { label: 'verilog', value: 'verilog' }, + { label: 'tcl', value: 'tcl' }, + { label: 'twig', value: 'twig' }, + { label: 'typescript', value: 'typescript' }, + { label: 'vb', value: 'vb' }, + { label: 'wgsl', value: 'wgsl' }, + { label: 'xml', value: 'xml' }, + { label: 'yaml', value: 'yaml' }, + { label: 'json', value: 'json' } +] + +export const themeOptions = [ + { + label: 'vs', + value: 'vs' + }, + { + label: 'vs-dark', + value: 'vs-dark' + }, + { + label: 'hc-black', + value: 'hc-black' + }, + { + label: 'hc-light', + value: 'hc-light' + } +] diff --git a/src/components/Collapse/index.ts b/src/components/Collapse/index.ts new file mode 100644 index 0000000..73f65a3 --- /dev/null +++ b/src/components/Collapse/index.ts @@ -0,0 +1,3 @@ +import Collapse from './src/Collapse.vue' + +export { Collapse } diff --git a/src/components/Collapse/src/Collapse.vue b/src/components/Collapse/src/Collapse.vue new file mode 100644 index 0000000..542d9d3 --- /dev/null +++ b/src/components/Collapse/src/Collapse.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/components/ConfigGlobal/index.ts b/src/components/ConfigGlobal/index.ts new file mode 100644 index 0000000..eaeb7d0 --- /dev/null +++ b/src/components/ConfigGlobal/index.ts @@ -0,0 +1,5 @@ +import ConfigGlobal from './src/ConfigGlobal.vue' + +export type { ConfigGlobalTypes } from './src/types' + +export { ConfigGlobal } diff --git a/src/components/ConfigGlobal/src/ConfigGlobal.vue b/src/components/ConfigGlobal/src/ConfigGlobal.vue new file mode 100644 index 0000000..5bd90cf --- /dev/null +++ b/src/components/ConfigGlobal/src/ConfigGlobal.vue @@ -0,0 +1,62 @@ + + + diff --git a/src/components/ConfigGlobal/src/types/index.ts b/src/components/ConfigGlobal/src/types/index.ts new file mode 100644 index 0000000..d41e4d3 --- /dev/null +++ b/src/components/ConfigGlobal/src/types/index.ts @@ -0,0 +1,5 @@ +import { ComponentSize } from 'element-plus' + +export interface ConfigGlobalTypes { + size?: ComponentSize +} diff --git a/src/components/ContentDetailWrap/index.ts b/src/components/ContentDetailWrap/index.ts new file mode 100644 index 0000000..1871cac --- /dev/null +++ b/src/components/ContentDetailWrap/index.ts @@ -0,0 +1,3 @@ +import ContentDetailWrap from './src/ContentDetailWrap.vue' + +export { ContentDetailWrap } diff --git a/src/components/ContentDetailWrap/src/ContentDetailWrap.vue b/src/components/ContentDetailWrap/src/ContentDetailWrap.vue new file mode 100644 index 0000000..29b4ff7 --- /dev/null +++ b/src/components/ContentDetailWrap/src/ContentDetailWrap.vue @@ -0,0 +1,25 @@ + + + diff --git a/src/components/ContentWrap/index.ts b/src/components/ContentWrap/index.ts new file mode 100644 index 0000000..8c22cc8 --- /dev/null +++ b/src/components/ContentWrap/index.ts @@ -0,0 +1,3 @@ +import ContentWrap from './src/ContentWrap.vue' + +export { ContentWrap } diff --git a/src/components/ContentWrap/src/ContentWrap.vue b/src/components/ContentWrap/src/ContentWrap.vue new file mode 100644 index 0000000..8557e81 --- /dev/null +++ b/src/components/ContentWrap/src/ContentWrap.vue @@ -0,0 +1,36 @@ + + + diff --git a/src/components/ContextMenu/index.ts b/src/components/ContextMenu/index.ts new file mode 100644 index 0000000..1b5442d --- /dev/null +++ b/src/components/ContextMenu/index.ts @@ -0,0 +1,12 @@ +import ContextMenu from './src/ContextMenu.vue' +import { ElDropdown } from 'element-plus' +import type { RouteLocationNormalizedLoaded } from 'vue-router' + +export type { ContextMenuSchema } from './src/types' + +export interface ContextMenuExpose { + elDropdownMenuRef: ComponentRef + tagItem: RouteLocationNormalizedLoaded +} + +export { ContextMenu } diff --git a/src/components/ContextMenu/src/ContextMenu.vue b/src/components/ContextMenu/src/ContextMenu.vue new file mode 100644 index 0000000..9583037 --- /dev/null +++ b/src/components/ContextMenu/src/ContextMenu.vue @@ -0,0 +1,72 @@ + + + diff --git a/src/components/ContextMenu/src/types/index.ts b/src/components/ContextMenu/src/types/index.ts new file mode 100644 index 0000000..b2be72b --- /dev/null +++ b/src/components/ContextMenu/src/types/index.ts @@ -0,0 +1,7 @@ +export interface ContextMenuSchema { + disabled?: boolean + divided?: boolean + icon?: string + label: string + command?: (item: ContextMenuSchema) => void +} diff --git a/src/components/CountTo/index.ts b/src/components/CountTo/index.ts new file mode 100644 index 0000000..2119f02 --- /dev/null +++ b/src/components/CountTo/index.ts @@ -0,0 +1,3 @@ +import CountTo from './src/CountTo.vue' + +export { CountTo } diff --git a/src/components/CountTo/src/CountTo.vue b/src/components/CountTo/src/CountTo.vue new file mode 100644 index 0000000..cab8ea9 --- /dev/null +++ b/src/components/CountTo/src/CountTo.vue @@ -0,0 +1,180 @@ + + + diff --git a/src/components/Descriptions/index.ts b/src/components/Descriptions/index.ts new file mode 100644 index 0000000..8f9a0f0 --- /dev/null +++ b/src/components/Descriptions/index.ts @@ -0,0 +1,5 @@ +import Descriptions from './src/Descriptions.vue' + +export type { DescriptionsSchema } from './src/types' + +export { Descriptions } diff --git a/src/components/Descriptions/src/Descriptions.vue b/src/components/Descriptions/src/Descriptions.vue new file mode 100644 index 0000000..a4b222b --- /dev/null +++ b/src/components/Descriptions/src/Descriptions.vue @@ -0,0 +1,197 @@ + + + diff --git a/src/components/Descriptions/src/types/index.ts b/src/components/Descriptions/src/types/index.ts new file mode 100644 index 0000000..be55b1c --- /dev/null +++ b/src/components/Descriptions/src/types/index.ts @@ -0,0 +1,15 @@ +export interface DescriptionsSchema { + span?: number // 占多少分 + field: string // 字段名 + label?: string // label名 + width?: string | number + minWidth?: string | number + align?: 'left' | 'center' | 'right' + labelAlign?: 'left' | 'center' | 'right' + className?: string + labelClassName?: string + slots?: { + default?: (...args: any[]) => JSX.Element | null + label?: (...args: any[]) => JSX.Element | null + } +} diff --git a/src/components/Dialog/hooks/useResize.ts b/src/components/Dialog/hooks/useResize.ts new file mode 100644 index 0000000..d52b279 --- /dev/null +++ b/src/components/Dialog/hooks/useResize.ts @@ -0,0 +1,178 @@ +import { ref } from 'vue' + +export const useResize = (props?: { + minHeightPx?: number + minWidthPx?: number + initHeight?: number + initWidth?: number +}) => { + const { + minHeightPx = 400, + minWidthPx = window.innerWidth / 2, + initHeight = 400, + initWidth = window.innerWidth / 2 + } = props || {} + // 屏幕宽度的 50% 作为最小宽度 + // const minWidthPx = window.innerWidth / 2 + // 固定的最小高度 400px + // const minHeightPx = 400 + // 初始高度限制为 400px + const maxHeight = ref(initHeight + 'px') + // 初始宽度限制为 50% + const minWidth = ref(initWidth + 'px') + const setupDrag = (elDialog: any, el: any) => { + // 获取对话框元素 + // 是否正在调整大小的标志 + let isResizing = false + // 当前调整的方向 + let currentResizeDirection = '' + + // 鼠标移动时的事件处理器,用于检测鼠标位置并设置相应的光标样式 + const handleMouseMove = (e: any) => { + const rect = elDialog.getBoundingClientRect() + // 鼠标相对于对话框左侧的偏移量 + const offsetX = e.clientX - rect.left + // 鼠标相对于对话框顶部的偏移量 + const offsetY = e.clientY - rect.top + const width = elDialog.clientWidth + const height = elDialog.clientHeight + + // 获取对话框的内边距 + const computedStyle = window.getComputedStyle(elDialog) + const paddingLeft = parseFloat(computedStyle.paddingLeft) + const paddingRight = parseFloat(computedStyle.paddingRight) + const paddingBottom = parseFloat(computedStyle.paddingBottom) + const paddingTop = parseFloat(computedStyle.paddingTop) + + // 根据鼠标位置设置相应的光标样式和调整方向 + if (!isResizing) { + if (offsetX < paddingLeft && offsetY > paddingTop && offsetY < height - paddingBottom) { + elDialog.style.cursor = 'ew-resize' // 左右箭头 + currentResizeDirection = 'left' + } else if ( + offsetX > width - paddingRight && + offsetY > paddingTop && + offsetY < height - paddingBottom + ) { + elDialog.style.cursor = 'ew-resize' // 左右箭头 + currentResizeDirection = 'right' + } else if ( + offsetY < paddingTop && + offsetX > paddingLeft && + offsetX < width - paddingRight + ) { + elDialog.style.cursor = 'ns-resize' // 上下箭头 + currentResizeDirection = 'top' + } else if ( + offsetY > height - paddingBottom && + offsetX > paddingLeft && + offsetX < width - paddingRight + ) { + elDialog.style.cursor = 'ns-resize' // 上下箭头 + currentResizeDirection = 'bottom' + } else if (offsetX < paddingLeft && offsetY < paddingTop) { + elDialog.style.cursor = 'nwse-resize' // 左上右下箭头 + currentResizeDirection = 'top-left' + } else if (offsetX > width - paddingRight && offsetY < paddingTop) { + elDialog.style.cursor = 'nesw-resize' // 右上左下箭头 + currentResizeDirection = 'top-right' + } else if (offsetX < paddingLeft && offsetY > height - paddingBottom) { + elDialog.style.cursor = 'nesw-resize' // 右上左下箭头 + currentResizeDirection = 'bottom-left' + } else if (offsetX > width - paddingRight && offsetY > height - paddingBottom) { + elDialog.style.cursor = 'nwse-resize' // 左上右下箭头 + currentResizeDirection = 'bottom-right' + } else { + elDialog.style.cursor = 'default' + currentResizeDirection = '' + } + } + } + + // 鼠标按下时的事件处理器,开始调整对话框大小 + const handleMouseDown = (e) => { + if (currentResizeDirection) { + isResizing = true + + const initialX = e.clientX + const initialY = e.clientY + const initialWidth = elDialog.clientWidth + const initialHeight = el.querySelector('.el-dialog__body').clientHeight + + // 调整大小的事件处理器 + const handleResizing = (e: any) => { + if (!isResizing) return + + let newWidth = initialWidth + let newHeight = initialHeight + + // 根据当前调整方向计算新的宽度和高度 + if (currentResizeDirection.includes('right')) { + newWidth = Math.max(minWidthPx, initialWidth + (e.clientX - initialX) * 2) + minWidth.value = `${newWidth}px` + } + + if (currentResizeDirection.includes('left')) { + newWidth = Math.max(minWidthPx, initialWidth - (e.clientX - initialX) * 2) + minWidth.value = `${newWidth}px` + } + + if (currentResizeDirection.includes('bottom')) { + newHeight = Math.max(minHeightPx, initialHeight + (e.clientY - initialY) * 2 - 20) + maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px` + } + + if (currentResizeDirection.includes('top')) { + newHeight = Math.max(minHeightPx, initialHeight - (e.clientY - initialY) * 2 - 20) + maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px` + } + + if (currentResizeDirection === 'top-left') { + newWidth = Math.max(minWidthPx, initialWidth - (e.clientX - initialX) * 2) + minWidth.value = `${newWidth}px` + newHeight = Math.max(minHeightPx, initialHeight - (e.clientY - initialY) * 2 - 20) + maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px` + } + + if (currentResizeDirection === 'top-right') { + newWidth = Math.max(minWidthPx, initialWidth + (e.clientX - initialX) * 2) + minWidth.value = `${newWidth}px` + newHeight = Math.max(minHeightPx, initialHeight - (e.clientY - initialY) * 2 - 20) + maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px` + } + + if (currentResizeDirection === 'bottom-left') { + newWidth = Math.max(minWidthPx, initialWidth - (e.clientX - initialX) * 2) + minWidth.value = `${newWidth}px` + newHeight = Math.max(minHeightPx, initialHeight + (e.clientY - initialY) * 2 - 20) + maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px` + } + + if (currentResizeDirection === 'bottom-right') { + newWidth = Math.max(minWidthPx, initialWidth + (e.clientX - initialX) * 2) + minWidth.value = `${newWidth}px` + newHeight = Math.max(minHeightPx, initialHeight + (e.clientY - initialY) * 2 - 20) + maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px` + } + } + // 停止调整大小的事件处理器 + const stopResizing = () => { + isResizing = false + document.removeEventListener('mousemove', handleResizing) + document.removeEventListener('mouseup', stopResizing) + } + + document.addEventListener('mousemove', handleResizing) + document.addEventListener('mouseup', stopResizing) + } + } + elDialog.addEventListener('mousemove', handleMouseMove) + elDialog.addEventListener('mousedown', handleMouseDown) + } + + return { + setupDrag, + maxHeight, + minWidth + } +} diff --git a/src/components/Dialog/index.ts b/src/components/Dialog/index.ts new file mode 100644 index 0000000..1655dad --- /dev/null +++ b/src/components/Dialog/index.ts @@ -0,0 +1,3 @@ +import Dialog from './src/Dialog.vue' + +export { Dialog } diff --git a/src/components/Dialog/src/Dialog.vue b/src/components/Dialog/src/Dialog.vue new file mode 100644 index 0000000..611d702 --- /dev/null +++ b/src/components/Dialog/src/Dialog.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/src/components/Dialog/src/ResizeDialog.vue b/src/components/Dialog/src/ResizeDialog.vue new file mode 100644 index 0000000..d604e12 --- /dev/null +++ b/src/components/Dialog/src/ResizeDialog.vue @@ -0,0 +1,73 @@ + + diff --git a/src/components/Echart/index.ts b/src/components/Echart/index.ts new file mode 100644 index 0000000..4822092 --- /dev/null +++ b/src/components/Echart/index.ts @@ -0,0 +1,3 @@ +import Echart from './src/Echart.vue' + +export { Echart } diff --git a/src/components/Echart/src/Echart.vue b/src/components/Echart/src/Echart.vue new file mode 100644 index 0000000..58cae29 --- /dev/null +++ b/src/components/Echart/src/Echart.vue @@ -0,0 +1,115 @@ + + + diff --git a/src/components/Editor/index.ts b/src/components/Editor/index.ts new file mode 100644 index 0000000..3fbf0a9 --- /dev/null +++ b/src/components/Editor/index.ts @@ -0,0 +1,8 @@ +import Editor from './src/Editor.vue' +import { IDomEditor } from '@wangeditor/editor' + +export interface EditorExpose { + getEditorRef: () => Promise +} + +export { Editor } diff --git a/src/components/Editor/src/Editor.vue b/src/components/Editor/src/Editor.vue new file mode 100644 index 0000000..0bb3452 --- /dev/null +++ b/src/components/Editor/src/Editor.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/src/components/Error/index.ts b/src/components/Error/index.ts new file mode 100644 index 0000000..a52c6f9 --- /dev/null +++ b/src/components/Error/index.ts @@ -0,0 +1,3 @@ +import Error from './src/Error.vue' + +export { Error } diff --git a/src/components/Error/src/Error.vue b/src/components/Error/src/Error.vue new file mode 100644 index 0000000..b18af60 --- /dev/null +++ b/src/components/Error/src/Error.vue @@ -0,0 +1,57 @@ + + + diff --git a/src/components/Footer/index.ts b/src/components/Footer/index.ts new file mode 100644 index 0000000..bd052e0 --- /dev/null +++ b/src/components/Footer/index.ts @@ -0,0 +1,3 @@ +import Footer from './src/Footer.vue' + +export { Footer } diff --git a/src/components/Footer/src/Footer.vue b/src/components/Footer/src/Footer.vue new file mode 100644 index 0000000..50b7ce7 --- /dev/null +++ b/src/components/Footer/src/Footer.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/components/Form/index.ts b/src/components/Form/index.ts new file mode 100644 index 0000000..6688425 --- /dev/null +++ b/src/components/Form/index.ts @@ -0,0 +1,48 @@ +import Form from './src/Form.vue' +import type { FormSchema, FormSetProps } from './src/types' +export type { + ComponentNameEnum, + ComponentName, + InputComponentProps, + AutocompleteComponentProps, + InputNumberComponentProps, + SelectOption, + SelectComponentProps, + SelectV2ComponentProps, + CascaderComponentProps, + SwitchComponentProps, + RateComponentProps, + ColorPickerComponentProps, + TransferComponentProps, + RadioOption, + RadioGroupComponentProps, + RadioButtonComponentProps, + CheckboxOption, + CheckboxGroupComponentProps, + DividerComponentProps, + DatePickerComponentProps, + DateTimePickerComponentProps, + TimePickerComponentProps, + TimeSelectComponentProps, + ColProps, + FormSetProps, + FormItemProps, + FormSchema, + FormProps, + PlaceholderModel, + InputPasswordComponentProps, + TreeSelectComponentProps +} from './src/types' + +export interface FormExpose { + setValues: (data: Recordable) => void + setProps: (props: Recordable) => void + delSchema: (field: string) => void + addSchema: (formSchema: FormSchema, index?: number) => void + setSchema: (schemaProps: FormSetProps[]) => void + formModel: Recordable + getComponentExpose: (field: string) => any + getFormItemExpose: (field: string) => any +} + +export { Form } diff --git a/src/components/Form/src/Form.vue b/src/components/Form/src/Form.vue new file mode 100644 index 0000000..22de784 --- /dev/null +++ b/src/components/Form/src/Form.vue @@ -0,0 +1,443 @@ + + + diff --git a/src/components/Form/src/components/useRenderCheckbox.tsx b/src/components/Form/src/components/useRenderCheckbox.tsx new file mode 100644 index 0000000..63afb10 --- /dev/null +++ b/src/components/Form/src/components/useRenderCheckbox.tsx @@ -0,0 +1,31 @@ +import { FormSchema, ComponentNameEnum, CheckboxGroupComponentProps } from '../types' +import { ElCheckbox, ElCheckboxButton } from 'element-plus' +import { defineComponent } from 'vue' + +export const useRenderCheckbox = () => { + const renderCheckboxOptions = (item: FormSchema) => { + // 如果有别名,就取别名 + const componentProps = item?.componentProps as CheckboxGroupComponentProps + const valueAlias = componentProps?.props?.value || 'value' + const labelAlias = componentProps?.props?.label || 'label' + const disabledAlias = componentProps?.props?.disabled || 'disabled' + const Com = ( + item.component === ComponentNameEnum.CHECKBOX_GROUP ? ElCheckbox : ElCheckboxButton + ) as ReturnType + return componentProps?.options?.map((option) => { + const { ...other } = option + return ( + + ) + }) + } + + return { + renderCheckboxOptions + } +} diff --git a/src/components/Form/src/components/useRenderRadio.tsx b/src/components/Form/src/components/useRenderRadio.tsx new file mode 100644 index 0000000..fc9842b --- /dev/null +++ b/src/components/Form/src/components/useRenderRadio.tsx @@ -0,0 +1,31 @@ +import { FormSchema, ComponentNameEnum, RadioGroupComponentProps } from '../types' +import { ElRadio, ElRadioButton } from 'element-plus' +import { defineComponent } from 'vue' + +export const useRenderRadio = () => { + const renderRadioOptions = (item: FormSchema) => { + // 如果有别名,就取别名 + const componentProps = item?.componentProps as RadioGroupComponentProps + const valueAlias = componentProps?.props?.value || 'value' + const labelAlias = componentProps?.props?.label || 'label' + const disabledAlias = componentProps?.props?.disabled || 'disabled' + const Com = ( + item.component === ComponentNameEnum.RADIO_GROUP ? ElRadio : ElRadioButton + ) as ReturnType + return componentProps?.options?.map((option) => { + const { ...other } = option + return ( + + ) + }) + } + + return { + renderRadioOptions + } +} diff --git a/src/components/Form/src/components/useRenderSelect.tsx b/src/components/Form/src/components/useRenderSelect.tsx new file mode 100644 index 0000000..46389af --- /dev/null +++ b/src/components/Form/src/components/useRenderSelect.tsx @@ -0,0 +1,58 @@ +import { ElOption, ElOptionGroup } from 'element-plus' +import { FormSchema, SelectComponentProps, SelectOption } from '../types' + +export const useRenderSelect = () => { + // 渲染 select options + const renderSelectOptions = (item: FormSchema) => { + const componentsProps = item?.componentProps as SelectComponentProps + const optionGroupDefaultSlot = componentsProps?.slots?.optionGroupDefault + // 如果有别名,就取别名 + const labelAlias = componentsProps?.props?.label + const keyAlias = componentsProps?.props?.key + return componentsProps?.options?.map((option) => { + if (option?.options?.length) { + return optionGroupDefaultSlot ? ( + optionGroupDefaultSlot(option) + ) : ( + + {{ + default: () => + option?.options?.map((v) => { + return renderSelectOptionItem(item, v) + }) + }} + + ) + } else { + return renderSelectOptionItem(item, option) + } + }) + } + + // 渲染 select option item + const renderSelectOptionItem = (item: FormSchema, option: SelectOption) => { + // 如果有别名,就取别名 + const componentsProps = item.componentProps as SelectComponentProps + const labelAlias = componentsProps?.props?.label + const valueAlias = componentsProps?.props?.value + const keyAlias = componentsProps?.props?.key + const optionDefaultSlot = componentsProps.slots?.optionDefault + + return ( + + {{ + default: () => (optionDefaultSlot ? optionDefaultSlot(option) : undefined) + }} + + ) + } + + return { + renderSelectOptions + } +} diff --git a/src/components/Form/src/helper/componentMap.ts b/src/components/Form/src/helper/componentMap.ts new file mode 100644 index 0000000..df2714f --- /dev/null +++ b/src/components/Form/src/helper/componentMap.ts @@ -0,0 +1,59 @@ +import type { Component } from 'vue' +import { + ElCascader, + ElCheckboxGroup, + ElColorPicker, + ElDatePicker, + ElInput, + ElInputNumber, + ElRadioGroup, + ElRate, + ElSelect, + ElSelectV2, + ElSlider, + ElSwitch, + ElTimePicker, + ElTimeSelect, + ElTransfer, + ElAutocomplete, + ElDivider, + ElTreeSelect, + ElUpload +} from 'element-plus' +import { InputPassword } from '@/components/InputPassword' +import { Editor } from '@/components/Editor' +import { JsonEditor } from '@/components/JsonEditor' +import { IconPicker } from '@/components/IconPicker' +import { IAgree } from '@/components/IAgree' +import { ComponentName } from '../types' + +const componentMap: Recordable = { + RadioGroup: ElRadioGroup, + RadioButton: ElRadioGroup, + CheckboxGroup: ElCheckboxGroup, + CheckboxButton: ElCheckboxGroup, + Input: ElInput, + Autocomplete: ElAutocomplete, + InputNumber: ElInputNumber, + Select: ElSelect, + Cascader: ElCascader, + Switch: ElSwitch, + Slider: ElSlider, + TimePicker: ElTimePicker, + DatePicker: ElDatePicker, + Rate: ElRate, + ColorPicker: ElColorPicker, + Transfer: ElTransfer, + Divider: ElDivider, + TimeSelect: ElTimeSelect, + SelectV2: ElSelectV2, + InputPassword: InputPassword, + Editor: Editor, + TreeSelect: ElTreeSelect, + Upload: ElUpload, + JsonEditor: JsonEditor, + IconPicker: IconPicker, + IAgree: IAgree +} + +export { componentMap } diff --git a/src/components/Form/src/helper/index.ts b/src/components/Form/src/helper/index.ts new file mode 100644 index 0000000..2ba1dc2 --- /dev/null +++ b/src/components/Form/src/helper/index.ts @@ -0,0 +1,169 @@ +import { useI18n } from '@/hooks/web/useI18n' +import { PlaceholderModel, FormSchema, ComponentNameEnum, ColProps } from '../types' +import { isFunction } from '@/utils/is' +import { firstUpperCase, humpToDash } from '@/utils' +import { set, get } from 'lodash-es' + +const { t } = useI18n() + +/** + * + * @param schema 对应组件数据 + * @returns 返回提示信息对象 + * @description 用于自动设置placeholder + */ +export const setTextPlaceholder = (schema: FormSchema): PlaceholderModel => { + const textMap = [ + ComponentNameEnum.INPUT, + ComponentNameEnum.AUTOCOMPLETE, + ComponentNameEnum.INPUT_NUMBER, + ComponentNameEnum.INPUT_PASSWORD + ] + const selectMap = [ + ComponentNameEnum.SELECT, + ComponentNameEnum.TIME_PICKER, + ComponentNameEnum.DATE_PICKER, + ComponentNameEnum.TIME_SELECT, + ComponentNameEnum.SELECT_V2 + ] + if (textMap.includes(schema?.component as ComponentNameEnum)) { + return { + placeholder: t('common.inputText') + } + } + if (selectMap.includes(schema?.component as ComponentNameEnum)) { + // 一些范围选择器 + const twoTextMap = ['datetimerange', 'daterange', 'monthrange', 'datetimerange', 'daterange'] + if ( + twoTextMap.includes( + ((schema?.componentProps as any)?.type || + (schema?.componentProps as any)?.isRange) as string + ) + ) { + return { + startPlaceholder: t('common.startTimeText'), + endPlaceholder: t('common.endTimeText'), + rangeSeparator: '-' + } + } else { + return { + placeholder: t('common.selectText') + } + } + } + return {} +} + +/** + * + * @param col 内置栅格 + * @returns 返回栅格属性 + * @description 合并传入进来的栅格属性 + */ +export const setGridProp = (col: ColProps = {}): ColProps => { + const colProps: ColProps = { + // 如果有span,代表用户优先级更高,所以不需要默认栅格 + ...(col.span + ? {} + : { + xs: 24, + sm: 12, + md: 12, + lg: 12, + xl: 12 + }), + ...col + } + return colProps +} + +/** + * + * @param item 传入的组件属性 + * @returns 默认添加 clearable 属性 + */ +export const setComponentProps = (item: FormSchema): Recordable => { + // const notNeedClearable = ['ColorPicker'] + // 拆分事件并组合 + const onEvents = (item?.componentProps as any)?.on || {} + const newOnEvents: Recordable = {} + + for (const key in onEvents) { + if (onEvents[key]) { + newOnEvents[`on${firstUpperCase(key)}`] = (...args: any[]) => { + onEvents[key](...args) + } + } + } + + const componentProps: Recordable = { + clearable: true, + ...item.componentProps, + ...newOnEvents + } + // 需要删除额外的属性 + if (componentProps.slots) { + delete componentProps.slots + } + if (componentProps.on) { + delete componentProps.on + } + return componentProps +} + +/** + * + * @param formModel 表单数据 + * @param slotsProps 插槽属性 + */ +export const setItemComponentSlots = (slotsProps: Recordable = {}): Recordable => { + const slotObj: Recordable = {} + for (const key in slotsProps) { + if (slotsProps[key]) { + if (isFunction(slotsProps[key])) { + slotObj[humpToDash(key)] = (...args: any[]) => { + return slotsProps[key]?.(...args) + } + } else { + slotObj[humpToDash(key)] = () => { + return slotsProps[key] + } + } + } + } + return slotObj +} + +/** + * + * @param schema Form表单结构化数组 + * @param formModel FormMoel + * @returns FormMoel + * @description 生成对应的formModel + */ +export const initModel = (schema: FormSchema[], formModel: Recordable) => { + const model: Recordable = { ...formModel } + schema.map((v) => { + if (v.remove) { + delete model[v.field] + } else if (v.component !== 'Divider') { + // const hasField = Reflect.has(model, v.field) + const hasField = get(model, v.field) + // 如果先前已经有值存在,则不进行重新赋值,而是采用现有的值 + set( + model, + v.field, + hasField !== void 0 ? get(model, v.field) : v.value !== void 0 ? v.value : undefined + ) + // model[v.field] = hasField ? model[v.field] : v.value !== void 0 ? v.value : undefined + } + }) + // 如果 schema 对应的 field 不存在,则删除 model 中的对应的 field + for (let i = 0; i < schema.length; i++) { + const key = schema[i].field + if (!Object.prototype.hasOwnProperty.call(model, key)) { + delete model[key] + } + } + return model +} diff --git a/src/components/Form/src/types/index.ts b/src/components/Form/src/types/index.ts new file mode 100644 index 0000000..ac80193 --- /dev/null +++ b/src/components/Form/src/types/index.ts @@ -0,0 +1,670 @@ +import { + AutocompleteProps, + InputNumberProps, + CascaderProps, + CascaderNode, + CascaderValue, + SwitchProps, + ComponentSize, + InputProps, + RateProps, + ColorPickerProps, + TransferProps, + RadioGroupProps, + RadioButtonProps, + CheckboxGroupProps, + DividerProps, + DatePickerProps, + FormItemProps as ElFormItemProps, + FormProps as ElFormProps, + ISelectProps, + UploadProps +} from 'element-plus' +import { IEditorConfig } from '@wangeditor/editor' +import { JsonEditorProps } from '@/components/JsonEditor' +import { IAgreeProps } from '@/components/IAgree' +import { CSSProperties } from 'vue' + +export interface PlaceholderModel { + placeholder?: string + startPlaceholder?: string + endPlaceholder?: string + rangeSeparator?: string +} + +export enum ComponentNameEnum { + RADIO_GROUP = 'RadioGroup', + RADIO_BUTTON = 'RadioButton', + CHECKBOX_GROUP = 'CheckboxGroup', + CHECKBOX_BUTTON = 'CheckboxButton', + INPUT = 'Input', + AUTOCOMPLETE = 'Autocomplete', + INPUT_NUMBER = 'InputNumber', + SELECT = 'Select', + CASCADER = 'Cascader', + SWITCH = 'Switch', + SLIDER = 'Slider', + TIME_PICKER = 'TimePicker', + DATE_PICKER = 'DatePicker', + RATE = 'Rate', + COLOR_PICKER = 'ColorPicker', + TRANSFER = 'Transfer', + DIVIDER = 'Divider', + TIME_SELECT = 'TimeSelect', + SELECT_V2 = 'SelectV2', + INPUT_PASSWORD = 'InputPassword', + EDITOR = 'Editor', + TREE_SELECT = 'TreeSelect', + UPLOAD = 'Upload', + JSON_EDITOR = 'JsonEditor', + ICON_PICKER = 'IconPicker', + I_AGREE = 'IAgree' +} + +type CamelCaseComponentName = keyof typeof ComponentNameEnum extends infer K + ? K extends string + ? K extends `${infer A}_${infer B}` + ? `${Capitalize>}${Capitalize>}` + : Capitalize> + : never + : never + +export type ComponentName = CamelCaseComponentName + +export interface InputPasswordComponentProps { + strength?: boolean + style?: CSSProperties +} + +export interface InputComponentProps extends Partial { + rows?: number + on?: { + blur?: (event: FocusEvent) => void + focus?: (event: FocusEvent) => void + change?: (value: string | number) => void + clear?: () => void + input?: (value: string | number) => void + } + slots?: { + prefix?: (...args: any[]) => JSX.Element | null + suffix?: (...args: any[]) => JSX.Element | null + prepend?: (...args: any[]) => JSX.Element | null + append?: (...args: any[]) => JSX.Element | null + } + style?: CSSProperties +} + +export interface AutocompleteComponentProps extends Partial { + on?: { + select?: (item: any) => void + change?: (value: string | number) => void + } + slots?: { + default?: (...args: any[]) => JSX.Element | null + prefix?: (...args: any[]) => JSX.Element | null + suffix?: (...args: any[]) => JSX.Element | null + prepend?: (...args: any[]) => JSX.Element | null + append?: (...args: any[]) => JSX.Element | null + } + style?: CSSProperties +} + +export interface InputNumberComponentProps extends Partial { + on?: { + change?: (currentValue: number | undefined, oldValue: number | undefined) => void + blur?: (event: FocusEvent) => void + focus?: (event: FocusEvent) => void + } + style?: CSSProperties +} + +export interface SelectOption { + label?: string + disabled?: boolean + value?: any + key?: string | number + options?: SelectOption[] + [key: string]: any +} + +export interface SelectComponentProps extends Omit, 'options'> { + /** + * 数据源的字段别名 + */ + props?: { + key?: string + value?: string + label?: string + children?: string + } + on?: { + change?: (value: string | number | boolean | object) => void + visibleChange?: (visible: boolean) => void + removeTag?: (tag: any) => void + clear?: () => void + blur?: (event: FocusEvent) => void + focus?: (event: FocusEvent) => void + } + slots?: { + default?: (options: SelectOption[]) => JSX.Element[] | null + optionGroupDefault?: (item: SelectOption) => JSX.Element + optionDefault?: (option: SelectOption) => JSX.Element | null + prefix?: (...args: any[]) => JSX.Element | null + empty?: (...args: any[]) => JSX.Element | null + } + options?: SelectOption[] + style?: CSSProperties +} + +export interface SelectV2ComponentProps { + multiple?: boolean + disabled?: boolean + valueKey?: string + size?: ComponentSize + clearable?: boolean + clearIcon?: string | JSX.Element | null + collapseTags?: boolean + multipleLimit?: number + name?: string + effect?: string + autocomplete?: string + placeholder?: string + filterable?: boolean + allowCreate?: boolean + reserveKeyword?: boolean + noDataText?: string + popperClass?: string + teleported?: boolean + persistent?: boolean + popperOptions?: any + automaticDropdown?: boolean + height?: number + scrollbarAlwaysOn?: boolean + remote?: boolean + remoteMethod?: (query: string) => void + validateEvent?: boolean + placement?: AutocompleteProps['placement'] + collapseTagsTooltip?: boolean + on?: { + change?: (value: string | number | boolean | object) => void + visibleChange?: (visible: boolean) => void + removeTag?: (tag: any) => void + clear?: () => void + blur?: (event: FocusEvent) => void + focus?: (event: FocusEvent) => void + } + options?: SelectOption[] + slots?: { + default?: (option: SelectOption) => JSX.Element | null + } + style?: CSSProperties +} + +export interface CascaderComponentProps { + options?: Record[] + props?: CascaderProps + size?: ComponentSize + placeholder?: string + disabled?: boolean + clearable?: boolean + showAllLevels?: boolean + collapseTags?: boolean + collapseTagsTooltip?: boolean + separator?: string + filterable?: boolean + filterMethod?: (node: CascaderNode, keyword: string) => boolean + debounce?: number + beforeFilter?: (value: string) => boolean + popperClass?: string + teleported?: boolean + tagType?: ElementPlusInfoType + validateEvent?: boolean + on?: { + change?: (value: CascaderValue) => void + expandChange?: (value: CascaderValue) => void + blur?: (event: FocusEvent) => void + focus?: (event: FocusEvent) => void + visibleChange?: (value: boolean) => void + removeTag?: (value: CascaderNode['valueByOption']) => void + } + slots?: { + default?: (...args: any[]) => JSX.Element | null + empty?: (...args: any[]) => JSX.Element | null + } + style?: CSSProperties +} + +export interface SwitchComponentProps extends Partial { + on?: { + change?: (value: boolean | string | number) => void + } + style?: CSSProperties +} + +export interface RateComponentProps extends Partial { + on?: { + change?: (value: number) => void + } + style?: CSSProperties +} + +export interface ColorPickerComponentProps extends Partial { + on?: { + change?: (value: string) => void + activeChange?: (value: string) => void + } + style?: CSSProperties +} + +export interface TransferComponentProps extends Partial { + on?: { + change?: ( + value: number | string, + direction: 'left' | 'right', + movedKeys: string[] | number[] + ) => void + leftCheckChange?: (value: any[]) => void + rightCheckChange?: (value: any[]) => void + } + slots?: { + default?: (...args: any[]) => JSX.Element | null + leftFooter?: (...args: any[]) => JSX.Element | null + rightFooter?: (...args: any[]) => JSX.Element | null + } + style?: CSSProperties +} + +export interface RadioOption { + label?: string + value?: string | number | boolean + disabled?: boolean + border?: boolean + size?: ComponentSize + name?: string + [key: string]: any +} +export interface RadioGroupComponentProps extends Partial { + options?: RadioOption[] + /** + * 数据源的字段别名 + */ + props?: { + label?: string + value?: string + disabled?: string + } + on?: { + change?: (value: string | number | boolean) => void + } + slots?: { + default?: (...args: any[]) => JSX.Element[] | null + } + style?: CSSProperties +} + +export interface RadioButtonComponentProps extends Partial { + options?: RadioOption[] + /** + * 数据源的字段别名 + */ + props?: { + label?: string + value?: string + disabled?: string + } + on?: { + change?: (value: string | number | boolean) => void + } + slots?: { + default?: (...args: any[]) => JSX.Element[] | null + } + style?: CSSProperties +} + +export interface CheckboxOption { + label?: string + value?: string | number | boolean + disabled?: boolean + trueLabel?: string | number + falseLabel?: string | number + border?: boolean + size?: ComponentSize + name?: string + checked?: boolean + indeterminate?: boolean + validateEvent?: boolean + tabindex?: number | string + id?: string + controls?: boolean + [key: string]: any +} + +export interface CheckboxGroupComponentProps extends Partial { + options?: CheckboxOption[] + /** + * 数据源的字段别名 + */ + props?: { + label?: string + value?: string + disabled?: string + } + on?: { + change?: (value: string | number | boolean) => void + } + slots?: { + default?: (...args: any[]) => JSX.Element[] | null + } + style?: CSSProperties +} + +export interface DividerComponentProps extends Partial { + on?: { + change?: (value: number) => void + input?: (value: number) => void + } + style?: CSSProperties +} + +export interface DatePickerComponentProps extends Partial { + on?: { + change?: (value: string | Date | number | string[]) => void + blur?: (event: FocusEvent) => void + focus?: (event: FocusEvent) => void + calendarChange?: (val: [Date, Date]) => void + panelChange?: (date, mode, view) => void + visibleChange?: (visibility: boolean) => void + } + slots?: { + default?: (...args: any[]) => JSX.Element | null + rangeSeparator?: (...args: any[]) => JSX.Element | null + } + style?: CSSProperties +} + +export interface DateTimePickerComponentProps { + readonly?: boolean + disabled?: boolean + editable?: boolean + clearable?: boolean + size?: ComponentSize + placeholder?: string + startPlaceholder?: string + endPlaceholder?: string + timeArrowControl?: boolean + type?: 'year' | 'month' | 'date' | 'datetime' | 'datetimerange' | 'daterange' | 'week' + format?: string + popperClass?: string + rangeSeparator?: string + defaultValue?: Date | [Date, Date] + defaultTime?: Date | [Date, Date] + valueFormat?: string + id?: string + name?: string + unlinkPanels?: boolean + prefixIcon?: string | JSX.Element + clearIcon?: string | JSX.Element + shortcuts?: Array<{ text: string; value: Date | Function }> + disabledDate?: (date: Date) => boolean + cellClassName?: string | ((date: Date) => string | undefined) + teleported?: boolean + on?: { + change?: (value: string | Date | number | string[]) => void + blur?: (event: FocusEvent) => void + focus?: (event: FocusEvent) => void + calendarChange?: (val: [Date, Date]) => void + visibleChange?: (visibility: boolean) => void + } + slots?: { + default?: (...args: any[]) => JSX.Element | null + rangeSeparator?: (...args: any[]) => JSX.Element | null + } + style?: CSSProperties +} + +export interface TimePickerComponentProps { + readonly?: boolean + disabled?: boolean + editable?: boolean + clearable?: boolean + size?: ComponentSize + placeholder?: string + startPlaceholder?: string + endPlaceholder?: string + isRange?: boolean + arrowControl?: boolean + popperClass?: string + rangeSeparator?: string + format?: string + defaultValue?: Date | [Date, Date] + id?: string + name?: string + label?: string + prefixIcon?: string | JSX.Element + clearIcon?: string | JSX.Element + disabledHours?: (role: string, comparingDate?: any) => number[] + disabledMinutes?: (hour: number, role: string, comparingDate?: any) => number[] + disabledSeconds?: (hour: number, minute: number, role: string, comparingDate?: any) => number[] + teleported?: boolean + tabindex?: number | string + on?: { + change: ( + val: number | string | Date | [number, number] | [string, string] | [Date, Date] + ) => void + blur?: (event: FocusEvent) => void + focus?: (event: FocusEvent) => void + visibleChange?: (visibility: boolean) => void + } + style?: CSSProperties +} + +export interface TimeSelectComponentProps { + disabled?: boolean + editable?: boolean + clearable?: boolean + size?: ComponentSize + placeholder?: string + name?: string + effect?: string + prefixIcon?: string | JSX.Element + clearIcon?: string | JSX.Element + start?: string + end?: string + step?: string + minTime?: string + maxTime?: string + format?: string + on?: { + change?: (val: string) => void + blur?: (event: FocusEvent) => void + focus?: (event: FocusEvent) => void + } + style?: CSSProperties +} + +export interface EditorComponentProps { + editorConfig?: IEditorConfig + style?: CSSProperties +} + +export interface ColProps { + span?: number + xs?: number + sm?: number + md?: number + lg?: number + xl?: number + tag?: string +} + +export interface FormSetProps { + field: string + path: string + value: any +} + +export interface FormItemProps extends Partial { + style?: CSSProperties + slots?: { + default?: (...args: any[]) => JSX.Element | null + label?: (...args: any[]) => JSX.Element | null + error?: (...args: any[]) => JSX.Element | null + } +} + +export interface UploadComponentProps extends Partial { + slots?: { + default?: (...args: any[]) => JSX.Element | null + trigger?: (...args: any[]) => JSX.Element | null + tip?: (...args: any[]) => JSX.Element | null + file?: (...args: any[]) => JSX.Element | null + } + style?: CSSProperties +} + +export interface TreeSelectComponentProps + extends Omit, 'props' | 'on' | 'slots'> { + data?: any[] + emptyText?: string + nodeKey?: string + props?: { + children?: string + label?: string | ((...args: any[]) => string) + disabled?: string | ((...args: any[]) => string) + isLeaf?: string | ((...args: any[]) => string) + class?: string | ((...args: any[]) => string) + } + renderAfterExpand?: boolean + load?: (...args: any[]) => Promise + renderContent?: (...args: any[]) => JSX.Element | null + highlightCurrent?: boolean + defaultExpandAll?: boolean + expandOnClickNode?: boolean + checkOnClickNode?: boolean + autoExpandParent?: boolean + defaultExpandedKeys?: any[] + showCheckbox?: boolean + checkStrictly?: boolean + defaultCheckedKeys?: any[] + currentNodeKey?: string | number + filterNodeMethod?: (...args: any[]) => boolean + accordion?: boolean + indent?: number + icon?: string | ((...args: any[]) => JSX.Element | null) + lazy?: boolean + draggable?: boolean + allowDrag?: (...args: any[]) => boolean + allowDrop?: (...args: any[]) => boolean + on?: { + change?: (value: string | number | boolean | object) => void + visibleChange?: (visible: boolean) => void + removeTag?: (tag: any) => void + clear?: () => void + blur?: (event: FocusEvent) => void + focus?: (event: FocusEvent) => void + nodeClick?: (...args: any[]) => void + nodeContextMenu?: (...args: any[]) => void + checkChange?: (...args: any[]) => void + check?: (...args: any[]) => void + currentChange?: (...args: any[]) => void + nodeExpand?: (...args: any[]) => void + nodeCollapse?: (...args: any[]) => void + nodeDragStart?: (...args: any[]) => void + nodeDragEnter?: (...args: any[]) => void + nodeDragLeave?: (...args: any[]) => void + nodeDragOver?: (...args: any[]) => void + nodeDragEnd?: (...args: any[]) => void + nodeDrop?: (...args: any[]) => void + } + slots?: { + default?: (...args: any[]) => JSX.Element | null + optionGroupDefault?: (item: SelectOption) => JSX.Element + optionDefault?: (option: SelectOption) => JSX.Element | null + prefix?: (...args: any[]) => JSX.Element | null + empty?: (...args: any[]) => JSX.Element | null + } + style?: CSSProperties +} + +export interface FormSchema { + /** + * 唯一标识 + */ + field: string + + /** + * 标题 + */ + label?: string + + /** + * col组件属性 + */ + colProps?: ColProps + + /** + * 表单组件属性,具体可以查看element-plus文档 + */ + componentProps?: + | InputComponentProps + | AutocompleteComponentProps + | InputNumberComponentProps + | SelectComponentProps + | SelectV2ComponentProps + | CascaderComponentProps + | SwitchComponentProps + | RateComponentProps + | ColorPickerComponentProps + | TransferComponentProps + | RadioGroupComponentProps + | RadioButtonComponentProps + | DividerComponentProps + | DatePickerComponentProps + | DateTimePickerComponentProps + | TimePickerComponentProps + | InputPasswordComponentProps + | TreeSelectComponentProps + | UploadComponentProps + | JsonEditorProps + | IAgreeProps + | any + + /** + * formItem组件属性,具体可以查看element-plus文档 + */ + formItemProps?: FormItemProps + + /** + * 渲染的组件名称 + */ + component?: ComponentName + + /** + * 初始值 + */ + value?: any + + /** + * 是否隐藏,如果为true,会连同值一同删除,类似v-if + */ + remove?: boolean + + /** + * 样式隐藏,不会把值一同删掉,类似v-show + */ + hidden?: boolean + + /** + * @returns 远程加载下拉项 + */ + optionApi?: any +} + +export interface FormProps extends Partial { + schema?: FormSchema[] + isCol?: boolean + model?: Recordable + autoSetPlaceholder?: boolean + isCustom?: boolean + [key: string]: any +} diff --git a/src/components/Highlight/index.ts b/src/components/Highlight/index.ts new file mode 100644 index 0000000..3e2d9ed --- /dev/null +++ b/src/components/Highlight/index.ts @@ -0,0 +1,3 @@ +import Highlight from './src/Highlight.vue' + +export { Highlight } diff --git a/src/components/Highlight/src/Highlight.vue b/src/components/Highlight/src/Highlight.vue new file mode 100644 index 0000000..ef923a9 --- /dev/null +++ b/src/components/Highlight/src/Highlight.vue @@ -0,0 +1,65 @@ + diff --git a/src/components/IAgree/index.ts b/src/components/IAgree/index.ts new file mode 100644 index 0000000..8c31125 --- /dev/null +++ b/src/components/IAgree/index.ts @@ -0,0 +1,4 @@ +import IAgree from './src/IAgree.vue' + +export type { LinkItem, IAgreeProps } from './src/types' +export { IAgree } diff --git a/src/components/IAgree/src/IAgree.vue b/src/components/IAgree/src/IAgree.vue new file mode 100644 index 0000000..6a36e23 --- /dev/null +++ b/src/components/IAgree/src/IAgree.vue @@ -0,0 +1,41 @@ + + + diff --git a/src/components/IAgree/src/types/index.ts b/src/components/IAgree/src/types/index.ts new file mode 100644 index 0000000..9ddef75 --- /dev/null +++ b/src/components/IAgree/src/types/index.ts @@ -0,0 +1,10 @@ +export interface LinkItem { + text: string + url?: string + onClick?: () => void +} + +export interface IAgreeProps { + text: string + link: LinkItem[] +} diff --git a/src/components/Icon/index.ts b/src/components/Icon/index.ts new file mode 100644 index 0000000..83469d4 --- /dev/null +++ b/src/components/Icon/index.ts @@ -0,0 +1,5 @@ +import Icon from './src/Icon.vue' + +export type { IconTypes } from './src/types' + +export { Icon } diff --git a/src/components/Icon/src/Icon.vue b/src/components/Icon/src/Icon.vue new file mode 100644 index 0000000..0fa4d73 --- /dev/null +++ b/src/components/Icon/src/Icon.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/src/components/Icon/src/types/index.ts b/src/components/Icon/src/types/index.ts new file mode 100644 index 0000000..632e4e8 --- /dev/null +++ b/src/components/Icon/src/types/index.ts @@ -0,0 +1,6 @@ +export interface IconTypes { + size?: number + color?: string + icon: string + hoverColor?: string +} diff --git a/src/components/IconPicker/index.ts b/src/components/IconPicker/index.ts new file mode 100644 index 0000000..b7b3022 --- /dev/null +++ b/src/components/IconPicker/index.ts @@ -0,0 +1,3 @@ +import IconPicker from './src/IconPicker.vue' + +export { IconPicker } diff --git a/src/components/IconPicker/src/IconPicker.vue b/src/components/IconPicker/src/IconPicker.vue new file mode 100644 index 0000000..34f350d --- /dev/null +++ b/src/components/IconPicker/src/IconPicker.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/src/components/IconPicker/src/data/icons.ant-design.ts b/src/components/IconPicker/src/data/icons.ant-design.ts new file mode 100644 index 0000000..eab2169 --- /dev/null +++ b/src/components/IconPicker/src/data/icons.ant-design.ts @@ -0,0 +1,836 @@ +export default { + name: 'Ant Design Icons', + prefix: 'vi-ant-design', + icons: [ + 'vi-ant-design:account-book-filled', + 'vi-ant-design:account-book-outlined', + 'vi-ant-design:account-book-twotone', + 'vi-ant-design:aim-outlined', + 'vi-ant-design:alert-filled', + 'vi-ant-design:alert-outlined', + 'vi-ant-design:alert-twotone', + 'vi-ant-design:alibaba-outlined', + 'vi-ant-design:align-center-outlined', + 'vi-ant-design:align-left-outlined', + 'vi-ant-design:align-right-outlined', + 'vi-ant-design:alipay-circle-filled', + 'vi-ant-design:alipay-circle-outlined', + 'vi-ant-design:alipay-outlined', + 'vi-ant-design:alipay-square-filled', + 'vi-ant-design:aliwangwang-filled', + 'vi-ant-design:aliwangwang-outlined', + 'vi-ant-design:aliyun-outlined', + 'vi-ant-design:amazon-circle-filled', + 'vi-ant-design:amazon-outlined', + 'vi-ant-design:amazon-square-filled', + 'vi-ant-design:android-filled', + 'vi-ant-design:android-outlined', + 'vi-ant-design:ant-cloud-outlined', + 'vi-ant-design:ant-design-outlined', + 'vi-ant-design:apartment-outlined', + 'vi-ant-design:api-filled', + 'vi-ant-design:api-outlined', + 'vi-ant-design:api-twotone', + 'vi-ant-design:apple-filled', + 'vi-ant-design:apple-outlined', + 'vi-ant-design:appstore-add-outlined', + 'vi-ant-design:appstore-filled', + 'vi-ant-design:appstore-outlined', + 'vi-ant-design:appstore-twotone', + 'vi-ant-design:area-chart-outlined', + 'vi-ant-design:arrow-down-outlined', + 'vi-ant-design:arrow-left-outlined', + 'vi-ant-design:arrow-right-outlined', + 'vi-ant-design:arrow-up-outlined', + 'vi-ant-design:arrows-alt-outlined', + 'vi-ant-design:audio-filled', + 'vi-ant-design:audio-muted-outlined', + 'vi-ant-design:audio-outlined', + 'vi-ant-design:audio-twotone', + 'vi-ant-design:audit-outlined', + 'vi-ant-design:backward-filled', + 'vi-ant-design:backward-outlined', + 'vi-ant-design:baidu-outlined', + 'vi-ant-design:bank-filled', + 'vi-ant-design:bank-outlined', + 'vi-ant-design:bank-twotone', + 'vi-ant-design:bar-chart-outlined', + 'vi-ant-design:barcode-outlined', + 'vi-ant-design:bars-outlined', + 'vi-ant-design:behance-circle-filled', + 'vi-ant-design:behance-outlined', + 'vi-ant-design:behance-square-filled', + 'vi-ant-design:behance-square-outlined', + 'vi-ant-design:bell-filled', + 'vi-ant-design:bell-outlined', + 'vi-ant-design:bell-twotone', + 'vi-ant-design:bg-colors-outlined', + 'vi-ant-design:bilibili-filled', + 'vi-ant-design:bilibili-outlined', + 'vi-ant-design:block-outlined', + 'vi-ant-design:bold-outlined', + 'vi-ant-design:book-filled', + 'vi-ant-design:book-outlined', + 'vi-ant-design:book-twotone', + 'vi-ant-design:border-bottom-outlined', + 'vi-ant-design:border-horizontal-outlined', + 'vi-ant-design:border-inner-outlined', + 'vi-ant-design:border-left-outlined', + 'vi-ant-design:border-outer-outlined', + 'vi-ant-design:border-outlined', + 'vi-ant-design:border-right-outlined', + 'vi-ant-design:border-top-outlined', + 'vi-ant-design:border-verticle-outlined', + 'vi-ant-design:borderless-table-outlined', + 'vi-ant-design:box-plot-filled', + 'vi-ant-design:box-plot-outlined', + 'vi-ant-design:box-plot-twotone', + 'vi-ant-design:branches-outlined', + 'vi-ant-design:bug-filled', + 'vi-ant-design:bug-outlined', + 'vi-ant-design:bug-twotone', + 'vi-ant-design:build-filled', + 'vi-ant-design:build-outlined', + 'vi-ant-design:build-twotone', + 'vi-ant-design:bulb-filled', + 'vi-ant-design:bulb-outlined', + 'vi-ant-design:bulb-twotone', + 'vi-ant-design:calculator-filled', + 'vi-ant-design:calculator-outlined', + 'vi-ant-design:calculator-twotone', + 'vi-ant-design:calendar-filled', + 'vi-ant-design:calendar-outlined', + 'vi-ant-design:calendar-twotone', + 'vi-ant-design:camera-filled', + 'vi-ant-design:camera-outlined', + 'vi-ant-design:camera-twotone', + 'vi-ant-design:car-filled', + 'vi-ant-design:car-outlined', + 'vi-ant-design:car-twotone', + 'vi-ant-design:caret-down-filled', + 'vi-ant-design:caret-down-outlined', + 'vi-ant-design:caret-left-filled', + 'vi-ant-design:caret-left-outlined', + 'vi-ant-design:caret-right-filled', + 'vi-ant-design:caret-right-outlined', + 'vi-ant-design:caret-up-filled', + 'vi-ant-design:caret-up-outlined', + 'vi-ant-design:carry-out-filled', + 'vi-ant-design:carry-out-outlined', + 'vi-ant-design:carry-out-twotone', + 'vi-ant-design:check-circle-filled', + 'vi-ant-design:check-circle-outlined', + 'vi-ant-design:check-circle-twotone', + 'vi-ant-design:check-outlined', + 'vi-ant-design:check-square-filled', + 'vi-ant-design:check-square-outlined', + 'vi-ant-design:check-square-twotone', + 'vi-ant-design:chrome-filled', + 'vi-ant-design:chrome-outlined', + 'vi-ant-design:ci-circle-filled', + 'vi-ant-design:ci-circle-outlined', + 'vi-ant-design:ci-circle-twotone', + 'vi-ant-design:ci-outlined', + 'vi-ant-design:ci-twotone', + 'vi-ant-design:clear-outlined', + 'vi-ant-design:clock-circle-filled', + 'vi-ant-design:clock-circle-outlined', + 'vi-ant-design:clock-circle-twotone', + 'vi-ant-design:close-circle-filled', + 'vi-ant-design:close-circle-outlined', + 'vi-ant-design:close-circle-twotone', + 'vi-ant-design:close-outlined', + 'vi-ant-design:close-square-filled', + 'vi-ant-design:close-square-outlined', + 'vi-ant-design:close-square-twotone', + 'vi-ant-design:cloud-download-outlined', + 'vi-ant-design:cloud-filled', + 'vi-ant-design:cloud-outlined', + 'vi-ant-design:cloud-server-outlined', + 'vi-ant-design:cloud-sync-outlined', + 'vi-ant-design:cloud-twotone', + 'vi-ant-design:cloud-upload-outlined', + 'vi-ant-design:cluster-outlined', + 'vi-ant-design:code-filled', + 'vi-ant-design:code-outlined', + 'vi-ant-design:code-sandbox-circle-filled', + 'vi-ant-design:code-sandbox-outlined', + 'vi-ant-design:code-sandbox-square-filled', + 'vi-ant-design:code-twotone', + 'vi-ant-design:codepen-circle-filled', + 'vi-ant-design:codepen-circle-outlined', + 'vi-ant-design:codepen-outlined', + 'vi-ant-design:codepen-square-filled', + 'vi-ant-design:coffee-outlined', + 'vi-ant-design:column-height-outlined', + 'vi-ant-design:column-width-outlined', + 'vi-ant-design:comment-outlined', + 'vi-ant-design:compass-filled', + 'vi-ant-design:compass-outlined', + 'vi-ant-design:compass-twotone', + 'vi-ant-design:compress-outlined', + 'vi-ant-design:console-sql-outlined', + 'vi-ant-design:contacts-filled', + 'vi-ant-design:contacts-outlined', + 'vi-ant-design:contacts-twotone', + 'vi-ant-design:container-filled', + 'vi-ant-design:container-outlined', + 'vi-ant-design:container-twotone', + 'vi-ant-design:control-filled', + 'vi-ant-design:control-outlined', + 'vi-ant-design:control-twotone', + 'vi-ant-design:copy-filled', + 'vi-ant-design:copy-outlined', + 'vi-ant-design:copy-twotone', + 'vi-ant-design:copyright-circle-filled', + 'vi-ant-design:copyright-circle-outlined', + 'vi-ant-design:copyright-circle-twotone', + 'vi-ant-design:copyright-outlined', + 'vi-ant-design:copyright-twotone', + 'vi-ant-design:credit-card-filled', + 'vi-ant-design:credit-card-outlined', + 'vi-ant-design:credit-card-twotone', + 'vi-ant-design:crown-filled', + 'vi-ant-design:crown-outlined', + 'vi-ant-design:crown-twotone', + 'vi-ant-design:customer-service-filled', + 'vi-ant-design:customer-service-outlined', + 'vi-ant-design:customer-service-twotone', + 'vi-ant-design:dash-outlined', + 'vi-ant-design:dashboard-filled', + 'vi-ant-design:dashboard-outlined', + 'vi-ant-design:dashboard-twotone', + 'vi-ant-design:database-filled', + 'vi-ant-design:database-outlined', + 'vi-ant-design:database-twotone', + 'vi-ant-design:delete-column-outlined', + 'vi-ant-design:delete-filled', + 'vi-ant-design:delete-outlined', + 'vi-ant-design:delete-row-outlined', + 'vi-ant-design:delete-twotone', + 'vi-ant-design:delivered-procedure-outlined', + 'vi-ant-design:deployment-unit-outlined', + 'vi-ant-design:desktop-outlined', + 'vi-ant-design:diff-filled', + 'vi-ant-design:diff-outlined', + 'vi-ant-design:diff-twotone', + 'vi-ant-design:dingding-outlined', + 'vi-ant-design:dingtalk-circle-filled', + 'vi-ant-design:dingtalk-outlined', + 'vi-ant-design:dingtalk-square-filled', + 'vi-ant-design:disconnect-outlined', + 'vi-ant-design:discord-filled', + 'vi-ant-design:discord-outlined', + 'vi-ant-design:dislike-filled', + 'vi-ant-design:dislike-outlined', + 'vi-ant-design:dislike-twotone', + 'vi-ant-design:docker-outlined', + 'vi-ant-design:dollar-circle-filled', + 'vi-ant-design:dollar-circle-outlined', + 'vi-ant-design:dollar-circle-twotone', + 'vi-ant-design:dollar-outlined', + 'vi-ant-design:dollar-twotone', + 'vi-ant-design:dot-chart-outlined', + 'vi-ant-design:dot-net-outlined', + 'vi-ant-design:double-left-outlined', + 'vi-ant-design:double-right-outlined', + 'vi-ant-design:down-circle-filled', + 'vi-ant-design:down-circle-outlined', + 'vi-ant-design:down-circle-twotone', + 'vi-ant-design:down-outlined', + 'vi-ant-design:down-square-filled', + 'vi-ant-design:down-square-outlined', + 'vi-ant-design:down-square-twotone', + 'vi-ant-design:download-outlined', + 'vi-ant-design:drag-outlined', + 'vi-ant-design:dribbble-circle-filled', + 'vi-ant-design:dribbble-outlined', + 'vi-ant-design:dribbble-square-filled', + 'vi-ant-design:dribbble-square-outlined', + 'vi-ant-design:dropbox-circle-filled', + 'vi-ant-design:dropbox-outlined', + 'vi-ant-design:dropbox-square-filled', + 'vi-ant-design:edit-filled', + 'vi-ant-design:edit-outlined', + 'vi-ant-design:edit-twotone', + 'vi-ant-design:ellipsis-outlined', + 'vi-ant-design:enter-outlined', + 'vi-ant-design:environment-filled', + 'vi-ant-design:environment-outlined', + 'vi-ant-design:environment-twotone', + 'vi-ant-design:euro-circle-filled', + 'vi-ant-design:euro-circle-outlined', + 'vi-ant-design:euro-circle-twotone', + 'vi-ant-design:euro-outlined', + 'vi-ant-design:euro-twotone', + 'vi-ant-design:exception-outlined', + 'vi-ant-design:exclamation-circle-filled', + 'vi-ant-design:exclamation-circle-outlined', + 'vi-ant-design:exclamation-circle-twotone', + 'vi-ant-design:exclamation-outlined', + 'vi-ant-design:expand-alt-outlined', + 'vi-ant-design:expand-outlined', + 'vi-ant-design:experiment-filled', + 'vi-ant-design:experiment-outlined', + 'vi-ant-design:experiment-twotone', + 'vi-ant-design:export-outlined', + 'vi-ant-design:eye-filled', + 'vi-ant-design:eye-invisible-filled', + 'vi-ant-design:eye-invisible-outlined', + 'vi-ant-design:eye-invisible-twotone', + 'vi-ant-design:eye-outlined', + 'vi-ant-design:eye-twotone', + 'vi-ant-design:facebook-filled', + 'vi-ant-design:facebook-outlined', + 'vi-ant-design:fall-outlined', + 'vi-ant-design:fast-backward-filled', + 'vi-ant-design:fast-backward-outlined', + 'vi-ant-design:fast-forward-filled', + 'vi-ant-design:fast-forward-outlined', + 'vi-ant-design:field-binary-outlined', + 'vi-ant-design:field-number-outlined', + 'vi-ant-design:field-string-outlined', + 'vi-ant-design:field-time-outlined', + 'vi-ant-design:file-add-filled', + 'vi-ant-design:file-add-outlined', + 'vi-ant-design:file-add-twotone', + 'vi-ant-design:file-done-outlined', + 'vi-ant-design:file-excel-filled', + 'vi-ant-design:file-excel-outlined', + 'vi-ant-design:file-excel-twotone', + 'vi-ant-design:file-exclamation-filled', + 'vi-ant-design:file-exclamation-outlined', + 'vi-ant-design:file-exclamation-twotone', + 'vi-ant-design:file-filled', + 'vi-ant-design:file-gif-outlined', + 'vi-ant-design:file-image-filled', + 'vi-ant-design:file-image-outlined', + 'vi-ant-design:file-image-twotone', + 'vi-ant-design:file-jpg-outlined', + 'vi-ant-design:file-markdown-filled', + 'vi-ant-design:file-markdown-outlined', + 'vi-ant-design:file-markdown-twotone', + 'vi-ant-design:file-outlined', + 'vi-ant-design:file-pdf-filled', + 'vi-ant-design:file-pdf-outlined', + 'vi-ant-design:file-pdf-twotone', + 'vi-ant-design:file-ppt-filled', + 'vi-ant-design:file-ppt-outlined', + 'vi-ant-design:file-ppt-twotone', + 'vi-ant-design:file-protect-outlined', + 'vi-ant-design:file-search-outlined', + 'vi-ant-design:file-sync-outlined', + 'vi-ant-design:file-text-filled', + 'vi-ant-design:file-text-outlined', + 'vi-ant-design:file-text-twotone', + 'vi-ant-design:file-twotone', + 'vi-ant-design:file-unknown-filled', + 'vi-ant-design:file-unknown-outlined', + 'vi-ant-design:file-unknown-twotone', + 'vi-ant-design:file-word-filled', + 'vi-ant-design:file-word-outlined', + 'vi-ant-design:file-word-twotone', + 'vi-ant-design:file-zip-filled', + 'vi-ant-design:file-zip-outlined', + 'vi-ant-design:file-zip-twotone', + 'vi-ant-design:filter-filled', + 'vi-ant-design:filter-outlined', + 'vi-ant-design:filter-twotone', + 'vi-ant-design:fire-filled', + 'vi-ant-design:fire-outlined', + 'vi-ant-design:fire-twotone', + 'vi-ant-design:flag-filled', + 'vi-ant-design:flag-outlined', + 'vi-ant-design:flag-twotone', + 'vi-ant-design:folder-add-filled', + 'vi-ant-design:folder-add-outlined', + 'vi-ant-design:folder-add-twotone', + 'vi-ant-design:folder-filled', + 'vi-ant-design:folder-open-filled', + 'vi-ant-design:folder-open-outlined', + 'vi-ant-design:folder-open-twotone', + 'vi-ant-design:folder-outlined', + 'vi-ant-design:folder-twotone', + 'vi-ant-design:folder-view-outlined', + 'vi-ant-design:font-colors-outlined', + 'vi-ant-design:font-size-outlined', + 'vi-ant-design:fork-outlined', + 'vi-ant-design:form-outlined', + 'vi-ant-design:format-painter-filled', + 'vi-ant-design:format-painter-outlined', + 'vi-ant-design:forward-filled', + 'vi-ant-design:forward-outlined', + 'vi-ant-design:frown-filled', + 'vi-ant-design:frown-outlined', + 'vi-ant-design:frown-twotone', + 'vi-ant-design:fullscreen-exit-outlined', + 'vi-ant-design:fullscreen-outlined', + 'vi-ant-design:function-outlined', + 'vi-ant-design:fund-filled', + 'vi-ant-design:fund-outlined', + 'vi-ant-design:fund-projection-screen-outlined', + 'vi-ant-design:fund-twotone', + 'vi-ant-design:fund-view-outlined', + 'vi-ant-design:funnel-plot-filled', + 'vi-ant-design:funnel-plot-outlined', + 'vi-ant-design:funnel-plot-twotone', + 'vi-ant-design:gateway-outlined', + 'vi-ant-design:gif-outlined', + 'vi-ant-design:gift-filled', + 'vi-ant-design:gift-outlined', + 'vi-ant-design:gift-twotone', + 'vi-ant-design:github-filled', + 'vi-ant-design:github-outlined', + 'vi-ant-design:gitlab-filled', + 'vi-ant-design:gitlab-outlined', + 'vi-ant-design:global-outlined', + 'vi-ant-design:gold-filled', + 'vi-ant-design:gold-outlined', + 'vi-ant-design:gold-twotone', + 'vi-ant-design:golden-filled', + 'vi-ant-design:google-circle-filled', + 'vi-ant-design:google-outlined', + 'vi-ant-design:google-plus-circle-filled', + 'vi-ant-design:google-plus-outlined', + 'vi-ant-design:google-plus-square-filled', + 'vi-ant-design:google-square-filled', + 'vi-ant-design:group-outlined', + 'vi-ant-design:harmony-o-s-outlined', + 'vi-ant-design:hdd-filled', + 'vi-ant-design:hdd-outlined', + 'vi-ant-design:hdd-twotone', + 'vi-ant-design:heart-filled', + 'vi-ant-design:heart-outlined', + 'vi-ant-design:heart-twotone', + 'vi-ant-design:heat-map-outlined', + 'vi-ant-design:highlight-filled', + 'vi-ant-design:highlight-outlined', + 'vi-ant-design:highlight-twotone', + 'vi-ant-design:history-outlined', + 'vi-ant-design:holder-outlined', + 'vi-ant-design:home-filled', + 'vi-ant-design:home-outlined', + 'vi-ant-design:home-twotone', + 'vi-ant-design:hourglass-filled', + 'vi-ant-design:hourglass-outlined', + 'vi-ant-design:hourglass-twotone', + 'vi-ant-design:html5-filled', + 'vi-ant-design:html5-outlined', + 'vi-ant-design:html5-twotone', + 'vi-ant-design:idcard-filled', + 'vi-ant-design:idcard-outlined', + 'vi-ant-design:idcard-twotone', + 'vi-ant-design:ie-circle-filled', + 'vi-ant-design:ie-outlined', + 'vi-ant-design:ie-square-filled', + 'vi-ant-design:import-outlined', + 'vi-ant-design:inbox-outlined', + 'vi-ant-design:info-circle-filled', + 'vi-ant-design:info-circle-outlined', + 'vi-ant-design:info-circle-twotone', + 'vi-ant-design:info-outlined', + 'vi-ant-design:insert-row-above-outlined', + 'vi-ant-design:insert-row-below-outlined', + 'vi-ant-design:insert-row-left-outlined', + 'vi-ant-design:insert-row-right-outlined', + 'vi-ant-design:instagram-filled', + 'vi-ant-design:instagram-outlined', + 'vi-ant-design:insurance-filled', + 'vi-ant-design:insurance-outlined', + 'vi-ant-design:insurance-twotone', + 'vi-ant-design:interaction-filled', + 'vi-ant-design:interaction-outlined', + 'vi-ant-design:interaction-twotone', + 'vi-ant-design:issues-close-outlined', + 'vi-ant-design:italic-outlined', + 'vi-ant-design:java-outlined', + 'vi-ant-design:java-script-outlined', + 'vi-ant-design:key-outlined', + 'vi-ant-design:kubernetes-outlined', + 'vi-ant-design:laptop-outlined', + 'vi-ant-design:layout-filled', + 'vi-ant-design:layout-outlined', + 'vi-ant-design:layout-twotone', + 'vi-ant-design:left-circle-filled', + 'vi-ant-design:left-circle-outlined', + 'vi-ant-design:left-circle-twotone', + 'vi-ant-design:left-outlined', + 'vi-ant-design:left-square-filled', + 'vi-ant-design:left-square-outlined', + 'vi-ant-design:left-square-twotone', + 'vi-ant-design:like-filled', + 'vi-ant-design:like-outlined', + 'vi-ant-design:like-twotone', + 'vi-ant-design:line-chart-outlined', + 'vi-ant-design:line-height-outlined', + 'vi-ant-design:line-outlined', + 'vi-ant-design:link-outlined', + 'vi-ant-design:linkedin-filled', + 'vi-ant-design:linkedin-outlined', + 'vi-ant-design:linux-outlined', + 'vi-ant-design:loading-3-quarters-outlined', + 'vi-ant-design:loading-outlined', + 'vi-ant-design:lock-filled', + 'vi-ant-design:lock-outlined', + 'vi-ant-design:lock-twotone', + 'vi-ant-design:login-outlined', + 'vi-ant-design:logout-outlined', + 'vi-ant-design:mac-command-filled', + 'vi-ant-design:mac-command-outlined', + 'vi-ant-design:mail-filled', + 'vi-ant-design:mail-outlined', + 'vi-ant-design:mail-twotone', + 'vi-ant-design:man-outlined', + 'vi-ant-design:medicine-box-filled', + 'vi-ant-design:medicine-box-outlined', + 'vi-ant-design:medicine-box-twotone', + 'vi-ant-design:medium-circle-filled', + 'vi-ant-design:medium-outlined', + 'vi-ant-design:medium-square-filled', + 'vi-ant-design:medium-workmark-outlined', + 'vi-ant-design:meh-filled', + 'vi-ant-design:meh-outlined', + 'vi-ant-design:meh-twotone', + 'vi-ant-design:menu-fold-outlined', + 'vi-ant-design:menu-outlined', + 'vi-ant-design:menu-unfold-outlined', + 'vi-ant-design:merge-cells-outlined', + 'vi-ant-design:merge-filled', + 'vi-ant-design:merge-outlined', + 'vi-ant-design:message-filled', + 'vi-ant-design:message-outlined', + 'vi-ant-design:message-twotone', + 'vi-ant-design:minus-circle-filled', + 'vi-ant-design:minus-circle-outlined', + 'vi-ant-design:minus-circle-twotone', + 'vi-ant-design:minus-outlined', + 'vi-ant-design:minus-square-filled', + 'vi-ant-design:minus-square-outlined', + 'vi-ant-design:minus-square-twotone', + 'vi-ant-design:mobile-filled', + 'vi-ant-design:mobile-outlined', + 'vi-ant-design:mobile-twotone', + 'vi-ant-design:money-collect-filled', + 'vi-ant-design:money-collect-outlined', + 'vi-ant-design:money-collect-twotone', + 'vi-ant-design:monitor-outlined', + 'vi-ant-design:moon-filled', + 'vi-ant-design:moon-outlined', + 'vi-ant-design:more-outlined', + 'vi-ant-design:muted-filled', + 'vi-ant-design:muted-outlined', + 'vi-ant-design:node-collapse-outlined', + 'vi-ant-design:node-expand-outlined', + 'vi-ant-design:node-index-outlined', + 'vi-ant-design:notification-filled', + 'vi-ant-design:notification-outlined', + 'vi-ant-design:notification-twotone', + 'vi-ant-design:number-outlined', + 'vi-ant-design:one-to-one-outlined', + 'vi-ant-design:open-a-i-filled', + 'vi-ant-design:open-a-i-outlined', + 'vi-ant-design:ordered-list-outlined', + 'vi-ant-design:paper-clip-outlined', + 'vi-ant-design:partition-outlined', + 'vi-ant-design:pause-circle-filled', + 'vi-ant-design:pause-circle-outlined', + 'vi-ant-design:pause-circle-twotone', + 'vi-ant-design:pause-outlined', + 'vi-ant-design:pay-circle-filled', + 'vi-ant-design:pay-circle-outlined', + 'vi-ant-design:percentage-outlined', + 'vi-ant-design:phone-filled', + 'vi-ant-design:phone-outlined', + 'vi-ant-design:phone-twotone', + 'vi-ant-design:pic-center-outlined', + 'vi-ant-design:pic-left-outlined', + 'vi-ant-design:pic-right-outlined', + 'vi-ant-design:picture-filled', + 'vi-ant-design:picture-outlined', + 'vi-ant-design:picture-twotone', + 'vi-ant-design:pie-chart-filled', + 'vi-ant-design:pie-chart-outlined', + 'vi-ant-design:pie-chart-twotone', + 'vi-ant-design:pinterest-filled', + 'vi-ant-design:pinterest-outlined', + 'vi-ant-design:play-circle-filled', + 'vi-ant-design:play-circle-outlined', + 'vi-ant-design:play-circle-twotone', + 'vi-ant-design:play-square-filled', + 'vi-ant-design:play-square-outlined', + 'vi-ant-design:play-square-twotone', + 'vi-ant-design:plus-circle-filled', + 'vi-ant-design:plus-circle-outlined', + 'vi-ant-design:plus-circle-twotone', + 'vi-ant-design:plus-outlined', + 'vi-ant-design:plus-square-filled', + 'vi-ant-design:plus-square-outlined', + 'vi-ant-design:plus-square-twotone', + 'vi-ant-design:pound-circle-filled', + 'vi-ant-design:pound-circle-outlined', + 'vi-ant-design:pound-circle-twotone', + 'vi-ant-design:pound-outlined', + 'vi-ant-design:poweroff-outlined', + 'vi-ant-design:printer-filled', + 'vi-ant-design:printer-outlined', + 'vi-ant-design:printer-twotone', + 'vi-ant-design:product-filled', + 'vi-ant-design:product-outlined', + 'vi-ant-design:profile-filled', + 'vi-ant-design:profile-outlined', + 'vi-ant-design:profile-twotone', + 'vi-ant-design:project-filled', + 'vi-ant-design:project-outlined', + 'vi-ant-design:project-twotone', + 'vi-ant-design:property-safety-filled', + 'vi-ant-design:property-safety-outlined', + 'vi-ant-design:property-safety-twotone', + 'vi-ant-design:pull-request-outlined', + 'vi-ant-design:pushpin-filled', + 'vi-ant-design:pushpin-outlined', + 'vi-ant-design:pushpin-twotone', + 'vi-ant-design:python-outlined', + 'vi-ant-design:qq-circle-filled', + 'vi-ant-design:qq-outlined', + 'vi-ant-design:qq-square-filled', + 'vi-ant-design:qrcode-outlined', + 'vi-ant-design:question-circle-filled', + 'vi-ant-design:question-circle-outlined', + 'vi-ant-design:question-circle-twotone', + 'vi-ant-design:question-outlined', + 'vi-ant-design:radar-chart-outlined', + 'vi-ant-design:radius-bottomleft-outlined', + 'vi-ant-design:radius-bottomright-outlined', + 'vi-ant-design:radius-setting-outlined', + 'vi-ant-design:radius-upleft-outlined', + 'vi-ant-design:radius-upright-outlined', + 'vi-ant-design:read-filled', + 'vi-ant-design:read-outlined', + 'vi-ant-design:reconciliation-filled', + 'vi-ant-design:reconciliation-outlined', + 'vi-ant-design:reconciliation-twotone', + 'vi-ant-design:red-envelope-filled', + 'vi-ant-design:red-envelope-outlined', + 'vi-ant-design:red-envelope-twotone', + 'vi-ant-design:reddit-circle-filled', + 'vi-ant-design:reddit-outlined', + 'vi-ant-design:reddit-square-filled', + 'vi-ant-design:redo-outlined', + 'vi-ant-design:reload-outlined', + 'vi-ant-design:rest-filled', + 'vi-ant-design:rest-outlined', + 'vi-ant-design:rest-twotone', + 'vi-ant-design:retweet-outlined', + 'vi-ant-design:right-circle-filled', + 'vi-ant-design:right-circle-outlined', + 'vi-ant-design:right-circle-twotone', + 'vi-ant-design:right-outlined', + 'vi-ant-design:right-square-filled', + 'vi-ant-design:right-square-outlined', + 'vi-ant-design:right-square-twotone', + 'vi-ant-design:rise-outlined', + 'vi-ant-design:robot-filled', + 'vi-ant-design:robot-outlined', + 'vi-ant-design:rocket-filled', + 'vi-ant-design:rocket-outlined', + 'vi-ant-design:rocket-twotone', + 'vi-ant-design:rollback-outlined', + 'vi-ant-design:rotate-left-outlined', + 'vi-ant-design:rotate-right-outlined', + 'vi-ant-design:ruby-outlined', + 'vi-ant-design:safety-certificate-filled', + 'vi-ant-design:safety-certificate-outlined', + 'vi-ant-design:safety-certificate-twotone', + 'vi-ant-design:safety-outlined', + 'vi-ant-design:save-filled', + 'vi-ant-design:save-outlined', + 'vi-ant-design:save-twotone', + 'vi-ant-design:scan-outlined', + 'vi-ant-design:schedule-filled', + 'vi-ant-design:schedule-outlined', + 'vi-ant-design:schedule-twotone', + 'vi-ant-design:scissor-outlined', + 'vi-ant-design:search-outlined', + 'vi-ant-design:security-scan-filled', + 'vi-ant-design:security-scan-outlined', + 'vi-ant-design:security-scan-twotone', + 'vi-ant-design:select-outlined', + 'vi-ant-design:send-outlined', + 'vi-ant-design:setting-filled', + 'vi-ant-design:setting-outlined', + 'vi-ant-design:setting-twotone', + 'vi-ant-design:shake-outlined', + 'vi-ant-design:share-alt-outlined', + 'vi-ant-design:shop-filled', + 'vi-ant-design:shop-outlined', + 'vi-ant-design:shop-twotone', + 'vi-ant-design:shopping-cart-outlined', + 'vi-ant-design:shopping-filled', + 'vi-ant-design:shopping-outlined', + 'vi-ant-design:shopping-twotone', + 'vi-ant-design:shrink-outlined', + 'vi-ant-design:signal-filled', + 'vi-ant-design:signature-filled', + 'vi-ant-design:signature-outlined', + 'vi-ant-design:sisternode-outlined', + 'vi-ant-design:sketch-circle-filled', + 'vi-ant-design:sketch-outlined', + 'vi-ant-design:sketch-square-filled', + 'vi-ant-design:skin-filled', + 'vi-ant-design:skin-outlined', + 'vi-ant-design:skin-twotone', + 'vi-ant-design:skype-filled', + 'vi-ant-design:skype-outlined', + 'vi-ant-design:slack-circle-filled', + 'vi-ant-design:slack-outlined', + 'vi-ant-design:slack-square-filled', + 'vi-ant-design:slack-square-outlined', + 'vi-ant-design:sliders-filled', + 'vi-ant-design:sliders-outlined', + 'vi-ant-design:sliders-twotone', + 'vi-ant-design:small-dash-outlined', + 'vi-ant-design:smile-filled', + 'vi-ant-design:smile-outlined', + 'vi-ant-design:smile-twotone', + 'vi-ant-design:snippets-filled', + 'vi-ant-design:snippets-outlined', + 'vi-ant-design:snippets-twotone', + 'vi-ant-design:solution-outlined', + 'vi-ant-design:sort-ascending-outlined', + 'vi-ant-design:sort-descending-outlined', + 'vi-ant-design:sound-filled', + 'vi-ant-design:sound-outlined', + 'vi-ant-design:sound-twotone', + 'vi-ant-design:split-cells-outlined', + 'vi-ant-design:spotify-filled', + 'vi-ant-design:spotify-outlined', + 'vi-ant-design:star-filled', + 'vi-ant-design:star-outlined', + 'vi-ant-design:star-twotone', + 'vi-ant-design:step-backward-filled', + 'vi-ant-design:step-backward-outlined', + 'vi-ant-design:step-forward-filled', + 'vi-ant-design:step-forward-outlined', + 'vi-ant-design:stock-outlined', + 'vi-ant-design:stop-filled', + 'vi-ant-design:stop-outlined', + 'vi-ant-design:stop-twotone', + 'vi-ant-design:strikethrough-outlined', + 'vi-ant-design:subnode-outlined', + 'vi-ant-design:sun-filled', + 'vi-ant-design:sun-outlined', + 'vi-ant-design:swap-left-outlined', + 'vi-ant-design:swap-outlined', + 'vi-ant-design:swap-right-outlined', + 'vi-ant-design:switcher-filled', + 'vi-ant-design:switcher-outlined', + 'vi-ant-design:switcher-twotone', + 'vi-ant-design:sync-outlined', + 'vi-ant-design:table-outlined', + 'vi-ant-design:tablet-filled', + 'vi-ant-design:tablet-outlined', + 'vi-ant-design:tablet-twotone', + 'vi-ant-design:tag-filled', + 'vi-ant-design:tag-outlined', + 'vi-ant-design:tag-twotone', + 'vi-ant-design:tags-filled', + 'vi-ant-design:tags-outlined', + 'vi-ant-design:tags-twotone', + 'vi-ant-design:taobao-circle-filled', + 'vi-ant-design:taobao-circle-outlined', + 'vi-ant-design:taobao-outlined', + 'vi-ant-design:taobao-square-filled', + 'vi-ant-design:team-outlined', + 'vi-ant-design:thunderbolt-filled', + 'vi-ant-design:thunderbolt-outlined', + 'vi-ant-design:thunderbolt-twotone', + 'vi-ant-design:tik-tok-filled', + 'vi-ant-design:tik-tok-outlined', + 'vi-ant-design:to-top-outlined', + 'vi-ant-design:tool-filled', + 'vi-ant-design:tool-outlined', + 'vi-ant-design:tool-twotone', + 'vi-ant-design:trademark-circle-filled', + 'vi-ant-design:trademark-circle-outlined', + 'vi-ant-design:trademark-circle-twotone', + 'vi-ant-design:trademark-outlined', + 'vi-ant-design:transaction-outlined', + 'vi-ant-design:translation-outlined', + 'vi-ant-design:trophy-filled', + 'vi-ant-design:trophy-outlined', + 'vi-ant-design:trophy-twotone', + 'vi-ant-design:truck-filled', + 'vi-ant-design:truck-outlined', + 'vi-ant-design:twitch-outlined', + 'vi-ant-design:twitter-circle-filled', + 'vi-ant-design:twitter-outlined', + 'vi-ant-design:twitter-square-filled', + 'vi-ant-design:underline-outlined', + 'vi-ant-design:undo-outlined', + 'vi-ant-design:ungroup-outlined', + 'vi-ant-design:unlock-filled', + 'vi-ant-design:unlock-outlined', + 'vi-ant-design:unlock-twotone', + 'vi-ant-design:unordered-list-outlined', + 'vi-ant-design:up-circle-filled', + 'vi-ant-design:up-circle-outlined', + 'vi-ant-design:up-circle-twotone', + 'vi-ant-design:up-outlined', + 'vi-ant-design:up-square-filled', + 'vi-ant-design:up-square-outlined', + 'vi-ant-design:up-square-twotone', + 'vi-ant-design:upload-outlined', + 'vi-ant-design:usb-filled', + 'vi-ant-design:usb-outlined', + 'vi-ant-design:usb-twotone', + 'vi-ant-design:user-add-outlined', + 'vi-ant-design:user-delete-outlined', + 'vi-ant-design:user-outlined', + 'vi-ant-design:user-switch-outlined', + 'vi-ant-design:usergroup-add-outlined', + 'vi-ant-design:usergroup-delete-outlined', + 'vi-ant-design:verified-outlined', + 'vi-ant-design:vertical-align-bottom-outlined', + 'vi-ant-design:vertical-align-middle-outlined', + 'vi-ant-design:vertical-align-top-outlined', + 'vi-ant-design:vertical-left-outlined', + 'vi-ant-design:vertical-right-outlined', + 'vi-ant-design:video-camera-add-outlined', + 'vi-ant-design:video-camera-filled', + 'vi-ant-design:video-camera-outlined', + 'vi-ant-design:video-camera-twotone', + 'vi-ant-design:wallet-filled', + 'vi-ant-design:wallet-outlined', + 'vi-ant-design:wallet-twotone', + 'vi-ant-design:warning-filled', + 'vi-ant-design:warning-outlined', + 'vi-ant-design:warning-twotone', + 'vi-ant-design:wechat-filled', + 'vi-ant-design:wechat-outlined', + 'vi-ant-design:wechat-work-filled', + 'vi-ant-design:wechat-work-outlined', + 'vi-ant-design:weibo-circle-filled', + 'vi-ant-design:weibo-circle-outlined', + 'vi-ant-design:weibo-outlined', + 'vi-ant-design:weibo-square-filled', + 'vi-ant-design:weibo-square-outlined', + 'vi-ant-design:whats-app-outlined', + 'vi-ant-design:wifi-outlined', + 'vi-ant-design:windows-filled', + 'vi-ant-design:windows-outlined', + 'vi-ant-design:woman-outlined', + 'vi-ant-design:x-filled', + 'vi-ant-design:x-outlined', + 'vi-ant-design:yahoo-filled', + 'vi-ant-design:yahoo-outlined', + 'vi-ant-design:youtube-filled', + 'vi-ant-design:youtube-outlined', + 'vi-ant-design:yuque-filled', + 'vi-ant-design:yuque-outlined', + 'vi-ant-design:zhihu-circle-filled', + 'vi-ant-design:zhihu-outlined', + 'vi-ant-design:zhihu-square-filled', + 'vi-ant-design:zoom-in-outlined', + 'vi-ant-design:zoom-out-outlined' + ] +} diff --git a/src/components/IconPicker/src/data/icons.ep.ts b/src/components/IconPicker/src/data/icons.ep.ts new file mode 100644 index 0000000..b3918be --- /dev/null +++ b/src/components/IconPicker/src/data/icons.ep.ts @@ -0,0 +1,299 @@ +export default { + name: 'Element Plus', + prefix: 'vi-ep', + icons: [ + 'vi-ep:add-location', + 'vi-ep:aim', + 'vi-ep:alarm-clock', + 'vi-ep:apple', + 'vi-ep:arrow-down', + 'vi-ep:arrow-down-bold', + 'vi-ep:arrow-left', + 'vi-ep:arrow-left-bold', + 'vi-ep:arrow-right', + 'vi-ep:arrow-right-bold', + 'vi-ep:arrow-up', + 'vi-ep:arrow-up-bold', + 'vi-ep:avatar', + 'vi-ep:back', + 'vi-ep:baseball', + 'vi-ep:basketball', + 'vi-ep:bell', + 'vi-ep:bell-filled', + 'vi-ep:bicycle', + 'vi-ep:bottom', + 'vi-ep:bottom-left', + 'vi-ep:bottom-right', + 'vi-ep:bowl', + 'vi-ep:box', + 'vi-ep:briefcase', + 'vi-ep:brush', + 'vi-ep:brush-filled', + 'vi-ep:burger', + 'vi-ep:calendar', + 'vi-ep:camera', + 'vi-ep:camera-filled', + 'vi-ep:caret-bottom', + 'vi-ep:caret-left', + 'vi-ep:caret-right', + 'vi-ep:caret-top', + 'vi-ep:cellphone', + 'vi-ep:chat-dot-round', + 'vi-ep:chat-dot-square', + 'vi-ep:chat-line-round', + 'vi-ep:chat-line-square', + 'vi-ep:chat-round', + 'vi-ep:chat-square', + 'vi-ep:check', + 'vi-ep:checked', + 'vi-ep:cherry', + 'vi-ep:chicken', + 'vi-ep:chrome-filled', + 'vi-ep:circle-check', + 'vi-ep:circle-check-filled', + 'vi-ep:circle-close', + 'vi-ep:circle-close-filled', + 'vi-ep:circle-plus', + 'vi-ep:circle-plus-filled', + 'vi-ep:clock', + 'vi-ep:close', + 'vi-ep:close-bold', + 'vi-ep:cloudy', + 'vi-ep:coffee', + 'vi-ep:coffee-cup', + 'vi-ep:coin', + 'vi-ep:cold-drink', + 'vi-ep:collection', + 'vi-ep:collection-tag', + 'vi-ep:comment', + 'vi-ep:compass', + 'vi-ep:connection', + 'vi-ep:coordinate', + 'vi-ep:copy-document', + 'vi-ep:cpu', + 'vi-ep:credit-card', + 'vi-ep:crop', + 'vi-ep:d-arrow-left', + 'vi-ep:d-arrow-right', + 'vi-ep:d-caret', + 'vi-ep:data-analysis', + 'vi-ep:data-board', + 'vi-ep:data-line', + 'vi-ep:delete', + 'vi-ep:delete-filled', + 'vi-ep:delete-location', + 'vi-ep:dessert', + 'vi-ep:discount', + 'vi-ep:dish', + 'vi-ep:dish-dot', + 'vi-ep:document', + 'vi-ep:document-add', + 'vi-ep:document-checked', + 'vi-ep:document-copy', + 'vi-ep:document-delete', + 'vi-ep:document-remove', + 'vi-ep:download', + 'vi-ep:drizzling', + 'vi-ep:edit', + 'vi-ep:edit-pen', + 'vi-ep:eleme', + 'vi-ep:eleme-filled', + 'vi-ep:element-plus', + 'vi-ep:expand', + 'vi-ep:failed', + 'vi-ep:female', + 'vi-ep:files', + 'vi-ep:film', + 'vi-ep:filter', + 'vi-ep:finished', + 'vi-ep:first-aid-kit', + 'vi-ep:flag', + 'vi-ep:fold', + 'vi-ep:folder', + 'vi-ep:folder-add', + 'vi-ep:folder-checked', + 'vi-ep:folder-delete', + 'vi-ep:folder-opened', + 'vi-ep:folder-remove', + 'vi-ep:food', + 'vi-ep:football', + 'vi-ep:fork-spoon', + 'vi-ep:fries', + 'vi-ep:full-screen', + 'vi-ep:goblet', + 'vi-ep:goblet-full', + 'vi-ep:goblet-square', + 'vi-ep:goblet-square-full', + 'vi-ep:gold-medal', + 'vi-ep:goods', + 'vi-ep:goods-filled', + 'vi-ep:grape', + 'vi-ep:grid', + 'vi-ep:guide', + 'vi-ep:handbag', + 'vi-ep:headset', + 'vi-ep:help', + 'vi-ep:help-filled', + 'vi-ep:hide', + 'vi-ep:histogram', + 'vi-ep:home-filled', + 'vi-ep:hot-water', + 'vi-ep:house', + 'vi-ep:ice-cream', + 'vi-ep:ice-cream-round', + 'vi-ep:ice-cream-square', + 'vi-ep:ice-drink', + 'vi-ep:ice-tea', + 'vi-ep:info-filled', + 'vi-ep:iphone', + 'vi-ep:key', + 'vi-ep:knife-fork', + 'vi-ep:lightning', + 'vi-ep:link', + 'vi-ep:list', + 'vi-ep:loading', + 'vi-ep:location', + 'vi-ep:location-filled', + 'vi-ep:location-information', + 'vi-ep:lock', + 'vi-ep:lollipop', + 'vi-ep:magic-stick', + 'vi-ep:magnet', + 'vi-ep:male', + 'vi-ep:management', + 'vi-ep:map-location', + 'vi-ep:medal', + 'vi-ep:memo', + 'vi-ep:menu', + 'vi-ep:message', + 'vi-ep:message-box', + 'vi-ep:mic', + 'vi-ep:microphone', + 'vi-ep:milk-tea', + 'vi-ep:minus', + 'vi-ep:money', + 'vi-ep:monitor', + 'vi-ep:moon', + 'vi-ep:moon-night', + 'vi-ep:more', + 'vi-ep:more-filled', + 'vi-ep:mostly-cloudy', + 'vi-ep:mouse', + 'vi-ep:mug', + 'vi-ep:mute', + 'vi-ep:mute-notification', + 'vi-ep:no-smoking', + 'vi-ep:notebook', + 'vi-ep:notification', + 'vi-ep:odometer', + 'vi-ep:office-building', + 'vi-ep:open', + 'vi-ep:operation', + 'vi-ep:opportunity', + 'vi-ep:orange', + 'vi-ep:paperclip', + 'vi-ep:partly-cloudy', + 'vi-ep:pear', + 'vi-ep:phone', + 'vi-ep:phone-filled', + 'vi-ep:picture', + 'vi-ep:picture-filled', + 'vi-ep:picture-rounded', + 'vi-ep:pie-chart', + 'vi-ep:place', + 'vi-ep:platform', + 'vi-ep:plus', + 'vi-ep:pointer', + 'vi-ep:position', + 'vi-ep:postcard', + 'vi-ep:pouring', + 'vi-ep:present', + 'vi-ep:price-tag', + 'vi-ep:printer', + 'vi-ep:promotion', + 'vi-ep:quartz-watch', + 'vi-ep:question-filled', + 'vi-ep:rank', + 'vi-ep:reading', + 'vi-ep:reading-lamp', + 'vi-ep:refresh', + 'vi-ep:refresh-left', + 'vi-ep:refresh-right', + 'vi-ep:refrigerator', + 'vi-ep:remove', + 'vi-ep:remove-filled', + 'vi-ep:right', + 'vi-ep:scale-to-original', + 'vi-ep:school', + 'vi-ep:scissor', + 'vi-ep:search', + 'vi-ep:select', + 'vi-ep:sell', + 'vi-ep:semi-select', + 'vi-ep:service', + 'vi-ep:set-up', + 'vi-ep:setting', + 'vi-ep:share', + 'vi-ep:ship', + 'vi-ep:shop', + 'vi-ep:shopping-bag', + 'vi-ep:shopping-cart', + 'vi-ep:shopping-cart-full', + 'vi-ep:shopping-trolley', + 'vi-ep:smoking', + 'vi-ep:soccer', + 'vi-ep:sold-out', + 'vi-ep:sort', + 'vi-ep:sort-down', + 'vi-ep:sort-up', + 'vi-ep:stamp', + 'vi-ep:star', + 'vi-ep:star-filled', + 'vi-ep:stopwatch', + 'vi-ep:success-filled', + 'vi-ep:sugar', + 'vi-ep:suitcase', + 'vi-ep:suitcase-line', + 'vi-ep:sunny', + 'vi-ep:sunrise', + 'vi-ep:sunset', + 'vi-ep:switch', + 'vi-ep:switch-button', + 'vi-ep:switch-filled', + 'vi-ep:takeaway-box', + 'vi-ep:ticket', + 'vi-ep:tickets', + 'vi-ep:timer', + 'vi-ep:toilet-paper', + 'vi-ep:tools', + 'vi-ep:top', + 'vi-ep:top-left', + 'vi-ep:top-right', + 'vi-ep:trend-charts', + 'vi-ep:trophy', + 'vi-ep:trophy-base', + 'vi-ep:turn-off', + 'vi-ep:umbrella', + 'vi-ep:unlock', + 'vi-ep:upload', + 'vi-ep:upload-filled', + 'vi-ep:user', + 'vi-ep:user-filled', + 'vi-ep:van', + 'vi-ep:video-camera', + 'vi-ep:video-camera-filled', + 'vi-ep:video-pause', + 'vi-ep:video-play', + 'vi-ep:view', + 'vi-ep:wallet', + 'vi-ep:wallet-filled', + 'vi-ep:warn-triangle-filled', + 'vi-ep:warning', + 'vi-ep:warning-filled', + 'vi-ep:watch', + 'vi-ep:watermelon', + 'vi-ep:wind-power', + 'vi-ep:zoom-in', + 'vi-ep:zoom-out' + ] +} diff --git a/src/components/IconPicker/src/data/icons.tdesign.ts b/src/components/IconPicker/src/data/icons.tdesign.ts new file mode 100644 index 0000000..77b298b --- /dev/null +++ b/src/components/IconPicker/src/data/icons.tdesign.ts @@ -0,0 +1,1209 @@ +export default { + name: 'TDesign Icons', + prefix: 'vi-tdesign', + icons: [ + 'vi-tdesign:activity', + 'vi-tdesign:add', + 'vi-tdesign:add-and-subtract', + 'vi-tdesign:add-circle', + 'vi-tdesign:add-rectangle', + 'vi-tdesign:address-book', + 'vi-tdesign:adjustment', + 'vi-tdesign:airplay-wave', + 'vi-tdesign:alarm', + 'vi-tdesign:alarm-add', + 'vi-tdesign:alarm-off', + 'vi-tdesign:align-top', + 'vi-tdesign:align-vertical', + 'vi-tdesign:alpha', + 'vi-tdesign:analytics', + 'vi-tdesign:anchor', + 'vi-tdesign:angry', + 'vi-tdesign:animation', + 'vi-tdesign:animation-1', + 'vi-tdesign:anticlockwise', + 'vi-tdesign:api', + 'vi-tdesign:app', + 'vi-tdesign:apple', + 'vi-tdesign:application', + 'vi-tdesign:architecture-hui-style', + 'vi-tdesign:archway', + 'vi-tdesign:archway-1', + 'vi-tdesign:arrow-down', + 'vi-tdesign:arrow-down-circle', + 'vi-tdesign:arrow-down-rectangle', + 'vi-tdesign:arrow-left', + 'vi-tdesign:arrow-left-circle', + 'vi-tdesign:arrow-left-down', + 'vi-tdesign:arrow-left-down-circle', + 'vi-tdesign:arrow-left-right-1', + 'vi-tdesign:arrow-left-right-2', + 'vi-tdesign:arrow-left-right-3', + 'vi-tdesign:arrow-left-right-circle', + 'vi-tdesign:arrow-left-up', + 'vi-tdesign:arrow-left-up-circle', + 'vi-tdesign:arrow-right', + 'vi-tdesign:arrow-right-circle', + 'vi-tdesign:arrow-right-down', + 'vi-tdesign:arrow-right-down-circle', + 'vi-tdesign:arrow-right-up', + 'vi-tdesign:arrow-right-up-circle', + 'vi-tdesign:arrow-triangle-down', + 'vi-tdesign:arrow-triangle-down-filled', + 'vi-tdesign:arrow-triangle-up', + 'vi-tdesign:arrow-triangle-up-filled', + 'vi-tdesign:arrow-up', + 'vi-tdesign:arrow-up-circle', + 'vi-tdesign:arrow-up-down-1', + 'vi-tdesign:arrow-up-down-2', + 'vi-tdesign:arrow-up-down-3', + 'vi-tdesign:arrow-up-down-circle', + 'vi-tdesign:artboard', + 'vi-tdesign:article', + 'vi-tdesign:assignment', + 'vi-tdesign:assignment-checked', + 'vi-tdesign:assignment-code', + 'vi-tdesign:assignment-error', + 'vi-tdesign:assignment-user', + 'vi-tdesign:attach', + 'vi-tdesign:attic', + 'vi-tdesign:attic-1', + 'vi-tdesign:audio', + 'vi-tdesign:awkward', + 'vi-tdesign:backtop', + 'vi-tdesign:backtop-rectangle', + 'vi-tdesign:backup', + 'vi-tdesign:backward', + 'vi-tdesign:bad-laugh', + 'vi-tdesign:bamboo-shoot', + 'vi-tdesign:banana', + 'vi-tdesign:barbecue', + 'vi-tdesign:barcode', + 'vi-tdesign:barcode-1', + 'vi-tdesign:base-station', + 'vi-tdesign:battery', + 'vi-tdesign:battery-add', + 'vi-tdesign:battery-charging', + 'vi-tdesign:battery-low', + 'vi-tdesign:bean', + 'vi-tdesign:beer', + 'vi-tdesign:beta', + 'vi-tdesign:bifurcate', + 'vi-tdesign:bill', + 'vi-tdesign:blockchain', + 'vi-tdesign:bluetooth', + 'vi-tdesign:bone', + 'vi-tdesign:book', + 'vi-tdesign:book-open', + 'vi-tdesign:bookmark', + 'vi-tdesign:bookmark-add', + 'vi-tdesign:bookmark-checked', + 'vi-tdesign:bookmark-double', + 'vi-tdesign:bookmark-minus', + 'vi-tdesign:braces', + 'vi-tdesign:brackets', + 'vi-tdesign:bread', + 'vi-tdesign:bridge', + 'vi-tdesign:bridge-1', + 'vi-tdesign:bridge-2', + 'vi-tdesign:bridge-3', + 'vi-tdesign:bridge-4', + 'vi-tdesign:bridge-5', + 'vi-tdesign:bridge-6', + 'vi-tdesign:brightness', + 'vi-tdesign:brightness-1', + 'vi-tdesign:broccoli', + 'vi-tdesign:browse', + 'vi-tdesign:browse-gallery', + 'vi-tdesign:browse-off', + 'vi-tdesign:brush', + 'vi-tdesign:bug', + 'vi-tdesign:bug-report', + 'vi-tdesign:building', + 'vi-tdesign:building-1', + 'vi-tdesign:building-2', + 'vi-tdesign:building-3', + 'vi-tdesign:building-4', + 'vi-tdesign:building-5', + 'vi-tdesign:bulletpoint', + 'vi-tdesign:button', + 'vi-tdesign:cabbage', + 'vi-tdesign:cake', + 'vi-tdesign:calculation', + 'vi-tdesign:calculation-1', + 'vi-tdesign:calculator', + 'vi-tdesign:calculator-1', + 'vi-tdesign:calendar', + 'vi-tdesign:calendar-1', + 'vi-tdesign:calendar-2', + 'vi-tdesign:calendar-edit', + 'vi-tdesign:calendar-event', + 'vi-tdesign:call', + 'vi-tdesign:call-1', + 'vi-tdesign:call-cancel', + 'vi-tdesign:call-forwarded', + 'vi-tdesign:call-incoming', + 'vi-tdesign:call-off', + 'vi-tdesign:calm', + 'vi-tdesign:calm-1', + 'vi-tdesign:camera', + 'vi-tdesign:camera-1', + 'vi-tdesign:camera-2', + 'vi-tdesign:camera-off', + 'vi-tdesign:candy', + 'vi-tdesign:card', + 'vi-tdesign:cardmembership', + 'vi-tdesign:caret-down', + 'vi-tdesign:caret-down-small', + 'vi-tdesign:caret-left', + 'vi-tdesign:caret-left-small', + 'vi-tdesign:caret-right', + 'vi-tdesign:caret-right-small', + 'vi-tdesign:caret-up', + 'vi-tdesign:caret-up-small', + 'vi-tdesign:cart', + 'vi-tdesign:cart-add', + 'vi-tdesign:cast', + 'vi-tdesign:castle', + 'vi-tdesign:castle-1', + 'vi-tdesign:castle-2', + 'vi-tdesign:castle-3', + 'vi-tdesign:castle-4', + 'vi-tdesign:castle-5', + 'vi-tdesign:castle-6', + 'vi-tdesign:castle-7', + 'vi-tdesign:cat', + 'vi-tdesign:catalog', + 'vi-tdesign:cd', + 'vi-tdesign:celsius', + 'vi-tdesign:center-focus-strong', + 'vi-tdesign:centimeter', + 'vi-tdesign:certificate', + 'vi-tdesign:certificate-1', + 'vi-tdesign:chart', + 'vi-tdesign:chart-3d', + 'vi-tdesign:chart-add', + 'vi-tdesign:chart-analytics', + 'vi-tdesign:chart-area', + 'vi-tdesign:chart-area-multi', + 'vi-tdesign:chart-bar', + 'vi-tdesign:chart-bubble', + 'vi-tdesign:chart-colum', + 'vi-tdesign:chart-combo', + 'vi-tdesign:chart-line', + 'vi-tdesign:chart-line-data', + 'vi-tdesign:chart-line-data-1', + 'vi-tdesign:chart-line-multi', + 'vi-tdesign:chart-maximum', + 'vi-tdesign:chart-median', + 'vi-tdesign:chart-minimum', + 'vi-tdesign:chart-pie', + 'vi-tdesign:chart-radar', + 'vi-tdesign:chart-radial', + 'vi-tdesign:chart-ring', + 'vi-tdesign:chart-ring-1', + 'vi-tdesign:chart-scatter', + 'vi-tdesign:chart-stacked', + 'vi-tdesign:chat', + 'vi-tdesign:chat-add', + 'vi-tdesign:chat-bubble', + 'vi-tdesign:chat-bubble-1', + 'vi-tdesign:chat-bubble-add', + 'vi-tdesign:chat-bubble-error', + 'vi-tdesign:chat-bubble-help', + 'vi-tdesign:chat-bubble-history', + 'vi-tdesign:chat-bubble-locked', + 'vi-tdesign:chat-bubble-smile', + 'vi-tdesign:chat-checked', + 'vi-tdesign:chat-clear', + 'vi-tdesign:chat-double', + 'vi-tdesign:chat-error', + 'vi-tdesign:chat-heart', + 'vi-tdesign:chat-message', + 'vi-tdesign:chat-off', + 'vi-tdesign:chat-poll', + 'vi-tdesign:chat-setting', + 'vi-tdesign:check', + 'vi-tdesign:check-circle', + 'vi-tdesign:check-circle-filled', + 'vi-tdesign:check-double', + 'vi-tdesign:check-rectangle', + 'vi-tdesign:check-rectangle-filled', + 'vi-tdesign:cheese', + 'vi-tdesign:cherry', + 'vi-tdesign:chevron-down', + 'vi-tdesign:chevron-down-circle', + 'vi-tdesign:chevron-down-double', + 'vi-tdesign:chevron-down-double-s', + 'vi-tdesign:chevron-down-rectangle', + 'vi-tdesign:chevron-down-s', + 'vi-tdesign:chevron-left', + 'vi-tdesign:chevron-left-circle', + 'vi-tdesign:chevron-left-double', + 'vi-tdesign:chevron-left-double-s', + 'vi-tdesign:chevron-left-rectangle', + 'vi-tdesign:chevron-left-s', + 'vi-tdesign:chevron-right', + 'vi-tdesign:chevron-right-circle', + 'vi-tdesign:chevron-right-double', + 'vi-tdesign:chevron-right-double-s', + 'vi-tdesign:chevron-right-rectangle', + 'vi-tdesign:chevron-right-s', + 'vi-tdesign:chevron-up', + 'vi-tdesign:chevron-up-circle', + 'vi-tdesign:chevron-up-double', + 'vi-tdesign:chevron-up-double-s', + 'vi-tdesign:chevron-up-rectangle', + 'vi-tdesign:chevron-up-s', + 'vi-tdesign:chicken', + 'vi-tdesign:chili', + 'vi-tdesign:chimney', + 'vi-tdesign:chimney-1', + 'vi-tdesign:chimney-2', + 'vi-tdesign:chinese-cabbage', + 'vi-tdesign:church', + 'vi-tdesign:circle', + 'vi-tdesign:city', + 'vi-tdesign:city-1', + 'vi-tdesign:city-10', + 'vi-tdesign:city-11', + 'vi-tdesign:city-12', + 'vi-tdesign:city-13', + 'vi-tdesign:city-14', + 'vi-tdesign:city-15', + 'vi-tdesign:city-2', + 'vi-tdesign:city-3', + 'vi-tdesign:city-4', + 'vi-tdesign:city-5', + 'vi-tdesign:city-6', + 'vi-tdesign:city-7', + 'vi-tdesign:city-8', + 'vi-tdesign:city-9', + 'vi-tdesign:city-ancient', + 'vi-tdesign:city-ancient-1', + 'vi-tdesign:city-ancient-2', + 'vi-tdesign:clear', + 'vi-tdesign:clear-formatting', + 'vi-tdesign:clear-formatting-1', + 'vi-tdesign:close', + 'vi-tdesign:close-circle', + 'vi-tdesign:close-circle-filled', + 'vi-tdesign:close-octagon', + 'vi-tdesign:close-rectangle', + 'vi-tdesign:cloud', + 'vi-tdesign:cloud-download', + 'vi-tdesign:cloud-upload', + 'vi-tdesign:cloudy-day', + 'vi-tdesign:cloudy-night', + 'vi-tdesign:cloudy-night-rain', + 'vi-tdesign:cloudy-rain', + 'vi-tdesign:cloudy-sunny', + 'vi-tdesign:code', + 'vi-tdesign:code-1', + 'vi-tdesign:code-off', + 'vi-tdesign:cola', + 'vi-tdesign:collage', + 'vi-tdesign:collection', + 'vi-tdesign:color-invert', + 'vi-tdesign:combination', + 'vi-tdesign:command', + 'vi-tdesign:compass', + 'vi-tdesign:compass-1', + 'vi-tdesign:component-breadcrumb', + 'vi-tdesign:component-checkbox', + 'vi-tdesign:component-divider-horizontal', + 'vi-tdesign:component-divider-vertical', + 'vi-tdesign:component-dropdown', + 'vi-tdesign:component-grid', + 'vi-tdesign:component-input', + 'vi-tdesign:component-layout', + 'vi-tdesign:component-radio', + 'vi-tdesign:component-space', + 'vi-tdesign:component-steps', + 'vi-tdesign:component-switch', + 'vi-tdesign:constraint', + 'vi-tdesign:contrast', + 'vi-tdesign:contrast-1', + 'vi-tdesign:control-platform', + 'vi-tdesign:cooperate', + 'vi-tdesign:coordinate-system', + 'vi-tdesign:copy', + 'vi-tdesign:copyright', + 'vi-tdesign:corn', + 'vi-tdesign:coupon', + 'vi-tdesign:course', + 'vi-tdesign:cpu', + 'vi-tdesign:crack', + 'vi-tdesign:creditcard', + 'vi-tdesign:creditcard-add', + 'vi-tdesign:creditcard-off', + 'vi-tdesign:crooked-smile', + 'vi-tdesign:cry-and-laugh', + 'vi-tdesign:cry-loudly', + 'vi-tdesign:css3', + 'vi-tdesign:cucumber', + 'vi-tdesign:currency-exchange', + 'vi-tdesign:cursor', + 'vi-tdesign:curtain', + 'vi-tdesign:curve', + 'vi-tdesign:cut', + 'vi-tdesign:cut-1', + 'vi-tdesign:dam', + 'vi-tdesign:dam-1', + 'vi-tdesign:dam-2', + 'vi-tdesign:dam-3', + 'vi-tdesign:dam-4', + 'vi-tdesign:dam-5', + 'vi-tdesign:dam-6', + 'vi-tdesign:dam-7', + 'vi-tdesign:dart-board', + 'vi-tdesign:dashboard', + 'vi-tdesign:dashboard-1', + 'vi-tdesign:data', + 'vi-tdesign:data-base', + 'vi-tdesign:data-checked', + 'vi-tdesign:data-display', + 'vi-tdesign:data-error', + 'vi-tdesign:data-search', + 'vi-tdesign:delete', + 'vi-tdesign:delete-1', + 'vi-tdesign:delete-time', + 'vi-tdesign:delta', + 'vi-tdesign:depressed', + 'vi-tdesign:desktop', + 'vi-tdesign:desktop-1', + 'vi-tdesign:despise', + 'vi-tdesign:device', + 'vi-tdesign:discount', + 'vi-tdesign:discount-filled', + 'vi-tdesign:dissatisfaction', + 'vi-tdesign:divide', + 'vi-tdesign:dividers', + 'vi-tdesign:dividers-1', + 'vi-tdesign:doge', + 'vi-tdesign:double-storey', + 'vi-tdesign:download', + 'vi-tdesign:download-1', + 'vi-tdesign:downscale', + 'vi-tdesign:drag-drop', + 'vi-tdesign:drag-move', + 'vi-tdesign:drink', + 'vi-tdesign:drumstick', + 'vi-tdesign:dv', + 'vi-tdesign:dvd', + 'vi-tdesign:earphone', + 'vi-tdesign:earth', + 'vi-tdesign:edit', + 'vi-tdesign:edit-1', + 'vi-tdesign:edit-2', + 'vi-tdesign:edit-off', + 'vi-tdesign:education', + 'vi-tdesign:eggplant', + 'vi-tdesign:ellipsis', + 'vi-tdesign:emo-emotional', + 'vi-tdesign:enter', + 'vi-tdesign:equal', + 'vi-tdesign:error', + 'vi-tdesign:error-circle', + 'vi-tdesign:error-circle-filled', + 'vi-tdesign:error-triangle', + 'vi-tdesign:excited', + 'vi-tdesign:excited-1', + 'vi-tdesign:expand-horizontal', + 'vi-tdesign:expand-vertical', + 'vi-tdesign:explore', + 'vi-tdesign:explore-off', + 'vi-tdesign:exposure', + 'vi-tdesign:extension', + 'vi-tdesign:extension-off', + 'vi-tdesign:face-retouching', + 'vi-tdesign:fact-check', + 'vi-tdesign:fahrenheit-scale', + 'vi-tdesign:feel-at-ease', + 'vi-tdesign:ferocious', + 'vi-tdesign:ferris-wheel', + 'vi-tdesign:file', + 'vi-tdesign:file-1', + 'vi-tdesign:file-add', + 'vi-tdesign:file-add-1', + 'vi-tdesign:file-attachment', + 'vi-tdesign:file-blocked', + 'vi-tdesign:file-code', + 'vi-tdesign:file-code-1', + 'vi-tdesign:file-copy', + 'vi-tdesign:file-download', + 'vi-tdesign:file-excel', + 'vi-tdesign:file-export', + 'vi-tdesign:file-icon', + 'vi-tdesign:file-image', + 'vi-tdesign:file-import', + 'vi-tdesign:file-locked', + 'vi-tdesign:file-minus', + 'vi-tdesign:file-music', + 'vi-tdesign:file-onenote', + 'vi-tdesign:file-outlook', + 'vi-tdesign:file-paste', + 'vi-tdesign:file-pdf', + 'vi-tdesign:file-powerpoint', + 'vi-tdesign:file-restore', + 'vi-tdesign:file-safety', + 'vi-tdesign:file-search', + 'vi-tdesign:file-setting', + 'vi-tdesign:file-teams', + 'vi-tdesign:file-unknown', + 'vi-tdesign:file-unlocked', + 'vi-tdesign:file-word', + 'vi-tdesign:file-zip', + 'vi-tdesign:fill-color', + 'vi-tdesign:fill-color-1', + 'vi-tdesign:film', + 'vi-tdesign:film-1', + 'vi-tdesign:filter', + 'vi-tdesign:filter-1', + 'vi-tdesign:filter-2', + 'vi-tdesign:filter-3', + 'vi-tdesign:filter-clear', + 'vi-tdesign:filter-off', + 'vi-tdesign:fingerprint', + 'vi-tdesign:fingerprint-1', + 'vi-tdesign:fingerprint-2', + 'vi-tdesign:fingerprint-3', + 'vi-tdesign:fish', + 'vi-tdesign:flag', + 'vi-tdesign:flag-1', + 'vi-tdesign:flag-2', + 'vi-tdesign:flag-3', + 'vi-tdesign:flag-4', + 'vi-tdesign:flashlight', + 'vi-tdesign:flight-landing', + 'vi-tdesign:flight-takeoff', + 'vi-tdesign:flip-smiling-face', + 'vi-tdesign:flip-to-back', + 'vi-tdesign:flip-to-front', + 'vi-tdesign:focus', + 'vi-tdesign:fog', + 'vi-tdesign:fog-night', + 'vi-tdesign:fog-sunny', + 'vi-tdesign:folder', + 'vi-tdesign:folder-1', + 'vi-tdesign:folder-add', + 'vi-tdesign:folder-add-1', + 'vi-tdesign:folder-blocked', + 'vi-tdesign:folder-details', + 'vi-tdesign:folder-export', + 'vi-tdesign:folder-import', + 'vi-tdesign:folder-locked', + 'vi-tdesign:folder-minus', + 'vi-tdesign:folder-move', + 'vi-tdesign:folder-off', + 'vi-tdesign:folder-open', + 'vi-tdesign:folder-open-1', + 'vi-tdesign:folder-search', + 'vi-tdesign:folder-setting', + 'vi-tdesign:folder-shared', + 'vi-tdesign:folder-unlocked', + 'vi-tdesign:folder-zip', + 'vi-tdesign:forest', + 'vi-tdesign:fork', + 'vi-tdesign:form', + 'vi-tdesign:format-horizontal-align-bottom', + 'vi-tdesign:format-horizontal-align-center', + 'vi-tdesign:format-horizontal-align-top', + 'vi-tdesign:format-vertical-align-center', + 'vi-tdesign:format-vertical-align-left', + 'vi-tdesign:format-vertical-align-right', + 'vi-tdesign:forward', + 'vi-tdesign:frame', + 'vi-tdesign:frame-1', + 'vi-tdesign:fries', + 'vi-tdesign:fullscreen', + 'vi-tdesign:fullscreen-1', + 'vi-tdesign:fullscreen-2', + 'vi-tdesign:fullscreen-exit', + 'vi-tdesign:fullscreen-exit-1', + 'vi-tdesign:function-curve', + 'vi-tdesign:functions', + 'vi-tdesign:functions-1', + 'vi-tdesign:gamepad', + 'vi-tdesign:gamepad-1', + 'vi-tdesign:gamma', + 'vi-tdesign:garlic', + 'vi-tdesign:gender-female', + 'vi-tdesign:gender-male', + 'vi-tdesign:gesture-applause', + 'vi-tdesign:gesture-click', + 'vi-tdesign:gesture-down', + 'vi-tdesign:gesture-expansion', + 'vi-tdesign:gesture-left', + 'vi-tdesign:gesture-left-slip', + 'vi-tdesign:gesture-pray', + 'vi-tdesign:gesture-pray-1', + 'vi-tdesign:gesture-press', + 'vi-tdesign:gesture-ranslation', + 'vi-tdesign:gesture-ranslation-1', + 'vi-tdesign:gesture-right', + 'vi-tdesign:gesture-right-slip', + 'vi-tdesign:gesture-slide-up', + 'vi-tdesign:gesture-up', + 'vi-tdesign:gesture-up-1', + 'vi-tdesign:gesture-up-2', + 'vi-tdesign:gesture-up-and-down', + 'vi-tdesign:gesture-wipe-down', + 'vi-tdesign:gift', + 'vi-tdesign:giggle', + 'vi-tdesign:git-branch', + 'vi-tdesign:git-commit', + 'vi-tdesign:git-merge', + 'vi-tdesign:git-pull-request', + 'vi-tdesign:git-repository', + 'vi-tdesign:git-repository-commits', + 'vi-tdesign:git-repository-private', + 'vi-tdesign:gps', + 'vi-tdesign:grape', + 'vi-tdesign:greater-than', + 'vi-tdesign:greater-than-or-equal', + 'vi-tdesign:green-onion', + 'vi-tdesign:grid-add', + 'vi-tdesign:grid-view', + 'vi-tdesign:guitar', + 'vi-tdesign:hamburger', + 'vi-tdesign:happy', + 'vi-tdesign:hard-disk-storage', + 'vi-tdesign:hard-drive', + 'vi-tdesign:hashtag', + 'vi-tdesign:hd', + 'vi-tdesign:heart', + 'vi-tdesign:heart-filled', + 'vi-tdesign:help', + 'vi-tdesign:help-circle', + 'vi-tdesign:help-circle-filled', + 'vi-tdesign:help-rectangle', + 'vi-tdesign:highlight', + 'vi-tdesign:highlight-1', + 'vi-tdesign:history', + 'vi-tdesign:history-setting', + 'vi-tdesign:home', + 'vi-tdesign:hospital', + 'vi-tdesign:hospital-1', + 'vi-tdesign:hotspot-wave', + 'vi-tdesign:hourglass', + 'vi-tdesign:houses', + 'vi-tdesign:houses-1', + 'vi-tdesign:houses-2', + 'vi-tdesign:html5', + 'vi-tdesign:https', + 'vi-tdesign:ice-cream', + 'vi-tdesign:icon', + 'vi-tdesign:image', + 'vi-tdesign:image-1', + 'vi-tdesign:image-add', + 'vi-tdesign:image-edit', + 'vi-tdesign:image-error', + 'vi-tdesign:image-off', + 'vi-tdesign:image-search', + 'vi-tdesign:indent-left', + 'vi-tdesign:indent-right', + 'vi-tdesign:indicator', + 'vi-tdesign:info-circle', + 'vi-tdesign:info-circle-filled', + 'vi-tdesign:ink', + 'vi-tdesign:install', + 'vi-tdesign:install-desktop', + 'vi-tdesign:install-mobile', + 'vi-tdesign:institution', + 'vi-tdesign:institution-checked', + 'vi-tdesign:internet', + 'vi-tdesign:ipod', + 'vi-tdesign:joyful', + 'vi-tdesign:jump', + 'vi-tdesign:jump-off', + 'vi-tdesign:keyboard', + 'vi-tdesign:laptop', + 'vi-tdesign:layers', + 'vi-tdesign:layout', + 'vi-tdesign:leaderboard', + 'vi-tdesign:lemon', + 'vi-tdesign:lemon-slice', + 'vi-tdesign:less-than', + 'vi-tdesign:less-than-or-equal', + 'vi-tdesign:letters-a', + 'vi-tdesign:letters-b', + 'vi-tdesign:letters-c', + 'vi-tdesign:letters-d', + 'vi-tdesign:letters-e', + 'vi-tdesign:letters-f', + 'vi-tdesign:letters-g', + 'vi-tdesign:letters-h', + 'vi-tdesign:letters-i', + 'vi-tdesign:letters-j', + 'vi-tdesign:letters-k', + 'vi-tdesign:letters-l', + 'vi-tdesign:letters-m', + 'vi-tdesign:letters-n', + 'vi-tdesign:letters-o', + 'vi-tdesign:letters-p', + 'vi-tdesign:letters-q', + 'vi-tdesign:letters-r', + 'vi-tdesign:letters-s', + 'vi-tdesign:letters-t', + 'vi-tdesign:letters-u', + 'vi-tdesign:letters-v', + 'vi-tdesign:letters-w', + 'vi-tdesign:letters-x', + 'vi-tdesign:letters-y', + 'vi-tdesign:letters-z', + 'vi-tdesign:lightbulb', + 'vi-tdesign:lightbulb-circle', + 'vi-tdesign:lighthouse', + 'vi-tdesign:lighthouse-1', + 'vi-tdesign:lighthouse-2', + 'vi-tdesign:lighting-circle', + 'vi-tdesign:line-height', + 'vi-tdesign:link', + 'vi-tdesign:link-1', + 'vi-tdesign:link-unlink', + 'vi-tdesign:liquor', + 'vi-tdesign:list', + 'vi-tdesign:load', + 'vi-tdesign:loading', + 'vi-tdesign:location', + 'vi-tdesign:location-1', + 'vi-tdesign:location-enlargement', + 'vi-tdesign:location-error', + 'vi-tdesign:location-parking-place', + 'vi-tdesign:location-reduction', + 'vi-tdesign:location-setting', + 'vi-tdesign:lock-off', + 'vi-tdesign:lock-on', + 'vi-tdesign:lock-time', + 'vi-tdesign:login', + 'vi-tdesign:logo-adobe-illustrate', + 'vi-tdesign:logo-adobe-photoshop', + 'vi-tdesign:logo-adobe-photoshop-1', + 'vi-tdesign:logo-android', + 'vi-tdesign:logo-apple', + 'vi-tdesign:logo-apple-filled', + 'vi-tdesign:logo-behance', + 'vi-tdesign:logo-chrome', + 'vi-tdesign:logo-chrome-filled', + 'vi-tdesign:logo-cinema4d', + 'vi-tdesign:logo-codepen', + 'vi-tdesign:logo-codesandbox', + 'vi-tdesign:logo-dribbble', + 'vi-tdesign:logo-facebook', + 'vi-tdesign:logo-figma', + 'vi-tdesign:logo-framer', + 'vi-tdesign:logo-github', + 'vi-tdesign:logo-github-filled', + 'vi-tdesign:logo-gitlab', + 'vi-tdesign:logo-ie', + 'vi-tdesign:logo-ie-filled', + 'vi-tdesign:logo-instagram', + 'vi-tdesign:logo-qq', + 'vi-tdesign:logo-twitter', + 'vi-tdesign:logo-wechat', + 'vi-tdesign:logo-wechat-stroke', + 'vi-tdesign:logo-wecom', + 'vi-tdesign:logo-windows', + 'vi-tdesign:logo-windows-filled', + 'vi-tdesign:logo-youtube', + 'vi-tdesign:logout', + 'vi-tdesign:look-around', + 'vi-tdesign:loudspeaker', + 'vi-tdesign:mail', + 'vi-tdesign:map', + 'vi-tdesign:map-3d', + 'vi-tdesign:map-add', + 'vi-tdesign:map-aiming', + 'vi-tdesign:map-blocked', + 'vi-tdesign:map-bubble', + 'vi-tdesign:map-cancel', + 'vi-tdesign:map-chat', + 'vi-tdesign:map-checked', + 'vi-tdesign:map-collection', + 'vi-tdesign:map-connection', + 'vi-tdesign:map-distance', + 'vi-tdesign:map-double', + 'vi-tdesign:map-edit', + 'vi-tdesign:map-grid', + 'vi-tdesign:map-information', + 'vi-tdesign:map-information-1', + 'vi-tdesign:map-information-2', + 'vi-tdesign:map-location', + 'vi-tdesign:map-locked', + 'vi-tdesign:map-marked', + 'vi-tdesign:map-navigation', + 'vi-tdesign:map-outline', + 'vi-tdesign:map-route-planning', + 'vi-tdesign:map-ruler', + 'vi-tdesign:map-safety', + 'vi-tdesign:map-search', + 'vi-tdesign:map-search-1', + 'vi-tdesign:map-setting', + 'vi-tdesign:map-unlocked', + 'vi-tdesign:mark-as-unread', + 'vi-tdesign:markup', + 'vi-tdesign:mathematics', + 'vi-tdesign:measurement', + 'vi-tdesign:measurement-1', + 'vi-tdesign:measurement-2', + 'vi-tdesign:meat-pepper', + 'vi-tdesign:media-library', + 'vi-tdesign:member', + 'vi-tdesign:menu', + 'vi-tdesign:menu-application', + 'vi-tdesign:menu-fold', + 'vi-tdesign:menu-unfold', + 'vi-tdesign:merge-cells', + 'vi-tdesign:microphone', + 'vi-tdesign:microphone-1', + 'vi-tdesign:microphone-2', + 'vi-tdesign:milk', + 'vi-tdesign:minus', + 'vi-tdesign:minus-circle', + 'vi-tdesign:minus-circle-filled', + 'vi-tdesign:minus-rectangle', + 'vi-tdesign:minus-rectangle-filled', + 'vi-tdesign:mirror', + 'vi-tdesign:mobile', + 'vi-tdesign:mobile-blocked', + 'vi-tdesign:mobile-list', + 'vi-tdesign:mobile-navigation', + 'vi-tdesign:mobile-shortcut', + 'vi-tdesign:mobile-vibrate', + 'vi-tdesign:mode-dark', + 'vi-tdesign:mode-light', + 'vi-tdesign:module', + 'vi-tdesign:money', + 'vi-tdesign:monument', + 'vi-tdesign:moon', + 'vi-tdesign:moon-fall', + 'vi-tdesign:moon-rising', + 'vi-tdesign:more', + 'vi-tdesign:mosque', + 'vi-tdesign:mosque-1', + 'vi-tdesign:mouse', + 'vi-tdesign:move', + 'vi-tdesign:move-1', + 'vi-tdesign:movie-clapper', + 'vi-tdesign:multiply', + 'vi-tdesign:museum', + 'vi-tdesign:museum-1', + 'vi-tdesign:museum-2', + 'vi-tdesign:mushroom', + 'vi-tdesign:mushroom-1', + 'vi-tdesign:music', + 'vi-tdesign:music-1', + 'vi-tdesign:music-2', + 'vi-tdesign:music-rectangle-add', + 'vi-tdesign:navigation-arrow', + 'vi-tdesign:next', + 'vi-tdesign:no-expression', + 'vi-tdesign:noodle', + 'vi-tdesign:notification', + 'vi-tdesign:notification-add', + 'vi-tdesign:notification-circle', + 'vi-tdesign:notification-error', + 'vi-tdesign:notification-filled', + 'vi-tdesign:numbers-0', + 'vi-tdesign:numbers-0-1', + 'vi-tdesign:numbers-1', + 'vi-tdesign:numbers-1-1', + 'vi-tdesign:numbers-2', + 'vi-tdesign:numbers-2-1', + 'vi-tdesign:numbers-3', + 'vi-tdesign:numbers-3-1', + 'vi-tdesign:numbers-4', + 'vi-tdesign:numbers-4-1', + 'vi-tdesign:numbers-5', + 'vi-tdesign:numbers-5-1', + 'vi-tdesign:numbers-6', + 'vi-tdesign:numbers-6-1', + 'vi-tdesign:numbers-7', + 'vi-tdesign:numbers-7-1', + 'vi-tdesign:numbers-8', + 'vi-tdesign:numbers-8-1', + 'vi-tdesign:numbers-9', + 'vi-tdesign:numbers-9-1', + 'vi-tdesign:nut', + 'vi-tdesign:object-storage', + 'vi-tdesign:open-mouth', + 'vi-tdesign:opera', + 'vi-tdesign:order-adjustment-column', + 'vi-tdesign:order-ascending', + 'vi-tdesign:order-descending', + 'vi-tdesign:outbox', + 'vi-tdesign:page-first', + 'vi-tdesign:page-head', + 'vi-tdesign:page-last', + 'vi-tdesign:palace', + 'vi-tdesign:palace-1', + 'vi-tdesign:palace-2', + 'vi-tdesign:palace-3', + 'vi-tdesign:palace-4', + 'vi-tdesign:palette', + 'vi-tdesign:palette-1', + 'vi-tdesign:panorama-horizontal', + 'vi-tdesign:panorama-vertical', + 'vi-tdesign:pantone', + 'vi-tdesign:parabola', + 'vi-tdesign:parentheses', + 'vi-tdesign:paste', + 'vi-tdesign:patio', + 'vi-tdesign:pause', + 'vi-tdesign:pause-circle', + 'vi-tdesign:pause-circle-filled', + 'vi-tdesign:pause-circle-stroke', + 'vi-tdesign:pea', + 'vi-tdesign:peach', + 'vi-tdesign:pear', + 'vi-tdesign:pearl-of-the-orient', + 'vi-tdesign:pen', + 'vi-tdesign:pen-ball', + 'vi-tdesign:pen-brush', + 'vi-tdesign:pen-mark', + 'vi-tdesign:pen-quill', + 'vi-tdesign:pending', + 'vi-tdesign:percent', + 'vi-tdesign:personal-information', + 'vi-tdesign:phone-locked', + 'vi-tdesign:phone-search', + 'vi-tdesign:pi', + 'vi-tdesign:piano', + 'vi-tdesign:pin', + 'vi-tdesign:pin-filled', + 'vi-tdesign:play', + 'vi-tdesign:play-circle', + 'vi-tdesign:play-circle-filled', + 'vi-tdesign:play-circle-stroke', + 'vi-tdesign:play-circle-stroke-add', + 'vi-tdesign:play-demo', + 'vi-tdesign:play-rectangle', + 'vi-tdesign:plus', + 'vi-tdesign:popsicle', + 'vi-tdesign:portrait', + 'vi-tdesign:pout', + 'vi-tdesign:poweroff', + 'vi-tdesign:precise-monitor', + 'vi-tdesign:previous', + 'vi-tdesign:print', + 'vi-tdesign:pumpkin', + 'vi-tdesign:pyramid', + 'vi-tdesign:pyramid-maya', + 'vi-tdesign:qrcode', + 'vi-tdesign:quadratic', + 'vi-tdesign:questionnaire', + 'vi-tdesign:queue', + 'vi-tdesign:radar', + 'vi-tdesign:radio-1', + 'vi-tdesign:radio-2', + 'vi-tdesign:radish', + 'vi-tdesign:rain-heavy', + 'vi-tdesign:rain-light', + 'vi-tdesign:rain-medium', + 'vi-tdesign:rainbow', + 'vi-tdesign:rectangle', + 'vi-tdesign:refresh', + 'vi-tdesign:relation', + 'vi-tdesign:relativity', + 'vi-tdesign:remote-wave', + 'vi-tdesign:remove', + 'vi-tdesign:replay', + 'vi-tdesign:rice', + 'vi-tdesign:rice-ball', + 'vi-tdesign:roast', + 'vi-tdesign:rocket', + 'vi-tdesign:rollback', + 'vi-tdesign:rollfront', + 'vi-tdesign:root-list', + 'vi-tdesign:rotate', + 'vi-tdesign:rotate-locked', + 'vi-tdesign:rotation', + 'vi-tdesign:round', + 'vi-tdesign:router-wave', + 'vi-tdesign:rss', + 'vi-tdesign:ruler', + 'vi-tdesign:sailing-hotel', + 'vi-tdesign:sandwich', + 'vi-tdesign:saturation', + 'vi-tdesign:sausage', + 'vi-tdesign:save', + 'vi-tdesign:saving-pot', + 'vi-tdesign:scan', + 'vi-tdesign:screen-4k', + 'vi-tdesign:screencast', + 'vi-tdesign:screenshot', + 'vi-tdesign:scroll-bar', + 'vi-tdesign:sd-card', + 'vi-tdesign:sd-card-1', + 'vi-tdesign:search', + 'vi-tdesign:search-error', + 'vi-tdesign:secured', + 'vi-tdesign:send', + 'vi-tdesign:send-cancel', + 'vi-tdesign:sensors', + 'vi-tdesign:sensors-1', + 'vi-tdesign:sensors-2', + 'vi-tdesign:sensors-off', + 'vi-tdesign:serenity', + 'vi-tdesign:server', + 'vi-tdesign:service', + 'vi-tdesign:setting', + 'vi-tdesign:setting-1', + 'vi-tdesign:share', + 'vi-tdesign:share-1', + 'vi-tdesign:sharpness', + 'vi-tdesign:shield-error', + 'vi-tdesign:shimen', + 'vi-tdesign:shop', + 'vi-tdesign:shop-1', + 'vi-tdesign:shop-2', + 'vi-tdesign:shop-3', + 'vi-tdesign:shop-4', + 'vi-tdesign:shop-5', + 'vi-tdesign:shrimp', + 'vi-tdesign:shrink-horizontal', + 'vi-tdesign:shrink-vertical', + 'vi-tdesign:shutter', + 'vi-tdesign:shutup', + 'vi-tdesign:sim-card', + 'vi-tdesign:sim-card-1', + 'vi-tdesign:sim-card-2', + 'vi-tdesign:sinister-smile', + 'vi-tdesign:sip', + 'vi-tdesign:slash', + 'vi-tdesign:sleep', + 'vi-tdesign:slice', + 'vi-tdesign:slideshow', + 'vi-tdesign:smile', + 'vi-tdesign:sneer', + 'vi-tdesign:snowflake', + 'vi-tdesign:sonic', + 'vi-tdesign:sound', + 'vi-tdesign:sound-down', + 'vi-tdesign:sound-high', + 'vi-tdesign:sound-low', + 'vi-tdesign:sound-mute', + 'vi-tdesign:sound-mute-1', + 'vi-tdesign:sound-up', + 'vi-tdesign:space', + 'vi-tdesign:speechless-1', + 'vi-tdesign:star', + 'vi-tdesign:star-filled', + 'vi-tdesign:statue-of-jesus', + 'vi-tdesign:sticky-note', + 'vi-tdesign:stop', + 'vi-tdesign:stop-circle', + 'vi-tdesign:stop-circle-filled', + 'vi-tdesign:stop-circle-stroke', + 'vi-tdesign:store', + 'vi-tdesign:street-road', + 'vi-tdesign:street-road-1', + 'vi-tdesign:subtitle', + 'vi-tdesign:subway-line', + 'vi-tdesign:sum', + 'vi-tdesign:sun-fall', + 'vi-tdesign:sun-rising', + 'vi-tdesign:sunny', + 'vi-tdesign:support', + 'vi-tdesign:surprised', + 'vi-tdesign:surprised-1', + 'vi-tdesign:swap', + 'vi-tdesign:swap-left', + 'vi-tdesign:swap-right', + 'vi-tdesign:swear-1', + 'vi-tdesign:swear-2', + 'vi-tdesign:system-2', + 'vi-tdesign:system-3', + 'vi-tdesign:system-application', + 'vi-tdesign:system-blocked', + 'vi-tdesign:system-code', + 'vi-tdesign:system-components', + 'vi-tdesign:system-coordinate', + 'vi-tdesign:system-device', + 'vi-tdesign:system-interface', + 'vi-tdesign:system-location', + 'vi-tdesign:system-locked', + 'vi-tdesign:system-log', + 'vi-tdesign:system-marked', + 'vi-tdesign:system-messages', + 'vi-tdesign:system-regulation', + 'vi-tdesign:system-search', + 'vi-tdesign:system-setting', + 'vi-tdesign:system-storage', + 'vi-tdesign:system-sum', + 'vi-tdesign:system-unlocked', + 'vi-tdesign:tab', + 'vi-tdesign:table', + 'vi-tdesign:table-1', + 'vi-tdesign:table-2', + 'vi-tdesign:table-add', + 'vi-tdesign:table-split', + 'vi-tdesign:tag', + 'vi-tdesign:tangerinr', + 'vi-tdesign:tape', + 'vi-tdesign:task', + 'vi-tdesign:task-1', + 'vi-tdesign:task-add', + 'vi-tdesign:task-add-1', + 'vi-tdesign:task-checked', + 'vi-tdesign:task-error', + 'vi-tdesign:task-location', + 'vi-tdesign:task-marked', + 'vi-tdesign:task-setting', + 'vi-tdesign:task-visible', + 'vi-tdesign:tea', + 'vi-tdesign:teahouse', + 'vi-tdesign:template', + 'vi-tdesign:temple', + 'vi-tdesign:terminal', + 'vi-tdesign:terminal-rectangle', + 'vi-tdesign:terminal-rectangle-1', + 'vi-tdesign:terminal-window', + 'vi-tdesign:textbox', + 'vi-tdesign:textformat-bold', + 'vi-tdesign:textformat-color', + 'vi-tdesign:textformat-italic', + 'vi-tdesign:textformat-strikethrough', + 'vi-tdesign:textformat-underline', + 'vi-tdesign:textformat-wrap', + 'vi-tdesign:theaters', + 'vi-tdesign:thumb-down', + 'vi-tdesign:thumb-down-1', + 'vi-tdesign:thumb-down-2', + 'vi-tdesign:thumb-up', + 'vi-tdesign:thumb-up-1', + 'vi-tdesign:thumb-up-2', + 'vi-tdesign:thunder', + 'vi-tdesign:thunderstorm', + 'vi-tdesign:thunderstorm-night', + 'vi-tdesign:thunderstorm-sunny', + 'vi-tdesign:ticket', + 'vi-tdesign:time', + 'vi-tdesign:time-filled', + 'vi-tdesign:tips', + 'vi-tdesign:tips-double', + 'vi-tdesign:tomato', + 'vi-tdesign:tools', + 'vi-tdesign:tools-circle', + 'vi-tdesign:tornado', + 'vi-tdesign:tower', + 'vi-tdesign:tower-1', + 'vi-tdesign:tower-2', + 'vi-tdesign:tower-3', + 'vi-tdesign:tower-clock', + 'vi-tdesign:town', + 'vi-tdesign:traffic', + 'vi-tdesign:traffic-events', + 'vi-tdesign:transform', + 'vi-tdesign:transform-1', + 'vi-tdesign:transform-2', + 'vi-tdesign:transform-3', + 'vi-tdesign:translate', + 'vi-tdesign:translate-1', + 'vi-tdesign:tree-list', + 'vi-tdesign:tree-round-dot', + 'vi-tdesign:tree-round-dot-vertical', + 'vi-tdesign:tree-square-dot', + 'vi-tdesign:tree-square-dot-vertical', + 'vi-tdesign:trending-down', + 'vi-tdesign:trending-up', + 'vi-tdesign:tv', + 'vi-tdesign:tv-1', + 'vi-tdesign:tv-2', + 'vi-tdesign:typography', + 'vi-tdesign:uncomfortable', + 'vi-tdesign:uncomfortable-1', + 'vi-tdesign:uncomfortable-2', + 'vi-tdesign:undertake', + 'vi-tdesign:undertake-delivery', + 'vi-tdesign:undertake-environment-protection', + 'vi-tdesign:undertake-hold-up', + 'vi-tdesign:undertake-transaction', + 'vi-tdesign:unfold-less', + 'vi-tdesign:unfold-more', + 'vi-tdesign:unhappy', + 'vi-tdesign:unhappy-1', + 'vi-tdesign:uninstall', + 'vi-tdesign:upload', + 'vi-tdesign:upload-1', + 'vi-tdesign:upscale', + 'vi-tdesign:usb', + 'vi-tdesign:user', + 'vi-tdesign:user-1', + 'vi-tdesign:user-add', + 'vi-tdesign:user-arrow-down', + 'vi-tdesign:user-arrow-left', + 'vi-tdesign:user-arrow-right', + 'vi-tdesign:user-arrow-up', + 'vi-tdesign:user-avatar', + 'vi-tdesign:user-blocked', + 'vi-tdesign:user-business', + 'vi-tdesign:user-checked', + 'vi-tdesign:user-checked-1', + 'vi-tdesign:user-circle', + 'vi-tdesign:user-clear', + 'vi-tdesign:user-error-1', + 'vi-tdesign:user-invisible', + 'vi-tdesign:user-list', + 'vi-tdesign:user-locked', + 'vi-tdesign:user-marked', + 'vi-tdesign:user-password', + 'vi-tdesign:user-safety', + 'vi-tdesign:user-search', + 'vi-tdesign:user-setting', + 'vi-tdesign:user-talk', + 'vi-tdesign:user-talk-1', + 'vi-tdesign:user-talk-off-1', + 'vi-tdesign:user-time', + 'vi-tdesign:user-transmit', + 'vi-tdesign:user-unknown', + 'vi-tdesign:user-unlocked', + 'vi-tdesign:user-vip', + 'vi-tdesign:user-visible', + 'vi-tdesign:usergroup', + 'vi-tdesign:usergroup-add', + 'vi-tdesign:usergroup-clear', + 'vi-tdesign:vehicle', + 'vi-tdesign:verified', + 'vi-tdesign:verify', + 'vi-tdesign:video', + 'vi-tdesign:video-camera', + 'vi-tdesign:video-camera-1', + 'vi-tdesign:video-camera-2', + 'vi-tdesign:video-camera-dollar', + 'vi-tdesign:video-camera-minus', + 'vi-tdesign:video-camera-music', + 'vi-tdesign:video-camera-off', + 'vi-tdesign:video-library', + 'vi-tdesign:view-agenda', + 'vi-tdesign:view-column', + 'vi-tdesign:view-in-ar', + 'vi-tdesign:view-list', + 'vi-tdesign:view-module', + 'vi-tdesign:visual-recognition', + 'vi-tdesign:wallet', + 'vi-tdesign:watch', + 'vi-tdesign:watermelon', + 'vi-tdesign:wave-left', + 'vi-tdesign:wave-right', + 'vi-tdesign:wealth', + 'vi-tdesign:wealth-1', + 'vi-tdesign:widget', + 'vi-tdesign:wifi', + 'vi-tdesign:wifi-1', + 'vi-tdesign:wifi-off', + 'vi-tdesign:wifi-off-1', + 'vi-tdesign:window', + 'vi-tdesign:window-1', + 'vi-tdesign:windy', + 'vi-tdesign:windy-rain', + 'vi-tdesign:wink', + 'vi-tdesign:work', + 'vi-tdesign:work-history', + 'vi-tdesign:work-off', + 'vi-tdesign:wry-smile', + 'vi-tdesign:zoom-in', + 'vi-tdesign:zoom-out' + ] +} diff --git a/src/components/ImageCropping/index.ts b/src/components/ImageCropping/index.ts new file mode 100644 index 0000000..d6c0f25 --- /dev/null +++ b/src/components/ImageCropping/index.ts @@ -0,0 +1,3 @@ +import ImageCropping from './src/ImageCropping.vue' + +export { ImageCropping } diff --git a/src/components/ImageCropping/src/ImageCropping.vue b/src/components/ImageCropping/src/ImageCropping.vue new file mode 100644 index 0000000..2f8c685 --- /dev/null +++ b/src/components/ImageCropping/src/ImageCropping.vue @@ -0,0 +1,259 @@ + + + diff --git a/src/components/ImageViewer/index.ts b/src/components/ImageViewer/index.ts new file mode 100644 index 0000000..35764d6 --- /dev/null +++ b/src/components/ImageViewer/index.ts @@ -0,0 +1,33 @@ +import ImageViewer from './src/ImageViewer.vue' +import { isClient } from '@/utils/is' +import { createVNode, render, VNode } from 'vue' +import { ImageViewerProps } from './src/types' + +let instance: Nullable = null + +export function createImageViewer(options: ImageViewerProps) { + if (!isClient) return + const { + urlList, + initialIndex = 0, + infinite = true, + hideOnClickModal = false, + teleported = false, + zIndex = 2000, + show = true + } = options + + const propsData: Partial = {} + const container = document.createElement('div') + propsData.urlList = urlList + propsData.initialIndex = initialIndex + propsData.infinite = infinite + propsData.hideOnClickModal = hideOnClickModal + propsData.teleported = teleported + propsData.zIndex = zIndex + propsData.show = show + + document.body.appendChild(container) + instance = createVNode(ImageViewer, propsData) + render(instance, container) +} diff --git a/src/components/ImageViewer/src/ImageViewer.vue b/src/components/ImageViewer/src/ImageViewer.vue new file mode 100644 index 0000000..b9afe17 --- /dev/null +++ b/src/components/ImageViewer/src/ImageViewer.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/components/ImageViewer/src/types/index.ts b/src/components/ImageViewer/src/types/index.ts new file mode 100644 index 0000000..2fff4c0 --- /dev/null +++ b/src/components/ImageViewer/src/types/index.ts @@ -0,0 +1,9 @@ +export interface ImageViewerProps { + urlList?: string[] + zIndex?: number + initialIndex?: number + infinite?: boolean + hideOnClickModal?: boolean + teleported?: boolean + show?: boolean +} diff --git a/src/components/Infotip/index.ts b/src/components/Infotip/index.ts new file mode 100644 index 0000000..eb99944 --- /dev/null +++ b/src/components/Infotip/index.ts @@ -0,0 +1,5 @@ +import Infotip from './src/Infotip.vue' + +export type { InfoTipSchema } from './src/types' + +export { Infotip } diff --git a/src/components/Infotip/src/Infotip.vue b/src/components/Infotip/src/Infotip.vue new file mode 100644 index 0000000..ff9136c --- /dev/null +++ b/src/components/Infotip/src/Infotip.vue @@ -0,0 +1,53 @@ + + + diff --git a/src/components/Infotip/src/types/index.ts b/src/components/Infotip/src/types/index.ts new file mode 100644 index 0000000..50398db --- /dev/null +++ b/src/components/Infotip/src/types/index.ts @@ -0,0 +1,4 @@ +export interface InfoTipSchema { + label: string + keys?: string[] +} diff --git a/src/components/InputPassword/index.ts b/src/components/InputPassword/index.ts new file mode 100644 index 0000000..1dcc38e --- /dev/null +++ b/src/components/InputPassword/index.ts @@ -0,0 +1,3 @@ +import InputPassword from './src/InputPassword.vue' + +export { InputPassword } diff --git a/src/components/InputPassword/src/InputPassword.vue b/src/components/InputPassword/src/InputPassword.vue new file mode 100644 index 0000000..d9aa928 --- /dev/null +++ b/src/components/InputPassword/src/InputPassword.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/src/components/JsonEditor/index.ts b/src/components/JsonEditor/index.ts new file mode 100644 index 0000000..53a2d06 --- /dev/null +++ b/src/components/JsonEditor/index.ts @@ -0,0 +1,4 @@ +import JsonEditor from './src/JsonEditor.vue' +export type { JsonEditorProps } from './src/types' + +export { JsonEditor } diff --git a/src/components/JsonEditor/src/JsonEditor.vue b/src/components/JsonEditor/src/JsonEditor.vue new file mode 100644 index 0000000..a1c0a43 --- /dev/null +++ b/src/components/JsonEditor/src/JsonEditor.vue @@ -0,0 +1,98 @@ + + + diff --git a/src/components/JsonEditor/src/types/index.ts b/src/components/JsonEditor/src/types/index.ts new file mode 100644 index 0000000..d77097f --- /dev/null +++ b/src/components/JsonEditor/src/types/index.ts @@ -0,0 +1,23 @@ +export interface JsonEditorProps { + value: any + deep?: number + showLength?: boolean + showLineNumbers?: boolean + showLineNumber?: boolean + showIcon?: boolean + showDoubleQuotes?: boolean + virtual?: boolean + height?: number + itemHeight?: number + rootPath?: string + nodeSelectable?: (...args: any[]) => boolean + selectableType?: 'multiple' | 'single' + showSelectController?: boolean + selectOnClickNode?: boolean + highlightSelectedNode?: boolean + collapsedOnClickBrackets?: boolean + renderNodeKey?: (...args: any[]) => any + renderNodeValue?: (...args: any[]) => any + editable?: boolean + editableTrigger?: 'click' | 'dblclick' +} diff --git a/src/components/LocaleDropdown/index.ts b/src/components/LocaleDropdown/index.ts new file mode 100644 index 0000000..4d9b98a --- /dev/null +++ b/src/components/LocaleDropdown/index.ts @@ -0,0 +1,5 @@ +import LocaleDropdown from './src/LocaleDropdown.vue' + +export type { Language, LocaleDropdownType } from './src/types' + +export { LocaleDropdown } diff --git a/src/components/LocaleDropdown/src/LocaleDropdown.vue b/src/components/LocaleDropdown/src/LocaleDropdown.vue new file mode 100644 index 0000000..e1a0342 --- /dev/null +++ b/src/components/LocaleDropdown/src/LocaleDropdown.vue @@ -0,0 +1,52 @@ + + + diff --git a/src/components/LocaleDropdown/src/types/index.ts b/src/components/LocaleDropdown/src/types/index.ts new file mode 100644 index 0000000..c749dce --- /dev/null +++ b/src/components/LocaleDropdown/src/types/index.ts @@ -0,0 +1,10 @@ +export interface Language { + el: Recordable + name: string +} + +export interface LocaleDropdownType { + lang: LocaleType + name?: string + elLocale?: Language +} diff --git a/src/components/Logo/index.ts b/src/components/Logo/index.ts new file mode 100644 index 0000000..1c4224c --- /dev/null +++ b/src/components/Logo/index.ts @@ -0,0 +1,3 @@ +import Logo from './src/Logo.vue' + +export { Logo } diff --git a/src/components/Logo/src/Logo.vue b/src/components/Logo/src/Logo.vue new file mode 100644 index 0000000..89cbe90 --- /dev/null +++ b/src/components/Logo/src/Logo.vue @@ -0,0 +1,80 @@ + + + diff --git a/src/components/Menu/index.ts b/src/components/Menu/index.ts new file mode 100644 index 0000000..a6ec696 --- /dev/null +++ b/src/components/Menu/index.ts @@ -0,0 +1,3 @@ +import Menu from './src/Menu.vue' + +export { Menu } diff --git a/src/components/Menu/src/Menu.vue b/src/components/Menu/src/Menu.vue new file mode 100644 index 0000000..083d03c --- /dev/null +++ b/src/components/Menu/src/Menu.vue @@ -0,0 +1,278 @@ + + + + + diff --git a/src/components/Menu/src/components/useRenderMenuItem.tsx b/src/components/Menu/src/components/useRenderMenuItem.tsx new file mode 100644 index 0000000..96914cc --- /dev/null +++ b/src/components/Menu/src/components/useRenderMenuItem.tsx @@ -0,0 +1,59 @@ +import { ElSubMenu, ElMenuItem } from 'element-plus' +import { unref } from 'vue' +import { hasOneShowingChild } from '../helper' +import { isUrl } from '@/utils/is' +import { useRenderMenuTitle } from './useRenderMenuTitle' +import { pathResolve } from '@/utils/routerHelper' +import { useDesign } from '@/hooks/web/useDesign' + +const { getPrefixCls } = useDesign() +const prefixCls = getPrefixCls('submenu') + +const { renderMenuTitle } = useRenderMenuTitle() + +export const useRenderMenuItem = (menuMode) => + // allRouters: AppRouteRecordRaw[] = [], + { + const renderMenuItem = (routers: AppRouteRecordRaw[], parentPath = '/') => { + return routers + .filter((v) => !v.meta?.hidden) + .map((v) => { + const meta = v.meta ?? {} + const { oneShowingChild, onlyOneChild } = hasOneShowingChild(v.children, v) + const fullPath = isUrl(v.path) ? v.path : pathResolve(parentPath, v.path) // getAllParentPath(allRouters, v.path).join('/') + + if ( + oneShowingChild && + (!onlyOneChild?.children || onlyOneChild?.noShowingChildren) && + !meta?.alwaysShow + ) { + return ( + + {{ + default: () => renderMenuTitle(onlyOneChild ? onlyOneChild?.meta : meta) + }} + + ) + } else { + return ( + + {{ + title: () => renderMenuTitle(meta), + default: () => renderMenuItem(v.children!, fullPath) + }} + + ) + } + }) + } + + return { + renderMenuItem + } + } diff --git a/src/components/Menu/src/components/useRenderMenuTitle.tsx b/src/components/Menu/src/components/useRenderMenuTitle.tsx new file mode 100644 index 0000000..8941d9d --- /dev/null +++ b/src/components/Menu/src/components/useRenderMenuTitle.tsx @@ -0,0 +1,27 @@ +import type { RouteMeta } from 'vue-router' +import { Icon } from '@/components/Icon' +import { useI18n } from '@/hooks/web/useI18n' + +export const useRenderMenuTitle = () => { + const renderMenuTitle = (meta: RouteMeta) => { + const { t } = useI18n() + const { title = 'Please set title', icon } = meta + + return icon ? ( + <> + + + {t(title as string)} + + + ) : ( + + {t(title as string)} + + ) + } + + return { + renderMenuTitle + } +} diff --git a/src/components/Menu/src/helper.ts b/src/components/Menu/src/helper.ts new file mode 100644 index 0000000..003cf10 --- /dev/null +++ b/src/components/Menu/src/helper.ts @@ -0,0 +1,54 @@ +import { ref, unref } from 'vue' +import { findPath } from '@/utils/tree' + +type OnlyOneChildType = AppRouteRecordRaw & { noShowingChildren?: boolean } + +interface HasOneShowingChild { + oneShowingChild?: boolean + onlyOneChild?: OnlyOneChildType +} + +export const getAllParentPath = (treeData: T[], path: string) => { + const menuList = findPath(treeData, (n) => n.path === path) as AppRouteRecordRaw[] + return (menuList || []).map((item) => item.path) +} + +export const hasOneShowingChild = ( + children: AppRouteRecordRaw[] = [], + parent: AppRouteRecordRaw +): HasOneShowingChild => { + const onlyOneChild = ref() + + const showingChildren = children.filter((v) => { + const meta = v.meta ?? {} + if (meta.hidden) { + return false + } else { + // Temp set(will be used if only has one showing child) + onlyOneChild.value = v + return true + } + }) + + // When there is only one child router, the child router is displayed by default + if (showingChildren.length === 1) { + return { + oneShowingChild: true, + onlyOneChild: unref(onlyOneChild) + } + } + + // Show parent if there are no child router to display + if (!showingChildren.length) { + onlyOneChild.value = { ...parent, path: '', noShowingChildren: true } + return { + oneShowingChild: true, + onlyOneChild: unref(onlyOneChild) + } + } + + return { + oneShowingChild: false, + onlyOneChild: unref(onlyOneChild) + } +} diff --git a/src/components/Permission/index.ts b/src/components/Permission/index.ts new file mode 100644 index 0000000..250ae75 --- /dev/null +++ b/src/components/Permission/index.ts @@ -0,0 +1,4 @@ +import Permission from './src/Permission.vue' +import { hasPermi } from './src/utils' + +export { Permission, hasPermi } diff --git a/src/components/Permission/src/Permission.vue b/src/components/Permission/src/Permission.vue new file mode 100644 index 0000000..8581a9d --- /dev/null +++ b/src/components/Permission/src/Permission.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/components/Permission/src/utils.ts b/src/components/Permission/src/utils.ts new file mode 100644 index 0000000..4c0a9b5 --- /dev/null +++ b/src/components/Permission/src/utils.ts @@ -0,0 +1,14 @@ +import { useI18n } from '@/hooks/web/useI18n' +import router from '@/router' + +export const hasPermi = (value: string) => { + const { t } = useI18n() + const permission = (router.currentRoute.value.meta.permission || []) as string[] + if (!value) { + throw new Error(t('permission.hasPermission')) + } + if (permission.includes(value)) { + return true + } + return false +} diff --git a/src/components/Qrcode/index.ts b/src/components/Qrcode/index.ts new file mode 100644 index 0000000..263f039 --- /dev/null +++ b/src/components/Qrcode/index.ts @@ -0,0 +1,5 @@ +import Qrcode from './src/Qrcode.vue' + +export type { QrcodeLogo } from './src/types' + +export { Qrcode } diff --git a/src/components/Qrcode/src/Qrcode.vue b/src/components/Qrcode/src/Qrcode.vue new file mode 100644 index 0000000..3b3cc1c --- /dev/null +++ b/src/components/Qrcode/src/Qrcode.vue @@ -0,0 +1,252 @@ + + + + + diff --git a/src/components/Qrcode/src/types/index.ts b/src/components/Qrcode/src/types/index.ts new file mode 100644 index 0000000..86cdf0b --- /dev/null +++ b/src/components/Qrcode/src/types/index.ts @@ -0,0 +1,9 @@ +export interface QrcodeLogo { + src?: string + logoSize?: number + bgColor?: string + borderSize?: number + crossOrigin?: string + borderRadius?: number + logoRadius?: number +} diff --git a/src/components/Screenfull/index.ts b/src/components/Screenfull/index.ts new file mode 100644 index 0000000..faec2d8 --- /dev/null +++ b/src/components/Screenfull/index.ts @@ -0,0 +1,3 @@ +import Screenfull from './src/Screenfull.vue' + +export { Screenfull } diff --git a/src/components/Screenfull/src/Screenfull.vue b/src/components/Screenfull/src/Screenfull.vue new file mode 100644 index 0000000..048df9a --- /dev/null +++ b/src/components/Screenfull/src/Screenfull.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/components/Search/index.ts b/src/components/Search/index.ts new file mode 100644 index 0000000..696ad84 --- /dev/null +++ b/src/components/Search/index.ts @@ -0,0 +1,15 @@ +import { FormSchema, FormSetProps } from '../Form' +import Search from './src/Search.vue' + +export type { SearchProps } from './src/types' + +export interface SearchExpose { + setValues: (data: Recordable) => void + setProps: (props: Recordable) => void + delSchema: (field: string) => void + addSchema: (formSchema: FormSchema, index?: number) => void + setSchema: (schemaProps: FormSetProps[]) => void + getFormData: () => Promise +} + +export { Search } diff --git a/src/components/Search/src/Search.vue b/src/components/Search/src/Search.vue new file mode 100644 index 0000000..3e57ed6 --- /dev/null +++ b/src/components/Search/src/Search.vue @@ -0,0 +1,271 @@ + + + diff --git a/src/components/Search/src/components/ActionButton.vue b/src/components/Search/src/components/ActionButton.vue new file mode 100644 index 0000000..8de1838 --- /dev/null +++ b/src/components/Search/src/components/ActionButton.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/components/Search/src/types/index.ts b/src/components/Search/src/types/index.ts new file mode 100644 index 0000000..7a1901d --- /dev/null +++ b/src/components/Search/src/types/index.ts @@ -0,0 +1,16 @@ +import { FormSchema } from '@/components/Form' + +export interface SearchProps { + schema?: FormSchema[] + isCol?: boolean + labelWidth?: string | number + layout?: 'inline' | 'bottom' + buttonPosition?: 'left' | 'right' | 'center' + showSearch?: boolean + showReset?: boolean + showExpand?: boolean + expandField?: string + inline?: boolean + removeNoValueItem?: boolean + model?: Recordable +} diff --git a/src/components/Setting/index.ts b/src/components/Setting/index.ts new file mode 100644 index 0000000..b64c9ad --- /dev/null +++ b/src/components/Setting/index.ts @@ -0,0 +1,3 @@ +import Setting from './src/Setting.vue' + +export { Setting } diff --git a/src/components/Setting/src/Setting.vue b/src/components/Setting/src/Setting.vue new file mode 100644 index 0000000..ecbe72d --- /dev/null +++ b/src/components/Setting/src/Setting.vue @@ -0,0 +1,251 @@ + + + + + diff --git a/src/components/Setting/src/components/ColorRadioPicker.vue b/src/components/Setting/src/components/ColorRadioPicker.vue new file mode 100644 index 0000000..9774176 --- /dev/null +++ b/src/components/Setting/src/components/ColorRadioPicker.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/src/components/Setting/src/components/InterfaceDisplay.vue b/src/components/Setting/src/components/InterfaceDisplay.vue new file mode 100644 index 0000000..466dc65 --- /dev/null +++ b/src/components/Setting/src/components/InterfaceDisplay.vue @@ -0,0 +1,227 @@ + + + diff --git a/src/components/Setting/src/components/LayoutRadioPicker.vue b/src/components/Setting/src/components/LayoutRadioPicker.vue new file mode 100644 index 0000000..2b6d4b5 --- /dev/null +++ b/src/components/Setting/src/components/LayoutRadioPicker.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/src/components/SizeDropdown/index.ts b/src/components/SizeDropdown/index.ts new file mode 100644 index 0000000..516488d --- /dev/null +++ b/src/components/SizeDropdown/index.ts @@ -0,0 +1,3 @@ +import SizeDropdown from './src/SizeDropdown.vue' + +export { SizeDropdown } diff --git a/src/components/SizeDropdown/src/SizeDropdown.vue b/src/components/SizeDropdown/src/SizeDropdown.vue new file mode 100644 index 0000000..eb55917 --- /dev/null +++ b/src/components/SizeDropdown/src/SizeDropdown.vue @@ -0,0 +1,39 @@ + + + diff --git a/src/components/TabMenu/index.ts b/src/components/TabMenu/index.ts new file mode 100644 index 0000000..b5fd71c --- /dev/null +++ b/src/components/TabMenu/index.ts @@ -0,0 +1,3 @@ +import TabMenu from './src/TabMenu.vue' + +export { TabMenu } diff --git a/src/components/TabMenu/src/TabMenu.vue b/src/components/TabMenu/src/TabMenu.vue new file mode 100644 index 0000000..e6cf366 --- /dev/null +++ b/src/components/TabMenu/src/TabMenu.vue @@ -0,0 +1,251 @@ + + + diff --git a/src/components/TabMenu/src/helper.ts b/src/components/TabMenu/src/helper.ts new file mode 100644 index 0000000..cb4696e --- /dev/null +++ b/src/components/TabMenu/src/helper.ts @@ -0,0 +1,51 @@ +import { getAllParentPath } from '@/components/Menu/src/helper' +import { isUrl } from '@/utils/is' +import { cloneDeep } from 'lodash-es' +import { reactive } from 'vue' + +export type TabMapTypes = { + [key: string]: string[] +} + +export const tabPathMap = reactive({}) + +export const initTabMap = (routes: AppRouteRecordRaw[]) => { + for (const v of routes) { + const meta = v.meta ?? {} + if (!meta?.hidden) { + tabPathMap[v.path] = [] + } + } +} + +export const filterMenusPath = ( + routes: AppRouteRecordRaw[], + allRoutes: AppRouteRecordRaw[] +): AppRouteRecordRaw[] => { + const res: AppRouteRecordRaw[] = [] + for (const v of routes) { + let data: Nullable = null + const meta = v.meta ?? {} + if (!meta.hidden || meta.canTo) { + const allParentPath = getAllParentPath(allRoutes, v.path) + + const fullPath = isUrl(v.path) ? v.path : allParentPath.join('/') + + data = cloneDeep(v) + data.path = fullPath + if (v.children && data) { + data.children = filterMenusPath(v.children, allRoutes) + } + + if (data) { + res.push(data) + } + + if (allParentPath.length && Reflect.has(tabPathMap, allParentPath[0])) { + tabPathMap[allParentPath[0]].push(fullPath) + } + } + } + + return res +} diff --git a/src/components/Table/index.ts b/src/components/Table/index.ts new file mode 100644 index 0000000..472ae5d --- /dev/null +++ b/src/components/Table/index.ts @@ -0,0 +1,21 @@ +import Table from './src/Table.vue' +import { ElTable } from 'element-plus' +import { TableColumn, TableSetProps } from './src/types' + +export type { + TableColumn, + TableSlotDefault, + Pagination, + TableSetProps, + TableProps +} from './src/types' + +export interface TableExpose { + setProps: (props: Recordable) => void + setColumn: (columnProps: TableSetProps[]) => void + addColumn: (column: TableColumn, index?: number) => void + delColumn: (field: string) => void + elTableRef: ComponentRef +} + +export { Table } diff --git a/src/components/Table/src/Table.vue b/src/components/Table/src/Table.vue new file mode 100644 index 0000000..9d496f0 --- /dev/null +++ b/src/components/Table/src/Table.vue @@ -0,0 +1,587 @@ + diff --git a/src/components/Table/src/components/ColumnSetting.vue b/src/components/Table/src/components/ColumnSetting.vue new file mode 100644 index 0000000..f0c3825 --- /dev/null +++ b/src/components/Table/src/components/ColumnSetting.vue @@ -0,0 +1,166 @@ + + + diff --git a/src/components/Table/src/components/TableActions.vue b/src/components/Table/src/components/TableActions.vue new file mode 100644 index 0000000..05336bb --- /dev/null +++ b/src/components/Table/src/components/TableActions.vue @@ -0,0 +1,105 @@ + diff --git a/src/components/Table/src/helper/index.ts b/src/components/Table/src/helper/index.ts new file mode 100644 index 0000000..d8b34a8 --- /dev/null +++ b/src/components/Table/src/helper/index.ts @@ -0,0 +1,8 @@ +export const setIndex = (reserveIndex: boolean, index: number, size: number, current: number) => { + const newIndex = index + 1 + if (reserveIndex) { + return size * (current - 1) + newIndex + } else { + return newIndex + } +} diff --git a/src/components/Table/src/types/index.ts b/src/components/Table/src/types/index.ts new file mode 100644 index 0000000..21200a7 --- /dev/null +++ b/src/components/Table/src/types/index.ts @@ -0,0 +1,98 @@ +import { TableProps as ElTableProps } from 'element-plus' +export interface TableColumn { + field: string + label?: string + type?: string + /** + * 是否隐藏 + */ + hidden?: boolean + children?: TableColumn[] + slots?: { + default?: (...args: any[]) => JSX.Element | JSX.Element[] | null + header?: (...args: any[]) => JSX.Element | null + } + index?: number | ((index: number) => number) + columnKey?: string + width?: string | number + minWidth?: string | number + fixed?: boolean | 'left' | 'right' + renderHeader?: (...args: any[]) => JSX.Element | null + // sortable?: boolean + sortMethod?: (...args: any[]) => number + sortBy?: string | string[] | ((...args: any[]) => string | string[]) + sortOrders?: (string | null)[] + resizable?: boolean + formatter?: (...args: any[]) => any + showOverflowTooltip?: boolean + align?: 'left' | 'center' | 'right' + headerAlign?: 'left' | 'center' | 'right' + className?: string + labelClassName?: string + selectable?: (...args: any[]) => boolean + reserveSelection?: boolean + filters?: Array<{ text: string; value: string }> + filterPlacement?: string + filterMultiple?: boolean + filterMethod?: (...args: any[]) => boolean + filteredValue?: string[] + [key: string]: any +} + +export interface TableSlotDefault { + row: Recordable + column: TableColumn + $index: number + [key: string]: any +} + +export interface Pagination { + small?: boolean + background?: boolean + pageSize?: number + defaultPageSize?: number + total?: number + pageCount?: number + pagerCount?: number + currentPage?: number + defaultCurrentPage?: number + layout?: string + pageSizes?: number[] + popperClass?: string + prevText?: string + nextText?: string + disabled?: boolean + hideOnSinglePage?: boolean +} + +export interface TableSetProps { + field: string + path: string + value: any +} + +export interface TableProps extends Omit>, 'data'> { + pageSize?: number + currentPage?: number + showAction?: boolean + // 是否所有的超出隐藏,优先级低于schema中的showOverflowTooltip, + showOverflowTooltip?: boolean + // 表头 + columns?: TableColumn[] + // 是否展示分页 + pagination?: Pagination | undefined + // 仅对 type=selection 的列有效,类型为 Boolean,为 true 则会在数据更新之后保留之前选中的数据(需指定 row-key) + reserveSelection?: boolean + // 加载状态 + loading?: boolean + // 是否叠加索引 + reserveIndex?: boolean + // 对齐方式 + align?: 'left' | 'center' | 'right' + // 表头对齐方式 + headerAlign?: 'left' | 'center' | 'right' + imagePreview?: string[] + videoPreview?: string[] + sortable?: boolean + data?: Recordable +} diff --git a/src/components/TagsView/index.ts b/src/components/TagsView/index.ts new file mode 100644 index 0000000..30e604a --- /dev/null +++ b/src/components/TagsView/index.ts @@ -0,0 +1,3 @@ +import TagsView from './src/TagsView.vue' + +export { TagsView } diff --git a/src/components/TagsView/src/TagsView.vue b/src/components/TagsView/src/TagsView.vue new file mode 100644 index 0000000..da3336b --- /dev/null +++ b/src/components/TagsView/src/TagsView.vue @@ -0,0 +1,590 @@ + + + + + diff --git a/src/components/TagsView/src/helper.ts b/src/components/TagsView/src/helper.ts new file mode 100644 index 0000000..912eb8e --- /dev/null +++ b/src/components/TagsView/src/helper.ts @@ -0,0 +1,21 @@ +import type { RouteLocationNormalizedLoaded } from 'vue-router' +import { pathResolve } from '@/utils/routerHelper' + +export const filterAffixTags = (routes: AppRouteRecordRaw[], parentPath = '') => { + let tags: RouteLocationNormalizedLoaded[] = [] + routes.forEach((route) => { + const meta = route.meta ?? {} + const tagPath = pathResolve(parentPath, route.path) + if (meta?.affix) { + tags.push({ ...route, path: tagPath, fullPath: tagPath } as RouteLocationNormalizedLoaded) + } + if (route.children) { + const tempTags: RouteLocationNormalizedLoaded[] = filterAffixTags(route.children, tagPath) + if (tempTags.length >= 1) { + tags = [...tags, ...tempTags] + } + } + }) + + return tags +} diff --git a/src/components/ThemeSwitch/index.ts b/src/components/ThemeSwitch/index.ts new file mode 100644 index 0000000..823a276 --- /dev/null +++ b/src/components/ThemeSwitch/index.ts @@ -0,0 +1,3 @@ +import ThemeSwitch from './src/ThemeSwitch.vue' + +export { ThemeSwitch } diff --git a/src/components/ThemeSwitch/src/ThemeSwitch.vue b/src/components/ThemeSwitch/src/ThemeSwitch.vue new file mode 100644 index 0000000..94b02c6 --- /dev/null +++ b/src/components/ThemeSwitch/src/ThemeSwitch.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/components/Tree/index.ts b/src/components/Tree/index.ts new file mode 100644 index 0000000..bee5f92 --- /dev/null +++ b/src/components/Tree/index.ts @@ -0,0 +1,3 @@ +import Tree from './src/Tree.vue' + +export { Tree } diff --git a/src/components/Tree/src/Tree.vue b/src/components/Tree/src/Tree.vue new file mode 100644 index 0000000..66597d1 --- /dev/null +++ b/src/components/Tree/src/Tree.vue @@ -0,0 +1,147 @@ + + + diff --git a/src/components/UserInfo/index.ts b/src/components/UserInfo/index.ts new file mode 100644 index 0000000..c3a34ab --- /dev/null +++ b/src/components/UserInfo/index.ts @@ -0,0 +1,3 @@ +import UserInfo from './src/UserInfo.vue' + +export { UserInfo } diff --git a/src/components/UserInfo/src/UserInfo.vue b/src/components/UserInfo/src/UserInfo.vue new file mode 100644 index 0000000..526b0a0 --- /dev/null +++ b/src/components/UserInfo/src/UserInfo.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/src/components/UserInfo/src/components/LockDialog.vue b/src/components/UserInfo/src/components/LockDialog.vue new file mode 100644 index 0000000..a8dc34f --- /dev/null +++ b/src/components/UserInfo/src/components/LockDialog.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/src/components/UserInfo/src/components/LockPage.vue b/src/components/UserInfo/src/components/LockPage.vue new file mode 100644 index 0000000..88d6998 --- /dev/null +++ b/src/components/UserInfo/src/components/LockPage.vue @@ -0,0 +1,281 @@ + + + + + diff --git a/src/components/VideoPlayer/index.ts b/src/components/VideoPlayer/index.ts new file mode 100644 index 0000000..247deca --- /dev/null +++ b/src/components/VideoPlayer/index.ts @@ -0,0 +1,27 @@ +import { VNode, createVNode, render } from 'vue' +import VideoPlayer from './src/VideoPlayer.vue' +import { isClient } from '@/utils/is' +import { VideoPlayerViewer } from '@/components/VideoPlayerViewer' +import { toAnyString } from '@/utils' + +export { VideoPlayer } + +let instance: Nullable = null + +export function createVideoViewer(options: { url: string; poster?: string; show?: boolean }) { + if (!isClient) return + const { url, poster } = options + + const propsData: Partial<{ url: string; poster?: string; show?: boolean; id?: string }> = {} + const container = document.createElement('div') + const id = toAnyString() + container.id = id + propsData.url = url + propsData.poster = poster + propsData.show = true + propsData.id = id + + document.body.appendChild(container) + instance = createVNode(VideoPlayerViewer, propsData) + render(instance, container) +} diff --git a/src/components/VideoPlayer/src/VideoPlayer.vue b/src/components/VideoPlayer/src/VideoPlayer.vue new file mode 100644 index 0000000..83c8d30 --- /dev/null +++ b/src/components/VideoPlayer/src/VideoPlayer.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/components/VideoPlayerViewer/index.ts b/src/components/VideoPlayerViewer/index.ts new file mode 100644 index 0000000..7f99155 --- /dev/null +++ b/src/components/VideoPlayerViewer/index.ts @@ -0,0 +1,3 @@ +import VideoPlayerViewer from './src/VideoPlayerViewer.vue' + +export { VideoPlayerViewer } diff --git a/src/components/VideoPlayerViewer/src/VideoPlayerViewer.vue b/src/components/VideoPlayerViewer/src/VideoPlayerViewer.vue new file mode 100644 index 0000000..56968df --- /dev/null +++ b/src/components/VideoPlayerViewer/src/VideoPlayerViewer.vue @@ -0,0 +1,49 @@ + + diff --git a/src/components/Waterfall/index.ts b/src/components/Waterfall/index.ts new file mode 100644 index 0000000..6fed67f --- /dev/null +++ b/src/components/Waterfall/index.ts @@ -0,0 +1,3 @@ +import Waterfall from './src/Waterfall.vue' + +export { Waterfall } diff --git a/src/components/Waterfall/src/Waterfall.vue b/src/components/Waterfall/src/Waterfall.vue new file mode 100644 index 0000000..32a0aa7 --- /dev/null +++ b/src/components/Waterfall/src/Waterfall.vue @@ -0,0 +1,234 @@ + + + diff --git a/src/components/index.ts b/src/components/index.ts new file mode 100644 index 0000000..9a179ea --- /dev/null +++ b/src/components/index.ts @@ -0,0 +1,10 @@ +import type { App } from 'vue' +import { Icon } from './Icon' +import { Permission } from './Permission' +import { BaseButton } from './Button' + +export const setupGlobCom = (app: App): void => { + app.component('Icon', Icon) + app.component('Permission', Permission) + app.component('BaseButton', BaseButton) +} diff --git a/src/constants/index.ts b/src/constants/index.ts new file mode 100644 index 0000000..cdf427e --- /dev/null +++ b/src/constants/index.ts @@ -0,0 +1,39 @@ +/** + * 请求成功状态码 + */ +export const SUCCESS_CODE = 0 + +/** + * 请求contentType + */ +export const CONTENT_TYPE: AxiosContentType = 'application/json' + +/** + * 请求超时时间 + */ +export const REQUEST_TIMEOUT = 60000 + +/** + * 不重定向白名单 + */ +export const NO_REDIRECT_WHITE_LIST = ['/login'] + +/** + * 不重置路由白名单 + */ +export const NO_RESET_WHITE_LIST = ['Redirect', 'RedirectWrap', 'Login', 'NoFind', 'Root'] + +/** + * 表格默认过滤列设置字段 + */ +export const DEFAULT_FILTER_COLUMN = ['expand', 'selection'] + +/** + * 是否根据headers->content-type自动转换数据格式 + */ +export const TRANSFORM_REQUEST_DATA = true + +/** + * 全局图标前缀 + */ +export const ICON_PREFIX = 'vi-' diff --git a/src/directives/index.ts b/src/directives/index.ts new file mode 100644 index 0000000..11b1da8 --- /dev/null +++ b/src/directives/index.ts @@ -0,0 +1,10 @@ +import type { App } from 'vue' +import { setupPermissionDirective } from './permission/hasPermi' + +/** + * 导出指令:v-xxx + * @methods hasPermi 按钮权限,用法: v-hasPermi + */ +export const setupPermission = (app: App) => { + setupPermissionDirective(app) +} diff --git a/src/directives/permission/hasPermi.ts b/src/directives/permission/hasPermi.ts new file mode 100644 index 0000000..0a74d94 --- /dev/null +++ b/src/directives/permission/hasPermi.ts @@ -0,0 +1,37 @@ +import type { App, Directive, DirectiveBinding } from 'vue' +import { useI18n } from '@/hooks/web/useI18n' +import router from '@/router' + +const { t } = useI18n() + +const hasPermission = (value: string): boolean => { + const permission = (router.currentRoute.value.meta.permission || []) as string[] + if (!value) { + throw new Error(t('permission.hasPermission')) + } + if (permission.includes(value)) { + return true + } + return false +} +function hasPermi(el: Element, binding: DirectiveBinding) { + const value = binding.value + + const flag = hasPermission(value) + if (!flag) { + el.parentNode?.removeChild(el) + } +} +const mounted = (el: Element, binding: DirectiveBinding) => { + hasPermi(el, binding) +} + +const permiDirective: Directive = { + mounted +} + +export const setupPermissionDirective = (app: App) => { + app.directive('hasPermi', permiDirective) +} + +export default permiDirective diff --git a/src/hooks/event/useEventBus.ts b/src/hooks/event/useEventBus.ts new file mode 100644 index 0000000..d9ee832 --- /dev/null +++ b/src/hooks/event/useEventBus.ts @@ -0,0 +1,26 @@ +import mitt from 'mitt' +import { onBeforeUnmount } from 'vue' + +interface Option { + name: string // 事件名称 + callback: Fn // 回调 +} + +const emitter = mitt() + +export const useEventBus = (option?: Option) => { + if (option) { + emitter.on(option.name, option.callback) + + onBeforeUnmount(() => { + emitter.off(option.name) + }) + } + + return { + on: emitter.on, + off: emitter.off, + emit: emitter.emit, + all: emitter.all + } +} diff --git a/src/hooks/event/useScrollTo.ts b/src/hooks/event/useScrollTo.ts new file mode 100644 index 0000000..74fd673 --- /dev/null +++ b/src/hooks/event/useScrollTo.ts @@ -0,0 +1,62 @@ +import { ref, unref } from 'vue' + +export interface ScrollToParams { + el: HTMLElement + to: number + position: string + duration?: number + callback?: () => void +} + +const easeInOutQuad = (t: number, b: number, c: number, d: number) => { + t /= d / 2 + if (t < 1) { + return (c / 2) * t * t + b + } + t-- + return (-c / 2) * (t * (t - 2) - 1) + b +} +const move = (el: HTMLElement, position: string, amount: number) => { + el[position] = amount +} + +export function useScrollTo({ + el, + position = 'scrollLeft', + to, + duration = 500, + callback +}: ScrollToParams) { + const isActiveRef = ref(false) + const start = el[position] + const change = to - start + const increment = 20 + let currentTime = 0 + + function animateScroll() { + if (!unref(isActiveRef)) { + return + } + currentTime += increment + const val = easeInOutQuad(currentTime, start, change, duration) + move(el, position, val) + if (currentTime < duration && unref(isActiveRef)) { + requestAnimationFrame(animateScroll) + } else { + if (callback) { + callback() + } + } + } + + function run() { + isActiveRef.value = true + animateScroll() + } + + function stop() { + isActiveRef.value = false + } + + return { start: run, stop } +} diff --git a/src/hooks/web/useClipboard.ts b/src/hooks/web/useClipboard.ts new file mode 100644 index 0000000..fb8c3d6 --- /dev/null +++ b/src/hooks/web/useClipboard.ts @@ -0,0 +1,47 @@ +import { ref } from 'vue' + +const useClipboard = () => { + const copied = ref(false) + const text = ref('') + const isSupported = ref(false) + + if (!navigator.clipboard && !document.execCommand) { + isSupported.value = false + } else { + isSupported.value = true + } + + const copy = (str: string) => { + if (navigator.clipboard) { + navigator.clipboard.writeText(str).then(() => { + text.value = str + copied.value = true + resetCopied() + }) + return + } + const input = document.createElement('input') + input.setAttribute('readonly', 'readonly') + input.setAttribute('value', str) + document.body.appendChild(input) + input.select() + input.setSelectionRange(0, 9999) + if (document.execCommand('copy')) { + text.value = str + document.execCommand('copy') + copied.value = true + resetCopied() + } + document.body.removeChild(input) + } + + const resetCopied = () => { + setTimeout(() => { + copied.value = false + }, 1500) + } + + return { copy, text, copied, isSupported } +} + +export { useClipboard } diff --git a/src/hooks/web/useConfigGlobal.ts b/src/hooks/web/useConfigGlobal.ts new file mode 100644 index 0000000..d1e490b --- /dev/null +++ b/src/hooks/web/useConfigGlobal.ts @@ -0,0 +1,10 @@ +import { ConfigGlobalTypes } from '@/components/ConfigGlobal' +import { inject } from 'vue' + +export const useConfigGlobal = () => { + const configGlobal = inject('configGlobal', {}) as ConfigGlobalTypes + + return { + configGlobal + } +} diff --git a/src/hooks/web/useCrudSchemas.ts b/src/hooks/web/useCrudSchemas.ts new file mode 100644 index 0000000..5e61d65 --- /dev/null +++ b/src/hooks/web/useCrudSchemas.ts @@ -0,0 +1,163 @@ +import { reactive } from 'vue' +import { eachTree, treeMap, filter } from '@/utils/tree' +import { FormSchema } from '@/components/Form' +import { TableColumn } from '@/components/Table' +import { DescriptionsSchema } from '@/components/Descriptions' + +export type CrudSchema = Omit & { + search?: CrudSearchParams + table?: CrudTableParams + form?: CrudFormParams + detail?: CrudDescriptionsParams + children?: CrudSchema[] +} + +interface CrudSearchParams extends Omit { + // 是否隐藏在查询项 + hidden?: boolean +} + +interface CrudTableParams extends Omit { + // 是否隐藏表头 + hidden?: boolean +} + +interface CrudFormParams extends Omit { + // 是否隐藏表单项 + hidden?: boolean +} + +interface CrudDescriptionsParams extends Omit { + // 是否隐藏表单项 + hidden?: boolean +} + +interface AllSchemas { + searchSchema: FormSchema[] + tableColumns: TableColumn[] + formSchema: FormSchema[] + detailSchema: DescriptionsSchema[] +} + +/** + * @deprecated 不推荐使用,感觉过于繁琐,不是很灵活 可能会在某个版本中删除 + */ +export const useCrudSchemas = ( + crudSchema: CrudSchema[] +): { + allSchemas: AllSchemas +} => { + // 所有结构数据 + const allSchemas = reactive({ + searchSchema: [], + tableColumns: [], + formSchema: [], + detailSchema: [] + }) + + const searchSchema = filterSearchSchema(crudSchema) + // @ts-ignore + allSchemas.searchSchema = searchSchema || [] + + const tableColumns = filterTableSchema(crudSchema) + allSchemas.tableColumns = tableColumns || [] + + const formSchema = filterFormSchema(crudSchema) + allSchemas.formSchema = formSchema + + const detailSchema = filterDescriptionsSchema(crudSchema) + allSchemas.detailSchema = detailSchema + + return { + allSchemas + } +} + +// 过滤 Search 结构 +const filterSearchSchema = (crudSchema: CrudSchema[]): FormSchema[] => { + const searchSchema: FormSchema[] = [] + const length = crudSchema.length + + for (let i = 0; i < length; i++) { + const schemaItem = crudSchema[i] + if (schemaItem.search?.hidden === true) { + continue + } + // 判断是否隐藏 + const searchSchemaItem = { + component: schemaItem?.search?.component || 'Input', + ...schemaItem.search, + field: schemaItem.field, + label: schemaItem.search?.label || schemaItem.label + } + + searchSchema.push(searchSchemaItem) + } + + return searchSchema +} + +// 过滤 table 结构 +const filterTableSchema = (crudSchema: CrudSchema[]): TableColumn[] => { + const tableColumns = treeMap(crudSchema, { + conversion: (schema: CrudSchema) => { + if (!schema?.table?.hidden) { + return { + ...schema, + ...schema.table + } + } + } + }) + + // 第一次过滤会有 undefined 所以需要二次过滤 + return filter(tableColumns as TableColumn[], (data) => { + if (data.children === void 0) { + delete data.children + } + return !!data.field + }) +} + +// 过滤 form 结构 +const filterFormSchema = (crudSchema: CrudSchema[]): FormSchema[] => { + const formSchema: FormSchema[] = [] + const length = crudSchema.length + + for (let i = 0; i < length; i++) { + const formItem = crudSchema[i] + const formSchemaItem = { + component: formItem?.form?.component || 'Input', + ...formItem.form, + field: formItem.field, + label: formItem.form?.label || formItem.label + } + + formSchema.push(formSchemaItem) + } + + return formSchema +} + +// 过滤 descriptions 结构 +const filterDescriptionsSchema = (crudSchema: CrudSchema[]): DescriptionsSchema[] => { + const descriptionsSchema: FormSchema[] = [] + + eachTree(crudSchema, (schemaItem: CrudSchema) => { + // 判断是否隐藏 + if (!schemaItem?.detail?.hidden) { + const descriptionsSchemaItem = { + ...schemaItem.detail, + field: schemaItem.field, + label: schemaItem.detail?.label || schemaItem.label + } + + // 删除不必要的字段 + delete descriptionsSchemaItem.hidden + + descriptionsSchema.push(descriptionsSchemaItem) + } + }) + + return descriptionsSchema +} diff --git a/src/hooks/web/useDesign.ts b/src/hooks/web/useDesign.ts new file mode 100644 index 0000000..1ec349f --- /dev/null +++ b/src/hooks/web/useDesign.ts @@ -0,0 +1,18 @@ +import variables from '@/styles/variables.module.less' + +export const useDesign = () => { + const lessVariables = variables + + /** + * @param scope 类名 + * @returns 返回空间名-类名 + */ + const getPrefixCls = (scope: string) => { + return `${lessVariables.namespace}-${scope}` + } + + return { + variables: lessVariables, + getPrefixCls + } +} diff --git a/src/hooks/web/useForm.ts b/src/hooks/web/useForm.ts new file mode 100644 index 0000000..cdf5eac --- /dev/null +++ b/src/hooks/web/useForm.ts @@ -0,0 +1,149 @@ +import type { Form, FormExpose } from '@/components/Form' +import type { ElForm, ElFormItem } from 'element-plus' +import { ref, unref, nextTick } from 'vue' +import { FormSchema, FormSetProps, FormProps } from '@/components/Form' +import { isEmptyVal, isObject } from '@/utils/is' + +export const useForm = () => { + // From实例 + const formRef = ref() + + // ElForm实例 + const elFormRef = ref>() + + /** + * @param ref Form实例 + * @param elRef ElForm实例 + */ + const register = (ref: typeof Form & FormExpose, elRef: ComponentRef) => { + formRef.value = ref + elFormRef.value = elRef + } + + const getForm = async () => { + await nextTick() + const form = unref(formRef) + if (!form) { + console.error('The form is not registered. Please use the register method to register') + } + return form + } + + // 一些内置的方法 + const methods = { + /** + * @description 设置form组件的props + * @param props form组件的props + */ + setProps: async (props: FormProps = {}) => { + const form = await getForm() + form?.setProps(props) + if (props.model) { + form?.setValues(props.model) + } + }, + + /** + * @description 设置form的值 + * @param data 需要设置的数据 + */ + setValues: async (data: Recordable) => { + const form = await getForm() + form?.setValues(data) + }, + + /** + * @description 设置schema + * @param schemaProps 需要设置的schemaProps + */ + setSchema: async (schemaProps: FormSetProps[]) => { + const form = await getForm() + form?.setSchema(schemaProps) + }, + + /** + * @description 新增schema + * @param formSchema 需要新增数据 + * @param index 在哪里新增 + */ + addSchema: async (formSchema: FormSchema, index?: number) => { + const form = await getForm() + form?.addSchema(formSchema, index) + }, + + /** + * @description 删除schema + * @param field 删除哪个数据 + */ + delSchema: async (field: string) => { + const form = await getForm() + form?.delSchema(field) + }, + + /** + * @description 获取表单数据 + * @returns form data + */ + getFormData: async (filterEmptyVal = true): Promise => { + const form = await getForm() + const model = form?.formModel as any + if (filterEmptyVal) { + // 使用reduce过滤空值,并返回一个新对象 + return Object.keys(model).reduce((prev, next) => { + const value = model[next] + if (!isEmptyVal(value)) { + if (isObject(value)) { + if (Object.keys(value).length > 0) { + prev[next] = value + } + } else { + prev[next] = value + } + } + return prev + }, {}) as T + } else { + return model as T + } + }, + + /** + * @description 获取表单组件的实例 + * @param field 表单项唯一标识 + * @returns component instance + */ + getComponentExpose: async (field: string) => { + const form = await getForm() + return form?.getComponentExpose(field) + }, + + /** + * @description 获取formItem组件的实例 + * @param field 表单项唯一标识 + * @returns formItem instance + */ + getFormItemExpose: async (field: string) => { + const form = await getForm() + return form?.getFormItemExpose(field) as ComponentRef + }, + + /** + * @description 获取ElForm组件的实例 + * @returns ElForm instance + */ + getElFormExpose: async () => { + await getForm() + return unref(elFormRef) + }, + + getFormExpose: async () => { + await getForm() + return unref(formRef) + } + } + + return { + formRegister: register, + formMethods: methods + } +} diff --git a/src/hooks/web/useGuide.ts b/src/hooks/web/useGuide.ts new file mode 100644 index 0000000..7fd2fb0 --- /dev/null +++ b/src/hooks/web/useGuide.ts @@ -0,0 +1,49 @@ +import { Config, driver } from 'driver.js' +import 'driver.js/dist/driver.css' +import { useDesign } from '@/hooks/web/useDesign' +import { useI18n } from '@/hooks/web/useI18n' + +const { t } = useI18n() + +const { variables } = useDesign() + +export const useGuide = (options?: Config) => { + const driverObj = driver( + options || { + showProgress: true, + nextBtnText: t('common.nextLabel'), + prevBtnText: t('common.prevLabel'), + doneBtnText: t('common.doneLabel'), + steps: [ + { + element: `#${variables.namespace}-menu`, + popover: { + title: t('common.menu'), + description: t('common.menuDes'), + side: 'right' + } + }, + { + element: `#${variables.namespace}-tool-header`, + popover: { + title: t('common.tool'), + description: t('common.toolDes'), + side: 'left' + } + }, + { + element: `#${variables.namespace}-tags-view`, + popover: { + title: t('common.tagsView'), + description: t('common.tagsViewDes'), + side: 'bottom' + } + } + ] + } + ) + + return { + ...driverObj + } +} diff --git a/src/hooks/web/useI18n.ts b/src/hooks/web/useI18n.ts new file mode 100644 index 0000000..f1e0e7b --- /dev/null +++ b/src/hooks/web/useI18n.ts @@ -0,0 +1,52 @@ +import { i18n } from '@/plugins/vueI18n' + +type I18nGlobalTranslation = { + (key: string): string + (key: string, locale: string): string + (key: string, locale: string, list: unknown[]): string + (key: string, locale: string, named: Record): string + (key: string, list: unknown[]): string + (key: string, named: Record): string +} + +type I18nTranslationRestParameters = [string, any] + +const getKey = (namespace: string | undefined, key: string) => { + if (!namespace) { + return key + } + if (key.startsWith(namespace)) { + return key + } + return `${namespace}.${key}` +} + +export const useI18n = ( + namespace?: string +): { + t: I18nGlobalTranslation +} => { + const normalFn = { + t: (key: string) => { + return getKey(namespace, key) + } + } + + if (!i18n) { + return normalFn + } + + const { t, ...methods } = i18n.global + + const tFn: I18nGlobalTranslation = (key: string, ...arg: any[]) => { + if (!key) return '' + if (!key.includes('.') && !namespace) return key + return (t as any)(getKey(namespace, key), ...(arg as I18nTranslationRestParameters)) + } + return { + ...methods, + t: tFn + } +} + +export const t = (key: string) => key diff --git a/src/hooks/web/useIcon.ts b/src/hooks/web/useIcon.ts new file mode 100644 index 0000000..b76bb29 --- /dev/null +++ b/src/hooks/web/useIcon.ts @@ -0,0 +1,7 @@ +import { h } from 'vue' +import type { VNode } from 'vue' +import { Icon, IconTypes } from '@/components/Icon' + +export const useIcon = (props: IconTypes): VNode => { + return h(Icon, props) +} diff --git a/src/hooks/web/useLocale.ts b/src/hooks/web/useLocale.ts new file mode 100644 index 0000000..c65070e --- /dev/null +++ b/src/hooks/web/useLocale.ts @@ -0,0 +1,35 @@ +import { i18n } from '@/plugins/vueI18n' +import { useLocaleStoreWithOut } from '@/store/modules/locale' +import { setHtmlPageLang } from '@/plugins/vueI18n/helper' + +const setI18nLanguage = (locale: LocaleType) => { + const localeStore = useLocaleStoreWithOut() + + if (i18n.mode === 'legacy') { + i18n.global.locale = locale + } else { + ;(i18n.global.locale as any).value = locale + } + localeStore.setCurrentLocale({ + lang: locale + }) + setHtmlPageLang(locale) +} + +export const useLocale = () => { + // Switching the language will change the locale of useI18n + // And submit to configuration modification + const changeLocale = async (locale: LocaleType) => { + const globalI18n = i18n.global + + const langModule = await import(`../../locales/${locale}.ts`) + + globalI18n.setLocaleMessage(locale, langModule.default) + + setI18nLanguage(locale) + } + + return { + changeLocale + } +} diff --git a/src/hooks/web/useMonacoEditor.ts b/src/hooks/web/useMonacoEditor.ts new file mode 100644 index 0000000..ab464ea --- /dev/null +++ b/src/hooks/web/useMonacoEditor.ts @@ -0,0 +1,129 @@ +import * as monaco from 'monaco-editor' +import { ref, nextTick, onBeforeUnmount } from 'vue' +import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker' +import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker' +import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker' +import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker' +import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker' + +self.MonacoEnvironment = { + getWorker(_, label) { + if (label === 'json') { + return new jsonWorker() + } + if (label === 'css' || label === 'scss' || label === 'less') { + return new cssWorker() + } + if (label === 'html' || label === 'handlebars' || label === 'razor') { + return new htmlWorker() + } + if (label === 'typescript' || label === 'javascript') { + return new tsWorker() + } + return new editorWorker() + } +} + +export function useMonacoEditor(language: string = 'javascript') { + // 编辑器示例 + let monacoEditor: monaco.editor.IStandaloneCodeEditor | null = null + // 目标元素 + const monacoEditorRef = ref() + + // 创建实例 + function createEditor(editorOption: monaco.editor.IStandaloneEditorConstructionOptions = {}) { + if (!monacoEditorRef.value) return + monacoEditor = monaco.editor.create(monacoEditorRef.value, { + // 初始模型 + model: monaco.editor.createModel('', language), + // 是否启用预览图 + minimap: { enabled: true }, + // 圆角 + roundedSelection: true, + // 主题 + theme: 'vs-dark', + // 主键 + multiCursorModifier: 'ctrlCmd', + // 滚动条 + scrollbar: { + verticalScrollbarSize: 8, + horizontalScrollbarSize: 8 + }, + // 行号 + lineNumbers: 'on', + // tab大小 + tabSize: 2, + //字体大小 + fontSize: 14, + // 控制编辑器在用户键入、粘贴、移动或缩进行时是否应自动调整缩进 + autoIndent: 'advanced', + // 自动布局 + automaticLayout: true, + ...editorOption + }) + return monacoEditor + } + + // 格式化 + async function formatDoc() { + await monacoEditor?.getAction('editor.action.formatDocument')?.run() + } + + // 数据更新 + function updateVal(val: string) { + nextTick(() => { + if (getOption(monaco.editor.EditorOption.readOnly)) { + updateOptions({ readOnly: false }) + } + monacoEditor?.setValue(val) + setTimeout(async () => { + await formatDoc() + }, 10) + }) + } + + // 配置更新 + function updateOptions(opt: monaco.editor.IStandaloneEditorConstructionOptions) { + monacoEditor?.updateOptions(opt) + } + + // 获取配置 + function getOption(name: monaco.editor.EditorOption) { + return monacoEditor?.getOption(name) + } + + // 获取实例 + function getEditor() { + return monacoEditor + } + + function changeLanguage(newLanguage: string) { + const model = monacoEditor?.getModel() + if (model) { + monaco.editor.setModelLanguage(model, newLanguage) + } + } + + function changeTheme(newTheme: string) { + monaco.editor.setTheme(newTheme) + } + + // 页面离开 销毁 + onBeforeUnmount(() => { + if (monacoEditor) { + monacoEditor.dispose() + } + }) + + return { + monacoEditorRef, + createEditor, + getEditor, + updateVal, + updateOptions, + getOption, + formatDoc, + changeLanguage, + changeTheme + } +} diff --git a/src/hooks/web/useNProgress.ts b/src/hooks/web/useNProgress.ts new file mode 100644 index 0000000..76859e5 --- /dev/null +++ b/src/hooks/web/useNProgress.ts @@ -0,0 +1,34 @@ +import { nextTick, unref } from 'vue' +import type { NProgressOptions } from 'nprogress' +import NProgress from 'nprogress' +import 'nprogress/nprogress.css' +import { useCssVar } from '@vueuse/core' + +const primaryColor = useCssVar('--el-color-primary', document.documentElement) + +export const useNProgress = () => { + NProgress.configure({ showSpinner: false } as NProgressOptions) + + const initColor = async () => { + await nextTick() + const bar = document.getElementById('nprogress')?.getElementsByClassName('bar')[0] as ElRef + if (bar) { + bar.style.background = unref(primaryColor.value) as string + } + } + + initColor() + + const start = () => { + NProgress.start() + } + + const done = () => { + NProgress.done() + } + + return { + start, + done + } +} diff --git a/src/hooks/web/useNetwork.ts b/src/hooks/web/useNetwork.ts new file mode 100644 index 0000000..66fa446 --- /dev/null +++ b/src/hooks/web/useNetwork.ts @@ -0,0 +1,21 @@ +import { ref, onBeforeUnmount } from 'vue' + +const useNetwork = () => { + const online = ref(true) + + const updateNetwork = () => { + online.value = navigator.onLine + } + + window.addEventListener('online', updateNetwork) + window.addEventListener('offline', updateNetwork) + + onBeforeUnmount(() => { + window.removeEventListener('online', updateNetwork) + window.removeEventListener('offline', updateNetwork) + }) + + return { online } +} + +export { useNetwork } diff --git a/src/hooks/web/useNow.ts b/src/hooks/web/useNow.ts new file mode 100644 index 0000000..09d3176 --- /dev/null +++ b/src/hooks/web/useNow.ts @@ -0,0 +1,60 @@ +import { dateUtil } from '@/utils/dateUtil' +import { reactive, toRefs } from 'vue' +import { tryOnMounted, tryOnUnmounted } from '@vueuse/core' + +export const useNow = (immediate = true) => { + let timer: IntervalHandle + + const state = reactive({ + year: 0, + month: 0, + week: '', + day: 0, + hour: '', + minute: '', + second: 0, + meridiem: '' + }) + + const update = () => { + const now = dateUtil() + + const h = now.format('HH') + const m = now.format('mm') + const s = now.get('s') + + state.year = now.get('y') + state.month = now.get('M') + 1 + state.week = '星期' + ['日', '一', '二', '三', '四', '五', '六'][now.day()] + state.day = now.get('date') + state.hour = h + state.minute = m + state.second = s + + state.meridiem = now.format('A') + } + + function start() { + update() + clearInterval(timer) + timer = setInterval(() => update(), 1000) + } + + function stop() { + clearInterval(timer) + } + + tryOnMounted(() => { + immediate && start() + }) + + tryOnUnmounted(() => { + stop() + }) + + return { + ...toRefs(state), + start, + stop + } +} diff --git a/src/hooks/web/usePageLoading.ts b/src/hooks/web/usePageLoading.ts new file mode 100644 index 0000000..995c941 --- /dev/null +++ b/src/hooks/web/usePageLoading.ts @@ -0,0 +1,20 @@ +import { useAppStoreWithOut } from '@/store/modules/app' + +export const usePageLoading = () => { + const loadStart = () => { + const appStore = useAppStoreWithOut() + + appStore.setPageLoading(true) + } + + const loadDone = () => { + const appStore = useAppStoreWithOut() + + appStore.setPageLoading(false) + } + + return { + loadStart, + loadDone + } +} diff --git a/src/hooks/web/useSearch.ts b/src/hooks/web/useSearch.ts new file mode 100644 index 0000000..788c49f --- /dev/null +++ b/src/hooks/web/useSearch.ts @@ -0,0 +1,91 @@ +import { ref, unref, nextTick } from 'vue' +import { FormSchema, FormSetProps } from '@/components/Form' +import { SearchExpose, SearchProps } from '@/components/Search' + +export const useSearch = () => { + // Search实例 + const searchRef = ref() + + /** + * @param ref Search实例 + * @param elRef ElForm实例 + */ + const register = (ref: SearchExpose) => { + searchRef.value = ref + } + + const getSearch = async () => { + await nextTick() + const search = unref(searchRef) + if (!search) { + console.error('The Search is not registered. Please use the register method to register') + } + return search + } + + // 一些内置的方法 + const methods = { + /** + * @description 设置search组件的props + * @param field FormItem的field + */ + setProps: async (props: SearchProps = {}) => { + const search = await getSearch() + search?.setProps(props) + if (props.model) { + search?.setValues(props.model) + } + }, + + /** + * @description 设置form的值 + * @param data 需要设置的数据 + */ + setValues: async (data: Recordable) => { + const search = await getSearch() + search?.setValues(data) + }, + + /** + * @description 设置schema + * @param schemaProps 需要设置的schemaProps + */ + setSchema: async (schemaProps: FormSetProps[]) => { + const search = await getSearch() + search?.setSchema(schemaProps) + }, + + /** + * @description 新增schema + * @param formSchema 需要新增数据 + * @param index 在哪里新增 + */ + addSchema: async (formSchema: FormSchema, index?: number) => { + const search = await getSearch() + search?.addSchema(formSchema, index) + }, + + /** + * @description 删除schema + * @param field 删除哪个数据 + */ + delSchema: async (field: string) => { + const search = await getSearch() + search?.delSchema(field) + }, + + /** + * @description 获取表单数据 + * @returns form data + */ + getFormData: async (): Promise => { + const search = await getSearch() + return search?.getFormData() as T + } + } + + return { + searchRegister: register, + searchMethods: methods + } +} diff --git a/src/hooks/web/useStorage.ts b/src/hooks/web/useStorage.ts new file mode 100644 index 0000000..e33a6a5 --- /dev/null +++ b/src/hooks/web/useStorage.ts @@ -0,0 +1,46 @@ +// 获取传入的值的类型 +const getValueType = (value: any) => { + const type = Object.prototype.toString.call(value) + return type.slice(8, -1) +} + +export const useStorage = (type: 'sessionStorage' | 'localStorage' = 'sessionStorage') => { + const setStorage = (key: string, value: any) => { + const valueType = getValueType(value) + window[type].setItem(key, JSON.stringify({ type: valueType, value })) + } + + const getStorage = (key: string) => { + const value = window[type].getItem(key) + if (value) { + const { value: val } = JSON.parse(value) + return val + } else { + return value + } + } + + const removeStorage = (key: string) => { + window[type].removeItem(key) + } + + const clear = (excludes?: string[]) => { + // 获取排除项 + const keys = Object.keys(window[type]) + const defaultExcludes = ['dynamicRouter', 'serverDynamicRouter'] + const excludesArr = excludes ? [...excludes, ...defaultExcludes] : defaultExcludes + const excludesKeys = excludesArr ? keys.filter((key) => !excludesArr.includes(key)) : keys + // 排除项不清除 + excludesKeys.forEach((key) => { + window[type].removeItem(key) + }) + // window[type].clear() + } + + return { + setStorage, + getStorage, + removeStorage, + clear + } +} diff --git a/src/hooks/web/useTable.ts b/src/hooks/web/useTable.ts new file mode 100644 index 0000000..d831f1c --- /dev/null +++ b/src/hooks/web/useTable.ts @@ -0,0 +1,195 @@ +import { useI18n } from '@/hooks/web/useI18n' +import { Table, TableExpose, TableProps, TableSetProps, TableColumn } from '@/components/Table' +import { ElTable, ElMessageBox, ElMessage } from 'element-plus' +import { ref, watch, unref, nextTick, onMounted } from 'vue' + +const { t } = useI18n() + +interface UseTableConfig { + /** + * 是否初始化的时候请求一次 + */ + immediate?: boolean + fetchDataApi: () => Promise<{ + list: any[] + total?: number + }> + fetchDelApi?: () => Promise +} + +export const useTable = (config: UseTableConfig) => { + const { immediate = true } = config + + const loading = ref(false) + const currentPage = ref(1) + const pageSize = ref(10) + const total = ref(0) + const dataList = ref([]) + let isPageSizeChange = false + + watch( + () => currentPage.value, + () => { + if (!isPageSizeChange) methods.getList() + isPageSizeChange = false + } + ) + + watch( + () => pageSize.value, + () => { + if (unref(currentPage) === 1) { + methods.getList() + } else { + currentPage.value = 1 + isPageSizeChange = true + methods.getList() + } + } + ) + + onMounted(() => { + if (immediate) { + methods.getList() + } + }) + + // Table实例 + const tableRef = ref() + + // ElTable实例 + const elTableRef = ref>() + + const register = (ref: typeof Table & TableExpose, elRef: ComponentRef) => { + tableRef.value = ref + elTableRef.value = unref(elRef) + } + + const getTable = async () => { + await nextTick() + const table = unref(tableRef) + if (!table) { + console.error('The table is not registered. Please use the register method to register') + } + return table + } + + const methods = { + /** + * 获取表单数据 + */ + getList: async () => { + loading.value = true + try { + const res = await config?.fetchDataApi() + console.log('fetchDataApi res', res) + if (res) { + dataList.value = res.list + total.value = res.total || 0 + } + } catch (err) { + console.log('fetchDataApi error') + } finally { + loading.value = false + } + }, + + /** + * @description 设置table组件的props + * @param props table组件的props + */ + setProps: async (props: TableProps = {}) => { + const table = await getTable() + table?.setProps(props) + }, + + /** + * @description 设置column + * @param columnProps 需要设置的列 + */ + setColumn: async (columnProps: TableSetProps[]) => { + const table = await getTable() + table?.setColumn(columnProps) + }, + + /** + * @description 新增column + * @param tableColumn 需要新增数据 + * @param index 在哪里新增 + */ + addColumn: async (tableColumn: TableColumn, index?: number) => { + const table = await getTable() + table?.addColumn(tableColumn, index) + }, + + /** + * @description 删除column + * @param field 删除哪个数据 + */ + delColumn: async (field: string) => { + const table = await getTable() + table?.delColumn(field) + }, + + /** + * @description 获取ElTable组件的实例 + * @returns ElTable instance + */ + getElTableExpose: async () => { + await getTable() + return unref(elTableRef) + }, + + refresh: () => { + methods.getList() + }, + + // sortableChange: (e: any) => { + // console.log('sortableChange', e) + // const { oldIndex, newIndex } = e + // dataList.value.splice(newIndex, 0, dataList.value.splice(oldIndex, 1)[0]) + // // to do something + // } + // 删除数据 + delList: async (idsLength: number) => { + const { fetchDelApi } = config + if (!fetchDelApi) { + console.warn('fetchDelApi is undefined') + return + } + ElMessageBox.confirm(t('common.delMessage'), t('common.delWarning'), { + confirmButtonText: t('common.delOk'), + cancelButtonText: t('common.delCancel'), + type: 'warning' + }).then(async () => { + const res = await fetchDelApi() + if (res) { + ElMessage.success(t('common.delSuccess')) + + // 计算出临界点 + const current = + unref(total) % unref(pageSize) === idsLength || unref(pageSize) === 1 + ? unref(currentPage) > 1 + ? unref(currentPage) - 1 + : unref(currentPage) + : unref(currentPage) + + currentPage.value = current + methods.getList() + } + }) + } + } + + return { + tableRegister: register, + tableMethods: methods, + tableState: { + currentPage, + pageSize, + total, + dataList, + loading + } + } +} diff --git a/src/hooks/web/useTagsView.ts b/src/hooks/web/useTagsView.ts new file mode 100644 index 0000000..31eadb0 --- /dev/null +++ b/src/hooks/web/useTagsView.ts @@ -0,0 +1,63 @@ +import { useTagsViewStoreWithOut } from '@/store/modules/tagsView' +import { RouteLocationNormalizedLoaded, useRouter } from 'vue-router' +import { computed, nextTick, unref } from 'vue' + +export const useTagsView = () => { + const tagsViewStore = useTagsViewStoreWithOut() + + const { replace, currentRoute } = useRouter() + + const selectedTag = computed(() => tagsViewStore.getSelectedTag) + + const closeAll = (callback?: Fn) => { + tagsViewStore.delAllViews() + callback?.() + } + + const closeLeft = (callback?: Fn) => { + tagsViewStore.delLeftViews(unref(selectedTag) as RouteLocationNormalizedLoaded) + callback?.() + } + + const closeRight = (callback?: Fn) => { + tagsViewStore.delRightViews(unref(selectedTag) as RouteLocationNormalizedLoaded) + callback?.() + } + + const closeOther = (callback?: Fn) => { + tagsViewStore.delOthersViews(unref(selectedTag) as RouteLocationNormalizedLoaded) + callback?.() + } + + const closeCurrent = (view?: RouteLocationNormalizedLoaded, callback?: Fn) => { + if (view?.meta?.affix) return + tagsViewStore.delView(view || unref(currentRoute)) + + callback?.() + } + + const refreshPage = async (view?: RouteLocationNormalizedLoaded, callback?: Fn) => { + tagsViewStore.delCachedView() + const { path, query } = view || unref(currentRoute) + await nextTick() + replace({ + path: '/redirect' + path, + query: query + }) + callback?.() + } + + const setTitle = (title: string, path?: string) => { + tagsViewStore.setTitle(title, path) + } + + return { + closeAll, + closeLeft, + closeRight, + closeOther, + closeCurrent, + refreshPage, + setTitle + } +} diff --git a/src/hooks/web/useTimeAgo.ts b/src/hooks/web/useTimeAgo.ts new file mode 100644 index 0000000..5675e5e --- /dev/null +++ b/src/hooks/web/useTimeAgo.ts @@ -0,0 +1,50 @@ +import { useTimeAgo as useTimeAgoCore, UseTimeAgoMessages } from '@vueuse/core' +import { computed, unref } from 'vue' +import { useLocaleStoreWithOut } from '@/store/modules/locale' + +const TIME_AGO_MESSAGE_MAP: { + 'zh-CN': UseTimeAgoMessages + en: UseTimeAgoMessages +} = { + 'zh-CN': { + justNow: '刚刚', + invalid: '无效时间', + past: (n) => (n.match(/\d/) ? `${n}前` : n), + future: (n) => (n.match(/\d/) ? `${n}后` : n), + month: (n, past) => (n === 1 ? (past ? '上个月' : '下个月') : `${n} 个月`), + year: (n, past) => (n === 1 ? (past ? '去年' : '明年') : `${n} 年`), + day: (n, past) => (n === 1 ? (past ? '昨天' : '明天') : `${n} 天`), + week: (n, past) => (n === 1 ? (past ? '上周' : '下周') : `${n} 周`), + hour: (n) => `${n} 小时`, + minute: (n) => `${n} 分钟`, + second: (n) => `${n} 秒` + }, + en: { + justNow: '刚刚', + invalid: 'Invalid Date', + past: (n) => (n.match(/\d/) ? `${n} ago` : n), + future: (n) => (n.match(/\d/) ? `in ${n}` : n), + month: (n, past) => + n === 1 ? (past ? 'last month' : 'next month') : `${n} month${n > 1 ? 's' : ''}`, + year: (n, past) => + n === 1 ? (past ? 'last year' : 'next year') : `${n} year${n > 1 ? 's' : ''}`, + day: (n, past) => (n === 1 ? (past ? 'yesterday' : 'tomorrow') : `${n} day${n > 1 ? 's' : ''}`), + week: (n, past) => + n === 1 ? (past ? 'last week' : 'next week') : `${n} week${n > 1 ? 's' : ''}`, + hour: (n) => `${n} hour${n > 1 ? 's' : ''}`, + minute: (n) => `${n} minute${n > 1 ? 's' : ''}`, + second: (n) => `${n} second${n > 1 ? 's' : ''}` + } +} + +export const useTimeAgo = (time: Date | number | string) => { + const localeStore = useLocaleStoreWithOut() + + const currentLocale = computed(() => localeStore.getCurrentLocale) + + const timeAgo = useTimeAgoCore(time, { + messages: TIME_AGO_MESSAGE_MAP[unref(currentLocale).lang] + }) + + return timeAgo +} diff --git a/src/hooks/web/useTitle.ts b/src/hooks/web/useTitle.ts new file mode 100644 index 0000000..546267d --- /dev/null +++ b/src/hooks/web/useTitle.ts @@ -0,0 +1,25 @@ +import { watch, ref } from 'vue' +import { isString } from '@/utils/is' +import { useAppStoreWithOut } from '@/store/modules/app' +import { useI18n } from '@/hooks/web/useI18n' + +export const useTitle = (newTitle?: string) => { + const { t } = useI18n() + const appStore = useAppStoreWithOut() + + const title = ref( + newTitle ? `${appStore.getTitle} - ${t(newTitle as string)}` : appStore.getTitle + ) + + watch( + title, + (n, o) => { + if (isString(n) && n !== o && document) { + document.title = n + } + }, + { immediate: true } + ) + + return title +} diff --git a/src/hooks/web/useValidator.ts b/src/hooks/web/useValidator.ts new file mode 100644 index 0000000..00586bd --- /dev/null +++ b/src/hooks/web/useValidator.ts @@ -0,0 +1,109 @@ +import { useI18n } from '@/hooks/web/useI18n' +import { FormItemRule } from 'element-plus' + +const { t } = useI18n() + +interface LengthRange { + min: number + max: number + message?: string +} + +export const useValidator = () => { + const required = (message?: string): FormItemRule => { + return { + required: true, + message: message || t('common.required') + } + } + + const lengthRange = (options: LengthRange): FormItemRule => { + const { min, max, message } = options + + return { + min, + max, + message: message || t('common.lengthRange', { min, max }) + } + } + + const notSpace = (message?: string): FormItemRule => { + return { + validator: (_, val, callback) => { + if (val?.indexOf(' ') !== -1) { + callback(new Error(message || t('common.notSpace'))) + } else { + callback() + } + } + } + } + + const notSpecialCharacters = (message?: string): FormItemRule => { + return { + validator: (_, val, callback) => { + if (/[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/gi.test(val)) { + callback(new Error(message || t('common.notSpecialCharacters'))) + } else { + callback() + } + } + } + } + + const phone = (message?: string): FormItemRule => { + return { + validator: (_, val, callback) => { + if (!val) return callback() + if (!/^1[3456789]\d{9}$/.test(val)) { + callback(new Error(message || '请输入正确的手机号码')) + } else { + callback() + } + } + } + } + + const email = (message?: string): FormItemRule => { + return { + validator: (_, val, callback) => { + if (!val) return callback() + if (!/^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/.test(val)) { + callback(new Error(message || '请输入正确的邮箱')) + } else { + callback() + } + } + } + } + + const maxlength = (max: number): FormItemRule => { + return { + max, + message: '长度不能超过' + max + '个字符' + } + } + + const check = (message?: string): FormItemRule => { + return { + validator: (_, val, callback) => { + if (!val) { + callback(new Error(message || t('common.required'))) + } else { + callback() + } + } + } + } + + return { + required, + lengthRange, + notSpace, + notSpecialCharacters, + phone, + email, + maxlength, + check + } +} diff --git a/src/hooks/web/useWatermark.ts b/src/hooks/web/useWatermark.ts new file mode 100644 index 0000000..4a31359 --- /dev/null +++ b/src/hooks/web/useWatermark.ts @@ -0,0 +1,55 @@ +const domSymbol = Symbol('watermark-dom') + +export function useWatermark(appendEl: HTMLElement | null = document.body) { + let func: Fn = () => {} + const id = domSymbol.toString() + const clear = () => { + const domId = document.getElementById(id) + if (domId) { + const el = appendEl + el && el.removeChild(domId) + } + window.removeEventListener('resize', func) + } + const createWatermark = (str: string) => { + clear() + + const can = document.createElement('canvas') + can.width = 300 + can.height = 240 + + const cans = can.getContext('2d') + if (cans) { + cans.rotate((-20 * Math.PI) / 120) + cans.font = '15px Vedana' + cans.fillStyle = 'rgba(0, 0, 0, 0.15)' + cans.textAlign = 'left' + cans.textBaseline = 'middle' + cans.fillText(str, can.width / 20, can.height) + } + + const div = document.createElement('div') + div.id = id + div.style.pointerEvents = 'none' + div.style.top = '0px' + div.style.left = '0px' + div.style.position = 'absolute' + div.style.zIndex = '100000000' + div.style.width = document.documentElement.clientWidth + 'px' + div.style.height = document.documentElement.clientHeight + 'px' + div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat' + const el = appendEl + el && el.appendChild(div) + return id + } + + function setWatermark(str: string) { + createWatermark(str) + func = () => { + createWatermark(str) + } + window.addEventListener('resize', func) + } + + return { setWatermark, clear } +} diff --git a/src/layout/Layout.vue b/src/layout/Layout.vue new file mode 100644 index 0000000..8f570c3 --- /dev/null +++ b/src/layout/Layout.vue @@ -0,0 +1,74 @@ + + + diff --git a/src/layout/components/AppView.vue b/src/layout/components/AppView.vue new file mode 100644 index 0000000..c491f1e --- /dev/null +++ b/src/layout/components/AppView.vue @@ -0,0 +1,37 @@ + + + diff --git a/src/layout/components/ToolHeader.vue b/src/layout/components/ToolHeader.vue new file mode 100644 index 0000000..e6f953f --- /dev/null +++ b/src/layout/components/ToolHeader.vue @@ -0,0 +1,82 @@ + + + diff --git a/src/layout/components/useRenderLayout.tsx b/src/layout/components/useRenderLayout.tsx new file mode 100644 index 0000000..9f4b3a7 --- /dev/null +++ b/src/layout/components/useRenderLayout.tsx @@ -0,0 +1,306 @@ +import { computed } from 'vue' +import { useAppStore } from '@/store/modules/app' +import { Menu } from '@/components/Menu' +import { TabMenu } from '@/components/TabMenu' +import { TagsView } from '@/components/TagsView' +import { Logo } from '@/components/Logo' +import AppView from './AppView.vue' +import ToolHeader from './ToolHeader.vue' +import { ElScrollbar } from 'element-plus' +import { useDesign } from '@/hooks/web/useDesign' + +const { getPrefixCls } = useDesign() + +const prefixCls = getPrefixCls('layout') + +const appStore = useAppStore() + +const pageLoading = computed(() => appStore.getPageLoading) + +// 标签页 +const tagsView = computed(() => appStore.getTagsView) + +// 菜单折叠 +const collapse = computed(() => appStore.getCollapse) + +// logo +const logo = computed(() => appStore.logo) + +// 固定头部 +const fixedHeader = computed(() => appStore.getFixedHeader) + +// 是否是移动端 +const mobile = computed(() => appStore.getMobile) + +// 固定菜单 +const fixedMenu = computed(() => appStore.getFixedMenu) + +export const useRenderLayout = () => { + const renderClassic = () => { + return ( + <> +
    + {logo.value ? ( + + ) : undefined} + +
    +
    + +
    + + + {tagsView.value ? ( + + ) : undefined} +
    + + +
    +
    + + ) + } + + const renderTopLeft = () => { + return ( + <> +
    + {logo.value ? : undefined} + + +
    +
    + +
    + + {tagsView.value ? ( + + ) : undefined} + + + +
    +
    + + ) + } + + const renderTop = () => { + return ( + <> +
    + {logo.value ? : undefined} + + +
    +
    + + {tagsView.value ? ( + + ) : undefined} + + + +
    + + ) + } + + const renderCutMenu = () => { + return ( + <> +
    + {logo.value ? : undefined} + + +
    +
    + +
    + + {tagsView.value ? ( + + ) : undefined} + + + +
    +
    + + ) + } + + return { + renderClassic, + renderTopLeft, + renderTop, + renderCutMenu + } +} diff --git a/src/locales/en.ts b/src/locales/en.ts new file mode 100644 index 0000000..04e4e42 --- /dev/null +++ b/src/locales/en.ts @@ -0,0 +1,584 @@ +export default { + common: { + inputText: 'Please input', + selectText: 'Please select', + startTimeText: 'Start time', + endTimeText: 'End time', + login: 'Login', + required: 'This is required', + loginOut: 'Login out', + document: 'Document', + reminder: 'Reminder', + loginOutMessage: 'Exit the system?', + back: 'Back', + ok: 'OK', + cancel: 'Cancel', + reload: 'Reload current', + closeTab: 'Close current', + closeTheLeftTab: 'Close left', + closeTheRightTab: 'Close right', + closeOther: 'Close other', + closeAll: 'Close all', + prevLabel: 'Prev', + nextLabel: 'Next', + skipLabel: 'Jump', + doneLabel: 'End', + menu: 'Menu', + menuDes: 'Menu bar rendered in routed structure', + collapse: 'Collapse', + collapseDes: 'Expand and zoom the menu bar', + tagsView: 'Tags view', + tagsViewDes: 'Used to record routing history', + tool: 'Tool', + toolDes: 'Used to set up custom systems', + query: 'Query', + reset: 'Reset', + shrink: 'Put away', + expand: 'Expand', + delMessage: 'Delete the selected data?', + delWarning: 'Warning', + delOk: 'OK', + delCancel: 'Cancel', + delNoData: 'Please select the data to delete', + delSuccess: 'Deleted successfully', + refresh: 'Refresh', + fullscreen: 'Fullscreen', + size: 'Size', + columnSetting: 'Column setting', + lengthRange: 'The length should be between {min} and {max}', + notSpace: 'Spaces are not allowed', + notSpecialCharacters: 'Special characters are not allowed', + isEqual: 'The two are not equal', + // 列设置 + setting: 'Setting' + }, + lock: { + lockScreen: 'Lock screen', + lock: 'Lock', + lockPassword: 'Lock screen password', + unlock: 'Click to unlock', + backToLogin: 'Back to login', + entrySystem: 'Entry the system', + placeholder: 'Please enter the lock screen password', + message: 'Lock screen password error' + }, + error: { + noPermission: `Sorry, you don't have permission to access this page.`, + pageError: 'Sorry, the page you visited does not exist.', + networkError: 'Sorry, the server reported an error.', + returnToHome: 'Return to home' + }, + setting: { + projectSetting: 'Project setting', + theme: 'Theme', + layout: 'Layout', + systemTheme: 'System theme', + menuTheme: 'Menu theme', + interfaceDisplay: 'Interface display', + breadcrumb: 'Breadcrumb', + breadcrumbIcon: 'Breadcrumb icon', + collapseMenu: 'Collapse menu', + hamburgerIcon: 'Hamburger icon', + screenfullIcon: 'Screenfull icon', + sizeIcon: 'Size icon', + localeIcon: 'Locale icon', + tagsView: 'Tags view', + logo: 'Logo', + greyMode: 'Grey mode', + fixedHeader: 'Fixed header', + headerTheme: 'Header theme', + cutMenu: 'Cut Menu', + copy: 'Copy', + clearAndReset: 'Clear cache and reset', + copySuccess: 'Copy success', + copyFailed: 'Copy failed', + footer: 'Footer', + uniqueOpened: 'Unique opened', + tagsViewIcon: 'Tags view icon', + // 开启动态路由 + dynamicRouter: 'Enable dynamic router', + serverDynamicRouter: 'Server dynamic router', + reExperienced: 'Please exit the login experience again', + fixedMenu: 'Fixed menu' + }, + size: { + default: 'Default', + large: 'Large', + small: 'Small' + }, + login: { + welcome: 'Welcome to the system', + message: 'Backstage management system', + username: 'Username', + password: 'Password', + register: 'Register', + checkPassword: 'Confirm password', + login: 'Sign in', + otherLogin: 'Sign in with', + remember: 'Remember me', + hasUser: 'Existing account? Go to login', + forgetPassword: 'Forget password', + usernamePlaceholder: 'Please input username', + passwordPlaceholder: 'Please input password', + code: 'Verification code', + codePlaceholder: 'Please input verification code', + getCode: 'Get code' + }, + router: { + login: 'Login', + level: 'Multi level menu', + menu: 'Menu', + menu1: 'Menu1', + menu11: 'Menu1-1', + menu111: 'Menu1-1-1', + menu12: 'Menu1-2', + menu2: 'Menu2', + dashboard: 'Dashboard', + analysis: 'Analysis', + workplace: 'Workplace', + guide: 'Guide', + component: 'Component', + icon: 'Icon', + echart: 'Echart', + countTo: 'Count to', + watermark: 'Watermark', + qrcode: 'Qrcode', + highlight: 'Highlight', + infotip: 'Infotip', + form: 'Form', + defaultForm: 'All examples', + search: 'Search', + table: 'Table', + defaultTable: 'Basic example', + editor: 'Editor', + richText: 'Rich text', + jsonEditor: 'JSON Editor', + codeEditor: 'Code Editor', + dialog: 'Dialog', + imageViewer: 'Image viewer', + descriptions: 'Descriptions', + example: 'Example', + exampleDialog: 'Example dialog', + examplePage: 'Example page', + exampleAdd: 'Example page - add', + exampleEdit: 'Example page - edit', + exampleDetail: 'Example page - detail', + errorPage: 'Error page', + authorization: 'Authorization', + user: 'User management', + role: 'Role management', + document: 'Document', + inputPassword: 'InputPassword', + sticky: 'Sticky', + treeTable: 'Tree table', + PicturePreview: 'Table Image Preview', + department: 'Department management', + menuManagement: 'Menu management', + // 权限测试页面 + permission: 'Permission test page', + function: 'Function', + multipleTabs: 'Multiple tabs', + details: 'Details', + iconPicker: 'Icon picker', + request: 'Request', + waterfall: 'Waterfall', + imageCropping: 'Image cropping', + videoPlayer: 'Video player', + // 表格视频预览 + tableVideoPreview: 'Table video preview', + cardTable: 'Card table', + personalCenter: 'Personal center', + personal: 'Personal', + avatars: 'Avatars', + iAgree: 'I agree', + tree: 'Tree' + }, + permission: { + hasPermission: 'Please set the operation permission value' + }, + analysis: { + newUser: 'New user', + unreadInformation: 'Unread information', + transactionAmount: 'Transaction amount', + totalShopping: 'Total Shopping', + monthlySales: 'Monthly sales', + userAccessSource: 'User access source', + january: 'January', + february: 'February', + march: 'March', + april: 'April', + may: 'May', + june: 'June', + july: 'July', + august: 'August', + september: 'September', + october: 'October', + november: 'November', + december: 'December', + estimate: 'Estimate', + actual: 'Actual', + directAccess: 'Airect access', + mailMarketing: 'Mail marketing', + allianceAdvertising: 'Alliance advertising', + videoAdvertising: 'Video advertising', + searchEngines: 'Search engines', + weeklyUserActivity: 'Weekly user activity', + activeQuantity: 'Active quantity', + monday: 'Monday', + tuesday: 'Tuesday', + wednesday: 'Wednesday', + thursday: 'Thursday', + friday: 'Friday', + saturday: 'Saturday', + sunday: 'Sunday' + }, + workplace: { + goodMorning: 'Good morning', + happyDay: 'Wish you happy every day!', + toady: `It's sunny today`, + project: 'Project', + access: 'Project access', + toDo: 'To do', + introduction: 'A serious introduction', + more: 'More', + shortcutOperation: 'Shortcut operation', + operation: 'Operation', + index: 'Index', + personal: 'Personal', + team: 'Team', + quote: 'Quote', + contribution: 'Contribution', + hot: 'Hot', + yield: 'Yield', + dynamic: 'Dynamic', + push: 'push', + pushCode: 'Archer push code to Github', + follow: 'Follow' + }, + formDemo: { + input: 'Input', + inputNumber: 'InputNumber', + default: 'Default', + icon: 'Icon', + mixed: 'Mixed', + password: 'Password', + textarea: 'Textarea', + remoteSearch: 'Remote search', + slot: 'Slot', + position: 'Position', + autocomplete: 'Autocomplete', + select: 'Select', + optionSlot: 'Option Slot', + selectGroup: 'Select Group', + selectV2: 'SelectV2', + cascader: 'Cascader', + switch: 'Switch', + rate: 'Rate', + colorPicker: 'Color Picker', + transfer: 'Transfer', + render: 'Render', + radio: 'Radio', + radioGroup: 'Radio Group', + button: 'Button', + checkbox: 'Checkbox', + checkboxButton: 'Checkbox Button', + checkboxGroup: 'Checkbox Group', + slider: 'Slider', + datePicker: 'Date Picker', + shortcuts: 'Shortcuts', + today: 'Today', + yesterday: 'Yesterday', + aWeekAgo: 'A week ago', + week: 'Week', + year: 'Year', + month: 'Month', + dates: 'Dates', + daterange: 'Date Range', + monthrange: 'Month Range', + dateTimePicker: 'DateTimePicker', + dateTimerange: 'Datetime Range', + timePicker: 'Time Picker', + timeSelect: 'Time Select', + inputPassword: 'input Password', + passwordStrength: 'Password Strength', + defaultForm: 'All examples', + formDes: + 'The secondary encapsulation of form components based on ElementPlus realizes data-driven and supports all Form parameters', + example: 'example', + operate: 'operate', + change: 'Change', + restore: 'Restore', + disabled: 'Disabled', + disablement: 'Disablement', + delete: 'Delete', + add: 'Add', + setValue: 'Set value', + resetValue: 'Reset value', + set: 'Set', + subitem: 'Subitem', + formValidation: 'Form validation', + verifyReset: 'Verify reset', + // 富文本编辑器 + richText: 'Rich text', + jsonEditor: 'JSON Editor', + form: 'Form', + // 远程加载 + remoteLoading: 'Remote loading', + // 聚焦 + focus: 'Focus', + treeSelect: 'Tree Select', + showCheckbox: 'Show Checkbox', + selectAnyLevel: 'Select Any Level', + multiple: 'Multiple', + filterable: 'Filterable', + // 自定义节点内容 + customContent: 'Custom content', + // 懒加载 + lazyLoad: 'Lazy load', + upload: 'Upload', + // 用户头像 + userAvatar: 'User avatar', + iconPicker: 'Icon picker', + iAgree: 'I agree' + }, + guideDemo: { + guide: 'Guide', + start: 'Start', + message: + 'The guide page is very useful for some people who enter the project for the first time. You can briefly introduce the functions of the project. The boot page is based on driver.js' + }, + iconDemo: { + icon: 'Icon', + localIcon: 'Local Icon', + iconify: 'Iconify component', + recommendedUse: 'Recommended use', + recommendeDes: + 'Iconify component basically contains all icons. You can query any icon you want. And packaging will only package the icons used.', + accessAddress: 'Access address' + }, + echartDemo: { + echart: 'Echart', + echartDes: + 'Based on the secondary packaging components of eckarts, the width is adaptive. The corresponding chart can be displayed by passing in the options and height attributes.' + }, + countToDemo: { + countTo: 'CountTo', + countToDes: + 'The transformation is based on vue-count-to and supports all vue-count-to parameters.', + suffix: 'Suffix', + prefix: 'Prefix', + separator: 'Separator', + duration: 'Duration', + endVal: 'End val', + startVal: 'Start val', + start: 'Start', + pause: 'Pause', + resume: 'Resume' + }, + watermarkDemo: { + watermark: 'Watermark', + createdWatermark: 'Created watermark', + clearWatermark: 'Clear watermark', + resetWatermark: 'Reset watermark' + }, + qrcodeDemo: { + qrcode: 'Qrcode', + qrcodeDes: 'Secondary packaging based on qrcode', + basicUsage: 'Basic usage', + imgTag: 'Img tag', + style: 'Style config', + click: 'Click event', + asynchronousContent: 'Asynchronous content', + invalid: 'Invalid', + logoConfig: 'Logo config', + logoStyle: 'Logo style', + size: 'size config' + }, + treeDemo: { + treeTitle: 'Tree control (right-click node to customize menu options)', + message: + 'The tree component is based on the secondary packaging of the tree component of ElementPlus' + }, + highlightDemo: { + highlight: 'Highlight', + message: 'The best time to plant a tree is ten years ago, followed by now.', + keys1: 'ten years ago', + keys2: 'now' + }, + infotipDemo: { + infotip: 'Infotip', + infotipDes: 'Secondary packaging of components based on Highlight', + title: 'matters needing attention' + }, + levelDemo: { + menu: 'Multi level menu cache' + }, + searchDemo: { + search: 'Search', + searchDes: + 'Based on the secondary encapsulation of form components, the functions of query and reset are realized', + operate: 'operate', + change: 'Change', + grid: 'grid', + button: 'Button', + restore: 'Restore', + inline: 'inline', + bottom: 'Bottom', + position: 'position', + left: 'left', + center: 'center', + right: 'right', + dynamicOptions: 'Dynamic options', + // 删除单选框 + deleteRadio: 'Delete radio', + // 还原单选框 + restoreRadio: 'Restore radio', + loading: 'Loading', + reset: 'Reset' + }, + stickyDemo: { + sticky: 'Sticky' + }, + tableDemo: { + table: 'Table', + tableDes: 'Secondary packaging of Table components based on ElementPlus', + index: 'Index', + title: 'Title', + author: 'Author', + displayTime: 'Display time', + importance: 'Importance', + pageviews: 'Pageviews', + action: 'Action', + important: 'Important', + good: 'Good', + commonly: 'Commonly', + operate: 'operate', + example: 'example', + show: 'Show', + hidden: 'Hidden', + pagination: 'pagination', + reserveIndex: 'Reserve index', + restoreIndex: 'Restore index', + showSelections: 'Show selections', + hiddenSelections: 'Restore selections', + showExpandedRows: 'Show expanded rows', + hiddenExpandedRows: 'Hidden expanded rows', + changeTitle: 'Change title', + header: 'Header', + selectAllNone: 'Select all / none', + delOrAddAction: 'Delete or add action', + showOrHiddenStripe: 'Show or hidden stripe', + showOrHiddenBorder: 'Show or hidden border', + fixedHeaderOrAuto: 'Fixed header or auto', + getSelections: 'Get selections', + preview: 'Preview', + showOrHiddenSortable: 'Show or hidden sortable', + videoPreview: 'Video preview', + cardTable: 'Card table' + }, + richText: { + richText: 'Rich text', + richTextDes: 'Secondary packaging based on wangeditor', + jsonEditor: 'JSON Editor', + jsonEditorDes: 'Secondary packaging based on vue-json-pretty', + codeEditor: 'Code Editor', + codeEditorDes: 'Secondary packaging based on monaco-editor' + }, + dialogDemo: { + dialog: 'Dialog', + resizeDialog: 'Resize dialog', + dialogDes: 'Secondary packaging of Dialog components based on ElementPlus', + open: 'Open', + close: 'Close', + combineWithForm: 'Combine with form', + submit: 'Submit' + }, + imageViewerDemo: { + open: 'Open', + imageViewer: 'Image viewer', + imageViewerDes: 'Secondary packaging of ImageViewer components based on ElementPlus' + }, + descriptionsDemo: { + descriptions: 'Descriptions', + descriptionsDes: 'Secondary packaging of Descriptions components based on ElementPlus', + username: 'Username', + nickName: 'NickName', + phone: 'Phone', + email: 'Email', + addr: 'Address', + form: 'Combined with Form component' + }, + exampleDemo: { + title: 'Title', + add: 'Add', + del: 'Delete', + edit: 'Edit', + author: 'Author', + displayTime: 'Display time', + importance: 'Importance', + pageviews: 'Pageviews', + important: 'Important', + content: 'Content', + save: 'Save', + detail: 'Detail' + }, + userDemo: { + title: 'User management', + message: + 'Because it is simulated data, only two accounts with different permissions are provided, which can be modified and combined by developers according to the actual situation.', + index: 'Index', + action: 'Action', + username: 'Username', + password: 'Password', + role: 'Role', + remark: 'Remark', + remarkMessage1: 'Back end control routing permission', + remarkMessage2: 'Front end control routing permission', + // 部门列表 + departmentList: 'Department list', + // 搜索部门 + searchDepartment: 'Search department', + account: 'Account', + email: 'Email', + createTime: 'Create time', + // 所属部门 + department: 'Department', + departmentName: 'Department name', + status: 'Status', + enable: 'Enable', + disable: 'Disable', + superiorDepartment: 'Superior department' + }, + menu: { + menuName: 'Menu name', + icon: 'Icon', + // 权限 + permission: 'Permission', + component: 'Component', + path: 'Path', + status: 'Status', + hidden: 'Hidden', + alwaysShow: 'Always show', + noCache: 'No cache', + breadcrumb: 'Breadcrumb', + affix: 'Affix', + noTagsView: 'No tags view', + activeMenu: 'Active menu', + canTo: 'Can to', + name: 'Name' + }, + role: { + roleName: 'Role name', + role: 'Role', + // 菜单分配 + menu: 'Menu allocation' + }, + inputPasswordDemo: { + title: 'InputPassword', + inputPasswordDes: 'Secondary packaging of Input components based on ElementPlus' + }, + avatarsDemo: { + title: + 'Avatar component for avatar list, secondary packaging based on element plus Avatar component' + } +} diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts new file mode 100644 index 0000000..fe74dfb --- /dev/null +++ b/src/locales/zh-CN.ts @@ -0,0 +1,572 @@ +export default { + common: { + inputText: '请输入', + selectText: '请选择', + startTimeText: '开始时间', + endTimeText: '结束时间', + login: '登录', + required: '该项为必填项', + loginOut: '退出系统', + document: '项目文档', + reminder: '温馨提示', + loginOutMessage: '是否退出本系统?', + back: '返回', + ok: '确定', + cancel: '取消', + reload: '重新加载', + closeTab: '关闭标签页', + closeTheLeftTab: '关闭左侧标签页', + closeTheRightTab: '关闭右侧标签页', + closeOther: '关闭其它标签页', + closeAll: '关闭全部标签页', + prevLabel: '上一步', + nextLabel: '下一步', + skipLabel: '跳过', + doneLabel: '结束', + menu: '菜单', + menuDes: '以路由的结构渲染的菜单栏', + collapse: '展开缩收', + collapseDes: '展开和缩放菜单栏', + tagsView: '标签页', + tagsViewDes: '用于记录路由历史记录', + tool: '工具', + toolDes: '用于设置定制系统', + query: '查询', + reset: '重置', + shrink: '收起', + expand: '展开', + delMessage: '是否删除所选中数据?', + delWarning: '提示', + delOk: '确定', + delCancel: '取消', + delNoData: '请选择需要删除的数据', + delSuccess: '删除成功', + refresh: '刷新', + fullscreen: '全屏', + size: '尺寸', + columnSetting: '列设置', + lengthRange: '长度在 {min} 到 {max} 个字符', + notSpace: '不能包含空格', + notSpecialCharacters: '不能包含特殊字符', + isEqual: '两次输入不一致', + setting: '设置' + }, + lock: { + lockScreen: '锁定屏幕', + lock: '锁定', + lockPassword: '锁屏密码', + unlock: '点击解锁', + backToLogin: '返回登录', + entrySystem: '进入系统', + placeholder: '请输入锁屏密码', + message: '锁屏密码错误' + }, + error: { + noPermission: `抱歉,您无权访问此页面。`, + pageError: '抱歉,您访问的页面不存在。', + networkError: '抱歉,服务器报告错误。', + returnToHome: '返回首页' + }, + setting: { + projectSetting: '项目配置', + theme: '主题', + layout: '布局', + systemTheme: '系统主题', + menuTheme: '菜单主题', + interfaceDisplay: '界面显示', + breadcrumb: '面包屑', + breadcrumbIcon: '面包屑图标', + collapseMenu: '折叠菜单', + hamburgerIcon: '折叠图标', + screenfullIcon: '全屏图标', + sizeIcon: '尺寸图标', + localeIcon: '多语言图标', + tagsView: '标签页', + logo: 'Logo', + greyMode: '灰色模式', + fixedHeader: '固定头部', + headerTheme: '头部主题', + cutMenu: '切割菜单', + copy: '拷贝', + clearAndReset: '清除缓存并且重置', + copySuccess: '拷贝成功', + copyFailed: '拷贝失败', + footer: '页脚', + uniqueOpened: '菜单手风琴', + tagsViewIcon: '标签页图标', + dynamicRouter: '开启动态路由', + serverDynamicRouter: '服务端动态路由', + reExperienced: '请重新退出登录体验', + fixedMenu: '固定菜单' + }, + size: { + default: '默认', + large: '大', + small: '小' + }, + login: { + welcome: '欢迎使用本系统', + message: '开箱即用的中后台管理系统', + username: '用户名', + password: '密码', + register: '注册', + checkPassword: '确认密码', + login: '登录', + otherLogin: '其它登录方式', + remember: '记住我', + hasUser: '已有账号?去登录', + forgetPassword: '忘记密码', + usernamePlaceholder: '请输入用户名', + passwordPlaceholder: '请输入密码', + code: '验证码', + codePlaceholder: '请输入验证码', + getCode: '获取验证码' + }, + router: { + login: '登录', + level: '多级菜单', + menu: '菜单', + menu1: '菜单1', + menu11: '菜单1-1', + menu111: '菜单1-1-1', + menu12: '菜单1-2', + menu2: '菜单2', + dashboard: '首页', + analysis: '分析页', + workplace: '工作台', + guide: '引导', + component: '组件', + icon: '图标', + echart: '图表', + countTo: '数字动画', + watermark: '水印', + qrcode: '二维码', + highlight: '高亮', + infotip: '信息提示', + form: '表单', + defaultForm: '全部示例', + search: '查询', + table: '表格', + defaultTable: '基础示例', + editor: '编辑器', + richText: '富文本', + jsonEditor: 'JSON编辑器', + codeEditor: '代码编辑器', + dialog: '弹窗', + imageViewer: '图片预览', + descriptions: '描述', + example: '综合示例', + exampleDialog: '综合示例 - 弹窗', + examplePage: '综合示例 - 页面', + exampleAdd: '综合示例 - 新增', + exampleEdit: '综合示例 - 编辑', + exampleDetail: '综合示例 - 详情', + errorPage: '错误页面', + authorization: '权限管理', + user: '用户管理', + role: '角色管理', + document: '文档', + inputPassword: '密码输入框', + sticky: '黏性', + treeTable: '树形表格', + PicturePreview: '表格图片预览', + department: '部门管理', + menuManagement: '菜单管理', + permission: '权限测试页', + function: '功能', + multipleTabs: '多开标签页', + details: '详情页', + iconPicker: '图标选择器', + request: '请求', + waterfall: '瀑布流', + imageCropping: '图片裁剪', + videoPlayer: '视频播放器', + tableVideoPreview: '表格视频预览', + cardTable: '卡片表格', + personalCenter: '个人中心', + personal: '个人', + avatars: '头像列表', + iAgree: '我同意', + tree: 'Tree 树形控件' + }, + permission: { + hasPermission: '请设置操作权限值' + }, + analysis: { + newUser: '新增用户', + unreadInformation: '未读消息', + transactionAmount: '成交金额', + totalShopping: '购物总量', + monthlySales: '每月销售额', + userAccessSource: '用户访问来源', + january: '一月', + february: '二月', + march: '三月', + april: '四月', + may: '五月', + june: '六月', + july: '七月', + august: '八月', + september: '九月', + october: '十月', + november: '十一月', + december: '十二月', + estimate: '预计', + actual: '实际', + directAccess: '直接访问', + mailMarketing: '邮件营销', + allianceAdvertising: '联盟广告', + videoAdvertising: '视频广告', + searchEngines: '搜索引擎', + weeklyUserActivity: '每周用户活跃量', + activeQuantity: '活跃量', + monday: '周一', + tuesday: '周二', + wednesday: '周三', + thursday: '周四', + friday: '周五', + saturday: '周六', + sunday: '周日' + }, + workplace: { + goodMorning: '早安', + happyDay: '祝你开心每一天!', + toady: '今日晴', + project: '项目数', + access: '项目访问', + toDo: '待办', + introduction: '一个正经的简介', + more: '更多', + shortcutOperation: '快捷操作', + operation: '操作', + index: '指数', + personal: '个人', + team: '团队', + quote: '引用', + contribution: '贡献', + hot: '热度', + yield: '产量', + dynamic: '动态', + push: '推送', + pushCode: 'Archer 推送 代码到 Github', + follow: '关注' + }, + formDemo: { + input: '输入框', + inputNumber: '数字输入框', + default: '默认', + icon: '图标', + mixed: '复合型', + password: '密码框', + textarea: '多行文本', + remoteSearch: '远程搜索', + slot: '插槽', + position: '位置', + autocomplete: '自动补全', + select: '选择器', + optionSlot: '选项插槽', + selectGroup: '选项分组', + selectV2: '虚拟列表选择器', + cascader: '级联选择器', + switch: '开关', + rate: '评分', + colorPicker: '颜色选择器', + transfer: '穿梭框', + render: '渲染器', + radio: '单选框', + radioGroup: '单选框组', + button: '按钮', + checkbox: '多选框', + checkboxButton: '多选框按钮', + checkboxGroup: '多选框组', + slider: '滑块', + datePicker: '日期选择器', + shortcuts: '快捷选项', + today: '今天', + yesterday: '昨天', + aWeekAgo: '一周前', + week: '周', + year: '年', + month: '月', + dates: '日期', + daterange: '日期范围', + monthrange: '月份范围', + dateTimePicker: '日期时间选择器', + dateTimerange: '日期时间范围', + timePicker: '时间选择器', + timeSelect: '时间选择', + inputPassword: '密码输入框', + passwordStrength: '密码强度', + defaultForm: '全部示例', + formDes: '基于 ElementPlus 的 Form 组件二次封装,实现数据驱动,支持所有 Form 参数', + example: '示例', + operate: '操作', + change: '更改', + restore: '还原', + disabled: '禁用', + disablement: '解除禁用', + delete: '删除', + add: '添加', + setValue: '设置值', + resetValue: '重置值', + set: '设置', + subitem: '子项', + formValidation: '表单验证', + verifyReset: '验证重置', + // 富文本编辑器 + richText: '富文本编辑器', + // JSON编辑器 + jsonEditor: 'JSON编辑器', + form: '表单', + // 远程加载 + remoteLoading: '远程加载', + // 聚焦 + focus: '聚焦', + treeSelect: '树形选择器', + showCheckbox: '显示复选框', + selectAnyLevel: '选择任意级别', + multiple: '多选', + filterable: '可筛选', + customContent: '自定义内容', + lazyLoad: '懒加载', + upload: '上传', + userAvatar: '用户头像', + iconPicker: '图标选择器', + iAgree: '我同意' + }, + guideDemo: { + guide: '引导页', + start: '开始', + message: + '引导页对于一些第一次进入项目的人很有用,你可以简单介绍下项目的功能。引导页基于 driver.js' + }, + iconDemo: { + icon: '图标', + localIcon: '本地图标', + iconify: 'Iconify组件', + recommendedUse: '推荐使用', + recommendeDes: + 'Iconify组件基本包含所有的图标,你可以查询到你想要的任何图标。并且打包只会打包所用到的图标。', + accessAddress: '访问地址' + }, + echartDemo: { + echart: '图表', + echartDes: + '基于 echarts 二次封装组件,自适应宽度,只需传入 options 与 height 属性即可展示对应的图表。' + }, + countToDemo: { + countTo: '数字动画', + countToDes: '基于 vue-count-to 进行改造,支持所有 vue-count-to 参数。', + suffix: '后缀', + prefix: '前缀', + separator: '分割符号', + duration: '持续时间', + endVal: '结束值', + startVal: '开始值', + start: '开始', + pause: '暂停', + resume: '继续' + }, + watermarkDemo: { + watermark: '水印', + createdWatermark: '创建水印', + clearWatermark: '清除水印', + resetWatermark: '重置水印' + }, + qrcodeDemo: { + qrcode: '二维码', + qrcodeDes: '基于 qrcode 二次封装', + basicUsage: '基础用法', + imgTag: 'img标签', + style: '样式配置', + click: '点击事件', + asynchronousContent: '异步内容', + invalid: '失效', + logoConfig: 'logo配置', + logoStyle: 'logo样式', + size: '大小配置' + }, + treeDemo: { + treeTitle: '树形控件(节点右键可自定义菜单选项)', + message: '基于 ElementPlus 的 Tree 组件二次封装' + }, + highlightDemo: { + highlight: '高亮', + message: '种一棵树最好的时间是十年前,其次就是现在。', + keys1: '十年前', + keys2: '现在' + }, + infotipDemo: { + infotip: '信息提示', + infotipDes: '基于 Highlight 组件二次封装', + title: '注意事项' + }, + levelDemo: { + menu: '多级菜单缓存' + }, + searchDemo: { + search: '查询', + searchDes: '基于 Form 组件二次封装,实现查询、重置功能', + operate: '操作', + change: '更改', + grid: '栅格', + button: '按钮', + restore: '还原', + inline: '内联', + bottom: '底部', + position: '位置', + left: '左', + center: '中', + right: '右', + dynamicOptions: '动态选项', + // 删除单选框 + deleteRadio: '删除单选框', + // 还原单选框 + restoreRadio: '还原单选框', + loading: '加载中', + reset: '重置' + }, + stickyDemo: { + sticky: '黏性' + }, + tableDemo: { + table: '表格', + tableDes: '基于 ElementPlus 的 Table 组件二次封装', + index: '序号', + title: '标题', + author: '作者', + displayTime: '创建时间', + importance: '重要性', + pageviews: '阅读数', + action: '操作', + important: '重要', + good: '良好', + commonly: '一般', + operate: '操作', + example: '示例', + show: '显示', + hidden: '隐藏', + pagination: '分页', + reserveIndex: '叠加序号', + restoreIndex: '还原序号', + showSelections: '显示多选', + hiddenSelections: '隐藏多选', + showExpandedRows: '显示展开行', + hiddenExpandedRows: '隐藏展开行', + changeTitle: '修改标题', + header: '头部', + selectAllNone: '全选/全不选', + delOrAddAction: '删除/添加操作列', + showOrHiddenStripe: '显示/隐藏斑马纹', + showOrHiddenBorder: '显示/隐藏边框', + fixedHeaderOrAuto: '固定头部/自动', + getSelections: '获取多选数据', + preview: '封面', + showOrHiddenSortable: '显示/隐藏排序', + videoPreview: '视频预览', + cardTable: '卡片表格' + }, + richText: { + richText: '富文本', + richTextDes: '基于 wangeditor 二次封装', + jsonEditor: 'JSON编辑器', + jsonEditorDes: '基于 vue-json-pretty 二次封装', + codeEditor: '代码编辑器', + codeEditorDes: '基于 monaco-editor 二次封装' + }, + dialogDemo: { + dialog: '弹窗', + resizeDialog: '可自定义调节弹窗大小的弹窗', + dialogDes: '基于 ElementPlus 的 Dialog 组件二次封装', + open: '打开', + close: '关闭', + combineWithForm: '与表单结合', + submit: '提交' + }, + imageViewerDemo: { + open: '打开', + imageViewer: '图片预览', + imageViewerDes: '基于 ElementPlus 的 ImageViewer 组件二次封装' + }, + descriptionsDemo: { + descriptions: '描述', + descriptionsDes: '基于 ElementPlus 的 Descriptions 组件二次封装', + username: '用户名', + nickName: '昵称', + phone: '联系电话', + email: '邮箱', + addr: '地址', + form: '与 Form 组件组合' + }, + exampleDemo: { + title: '标题', + add: '新增', + del: '删除', + edit: '编辑', + author: '作者', + displayTime: '创建时间', + importance: '重要性', + pageviews: '阅读数', + important: '重要', + content: '内容', + save: '保存', + detail: '详情' + }, + userDemo: { + title: '用户管理', + message: '由于是模拟数据,所以只提供了两种不同权限的帐号,开发者可根据实际情况自行改造结合。', + index: '序号', + action: '操作', + username: '用户名', + password: '密码', + role: '角色', + remark: '备注', + remarkMessage1: '后端控制路由权限', + remarkMessage2: '前端控制路由权限', + // 部门列表 + departmentList: '部门列表', + searchDepartment: '搜索部门', + account: '账号', + email: '邮箱', + createTime: '创建时间', + // 所属部门 + department: '所属部门', + departmentName: '部门名称', + status: '状态', + // 启用 + enable: '启用', + // 禁用 + disable: '禁用', + // 上级部门 + superiorDepartment: '上级部门' + }, + menu: { + menuName: '菜单名称', + icon: '图标', + permission: '按钮权限', + component: '组件', + path: '路径', + status: '状态', + hidden: '是否隐藏', + alwaysShow: '是否一直显示', + noCache: '是否清除缓存', + breadcrumb: '是否显示面包屑', + affix: '是否固定在标签页', + noTagsView: '是否隐藏标签页', + activeMenu: '高亮菜单', + canTo: '是否可跳转', + name: '组件名称' + }, + role: { + roleName: '角色名称', + role: '角色', + menu: '菜单分配' + }, + inputPasswordDemo: { + title: '密码输入框', + inputPasswordDes: '基于 ElementPlus 的 Input 组件二次封装' + }, + avatarsDemo: { + title: '头像列表组件,基于element-plus的Avatar组件二次封装' + } +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..d0f08af --- /dev/null +++ b/src/main.ts @@ -0,0 +1,58 @@ +import 'vue/jsx' + +// 引入windi css +import '@/plugins/unocss' + +// 导入全局的svg图标 +import '@/plugins/svgIcon' + +// 初始化多语言 +import { setupI18n } from '@/plugins/vueI18n' + +// 引入状态管理 +import { setupStore } from '@/store' + +// 全局组件 +import { setupGlobCom } from '@/components' + +// 引入element-plus +import { setupElementPlus } from '@/plugins/elementPlus' + +// 引入全局样式 +import '@/styles/index.less' + +// 引入动画 +import '@/plugins/animate.css' + +// 路由 +import { setupRouter } from './router' + +// 权限 +import { setupPermission } from './directives' + +import { createApp } from 'vue' + +import App from './App.vue' + +import './permission' + +// 创建实例 +const setupAll = async () => { + const app = createApp(App) + + await setupI18n(app) + + setupStore(app) + + setupGlobCom(app) + + setupElementPlus(app) + + setupRouter(app) + + setupPermission(app) + + app.mount('#app') +} + +setupAll() diff --git a/src/permission.ts b/src/permission.ts new file mode 100644 index 0000000..a14c3a8 --- /dev/null +++ b/src/permission.ts @@ -0,0 +1,64 @@ +import router from './router' +import { useAppStoreWithOut } from '@/store/modules/app' +import type { RouteRecordRaw } from 'vue-router' +import { useTitle } from '@/hooks/web/useTitle' +import { useNProgress } from '@/hooks/web/useNProgress' +import { usePermissionStoreWithOut } from '@/store/modules/permission' +import { usePageLoading } from '@/hooks/web/usePageLoading' +import { NO_REDIRECT_WHITE_LIST } from '@/constants' +import { useUserStoreWithOut } from '@/store/modules/user' + +const { start, done } = useNProgress() + +const { loadStart, loadDone } = usePageLoading() + +router.beforeEach(async (to, from, next) => { + start() + loadStart() + const permissionStore = usePermissionStoreWithOut() + const appStore = useAppStoreWithOut() + const userStore = useUserStoreWithOut() + if (userStore.getUserInfo) { + if (to.path === '/login') { + next({ path: '/' }) + } else { + if (permissionStore.getIsAddRouters) { + next() + return + } + + // 开发者可根据实际情况进行修改 + const roleRouters = userStore.getRoleRouters || [] + + // 是否使用动态路由 + if (appStore.getDynamicRouter) { + appStore.serverDynamicRouter + ? await permissionStore.generateRoutes('server', roleRouters as AppCustomRouteRecordRaw[]) + : await permissionStore.generateRoutes('frontEnd', roleRouters as string[]) + } else { + await permissionStore.generateRoutes('static') + } + + permissionStore.getAddRouters.forEach((route) => { + router.addRoute(route as unknown as RouteRecordRaw) // 动态添加可访问路由表 + }) + const redirectPath = from.query.redirect || to.path + const redirect = decodeURIComponent(redirectPath as string) + const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect } + permissionStore.setIsAddRouters(true) + next(nextData) + } + } else { + if (NO_REDIRECT_WHITE_LIST.indexOf(to.path) !== -1) { + next() + } else { + next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页 + } + } +}) + +router.afterEach((to) => { + useTitle(to?.meta?.title as string) + done() // 结束Progress + loadDone() +}) diff --git a/src/plugins/animate.css/index.ts b/src/plugins/animate.css/index.ts new file mode 100644 index 0000000..3e93451 --- /dev/null +++ b/src/plugins/animate.css/index.ts @@ -0,0 +1 @@ +import 'animate.css' diff --git a/src/plugins/echarts/index.ts b/src/plugins/echarts/index.ts new file mode 100644 index 0000000..34f756f --- /dev/null +++ b/src/plugins/echarts/index.ts @@ -0,0 +1,41 @@ +import * as echarts from 'echarts/core' + +import { + BarChart, + LineChart, + PieChart, + MapChart, + PictorialBarChart, + RadarChart +} from 'echarts/charts' + +import { + TitleComponent, + TooltipComponent, + GridComponent, + PolarComponent, + AriaComponent, + ParallelComponent, + LegendComponent +} from 'echarts/components' + +import { CanvasRenderer } from 'echarts/renderers' + +echarts.use([ + LegendComponent, + TitleComponent, + TooltipComponent, + GridComponent, + PolarComponent, + AriaComponent, + ParallelComponent, + BarChart, + LineChart, + PieChart, + MapChart, + CanvasRenderer, + PictorialBarChart, + RadarChart +]) + +export default echarts diff --git a/src/plugins/elementPlus/index.ts b/src/plugins/elementPlus/index.ts new file mode 100644 index 0000000..29a7840 --- /dev/null +++ b/src/plugins/elementPlus/index.ts @@ -0,0 +1,24 @@ +import type { App } from 'vue' + +// 需要全局引入一些组件,如ElScrollbar,不然一些下拉项样式有问题 +import { ElLoading, ElScrollbar } from 'element-plus' + +const plugins = [ElLoading] + +const components = [ElScrollbar] + +export const setupElementPlus = (app: App) => { + plugins.forEach((plugin) => { + app.use(plugin) + }) + + // 为了开发环境启动更快,一次性引入所有样式 + if (import.meta.env.VITE_USE_ALL_ELEMENT_PLUS_STYLE === 'true') { + import('element-plus/dist/index.css') + return + } + + components.forEach((component) => { + app.component(component.name!, component) + }) +} diff --git a/src/plugins/svgIcon/index.ts b/src/plugins/svgIcon/index.ts new file mode 100644 index 0000000..1b11e2d --- /dev/null +++ b/src/plugins/svgIcon/index.ts @@ -0,0 +1 @@ +import 'virtual:svg-icons-register' diff --git a/src/plugins/unocss/index.ts b/src/plugins/unocss/index.ts new file mode 100644 index 0000000..d366b5a --- /dev/null +++ b/src/plugins/unocss/index.ts @@ -0,0 +1 @@ +import 'virtual:uno.css' diff --git a/src/plugins/vueI18n/helper.ts b/src/plugins/vueI18n/helper.ts new file mode 100644 index 0000000..da6bc8c --- /dev/null +++ b/src/plugins/vueI18n/helper.ts @@ -0,0 +1,3 @@ +export const setHtmlPageLang = (locale: LocaleType) => { + document.querySelector('html')?.setAttribute('lang', locale) +} diff --git a/src/plugins/vueI18n/index.ts b/src/plugins/vueI18n/index.ts new file mode 100644 index 0000000..f845b13 --- /dev/null +++ b/src/plugins/vueI18n/index.ts @@ -0,0 +1,42 @@ +import type { App } from 'vue' +import { createI18n } from 'vue-i18n' +import { useLocaleStoreWithOut } from '@/store/modules/locale' +import type { I18n, I18nOptions } from 'vue-i18n' +import { setHtmlPageLang } from './helper' + +export let i18n: ReturnType + +const createI18nOptions = async (): Promise => { + const localeStore = useLocaleStoreWithOut() + const locale = localeStore.getCurrentLocale + const localeMap = localeStore.getLocaleMap + const defaultLocal = await import(`../../locales/${locale.lang}.ts`) + const message = defaultLocal.default ?? {} + + setHtmlPageLang(locale.lang) + + localeStore.setCurrentLocale({ + lang: locale.lang + // elLocale: elLocal + }) + + return { + legacy: false, + locale: locale.lang, + fallbackLocale: locale.lang, + messages: { + [locale.lang]: message + }, + availableLocales: localeMap.map((v) => v.lang), + sync: true, + silentTranslationWarn: true, + missingWarn: false, + silentFallbackWarn: true + } +} + +export const setupI18n = async (app: App) => { + const options = await createI18nOptions() + i18n = createI18n(options) as I18n + app.use(i18n) +} diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..e203a01 --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,753 @@ +import { createRouter, createWebHashHistory } from 'vue-router' +import type { RouteRecordRaw } from 'vue-router' +import type { App } from 'vue' +import { Layout, getParentLayout } from '@/utils/routerHelper' +import { useI18n } from '@/hooks/web/useI18n' +import { NO_RESET_WHITE_LIST } from '@/constants' + +const { t } = useI18n() + +export const constantRouterMap: AppRouteRecordRaw[] = [ + { + path: '/', + component: Layout, + redirect: '/dashboard/analysis', + name: 'Root', + meta: { + hidden: true + } + }, + { + path: '/redirect', + component: Layout, + name: 'RedirectWrap', + children: [ + { + path: '/redirect/:path(.*)', + name: 'Redirect', + component: () => import('@/views/Redirect/Redirect.vue'), + meta: {} + } + ], + meta: { + hidden: true, + noTagsView: true + } + }, + { + path: '/login', + component: () => import('@/views/Login/Login.vue'), + name: 'Login', + meta: { + hidden: true, + title: t('router.login'), + noTagsView: true + } + }, + { + path: '/personal', + component: Layout, + redirect: '/personal/personal-center', + name: 'Personal', + meta: { + title: t('router.personal'), + hidden: true, + canTo: true + }, + children: [ + { + path: 'personal-center', + component: () => import('@/views/Personal/PersonalCenter/PersonalCenter.vue'), + name: 'PersonalCenter', + meta: { + title: t('router.personalCenter'), + hidden: true, + canTo: true + } + } + ] + }, + { + path: '/404', + component: () => import('@/views/Error/404.vue'), + name: 'NoFind', + meta: { + hidden: true, + title: '404', + noTagsView: true + } + } +] + +export const asyncRouterMap: AppRouteRecordRaw[] = [ + { + path: '/dashboard', + component: Layout, + redirect: '/dashboard/analysis', + name: 'Dashboard', + meta: { + title: t('router.dashboard'), + icon: 'vi-ant-design:dashboard-filled', + alwaysShow: true + }, + children: [ + { + path: 'analysis', + component: () => import('@/views/Dashboard/Analysis.vue'), + name: 'Analysis', + meta: { + title: t('router.analysis'), + noCache: true, + affix: true + } + }, + { + path: 'workplace', + component: () => import('@/views/Dashboard/Workplace.vue'), + name: 'Workplace', + meta: { + title: t('router.workplace'), + noCache: true + } + } + ] + }, + { + path: '/external-link', + component: Layout, + meta: {}, + name: 'ExternalLink', + children: [ + { + path: 'https://element-plus-admin-doc.cn/', + name: 'DocumentLink', + meta: { + title: t('router.document'), + icon: 'vi-clarity:document-solid' + } + } + ] + }, + { + path: '/guide', + component: Layout, + name: 'Guide', + meta: {}, + children: [ + { + path: 'index', + component: () => import('@/views/Guide/Guide.vue'), + name: 'GuideDemo', + meta: { + title: t('router.guide'), + icon: 'vi-cib:telegram-plane' + } + } + ] + }, + { + path: '/components', + component: Layout, + name: 'ComponentsDemo', + meta: { + title: t('router.component'), + icon: 'vi-bx:bxs-component', + alwaysShow: true + }, + children: [ + { + path: 'form', + component: getParentLayout(), + redirect: '/components/form/default-form', + name: 'Form', + meta: { + title: t('router.form'), + alwaysShow: true + }, + children: [ + { + path: 'default-form', + component: () => import('@/views/Components/Form/DefaultForm.vue'), + name: 'DefaultForm', + meta: { + title: t('router.defaultForm') + } + }, + { + path: 'use-form', + component: () => import('@/views/Components/Form/UseFormDemo.vue'), + name: 'UseForm', + meta: { + title: 'UseForm' + } + } + ] + }, + { + path: 'table', + component: getParentLayout(), + redirect: '/components/table/default-table', + name: 'TableDemo', + meta: { + title: t('router.table'), + alwaysShow: true + }, + children: [ + { + path: 'default-table', + component: () => import('@/views/Components/Table/DefaultTable.vue'), + name: 'DefaultTable', + meta: { + title: t('router.defaultTable') + } + }, + { + path: 'use-table', + component: () => import('@/views/Components/Table/UseTableDemo.vue'), + name: 'UseTable', + meta: { + title: 'UseTable' + } + }, + { + path: 'tree-table', + component: () => import('@/views/Components/Table/TreeTable.vue'), + name: 'TreeTable', + meta: { + title: t('router.treeTable') + } + }, + { + path: 'table-image-preview', + component: () => import('@/views/Components/Table/TableImagePreview.vue'), + name: 'TableImagePreview', + meta: { + title: t('router.PicturePreview') + } + }, + { + path: 'table-video-preview', + component: () => import('@/views/Components/Table/TableVideoPreview.vue'), + name: 'TableVideoPreview', + meta: { + title: t('router.tableVideoPreview') + } + }, + { + path: 'card-table', + component: () => import('@/views/Components/Table/CardTable.vue'), + name: 'CardTable', + meta: { + title: t('router.cardTable') + } + } + ] + }, + { + path: 'editor-demo', + component: getParentLayout(), + redirect: '/components/editor-demo/editor', + name: 'EditorDemo', + meta: { + title: t('router.editor'), + alwaysShow: true + }, + children: [ + { + path: 'editor', + component: () => import('@/views/Components/Editor/Editor.vue'), + name: 'Editor', + meta: { + title: t('router.richText') + } + }, + { + path: 'json-editor', + component: () => import('@/views/Components/Editor/JsonEditor.vue'), + name: 'JsonEditor', + meta: { + title: t('router.jsonEditor') + } + } + ] + }, + { + path: 'search', + component: () => import('@/views/Components/Search.vue'), + name: 'Search', + meta: { + title: t('router.search') + } + }, + { + path: 'descriptions', + component: () => import('@/views/Components/Descriptions.vue'), + name: 'Descriptions', + meta: { + title: t('router.descriptions') + } + }, + { + path: 'image-viewer', + component: () => import('@/views/Components/ImageViewer.vue'), + name: 'ImageViewer', + meta: { + title: t('router.imageViewer') + } + }, + { + path: 'dialog', + component: () => import('@/views/Components/Dialog.vue'), + name: 'Dialog', + meta: { + title: t('router.dialog') + } + }, + { + path: 'icon', + component: () => import('@/views/Components/Icon.vue'), + name: 'Icon', + meta: { + title: t('router.icon') + } + }, + { + path: 'icon-picker', + component: () => import('@/views/Components/IconPicker.vue'), + name: 'IconPicker', + meta: { + title: t('router.iconPicker') + } + }, + { + path: 'echart', + component: () => import('@/views/Components/Echart.vue'), + name: 'Echart', + meta: { + title: t('router.echart') + } + }, + { + path: 'count-to', + component: () => import('@/views/Components/CountTo.vue'), + name: 'CountTo', + meta: { + title: t('router.countTo') + } + }, + { + path: 'qrcode', + component: () => import('@/views/Components/Qrcode.vue'), + name: 'Qrcode', + meta: { + title: t('router.qrcode') + } + }, + { + path: 'highlight', + component: () => import('@/views/Components/Highlight.vue'), + name: 'Highlight', + meta: { + title: t('router.highlight') + } + }, + { + path: 'infotip', + component: () => import('@/views/Components/Infotip.vue'), + name: 'Infotip', + meta: { + title: t('router.infotip') + } + }, + { + path: 'input-password', + component: () => import('@/views/Components/InputPassword.vue'), + name: 'InputPassword', + meta: { + title: t('router.inputPassword') + } + }, + { + path: 'waterfall', + component: () => import('@/views/Components/Waterfall.vue'), + name: 'waterfall', + meta: { + title: t('router.waterfall') + } + }, + { + path: 'image-cropping', + component: () => import('@/views/Components/ImageCropping.vue'), + name: 'ImageCropping', + meta: { + title: t('router.imageCropping') + } + }, + { + path: 'video-player', + component: () => import('@/views/Components/VideoPlayer.vue'), + name: 'VideoPlayer', + meta: { + title: t('router.videoPlayer') + } + }, + { + path: 'avatars', + component: () => import('@/views/Components/Avatars.vue'), + name: 'Avatars', + meta: { + title: t('router.avatars') + } + }, + { + path: 'i-agree', + component: () => import('@/views/Components/IAgree.vue'), + name: 'IAgree', + meta: { + title: t('router.iAgree') + } + } + ] + }, + { + path: '/function', + component: Layout, + redirect: '/function/multipleTabs', + name: 'Function', + meta: { + title: t('router.function'), + icon: 'vi-ri:function-fill', + alwaysShow: true + }, + children: [ + { + path: 'multiple-tabs', + component: () => import('@/views/Function/MultipleTabs.vue'), + name: 'MultipleTabs', + meta: { + title: t('router.multipleTabs') + } + }, + { + path: 'multiple-tabs-demo/:id', + component: () => import('@/views/Function/MultipleTabsDemo.vue'), + name: 'MultipleTabsDemo', + meta: { + hidden: true, + title: t('router.details'), + canTo: true, + activeMenu: '/function/multiple-tabs' + } + }, + { + path: 'request', + component: () => import('@/views/Function/Request.vue'), + name: 'Request', + meta: { + title: t('router.request') + } + }, + { + path: 'test', + component: () => import('@/views/Function/Test.vue'), + name: 'Test', + meta: { + title: t('router.permission'), + permission: ['add', 'edit', 'delete'] + } + } + ] + }, + { + path: '/hooks', + component: Layout, + redirect: '/hooks/useWatermark', + name: 'Hooks', + meta: { + title: 'hooks', + icon: 'vi-ic:outline-webhook', + alwaysShow: true + }, + children: [ + { + path: 'useWatermark', + component: () => import('@/views/hooks/useWatermark.vue'), + name: 'UseWatermark', + meta: { + title: 'useWatermark' + } + }, + { + path: 'useTagsView', + component: () => import('@/views/hooks/useTagsView.vue'), + name: 'UseTagsView', + meta: { + title: 'useTagsView' + } + }, + { + path: 'useValidator', + component: () => import('@/views/hooks/useValidator.vue'), + name: 'UseValidator', + meta: { + title: 'useValidator' + } + }, + { + path: 'useCrudSchemas', + component: () => import('@/views/hooks/useCrudSchemas.vue'), + name: 'UseCrudSchemas', + meta: { + title: 'useCrudSchemas' + } + }, + { + path: 'useClipboard', + component: () => import('@/views/hooks/useClipboard.vue'), + name: 'UseClipboard', + meta: { + title: 'useClipboard' + } + }, + { + path: 'useNetwork', + component: () => import('@/views/hooks/useNetwork.vue'), + name: 'UseNetwork', + meta: { + title: 'useNetwork' + } + } + ] + }, + { + path: '/level', + component: Layout, + redirect: '/level/menu1/menu1-1/menu1-1-1', + name: 'Level', + meta: { + title: t('router.level'), + icon: 'vi-carbon:skill-level-advanced' + }, + children: [ + { + path: 'menu1', + name: 'Menu1', + component: getParentLayout(), + redirect: '/level/menu1/menu1-1/menu1-1-1', + meta: { + title: t('router.menu1') + }, + children: [ + { + path: 'menu1-1', + name: 'Menu11', + component: getParentLayout(), + redirect: '/level/menu1/menu1-1/menu1-1-1', + meta: { + title: t('router.menu11'), + alwaysShow: true + }, + children: [ + { + path: 'menu1-1-1', + name: 'Menu111', + component: () => import('@/views/Level/Menu111.vue'), + meta: { + title: t('router.menu111') + } + } + ] + }, + { + path: 'menu1-2', + name: 'Menu12', + component: () => import('@/views/Level/Menu12.vue'), + meta: { + title: t('router.menu12') + } + } + ] + }, + { + path: 'menu2', + name: 'Menu2', + component: () => import('@/views/Level/Menu2.vue'), + meta: { + title: t('router.menu2') + } + } + ] + }, + { + path: '/example', + component: Layout, + redirect: '/example/example-dialog', + name: 'Example', + meta: { + title: t('router.example'), + icon: 'vi-ep:management', + alwaysShow: true + }, + children: [ + { + path: 'example-dialog', + component: () => import('@/views/Example/Dialog/ExampleDialog.vue'), + name: 'ExampleDialog', + meta: { + title: t('router.exampleDialog') + } + }, + { + path: 'example-page', + component: () => import('@/views/Example/Page/ExamplePage.vue'), + name: 'ExamplePage', + meta: { + title: t('router.examplePage') + } + }, + { + path: 'example-add', + component: () => import('@/views/Example/Page/ExampleAdd.vue'), + name: 'ExampleAdd', + meta: { + title: t('router.exampleAdd'), + noTagsView: true, + noCache: true, + hidden: true, + canTo: true, + activeMenu: '/example/example-page' + } + }, + { + path: 'example-edit', + component: () => import('@/views/Example/Page/ExampleEdit.vue'), + name: 'ExampleEdit', + meta: { + title: t('router.exampleEdit'), + noTagsView: true, + noCache: true, + hidden: true, + canTo: true, + activeMenu: '/example/example-page' + } + }, + { + path: 'example-detail', + component: () => import('@/views/Example/Page/ExampleDetail.vue'), + name: 'ExampleDetail', + meta: { + title: t('router.exampleDetail'), + noTagsView: true, + noCache: true, + hidden: true, + canTo: true, + activeMenu: '/example/example-page' + } + } + ] + }, + { + path: '/error', + component: Layout, + redirect: '/error/404', + name: 'Error', + meta: { + title: t('router.errorPage'), + icon: 'vi-ci:error', + alwaysShow: true + }, + children: [ + { + path: '404-demo', + component: () => import('@/views/Error/404.vue'), + name: '404Demo', + meta: { + title: '404' + } + }, + { + path: '403-demo', + component: () => import('@/views/Error/403.vue'), + name: '403Demo', + meta: { + title: '403' + } + }, + { + path: '500-demo', + component: () => import('@/views/Error/500.vue'), + name: '500Demo', + meta: { + title: '500' + } + } + ] + }, + { + path: '/authorization', + component: Layout, + redirect: '/authorization/user', + name: 'Authorization', + meta: { + title: t('router.authorization'), + icon: 'vi-eos-icons:role-binding', + alwaysShow: true + }, + children: [ + { + path: 'department', + component: () => import('@/views/Authorization/Department/Department.vue'), + name: 'Department', + meta: { + title: t('router.department') + } + }, + { + path: 'user', + component: () => import('@/views/Authorization/User/User.vue'), + name: 'User', + meta: { + title: t('router.user') + } + }, + { + path: 'menu', + component: () => import('@/views/Authorization/Menu/Menu.vue'), + name: 'Menu', + meta: { + title: t('router.menuManagement') + } + }, + { + path: 'role', + component: () => import('@/views/Authorization/Role/Role.vue'), + name: 'Role', + meta: { + title: t('router.role') + } + } + ] + } +] + +const router = createRouter({ + history: createWebHashHistory(), + strict: true, + routes: constantRouterMap as RouteRecordRaw[], + scrollBehavior: () => ({ left: 0, top: 0 }) +}) + +export const resetRouter = (): void => { + router.getRoutes().forEach((route) => { + const { name } = route + if (name && !NO_RESET_WHITE_LIST.includes(name as string)) { + router.hasRoute(name) && router.removeRoute(name) + } + }) +} + +export const setupRouter = (app: App) => { + app.use(router) +} + +export default router diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 0000000..ee92ca8 --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1,13 @@ +import type { App } from 'vue' +import { createPinia } from 'pinia' +import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' + +const store = createPinia() + +store.use(piniaPluginPersistedstate) + +export const setupStore = (app: App) => { + app.use(store) +} + +export { store } diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts new file mode 100644 index 0000000..9a295fb --- /dev/null +++ b/src/store/modules/app.ts @@ -0,0 +1,340 @@ +import { defineStore } from 'pinia' +import { store } from '../index' +import { setCssVar, humpToUnderline } from '@/utils' +import { colorIsDark, hexToRGB, lighten, mix } from '@/utils/color' +import { ElMessage, ComponentSize } from 'element-plus' +import { useCssVar } from '@vueuse/core' +import { unref } from 'vue' +import { useDark } from '@vueuse/core' + +interface AppState { + breadcrumb: boolean + breadcrumbIcon: boolean + collapse: boolean + uniqueOpened: boolean + hamburger: boolean + screenfull: boolean + size: boolean + locale: boolean + tagsView: boolean + tagsViewIcon: boolean + logo: boolean + fixedHeader: boolean + greyMode: boolean + dynamicRouter: boolean + serverDynamicRouter: boolean + pageLoading: boolean + layout: LayoutType + title: string + isDark: boolean + currentSize: ComponentSize + sizeMap: ComponentSize[] + mobile: boolean + footer: boolean + theme: ThemeTypes + fixedMenu: boolean +} + +export const useAppStore = defineStore('app', { + state: (): AppState => { + return { + sizeMap: ['default', 'large', 'small'], + mobile: false, // 是否是移动端 + title: import.meta.env.VITE_APP_TITLE, // 标题 + pageLoading: false, // 路由跳转loading + breadcrumb: true, // 面包屑 + breadcrumbIcon: true, // 面包屑图标 + collapse: false, // 折叠菜单 + uniqueOpened: false, // 是否只保持一个子菜单的展开 + hamburger: true, // 折叠图标 + screenfull: true, // 全屏图标 + size: true, // 尺寸图标 + locale: true, // 多语言图标 + tagsView: true, // 标签页 + tagsViewIcon: true, // 是否显示标签图标 + logo: true, // logo + fixedHeader: true, // 固定toolheader + footer: true, // 显示页脚 + greyMode: false, // 是否开始灰色模式,用于特殊悼念日 + dynamicRouter: true, // 是否动态路由 + serverDynamicRouter: true, // 是否服务端渲染动态路由 + fixedMenu: false, // 是否固定菜单 + + layout: 'classic', // layout布局 + isDark: false, // 是否是暗黑模式 + currentSize: 'default', // 组件尺寸 + theme: { + // 主题色 + elColorPrimary: '#409eff', + // 左侧菜单边框颜色 + leftMenuBorderColor: 'inherit', + // 左侧菜单背景颜色 + leftMenuBgColor: '#001529', + // 左侧菜单浅色背景颜色 + leftMenuBgLightColor: '#0f2438', + // 左侧菜单选中背景颜色 + leftMenuBgActiveColor: 'var(--el-color-primary)', + // 左侧菜单收起选中背景颜色 + leftMenuCollapseBgActiveColor: 'var(--el-color-primary)', + // 左侧菜单字体颜色 + leftMenuTextColor: '#bfcbd9', + // 左侧菜单选中字体颜色 + leftMenuTextActiveColor: '#fff', + // logo字体颜色 + logoTitleTextColor: '#fff', + // logo边框颜色 + logoBorderColor: 'inherit', + // 头部背景颜色 + topHeaderBgColor: '#fff', + // 头部字体颜色 + topHeaderTextColor: 'inherit', + // 头部悬停颜色 + topHeaderHoverColor: '#f6f6f6', + // 头部边框颜色 + topToolBorderColor: '#eee' + } + } + }, + getters: { + getBreadcrumb(): boolean { + return this.breadcrumb + }, + getBreadcrumbIcon(): boolean { + return this.breadcrumbIcon + }, + getCollapse(): boolean { + return this.collapse + }, + getUniqueOpened(): boolean { + return this.uniqueOpened + }, + getHamburger(): boolean { + return this.hamburger + }, + getScreenfull(): boolean { + return this.screenfull + }, + getSize(): boolean { + return this.size + }, + getLocale(): boolean { + return this.locale + }, + getTagsView(): boolean { + return this.tagsView + }, + getTagsViewIcon(): boolean { + return this.tagsViewIcon + }, + getLogo(): boolean { + return this.logo + }, + getFixedHeader(): boolean { + return this.fixedHeader + }, + getGreyMode(): boolean { + return this.greyMode + }, + getDynamicRouter(): boolean { + return this.dynamicRouter + }, + getServerDynamicRouter(): boolean { + return this.serverDynamicRouter + }, + getFixedMenu(): boolean { + return this.fixedMenu + }, + getPageLoading(): boolean { + return this.pageLoading + }, + getLayout(): LayoutType { + return this.layout + }, + getTitle(): string { + return this.title + }, + getIsDark(): boolean { + return this.isDark + }, + getCurrentSize(): ComponentSize { + return this.currentSize + }, + getSizeMap(): ComponentSize[] { + return this.sizeMap + }, + getMobile(): boolean { + return this.mobile + }, + getTheme(): ThemeTypes { + return this.theme + }, + getFooter(): boolean { + return this.footer + } + }, + actions: { + setBreadcrumb(breadcrumb: boolean) { + this.breadcrumb = breadcrumb + }, + setBreadcrumbIcon(breadcrumbIcon: boolean) { + this.breadcrumbIcon = breadcrumbIcon + }, + setCollapse(collapse: boolean) { + this.collapse = collapse + }, + setUniqueOpened(uniqueOpened: boolean) { + this.uniqueOpened = uniqueOpened + }, + setHamburger(hamburger: boolean) { + this.hamburger = hamburger + }, + setScreenfull(screenfull: boolean) { + this.screenfull = screenfull + }, + setSize(size: boolean) { + this.size = size + }, + setLocale(locale: boolean) { + this.locale = locale + }, + setTagsView(tagsView: boolean) { + this.tagsView = tagsView + }, + setTagsViewIcon(tagsViewIcon: boolean) { + this.tagsViewIcon = tagsViewIcon + }, + setLogo(logo: boolean) { + this.logo = logo + }, + setFixedHeader(fixedHeader: boolean) { + this.fixedHeader = fixedHeader + }, + setGreyMode(greyMode: boolean) { + this.greyMode = greyMode + }, + setDynamicRouter(dynamicRouter: boolean) { + this.dynamicRouter = dynamicRouter + }, + setServerDynamicRouter(serverDynamicRouter: boolean) { + this.serverDynamicRouter = serverDynamicRouter + }, + setFixedMenu(fixedMenu: boolean) { + this.fixedMenu = fixedMenu + }, + setPageLoading(pageLoading: boolean) { + this.pageLoading = pageLoading + }, + setLayout(layout: LayoutType) { + if (this.mobile && layout !== 'classic') { + ElMessage.warning('移动端模式下不支持切换其它布局') + return + } + this.layout = layout + }, + setTitle(title: string) { + this.title = title + }, + setIsDark(isDark: boolean) { + this.isDark = isDark + if (this.isDark) { + document.documentElement.classList.add('dark') + document.documentElement.classList.remove('light') + } else { + document.documentElement.classList.add('light') + document.documentElement.classList.remove('dark') + } + this.setPrimaryLight() + }, + setCurrentSize(currentSize: ComponentSize) { + this.currentSize = currentSize + }, + setMobile(mobile: boolean) { + this.mobile = mobile + }, + setTheme(theme: ThemeTypes) { + this.theme = Object.assign(this.theme, theme) + }, + setCssVarTheme() { + for (const key in this.theme) { + setCssVar(`--${humpToUnderline(key)}`, this.theme[key]) + } + this.setPrimaryLight() + }, + setFooter(footer: boolean) { + this.footer = footer + }, + setPrimaryLight() { + if (this.theme.elColorPrimary) { + const elColorPrimary = this.theme.elColorPrimary + const color = this.isDark ? '#000000' : '#ffffff' + const lightList = [3, 5, 7, 8, 9] + lightList.forEach((v) => { + setCssVar(`--el-color-primary-light-${v}`, mix(color, elColorPrimary, v / 10)) + }) + setCssVar(`--el-color-primary-dark-2`, mix(color, elColorPrimary, 0.2)) + } + }, + setMenuTheme(color: string) { + const primaryColor = useCssVar('--el-color-primary', document.documentElement) + const isDarkColor = colorIsDark(color) + const theme: Recordable = { + // 左侧菜单边框颜色 + leftMenuBorderColor: isDarkColor ? 'inherit' : '#eee', + // 左侧菜单背景颜色 + leftMenuBgColor: color, + // 左侧菜单浅色背景颜色 + leftMenuBgLightColor: isDarkColor ? lighten(color!, 6) : color, + // 左侧菜单选中背景颜色 + leftMenuBgActiveColor: isDarkColor + ? 'var(--el-color-primary)' + : hexToRGB(unref(primaryColor) as string, 0.1), + // 左侧菜单收起选中背景颜色 + leftMenuCollapseBgActiveColor: isDarkColor + ? 'var(--el-color-primary)' + : hexToRGB(unref(primaryColor) as string, 0.1), + // 左侧菜单字体颜色 + leftMenuTextColor: isDarkColor ? '#bfcbd9' : '#333', + // 左侧菜单选中字体颜色 + leftMenuTextActiveColor: isDarkColor ? '#fff' : 'var(--el-color-primary)', + // logo字体颜色 + logoTitleTextColor: isDarkColor ? '#fff' : 'inherit', + // logo边框颜色 + logoBorderColor: isDarkColor ? color : '#eee' + } + this.setTheme(theme) + this.setCssVarTheme() + }, + setHeaderTheme(color: string) { + const isDarkColor = colorIsDark(color) + const textColor = isDarkColor ? '#fff' : 'inherit' + const textHoverColor = isDarkColor ? lighten(color!, 6) : '#f6f6f6' + const topToolBorderColor = isDarkColor ? color : '#eee' + setCssVar('--top-header-bg-color', color) + setCssVar('--top-header-text-color', textColor) + setCssVar('--top-header-hover-color', textHoverColor) + this.setTheme({ + topHeaderBgColor: color, + topHeaderTextColor: textColor, + topHeaderHoverColor: textHoverColor, + topToolBorderColor + }) + if (this.getLayout === 'top') { + this.setMenuTheme(color) + } + }, + initTheme() { + const isDark = useDark({ + valueDark: 'dark', + valueLight: 'light' + }) + isDark.value = this.getIsDark + const newTitle = import.meta.env.VITE_APP_TITLE + newTitle !== this.getTitle && this.setTitle(newTitle) + } + }, + persist: true +}) + +export const useAppStoreWithOut = () => { + return useAppStore(store) +} diff --git a/src/store/modules/locale.ts b/src/store/modules/locale.ts new file mode 100644 index 0000000..8d2ba35 --- /dev/null +++ b/src/store/modules/locale.ts @@ -0,0 +1,59 @@ +import { defineStore } from 'pinia' +import { store } from '../index' +import zhCn from 'element-plus/es/locale/lang/zh-cn' +import en from 'element-plus/es/locale/lang/en' +import { useStorage } from '@/hooks/web/useStorage' +import { LocaleDropdownType } from '@/components/LocaleDropdown' + +const { getStorage, setStorage } = useStorage('localStorage') + +const elLocaleMap = { + 'zh-CN': zhCn, + en: en +} +interface LocaleState { + currentLocale: LocaleDropdownType + localeMap: LocaleDropdownType[] +} + +export const useLocaleStore = defineStore('locales', { + state: (): LocaleState => { + return { + currentLocale: { + lang: getStorage('lang') || 'zh-CN', + elLocale: elLocaleMap[getStorage('lang') || 'zh-CN'] + }, + // 多语言 + localeMap: [ + { + lang: 'zh-CN', + name: '简体中文' + }, + { + lang: 'en', + name: 'English' + } + ] + } + }, + getters: { + getCurrentLocale(): LocaleDropdownType { + return this.currentLocale + }, + getLocaleMap(): LocaleDropdownType[] { + return this.localeMap + } + }, + actions: { + setCurrentLocale(localeMap: LocaleDropdownType) { + // this.locale = Object.assign(this.locale, localeMap) + this.currentLocale.lang = localeMap?.lang + this.currentLocale.elLocale = elLocaleMap[localeMap?.lang] + setStorage('lang', localeMap?.lang) + } + } +}) + +export const useLocaleStoreWithOut = () => { + return useLocaleStore(store) +} diff --git a/src/store/modules/lock.ts b/src/store/modules/lock.ts new file mode 100644 index 0000000..70ff87f --- /dev/null +++ b/src/store/modules/lock.ts @@ -0,0 +1,48 @@ +import { defineStore } from 'pinia' +import { store } from '../index' + +interface lockInfo { + isLock?: boolean + password?: string +} + +interface LockState { + lockInfo: lockInfo +} + +export const useLockStore = defineStore('lock', { + state: (): LockState => { + return { + lockInfo: { + // isLock: false, // 是否锁定屏幕 + // password: '' // 锁屏密码 + } + } + }, + getters: { + getLockInfo(): lockInfo { + return this.lockInfo + } + }, + actions: { + setLockInfo(lockInfo: lockInfo) { + this.lockInfo = lockInfo + }, + resetLockInfo() { + this.lockInfo = {} + }, + unLock(password: string) { + if (this.lockInfo?.password === password) { + this.resetLockInfo() + return true + } else { + return false + } + } + }, + persist: true +}) + +export const useLockStoreWithOut = () => { + return useLockStore(store) +} diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts new file mode 100644 index 0000000..5d48cce --- /dev/null +++ b/src/store/modules/permission.ts @@ -0,0 +1,104 @@ +import { defineStore } from 'pinia' +import { asyncRouterMap, constantRouterMap } from '@/router' +import { + generateRoutesByFrontEnd, + generateRoutesByServer, + flatMultiLevelRoutes +} from '@/utils/routerHelper' +import { store } from '../index' +import { cloneDeep } from 'lodash-es' + +export interface PermissionState { + routers: AppRouteRecordRaw[] + addRouters: AppRouteRecordRaw[] + isAddRouters: boolean + menuTabRouters: AppRouteRecordRaw[] +} + +export const usePermissionStore = defineStore('permission', { + state: (): PermissionState => ({ + routers: [], + addRouters: [], + isAddRouters: false, + menuTabRouters: [] + }), + getters: { + getRouters(): AppRouteRecordRaw[] { + return this.routers + }, + getAddRouters(): AppRouteRecordRaw[] { + return flatMultiLevelRoutes(cloneDeep(this.addRouters)) + }, + getIsAddRouters(): boolean { + return this.isAddRouters + }, + getMenuTabRouters(): AppRouteRecordRaw[] { + return this.menuTabRouters + } + }, + actions: { + generateRoutes( + type: 'server' | 'frontEnd' | 'static', + routers?: AppCustomRouteRecordRaw[] | string[] + ): Promise { + return new Promise((resolve) => { + let routerMap: AppRouteRecordRaw[] = [] + if (type === 'server') { + // 模拟后端过滤菜单 + routerMap = generateRoutesByServer(routers as AppCustomRouteRecordRaw[]) + } else if (type === 'frontEnd') { + // 模拟前端过滤菜单 + routerMap = generateRoutesByFrontEnd(cloneDeep(asyncRouterMap), routers as string[]) + } else { + // 直接读取静态路由表 + routerMap = cloneDeep(asyncRouterMap) + } + // 动态路由,404一定要放到最后面 + // 如果路由生成结果为空(例如后端返回空路由),为了避免只剩通配符导致所有页面都走 404, + // 在没有明确权限路由的情况下回退到静态路由表 `asyncRouterMap` 作为兜底。 + if (routerMap.length === 0) { + routerMap = cloneDeep(asyncRouterMap) + } + + this.addRouters = routerMap.concat([ + { + path: '/:path(.*)*', + redirect: '/404', + name: '404Page', + meta: { + hidden: true, + breadcrumb: false + } + } + ]) + // 渲染菜单的所有路由 + this.routers = cloneDeep(constantRouterMap).concat(routerMap) + resolve() + }) + }, + setIsAddRouters(state: boolean): void { + this.isAddRouters = state + }, + setMenuTabRouters(routers: AppRouteRecordRaw[]): void { + this.menuTabRouters = routers + } + }, + persist: [ + { + pick: ['routers'], + storage: localStorage + }, + { + pick: ['addRouters'], + storage: localStorage + }, + { + pick: ['menuTabRouters'], + storage: localStorage + } + ] +}) + +export const usePermissionStoreWithOut = () => { + return usePermissionStore(store) +} diff --git a/src/store/modules/tagsView.ts b/src/store/modules/tagsView.ts new file mode 100644 index 0000000..d07a439 --- /dev/null +++ b/src/store/modules/tagsView.ts @@ -0,0 +1,163 @@ +import router from '@/router' +import type { RouteLocationNormalizedLoaded } from 'vue-router' +import { getRawRoute } from '@/utils/routerHelper' +import { defineStore } from 'pinia' +import { store } from '../index' +import { findIndex } from '@/utils' +import { useUserStoreWithOut } from './user' + +export interface TagsViewState { + visitedViews: RouteLocationNormalizedLoaded[] + cachedViews: Set + selectedTag?: RouteLocationNormalizedLoaded +} + +export const useTagsViewStore = defineStore('tagsView', { + state: (): TagsViewState => ({ + visitedViews: [], + cachedViews: new Set(), + selectedTag: undefined + }), + getters: { + getVisitedViews(): RouteLocationNormalizedLoaded[] { + return this.visitedViews + }, + getCachedViews(): string[] { + return Array.from(this.cachedViews) + }, + getSelectedTag(): RouteLocationNormalizedLoaded | undefined { + return this.selectedTag + } + }, + actions: { + // 新增缓存和tag + addView(view: RouteLocationNormalizedLoaded): void { + this.addVisitedView(view) + this.addCachedView() + }, + // 新增tag + addVisitedView(view: RouteLocationNormalizedLoaded) { + if (this.visitedViews.some((v) => v.path === view.path)) return + if (view.meta?.noTagsView) return + this.visitedViews.push( + Object.assign({}, view, { + title: view.meta?.title || 'no-name' + }) + ) + }, + // 新增缓存 + addCachedView() { + const cacheMap: Set = new Set() + for (const v of this.visitedViews) { + const item = getRawRoute(v) + const needCache = !item?.meta?.noCache + if (!needCache) { + continue + } + const name = item.name as string + cacheMap.add(name) + } + if (Array.from(this.cachedViews).sort().toString() === Array.from(cacheMap).sort().toString()) + return + this.cachedViews = cacheMap + }, + // 删除某个 + delView(view: RouteLocationNormalizedLoaded) { + this.delVisitedView(view) + this.addCachedView() + }, + // 删除tag + delVisitedView(view: RouteLocationNormalizedLoaded) { + for (const [i, v] of this.visitedViews.entries()) { + if (v.path === view.path) { + this.visitedViews.splice(i, 1) + break + } + } + }, + // 删除缓存 + delCachedView() { + const route = router.currentRoute.value + const index = findIndex(this.getCachedViews, (v) => v === route.name) + if (index > -1) { + this.cachedViews.delete(this.getCachedViews[index]) + } + }, + // 删除所有缓存和tag + delAllViews() { + this.delAllVisitedViews() + this.addCachedView() + }, + // 删除所有tag + delAllVisitedViews() { + const userStore = useUserStoreWithOut() + + // const affixTags = this.visitedViews.filter((tag) => tag.meta.affix) + this.visitedViews = userStore.getUserInfo + ? this.visitedViews.filter((tag) => tag?.meta?.affix) + : [] + }, + // 删除其它 + delOthersViews(view: RouteLocationNormalizedLoaded) { + this.delOthersVisitedViews(view) + this.addCachedView() + }, + // 删除其它tag + delOthersVisitedViews(view: RouteLocationNormalizedLoaded) { + this.visitedViews = this.visitedViews.filter((v) => { + return v?.meta?.affix || v.path === view.path + }) + }, + // 删除左侧 + delLeftViews(view: RouteLocationNormalizedLoaded) { + const index = findIndex( + this.visitedViews, + (v) => v.path === view.path + ) + if (index > -1) { + this.visitedViews = this.visitedViews.filter((v, i) => { + return v?.meta?.affix || v.path === view.path || i > index + }) + this.addCachedView() + } + }, + // 删除右侧 + delRightViews(view: RouteLocationNormalizedLoaded) { + const index = findIndex( + this.visitedViews, + (v) => v.path === view.path + ) + if (index > -1) { + this.visitedViews = this.visitedViews.filter((v, i) => { + return v?.meta?.affix || v.path === view.path || i < index + }) + this.addCachedView() + } + }, + updateVisitedView(view: RouteLocationNormalizedLoaded) { + for (let v of this.visitedViews) { + if (v.path === view.path) { + v = Object.assign(v, view) + break + } + } + }, + // 设置当前选中的tag + setSelectedTag(tag: RouteLocationNormalizedLoaded) { + this.selectedTag = tag + }, + setTitle(title: string, path?: string) { + for (const v of this.visitedViews) { + if (v.path === (path ?? this.selectedTag?.path)) { + v.meta.title = title + break + } + } + } + }, + persist: false +}) + +export const useTagsViewStoreWithOut = () => { + return useTagsViewStore(store) +} diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts new file mode 100644 index 0000000..b29a2b7 --- /dev/null +++ b/src/store/modules/user.ts @@ -0,0 +1,102 @@ +import { defineStore } from 'pinia' +import { store } from '../index' +import { UserLoginType, UserType } from '@/api/login/types' +import { ElMessageBox } from 'element-plus' +import { useI18n } from '@/hooks/web/useI18n' +import { loginOutApi } from '@/api/login' +import { useTagsViewStore } from './tagsView' +import router from '@/router' + +interface UserState { + userInfo?: UserType + tokenKey: string + token: string + roleRouters?: string[] | AppCustomRouteRecordRaw[] + rememberMe: boolean + loginInfo?: UserLoginType +} + +export const useUserStore = defineStore('user', { + state: (): UserState => { + return { + userInfo: undefined, + tokenKey: 'Authorization', + token: '', + roleRouters: undefined, + // 记住我 + rememberMe: true, + loginInfo: undefined + } + }, + getters: { + getTokenKey(): string { + return this.tokenKey + }, + getToken(): string { + return this.token + }, + getUserInfo(): UserType | undefined { + return this.userInfo + }, + getRoleRouters(): string[] | AppCustomRouteRecordRaw[] | undefined { + return this.roleRouters + }, + getRememberMe(): boolean { + return this.rememberMe + }, + getLoginInfo(): UserLoginType | undefined { + return this.loginInfo + } + }, + actions: { + setTokenKey(tokenKey: string) { + this.tokenKey = tokenKey + }, + setToken(token: string) { + this.token = token + }, + setUserInfo(userInfo?: UserType) { + this.userInfo = userInfo + }, + setRoleRouters(roleRouters: string[] | AppCustomRouteRecordRaw[]) { + this.roleRouters = roleRouters + }, + logoutConfirm() { + const { t } = useI18n() + ElMessageBox.confirm(t('common.loginOutMessage'), t('common.reminder'), { + confirmButtonText: t('common.ok'), + cancelButtonText: t('common.cancel'), + type: 'warning' + }) + .then(async () => { + const res = await loginOutApi().catch(() => {}) + if (res) { + this.reset() + } + }) + .catch(() => {}) + }, + reset() { + const tagsViewStore = useTagsViewStore() + tagsViewStore.delAllViews() + this.setToken('') + this.setUserInfo(undefined) + this.setRoleRouters([]) + router.replace('/login') + }, + logout() { + this.reset() + }, + setRememberMe(rememberMe: boolean) { + this.rememberMe = rememberMe + }, + setLoginInfo(loginInfo: UserLoginType | undefined) { + this.loginInfo = loginInfo + } + }, + persist: true +}) + +export const useUserStoreWithOut = () => { + return useUserStore(store) +} diff --git a/src/styles/index.less b/src/styles/index.less new file mode 100644 index 0000000..6825d70 --- /dev/null +++ b/src/styles/index.less @@ -0,0 +1,7 @@ +@import './var.css'; +@import 'element-plus/theme-chalk/dark/css-vars.css'; + +// 解决抽屉弹出时,body宽度变化的问题 +.el-popup-parent--hidden { + width: 100% !important; +} diff --git a/src/styles/var.css b/src/styles/var.css new file mode 100644 index 0000000..fb869ec --- /dev/null +++ b/src/styles/var.css @@ -0,0 +1,69 @@ +:root { + --login-bg-color: #293146; + + /* left menu start */ + --left-menu-max-width: 200px; + + --left-menu-min-width: 64px; + + --left-menu-bg-color: #001529; + + --left-menu-bg-light-color: #0f2438; + + --left-menu-bg-active-color: var(--el-color-primary); + + --left-menu-text-color: #bfcbd9; + + --left-menu-text-active-color: #fff; + + --left-menu-collapse-bg-active-color: var(--el-color-primary); + /* left menu end */ + + /* logo start */ + --logo-height: 50px; + + --logo-title-text-color: #fff; + /* logo end */ + + /* header start */ + --top-header-bg-color: '#fff'; + + --top-header-text-color: 'inherit'; + + --top-header-hover-color: #f6f6f6; + + --top-tool-height: var(--logo-height); + + --top-tool-p-x: 0; + + --tags-view-height: 35px; + /* header start */ + + /* tab menu start */ + --tab-menu-max-width: 80px; + + --tab-menu-min-width: 30px; + + --tab-menu-collapse-height: 36px; + /* tab menu end */ + + --app-content-padding: 20px; + + --app-content-bg-color: #f5f7f9; + + --app-footer-height: 50px; + + --transition-time-02: 0.2s; +} + +.dark { + --app-content-bg-color: var(--el-bg-color); +} + +*, +:after, +:before { + margin: 0; + padding: 0; + box-sizing: border-box; +} diff --git a/src/styles/variables.module.less b/src/styles/variables.module.less new file mode 100644 index 0000000..a773269 --- /dev/null +++ b/src/styles/variables.module.less @@ -0,0 +1,10 @@ +// 命名空间 +@adminNamespace: v; +// el命名空间 +@elNamespace: el; + +// 导出变量 +:export { + namespace: @adminNamespace; + elNamespace: @elNamespace; +} diff --git a/src/utils/color.ts b/src/utils/color.ts new file mode 100644 index 0000000..387ffc6 --- /dev/null +++ b/src/utils/color.ts @@ -0,0 +1,172 @@ +/** + * 判断是否 十六进制颜色值. + * 输入形式可为 #fff000 #f00 + * + * @param String color 十六进制颜色值 + * @return Boolean + */ +export const isHexColor = (color: string) => { + const reg = /^#([0-9a-fA-F]{3}|[0-9a-fA-f]{6})$/ + return reg.test(color) +} + +/** + * RGB 颜色值转换为 十六进制颜色值. + * r, g, 和 b 需要在 [0, 255] 范围内 + * + * @return String 类似#ff00ff + * @param r + * @param g + * @param b + */ +export const rgbToHex = (r: number, g: number, b: number) => { + // tslint:disable-next-line:no-bitwise + const hex = ((r << 16) | (g << 8) | b).toString(16) + return '#' + new Array(Math.abs(hex.length - 7)).join('0') + hex +} + +/** + * Transform a HEX color to its RGB representation + * @param {string} hex The color to transform + * @returns The RGB representation of the passed color + */ +export const hexToRGB = (hex: string, opacity?: number) => { + let sHex = hex.toLowerCase() + if (isHexColor(hex)) { + if (sHex.length === 4) { + let sColorNew = '#' + for (let i = 1; i < 4; i += 1) { + sColorNew += sHex.slice(i, i + 1).concat(sHex.slice(i, i + 1)) + } + sHex = sColorNew + } + const sColorChange: number[] = [] + for (let i = 1; i < 7; i += 2) { + sColorChange.push(parseInt('0x' + sHex.slice(i, i + 2))) + } + return opacity + ? 'RGBA(' + sColorChange.join(',') + ',' + opacity + ')' + : 'RGB(' + sColorChange.join(',') + ')' + } + return sHex +} + +export const colorIsDark = (color: string) => { + if (!isHexColor(color)) return + const [r, g, b] = hexToRGB(color) + .replace(/(?:\(|\)|rgb|RGB)*/g, '') + .split(',') + .map((item) => Number(item)) + return r * 0.299 + g * 0.578 + b * 0.114 < 192 +} + +/** + * Darkens a HEX color given the passed percentage + * @param {string} color The color to process + * @param {number} amount The amount to change the color by + * @returns {string} The HEX representation of the processed color + */ +export const darken = (color: string, amount: number) => { + color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color + amount = Math.trunc((255 * amount) / 100) + return `#${subtractLight(color.substring(0, 2), amount)}${subtractLight( + color.substring(2, 4), + amount + )}${subtractLight(color.substring(4, 6), amount)}` +} + +/** + * Lightens a 6 char HEX color according to the passed percentage + * @param {string} color The color to change + * @param {number} amount The amount to change the color by + * @returns {string} The processed color represented as HEX + */ +export const lighten = (color: string, amount: number) => { + color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color + amount = Math.trunc((255 * amount) / 100) + return `#${addLight(color.substring(0, 2), amount)}${addLight( + color.substring(2, 4), + amount + )}${addLight(color.substring(4, 6), amount)}` +} + +/* Suma el porcentaje indicado a un color (RR, GG o BB) hexadecimal para aclararlo */ +/** + * Sums the passed percentage to the R, G or B of a HEX color + * @param {string} color The color to change + * @param {number} amount The amount to change the color by + * @returns {string} The processed part of the color + */ +const addLight = (color: string, amount: number) => { + const cc = parseInt(color, 16) + amount + const c = cc > 255 ? 255 : cc + return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}` +} + +/** + * Calculates luminance of an rgb color + * @param {number} r red + * @param {number} g green + * @param {number} b blue + */ +const luminanace = (r: number, g: number, b: number) => { + const a = [r, g, b].map((v) => { + v /= 255 + return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4) + }) + return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722 +} + +/** + * Calculates contrast between two rgb colors + * @param {string} rgb1 rgb color 1 + * @param {string} rgb2 rgb color 2 + */ +const contrast = (rgb1: string[], rgb2: number[]) => { + return ( + (luminanace(~~rgb1[0], ~~rgb1[1], ~~rgb1[2]) + 0.05) / + (luminanace(rgb2[0], rgb2[1], rgb2[2]) + 0.05) + ) +} + +/** + * Determines what the best text color is (black or white) based con the contrast with the background + * @param hexColor - Last selected color by the user + */ +export const calculateBestTextColor = (hexColor: string) => { + const rgbColor = hexToRGB(hexColor.substring(1)) + const contrastWithBlack = contrast(rgbColor.split(','), [0, 0, 0]) + + return contrastWithBlack >= 12 ? '#000000' : '#FFFFFF' +} + +/** + * Subtracts the indicated percentage to the R, G or B of a HEX color + * @param {string} color The color to change + * @param {number} amount The amount to change the color by + * @returns {string} The processed part of the color + */ +const subtractLight = (color: string, amount: number) => { + const cc = parseInt(color, 16) - amount + const c = cc < 0 ? 0 : cc + return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}` +} + +/** + * Mixes two colors. + * + * @param {string} color1 - The first color, should be a 6-digit hexadecimal color code starting with `#`. + * @param {string} color2 - The second color, should be a 6-digit hexadecimal color code starting with `#`. + * @param {number} [weight=0.5] - The weight of color1 in the mix, should be a number between 0 and 1, where 0 represents 100% of color2, and 1 represents 100% of color1. + * @returns {string} The mixed color, a 6-digit hexadecimal color code starting with `#`. + */ +export const mix = (color1: string, color2: string, weight: number = 0.5): string => { + let color = '#' + for (let i = 0; i <= 2; i++) { + const c1 = parseInt(color1.substring(1 + i * 2, 3 + i * 2), 16) + const c2 = parseInt(color2.substring(1 + i * 2, 3 + i * 2), 16) + const c = Math.round(c1 * weight + c2 * (1 - weight)) + color += c.toString(16).padStart(2, '0') + } + return color +} diff --git a/src/utils/dateUtil.ts b/src/utils/dateUtil.ts new file mode 100644 index 0000000..36b87e3 --- /dev/null +++ b/src/utils/dateUtil.ts @@ -0,0 +1,17 @@ +/** + * Independent time operation tool to facilitate subsequent switch to dayjs + */ +import dayjs from 'dayjs' + +const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss' +const DATE_FORMAT = 'YYYY-MM-DD' + +export function formatToDateTime(date?: dayjs.ConfigType, format = DATE_TIME_FORMAT): string { + return dayjs(date).format(format) +} + +export function formatToDate(date?: dayjs.ConfigType, format = DATE_FORMAT): string { + return dayjs(date).format(format) +} + +export const dateUtil = dayjs diff --git a/src/utils/domUtils.ts b/src/utils/domUtils.ts new file mode 100644 index 0000000..dbc1989 --- /dev/null +++ b/src/utils/domUtils.ts @@ -0,0 +1,289 @@ +import { isServer } from './is' +const ieVersion = isServer ? 0 : Number((document as any).documentMode) +const SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g +const MOZ_HACK_REGEXP = /^moz([A-Z])/ + +export interface ViewportOffsetResult { + left: number + top: number + right: number + bottom: number + rightIncludeBody: number + bottomIncludeBody: number +} + +/* istanbul ignore next */ +const trim = function (string: string) { + return (string || '').replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, '') +} + +/* istanbul ignore next */ +const camelCase = function (name: string) { + return name + .replace(SPECIAL_CHARS_REGEXP, function (_, __, letter, offset) { + return offset ? letter.toUpperCase() : letter + }) + .replace(MOZ_HACK_REGEXP, 'Moz$1') +} + +/* istanbul ignore next */ +export function hasClass(el: Element, cls: string) { + if (!el || !cls) return false + if (cls.indexOf(' ') !== -1) { + throw new Error('className should not contain space.') + } + if (el.classList) { + return el.classList.contains(cls) + } else { + return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1 + } +} + +/* istanbul ignore next */ +export function addClass(el: Element, cls: string) { + if (!el) return + let curClass = el.className + const classes = (cls || '').split(' ') + + for (let i = 0, j = classes.length; i < j; i++) { + const clsName = classes[i] + if (!clsName) continue + + if (el.classList) { + el.classList.add(clsName) + } else if (!hasClass(el, clsName)) { + curClass += ' ' + clsName + } + } + if (!el.classList) { + el.className = curClass + } +} + +/* istanbul ignore next */ +export function removeClass(el: Element, cls: string) { + if (!el || !cls) return + const classes = cls.split(' ') + let curClass = ' ' + el.className + ' ' + + for (let i = 0, j = classes.length; i < j; i++) { + const clsName = classes[i] + if (!clsName) continue + + if (el.classList) { + el.classList.remove(clsName) + } else if (hasClass(el, clsName)) { + curClass = curClass.replace(' ' + clsName + ' ', ' ') + } + } + if (!el.classList) { + el.className = trim(curClass) + } +} + +export function getBoundingClientRect(element: Element): DOMRect | number { + if (!element || !element.getBoundingClientRect) { + return 0 + } + return element.getBoundingClientRect() +} + +/** + * 获取当前元素的left、top偏移 + * left:元素最左侧距离文档左侧的距离 + * top:元素最顶端距离文档顶端的距离 + * right:元素最右侧距离文档右侧的距离 + * bottom:元素最底端距离文档底端的距离 + * rightIncludeBody:元素最左侧距离文档右侧的距离 + * bottomIncludeBody:元素最底端距离文档最底部的距离 + * + * @description: + */ +export function getViewportOffset(element: Element): ViewportOffsetResult { + const doc = document.documentElement + + const docScrollLeft = doc.scrollLeft + const docScrollTop = doc.scrollTop + const docClientLeft = doc.clientLeft + const docClientTop = doc.clientTop + + const pageXOffset = window.pageXOffset + const pageYOffset = window.pageYOffset + + const box = getBoundingClientRect(element) + + const { left: retLeft, top: rectTop, width: rectWidth, height: rectHeight } = box as DOMRect + + const scrollLeft = (pageXOffset || docScrollLeft) - (docClientLeft || 0) + const scrollTop = (pageYOffset || docScrollTop) - (docClientTop || 0) + const offsetLeft = retLeft + pageXOffset + const offsetTop = rectTop + pageYOffset + + const left = offsetLeft - scrollLeft + const top = offsetTop - scrollTop + + const clientWidth = window.document.documentElement.clientWidth + const clientHeight = window.document.documentElement.clientHeight + return { + left: left, + top: top, + right: clientWidth - rectWidth - left, + bottom: clientHeight - rectHeight - top, + rightIncludeBody: clientWidth - left, + bottomIncludeBody: clientHeight - top + } +} + +/* istanbul ignore next */ +export const on = function ( + element: HTMLElement | Document | Window, + event: string, + handler: EventListenerOrEventListenerObject +): void { + if (element && event && handler) { + element.addEventListener(event, handler, false) + } +} + +/* istanbul ignore next */ +export const off = function ( + element: HTMLElement | Document | Window, + event: string, + handler: any +): void { + if (element && event && handler) { + element.removeEventListener(event, handler, false) + } +} + +/* istanbul ignore next */ +export const once = function (el: HTMLElement, event: string, fn: EventListener): void { + const listener = function (this: any, ...args: unknown[]) { + if (fn) { + // @ts-ignore + fn.apply(this, args) + } + off(el, event, listener) + } + on(el, event, listener) +} + +/* istanbul ignore next */ +export const getStyle = + ieVersion < 9 + ? function (element: Element | any, styleName: string) { + if (isServer) return + if (!element || !styleName) return null + styleName = camelCase(styleName) + if (styleName === 'float') { + styleName = 'styleFloat' + } + try { + switch (styleName) { + case 'opacity': + try { + return element.filters.item('alpha').opacity / 100 + } catch (e) { + return 1.0 + } + default: + return element.style[styleName] || element.currentStyle + ? element.currentStyle[styleName] + : null + } + } catch (e) { + return element.style[styleName] + } + } + : function (element: Element | any, styleName: string) { + if (isServer) return + if (!element || !styleName) return null + styleName = camelCase(styleName) + if (styleName === 'float') { + styleName = 'cssFloat' + } + try { + const computed = (document as any).defaultView.getComputedStyle(element, '') + return element.style[styleName] || computed ? computed[styleName] : null + } catch (e) { + return element.style[styleName] + } + } + +/* istanbul ignore next */ +export function setStyle(element: Element | any, styleName: any, value: any) { + if (!element || !styleName) return + + if (typeof styleName === 'object') { + for (const prop in styleName) { + if (Object.prototype.hasOwnProperty.call(styleName, prop)) { + setStyle(element, prop, styleName[prop]) + } + } + } else { + styleName = camelCase(styleName) + if (styleName === 'opacity' && ieVersion < 9) { + element.style.filter = isNaN(value) ? '' : 'alpha(opacity=' + value * 100 + ')' + } else { + element.style[styleName] = value + } + } +} + +/* istanbul ignore next */ +export const isScroll = (el: Element, vertical: any) => { + if (isServer) return + + const determinedDirection = vertical !== null || vertical !== undefined + const overflow = determinedDirection + ? vertical + ? getStyle(el, 'overflow-y') + : getStyle(el, 'overflow-x') + : getStyle(el, 'overflow') + + return overflow.match(/(scroll|auto)/) +} + +/* istanbul ignore next */ +export const getScrollContainer = (el: Element, vertical?: any) => { + if (isServer) return + + let parent: any = el + while (parent) { + if ([window, document, document.documentElement].includes(parent)) { + return window + } + if (isScroll(parent, vertical)) { + return parent + } + parent = parent.parentNode + } + + return parent +} + +/* istanbul ignore next */ +export const isInContainer = (el: Element, container: any) => { + if (isServer || !el || !container) return false + + const elRect = el.getBoundingClientRect() + let containerRect + + if ([window, document, document.documentElement, null, undefined].includes(container)) { + containerRect = { + top: 0, + right: window.innerWidth, + bottom: window.innerHeight, + left: 0 + } + } else { + containerRect = container.getBoundingClientRect() + } + + return ( + elRect.top < containerRect.bottom && + elRect.bottom > containerRect.top && + elRect.right > containerRect.left && + elRect.left < containerRect.right + ) +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..d91b679 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,136 @@ +/** + * + * @param component 需要注册的组件 + * @param alias 组件别名 + * @returns any + */ +export const withInstall = (component: T, alias?: string) => { + const comp = component as any + comp.install = (app: any) => { + app.component(comp.name || comp.displayName, component) + if (alias) { + app.config.globalProperties[alias] = component + } + } + return component as T & Plugin +} + +/** + * @param str 需要转下划线的驼峰字符串 + * @returns 字符串下划线 + */ +export const humpToUnderline = (str: string): string => { + return str.replace(/([A-Z])/g, '-$1').toLowerCase() +} + +/** + * @param str 需要转驼峰的下划线字符串 + * @returns 字符串驼峰 + */ +export const underlineToHump = (str: string): string => { + if (!str) return '' + return str.replace(/\-(\w)/g, (_, letter: string) => { + return letter.toUpperCase() + }) +} + +/** + * 驼峰转横杠 + */ +export const humpToDash = (str: string): string => { + return str.replace(/([A-Z])/g, '-$1').toLowerCase() +} + +export const setCssVar = (prop: string, val: any, dom = document.documentElement) => { + dom.style.setProperty(prop, val) +} + +export const getCssVar = (prop: string, dom = document.documentElement) => { + return getComputedStyle(dom).getPropertyValue(prop) +} + +/** + * 查找数组对象的某个下标 + * @param {Array} ary 查找的数组 + * @param {Functon} fn 判断的方法 + */ +export const findIndex = (ary: Array, fn: Fn): number => { + if (ary.findIndex) { + return ary.findIndex(fn) + } + let index = -1 + ary.some((item: T, i: number, ary: Array) => { + const ret: T = fn(item, i, ary) + if (ret) { + index = i + return ret + } + }) + return index +} + +export const trim = (str: string) => { + return str.replace(/(^\s*)|(\s*$)/g, '') +} + +/** + * @param {Date | number | string} time 需要转换的时间 + * @param {String} fmt 需要转换的格式 如 yyyy-MM-dd、yyyy-MM-dd HH:mm:ss + */ +export function formatTime(time: Date | number | string, fmt: string) { + if (!time) return '' + else { + const date = new Date(time) + const o = { + 'M+': date.getMonth() + 1, + 'd+': date.getDate(), + 'H+': date.getHours(), + 'm+': date.getMinutes(), + 's+': date.getSeconds(), + 'q+': Math.floor((date.getMonth() + 3) / 3), + S: date.getMilliseconds() + } + if (/(y+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) + } + for (const k in o) { + if (new RegExp('(' + k + ')').test(fmt)) { + fmt = fmt.replace( + RegExp.$1, + RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length) + ) + } + } + return fmt + } +} + +/** + * 生成随机字符串 + */ +export function toAnyString() { + const str: string = 'xxxxx-xxxxx-4xxxx-yxxxx-xxxxx'.replace(/[xy]/g, (c: string) => { + const r: number = (Math.random() * 16) | 0 + const v: number = c === 'x' ? r : (r & 0x3) | 0x8 + return v.toString() + }) + return str +} + +/** + * 首字母大写 + */ +export function firstUpperCase(str: string) { + return str.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase()) +} + +/** + * 把对象转为formData + */ +export function objToFormData(obj: Recordable) { + const formData = new FormData() + Object.keys(obj).forEach((key) => { + formData.append(key, obj[key]) + }) + return formData +} diff --git a/src/utils/is.ts b/src/utils/is.ts new file mode 100644 index 0000000..1651420 --- /dev/null +++ b/src/utils/is.ts @@ -0,0 +1,117 @@ +// copy to vben-admin + +const toString = Object.prototype.toString + +export const is = (val: unknown, type: string) => { + return toString.call(val) === `[object ${type}]` +} + +export const isDef = (val?: T): val is T => { + return typeof val !== 'undefined' +} + +export const isUnDef = (val?: T): val is T => { + return !isDef(val) +} + +export const isObject = (val: any): val is Record => { + return val !== null && is(val, 'Object') +} + +export const isEmpty = (val: T): val is T => { + if (isArray(val) || isString(val)) { + return val.length === 0 + } + + if (val instanceof Map || val instanceof Set) { + return val.size === 0 + } + + if (isObject(val)) { + return Object.keys(val).length === 0 + } + + return false +} + +export const isDate = (val: unknown): val is Date => { + return is(val, 'Date') +} + +export const isNull = (val: unknown): val is null => { + return val === null +} + +export const isNullAndUnDef = (val: unknown): val is null | undefined => { + return isUnDef(val) && isNull(val) +} + +export const isNullOrUnDef = (val: unknown): val is null | undefined => { + return isUnDef(val) || isNull(val) +} + +export const isNumber = (val: unknown): val is number => { + return is(val, 'Number') +} + +export const isPromise = (val: unknown): val is Promise => { + return is(val, 'Promise') && isObject(val) && isFunction(val.then) && isFunction(val.catch) +} + +export const isString = (val: unknown): val is string => { + return is(val, 'String') +} + +export const isFunction = (val: unknown): val is Function => { + return typeof val === 'function' +} + +export const isBoolean = (val: unknown): val is boolean => { + return is(val, 'Boolean') +} + +export const isRegExp = (val: unknown): val is RegExp => { + return is(val, 'RegExp') +} + +export const isArray = (val: any): val is Array => { + return val && Array.isArray(val) +} + +export const isWindow = (val: any): val is Window => { + return typeof window !== 'undefined' && is(val, 'Window') +} + +export const isElement = (val: unknown): val is Element => { + return isObject(val) && !!val.tagName +} + +export const isMap = (val: unknown): val is Map => { + return is(val, 'Map') +} + +export const isServer = typeof window === 'undefined' + +export const isClient = !isServer + +export const isUrl = (path: string): boolean => { + try { + new URL(path) + return true + } catch (_error) { + return false + } +} + +export const isDark = (): boolean => { + return window.matchMedia('(prefers-color-scheme: dark)').matches +} + +// 是否是图片链接 +export const isImgPath = (path: string): boolean => { + return /(https?:\/\/|data:image\/).*?\.(png|jpg|jpeg|gif|svg|webp|ico)/gi.test(path) +} + +export const isEmptyVal = (val: any): boolean => { + return val === '' || val === null || val === undefined +} diff --git a/src/utils/propTypes.ts b/src/utils/propTypes.ts new file mode 100644 index 0000000..863f55c --- /dev/null +++ b/src/utils/propTypes.ts @@ -0,0 +1,24 @@ +import { VueTypeValidableDef, VueTypesInterface, createTypes, toValidableType } from 'vue-types' +import { CSSProperties } from 'vue' + +type PropTypes = VueTypesInterface & { + readonly style: VueTypeValidableDef +} +const newPropTypes = createTypes({ + func: undefined, + bool: undefined, + string: undefined, + number: undefined, + object: undefined, + integer: undefined +}) as PropTypes + +class propTypes extends newPropTypes { + static get style() { + return toValidableType('style', { + type: [String, Object] + }) + } +} + +export { propTypes } diff --git a/src/utils/routerHelper.ts b/src/utils/routerHelper.ts new file mode 100644 index 0000000..b4e7548 --- /dev/null +++ b/src/utils/routerHelper.ts @@ -0,0 +1,197 @@ +import { createRouter, createWebHashHistory } from 'vue-router' +import type { + Router, + RouteLocationNormalized, + RouteRecordNormalized, + RouteRecordRaw +} from 'vue-router' +import { isUrl } from '@/utils/is' +import { omit, cloneDeep } from 'lodash-es' + +const modules = import.meta.glob('../views/**/*.{vue,tsx}') + +/* Layout */ +export const Layout = () => import('@/layout/Layout.vue') + +export const getParentLayout = () => { + return () => + new Promise((resolve) => { + resolve({ + name: 'ParentLayout' + }) + }) +} + +export const getRawRoute = (route: RouteLocationNormalized): RouteLocationNormalized => { + if (!route) return route + const { matched, ...opt } = route + return { + ...opt, + matched: (matched + ? matched.map((item) => ({ + meta: item.meta, + name: item.name, + path: item.path + })) + : undefined) as RouteRecordNormalized[] + } +} + +// 前端控制路由生成 +export const generateRoutesByFrontEnd = ( + routes: AppRouteRecordRaw[], + keys: string[], + basePath = '/' +): AppRouteRecordRaw[] => { + const res: AppRouteRecordRaw[] = [] + + for (const route of routes) { + const meta = route.meta ?? {} + // skip some route + if (meta.hidden && !meta.canTo) { + continue + } + + let data: Nullable = null + + let onlyOneChild: Nullable = null + if (route.children && route.children.length === 1 && !meta.alwaysShow) { + onlyOneChild = ( + isUrl(route.children[0].path) + ? route.children[0].path + : pathResolve(pathResolve(basePath, route.path), route.children[0].path) + ) as string + } + + // 开发者可以根据实际情况进行扩展 + for (const item of keys) { + // 通过路径去匹配 + if (isUrl(item) && (onlyOneChild === item || route.path === item)) { + data = Object.assign({}, route) + } else { + const routePath = (onlyOneChild ?? pathResolve(basePath, route.path)).trim() + if (routePath === item || meta.followRoute === item) { + data = Object.assign({}, route) + } + } + } + + // recursive child routes + if (route.children && data) { + data.children = generateRoutesByFrontEnd( + route.children, + keys, + pathResolve(basePath, data.path) + ) + } + if (data) { + res.push(data as AppRouteRecordRaw) + } + } + return res +} + +// 后端控制路由生成 +export const generateRoutesByServer = (routes: AppCustomRouteRecordRaw[]): AppRouteRecordRaw[] => { + const res: AppRouteRecordRaw[] = [] + + for (const route of routes) { + const data: AppRouteRecordRaw = { + path: route.path, + name: route.name, + redirect: route.redirect, + meta: route.meta + } + if (route.component) { + const comModule = modules[`../${route.component}.vue`] || modules[`../${route.component}.tsx`] + const component = route.component as string + if (!comModule && !component.includes('#')) { + console.error(`未找到${route.component}.vue文件或${route.component}.tsx文件,请创建`) + } else { + // 动态加载路由文件,可根据实际情况进行自定义逻辑 + data.component = + component === '#' ? Layout : component.includes('##') ? getParentLayout() : comModule + } + } + // recursive child routes + if (route.children) { + data.children = generateRoutesByServer(route.children) + } + res.push(data as AppRouteRecordRaw) + } + return res +} + +export const pathResolve = (parentPath: string, path: string) => { + if (isUrl(path)) return path + const childPath = path.startsWith('/') || !path ? path : `/${path}` + return `${parentPath}${childPath}`.replace(/\/\//g, '/').trim() +} + +// 路由降级 +export const flatMultiLevelRoutes = (routes: AppRouteRecordRaw[]) => { + const modules: AppRouteRecordRaw[] = cloneDeep(routes) + for (let index = 0; index < modules.length; index++) { + const route = modules[index] + if (!isMultipleRoute(route)) { + continue + } + promoteRouteLevel(route) + } + return modules +} + +// 层级是否大于2 +const isMultipleRoute = (route: AppRouteRecordRaw) => { + if (!route || !Reflect.has(route, 'children') || !route.children?.length) { + return false + } + + const children = route.children + + let flag = false + for (let index = 0; index < children.length; index++) { + const child = children[index] + if (child.children?.length) { + flag = true + break + } + } + return flag +} + +// 生成二级路由 +const promoteRouteLevel = (route: AppRouteRecordRaw) => { + let router: Router | null = createRouter({ + routes: [route as RouteRecordRaw], + history: createWebHashHistory() + }) + + const routes = router.getRoutes() + addToChildren(routes, route.children || [], route) + router = null + + route.children = route.children?.map((item) => omit(item, 'children')) +} + +// 添加所有子菜单 +const addToChildren = ( + routes: RouteRecordNormalized[], + children: AppRouteRecordRaw[], + routeModule: AppRouteRecordRaw +) => { + for (let index = 0; index < children.length; index++) { + const child = children[index] + const route = routes.find((item) => item.name === child.name) + if (!route) { + continue + } + routeModule.children = routeModule.children || [] + if (!routeModule.children.find((item) => item.name === route.name)) { + routeModule.children?.push(route as unknown as AppRouteRecordRaw) + } + if (child.children?.length) { + addToChildren(routes, child.children, routeModule) + } + } +} diff --git a/src/utils/tree.ts b/src/utils/tree.ts new file mode 100644 index 0000000..fe0207d --- /dev/null +++ b/src/utils/tree.ts @@ -0,0 +1,207 @@ +interface TreeHelperConfig { + id: string + children: string + pid: string +} +const DEFAULT_CONFIG: TreeHelperConfig = { + id: 'id', + children: 'children', + pid: 'pid' +} + +const getConfig = (config: Partial) => Object.assign({}, DEFAULT_CONFIG, config) + +// tree from list +export const listToTree = (list: any[], config: Partial = {}): T[] => { + const conf = getConfig(config) as TreeHelperConfig + const nodeMap = new Map() + const result: T[] = [] + const { id, children, pid } = conf + + for (const node of list) { + node[children] = node[children] || [] + nodeMap.set(node[id], node) + } + for (const node of list) { + const parent = nodeMap.get(node[pid]) + ;(parent ? parent.children : result).push(node) + } + return result +} + +export const treeToList = (tree: any, config: Partial = {}): T => { + config = getConfig(config) + const { children } = config + const result: any = [...tree] + for (let i = 0; i < result.length; i++) { + if (!result[i][children!]) continue + result.splice(i + 1, 0, ...result[i][children!]) + } + return result +} + +export const findNode = ( + tree: any, + func: Fn, + config: Partial = {} +): T | null => { + config = getConfig(config) + const { children } = config + const list = [...tree] + for (const node of list) { + if (func(node)) return node + node[children!] && list.push(...node[children!]) + } + return null +} + +export const findNodeAll = ( + tree: any, + func: Fn, + config: Partial = {} +): T[] => { + config = getConfig(config) + const { children } = config + const list = [...tree] + const result: T[] = [] + for (const node of list) { + func(node) && result.push(node) + node[children!] && list.push(...node[children!]) + } + return result +} + +export const findPath = ( + tree: any, + func: Fn, + config: Partial = {} +): T | T[] | null => { + config = getConfig(config) + const path: T[] = [] + const list = [...tree] + const visitedSet = new Set() + const { children } = config + while (list.length) { + const node = list[0] + if (visitedSet.has(node)) { + path.pop() + list.shift() + } else { + visitedSet.add(node) + node[children!] && list.unshift(...node[children!]) + path.push(node) + if (func(node)) { + return path + } + } + } + return null +} + +export const findPathAll = (tree: any, func: Fn, config: Partial = {}) => { + config = getConfig(config) + const path: any[] = [] + const list = [...tree] + const result: any[] = [] + const visitedSet = new Set(), + { children } = config + while (list.length) { + const node = list[0] + if (visitedSet.has(node)) { + path.pop() + list.shift() + } else { + visitedSet.add(node) + node[children!] && list.unshift(...node[children!]) + path.push(node) + func(node) && result.push([...path]) + } + } + return result +} + +export const filter = ( + tree: T[], + func: (n: T) => boolean, + config: Partial = {} +): T[] => { + config = getConfig(config) + const children = config.children as string + function listFilter(list: T[]) { + return list + .map((node: any) => ({ ...node })) + .filter((node) => { + node[children] = node[children] && listFilter(node[children]) + return func(node) || (node[children] && node[children].length) + }) + } + return listFilter(tree) +} + +export const forEach = ( + tree: T[], + func: (n: T) => any, + config: Partial = {} +): void => { + config = getConfig(config) + const list: any[] = [...tree] + const { children } = config + for (let i = 0; i < list.length; i++) { + // func 返回true就终止遍历,避免大量节点场景下无意义循环,引起浏览器卡顿 + if (func(list[i])) { + return + } + children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]) + } +} + +/** + * @description: Extract tree specified structure + */ +export const treeMap = ( + treeData: T[], + opt: { children?: string; conversion: Fn } +): T[] => { + return treeData.map((item) => treeMapEach(item, opt)) +} + +/** + * @description: Extract tree specified structure + */ +export const treeMapEach = ( + data: any, + { children = 'children', conversion }: { children?: string; conversion: Fn } +) => { + const haveChildren = Array.isArray(data[children]) && data[children].length > 0 + const conversionData = conversion(data) || {} + if (haveChildren) { + return { + ...conversionData, + [children]: data[children].map((i: number) => + treeMapEach(i, { + children, + conversion + }) + ) + } + } else { + return { + ...conversionData + } + } +} + +/** + * 递归遍历树结构 + * @param treeDatas 树 + * @param callBack 回调 + * @param parentNode 父节点 + */ +export const eachTree = (treeDatas: any[], callBack: Fn, parentNode = {}) => { + treeDatas.forEach((element) => { + const newNode = callBack(element, parentNode) || element + if (element.children) { + eachTree(element.children, callBack, newNode) + } + }) +} diff --git a/src/utils/tsxHelper.ts b/src/utils/tsxHelper.ts new file mode 100644 index 0000000..6087fa3 --- /dev/null +++ b/src/utils/tsxHelper.ts @@ -0,0 +1,16 @@ +import { Slots } from 'vue' +import { isFunction } from '@/utils/is' + +export const getSlot = (slots: Slots, slot = 'default', data?: Recordable) => { + // Reflect.has 判断一个对象是否存在某个属性 + if (!slots || !Reflect.has(slots, slot)) { + return null + } + if (!isFunction(slots[slot])) { + console.error(`${slot} is not a function!`) + return null + } + const slotFn = slots[slot] + if (!slotFn) return null + return slotFn(data) +} diff --git a/src/views/Authorization/Department/Department.vue b/src/views/Authorization/Department/Department.vue new file mode 100644 index 0000000..c889705 --- /dev/null +++ b/src/views/Authorization/Department/Department.vue @@ -0,0 +1,341 @@ + + + diff --git a/src/views/Authorization/Department/components/Detail.vue b/src/views/Authorization/Department/components/Detail.vue new file mode 100644 index 0000000..8262b95 --- /dev/null +++ b/src/views/Authorization/Department/components/Detail.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/views/Authorization/Department/components/Write.vue b/src/views/Authorization/Department/components/Write.vue new file mode 100644 index 0000000..2c3c527 --- /dev/null +++ b/src/views/Authorization/Department/components/Write.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/views/Authorization/Menu/Menu.vue b/src/views/Authorization/Menu/Menu.vue new file mode 100644 index 0000000..1ea4fb3 --- /dev/null +++ b/src/views/Authorization/Menu/Menu.vue @@ -0,0 +1,212 @@ + + + diff --git a/src/views/Authorization/Menu/components/AddButtonPermission.vue b/src/views/Authorization/Menu/components/AddButtonPermission.vue new file mode 100644 index 0000000..32cb3c3 --- /dev/null +++ b/src/views/Authorization/Menu/components/AddButtonPermission.vue @@ -0,0 +1,68 @@ + + + diff --git a/src/views/Authorization/Menu/components/Detail.vue b/src/views/Authorization/Menu/components/Detail.vue new file mode 100644 index 0000000..54b2cad --- /dev/null +++ b/src/views/Authorization/Menu/components/Detail.vue @@ -0,0 +1,173 @@ + + + diff --git a/src/views/Authorization/Menu/components/Write.vue b/src/views/Authorization/Menu/components/Write.vue new file mode 100644 index 0000000..2da8b67 --- /dev/null +++ b/src/views/Authorization/Menu/components/Write.vue @@ -0,0 +1,409 @@ + + + diff --git a/src/views/Authorization/Role/Role.vue b/src/views/Authorization/Role/Role.vue new file mode 100644 index 0000000..4b67c3f --- /dev/null +++ b/src/views/Authorization/Role/Role.vue @@ -0,0 +1,173 @@ + + + diff --git a/src/views/Authorization/Role/components/Detail.vue b/src/views/Authorization/Role/components/Detail.vue new file mode 100644 index 0000000..97c1b57 --- /dev/null +++ b/src/views/Authorization/Role/components/Detail.vue @@ -0,0 +1,106 @@ + + + diff --git a/src/views/Authorization/Role/components/Write.vue b/src/views/Authorization/Role/components/Write.vue new file mode 100644 index 0000000..0169427 --- /dev/null +++ b/src/views/Authorization/Role/components/Write.vue @@ -0,0 +1,181 @@ + + + diff --git a/src/views/Authorization/User/User.vue b/src/views/Authorization/User/User.vue new file mode 100644 index 0000000..12ad2e2 --- /dev/null +++ b/src/views/Authorization/User/User.vue @@ -0,0 +1,384 @@ + + + diff --git a/src/views/Authorization/User/components/Detail.vue b/src/views/Authorization/User/components/Detail.vue new file mode 100644 index 0000000..81dd5ee --- /dev/null +++ b/src/views/Authorization/User/components/Detail.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/views/Authorization/User/components/Write.vue b/src/views/Authorization/User/components/Write.vue new file mode 100644 index 0000000..ec60c8a --- /dev/null +++ b/src/views/Authorization/User/components/Write.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/views/Components/Avatars.vue b/src/views/Components/Avatars.vue new file mode 100644 index 0000000..430c758 --- /dev/null +++ b/src/views/Components/Avatars.vue @@ -0,0 +1,53 @@ + + + diff --git a/src/views/Components/CountTo.vue b/src/views/Components/CountTo.vue new file mode 100644 index 0000000..a547e8e --- /dev/null +++ b/src/views/Components/CountTo.vue @@ -0,0 +1,100 @@ + + + diff --git a/src/views/Components/Descriptions.vue b/src/views/Components/Descriptions.vue new file mode 100644 index 0000000..4b96bf6 --- /dev/null +++ b/src/views/Components/Descriptions.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/src/views/Components/Dialog.vue b/src/views/Components/Dialog.vue new file mode 100644 index 0000000..33726e4 --- /dev/null +++ b/src/views/Components/Dialog.vue @@ -0,0 +1,165 @@ + + + diff --git a/src/views/Components/Echart.vue b/src/views/Components/Echart.vue new file mode 100644 index 0000000..683d6b4 --- /dev/null +++ b/src/views/Components/Echart.vue @@ -0,0 +1,36 @@ + + + diff --git a/src/views/Components/Editor/CodeEditor.vue b/src/views/Components/Editor/CodeEditor.vue new file mode 100644 index 0000000..db80bb0 --- /dev/null +++ b/src/views/Components/Editor/CodeEditor.vue @@ -0,0 +1,23 @@ + + diff --git a/src/views/Components/Editor/Editor.vue b/src/views/Components/Editor/Editor.vue new file mode 100644 index 0000000..9dde431 --- /dev/null +++ b/src/views/Components/Editor/Editor.vue @@ -0,0 +1,32 @@ + + + diff --git a/src/views/Components/Editor/JsonEditor.vue b/src/views/Components/Editor/JsonEditor.vue new file mode 100644 index 0000000..c508fbd --- /dev/null +++ b/src/views/Components/Editor/JsonEditor.vue @@ -0,0 +1,36 @@ + + + diff --git a/src/views/Components/Form/DefaultForm.vue b/src/views/Components/Form/DefaultForm.vue new file mode 100644 index 0000000..4165c16 --- /dev/null +++ b/src/views/Components/Form/DefaultForm.vue @@ -0,0 +1,1863 @@ + + + + + diff --git a/src/views/Components/Form/UseFormDemo.vue b/src/views/Components/Form/UseFormDemo.vue new file mode 100644 index 0000000..de9cc64 --- /dev/null +++ b/src/views/Components/Form/UseFormDemo.vue @@ -0,0 +1,470 @@ + + + + + diff --git a/src/views/Components/Highlight.vue b/src/views/Components/Highlight.vue new file mode 100644 index 0000000..96baedc --- /dev/null +++ b/src/views/Components/Highlight.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/views/Components/IAgree.vue b/src/views/Components/IAgree.vue new file mode 100644 index 0000000..947226b --- /dev/null +++ b/src/views/Components/IAgree.vue @@ -0,0 +1,21 @@ + + + diff --git a/src/views/Components/Icon.vue b/src/views/Components/Icon.vue new file mode 100644 index 0000000..02da12a --- /dev/null +++ b/src/views/Components/Icon.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/views/Components/IconPicker.vue b/src/views/Components/IconPicker.vue new file mode 100644 index 0000000..6643f94 --- /dev/null +++ b/src/views/Components/IconPicker.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/views/Components/ImageCropping.vue b/src/views/Components/ImageCropping.vue new file mode 100644 index 0000000..9e69952 --- /dev/null +++ b/src/views/Components/ImageCropping.vue @@ -0,0 +1,43 @@ + + + diff --git a/src/views/Components/ImageViewer.vue b/src/views/Components/ImageViewer.vue new file mode 100644 index 0000000..a20ce91 --- /dev/null +++ b/src/views/Components/ImageViewer.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/views/Components/Infotip.vue b/src/views/Components/Infotip.vue new file mode 100644 index 0000000..49cff12 --- /dev/null +++ b/src/views/Components/Infotip.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/views/Components/InputPassword.vue b/src/views/Components/InputPassword.vue new file mode 100644 index 0000000..bfae7e5 --- /dev/null +++ b/src/views/Components/InputPassword.vue @@ -0,0 +1,21 @@ + + + diff --git a/src/views/Components/Qrcode.vue b/src/views/Components/Qrcode.vue new file mode 100644 index 0000000..6b7d792 --- /dev/null +++ b/src/views/Components/Qrcode.vue @@ -0,0 +1,108 @@ + + + diff --git a/src/views/Components/Search.vue b/src/views/Components/Search.vue new file mode 100644 index 0000000..0cc9154 --- /dev/null +++ b/src/views/Components/Search.vue @@ -0,0 +1,363 @@ + + + + + diff --git a/src/views/Components/Table/CardTable.vue b/src/views/Components/Table/CardTable.vue new file mode 100644 index 0000000..f07059d --- /dev/null +++ b/src/views/Components/Table/CardTable.vue @@ -0,0 +1,80 @@ + + + diff --git a/src/views/Components/Table/DefaultTable.vue b/src/views/Components/Table/DefaultTable.vue new file mode 100644 index 0000000..1d9124a --- /dev/null +++ b/src/views/Components/Table/DefaultTable.vue @@ -0,0 +1,105 @@ + + + diff --git a/src/views/Components/Table/TableImagePreview.vue b/src/views/Components/Table/TableImagePreview.vue new file mode 100644 index 0000000..ded2d6d --- /dev/null +++ b/src/views/Components/Table/TableImagePreview.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/views/Components/Table/TableVideoPreview.vue b/src/views/Components/Table/TableVideoPreview.vue new file mode 100644 index 0000000..a6607b0 --- /dev/null +++ b/src/views/Components/Table/TableVideoPreview.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/views/Components/Table/TreeTable.vue b/src/views/Components/Table/TreeTable.vue new file mode 100644 index 0000000..90a1dfb --- /dev/null +++ b/src/views/Components/Table/TreeTable.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/src/views/Components/Table/UseTableDemo.vue b/src/views/Components/Table/UseTableDemo.vue new file mode 100644 index 0000000..62e9801 --- /dev/null +++ b/src/views/Components/Table/UseTableDemo.vue @@ -0,0 +1,283 @@ + + + + + diff --git a/src/views/Components/Tree.vue b/src/views/Components/Tree.vue new file mode 100644 index 0000000..661732e --- /dev/null +++ b/src/views/Components/Tree.vue @@ -0,0 +1,252 @@ + + + + diff --git a/src/views/Components/VideoPlayer.vue b/src/views/Components/VideoPlayer.vue new file mode 100644 index 0000000..66dcad4 --- /dev/null +++ b/src/views/Components/VideoPlayer.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/views/Components/Waterfall.vue b/src/views/Components/Waterfall.vue new file mode 100644 index 0000000..c56f8f8 --- /dev/null +++ b/src/views/Components/Waterfall.vue @@ -0,0 +1,62 @@ + + + diff --git a/src/views/Dashboard/Analysis.vue b/src/views/Dashboard/Analysis.vue new file mode 100644 index 0000000..4ce6f27 --- /dev/null +++ b/src/views/Dashboard/Analysis.vue @@ -0,0 +1,127 @@ + + + diff --git a/src/views/Dashboard/Workplace.vue b/src/views/Dashboard/Workplace.vue new file mode 100644 index 0000000..4e0bd80 --- /dev/null +++ b/src/views/Dashboard/Workplace.vue @@ -0,0 +1,293 @@ + + + diff --git a/src/views/Dashboard/components/PanelGroup.vue b/src/views/Dashboard/components/PanelGroup.vue new file mode 100644 index 0000000..228cf4d --- /dev/null +++ b/src/views/Dashboard/components/PanelGroup.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/src/views/Dashboard/echarts-data.ts b/src/views/Dashboard/echarts-data.ts new file mode 100644 index 0000000..00a195e --- /dev/null +++ b/src/views/Dashboard/echarts-data.ts @@ -0,0 +1,309 @@ +import { EChartsOption } from 'echarts' +import { useI18n } from '@/hooks/web/useI18n' + +const { t } = useI18n() + +export const lineOptions: EChartsOption = { + title: { + text: t('analysis.monthlySales'), + left: 'center' + }, + xAxis: { + data: [ + t('analysis.january'), + t('analysis.february'), + t('analysis.march'), + t('analysis.april'), + t('analysis.may'), + t('analysis.june'), + t('analysis.july'), + t('analysis.august'), + t('analysis.september'), + t('analysis.october'), + t('analysis.november'), + t('analysis.december') + ], + boundaryGap: false, + axisTick: { + show: false + } + }, + grid: { + left: 20, + right: 20, + bottom: 20, + top: 80, + containLabel: true + }, + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'cross' + }, + padding: [5, 10] + }, + yAxis: { + axisTick: { + show: false + } + }, + legend: { + data: [t('analysis.estimate'), t('analysis.actual')], + top: 50 + }, + series: [ + { + name: t('analysis.estimate'), + smooth: true, + type: 'line', + data: [100, 120, 161, 134, 105, 160, 165, 114, 163, 185, 118, 123], + animationDuration: 2800, + animationEasing: 'cubicInOut' + }, + { + name: t('analysis.actual'), + smooth: true, + type: 'line', + itemStyle: {}, + data: [120, 82, 91, 154, 162, 140, 145, 250, 134, 56, 99, 123], + animationDuration: 2800, + animationEasing: 'quadraticOut' + } + ] +} + +export const pieOptions: EChartsOption = { + title: { + text: t('analysis.userAccessSource'), + left: 'center' + }, + tooltip: { + trigger: 'item', + formatter: '{a}
    {b} : {c} ({d}%)' + }, + legend: { + orient: 'vertical', + left: 'left', + data: [ + t('analysis.directAccess'), + t('analysis.mailMarketing'), + t('analysis.allianceAdvertising'), + t('analysis.videoAdvertising'), + t('analysis.searchEngines') + ] + }, + series: [ + { + name: t('analysis.userAccessSource'), + type: 'pie', + radius: '55%', + center: ['50%', '60%'], + data: [ + { value: 335, name: t('analysis.directAccess') }, + { value: 310, name: t('analysis.mailMarketing') }, + { value: 234, name: t('analysis.allianceAdvertising') }, + { value: 135, name: t('analysis.videoAdvertising') }, + { value: 1548, name: t('analysis.searchEngines') } + ] + } + ] +} + +export const barOptions: EChartsOption = { + title: { + text: t('analysis.weeklyUserActivity'), + left: 'center' + }, + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'shadow' + } + }, + grid: { + left: 50, + right: 20, + bottom: 20 + }, + xAxis: { + type: 'category', + data: [ + t('analysis.monday'), + t('analysis.tuesday'), + t('analysis.wednesday'), + t('analysis.thursday'), + t('analysis.friday'), + t('analysis.saturday'), + t('analysis.sunday') + ], + axisTick: { + alignWithLabel: true + } + }, + yAxis: { + type: 'value' + }, + series: [ + { + name: t('analysis.activeQuantity'), + data: [13253, 34235, 26321, 12340, 24643, 1322, 1324], + type: 'bar' + } + ] +} + +export const radarOption: EChartsOption = { + legend: { + data: [t('workplace.personal'), t('workplace.team')] + }, + radar: { + // shape: 'circle', + indicator: [ + { name: t('workplace.quote'), max: 65 }, + { name: t('workplace.contribution'), max: 160 }, + { name: t('workplace.hot'), max: 300 }, + { name: t('workplace.yield'), max: 130 }, + { name: t('workplace.follow'), max: 100 } + ] + }, + series: [ + { + name: `xxx${t('workplace.index')}`, + type: 'radar', + data: [ + { + value: [42, 30, 20, 35, 80], + name: t('workplace.personal') + }, + { + value: [50, 140, 290, 100, 90], + name: t('workplace.team') + } + ] + } + ] +} + +export const wordOptions = { + series: [ + { + type: 'wordCloud', + gridSize: 2, + sizeRange: [12, 50], + rotationRange: [-90, 90], + shape: 'pentagon', + width: 600, + height: 400, + drawOutOfBound: true, + textStyle: { + color: function () { + return ( + 'rgb(' + + [ + Math.round(Math.random() * 160), + Math.round(Math.random() * 160), + Math.round(Math.random() * 160) + ].join(',') + + ')' + ) + } + }, + emphasis: { + textStyle: { + shadowBlur: 10, + shadowColor: '#333' + } + }, + data: [ + { + name: 'Sam S Club', + value: 10000, + textStyle: { + color: 'black' + }, + emphasis: { + textStyle: { + color: 'red' + } + } + }, + { + name: 'Macys', + value: 6181 + }, + { + name: 'Amy Schumer', + value: 4386 + }, + { + name: 'Jurassic World', + value: 4055 + }, + { + name: 'Charter Communications', + value: 2467 + }, + { + name: 'Chick Fil A', + value: 2244 + }, + { + name: 'Planet Fitness', + value: 1898 + }, + { + name: 'Pitch Perfect', + value: 1484 + }, + { + name: 'Express', + value: 1112 + }, + { + name: 'Home', + value: 965 + }, + { + name: 'Johnny Depp', + value: 847 + }, + { + name: 'Lena Dunham', + value: 582 + }, + { + name: 'Lewis Hamilton', + value: 555 + }, + { + name: 'KXAN', + value: 550 + }, + { + name: 'Mary Ellen Mark', + value: 462 + }, + { + name: 'Farrah Abraham', + value: 366 + }, + { + name: 'Rita Ora', + value: 360 + }, + { + name: 'Serena Williams', + value: 282 + }, + { + name: 'NCAA baseball tournament', + value: 273 + }, + { + name: 'Point Break', + value: 265 + } + ] + } + ] +} diff --git a/src/views/Error/403.vue b/src/views/Error/403.vue new file mode 100644 index 0000000..615c940 --- /dev/null +++ b/src/views/Error/403.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/views/Error/404.vue b/src/views/Error/404.vue new file mode 100644 index 0000000..0a3fbbe --- /dev/null +++ b/src/views/Error/404.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/views/Error/500.vue b/src/views/Error/500.vue new file mode 100644 index 0000000..ddb5097 --- /dev/null +++ b/src/views/Error/500.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/views/Example/Dialog/ExampleDialog.vue b/src/views/Example/Dialog/ExampleDialog.vue new file mode 100644 index 0000000..b93450d --- /dev/null +++ b/src/views/Example/Dialog/ExampleDialog.vue @@ -0,0 +1,340 @@ + + + diff --git a/src/views/Example/Dialog/components/Detail.vue b/src/views/Example/Dialog/components/Detail.vue new file mode 100644 index 0000000..2496e75 --- /dev/null +++ b/src/views/Example/Dialog/components/Detail.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/views/Example/Dialog/components/Write.vue b/src/views/Example/Dialog/components/Write.vue new file mode 100644 index 0000000..2ea183a --- /dev/null +++ b/src/views/Example/Dialog/components/Write.vue @@ -0,0 +1,63 @@ + + + diff --git a/src/views/Example/Page/ExampleAdd.vue b/src/views/Example/Page/ExampleAdd.vue new file mode 100644 index 0000000..fbe7460 --- /dev/null +++ b/src/views/Example/Page/ExampleAdd.vue @@ -0,0 +1,51 @@ + + + diff --git a/src/views/Example/Page/ExampleDetail.vue b/src/views/Example/Page/ExampleDetail.vue new file mode 100644 index 0000000..6f7e44c --- /dev/null +++ b/src/views/Example/Page/ExampleDetail.vue @@ -0,0 +1,37 @@ + + + diff --git a/src/views/Example/Page/ExampleEdit.vue b/src/views/Example/Page/ExampleEdit.vue new file mode 100644 index 0000000..eb65721 --- /dev/null +++ b/src/views/Example/Page/ExampleEdit.vue @@ -0,0 +1,66 @@ + + + +@/hooks/event/useEventBus diff --git a/src/views/Example/Page/ExamplePage.vue b/src/views/Example/Page/ExamplePage.vue new file mode 100644 index 0000000..c13fe3c --- /dev/null +++ b/src/views/Example/Page/ExamplePage.vue @@ -0,0 +1,297 @@ + + + +@/hooks/event/useEventBus diff --git a/src/views/Example/Page/components/Detail.vue b/src/views/Example/Page/components/Detail.vue new file mode 100644 index 0000000..11d4a94 --- /dev/null +++ b/src/views/Example/Page/components/Detail.vue @@ -0,0 +1,69 @@ + + + diff --git a/src/views/Example/Page/components/Write.vue b/src/views/Example/Page/components/Write.vue new file mode 100644 index 0000000..c4f50ad --- /dev/null +++ b/src/views/Example/Page/components/Write.vue @@ -0,0 +1,154 @@ + + + diff --git a/src/views/Function/MultipleTabs.vue b/src/views/Function/MultipleTabs.vue new file mode 100644 index 0000000..4a623c8 --- /dev/null +++ b/src/views/Function/MultipleTabs.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/views/Function/MultipleTabsDemo.vue b/src/views/Function/MultipleTabsDemo.vue new file mode 100644 index 0000000..9421a9a --- /dev/null +++ b/src/views/Function/MultipleTabsDemo.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/views/Function/Request.vue b/src/views/Function/Request.vue new file mode 100644 index 0000000..b37e67b --- /dev/null +++ b/src/views/Function/Request.vue @@ -0,0 +1,173 @@ + + + diff --git a/src/views/Function/Test.vue b/src/views/Function/Test.vue new file mode 100644 index 0000000..dbb3732 --- /dev/null +++ b/src/views/Function/Test.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/views/Guide/Guide.vue b/src/views/Guide/Guide.vue new file mode 100644 index 0000000..dbdc91b --- /dev/null +++ b/src/views/Guide/Guide.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/views/Level/Menu111.vue b/src/views/Level/Menu111.vue new file mode 100644 index 0000000..015d0f8 --- /dev/null +++ b/src/views/Level/Menu111.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/views/Level/Menu12.vue b/src/views/Level/Menu12.vue new file mode 100644 index 0000000..8e2725d --- /dev/null +++ b/src/views/Level/Menu12.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/views/Level/Menu2.vue b/src/views/Level/Menu2.vue new file mode 100644 index 0000000..72e2abb --- /dev/null +++ b/src/views/Level/Menu2.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/views/Login/Login.vue b/src/views/Login/Login.vue new file mode 100644 index 0000000..081f30a --- /dev/null +++ b/src/views/Login/Login.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/src/views/Login/components/LoginForm.vue b/src/views/Login/components/LoginForm.vue new file mode 100644 index 0000000..6d39b8e --- /dev/null +++ b/src/views/Login/components/LoginForm.vue @@ -0,0 +1,313 @@ + + + diff --git a/src/views/Login/components/RegisterForm.vue b/src/views/Login/components/RegisterForm.vue new file mode 100644 index 0000000..1f3d251 --- /dev/null +++ b/src/views/Login/components/RegisterForm.vue @@ -0,0 +1,218 @@ + + + diff --git a/src/views/Login/components/index.ts b/src/views/Login/components/index.ts new file mode 100644 index 0000000..d08be96 --- /dev/null +++ b/src/views/Login/components/index.ts @@ -0,0 +1,4 @@ +import LoginForm from './LoginForm.vue' +import RegisterForm from './RegisterForm.vue' + +export { LoginForm, RegisterForm } diff --git a/src/views/Personal/PersonalCenter/PersonalCenter.vue b/src/views/Personal/PersonalCenter/PersonalCenter.vue new file mode 100644 index 0000000..dc09883 --- /dev/null +++ b/src/views/Personal/PersonalCenter/PersonalCenter.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/src/views/Personal/PersonalCenter/components/EditInfo.vue b/src/views/Personal/PersonalCenter/components/EditInfo.vue new file mode 100644 index 0000000..bd684b7 --- /dev/null +++ b/src/views/Personal/PersonalCenter/components/EditInfo.vue @@ -0,0 +1,96 @@ + + + diff --git a/src/views/Personal/PersonalCenter/components/EditPassword.vue b/src/views/Personal/PersonalCenter/components/EditPassword.vue new file mode 100644 index 0000000..7b320f3 --- /dev/null +++ b/src/views/Personal/PersonalCenter/components/EditPassword.vue @@ -0,0 +1,110 @@ + + + diff --git a/src/views/Personal/PersonalCenter/components/UploadAvatar.vue b/src/views/Personal/PersonalCenter/components/UploadAvatar.vue new file mode 100644 index 0000000..9b40e21 --- /dev/null +++ b/src/views/Personal/PersonalCenter/components/UploadAvatar.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/views/Redirect/Redirect.vue b/src/views/Redirect/Redirect.vue new file mode 100644 index 0000000..0b7af7b --- /dev/null +++ b/src/views/Redirect/Redirect.vue @@ -0,0 +1,30 @@ + + diff --git a/src/views/hooks/useClipboard.vue b/src/views/hooks/useClipboard.vue new file mode 100644 index 0000000..f49125e --- /dev/null +++ b/src/views/hooks/useClipboard.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/views/hooks/useCrudSchemas.vue b/src/views/hooks/useCrudSchemas.vue new file mode 100644 index 0000000..69a2d7f --- /dev/null +++ b/src/views/hooks/useCrudSchemas.vue @@ -0,0 +1,186 @@ + + + diff --git a/src/views/hooks/useNetwork.vue b/src/views/hooks/useNetwork.vue new file mode 100644 index 0000000..dd6ed93 --- /dev/null +++ b/src/views/hooks/useNetwork.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/hooks/useTagsView.vue b/src/views/hooks/useTagsView.vue new file mode 100644 index 0000000..1bacedc --- /dev/null +++ b/src/views/hooks/useTagsView.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/views/hooks/useValidator.vue b/src/views/hooks/useValidator.vue new file mode 100644 index 0000000..c3d6131 --- /dev/null +++ b/src/views/hooks/useValidator.vue @@ -0,0 +1,80 @@ + + + diff --git a/src/views/hooks/useWatermark.vue b/src/views/hooks/useWatermark.vue new file mode 100644 index 0000000..bd5cc84 --- /dev/null +++ b/src/views/hooks/useWatermark.vue @@ -0,0 +1,31 @@ + + + diff --git a/stylelint.config.cjs b/stylelint.config.cjs new file mode 100644 index 0000000..a50d202 --- /dev/null +++ b/stylelint.config.cjs @@ -0,0 +1,231 @@ +module.exports = { + root: true, + plugins: ['stylelint-order'], + customSyntax: 'postcss-html', + extends: ['stylelint-config-standard'], + rules: { + 'selector-pseudo-class-no-unknown': [ + true, + { + ignorePseudoClasses: ['global', 'deep'] + } + ], + 'at-rule-no-unknown': [ + true, + { + ignoreAtRules: ['function', 'if', 'each', 'include', 'mixin'] + } + ], + 'media-query-no-invalid': null, + 'function-no-unknown': null, + 'no-empty-source': null, + 'named-grid-areas-no-invalid': null, + 'no-descending-specificity': null, + 'font-family-no-missing-generic-family-keyword': null, + 'rule-empty-line-before': [ + 'always', + { + ignore: ['after-comment', 'first-nested'] + } + ], + 'unit-no-unknown': [ + true, + { + ignoreUnits: ['rpx'] + } + ], + 'order/order': [ + [ + 'dollar-variables', + 'custom-properties', + 'at-rules', + 'declarations', + { + type: 'at-rule', + name: 'supports' + }, + { + type: 'at-rule', + name: 'media' + }, + 'rules' + ], + { + severity: 'warning' + } + ], + // Specify the alphabetical order of the attributes in the declaration block + 'order/properties-order': [ + 'position', + 'top', + 'right', + 'bottom', + 'left', + 'z-index', + 'display', + 'float', + 'width', + 'height', + 'max-width', + 'max-height', + 'min-width', + 'min-height', + 'padding', + 'padding-top', + 'padding-right', + 'padding-bottom', + 'padding-left', + 'margin', + 'margin-top', + 'margin-right', + 'margin-bottom', + 'margin-left', + 'margin-collapse', + 'margin-top-collapse', + 'margin-right-collapse', + 'margin-bottom-collapse', + 'margin-left-collapse', + 'overflow', + 'overflow-x', + 'overflow-y', + 'clip', + 'clear', + 'font', + 'font-family', + 'font-size', + 'font-smoothing', + 'osx-font-smoothing', + 'font-style', + 'font-weight', + 'hyphens', + 'src', + 'line-height', + 'letter-spacing', + 'word-spacing', + 'color', + 'text-align', + 'text-decoration', + 'text-indent', + 'text-overflow', + 'text-rendering', + 'text-size-adjust', + 'text-shadow', + 'text-transform', + 'word-break', + 'word-wrap', + 'white-space', + 'vertical-align', + 'list-style', + 'list-style-type', + 'list-style-position', + 'list-style-image', + 'pointer-events', + 'cursor', + 'background', + 'background-attachment', + 'background-color', + 'background-image', + 'background-position', + 'background-repeat', + 'background-size', + 'border', + 'border-collapse', + 'border-top', + 'border-right', + 'border-bottom', + 'border-left', + 'border-color', + 'border-image', + 'border-top-color', + 'border-right-color', + 'border-bottom-color', + 'border-left-color', + 'border-spacing', + 'border-style', + 'border-top-style', + 'border-right-style', + 'border-bottom-style', + 'border-left-style', + 'border-width', + 'border-top-width', + 'border-right-width', + 'border-bottom-width', + 'border-left-width', + 'border-radius', + 'border-top-right-radius', + 'border-bottom-right-radius', + 'border-bottom-left-radius', + 'border-top-left-radius', + 'border-radius-topright', + 'border-radius-bottomright', + 'border-radius-bottomleft', + 'border-radius-topleft', + 'content', + 'quotes', + 'outline', + 'outline-offset', + 'opacity', + 'filter', + 'visibility', + 'size', + 'zoom', + 'transform', + 'box-align', + 'box-flex', + 'box-orient', + 'box-pack', + 'box-shadow', + 'box-sizing', + 'table-layout', + 'animation', + 'animation-delay', + 'animation-duration', + 'animation-iteration-count', + 'animation-name', + 'animation-play-state', + 'animation-timing-function', + 'animation-fill-mode', + 'transition', + 'transition-delay', + 'transition-duration', + 'transition-property', + 'transition-timing-function', + 'background-clip', + 'backface-visibility', + 'resize', + 'appearance', + 'user-select', + 'interpolation-mode', + 'direction', + 'marks', + 'page', + 'set-link-source', + 'unicode-bidi', + 'speak' + ] + }, + ignoreFiles: ['**/*.js', '**/*.jsx', '**/*.tsx', '**/*.ts'], + overrides: [ + { + files: ['*.vue', '**/*.vue', '*.html', '**/*.html'], + extends: ['stylelint-config-recommended', 'stylelint-config-html'], + rules: { + 'keyframes-name-pattern': null, + 'selector-class-pattern': null, + 'no-duplicate-selectors': null, + 'selector-pseudo-class-no-unknown': [ + true, + { + ignorePseudoClasses: ['deep', 'global'] + } + ], + 'selector-pseudo-element-no-unknown': [ + true, + { + ignorePseudoElements: ['v-deep', 'v-global', 'v-slotted'] + } + ] + } + } + ] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..fe67772 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,37 @@ +{ + "compilerOptions": { + "target": "esnext", + "useDefineForClassFields": true, + "module": "esnext", + "moduleResolution": "node", + "strict": true, + "jsx": "preserve", + "sourceMap": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "jsxImportSource": "vue", + "lib": ["esnext", "dom"], + "baseUrl": "./", + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": true, + "strictFunctionTypes": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "experimentalDecorators": true, + "noImplicitAny": false, + "skipLibCheck": true, + "paths": { + "@/*": ["src/*"] + }, + "types": [ + "@intlify/unplugin-vue-i18n/types", + "vite/client", + "element-plus/global", + "@types/qrcode", + "vite-plugin-svg-icons/client" + ] + }, + "include": ["src", "types/**/*.d.ts", "mock/**/*.ts"] + // "exclude": ["dist", "node_modules"] +} diff --git a/types/components.d.ts b/types/components.d.ts new file mode 100644 index 0000000..15b5a6b --- /dev/null +++ b/types/components.d.ts @@ -0,0 +1,9 @@ +declare module 'vue' { + export interface GlobalComponents { + Icon: (typeof import('../src/components/Icon/index'))['Icon'] + Permission: (typeof import('../src/components/Permission/index'))['Permission'] + BaseButton: (typeof import('../src/components/Button/index'))['BaseButton'] + } +} + +export {} diff --git a/types/env.d.ts b/types/env.d.ts new file mode 100644 index 0000000..3811725 --- /dev/null +++ b/types/env.d.ts @@ -0,0 +1,14 @@ +/// + +declare module '*.vue' { + import { DefineComponent } from 'vue' + + const component: DefineComponent<{}, {}, any> + export default component +} + +declare global { + interface ImportMeta { + readonly env: ImportMetaEnv + } +} diff --git a/types/global.d.ts b/types/global.d.ts new file mode 100644 index 0000000..c8ef5ed --- /dev/null +++ b/types/global.d.ts @@ -0,0 +1,87 @@ +import type { CSSProperties } from 'vue' +import { RawAxiosRequestHeaders } from 'axios' +declare global { + declare interface Fn { + (...arg: T[]): T + } + + declare type Nullable = T | null + + declare type ElRef = Nullable + + declare type Recordable = Record + + declare type RemoveReadonly = { + -readonly [P in keyof T]: T[P] + } + + declare type ComponentRef = InstanceType + + declare type LocaleType = 'zh-CN' | 'en' + + declare type TimeoutHandle = ReturnType + declare type IntervalHandle = ReturnType + + declare type ElementPlusInfoType = 'success' | 'info' | 'warning' | 'danger' + + declare type LayoutType = 'classic' | 'topLeft' | 'top' | 'cutMenu' + + declare type AxiosContentType = + | 'application/json' + | 'application/x-www-form-urlencoded' + | 'multipart/form-data' + | 'text/plain' + + declare type AxiosMethod = 'get' | 'post' | 'delete' | 'put' + + declare type AxiosResponseType = 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream' + + declare interface AxiosConfig { + params?: any + data?: any + url?: string + method?: AxiosMethod + headers?: RawAxiosRequestHeaders + responseType?: AxiosResponseType + } + + declare interface IResponse { + code: number + data: T extends any ? T : T & any + } + + declare interface ThemeTypes { + elColorPrimary?: string + leftMenuBorderColor?: string + leftMenuBgColor?: string + leftMenuBgLightColor?: string + leftMenuBgActiveColor?: string + leftMenuCollapseBgActiveColor?: string + leftMenuTextColor?: string + leftMenuTextActiveColor?: string + logoTitleTextColor?: string + logoBorderColor?: string + topHeaderBgColor?: string + topHeaderTextColor?: string + topHeaderHoverColor?: string + topToolBorderColor?: string + } + + declare interface ImportMetaEnv { + readonly VITE_NODE_ENV: string + readonly VITE_APP_TITLE: string + readonly VITE_API_BASE_PATH: string + readonly VITE_BASE_PATH: string + readonly VITE_DROP_DEBUGGER: string + readonly VITE_DROP_CONSOLE: string + readonly VITE_SOURCEMAP: string + readonly VITE_OUT_DIR: string + readonly VITE_USE_BUNDLE_ANALYZER: string + readonly VITE_USE_ALL_ELEMENT_PLUS_STYLE: string + readonly VITE_USE_MOCK: string + readonly VITE_USE_CSS_SPLIT: string + readonly VITE_USE_ONLINE_ICON: string + readonly VITE_ICON_PREFIX: string + readonly VITE_HIDE_GLOBAL_SETTING: string + } +} diff --git a/types/router.d.ts b/types/router.d.ts new file mode 100644 index 0000000..32d9447 --- /dev/null +++ b/types/router.d.ts @@ -0,0 +1,78 @@ +import type { RouteRecordRaw } from 'vue-router' +import { defineComponent } from 'vue' + +/** +* redirect: noredirect 当设置 noredirect 的时候该路由在面包屑导航中不可被点击 +* name:'router-name' 设定路由的名字,一定要填写不然使用时会出现各种问题 +* meta : { + hidden: true 当设置 true 的时候该路由不会再侧边栏出现 如404,login等页面(默认 false) + + alwaysShow: true 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式, + 只有一个时,会将那个子路由当做根路由显示在侧边栏, + 若你想不管路由下面的 children 声明的个数都显示你的根路由, + 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则, + 一直显示根路由(默认 false) + + title: 'title' 设置该路由在侧边栏和面包屑中展示的名字 + + icon: 'svg-name' 设置该路由的图标 + + noCache: true 如果设置为true,则不会被 缓存(默认 false) + + breadcrumb: false 如果设置为false,则不会在breadcrumb面包屑中显示(默认 true) + + affix: true 如果设置为true,则会一直固定在tag项中(默认 false) + + noTagsView: true 如果设置为true,则不会出现在tag中(默认 false) + + activeMenu: '/dashboard' 显示高亮的路由路径 + + canTo: true 设置为true即使hidden为true,也依然可以进行路由跳转(默认 false) + + permission: ['edit','add', 'delete'] 设置该路由的权限 + } +**/ + +interface RouteMetaCustom extends Record { + hidden?: boolean + alwaysShow?: boolean + title?: string + icon?: string + noCache?: boolean + breadcrumb?: boolean + affix?: boolean + activeMenu?: string + noTagsView?: boolean + canTo?: boolean + permission?: string[] +} + +declare module 'vue-router' { + interface RouteMeta extends RouteMetaCustom {} +} + +type Component = + | ReturnType + | (() => Promise) + | (() => Promise) + +declare global { + declare interface AppRouteRecordRaw extends Omit { + name: string + meta: RouteMetaCustom + component?: Component | string + children?: AppRouteRecordRaw[] + props?: Recordable + fullPath?: string + } + + declare interface AppCustomRouteRecordRaw + extends Omit { + name: string + meta: RouteMetaCustom + component: string + path: string + redirect: string + children?: AppCustomRouteRecordRaw[] + } +} diff --git a/uno.config.ts b/uno.config.ts new file mode 100644 index 0000000..997f6c8 --- /dev/null +++ b/uno.config.ts @@ -0,0 +1,146 @@ +import { defineConfig, toEscapedSelector as e, presetUno, presetIcons } from 'unocss' +import transformerVariantGroup from '@unocss/transformer-variant-group' +import { loadEnv } from 'vite' +import { ICON_PREFIX } from './src/constants' + +const root = process.cwd() + +const createPresetIcons = () => { + const isBuild = !!process.argv[4] + let env = {} as any + if (!isBuild) { + env = loadEnv(process.argv[3], root) + } else { + env = loadEnv(process.argv[4], root) + } + // @ts-ignore + if (env.VITE_USE_ONLINE_ICON === 'true') { + return [] + } else { + return [ + presetIcons({ + autoInstall: false, + prefix: ICON_PREFIX + }) + ] + } +} + +export default defineConfig({ + // ...UnoCSS options + rules: [ + [ + /^overflow-ellipsis$/, + ([], { rawSelector }) => { + const selector = e(rawSelector) + return ` +${selector} { + text-overflow: ellipsis; +} +` + } + ], + [ + /^custom-hover$/, + ([], { rawSelector }) => { + const selector = e(rawSelector) + return ` +${selector} { + display: flex; + height: 100%; + padding: 1px 10px 0; + cursor: pointer; + align-items: center; + transition: background var(--transition-time-02); +} +/* you can have multiple rules */ +${selector}:hover { + background-color: var(--top-header-hover-color); +} +.dark ${selector}:hover { + background-color: var(--el-bg-color-overlay); +} +` + } + ], + [ + /^layout-border__left$/, + ([], { rawSelector }) => { + const selector = e(rawSelector) + return ` +${selector}:before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 1px; + height: 100%; + background-color: var(--el-border-color); + z-index: 3; +} +` + } + ], + [ + /^layout-border__right$/, + ([], { rawSelector }) => { + const selector = e(rawSelector) + return ` +${selector}:after { + content: ""; + position: absolute; + top: 0; + right: 0; + width: 1px; + height: 100%; + background-color: var(--el-border-color); + z-index: 3; +} +` + } + ], + [ + /^layout-border__top$/, + ([], { rawSelector }) => { + const selector = e(rawSelector) + return ` +${selector}:before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 1px; + background-color: var(--el-border-color); + z-index: 3; +} +` + } + ], + [ + /^layout-border__bottom$/, + ([], { rawSelector }) => { + const selector = e(rawSelector) + return ` +${selector}:after { + content: ""; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 1px; + background-color: var(--el-border-color); + z-index: 3; +} +` + } + ] + ], + presets: [presetUno({ dark: 'class', attributify: false }), ...createPresetIcons()], + transformers: [transformerVariantGroup()], + content: { + pipeline: { + include: [/\.(vue|svelte|[jt]sx|mdx?|astro|elm|php|phtml|html|ts)($|\?)/] + } + } +}) diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..749c3c1 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,181 @@ +import { resolve } from 'path' +import { loadEnv } from 'vite' +import type { UserConfig, ConfigEnv } from 'vite' +import Vue from '@vitejs/plugin-vue' +import VueJsx from '@vitejs/plugin-vue-jsx' +import progress from 'vite-plugin-progress' +import EslintPlugin from 'vite-plugin-eslint' +import { ViteEjsPlugin } from 'vite-plugin-ejs' +import { viteMockServe } from 'vite-plugin-mock' +import PurgeIcons from 'vite-plugin-purge-icons' +import ServerUrlCopy from 'vite-plugin-url-copy' +import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite' +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' +import { createStyleImportPlugin, ElementPlusResolve } from 'vite-plugin-style-import' +import UnoCSS from 'unocss/vite' +import { visualizer } from 'rollup-plugin-visualizer' + +// https://vitejs.dev/config/ +const root = process.cwd() + +function pathResolve(dir: string) { + return resolve(root, '.', dir) +} + +export default ({ command, mode }: ConfigEnv): UserConfig => { + let env = {} as any + const isBuild = command === 'build' + if (!isBuild) { + env = loadEnv(process.argv[3] === '--mode' ? process.argv[4] : process.argv[3], root) + } else { + env = loadEnv(mode, root) + } + return { + base: env.VITE_BASE_PATH, + plugins: [ + Vue({ + script: { + // 开启defineModel + defineModel: true + } + }), + VueJsx(), + ServerUrlCopy(), + progress(), + env.VITE_USE_ALL_ELEMENT_PLUS_STYLE === 'false' + ? createStyleImportPlugin({ + resolves: [ElementPlusResolve()], + libs: [ + { + libraryName: 'element-plus', + esModule: true, + resolveStyle: (name) => { + if (name === 'click-outside') { + return '' + } + return `element-plus/es/components/${name.replace(/^el-/, '')}/style/css` + } + } + ] + }) + : undefined, + EslintPlugin({ + cache: false, + failOnWarning: false, + failOnError: false, + include: ['src/**/*.vue', 'src/**/*.ts', 'src/**/*.tsx'] // 检查的文件 + }), + VueI18nPlugin({ + runtimeOnly: true, + compositionOnly: true, + include: [resolve(__dirname, 'src/locales/**')] + }), + createSvgIconsPlugin({ + iconDirs: [pathResolve('src/assets/svgs')], + symbolId: 'icon-[dir]-[name]', + svgoOptions: true + }), + PurgeIcons(), + env.VITE_USE_MOCK === 'true' + ? viteMockServe({ + ignore: /^\_/, + mockPath: 'mock', + localEnabled: !isBuild, + prodEnabled: isBuild, + injectCode: ` + import { setupProdMockServer } from '../mock/_createProductionServer' + + setupProdMockServer() + ` + }) + : undefined, + ViteEjsPlugin({ + title: env.VITE_APP_TITLE + }), + UnoCSS() + ], + + css: { + preprocessorOptions: { + less: { + additionalData: '@import "./src/styles/variables.module.less";', + javascriptEnabled: true + } + } + }, + resolve: { + extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.less', '.css'], + alias: [ + { + find: 'vue-i18n', + replacement: 'vue-i18n/dist/vue-i18n.cjs.js' + }, + { + find: /\@\//, + replacement: `${pathResolve('src')}/` + } + ] + }, + esbuild: { + pure: env.VITE_DROP_CONSOLE === 'true' ? ['console.log'] : undefined, + drop: env.VITE_DROP_DEBUGGER === 'true' ? ['debugger'] : undefined + }, + build: { + target: 'es2015', + outDir: env.VITE_OUT_DIR || 'dist', + sourcemap: env.VITE_SOURCEMAP === 'true', + // brotliSize: false, + rollupOptions: { + plugins: env.VITE_USE_BUNDLE_ANALYZER === 'true' ? [visualizer()] : undefined, + // 拆包 + output: { + manualChunks: { + 'vue-chunks': ['vue', 'vue-router', 'pinia', 'vue-i18n'], + 'element-plus': ['element-plus'], + 'wang-editor': ['@wangeditor/editor', '@wangeditor/editor-for-vue'], + echarts: ['echarts', 'echarts-wordcloud'] + } + } + }, + cssCodeSplit: !(env.VITE_USE_CSS_SPLIT === 'false'), + cssTarget: ['chrome31'] + }, + server: { + port: 4000, + proxy: { + // 选项写法 + '/api': { + target: 'http://127.0.0.1:8000', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, '') + } + }, + hmr: { + overlay: false + }, + host: '0.0.0.0' + }, + optimizeDeps: { + include: [ + 'vue', + 'vue-router', + 'vue-types', + 'element-plus/es/locale/lang/zh-cn', + 'element-plus/es/locale/lang/en', + '@iconify/iconify', + '@vueuse/core', + 'axios', + 'qs', + 'echarts', + 'echarts-wordcloud', + 'qrcode', + '@wangeditor/editor', + '@wangeditor/editor-for-vue', + 'vue-json-pretty', + '@zxcvbn-ts/core', + 'dayjs', + 'cropperjs' + ] + } + } +}