From a1fc770fdc28b83d1a885d453534045263cf1e92 Mon Sep 17 00:00:00 2001 From: zhangshengli <18103773227@163.com> Date: Tue, 11 Jul 2023 16:21:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E6=A1=86=E6=9E=B6=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 19 + .env | 22 + .env.development | 23 + .env.production | 33 + .eslintignore | 15 + .eslintrc.js | 78 + .gitignore | 34 + .gitpod.yml | 6 + .prettierignore | 9 + .stylelintignore | 3 + .yarnclean | 48 + Dockerfile | 30 + LICENSE | 32 + README.md | 441 + build/config/themeConfig.ts | 79 + build/constant.ts | 6 + build/generate/generateModifyVars.ts | 37 + build/generate/icon/index.ts | 68 + build/getConfigFileName.ts | 7 + build/script/buildConf.ts | 47 + build/script/postBuild.ts | 23 + build/utils.ts | 92 + build/vite/plugin/compress.ts | 32 + build/vite/plugin/html.ts | 40 + build/vite/plugin/imagemin.ts | 34 + build/vite/plugin/index.ts | 80 + build/vite/plugin/mock.ts | 19 + build/vite/plugin/pwa.ts | 33 + build/vite/plugin/styleImport.ts | 81 + build/vite/plugin/svgSprite.ts | 17 + build/vite/plugin/theme.ts | 100 + build/vite/plugin/visualizer.ts | 17 + build/vite/proxy.ts | 34 + commitlint.config.js | 32 + index.html | 170 + jest.config.mjs | 36 + mock/_createProductionServer.ts | 18 + mock/_util.ts | 63 + mock/demo/account.ts | 70 + mock/demo/select-demo.ts | 28 + mock/demo/system.ts | 298 + mock/demo/table-demo.ts | 52 + mock/demo/tree-demo.ts | 38 + mock/sys/menu.ts | 270 + mock/sys/user.ts | 124 + npm | 0 package.json | 302 + pnpm-lock.yaml | 16804 ++++++++++++++++ postcss.config.js | 5 + prettier.config.js | 20 + public/favicon.ico | Bin 0 -> 430 bytes public/logo.png | Bin 0 -> 7519 bytes public/resource/img/logo.png | Bin 0 -> 7519 bytes public/resource/img/pwa-192x192.png | Bin 0 -> 12205 bytes public/resource/img/pwa-512x512.png | Bin 0 -> 52656 bytes public/resource/js/iconfont.js | 1 + public/resource/tinymce/langs/en.js | 419 + public/resource/tinymce/langs/zh_CN.js | 389 + .../tinymce/skins/ui/jeecg/content.css | 711 + .../tinymce/skins/ui/jeecg/content.inline.css | 705 + .../skins/ui/jeecg/content.inline.min.css | 7 + .../tinymce/skins/ui/jeecg/content.min.css | 7 + .../tinymce/skins/ui/jeecg/content.mobile.css | 29 + .../skins/ui/jeecg/content.mobile.min.css | 7 + .../skins/ui/jeecg/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes .../resource/tinymce/skins/ui/jeecg/skin.css | 3045 +++ .../tinymce/skins/ui/jeecg/skin.min.css | 7 + .../tinymce/skins/ui/jeecg/skin.mobile.css | 677 + .../skins/ui/jeecg/skin.mobile.min.css | 7 + .../ui/oxide-dark/content.inline.min.css | 239 + .../skins/ui/oxide-dark/content.min.css | 235 + .../ui/oxide-dark/content.mobile.min.css | 17 + .../tinymce/skins/ui/oxide-dark/skin.min.css | 875 + .../skins/ui/oxide-dark/skin.mobile.min.css | 239 + .../skins/ui/oxide/content.inline.min.css | 239 + .../tinymce/skins/ui/oxide/content.min.css | 235 + .../skins/ui/oxide/content.mobile.min.css | 17 + .../skins/ui/oxide/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes .../tinymce/skins/ui/oxide/skin.min.css | 875 + .../skins/ui/oxide/skin.mobile.min.css | 239 + src/App.vue | 21 + src/api/common/api.ts | 150 + src/api/demo/account.ts | 16 + src/api/demo/error.ts | 12 + src/api/demo/model/accountModel.ts | 7 + src/api/demo/model/optionsModel.ts | 15 + src/api/demo/model/systemModel.ts | 103 + src/api/demo/model/tableModel.ts | 20 + src/api/demo/select.ts | 10 + src/api/demo/system.ts | 45 + src/api/demo/table.ts | 19 + src/api/demo/tree.ts | 10 + src/api/model/baseModel.ts | 14 + src/api/sys/menu.ts | 33 + src/api/sys/model/menuModel.ts | 16 + src/api/sys/model/uploadModel.ts | 5 + src/api/sys/model/userModel.ts | 58 + src/api/sys/upload.ts | 32 + src/api/sys/user.ts | 197 + src/assets/icons/download-count.svg | 1 + src/assets/icons/dynamic-avatar-1.svg | 1 + src/assets/icons/dynamic-avatar-2.svg | 1 + src/assets/icons/dynamic-avatar-3.svg | 1 + src/assets/icons/dynamic-avatar-4.svg | 1 + src/assets/icons/dynamic-avatar-5.svg | 1 + src/assets/icons/dynamic-avatar-6.svg | 1 + src/assets/icons/js/iconfont.js | 1 + src/assets/icons/lock.svg | 1 + src/assets/icons/moon.svg | 16 + src/assets/icons/sun.svg | 42 + src/assets/icons/test.svg | 21 + src/assets/icons/total-sales.svg | 1 + src/assets/icons/transaction.svg | 1 + src/assets/icons/visit-count.svg | 1 + src/assets/images/checkcode.png | Bin 0 -> 2236 bytes src/assets/images/cms_bpm.png | Bin 0 -> 12382 bytes src/assets/images/cms_oa.png | Bin 0 -> 11340 bytes src/assets/images/daiban.png | Bin 0 -> 3632 bytes src/assets/images/demo.png | Bin 0 -> 33342 bytes src/assets/images/duban.png | Bin 0 -> 4933 bytes src/assets/images/guaz.png | Bin 0 -> 7491 bytes src/assets/images/header.jpg | Bin 0 -> 16880 bytes src/assets/images/link.png | Bin 0 -> 4211 bytes src/assets/images/logo.png | Bin 0 -> 7519 bytes src/assets/images/nodata.png | Bin 0 -> 101556 bytes src/assets/images/panel_cover.png | Bin 0 -> 2351 bytes src/assets/images/pdf4.jpg | Bin 0 -> 50960 bytes src/assets/images/zaiban.png | Bin 0 -> 10332 bytes src/assets/less/JAreaLinkage.less | 258 + src/assets/loginmini/icon/icon-code.png | Bin 0 -> 3079 bytes src/assets/loginmini/icon/icon-eye-g.png | Bin 0 -> 6778 bytes src/assets/loginmini/icon/icon-eye-k.png | Bin 0 -> 5682 bytes src/assets/loginmini/icon/icon-line-msg.png | Bin 0 -> 4230 bytes src/assets/loginmini/icon/icon-line-pad.png | Bin 0 -> 3114 bytes src/assets/loginmini/icon/icon-line-tel.png | Bin 0 -> 2450 bytes src/assets/loginmini/icon/icon-line-user.png | Bin 0 -> 5173 bytes src/assets/loginmini/icon/icon-password.png | Bin 0 -> 2101 bytes src/assets/loginmini/icon/icon-success.png | Bin 0 -> 14838 bytes src/assets/loginmini/icon/icon-user.png | Bin 0 -> 2701 bytes src/assets/loginmini/icon/icon_dow.png | Bin 0 -> 536 bytes src/assets/loginmini/icon/jeecg_ad.png | Bin 0 -> 85653 bytes src/assets/loginmini/icon/jeecg_ad_text.png | Bin 0 -> 24801 bytes src/assets/loginmini/icon/jeecg_bg.png | Bin 0 -> 23254 bytes src/assets/loginmini/icon/jeecg_logo.png | Bin 0 -> 11764 bytes src/assets/loginmini/icon/logo.png | Bin 0 -> 3978 bytes src/assets/loginmini/style/base.less | 365 + src/assets/loginmini/style/home.less | 612 + src/assets/svg/fileType/excel.svg | 1 + src/assets/svg/fileType/other.svg | 1 + src/assets/svg/fileType/pdf.svg | 1 + src/assets/svg/fileType/txt.svg | 1 + src/assets/svg/fileType/word.svg | 1 + src/assets/svg/illustration.svg | 1 + src/assets/svg/login-bg-dark.svg | 19 + src/assets/svg/login-bg.svg | 17 + src/assets/svg/login-box-bg.svg | 1 + src/assets/svg/net-error.svg | 1 + src/assets/svg/no-data.svg | 1 + src/assets/svg/preview/p-rotate.svg | 1 + src/assets/svg/preview/resume.svg | 1 + src/assets/svg/preview/scale.svg | 1 + src/assets/svg/preview/unrotate.svg | 1 + src/assets/svg/preview/unscale.svg | 1 + src/components/Application/index.ts | 15 + .../Application/src/AppDarkModeToggle.vue | 76 + .../Application/src/AppLocalePicker.vue | 76 + src/components/Application/src/AppLogo.vue | 89 + .../Application/src/AppProvider.vue | 77 + .../Application/src/search/AppSearch.vue | 33 + .../src/search/AppSearchFooter.vue | 55 + .../src/search/AppSearchKeyItem.vue | 11 + .../Application/src/search/AppSearchModal.vue | 260 + .../Application/src/search/useMenuSearch.ts | 170 + .../Application/src/useAppContext.ts | 17 + src/components/Authority/index.ts | 4 + src/components/Authority/src/Authority.vue | 45 + src/components/Basic/index.ts | 8 + src/components/Basic/src/BasicArrow.vue | 84 + src/components/Basic/src/BasicHelp.vue | 112 + src/components/Basic/src/BasicTitle.vue | 76 + src/components/Button/index.ts | 11 + src/components/Button/src/BasicButton.vue | 41 + src/components/Button/src/JUploadButton.vue | 41 + .../Button/src/PopConfirmButton.vue | 56 + src/components/Button/src/props.ts | 21 + src/components/CardList/index.ts | 4 + src/components/CardList/src/CardList.vue | 164 + src/components/CardList/src/data.ts | 25 + src/components/ClickOutSide/index.ts | 4 + .../ClickOutSide/src/ClickOutSide.vue | 19 + src/components/CodeEditor/index.ts | 6 + src/components/CodeEditor/src/CodeEditor.vue | 49 + .../CodeEditor/src/codemirror/CodeMirror.vue | 102 + .../CodeEditor/src/codemirror/codeMirror.ts | 21 + .../CodeEditor/src/codemirror/codemirror.css | 539 + .../src/json-preview/JsonPreview.vue | 12 + src/components/CodeEditor/src/typing.ts | 5 + src/components/Container/index.ts | 10 + .../Container/src/LazyContainer.vue | 138 + .../Container/src/ScrollContainer.vue | 93 + .../src/collapse/CollapseContainer.vue | 105 + .../Container/src/collapse/CollapseHeader.vue | 38 + src/components/Container/src/typing.ts | 17 + src/components/ContextMenu/index.ts | 3 + .../ContextMenu/src/ContextMenu.vue | 196 + .../ContextMenu/src/createContextMenu.ts | 75 + src/components/ContextMenu/src/typing.ts | 35 + src/components/CountDown/index.ts | 6 + src/components/CountDown/src/CountButton.vue | 60 + .../CountDown/src/CountdownInput.vue | 54 + src/components/CountDown/src/useCountdown.ts | 51 + src/components/CountTo/index.ts | 4 + src/components/CountTo/src/CountTo.vue | 110 + src/components/Cropper/index.ts | 7 + src/components/Cropper/src/CopperModal.vue | 237 + src/components/Cropper/src/Cropper.vue | 181 + src/components/Cropper/src/CropperAvatar.vue | 136 + src/components/Cropper/src/typing.ts | 8 + src/components/Description/index.ts | 6 + .../Description/src/Description.vue | 181 + src/components/Description/src/typing.ts | 47 + .../Description/src/useDescription.ts | 28 + src/components/Drawer/index.ts | 6 + src/components/Drawer/src/BasicDrawer.vue | 237 + .../Drawer/src/components/DrawerFooter.vue | 75 + .../Drawer/src/components/DrawerHeader.vue | 74 + src/components/Drawer/src/props.ts | 45 + src/components/Drawer/src/typing.ts | 196 + src/components/Drawer/src/useDrawer.ts | 146 + src/components/Dropdown/index.ts | 5 + src/components/Dropdown/src/Dropdown.vue | 113 + src/components/Dropdown/src/typing.ts | 9 + src/components/Form/index.ts | 35 + src/components/Form/src/BasicForm.vue | 381 + src/components/Form/src/componentMap.ts | 143 + .../Form/src/components/ApiRadioGroup.vue | 130 + .../Form/src/components/ApiSelect.vue | 149 + .../Form/src/components/ApiTreeSelect.vue | 86 + .../Form/src/components/FormAction.vue | 121 + .../Form/src/components/FormItem.vue | 364 + .../Form/src/components/RadioButtonGroup.vue | 57 + src/components/Form/src/helper.ts | 68 + src/components/Form/src/hooks/useAdvanced.ts | 164 + src/components/Form/src/hooks/useAutoFocus.ts | 35 + .../Form/src/hooks/useComponentRegister.ts | 11 + src/components/Form/src/hooks/useForm.ts | 159 + .../Form/src/hooks/useFormContext.ts | 17 + .../Form/src/hooks/useFormEvents.ts | 276 + .../Form/src/hooks/useFormValues.ts | 59 + .../Form/src/hooks/useLabelWidth.ts | 44 + .../Form/src/jeecg/components/JAddInput.vue | 123 + .../src/jeecg/components/JAreaLinkage.vue | 76 + .../Form/src/jeecg/components/JAreaSelect.vue | 165 + .../src/jeecg/components/JCategorySelect.vue | 258 + .../Form/src/jeecg/components/JCheckbox.vue | 91 + .../Form/src/jeecg/components/JCodeEditor.vue | 298 + .../src/jeecg/components/JDictSelectTag.vue | 211 + .../components/JEasyCron/EasyCronInner.vue | 319 + .../components/JEasyCron/EasyCronInput.vue | 63 + .../components/JEasyCron/EasyCronModal.vue | 28 + .../src/jeecg/components/JEasyCron/LICENSE | 21 + .../components/JEasyCron/easy.cron.data.ts | 10 + .../components/JEasyCron/easy.cron.inner.less | 59 + .../components/JEasyCron/easy.cron.input.less | 14 + .../src/jeecg/components/JEasyCron/index.ts | 6 + .../jeecg/components/JEasyCron/tabs/DayUI.vue | 94 + .../components/JEasyCron/tabs/HourUI.vue | 59 + .../components/JEasyCron/tabs/MinuteUI.vue | 59 + .../components/JEasyCron/tabs/MonthUI.vue | 59 + .../components/JEasyCron/tabs/SecondUI.vue | 59 + .../components/JEasyCron/tabs/WeekUI.vue | 125 + .../components/JEasyCron/tabs/YearUI.vue | 49 + .../components/JEasyCron/tabs/useTabMixin.ts | 199 + .../jeecg/components/JEasyCron/validator.ts | 48 + .../Form/src/jeecg/components/JEditor.vue | 39 + .../Form/src/jeecg/components/JEllipsis.vue | 21 + .../src/jeecg/components/JFormContainer.vue | 62 + .../src/jeecg/components/JImageUpload.vue | 260 + .../src/jeecg/components/JImportModal.vue | 181 + .../Form/src/jeecg/components/JInput.vue | 105 + .../Form/src/jeecg/components/JInputPop.vue | 117 + .../src/jeecg/components/JMarkdownEditor.vue | 57 + .../Form/src/jeecg/components/JPopup.vue | 154 + .../Form/src/jeecg/components/JRangeDate.vue | 65 + .../src/jeecg/components/JRangeNumber.vue | 72 + .../Form/src/jeecg/components/JRangeTime.vue | 53 + .../src/jeecg/components/JSearchSelect.vue | 329 + .../Form/src/jeecg/components/JSelectDept.vue | 169 + .../src/jeecg/components/JSelectInput.vue | 89 + .../src/jeecg/components/JSelectMultiple.vue | 164 + .../src/jeecg/components/JSelectPosition.vue | 153 + .../Form/src/jeecg/components/JSelectRole.vue | 154 + .../Form/src/jeecg/components/JSelectUser.vue | 157 + .../jeecg/components/JSelectUserByDept.vue | 153 + .../Form/src/jeecg/components/JSwitch.vue | 83 + .../Form/src/jeecg/components/JTreeDict.vue | 141 + .../Form/src/jeecg/components/JTreeSelect.vue | 352 + .../src/jeecg/components/JUpload/JUpload.vue | 430 + .../jeecg/components/JUpload/JUploadModal.vue | 45 + .../JUpload/components/UploadItemActions.vue | 90 + .../src/jeecg/components/JUpload/index.ts | 3 + .../jeecg/components/JUpload/upload.data.ts | 5 + .../src/jeecg/components/base/JSelectBiz.vue | 122 + .../src/jeecg/components/base/JTreeBiz.vue | 91 + .../components/modal/DeptSelectModal.vue | 122 + .../components/modal/JPopupOnlReportModal.vue | 284 + .../components/modal/PositionSelectModal.vue | 182 + .../components/modal/RoleSelectModal.vue | 120 + .../components/modal/UserSelectByDepModal.vue | 214 + .../components/modal/UserSelectModal.vue | 233 + .../positionSelect/PositionSelectModal.vue | 282 + .../components/roleSelect/RoleSelectModal.vue | 282 + .../userSelect/SelectedUserItem.vue | 144 + .../jeecg/components/userSelect/UserList.vue | 175 + .../userSelect/UserListAndDepart.vue | 181 + .../components/userSelect/UserListAndRole.vue | 136 + .../components/userSelect/UserSelectModal.vue | 347 + .../src/jeecg/components/userSelect/index.vue | 245 + .../Form/src/jeecg/hooks/useSelectBiz.ts | 168 + .../Form/src/jeecg/hooks/useTreeBiz.ts | 275 + src/components/Form/src/jeecg/props/props.ts | 87 + src/components/Form/src/props.ts | 121 + src/components/Form/src/types/form.ts | 216 + src/components/Form/src/types/formItem.ts | 91 + src/components/Form/src/types/hooks.ts | 6 + src/components/Form/src/types/index.ts | 154 + src/components/Form/src/utils/Area.ts | 113 + src/components/Form/src/utils/GroupRequest.ts | 27 + src/components/Form/src/utils/areaDataUtil.js | 193 + src/components/Form/src/utils/formUtils.ts | 73 + src/components/Icon/data/icons.data.ts | 791 + src/components/Icon/index.ts | 7 + src/components/Icon/src/Icon.vue | 101 + src/components/Icon/src/IconPicker.vue | 178 + src/components/Icon/src/SvgIcon.vue | 61 + src/components/JVxeCustom/index.ts | 27 + .../src/components/JVxeDepartSelectCell.vue | 212 + .../src/components/JVxeFileCell.vue | 77 + .../src/components/JVxeImageCell.vue | 128 + .../JVxeCustom/src/components/JVxePcaCell.vue | 77 + .../src/components/JVxePopupCell.vue | 67 + .../components/JVxeSelectDictSearchCell.ts | 288 + .../src/components/JVxeUserSelectCell.vue | 101 + .../JVxeCustom/src/hooks/useFileCell.ts | 93 + src/components/Loading/index.ts | 5 + src/components/Loading/src/Loading.vue | 79 + src/components/Loading/src/createLoading.ts | 65 + src/components/Loading/src/typing.ts | 10 + src/components/Loading/src/useLoading.ts | 47 + src/components/Markdown/index.ts | 7 + src/components/Markdown/src/Markdown.vue | 184 + .../Markdown/src/MarkdownViewer.vue | 22 + src/components/Markdown/src/typing.ts | 4 + src/components/Menu/index.ts | 3 + src/components/Menu/src/BasicMenu.vue | 159 + .../Menu/src/components/BasicMenuItem.vue | 20 + .../Menu/src/components/BasicSubMenuItem.vue | 53 + .../Menu/src/components/MenuItemContent.vue | 34 + src/components/Menu/src/index.less | 74 + src/components/Menu/src/props.ts | 60 + src/components/Menu/src/types.ts | 25 + src/components/Menu/src/useOpenKeys.ts | 78 + src/components/Modal/index.ts | 8 + src/components/Modal/src/BasicModal.vue | 279 + src/components/Modal/src/components/Modal.tsx | 30 + .../Modal/src/components/ModalClose.vue | 159 + .../Modal/src/components/ModalFooter.vue | 34 + .../Modal/src/components/ModalHeader.vue | 22 + .../Modal/src/components/ModalWrapper.vue | 149 + src/components/Modal/src/hooks/useModal.ts | 148 + .../Modal/src/hooks/useModalContext.ts | 16 + .../Modal/src/hooks/useModalDrag.ts | 112 + .../Modal/src/hooks/useModalFullScreen.ts | 43 + src/components/Modal/src/index.less | 136 + src/components/Modal/src/props.ts | 86 + src/components/Modal/src/typing.ts | 211 + src/components/Page/index.ts | 7 + src/components/Page/injectionKey.ts | 1 + src/components/Page/src/PageFooter.vue | 49 + src/components/Page/src/PageWrapper.vue | 186 + src/components/Preview/index.ts | 2 + src/components/Preview/src/Functional.vue | 528 + src/components/Preview/src/Preview.vue | 94 + src/components/Preview/src/functional.ts | 18 + src/components/Preview/src/typing.ts | 49 + src/components/Qrcode/index.ts | 5 + src/components/Qrcode/src/Qrcode.vue | 112 + src/components/Qrcode/src/drawCanvas.ts | 32 + src/components/Qrcode/src/drawLogo.ts | 81 + src/components/Qrcode/src/qrcodePlus.ts | 4 + src/components/Qrcode/src/toCanvas.ts | 10 + src/components/Qrcode/src/typing.ts | 38 + src/components/Scrollbar/index.ts | 8 + src/components/Scrollbar/src/Scrollbar.vue | 193 + src/components/Scrollbar/src/bar.ts | 92 + src/components/Scrollbar/src/types.d.ts | 18 + src/components/Scrollbar/src/util.ts | 50 + src/components/SimpleMenu/index.ts | 2 + src/components/SimpleMenu/src/SimpleMenu.vue | 155 + .../SimpleMenu/src/SimpleMenuTag.vue | 68 + .../SimpleMenu/src/SimpleSubMenu.vue | 105 + .../SimpleMenu/src/components/Menu.vue | 148 + .../src/components/MenuCollapseTransition.vue | 78 + .../SimpleMenu/src/components/MenuItem.vue | 127 + .../SimpleMenu/src/components/SubMenuItem.vue | 311 + .../SimpleMenu/src/components/menu.less | 309 + .../SimpleMenu/src/components/types.ts | 25 + .../SimpleMenu/src/components/useMenu.ts | 84 + .../src/components/useSimpleMenuContext.ts | 18 + src/components/SimpleMenu/src/index.less | 77 + src/components/SimpleMenu/src/types.ts | 5 + src/components/SimpleMenu/src/useOpenKeys.ts | 44 + src/components/StrengthMeter/index.ts | 4 + .../StrengthMeter/src/StrengthMeter.vue | 135 + src/components/Table/index.ts | 10 + src/components/Table/src/BasicTable.vue | 433 + src/components/Table/src/componentMap.ts | 26 + .../src/components/EditTableHeaderIcon.vue | 16 + .../Table/src/components/ExpandIcon.tsx | 23 + .../Table/src/components/HeaderCell.vue | 48 + .../Table/src/components/TableAction.vue | 201 + .../Table/src/components/TableFooter.vue | 94 + .../Table/src/components/TableHeader.vue | 165 + .../Table/src/components/TableImg.vue | 76 + .../Table/src/components/TableTitle.vue | 53 + .../src/components/editable/CellComponent.ts | 38 + .../src/components/editable/EditableCell.vue | 480 + .../Table/src/components/editable/helper.ts | 28 + .../Table/src/components/editable/index.ts | 68 + .../src/components/settings/ColumnSetting.vue | 505 + .../components/settings/FullScreenSetting.vue | 48 + .../src/components/settings/RedoSetting.vue | 45 + .../src/components/settings/SizeSetting.vue | 74 + .../Table/src/components/settings/index.vue | 74 + src/components/Table/src/const.ts | 30 + src/components/Table/src/hooks/useColumns.ts | 310 + .../Table/src/hooks/useColumnsCache.ts | 137 + .../Table/src/hooks/useCustomRow.ts | 94 + .../Table/src/hooks/useDataSource.ts | 338 + src/components/Table/src/hooks/useLoading.ts | 21 + .../Table/src/hooks/usePagination.tsx | 85 + .../Table/src/hooks/useRowSelection.ts | 122 + src/components/Table/src/hooks/useTable.ts | 168 + .../Table/src/hooks/useTableContext.ts | 22 + .../Table/src/hooks/useTableExpand.ts | 54 + .../Table/src/hooks/useTableFooter.ts | 52 + .../Table/src/hooks/useTableForm.ts | 49 + .../Table/src/hooks/useTableHeader.ts | 58 + .../Table/src/hooks/useTableScroll.ts | 188 + .../Table/src/hooks/useTableStyle.ts | 20 + src/components/Table/src/props.ts | 139 + src/components/Table/src/types/column.ts | 195 + .../Table/src/types/componentType.ts | 1 + src/components/Table/src/types/pagination.ts | 99 + src/components/Table/src/types/table.ts | 462 + src/components/Table/src/types/tableAction.ts | 31 + src/components/Time/index.ts | 4 + src/components/Time/src/Time.vue | 107 + src/components/Tinymce/index.ts | 4 + src/components/Tinymce/src/Editor.vue | 360 + src/components/Tinymce/src/ImgUpload.vue | 118 + src/components/Tinymce/src/helper.ts | 81 + src/components/Tinymce/src/tinymce.ts | 20 + src/components/Transition/index.ts | 21 + .../Transition/src/CollapseTransition.vue | 78 + .../Transition/src/CreateTransition.tsx | 69 + .../Transition/src/ExpandTransition.ts | 89 + src/components/Tree/index.ts | 6 + src/components/Tree/src/BasicTree.vue | 458 + src/components/Tree/src/TreeIcon.ts | 13 + .../Tree/src/components/TreeHeader.vue | 171 + src/components/Tree/src/hooks/useTree.ts | 207 + src/components/Tree/src/types/tree.ts | 195 + src/components/Tree/style/index.less | 52 + src/components/Tree/style/index.ts | 1 + src/components/Tree_backup/index.ts | 5 + src/components/Tree_backup/src/Tree.vue | 449 + src/components/Tree_backup/src/TreeHeader.vue | 181 + src/components/Tree_backup/src/TreeIcon.ts | 17 + src/components/Tree_backup/src/props.ts | 99 + src/components/Tree_backup/src/typing.ts | 53 + src/components/Tree_backup/src/useTree.ts | 192 + src/components/Upload/index.ts | 4 + src/components/Upload/src/BasicUpload.vue | 113 + src/components/Upload/src/FileList.vue | 102 + src/components/Upload/src/ThumbUrl.vue | 29 + src/components/Upload/src/UploadModal.vue | 309 + .../Upload/src/UploadPreviewModal.vue | 99 + src/components/Upload/src/data.tsx | 147 + src/components/Upload/src/helper.ts | 27 + src/components/Upload/src/props.ts | 83 + src/components/Upload/src/typing.ts | 55 + src/components/Upload/src/useUpload.ts | 60 + src/components/Verify/index.ts | 7 + src/components/Verify/src/DragVerify.vue | 361 + src/components/Verify/src/ImgRotate.vue | 216 + src/components/Verify/src/props.ts | 87 + src/components/Verify/src/typing.ts | 14 + src/components/VirtualScroll/index.ts | 4 + .../VirtualScroll/src/VirtualScroll.vue | 180 + src/components/chart/Bar.vue | 79 + src/components/chart/BarAndLine.vue | 86 + src/components/chart/BarMulti.vue | 98 + src/components/chart/ChartCard.vue | 110 + src/components/chart/Gauge.vue | 100 + src/components/chart/HeadInfo.vue | 75 + src/components/chart/Line.vue | 81 + src/components/chart/LineMulti.vue | 98 + src/components/chart/Pie.vue | 89 + src/components/chart/README.md | 282 + src/components/chart/Radar.vue | 96 + src/components/chart/RankList.vue | 79 + src/components/chart/StackBar.vue | 107 + src/components/chart/Trend.vue | 90 + src/components/jeecg/AIcon.vue | 38 + src/components/jeecg/ExcelButton.vue | 84 + src/components/jeecg/JPrompt/JPrompt.vue | 160 + .../jeecg/JPrompt/hooks/useJPrompt.ts | 57 + src/components/jeecg/JPrompt/index.ts | 2 + src/components/jeecg/JPrompt/typing.ts | 15 + src/components/jeecg/JVxeTable/hooks.ts | 2 + src/components/jeecg/JVxeTable/index.ts | 4 + .../jeecg/JVxeTable/src/JVxeTable.ts | 77 + .../jeecg/JVxeTable/src/componentMap.ts | 86 + .../src/components/JVxeDetailsModal.vue | 78 + .../src/components/JVxeReloadEffect.ts | 89 + .../src/components/JVxeSubPopover.vue | 207 + .../JVxeTable/src/components/JVxeToolbar.vue | 117 + .../src/components/cells/JVxeCheckboxCell.vue | 116 + .../src/components/cells/JVxeDateCell.vue | 65 + .../src/components/cells/JVxeDragSortCell.vue | 92 + .../src/components/cells/JVxeInputCell.vue | 81 + .../src/components/cells/JVxeNormalCell.vue | 53 + .../src/components/cells/JVxeProgressCell.vue | 52 + .../src/components/cells/JVxeRadioCell.vue | 60 + .../src/components/cells/JVxeSelectCell.vue | 234 + .../src/components/cells/JVxeSlotCell.ts | 41 + .../src/components/cells/JVxeTextareaCell.vue | 57 + .../src/components/cells/JVxeTimeCell.vue | 65 + .../src/components/cells/JVxeUploadCell.vue | 76 + .../src/hooks/cells/useJVxeUploadCell.ts | 137 + .../jeecg/JVxeTable/src/hooks/useColumns.ts | 361 + .../jeecg/JVxeTable/src/hooks/useData.ts | 94 + .../JVxeTable/src/hooks/useDataSource.ts | 36 + .../jeecg/JVxeTable/src/hooks/useDragSort.ts | 75 + .../JVxeTable/src/hooks/useFinallyProps.ts | 83 + .../JVxeTable/src/hooks/useJVxeComponent.ts | 252 + .../JVxeTable/src/hooks/useKeyboardEdit.ts | 37 + .../jeecg/JVxeTable/src/hooks/useLinkage.ts | 145 + .../jeecg/JVxeTable/src/hooks/useMethods.ts | 818 + .../JVxeTable/src/hooks/usePagination.ts | 66 + .../src/hooks/useRenderComponents.ts | 61 + .../jeecg/JVxeTable/src/hooks/useToolbar.ts | 53 + .../JVxeTable/src/hooks/useValidateRules.ts | 103 + .../jeecg/JVxeTable/src/hooks/useWebSocket.ts | 236 + src/components/jeecg/JVxeTable/src/install.ts | 67 + .../jeecg/JVxeTable/src/style/index.less | 102 + .../JVxeTable/src/style/reload-effect.less | 44 + .../jeecg/JVxeTable/src/style/vxe.const.less | 2 + .../jeecg/JVxeTable/src/style/vxe.dark.less | 112 + .../JVxeTable/src/types/JVxeComponent.ts | 87 + .../jeecg/JVxeTable/src/types/JVxeTypes.ts | 60 + .../jeecg/JVxeTable/src/types/index.ts | 120 + .../jeecg/JVxeTable/src/utils/authUtils.ts | 50 + .../JVxeTable/src/utils/enhancedUtils.ts | 155 + .../JVxeTable/src/utils/registerUtils.ts | 130 + .../jeecg/JVxeTable/src/utils/vxeUtils.ts | 21 + .../jeecg/JVxeTable/src/vxe.data.ts | 93 + src/components/jeecg/JVxeTable/types.ts | 6 + src/components/jeecg/JVxeTable/utils.ts | 1 + .../jeecg/OnLine/JPopupOnlReport.vue | 249 + .../jeecg/OnLine/SearchFormItem.vue | 328 + .../jeecg/OnLine/hooks/usePopBiz.ts | 852 + .../jeecg/OnLine/types/onlineConfig.ts | 43 + src/components/jeecg/UserAvatar.vue | 142 + src/components/jeecg/comment/CommentFiles.vue | 164 + src/components/jeecg/comment/CommentList.vue | 331 + src/components/jeecg/comment/CommentPanel.vue | 99 + src/components/jeecg/comment/DataLogList.vue | 177 + .../jeecg/comment/HistoryFileList.vue | 88 + src/components/jeecg/comment/MyComment.vue | 382 + src/components/jeecg/comment/UploadChunk.vue | 119 + src/components/jeecg/comment/comment.less | 234 + src/components/jeecg/comment/image/emoji.png | Bin 0 -> 858814 bytes .../jeecg/comment/image/emoji_native.png | Bin 0 -> 4410196 bytes src/components/jeecg/comment/useComment.ts | 407 + .../jeecg/thirdApp/JThirdAppButton.vue | 180 + .../jeecg/thirdApp/JThirdAppDropdown.vue | 43 + .../jeecg/thirdApp/jThirdApp.api.ts | 37 + src/components/registerGlobComp.ts | 113 + src/design/ant/btn.less | 317 + src/design/ant/index.less | 65 + src/design/ant/input.less | 24 + src/design/ant/pagination.less | 98 + src/design/ant/table.less | 76 + src/design/color.less | 138 + src/design/config.less | 2 + src/design/index.less | 48 + src/design/public.less | 113 + src/design/theme.less | 65 + src/design/transition/base.less | 18 + src/design/transition/fade.less | 81 + src/design/transition/index.less | 10 + src/design/transition/scale.less | 21 + src/design/transition/scroll.less | 67 + src/design/transition/slide.less | 39 + src/design/transition/zoom.less | 27 + src/design/var/breakpoint.less | 33 + src/design/var/easing.less | 18 + src/design/var/index.less | 42 + src/directives/clickOutside.ts | 78 + src/directives/index.ts | 11 + src/directives/loading.ts | 41 + src/directives/permission.ts | 32 + src/directives/repeatClick.ts | 31 + src/directives/ripple/index.less | 21 + src/directives/ripple/index.ts | 180 + src/enums/CompTypeEnum.ts | 32 + src/enums/DateTypeEnum.ts | 8 + src/enums/appEnum.ts | 58 + src/enums/breakpointEnum.ts | 28 + src/enums/cacheEnum.ts | 41 + src/enums/exceptionEnum.ts | 27 + src/enums/httpEnum.ts | 50 + src/enums/jeecgEnum.ts | 23 + src/enums/menuEnum.ts | 50 + src/enums/pageEnum.ts | 14 + src/enums/roleEnum.ts | 7 + src/enums/sizeEnum.ts | 27 + src/hooks/component/useFormItem.ts | 51 + src/hooks/component/usePageContext.ts | 18 + src/hooks/core/onMountedOrActivated.ts | 18 + src/hooks/core/useAttrs.ts | 41 + src/hooks/core/useContext.ts | 38 + src/hooks/core/useLockFn.ts | 17 + src/hooks/core/useRefs.ts | 16 + src/hooks/core/useTimeout.ts | 45 + src/hooks/event/useBreakpoint.ts | 89 + src/hooks/event/useEventListener.ts | 52 + src/hooks/event/useIntersectionObserver.ts | 42 + src/hooks/event/useScroll.ts | 65 + src/hooks/event/useScrollTo.ts | 59 + src/hooks/event/useWindowSizeFn.ts | 36 + src/hooks/jeecg/useAdaptiveWidth.ts | 88 + src/hooks/setting/index.ts | 39 + src/hooks/setting/useHeaderSetting.ts | 90 + src/hooks/setting/useMenuSetting.ts | 155 + src/hooks/setting/useMultipleTabSetting.ts | 32 + src/hooks/setting/useRootSetting.ts | 88 + src/hooks/setting/useTransitionSetting.ts | 31 + src/hooks/system/useAutoAdapt.ts | 51 + src/hooks/system/useJvxeMethods.ts | 186 + src/hooks/system/useListPage.ts | 330 + src/hooks/system/useMethods.ts | 97 + src/hooks/system/useThirdLogin.ts | 198 + src/hooks/web/useAppInject.ts | 10 + src/hooks/web/useContentHeight.ts | 183 + src/hooks/web/useContextMenu.ts | 12 + src/hooks/web/useCopyModal.ts | 64 + src/hooks/web/useCopyToClipboard.ts | 69 + src/hooks/web/useDesign.ts | 22 + src/hooks/web/useECharts.ts | 113 + src/hooks/web/useFullContent.ts | 28 + src/hooks/web/useI18n.ts | 55 + src/hooks/web/useLockPage.ts | 72 + src/hooks/web/useMessage.ts | 141 + src/hooks/web/useMessage.tsx_backup | 132 + src/hooks/web/usePage.ts | 85 + src/hooks/web/usePagination.ts | 31 + src/hooks/web/usePermission.ts | 174 + src/hooks/web/usePrintJS.ts | 42 + src/hooks/web/useScript.ts | 46 + src/hooks/web/useSortable.ts | 21 + src/hooks/web/useSso.ts | 42 + src/hooks/web/useTabs.ts | 118 + src/hooks/web/useTitle.ts | 35 + src/hooks/web/useWatermark.ts | 98 + src/hooks/web/useWebSocket.ts | 97 + src/layouts/default/content/index.vue | 66 + .../default/content/useContentContext.ts | 17 + .../default/content/useContentViewHeight.ts | 42 + src/layouts/default/feature/index.vue | 82 + src/layouts/default/footer/index.vue | 95 + src/layouts/default/header/MultipleHeader.vue | 129 + .../default/header/components/Breadcrumb.vue | 204 + .../default/header/components/ErrorAction.vue | 43 + .../default/header/components/FullScreen.vue | 35 + .../default/header/components/LockScreen.vue | 40 + .../default/header/components/index.ts | 16 + .../header/components/lock/LockModal.vue | 118 + .../header/components/notify/NoticeList.vue | 232 + .../default/header/components/notify/data.ts | 206 + .../header/components/notify/index.vue | 269 + .../header/components/notify/index_old.vue | 272 + .../header/components/notify/notify.api.ts | 14 + .../components/user-dropdown/DepartSelect.vue | 271 + .../components/user-dropdown/DropMenuItem.vue | 31 + .../user-dropdown/UpdatePassword.vue | 89 + .../header/components/user-dropdown/index.vue | 233 + src/layouts/default/header/index.less | 200 + src/layouts/default/header/index.vue | 250 + src/layouts/default/index.vue | 92 + src/layouts/default/menu/index.vue | 189 + src/layouts/default/menu/useLayoutMenu.ts | 105 + src/layouts/default/setting/SettingDrawer.tsx | 352 + .../setting/components/InputNumberItem.vue | 51 + .../default/setting/components/SelectItem.vue | 68 + .../setting/components/SettingFooter.vue | 97 + .../default/setting/components/SwitchItem.vue | 66 + .../setting/components/ThemeColorPicker.vue | 88 + .../default/setting/components/TypePicker.vue | 178 + .../default/setting/components/index.ts | 8 + src/layouts/default/setting/enum.ts | 167 + src/layouts/default/setting/handler.ts | 177 + src/layouts/default/setting/index.vue | 26 + src/layouts/default/sider/DragBar.vue | 66 + src/layouts/default/sider/LayoutSider.vue | 172 + src/layouts/default/sider/MixSider.vue | 560 + src/layouts/default/sider/index.vue | 57 + src/layouts/default/sider/useLayoutSider.ts | 133 + .../default/tabs/components/FoldButton.vue | 40 + .../default/tabs/components/TabContent.vue | 97 + .../default/tabs/components/TabRedo.vue | 33 + src/layouts/default/tabs/index.less | 228 + src/layouts/default/tabs/index.vue | 147 + src/layouts/default/tabs/tabs.theme.card.less | 234 + .../default/tabs/tabs.theme.smooth.less | 233 + src/layouts/default/tabs/types.ts | 25 + src/layouts/default/tabs/useMultipleTabs.ts | 78 + src/layouts/default/tabs/useTabDropdown.ts | 138 + src/layouts/default/trigger/HeaderTrigger.vue | 23 + src/layouts/default/trigger/SiderTrigger.vue | 21 + src/layouts/default/trigger/index.vue | 22 + src/layouts/iframe/index.vue | 25 + src/layouts/iframe/useFrameKeepAlive.ts | 59 + src/layouts/page/index.vue | 70 + src/layouts/page/transition.ts | 33 + src/locales/helper.ts | 37 + src/locales/lang/en.ts | 13 + src/locales/lang/en/common.ts | 20 + src/locales/lang/en/component.ts | 129 + src/locales/lang/en/layout.ts | 122 + src/locales/lang/en/routes/basic.ts | 4 + src/locales/lang/en/routes/dashboard.ts | 6 + src/locales/lang/en/routes/demo.ts | 199 + src/locales/lang/en/sys.ts | 110 + src/locales/lang/zh-CN/common.ts | 20 + src/locales/lang/zh-CN/component.ts | 134 + src/locales/lang/zh-CN/layout.ts | 123 + src/locales/lang/zh-CN/routes/basic.ts | 4 + src/locales/lang/zh-CN/routes/dashboard.ts | 6 + src/locales/lang/zh-CN/routes/demo.ts | 207 + src/locales/lang/zh-CN/sys.ts | 112 + src/locales/lang/zh_CN.ts | 10 + src/locales/setupI18n.ts | 44 + src/locales/useLocale.ts | 69 + src/logics/error-handle/index.ts | 178 + src/logics/initAppConfig.ts | 84 + src/logics/mitt/routeChange.ts | 28 + src/logics/theme/dark.ts | 24 + src/logics/theme/index.ts | 27 + src/logics/theme/updateBackground.ts | 75 + src/logics/theme/updateColorWeak.ts | 9 + src/logics/theme/updateGrayMode.ts | 9 + src/logics/theme/util.ts | 11 + src/main.ts | 72 + src/qiankun/apps.ts | 22 + src/qiankun/index.ts | 73 + src/qiankun/state.ts | 38 + src/router/constant.ts | 24 + src/router/guard/index.ts | 147 + src/router/guard/paramMenuGuard.ts | 47 + src/router/guard/permissionGuard.ts | 154 + src/router/guard/stateGuard.ts | 24 + src/router/helper/menuHelper.ts | 133 + src/router/helper/routeHelper.ts | 240 + src/router/index.ts | 37 + src/router/menus/index.ts | 126 + src/router/routes/basic.ts | 73 + src/router/routes/index.ts | 69 + src/router/routes/mainOut.ts | 22 + src/router/routes/modules/about.ts | 31 + src/router/routes/modules/dashboard.ts | 37 + src/router/routes/modules/demo/charts.ts | 79 + src/router/routes/modules/demo/comp.ts | 700 + src/router/routes/modules/demo/feat.ts | 196 + src/router/routes/modules/demo/iframe.ts | 48 + src/router/routes/modules/demo/level.ts | 68 + src/router/routes/modules/demo/page.ts | 255 + src/router/routes/modules/demo/permission.ts | 92 + src/router/routes/modules/demo/setup.ts | 31 + src/router/routes/modules/demo/system.ts | 86 + src/router/types.ts | 59 + src/settings/componentSetting.ts | 88 + src/settings/designSetting.ts | 38 + src/settings/encryptionSetting.ts | 13 + src/settings/localeSetting.ts | 30 + src/settings/projectSetting.ts | 192 + src/settings/registerThirdComp.ts | 39 + src/settings/siteSetting.ts | 8 + src/store/index.ts | 9 + src/store/modules/app.ts | 112 + src/store/modules/errorLog.ts | 74 + src/store/modules/locale.ts | 85 + src/store/modules/lock.ts | 59 + src/store/modules/multipleTab.ts | 356 + src/store/modules/permission.ts | 305 + src/store/modules/user.ts | 304 + src/utils/auth/index.ts | 80 + src/utils/bem.ts | 52 + src/utils/browser.js | 37 + src/utils/cache/index.ts | 32 + src/utils/cache/memory.ts | 110 + src/utils/cache/persistent.ts | 144 + src/utils/cache/storageCache.ts | 112 + src/utils/cipher.ts | 55 + src/utils/color.ts | 145 + src/utils/common/compUtils.ts | 367 + src/utils/common/renderUtils.ts | 175 + src/utils/common/vxeUtils.ts | 102 + src/utils/dateUtil.ts | 17 + src/utils/desform/customExpression.ts | 30 + src/utils/dict/JDictSelectUtil.js | 156 + src/utils/dict/index.ts | 42 + src/utils/domUtils.ts | 172 + src/utils/encryption/signMd5Utils.js | 138 + src/utils/env.ts | 93 + src/utils/event/index.ts | 42 + src/utils/factory/createAsyncComponent.tsx | 63 + src/utils/file/base64Conver.ts | 41 + src/utils/file/download.ts | 91 + src/utils/helper/treeHelper.ts | 197 + src/utils/helper/tsxHelper.tsx | 35 + src/utils/helper/validator.ts | 155 + src/utils/http/axios/Axios.ts | 270 + src/utils/http/axios/axiosCancel.ts | 60 + src/utils/http/axios/axiosTransform.ts | 49 + src/utils/http/axios/checkStatus.ts | 76 + src/utils/http/axios/helper.ts | 46 + src/utils/http/axios/index.ts | 286 + src/utils/index.ts | 314 + src/utils/is.ts | 108 + src/utils/lib/echarts.ts | 51 + src/utils/log.ts | 9 + src/utils/mitt.ts | 101 + src/utils/monorepo/dynamicRouter.ts | 19 + src/utils/monorepo/registerPackages.ts | 47 + src/utils/propTypes.ts | 34 + src/utils/props.ts | 185 + src/utils/types.ts | 42 + src/utils/uuid.ts | 28 + src/views/dashboard/Analysis/api.ts | 16 + .../Analysis/components/BdcTabCard.vue | 109 + .../Analysis/components/ChartGroupCard.vue | 104 + .../Analysis/components/GrowCard.vue | 40 + .../Analysis/components/QuickNav.vue | 56 + .../Analysis/components/SaleTabCard.vue | 81 + .../Analysis/components/SalesProductPie.vue | 63 + .../Analysis/components/SiteAnalysis.vue | 33 + .../Analysis/components/VisitAnalysis.vue | 100 + .../Analysis/components/VisitAnalysisBar.vue | 45 + .../Analysis/components/VisitRadar.vue | 100 + .../Analysis/components/VisitSource.vue | 80 + .../dashboard/Analysis/components/props.ts | 16 + src/views/dashboard/Analysis/data.ts | 221 + .../dashboard/Analysis/homePage/IndexBdc.vue | 233 + .../Analysis/homePage/IndexChart.vue | 116 + .../dashboard/Analysis/homePage/IndexDef.vue | 25 + .../dashboard/Analysis/homePage/IndexTask.vue | 422 + src/views/dashboard/Analysis/index.vue | 24 + .../workbench/components/DynamicInfo.vue | 31 + .../workbench/components/ProjectCard.vue | 34 + .../workbench/components/QuickNav.vue | 19 + .../workbench/components/SaleRadar.vue | 100 + .../workbench/components/WorkbenchHeader.vue | 33 + .../dashboard/workbench/components/data.ts | 156 + src/views/dashboard/workbench/index.vue | 36 + src/views/demo/charts/Line.vue | 117 + src/views/demo/charts/Map.vue | 75 + src/views/demo/charts/Pie.vue | 135 + src/views/demo/charts/SaleRadar.vue | 106 + src/views/demo/charts/china.json | 839 + src/views/demo/charts/data.ts | 189 + src/views/demo/charts/map/Baidu.vue | 45 + src/views/demo/charts/map/Gaode.vue | 47 + src/views/demo/charts/map/Google.vue | 52 + src/views/demo/codemirror/index.vue | 67 + src/views/demo/comp/button/index.vue | 110 + src/views/demo/comp/card-list/index.vue | 32 + src/views/demo/comp/count-to/index.vue | 42 + src/views/demo/comp/cropper/index.vue | 94 + src/views/demo/comp/desc/index.vue | 79 + src/views/demo/comp/drawer/Drawer1.vue | 13 + src/views/demo/comp/drawer/Drawer2.vue | 17 + src/views/demo/comp/drawer/Drawer3.vue | 35 + src/views/demo/comp/drawer/Drawer4.vue | 53 + src/views/demo/comp/drawer/Drawer5.vue | 13 + src/views/demo/comp/drawer/index.vue | 69 + src/views/demo/comp/lazy/TargetContent.vue | 19 + src/views/demo/comp/lazy/Transition.vue | 77 + src/views/demo/comp/lazy/index.vue | 52 + src/views/demo/comp/loading/index.vue | 101 + src/views/demo/comp/modal/Modal1.vue | 58 + src/views/demo/comp/modal/Modal2.vue | 23 + src/views/demo/comp/modal/Modal3.vue | 15 + src/views/demo/comp/modal/Modal4.vue | 81 + src/views/demo/comp/modal/index.vue | 112 + src/views/demo/comp/qrcode/index.vue | 117 + src/views/demo/comp/scroll/Action.vue | 59 + src/views/demo/comp/scroll/VirtualScroll.vue | 64 + src/views/demo/comp/scroll/index.vue | 31 + src/views/demo/comp/strength-meter/index.vue | 32 + src/views/demo/comp/time/index.vue | 44 + src/views/demo/comp/transition/index.vue | 91 + src/views/demo/comp/upload/index.vue | 54 + src/views/demo/comp/verify/Rotate.vue | 33 + src/views/demo/comp/verify/index.vue | 97 + src/views/demo/editor/json/index.vue | 91 + src/views/demo/editor/markdown/Editor.vue | 53 + src/views/demo/editor/markdown/index.vue | 55 + src/views/demo/editor/tinymce/Editor.vue | 53 + src/views/demo/editor/tinymce/index.vue | 21 + .../demo/feat/breadcrumb/ChildrenList.vue | 13 + .../feat/breadcrumb/ChildrenListDetail.vue | 10 + src/views/demo/feat/breadcrumb/FlatList.vue | 13 + .../demo/feat/breadcrumb/FlatListDetail.vue | 8 + src/views/demo/feat/click-out-side/index.vue | 43 + src/views/demo/feat/context-menu/index.vue | 85 + src/views/demo/feat/copy/index.vue | 40 + src/views/demo/feat/download/imgBase64.ts | 1 + src/views/demo/feat/download/index.vue | 59 + src/views/demo/feat/full-screen/index.vue | 45 + src/views/demo/feat/icon/index.vue | 96 + src/views/demo/feat/img-preview/index.vue | 38 + src/views/demo/feat/menu-params/index.vue | 42 + src/views/demo/feat/msg/index.vue | 85 + src/views/demo/feat/print/index.vue | 46 + src/views/demo/feat/ripple/index.vue | 31 + src/views/demo/feat/session-timeout/index.vue | 51 + src/views/demo/feat/tab-params/index.vue | 27 + src/views/demo/feat/tabs/TabDetail.vue | 28 + src/views/demo/feat/tabs/index.vue | 66 + src/views/demo/feat/watermark/index.vue | 28 + src/views/demo/feat/ws/index.vue | 120 + src/views/demo/form/AdvancedForm.vue | 190 + src/views/demo/form/AppendForm.vue | 118 + src/views/demo/form/CustomerForm.vue | 85 + src/views/demo/form/DynamicForm.vue | 258 + src/views/demo/form/RefForm.vue | 174 + src/views/demo/form/RuleForm.vue | 260 + src/views/demo/form/UseForm.vue | 189 + src/views/demo/form/index.vue | 621 + src/views/demo/jeecg/AsyncTreeTable.vue | 57 + src/views/demo/jeecg/ImgDragSort.vue | 80 + src/views/demo/jeecg/ImgTurnPage.vue | 170 + src/views/demo/jeecg/InnerExpandTable.vue | 243 + src/views/demo/jeecg/JCodeEditDemo.vue | 67 + src/views/demo/jeecg/JEditorDemo.vue | 99 + src/views/demo/jeecg/JUploadDemo.vue | 84 + .../demo/jeecg/JVxeTableDemo/JVxeDemo1.vue | 384 + .../demo/jeecg/JVxeTableDemo/JVxeDemo2.vue | 179 + .../demo/jeecg/JVxeTableDemo/JVxeDemo3.vue | 127 + .../demo/jeecg/JVxeTableDemo/JVxeDemo4.vue | 153 + .../demo/jeecg/JVxeTableDemo/JVxeDemo5.vue | 129 + .../JVxeTableDemo/func-demo/JSBCDemo.vue | 224 + .../JVxeTableDemo/func-demo/PopupSubTable.vue | 244 + .../JVxeTableDemo/func-demo/SocketReload.vue | 126 + src/views/demo/jeecg/JVxeTableDemo/index.vue | 33 + .../JVxeTableDemo/layout-demo/ErpTemplate.vue | 319 + .../JVxeTableDemo/layout-demo/Template1.vue | 332 + .../JVxeTableDemo/layout-demo/Template2.vue | 249 + .../JVxeTableDemo/layout-demo/Template3.vue | 237 + .../JVxeTableDemo/layout-demo/Template4.vue | 340 + .../JVxeTableDemo/layout-demo/Template5.vue | 221 + .../jeecg/JVxeTableDemo/layout-demo/index.vue | 35 + src/views/demo/jeecg/JeecgComponents.vue | 125 + src/views/demo/jeecg/JeecgPdfView.vue | 93 + .../demo/jeecg/Native/less/TableExpand.less | 102 + .../demo/jeecg/Native/one/OneNativeList.vue | 418 + .../Native/one/components/OneNativeForm.vue | 455 + .../Native/one/components/OneNativeModal.vue | 65 + src/views/demo/jeecg/PrintDemo.vue | 202 + src/views/demo/jeecg/TableTotal.vue | 59 + .../jeecg/erplist/JeecgOrderCustomerList.vue | 165 + .../jeecg/erplist/JeecgOrderTicketList.vue | 164 + .../components/JeecgOrderCustomerModal.vue | 57 + .../erplist/components/JeecgOrderModal.vue | 52 + .../components/JeecgOrderTicketModal.vue | 57 + src/views/demo/jeecg/erplist/erplist.api.ts | 139 + src/views/demo/jeecg/erplist/erplist.data.ts | 238 + src/views/demo/jeecg/erplist/index.vue | 163 + src/views/demo/jeecg/index.vue | 54 + src/views/demo/jeecg/jeecgComponents.data.ts | 692 + .../demo/jeecg/model/JeecgOrderModal.vue | 94 + src/views/demo/level/Menu111.vue | 12 + src/views/demo/level/Menu12.vue | 12 + src/views/demo/level/Menu2.vue | 15 + src/views/demo/main-out/index.vue | 6 + .../demo/page/account/center/Application.vue | 88 + .../demo/page/account/center/Article.vue | 92 + .../demo/page/account/center/Project.vue | 71 + src/views/demo/page/account/center/data.tsx | 124 + src/views/demo/page/account/center/index.vue | 155 + .../demo/page/account/setting/AccountBind.vue | 59 + .../demo/page/account/setting/BaseSetting.vue | 119 + .../demo/page/account/setting/MsgNotify.vue | 48 + .../page/account/setting/SecureSetting.vue | 68 + src/views/demo/page/account/setting/data.ts | 167 + src/views/demo/page/account/setting/index.vue | 62 + src/views/demo/page/desc/basic/data.tsx | 196 + src/views/demo/page/desc/basic/index.vue | 84 + src/views/demo/page/desc/high/data.tsx | 65 + src/views/demo/page/desc/high/index.vue | 123 + src/views/demo/page/form/basic/data.ts | 119 + src/views/demo/page/form/basic/index.vue | 64 + src/views/demo/page/form/high/PersonTable.vue | 137 + src/views/demo/page/form/high/data.ts | 149 + src/views/demo/page/form/high/index.vue | 77 + src/views/demo/page/form/step/Step1.vue | 103 + src/views/demo/page/form/step/Step2.vue | 78 + src/views/demo/page/form/step/Step3.vue | 49 + src/views/demo/page/form/step/data.tsx | 63 + src/views/demo/page/form/step/index.vue | 86 + src/views/demo/page/list/basic/data.tsx | 17 + src/views/demo/page/list/basic/index.vue | 161 + src/views/demo/page/list/card/data.tsx | 14 + src/views/demo/page/list/card/index.vue | 102 + src/views/demo/page/list/search/data.tsx | 37 + src/views/demo/page/list/search/index.vue | 125 + src/views/demo/page/result/fail/index.vue | 54 + src/views/demo/page/result/success/index.vue | 58 + .../demo/permission/CurrentPermissionMode.vue | 32 + src/views/demo/permission/back/Btn.vue | 88 + src/views/demo/permission/back/index.vue | 63 + src/views/demo/permission/front/AuthPageA.vue | 19 + src/views/demo/permission/front/AuthPageB.vue | 19 + src/views/demo/permission/front/Btn.vue | 85 + src/views/demo/permission/front/index.vue | 57 + src/views/demo/setup/index.vue | 43 + .../demo/system/account/AccountDetail.vue | 62 + .../demo/system/account/AccountModal.vue | 74 + src/views/demo/system/account/DeptTree.vue | 42 + src/views/demo/system/account/account.data.ts | 127 + src/views/demo/system/account/index.vue | 137 + src/views/demo/system/dept/DeptModal.vue | 61 + src/views/demo/system/dept/dept.data.ts | 108 + src/views/demo/system/dept/index.vue | 100 + src/views/demo/system/menu/MenuDrawer.vue | 63 + src/views/demo/system/menu/index.vue | 107 + src/views/demo/system/menu/menu.data.ts | 202 + src/views/demo/system/password/index.vue | 44 + src/views/demo/system/password/pwd.data.ts | 46 + src/views/demo/system/role/RoleDrawer.vue | 80 + src/views/demo/system/role/index.vue | 97 + src/views/demo/system/role/role.data.ts | 124 + src/views/demo/system/test/TestDrawer.vue | 59 + src/views/demo/system/test/index.vue | 97 + src/views/demo/system/test/test.data.ts | 51 + src/views/demo/table/AuthColumn.vue | 127 + src/views/demo/table/Basic.vue | 81 + src/views/demo/table/CustomerCell.vue | 104 + src/views/demo/table/EditCellTable.vue | 209 + src/views/demo/table/EditRowTable.vue | 253 + src/views/demo/table/ExpandTable.vue | 74 + src/views/demo/table/FetchTable.vue | 43 + src/views/demo/table/FixedColumn.vue | 93 + src/views/demo/table/FixedHeight.vue | 41 + src/views/demo/table/FooterTable.vue | 50 + src/views/demo/table/FormTable.vue | 63 + src/views/demo/table/MergeHeader.vue | 27 + src/views/demo/table/MultipleHeader.vue | 26 + src/views/demo/table/NestedTable.vue | 110 + src/views/demo/table/RefTable.vue | 125 + src/views/demo/table/TreeTable.vue | 41 + src/views/demo/table/UseTable.vue | 147 + src/views/demo/table/tableData.tsx | 316 + src/views/demo/tree/ActionTree.vue | 131 + src/views/demo/tree/EditTree.vue | 83 + src/views/demo/tree/data.ts | 35 + src/views/demo/tree/index.vue | 128 + src/views/demo/vextable/OneToOneModal.vue | 187 + src/views/demo/vextable/VexTableModal.vue | 190 + src/views/demo/vextable/api.ts | 32 + src/views/demo/vextable/data.ts | 154 + src/views/demo/vextable/drawer.vue | 38 + .../vextable/form/JeecgOrderCustomerForm.vue | 67 + .../demo/vextable/form/JeecgOrderMainForm.vue | 155 + src/views/demo/vextable/index.vue | 144 + src/views/demo/vextable/index2.vue | 39 + .../vextable/jvxetable/JVxeTableModal.vue | 193 + .../demo/vextable/jvxetable/jvxetable.api.ts | 17 + .../demo/vextable/jvxetable/jvxetable.data.ts | 73 + src/views/demo/vextable/modal.vue | 268 + .../monitor/datalog/DataLogCompareModal.vue | 220 + src/views/monitor/datalog/DataLogModal.vue | 111 + src/views/monitor/datalog/datalog.api.ts | 31 + src/views/monitor/datalog/datalog.data.ts | 45 + src/views/monitor/datalog/index.vue | 57 + .../monitor/datasource/DataSourceModal.vue | 87 + .../monitor/datasource/datasource.api.ts | 83 + .../monitor/datasource/datasource.data.ts | 185 + src/views/monitor/datasource/index.vue | 118 + src/views/monitor/disk/DiskInfo.vue | 37 + src/views/monitor/disk/disk.api.ts | 12 + src/views/monitor/disk/gauge.vue | 82 + src/views/monitor/log/index.vue | 74 + src/views/monitor/log/log.api.ts | 13 + src/views/monitor/log/log.data.ts | 73 + src/views/monitor/mynews/DetailModal.vue | 89 + src/views/monitor/mynews/DynamicNotice.vue | 35 + src/views/monitor/mynews/index.vue | 131 + src/views/monitor/mynews/mynews.api.ts | 61 + src/views/monitor/mynews/mynews.data.ts | 75 + src/views/monitor/quartz/QuartzModal.vue | 59 + src/views/monitor/quartz/index.vue | 177 + src/views/monitor/quartz/quartz.api.ts | 107 + src/views/monitor/quartz/quartz.data.ts | 124 + src/views/monitor/redis/index.vue | 189 + src/views/monitor/redis/redis.api.ts | 32 + src/views/monitor/redis/redis.data.ts | 19 + src/views/monitor/route/RouteModal.vue | 420 + src/views/monitor/route/index.vue | 104 + src/views/monitor/route/route.api.ts | 34 + src/views/monitor/route/route.data.ts | 52 + src/views/monitor/server/index.vue | 107 + src/views/monitor/server/server.api.ts | 309 + src/views/monitor/server/server.data.ts | 23 + src/views/monitor/trace/index.vue | 47 + src/views/monitor/trace/trace.api.ts | 12 + src/views/monitor/trace/trace.data.ts | 84 + src/views/report/chartdemo/chartdemo.data.ts | 49 + src/views/report/chartdemo/index.vue | 93 + src/views/report/statisticst/index.vue | 135 + src/views/sys/about/index.vue | 98 + src/views/sys/error-log/DetailModal.vue | 27 + src/views/sys/error-log/data.tsx | 67 + src/views/sys/error-log/index.vue | 88 + src/views/sys/exception/Exception.vue | 143 + .../sys/exception/NetworkErrorException.vue | 11 + .../sys/exception/NotAccessException.vue | 11 + .../sys/exception/NotDataErrorException.vue | 11 + .../sys/exception/ServerErrorException.vue | 11 + src/views/sys/exception/index.ts | 5 + src/views/sys/forget-password/step1.vue | 96 + src/views/sys/forget-password/step2.vue | 103 + src/views/sys/forget-password/step3.vue | 71 + src/views/sys/iframe/FrameBlank.vue | 9 + src/views/sys/iframe/index.vue | 85 + src/views/sys/lock/LockPage.vue | 215 + src/views/sys/lock/index.vue | 13 + src/views/sys/lock/useNow.ts | 60 + src/views/sys/login/ForgetPasswordForm.vue | 68 + src/views/sys/login/Login.vue | 208 + src/views/sys/login/LoginForm.vue | 196 + src/views/sys/login/LoginFormTitle.vue | 25 + src/views/sys/login/LoginSelect.vue | 332 + src/views/sys/login/MobileForm.vue | 89 + src/views/sys/login/OAuth2Login.vue | 86 + src/views/sys/login/QrCodeForm.vue | 83 + src/views/sys/login/RegisterForm.vue | 114 + src/views/sys/login/SessionTimeoutLogin.vue | 53 + src/views/sys/login/ThirdModal.vue | 64 + src/views/sys/login/TokenLoginPage.vue | 209 + src/views/sys/login/useLogin.ts | 184 + src/views/sys/redirect/index.vue | 30 + src/views/system/address/address.api.ts | 19 + src/views/system/address/address.data.ts | 51 + .../address/components/DepartLeftTree.vue | 158 + src/views/system/address/index.less | 10 + src/views/system/address/index.vue | 95 + src/views/system/category/category.api.ts | 78 + src/views/system/category/category.data.ts | 65 + .../category/components/CategoryModal.vue | 89 + src/views/system/category/index.vue | 295 + src/views/system/checkRule/CheckRuleModal.vue | 247 + .../system/checkRule/CheckRuleTestModal.vue | 55 + src/views/system/checkRule/check.rule.api.ts | 86 + src/views/system/checkRule/check.rule.data.ts | 152 + src/views/system/checkRule/index.vue | 150 + .../components/DepartDataRuleDrawer.vue | 78 + .../depart/components/DepartFormModal.vue | 92 + .../depart/components/DepartFormTab.vue | 122 + .../depart/components/DepartLeftTree.vue | 332 + .../depart/components/DepartRuleTab.vue | 176 + src/views/system/depart/depart.api.ts | 122 + src/views/system/depart/depart.data.ts | 90 + src/views/system/depart/index.less | 10 + src/views/system/depart/index.vue | 70 + .../components/DepartBaseInfoTab.vue | 40 + .../components/DepartRoleAuthDrawer.vue | 158 + .../components/DepartRoleDataRuleDrawer.vue | 82 + .../components/DepartRoleInfoTab.vue | 196 + .../departUser/components/DepartRoleModal.vue | 63 + .../components/DepartRoleUserAuthDrawer.vue | 91 + .../departUser/components/DepartTree.vue | 149 + .../components/DepartUserInfoTab.vue | 229 + .../system/departUser/depart.user.api.ts | 159 + .../system/departUser/depart.user.data.ts | 195 + src/views/system/departUser/index.less | 48 + src/views/system/departUser/index.vue | 49 + .../system/dict/components/DictItemList.vue | 132 + .../system/dict/components/DictItemModal.vue | 63 + .../system/dict/components/DictModal.vue | 52 + .../dict/components/DictRecycleBinModal.vue | 90 + src/views/system/dict/dict.api.ts | 135 + src/views/system/dict/dict.data.ts | 184 + src/views/system/dict/index.vue | 187 + src/views/system/examples/demo/DemoModal.vue | 69 + src/views/system/examples/demo/demo.api.ts | 73 + src/views/system/examples/demo/demo.data.ts | 220 + src/views/system/examples/demo/index.vue | 311 + src/views/system/fillRule/FillRuleModal.vue | 65 + src/views/system/fillRule/fill.rule.api.ts | 83 + src/views/system/fillRule/fill.rule.data.ts | 112 + src/views/system/fillRule/index.vue | 146 + src/views/system/loginmini/MiniCodelogin.vue | 165 + src/views/system/loginmini/MiniForgotpad.vue | 282 + src/views/system/loginmini/MiniLogin.vue | 557 + src/views/system/loginmini/MiniRegister.vue | 266 + src/views/system/loginmini/OAuth2Login.vue | 87 + src/views/system/menu/DataRuleList.vue | 122 + src/views/system/menu/DataRuleModal.vue | 54 + src/views/system/menu/MenuDrawer.vue | 112 + src/views/system/menu/index.vue | 201 + src/views/system/menu/menu.api.ts | 119 + src/views/system/menu/menu.data.ts | 415 + .../message/components/SysMessageList.vue | 165 + .../message/components/SysMessageModal.vue | 487 + .../message/components/useSysMessage.ts | 229 + .../system/message/manage/ManageDrawer.vue | 24 + src/views/system/message/manage/index.less | 5 + src/views/system/message/manage/index.vue | 129 + src/views/system/message/manage/manage.api.ts | 52 + .../system/message/manage/manage.data.ts | 134 + .../system/message/template/TemplateModal.vue | 51 + .../message/template/TemplateTestModal.vue | 40 + src/views/system/message/template/index.less | 5 + src/views/system/message/template/index.vue | 208 + .../system/message/template/template.api.ts | 60 + .../system/message/template/template.data.ts | 185 + src/views/system/notice/DetailModal.vue | 24 + src/views/system/notice/NoticeModal.vue | 60 + src/views/system/notice/index.vue | 168 + src/views/system/notice/notice.api.ts | 65 + src/views/system/notice/notice.data.ts | 156 + src/views/system/onlineuser/OnlineUser.api.ts | 20 + .../system/onlineuser/OnlineUser.data.ts | 54 + .../system/onlineuser/OnlineUserList.vue | 65 + src/views/system/ossfile/index.vue | 154 + src/views/system/ossfile/ossfile.api.ts | 33 + src/views/system/ossfile/ossfile.data.ts | 30 + src/views/system/position/PositionModal.vue | 53 + src/views/system/position/index.vue | 116 + src/views/system/position/position.api.ts | 79 + src/views/system/position/position.data.ts | 70 + src/views/system/role/TenantRoleList.vue | 160 + .../role/components/RoleDataRuleDrawer.vue | 85 + src/views/system/role/components/RoleDesc.vue | 18 + .../system/role/components/RoleDrawer.vue | 53 + .../system/role/components/RoleIndexModal.vue | 55 + .../role/components/RolePermissionDrawer.vue | 206 + .../system/role/components/RoleUserTable.vue | 185 + .../system/role/components/UseSelectModal.vue | 59 + src/views/system/role/index.vue | 191 + src/views/system/role/role.api.ts | 172 + src/views/system/role/role.data.ts | 183 + .../system/tenant/TenantInviteUserModal.vue | 63 + src/views/system/tenant/TenantModal.vue | 57 + .../system/tenant/TenantPackMenuModal.vue | 52 + src/views/system/tenant/TenantPackModal.vue | 184 + .../system/tenant/TenantPackUserModal.vue | 173 + .../system/tenant/TenantRecycleBinModal.vue | 146 + src/views/system/tenant/TenantUserModal.vue | 95 + src/views/system/tenant/index.vue | 207 + src/views/system/tenant/tenant.api.ts | 204 + src/views/system/tenant/tenant.data.ts | 403 + src/views/system/user/PasswordModal.vue | 42 + src/views/system/user/TenantUserList.vue | 206 + src/views/system/user/UserAgentModal.vue | 45 + src/views/system/user/UserDrawer.vue | 157 + src/views/system/user/UserQuitAgentModal.vue | 68 + src/views/system/user/UserQuitModal.vue | 110 + src/views/system/user/UserRecycleBinModal.vue | 138 + src/views/system/user/index.vue | 307 + src/views/system/user/user.api.ts | 226 + src/views/system/user/user.data.ts | 546 + src/views/system/user/userDetails.vue | 54 + .../system/usersetting/AccountSetting.vue | 190 + src/views/system/usersetting/BaseSetting.vue | 360 + .../system/usersetting/TenantSetting.vue | 581 + .../system/usersetting/UserSetting.api.ts | 85 + .../system/usersetting/UserSetting.data.ts | 146 + src/views/system/usersetting/UserSetting.vue | 116 + .../system/usersetting/WeChatDingSetting.vue | 116 + .../commponents/UserAccountModal.vue | 70 + .../commponents/UserEmailModal.vue | 80 + .../commponents/UserPasswordModal.vue | 114 + .../commponents/UserPhoneModal.vue | 83 + stylelint.config.js | 71 + tests/__mocks__/fileMock.ts | 1 + tests/__mocks__/styleMock.ts | 1 + tests/__mocks__/workerMock.ts | 5 + tests/server/README.md | 15 + tests/server/controller/FileController.ts | 18 + tests/server/controller/UserController.ts | 15 + tests/server/ecosystem.config.js | 18 + tests/server/index.ts | 63 + tests/server/nodemon.json | 8 + tests/server/package.json | 36 + tests/server/routes.ts | 23 + tests/server/service/FileService.ts | 54 + tests/server/service/UserService.ts | 25 + tests/server/tsconfig.json | 15 + tests/server/utils.ts | 9 + tests/server/yarn.lock | 2955 +++ tests/test.spec.ts | 16 + tsconfig.json | 43 + types/axios.d.ts | 55 + types/config.d.ts | 178 + types/global.d.ts | 92 + types/index.d.ts | 27 + types/module.d.ts | 16 + types/store.d.ts | 59 + types/utils.d.ts | 5 + types/vue-router.d.ts | 45 + unnamed.patch | 0 vite.config.ts | 112 + windi.config.ts | 74 + yarn.lock | 12354 ++++++++++++ 1329 files changed, 168926 insertions(+) create mode 100644 .editorconfig create mode 100644 .env create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .gitpod.yml create mode 100644 .prettierignore create mode 100644 .stylelintignore create mode 100644 .yarnclean create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build/config/themeConfig.ts create mode 100644 build/constant.ts create mode 100644 build/generate/generateModifyVars.ts create mode 100644 build/generate/icon/index.ts create mode 100644 build/getConfigFileName.ts create mode 100644 build/script/buildConf.ts create mode 100644 build/script/postBuild.ts create mode 100644 build/utils.ts create mode 100644 build/vite/plugin/compress.ts create mode 100644 build/vite/plugin/html.ts create mode 100644 build/vite/plugin/imagemin.ts create mode 100644 build/vite/plugin/index.ts create mode 100644 build/vite/plugin/mock.ts create mode 100644 build/vite/plugin/pwa.ts create mode 100644 build/vite/plugin/styleImport.ts create mode 100644 build/vite/plugin/svgSprite.ts create mode 100644 build/vite/plugin/theme.ts create mode 100644 build/vite/plugin/visualizer.ts create mode 100644 build/vite/proxy.ts create mode 100644 commitlint.config.js create mode 100644 index.html create mode 100644 jest.config.mjs create mode 100644 mock/_createProductionServer.ts create mode 100644 mock/_util.ts create mode 100644 mock/demo/account.ts create mode 100644 mock/demo/select-demo.ts create mode 100644 mock/demo/system.ts create mode 100644 mock/demo/table-demo.ts create mode 100644 mock/demo/tree-demo.ts create mode 100644 mock/sys/menu.ts create mode 100644 mock/sys/user.ts create mode 100644 npm create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.js create mode 100644 prettier.config.js create mode 100644 public/favicon.ico create mode 100644 public/logo.png create mode 100644 public/resource/img/logo.png create mode 100644 public/resource/img/pwa-192x192.png create mode 100644 public/resource/img/pwa-512x512.png create mode 100644 public/resource/js/iconfont.js create mode 100644 public/resource/tinymce/langs/en.js create mode 100644 public/resource/tinymce/langs/zh_CN.js create mode 100644 public/resource/tinymce/skins/ui/jeecg/content.css create mode 100644 public/resource/tinymce/skins/ui/jeecg/content.inline.css create mode 100644 public/resource/tinymce/skins/ui/jeecg/content.inline.min.css create mode 100644 public/resource/tinymce/skins/ui/jeecg/content.min.css create mode 100644 public/resource/tinymce/skins/ui/jeecg/content.mobile.css create mode 100644 public/resource/tinymce/skins/ui/jeecg/content.mobile.min.css create mode 100644 public/resource/tinymce/skins/ui/jeecg/fonts/tinymce-mobile.woff create mode 100644 public/resource/tinymce/skins/ui/jeecg/skin.css create mode 100644 public/resource/tinymce/skins/ui/jeecg/skin.min.css create mode 100644 public/resource/tinymce/skins/ui/jeecg/skin.mobile.css create mode 100644 public/resource/tinymce/skins/ui/jeecg/skin.mobile.min.css create mode 100644 public/resource/tinymce/skins/ui/oxide-dark/content.inline.min.css create mode 100644 public/resource/tinymce/skins/ui/oxide-dark/content.min.css create mode 100644 public/resource/tinymce/skins/ui/oxide-dark/content.mobile.min.css create mode 100644 public/resource/tinymce/skins/ui/oxide-dark/skin.min.css create mode 100644 public/resource/tinymce/skins/ui/oxide-dark/skin.mobile.min.css create mode 100644 public/resource/tinymce/skins/ui/oxide/content.inline.min.css create mode 100644 public/resource/tinymce/skins/ui/oxide/content.min.css create mode 100644 public/resource/tinymce/skins/ui/oxide/content.mobile.min.css create mode 100644 public/resource/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff create mode 100644 public/resource/tinymce/skins/ui/oxide/skin.min.css create mode 100644 public/resource/tinymce/skins/ui/oxide/skin.mobile.min.css create mode 100644 src/App.vue create mode 100644 src/api/common/api.ts create mode 100644 src/api/demo/account.ts create mode 100644 src/api/demo/error.ts create mode 100644 src/api/demo/model/accountModel.ts create mode 100644 src/api/demo/model/optionsModel.ts create mode 100644 src/api/demo/model/systemModel.ts create mode 100644 src/api/demo/model/tableModel.ts create mode 100644 src/api/demo/select.ts create mode 100644 src/api/demo/system.ts create mode 100644 src/api/demo/table.ts create mode 100644 src/api/demo/tree.ts create mode 100644 src/api/model/baseModel.ts create mode 100644 src/api/sys/menu.ts create mode 100644 src/api/sys/model/menuModel.ts create mode 100644 src/api/sys/model/uploadModel.ts create mode 100644 src/api/sys/model/userModel.ts create mode 100644 src/api/sys/upload.ts create mode 100644 src/api/sys/user.ts create mode 100644 src/assets/icons/download-count.svg create mode 100644 src/assets/icons/dynamic-avatar-1.svg create mode 100644 src/assets/icons/dynamic-avatar-2.svg create mode 100644 src/assets/icons/dynamic-avatar-3.svg create mode 100644 src/assets/icons/dynamic-avatar-4.svg create mode 100644 src/assets/icons/dynamic-avatar-5.svg create mode 100644 src/assets/icons/dynamic-avatar-6.svg create mode 100644 src/assets/icons/js/iconfont.js create mode 100644 src/assets/icons/lock.svg create mode 100644 src/assets/icons/moon.svg create mode 100644 src/assets/icons/sun.svg create mode 100644 src/assets/icons/test.svg create mode 100644 src/assets/icons/total-sales.svg create mode 100644 src/assets/icons/transaction.svg create mode 100644 src/assets/icons/visit-count.svg create mode 100644 src/assets/images/checkcode.png create mode 100644 src/assets/images/cms_bpm.png create mode 100644 src/assets/images/cms_oa.png create mode 100644 src/assets/images/daiban.png create mode 100644 src/assets/images/demo.png create mode 100644 src/assets/images/duban.png create mode 100644 src/assets/images/guaz.png create mode 100644 src/assets/images/header.jpg create mode 100644 src/assets/images/link.png create mode 100644 src/assets/images/logo.png create mode 100644 src/assets/images/nodata.png create mode 100644 src/assets/images/panel_cover.png create mode 100644 src/assets/images/pdf4.jpg create mode 100644 src/assets/images/zaiban.png create mode 100644 src/assets/less/JAreaLinkage.less create mode 100644 src/assets/loginmini/icon/icon-code.png create mode 100644 src/assets/loginmini/icon/icon-eye-g.png create mode 100644 src/assets/loginmini/icon/icon-eye-k.png create mode 100644 src/assets/loginmini/icon/icon-line-msg.png create mode 100644 src/assets/loginmini/icon/icon-line-pad.png create mode 100644 src/assets/loginmini/icon/icon-line-tel.png create mode 100644 src/assets/loginmini/icon/icon-line-user.png create mode 100644 src/assets/loginmini/icon/icon-password.png create mode 100644 src/assets/loginmini/icon/icon-success.png create mode 100644 src/assets/loginmini/icon/icon-user.png create mode 100644 src/assets/loginmini/icon/icon_dow.png create mode 100644 src/assets/loginmini/icon/jeecg_ad.png create mode 100644 src/assets/loginmini/icon/jeecg_ad_text.png create mode 100644 src/assets/loginmini/icon/jeecg_bg.png create mode 100644 src/assets/loginmini/icon/jeecg_logo.png create mode 100644 src/assets/loginmini/icon/logo.png create mode 100644 src/assets/loginmini/style/base.less create mode 100644 src/assets/loginmini/style/home.less create mode 100644 src/assets/svg/fileType/excel.svg create mode 100644 src/assets/svg/fileType/other.svg create mode 100644 src/assets/svg/fileType/pdf.svg create mode 100644 src/assets/svg/fileType/txt.svg create mode 100644 src/assets/svg/fileType/word.svg create mode 100644 src/assets/svg/illustration.svg create mode 100644 src/assets/svg/login-bg-dark.svg create mode 100644 src/assets/svg/login-bg.svg create mode 100644 src/assets/svg/login-box-bg.svg create mode 100644 src/assets/svg/net-error.svg create mode 100644 src/assets/svg/no-data.svg create mode 100644 src/assets/svg/preview/p-rotate.svg create mode 100644 src/assets/svg/preview/resume.svg create mode 100644 src/assets/svg/preview/scale.svg create mode 100644 src/assets/svg/preview/unrotate.svg create mode 100644 src/assets/svg/preview/unscale.svg create mode 100644 src/components/Application/index.ts create mode 100644 src/components/Application/src/AppDarkModeToggle.vue create mode 100644 src/components/Application/src/AppLocalePicker.vue create mode 100644 src/components/Application/src/AppLogo.vue create mode 100644 src/components/Application/src/AppProvider.vue create mode 100644 src/components/Application/src/search/AppSearch.vue create mode 100644 src/components/Application/src/search/AppSearchFooter.vue create mode 100644 src/components/Application/src/search/AppSearchKeyItem.vue create mode 100644 src/components/Application/src/search/AppSearchModal.vue create mode 100644 src/components/Application/src/search/useMenuSearch.ts create mode 100644 src/components/Application/src/useAppContext.ts create mode 100644 src/components/Authority/index.ts create mode 100644 src/components/Authority/src/Authority.vue create mode 100644 src/components/Basic/index.ts create mode 100644 src/components/Basic/src/BasicArrow.vue create mode 100644 src/components/Basic/src/BasicHelp.vue create mode 100644 src/components/Basic/src/BasicTitle.vue create mode 100644 src/components/Button/index.ts create mode 100644 src/components/Button/src/BasicButton.vue create mode 100644 src/components/Button/src/JUploadButton.vue create mode 100644 src/components/Button/src/PopConfirmButton.vue create mode 100644 src/components/Button/src/props.ts create mode 100644 src/components/CardList/index.ts create mode 100644 src/components/CardList/src/CardList.vue create mode 100644 src/components/CardList/src/data.ts create mode 100644 src/components/ClickOutSide/index.ts create mode 100644 src/components/ClickOutSide/src/ClickOutSide.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/codemirror/CodeMirror.vue create mode 100644 src/components/CodeEditor/src/codemirror/codeMirror.ts create mode 100644 src/components/CodeEditor/src/codemirror/codemirror.css create mode 100644 src/components/CodeEditor/src/json-preview/JsonPreview.vue create mode 100644 src/components/CodeEditor/src/typing.ts create mode 100644 src/components/Container/index.ts create mode 100644 src/components/Container/src/LazyContainer.vue create mode 100644 src/components/Container/src/ScrollContainer.vue create mode 100644 src/components/Container/src/collapse/CollapseContainer.vue create mode 100644 src/components/Container/src/collapse/CollapseHeader.vue create mode 100644 src/components/Container/src/typing.ts create mode 100644 src/components/ContextMenu/index.ts create mode 100644 src/components/ContextMenu/src/ContextMenu.vue create mode 100644 src/components/ContextMenu/src/createContextMenu.ts create mode 100644 src/components/ContextMenu/src/typing.ts create mode 100644 src/components/CountDown/index.ts create mode 100644 src/components/CountDown/src/CountButton.vue create mode 100644 src/components/CountDown/src/CountdownInput.vue create mode 100644 src/components/CountDown/src/useCountdown.ts create mode 100644 src/components/CountTo/index.ts create mode 100644 src/components/CountTo/src/CountTo.vue create mode 100644 src/components/Cropper/index.ts create mode 100644 src/components/Cropper/src/CopperModal.vue create mode 100644 src/components/Cropper/src/Cropper.vue create mode 100644 src/components/Cropper/src/CropperAvatar.vue create mode 100644 src/components/Cropper/src/typing.ts create mode 100644 src/components/Description/index.ts create mode 100644 src/components/Description/src/Description.vue create mode 100644 src/components/Description/src/typing.ts create mode 100644 src/components/Description/src/useDescription.ts create mode 100644 src/components/Drawer/index.ts create mode 100644 src/components/Drawer/src/BasicDrawer.vue create mode 100644 src/components/Drawer/src/components/DrawerFooter.vue create mode 100644 src/components/Drawer/src/components/DrawerHeader.vue create mode 100644 src/components/Drawer/src/props.ts create mode 100644 src/components/Drawer/src/typing.ts create mode 100644 src/components/Drawer/src/useDrawer.ts create mode 100644 src/components/Dropdown/index.ts create mode 100644 src/components/Dropdown/src/Dropdown.vue create mode 100644 src/components/Dropdown/src/typing.ts create mode 100644 src/components/Form/index.ts create mode 100644 src/components/Form/src/BasicForm.vue create mode 100644 src/components/Form/src/componentMap.ts create mode 100644 src/components/Form/src/components/ApiRadioGroup.vue create mode 100644 src/components/Form/src/components/ApiSelect.vue create mode 100644 src/components/Form/src/components/ApiTreeSelect.vue create mode 100644 src/components/Form/src/components/FormAction.vue create mode 100644 src/components/Form/src/components/FormItem.vue create mode 100644 src/components/Form/src/components/RadioButtonGroup.vue create mode 100644 src/components/Form/src/helper.ts create mode 100644 src/components/Form/src/hooks/useAdvanced.ts create mode 100644 src/components/Form/src/hooks/useAutoFocus.ts create mode 100644 src/components/Form/src/hooks/useComponentRegister.ts create mode 100644 src/components/Form/src/hooks/useForm.ts create mode 100644 src/components/Form/src/hooks/useFormContext.ts create mode 100644 src/components/Form/src/hooks/useFormEvents.ts create mode 100644 src/components/Form/src/hooks/useFormValues.ts create mode 100644 src/components/Form/src/hooks/useLabelWidth.ts create mode 100644 src/components/Form/src/jeecg/components/JAddInput.vue create mode 100644 src/components/Form/src/jeecg/components/JAreaLinkage.vue create mode 100644 src/components/Form/src/jeecg/components/JAreaSelect.vue create mode 100644 src/components/Form/src/jeecg/components/JCategorySelect.vue create mode 100644 src/components/Form/src/jeecg/components/JCheckbox.vue create mode 100644 src/components/Form/src/jeecg/components/JCodeEditor.vue create mode 100644 src/components/Form/src/jeecg/components/JDictSelectTag.vue create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/EasyCronInner.vue create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/EasyCronInput.vue create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/EasyCronModal.vue create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/LICENSE create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/easy.cron.data.ts create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/easy.cron.inner.less create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/easy.cron.input.less create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/index.ts create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/tabs/DayUI.vue create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/tabs/HourUI.vue create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/tabs/MinuteUI.vue create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/tabs/MonthUI.vue create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/tabs/SecondUI.vue create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/tabs/WeekUI.vue create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/tabs/YearUI.vue create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/tabs/useTabMixin.ts create mode 100644 src/components/Form/src/jeecg/components/JEasyCron/validator.ts create mode 100644 src/components/Form/src/jeecg/components/JEditor.vue create mode 100644 src/components/Form/src/jeecg/components/JEllipsis.vue create mode 100644 src/components/Form/src/jeecg/components/JFormContainer.vue create mode 100644 src/components/Form/src/jeecg/components/JImageUpload.vue create mode 100644 src/components/Form/src/jeecg/components/JImportModal.vue create mode 100644 src/components/Form/src/jeecg/components/JInput.vue create mode 100644 src/components/Form/src/jeecg/components/JInputPop.vue create mode 100644 src/components/Form/src/jeecg/components/JMarkdownEditor.vue create mode 100644 src/components/Form/src/jeecg/components/JPopup.vue create mode 100644 src/components/Form/src/jeecg/components/JRangeDate.vue create mode 100644 src/components/Form/src/jeecg/components/JRangeNumber.vue create mode 100644 src/components/Form/src/jeecg/components/JRangeTime.vue create mode 100644 src/components/Form/src/jeecg/components/JSearchSelect.vue create mode 100644 src/components/Form/src/jeecg/components/JSelectDept.vue create mode 100644 src/components/Form/src/jeecg/components/JSelectInput.vue create mode 100644 src/components/Form/src/jeecg/components/JSelectMultiple.vue create mode 100644 src/components/Form/src/jeecg/components/JSelectPosition.vue create mode 100644 src/components/Form/src/jeecg/components/JSelectRole.vue create mode 100644 src/components/Form/src/jeecg/components/JSelectUser.vue create mode 100644 src/components/Form/src/jeecg/components/JSelectUserByDept.vue create mode 100644 src/components/Form/src/jeecg/components/JSwitch.vue create mode 100644 src/components/Form/src/jeecg/components/JTreeDict.vue create mode 100644 src/components/Form/src/jeecg/components/JTreeSelect.vue create mode 100644 src/components/Form/src/jeecg/components/JUpload/JUpload.vue create mode 100644 src/components/Form/src/jeecg/components/JUpload/JUploadModal.vue create mode 100644 src/components/Form/src/jeecg/components/JUpload/components/UploadItemActions.vue create mode 100644 src/components/Form/src/jeecg/components/JUpload/index.ts create mode 100644 src/components/Form/src/jeecg/components/JUpload/upload.data.ts create mode 100644 src/components/Form/src/jeecg/components/base/JSelectBiz.vue create mode 100644 src/components/Form/src/jeecg/components/base/JTreeBiz.vue create mode 100644 src/components/Form/src/jeecg/components/modal/DeptSelectModal.vue create mode 100644 src/components/Form/src/jeecg/components/modal/JPopupOnlReportModal.vue create mode 100644 src/components/Form/src/jeecg/components/modal/PositionSelectModal.vue create mode 100644 src/components/Form/src/jeecg/components/modal/RoleSelectModal.vue create mode 100644 src/components/Form/src/jeecg/components/modal/UserSelectByDepModal.vue create mode 100644 src/components/Form/src/jeecg/components/modal/UserSelectModal.vue create mode 100644 src/components/Form/src/jeecg/components/positionSelect/PositionSelectModal.vue create mode 100644 src/components/Form/src/jeecg/components/roleSelect/RoleSelectModal.vue create mode 100644 src/components/Form/src/jeecg/components/userSelect/SelectedUserItem.vue create mode 100644 src/components/Form/src/jeecg/components/userSelect/UserList.vue create mode 100644 src/components/Form/src/jeecg/components/userSelect/UserListAndDepart.vue create mode 100644 src/components/Form/src/jeecg/components/userSelect/UserListAndRole.vue create mode 100644 src/components/Form/src/jeecg/components/userSelect/UserSelectModal.vue create mode 100644 src/components/Form/src/jeecg/components/userSelect/index.vue create mode 100644 src/components/Form/src/jeecg/hooks/useSelectBiz.ts create mode 100644 src/components/Form/src/jeecg/hooks/useTreeBiz.ts create mode 100644 src/components/Form/src/jeecg/props/props.ts create mode 100644 src/components/Form/src/props.ts create mode 100644 src/components/Form/src/types/form.ts create mode 100644 src/components/Form/src/types/formItem.ts create mode 100644 src/components/Form/src/types/hooks.ts create mode 100644 src/components/Form/src/types/index.ts create mode 100644 src/components/Form/src/utils/Area.ts create mode 100644 src/components/Form/src/utils/GroupRequest.ts create mode 100644 src/components/Form/src/utils/areaDataUtil.js create mode 100644 src/components/Form/src/utils/formUtils.ts create mode 100644 src/components/Icon/data/icons.data.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/IconPicker.vue create mode 100644 src/components/Icon/src/SvgIcon.vue create mode 100644 src/components/JVxeCustom/index.ts create mode 100644 src/components/JVxeCustom/src/components/JVxeDepartSelectCell.vue create mode 100644 src/components/JVxeCustom/src/components/JVxeFileCell.vue create mode 100644 src/components/JVxeCustom/src/components/JVxeImageCell.vue create mode 100644 src/components/JVxeCustom/src/components/JVxePcaCell.vue create mode 100644 src/components/JVxeCustom/src/components/JVxePopupCell.vue create mode 100644 src/components/JVxeCustom/src/components/JVxeSelectDictSearchCell.ts create mode 100644 src/components/JVxeCustom/src/components/JVxeUserSelectCell.vue create mode 100644 src/components/JVxeCustom/src/hooks/useFileCell.ts create mode 100644 src/components/Loading/index.ts create mode 100644 src/components/Loading/src/Loading.vue create mode 100644 src/components/Loading/src/createLoading.ts create mode 100644 src/components/Loading/src/typing.ts create mode 100644 src/components/Loading/src/useLoading.ts create mode 100644 src/components/Markdown/index.ts create mode 100644 src/components/Markdown/src/Markdown.vue create mode 100644 src/components/Markdown/src/MarkdownViewer.vue create mode 100644 src/components/Markdown/src/typing.ts create mode 100644 src/components/Menu/index.ts create mode 100644 src/components/Menu/src/BasicMenu.vue create mode 100644 src/components/Menu/src/components/BasicMenuItem.vue create mode 100644 src/components/Menu/src/components/BasicSubMenuItem.vue create mode 100644 src/components/Menu/src/components/MenuItemContent.vue create mode 100644 src/components/Menu/src/index.less create mode 100644 src/components/Menu/src/props.ts create mode 100644 src/components/Menu/src/types.ts create mode 100644 src/components/Menu/src/useOpenKeys.ts create mode 100644 src/components/Modal/index.ts create mode 100644 src/components/Modal/src/BasicModal.vue create mode 100644 src/components/Modal/src/components/Modal.tsx create mode 100644 src/components/Modal/src/components/ModalClose.vue create mode 100644 src/components/Modal/src/components/ModalFooter.vue create mode 100644 src/components/Modal/src/components/ModalHeader.vue create mode 100644 src/components/Modal/src/components/ModalWrapper.vue create mode 100644 src/components/Modal/src/hooks/useModal.ts create mode 100644 src/components/Modal/src/hooks/useModalContext.ts create mode 100644 src/components/Modal/src/hooks/useModalDrag.ts create mode 100644 src/components/Modal/src/hooks/useModalFullScreen.ts create mode 100644 src/components/Modal/src/index.less create mode 100644 src/components/Modal/src/props.ts create mode 100644 src/components/Modal/src/typing.ts create mode 100644 src/components/Page/index.ts create mode 100644 src/components/Page/injectionKey.ts create mode 100644 src/components/Page/src/PageFooter.vue create mode 100644 src/components/Page/src/PageWrapper.vue create mode 100644 src/components/Preview/index.ts create mode 100644 src/components/Preview/src/Functional.vue create mode 100644 src/components/Preview/src/Preview.vue create mode 100644 src/components/Preview/src/functional.ts create mode 100644 src/components/Preview/src/typing.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/drawCanvas.ts create mode 100644 src/components/Qrcode/src/drawLogo.ts create mode 100644 src/components/Qrcode/src/qrcodePlus.ts create mode 100644 src/components/Qrcode/src/toCanvas.ts create mode 100644 src/components/Qrcode/src/typing.ts create mode 100644 src/components/Scrollbar/index.ts create mode 100644 src/components/Scrollbar/src/Scrollbar.vue create mode 100644 src/components/Scrollbar/src/bar.ts create mode 100644 src/components/Scrollbar/src/types.d.ts create mode 100644 src/components/Scrollbar/src/util.ts create mode 100644 src/components/SimpleMenu/index.ts create mode 100644 src/components/SimpleMenu/src/SimpleMenu.vue create mode 100644 src/components/SimpleMenu/src/SimpleMenuTag.vue create mode 100644 src/components/SimpleMenu/src/SimpleSubMenu.vue create mode 100644 src/components/SimpleMenu/src/components/Menu.vue create mode 100644 src/components/SimpleMenu/src/components/MenuCollapseTransition.vue create mode 100644 src/components/SimpleMenu/src/components/MenuItem.vue create mode 100644 src/components/SimpleMenu/src/components/SubMenuItem.vue create mode 100644 src/components/SimpleMenu/src/components/menu.less create mode 100644 src/components/SimpleMenu/src/components/types.ts create mode 100644 src/components/SimpleMenu/src/components/useMenu.ts create mode 100644 src/components/SimpleMenu/src/components/useSimpleMenuContext.ts create mode 100644 src/components/SimpleMenu/src/index.less create mode 100644 src/components/SimpleMenu/src/types.ts create mode 100644 src/components/SimpleMenu/src/useOpenKeys.ts create mode 100644 src/components/StrengthMeter/index.ts create mode 100644 src/components/StrengthMeter/src/StrengthMeter.vue create mode 100644 src/components/Table/index.ts create mode 100644 src/components/Table/src/BasicTable.vue create mode 100644 src/components/Table/src/componentMap.ts create mode 100644 src/components/Table/src/components/EditTableHeaderIcon.vue create mode 100644 src/components/Table/src/components/ExpandIcon.tsx create mode 100644 src/components/Table/src/components/HeaderCell.vue create mode 100644 src/components/Table/src/components/TableAction.vue create mode 100644 src/components/Table/src/components/TableFooter.vue create mode 100644 src/components/Table/src/components/TableHeader.vue create mode 100644 src/components/Table/src/components/TableImg.vue create mode 100644 src/components/Table/src/components/TableTitle.vue create mode 100644 src/components/Table/src/components/editable/CellComponent.ts create mode 100644 src/components/Table/src/components/editable/EditableCell.vue create mode 100644 src/components/Table/src/components/editable/helper.ts create mode 100644 src/components/Table/src/components/editable/index.ts create mode 100644 src/components/Table/src/components/settings/ColumnSetting.vue create mode 100644 src/components/Table/src/components/settings/FullScreenSetting.vue create mode 100644 src/components/Table/src/components/settings/RedoSetting.vue create mode 100644 src/components/Table/src/components/settings/SizeSetting.vue create mode 100644 src/components/Table/src/components/settings/index.vue create mode 100644 src/components/Table/src/const.ts create mode 100644 src/components/Table/src/hooks/useColumns.ts create mode 100644 src/components/Table/src/hooks/useColumnsCache.ts create mode 100644 src/components/Table/src/hooks/useCustomRow.ts create mode 100644 src/components/Table/src/hooks/useDataSource.ts create mode 100644 src/components/Table/src/hooks/useLoading.ts create mode 100644 src/components/Table/src/hooks/usePagination.tsx create mode 100644 src/components/Table/src/hooks/useRowSelection.ts create mode 100644 src/components/Table/src/hooks/useTable.ts create mode 100644 src/components/Table/src/hooks/useTableContext.ts create mode 100644 src/components/Table/src/hooks/useTableExpand.ts create mode 100644 src/components/Table/src/hooks/useTableFooter.ts create mode 100644 src/components/Table/src/hooks/useTableForm.ts create mode 100644 src/components/Table/src/hooks/useTableHeader.ts create mode 100644 src/components/Table/src/hooks/useTableScroll.ts create mode 100644 src/components/Table/src/hooks/useTableStyle.ts create mode 100644 src/components/Table/src/props.ts create mode 100644 src/components/Table/src/types/column.ts create mode 100644 src/components/Table/src/types/componentType.ts create mode 100644 src/components/Table/src/types/pagination.ts create mode 100644 src/components/Table/src/types/table.ts create mode 100644 src/components/Table/src/types/tableAction.ts create mode 100644 src/components/Time/index.ts create mode 100644 src/components/Time/src/Time.vue create mode 100644 src/components/Tinymce/index.ts create mode 100644 src/components/Tinymce/src/Editor.vue create mode 100644 src/components/Tinymce/src/ImgUpload.vue create mode 100644 src/components/Tinymce/src/helper.ts create mode 100644 src/components/Tinymce/src/tinymce.ts create mode 100644 src/components/Transition/index.ts create mode 100644 src/components/Transition/src/CollapseTransition.vue create mode 100644 src/components/Transition/src/CreateTransition.tsx create mode 100644 src/components/Transition/src/ExpandTransition.ts create mode 100644 src/components/Tree/index.ts create mode 100644 src/components/Tree/src/BasicTree.vue create mode 100644 src/components/Tree/src/TreeIcon.ts create mode 100644 src/components/Tree/src/components/TreeHeader.vue create mode 100644 src/components/Tree/src/hooks/useTree.ts create mode 100644 src/components/Tree/src/types/tree.ts create mode 100644 src/components/Tree/style/index.less create mode 100644 src/components/Tree/style/index.ts create mode 100644 src/components/Tree_backup/index.ts create mode 100644 src/components/Tree_backup/src/Tree.vue create mode 100644 src/components/Tree_backup/src/TreeHeader.vue create mode 100644 src/components/Tree_backup/src/TreeIcon.ts create mode 100644 src/components/Tree_backup/src/props.ts create mode 100644 src/components/Tree_backup/src/typing.ts create mode 100644 src/components/Tree_backup/src/useTree.ts create mode 100644 src/components/Upload/index.ts create mode 100644 src/components/Upload/src/BasicUpload.vue create mode 100644 src/components/Upload/src/FileList.vue create mode 100644 src/components/Upload/src/ThumbUrl.vue create mode 100644 src/components/Upload/src/UploadModal.vue create mode 100644 src/components/Upload/src/UploadPreviewModal.vue create mode 100644 src/components/Upload/src/data.tsx create mode 100644 src/components/Upload/src/helper.ts create mode 100644 src/components/Upload/src/props.ts create mode 100644 src/components/Upload/src/typing.ts create mode 100644 src/components/Upload/src/useUpload.ts create mode 100644 src/components/Verify/index.ts create mode 100644 src/components/Verify/src/DragVerify.vue create mode 100644 src/components/Verify/src/ImgRotate.vue create mode 100644 src/components/Verify/src/props.ts create mode 100644 src/components/Verify/src/typing.ts create mode 100644 src/components/VirtualScroll/index.ts create mode 100644 src/components/VirtualScroll/src/VirtualScroll.vue create mode 100644 src/components/chart/Bar.vue create mode 100644 src/components/chart/BarAndLine.vue create mode 100644 src/components/chart/BarMulti.vue create mode 100644 src/components/chart/ChartCard.vue create mode 100644 src/components/chart/Gauge.vue create mode 100644 src/components/chart/HeadInfo.vue create mode 100644 src/components/chart/Line.vue create mode 100644 src/components/chart/LineMulti.vue create mode 100644 src/components/chart/Pie.vue create mode 100644 src/components/chart/README.md create mode 100644 src/components/chart/Radar.vue create mode 100644 src/components/chart/RankList.vue create mode 100644 src/components/chart/StackBar.vue create mode 100644 src/components/chart/Trend.vue create mode 100644 src/components/jeecg/AIcon.vue create mode 100644 src/components/jeecg/ExcelButton.vue create mode 100644 src/components/jeecg/JPrompt/JPrompt.vue create mode 100644 src/components/jeecg/JPrompt/hooks/useJPrompt.ts create mode 100644 src/components/jeecg/JPrompt/index.ts create mode 100644 src/components/jeecg/JPrompt/typing.ts create mode 100644 src/components/jeecg/JVxeTable/hooks.ts create mode 100644 src/components/jeecg/JVxeTable/index.ts create mode 100644 src/components/jeecg/JVxeTable/src/JVxeTable.ts create mode 100644 src/components/jeecg/JVxeTable/src/componentMap.ts create mode 100644 src/components/jeecg/JVxeTable/src/components/JVxeDetailsModal.vue create mode 100644 src/components/jeecg/JVxeTable/src/components/JVxeReloadEffect.ts create mode 100644 src/components/jeecg/JVxeTable/src/components/JVxeSubPopover.vue create mode 100644 src/components/jeecg/JVxeTable/src/components/JVxeToolbar.vue create mode 100644 src/components/jeecg/JVxeTable/src/components/cells/JVxeCheckboxCell.vue create mode 100644 src/components/jeecg/JVxeTable/src/components/cells/JVxeDateCell.vue create mode 100644 src/components/jeecg/JVxeTable/src/components/cells/JVxeDragSortCell.vue create mode 100644 src/components/jeecg/JVxeTable/src/components/cells/JVxeInputCell.vue create mode 100644 src/components/jeecg/JVxeTable/src/components/cells/JVxeNormalCell.vue create mode 100644 src/components/jeecg/JVxeTable/src/components/cells/JVxeProgressCell.vue create mode 100644 src/components/jeecg/JVxeTable/src/components/cells/JVxeRadioCell.vue create mode 100644 src/components/jeecg/JVxeTable/src/components/cells/JVxeSelectCell.vue create mode 100644 src/components/jeecg/JVxeTable/src/components/cells/JVxeSlotCell.ts create mode 100644 src/components/jeecg/JVxeTable/src/components/cells/JVxeTextareaCell.vue create mode 100644 src/components/jeecg/JVxeTable/src/components/cells/JVxeTimeCell.vue create mode 100644 src/components/jeecg/JVxeTable/src/components/cells/JVxeUploadCell.vue create mode 100644 src/components/jeecg/JVxeTable/src/hooks/cells/useJVxeUploadCell.ts create mode 100644 src/components/jeecg/JVxeTable/src/hooks/useColumns.ts create mode 100644 src/components/jeecg/JVxeTable/src/hooks/useData.ts create mode 100644 src/components/jeecg/JVxeTable/src/hooks/useDataSource.ts create mode 100644 src/components/jeecg/JVxeTable/src/hooks/useDragSort.ts create mode 100644 src/components/jeecg/JVxeTable/src/hooks/useFinallyProps.ts create mode 100644 src/components/jeecg/JVxeTable/src/hooks/useJVxeComponent.ts create mode 100644 src/components/jeecg/JVxeTable/src/hooks/useKeyboardEdit.ts create mode 100644 src/components/jeecg/JVxeTable/src/hooks/useLinkage.ts create mode 100644 src/components/jeecg/JVxeTable/src/hooks/useMethods.ts create mode 100644 src/components/jeecg/JVxeTable/src/hooks/usePagination.ts create mode 100644 src/components/jeecg/JVxeTable/src/hooks/useRenderComponents.ts create mode 100644 src/components/jeecg/JVxeTable/src/hooks/useToolbar.ts create mode 100644 src/components/jeecg/JVxeTable/src/hooks/useValidateRules.ts create mode 100644 src/components/jeecg/JVxeTable/src/hooks/useWebSocket.ts create mode 100644 src/components/jeecg/JVxeTable/src/install.ts create mode 100644 src/components/jeecg/JVxeTable/src/style/index.less create mode 100644 src/components/jeecg/JVxeTable/src/style/reload-effect.less create mode 100644 src/components/jeecg/JVxeTable/src/style/vxe.const.less create mode 100644 src/components/jeecg/JVxeTable/src/style/vxe.dark.less create mode 100644 src/components/jeecg/JVxeTable/src/types/JVxeComponent.ts create mode 100644 src/components/jeecg/JVxeTable/src/types/JVxeTypes.ts create mode 100644 src/components/jeecg/JVxeTable/src/types/index.ts create mode 100644 src/components/jeecg/JVxeTable/src/utils/authUtils.ts create mode 100644 src/components/jeecg/JVxeTable/src/utils/enhancedUtils.ts create mode 100644 src/components/jeecg/JVxeTable/src/utils/registerUtils.ts create mode 100644 src/components/jeecg/JVxeTable/src/utils/vxeUtils.ts create mode 100644 src/components/jeecg/JVxeTable/src/vxe.data.ts create mode 100644 src/components/jeecg/JVxeTable/types.ts create mode 100644 src/components/jeecg/JVxeTable/utils.ts create mode 100644 src/components/jeecg/OnLine/JPopupOnlReport.vue create mode 100644 src/components/jeecg/OnLine/SearchFormItem.vue create mode 100644 src/components/jeecg/OnLine/hooks/usePopBiz.ts create mode 100644 src/components/jeecg/OnLine/types/onlineConfig.ts create mode 100644 src/components/jeecg/UserAvatar.vue create mode 100644 src/components/jeecg/comment/CommentFiles.vue create mode 100644 src/components/jeecg/comment/CommentList.vue create mode 100644 src/components/jeecg/comment/CommentPanel.vue create mode 100644 src/components/jeecg/comment/DataLogList.vue create mode 100644 src/components/jeecg/comment/HistoryFileList.vue create mode 100644 src/components/jeecg/comment/MyComment.vue create mode 100644 src/components/jeecg/comment/UploadChunk.vue create mode 100644 src/components/jeecg/comment/comment.less create mode 100644 src/components/jeecg/comment/image/emoji.png create mode 100644 src/components/jeecg/comment/image/emoji_native.png create mode 100644 src/components/jeecg/comment/useComment.ts create mode 100644 src/components/jeecg/thirdApp/JThirdAppButton.vue create mode 100644 src/components/jeecg/thirdApp/JThirdAppDropdown.vue create mode 100644 src/components/jeecg/thirdApp/jThirdApp.api.ts create mode 100644 src/components/registerGlobComp.ts create mode 100644 src/design/ant/btn.less create mode 100644 src/design/ant/index.less create mode 100644 src/design/ant/input.less create mode 100644 src/design/ant/pagination.less create mode 100644 src/design/ant/table.less create mode 100644 src/design/color.less create mode 100644 src/design/config.less create mode 100644 src/design/index.less create mode 100644 src/design/public.less create mode 100644 src/design/theme.less create mode 100644 src/design/transition/base.less create mode 100644 src/design/transition/fade.less create mode 100644 src/design/transition/index.less create mode 100644 src/design/transition/scale.less create mode 100644 src/design/transition/scroll.less create mode 100644 src/design/transition/slide.less create mode 100644 src/design/transition/zoom.less create mode 100644 src/design/var/breakpoint.less create mode 100644 src/design/var/easing.less create mode 100644 src/design/var/index.less create mode 100644 src/directives/clickOutside.ts create mode 100644 src/directives/index.ts create mode 100644 src/directives/loading.ts create mode 100644 src/directives/permission.ts create mode 100644 src/directives/repeatClick.ts create mode 100644 src/directives/ripple/index.less create mode 100644 src/directives/ripple/index.ts create mode 100644 src/enums/CompTypeEnum.ts create mode 100644 src/enums/DateTypeEnum.ts create mode 100644 src/enums/appEnum.ts create mode 100644 src/enums/breakpointEnum.ts create mode 100644 src/enums/cacheEnum.ts create mode 100644 src/enums/exceptionEnum.ts create mode 100644 src/enums/httpEnum.ts create mode 100644 src/enums/jeecgEnum.ts create mode 100644 src/enums/menuEnum.ts create mode 100644 src/enums/pageEnum.ts create mode 100644 src/enums/roleEnum.ts create mode 100644 src/enums/sizeEnum.ts create mode 100644 src/hooks/component/useFormItem.ts create mode 100644 src/hooks/component/usePageContext.ts create mode 100644 src/hooks/core/onMountedOrActivated.ts create mode 100644 src/hooks/core/useAttrs.ts create mode 100644 src/hooks/core/useContext.ts create mode 100644 src/hooks/core/useLockFn.ts create mode 100644 src/hooks/core/useRefs.ts create mode 100644 src/hooks/core/useTimeout.ts create mode 100644 src/hooks/event/useBreakpoint.ts create mode 100644 src/hooks/event/useEventListener.ts create mode 100644 src/hooks/event/useIntersectionObserver.ts create mode 100644 src/hooks/event/useScroll.ts create mode 100644 src/hooks/event/useScrollTo.ts create mode 100644 src/hooks/event/useWindowSizeFn.ts create mode 100644 src/hooks/jeecg/useAdaptiveWidth.ts create mode 100644 src/hooks/setting/index.ts create mode 100644 src/hooks/setting/useHeaderSetting.ts create mode 100644 src/hooks/setting/useMenuSetting.ts create mode 100644 src/hooks/setting/useMultipleTabSetting.ts create mode 100644 src/hooks/setting/useRootSetting.ts create mode 100644 src/hooks/setting/useTransitionSetting.ts create mode 100644 src/hooks/system/useAutoAdapt.ts create mode 100644 src/hooks/system/useJvxeMethods.ts create mode 100644 src/hooks/system/useListPage.ts create mode 100644 src/hooks/system/useMethods.ts create mode 100644 src/hooks/system/useThirdLogin.ts create mode 100644 src/hooks/web/useAppInject.ts create mode 100644 src/hooks/web/useContentHeight.ts create mode 100644 src/hooks/web/useContextMenu.ts create mode 100644 src/hooks/web/useCopyModal.ts create mode 100644 src/hooks/web/useCopyToClipboard.ts create mode 100644 src/hooks/web/useDesign.ts create mode 100644 src/hooks/web/useECharts.ts create mode 100644 src/hooks/web/useFullContent.ts create mode 100644 src/hooks/web/useI18n.ts create mode 100644 src/hooks/web/useLockPage.ts create mode 100644 src/hooks/web/useMessage.ts create mode 100644 src/hooks/web/useMessage.tsx_backup create mode 100644 src/hooks/web/usePage.ts create mode 100644 src/hooks/web/usePagination.ts create mode 100644 src/hooks/web/usePermission.ts create mode 100644 src/hooks/web/usePrintJS.ts create mode 100644 src/hooks/web/useScript.ts create mode 100644 src/hooks/web/useSortable.ts create mode 100644 src/hooks/web/useSso.ts create mode 100644 src/hooks/web/useTabs.ts create mode 100644 src/hooks/web/useTitle.ts create mode 100644 src/hooks/web/useWatermark.ts create mode 100644 src/hooks/web/useWebSocket.ts create mode 100644 src/layouts/default/content/index.vue create mode 100644 src/layouts/default/content/useContentContext.ts create mode 100644 src/layouts/default/content/useContentViewHeight.ts create mode 100644 src/layouts/default/feature/index.vue create mode 100644 src/layouts/default/footer/index.vue create mode 100644 src/layouts/default/header/MultipleHeader.vue create mode 100644 src/layouts/default/header/components/Breadcrumb.vue create mode 100644 src/layouts/default/header/components/ErrorAction.vue create mode 100644 src/layouts/default/header/components/FullScreen.vue create mode 100644 src/layouts/default/header/components/LockScreen.vue create mode 100644 src/layouts/default/header/components/index.ts create mode 100644 src/layouts/default/header/components/lock/LockModal.vue create mode 100644 src/layouts/default/header/components/notify/NoticeList.vue create mode 100644 src/layouts/default/header/components/notify/data.ts create mode 100644 src/layouts/default/header/components/notify/index.vue create mode 100644 src/layouts/default/header/components/notify/index_old.vue create mode 100644 src/layouts/default/header/components/notify/notify.api.ts create mode 100644 src/layouts/default/header/components/user-dropdown/DepartSelect.vue create mode 100644 src/layouts/default/header/components/user-dropdown/DropMenuItem.vue create mode 100644 src/layouts/default/header/components/user-dropdown/UpdatePassword.vue create mode 100644 src/layouts/default/header/components/user-dropdown/index.vue create mode 100644 src/layouts/default/header/index.less create mode 100644 src/layouts/default/header/index.vue create mode 100644 src/layouts/default/index.vue create mode 100644 src/layouts/default/menu/index.vue create mode 100644 src/layouts/default/menu/useLayoutMenu.ts create mode 100644 src/layouts/default/setting/SettingDrawer.tsx create mode 100644 src/layouts/default/setting/components/InputNumberItem.vue create mode 100644 src/layouts/default/setting/components/SelectItem.vue create mode 100644 src/layouts/default/setting/components/SettingFooter.vue create mode 100644 src/layouts/default/setting/components/SwitchItem.vue create mode 100644 src/layouts/default/setting/components/ThemeColorPicker.vue create mode 100644 src/layouts/default/setting/components/TypePicker.vue create mode 100644 src/layouts/default/setting/components/index.ts create mode 100644 src/layouts/default/setting/enum.ts create mode 100644 src/layouts/default/setting/handler.ts create mode 100644 src/layouts/default/setting/index.vue create mode 100644 src/layouts/default/sider/DragBar.vue create mode 100644 src/layouts/default/sider/LayoutSider.vue create mode 100644 src/layouts/default/sider/MixSider.vue create mode 100644 src/layouts/default/sider/index.vue create mode 100644 src/layouts/default/sider/useLayoutSider.ts create mode 100644 src/layouts/default/tabs/components/FoldButton.vue create mode 100644 src/layouts/default/tabs/components/TabContent.vue create mode 100644 src/layouts/default/tabs/components/TabRedo.vue create mode 100644 src/layouts/default/tabs/index.less create mode 100644 src/layouts/default/tabs/index.vue create mode 100644 src/layouts/default/tabs/tabs.theme.card.less create mode 100644 src/layouts/default/tabs/tabs.theme.smooth.less create mode 100644 src/layouts/default/tabs/types.ts create mode 100644 src/layouts/default/tabs/useMultipleTabs.ts create mode 100644 src/layouts/default/tabs/useTabDropdown.ts create mode 100644 src/layouts/default/trigger/HeaderTrigger.vue create mode 100644 src/layouts/default/trigger/SiderTrigger.vue create mode 100644 src/layouts/default/trigger/index.vue create mode 100644 src/layouts/iframe/index.vue create mode 100644 src/layouts/iframe/useFrameKeepAlive.ts create mode 100644 src/layouts/page/index.vue create mode 100644 src/layouts/page/transition.ts create mode 100644 src/locales/helper.ts create mode 100644 src/locales/lang/en.ts create mode 100644 src/locales/lang/en/common.ts create mode 100644 src/locales/lang/en/component.ts create mode 100644 src/locales/lang/en/layout.ts create mode 100644 src/locales/lang/en/routes/basic.ts create mode 100644 src/locales/lang/en/routes/dashboard.ts create mode 100644 src/locales/lang/en/routes/demo.ts create mode 100644 src/locales/lang/en/sys.ts create mode 100644 src/locales/lang/zh-CN/common.ts create mode 100644 src/locales/lang/zh-CN/component.ts create mode 100644 src/locales/lang/zh-CN/layout.ts create mode 100644 src/locales/lang/zh-CN/routes/basic.ts create mode 100644 src/locales/lang/zh-CN/routes/dashboard.ts create mode 100644 src/locales/lang/zh-CN/routes/demo.ts create mode 100644 src/locales/lang/zh-CN/sys.ts create mode 100644 src/locales/lang/zh_CN.ts create mode 100644 src/locales/setupI18n.ts create mode 100644 src/locales/useLocale.ts create mode 100644 src/logics/error-handle/index.ts create mode 100644 src/logics/initAppConfig.ts create mode 100644 src/logics/mitt/routeChange.ts create mode 100644 src/logics/theme/dark.ts create mode 100644 src/logics/theme/index.ts create mode 100644 src/logics/theme/updateBackground.ts create mode 100644 src/logics/theme/updateColorWeak.ts create mode 100644 src/logics/theme/updateGrayMode.ts create mode 100644 src/logics/theme/util.ts create mode 100644 src/main.ts create mode 100644 src/qiankun/apps.ts create mode 100644 src/qiankun/index.ts create mode 100644 src/qiankun/state.ts create mode 100644 src/router/constant.ts create mode 100644 src/router/guard/index.ts create mode 100644 src/router/guard/paramMenuGuard.ts create mode 100644 src/router/guard/permissionGuard.ts create mode 100644 src/router/guard/stateGuard.ts create mode 100644 src/router/helper/menuHelper.ts create mode 100644 src/router/helper/routeHelper.ts create mode 100644 src/router/index.ts create mode 100644 src/router/menus/index.ts create mode 100644 src/router/routes/basic.ts create mode 100644 src/router/routes/index.ts create mode 100644 src/router/routes/mainOut.ts create mode 100644 src/router/routes/modules/about.ts create mode 100644 src/router/routes/modules/dashboard.ts create mode 100644 src/router/routes/modules/demo/charts.ts create mode 100644 src/router/routes/modules/demo/comp.ts create mode 100644 src/router/routes/modules/demo/feat.ts create mode 100644 src/router/routes/modules/demo/iframe.ts create mode 100644 src/router/routes/modules/demo/level.ts create mode 100644 src/router/routes/modules/demo/page.ts create mode 100644 src/router/routes/modules/demo/permission.ts create mode 100644 src/router/routes/modules/demo/setup.ts create mode 100644 src/router/routes/modules/demo/system.ts create mode 100644 src/router/types.ts create mode 100644 src/settings/componentSetting.ts create mode 100644 src/settings/designSetting.ts create mode 100644 src/settings/encryptionSetting.ts create mode 100644 src/settings/localeSetting.ts create mode 100644 src/settings/projectSetting.ts create mode 100644 src/settings/registerThirdComp.ts create mode 100644 src/settings/siteSetting.ts create mode 100644 src/store/index.ts create mode 100644 src/store/modules/app.ts create mode 100644 src/store/modules/errorLog.ts create mode 100644 src/store/modules/locale.ts create mode 100644 src/store/modules/lock.ts create mode 100644 src/store/modules/multipleTab.ts create mode 100644 src/store/modules/permission.ts create mode 100644 src/store/modules/user.ts create mode 100644 src/utils/auth/index.ts create mode 100644 src/utils/bem.ts create mode 100644 src/utils/browser.js create mode 100644 src/utils/cache/index.ts create mode 100644 src/utils/cache/memory.ts create mode 100644 src/utils/cache/persistent.ts create mode 100644 src/utils/cache/storageCache.ts create mode 100644 src/utils/cipher.ts create mode 100644 src/utils/color.ts create mode 100644 src/utils/common/compUtils.ts create mode 100644 src/utils/common/renderUtils.ts create mode 100644 src/utils/common/vxeUtils.ts create mode 100644 src/utils/dateUtil.ts create mode 100644 src/utils/desform/customExpression.ts create mode 100644 src/utils/dict/JDictSelectUtil.js create mode 100644 src/utils/dict/index.ts create mode 100644 src/utils/domUtils.ts create mode 100644 src/utils/encryption/signMd5Utils.js create mode 100644 src/utils/env.ts create mode 100644 src/utils/event/index.ts create mode 100644 src/utils/factory/createAsyncComponent.tsx create mode 100644 src/utils/file/base64Conver.ts create mode 100644 src/utils/file/download.ts create mode 100644 src/utils/helper/treeHelper.ts create mode 100644 src/utils/helper/tsxHelper.tsx create mode 100644 src/utils/helper/validator.ts create mode 100644 src/utils/http/axios/Axios.ts create mode 100644 src/utils/http/axios/axiosCancel.ts create mode 100644 src/utils/http/axios/axiosTransform.ts create mode 100644 src/utils/http/axios/checkStatus.ts create mode 100644 src/utils/http/axios/helper.ts create mode 100644 src/utils/http/axios/index.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/is.ts create mode 100644 src/utils/lib/echarts.ts create mode 100644 src/utils/log.ts create mode 100644 src/utils/mitt.ts create mode 100644 src/utils/monorepo/dynamicRouter.ts create mode 100644 src/utils/monorepo/registerPackages.ts create mode 100644 src/utils/propTypes.ts create mode 100644 src/utils/props.ts create mode 100644 src/utils/types.ts create mode 100644 src/utils/uuid.ts create mode 100644 src/views/dashboard/Analysis/api.ts create mode 100644 src/views/dashboard/Analysis/components/BdcTabCard.vue create mode 100644 src/views/dashboard/Analysis/components/ChartGroupCard.vue create mode 100644 src/views/dashboard/Analysis/components/GrowCard.vue create mode 100644 src/views/dashboard/Analysis/components/QuickNav.vue create mode 100644 src/views/dashboard/Analysis/components/SaleTabCard.vue create mode 100644 src/views/dashboard/Analysis/components/SalesProductPie.vue create mode 100644 src/views/dashboard/Analysis/components/SiteAnalysis.vue create mode 100644 src/views/dashboard/Analysis/components/VisitAnalysis.vue create mode 100644 src/views/dashboard/Analysis/components/VisitAnalysisBar.vue create mode 100644 src/views/dashboard/Analysis/components/VisitRadar.vue create mode 100644 src/views/dashboard/Analysis/components/VisitSource.vue create mode 100644 src/views/dashboard/Analysis/components/props.ts create mode 100644 src/views/dashboard/Analysis/data.ts create mode 100644 src/views/dashboard/Analysis/homePage/IndexBdc.vue create mode 100644 src/views/dashboard/Analysis/homePage/IndexChart.vue create mode 100644 src/views/dashboard/Analysis/homePage/IndexDef.vue create mode 100644 src/views/dashboard/Analysis/homePage/IndexTask.vue create mode 100644 src/views/dashboard/Analysis/index.vue create mode 100644 src/views/dashboard/workbench/components/DynamicInfo.vue create mode 100644 src/views/dashboard/workbench/components/ProjectCard.vue create mode 100644 src/views/dashboard/workbench/components/QuickNav.vue create mode 100644 src/views/dashboard/workbench/components/SaleRadar.vue create mode 100644 src/views/dashboard/workbench/components/WorkbenchHeader.vue create mode 100644 src/views/dashboard/workbench/components/data.ts create mode 100644 src/views/dashboard/workbench/index.vue create mode 100644 src/views/demo/charts/Line.vue create mode 100644 src/views/demo/charts/Map.vue create mode 100644 src/views/demo/charts/Pie.vue create mode 100644 src/views/demo/charts/SaleRadar.vue create mode 100644 src/views/demo/charts/china.json create mode 100644 src/views/demo/charts/data.ts create mode 100644 src/views/demo/charts/map/Baidu.vue create mode 100644 src/views/demo/charts/map/Gaode.vue create mode 100644 src/views/demo/charts/map/Google.vue create mode 100644 src/views/demo/codemirror/index.vue create mode 100644 src/views/demo/comp/button/index.vue create mode 100644 src/views/demo/comp/card-list/index.vue create mode 100644 src/views/demo/comp/count-to/index.vue create mode 100644 src/views/demo/comp/cropper/index.vue create mode 100644 src/views/demo/comp/desc/index.vue create mode 100644 src/views/demo/comp/drawer/Drawer1.vue create mode 100644 src/views/demo/comp/drawer/Drawer2.vue create mode 100644 src/views/demo/comp/drawer/Drawer3.vue create mode 100644 src/views/demo/comp/drawer/Drawer4.vue create mode 100644 src/views/demo/comp/drawer/Drawer5.vue create mode 100644 src/views/demo/comp/drawer/index.vue create mode 100644 src/views/demo/comp/lazy/TargetContent.vue create mode 100644 src/views/demo/comp/lazy/Transition.vue create mode 100644 src/views/demo/comp/lazy/index.vue create mode 100644 src/views/demo/comp/loading/index.vue create mode 100644 src/views/demo/comp/modal/Modal1.vue create mode 100644 src/views/demo/comp/modal/Modal2.vue create mode 100644 src/views/demo/comp/modal/Modal3.vue create mode 100644 src/views/demo/comp/modal/Modal4.vue create mode 100644 src/views/demo/comp/modal/index.vue create mode 100644 src/views/demo/comp/qrcode/index.vue create mode 100644 src/views/demo/comp/scroll/Action.vue create mode 100644 src/views/demo/comp/scroll/VirtualScroll.vue create mode 100644 src/views/demo/comp/scroll/index.vue create mode 100644 src/views/demo/comp/strength-meter/index.vue create mode 100644 src/views/demo/comp/time/index.vue create mode 100644 src/views/demo/comp/transition/index.vue create mode 100644 src/views/demo/comp/upload/index.vue create mode 100644 src/views/demo/comp/verify/Rotate.vue create mode 100644 src/views/demo/comp/verify/index.vue create mode 100644 src/views/demo/editor/json/index.vue create mode 100644 src/views/demo/editor/markdown/Editor.vue create mode 100644 src/views/demo/editor/markdown/index.vue create mode 100644 src/views/demo/editor/tinymce/Editor.vue create mode 100644 src/views/demo/editor/tinymce/index.vue create mode 100644 src/views/demo/feat/breadcrumb/ChildrenList.vue create mode 100644 src/views/demo/feat/breadcrumb/ChildrenListDetail.vue create mode 100644 src/views/demo/feat/breadcrumb/FlatList.vue create mode 100644 src/views/demo/feat/breadcrumb/FlatListDetail.vue create mode 100644 src/views/demo/feat/click-out-side/index.vue create mode 100644 src/views/demo/feat/context-menu/index.vue create mode 100644 src/views/demo/feat/copy/index.vue create mode 100644 src/views/demo/feat/download/imgBase64.ts create mode 100644 src/views/demo/feat/download/index.vue create mode 100644 src/views/demo/feat/full-screen/index.vue create mode 100644 src/views/demo/feat/icon/index.vue create mode 100644 src/views/demo/feat/img-preview/index.vue create mode 100644 src/views/demo/feat/menu-params/index.vue create mode 100644 src/views/demo/feat/msg/index.vue create mode 100644 src/views/demo/feat/print/index.vue create mode 100644 src/views/demo/feat/ripple/index.vue create mode 100644 src/views/demo/feat/session-timeout/index.vue create mode 100644 src/views/demo/feat/tab-params/index.vue create mode 100644 src/views/demo/feat/tabs/TabDetail.vue create mode 100644 src/views/demo/feat/tabs/index.vue create mode 100644 src/views/demo/feat/watermark/index.vue create mode 100644 src/views/demo/feat/ws/index.vue create mode 100644 src/views/demo/form/AdvancedForm.vue create mode 100644 src/views/demo/form/AppendForm.vue create mode 100644 src/views/demo/form/CustomerForm.vue create mode 100644 src/views/demo/form/DynamicForm.vue create mode 100644 src/views/demo/form/RefForm.vue create mode 100644 src/views/demo/form/RuleForm.vue create mode 100644 src/views/demo/form/UseForm.vue create mode 100644 src/views/demo/form/index.vue create mode 100644 src/views/demo/jeecg/AsyncTreeTable.vue create mode 100644 src/views/demo/jeecg/ImgDragSort.vue create mode 100644 src/views/demo/jeecg/ImgTurnPage.vue create mode 100644 src/views/demo/jeecg/InnerExpandTable.vue create mode 100644 src/views/demo/jeecg/JCodeEditDemo.vue create mode 100644 src/views/demo/jeecg/JEditorDemo.vue create mode 100644 src/views/demo/jeecg/JUploadDemo.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/JVxeDemo1.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/JVxeDemo2.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/JVxeDemo3.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/JVxeDemo4.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/JVxeDemo5.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/func-demo/JSBCDemo.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/func-demo/PopupSubTable.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/func-demo/SocketReload.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/index.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/layout-demo/ErpTemplate.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template1.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template2.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template3.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template4.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template5.vue create mode 100644 src/views/demo/jeecg/JVxeTableDemo/layout-demo/index.vue create mode 100644 src/views/demo/jeecg/JeecgComponents.vue create mode 100644 src/views/demo/jeecg/JeecgPdfView.vue create mode 100644 src/views/demo/jeecg/Native/less/TableExpand.less create mode 100644 src/views/demo/jeecg/Native/one/OneNativeList.vue create mode 100644 src/views/demo/jeecg/Native/one/components/OneNativeForm.vue create mode 100644 src/views/demo/jeecg/Native/one/components/OneNativeModal.vue create mode 100644 src/views/demo/jeecg/PrintDemo.vue create mode 100644 src/views/demo/jeecg/TableTotal.vue create mode 100644 src/views/demo/jeecg/erplist/JeecgOrderCustomerList.vue create mode 100644 src/views/demo/jeecg/erplist/JeecgOrderTicketList.vue create mode 100644 src/views/demo/jeecg/erplist/components/JeecgOrderCustomerModal.vue create mode 100644 src/views/demo/jeecg/erplist/components/JeecgOrderModal.vue create mode 100644 src/views/demo/jeecg/erplist/components/JeecgOrderTicketModal.vue create mode 100644 src/views/demo/jeecg/erplist/erplist.api.ts create mode 100644 src/views/demo/jeecg/erplist/erplist.data.ts create mode 100644 src/views/demo/jeecg/erplist/index.vue create mode 100644 src/views/demo/jeecg/index.vue create mode 100644 src/views/demo/jeecg/jeecgComponents.data.ts create mode 100644 src/views/demo/jeecg/model/JeecgOrderModal.vue create mode 100644 src/views/demo/level/Menu111.vue create mode 100644 src/views/demo/level/Menu12.vue create mode 100644 src/views/demo/level/Menu2.vue create mode 100644 src/views/demo/main-out/index.vue create mode 100644 src/views/demo/page/account/center/Application.vue create mode 100644 src/views/demo/page/account/center/Article.vue create mode 100644 src/views/demo/page/account/center/Project.vue create mode 100644 src/views/demo/page/account/center/data.tsx create mode 100644 src/views/demo/page/account/center/index.vue create mode 100644 src/views/demo/page/account/setting/AccountBind.vue create mode 100644 src/views/demo/page/account/setting/BaseSetting.vue create mode 100644 src/views/demo/page/account/setting/MsgNotify.vue create mode 100644 src/views/demo/page/account/setting/SecureSetting.vue create mode 100644 src/views/demo/page/account/setting/data.ts create mode 100644 src/views/demo/page/account/setting/index.vue create mode 100644 src/views/demo/page/desc/basic/data.tsx create mode 100644 src/views/demo/page/desc/basic/index.vue create mode 100644 src/views/demo/page/desc/high/data.tsx create mode 100644 src/views/demo/page/desc/high/index.vue create mode 100644 src/views/demo/page/form/basic/data.ts create mode 100644 src/views/demo/page/form/basic/index.vue create mode 100644 src/views/demo/page/form/high/PersonTable.vue create mode 100644 src/views/demo/page/form/high/data.ts create mode 100644 src/views/demo/page/form/high/index.vue create mode 100644 src/views/demo/page/form/step/Step1.vue create mode 100644 src/views/demo/page/form/step/Step2.vue create mode 100644 src/views/demo/page/form/step/Step3.vue create mode 100644 src/views/demo/page/form/step/data.tsx create mode 100644 src/views/demo/page/form/step/index.vue create mode 100644 src/views/demo/page/list/basic/data.tsx create mode 100644 src/views/demo/page/list/basic/index.vue create mode 100644 src/views/demo/page/list/card/data.tsx create mode 100644 src/views/demo/page/list/card/index.vue create mode 100644 src/views/demo/page/list/search/data.tsx create mode 100644 src/views/demo/page/list/search/index.vue create mode 100644 src/views/demo/page/result/fail/index.vue create mode 100644 src/views/demo/page/result/success/index.vue create mode 100644 src/views/demo/permission/CurrentPermissionMode.vue create mode 100644 src/views/demo/permission/back/Btn.vue create mode 100644 src/views/demo/permission/back/index.vue create mode 100644 src/views/demo/permission/front/AuthPageA.vue create mode 100644 src/views/demo/permission/front/AuthPageB.vue create mode 100644 src/views/demo/permission/front/Btn.vue create mode 100644 src/views/demo/permission/front/index.vue create mode 100644 src/views/demo/setup/index.vue create mode 100644 src/views/demo/system/account/AccountDetail.vue create mode 100644 src/views/demo/system/account/AccountModal.vue create mode 100644 src/views/demo/system/account/DeptTree.vue create mode 100644 src/views/demo/system/account/account.data.ts create mode 100644 src/views/demo/system/account/index.vue create mode 100644 src/views/demo/system/dept/DeptModal.vue create mode 100644 src/views/demo/system/dept/dept.data.ts create mode 100644 src/views/demo/system/dept/index.vue create mode 100644 src/views/demo/system/menu/MenuDrawer.vue create mode 100644 src/views/demo/system/menu/index.vue create mode 100644 src/views/demo/system/menu/menu.data.ts create mode 100644 src/views/demo/system/password/index.vue create mode 100644 src/views/demo/system/password/pwd.data.ts create mode 100644 src/views/demo/system/role/RoleDrawer.vue create mode 100644 src/views/demo/system/role/index.vue create mode 100644 src/views/demo/system/role/role.data.ts create mode 100644 src/views/demo/system/test/TestDrawer.vue create mode 100644 src/views/demo/system/test/index.vue create mode 100644 src/views/demo/system/test/test.data.ts create mode 100644 src/views/demo/table/AuthColumn.vue create mode 100644 src/views/demo/table/Basic.vue create mode 100644 src/views/demo/table/CustomerCell.vue create mode 100644 src/views/demo/table/EditCellTable.vue create mode 100644 src/views/demo/table/EditRowTable.vue create mode 100644 src/views/demo/table/ExpandTable.vue create mode 100644 src/views/demo/table/FetchTable.vue create mode 100644 src/views/demo/table/FixedColumn.vue create mode 100644 src/views/demo/table/FixedHeight.vue create mode 100644 src/views/demo/table/FooterTable.vue create mode 100644 src/views/demo/table/FormTable.vue create mode 100644 src/views/demo/table/MergeHeader.vue create mode 100644 src/views/demo/table/MultipleHeader.vue create mode 100644 src/views/demo/table/NestedTable.vue create mode 100644 src/views/demo/table/RefTable.vue create mode 100644 src/views/demo/table/TreeTable.vue create mode 100644 src/views/demo/table/UseTable.vue create mode 100644 src/views/demo/table/tableData.tsx create mode 100644 src/views/demo/tree/ActionTree.vue create mode 100644 src/views/demo/tree/EditTree.vue create mode 100644 src/views/demo/tree/data.ts create mode 100644 src/views/demo/tree/index.vue create mode 100644 src/views/demo/vextable/OneToOneModal.vue create mode 100644 src/views/demo/vextable/VexTableModal.vue create mode 100644 src/views/demo/vextable/api.ts create mode 100644 src/views/demo/vextable/data.ts create mode 100644 src/views/demo/vextable/drawer.vue create mode 100644 src/views/demo/vextable/form/JeecgOrderCustomerForm.vue create mode 100644 src/views/demo/vextable/form/JeecgOrderMainForm.vue create mode 100644 src/views/demo/vextable/index.vue create mode 100644 src/views/demo/vextable/index2.vue create mode 100644 src/views/demo/vextable/jvxetable/JVxeTableModal.vue create mode 100644 src/views/demo/vextable/jvxetable/jvxetable.api.ts create mode 100644 src/views/demo/vextable/jvxetable/jvxetable.data.ts create mode 100644 src/views/demo/vextable/modal.vue create mode 100644 src/views/monitor/datalog/DataLogCompareModal.vue create mode 100644 src/views/monitor/datalog/DataLogModal.vue create mode 100644 src/views/monitor/datalog/datalog.api.ts create mode 100644 src/views/monitor/datalog/datalog.data.ts create mode 100644 src/views/monitor/datalog/index.vue create mode 100644 src/views/monitor/datasource/DataSourceModal.vue create mode 100644 src/views/monitor/datasource/datasource.api.ts create mode 100644 src/views/monitor/datasource/datasource.data.ts create mode 100644 src/views/monitor/datasource/index.vue create mode 100644 src/views/monitor/disk/DiskInfo.vue create mode 100644 src/views/monitor/disk/disk.api.ts create mode 100644 src/views/monitor/disk/gauge.vue create mode 100644 src/views/monitor/log/index.vue create mode 100644 src/views/monitor/log/log.api.ts create mode 100644 src/views/monitor/log/log.data.ts create mode 100644 src/views/monitor/mynews/DetailModal.vue create mode 100644 src/views/monitor/mynews/DynamicNotice.vue create mode 100644 src/views/monitor/mynews/index.vue create mode 100644 src/views/monitor/mynews/mynews.api.ts create mode 100644 src/views/monitor/mynews/mynews.data.ts create mode 100644 src/views/monitor/quartz/QuartzModal.vue create mode 100644 src/views/monitor/quartz/index.vue create mode 100644 src/views/monitor/quartz/quartz.api.ts create mode 100644 src/views/monitor/quartz/quartz.data.ts create mode 100644 src/views/monitor/redis/index.vue create mode 100644 src/views/monitor/redis/redis.api.ts create mode 100644 src/views/monitor/redis/redis.data.ts create mode 100644 src/views/monitor/route/RouteModal.vue create mode 100644 src/views/monitor/route/index.vue create mode 100644 src/views/monitor/route/route.api.ts create mode 100644 src/views/monitor/route/route.data.ts create mode 100644 src/views/monitor/server/index.vue create mode 100644 src/views/monitor/server/server.api.ts create mode 100644 src/views/monitor/server/server.data.ts create mode 100644 src/views/monitor/trace/index.vue create mode 100644 src/views/monitor/trace/trace.api.ts create mode 100644 src/views/monitor/trace/trace.data.ts create mode 100644 src/views/report/chartdemo/chartdemo.data.ts create mode 100644 src/views/report/chartdemo/index.vue create mode 100644 src/views/report/statisticst/index.vue create mode 100644 src/views/sys/about/index.vue create mode 100644 src/views/sys/error-log/DetailModal.vue create mode 100644 src/views/sys/error-log/data.tsx create mode 100644 src/views/sys/error-log/index.vue create mode 100644 src/views/sys/exception/Exception.vue create mode 100644 src/views/sys/exception/NetworkErrorException.vue create mode 100644 src/views/sys/exception/NotAccessException.vue create mode 100644 src/views/sys/exception/NotDataErrorException.vue create mode 100644 src/views/sys/exception/ServerErrorException.vue create mode 100644 src/views/sys/exception/index.ts create mode 100644 src/views/sys/forget-password/step1.vue create mode 100644 src/views/sys/forget-password/step2.vue create mode 100644 src/views/sys/forget-password/step3.vue create mode 100644 src/views/sys/iframe/FrameBlank.vue create mode 100644 src/views/sys/iframe/index.vue create mode 100644 src/views/sys/lock/LockPage.vue create mode 100644 src/views/sys/lock/index.vue create mode 100644 src/views/sys/lock/useNow.ts create mode 100644 src/views/sys/login/ForgetPasswordForm.vue create mode 100644 src/views/sys/login/Login.vue create mode 100644 src/views/sys/login/LoginForm.vue create mode 100644 src/views/sys/login/LoginFormTitle.vue create mode 100644 src/views/sys/login/LoginSelect.vue create mode 100644 src/views/sys/login/MobileForm.vue create mode 100644 src/views/sys/login/OAuth2Login.vue create mode 100644 src/views/sys/login/QrCodeForm.vue create mode 100644 src/views/sys/login/RegisterForm.vue create mode 100644 src/views/sys/login/SessionTimeoutLogin.vue create mode 100644 src/views/sys/login/ThirdModal.vue create mode 100644 src/views/sys/login/TokenLoginPage.vue create mode 100644 src/views/sys/login/useLogin.ts create mode 100644 src/views/sys/redirect/index.vue create mode 100644 src/views/system/address/address.api.ts create mode 100644 src/views/system/address/address.data.ts create mode 100644 src/views/system/address/components/DepartLeftTree.vue create mode 100644 src/views/system/address/index.less create mode 100644 src/views/system/address/index.vue create mode 100644 src/views/system/category/category.api.ts create mode 100644 src/views/system/category/category.data.ts create mode 100644 src/views/system/category/components/CategoryModal.vue create mode 100644 src/views/system/category/index.vue create mode 100644 src/views/system/checkRule/CheckRuleModal.vue create mode 100644 src/views/system/checkRule/CheckRuleTestModal.vue create mode 100644 src/views/system/checkRule/check.rule.api.ts create mode 100644 src/views/system/checkRule/check.rule.data.ts create mode 100644 src/views/system/checkRule/index.vue create mode 100644 src/views/system/depart/components/DepartDataRuleDrawer.vue create mode 100644 src/views/system/depart/components/DepartFormModal.vue create mode 100644 src/views/system/depart/components/DepartFormTab.vue create mode 100644 src/views/system/depart/components/DepartLeftTree.vue create mode 100644 src/views/system/depart/components/DepartRuleTab.vue create mode 100644 src/views/system/depart/depart.api.ts create mode 100644 src/views/system/depart/depart.data.ts create mode 100644 src/views/system/depart/index.less create mode 100644 src/views/system/depart/index.vue create mode 100644 src/views/system/departUser/components/DepartBaseInfoTab.vue create mode 100644 src/views/system/departUser/components/DepartRoleAuthDrawer.vue create mode 100644 src/views/system/departUser/components/DepartRoleDataRuleDrawer.vue create mode 100644 src/views/system/departUser/components/DepartRoleInfoTab.vue create mode 100644 src/views/system/departUser/components/DepartRoleModal.vue create mode 100644 src/views/system/departUser/components/DepartRoleUserAuthDrawer.vue create mode 100644 src/views/system/departUser/components/DepartTree.vue create mode 100644 src/views/system/departUser/components/DepartUserInfoTab.vue create mode 100644 src/views/system/departUser/depart.user.api.ts create mode 100644 src/views/system/departUser/depart.user.data.ts create mode 100644 src/views/system/departUser/index.less create mode 100644 src/views/system/departUser/index.vue create mode 100644 src/views/system/dict/components/DictItemList.vue create mode 100644 src/views/system/dict/components/DictItemModal.vue create mode 100644 src/views/system/dict/components/DictModal.vue create mode 100644 src/views/system/dict/components/DictRecycleBinModal.vue create mode 100644 src/views/system/dict/dict.api.ts create mode 100644 src/views/system/dict/dict.data.ts create mode 100644 src/views/system/dict/index.vue create mode 100644 src/views/system/examples/demo/DemoModal.vue create mode 100644 src/views/system/examples/demo/demo.api.ts create mode 100644 src/views/system/examples/demo/demo.data.ts create mode 100644 src/views/system/examples/demo/index.vue create mode 100644 src/views/system/fillRule/FillRuleModal.vue create mode 100644 src/views/system/fillRule/fill.rule.api.ts create mode 100644 src/views/system/fillRule/fill.rule.data.ts create mode 100644 src/views/system/fillRule/index.vue create mode 100644 src/views/system/loginmini/MiniCodelogin.vue create mode 100644 src/views/system/loginmini/MiniForgotpad.vue create mode 100644 src/views/system/loginmini/MiniLogin.vue create mode 100644 src/views/system/loginmini/MiniRegister.vue create mode 100644 src/views/system/loginmini/OAuth2Login.vue create mode 100644 src/views/system/menu/DataRuleList.vue create mode 100644 src/views/system/menu/DataRuleModal.vue create mode 100644 src/views/system/menu/MenuDrawer.vue create mode 100644 src/views/system/menu/index.vue create mode 100644 src/views/system/menu/menu.api.ts create mode 100644 src/views/system/menu/menu.data.ts create mode 100644 src/views/system/message/components/SysMessageList.vue create mode 100644 src/views/system/message/components/SysMessageModal.vue create mode 100644 src/views/system/message/components/useSysMessage.ts create mode 100644 src/views/system/message/manage/ManageDrawer.vue create mode 100644 src/views/system/message/manage/index.less create mode 100644 src/views/system/message/manage/index.vue create mode 100644 src/views/system/message/manage/manage.api.ts create mode 100644 src/views/system/message/manage/manage.data.ts create mode 100644 src/views/system/message/template/TemplateModal.vue create mode 100644 src/views/system/message/template/TemplateTestModal.vue create mode 100644 src/views/system/message/template/index.less create mode 100644 src/views/system/message/template/index.vue create mode 100644 src/views/system/message/template/template.api.ts create mode 100644 src/views/system/message/template/template.data.ts create mode 100644 src/views/system/notice/DetailModal.vue create mode 100644 src/views/system/notice/NoticeModal.vue create mode 100644 src/views/system/notice/index.vue create mode 100644 src/views/system/notice/notice.api.ts create mode 100644 src/views/system/notice/notice.data.ts create mode 100644 src/views/system/onlineuser/OnlineUser.api.ts create mode 100644 src/views/system/onlineuser/OnlineUser.data.ts create mode 100644 src/views/system/onlineuser/OnlineUserList.vue create mode 100644 src/views/system/ossfile/index.vue create mode 100644 src/views/system/ossfile/ossfile.api.ts create mode 100644 src/views/system/ossfile/ossfile.data.ts create mode 100644 src/views/system/position/PositionModal.vue create mode 100644 src/views/system/position/index.vue create mode 100644 src/views/system/position/position.api.ts create mode 100644 src/views/system/position/position.data.ts create mode 100644 src/views/system/role/TenantRoleList.vue create mode 100644 src/views/system/role/components/RoleDataRuleDrawer.vue create mode 100644 src/views/system/role/components/RoleDesc.vue create mode 100644 src/views/system/role/components/RoleDrawer.vue create mode 100644 src/views/system/role/components/RoleIndexModal.vue create mode 100644 src/views/system/role/components/RolePermissionDrawer.vue create mode 100644 src/views/system/role/components/RoleUserTable.vue create mode 100644 src/views/system/role/components/UseSelectModal.vue create mode 100644 src/views/system/role/index.vue create mode 100644 src/views/system/role/role.api.ts create mode 100644 src/views/system/role/role.data.ts create mode 100644 src/views/system/tenant/TenantInviteUserModal.vue create mode 100644 src/views/system/tenant/TenantModal.vue create mode 100644 src/views/system/tenant/TenantPackMenuModal.vue create mode 100644 src/views/system/tenant/TenantPackModal.vue create mode 100644 src/views/system/tenant/TenantPackUserModal.vue create mode 100644 src/views/system/tenant/TenantRecycleBinModal.vue create mode 100644 src/views/system/tenant/TenantUserModal.vue create mode 100644 src/views/system/tenant/index.vue create mode 100644 src/views/system/tenant/tenant.api.ts create mode 100644 src/views/system/tenant/tenant.data.ts create mode 100644 src/views/system/user/PasswordModal.vue create mode 100644 src/views/system/user/TenantUserList.vue create mode 100644 src/views/system/user/UserAgentModal.vue create mode 100644 src/views/system/user/UserDrawer.vue create mode 100644 src/views/system/user/UserQuitAgentModal.vue create mode 100644 src/views/system/user/UserQuitModal.vue create mode 100644 src/views/system/user/UserRecycleBinModal.vue create mode 100644 src/views/system/user/index.vue create mode 100644 src/views/system/user/user.api.ts create mode 100644 src/views/system/user/user.data.ts create mode 100644 src/views/system/user/userDetails.vue create mode 100644 src/views/system/usersetting/AccountSetting.vue create mode 100644 src/views/system/usersetting/BaseSetting.vue create mode 100644 src/views/system/usersetting/TenantSetting.vue create mode 100644 src/views/system/usersetting/UserSetting.api.ts create mode 100644 src/views/system/usersetting/UserSetting.data.ts create mode 100644 src/views/system/usersetting/UserSetting.vue create mode 100644 src/views/system/usersetting/WeChatDingSetting.vue create mode 100644 src/views/system/usersetting/commponents/UserAccountModal.vue create mode 100644 src/views/system/usersetting/commponents/UserEmailModal.vue create mode 100644 src/views/system/usersetting/commponents/UserPasswordModal.vue create mode 100644 src/views/system/usersetting/commponents/UserPhoneModal.vue create mode 100644 stylelint.config.js create mode 100644 tests/__mocks__/fileMock.ts create mode 100644 tests/__mocks__/styleMock.ts create mode 100644 tests/__mocks__/workerMock.ts create mode 100644 tests/server/README.md create mode 100644 tests/server/controller/FileController.ts create mode 100644 tests/server/controller/UserController.ts create mode 100644 tests/server/ecosystem.config.js create mode 100644 tests/server/index.ts create mode 100644 tests/server/nodemon.json create mode 100644 tests/server/package.json create mode 100644 tests/server/routes.ts create mode 100644 tests/server/service/FileService.ts create mode 100644 tests/server/service/UserService.ts create mode 100644 tests/server/tsconfig.json create mode 100644 tests/server/utils.ts create mode 100644 tests/server/yarn.lock create mode 100644 tests/test.spec.ts create mode 100644 tsconfig.json create mode 100644 types/axios.d.ts create mode 100644 types/config.d.ts create mode 100644 types/global.d.ts create mode 100644 types/index.d.ts create mode 100644 types/module.d.ts create mode 100644 types/store.d.ts create mode 100644 types/utils.d.ts create mode 100644 types/vue-router.d.ts create mode 100644 unnamed.patch create mode 100644 vite.config.ts create mode 100644 windi.config.ts create mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..dccf841 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +root = true + +[*] +charset=utf-8 +end_of_line=lf +insert_final_newline=true +indent_style=space +indent_size=2 +max_line_length = 100 + +[*.{yml,yaml,json}] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab diff --git a/.env b/.env new file mode 100644 index 0000000..5ad279d --- /dev/null +++ b/.env @@ -0,0 +1,22 @@ +# port +VITE_PORT = 3100 + +# 网站标题 +VITE_GLOB_APP_TITLE = JeecgBoot 企业级低代码平台 + +# 简称,用于配置文件名字 不要出现空格、数字开头等特殊字符 +VITE_GLOB_APP_SHORT_NAME = JeecgBootAdmin + +# 单点登录服务端地址 +VITE_GLOB_APP_CAS_BASE_URL=http://cas.test.com:8443/cas + +# 是否开启单点登录 +VITE_GLOB_APP_OPEN_SSO = false + +# 开启微前端模式 +VITE_GLOB_APP_OPEN_QIANKUN=true + +# 文件预览地址 +VITE_GLOB_ONLINE_VIEW_URL=http://fileview.jeecg.com/onlinePreview + + diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..ac86332 --- /dev/null +++ b/.env.development @@ -0,0 +1,23 @@ +# 是否打开mock +VITE_USE_MOCK = true + +# 发布路径 +VITE_PUBLIC_PATH = / + +# 跨域代理,您可以配置多个 ,请注意,没有换行符 +VITE_PROXY = [["/jeecgboot","http://192.168.31.146:9999"],["/upload","http://localhost:3300/upload"],["/charg-pile-system","http://192.168.31.146:9999"]] + +# 控制台不输出 +VITE_DROP_CONSOLE = false + +#后台接口父地址(必填) +VITE_GLOB_API_URL=/jeecgboot + +#后台接口全路径地址(必填) +VITE_GLOB_DOMAIN_URL=http://192.168.31.146:9999 + +# 接口前缀 +VITE_GLOB_API_URL_PREFIX= + +#微前端qiankun应用,命名必须以VITE_APP_SUB_开头,jeecg-app-1为子应用的项目名称,也是子应用的路由父路径 +VITE_APP_SUB_jeecg-app-1 = '//localhost:8092' diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..fc267f8 --- /dev/null +++ b/.env.production @@ -0,0 +1,33 @@ +# 是否启用mock +VITE_USE_MOCK = true + +# 发布路径 +VITE_PUBLIC_PATH = / + +# 控制台不输出 +VITE_DROP_CONSOLE = true + +# 是否启用gzip或brotli压缩 +# 选项值: gzip | brotli | none +# 如果需要多个可以使用“,”分隔 +VITE_BUILD_COMPRESS = 'gzip' + +# 使用压缩时是否删除原始文件,默认为false +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false + +#后台接口父地址(必填) +VITE_GLOB_API_URL=/jeecgboot + +#后台接口全路径地址(必填) +VITE_GLOB_DOMAIN_URL=http://jeecg-boot-system:8080/jeecg-boot +# 接口父路径前缀 +VITE_GLOB_API_URL_PREFIX= + +# 是否启用图像压缩 +VITE_USE_IMAGEMIN= true + +# 使用pwa +VITE_USE_PWA = false + +# 是否兼容旧浏览器 +VITE_LEGACY = false diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..348631b --- /dev/null +++ b/.eslintignore @@ -0,0 +1,15 @@ + +*.sh +node_modules +*.md +*.woff +*.ttf +.vscode +.idea +dist +/public +/docs +.husky +.local +/bin +Dockerfile diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..5fcac9e --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,78 @@ +// @ts-check +const { defineConfig } = require('eslint-define-config'); +module.exports = defineConfig({ + root: true, + env: { + browser: true, + node: true, + es6: true, + }, + parser: 'vue-eslint-parser', + parserOptions: { + parser: '@typescript-eslint/parser', + ecmaVersion: 2020, + sourceType: 'module', + jsxPragma: 'React', + ecmaFeatures: { + jsx: true, + }, + }, + extends: [ + 'plugin:vue/vue3-recommended', + 'plugin:@typescript-eslint/recommended', + 'prettier', + 'plugin:prettier/recommended', + 'plugin:jest/recommended', + ], + rules: { + 'vue/script-setup-uses-vars': 'error', + '@typescript-eslint/ban-ts-ignore': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-function': 'off', + 'vue/custom-event-name-casing': 'off', + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + }, + ], + 'no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + }, + ], + 'space-before-function-paren': 'off', + + 'vue/attributes-order': 'off', + 'vue/one-component-per-file': 'off', + 'vue/html-closing-bracket-newline': 'off', + 'vue/max-attributes-per-line': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/singleline-html-element-content-newline': 'off', + 'vue/attribute-hyphenation': 'off', + 'vue/require-default-prop': 'off', + 'vue/html-self-closing': [ + 'error', + { + html: { + void: 'always', + normal: 'never', + component: 'always', + }, + svg: 'always', + math: 'always', + }, + ], + }, +}); diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a0b9717 --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +node_modules +.DS_Store +.github +dist +.npmrc +.cache + +tests/server/static +tests/server/static/upload + +.local +# local env files +.env.local +.env.*.local +.eslintcache + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +# .vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +/os_del.cmd +/.vscode/ +/.history/ +/svn clear.bat diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 0000000..2191895 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,6 @@ +ports: + - port: 3344 + onOpen: open-preview +tasks: + - init: yarn + command: yarn dev diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..f7e39e6 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,9 @@ +/dist/* +.local +.output.js +/node_modules/** + +**/*.svg +**/*.sh + +/public/* diff --git a/.stylelintignore b/.stylelintignore new file mode 100644 index 0000000..0517076 --- /dev/null +++ b/.stylelintignore @@ -0,0 +1,3 @@ +/dist/* +/public/* +public/* diff --git a/.yarnclean b/.yarnclean new file mode 100644 index 0000000..3e556ef --- /dev/null +++ b/.yarnclean @@ -0,0 +1,48 @@ +# test directories +__tests__ +test +tests +powered-test + +# asset directories +docs +doc +website +images +assets + +# examples +example +examples + +# code coverage directories +coverage +.nyc_output + +# build scripts +Makefile +Gulpfile.js +Gruntfile.js + +# configs +appveyor.yml +circle.yml +codeship-services.yml +codeship-steps.yml +wercker.yml +.tern-project +.gitattributes +.editorconfig +.*ignore +.eslintrc +.jshintrc +.flowconfig +.documentup.json +.yarn-metadata.json +.travis.yml + +# misc +*.md + +!istanbul-reports/lib/html/assets +!istanbul-api/node_modules/istanbul-reports/lib/html/assets diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..bafce2b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,30 @@ +FROM nginx +MAINTAINER jeecgos@163.com +VOLUME /tmp +ENV LANG en_US.UTF-8 +RUN echo "server { \ + listen 80; \ + location /jeecgboot/ { \ + proxy_pass http://jeecg-boot-system:8080/jeecg-boot/; \ + proxy_redirect off; \ + proxy_set_header Host jeecg-boot-system; \ + proxy_set_header X-Real-IP \$remote_addr; \ + proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; \ + } \ + #解决Router(mode: 'history')模式下,刷新路由地址不能找到页面的问题 \ + location / { \ + root /var/www/html/; \ + index index.html index.htm; \ + if (!-e \$request_filename) { \ + rewrite ^(.*)\$ /index.html?s=\$1 last; \ + break; \ + } \ + } \ + access_log /var/log/nginx/access.log ; \ + } " > /etc/nginx/conf.d/default.conf \ + && mkdir -p /var/www \ + && mkdir -p /var/www/html + +ADD dist/ /var/www/html/ +EXPOSE 80 +EXPOSE 443 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..10483c9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,32 @@ +MIT License + +Copyright (c) 2020-present, Jeecg + +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. + + + +开源协议补充 + JeecgBoot 是由 北京敲敲云科技有限公司 发行的软件。 总部位于北京,地址:中国·北京·朝阳区科荟前街1号院奥林佳泰大厦。邮箱:jeecgos@163.com + 本软件受适用的国家软件著作权法(包括国际条约)和双重保护许可。 + + 1.允许基于本平台软件开展业务系统开发。 + 2.不得基于该平台软件的基础,修改包装成一个与JeecgBoot平台软件功能类似的产品进行发布、销售,或与JeecgBoot参与同类软件产品市场的竞争。 + 违反此条款属于侵权行为,须赔偿侵权经济损失,同时立即停止著作权侵权行为。 + 解释权归:http://www.jeecg.com \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0f2ac2f --- /dev/null +++ b/README.md @@ -0,0 +1,441 @@ +JEECG BOOT 低代码开发平台(Vue3前端) +=============== +当前最新版本: 3.5.1(发布时间:2023-04-20) + +[![AUR](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE) +[![](https://img.shields.io/badge/Author-北京敲敲云科技-orange.svg)](http://www.jeecg.com) +[![](https://img.shields.io/badge/Blog-官方博客-blue.svg)](https://jeecg.blog.csdn.net) +[![](https://img.shields.io/badge/version-3.5.1-brightgreen.svg)](https://github.com/zhangdaiscott/jeecg-boot) +[![GitHub stars](https://img.shields.io/github/stars/zhangdaiscott/jeecg-boot.svg?style=social&label=Stars)](https://github.com/zhangdaiscott/jeecg-boot) +[![GitHub forks](https://img.shields.io/github/forks/zhangdaiscott/jeecg-boot.svg?style=social&label=Fork)](https://github.com/zhangdaiscott/jeecg-boot) + + + +## 简介 +JeecgBoot-Vue3采用 Vue3.0、Vite、 Ant-Design-Vue3、TypeScript 等新技术方案,包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能。 +是采用Vben实现的 JeecgBoot低代码平台的全新vue3版本。 + +> 强大的代码生成器让前后端代码一键生成! JeecgBoot引领低代码开发模式(OnlineCoding-> 代码生成-> 手工MERGE), 帮助解决Java项目70%的重复工作,让开发更多关注业务。既能快速提高效率,节省成本,同时又不失灵活性 + +## 技术支持 + +关闭Gitee的issue通道,使用中遇到问题或者BUG可以在 [Github上提Issues](https://github.com/jeecgboot/jeecgboot-vue3/issues/new) + +官方支持: http://jeecg.com/doc/help + + +## 源码下载 + +- 后台源码 :https://github.com/jeecgboot/jeecg-boot +- 前端源码 :https://github.com/jeecgboot/jeecgboot-vue3 + +##### 项目说明 + +| 项目名 | 说明 | +|--------------------|------------------------| +| `jeecgboot-vue3` | Vue3版前端代码 | +| `jeecg-boot` | SpringBoot后台项目(支持微服务) | + + +## 技术文档 + +- 官方文档:[http://help.jeecg.com](http://help.jeecg.com) +- 官方网站: [http://www.jeecg.com](http://www.jeecg.com) +- 在线演示:[低代码演示](http://boot3.jeecg.com) | [敲敲云零代码](https://www.qiaoqiaoyun.com) +- 快速入门:[常见问题](http://help.jeecg.com/qa.html) | [入门视频](https://www.bilibili.com/video/BV1V34y187Y9 "入门视频") | [ 代码生成](http://help.jeecg.com/vue3/codegen/online.html) +- QQ交流群:⑦791696430、683903138 + +## 安装与使用 + + + > 环境要求: 版本要求Node 14.18+ / 16+ 版本以上,不再支持 Node 12 / 13 / 15。 + > 建议使用pnpm,如果使用yarn,请用Yarn1.x版本,否则依赖可能安装不上。 + + +- Get the project code + +```bash +git clone https://github.com/jeecgboot/jeecgboot-vue3.git +``` + +- Installation dependencies + +```bash +cd jeecgboot-vue3 + +pnpm install +``` + +- 配置接口地址 `.env.development` + +```bash +VITE_PROXY = [["/jeecgboot","http://localhost:8080/jeecg-boot"],["/upload","http://localhost:3300/upload"]] +VITE_GLOB_DOMAIN_URL=http://localhost:8080/jeecg-boot +``` + +> 说明:把`http://localhost:8080/jeecg-boot` 换成自己地址,其他不用改。 + + +- run + +```bash +pnpm serve +``` + + +- build + +```bash +pnpm build +``` + + +## Docker镜像启动前端(单体模式) + +- host设置 + +>注意: 需要把`127.0.0.1`替换成真实IP 比如`192.`开头,不然后端不通。 + +```bash +127.0.0.1 jeecg-boot-system +127.0.0.1 jeecg-boot-gateway +``` + + +- 下载项目 + +```bash +git clone https://github.com/jeecgboot/jeecgboot-vue3.git + +cd jeecgboot-vue3 +``` + +- 配置接口域名 `.env.production` + +```bash +VITE_GLOB_API_URL=/jeecgboot +VITE_GLOB_DOMAIN_URL=http://jeecg-boot-system:8080/jeecg-boot +``` +后台单体启动 [见此文档](https://help.jeecg.com/java/setup/docker/up.html) + +- 编译项目 + +```bash +pnpm install + +pnpm build +``` + +- 启动容器 +```bash +docker build -t jeecgboot-vue3 . +docker run --name jeecgboot-vue3-nginx -p 80:80 -d jeecgboot-vue3 +``` + +- 访问前台 + +http://localhost + +## Docker镜像启动前端(微服务模式) +> 这里只写与单体的区别步骤 + +- 区别1. 修改后台域名 +.env.production + +```bash +VITE_GLOB_API_URL=/jeecgboot +VITE_GLOB_DOMAIN_URL=http://jeecg-boot-gateway:9999 +``` + +后台微服务启动 [见此文档](https://help.jeecg.com/java/springcloud/docker.html) + +- 区别2. 修改Dockerfile文件 + +```bash +- 把`http://jeecg-boot-system:8080/jeecg-boot`替换成 `http://jeecg-boot-gateway:9999` +- 把`jeecg-boot-system`替换成 `jeecg-boot-gateway` +``` + +- 其他与单体模式一样 + +```bash +镜像需要重现构建,最好把单体的镜像删掉,重新构建docker镜像。 +``` + + + + + + + +## 入门必备 + +本项目需要一定前端基础知识,请确保掌握 Vue 的基础知识,以便能处理一些常见的问题。 建议在开发前先学一下以下内容,提前了解和学习这些知识,会对项目理解非常有帮助: + +* [JeecgBoot-Vue3文档](http://help.jeecg.com) +* [Vue3 文档](https://cn.vuejs.org/) +* [Vben文档](https://doc.vvbin.cn) +* [Ant-Design-Vue](https://www.antdv.com/docs/vue/introduce-cn/) +* [TypeScript](https://www.typescriptlang.org/) +* [Vue-router](https://router.vuejs.org/zh) +* [Es6](https://es6.ruanyifeng.com/) +* [Vitejs](https://cn.vitejs.dev/guide/) +* [Pinia(vuex替代方案)](https://pinia.esm.dev/introduction.html) +* [Vue-RFCS](https://github.com/vuejs/rfcs) +* [Vue2 迁移到 3](https://v3.vuejs.org/guide/migration/introduction.html) +* [vxetable文档](https://vxetable.cn) +* [~~WindiCss~~](https://windicss.netlify.app/) + + +## 浏览器支持 + +**本地开发**推荐使用`Chrome 最新版`浏览器,**不支持**`Chrome 90`以下版本。 + +**生产环境**支持现代浏览器,不支持 IE。 + +| [![IE](https://raw.githubusercontent.com/alrra/browser-logos/master/src/archive/internet-explorer_9-11/internet-explorer_9-11_48x48.png)](http://godban.github.io/browsers-support-badges/)IE | [![ Edge](https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png)](http://godban.github.io/browsers-support-badges/)Edge | [![Firefox](https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png)](http://godban.github.io/browsers-support-badges/)Firefox | [![Chrome](https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png)](http://godban.github.io/browsers-support-badges/)Chrome | [![Safari](https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png)](http://godban.github.io/browsers-support-badges/)Safari | +| --- | --- | --- | --- | --- | +| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions | + + + +## 功能模块 +> vue3版本已经实现了系统管理、系统监控、报表、各种组件、前端权限、GUI代码生成、Online表单、Online报表等平台功能,完全可以用于生产环境。 + +``` +├─首页 +│ ├─首页(四套首页满足不同场景需求) +│ ├─工作台 +├─系统管理 +│ ├─用户管理 +│ ├─角色管理 +│ ├─菜单管理 +│ ├─权限设置(支持按钮权限、数据权限) +│ ├─表单权限(控制字段禁用、隐藏) +│ ├─部门管理 +│ ├─我的部门(二级管理员) +│ └─字典管理 +│ └─分类字典 +│ └─系统公告 +│ └─职务管理 +│ └─通讯录 +│ └─对象存储 +│ └─多租户管理 +├─系统监控 +│ ├─网关路由配置(gateway) +│ ├─定时任务 +│ ├─数据源管理 +│ ├─系统日志 +│ ├─消息中心(支持短信、邮件、微信推送等等) +│ ├─数据日志(记录数据快照,可对比快照,查看数据变更情况) +│ ├─系统通知 +│ ├─SQL监控 +│ ├─性能监控 +│ │ ├─监控 Redis +│ │ ├─Tomcat +│ │ ├─jvm +│ │ ├─服务器信息 +│ │ ├─请求追踪 +│ │ ├─磁盘监控 +├─消息中心 +│ ├─我的消息 +│ ├─消息管理 +│ ├─模板管理 +├─积木报表设计器 +│─报表示例 +│ ├─曲线图 +│ └─饼状图 +│ └─柱状图 +│ └─折线图 +│ └─面积图 +│ └─雷达图 +│ └─仪表图 +│ └─进度条 +│ └─排名列表 +│ └─等等 +│─大屏模板 +│ ├─作战指挥中心大屏 +│ └─物流服务中心大屏 +├─代码生成器(GUI) +│ ├─代码生成器功能(一键生成前后端代码,生成后无需修改直接用,绝对是后端开发福音) +│ ├─代码生成器模板(提供4套模板,分别支持单表和一对多模型,不同风格选择) +│ ├─代码生成器模板(生成代码,自带excel导入导出) +│ ├─查询过滤器(查询逻辑无需编码,系统根据页面配置自动生成) +│ ├─高级查询器(弹窗自动组合查询条件) +│ ├─Excel导入导出工具集成(支持单表,一对多 导入导出) +│ ├─平台移动自适应支持 +│─常用示例 +│ ├─自定义组件示例 +│ ├─JVxeTable示例(ERP行业复杂排版效果) +│ ├─单表模型例子 +│ └─一对多模型例子 +│ └─打印例子 +│ └─一对多内嵌示例 +│ └─异步树Table +│ └─图片拖拽排序 +│ └─图片翻页 +│ └─图片预览 +│ └─PDF预览 +│─封装通用组件 +│ ├─行编辑表格JVxeTable +│ └─省略显示组件 +│ └─时间控件 +│ └─高级查询 (未实现) +│ └─用户选择组件 +│ └─报表组件封装 +│ └─字典组件 +│ └─下拉多选组件 +│ └─选人组件 +│ └─选部门组件 +│ └─通过部门选人组件 +│ └─封装曲线、柱状图、饼状图、折线图等等报表的组件(经过封装,使用简单) +│ └─在线code编辑器 +│ └─上传文件组件 +│ └─树列表组件 +│ └─表单禁用组件 +│ └─等等 +│─更多页面模板 +│ └─Mock示例(子菜单很多) +│ └─页面&导航(子菜单很多) +│ └─组件&功能(子菜单很多) +├─高级功能 +│ ├─支持微前端 +│ ├─提供CAS单点登录 +│ ├─集成Websocket消息通知机制 +│ ├─支持第三方登录(QQ、钉钉、微信等) +│ ├─系统编码规则 +├─Online在线开发(低代码) +│ ├─Online在线表单 - 功能已开放 +│ ├─Online代码生成器 - 功能已开放 +│ ├─Online在线报表 - 功能已开放 +│ ├─Online在线图表(暂未开源) +│ ├─多数据源管理 +│─流程模块功能 (暂未开源) +│ ├─流程设计器 +│ ├─表单设计器 +│ ├─大屏设计器 +│ ├─门户设计/仪表盘设计器 +│ └─我的任务 +│ └─历史流程 +│ └─历史流程 +│ └─流程实例管理 +│ └─流程监听管理 +│ └─流程表达式 +│ └─我发起的流程 +│ └─我的抄送 +│ └─流程委派、抄送、跳转 +│ └─OA办公组件 +└─其他模块 + └─更多功能开发中。。 + +``` + + +## 系统效果 +系统后台 + +![](https://oscimg.oschina.net/oscnet/up-000530d95df337b43089ac77e562494f454.png) + +![输入图片说明](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/site/vue3_20220310142354.png "在这里输入图片标题") + + +![输入图片说明](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/site/vue3_20220310142409.png "在这里输入图片标题") + +![输入图片说明](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/site/vue3_20220310142401.png "在这里输入图片标题") + +![输入图片说明](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/site/vue3_11.png "在这里输入图片标题") + +Online开发&代码生成 +![](https://oscimg.oschina.net/oscnet/up-e8862f2c3c14eace9090c20a8fb928234a4.png) + +![](https://oscimg.oschina.net/oscnet/up-e3b3a736236bc66f255a9a32ab3f9b7196b.png) + +![](https://oscimg.oschina.net/oscnet/up-221b8cbdea3c17d31a1365023a73d3d439f.png) + +![](https://oscimg.oschina.net/oscnet/up-14092f6f213b26ab145cf70b2dc6dec5635.png) + + + + +系统交互 +![](https://oscimg.oschina.net/oscnet/up-78b151fc888d4319377bf1cc311fe826871.png) + +![](https://oscimg.oschina.net/oscnet/up-16c07e000278329b69b228ae3189814b8e9.png) + + +流程设计 +![](https://oscimg.oschina.net/oscnet/up-981ce174e4fbb48c8a2ce4ccfd7372e2994.png) + +![输入图片说明](https://static.oschina.net/uploads/img/201907/05165142_yyQ7.png "在这里输入图片标题") + +![输入图片说明](https://static.oschina.net/uploads/img/201904/14160917_9Ftz.png "在这里输入图片标题") + +![输入图片说明](https://static.oschina.net/uploads/img/201904/14160633_u59G.png "在这里输入图片标题") + +简版流程设计 + +![](https://oscimg.oschina.net/oscnet/up-1dc0d052149ec675f3e4fad632b82b48add.png) + +![](https://oscimg.oschina.net/oscnet/up-de31bc2f9d9b8332c554b0954cc73d79593.png) + +![](https://oscimg.oschina.net/oscnet/up-7f83b25159663686d67ed080eb16068c3b4.png) + +仪表盘设计器 +![](https://oscimg.oschina.net/oscnet/up-9c9d41288c31398d76b390bdd400f13a582.png) + +![](https://oscimg.oschina.net/oscnet/up-fad98d42b2cf92f92a903c9cff7579f18ec.png) + +报表设计器 +![](https://oscimg.oschina.net/oscnet/up-64648de000851f15f6c7b9573d107ebb5f8.png) + +![](https://oscimg.oschina.net/oscnet/up-fa52b44445db281c51d3f267dce7450d21b.gif) + +![](https://oscimg.oschina.net/oscnet/up-68a19149d640f1646c8ed89ed4375e3326c.png) + +![](https://oscimg.oschina.net/oscnet/up-f7e9cb2e3740f2d19ff63b40ec2dd554f96.png) + +表单设计器 +![](https://oscimg.oschina.net/oscnet/up-5f8cb657615714b02190b355e59f60c5937.png) + +![](https://oscimg.oschina.net/oscnet/up-d9659b2f324e33218476ec98c9b400e6508.png) + +![](https://oscimg.oschina.net/oscnet/up-4868615395272d3206dbb960ade02dbc291.png) + +大屏设计器 +![](https://oscimg.oschina.net/oscnet/up-402a6034124474bfef8dfc5b4b2bac1ce5c.png) + +![](https://oscimg.oschina.net/oscnet/up-6f7ba2e2ebbeea0d203db8d69fd87644c9f.png) + +![](https://oscimg.oschina.net/oscnet/up-ee8d34f318da466b8a6070a6e3111d12ce7.png) + +![](https://oscimg.oschina.net/oscnet/up-6b81781b43086819049c4421206810667c5.png) + + +报表效果 + +![](https://static.oschina.net/uploads/img/201904/14160828_pkFr.png "") + +![](https://static.oschina.net/uploads/img/201904/14160834_Lo23.png "") + +![](https://static.oschina.net/uploads/img/201904/14160842_QK7B.png "") + +![](https://static.oschina.net/uploads/img/201904/14160849_GBm5.png "") + +![](https://static.oschina.net/uploads/img/201904/14160858_6RAM.png "") + +接口文档 + +![](https://oscimg.oschina.net/oscnet/up-e6ea09dbaa01b8458c2e23614077ba9507f.png) + + +手机端 +![](https://oscimg.oschina.net/oscnet/da543c5d0d57baab0cecaa4670c8b68c521.jpg) +![](https://oscimg.oschina.net/oscnet/fda4bd82cab9d682de1c1fbf2060bf14fa6.jpg) + +PAD端 +![](https://oscimg.oschina.net/oscnet/e90fef970a8c33790ab03ffd6c4c7cec225.jpg) +![](https://oscimg.oschina.net/oscnet/d78218803a9e856a0aa82b45efc49849a0c.jpg) +![](https://oscimg.oschina.net/oscnet/59c23b230f52384e588ee16309b44fa20de.jpg) + + + diff --git a/build/config/themeConfig.ts b/build/config/themeConfig.ts new file mode 100644 index 0000000..8dbe118 --- /dev/null +++ b/build/config/themeConfig.ts @@ -0,0 +1,79 @@ +import { generate } from '@ant-design/colors'; + +export const primaryColor = '#1890FF'; + +export const darkMode = 'light'; + +type Fn = (...arg: any) => any; + +type GenerateTheme = 'default' | 'dark'; + +export interface GenerateColorsParams { + mixLighten: Fn; + mixDarken: Fn; + tinycolor: any; + color?: string; +} + +export function generateAntColors(color: string, theme: GenerateTheme = 'default') { + return generate(color, { + theme, + }); +} + +export function getThemeColors(color?: string) { + const tc = color || primaryColor; + const lightColors = generateAntColors(tc); + const primary = lightColors[5]; + const modeColors = generateAntColors(primary, 'dark'); + + return [...lightColors, ...modeColors]; +} + +export function generateColors({ + color = primaryColor, + mixLighten, + mixDarken, + tinycolor, +}: GenerateColorsParams) { + const arr = new Array(19).fill(0); + const lightens = arr.map((_t, i) => { + return mixLighten(color, i / 5); + }); + + const darkens = arr.map((_t, i) => { + return mixDarken(color, i / 5); + }); + + const alphaColors = arr.map((_t, i) => { + return tinycolor(color) + .setAlpha(i / 20) + .toRgbString(); + }); + + const shortAlphaColors = alphaColors.map((item) => item.replace(/\s/g, '').replace(/0\./g, '.')); + + const tinycolorLightens = arr + .map((_t, i) => { + return tinycolor(color) + .lighten(i * 5) + .toHexString(); + }) + .filter((item) => item !== '#ffffff'); + + const tinycolorDarkens = arr + .map((_t, i) => { + return tinycolor(color) + .darken(i * 5) + .toHexString(); + }) + .filter((item) => item !== '#000000'); + return [ + ...lightens, + ...darkens, + ...alphaColors, + ...shortAlphaColors, + ...tinycolorDarkens, + ...tinycolorLightens, + ].filter((item) => !item.includes('-')); +} diff --git a/build/constant.ts b/build/constant.ts new file mode 100644 index 0000000..2c6119c --- /dev/null +++ b/build/constant.ts @@ -0,0 +1,6 @@ +/** + * The name of the configuration file entered in the production environment + */ +export const GLOB_CONFIG_FILE_NAME = '_app.config.js'; + +export const OUTPUT_DIR = 'dist'; diff --git a/build/generate/generateModifyVars.ts b/build/generate/generateModifyVars.ts new file mode 100644 index 0000000..44670e2 --- /dev/null +++ b/build/generate/generateModifyVars.ts @@ -0,0 +1,37 @@ +import { generateAntColors, primaryColor } from '../config/themeConfig'; +import { getThemeVariables } from 'ant-design-vue/dist/theme'; +import { resolve } from 'path'; + +/** + * less global variable + */ +export function generateModifyVars(dark = false) { + const palettes = generateAntColors(primaryColor); + const primary = palettes[5]; + + const primaryColorObj: Record = {}; + + for (let index = 0; index < 10; index++) { + primaryColorObj[`primary-${index + 1}`] = palettes[index]; + } + + const modifyVars = getThemeVariables({ dark }); + return { + ...modifyVars, + // Used for global import to avoid the need to import each style file separately + // reference: Avoid repeated references + hack: `${modifyVars.hack} @import (reference) "${resolve('src/design/config.less')}";`, + 'primary-color': primary, + ...primaryColorObj, + 'info-color': primary, + 'processing-color': primary, + 'success-color': '#55D187', // Success color + 'error-color': '#ED6F6F', // False color + 'warning-color': '#EFBD47', // Warning color + //'border-color-base': '#EEEEEE', + 'font-size-base': '14px', // Main font size + 'border-radius-base': '2px', // Component/float fillet + 'link-color': primary, // Link color + 'app-content-background': '#fafafa', // Link color + }; +} diff --git a/build/generate/icon/index.ts b/build/generate/icon/index.ts new file mode 100644 index 0000000..1b1bfd7 --- /dev/null +++ b/build/generate/icon/index.ts @@ -0,0 +1,68 @@ +import path from 'path'; +import fs from 'fs-extra'; +import inquirer from 'inquirer'; +import colors from 'picocolors'; +import pkg from '../../../package.json'; + +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?', + }, + { + type: 'input', + name: 'output', + message: 'Select the icon set that needs to be generated?', + default: 'src/components/Icon/data', + }, + ]) + .then(async (answers) => { + const { iconSet, output, useType } = answers; + const outputDir = path.resolve(process.cwd(), output); + 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 isLocal = useType === 'local'; + const icons = Object.keys(data.icons).map((item) => `${isLocal ? prefix + ':' : ''}${item}`); + + await fs.writeFileSync( + path.join(output, `icons.data.ts`), + `export default ${isLocal ? JSON.stringify(icons) : JSON.stringify({ prefix, icons })}` + ); + prefixSet.push(prefix); + } + } + fs.emptyDir(path.join(process.cwd(), 'node_modules/.vite')); + console.log(`✨ ${colors.cyan(`[${pkg.name}]`)}` + ' - Icon generated successfully:' + `[${prefixSet}]`); + }); +} + +generateIcon(); diff --git a/build/getConfigFileName.ts b/build/getConfigFileName.ts new file mode 100644 index 0000000..46cb902 --- /dev/null +++ b/build/getConfigFileName.ts @@ -0,0 +1,7 @@ +/** + * Get the configuration file variable name + * @param env + */ +export const getConfigFileName = (env: Record) => { + return `__PRODUCTION__${env.VITE_GLOB_APP_SHORT_NAME || '__APP'}__CONF__`.toUpperCase().replace(/\s/g, ''); +}; diff --git a/build/script/buildConf.ts b/build/script/buildConf.ts new file mode 100644 index 0000000..0c8089c --- /dev/null +++ b/build/script/buildConf.ts @@ -0,0 +1,47 @@ +/** + * Generate additional configuration files when used for packaging. The file can be configured with some global variables, so that it can be changed directly externally without repackaging + */ +import { GLOB_CONFIG_FILE_NAME, OUTPUT_DIR } from '../constant'; +import fs, { writeFileSync } from 'fs-extra'; +import colors from 'picocolors'; + +import { getEnvConfig, getRootPath } from '../utils'; +import { getConfigFileName } from '../getConfigFileName'; + +import pkg from '../../package.json'; + +interface CreateConfigParams { + configName: string; + config: any; + configFileName?: string; +} + +function createConfig(params: CreateConfigParams) { + const { configName, config, configFileName } = params; + try { + const windowConf = `window.${configName}`; + // Ensure that the variable will not be modified + let configStr = `${windowConf}=${JSON.stringify(config)};`; + configStr += ` + Object.freeze(${windowConf}); + Object.defineProperty(window, "${configName}", { + configurable: false, + writable: false, + }); + `.replace(/\s/g, ''); + + fs.mkdirp(getRootPath(OUTPUT_DIR)); + writeFileSync(getRootPath(`${OUTPUT_DIR}/${configFileName}`), configStr); + + console.log(colors.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`); + console.log(colors.gray(OUTPUT_DIR + '/' + colors.green(configFileName)) + '\n'); + } catch (error) { + console.log(colors.red('configuration file configuration file failed to package:\n' + error)); + } +} + +export function runBuildConfig() { + const config = getEnvConfig(); + const configFileName = getConfigFileName(config); + createConfig({ config, configName: configFileName, configFileName: GLOB_CONFIG_FILE_NAME }); +} diff --git a/build/script/postBuild.ts b/build/script/postBuild.ts new file mode 100644 index 0000000..42635d8 --- /dev/null +++ b/build/script/postBuild.ts @@ -0,0 +1,23 @@ +// #!/usr/bin/env node + +import { runBuildConfig } from './buildConf'; +import colors from 'picocolors'; + +import pkg from '../../package.json'; + +export const runBuild = async () => { + try { + const argvList = process.argv.splice(2); + + // Generate configuration file + if (!argvList.includes('disabled-config')) { + runBuildConfig(); + } + + console.log(`✨ ${colors.cyan(`[${pkg.name}]`)}` + ' - build successfully!'); + } catch (error) { + console.log(colors.red('vite build error:\n' + error)); + process.exit(1); + } +}; +runBuild(); diff --git a/build/utils.ts b/build/utils.ts new file mode 100644 index 0000000..c201514 --- /dev/null +++ b/build/utils.ts @@ -0,0 +1,92 @@ +import fs from 'fs'; +import path from 'path'; +import dotenv from 'dotenv'; + +export function isDevFn(mode: string): boolean { + return mode === 'development'; +} + +export function isProdFn(mode: string): boolean { + return mode === 'production'; +} + +/** + * Whether to generate package preview + */ +export function isReportMode(): boolean { + return process.env.REPORT === 'true'; +} + +// Read all environment variable configuration files to process.env +export function wrapperEnv(envConf: Recordable): ViteEnv { + const ret: any = {}; + + for (const envName of Object.keys(envConf)) { + let realName = envConf[envName].replace(/\\n/g, '\n'); + realName = realName === 'true' ? true : realName === 'false' ? false : realName; + + if (envName === 'VITE_PORT') { + realName = Number(realName); + } + if (envName === 'VITE_PROXY' && realName) { + try { + realName = JSON.parse(realName.replace(/'/g, '"')); + } catch (error) { + realName = ''; + } + } + ret[envName] = realName; + if (typeof realName === 'string') { + process.env[envName] = realName; + } else if (typeof realName === 'object') { + process.env[envName] = JSON.stringify(realName); + } + } + return ret; +} + +/** + * 获取当前环境下生效的配置文件名 + */ +function getConfFiles() { + const script = process.env.npm_lifecycle_script; + const reg = new RegExp('--mode ([a-z_\\d]+)'); + const result = reg.exec(script as string) as any; + if (result) { + const mode = result[1] as string; + return ['.env', `.env.${mode}`]; + } + return ['.env', '.env.production']; +} + +/** + * Get the environment variables starting with the specified prefix + * @param match prefix + * @param confFiles ext + */ +export function getEnvConfig(match = 'VITE_GLOB_', confFiles = getConfFiles()) { + let envConfig = {}; + confFiles.forEach((item) => { + try { + const env = dotenv.parse(fs.readFileSync(path.resolve(process.cwd(), item))); + envConfig = { ...envConfig, ...env }; + } catch (e) { + console.error(`Error in parsing ${item}`, e); + } + }); + const reg = new RegExp(`^(${match})`); + Object.keys(envConfig).forEach((key) => { + if (!reg.test(key)) { + Reflect.deleteProperty(envConfig, key); + } + }); + return envConfig; +} + +/** + * Get user root directory + * @param dir file path + */ +export function getRootPath(...dir: string[]) { + return path.resolve(process.cwd(), ...dir); +} diff --git a/build/vite/plugin/compress.ts b/build/vite/plugin/compress.ts new file mode 100644 index 0000000..987f127 --- /dev/null +++ b/build/vite/plugin/compress.ts @@ -0,0 +1,32 @@ +/** + * Used to package and output gzip. Note that this does not work properly in Vite, the specific reason is still being investigated + * https://github.com/anncwb/vite-plugin-compression + */ +import type { PluginOption } from 'vite'; +import compressPlugin from 'vite-plugin-compression'; + +export function configCompressPlugin(compress: 'gzip' | 'brotli' | 'none', deleteOriginFile = false): PluginOption | PluginOption[] { + const compressList = compress.split(','); + + const plugins: PluginOption[] = []; + + if (compressList.includes('gzip')) { + plugins.push( + compressPlugin({ + ext: '.gz', + deleteOriginFile, + }) + ); + } + + if (compressList.includes('brotli')) { + plugins.push( + compressPlugin({ + ext: '.br', + algorithm: 'brotliCompress', + deleteOriginFile, + }) + ); + } + return plugins; +} diff --git a/build/vite/plugin/html.ts b/build/vite/plugin/html.ts new file mode 100644 index 0000000..6af034a --- /dev/null +++ b/build/vite/plugin/html.ts @@ -0,0 +1,40 @@ +/** + * Plugin to minimize and use ejs template syntax in index.html. + * https://github.com/anncwb/vite-plugin-html + */ +import type { PluginOption } from 'vite'; +import { createHtmlPlugin } from 'vite-plugin-html'; +import pkg from '../../../package.json'; +import { GLOB_CONFIG_FILE_NAME } from '../../constant'; + +export function configHtmlPlugin(env: ViteEnv, isBuild: boolean) { + const { VITE_GLOB_APP_TITLE, VITE_PUBLIC_PATH } = env; + + const path = VITE_PUBLIC_PATH.endsWith('/') ? VITE_PUBLIC_PATH : `${VITE_PUBLIC_PATH}/`; + + const getAppConfigSrc = () => { + return `${path || '/'}${GLOB_CONFIG_FILE_NAME}?v=${pkg.version}-${new Date().getTime()}`; + }; + + const htmlPlugin: PluginOption[] = createHtmlPlugin({ + minify: isBuild, + inject: { + // Inject data into ejs template + data: { + title: VITE_GLOB_APP_TITLE, + }, + // Embed the generated app.config.js file + tags: isBuild + ? [ + { + tag: 'script', + attrs: { + src: getAppConfigSrc(), + }, + }, + ] + : [], + }, + }); + return htmlPlugin; +} diff --git a/build/vite/plugin/imagemin.ts b/build/vite/plugin/imagemin.ts new file mode 100644 index 0000000..a023573 --- /dev/null +++ b/build/vite/plugin/imagemin.ts @@ -0,0 +1,34 @@ +// Image resource files used to compress the output of the production environment +// https://github.com/anncwb/vite-plugin-imagemin +import viteImagemin from 'vite-plugin-imagemin'; + +export function configImageminPlugin() { + const plugin = viteImagemin({ + gifsicle: { + optimizationLevel: 7, + interlaced: false, + }, + optipng: { + optimizationLevel: 7, + }, + mozjpeg: { + quality: 20, + }, + pngquant: { + quality: [0.8, 0.9], + speed: 4, + }, + svgo: { + plugins: [ + { + name: 'removeViewBox', + }, + { + name: 'removeEmptyAttrs', + active: false, + }, + ], + }, + }); + return plugin; +} diff --git a/build/vite/plugin/index.ts b/build/vite/plugin/index.ts new file mode 100644 index 0000000..661eb4e --- /dev/null +++ b/build/vite/plugin/index.ts @@ -0,0 +1,80 @@ +import { PluginOption } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import legacy from '@vitejs/plugin-legacy'; +import purgeIcons from 'vite-plugin-purge-icons'; +import windiCSS from 'vite-plugin-windicss'; +import VitePluginCertificate from 'vite-plugin-mkcert'; +import vueSetupExtend from 'vite-plugin-vue-setup-extend'; +import { configHtmlPlugin } from './html'; +import { configPwaConfig } from './pwa'; +import { configMockPlugin } from './mock'; +import { configCompressPlugin } from './compress'; +import { configStyleImportPlugin } from './styleImport'; +import { configVisualizerConfig } from './visualizer'; +import { configThemePlugin } from './theme'; +import { configImageminPlugin } from './imagemin'; +import { configSvgIconsPlugin } from './svgSprite'; +import OptimizationPersist from 'vite-plugin-optimize-persist' +import PkgConfig from 'vite-plugin-package-config' + +export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) { + const { VITE_USE_IMAGEMIN, VITE_USE_MOCK, VITE_LEGACY, VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE } = viteEnv; + + const vitePlugins: (PluginOption | PluginOption[])[] = [ + // have to + vue(), + // have to + vueJsx(), + // support name + vueSetupExtend(), + // @ts-ignore + VitePluginCertificate({ + source: 'coding', + }), + ]; + + // vite-plugin-windicss + vitePlugins.push(windiCSS()); + + // @vitejs/plugin-legacy + VITE_LEGACY && isBuild && vitePlugins.push(legacy()); + + // vite-plugin-html + vitePlugins.push(configHtmlPlugin(viteEnv, isBuild)); + + // vite-plugin-svg-icons + vitePlugins.push(configSvgIconsPlugin(isBuild)); + + // vite-plugin-mock + VITE_USE_MOCK && vitePlugins.push(configMockPlugin(isBuild)); + + // vite-plugin-purge-icons + vitePlugins.push(purgeIcons()); + + // vite-plugin-style-import + vitePlugins.push(configStyleImportPlugin(isBuild)); + + // rollup-plugin-visualizer + vitePlugins.push(configVisualizerConfig()); + + // vite-plugin-theme + vitePlugins.push(configThemePlugin(isBuild)); + + // The following plugins only work in the production environment + if (isBuild) { + // vite-plugin-imagemin + VITE_USE_IMAGEMIN && vitePlugins.push(configImageminPlugin()); + + // rollup-plugin-gzip + vitePlugins.push(configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE)); + + // vite-plugin-pwa + vitePlugins.push(configPwaConfig(viteEnv)); + } + + //vite-plugin-theme【解决vite首次打开界面加载慢问题】 + vitePlugins.push(PkgConfig()); + vitePlugins.push(OptimizationPersist()); + return vitePlugins; +} diff --git a/build/vite/plugin/mock.ts b/build/vite/plugin/mock.ts new file mode 100644 index 0000000..d241e26 --- /dev/null +++ b/build/vite/plugin/mock.ts @@ -0,0 +1,19 @@ +/** + * Mock plugin for development and production. + * https://github.com/anncwb/vite-plugin-mock + */ +import { viteMockServe } from 'vite-plugin-mock'; + +export function configMockPlugin(isBuild: boolean) { + return viteMockServe({ + ignore: /^\_/, + mockPath: 'mock', + localEnabled: !isBuild, + prodEnabled: isBuild, + injectCode: ` + import { setupProdMockServer } from '../mock/_createProductionServer'; + + setupProdMockServer(); + `, + }); +} diff --git a/build/vite/plugin/pwa.ts b/build/vite/plugin/pwa.ts new file mode 100644 index 0000000..90ef5bc --- /dev/null +++ b/build/vite/plugin/pwa.ts @@ -0,0 +1,33 @@ +/** + * Zero-config PWA for Vite + * https://github.com/antfu/vite-plugin-pwa + */ +import { VitePWA } from 'vite-plugin-pwa'; + +export function configPwaConfig(env: ViteEnv) { + const { VITE_USE_PWA, VITE_GLOB_APP_TITLE, VITE_GLOB_APP_SHORT_NAME } = env; + + if (VITE_USE_PWA) { + // vite-plugin-pwa + const pwaPlugin = VitePWA({ + manifest: { + name: VITE_GLOB_APP_TITLE, + short_name: VITE_GLOB_APP_SHORT_NAME, + icons: [ + { + src: './resource/img/pwa-192x192.png', + sizes: '192x192', + type: 'image/png', + }, + { + src: './resource/img/pwa-512x512.png', + sizes: '512x512', + type: 'image/png', + }, + ], + }, + }); + return pwaPlugin; + } + return []; +} diff --git a/build/vite/plugin/styleImport.ts b/build/vite/plugin/styleImport.ts new file mode 100644 index 0000000..da1499d --- /dev/null +++ b/build/vite/plugin/styleImport.ts @@ -0,0 +1,81 @@ +/** + * Introduces component library styles on demand. + * https://github.com/anncwb/vite-plugin-style-import + */ +import { createStyleImportPlugin } from 'vite-plugin-style-import'; + +export function configStyleImportPlugin(_isBuild: boolean) { + if (!_isBuild) { + return []; + } + const styleImportPlugin = createStyleImportPlugin({ + libs: [ + { + libraryName: 'ant-design-vue', + esModule: true, + resolveStyle: (name) => { + // 这里是无需额外引入样式文件的“子组件”列表 + const ignoreList = [ + 'anchor-link', + 'sub-menu', + 'menu-item', + 'menu-divider', + 'menu-item-group', + 'breadcrumb-item', + 'breadcrumb-separator', + 'form-item', + 'step', + 'select-option', + 'select-opt-group', + 'card-grid', + 'card-meta', + 'collapse-panel', + 'descriptions-item', + 'list-item', + 'list-item-meta', + 'table-column', + 'table-column-group', + 'tab-pane', + 'tab-content', + 'timeline-item', + 'tree-node', + 'skeleton-input', + 'skeleton-avatar', + 'skeleton-title', + 'skeleton-paragraph', + 'skeleton-image', + 'skeleton-button', + ]; + // 这里是需要额外引入样式的子组件列表 + // 单独引入子组件时需引入组件样式,否则会在打包后导致子组件样式丢失 + const replaceList = { + 'typography-text': 'typography', + 'typography-title': 'typography', + 'typography-paragraph': 'typography', + 'typography-link': 'typography', + 'dropdown-button': 'dropdown', + 'input-password': 'input', + 'input-search': 'input', + 'input-group': 'input', + 'radio-group': 'radio', + 'checkbox-group': 'checkbox', + 'layout-sider': 'layout', + 'layout-content': 'layout', + 'layout-footer': 'layout', + 'layout-header': 'layout', + 'month-picker': 'date-picker', + 'range-picker': 'date-picker', + 'image-preview-group': 'image', + }; + + return ignoreList.includes(name) + ? '' + : replaceList.hasOwnProperty(name) + ? `ant-design-vue/es/${replaceList[name]}/style/index` + : `ant-design-vue/es/${name}/style/index`; + }, + }, + ], + }); + return styleImportPlugin; +} diff --git a/build/vite/plugin/svgSprite.ts b/build/vite/plugin/svgSprite.ts new file mode 100644 index 0000000..61f637f --- /dev/null +++ b/build/vite/plugin/svgSprite.ts @@ -0,0 +1,17 @@ +/** + * Vite Plugin for fast creating SVG sprites. + * https://github.com/anncwb/vite-plugin-svg-icons + */ + +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; +import path from 'path'; + +export function configSvgIconsPlugin(isBuild: boolean) { + const svgIconsPlugin = createSvgIconsPlugin({ + iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')], + svgoOptions: isBuild, + // default + symbolId: 'icon-[dir]-[name]', + }); + return svgIconsPlugin; +} diff --git a/build/vite/plugin/theme.ts b/build/vite/plugin/theme.ts new file mode 100644 index 0000000..f9a10c3 --- /dev/null +++ b/build/vite/plugin/theme.ts @@ -0,0 +1,100 @@ +/** + * Vite plugin for website theme color switching + * https://github.com/anncwb/vite-plugin-theme + */ +import type { PluginOption } from 'vite'; +import path from 'path'; +import { viteThemePlugin, antdDarkThemePlugin, mixLighten, mixDarken, tinycolor } from '@rys-fe/vite-plugin-theme'; +import { getThemeColors, generateColors } from '../../config/themeConfig'; +import { generateModifyVars } from '../../generate/generateModifyVars'; + +export function configThemePlugin(isBuild: boolean): PluginOption[] { + const colors = generateColors({ + mixDarken, + mixLighten, + tinycolor, + }); + + // update-begin-修复编译后主题色切换不生效黑屏的问题----------------------- + // https://github.com/vbenjs/vue-vben-admin/issues/1445 + // 抽取出viteThemePlugin插件,下方会根据不同环境设置enforce + const vite_theme_plugin = viteThemePlugin({ + resolveSelector: (s) => { + s = s.trim(); + switch (s) { + case '.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon': + return '.ant-steps-item-icon > .ant-steps-icon'; + case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)': + case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover': + case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active': + return s; + case '.ant-steps-item-icon > .ant-steps-icon': + return s; + case '.ant-select-item-option-selected:not(.ant-select-item-option-disabled)': + return s; + default: + if (s.indexOf('.ant-btn') >= -1) { + // 按钮被重新定制过,需要过滤掉class防止覆盖 + return s; + } + } + return s.startsWith('[data-theme') ? s : `[data-theme] ${s}`; + }, + colorVariables: [...getThemeColors(), ...colors], + }); + vite_theme_plugin.forEach(function (item) { + //对vite:theme插件特殊配置 + if ('vite:theme' === item.name) { + // 打包时去除enforce: "post",vite 2.6.x适配,否则生成app-theme-style为空,因为async transform(code, id) {的code没有正确获取 + if (isBuild) { + delete item.enforce; + } + } + }); + // update-end-修复编译后主题色切换不生效黑屏的问题----------------------- + + const plugin = [ + vite_theme_plugin, + antdDarkThemePlugin({ + preloadFiles: [ + path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.less'), + //path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.dark.less'), + path.resolve(process.cwd(), 'src/design/index.less'), + ], + filter: (id) => (isBuild ? !id.endsWith('antd.less') : true), + // extractCss: false, + darkModifyVars: { + ...generateModifyVars(true), + 'text-color': '#c9d1d9', + 'primary-1': 'rgb(255 255 255 / 8%)', + 'text-color-base': '#c9d1d9', + 'component-background': '#151515', + 'heading-color': 'rgb(255 255 255 / 65%)', + // black: '#0e1117', + // #8b949e + 'text-color-secondary': '#8b949e', + 'border-color-base': '#303030', + 'header-light-bottom-border-color': '#303030', + // 'border-color-split': '#30363d', + 'item-active-bg': '#111b26', + 'app-content-background': '#1e1e1e', + 'tree-node-selected-bg': '#11263c', + + 'alert-success-border-color': '#274916', + 'alert-success-bg-color': '#162312', + 'alert-success-icon-color': '#49aa19', + 'alert-info-border-color': '#153450', + 'alert-info-bg-color': '#111b26', + 'alert-info-icon-color': '#177ddc', + 'alert-warning-border-color': '#594214', + 'alert-warning-bg-color': '#2b2111', + 'alert-warning-icon-color': '#d89614', + 'alert-error-border-color': '#58181c', + 'alert-error-bg-color': '#2a1215', + 'alert-error-icon-color': '#a61d24', + }, + }), + ]; + + return plugin as unknown as PluginOption[]; +} diff --git a/build/vite/plugin/visualizer.ts b/build/vite/plugin/visualizer.ts new file mode 100644 index 0000000..75d4451 --- /dev/null +++ b/build/vite/plugin/visualizer.ts @@ -0,0 +1,17 @@ +/** + * Package file volume analysis + */ +import visualizer from 'rollup-plugin-visualizer'; +import { isReportMode } from '../../utils'; + +export function configVisualizerConfig() { + if (isReportMode()) { + return visualizer({ + filename: './node_modules/.cache/visualizer/stats.html', + open: true, + gzipSize: true, + brotliSize: true, + }) as Plugin; + } + return []; +} diff --git a/build/vite/proxy.ts b/build/vite/proxy.ts new file mode 100644 index 0000000..8525397 --- /dev/null +++ b/build/vite/proxy.ts @@ -0,0 +1,34 @@ +/** + * Used to parse the .env.development proxy configuration + */ +import type { ProxyOptions } from 'vite'; + +type ProxyItem = [string, string]; + +type ProxyList = ProxyItem[]; + +type ProxyTargetList = Record; + +const httpsRE = /^https:\/\//; + +/** + * Generate proxy + * @param list + */ +export function createProxy(list: ProxyList = []) { + const ret: ProxyTargetList = {}; + for (const [prefix, target] of list) { + const isHttps = httpsRE.test(target); + + // https://github.com/http-party/node-http-proxy#options + ret[prefix] = { + target: target, + changeOrigin: true, + ws: true, + rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ''), + // https is require secure=false + ...(isHttps ? { secure: false } : {}), + }; + } + return ret; +} diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..ac977af --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,32 @@ +module.exports = { + ignores: [(commit) => commit.includes('init')], + extends: ['@commitlint/config-conventional'], + rules: { + 'body-leading-blank': [2, 'always'], + 'footer-leading-blank': [1, 'always'], + 'header-max-length': [2, 'always', 108], + 'subject-empty': [2, 'never'], + 'type-empty': [2, 'never'], + 'type-enum': [ + 2, + 'always', + [ + 'feat', + 'fix', + 'perf', + 'style', + 'docs', + 'test', + 'refactor', + 'build', + 'ci', + 'chore', + 'revert', + 'wip', + 'workflow', + 'types', + 'release', + ], + ], + }, +}; diff --git a/index.html b/index.html new file mode 100644 index 0000000..c80afd8 --- /dev/null +++ b/index.html @@ -0,0 +1,170 @@ + + + + + + + + + <%= title %> + + + + + + +
+ +
+
+ +
+ +
+
<%= title %>
+
+
+
+ + + diff --git a/jest.config.mjs b/jest.config.mjs new file mode 100644 index 0000000..162e72b --- /dev/null +++ b/jest.config.mjs @@ -0,0 +1,36 @@ +export default { + preset: 'ts-jest', + roots: ['/tests/'], + clearMocks: true, + moduleDirectories: ['node_modules', 'src'], + moduleFileExtensions: ['js', 'ts', 'vue', 'tsx', 'jsx', 'json', 'node'], + modulePaths: ['/src', '/node_modules'], + testMatch: [ + '**/tests/**/*.[jt]s?(x)', + '**/?(*.)+(spec|test).[tj]s?(x)', + '(/__tests__/.*|(\\.|/)(test|spec))\\.(js|ts)$', + ], + testPathIgnorePatterns: [ + '/tests/server/', + '/tests/__mocks__/', + '/node_modules/', + ], + transform: { + '^.+\\.tsx?$': 'ts-jest', + }, + transformIgnorePatterns: ['/tests/__mocks__/', '/node_modules/'], + // A map from regular expressions to module names that allow to stub out resources with a single module + moduleNameMapper: { + '\\.(vs|fs|vert|frag|glsl|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': + '/tests/__mocks__/fileMock.ts', + '\\.(sass|s?css|less)$': '/tests/__mocks__/styleMock.ts', + '\\?worker$': '/tests/__mocks__/workerMock.ts', + '^/@/(.*)$': '/src/$1', + }, + testEnvironment: 'jsdom', + verbose: true, + collectCoverage: false, + coverageDirectory: 'coverage', + collectCoverageFrom: ['src/**/*.{js,ts,vue}'], + coveragePathIgnorePatterns: ['^.+\\.d\\.ts$'], +}; diff --git a/mock/_createProductionServer.ts b/mock/_createProductionServer.ts new file mode 100644 index 0000000..8f47c23 --- /dev/null +++ b/mock/_createProductionServer.ts @@ -0,0 +1,18 @@ +import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer'; + +const modules = import.meta.glob('./**/*.ts', { eager: true }); + +const mockModules: any[] = []; +Object.keys(modules).forEach((key) => { + if (key.includes('/_')) { + return; + } + mockModules.push(...(modules as Recordable)[key].default); +}); + +/** + * Used in a production environment. Need to manually import all modules + */ +export function setupProdMockServer() { + createProdMockServer(mockModules); +} diff --git a/mock/_util.ts b/mock/_util.ts new file mode 100644 index 0000000..6a171d5 --- /dev/null +++ b/mock/_util.ts @@ -0,0 +1,63 @@ +// Interface data format used to return a unified format + +export function resultSuccess(result: T, { message = 'ok' } = {}) { + return { + code: 0, + result, + message, + type: 'success', + }; +} + +export function resultPageSuccess( + pageNo: number, + pageSize: number, + list: T[], + { message = 'ok' } = {} +) { + const pageData = pagination(pageNo, pageSize, list); + + return { + ...resultSuccess({ + records: pageData, + total: list.length, + }), + message, + }; +} + +export function resultError(message = 'Request failed', { code = -1, result = null } = {}) { + return { + code, + result, + message, + type: 'error', + }; +} + +export function pagination(pageNo: number, pageSize: number, array: T[]): T[] { + const offset = (pageNo - 1) * Number(pageSize); + const ret = + offset + Number(pageSize) >= array.length + ? array.slice(offset, array.length) + : array.slice(offset, offset + Number(pageSize)); + return ret; +} + +export interface requestParams { + method: string; + body: any; + headers?: { authorization?: string }; + query: any; +} + +/** + * @description 本函数用于从request数据中获取token,请根据项目的实际情况修改 + * + */ +export function getRequestToken({ headers }: requestParams): string | undefined { + return headers?.authorization; +} + +//TODO 接口父路径(写死不够灵活) +export const baseUrl = '/jeecgboot/mock'; diff --git a/mock/demo/account.ts b/mock/demo/account.ts new file mode 100644 index 0000000..a8a31c2 --- /dev/null +++ b/mock/demo/account.ts @@ -0,0 +1,70 @@ +import { MockMethod } from 'vite-plugin-mock'; +import { resultSuccess, resultError, baseUrl } from '../_util'; +import { ResultEnum } from '../../src/enums/httpEnum'; +const userInfo = { + name: 'Jeecg', + userid: '00000001', + email: 'test@gmail.com', + signature: '海纳百川,有容乃大', + introduction: '微笑着,努力着,欣赏着', + title: '交互专家', + group: '某某某事业群-某某平台部-某某技术部-UED', + tags: [ + { + key: '0', + label: '很有想法的', + }, + { + key: '1', + label: '专注设计', + }, + { + key: '2', + label: '辣~', + }, + { + key: '3', + label: '大长腿', + }, + { + key: '4', + label: '川妹子', + }, + { + key: '5', + label: '海纳百川', + }, + ], + notifyCount: 12, + unreadCount: 11, + country: 'China', + address: 'Xiamen City 77', + phone: '0592-268888888', +}; + +export default [ + { + url: `${baseUrl}/account/getAccountInfo`, + timeout: 1000, + method: 'get', + response: () => { + return resultSuccess(userInfo); + }, + }, + { + url: `${baseUrl}/user/sessionTimeout`, + method: 'post', + statusCode: 401, + response: () => { + return resultError(); + }, + }, + { + url: '/basic-api/user/tokenExpired', + method: 'post', + statusCode: 200, + response: () => { + return resultError('Token Expired!', { code: ResultEnum.TIMEOUT as number }); + }, + }, +] as MockMethod[]; diff --git a/mock/demo/select-demo.ts b/mock/demo/select-demo.ts new file mode 100644 index 0000000..ca2d949 --- /dev/null +++ b/mock/demo/select-demo.ts @@ -0,0 +1,28 @@ +import { MockMethod } from 'vite-plugin-mock'; +import { resultSuccess, baseUrl } from '../_util'; + +const demoList = (keyword, count = 20) => { + const result = { + list: [] as any[], + }; + for (let index = 0; index < count; index++) { + result.list.push({ + name: `${keyword ?? ''}选项${index}`, + id: `${index}`, + }); + } + return result; +}; + +export default [ + { + url: `${baseUrl}/select/getDemoOptions`, + timeout: 1000, + method: 'get', + response: ({ query }) => { + const { keyword,count} = query; + console.log(keyword); + return resultSuccess(demoList(keyword,count)); + }, + }, +] as MockMethod[]; diff --git a/mock/demo/system.ts b/mock/demo/system.ts new file mode 100644 index 0000000..940c04e --- /dev/null +++ b/mock/demo/system.ts @@ -0,0 +1,298 @@ +import { MockMethod } from 'vite-plugin-mock'; +import { resultError, resultPageSuccess, resultSuccess, baseUrl } from '../_util'; + +const accountList = (() => { + const result: any[] = []; + for (let index = 0; index < 20; index++) { + result.push({ + id: `${index}`, + account: '@first', + email: '@email', + nickname: '@cname()', + role: '@first', + createTime: '@datetime', + remark: '@cword(10,20)', + 'status|1': ['0', '1'], + }); + } + return result; +})(); + +const userList = (() => { + const result: any[] = []; + for (let index = 0; index < 20; index++) { + result.push({ + id: `${index}`, + username: '@first', + email: '@email', + realname: '@cname()', + createTime: '@datetime', + remark: '@cword(10,20)', + avatar: 'https://q1.qlogo.cn/g?b=qq&nk=190848757&s=640' + }); + } + return result; +})(); + +const roleList = (() => { + const result: any[] = []; + for (let index = 0; index < 4; index++) { + result.push({ + id: index + 1, + orderNo: `${index + 1}`, + roleName: ['超级管理员', '管理员', '文章管理员', '普通用户'][index], + roleValue: '@first', + createTime: '@datetime', + remark: '@cword(10,20)', + menu: [['0', '1', '2'], ['0', '1'], ['0', '2'], ['2']][index], + 'status|1': ['0', '1'], + }); + } + return result; +})(); + +const newRoleList = (() => { + const result: any[] = []; + for (let index = 0; index < 4; index++) { + result.push({ + id: index + 1, + orderNo: `${index + 1}`, + roleName: ['超级管理员', '管理员', '文章管理员', '普通用户'][index], + roleCode: '@first', + createTime: '@datetime', + remark: '@cword(10,20)' + }); + } + return result; +})(); + +const testList = (() => { + const result: any[] = []; + for (let index = 0; index < 4; index++) { + result.push({ + id: index + 1, + orderNo: `${index + 1}`, + testName: ['数据1', '数据2', '数据3', '数据4'][index], + testValue: '@first', + createTime: '@datetime' + }); + } + return result; +})(); + +const tableDemoList = (() => { + const result: any[] = []; + for (let index = 0; index < 4; index++) { + result.push({ + id: index + 1, + orderCode: '2008200' + `${index + 1}`, + orderMoney: '@natural(1000,3000)', + ctype: '@natural(1,2)', + content: '@cword(10,20)', + orderDate: '@datetime' + }); + } + return result; +})(); + +const deptList = (() => { + const result: any[] = []; + for (let index = 0; index < 3; index++) { + result.push({ + id: `${index}`, + deptName: ['华东分部', '华南分部', '西北分部'][index], + orderNo: index + 1, + createTime: '@datetime', + remark: '@cword(10,20)', + 'status|1': ['0', '0', '1'], + children: (() => { + const children: any[] = []; + for (let j = 0; j < 4; j++) { + children.push({ + id: `${index}-${j}`, + deptName: ['研发部', '市场部', '商务部', '财务部'][j], + orderNo: j + 1, + createTime: '@datetime', + remark: '@cword(10,20)', + 'status|1': ['0', '1'], + parentDept: `${index}`, + children: undefined, + }); + } + return children; + })(), + }); + } + return result; +})(); + +const menuList = (() => { + const result: any[] = []; + for (let index = 0; index < 3; index++) { + result.push({ + id: `${index}`, + icon: ['ion:layers-outline', 'ion:git-compare-outline', 'ion:tv-outline'][index], + component: 'LAYOUT', + type: '0', + menuName: ['Dashboard', '权限管理', '功能'][index], + permission: '', + orderNo: index + 1, + createTime: '@datetime', + 'status|1': ['0', '0', '1'], + children: (() => { + const children: any[] = []; + for (let j = 0; j < 4; j++) { + children.push({ + id: `${index}-${j}`, + type: '1', + menuName: ['菜单1', '菜单2', '菜单3', '菜单4'][j], + icon: 'ion:document', + permission: ['menu1:view', 'menu2:add', 'menu3:update', 'menu4:del'][index], + component: [ + '/dashboard/welcome/index', + '/dashboard/Analysis/index', + '/dashboard/workbench/index', + '/dashboard/test/index', + ][j], + orderNo: j + 1, + createTime: '@datetime', + 'status|1': ['0', '1'], + parentMenu: `${index}`, + children: (() => { + const children: any[] = []; + for (let k = 0; k < 4; k++) { + children.push({ + id: `${index}-${j}-${k}`, + type: '2', + menuName: '按钮' + (j + 1) + '-' + (k + 1), + icon: '', + permission: + ['menu1:view', 'menu2:add', 'menu3:update', 'menu4:del'][index] + + ':btn' + + (k + 1), + component: [ + '/dashboard/welcome/index', + '/dashboard/Analysis/index', + '/dashboard/workbench/index', + '/dashboard/test/index', + ][j], + orderNo: j + 1, + createTime: '@datetime', + 'status|1': ['0', '1'], + parentMenu: `${index}-${j}`, + children: undefined, + }); + } + return children; + })(), + }); + } + return children; + })(), + }); + } + return result; +})(); + +export default [ + { + url: `${baseUrl}/system/getAccountList`, + timeout: 100, + method: 'get', + response: ({ query }) => { + const { page = 1, pageSize = 20 } = query; + return resultPageSuccess(page, pageSize, accountList); + }, + }, + { + url: `${baseUrl}/sys/user/list`, + timeout: 100, + method: 'get', + response: ({ query }) => { + const { page = 1, pageSize = 20 } = query; + return resultPageSuccess(page, pageSize, userList); + }, + }, + { + url: `${baseUrl}/system/getRoleListByPage`, + timeout: 100, + method: 'get', + response: ({ query }) => { + const { page = 1, pageSize = 20 } = query; + return resultPageSuccess(page, pageSize, roleList); + }, + }, + { + url: `${baseUrl}/sys/role/list`, + timeout: 100, + method: 'get', + response: ({ query }) => { + const { page = 1, pageSize = 20 } = query; + return resultPageSuccess(page, pageSize, newRoleList); + }, + }, + { + url: `${baseUrl}/system/getTestListByPage`, + timeout: 100, + method: 'get', + response: ({ query }) => { + const { page = 1, pageSize = 20 } = query; + return resultPageSuccess(page, pageSize, testList); + }, + }, + { + url: `${baseUrl}/system/getDemoTableListByPage`, + timeout: 100, + method: 'get', + response: ({ query }) => { + const { page = 1, pageSize = 20 } = query; + return resultPageSuccess(page, pageSize, tableDemoList); + }, + }, + { + url: `${baseUrl}/system/setRoleStatus`, + timeout: 500, + method: 'post', + response: ({ query }) => { + const { id, status } = query; + return resultSuccess({ id, status }); + }, + }, + { + url: `${baseUrl}/system/getAllRoleList`, + timeout: 100, + method: 'get', + response: () => { + return resultSuccess(roleList); + }, + }, + { + url: `${baseUrl}/system/getDeptList`, + timeout: 100, + method: 'get', + response: () => { + return resultSuccess(deptList); + }, + }, + { + url: `${baseUrl}/system/getMenuList`, + timeout: 100, + method: 'get', + response: () => { + return resultSuccess(menuList); + }, + }, + { + url: `${baseUrl}/system/accountExist`, + timeout: 500, + method: 'post', + response: ({ body }) => { + const { account } = body || {}; + if (account && account.indexOf('admin') !== -1) { + return resultError('该字段不能包含admin'); + } else { + return resultSuccess(`${account} can use`); + } + }, + }, +] as MockMethod[]; diff --git a/mock/demo/table-demo.ts b/mock/demo/table-demo.ts new file mode 100644 index 0000000..fbb51f6 --- /dev/null +++ b/mock/demo/table-demo.ts @@ -0,0 +1,52 @@ +import { MockMethod } from 'vite-plugin-mock'; +import { Random } from 'mockjs'; +import { resultPageSuccess, baseUrl } from '../_util'; + +function getRandomPics(count = 10): string[] { + const arr: string[] = []; + for (let i = 0; i < count; i++) { + arr.push(Random.image('800x600', Random.color(), Random.color(), Random.title())); + } + return arr; +} + +const demoList = (() => { + const result: any[] = []; + for (let index = 0; index < 200; index++) { + result.push({ + id: `${index}`, + beginTime: '@datetime', + endTime: '@datetime', + address: '@city()', + name: '@cname()', + name1: '@cname()', + name2: '@cname()', + name3: '@cname()', + name4: '@cname()', + name5: '@cname()', + name6: '@cname()', + name7: '@cname()', + name8: '@cname()', + avatar: Random.image('400x400', Random.color(), Random.color(), Random.first()), + imgArr: getRandomPics(Math.ceil(Math.random() * 3) + 1), + imgs: getRandomPics(Math.ceil(Math.random() * 3) + 1), + date: `@date('yyyy-MM-dd')`, + time: `@time('HH:mm')`, + 'no|100000-10000000': 100000, + 'status|1': ['normal', 'enable', 'disable'], + }); + } + return result; +})(); + +export default [ + { + url: `${baseUrl}/table/getDemoList`, + timeout: 100, + method: 'get', + response: ({ query }) => { + const { page = 1, pageSize = 20 } = query; + return resultPageSuccess(page, pageSize, demoList); + }, + }, +] as MockMethod[]; diff --git a/mock/demo/tree-demo.ts b/mock/demo/tree-demo.ts new file mode 100644 index 0000000..1f4ec22 --- /dev/null +++ b/mock/demo/tree-demo.ts @@ -0,0 +1,38 @@ +import { MockMethod } from 'vite-plugin-mock'; +import { resultSuccess, baseUrl } from '../_util'; + +const demoTreeList = (keyword) => { + const result = { + list: [] as Recordable[], + }; + for (let index = 0; index < 5; index++) { + const children: Recordable[] = []; + for (let j = 0; j < 3; j++) { + children.push({ + title: `${keyword ?? ''}选项${index}-${j}`, + value: `${index}-${j}`, + key: `${index}-${j}`, + }); + } + result.list.push({ + title: `${keyword ?? ''}选项${index}`, + value: `${index}`, + key: `${index}`, + children, + }); + } + return result; +}; + +export default [ + { + url: `${baseUrl}/tree/getDemoOptions`, + timeout: 1000, + method: 'get', + response: ({ query }) => { + const { keyword } = query; + console.log(keyword); + return resultSuccess(demoTreeList(keyword)); + }, + }, +] as MockMethod[]; diff --git a/mock/sys/menu.ts b/mock/sys/menu.ts new file mode 100644 index 0000000..73bda64 --- /dev/null +++ b/mock/sys/menu.ts @@ -0,0 +1,270 @@ +import { resultSuccess, resultError, getRequestToken, requestParams,baseUrl} from '../_util'; +import { MockMethod } from 'vite-plugin-mock'; +import { createFakeUserList } from './user'; + +// single +const dashboardRoute = { + path: '/dashboard', + name: 'Dashboard', + component: 'LAYOUT', + redirect: '/dashboard/analysis', + meta: { + title: 'routes.dashboard.dashboard', + hideChildrenInMenu: true, + icon: 'bx:bx-home', + }, + children: [ + { + path: 'analysis', + name: 'Analysis', + component: '/dashboard/Analysis/index', + meta: { + hideMenu: true, + hideBreadcrumb: true, + title: 'routes.dashboard.analysis', + currentActiveMenu: '/dashboard', + icon: 'bx:bx-home', + }, + }, + { + path: 'workbench', + name: 'Workbench', + component: '/dashboard/workbench/index', + meta: { + hideMenu: true, + hideBreadcrumb: true, + title: 'routes.dashboard.workbench', + currentActiveMenu: '/dashboard', + icon: 'bx:bx-home', + }, + }, + ], +}; + +const backRoute = { + path: 'back', + name: 'PermissionBackDemo', + meta: { + title: 'routes.demo.permission.back', + }, + + children: [ + { + path: 'page', + name: 'BackAuthPage', + component: '/demo/permission/back/index', + meta: { + title: 'routes.demo.permission.backPage', + }, + }, + { + path: 'btn', + name: 'BackAuthBtn', + component: '/demo/permission/back/Btn', + meta: { + title: 'routes.demo.permission.backBtn', + }, + }, + ], +}; + +const authRoute = { + path: '/permission', + name: 'Permission', + component: 'LAYOUT', + redirect: '/permission/front/page', + meta: { + icon: 'carbon:user-role', + title: 'routes.demo.permission.permission', + }, + children: [backRoute], +}; + +const levelRoute = { + path: '/level', + name: 'Level', + component: 'LAYOUT', + redirect: '/level/menu1/menu1-1', + meta: { + icon: 'carbon:user-role', + title: 'routes.demo.level.level', + }, + + children: [ + { + path: 'menu1', + name: 'Menu1Demo', + meta: { + title: 'Menu1', + }, + children: [ + { + path: 'menu1-1', + name: 'Menu11Demo', + meta: { + title: 'Menu1-1', + }, + children: [ + { + path: 'menu1-1-1', + name: 'Menu111Demo', + component: '/demo/level/Menu111', + meta: { + title: 'Menu111', + }, + }, + ], + }, + { + path: 'menu1-2', + name: 'Menu12Demo', + component: '/demo/level/Menu12', + meta: { + title: 'Menu1-2', + }, + }, + ], + }, + { + path: 'menu2', + name: 'Menu2Demo', + component: '/demo/level/Menu2', + meta: { + title: 'Menu2', + }, + }, + ], +}; + +const sysRoute = { + path: '/system', + name: 'System', + component: 'LAYOUT', + redirect: '/system/account', + meta: { + icon: 'ion:settings-outline', + title: 'routes.demo.system.moduleName', + }, + children: [ + { + path: 'account', + name: 'AccountManagement', + meta: { + title: 'routes.demo.system.account', + ignoreKeepAlive: true, + }, + component: '/demo/system/account/index', + }, + { + path: 'account_detail/:id', + name: 'AccountDetail', + meta: { + hideMenu: true, + title: 'routes.demo.system.account_detail', + ignoreKeepAlive: true, + showMenu: false, + currentActiveMenu: '/system/account', + }, + component: '/demo/system/account/AccountDetail', + }, + { + path: 'role', + name: 'RoleManagement', + meta: { + title: 'routes.demo.system.role', + ignoreKeepAlive: true, + }, + component: '/demo/system/role/index', + }, + + { + path: 'menu', + name: 'MenuManagement', + meta: { + title: 'routes.demo.system.menu', + ignoreKeepAlive: true, + }, + component: '/demo/system/menu/index', + }, + { + path: 'dept', + name: 'DeptManagement', + meta: { + title: 'routes.demo.system.dept', + ignoreKeepAlive: true, + }, + component: '/demo/system/dept/index', + }, + { + path: 'changePassword', + name: 'ChangePassword', + meta: { + title: 'routes.demo.system.password', + ignoreKeepAlive: true, + }, + component: '/demo/system/password/index', + }, + ], +}; + +const linkRoute = { + path: '/link', + name: 'Link', + component: 'LAYOUT', + meta: { + icon: 'ion:tv-outline', + title: 'routes.demo.iframe.frame', + }, + children: [ + { + path: 'doc', + name: 'Doc', + meta: { + title: 'routes.demo.iframe.doc', + frameSrc: 'https://vvbin.cn/doc-next/', + }, + }, + { + path: 'https://vvbin.cn/doc-next/', + name: 'DocExternal', + component: 'LAYOUT', + meta: { + title: 'routes.demo.iframe.docExternal', + }, + }, + ], +}; + +export default [ + { + url: `${baseUrl}/sys/permission/getUserPermissionByToken`, + timeout: 1000, + method: 'get', + response: (request: requestParams) => { + const token = getRequestToken(request); + if (!token) { + return resultError('Invalid token!'); + } + const checkUser = createFakeUserList().find((item) => item.token === token); + if (!checkUser) { + return resultError('Invalid user token!'); + } + const id = checkUser.userId; + let menu: Object[]; + switch (id) { + case '1': + dashboardRoute.redirect = dashboardRoute.path + '/' + dashboardRoute.children[0].path; + menu = [dashboardRoute, authRoute, levelRoute, sysRoute, linkRoute]; + break; + case '2': + dashboardRoute.redirect = dashboardRoute.path + '/' + dashboardRoute.children[1].path; + menu = [dashboardRoute, authRoute, levelRoute, linkRoute]; + break; + default: + menu = []; + } + + return resultSuccess(menu); + }, + }, +] as MockMethod[]; diff --git a/mock/sys/user.ts b/mock/sys/user.ts new file mode 100644 index 0000000..34175e7 --- /dev/null +++ b/mock/sys/user.ts @@ -0,0 +1,124 @@ +import { MockMethod } from 'vite-plugin-mock'; +import { resultError, resultSuccess, getRequestToken, requestParams, baseUrl } from '../_util'; +export function createFakeUserList() { + return [ + { + userId: '1', + username: 'admin', + realname: '管理员', + avatar: 'https://q1.qlogo.cn/g?b=qq&nk=190848757&s=640', + desc: 'manager', + password: '123456', + token: 'fakeToken1', + homePath: '/dashboard/analysis', + roles: [ + { + roleName: 'Super Admin', + value: 'super', + }, + ], + }, + { + userId: '2', + username: 'jeecg', + password: '123456', + realname: '测试用户', + avatar: 'https://q1.qlogo.cn/g?b=qq&nk=339449197&s=640', + desc: 'tester', + token: 'fakeToken2', + homePath: '/dashboard/workbench', + roles: [ + { + roleName: 'Tester', + value: 'test', + }, + ], + }, + ]; +} + +const fakeCodeList: any = { + '1': ['1000', '3000', '5000'], + + '2': ['2000', '4000', '6000'], +}; + +export default [ + // mock user login + { + url: `${baseUrl}/sys/login`, + timeout: 200, + method: 'post', + response: ({ body }) => { + const { username, password } = body; + const checkUser = createFakeUserList().find( + (item) => item.username === username && password === item.password + ); + if (!checkUser) { + return resultError('Incorrect account or password!'); + } + const { userId, username: _username, token, realname, desc, roles } = checkUser; + return resultSuccess({ + roles, + userId, + username: _username, + token, + realname, + desc, + }); + }, + }, + { + url: `${baseUrl}/sys/user/getUserInfo`, + method: 'get', + response: (request: requestParams) => { + const token = getRequestToken(request); + if (!token) return resultError('Invalid token'); + const checkUser = createFakeUserList().find((item) => item.token === token); + if (!checkUser) { + return resultError('The corresponding user information was not obtained!'); + } + return resultSuccess(checkUser); + }, + }, + { + url: `${baseUrl}/sys/permission/getPermCode`, + timeout: 200, + method: 'get', + response: (request: requestParams) => { + const token = getRequestToken(request); + if (!token) return resultError('Invalid token'); + const checkUser = createFakeUserList().find((item) => item.token === token); + if (!checkUser) { + return resultError('Invalid token!'); + } + const codeList = fakeCodeList[checkUser.userId]; + + return resultSuccess(codeList); + }, + }, + { + url: `${baseUrl}/sys/logout`, + timeout: 200, + method: 'get', + response: (request: requestParams) => { + const token = getRequestToken(request); + if (!token) return resultError('Invalid token'); + const checkUser = createFakeUserList().find((item) => item.token === token); + if (!checkUser) { + return resultError('Invalid token!'); + } + return resultSuccess(undefined, { message: 'Token has been destroyed' }); + }, + }, + { + url: `${baseUrl}/sys/randomImage/1629428467008`, + timeout: 200, + method: 'get', + response: (request: requestParams) => { + const result = + 'data:image/jpg;base64,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'; + return resultSuccess(result); + }, + }, +] as MockMethod[]; diff --git a/npm b/npm new file mode 100644 index 0000000..e69de29 diff --git a/package.json b/package.json new file mode 100644 index 0000000..fb0c046 --- /dev/null +++ b/package.json @@ -0,0 +1,302 @@ +{ + "name": "chargin_pile", + "version": "3.5.1", + "author": { + "name": "jeecg", + "email": "jeecgos@163.com", + "url": "https://github.com/jeecgboot/jeecgboot-vue3" + }, + "scripts": { + "bootstrap": "npm install", + "serve": "npm run dev", + "dev": "vite", + "clean:cache": "rimraf node_modules/.cache/ && rimraf node_modules/.vite", + "clean:lib": "rimraf node_modules", + "build": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=8192 vite build && esno ./build/script/postBuild.ts", + "build:no-cache": "pnpm clean:cache && npm run build", + "report": "cross-env REPORT=true npm run build", + "type:check": "vue-tsc --noEmit --skipLibCheck", + "preview": "npm run build && vite preview", + "preview:dist": "vite preview", + "log": "conventional-changelog -p angular -i CHANGELOG.md -s", + "lint:eslint": "eslint --cache --max-warnings 0 \"{src,mock}/**/*.{vue,ts,tsx}\" --fix", + "lint:prettier": "prettier --write \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"", + "lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/", + "lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.js", + "lint:pretty": "pretty-quick --staged", + "test:unit": "jest", + "test:unit-coverage": "jest --coverage", + "test:gzip": "http-server dist --cors --gzip -c-1", + "test:br": "http-server dist --cors --brotli -c-1", + "reinstall": "rimraf pnpm-lock.yaml && yarn.lock && rimraf package.lock.json && rimraf node_modules && npm run bootstrap", + "prepare": "husky install", + "gen:icon": "esno ./build/generate/icon/index.ts" + }, + "dependencies": { + "@jeecg/online": "3.4.4-RC", + "@iconify/iconify": "^2.2.1", + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-vue": "^6.1.0", + "@logicflow/core": "^1.1.13", + "@logicflow/extension": "^1.1.13", + "@vue/shared": "^3.2.33", + "@vue/runtime-core": "^3.2.33", + "@vueuse/shared": "^8.3.0", + "@vueuse/core": "^8.3.0", + "@zxcvbn-ts/core": "^2.0.1", + "ant-design-vue": "^3.2.12", + "axios": "^0.26.1", + "china-area-data": "^5.0.1", + "clipboard": "^2.0.8", + "codemirror": "^5.65.3", + "cron-parser": "^3.5.0", + "cropperjs": "^1.5.12", + "crypto-js": "^4.1.1", + "dayjs": "^1.11.1", + "dom-align": "^1.12.2", + "echarts": "^5.3.2", + "emoji-mart-vue-fast": "^11.1.1", + "enquire.js": "^2.1.6", + "intro.js": "^5.1.0", + "lodash-es": "^4.17.21", + "lodash.get": "^4.4.2", + "md5": "^2.3.0", + "mockjs": "^1.1.0", + "nprogress": "^0.2.0", + "path-to-regexp": "^6.2.0", + "pinia": "2.0.12", + "print-js": "^1.6.0", + "pinyin-pro": "^3.11.0", + "qs": "^6.10.3", + "qrcode": "^1.5.0", + "qrcodejs2": "0.0.2", + "resize-observer-polyfill": "^1.5.1", + "showdown": "^2.1.0", + "sortablejs": "^1.15.0", + "tinymce": "^5.10.3", + "vditor": "^3.8.13", + "vue": "^3.2.33", + "vue-cropper": "^0.5.6", + "vue-cropperjs": "^5.0.0", + "vue-i18n": "^9.1.9", + "vue-infinite-scroll": "^2.0.2", + "vue-print-nb-jeecg": "^1.0.12", + "vue-router": "^4.0.14", + "vue-types": "^4.1.1", + "vuedraggable": "^4.1.0", + "vxe-table": "4.1.0", + "vxe-table-plugin-antd": "3.0.5", + "xe-utils": "^3.3.1", + "vue-json-pretty": "^2.0.6", + "xss": "^1.0.13" + }, + "devDependencies": { + "@commitlint/cli": "^16.2.3", + "@commitlint/config-conventional": "^16.2.1", + "@iconify/json": "^2.1.30", + "@purge-icons/generated": "^0.8.1", + "@types/codemirror": "^5.60.5", + "@types/crypto-js": "^4.1.1", + "@types/fs-extra": "^9.0.13", + "@types/inquirer": "^8.2.1", + "@types/intro.js": "^3.0.2", + "@types/jest": "^27.0.2", + "@types/lodash-es": "^4.17.6", + "@types/mockjs": "^1.0.6", + "@types/node": "^17.0.25", + "@types/nprogress": "^0.2.0", + "@types/qrcode": "^1.4.2", + "@types/qs": "^6.9.7", + "@types/pinyin": "^2.10.0", + "@types/showdown": "^1.9.4", + "@types/sortablejs": "^1.10.7", + "@typescript-eslint/eslint-plugin": "^5.20.0", + "@typescript-eslint/parser": "^5.20.0", + "@vitejs/plugin-legacy": "^2.0.0", + "@vitejs/plugin-vue": "^3.0.1", + "@vitejs/plugin-vue-jsx": "^1.3.10", + "@vue/compiler-sfc": "^3.2.33", + "@vue/test-utils": "^2.0.0-rc.21", + "autoprefixer": "^10.4.4", + "commitizen": "^4.2.4", + "conventional-changelog-cli": "^2.2.2", + "cross-env": "^7.0.3", + "cz-git": "^1.3.9", + "czg": "^1.3.9", + "dotenv": "^16.0.0", + "eslint": "^8.22.0", + "eslint-config-prettier": "^8.6.0", + "eslint-define-config": "^1.14.0", + "eslint-plugin-jest": "^27.2.1", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-vue": "^9.9.0", + "esno": "^0.14.1", + "fs-extra": "^10.1.0", + "http-server": "^14.0.0", + "husky": "^7.0.4", + "inquirer": "^8.2.2", + "is-ci": "^3.0.0", + "jest": "^27.3.1", + "less": "^4.1.2", + "lint-staged": "12.3.7", + "npm-run-all": "^4.1.5", + "picocolors": "^1.0.0", + "postcss": "^8.4.12", + "postcss-html": "^1.4.1", + "postcss-less": "^6.0.0", + "prettier": "^2.6.2", + "pretty-quick": "^3.1.1", + "rimraf": "^3.0.2", + "rollup": "^2.70.2", + "rollup-plugin-visualizer": "^5.6.0", + "stylelint": "^14.7.1", + "stylelint-config-prettier": "^9.0.3", + "stylelint-config-recommended": "^7.0.0", + "stylelint-config-recommended-vue": "^1.4.0", + "stylelint-config-standard": "^25.0.0", + "stylelint-order": "^5.0.0", + "ts-jest": "^27.0.7", + "ts-node": "^10.7.0", + "typescript": "^4.6.3", + "vite": "^3.0.2", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-html": "^3.2.0", + "vite-plugin-imagemin": "^0.6.1", + "vite-plugin-mkcert": "^1.10.1", + "vite-plugin-mock": "^2.9.6", + "vite-plugin-optimize-persist": "^0.1.2", + "vite-plugin-package-config": "^0.1.1", + "vite-plugin-purge-icons": "^0.8.2", + "vite-plugin-pwa": "^0.12.3", + "vite-plugin-style-import": "^2.0.0", + "vite-plugin-svg-icons": "^2.0.1", + "@rys-fe/vite-plugin-theme": "^0.8.6", + "vite-plugin-vue-setup-extend": "^0.4.0", + "vite-plugin-windicss": "^1.8.7", + "vue-eslint-parser": "^8.3.0", + "vue-tsc": "^0.33.9" + }, + "resolutions": { + "bin-wrapper": "npm:bin-wrapper-china", + "rollup": "^2.72.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/jeecgboot/jeecgboot-vue3.git" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/jeecgboot/jeecgboot-vue3/issues" + }, + "homepage": "https://github.com/jeecgboot/jeecgboot-vue3", + "engines": { + "node": "^12 || >=14" + }, + "vite": { + "optimizeDeps": { + "include": [ + "@ant-design/colors", + "@ant-design/icons-vue", + "@vueuse/core", + "@vueuse/shared", + "@zxcvbn-ts/core", + "ant-design-vue", + "axios", + "china-area-data", + "clipboard", + "codemirror", + "codemirror/addon/fold/brace-fold.js", + "codemirror/addon/fold/comment-fold.js", + "codemirror/addon/fold/foldcode.js", + "codemirror/addon/fold/foldgutter.js", + "codemirror/addon/fold/indent-fold.js", + "codemirror/addon/hint/anyword-hint.js", + "codemirror/addon/hint/show-hint.js", + "codemirror/addon/selection/active-line.js", + "codemirror/mode/clike/clike.js", + "codemirror/mode/css/css.js", + "codemirror/mode/javascript/javascript.js", + "codemirror/mode/markdown/markdown.js", + "codemirror/mode/python/python.js", + "codemirror/mode/r/r.js", + "codemirror/mode/shell/shell.js", + "codemirror/mode/sql/sql.js", + "codemirror/mode/swift/swift.js", + "codemirror/mode/vue/vue.js", + "codemirror/mode/xml/xml.js", + "cron-parser", + "cropperjs", + "crypto-js/aes", + "crypto-js/enc-base64", + "crypto-js/enc-utf8", + "crypto-js/md5", + "crypto-js/mode-ecb", + "crypto-js/pad-pkcs7", + "dom-align", + "echarts", + "echarts/charts", + "echarts/components", + "echarts/core", + "echarts/renderers", + "emoji-mart-vue-fast/src", + "intro.js", + "lodash-es", + "md5", + "nprogress", + "path-to-regexp", + "pinia", + "print-js", + "qrcode", + "qs", + "resize-observer-polyfill", + "showdown", + "sortablejs", + "tinymce/icons/default/icons", + "tinymce/plugins/advlist", + "tinymce/plugins/anchor", + "tinymce/plugins/autolink", + "tinymce/plugins/autosave", + "tinymce/plugins/code", + "tinymce/plugins/codesample", + "tinymce/plugins/contextmenu", + "tinymce/plugins/directionality", + "tinymce/plugins/fullscreen", + "tinymce/plugins/hr", + "tinymce/plugins/image", + "tinymce/plugins/insertdatetime", + "tinymce/plugins/link", + "tinymce/plugins/lists", + "tinymce/plugins/media", + "tinymce/plugins/nonbreaking", + "tinymce/plugins/noneditable", + "tinymce/plugins/pagebreak", + "tinymce/plugins/paste", + "tinymce/plugins/preview", + "tinymce/plugins/print", + "tinymce/plugins/save", + "tinymce/plugins/searchreplace", + "tinymce/plugins/spellchecker", + "tinymce/plugins/tabfocus", + "tinymce/plugins/table", + "tinymce/plugins/template", + "tinymce/plugins/textcolor", + "tinymce/plugins/textpattern", + "tinymce/plugins/visualblocks", + "tinymce/plugins/visualchars", + "tinymce/plugins/wordcount", + "tinymce/themes/silver", + "tinymce/tinymce", + "vditor", + "vue", + "vue-i18n", + "vue-print-nb-jeecg/src/printarea", + "vue-router", + "vue-types", + "vxe-table", + "vxe-table-plugin-antd", + "xe-utils", + "xss" + ] + } + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..837c7ae --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,16804 @@ +lockfileVersion: 5.4 + +overrides: + bin-wrapper: npm:bin-wrapper-china + rollup: ^2.72.0 + +specifiers: + '@ant-design/colors': ^6.0.0 + '@ant-design/icons-vue': ^6.1.0 + '@commitlint/cli': ^16.2.3 + '@commitlint/config-conventional': ^16.2.1 + '@iconify/iconify': ^2.2.1 + '@iconify/json': ^2.1.30 + '@jeecg/online': 3.4.4-RC + '@logicflow/core': ^1.1.13 + '@logicflow/extension': ^1.1.13 + '@purge-icons/generated': ^0.8.1 + '@rys-fe/vite-plugin-theme': ^0.8.6 + '@types/codemirror': ^5.60.5 + '@types/crypto-js': ^4.1.1 + '@types/fs-extra': ^9.0.13 + '@types/inquirer': ^8.2.1 + '@types/intro.js': ^3.0.2 + '@types/jest': ^27.0.2 + '@types/lodash-es': ^4.17.6 + '@types/mockjs': ^1.0.6 + '@types/node': ^17.0.25 + '@types/nprogress': ^0.2.0 + '@types/pinyin': ^2.10.0 + '@types/qrcode': ^1.4.2 + '@types/qs': ^6.9.7 + '@types/showdown': ^1.9.4 + '@types/sortablejs': ^1.10.7 + '@typescript-eslint/eslint-plugin': ^5.20.0 + '@typescript-eslint/parser': ^5.20.0 + '@vitejs/plugin-legacy': ^2.0.0 + '@vitejs/plugin-vue': ^3.0.1 + '@vitejs/plugin-vue-jsx': ^1.3.10 + '@vue/compiler-sfc': ^3.2.33 + '@vue/runtime-core': ^3.2.33 + '@vue/shared': ^3.2.33 + '@vue/test-utils': ^2.0.0-rc.21 + '@vueuse/core': ^8.3.0 + '@vueuse/shared': ^8.3.0 + '@zxcvbn-ts/core': ^2.0.1 + ant-design-vue: ^3.2.12 + autoprefixer: ^10.4.4 + axios: ^0.26.1 + china-area-data: ^5.0.1 + clipboard: ^2.0.8 + codemirror: ^5.65.3 + commitizen: ^4.2.4 + conventional-changelog-cli: ^2.2.2 + cron-parser: ^3.5.0 + cropperjs: ^1.5.12 + cross-env: ^7.0.3 + crypto-js: ^4.1.1 + cz-git: ^1.3.9 + czg: ^1.3.9 + dayjs: ^1.11.1 + dom-align: ^1.12.2 + dotenv: ^16.0.0 + echarts: ^5.3.2 + emoji-mart-vue-fast: ^11.1.1 + enquire.js: ^2.1.6 + eslint: ^8.13.0 + eslint-config-prettier: ^8.5.0 + eslint-define-config: ^1.1.1 + eslint-plugin-jest: ^25.2.2 + eslint-plugin-prettier: ^4.0.0 + eslint-plugin-vue: ^8.6.0 + esno: ^0.14.1 + fs-extra: ^10.1.0 + http-server: ^14.0.0 + husky: ^7.0.4 + inquirer: ^8.2.2 + intro.js: ^5.1.0 + is-ci: ^3.0.0 + jest: ^27.3.1 + less: ^4.1.2 + lint-staged: 12.3.7 + lodash-es: ^4.17.21 + lodash.get: ^4.4.2 + md5: ^2.3.0 + mockjs: ^1.1.0 + npm-run-all: ^4.1.5 + nprogress: ^0.2.0 + path-to-regexp: ^6.2.0 + picocolors: ^1.0.0 + pinia: 2.0.12 + pinyin-pro: ^3.11.0 + postcss: ^8.4.12 + postcss-html: ^1.4.1 + postcss-less: ^6.0.0 + prettier: ^2.6.2 + pretty-quick: ^3.1.1 + print-js: ^1.6.0 + qrcode: ^1.5.0 + qrcodejs2: 0.0.2 + qs: ^6.10.3 + resize-observer-polyfill: ^1.5.1 + rimraf: ^3.0.2 + rollup: ^2.72.0 + rollup-plugin-visualizer: ^5.6.0 + showdown: ^2.1.0 + sortablejs: ^1.15.0 + stylelint: ^14.7.1 + stylelint-config-prettier: ^9.0.3 + stylelint-config-recommended: ^7.0.0 + stylelint-config-recommended-vue: ^1.4.0 + stylelint-config-standard: ^25.0.0 + stylelint-order: ^5.0.0 + tinymce: ^5.10.3 + ts-jest: ^27.0.7 + ts-node: ^10.7.0 + typescript: ^4.6.3 + vditor: ^3.8.13 + vite: ^3.0.2 + vite-plugin-compression: ^0.5.1 + vite-plugin-html: ^3.2.0 + vite-plugin-imagemin: ^0.6.1 + vite-plugin-mkcert: ^1.10.1 + vite-plugin-mock: ^2.9.6 + vite-plugin-optimize-persist: ^0.1.2 + vite-plugin-package-config: ^0.1.1 + vite-plugin-purge-icons: ^0.8.2 + vite-plugin-pwa: ^0.12.3 + vite-plugin-style-import: ^2.0.0 + vite-plugin-svg-icons: ^2.0.1 + vite-plugin-vue-setup-extend: ^0.4.0 + vite-plugin-windicss: ^1.8.7 + vue: ^3.2.33 + vue-cropper: ^0.5.6 + vue-cropperjs: ^5.0.0 + vue-eslint-parser: ^8.3.0 + vue-i18n: ^9.1.9 + vue-infinite-scroll: ^2.0.2 + vue-json-pretty: ^2.0.6 + vue-print-nb-jeecg: ^1.0.10 + vue-router: ^4.0.14 + vue-tsc: ^0.33.9 + vue-types: ^4.1.1 + vuedraggable: ^4.1.0 + vxe-table: 4.1.0 + vxe-table-plugin-antd: 3.0.5 + xe-utils: ^3.3.1 + xss: ^1.0.13 + +dependencies: + '@ant-design/colors': registry.npmmirror.com/@ant-design/colors/6.0.0 + '@ant-design/icons-vue': registry.npmmirror.com/@ant-design/icons-vue/6.1.0_vue@3.2.47 + '@iconify/iconify': registry.npmmirror.com/@iconify/iconify/2.2.1 + '@logicflow/core': registry.npmmirror.com/@logicflow/core/1.1.31 + '@logicflow/extension': registry.npmmirror.com/@logicflow/extension/1.1.31 + '@vue/runtime-core': registry.npmmirror.com/@vue/runtime-core/3.2.47 + '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.47 + '@vueuse/core': registry.npmmirror.com/@vueuse/core/8.9.4_vue@3.2.47 + '@vueuse/shared': registry.npmmirror.com/@vueuse/shared/8.9.4_vue@3.2.47 + '@zxcvbn-ts/core': registry.npmmirror.com/@zxcvbn-ts/core/2.2.1 + ant-design-vue: registry.npmmirror.com/ant-design-vue/3.2.15_vue@3.2.47 + axios: registry.npmmirror.com/axios/0.26.1 + china-area-data: registry.npmmirror.com/china-area-data/5.0.1 + clipboard: registry.npmmirror.com/clipboard/2.0.11 + codemirror: registry.npmmirror.com/codemirror/5.65.12 + cron-parser: registry.npmmirror.com/cron-parser/3.5.0 + cropperjs: registry.npmmirror.com/cropperjs/1.5.13 + crypto-js: registry.npmmirror.com/crypto-js/4.1.1 + dayjs: registry.npmmirror.com/dayjs/1.11.7 + dom-align: registry.npmmirror.com/dom-align/1.12.4 + echarts: registry.npmmirror.com/echarts/5.4.1 + emoji-mart-vue-fast: registry.npmmirror.com/emoji-mart-vue-fast/11.2.0_vue@3.2.47 + enquire.js: registry.npmmirror.com/enquire.js/2.1.6 + intro.js: registry.npmmirror.com/intro.js/5.1.0 + lodash-es: registry.npmmirror.com/lodash-es/4.17.21 + lodash.get: registry.npmmirror.com/lodash.get/4.4.2 + md5: registry.npmmirror.com/md5/2.3.0 + mockjs: registry.npmmirror.com/mockjs/1.1.0 + nprogress: registry.npmmirror.com/nprogress/0.2.0 + path-to-regexp: registry.npmmirror.com/path-to-regexp/6.2.1 + pinia: registry.npmmirror.com/pinia/2.0.12_hmuptsblhheur2tugfgucj7gc4 + pinyin-pro: registry.npmmirror.com/pinyin-pro/3.13.1 + print-js: registry.npmmirror.com/print-js/1.6.0 + qrcode: registry.npmmirror.com/qrcode/1.5.1 + qrcodejs2: registry.npmmirror.com/qrcodejs2/0.0.2 + qs: registry.npmmirror.com/qs/6.11.0 + resize-observer-polyfill: registry.npmmirror.com/resize-observer-polyfill/1.5.1 + showdown: registry.npmmirror.com/showdown/2.1.0 + sortablejs: registry.npmmirror.com/sortablejs/1.15.0 + tinymce: registry.npmmirror.com/tinymce/5.10.7 + vditor: registry.npmmirror.com/vditor/3.9.0 + vue: registry.npmmirror.com/vue/3.2.47 + vue-cropper: registry.npmmirror.com/vue-cropper/0.5.8 + vue-cropperjs: registry.npmmirror.com/vue-cropperjs/5.0.0_vue@3.2.47 + vue-i18n: registry.npmmirror.com/vue-i18n/9.2.2_vue@3.2.47 + vue-infinite-scroll: registry.npmmirror.com/vue-infinite-scroll/2.0.2 + vue-json-pretty: registry.npmmirror.com/vue-json-pretty/2.2.3_vue@3.2.47 + vue-print-nb-jeecg: registry.npmmirror.com/vue-print-nb-jeecg/1.0.11 + vue-router: registry.npmmirror.com/vue-router/4.1.6_vue@3.2.47 + vue-types: registry.npmmirror.com/vue-types/4.2.1_vue@3.2.47 + vuedraggable: registry.npmmirror.com/vuedraggable/4.1.0_vue@3.2.47 + vxe-table: registry.npmmirror.com/vxe-table/4.1.0_vue@3.2.47+xe-utils@3.5.7 + vxe-table-plugin-antd: registry.npmmirror.com/vxe-table-plugin-antd/3.0.5_vxe-table@4.1.0 + xe-utils: registry.npmmirror.com/xe-utils/3.5.7 + xss: registry.npmmirror.com/xss/1.0.14 + +devDependencies: + '@commitlint/cli': registry.npmmirror.com/@commitlint/cli/16.3.0 + '@commitlint/config-conventional': registry.npmmirror.com/@commitlint/config-conventional/16.2.4 + '@iconify/json': registry.npmmirror.com/@iconify/json/2.2.30 + '@jeecg/online': registry.npmmirror.com/@jeecg/online/3.4.4-RC + '@purge-icons/generated': registry.npmmirror.com/@purge-icons/generated/0.8.1 + '@rys-fe/vite-plugin-theme': registry.npmmirror.com/@rys-fe/vite-plugin-theme/0.8.6_vite@3.2.5 + '@types/codemirror': registry.npmmirror.com/@types/codemirror/5.60.7 + '@types/crypto-js': registry.npmmirror.com/@types/crypto-js/4.1.1 + '@types/fs-extra': registry.npmmirror.com/@types/fs-extra/9.0.13 + '@types/inquirer': registry.npmmirror.com/@types/inquirer/8.2.6 + '@types/intro.js': registry.npmmirror.com/@types/intro.js/3.0.2 + '@types/jest': registry.npmmirror.com/@types/jest/27.5.2 + '@types/lodash-es': registry.npmmirror.com/@types/lodash-es/4.17.6 + '@types/mockjs': registry.npmmirror.com/@types/mockjs/1.0.7 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + '@types/nprogress': registry.npmmirror.com/@types/nprogress/0.2.0 + '@types/pinyin': registry.npmmirror.com/@types/pinyin/2.10.0 + '@types/qrcode': registry.npmmirror.com/@types/qrcode/1.5.0 + '@types/qs': registry.npmmirror.com/@types/qs/6.9.7 + '@types/showdown': registry.npmmirror.com/@types/showdown/1.9.4 + '@types/sortablejs': registry.npmmirror.com/@types/sortablejs/1.15.0 + '@typescript-eslint/eslint-plugin': registry.npmmirror.com/@typescript-eslint/eslint-plugin/5.54.0_6mj2wypvdnknez7kws2nfdgupi + '@typescript-eslint/parser': registry.npmmirror.com/@typescript-eslint/parser/5.54.0_ycpbpc6yetojsgtrx3mwntkhsu + '@vitejs/plugin-legacy': registry.npmmirror.com/@vitejs/plugin-legacy/2.3.1_vite@3.2.5 + '@vitejs/plugin-vue': registry.npmmirror.com/@vitejs/plugin-vue/3.2.0_vite@3.2.5+vue@3.2.47 + '@vitejs/plugin-vue-jsx': registry.npmmirror.com/@vitejs/plugin-vue-jsx/1.3.10 + '@vue/compiler-sfc': registry.npmmirror.com/@vue/compiler-sfc/3.2.47 + '@vue/test-utils': registry.npmmirror.com/@vue/test-utils/2.3.0_vue@3.2.47 + autoprefixer: registry.npmmirror.com/autoprefixer/10.4.13_postcss@8.4.21 + commitizen: registry.npmmirror.com/commitizen/4.3.0 + conventional-changelog-cli: registry.npmmirror.com/conventional-changelog-cli/2.2.2 + cross-env: registry.npmmirror.com/cross-env/7.0.3 + cz-git: registry.npmmirror.com/cz-git/1.5.1 + czg: registry.npmmirror.com/czg/1.5.1 + dotenv: registry.npmmirror.com/dotenv/16.0.3 + eslint: registry.npmmirror.com/eslint/8.35.0 + eslint-config-prettier: registry.npmmirror.com/eslint-config-prettier/8.6.0_eslint@8.35.0 + eslint-define-config: registry.npmmirror.com/eslint-define-config/1.15.0 + eslint-plugin-jest: registry.npmmirror.com/eslint-plugin-jest/25.7.0_npuaqhfkjgus3nqfbgjmqmizqa + eslint-plugin-prettier: registry.npmmirror.com/eslint-plugin-prettier/4.2.1_u2zha4kiojzs42thzpgwygphmy + eslint-plugin-vue: registry.npmmirror.com/eslint-plugin-vue/8.7.1_eslint@8.35.0 + esno: registry.npmmirror.com/esno/0.14.1 + fs-extra: registry.npmmirror.com/fs-extra/10.1.0 + http-server: registry.npmmirror.com/http-server/14.1.1 + husky: registry.npmmirror.com/husky/7.0.4 + inquirer: registry.npmmirror.com/inquirer/8.2.5 + is-ci: registry.npmmirror.com/is-ci/3.0.1 + jest: registry.npmmirror.com/jest/27.5.1_ts-node@10.9.1 + less: registry.npmmirror.com/less/4.1.3 + lint-staged: registry.npmmirror.com/lint-staged/12.3.7 + npm-run-all: registry.npmmirror.com/npm-run-all/4.1.5 + picocolors: registry.npmmirror.com/picocolors/1.0.0 + postcss: registry.npmmirror.com/postcss/8.4.21 + postcss-html: registry.npmmirror.com/postcss-html/1.5.0 + postcss-less: registry.npmmirror.com/postcss-less/6.0.0_postcss@8.4.21 + prettier: registry.npmmirror.com/prettier/2.8.4 + pretty-quick: registry.npmmirror.com/pretty-quick/3.1.3_prettier@2.8.4 + rimraf: registry.npmmirror.com/rimraf/3.0.2 + rollup: registry.npmmirror.com/rollup/2.79.1 + rollup-plugin-visualizer: registry.npmmirror.com/rollup-plugin-visualizer/5.9.0_rollup@2.79.1 + stylelint: registry.npmmirror.com/stylelint/14.16.1 + stylelint-config-prettier: registry.npmmirror.com/stylelint-config-prettier/9.0.5_stylelint@14.16.1 + stylelint-config-recommended: registry.npmmirror.com/stylelint-config-recommended/7.0.0_stylelint@14.16.1 + stylelint-config-recommended-vue: registry.npmmirror.com/stylelint-config-recommended-vue/1.4.0_kbto3rg3njmczth2rrsgfnlsqa + stylelint-config-standard: registry.npmmirror.com/stylelint-config-standard/25.0.0_stylelint@14.16.1 + stylelint-order: registry.npmmirror.com/stylelint-order/5.0.0_stylelint@14.16.1 + ts-jest: registry.npmmirror.com/ts-jest/27.1.5_n4jzo3ixy42kfaqevs43wjx5ui + ts-node: registry.npmmirror.com/ts-node/10.9.1_cin3sed6ohfsopbmt6orxeb4o4 + typescript: registry.npmmirror.com/typescript/4.9.5 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + vite-plugin-compression: registry.npmmirror.com/vite-plugin-compression/0.5.1_vite@3.2.5 + vite-plugin-html: registry.npmmirror.com/vite-plugin-html/3.2.0_vite@3.2.5 + vite-plugin-imagemin: registry.npmmirror.com/vite-plugin-imagemin/0.6.1_vite@3.2.5 + vite-plugin-mkcert: registry.npmmirror.com/vite-plugin-mkcert/1.13.3_vite@3.2.5 + vite-plugin-mock: registry.npmmirror.com/vite-plugin-mock/2.9.6_umj7dnwtpamrulvvz5fh6e7doq + vite-plugin-optimize-persist: registry.npmmirror.com/vite-plugin-optimize-persist/0.1.2_hixcczfrsvi4wedfdfr7z5co24 + vite-plugin-package-config: registry.npmmirror.com/vite-plugin-package-config/0.1.1_vite@3.2.5 + vite-plugin-purge-icons: registry.npmmirror.com/vite-plugin-purge-icons/0.8.2_vite@3.2.5 + vite-plugin-pwa: registry.npmmirror.com/vite-plugin-pwa/0.12.8_vite@3.2.5 + vite-plugin-style-import: registry.npmmirror.com/vite-plugin-style-import/2.0.0_vite@3.2.5 + vite-plugin-svg-icons: registry.npmmirror.com/vite-plugin-svg-icons/2.0.1_vite@3.2.5 + vite-plugin-vue-setup-extend: registry.npmmirror.com/vite-plugin-vue-setup-extend/0.4.0_vite@3.2.5 + vite-plugin-windicss: registry.npmmirror.com/vite-plugin-windicss/1.8.10_vite@3.2.5 + vue-eslint-parser: registry.npmmirror.com/vue-eslint-parser/8.3.0_eslint@8.35.0 + vue-tsc: registry.npmmirror.com/vue-tsc/0.33.9_typescript@4.9.5 + +packages: + + registry.npmmirror.com/@ampproject/remapping/2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz} + name: '@ampproject/remapping' + version: 2.2.0 + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping/0.1.1 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping/0.3.17 + dev: true + + registry.npmmirror.com/@ant-design/colors/6.0.0: + resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ant-design/colors/-/colors-6.0.0.tgz} + name: '@ant-design/colors' + version: 6.0.0 + dependencies: + '@ctrl/tinycolor': registry.npmmirror.com/@ctrl/tinycolor/3.6.0 + dev: false + + registry.npmmirror.com/@ant-design/icons-svg/4.2.1: + resolution: {integrity: sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz} + name: '@ant-design/icons-svg' + version: 4.2.1 + dev: false + + registry.npmmirror.com/@ant-design/icons-vue/6.1.0_vue@3.2.47: + resolution: {integrity: sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz} + id: registry.npmmirror.com/@ant-design/icons-vue/6.1.0 + name: '@ant-design/icons-vue' + version: 6.1.0 + peerDependencies: + vue: '>=3.0.3' + dependencies: + '@ant-design/colors': registry.npmmirror.com/@ant-design/colors/6.0.0 + '@ant-design/icons-svg': registry.npmmirror.com/@ant-design/icons-svg/4.2.1 + vue: registry.npmmirror.com/vue/3.2.47 + dev: false + + registry.npmmirror.com/@antfu/utils/0.7.2: + resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.2.tgz} + name: '@antfu/utils' + version: 0.7.2 + dev: true + + registry.npmmirror.com/@apideck/better-ajv-errors/0.3.6_ajv@8.12.0: + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz} + id: registry.npmmirror.com/@apideck/better-ajv-errors/0.3.6 + name: '@apideck/better-ajv-errors' + version: 0.3.6 + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + dependencies: + ajv: registry.npmmirror.com/ajv/8.12.0 + json-schema: registry.npmmirror.com/json-schema/0.4.0 + jsonpointer: registry.npmmirror.com/jsonpointer/5.0.1 + leven: registry.npmmirror.com/leven/3.1.0 + dev: true + + registry.npmmirror.com/@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz} + name: '@babel/code-frame' + version: 7.18.6 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': registry.npmmirror.com/@babel/highlight/7.18.6 + dev: true + + registry.npmmirror.com/@babel/compat-data/7.21.0: + resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.21.0.tgz} + name: '@babel/compat-data' + version: 7.21.0 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/core/7.21.0: + resolution: {integrity: sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/core/-/core-7.21.0.tgz} + name: '@babel/core' + version: 7.21.0 + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': registry.npmmirror.com/@ampproject/remapping/2.2.0 + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6 + '@babel/generator': registry.npmmirror.com/@babel/generator/7.21.1 + '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0 + '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms/7.21.2 + '@babel/helpers': registry.npmmirror.com/@babel/helpers/7.21.0 + '@babel/parser': registry.npmmirror.com/@babel/parser/7.21.2 + '@babel/template': registry.npmmirror.com/@babel/template/7.20.7 + '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.21.2 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + convert-source-map: registry.npmmirror.com/convert-source-map/1.9.0 + debug: registry.npmmirror.com/debug/4.3.4 + gensync: registry.npmmirror.com/gensync/1.0.0-beta.2 + json5: registry.npmmirror.com/json5/2.2.3 + semver: registry.npmmirror.com/semver/6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/generator/7.21.1: + resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/generator/-/generator-7.21.1.tgz} + name: '@babel/generator' + version: 7.21.1 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping/0.3.2 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping/0.3.17 + jsesc: registry.npmmirror.com/jsesc/2.5.2 + dev: true + + registry.npmmirror.com/@babel/helper-annotate-as-pure/7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz} + name: '@babel/helper-annotate-as-pure' + version: 7.18.6 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: + resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz} + name: '@babel/helper-builder-binary-assignment-operator-visitor' + version: 7.18.9 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-explode-assignable-expression': registry.npmmirror.com/@babel/helper-explode-assignable-expression/7.18.6 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz} + id: registry.npmmirror.com/@babel/helper-compilation-targets/7.20.7 + name: '@babel/helper-compilation-targets' + version: 7.20.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': registry.npmmirror.com/@babel/compat-data/7.21.0 + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-validator-option': registry.npmmirror.com/@babel/helper-validator-option/7.21.0 + browserslist: registry.npmmirror.com/browserslist/4.21.5 + lru-cache: registry.npmmirror.com/lru-cache/5.1.1 + semver: registry.npmmirror.com/semver/6.3.0 + dev: true + + registry.npmmirror.com/@babel/helper-create-class-features-plugin/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz} + id: registry.npmmirror.com/@babel/helper-create-class-features-plugin/7.21.0 + name: '@babel/helper-create-class-features-plugin' + version: 7.21.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-annotate-as-pure': registry.npmmirror.com/@babel/helper-annotate-as-pure/7.18.6 + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9 + '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name/7.21.0 + '@babel/helper-member-expression-to-functions': registry.npmmirror.com/@babel/helper-member-expression-to-functions/7.21.0 + '@babel/helper-optimise-call-expression': registry.npmmirror.com/@babel/helper-optimise-call-expression/7.18.6 + '@babel/helper-replace-supers': registry.npmmirror.com/@babel/helper-replace-supers/7.20.7 + '@babel/helper-skip-transparent-expression-wrappers': registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/7.20.0 + '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration/7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz} + id: registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/7.21.0 + name: '@babel/helper-create-regexp-features-plugin' + version: 7.21.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-annotate-as-pure': registry.npmmirror.com/@babel/helper-annotate-as-pure/7.18.6 + regexpu-core: registry.npmmirror.com/regexpu-core/5.3.1 + dev: true + + registry.npmmirror.com/@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.0: + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz} + id: registry.npmmirror.com/@babel/helper-define-polyfill-provider/0.3.3 + name: '@babel/helper-define-polyfill-provider' + version: 0.3.3 + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + debug: registry.npmmirror.com/debug/4.3.4 + lodash.debounce: registry.npmmirror.com/lodash.debounce/4.0.8 + resolve: registry.npmmirror.com/resolve/1.22.1 + semver: registry.npmmirror.com/semver/6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz} + name: '@babel/helper-environment-visitor' + version: 7.18.9 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/helper-explode-assignable-expression/7.18.6: + resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz} + name: '@babel/helper-explode-assignable-expression' + version: 7.18.6 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@babel/helper-function-name/7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz} + name: '@babel/helper-function-name' + version: 7.21.0 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': registry.npmmirror.com/@babel/template/7.20.7 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz} + name: '@babel/helper-hoist-variables' + version: 7.18.6 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@babel/helper-member-expression-to-functions/7.21.0: + resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz} + name: '@babel/helper-member-expression-to-functions' + version: 7.21.0 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@babel/helper-module-imports/7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz} + name: '@babel/helper-module-imports' + version: 7.18.6 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@babel/helper-module-transforms/7.21.2: + resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz} + name: '@babel/helper-module-transforms' + version: 7.21.2 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9 + '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports/7.18.6 + '@babel/helper-simple-access': registry.npmmirror.com/@babel/helper-simple-access/7.20.2 + '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration/7.18.6 + '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier/7.19.1 + '@babel/template': registry.npmmirror.com/@babel/template/7.20.7 + '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.21.2 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/helper-optimise-call-expression/7.18.6: + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz} + name: '@babel/helper-optimise-call-expression' + version: 7.18.6 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2: + resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz} + name: '@babel/helper-plugin-utils' + version: 7.20.2 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.21.0: + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz} + id: registry.npmmirror.com/@babel/helper-remap-async-to-generator/7.18.9 + name: '@babel/helper-remap-async-to-generator' + version: 7.18.9 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-annotate-as-pure': registry.npmmirror.com/@babel/helper-annotate-as-pure/7.18.6 + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9 + '@babel/helper-wrap-function': registry.npmmirror.com/@babel/helper-wrap-function/7.20.5 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/helper-replace-supers/7.20.7: + resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz} + name: '@babel/helper-replace-supers' + version: 7.20.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9 + '@babel/helper-member-expression-to-functions': registry.npmmirror.com/@babel/helper-member-expression-to-functions/7.21.0 + '@babel/helper-optimise-call-expression': registry.npmmirror.com/@babel/helper-optimise-call-expression/7.18.6 + '@babel/template': registry.npmmirror.com/@babel/template/7.20.7 + '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.21.2 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/helper-simple-access/7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz} + name: '@babel/helper-simple-access' + version: 7.20.2 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/7.20.0: + resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz} + name: '@babel/helper-skip-transparent-expression-wrappers' + version: 7.20.0 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz} + name: '@babel/helper-split-export-declaration' + version: 7.18.6 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz} + name: '@babel/helper-string-parser' + version: 7.19.4 + engines: {node: '>=6.9.0'} + + registry.npmmirror.com/@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz} + name: '@babel/helper-validator-identifier' + version: 7.19.1 + engines: {node: '>=6.9.0'} + + registry.npmmirror.com/@babel/helper-validator-option/7.21.0: + resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz} + name: '@babel/helper-validator-option' + version: 7.21.0 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/helper-wrap-function/7.20.5: + resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz} + name: '@babel/helper-wrap-function' + version: 7.20.5 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name/7.21.0 + '@babel/template': registry.npmmirror.com/@babel/template/7.20.7 + '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.21.2 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/helpers/7.21.0: + resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helpers/-/helpers-7.21.0.tgz} + name: '@babel/helpers' + version: 7.21.0 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': registry.npmmirror.com/@babel/template/7.20.7 + '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.21.2 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz} + name: '@babel/highlight' + version: 7.18.6 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier/7.19.1 + chalk: registry.npmmirror.com/chalk/2.4.2 + js-tokens: registry.npmmirror.com/js-tokens/4.0.0 + dev: true + + registry.npmmirror.com/@babel/parser/7.21.2: + resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/parser/-/parser-7.21.2.tgz} + name: '@babel/parser' + version: 7.21.2 + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + + registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6 + name: '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz} + id: registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7 + name: '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining' + version: 7.20.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/7.20.0 + '@babel/plugin-proposal-optional-chaining': registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.21.0 + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/7.20.7 + name: '@babel/plugin-proposal-async-generator-functions' + version: 7.20.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/helper-remap-async-to-generator': registry.npmmirror.com/@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.21.0 + '@babel/plugin-syntax-async-generators': registry.npmmirror.com/@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-class-properties/7.18.6 + name: '@babel/plugin-proposal-class-properties' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-create-class-features-plugin': registry.npmmirror.com/@babel/helper-create-class-features-plugin/7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-class-static-block/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-class-static-block/7.21.0 + name: '@babel/plugin-proposal-class-static-block' + version: 7.21.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-create-class-features-plugin': registry.npmmirror.com/@babel/helper-create-class-features-plugin/7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/plugin-syntax-class-static-block': registry.npmmirror.com/@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/7.18.6 + name: '@babel/plugin-proposal-dynamic-import' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/plugin-syntax-dynamic-import': registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.21.0 + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.21.0: + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/7.18.9 + name: '@babel/plugin-proposal-export-namespace-from' + version: 7.18.9 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/plugin-syntax-export-namespace-from': registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.21.0 + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-json-strings/7.18.6 + name: '@babel/plugin-proposal-json-strings' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/plugin-syntax-json-strings': registry.npmmirror.com/@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.0 + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/7.20.7 + name: '@babel/plugin-proposal-logical-assignment-operators' + version: 7.20.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.0 + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/7.18.6 + name: '@babel/plugin-proposal-nullish-coalescing-operator' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/plugin-syntax-nullish-coalescing-operator': registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.0 + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/7.18.6 + name: '@babel/plugin-proposal-numeric-separator' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/plugin-syntax-numeric-separator': registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.0 + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/7.20.7 + name: '@babel/plugin-proposal-object-rest-spread' + version: 7.20.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': registry.npmmirror.com/@babel/compat-data/7.21.0 + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/plugin-syntax-object-rest-spread': registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.0 + '@babel/plugin-transform-parameters': registry.npmmirror.com/@babel/plugin-transform-parameters/7.20.7_@babel+core@7.21.0 + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/7.18.6 + name: '@babel/plugin-proposal-optional-catch-binding' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/plugin-syntax-optional-catch-binding': registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.0 + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/7.21.0 + name: '@babel/plugin-proposal-optional-chaining' + version: 7.21.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/7.20.0 + '@babel/plugin-syntax-optional-chaining': registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.0 + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-private-methods/7.18.6 + name: '@babel/plugin-proposal-private-methods' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-create-class-features-plugin': registry.npmmirror.com/@babel/helper-create-class-features-plugin/7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/7.21.0 + name: '@babel/plugin-proposal-private-property-in-object' + version: 7.21.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-annotate-as-pure': registry.npmmirror.com/@babel/helper-annotate-as-pure/7.18.6 + '@babel/helper-create-class-features-plugin': registry.npmmirror.com/@babel/helper-create-class-features-plugin/7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/plugin-syntax-private-property-in-object': registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/7.18.6 + name: '@babel/plugin-proposal-unicode-property-regex' + version: 7.18.6 + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-create-regexp-features-plugin': registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.0: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-async-generators/7.8.4 + name: '@babel/plugin-syntax-async-generators' + version: 7.8.4 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-bigint/7.8.3 + name: '@babel/plugin-syntax-bigint' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.0: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-class-properties/7.12.13 + name: '@babel/plugin-syntax-class-properties' + version: 7.12.13 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.21.0: + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-class-static-block/7.14.5 + name: '@babel/plugin-syntax-class-static-block' + version: 7.14.5 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/7.8.3 + name: '@babel/plugin-syntax-dynamic-import' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/7.8.3 + name: '@babel/plugin-syntax-export-namespace-from' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.21.0: + resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-import-assertions/7.20.0 + name: '@babel/plugin-syntax-import-assertions' + version: 7.20.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.21.0: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-import-meta/7.10.4 + name: '@babel/plugin-syntax-import-meta' + version: 7.10.4 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-json-strings/7.8.3 + name: '@babel/plugin-syntax-json-strings' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-jsx/7.18.6 + name: '@babel/plugin-syntax-jsx' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.0: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/7.10.4 + name: '@babel/plugin-syntax-logical-assignment-operators' + version: 7.10.4 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3 + name: '@babel/plugin-syntax-nullish-coalescing-operator' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.0: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/7.10.4 + name: '@babel/plugin-syntax-numeric-separator' + version: 7.10.4 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/7.8.3 + name: '@babel/plugin-syntax-object-rest-spread' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/7.8.3 + name: '@babel/plugin-syntax-optional-catch-binding' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/7.8.3 + name: '@babel/plugin-syntax-optional-chaining' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.21.0: + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/7.14.5 + name: '@babel/plugin-syntax-private-property-in-object' + version: 7.14.5 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.0: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-top-level-await/7.14.5 + name: '@babel/plugin-syntax-top-level-await' + version: 7.14.5 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.21.0: + resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-typescript/7.20.0 + name: '@babel/plugin-syntax-typescript' + version: 7.20.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-arrow-functions/7.20.7 + name: '@babel/plugin-transform-arrow-functions' + version: 7.20.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-async-to-generator/7.20.7 + name: '@babel/plugin-transform-async-to-generator' + version: 7.20.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports/7.18.6 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/helper-remap-async-to-generator': registry.npmmirror.com/@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/7.18.6 + name: '@babel/plugin-transform-block-scoped-functions' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-block-scoping/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-block-scoping/7.21.0 + name: '@babel/plugin-transform-block-scoping' + version: 7.21.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-classes/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-classes/7.21.0 + name: '@babel/plugin-transform-classes' + version: 7.21.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-annotate-as-pure': registry.npmmirror.com/@babel/helper-annotate-as-pure/7.18.6 + '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0 + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9 + '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name/7.21.0 + '@babel/helper-optimise-call-expression': registry.npmmirror.com/@babel/helper-optimise-call-expression/7.18.6 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/helper-replace-supers': registry.npmmirror.com/@babel/helper-replace-supers/7.20.7 + '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration/7.18.6 + globals: registry.npmmirror.com/globals/11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-computed-properties/7.20.7 + name: '@babel/plugin-transform-computed-properties' + version: 7.20.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/template': registry.npmmirror.com/@babel/template/7.20.7 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-destructuring/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-destructuring/7.20.7 + name: '@babel/plugin-transform-destructuring' + version: 7.20.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-dotall-regex/7.18.6 + name: '@babel/plugin-transform-dotall-regex' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-create-regexp-features-plugin': registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.21.0: + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/7.18.9 + name: '@babel/plugin-transform-duplicate-keys' + version: 7.18.9 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/7.18.6 + name: '@babel/plugin-transform-exponentiation-operator' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-builder-binary-assignment-operator-visitor': registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/7.18.9 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-for-of/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-for-of/7.21.0 + name: '@babel/plugin-transform-for-of' + version: 7.21.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-function-name/7.18.9_@babel+core@7.21.0: + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-function-name/7.18.9 + name: '@babel/plugin-transform-function-name' + version: 7.18.9 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0 + '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-literals/7.18.9_@babel+core@7.21.0: + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-literals/7.18.9 + name: '@babel/plugin-transform-literals' + version: 7.18.9 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/7.18.6 + name: '@babel/plugin-transform-member-expression-literals' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.21.0: + resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-modules-amd/7.20.11 + name: '@babel/plugin-transform-modules-amd' + version: 7.20.11 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms/7.21.2 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/7.21.2_@babel+core@7.21.0: + resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/7.21.2 + name: '@babel/plugin-transform-modules-commonjs' + version: 7.21.2 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms/7.21.2 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/helper-simple-access': registry.npmmirror.com/@babel/helper-simple-access/7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.21.0: + resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/7.20.11 + name: '@babel/plugin-transform-modules-systemjs' + version: 7.20.11 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-hoist-variables': registry.npmmirror.com/@babel/helper-hoist-variables/7.18.6 + '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms/7.21.2 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier/7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-modules-umd/7.18.6 + name: '@babel/plugin-transform-modules-umd' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms/7.21.2 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.21.0: + resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/7.20.5 + name: '@babel/plugin-transform-named-capturing-groups-regex' + version: 7.20.5 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-create-regexp-features-plugin': registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-new-target/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-new-target/7.18.6 + name: '@babel/plugin-transform-new-target' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-object-super/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-object-super/7.18.6 + name: '@babel/plugin-transform-object-super' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/helper-replace-supers': registry.npmmirror.com/@babel/helper-replace-supers/7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-parameters/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-parameters/7.20.7 + name: '@babel/plugin-transform-parameters' + version: 7.20.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-property-literals/7.18.6 + name: '@babel/plugin-transform-property-literals' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.21.0: + resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-regenerator/7.20.5 + name: '@babel/plugin-transform-regenerator' + version: 7.20.5 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + regenerator-transform: registry.npmmirror.com/regenerator-transform/0.15.1 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-reserved-words/7.18.6 + name: '@babel/plugin-transform-reserved-words' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/7.18.6 + name: '@babel/plugin-transform-shorthand-properties' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-spread/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-spread/7.20.7 + name: '@babel/plugin-transform-spread' + version: 7.20.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/7.20.0 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-sticky-regex/7.18.6 + name: '@babel/plugin-transform-sticky-regex' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.21.0: + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-template-literals/7.18.9 + name: '@babel/plugin-transform-template-literals' + version: 7.18.9 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.21.0: + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/7.18.9 + name: '@babel/plugin-transform-typeof-symbol' + version: 7.18.9 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-typescript/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-typescript/7.21.0 + name: '@babel/plugin-transform-typescript' + version: 7.21.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-create-class-features-plugin': registry.npmmirror.com/@babel/helper-create-class-features-plugin/7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/plugin-syntax-typescript': registry.npmmirror.com/@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.21.0: + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/7.18.10 + name: '@babel/plugin-transform-unicode-escapes' + version: 7.18.10 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-unicode-regex/7.18.6 + name: '@babel/plugin-transform-unicode-regex' + version: 7.18.6 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-create-regexp-features-plugin': registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + dev: true + + registry.npmmirror.com/@babel/preset-env/7.20.2_@babel+core@7.21.0: + resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.20.2.tgz} + id: registry.npmmirror.com/@babel/preset-env/7.20.2 + name: '@babel/preset-env' + version: 7.20.2 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': registry.npmmirror.com/@babel/compat-data/7.21.0 + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/helper-validator-option': registry.npmmirror.com/@babel/helper-validator-option/7.21.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.21.0 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.21.0 + '@babel/plugin-proposal-async-generator-functions': registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.21.0 + '@babel/plugin-proposal-class-properties': registry.npmmirror.com/@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-class-static-block': registry.npmmirror.com/@babel/plugin-proposal-class-static-block/7.21.0_@babel+core@7.21.0 + '@babel/plugin-proposal-dynamic-import': registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-export-namespace-from': registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.21.0 + '@babel/plugin-proposal-json-strings': registry.npmmirror.com/@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-logical-assignment-operators': registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.21.0 + '@babel/plugin-proposal-nullish-coalescing-operator': registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-numeric-separator': registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-object-rest-spread': registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.21.0 + '@babel/plugin-proposal-optional-catch-binding': registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-optional-chaining': registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.21.0 + '@babel/plugin-proposal-private-methods': registry.npmmirror.com/@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-private-property-in-object': registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/7.21.0_@babel+core@7.21.0 + '@babel/plugin-proposal-unicode-property-regex': registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.21.0 + '@babel/plugin-syntax-async-generators': registry.npmmirror.com/@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.0 + '@babel/plugin-syntax-class-properties': registry.npmmirror.com/@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.0 + '@babel/plugin-syntax-class-static-block': registry.npmmirror.com/@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.21.0 + '@babel/plugin-syntax-dynamic-import': registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-export-namespace-from': registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-import-assertions': registry.npmmirror.com/@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.21.0 + '@babel/plugin-syntax-json-strings': registry.npmmirror.com/@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-logical-assignment-operators': registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.0 + '@babel/plugin-syntax-nullish-coalescing-operator': registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-numeric-separator': registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.0 + '@babel/plugin-syntax-object-rest-spread': registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-optional-catch-binding': registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-optional-chaining': registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-private-property-in-object': registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.21.0 + '@babel/plugin-syntax-top-level-await': registry.npmmirror.com/@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.0 + '@babel/plugin-transform-arrow-functions': registry.npmmirror.com/@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-async-to-generator': registry.npmmirror.com/@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-block-scoped-functions': registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-block-scoping': registry.npmmirror.com/@babel/plugin-transform-block-scoping/7.21.0_@babel+core@7.21.0 + '@babel/plugin-transform-classes': registry.npmmirror.com/@babel/plugin-transform-classes/7.21.0_@babel+core@7.21.0 + '@babel/plugin-transform-computed-properties': registry.npmmirror.com/@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-destructuring': registry.npmmirror.com/@babel/plugin-transform-destructuring/7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-dotall-regex': registry.npmmirror.com/@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-duplicate-keys': registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-exponentiation-operator': registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-for-of': registry.npmmirror.com/@babel/plugin-transform-for-of/7.21.0_@babel+core@7.21.0 + '@babel/plugin-transform-function-name': registry.npmmirror.com/@babel/plugin-transform-function-name/7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-literals': registry.npmmirror.com/@babel/plugin-transform-literals/7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-member-expression-literals': registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-modules-amd': registry.npmmirror.com/@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.21.0 + '@babel/plugin-transform-modules-commonjs': registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/7.21.2_@babel+core@7.21.0 + '@babel/plugin-transform-modules-systemjs': registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.21.0 + '@babel/plugin-transform-modules-umd': registry.npmmirror.com/@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-named-capturing-groups-regex': registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.21.0 + '@babel/plugin-transform-new-target': registry.npmmirror.com/@babel/plugin-transform-new-target/7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-object-super': registry.npmmirror.com/@babel/plugin-transform-object-super/7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-parameters': registry.npmmirror.com/@babel/plugin-transform-parameters/7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-property-literals': registry.npmmirror.com/@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-regenerator': registry.npmmirror.com/@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.21.0 + '@babel/plugin-transform-reserved-words': registry.npmmirror.com/@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-shorthand-properties': registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-spread': registry.npmmirror.com/@babel/plugin-transform-spread/7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-sticky-regex': registry.npmmirror.com/@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-template-literals': registry.npmmirror.com/@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-typeof-symbol': registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-unicode-escapes': registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.21.0 + '@babel/plugin-transform-unicode-regex': registry.npmmirror.com/@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.21.0 + '@babel/preset-modules': registry.npmmirror.com/@babel/preset-modules/0.1.5_@babel+core@7.21.0 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + babel-plugin-polyfill-corejs2: registry.npmmirror.com/babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.21.0 + babel-plugin-polyfill-corejs3: registry.npmmirror.com/babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.21.0 + babel-plugin-polyfill-regenerator: registry.npmmirror.com/babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.21.0 + core-js-compat: registry.npmmirror.com/core-js-compat/3.29.0 + semver: registry.npmmirror.com/semver/6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/preset-modules/0.1.5_@babel+core@7.21.0: + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz} + id: registry.npmmirror.com/@babel/preset-modules/0.1.5 + name: '@babel/preset-modules' + version: 0.1.5 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@babel/plugin-proposal-unicode-property-regex': registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-dotall-regex': registry.npmmirror.com/@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.21.0 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + esutils: registry.npmmirror.com/esutils/2.0.3 + dev: true + + registry.npmmirror.com/@babel/regjsgen/0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz} + name: '@babel/regjsgen' + version: 0.8.0 + dev: true + + registry.npmmirror.com/@babel/runtime/7.21.0: + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/runtime/-/runtime-7.21.0.tgz} + name: '@babel/runtime' + version: 7.21.0 + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: registry.npmmirror.com/regenerator-runtime/0.13.11 + + registry.npmmirror.com/@babel/standalone/7.21.2: + resolution: {integrity: sha512-ySP/TJcyqMJVg1M/lmnPVi6L+F+IJpQ4+0lqtf723LERbk1N8/0JgLgm346cRAzfHaoXkLq/M/mJBd2uo25RBA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/standalone/-/standalone-7.21.2.tgz} + name: '@babel/standalone' + version: 7.21.2 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/template/7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/template/-/template-7.20.7.tgz} + name: '@babel/template' + version: 7.20.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6 + '@babel/parser': registry.npmmirror.com/@babel/parser/7.21.2 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@babel/traverse/7.21.2: + resolution: {integrity: sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/traverse/-/traverse-7.21.2.tgz} + name: '@babel/traverse' + version: 7.21.2 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6 + '@babel/generator': registry.npmmirror.com/@babel/generator/7.21.1 + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9 + '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name/7.21.0 + '@babel/helper-hoist-variables': registry.npmmirror.com/@babel/helper-hoist-variables/7.18.6 + '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration/7.18.6 + '@babel/parser': registry.npmmirror.com/@babel/parser/7.21.2 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + debug: registry.npmmirror.com/debug/4.3.4 + globals: registry.npmmirror.com/globals/11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/types/7.21.2: + resolution: {integrity: sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/types/-/types-7.21.2.tgz} + name: '@babel/types' + version: 7.21.2 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': registry.npmmirror.com/@babel/helper-string-parser/7.19.4 + '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier/7.19.1 + to-fast-properties: registry.npmmirror.com/to-fast-properties/2.0.0 + + registry.npmmirror.com/@bcoe/v8-coverage/0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz} + name: '@bcoe/v8-coverage' + version: 0.2.3 + dev: true + + registry.npmmirror.com/@commitlint/cli/16.3.0: + resolution: {integrity: sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/cli/-/cli-16.3.0.tgz} + name: '@commitlint/cli' + version: 16.3.0 + engines: {node: '>=v12'} + hasBin: true + dependencies: + '@commitlint/format': registry.npmmirror.com/@commitlint/format/16.2.1 + '@commitlint/lint': registry.npmmirror.com/@commitlint/lint/16.2.4 + '@commitlint/load': registry.npmmirror.com/@commitlint/load/16.3.0 + '@commitlint/read': registry.npmmirror.com/@commitlint/read/16.2.1 + '@commitlint/types': registry.npmmirror.com/@commitlint/types/16.2.1 + lodash: registry.npmmirror.com/lodash/4.17.21 + resolve-from: registry.npmmirror.com/resolve-from/5.0.0 + resolve-global: registry.npmmirror.com/resolve-global/1.0.0 + yargs: registry.npmmirror.com/yargs/17.7.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + registry.npmmirror.com/@commitlint/config-conventional/16.2.4: + resolution: {integrity: sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/config-conventional/-/config-conventional-16.2.4.tgz} + name: '@commitlint/config-conventional' + version: 16.2.4 + engines: {node: '>=v12'} + dependencies: + conventional-changelog-conventionalcommits: registry.npmmirror.com/conventional-changelog-conventionalcommits/4.6.3 + dev: true + + registry.npmmirror.com/@commitlint/config-validator/16.2.1: + resolution: {integrity: sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/config-validator/-/config-validator-16.2.1.tgz} + name: '@commitlint/config-validator' + version: 16.2.1 + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': registry.npmmirror.com/@commitlint/types/16.2.1 + ajv: registry.npmmirror.com/ajv/6.12.6 + dev: true + + registry.npmmirror.com/@commitlint/config-validator/17.4.4: + resolution: {integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/config-validator/-/config-validator-17.4.4.tgz} + name: '@commitlint/config-validator' + version: 17.4.4 + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': registry.npmmirror.com/@commitlint/types/17.4.4 + ajv: registry.npmmirror.com/ajv/8.12.0 + dev: true + optional: true + + registry.npmmirror.com/@commitlint/ensure/16.2.1: + resolution: {integrity: sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/ensure/-/ensure-16.2.1.tgz} + name: '@commitlint/ensure' + version: 16.2.1 + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': registry.npmmirror.com/@commitlint/types/16.2.1 + lodash: registry.npmmirror.com/lodash/4.17.21 + dev: true + + registry.npmmirror.com/@commitlint/execute-rule/16.2.1: + resolution: {integrity: sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/execute-rule/-/execute-rule-16.2.1.tgz} + name: '@commitlint/execute-rule' + version: 16.2.1 + engines: {node: '>=v12'} + dev: true + + registry.npmmirror.com/@commitlint/execute-rule/17.4.0: + resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz} + name: '@commitlint/execute-rule' + version: 17.4.0 + engines: {node: '>=v14'} + dev: true + optional: true + + registry.npmmirror.com/@commitlint/format/16.2.1: + resolution: {integrity: sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/format/-/format-16.2.1.tgz} + name: '@commitlint/format' + version: 16.2.1 + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': registry.npmmirror.com/@commitlint/types/16.2.1 + chalk: registry.npmmirror.com/chalk/4.1.2 + dev: true + + registry.npmmirror.com/@commitlint/is-ignored/16.2.4: + resolution: {integrity: sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/is-ignored/-/is-ignored-16.2.4.tgz} + name: '@commitlint/is-ignored' + version: 16.2.4 + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': registry.npmmirror.com/@commitlint/types/16.2.1 + semver: registry.npmmirror.com/semver/7.3.7 + dev: true + + registry.npmmirror.com/@commitlint/lint/16.2.4: + resolution: {integrity: sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/lint/-/lint-16.2.4.tgz} + name: '@commitlint/lint' + version: 16.2.4 + engines: {node: '>=v12'} + dependencies: + '@commitlint/is-ignored': registry.npmmirror.com/@commitlint/is-ignored/16.2.4 + '@commitlint/parse': registry.npmmirror.com/@commitlint/parse/16.2.1 + '@commitlint/rules': registry.npmmirror.com/@commitlint/rules/16.2.4 + '@commitlint/types': registry.npmmirror.com/@commitlint/types/16.2.1 + dev: true + + registry.npmmirror.com/@commitlint/load/16.3.0: + resolution: {integrity: sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/load/-/load-16.3.0.tgz} + name: '@commitlint/load' + version: 16.3.0 + engines: {node: '>=v12'} + dependencies: + '@commitlint/config-validator': registry.npmmirror.com/@commitlint/config-validator/16.2.1 + '@commitlint/execute-rule': registry.npmmirror.com/@commitlint/execute-rule/16.2.1 + '@commitlint/resolve-extends': registry.npmmirror.com/@commitlint/resolve-extends/16.2.1 + '@commitlint/types': registry.npmmirror.com/@commitlint/types/16.2.1 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + chalk: registry.npmmirror.com/chalk/4.1.2 + cosmiconfig: registry.npmmirror.com/cosmiconfig/7.1.0 + cosmiconfig-typescript-loader: registry.npmmirror.com/cosmiconfig-typescript-loader/2.0.2_cin3sed6ohfsopbmt6orxeb4o4 + lodash: registry.npmmirror.com/lodash/4.17.21 + resolve-from: registry.npmmirror.com/resolve-from/5.0.0 + typescript: registry.npmmirror.com/typescript/4.9.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + registry.npmmirror.com/@commitlint/load/17.4.4: + resolution: {integrity: sha512-z6uFIQ7wfKX5FGBe1AkOF4l/ShOQsaa1ml/nLMkbW7R/xF8galGS7Zh0yHvzVp/srtfS0brC+0bUfQfmpMPFVQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/load/-/load-17.4.4.tgz} + name: '@commitlint/load' + version: 17.4.4 + engines: {node: '>=v14'} + requiresBuild: true + dependencies: + '@commitlint/config-validator': registry.npmmirror.com/@commitlint/config-validator/17.4.4 + '@commitlint/execute-rule': registry.npmmirror.com/@commitlint/execute-rule/17.4.0 + '@commitlint/resolve-extends': registry.npmmirror.com/@commitlint/resolve-extends/17.4.4 + '@commitlint/types': registry.npmmirror.com/@commitlint/types/17.4.4 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + chalk: registry.npmmirror.com/chalk/4.1.2 + cosmiconfig: registry.npmmirror.com/cosmiconfig/8.1.0 + cosmiconfig-typescript-loader: registry.npmmirror.com/cosmiconfig-typescript-loader/4.3.0_ex3rrhbii2ixlrca7p7vytu7ce + lodash.isplainobject: registry.npmmirror.com/lodash.isplainobject/4.0.6 + lodash.merge: registry.npmmirror.com/lodash.merge/4.6.2 + lodash.uniq: registry.npmmirror.com/lodash.uniq/4.5.0 + resolve-from: registry.npmmirror.com/resolve-from/5.0.0 + ts-node: registry.npmmirror.com/ts-node/10.9.1_cin3sed6ohfsopbmt6orxeb4o4 + typescript: registry.npmmirror.com/typescript/4.9.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + optional: true + + registry.npmmirror.com/@commitlint/message/16.2.1: + resolution: {integrity: sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/message/-/message-16.2.1.tgz} + name: '@commitlint/message' + version: 16.2.1 + engines: {node: '>=v12'} + dev: true + + registry.npmmirror.com/@commitlint/parse/16.2.1: + resolution: {integrity: sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/parse/-/parse-16.2.1.tgz} + name: '@commitlint/parse' + version: 16.2.1 + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': registry.npmmirror.com/@commitlint/types/16.2.1 + conventional-changelog-angular: registry.npmmirror.com/conventional-changelog-angular/5.0.13 + conventional-commits-parser: registry.npmmirror.com/conventional-commits-parser/3.2.4 + dev: true + + registry.npmmirror.com/@commitlint/read/16.2.1: + resolution: {integrity: sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/read/-/read-16.2.1.tgz} + name: '@commitlint/read' + version: 16.2.1 + engines: {node: '>=v12'} + dependencies: + '@commitlint/top-level': registry.npmmirror.com/@commitlint/top-level/16.2.1 + '@commitlint/types': registry.npmmirror.com/@commitlint/types/16.2.1 + fs-extra: registry.npmmirror.com/fs-extra/10.1.0 + git-raw-commits: registry.npmmirror.com/git-raw-commits/2.0.11 + dev: true + + registry.npmmirror.com/@commitlint/resolve-extends/16.2.1: + resolution: {integrity: sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/resolve-extends/-/resolve-extends-16.2.1.tgz} + name: '@commitlint/resolve-extends' + version: 16.2.1 + engines: {node: '>=v12'} + dependencies: + '@commitlint/config-validator': registry.npmmirror.com/@commitlint/config-validator/16.2.1 + '@commitlint/types': registry.npmmirror.com/@commitlint/types/16.2.1 + import-fresh: registry.npmmirror.com/import-fresh/3.3.0 + lodash: registry.npmmirror.com/lodash/4.17.21 + resolve-from: registry.npmmirror.com/resolve-from/5.0.0 + resolve-global: registry.npmmirror.com/resolve-global/1.0.0 + dev: true + + registry.npmmirror.com/@commitlint/resolve-extends/17.4.4: + resolution: {integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz} + name: '@commitlint/resolve-extends' + version: 17.4.4 + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': registry.npmmirror.com/@commitlint/config-validator/17.4.4 + '@commitlint/types': registry.npmmirror.com/@commitlint/types/17.4.4 + import-fresh: registry.npmmirror.com/import-fresh/3.3.0 + lodash.mergewith: registry.npmmirror.com/lodash.mergewith/4.6.2 + resolve-from: registry.npmmirror.com/resolve-from/5.0.0 + resolve-global: registry.npmmirror.com/resolve-global/1.0.0 + dev: true + optional: true + + registry.npmmirror.com/@commitlint/rules/16.2.4: + resolution: {integrity: sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/rules/-/rules-16.2.4.tgz} + name: '@commitlint/rules' + version: 16.2.4 + engines: {node: '>=v12'} + dependencies: + '@commitlint/ensure': registry.npmmirror.com/@commitlint/ensure/16.2.1 + '@commitlint/message': registry.npmmirror.com/@commitlint/message/16.2.1 + '@commitlint/to-lines': registry.npmmirror.com/@commitlint/to-lines/16.2.1 + '@commitlint/types': registry.npmmirror.com/@commitlint/types/16.2.1 + execa: registry.npmmirror.com/execa/5.1.1 + dev: true + + registry.npmmirror.com/@commitlint/to-lines/16.2.1: + resolution: {integrity: sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/to-lines/-/to-lines-16.2.1.tgz} + name: '@commitlint/to-lines' + version: 16.2.1 + engines: {node: '>=v12'} + dev: true + + registry.npmmirror.com/@commitlint/top-level/16.2.1: + resolution: {integrity: sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/top-level/-/top-level-16.2.1.tgz} + name: '@commitlint/top-level' + version: 16.2.1 + engines: {node: '>=v12'} + dependencies: + find-up: registry.npmmirror.com/find-up/5.0.0 + dev: true + + registry.npmmirror.com/@commitlint/types/16.2.1: + resolution: {integrity: sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/types/-/types-16.2.1.tgz} + name: '@commitlint/types' + version: 16.2.1 + engines: {node: '>=v12'} + dependencies: + chalk: registry.npmmirror.com/chalk/4.1.2 + dev: true + + registry.npmmirror.com/@commitlint/types/17.4.4: + resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@commitlint/types/-/types-17.4.4.tgz} + name: '@commitlint/types' + version: 17.4.4 + engines: {node: '>=v14'} + dependencies: + chalk: registry.npmmirror.com/chalk/4.1.2 + dev: true + optional: true + + registry.npmmirror.com/@cspotcode/source-map-support/0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz} + name: '@cspotcode/source-map-support' + version: 0.8.1 + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping/0.3.9 + dev: true + + registry.npmmirror.com/@csstools/selector-specificity/2.1.1_wajs5nedgkikc5pcuwett7legi: + resolution: {integrity: sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz} + id: registry.npmmirror.com/@csstools/selector-specificity/2.1.1 + name: '@csstools/selector-specificity' + version: 2.1.1 + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + postcss-selector-parser: ^6.0.10 + dependencies: + postcss: registry.npmmirror.com/postcss/8.4.21 + postcss-selector-parser: registry.npmmirror.com/postcss-selector-parser/6.0.11 + dev: true + + registry.npmmirror.com/@ctrl/tinycolor/3.6.0: + resolution: {integrity: sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz} + name: '@ctrl/tinycolor' + version: 3.6.0 + engines: {node: '>=10'} + dev: false + + registry.npmmirror.com/@esbuild/android-arm/0.15.18: + resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.15.18.tgz} + name: '@esbuild/android-arm' + version: 0.15.18 + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/android-arm/0.17.11: + resolution: {integrity: sha512-CdyX6sRVh1NzFCsf5vw3kULwlAhfy9wVt8SZlrhQ7eL2qBjGbFhRBWkkAzuZm9IIEOCKJw4DXA6R85g+qc8RDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.17.11.tgz} + name: '@esbuild/android-arm' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/android-arm64/0.17.11: + resolution: {integrity: sha512-QnK4d/zhVTuV4/pRM4HUjcsbl43POALU2zvBynmrrqZt9LPcLA3x1fTZPBg2RRguBQnJcnU059yKr+bydkntjg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.17.11.tgz} + name: '@esbuild/android-arm64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/android-x64/0.17.11: + resolution: {integrity: sha512-3PL3HKtsDIXGQcSCKtWD/dy+mgc4p2Tvo2qKgKHj9Yf+eniwFnuoQ0OUhlSfAEpKAFzF9N21Nwgnap6zy3L3MQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.17.11.tgz} + name: '@esbuild/android-x64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/darwin-arm64/0.17.11: + resolution: {integrity: sha512-pJ950bNKgzhkGNO3Z9TeHzIFtEyC2GDQL3wxkMApDEghYx5Qers84UTNc1bAxWbRkuJOgmOha5V0WUeh8G+YGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.11.tgz} + name: '@esbuild/darwin-arm64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/darwin-x64/0.17.11: + resolution: {integrity: sha512-iB0dQkIHXyczK3BZtzw1tqegf0F0Ab5texX2TvMQjiJIWXAfM4FQl7D909YfXWnB92OQz4ivBYQ2RlxBJrMJOw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.17.11.tgz} + name: '@esbuild/darwin-x64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/freebsd-arm64/0.17.11: + resolution: {integrity: sha512-7EFzUADmI1jCHeDRGKgbnF5sDIceZsQGapoO6dmw7r/ZBEKX7CCDnIz8m9yEclzr7mFsd+DyasHzpjfJnmBB1Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.11.tgz} + name: '@esbuild/freebsd-arm64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/freebsd-x64/0.17.11: + resolution: {integrity: sha512-iPgenptC8i8pdvkHQvXJFzc1eVMR7W2lBPrTE6GbhR54sLcF42mk3zBOjKPOodezzuAz/KSu8CPyFSjcBMkE9g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.11.tgz} + name: '@esbuild/freebsd-x64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-arm/0.17.11: + resolution: {integrity: sha512-M9iK/d4lgZH0U5M1R2p2gqhPV/7JPJcRz+8O8GBKVgqndTzydQ7B2XGDbxtbvFkvIs53uXTobOhv+RyaqhUiMg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.17.11.tgz} + name: '@esbuild/linux-arm' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-arm64/0.17.11: + resolution: {integrity: sha512-Qxth3gsWWGKz2/qG2d5DsW/57SeA2AmpSMhdg9TSB5Svn2KDob3qxfQSkdnWjSd42kqoxIPy3EJFs+6w1+6Qjg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.17.11.tgz} + name: '@esbuild/linux-arm64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-ia32/0.17.11: + resolution: {integrity: sha512-dB1nGaVWtUlb/rRDHmuDQhfqazWE0LMro/AIbT2lWM3CDMHJNpLckH+gCddQyhhcLac2OYw69ikUMO34JLt3wA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.17.11.tgz} + name: '@esbuild/linux-ia32' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-loong64/0.14.54: + resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz} + name: '@esbuild/linux-loong64' + version: 0.14.54 + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-loong64/0.15.18: + resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz} + name: '@esbuild/linux-loong64' + version: 0.15.18 + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-loong64/0.17.11: + resolution: {integrity: sha512-aCWlq70Q7Nc9WDnormntGS1ar6ZFvUpqr8gXtO+HRejRYPweAFQN615PcgaSJkZjhHp61+MNLhzyVALSF2/Q0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.17.11.tgz} + name: '@esbuild/linux-loong64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-mips64el/0.17.11: + resolution: {integrity: sha512-cGeGNdQxqY8qJwlYH1BP6rjIIiEcrM05H7k3tR7WxOLmD1ZxRMd6/QIOWMb8mD2s2YJFNRuNQ+wjMhgEL2oCEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.11.tgz} + name: '@esbuild/linux-mips64el' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-ppc64/0.17.11: + resolution: {integrity: sha512-BdlziJQPW/bNe0E8eYsHB40mYOluS+jULPCjlWiHzDgr+ZBRXPtgMV1nkLEGdpjrwgmtkZHEGEPaKdS/8faLDA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.11.tgz} + name: '@esbuild/linux-ppc64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-riscv64/0.17.11: + resolution: {integrity: sha512-MDLwQbtF+83oJCI1Cixn68Et/ME6gelmhssPebC40RdJaect+IM+l7o/CuG0ZlDs6tZTEIoxUe53H3GmMn8oMA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.11.tgz} + name: '@esbuild/linux-riscv64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-s390x/0.17.11: + resolution: {integrity: sha512-4N5EMESvws0Ozr2J94VoUD8HIRi7X0uvUv4c0wpTHZyZY9qpaaN7THjosdiW56irQ4qnJ6Lsc+i+5zGWnyqWqQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.17.11.tgz} + name: '@esbuild/linux-s390x' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-x64/0.17.11: + resolution: {integrity: sha512-rM/v8UlluxpytFSmVdbCe1yyKQd/e+FmIJE2oPJvbBo+D0XVWi1y/NQ4iTNx+436WmDHQBjVLrbnAQLQ6U7wlw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.17.11.tgz} + name: '@esbuild/linux-x64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/netbsd-x64/0.17.11: + resolution: {integrity: sha512-4WaAhuz5f91h3/g43VBGdto1Q+X7VEZfpcWGtOFXnggEuLvjV+cP6DyLRU15IjiU9fKLLk41OoJfBFN5DhPvag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.11.tgz} + name: '@esbuild/netbsd-x64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/openbsd-x64/0.17.11: + resolution: {integrity: sha512-UBj135Nx4FpnvtE+C8TWGp98oUgBcmNmdYgl5ToKc0mBHxVVqVE7FUS5/ELMImOp205qDAittL6Ezhasc2Ev/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.11.tgz} + name: '@esbuild/openbsd-x64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/sunos-x64/0.17.11: + resolution: {integrity: sha512-1/gxTifDC9aXbV2xOfCbOceh5AlIidUrPsMpivgzo8P8zUtczlq1ncFpeN1ZyQJ9lVs2hILy1PG5KPp+w8QPPg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.17.11.tgz} + name: '@esbuild/sunos-x64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/win32-arm64/0.17.11: + resolution: {integrity: sha512-vtSfyx5yRdpiOW9yp6Ax0zyNOv9HjOAw8WaZg3dF5djEHKKm3UnoohftVvIJtRh0Ec7Hso0RIdTqZvPXJ7FdvQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.17.11.tgz} + name: '@esbuild/win32-arm64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/win32-ia32/0.17.11: + resolution: {integrity: sha512-GFPSLEGQr4wHFTiIUJQrnJKZhZjjq4Sphf+mM76nQR6WkQn73vm7IsacmBRPkALfpOCHsopSvLgqdd4iUW2mYw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.17.11.tgz} + name: '@esbuild/win32-ia32' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/win32-x64/0.17.11: + resolution: {integrity: sha512-N9vXqLP3eRL8BqSy8yn4Y98cZI2pZ8fyuHx6lKjiG2WABpT2l01TXdzq5Ma2ZUBzfB7tx5dXVhge8X9u0S70ZQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.17.11.tgz} + name: '@esbuild/win32-x64' + version: 0.17.11 + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@eslint/eslintrc/2.0.0: + resolution: {integrity: sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.0.0.tgz} + name: '@eslint/eslintrc' + version: 2.0.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: registry.npmmirror.com/ajv/6.12.6 + debug: registry.npmmirror.com/debug/4.3.4 + espree: registry.npmmirror.com/espree/9.4.1 + globals: registry.npmmirror.com/globals/13.20.0 + ignore: registry.npmmirror.com/ignore/5.2.4 + import-fresh: registry.npmmirror.com/import-fresh/3.3.0 + js-yaml: registry.npmmirror.com/js-yaml/4.1.0 + minimatch: registry.npmmirror.com/minimatch/3.1.2 + strip-json-comments: registry.npmmirror.com/strip-json-comments/3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@eslint/js/8.35.0: + resolution: {integrity: sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@eslint/js/-/js-8.35.0.tgz} + name: '@eslint/js' + version: 8.35.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + registry.npmmirror.com/@humanwhocodes/config-array/0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz} + name: '@humanwhocodes/config-array' + version: 0.11.8 + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': registry.npmmirror.com/@humanwhocodes/object-schema/1.2.1 + debug: registry.npmmirror.com/debug/4.3.4 + minimatch: registry.npmmirror.com/minimatch/3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@humanwhocodes/module-importer/1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz} + name: '@humanwhocodes/module-importer' + version: 1.0.1 + engines: {node: '>=12.22'} + dev: true + + registry.npmmirror.com/@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz} + name: '@humanwhocodes/object-schema' + version: 1.2.1 + dev: true + + registry.npmmirror.com/@hutson/parse-repository-url/3.0.2: + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz} + name: '@hutson/parse-repository-url' + version: 3.0.2 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@iconify/iconify/2.1.2: + resolution: {integrity: sha512-QcUzFeEWkE/mW+BVtEGmcWATClcCOIJFiYUD/PiCWuTcdEA297o8D4oN6Ra44WrNOHu1wqNW4J0ioaDIiqaFOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@iconify/iconify/-/iconify-2.1.2.tgz} + name: '@iconify/iconify' + version: 2.1.2 + dependencies: + cross-fetch: registry.npmmirror.com/cross-fetch/3.1.5 + transitivePeerDependencies: + - encoding + dev: true + + registry.npmmirror.com/@iconify/iconify/2.2.1: + resolution: {integrity: sha512-WJzw+3iicrF/tbjbxxRinSgy5FHdJoz/egTqwi3xCDkNRJPq482RX1iyaWrjNuY2vMNSPkQMuqHvZDXgA+WnwQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@iconify/iconify/-/iconify-2.2.1.tgz} + name: '@iconify/iconify' + version: 2.2.1 + + registry.npmmirror.com/@iconify/json/2.2.30: + resolution: {integrity: sha512-F+eeFDEe+5iZ6wn/GrpQhycWN5XeULA17oPZdl8t+BuOwrq0rRWanB0sruGRir+SScsUuKR2TJyWTaQwmqtnvQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@iconify/json/-/json-2.2.30.tgz} + name: '@iconify/json' + version: 2.2.30 + dependencies: + '@iconify/types': registry.npmmirror.com/@iconify/types/2.0.0 + pathe: registry.npmmirror.com/pathe/1.1.0 + dev: true + + registry.npmmirror.com/@iconify/types/2.0.0: + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz} + name: '@iconify/types' + version: 2.0.0 + dev: true + + registry.npmmirror.com/@intlify/core-base/9.2.2: + resolution: {integrity: sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.2.2.tgz} + name: '@intlify/core-base' + version: 9.2.2 + engines: {node: '>= 14'} + dependencies: + '@intlify/devtools-if': registry.npmmirror.com/@intlify/devtools-if/9.2.2 + '@intlify/message-compiler': registry.npmmirror.com/@intlify/message-compiler/9.2.2 + '@intlify/shared': registry.npmmirror.com/@intlify/shared/9.2.2 + '@intlify/vue-devtools': registry.npmmirror.com/@intlify/vue-devtools/9.2.2 + dev: false + + registry.npmmirror.com/@intlify/devtools-if/9.2.2: + resolution: {integrity: sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.2.2.tgz} + name: '@intlify/devtools-if' + version: 9.2.2 + engines: {node: '>= 14'} + dependencies: + '@intlify/shared': registry.npmmirror.com/@intlify/shared/9.2.2 + dev: false + + registry.npmmirror.com/@intlify/message-compiler/9.2.2: + resolution: {integrity: sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.2.2.tgz} + name: '@intlify/message-compiler' + version: 9.2.2 + engines: {node: '>= 14'} + dependencies: + '@intlify/shared': registry.npmmirror.com/@intlify/shared/9.2.2 + source-map: registry.npmmirror.com/source-map/0.6.1 + dev: false + + registry.npmmirror.com/@intlify/shared/9.2.2: + resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz} + name: '@intlify/shared' + version: 9.2.2 + engines: {node: '>= 14'} + dev: false + + registry.npmmirror.com/@intlify/vue-devtools/9.2.2: + resolution: {integrity: sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz} + name: '@intlify/vue-devtools' + version: 9.2.2 + engines: {node: '>= 14'} + dependencies: + '@intlify/core-base': registry.npmmirror.com/@intlify/core-base/9.2.2 + '@intlify/shared': registry.npmmirror.com/@intlify/shared/9.2.2 + dev: false + + registry.npmmirror.com/@istanbuljs/load-nyc-config/1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz} + name: '@istanbuljs/load-nyc-config' + version: 1.1.0 + engines: {node: '>=8'} + dependencies: + camelcase: registry.npmmirror.com/camelcase/5.3.1 + find-up: registry.npmmirror.com/find-up/4.1.0 + get-package-type: registry.npmmirror.com/get-package-type/0.1.0 + js-yaml: registry.npmmirror.com/js-yaml/3.14.1 + resolve-from: registry.npmmirror.com/resolve-from/5.0.0 + dev: true + + registry.npmmirror.com/@istanbuljs/schema/0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz} + name: '@istanbuljs/schema' + version: 0.1.3 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/@jeecg/online/3.4.4-RC: + resolution: {integrity: sha512-EjibCo++GszsWuLn3+kqaxt12Zim7f0XWSiHzypef4aAqBKYDnG30Z5K3j5W1g4g22fjVUkrb1rQ8rSLTlPdBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jeecg/online/-/online-3.4.4-RC.tgz} + name: '@jeecg/online' + version: 3.4.4-RC + dev: true + + registry.npmmirror.com/@jest/console/27.5.1: + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jest/console/-/console-27.5.1.tgz} + name: '@jest/console' + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + chalk: registry.npmmirror.com/chalk/4.1.2 + jest-message-util: registry.npmmirror.com/jest-message-util/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + slash: registry.npmmirror.com/slash/3.0.0 + dev: true + + registry.npmmirror.com/@jest/core/27.5.1_ts-node@10.9.1: + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jest/core/-/core-27.5.1.tgz} + id: registry.npmmirror.com/@jest/core/27.5.1 + name: '@jest/core' + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': registry.npmmirror.com/@jest/console/27.5.1 + '@jest/reporters': registry.npmmirror.com/@jest/reporters/27.5.1 + '@jest/test-result': registry.npmmirror.com/@jest/test-result/27.5.1 + '@jest/transform': registry.npmmirror.com/@jest/transform/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + ansi-escapes: registry.npmmirror.com/ansi-escapes/4.3.2 + chalk: registry.npmmirror.com/chalk/4.1.2 + emittery: registry.npmmirror.com/emittery/0.8.1 + exit: registry.npmmirror.com/exit/0.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + jest-changed-files: registry.npmmirror.com/jest-changed-files/27.5.1 + jest-config: registry.npmmirror.com/jest-config/27.5.1_ts-node@10.9.1 + jest-haste-map: registry.npmmirror.com/jest-haste-map/27.5.1 + jest-message-util: registry.npmmirror.com/jest-message-util/27.5.1 + jest-regex-util: registry.npmmirror.com/jest-regex-util/27.5.1 + jest-resolve: registry.npmmirror.com/jest-resolve/27.5.1 + jest-resolve-dependencies: registry.npmmirror.com/jest-resolve-dependencies/27.5.1 + jest-runner: registry.npmmirror.com/jest-runner/27.5.1 + jest-runtime: registry.npmmirror.com/jest-runtime/27.5.1 + jest-snapshot: registry.npmmirror.com/jest-snapshot/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + jest-validate: registry.npmmirror.com/jest-validate/27.5.1 + jest-watcher: registry.npmmirror.com/jest-watcher/27.5.1 + micromatch: registry.npmmirror.com/micromatch/4.0.5 + rimraf: registry.npmmirror.com/rimraf/3.0.2 + slash: registry.npmmirror.com/slash/3.0.0 + strip-ansi: registry.npmmirror.com/strip-ansi/6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + registry.npmmirror.com/@jest/environment/27.5.1: + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jest/environment/-/environment-27.5.1.tgz} + name: '@jest/environment' + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + jest-mock: registry.npmmirror.com/jest-mock/27.5.1 + dev: true + + registry.npmmirror.com/@jest/fake-timers/27.5.1: + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz} + name: '@jest/fake-timers' + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@sinonjs/fake-timers': registry.npmmirror.com/@sinonjs/fake-timers/8.1.0 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + jest-message-util: registry.npmmirror.com/jest-message-util/27.5.1 + jest-mock: registry.npmmirror.com/jest-mock/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + dev: true + + registry.npmmirror.com/@jest/globals/27.5.1: + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jest/globals/-/globals-27.5.1.tgz} + name: '@jest/globals' + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': registry.npmmirror.com/@jest/environment/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + expect: registry.npmmirror.com/expect/27.5.1 + dev: true + + registry.npmmirror.com/@jest/reporters/27.5.1: + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jest/reporters/-/reporters-27.5.1.tgz} + name: '@jest/reporters' + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': registry.npmmirror.com/@bcoe/v8-coverage/0.2.3 + '@jest/console': registry.npmmirror.com/@jest/console/27.5.1 + '@jest/test-result': registry.npmmirror.com/@jest/test-result/27.5.1 + '@jest/transform': registry.npmmirror.com/@jest/transform/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + chalk: registry.npmmirror.com/chalk/4.1.2 + collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage/1.0.1 + exit: registry.npmmirror.com/exit/0.1.2 + glob: registry.npmmirror.com/glob/7.2.3 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage/3.2.0 + istanbul-lib-instrument: registry.npmmirror.com/istanbul-lib-instrument/5.2.1 + istanbul-lib-report: registry.npmmirror.com/istanbul-lib-report/3.0.0 + istanbul-lib-source-maps: registry.npmmirror.com/istanbul-lib-source-maps/4.0.1 + istanbul-reports: registry.npmmirror.com/istanbul-reports/3.1.5 + jest-haste-map: registry.npmmirror.com/jest-haste-map/27.5.1 + jest-resolve: registry.npmmirror.com/jest-resolve/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + jest-worker: registry.npmmirror.com/jest-worker/27.5.1 + slash: registry.npmmirror.com/slash/3.0.0 + source-map: registry.npmmirror.com/source-map/0.6.1 + string-length: registry.npmmirror.com/string-length/4.0.2 + terminal-link: registry.npmmirror.com/terminal-link/2.1.1 + v8-to-istanbul: registry.npmmirror.com/v8-to-istanbul/8.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@jest/source-map/27.5.1: + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jest/source-map/-/source-map-27.5.1.tgz} + name: '@jest/source-map' + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + callsites: registry.npmmirror.com/callsites/3.1.0 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + source-map: registry.npmmirror.com/source-map/0.6.1 + dev: true + + registry.npmmirror.com/@jest/test-result/27.5.1: + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jest/test-result/-/test-result-27.5.1.tgz} + name: '@jest/test-result' + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': registry.npmmirror.com/@jest/console/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage/2.0.4 + collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage/1.0.1 + dev: true + + registry.npmmirror.com/@jest/test-sequencer/27.5.1: + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz} + name: '@jest/test-sequencer' + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': registry.npmmirror.com/@jest/test-result/27.5.1 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + jest-haste-map: registry.npmmirror.com/jest-haste-map/27.5.1 + jest-runtime: registry.npmmirror.com/jest-runtime/27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@jest/transform/27.5.1: + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jest/transform/-/transform-27.5.1.tgz} + name: '@jest/transform' + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + babel-plugin-istanbul: registry.npmmirror.com/babel-plugin-istanbul/6.1.1 + chalk: registry.npmmirror.com/chalk/4.1.2 + convert-source-map: registry.npmmirror.com/convert-source-map/1.9.0 + fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify/2.1.0 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + jest-haste-map: registry.npmmirror.com/jest-haste-map/27.5.1 + jest-regex-util: registry.npmmirror.com/jest-regex-util/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + micromatch: registry.npmmirror.com/micromatch/4.0.5 + pirates: registry.npmmirror.com/pirates/4.0.5 + slash: registry.npmmirror.com/slash/3.0.0 + source-map: registry.npmmirror.com/source-map/0.6.1 + write-file-atomic: registry.npmmirror.com/write-file-atomic/3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@jest/types/27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jest/types/-/types-27.5.1.tgz} + name: '@jest/types' + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage/2.0.4 + '@types/istanbul-reports': registry.npmmirror.com/@types/istanbul-reports/3.0.1 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + '@types/yargs': registry.npmmirror.com/@types/yargs/16.0.5 + chalk: registry.npmmirror.com/chalk/4.1.2 + dev: true + + registry.npmmirror.com/@jridgewell/gen-mapping/0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz} + name: '@jridgewell/gen-mapping' + version: 0.1.1 + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': registry.npmmirror.com/@jridgewell/set-array/1.1.2 + '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14 + dev: true + + registry.npmmirror.com/@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz} + name: '@jridgewell/gen-mapping' + version: 0.3.2 + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': registry.npmmirror.com/@jridgewell/set-array/1.1.2 + '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping/0.3.17 + dev: true + + registry.npmmirror.com/@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz} + name: '@jridgewell/resolve-uri' + version: 3.1.0 + engines: {node: '>=6.0.0'} + dev: true + + registry.npmmirror.com/@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz} + name: '@jridgewell/set-array' + version: 1.1.2 + engines: {node: '>=6.0.0'} + dev: true + + registry.npmmirror.com/@jridgewell/source-map/0.3.2: + resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz} + name: '@jridgewell/source-map' + version: 0.3.2 + dependencies: + '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping/0.3.2 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping/0.3.17 + dev: true + + registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz} + name: '@jridgewell/sourcemap-codec' + version: 1.4.14 + dev: true + + registry.npmmirror.com/@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz} + name: '@jridgewell/trace-mapping' + version: 0.3.17 + dependencies: + '@jridgewell/resolve-uri': registry.npmmirror.com/@jridgewell/resolve-uri/3.1.0 + '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14 + dev: true + + registry.npmmirror.com/@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz} + name: '@jridgewell/trace-mapping' + version: 0.3.9 + dependencies: + '@jridgewell/resolve-uri': registry.npmmirror.com/@jridgewell/resolve-uri/3.1.0 + '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14 + dev: true + + registry.npmmirror.com/@logicflow/core/1.1.31: + resolution: {integrity: sha512-TQYJoxhqSzWBvw/NkI5hNZ8WkfS7JDLrvp56EU/OYo6Nbusj2n8/ya8XaMM50+GXqnp6+38t3RAGCC9Dk9cmhA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@logicflow/core/-/core-1.1.31.tgz} + name: '@logicflow/core' + version: 1.1.31 + dependencies: + '@types/mousetrap': registry.npmmirror.com/@types/mousetrap/1.6.11 + mousetrap: registry.npmmirror.com/mousetrap/1.6.5 + preact: registry.npmmirror.com/preact/10.13.0 + dev: false + + registry.npmmirror.com/@logicflow/extension/1.1.31: + resolution: {integrity: sha512-MUDdP7Anf3OmIEVmJTlIH8e5h2yrdqlwWYCDjDoh9R1IOfzR4wCvEiH4HgOkadTsGtfaihFRyFnPIYT1cu7oUA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@logicflow/extension/-/extension-1.1.31.tgz} + name: '@logicflow/extension' + version: 1.1.31 + dependencies: + '@logicflow/core': registry.npmmirror.com/@logicflow/core/1.1.31 + ids: registry.npmmirror.com/ids/1.0.0 + preact: registry.npmmirror.com/preact/10.13.0 + dev: false + + registry.npmmirror.com/@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz} + name: '@nodelib/fs.scandir' + version: 2.1.5 + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': registry.npmmirror.com/@nodelib/fs.stat/2.0.5 + run-parallel: registry.npmmirror.com/run-parallel/1.2.0 + dev: true + + registry.npmmirror.com/@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz} + name: '@nodelib/fs.stat' + version: 2.0.5 + engines: {node: '>= 8'} + dev: true + + registry.npmmirror.com/@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz} + name: '@nodelib/fs.walk' + version: 1.2.8 + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': registry.npmmirror.com/@nodelib/fs.scandir/2.1.5 + fastq: registry.npmmirror.com/fastq/1.15.0 + dev: true + + registry.npmmirror.com/@octokit/auth-token/3.0.3: + resolution: {integrity: sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@octokit/auth-token/-/auth-token-3.0.3.tgz} + name: '@octokit/auth-token' + version: 3.0.3 + engines: {node: '>= 14'} + dependencies: + '@octokit/types': registry.npmmirror.com/@octokit/types/9.0.0 + dev: true + + registry.npmmirror.com/@octokit/core/4.2.0: + resolution: {integrity: sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@octokit/core/-/core-4.2.0.tgz} + name: '@octokit/core' + version: 4.2.0 + engines: {node: '>= 14'} + dependencies: + '@octokit/auth-token': registry.npmmirror.com/@octokit/auth-token/3.0.3 + '@octokit/graphql': registry.npmmirror.com/@octokit/graphql/5.0.5 + '@octokit/request': registry.npmmirror.com/@octokit/request/6.2.3 + '@octokit/request-error': registry.npmmirror.com/@octokit/request-error/3.0.3 + '@octokit/types': registry.npmmirror.com/@octokit/types/9.0.0 + before-after-hook: registry.npmmirror.com/before-after-hook/2.2.3 + universal-user-agent: registry.npmmirror.com/universal-user-agent/6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + registry.npmmirror.com/@octokit/endpoint/7.0.5: + resolution: {integrity: sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@octokit/endpoint/-/endpoint-7.0.5.tgz} + name: '@octokit/endpoint' + version: 7.0.5 + engines: {node: '>= 14'} + dependencies: + '@octokit/types': registry.npmmirror.com/@octokit/types/9.0.0 + is-plain-object: registry.npmmirror.com/is-plain-object/5.0.0 + universal-user-agent: registry.npmmirror.com/universal-user-agent/6.0.0 + dev: true + + registry.npmmirror.com/@octokit/graphql/5.0.5: + resolution: {integrity: sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@octokit/graphql/-/graphql-5.0.5.tgz} + name: '@octokit/graphql' + version: 5.0.5 + engines: {node: '>= 14'} + dependencies: + '@octokit/request': registry.npmmirror.com/@octokit/request/6.2.3 + '@octokit/types': registry.npmmirror.com/@octokit/types/9.0.0 + universal-user-agent: registry.npmmirror.com/universal-user-agent/6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + registry.npmmirror.com/@octokit/openapi-types/16.0.0: + resolution: {integrity: sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-16.0.0.tgz} + name: '@octokit/openapi-types' + version: 16.0.0 + dev: true + + registry.npmmirror.com/@octokit/plugin-paginate-rest/6.0.0_@octokit+core@4.2.0: + resolution: {integrity: sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz} + id: registry.npmmirror.com/@octokit/plugin-paginate-rest/6.0.0 + name: '@octokit/plugin-paginate-rest' + version: 6.0.0 + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=4' + dependencies: + '@octokit/core': registry.npmmirror.com/@octokit/core/4.2.0 + '@octokit/types': registry.npmmirror.com/@octokit/types/9.0.0 + dev: true + + registry.npmmirror.com/@octokit/plugin-request-log/1.0.4_@octokit+core@4.2.0: + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz} + id: registry.npmmirror.com/@octokit/plugin-request-log/1.0.4 + name: '@octokit/plugin-request-log' + version: 1.0.4 + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': registry.npmmirror.com/@octokit/core/4.2.0 + dev: true + + registry.npmmirror.com/@octokit/plugin-rest-endpoint-methods/7.0.1_@octokit+core@4.2.0: + resolution: {integrity: sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz} + id: registry.npmmirror.com/@octokit/plugin-rest-endpoint-methods/7.0.1 + name: '@octokit/plugin-rest-endpoint-methods' + version: 7.0.1 + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': registry.npmmirror.com/@octokit/core/4.2.0 + '@octokit/types': registry.npmmirror.com/@octokit/types/9.0.0 + deprecation: registry.npmmirror.com/deprecation/2.3.1 + dev: true + + registry.npmmirror.com/@octokit/request-error/3.0.3: + resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@octokit/request-error/-/request-error-3.0.3.tgz} + name: '@octokit/request-error' + version: 3.0.3 + engines: {node: '>= 14'} + dependencies: + '@octokit/types': registry.npmmirror.com/@octokit/types/9.0.0 + deprecation: registry.npmmirror.com/deprecation/2.3.1 + once: registry.npmmirror.com/once/1.4.0 + dev: true + + registry.npmmirror.com/@octokit/request/6.2.3: + resolution: {integrity: sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@octokit/request/-/request-6.2.3.tgz} + name: '@octokit/request' + version: 6.2.3 + engines: {node: '>= 14'} + dependencies: + '@octokit/endpoint': registry.npmmirror.com/@octokit/endpoint/7.0.5 + '@octokit/request-error': registry.npmmirror.com/@octokit/request-error/3.0.3 + '@octokit/types': registry.npmmirror.com/@octokit/types/9.0.0 + is-plain-object: registry.npmmirror.com/is-plain-object/5.0.0 + node-fetch: registry.npmmirror.com/node-fetch/2.6.9 + universal-user-agent: registry.npmmirror.com/universal-user-agent/6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + registry.npmmirror.com/@octokit/rest/19.0.7: + resolution: {integrity: sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@octokit/rest/-/rest-19.0.7.tgz} + name: '@octokit/rest' + version: 19.0.7 + engines: {node: '>= 14'} + dependencies: + '@octokit/core': registry.npmmirror.com/@octokit/core/4.2.0 + '@octokit/plugin-paginate-rest': registry.npmmirror.com/@octokit/plugin-paginate-rest/6.0.0_@octokit+core@4.2.0 + '@octokit/plugin-request-log': registry.npmmirror.com/@octokit/plugin-request-log/1.0.4_@octokit+core@4.2.0 + '@octokit/plugin-rest-endpoint-methods': registry.npmmirror.com/@octokit/plugin-rest-endpoint-methods/7.0.1_@octokit+core@4.2.0 + transitivePeerDependencies: + - encoding + dev: true + + registry.npmmirror.com/@octokit/types/9.0.0: + resolution: {integrity: sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@octokit/types/-/types-9.0.0.tgz} + name: '@octokit/types' + version: 9.0.0 + dependencies: + '@octokit/openapi-types': registry.npmmirror.com/@octokit/openapi-types/16.0.0 + dev: true + + registry.npmmirror.com/@purge-icons/core/0.8.0: + resolution: {integrity: sha512-8L6hP1U9XQO5B7kvquVJ5N7jzFvO0LZLXhBCjUQzzJzi42i6MAUanVKROApqbBuh21o9tmPwvNUg0xPe/uftRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@purge-icons/core/-/core-0.8.0.tgz} + name: '@purge-icons/core' + version: 0.8.0 + dependencies: + '@iconify/iconify': registry.npmmirror.com/@iconify/iconify/2.1.2 + axios: registry.npmmirror.com/axios/0.26.1_debug@4.3.4 + debug: registry.npmmirror.com/debug/4.3.4 + fast-glob: registry.npmmirror.com/fast-glob/3.2.12 + fs-extra: registry.npmmirror.com/fs-extra/10.1.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + registry.npmmirror.com/@purge-icons/generated/0.8.1: + resolution: {integrity: sha512-rIExGA33EGKEToqtc8WfpboaR7or1XRp+KV1Y5v/P0Rq7G5Me95DmP3ow/MpG7ql+XZ9xPzyS2naGRx5358+6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@purge-icons/generated/-/generated-0.8.1.tgz} + name: '@purge-icons/generated' + version: 0.8.1 + dependencies: + '@iconify/iconify': registry.npmmirror.com/@iconify/iconify/2.2.1 + dev: true + + registry.npmmirror.com/@rollup/plugin-babel/5.3.1_4tnfxcmsyr7y5qv3uwkivwqysm: + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz} + id: registry.npmmirror.com/@rollup/plugin-babel/5.3.1 + name: '@rollup/plugin-babel' + version: 5.3.1 + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports/7.18.6 + '@rollup/pluginutils': registry.npmmirror.com/@rollup/pluginutils/3.1.0_rollup@2.79.1 + rollup: registry.npmmirror.com/rollup/2.79.1 + dev: true + + registry.npmmirror.com/@rollup/plugin-node-resolve/11.2.1_rollup@2.79.1: + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz} + id: registry.npmmirror.com/@rollup/plugin-node-resolve/11.2.1 + name: '@rollup/plugin-node-resolve' + version: 11.2.1 + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@rollup/pluginutils': registry.npmmirror.com/@rollup/pluginutils/3.1.0_rollup@2.79.1 + '@types/resolve': registry.npmmirror.com/@types/resolve/1.17.1 + builtin-modules: registry.npmmirror.com/builtin-modules/3.3.0 + deepmerge: registry.npmmirror.com/deepmerge/4.3.0 + is-module: registry.npmmirror.com/is-module/1.0.0 + resolve: registry.npmmirror.com/resolve/1.22.1 + rollup: registry.npmmirror.com/rollup/2.79.1 + dev: true + + registry.npmmirror.com/@rollup/plugin-node-resolve/13.3.0_rollup@2.79.1: + resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz} + id: registry.npmmirror.com/@rollup/plugin-node-resolve/13.3.0 + name: '@rollup/plugin-node-resolve' + version: 13.3.0 + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^2.42.0 + dependencies: + '@rollup/pluginutils': registry.npmmirror.com/@rollup/pluginutils/3.1.0_rollup@2.79.1 + '@types/resolve': registry.npmmirror.com/@types/resolve/1.17.1 + deepmerge: registry.npmmirror.com/deepmerge/4.3.0 + is-builtin-module: registry.npmmirror.com/is-builtin-module/3.2.1 + is-module: registry.npmmirror.com/is-module/1.0.0 + resolve: registry.npmmirror.com/resolve/1.22.1 + rollup: registry.npmmirror.com/rollup/2.79.1 + dev: true + + registry.npmmirror.com/@rollup/plugin-replace/2.4.2_rollup@2.79.1: + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz} + id: registry.npmmirror.com/@rollup/plugin-replace/2.4.2 + name: '@rollup/plugin-replace' + version: 2.4.2 + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': registry.npmmirror.com/@rollup/pluginutils/3.1.0_rollup@2.79.1 + magic-string: registry.npmmirror.com/magic-string/0.25.9 + rollup: registry.npmmirror.com/rollup/2.79.1 + dev: true + + registry.npmmirror.com/@rollup/pluginutils/3.1.0_rollup@2.79.1: + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz} + id: registry.npmmirror.com/@rollup/pluginutils/3.1.0 + name: '@rollup/pluginutils' + version: 3.1.0 + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': registry.npmmirror.com/@types/estree/0.0.39 + estree-walker: registry.npmmirror.com/estree-walker/1.0.1 + picomatch: registry.npmmirror.com/picomatch/2.3.1 + rollup: registry.npmmirror.com/rollup/2.79.1 + dev: true + + registry.npmmirror.com/@rollup/pluginutils/4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz} + name: '@rollup/pluginutils' + version: 4.2.1 + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: registry.npmmirror.com/estree-walker/2.0.2 + picomatch: registry.npmmirror.com/picomatch/2.3.1 + dev: true + + registry.npmmirror.com/@rys-fe/vite-plugin-theme/0.8.6_vite@3.2.5: + resolution: {integrity: sha512-9j6yMhNRCDxv4Wpimo0EDZf/KU5FgJtjMPVYBaFv4SPClLOEx5kkpcRuDrVBaB4IzM1qizRlxUK4jd9Klxyqig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@rys-fe/vite-plugin-theme/-/vite-plugin-theme-0.8.6.tgz} + id: registry.npmmirror.com/@rys-fe/vite-plugin-theme/0.8.6 + name: '@rys-fe/vite-plugin-theme' + version: 0.8.6 + peerDependencies: + vite: '>=2.0.0-beta.49' + dependencies: + '@types/node': registry.npmmirror.com/@types/node/14.18.37 + '@types/tinycolor2': registry.npmmirror.com/@types/tinycolor2/1.4.3 + chalk: registry.npmmirror.com/chalk/4.1.2 + clean-css: registry.npmmirror.com/clean-css/5.3.2 + debug: registry.npmmirror.com/debug/4.3.4 + esbuild: registry.npmmirror.com/esbuild/0.11.23 + esbuild-plugin-alias: registry.npmmirror.com/esbuild-plugin-alias/0.1.2 + tinycolor2: registry.npmmirror.com/tinycolor2/1.6.0 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@simonwep/pickr/1.8.2: + resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@simonwep/pickr/-/pickr-1.8.2.tgz} + name: '@simonwep/pickr' + version: 1.8.2 + dependencies: + core-js: registry.npmmirror.com/core-js/3.29.0 + nanopop: registry.npmmirror.com/nanopop/2.2.0 + dev: false + + registry.npmmirror.com/@sindresorhus/is/0.7.0: + resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@sindresorhus/is/-/is-0.7.0.tgz} + name: '@sindresorhus/is' + version: 0.7.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/@sinonjs/commons/1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@sinonjs/commons/-/commons-1.8.6.tgz} + name: '@sinonjs/commons' + version: 1.8.6 + dependencies: + type-detect: registry.npmmirror.com/type-detect/4.0.8 + dev: true + + registry.npmmirror.com/@sinonjs/fake-timers/8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz} + name: '@sinonjs/fake-timers' + version: 8.1.0 + dependencies: + '@sinonjs/commons': registry.npmmirror.com/@sinonjs/commons/1.8.6 + dev: true + + registry.npmmirror.com/@surma/rollup-plugin-off-main-thread/2.2.3: + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz} + name: '@surma/rollup-plugin-off-main-thread' + version: 2.2.3 + dependencies: + ejs: registry.npmmirror.com/ejs/3.1.8 + json5: registry.npmmirror.com/json5/2.2.3 + magic-string: registry.npmmirror.com/magic-string/0.25.9 + string.prototype.matchall: registry.npmmirror.com/string.prototype.matchall/4.0.8 + dev: true + + registry.npmmirror.com/@tootallnate/once/1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@tootallnate/once/-/once-1.1.2.tgz} + name: '@tootallnate/once' + version: 1.1.2 + engines: {node: '>= 6'} + dev: true + + registry.npmmirror.com/@trysound/sax/0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz} + name: '@trysound/sax' + version: 0.2.0 + engines: {node: '>=10.13.0'} + dev: true + + registry.npmmirror.com/@tsconfig/node10/1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz} + name: '@tsconfig/node10' + version: 1.0.9 + dev: true + + registry.npmmirror.com/@tsconfig/node12/1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz} + name: '@tsconfig/node12' + version: 1.0.11 + dev: true + + registry.npmmirror.com/@tsconfig/node14/1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz} + name: '@tsconfig/node14' + version: 1.0.3 + dev: true + + registry.npmmirror.com/@tsconfig/node16/1.0.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.3.tgz} + name: '@tsconfig/node16' + version: 1.0.3 + dev: true + + registry.npmmirror.com/@types/babel__core/7.20.0: + resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.0.tgz} + name: '@types/babel__core' + version: 7.20.0 + dependencies: + '@babel/parser': registry.npmmirror.com/@babel/parser/7.21.2 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + '@types/babel__generator': registry.npmmirror.com/@types/babel__generator/7.6.4 + '@types/babel__template': registry.npmmirror.com/@types/babel__template/7.4.1 + '@types/babel__traverse': registry.npmmirror.com/@types/babel__traverse/7.18.3 + dev: true + + registry.npmmirror.com/@types/babel__generator/7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.4.tgz} + name: '@types/babel__generator' + version: 7.6.4 + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@types/babel__template/7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.1.tgz} + name: '@types/babel__template' + version: 7.4.1 + dependencies: + '@babel/parser': registry.npmmirror.com/@babel/parser/7.21.2 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@types/babel__traverse/7.18.3: + resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz} + name: '@types/babel__traverse' + version: 7.18.3 + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + dev: true + + registry.npmmirror.com/@types/codemirror/5.60.7: + resolution: {integrity: sha512-QXIC+RPzt/1BGSuD6iFn6UMC9TDp+9hkOANYNPVsjjrDdzKphfRkwQDKGp2YaC54Yhz0g6P5uYTCCibZZEiMAA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/codemirror/-/codemirror-5.60.7.tgz} + name: '@types/codemirror' + version: 5.60.7 + dependencies: + '@types/tern': registry.npmmirror.com/@types/tern/0.23.4 + dev: true + + registry.npmmirror.com/@types/crypto-js/4.1.1: + resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/crypto-js/-/crypto-js-4.1.1.tgz} + name: '@types/crypto-js' + version: 4.1.1 + dev: true + + registry.npmmirror.com/@types/estree/0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/estree/-/estree-0.0.39.tgz} + name: '@types/estree' + version: 0.0.39 + dev: true + + registry.npmmirror.com/@types/estree/1.0.0: + resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/estree/-/estree-1.0.0.tgz} + name: '@types/estree' + version: 1.0.0 + dev: true + + registry.npmmirror.com/@types/fs-extra/9.0.13: + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-9.0.13.tgz} + name: '@types/fs-extra' + version: 9.0.13 + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + dev: true + + registry.npmmirror.com/@types/glob/7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz} + name: '@types/glob' + version: 7.2.0 + dependencies: + '@types/minimatch': registry.npmmirror.com/@types/minimatch/5.1.2 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + dev: true + + registry.npmmirror.com/@types/graceful-fs/4.1.6: + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz} + name: '@types/graceful-fs' + version: 4.1.6 + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + dev: true + + registry.npmmirror.com/@types/imagemin-gifsicle/7.0.1: + resolution: {integrity: sha512-kUz6sUh0P95JOS0RGEaaemWUrASuw+dLsWIveK2UZJx74id/B9epgblMkCk/r5MjUWbZ83wFvacG5Rb/f97gyA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/imagemin-gifsicle/-/imagemin-gifsicle-7.0.1.tgz} + name: '@types/imagemin-gifsicle' + version: 7.0.1 + dependencies: + '@types/imagemin': registry.npmmirror.com/@types/imagemin/7.0.1 + dev: true + + registry.npmmirror.com/@types/imagemin-jpegtran/5.0.1: + resolution: {integrity: sha512-Ps8kbm+DUFte/Eln/tUdEvpMWHKFCsQKlV8n+RN50zqWqL/7QhfLxR0ymitP9wa90P6+rkbJlintBNPkVR+B/Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/imagemin-jpegtran/-/imagemin-jpegtran-5.0.1.tgz} + name: '@types/imagemin-jpegtran' + version: 5.0.1 + dependencies: + '@types/imagemin': registry.npmmirror.com/@types/imagemin/7.0.1 + dev: true + + registry.npmmirror.com/@types/imagemin-mozjpeg/8.0.1: + resolution: {integrity: sha512-kMQWEoKxxhlnH4POI3qfW9DjXlQfi80ux3l2b3j5R3eudSCoUIzKQLkfMjNJ6eMYnMWBcB+rfQOWqIzdIwFGKw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.1.tgz} + name: '@types/imagemin-mozjpeg' + version: 8.0.1 + dependencies: + '@types/imagemin': registry.npmmirror.com/@types/imagemin/7.0.1 + dev: true + + registry.npmmirror.com/@types/imagemin-optipng/5.2.1: + resolution: {integrity: sha512-XCM/3q+HUL7v4zOqMI+dJ5dTxT+MUukY9KU49DSnYb/4yWtSMHJyADP+WHSMVzTR63J2ZvfUOzSilzBNEQW78g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz} + name: '@types/imagemin-optipng' + version: 5.2.1 + dependencies: + '@types/imagemin': registry.npmmirror.com/@types/imagemin/7.0.1 + dev: true + + registry.npmmirror.com/@types/imagemin-svgo/10.0.2: + resolution: {integrity: sha512-F4enqbl7eE0JhrwGdJSMKFDn1j1Pk8JsCvnjA5iJKSi+IK3sd4CronabzVmOuEkz663tV7FsRQp1f7SP3zmIaA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/imagemin-svgo/-/imagemin-svgo-10.0.2.tgz} + name: '@types/imagemin-svgo' + version: 10.0.2 + dependencies: + '@types/imagemin': registry.npmmirror.com/@types/imagemin/7.0.1 + '@types/svgo': registry.npmmirror.com/@types/svgo/2.6.4 + dev: true + + registry.npmmirror.com/@types/imagemin-webp/7.0.0: + resolution: {integrity: sha512-Lb1tjy2vEU7qYwM5iFB9o5k0J3mIpulw6Yftset5LLLugPu7+C16rLYRP1WEwr4QM8AeJZRjC2BGBLd9lGvRhQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/imagemin-webp/-/imagemin-webp-7.0.0.tgz} + name: '@types/imagemin-webp' + version: 7.0.0 + dependencies: + '@types/imagemin': registry.npmmirror.com/@types/imagemin/7.0.1 + dev: true + + registry.npmmirror.com/@types/imagemin/7.0.1: + resolution: {integrity: sha512-xEn5+M3lDBtI3JxLy6eU3ksoVurygnlG7OYhTqJfGGP4PcvYnfn+IABCmMve7ziM/SneHDm5xgJFKC8hCYPicw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/imagemin/-/imagemin-7.0.1.tgz} + name: '@types/imagemin' + version: 7.0.1 + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + dev: true + + registry.npmmirror.com/@types/inquirer/8.2.6: + resolution: {integrity: sha512-3uT88kxg8lNzY8ay2ZjP44DKcRaTGztqeIvN2zHvhzIBH/uAPaL75aBtdNRKbA7xXoMbBt5kX0M00VKAnfOYlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/inquirer/-/inquirer-8.2.6.tgz} + name: '@types/inquirer' + version: 8.2.6 + dependencies: + '@types/through': registry.npmmirror.com/@types/through/0.0.30 + rxjs: registry.npmmirror.com/rxjs/7.8.0 + dev: true + + registry.npmmirror.com/@types/intro.js/3.0.2: + resolution: {integrity: sha512-kow8REgIIG42atN9vAaIdpEqVzj6WzV9m0PII8oce+an4Lc3eyfQF32/FbabbGmfWuF7TceTdd+gh74kOrXkPw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/intro.js/-/intro.js-3.0.2.tgz} + name: '@types/intro.js' + version: 3.0.2 + dev: true + + registry.npmmirror.com/@types/istanbul-lib-coverage/2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz} + name: '@types/istanbul-lib-coverage' + version: 2.0.4 + dev: true + + registry.npmmirror.com/@types/istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz} + name: '@types/istanbul-lib-report' + version: 3.0.0 + dependencies: + '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage/2.0.4 + dev: true + + registry.npmmirror.com/@types/istanbul-reports/3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz} + name: '@types/istanbul-reports' + version: 3.0.1 + dependencies: + '@types/istanbul-lib-report': registry.npmmirror.com/@types/istanbul-lib-report/3.0.0 + dev: true + + registry.npmmirror.com/@types/jest/27.5.2: + resolution: {integrity: sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/jest/-/jest-27.5.2.tgz} + name: '@types/jest' + version: 27.5.2 + dependencies: + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils/27.5.1 + pretty-format: registry.npmmirror.com/pretty-format/27.5.1 + dev: true + + registry.npmmirror.com/@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz} + name: '@types/json-schema' + version: 7.0.11 + dev: true + + registry.npmmirror.com/@types/keyv/3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/keyv/-/keyv-3.1.4.tgz} + name: '@types/keyv' + version: 3.1.4 + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + dev: true + + registry.npmmirror.com/@types/lodash-es/4.17.6: + resolution: {integrity: sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.6.tgz} + name: '@types/lodash-es' + version: 4.17.6 + dependencies: + '@types/lodash': registry.npmmirror.com/@types/lodash/4.14.191 + dev: true + + registry.npmmirror.com/@types/lodash/4.14.191: + resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.191.tgz} + name: '@types/lodash' + version: 4.14.191 + dev: true + + registry.npmmirror.com/@types/minimatch/3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/minimatch/-/minimatch-3.0.5.tgz} + name: '@types/minimatch' + version: 3.0.5 + dev: true + + registry.npmmirror.com/@types/minimatch/5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/minimatch/-/minimatch-5.1.2.tgz} + name: '@types/minimatch' + version: 5.1.2 + dev: true + + registry.npmmirror.com/@types/minimist/1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/minimist/-/minimist-1.2.2.tgz} + name: '@types/minimist' + version: 1.2.2 + dev: true + + registry.npmmirror.com/@types/mockjs/1.0.7: + resolution: {integrity: sha512-OCxXz6hEaJOVpRwuJMiVY5a6LtJcih+br9gwB/Q8ooOBikvk5FpBQ31OlNimXo3EqKha1Z7PFBni+q9m+8NCWg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/mockjs/-/mockjs-1.0.7.tgz} + name: '@types/mockjs' + version: 1.0.7 + dev: true + + registry.npmmirror.com/@types/mousetrap/1.6.11: + resolution: {integrity: sha512-F0oAily9Q9QQpv9JKxKn0zMKfOo36KHCW7myYsmUyf2t0g+sBTbG3UleTPoguHdE1z3GLFr3p7/wiOio52QFjQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/mousetrap/-/mousetrap-1.6.11.tgz} + name: '@types/mousetrap' + version: 1.6.11 + dev: false + + registry.npmmirror.com/@types/node/14.18.37: + resolution: {integrity: sha512-7GgtHCs/QZrBrDzgIJnQtuSvhFSwhyYSI2uafSwZoNt1iOGhEN5fwNrQMjtONyHm9+/LoA4453jH0CMYcr06Pg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-14.18.37.tgz} + name: '@types/node' + version: 14.18.37 + dev: true + + registry.npmmirror.com/@types/node/17.0.45: + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-17.0.45.tgz} + name: '@types/node' + version: 17.0.45 + dev: true + + registry.npmmirror.com/@types/normalize-package-data/2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz} + name: '@types/normalize-package-data' + version: 2.4.1 + dev: true + + registry.npmmirror.com/@types/nprogress/0.2.0: + resolution: {integrity: sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/nprogress/-/nprogress-0.2.0.tgz} + name: '@types/nprogress' + version: 0.2.0 + dev: true + + registry.npmmirror.com/@types/parse-json/4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz} + name: '@types/parse-json' + version: 4.0.0 + dev: true + + registry.npmmirror.com/@types/pinyin/2.10.0: + resolution: {integrity: sha512-YLty6FPYiBgxNbQNaTRJquvflRdG026jjOpjNXR7HdGEJPGtmPBp1x9LkWePCNA/ClaTT0hYem080TbRCMLbew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/pinyin/-/pinyin-2.10.0.tgz} + name: '@types/pinyin' + version: 2.10.0 + dev: true + + registry.npmmirror.com/@types/prettier/2.7.2: + resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/prettier/-/prettier-2.7.2.tgz} + name: '@types/prettier' + version: 2.7.2 + dev: true + + registry.npmmirror.com/@types/qrcode/1.5.0: + resolution: {integrity: sha512-x5ilHXRxUPIMfjtM+1vf/GPTRWZ81nqscursm5gMznJeK9M0YnZ1c3bEvRLQ0zSSgedLx1J6MGL231ObQGGhaA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/qrcode/-/qrcode-1.5.0.tgz} + name: '@types/qrcode' + version: 1.5.0 + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + dev: true + + registry.npmmirror.com/@types/qs/6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz} + name: '@types/qs' + version: 6.9.7 + dev: true + + registry.npmmirror.com/@types/resolve/1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/resolve/-/resolve-1.17.1.tgz} + name: '@types/resolve' + version: 1.17.1 + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + dev: true + + registry.npmmirror.com/@types/responselike/1.0.0: + resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/responselike/-/responselike-1.0.0.tgz} + name: '@types/responselike' + version: 1.0.0 + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + dev: true + + registry.npmmirror.com/@types/semver/7.3.13: + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/semver/-/semver-7.3.13.tgz} + name: '@types/semver' + version: 7.3.13 + dev: true + + registry.npmmirror.com/@types/showdown/1.9.4: + resolution: {integrity: sha512-50ehC3IAijfkvoNqmQ+VL73S7orOxmAK8ljQAFBv8o7G66lAZyxQj1L3BAv2dD86myLXI+sgKP1kcxAaxW356w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/showdown/-/showdown-1.9.4.tgz} + name: '@types/showdown' + version: 1.9.4 + dev: true + + registry.npmmirror.com/@types/sortablejs/1.15.0: + resolution: {integrity: sha512-qrhtM7M41EhH4tZQTNw2/RJkxllBx3reiJpTbgWCM2Dx0U1sZ6LwKp9lfNln9uqE26ZMKUaPEYaD4rzvOWYtZw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/sortablejs/-/sortablejs-1.15.0.tgz} + name: '@types/sortablejs' + version: 1.15.0 + dev: true + + registry.npmmirror.com/@types/stack-utils/2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.1.tgz} + name: '@types/stack-utils' + version: 2.0.1 + dev: true + + registry.npmmirror.com/@types/svgo/2.6.4: + resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/svgo/-/svgo-2.6.4.tgz} + name: '@types/svgo' + version: 2.6.4 + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + dev: true + + registry.npmmirror.com/@types/tern/0.23.4: + resolution: {integrity: sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/tern/-/tern-0.23.4.tgz} + name: '@types/tern' + version: 0.23.4 + dependencies: + '@types/estree': registry.npmmirror.com/@types/estree/1.0.0 + dev: true + + registry.npmmirror.com/@types/through/0.0.30: + resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/through/-/through-0.0.30.tgz} + name: '@types/through' + version: 0.0.30 + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + dev: true + + registry.npmmirror.com/@types/tinycolor2/1.4.3: + resolution: {integrity: sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/tinycolor2/-/tinycolor2-1.4.3.tgz} + name: '@types/tinycolor2' + version: 1.4.3 + dev: true + + registry.npmmirror.com/@types/trusted-types/2.0.3: + resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.3.tgz} + name: '@types/trusted-types' + version: 2.0.3 + dev: true + + registry.npmmirror.com/@types/web-bluetooth/0.0.14: + resolution: {integrity: sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.14.tgz} + name: '@types/web-bluetooth' + version: 0.0.14 + dev: false + + registry.npmmirror.com/@types/yargs-parser/21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz} + name: '@types/yargs-parser' + version: 21.0.0 + dev: true + + registry.npmmirror.com/@types/yargs/16.0.5: + resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/yargs/-/yargs-16.0.5.tgz} + name: '@types/yargs' + version: 16.0.5 + dependencies: + '@types/yargs-parser': registry.npmmirror.com/@types/yargs-parser/21.0.0 + dev: true + + registry.npmmirror.com/@typescript-eslint/eslint-plugin/5.54.0_6mj2wypvdnknez7kws2nfdgupi: + resolution: {integrity: sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz} + id: registry.npmmirror.com/@typescript-eslint/eslint-plugin/5.54.0 + name: '@typescript-eslint/eslint-plugin' + version: 5.54.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': registry.npmmirror.com/@typescript-eslint/parser/5.54.0_ycpbpc6yetojsgtrx3mwntkhsu + '@typescript-eslint/scope-manager': registry.npmmirror.com/@typescript-eslint/scope-manager/5.54.0 + '@typescript-eslint/type-utils': registry.npmmirror.com/@typescript-eslint/type-utils/5.54.0_ycpbpc6yetojsgtrx3mwntkhsu + '@typescript-eslint/utils': registry.npmmirror.com/@typescript-eslint/utils/5.54.0_ycpbpc6yetojsgtrx3mwntkhsu + debug: registry.npmmirror.com/debug/4.3.4 + eslint: registry.npmmirror.com/eslint/8.35.0 + grapheme-splitter: registry.npmmirror.com/grapheme-splitter/1.0.4 + ignore: registry.npmmirror.com/ignore/5.2.4 + natural-compare-lite: registry.npmmirror.com/natural-compare-lite/1.4.0 + regexpp: registry.npmmirror.com/regexpp/3.2.0 + semver: registry.npmmirror.com/semver/7.3.8 + tsutils: registry.npmmirror.com/tsutils/3.21.0_typescript@4.9.5 + typescript: registry.npmmirror.com/typescript/4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@typescript-eslint/experimental-utils/5.54.0_ycpbpc6yetojsgtrx3mwntkhsu: + resolution: {integrity: sha512-rRYECOTh5V3iWsrOzXi7h1jp3Bi9OkJHrb3wECi3DVqMGTilo9wAYmCbT+6cGdrzUY3MWcAa2mESM6FMik6tVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.54.0.tgz} + id: registry.npmmirror.com/@typescript-eslint/experimental-utils/5.54.0 + name: '@typescript-eslint/experimental-utils' + version: 5.54.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': registry.npmmirror.com/@typescript-eslint/utils/5.54.0_ycpbpc6yetojsgtrx3mwntkhsu + eslint: registry.npmmirror.com/eslint/8.35.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + registry.npmmirror.com/@typescript-eslint/parser/5.54.0_ycpbpc6yetojsgtrx3mwntkhsu: + resolution: {integrity: sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.54.0.tgz} + id: registry.npmmirror.com/@typescript-eslint/parser/5.54.0 + name: '@typescript-eslint/parser' + version: 5.54.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': registry.npmmirror.com/@typescript-eslint/scope-manager/5.54.0 + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types/5.54.0 + '@typescript-eslint/typescript-estree': registry.npmmirror.com/@typescript-eslint/typescript-estree/5.54.0_typescript@4.9.5 + debug: registry.npmmirror.com/debug/4.3.4 + eslint: registry.npmmirror.com/eslint/8.35.0 + typescript: registry.npmmirror.com/typescript/4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@typescript-eslint/scope-manager/5.54.0: + resolution: {integrity: sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz} + name: '@typescript-eslint/scope-manager' + version: 5.54.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types/5.54.0 + '@typescript-eslint/visitor-keys': registry.npmmirror.com/@typescript-eslint/visitor-keys/5.54.0 + dev: true + + registry.npmmirror.com/@typescript-eslint/type-utils/5.54.0_ycpbpc6yetojsgtrx3mwntkhsu: + resolution: {integrity: sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz} + id: registry.npmmirror.com/@typescript-eslint/type-utils/5.54.0 + name: '@typescript-eslint/type-utils' + version: 5.54.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': registry.npmmirror.com/@typescript-eslint/typescript-estree/5.54.0_typescript@4.9.5 + '@typescript-eslint/utils': registry.npmmirror.com/@typescript-eslint/utils/5.54.0_ycpbpc6yetojsgtrx3mwntkhsu + debug: registry.npmmirror.com/debug/4.3.4 + eslint: registry.npmmirror.com/eslint/8.35.0 + tsutils: registry.npmmirror.com/tsutils/3.21.0_typescript@4.9.5 + typescript: registry.npmmirror.com/typescript/4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@typescript-eslint/types/5.54.0: + resolution: {integrity: sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.54.0.tgz} + name: '@typescript-eslint/types' + version: 5.54.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + registry.npmmirror.com/@typescript-eslint/typescript-estree/5.54.0_typescript@4.9.5: + resolution: {integrity: sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz} + id: registry.npmmirror.com/@typescript-eslint/typescript-estree/5.54.0 + name: '@typescript-eslint/typescript-estree' + version: 5.54.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types/5.54.0 + '@typescript-eslint/visitor-keys': registry.npmmirror.com/@typescript-eslint/visitor-keys/5.54.0 + debug: registry.npmmirror.com/debug/4.3.4 + globby: registry.npmmirror.com/globby/11.1.0 + is-glob: registry.npmmirror.com/is-glob/4.0.3 + semver: registry.npmmirror.com/semver/7.3.8 + tsutils: registry.npmmirror.com/tsutils/3.21.0_typescript@4.9.5 + typescript: registry.npmmirror.com/typescript/4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@typescript-eslint/utils/5.54.0_ycpbpc6yetojsgtrx3mwntkhsu: + resolution: {integrity: sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.54.0.tgz} + id: registry.npmmirror.com/@typescript-eslint/utils/5.54.0 + name: '@typescript-eslint/utils' + version: 5.54.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': registry.npmmirror.com/@types/json-schema/7.0.11 + '@types/semver': registry.npmmirror.com/@types/semver/7.3.13 + '@typescript-eslint/scope-manager': registry.npmmirror.com/@typescript-eslint/scope-manager/5.54.0 + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types/5.54.0 + '@typescript-eslint/typescript-estree': registry.npmmirror.com/@typescript-eslint/typescript-estree/5.54.0_typescript@4.9.5 + eslint: registry.npmmirror.com/eslint/8.35.0 + eslint-scope: registry.npmmirror.com/eslint-scope/5.1.1 + eslint-utils: registry.npmmirror.com/eslint-utils/3.0.0_eslint@8.35.0 + semver: registry.npmmirror.com/semver/7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + registry.npmmirror.com/@typescript-eslint/visitor-keys/5.54.0: + resolution: {integrity: sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz} + name: '@typescript-eslint/visitor-keys' + version: 5.54.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types/5.54.0 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys/3.3.0 + dev: true + + registry.npmmirror.com/@vitejs/plugin-legacy/2.3.1_vite@3.2.5: + resolution: {integrity: sha512-J5KaGBlSt2tEYPVjM/C8dA6DkRzkFkbPe+Xb4IX5G+XOV5OGbVAfkMjKywdrkO3gGynO8S98i71Lmsff4cWkCQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vitejs/plugin-legacy/-/plugin-legacy-2.3.1.tgz} + id: registry.npmmirror.com/@vitejs/plugin-legacy/2.3.1 + name: '@vitejs/plugin-legacy' + version: 2.3.1 + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + terser: ^5.4.0 + vite: ^3.0.0 + dependencies: + '@babel/standalone': registry.npmmirror.com/@babel/standalone/7.21.2 + core-js: registry.npmmirror.com/core-js/3.29.0 + magic-string: registry.npmmirror.com/magic-string/0.26.7 + regenerator-runtime: registry.npmmirror.com/regenerator-runtime/0.13.11 + systemjs: registry.npmmirror.com/systemjs/6.14.0 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + dev: true + + registry.npmmirror.com/@vitejs/plugin-vue-jsx/1.3.10: + resolution: {integrity: sha512-Cf5zznh4yNMiEMBfTOztaDVDmK1XXfgxClzOSUVUc8WAmHzogrCUeM8B05ABzuGtg0D1amfng+mUmSIOFGP3Pw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-1.3.10.tgz} + name: '@vitejs/plugin-vue-jsx' + version: 1.3.10 + engines: {node: '>=12.0.0'} + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/plugin-syntax-import-meta': registry.npmmirror.com/@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.21.0 + '@babel/plugin-transform-typescript': registry.npmmirror.com/@babel/plugin-transform-typescript/7.21.0_@babel+core@7.21.0 + '@rollup/pluginutils': registry.npmmirror.com/@rollup/pluginutils/4.2.1 + '@vue/babel-plugin-jsx': registry.npmmirror.com/@vue/babel-plugin-jsx/1.1.1_@babel+core@7.21.0 + hash-sum: registry.npmmirror.com/hash-sum/2.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@vitejs/plugin-vue/3.2.0_vite@3.2.5+vue@3.2.47: + resolution: {integrity: sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz} + id: registry.npmmirror.com/@vitejs/plugin-vue/3.2.0 + name: '@vitejs/plugin-vue' + version: 3.2.0 + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 + vue: ^3.2.25 + dependencies: + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + vue: registry.npmmirror.com/vue/3.2.47 + dev: true + + registry.npmmirror.com/@volar/code-gen/0.33.9: + resolution: {integrity: sha512-HI+XemEjvOv9uSjqaNXIL1brSTaBy9vRTcXqz9787nL5VKktI8aU1Zk4w9yJR88eTqw7mlPIdMaib7Ps/QPq8Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@volar/code-gen/-/code-gen-0.33.9.tgz} + name: '@volar/code-gen' + version: 0.33.9 + dependencies: + '@volar/source-map': registry.npmmirror.com/@volar/source-map/0.33.9 + dev: true + + registry.npmmirror.com/@volar/pug-language-service/0.33.9: + resolution: {integrity: sha512-3oOV0HmoqkCyPAiHXSMoDzbLrSEQQv3d1dY/Lfo4H8hGoS8kUYJ958328TuLFc90yzsSmYnuvIux5AUok138pg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@volar/pug-language-service/-/pug-language-service-0.33.9.tgz} + name: '@volar/pug-language-service' + version: 0.33.9 + dependencies: + '@volar/code-gen': registry.npmmirror.com/@volar/code-gen/0.33.9 + '@volar/shared': registry.npmmirror.com/@volar/shared/0.33.9 + '@volar/source-map': registry.npmmirror.com/@volar/source-map/0.33.9 + '@volar/transforms': registry.npmmirror.com/@volar/transforms/0.33.9 + pug-lexer: registry.npmmirror.com/pug-lexer/5.0.1 + pug-parser: registry.npmmirror.com/pug-parser/6.0.0 + vscode-languageserver-textdocument: registry.npmmirror.com/vscode-languageserver-textdocument/1.0.8 + vscode-languageserver-types: registry.npmmirror.com/vscode-languageserver-types/3.17.3 + dev: true + + registry.npmmirror.com/@volar/shared/0.33.9: + resolution: {integrity: sha512-YqEBYT1SjyO+/W73lyKZlftumimsrYGvd98pHrIyvgc6HNhFnCcthRbyHskstjU6P8Bgj90mRl+7Sb29J+Z5ng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@volar/shared/-/shared-0.33.9.tgz} + name: '@volar/shared' + version: 0.33.9 + dependencies: + upath: registry.npmmirror.com/upath/2.0.1 + vscode-jsonrpc: registry.npmmirror.com/vscode-jsonrpc/8.1.0 + vscode-uri: registry.npmmirror.com/vscode-uri/3.0.7 + dev: true + + registry.npmmirror.com/@volar/source-map/0.33.9: + resolution: {integrity: sha512-SE7dfumZ8pLsbj4DtiSDTg2/d/JT45nF51rUnuz1UNSBPEeXBexlzvz5EQ2AyrX0FjAAd2ijrRtirTk1a0SFhQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@volar/source-map/-/source-map-0.33.9.tgz} + name: '@volar/source-map' + version: 0.33.9 + dev: true + + registry.npmmirror.com/@volar/transforms/0.33.9: + resolution: {integrity: sha512-qdc2d0ZW/G6jCx1pBmoMjMJTY245pZJjpPL/OCT3zgbDLGvLvqhowXxQYQd2YiNXqxJvbadEKviH5LiZL3sU9g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@volar/transforms/-/transforms-0.33.9.tgz} + name: '@volar/transforms' + version: 0.33.9 + dependencies: + '@volar/shared': registry.npmmirror.com/@volar/shared/0.33.9 + vscode-languageserver-types: registry.npmmirror.com/vscode-languageserver-types/3.17.3 + dev: true + + registry.npmmirror.com/@volar/vue-code-gen/0.33.9: + resolution: {integrity: sha512-qRCXcBhm1kUlI06sW5zolavn8gqZdSC2eIWw7jgbW68K/cGlTyXHGGZgJPM9P22cF9pcrjV1ByehO18ke2u+aA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@volar/vue-code-gen/-/vue-code-gen-0.33.9.tgz} + name: '@volar/vue-code-gen' + version: 0.33.9 + dependencies: + '@volar/code-gen': registry.npmmirror.com/@volar/code-gen/0.33.9 + '@volar/source-map': registry.npmmirror.com/@volar/source-map/0.33.9 + '@vue/compiler-core': registry.npmmirror.com/@vue/compiler-core/3.2.47 + '@vue/compiler-dom': registry.npmmirror.com/@vue/compiler-dom/3.2.47 + '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.47 + dev: true + + registry.npmmirror.com/@volar/vue-typescript/0.33.9: + resolution: {integrity: sha512-UUViaQfzAV7z49TB+IsGCT6ls7zdEUib2N0L4k8U9nZbd2BQA4kcR9nyS/8oDOU5fK3ErP+pPlC+XzGGamKhcw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@volar/vue-typescript/-/vue-typescript-0.33.9.tgz} + name: '@volar/vue-typescript' + version: 0.33.9 + dependencies: + '@volar/code-gen': registry.npmmirror.com/@volar/code-gen/0.33.9 + '@volar/pug-language-service': registry.npmmirror.com/@volar/pug-language-service/0.33.9 + '@volar/source-map': registry.npmmirror.com/@volar/source-map/0.33.9 + '@volar/vue-code-gen': registry.npmmirror.com/@volar/vue-code-gen/0.33.9 + '@vue/compiler-sfc': registry.npmmirror.com/@vue/compiler-sfc/3.2.47 + '@vue/reactivity': registry.npmmirror.com/@vue/reactivity/3.2.47 + dev: true + + registry.npmmirror.com/@vue/babel-helper-vue-transform-on/1.0.2: + resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz} + name: '@vue/babel-helper-vue-transform-on' + version: 1.0.2 + dev: true + + registry.npmmirror.com/@vue/babel-plugin-jsx/1.1.1_@babel+core@7.21.0: + resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz} + id: registry.npmmirror.com/@vue/babel-plugin-jsx/1.1.1 + name: '@vue/babel-plugin-jsx' + version: 1.1.1 + dependencies: + '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports/7.18.6 + '@babel/plugin-syntax-jsx': registry.npmmirror.com/@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.21.0 + '@babel/template': registry.npmmirror.com/@babel/template/7.20.7 + '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.21.2 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + '@vue/babel-helper-vue-transform-on': registry.npmmirror.com/@vue/babel-helper-vue-transform-on/1.0.2 + camelcase: registry.npmmirror.com/camelcase/6.3.0 + html-tags: registry.npmmirror.com/html-tags/3.2.0 + svg-tags: registry.npmmirror.com/svg-tags/1.0.0 + transitivePeerDependencies: + - '@babel/core' + - supports-color + dev: true + + registry.npmmirror.com/@vue/compiler-core/3.2.47: + resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.47.tgz} + name: '@vue/compiler-core' + version: 3.2.47 + dependencies: + '@babel/parser': registry.npmmirror.com/@babel/parser/7.21.2 + '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.47 + estree-walker: registry.npmmirror.com/estree-walker/2.0.2 + source-map: registry.npmmirror.com/source-map/0.6.1 + + registry.npmmirror.com/@vue/compiler-dom/3.2.47: + resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz} + name: '@vue/compiler-dom' + version: 3.2.47 + dependencies: + '@vue/compiler-core': registry.npmmirror.com/@vue/compiler-core/3.2.47 + '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.47 + + registry.npmmirror.com/@vue/compiler-sfc/3.2.47: + resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz} + name: '@vue/compiler-sfc' + version: 3.2.47 + dependencies: + '@babel/parser': registry.npmmirror.com/@babel/parser/7.21.2 + '@vue/compiler-core': registry.npmmirror.com/@vue/compiler-core/3.2.47 + '@vue/compiler-dom': registry.npmmirror.com/@vue/compiler-dom/3.2.47 + '@vue/compiler-ssr': registry.npmmirror.com/@vue/compiler-ssr/3.2.47 + '@vue/reactivity-transform': registry.npmmirror.com/@vue/reactivity-transform/3.2.47 + '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.47 + estree-walker: registry.npmmirror.com/estree-walker/2.0.2 + magic-string: registry.npmmirror.com/magic-string/0.25.9 + postcss: registry.npmmirror.com/postcss/8.4.21 + source-map: registry.npmmirror.com/source-map/0.6.1 + + registry.npmmirror.com/@vue/compiler-ssr/3.2.47: + resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz} + name: '@vue/compiler-ssr' + version: 3.2.47 + dependencies: + '@vue/compiler-dom': registry.npmmirror.com/@vue/compiler-dom/3.2.47 + '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.47 + + registry.npmmirror.com/@vue/devtools-api/6.5.0: + resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz} + name: '@vue/devtools-api' + version: 6.5.0 + dev: false + + registry.npmmirror.com/@vue/reactivity-transform/3.2.47: + resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz} + name: '@vue/reactivity-transform' + version: 3.2.47 + dependencies: + '@babel/parser': registry.npmmirror.com/@babel/parser/7.21.2 + '@vue/compiler-core': registry.npmmirror.com/@vue/compiler-core/3.2.47 + '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.47 + estree-walker: registry.npmmirror.com/estree-walker/2.0.2 + magic-string: registry.npmmirror.com/magic-string/0.25.9 + + registry.npmmirror.com/@vue/reactivity/3.2.47: + resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.47.tgz} + name: '@vue/reactivity' + version: 3.2.47 + dependencies: + '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.47 + + registry.npmmirror.com/@vue/runtime-core/3.2.47: + resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.47.tgz} + name: '@vue/runtime-core' + version: 3.2.47 + dependencies: + '@vue/reactivity': registry.npmmirror.com/@vue/reactivity/3.2.47 + '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.47 + + registry.npmmirror.com/@vue/runtime-dom/3.2.47: + resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz} + name: '@vue/runtime-dom' + version: 3.2.47 + dependencies: + '@vue/runtime-core': registry.npmmirror.com/@vue/runtime-core/3.2.47 + '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.47 + csstype: registry.npmmirror.com/csstype/2.6.21 + + registry.npmmirror.com/@vue/server-renderer/3.2.47_vue@3.2.47: + resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.47.tgz} + id: registry.npmmirror.com/@vue/server-renderer/3.2.47 + name: '@vue/server-renderer' + version: 3.2.47 + peerDependencies: + vue: 3.2.47 + dependencies: + '@vue/compiler-ssr': registry.npmmirror.com/@vue/compiler-ssr/3.2.47 + '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.47 + vue: registry.npmmirror.com/vue/3.2.47 + + registry.npmmirror.com/@vue/shared/3.2.47: + resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/shared/-/shared-3.2.47.tgz} + name: '@vue/shared' + version: 3.2.47 + + registry.npmmirror.com/@vue/test-utils/2.3.0_vue@3.2.47: + resolution: {integrity: sha512-S8/9Z+B4VSsTUNtZtzS7J1TfxJbf10n+gcH9X8cASbG0Tp7qD6vqs/sUNlmpzk6i7+pP00ptauJp9rygyW89Ww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/test-utils/-/test-utils-2.3.0.tgz} + id: registry.npmmirror.com/@vue/test-utils/2.3.0 + name: '@vue/test-utils' + version: 2.3.0 + peerDependencies: + vue: ^3.0.1 + dependencies: + js-beautify: registry.npmmirror.com/js-beautify/1.14.6 + vue: registry.npmmirror.com/vue/3.2.47 + optionalDependencies: + '@vue/compiler-dom': registry.npmmirror.com/@vue/compiler-dom/3.2.47 + '@vue/server-renderer': registry.npmmirror.com/@vue/server-renderer/3.2.47_vue@3.2.47 + dev: true + + registry.npmmirror.com/@vueuse/core/8.9.4_vue@3.2.47: + resolution: {integrity: sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vueuse/core/-/core-8.9.4.tgz} + id: registry.npmmirror.com/@vueuse/core/8.9.4 + name: '@vueuse/core' + version: 8.9.4 + peerDependencies: + '@vue/composition-api': ^1.1.0 + vue: ^2.6.0 || ^3.2.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + vue: + optional: true + dependencies: + '@types/web-bluetooth': registry.npmmirror.com/@types/web-bluetooth/0.0.14 + '@vueuse/metadata': registry.npmmirror.com/@vueuse/metadata/8.9.4 + '@vueuse/shared': registry.npmmirror.com/@vueuse/shared/8.9.4_vue@3.2.47 + vue: registry.npmmirror.com/vue/3.2.47 + vue-demi: registry.npmmirror.com/vue-demi/0.13.11_vue@3.2.47 + dev: false + + registry.npmmirror.com/@vueuse/metadata/8.9.4: + resolution: {integrity: sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vueuse/metadata/-/metadata-8.9.4.tgz} + name: '@vueuse/metadata' + version: 8.9.4 + dev: false + + registry.npmmirror.com/@vueuse/shared/8.9.4_vue@3.2.47: + resolution: {integrity: sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vueuse/shared/-/shared-8.9.4.tgz} + id: registry.npmmirror.com/@vueuse/shared/8.9.4 + name: '@vueuse/shared' + version: 8.9.4 + peerDependencies: + '@vue/composition-api': ^1.1.0 + vue: ^2.6.0 || ^3.2.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + vue: + optional: true + dependencies: + vue: registry.npmmirror.com/vue/3.2.47 + vue-demi: registry.npmmirror.com/vue-demi/0.13.11_vue@3.2.47 + dev: false + + registry.npmmirror.com/@windicss/config/1.8.10: + resolution: {integrity: sha512-O9SsC110b1Ik3YYa4Ck/0TWuCo7YFfA9KDrwD5sAeqscT5COIGK1HszdCT3oh0MJFej2wNrvpfyW9h6yQaW6PA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@windicss/config/-/config-1.8.10.tgz} + name: '@windicss/config' + version: 1.8.10 + dependencies: + debug: registry.npmmirror.com/debug/4.3.4 + jiti: registry.npmmirror.com/jiti/1.17.1 + windicss: registry.npmmirror.com/windicss/3.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@windicss/plugin-utils/1.8.10: + resolution: {integrity: sha512-Phqk5OW1w+Mv+ry6t7BzAeDq3aMhbI94gR49j9vQCufFfDGCHndhhjtMK0sBv+NPJUsIAIh6qayb1iwBCXUGrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@windicss/plugin-utils/-/plugin-utils-1.8.10.tgz} + name: '@windicss/plugin-utils' + version: 1.8.10 + dependencies: + '@antfu/utils': registry.npmmirror.com/@antfu/utils/0.7.2 + '@windicss/config': registry.npmmirror.com/@windicss/config/1.8.10 + debug: registry.npmmirror.com/debug/4.3.4 + fast-glob: registry.npmmirror.com/fast-glob/3.2.12 + magic-string: registry.npmmirror.com/magic-string/0.27.0 + micromatch: registry.npmmirror.com/micromatch/4.0.5 + windicss: registry.npmmirror.com/windicss/3.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@zxcvbn-ts/core/2.2.1: + resolution: {integrity: sha512-Cg1JyRpCDIF+Dh3nauqygmmCYxogNVZDxSn+9PgkPD1HZ2QiJe4elruVJrGmYRS7muGmZ1hNJq8ySQdPv6GHaw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@zxcvbn-ts/core/-/core-2.2.1.tgz} + name: '@zxcvbn-ts/core' + version: 2.2.1 + dependencies: + fastest-levenshtein: registry.npmmirror.com/fastest-levenshtein/1.0.16 + dev: false + + registry.npmmirror.com/JSONStream/1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/JSONStream/-/JSONStream-1.3.5.tgz} + name: JSONStream + version: 1.3.5 + hasBin: true + dependencies: + jsonparse: registry.npmmirror.com/jsonparse/1.3.1 + through: registry.npmmirror.com/through/2.3.8 + dev: true + + registry.npmmirror.com/abab/2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz} + name: abab + version: 2.0.6 + dev: true + + registry.npmmirror.com/abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz} + name: abbrev + version: 1.1.1 + dev: true + + registry.npmmirror.com/acorn-globals/6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn-globals/-/acorn-globals-6.0.0.tgz} + name: acorn-globals + version: 6.0.0 + dependencies: + acorn: registry.npmmirror.com/acorn/7.4.1 + acorn-walk: registry.npmmirror.com/acorn-walk/7.2.0 + dev: true + + registry.npmmirror.com/acorn-jsx/5.3.2_acorn@8.8.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz} + id: registry.npmmirror.com/acorn-jsx/5.3.2 + name: acorn-jsx + version: 5.3.2 + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: registry.npmmirror.com/acorn/8.8.2 + dev: true + + registry.npmmirror.com/acorn-walk/7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz} + name: acorn-walk + version: 7.2.0 + engines: {node: '>=0.4.0'} + dev: true + + registry.npmmirror.com/acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz} + name: acorn-walk + version: 8.2.0 + engines: {node: '>=0.4.0'} + dev: true + + registry.npmmirror.com/acorn/7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz} + name: acorn + version: 7.4.1 + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + registry.npmmirror.com/acorn/8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn/-/acorn-8.8.2.tgz} + name: acorn + version: 8.8.2 + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + registry.npmmirror.com/add-stream/1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/add-stream/-/add-stream-1.0.0.tgz} + name: add-stream + version: 1.0.0 + dev: true + + registry.npmmirror.com/agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz} + name: agent-base + version: 6.0.2 + engines: {node: '>= 6.0.0'} + dependencies: + debug: registry.npmmirror.com/debug/4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/aggregate-error/3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz} + name: aggregate-error + version: 3.1.0 + engines: {node: '>=8'} + dependencies: + clean-stack: registry.npmmirror.com/clean-stack/2.2.0 + indent-string: registry.npmmirror.com/indent-string/4.0.0 + dev: true + + registry.npmmirror.com/ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz} + name: ajv + version: 6.12.6 + dependencies: + fast-deep-equal: registry.npmmirror.com/fast-deep-equal/3.1.3 + fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify/2.1.0 + json-schema-traverse: registry.npmmirror.com/json-schema-traverse/0.4.1 + uri-js: registry.npmmirror.com/uri-js/4.4.1 + dev: true + + registry.npmmirror.com/ajv/8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz} + name: ajv + version: 8.12.0 + dependencies: + fast-deep-equal: registry.npmmirror.com/fast-deep-equal/3.1.3 + json-schema-traverse: registry.npmmirror.com/json-schema-traverse/1.0.0 + require-from-string: registry.npmmirror.com/require-from-string/2.0.2 + uri-js: registry.npmmirror.com/uri-js/4.4.1 + dev: true + + registry.npmmirror.com/ansi-escapes/4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz} + name: ansi-escapes + version: 4.3.2 + engines: {node: '>=8'} + dependencies: + type-fest: registry.npmmirror.com/type-fest/0.21.3 + dev: true + + registry.npmmirror.com/ansi-regex/2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz} + name: ansi-regex + version: 2.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz} + name: ansi-regex + version: 5.0.1 + engines: {node: '>=8'} + + registry.npmmirror.com/ansi-regex/6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz} + name: ansi-regex + version: 6.0.1 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/ansi-styles/2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz} + name: ansi-styles + version: 2.2.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz} + name: ansi-styles + version: 3.2.1 + engines: {node: '>=4'} + dependencies: + color-convert: registry.npmmirror.com/color-convert/1.9.3 + dev: true + + registry.npmmirror.com/ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz} + name: ansi-styles + version: 4.3.0 + engines: {node: '>=8'} + dependencies: + color-convert: registry.npmmirror.com/color-convert/2.0.1 + + registry.npmmirror.com/ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz} + name: ansi-styles + version: 5.2.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/ansi-styles/6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz} + name: ansi-styles + version: 6.2.1 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/ant-design-vue/3.2.15_vue@3.2.47: + resolution: {integrity: sha512-sJfE7LWimSdAPe4dzNyQBrmVMnOTNQTkG9oOyr+7W8qIYrX8sYWyC68Nn1uum4KBJUSZUa/BU6dohvTG0urBhA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ant-design-vue/-/ant-design-vue-3.2.15.tgz} + id: registry.npmmirror.com/ant-design-vue/3.2.15 + name: ant-design-vue + version: 3.2.15 + engines: {node: '>=12.22.0'} + peerDependencies: + vue: '>=3.2.0' + dependencies: + '@ant-design/colors': registry.npmmirror.com/@ant-design/colors/6.0.0 + '@ant-design/icons-vue': registry.npmmirror.com/@ant-design/icons-vue/6.1.0_vue@3.2.47 + '@babel/runtime': registry.npmmirror.com/@babel/runtime/7.21.0 + '@ctrl/tinycolor': registry.npmmirror.com/@ctrl/tinycolor/3.6.0 + '@simonwep/pickr': registry.npmmirror.com/@simonwep/pickr/1.8.2 + array-tree-filter: registry.npmmirror.com/array-tree-filter/2.1.0 + async-validator: registry.npmmirror.com/async-validator/4.2.5 + dayjs: registry.npmmirror.com/dayjs/1.11.7 + dom-align: registry.npmmirror.com/dom-align/1.12.4 + dom-scroll-into-view: registry.npmmirror.com/dom-scroll-into-view/2.0.1 + lodash: registry.npmmirror.com/lodash/4.17.21 + lodash-es: registry.npmmirror.com/lodash-es/4.17.21 + resize-observer-polyfill: registry.npmmirror.com/resize-observer-polyfill/1.5.1 + scroll-into-view-if-needed: registry.npmmirror.com/scroll-into-view-if-needed/2.2.31 + shallow-equal: registry.npmmirror.com/shallow-equal/1.2.1 + vue: registry.npmmirror.com/vue/3.2.47 + vue-types: registry.npmmirror.com/vue-types/3.0.2_vue@3.2.47 + warning: registry.npmmirror.com/warning/4.0.3 + dev: false + + registry.npmmirror.com/anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz} + name: anymatch + version: 3.1.3 + engines: {node: '>= 8'} + dependencies: + normalize-path: registry.npmmirror.com/normalize-path/3.0.0 + picomatch: registry.npmmirror.com/picomatch/2.3.1 + dev: true + + registry.npmmirror.com/arch/2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz} + name: arch + version: 2.2.0 + dev: true + + registry.npmmirror.com/archive-type/4.0.0: + resolution: {integrity: sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/archive-type/-/archive-type-4.0.0.tgz} + name: archive-type + version: 4.0.0 + engines: {node: '>=4'} + dependencies: + file-type: registry.npmmirror.com/file-type/4.4.0 + dev: true + + registry.npmmirror.com/arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz} + name: arg + version: 4.1.3 + dev: true + + registry.npmmirror.com/argparse/1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz} + name: argparse + version: 1.0.10 + dependencies: + sprintf-js: registry.npmmirror.com/sprintf-js/1.0.3 + dev: true + + registry.npmmirror.com/argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz} + name: argparse + version: 2.0.1 + dev: true + + registry.npmmirror.com/arr-diff/4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz} + name: arr-diff + version: 4.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/arr-flatten/1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz} + name: arr-flatten + version: 1.1.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/arr-union/3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz} + name: arr-union + version: 3.1.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/array-differ/3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-differ/-/array-differ-3.0.0.tgz} + name: array-differ + version: 3.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/array-find-index/1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-find-index/-/array-find-index-1.0.2.tgz} + name: array-find-index + version: 1.0.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/array-ify/1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-ify/-/array-ify-1.0.0.tgz} + name: array-ify + version: 1.0.0 + dev: true + + registry.npmmirror.com/array-tree-filter/2.1.0: + resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz} + name: array-tree-filter + version: 2.1.0 + dev: false + + registry.npmmirror.com/array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz} + name: array-union + version: 2.1.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/array-unique/0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz} + name: array-unique + version: 0.3.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/arrify/1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/arrify/-/arrify-1.0.1.tgz} + name: arrify + version: 1.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/arrify/2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/arrify/-/arrify-2.0.1.tgz} + name: arrify + version: 2.0.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/assign-symbols/1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz} + name: assign-symbols + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/astral-regex/2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz} + name: astral-regex + version: 2.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/async-validator/4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz} + name: async-validator + version: 4.2.5 + dev: false + + registry.npmmirror.com/async/2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/async/-/async-2.6.4.tgz} + name: async + version: 2.6.4 + dependencies: + lodash: registry.npmmirror.com/lodash/4.17.21 + dev: true + + registry.npmmirror.com/async/3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/async/-/async-3.2.4.tgz} + name: async + version: 3.2.4 + dev: true + + registry.npmmirror.com/asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz} + name: asynckit + version: 0.4.0 + dev: true + + registry.npmmirror.com/at-least-node/1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz} + name: at-least-node + version: 1.0.0 + engines: {node: '>= 4.0.0'} + dev: true + + registry.npmmirror.com/atob/2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz} + name: atob + version: 2.1.2 + engines: {node: '>= 4.5.0'} + hasBin: true + dev: true + + registry.npmmirror.com/autoprefixer/10.4.13_postcss@8.4.21: + resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.13.tgz} + id: registry.npmmirror.com/autoprefixer/10.4.13 + name: autoprefixer + version: 10.4.13 + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: registry.npmmirror.com/browserslist/4.21.5 + caniuse-lite: registry.npmmirror.com/caniuse-lite/1.0.30001460 + fraction.js: registry.npmmirror.com/fraction.js/4.2.0 + normalize-range: registry.npmmirror.com/normalize-range/0.1.2 + picocolors: registry.npmmirror.com/picocolors/1.0.0 + postcss: registry.npmmirror.com/postcss/8.4.21 + postcss-value-parser: registry.npmmirror.com/postcss-value-parser/4.2.0 + dev: true + + registry.npmmirror.com/available-typed-arrays/1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz} + name: available-typed-arrays + version: 1.0.5 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/axios/0.26.1: + resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/axios/-/axios-0.26.1.tgz} + name: axios + version: 0.26.1 + dependencies: + follow-redirects: registry.npmmirror.com/follow-redirects/1.15.2 + transitivePeerDependencies: + - debug + dev: false + + registry.npmmirror.com/axios/0.26.1_debug@4.3.4: + resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/axios/-/axios-0.26.1.tgz} + id: registry.npmmirror.com/axios/0.26.1 + name: axios + version: 0.26.1 + dependencies: + follow-redirects: registry.npmmirror.com/follow-redirects/1.15.2_debug@4.3.4 + transitivePeerDependencies: + - debug + dev: true + + registry.npmmirror.com/axios/1.3.4_debug@4.3.4: + resolution: {integrity: sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/axios/-/axios-1.3.4.tgz} + id: registry.npmmirror.com/axios/1.3.4 + name: axios + version: 1.3.4 + dependencies: + follow-redirects: registry.npmmirror.com/follow-redirects/1.15.2 + form-data: registry.npmmirror.com/form-data/4.0.0 + proxy-from-env: registry.npmmirror.com/proxy-from-env/1.1.0 + transitivePeerDependencies: + - debug + dev: true + + registry.npmmirror.com/babel-jest/27.5.1_@babel+core@7.21.0: + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-jest/-/babel-jest-27.5.1.tgz} + id: registry.npmmirror.com/babel-jest/27.5.1 + name: babel-jest + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@jest/transform': registry.npmmirror.com/@jest/transform/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/babel__core': registry.npmmirror.com/@types/babel__core/7.20.0 + babel-plugin-istanbul: registry.npmmirror.com/babel-plugin-istanbul/6.1.1 + babel-preset-jest: registry.npmmirror.com/babel-preset-jest/27.5.1_@babel+core@7.21.0 + chalk: registry.npmmirror.com/chalk/4.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + slash: registry.npmmirror.com/slash/3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/babel-plugin-istanbul/6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz} + name: babel-plugin-istanbul + version: 6.1.1 + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 + '@istanbuljs/load-nyc-config': registry.npmmirror.com/@istanbuljs/load-nyc-config/1.1.0 + '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema/0.1.3 + istanbul-lib-instrument: registry.npmmirror.com/istanbul-lib-instrument/5.2.1 + test-exclude: registry.npmmirror.com/test-exclude/6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/babel-plugin-jest-hoist/27.5.1: + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz} + name: babel-plugin-jest-hoist + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/template': registry.npmmirror.com/@babel/template/7.20.7 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + '@types/babel__core': registry.npmmirror.com/@types/babel__core/7.20.0 + '@types/babel__traverse': registry.npmmirror.com/@types/babel__traverse/7.18.3 + dev: true + + registry.npmmirror.com/babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.21.0: + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz} + id: registry.npmmirror.com/babel-plugin-polyfill-corejs2/0.3.3 + name: babel-plugin-polyfill-corejs2 + version: 0.3.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': registry.npmmirror.com/@babel/compat-data/7.21.0 + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-define-polyfill-provider': registry.npmmirror.com/@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.0 + semver: registry.npmmirror.com/semver/6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.21.0: + resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz} + id: registry.npmmirror.com/babel-plugin-polyfill-corejs3/0.6.0 + name: babel-plugin-polyfill-corejs3 + version: 0.6.0 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-define-polyfill-provider': registry.npmmirror.com/@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.0 + core-js-compat: registry.npmmirror.com/core-js-compat/3.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.21.0: + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz} + id: registry.npmmirror.com/babel-plugin-polyfill-regenerator/0.4.1 + name: babel-plugin-polyfill-regenerator + version: 0.4.1 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/helper-define-polyfill-provider': registry.npmmirror.com/@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/babel-plugin-transform-runtime/6.23.0: + resolution: {integrity: sha512-cpGMVC1vt/772y3jx1gwSaTitQVZuFDlllgreMsZ+rTYC6jlYXRyf5FQOgSnckOiA5QmzbXTyBY2A5AmZXF1fA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz} + name: babel-plugin-transform-runtime + version: 6.23.0 + dependencies: + babel-runtime: registry.npmmirror.com/babel-runtime/6.26.0 + dev: false + + registry.npmmirror.com/babel-preset-current-node-syntax/1.0.1_@babel+core@7.21.0: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz} + id: registry.npmmirror.com/babel-preset-current-node-syntax/1.0.1 + name: babel-preset-current-node-syntax + version: 1.0.1 + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/plugin-syntax-async-generators': registry.npmmirror.com/@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.0 + '@babel/plugin-syntax-bigint': registry.npmmirror.com/@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-class-properties': registry.npmmirror.com/@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.0 + '@babel/plugin-syntax-import-meta': registry.npmmirror.com/@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.21.0 + '@babel/plugin-syntax-json-strings': registry.npmmirror.com/@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-logical-assignment-operators': registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.0 + '@babel/plugin-syntax-nullish-coalescing-operator': registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-numeric-separator': registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.0 + '@babel/plugin-syntax-object-rest-spread': registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-optional-catch-binding': registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-optional-chaining': registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-top-level-await': registry.npmmirror.com/@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.0 + dev: true + + registry.npmmirror.com/babel-preset-jest/27.5.1_@babel+core@7.21.0: + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz} + id: registry.npmmirror.com/babel-preset-jest/27.5.1 + name: babel-preset-jest + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + babel-plugin-jest-hoist: registry.npmmirror.com/babel-plugin-jest-hoist/27.5.1 + babel-preset-current-node-syntax: registry.npmmirror.com/babel-preset-current-node-syntax/1.0.1_@babel+core@7.21.0 + dev: true + + registry.npmmirror.com/babel-runtime/6.26.0: + resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz} + name: babel-runtime + version: 6.26.0 + dependencies: + core-js: registry.npmmirror.com/core-js/2.6.12 + regenerator-runtime: registry.npmmirror.com/regenerator-runtime/0.11.1 + dev: false + + registry.npmmirror.com/balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz} + name: balanced-match + version: 1.0.2 + dev: true + + registry.npmmirror.com/balanced-match/2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/balanced-match/-/balanced-match-2.0.0.tgz} + name: balanced-match + version: 2.0.0 + dev: true + + registry.npmmirror.com/base/0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/base/-/base-0.11.2.tgz} + name: base + version: 0.11.2 + engines: {node: '>=0.10.0'} + dependencies: + cache-base: registry.npmmirror.com/cache-base/1.0.1 + class-utils: registry.npmmirror.com/class-utils/0.3.6 + component-emitter: registry.npmmirror.com/component-emitter/1.3.0 + define-property: registry.npmmirror.com/define-property/1.0.0 + isobject: registry.npmmirror.com/isobject/3.0.1 + mixin-deep: registry.npmmirror.com/mixin-deep/1.3.2 + pascalcase: registry.npmmirror.com/pascalcase/0.1.1 + dev: true + + registry.npmmirror.com/base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz} + name: base64-js + version: 1.5.1 + dev: true + + registry.npmmirror.com/basic-auth/2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/basic-auth/-/basic-auth-2.0.1.tgz} + name: basic-auth + version: 2.0.1 + engines: {node: '>= 0.8'} + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer/5.1.2 + dev: true + + registry.npmmirror.com/before-after-hook/2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/before-after-hook/-/before-after-hook-2.2.3.tgz} + name: before-after-hook + version: 2.2.3 + dev: true + + registry.npmmirror.com/big.js/5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz} + name: big.js + version: 5.2.2 + dev: true + + registry.npmmirror.com/bin-build/3.0.0: + resolution: {integrity: sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bin-build/-/bin-build-3.0.0.tgz} + name: bin-build + version: 3.0.0 + engines: {node: '>=4'} + dependencies: + decompress: registry.npmmirror.com/decompress/4.2.1 + download: registry.npmmirror.com/download/6.2.5 + execa: registry.npmmirror.com/execa/0.7.0 + p-map-series: registry.npmmirror.com/p-map-series/1.0.0 + tempfile: registry.npmmirror.com/tempfile/2.0.0 + dev: true + + registry.npmmirror.com/bin-check/4.1.0: + resolution: {integrity: sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bin-check/-/bin-check-4.1.0.tgz} + name: bin-check + version: 4.1.0 + engines: {node: '>=4'} + dependencies: + execa: registry.npmmirror.com/execa/0.7.0 + executable: registry.npmmirror.com/executable/4.1.1 + dev: true + + registry.npmmirror.com/bin-version-check/4.0.0: + resolution: {integrity: sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bin-version-check/-/bin-version-check-4.0.0.tgz} + name: bin-version-check + version: 4.0.0 + engines: {node: '>=6'} + dependencies: + bin-version: registry.npmmirror.com/bin-version/3.1.0 + semver: registry.npmmirror.com/semver/5.7.1 + semver-truncate: registry.npmmirror.com/semver-truncate/1.1.2 + dev: true + + registry.npmmirror.com/bin-version/3.1.0: + resolution: {integrity: sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bin-version/-/bin-version-3.1.0.tgz} + name: bin-version + version: 3.1.0 + engines: {node: '>=6'} + dependencies: + execa: registry.npmmirror.com/execa/1.0.0 + find-versions: registry.npmmirror.com/find-versions/3.2.0 + dev: true + + registry.npmmirror.com/bin-wrapper-china/0.1.0: + resolution: {integrity: sha512-1UCm17WYEbgry50tup+AQN+JGVEVzoW4f8HMl899k1lvuFxWKGZXl/G2fgxQxAckRjnloO3ijLVVEsv8zescUg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bin-wrapper-china/-/bin-wrapper-china-0.1.0.tgz} + name: bin-wrapper-china + version: 0.1.0 + engines: {node: '>=8.3'} + hasBin: true + dependencies: + bin-check: registry.npmmirror.com/bin-check/4.1.0 + bin-version-check: registry.npmmirror.com/bin-version-check/4.0.0 + binary-mirror-config: registry.npmmirror.com/binary-mirror-config/1.41.0 + download: registry.npmmirror.com/download/7.1.0 + import-lazy: registry.npmmirror.com/import-lazy/4.0.0 + os-filter-obj: registry.npmmirror.com/os-filter-obj/2.0.0 + pify: registry.npmmirror.com/pify/4.0.1 + dev: true + + registry.npmmirror.com/binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz} + name: binary-extensions + version: 2.2.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/binary-mirror-config/1.41.0: + resolution: {integrity: sha512-ZiIhR1s6Sv1Fv6qCQqfPjx0Cj86BgFlhqNxZgHkQOWcxJcMbO3mj1iqsuVjowYqJqeZL8e52+IEv7IRnSX6T6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/binary-mirror-config/-/binary-mirror-config-1.41.0.tgz} + name: binary-mirror-config + version: 1.41.0 + dev: true + + registry.npmmirror.com/bl/1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bl/-/bl-1.2.3.tgz} + name: bl + version: 1.2.3 + dependencies: + readable-stream: registry.npmmirror.com/readable-stream/2.3.8 + safe-buffer: registry.npmmirror.com/safe-buffer/5.2.1 + dev: true + + registry.npmmirror.com/bl/4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz} + name: bl + version: 4.1.0 + dependencies: + buffer: registry.npmmirror.com/buffer/5.7.1 + inherits: registry.npmmirror.com/inherits/2.0.4 + readable-stream: registry.npmmirror.com/readable-stream/3.6.1 + dev: true + + registry.npmmirror.com/bluebird/3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz} + name: bluebird + version: 3.7.2 + dev: true + + registry.npmmirror.com/boolbase/1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz} + name: boolbase + version: 1.0.0 + dev: true + + registry.npmmirror.com/brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz} + name: brace-expansion + version: 1.1.11 + dependencies: + balanced-match: registry.npmmirror.com/balanced-match/1.0.2 + concat-map: registry.npmmirror.com/concat-map/0.0.1 + dev: true + + registry.npmmirror.com/brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz} + name: brace-expansion + version: 2.0.1 + dependencies: + balanced-match: registry.npmmirror.com/balanced-match/1.0.2 + dev: true + + registry.npmmirror.com/braces/2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz} + name: braces + version: 2.3.2 + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: registry.npmmirror.com/arr-flatten/1.1.0 + array-unique: registry.npmmirror.com/array-unique/0.3.2 + extend-shallow: registry.npmmirror.com/extend-shallow/2.0.1 + fill-range: registry.npmmirror.com/fill-range/4.0.0 + isobject: registry.npmmirror.com/isobject/3.0.1 + repeat-element: registry.npmmirror.com/repeat-element/1.1.4 + snapdragon: registry.npmmirror.com/snapdragon/0.8.2 + snapdragon-node: registry.npmmirror.com/snapdragon-node/2.1.1 + split-string: registry.npmmirror.com/split-string/3.1.0 + to-regex: registry.npmmirror.com/to-regex/3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz} + name: braces + version: 3.0.2 + engines: {node: '>=8'} + dependencies: + fill-range: registry.npmmirror.com/fill-range/7.0.1 + dev: true + + registry.npmmirror.com/browser-process-hrtime/1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz} + name: browser-process-hrtime + version: 1.0.0 + dev: true + + registry.npmmirror.com/browserslist/4.21.5: + resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browserslist/-/browserslist-4.21.5.tgz} + name: browserslist + version: 4.21.5 + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: registry.npmmirror.com/caniuse-lite/1.0.30001460 + electron-to-chromium: registry.npmmirror.com/electron-to-chromium/1.4.320 + node-releases: registry.npmmirror.com/node-releases/2.0.10 + update-browserslist-db: registry.npmmirror.com/update-browserslist-db/1.0.10_browserslist@4.21.5 + dev: true + + registry.npmmirror.com/bs-logger/0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bs-logger/-/bs-logger-0.2.6.tgz} + name: bs-logger + version: 0.2.6 + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify/2.1.0 + dev: true + + registry.npmmirror.com/bser/2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz} + name: bser + version: 2.1.1 + dependencies: + node-int64: registry.npmmirror.com/node-int64/0.4.0 + dev: true + + registry.npmmirror.com/buffer-alloc-unsafe/1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz} + name: buffer-alloc-unsafe + version: 1.1.0 + dev: true + + registry.npmmirror.com/buffer-alloc/1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz} + name: buffer-alloc + version: 1.2.0 + dependencies: + buffer-alloc-unsafe: registry.npmmirror.com/buffer-alloc-unsafe/1.1.0 + buffer-fill: registry.npmmirror.com/buffer-fill/1.0.0 + dev: true + + registry.npmmirror.com/buffer-crc32/0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz} + name: buffer-crc32 + version: 0.2.13 + dev: true + + registry.npmmirror.com/buffer-fill/1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/buffer-fill/-/buffer-fill-1.0.0.tgz} + name: buffer-fill + version: 1.0.0 + dev: true + + registry.npmmirror.com/buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz} + name: buffer-from + version: 1.1.2 + dev: true + + registry.npmmirror.com/buffer/5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz} + name: buffer + version: 5.7.1 + dependencies: + base64-js: registry.npmmirror.com/base64-js/1.5.1 + ieee754: registry.npmmirror.com/ieee754/1.2.1 + dev: true + + registry.npmmirror.com/builtin-modules/3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/builtin-modules/-/builtin-modules-3.3.0.tgz} + name: builtin-modules + version: 3.3.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/builtins/4.1.0: + resolution: {integrity: sha512-1bPRZQtmKaO6h7qV1YHXNtr6nCK28k0Zo95KM4dXfILcZZwoHJBN1m3lfLv9LPkcOZlrSr+J1bzMaZFO98Yq0w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/builtins/-/builtins-4.1.0.tgz} + name: builtins + version: 4.1.0 + dependencies: + semver: registry.npmmirror.com/semver/7.3.8 + dev: true + + registry.npmmirror.com/cache-base/1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz} + name: cache-base + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: registry.npmmirror.com/collection-visit/1.0.0 + component-emitter: registry.npmmirror.com/component-emitter/1.3.0 + get-value: registry.npmmirror.com/get-value/2.0.6 + has-value: registry.npmmirror.com/has-value/1.0.0 + isobject: registry.npmmirror.com/isobject/3.0.1 + set-value: registry.npmmirror.com/set-value/2.0.1 + to-object-path: registry.npmmirror.com/to-object-path/0.3.0 + union-value: registry.npmmirror.com/union-value/1.0.1 + unset-value: registry.npmmirror.com/unset-value/1.0.0 + dev: true + + registry.npmmirror.com/cacheable-request/2.1.4: + resolution: {integrity: sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cacheable-request/-/cacheable-request-2.1.4.tgz} + name: cacheable-request + version: 2.1.4 + dependencies: + clone-response: registry.npmmirror.com/clone-response/1.0.2 + get-stream: registry.npmmirror.com/get-stream/3.0.0 + http-cache-semantics: registry.npmmirror.com/http-cache-semantics/3.8.1 + keyv: registry.npmmirror.com/keyv/3.0.0 + lowercase-keys: registry.npmmirror.com/lowercase-keys/1.0.0 + normalize-url: registry.npmmirror.com/normalize-url/2.0.1 + responselike: registry.npmmirror.com/responselike/1.0.2 + dev: true + + registry.npmmirror.com/cachedir/2.3.0: + resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cachedir/-/cachedir-2.3.0.tgz} + name: cachedir + version: 2.3.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz} + name: call-bind + version: 1.0.2 + dependencies: + function-bind: registry.npmmirror.com/function-bind/1.1.1 + get-intrinsic: registry.npmmirror.com/get-intrinsic/1.2.0 + + registry.npmmirror.com/callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz} + name: callsites + version: 3.1.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/camel-case/4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz} + name: camel-case + version: 4.1.2 + dependencies: + pascal-case: registry.npmmirror.com/pascal-case/3.1.2 + tslib: registry.npmmirror.com/tslib/2.5.0 + dev: true + + registry.npmmirror.com/camelcase-keys/2.1.0: + resolution: {integrity: sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz} + name: camelcase-keys + version: 2.1.0 + engines: {node: '>=0.10.0'} + dependencies: + camelcase: registry.npmmirror.com/camelcase/2.1.1 + map-obj: registry.npmmirror.com/map-obj/1.0.1 + dev: true + + registry.npmmirror.com/camelcase-keys/6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz} + name: camelcase-keys + version: 6.2.2 + engines: {node: '>=8'} + dependencies: + camelcase: registry.npmmirror.com/camelcase/5.3.1 + map-obj: registry.npmmirror.com/map-obj/4.3.0 + quick-lru: registry.npmmirror.com/quick-lru/4.0.1 + dev: true + + registry.npmmirror.com/camelcase/2.1.1: + resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/camelcase/-/camelcase-2.1.1.tgz} + name: camelcase + version: 2.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/camelcase/5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz} + name: camelcase + version: 5.3.1 + engines: {node: '>=6'} + + registry.npmmirror.com/camelcase/6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz} + name: camelcase + version: 6.3.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/caniuse-lite/1.0.30001460: + resolution: {integrity: sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001460.tgz} + name: caniuse-lite + version: 1.0.30001460 + dev: true + + registry.npmmirror.com/capital-case/1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/capital-case/-/capital-case-1.0.4.tgz} + name: capital-case + version: 1.0.4 + dependencies: + no-case: registry.npmmirror.com/no-case/3.0.4 + tslib: registry.npmmirror.com/tslib/2.5.0 + upper-case-first: registry.npmmirror.com/upper-case-first/2.0.2 + dev: true + + registry.npmmirror.com/caw/2.0.1: + resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/caw/-/caw-2.0.1.tgz} + name: caw + version: 2.0.1 + engines: {node: '>=4'} + dependencies: + get-proxy: registry.npmmirror.com/get-proxy/2.1.0 + isurl: registry.npmmirror.com/isurl/1.0.0 + tunnel-agent: registry.npmmirror.com/tunnel-agent/0.6.0 + url-to-options: registry.npmmirror.com/url-to-options/1.0.1 + dev: true + + registry.npmmirror.com/chalk/1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz} + name: chalk + version: 1.1.3 + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles/2.2.1 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp/1.0.5 + has-ansi: registry.npmmirror.com/has-ansi/2.0.0 + strip-ansi: registry.npmmirror.com/strip-ansi/3.0.1 + supports-color: registry.npmmirror.com/supports-color/2.0.0 + dev: true + + registry.npmmirror.com/chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz} + name: chalk + version: 2.4.2 + engines: {node: '>=4'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles/3.2.1 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp/1.0.5 + supports-color: registry.npmmirror.com/supports-color/5.5.0 + dev: true + + registry.npmmirror.com/chalk/3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz} + name: chalk + version: 3.0.0 + engines: {node: '>=8'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles/4.3.0 + supports-color: registry.npmmirror.com/supports-color/7.2.0 + dev: true + + registry.npmmirror.com/chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz} + name: chalk + version: 4.1.2 + engines: {node: '>=10'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles/4.3.0 + supports-color: registry.npmmirror.com/supports-color/7.2.0 + dev: true + + registry.npmmirror.com/change-case/4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/change-case/-/change-case-4.1.2.tgz} + name: change-case + version: 4.1.2 + dependencies: + camel-case: registry.npmmirror.com/camel-case/4.1.2 + capital-case: registry.npmmirror.com/capital-case/1.0.4 + constant-case: registry.npmmirror.com/constant-case/3.0.4 + dot-case: registry.npmmirror.com/dot-case/3.0.4 + header-case: registry.npmmirror.com/header-case/2.0.4 + no-case: registry.npmmirror.com/no-case/3.0.4 + param-case: registry.npmmirror.com/param-case/3.0.4 + pascal-case: registry.npmmirror.com/pascal-case/3.1.2 + path-case: registry.npmmirror.com/path-case/3.0.4 + sentence-case: registry.npmmirror.com/sentence-case/3.0.4 + snake-case: registry.npmmirror.com/snake-case/3.0.4 + tslib: registry.npmmirror.com/tslib/2.5.0 + dev: true + + registry.npmmirror.com/char-regex/1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz} + name: char-regex + version: 1.0.2 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/character-parser/2.2.0: + resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/character-parser/-/character-parser-2.2.0.tgz} + name: character-parser + version: 2.2.0 + dependencies: + is-regex: registry.npmmirror.com/is-regex/1.1.4 + dev: true + + registry.npmmirror.com/chardet/0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz} + name: chardet + version: 0.7.0 + dev: true + + registry.npmmirror.com/charenc/0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz} + name: charenc + version: 0.0.2 + dev: false + + registry.npmmirror.com/china-area-data/5.0.1: + resolution: {integrity: sha512-BQDPpiv5Nn+018ekcJK2oSD9PAD+E1bvXB0wgabc//dFVS/KvRqCgg0QOEUt3vBkx9XzB5a9BmkJCEZDBxVjVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/china-area-data/-/china-area-data-5.0.1.tgz} + name: china-area-data + version: 5.0.1 + dev: false + + registry.npmmirror.com/chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz} + name: chokidar + version: 3.5.3 + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: registry.npmmirror.com/anymatch/3.1.3 + braces: registry.npmmirror.com/braces/3.0.2 + glob-parent: registry.npmmirror.com/glob-parent/5.1.2 + is-binary-path: registry.npmmirror.com/is-binary-path/2.1.0 + is-glob: registry.npmmirror.com/is-glob/4.0.3 + normalize-path: registry.npmmirror.com/normalize-path/3.0.0 + readdirp: registry.npmmirror.com/readdirp/3.6.0 + optionalDependencies: + fsevents: registry.npmmirror.com/fsevents/2.3.2 + dev: true + + registry.npmmirror.com/ci-info/3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ci-info/-/ci-info-3.8.0.tgz} + name: ci-info + version: 3.8.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/cjs-module-lexer/1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz} + name: cjs-module-lexer + version: 1.2.2 + dev: true + + registry.npmmirror.com/class-utils/0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz} + name: class-utils + version: 0.3.6 + engines: {node: '>=0.10.0'} + dependencies: + arr-union: registry.npmmirror.com/arr-union/3.1.0 + define-property: registry.npmmirror.com/define-property/0.2.5 + isobject: registry.npmmirror.com/isobject/3.0.1 + static-extend: registry.npmmirror.com/static-extend/0.1.2 + dev: true + + registry.npmmirror.com/clean-css/5.3.2: + resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/clean-css/-/clean-css-5.3.2.tgz} + name: clean-css + version: 5.3.2 + engines: {node: '>= 10.0'} + dependencies: + source-map: registry.npmmirror.com/source-map/0.6.1 + dev: true + + registry.npmmirror.com/clean-stack/2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz} + name: clean-stack + version: 2.2.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/cli-cursor/3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz} + name: cli-cursor + version: 3.1.0 + engines: {node: '>=8'} + dependencies: + restore-cursor: registry.npmmirror.com/restore-cursor/3.1.0 + dev: true + + registry.npmmirror.com/cli-spinners/2.7.0: + resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.7.0.tgz} + name: cli-spinners + version: 2.7.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/cli-truncate/2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz} + name: cli-truncate + version: 2.1.0 + engines: {node: '>=8'} + dependencies: + slice-ansi: registry.npmmirror.com/slice-ansi/3.0.0 + string-width: registry.npmmirror.com/string-width/4.2.3 + dev: true + + registry.npmmirror.com/cli-truncate/3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cli-truncate/-/cli-truncate-3.1.0.tgz} + name: cli-truncate + version: 3.1.0 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: registry.npmmirror.com/slice-ansi/5.0.0 + string-width: registry.npmmirror.com/string-width/5.1.2 + dev: true + + registry.npmmirror.com/cli-width/3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz} + name: cli-width + version: 3.0.0 + engines: {node: '>= 10'} + dev: true + + registry.npmmirror.com/clipboard/2.0.11: + resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz} + name: clipboard + version: 2.0.11 + dependencies: + good-listener: registry.npmmirror.com/good-listener/1.2.2 + select: registry.npmmirror.com/select/1.1.2 + tiny-emitter: registry.npmmirror.com/tiny-emitter/2.1.0 + dev: false + + registry.npmmirror.com/cliui/6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz} + name: cliui + version: 6.0.0 + dependencies: + string-width: registry.npmmirror.com/string-width/4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi/6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi/6.2.0 + dev: false + + registry.npmmirror.com/cliui/7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz} + name: cliui + version: 7.0.4 + dependencies: + string-width: registry.npmmirror.com/string-width/4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi/6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi/7.0.0 + dev: true + + registry.npmmirror.com/cliui/8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz} + name: cliui + version: 8.0.1 + engines: {node: '>=12'} + dependencies: + string-width: registry.npmmirror.com/string-width/4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi/6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi/7.0.0 + dev: true + + registry.npmmirror.com/clone-response/1.0.2: + resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/clone-response/-/clone-response-1.0.2.tgz} + name: clone-response + version: 1.0.2 + dependencies: + mimic-response: registry.npmmirror.com/mimic-response/1.0.1 + dev: true + + registry.npmmirror.com/clone/1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz} + name: clone + version: 1.0.4 + engines: {node: '>=0.8'} + dev: true + + registry.npmmirror.com/clone/2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz} + name: clone + version: 2.1.2 + engines: {node: '>=0.8'} + dev: true + + registry.npmmirror.com/co/4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/co/-/co-4.6.0.tgz} + name: co + version: 4.6.0 + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + registry.npmmirror.com/codemirror/5.65.12: + resolution: {integrity: sha512-z2jlHBocElRnPYysN2HAuhXbO3DNB0bcSKmNz3hcWR2Js2Dkhc1bEOxG93Z3DeUrnm+qx56XOY5wQmbP5KY0sw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/codemirror/-/codemirror-5.65.12.tgz} + name: codemirror + version: 5.65.12 + dev: false + + registry.npmmirror.com/collect-v8-coverage/1.0.1: + resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz} + name: collect-v8-coverage + version: 1.0.1 + dev: true + + registry.npmmirror.com/collection-visit/1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz} + name: collection-visit + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + map-visit: registry.npmmirror.com/map-visit/1.0.0 + object-visit: registry.npmmirror.com/object-visit/1.0.1 + dev: true + + registry.npmmirror.com/color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz} + name: color-convert + version: 1.9.3 + dependencies: + color-name: registry.npmmirror.com/color-name/1.1.3 + dev: true + + registry.npmmirror.com/color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz} + name: color-convert + version: 2.0.1 + engines: {node: '>=7.0.0'} + dependencies: + color-name: registry.npmmirror.com/color-name/1.1.4 + + registry.npmmirror.com/color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz} + name: color-name + version: 1.1.3 + dev: true + + registry.npmmirror.com/color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz} + name: color-name + version: 1.1.4 + + registry.npmmirror.com/colord/2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/colord/-/colord-2.9.3.tgz} + name: colord + version: 2.9.3 + dev: true + + registry.npmmirror.com/colorette/2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/colorette/-/colorette-2.0.19.tgz} + name: colorette + version: 2.0.19 + dev: true + + registry.npmmirror.com/combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz} + name: combined-stream + version: 1.0.8 + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: registry.npmmirror.com/delayed-stream/1.0.0 + dev: true + + registry.npmmirror.com/commander/10.0.0: + resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/commander/-/commander-10.0.0.tgz} + name: commander + version: 10.0.0 + engines: {node: '>=14'} + + registry.npmmirror.com/commander/2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz} + name: commander + version: 2.20.3 + + registry.npmmirror.com/commander/7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz} + name: commander + version: 7.2.0 + engines: {node: '>= 10'} + dev: true + + registry.npmmirror.com/commander/8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz} + name: commander + version: 8.3.0 + engines: {node: '>= 12'} + dev: true + + registry.npmmirror.com/commander/9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz} + name: commander + version: 9.5.0 + engines: {node: ^12.20.0 || >=14} + dev: false + + registry.npmmirror.com/commitizen/4.3.0: + resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/commitizen/-/commitizen-4.3.0.tgz} + name: commitizen + version: 4.3.0 + engines: {node: '>= 12'} + hasBin: true + dependencies: + cachedir: registry.npmmirror.com/cachedir/2.3.0 + cz-conventional-changelog: registry.npmmirror.com/cz-conventional-changelog/3.3.0 + dedent: registry.npmmirror.com/dedent/0.7.0 + detect-indent: registry.npmmirror.com/detect-indent/6.1.0 + find-node-modules: registry.npmmirror.com/find-node-modules/2.1.3 + find-root: registry.npmmirror.com/find-root/1.1.0 + fs-extra: registry.npmmirror.com/fs-extra/9.1.0 + glob: registry.npmmirror.com/glob/7.2.3 + inquirer: registry.npmmirror.com/inquirer/8.2.5 + is-utf8: registry.npmmirror.com/is-utf8/0.2.1 + lodash: registry.npmmirror.com/lodash/4.17.21 + minimist: registry.npmmirror.com/minimist/1.2.7 + strip-bom: registry.npmmirror.com/strip-bom/4.0.0 + strip-json-comments: registry.npmmirror.com/strip-json-comments/3.1.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + registry.npmmirror.com/common-tags/1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz} + name: common-tags + version: 1.8.2 + engines: {node: '>=4.0.0'} + dev: true + + registry.npmmirror.com/compare-func/2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/compare-func/-/compare-func-2.0.0.tgz} + name: compare-func + version: 2.0.0 + dependencies: + array-ify: registry.npmmirror.com/array-ify/1.0.0 + dot-prop: registry.npmmirror.com/dot-prop/5.3.0 + dev: true + + registry.npmmirror.com/component-emitter/1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz} + name: component-emitter + version: 1.3.0 + dev: true + + registry.npmmirror.com/compute-scroll-into-view/1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz} + name: compute-scroll-into-view + version: 1.0.20 + dev: false + + registry.npmmirror.com/concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz} + name: concat-map + version: 0.0.1 + dev: true + + registry.npmmirror.com/config-chain/1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/config-chain/-/config-chain-1.1.13.tgz} + name: config-chain + version: 1.1.13 + dependencies: + ini: registry.npmmirror.com/ini/1.3.8 + proto-list: registry.npmmirror.com/proto-list/1.2.4 + dev: true + + registry.npmmirror.com/connect-history-api-fallback/1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz} + name: connect-history-api-fallback + version: 1.6.0 + engines: {node: '>=0.8'} + dev: true + + registry.npmmirror.com/connect/3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz} + name: connect + version: 3.7.0 + engines: {node: '>= 0.10.0'} + dependencies: + debug: registry.npmmirror.com/debug/2.6.9 + finalhandler: registry.npmmirror.com/finalhandler/1.1.2 + parseurl: registry.npmmirror.com/parseurl/1.3.3 + utils-merge: registry.npmmirror.com/utils-merge/1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/consola/2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/consola/-/consola-2.15.3.tgz} + name: consola + version: 2.15.3 + dev: true + + registry.npmmirror.com/console-stream/0.1.1: + resolution: {integrity: sha512-QC/8l9e6ofi6nqZ5PawlDgzmMw3OxIXtvolBzap/F4UDBJlDaZRSNbL/lb41C29FcbSJncBFlJFj2WJoNyZRfQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/console-stream/-/console-stream-0.1.1.tgz} + name: console-stream + version: 0.1.1 + dev: true + + registry.npmmirror.com/console/0.7.2: + resolution: {integrity: sha512-+JSDwGunA4MTEgAV/4VBKwUHonP8CzJ/6GIuwPi6acKFqFfHUdSGCm89ZxZ5FfGWdZfkdgAroy5bJ5FSeN/t4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/console/-/console-0.7.2.tgz} + name: console + version: 0.7.2 + dev: true + + registry.npmmirror.com/constant-case/3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/constant-case/-/constant-case-3.0.4.tgz} + name: constant-case + version: 3.0.4 + dependencies: + no-case: registry.npmmirror.com/no-case/3.0.4 + tslib: registry.npmmirror.com/tslib/2.5.0 + upper-case: registry.npmmirror.com/upper-case/2.0.2 + dev: true + + registry.npmmirror.com/content-disposition/0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz} + name: content-disposition + version: 0.5.4 + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer/5.2.1 + dev: true + + registry.npmmirror.com/conventional-changelog-angular/5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz} + name: conventional-changelog-angular + version: 5.0.13 + engines: {node: '>=10'} + dependencies: + compare-func: registry.npmmirror.com/compare-func/2.0.0 + q: registry.npmmirror.com/q/1.5.1 + dev: true + + registry.npmmirror.com/conventional-changelog-atom/2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz} + name: conventional-changelog-atom + version: 2.0.8 + engines: {node: '>=10'} + dependencies: + q: registry.npmmirror.com/q/1.5.1 + dev: true + + registry.npmmirror.com/conventional-changelog-cli/2.2.2: + resolution: {integrity: sha512-8grMV5Jo8S0kP3yoMeJxV2P5R6VJOqK72IiSV9t/4H5r/HiRqEBQ83bYGuz4Yzfdj4bjaAEhZN/FFbsFXr5bOA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-changelog-cli/-/conventional-changelog-cli-2.2.2.tgz} + name: conventional-changelog-cli + version: 2.2.2 + engines: {node: '>=10'} + hasBin: true + dependencies: + add-stream: registry.npmmirror.com/add-stream/1.0.0 + conventional-changelog: registry.npmmirror.com/conventional-changelog/3.1.25 + lodash: registry.npmmirror.com/lodash/4.17.21 + meow: registry.npmmirror.com/meow/8.1.2 + tempfile: registry.npmmirror.com/tempfile/3.0.0 + dev: true + + registry.npmmirror.com/conventional-changelog-codemirror/2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz} + name: conventional-changelog-codemirror + version: 2.0.8 + engines: {node: '>=10'} + dependencies: + q: registry.npmmirror.com/q/1.5.1 + dev: true + + registry.npmmirror.com/conventional-changelog-conventionalcommits/4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz} + name: conventional-changelog-conventionalcommits + version: 4.6.3 + engines: {node: '>=10'} + dependencies: + compare-func: registry.npmmirror.com/compare-func/2.0.0 + lodash: registry.npmmirror.com/lodash/4.17.21 + q: registry.npmmirror.com/q/1.5.1 + dev: true + + registry.npmmirror.com/conventional-changelog-core/4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz} + name: conventional-changelog-core + version: 4.2.4 + engines: {node: '>=10'} + dependencies: + add-stream: registry.npmmirror.com/add-stream/1.0.0 + conventional-changelog-writer: registry.npmmirror.com/conventional-changelog-writer/5.0.1 + conventional-commits-parser: registry.npmmirror.com/conventional-commits-parser/3.2.4 + dateformat: registry.npmmirror.com/dateformat/3.0.3 + get-pkg-repo: registry.npmmirror.com/get-pkg-repo/4.2.1 + git-raw-commits: registry.npmmirror.com/git-raw-commits/2.0.11 + git-remote-origin-url: registry.npmmirror.com/git-remote-origin-url/2.0.0 + git-semver-tags: registry.npmmirror.com/git-semver-tags/4.1.1 + lodash: registry.npmmirror.com/lodash/4.17.21 + normalize-package-data: registry.npmmirror.com/normalize-package-data/3.0.3 + q: registry.npmmirror.com/q/1.5.1 + read-pkg: registry.npmmirror.com/read-pkg/3.0.0 + read-pkg-up: registry.npmmirror.com/read-pkg-up/3.0.0 + through2: registry.npmmirror.com/through2/4.0.2 + dev: true + + registry.npmmirror.com/conventional-changelog-ember/2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz} + name: conventional-changelog-ember + version: 2.0.9 + engines: {node: '>=10'} + dependencies: + q: registry.npmmirror.com/q/1.5.1 + dev: true + + registry.npmmirror.com/conventional-changelog-eslint/3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz} + name: conventional-changelog-eslint + version: 3.0.9 + engines: {node: '>=10'} + dependencies: + q: registry.npmmirror.com/q/1.5.1 + dev: true + + registry.npmmirror.com/conventional-changelog-express/2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz} + name: conventional-changelog-express + version: 2.0.6 + engines: {node: '>=10'} + dependencies: + q: registry.npmmirror.com/q/1.5.1 + dev: true + + registry.npmmirror.com/conventional-changelog-jquery/3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz} + name: conventional-changelog-jquery + version: 3.0.11 + engines: {node: '>=10'} + dependencies: + q: registry.npmmirror.com/q/1.5.1 + dev: true + + registry.npmmirror.com/conventional-changelog-jshint/2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz} + name: conventional-changelog-jshint + version: 2.0.9 + engines: {node: '>=10'} + dependencies: + compare-func: registry.npmmirror.com/compare-func/2.0.0 + q: registry.npmmirror.com/q/1.5.1 + dev: true + + registry.npmmirror.com/conventional-changelog-preset-loader/2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz} + name: conventional-changelog-preset-loader + version: 2.3.4 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/conventional-changelog-writer/5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz} + name: conventional-changelog-writer + version: 5.0.1 + engines: {node: '>=10'} + hasBin: true + dependencies: + conventional-commits-filter: registry.npmmirror.com/conventional-commits-filter/2.0.7 + dateformat: registry.npmmirror.com/dateformat/3.0.3 + handlebars: registry.npmmirror.com/handlebars/4.7.7 + json-stringify-safe: registry.npmmirror.com/json-stringify-safe/5.0.1 + lodash: registry.npmmirror.com/lodash/4.17.21 + meow: registry.npmmirror.com/meow/8.1.2 + semver: registry.npmmirror.com/semver/6.3.0 + split: registry.npmmirror.com/split/1.0.1 + through2: registry.npmmirror.com/through2/4.0.2 + dev: true + + registry.npmmirror.com/conventional-changelog/3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-changelog/-/conventional-changelog-3.1.25.tgz} + name: conventional-changelog + version: 3.1.25 + engines: {node: '>=10'} + dependencies: + conventional-changelog-angular: registry.npmmirror.com/conventional-changelog-angular/5.0.13 + conventional-changelog-atom: registry.npmmirror.com/conventional-changelog-atom/2.0.8 + conventional-changelog-codemirror: registry.npmmirror.com/conventional-changelog-codemirror/2.0.8 + conventional-changelog-conventionalcommits: registry.npmmirror.com/conventional-changelog-conventionalcommits/4.6.3 + conventional-changelog-core: registry.npmmirror.com/conventional-changelog-core/4.2.4 + conventional-changelog-ember: registry.npmmirror.com/conventional-changelog-ember/2.0.9 + conventional-changelog-eslint: registry.npmmirror.com/conventional-changelog-eslint/3.0.9 + conventional-changelog-express: registry.npmmirror.com/conventional-changelog-express/2.0.6 + conventional-changelog-jquery: registry.npmmirror.com/conventional-changelog-jquery/3.0.11 + conventional-changelog-jshint: registry.npmmirror.com/conventional-changelog-jshint/2.0.9 + conventional-changelog-preset-loader: registry.npmmirror.com/conventional-changelog-preset-loader/2.3.4 + dev: true + + registry.npmmirror.com/conventional-commit-types/3.0.0: + resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz} + name: conventional-commit-types + version: 3.0.0 + dev: true + + registry.npmmirror.com/conventional-commits-filter/2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz} + name: conventional-commits-filter + version: 2.0.7 + engines: {node: '>=10'} + dependencies: + lodash.ismatch: registry.npmmirror.com/lodash.ismatch/4.4.0 + modify-values: registry.npmmirror.com/modify-values/1.0.1 + dev: true + + registry.npmmirror.com/conventional-commits-parser/3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz} + name: conventional-commits-parser + version: 3.2.4 + engines: {node: '>=10'} + hasBin: true + dependencies: + JSONStream: registry.npmmirror.com/JSONStream/1.3.5 + is-text-path: registry.npmmirror.com/is-text-path/1.0.1 + lodash: registry.npmmirror.com/lodash/4.17.21 + meow: registry.npmmirror.com/meow/8.1.2 + split2: registry.npmmirror.com/split2/3.2.2 + through2: registry.npmmirror.com/through2/4.0.2 + dev: true + + registry.npmmirror.com/convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz} + name: convert-source-map + version: 1.9.0 + dev: true + + registry.npmmirror.com/copy-anything/2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz} + name: copy-anything + version: 2.0.6 + dependencies: + is-what: registry.npmmirror.com/is-what/3.14.1 + dev: true + + registry.npmmirror.com/copy-descriptor/0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz} + name: copy-descriptor + version: 0.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/core-js-compat/3.29.0: + resolution: {integrity: sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.29.0.tgz} + name: core-js-compat + version: 3.29.0 + dependencies: + browserslist: registry.npmmirror.com/browserslist/4.21.5 + dev: true + + registry.npmmirror.com/core-js/2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz} + name: core-js + version: 2.6.12 + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + requiresBuild: true + dev: false + + registry.npmmirror.com/core-js/3.29.0: + resolution: {integrity: sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/core-js/-/core-js-3.29.0.tgz} + name: core-js + version: 3.29.0 + requiresBuild: true + + registry.npmmirror.com/core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz} + name: core-util-is + version: 1.0.3 + dev: true + + registry.npmmirror.com/cors/2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz} + name: cors + version: 2.8.5 + engines: {node: '>= 0.10'} + dependencies: + object-assign: registry.npmmirror.com/object-assign/4.1.1 + vary: registry.npmmirror.com/vary/1.1.2 + dev: true + + registry.npmmirror.com/corser/2.0.1: + resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/corser/-/corser-2.0.1.tgz} + name: corser + version: 2.0.1 + engines: {node: '>= 0.4.0'} + dev: true + + registry.npmmirror.com/cosmiconfig-typescript-loader/2.0.2_cin3sed6ohfsopbmt6orxeb4o4: + resolution: {integrity: sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-2.0.2.tgz} + id: registry.npmmirror.com/cosmiconfig-typescript-loader/2.0.2 + name: cosmiconfig-typescript-loader + version: 2.0.2 + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@types/node': '*' + typescript: '>=3' + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + cosmiconfig: registry.npmmirror.com/cosmiconfig/7.1.0 + ts-node: registry.npmmirror.com/ts-node/10.9.1_cin3sed6ohfsopbmt6orxeb4o4 + typescript: registry.npmmirror.com/typescript/4.9.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + registry.npmmirror.com/cosmiconfig-typescript-loader/4.3.0_ex3rrhbii2ixlrca7p7vytu7ce: + resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz} + id: registry.npmmirror.com/cosmiconfig-typescript-loader/4.3.0 + name: cosmiconfig-typescript-loader + version: 4.3.0 + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + ts-node: '>=10' + typescript: '>=3' + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + cosmiconfig: registry.npmmirror.com/cosmiconfig/8.1.0 + ts-node: registry.npmmirror.com/ts-node/10.9.1_cin3sed6ohfsopbmt6orxeb4o4 + typescript: registry.npmmirror.com/typescript/4.9.5 + dev: true + optional: true + + registry.npmmirror.com/cosmiconfig/7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz} + name: cosmiconfig + version: 7.1.0 + engines: {node: '>=10'} + dependencies: + '@types/parse-json': registry.npmmirror.com/@types/parse-json/4.0.0 + import-fresh: registry.npmmirror.com/import-fresh/3.3.0 + parse-json: registry.npmmirror.com/parse-json/5.2.0 + path-type: registry.npmmirror.com/path-type/4.0.0 + yaml: registry.npmmirror.com/yaml/1.10.2 + dev: true + + registry.npmmirror.com/cosmiconfig/8.1.0: + resolution: {integrity: sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-8.1.0.tgz} + name: cosmiconfig + version: 8.1.0 + engines: {node: '>=14'} + dependencies: + import-fresh: registry.npmmirror.com/import-fresh/3.3.0 + js-yaml: registry.npmmirror.com/js-yaml/4.1.0 + parse-json: registry.npmmirror.com/parse-json/5.2.0 + path-type: registry.npmmirror.com/path-type/4.0.0 + dev: true + optional: true + + registry.npmmirror.com/create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz} + name: create-require + version: 1.1.1 + dev: true + + registry.npmmirror.com/cron-parser/3.5.0: + resolution: {integrity: sha512-wyVZtbRs6qDfFd8ap457w3XVntdvqcwBGxBoTvJQH9KGVKL/fB+h2k3C8AqiVxvUQKN1Ps/Ns46CNViOpVDhfQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cron-parser/-/cron-parser-3.5.0.tgz} + name: cron-parser + version: 3.5.0 + engines: {node: '>=0.8'} + dependencies: + is-nan: registry.npmmirror.com/is-nan/1.3.2 + luxon: registry.npmmirror.com/luxon/1.28.1 + dev: false + + registry.npmmirror.com/cropperjs/1.5.13: + resolution: {integrity: sha512-by7jKAo73y5/Do0K6sxdTKHgndY0NMjG2bEdgeJxycbcmHuCiMXqw8sxy5C5Y5WTOTcDGmbT7Sr5CgKOXR06OA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cropperjs/-/cropperjs-1.5.13.tgz} + name: cropperjs + version: 1.5.13 + dev: false + + registry.npmmirror.com/cross-env/7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz} + name: cross-env + version: 7.0.3 + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + dependencies: + cross-spawn: registry.npmmirror.com/cross-spawn/7.0.3 + dev: true + + registry.npmmirror.com/cross-fetch/3.1.5: + resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cross-fetch/-/cross-fetch-3.1.5.tgz} + name: cross-fetch + version: 3.1.5 + dependencies: + node-fetch: registry.npmmirror.com/node-fetch/2.6.7 + transitivePeerDependencies: + - encoding + dev: true + + registry.npmmirror.com/cross-spawn/5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cross-spawn/-/cross-spawn-5.1.0.tgz} + name: cross-spawn + version: 5.1.0 + dependencies: + lru-cache: registry.npmmirror.com/lru-cache/4.1.5 + shebang-command: registry.npmmirror.com/shebang-command/1.2.0 + which: registry.npmmirror.com/which/1.3.1 + dev: true + + registry.npmmirror.com/cross-spawn/6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz} + name: cross-spawn + version: 6.0.5 + engines: {node: '>=4.8'} + dependencies: + nice-try: registry.npmmirror.com/nice-try/1.0.5 + path-key: registry.npmmirror.com/path-key/2.0.1 + semver: registry.npmmirror.com/semver/5.7.1 + shebang-command: registry.npmmirror.com/shebang-command/1.2.0 + which: registry.npmmirror.com/which/1.3.1 + dev: true + + registry.npmmirror.com/cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz} + name: cross-spawn + version: 7.0.3 + engines: {node: '>= 8'} + dependencies: + path-key: registry.npmmirror.com/path-key/3.1.1 + shebang-command: registry.npmmirror.com/shebang-command/2.0.0 + which: registry.npmmirror.com/which/2.0.2 + dev: true + + registry.npmmirror.com/crypt/0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz} + name: crypt + version: 0.0.2 + dev: false + + registry.npmmirror.com/crypto-js/4.1.1: + resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/crypto-js/-/crypto-js-4.1.1.tgz} + name: crypto-js + version: 4.1.1 + dev: false + + registry.npmmirror.com/crypto-random-string/2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz} + name: crypto-random-string + version: 2.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/css-functions-list/3.1.0: + resolution: {integrity: sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/css-functions-list/-/css-functions-list-3.1.0.tgz} + name: css-functions-list + version: 3.1.0 + engines: {node: '>=12.22'} + dev: true + + registry.npmmirror.com/css-select/4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz} + name: css-select + version: 4.3.0 + dependencies: + boolbase: registry.npmmirror.com/boolbase/1.0.0 + css-what: registry.npmmirror.com/css-what/6.1.0 + domhandler: registry.npmmirror.com/domhandler/4.3.1 + domutils: registry.npmmirror.com/domutils/2.8.0 + nth-check: registry.npmmirror.com/nth-check/2.1.1 + dev: true + + registry.npmmirror.com/css-tree/1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz} + name: css-tree + version: 1.1.3 + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: registry.npmmirror.com/mdn-data/2.0.14 + source-map: registry.npmmirror.com/source-map/0.6.1 + dev: true + + registry.npmmirror.com/css-what/6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz} + name: css-what + version: 6.1.0 + engines: {node: '>= 6'} + dev: true + + registry.npmmirror.com/cssesc/3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz} + name: cssesc + version: 3.0.0 + engines: {node: '>=4'} + hasBin: true + dev: true + + registry.npmmirror.com/cssfilter/0.0.10: + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cssfilter/-/cssfilter-0.0.10.tgz} + name: cssfilter + version: 0.0.10 + dev: false + + registry.npmmirror.com/csso/4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz} + name: csso + version: 4.2.0 + engines: {node: '>=8.0.0'} + dependencies: + css-tree: registry.npmmirror.com/css-tree/1.1.3 + dev: true + + registry.npmmirror.com/cssom/0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz} + name: cssom + version: 0.3.8 + dev: true + + registry.npmmirror.com/cssom/0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cssom/-/cssom-0.4.4.tgz} + name: cssom + version: 0.4.4 + dev: true + + registry.npmmirror.com/cssstyle/2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz} + name: cssstyle + version: 2.3.0 + engines: {node: '>=8'} + dependencies: + cssom: registry.npmmirror.com/cssom/0.3.8 + dev: true + + registry.npmmirror.com/csstype/2.6.21: + resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/csstype/-/csstype-2.6.21.tgz} + name: csstype + version: 2.6.21 + + registry.npmmirror.com/currently-unhandled/0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz} + name: currently-unhandled + version: 0.4.1 + engines: {node: '>=0.10.0'} + dependencies: + array-find-index: registry.npmmirror.com/array-find-index/1.0.2 + dev: true + + registry.npmmirror.com/cwebp-bin/6.1.2: + resolution: {integrity: sha512-NLEZ/BVAl9g426hwUX/qrQ7b/EfQH7BS1tr+CzPo2EgDQbcdzmUVE+fIfsi64lsL638lWgzTEViMAL4pxV1GOg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cwebp-bin/-/cwebp-bin-6.1.2.tgz} + name: cwebp-bin + version: 6.1.2 + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + bin-build: registry.npmmirror.com/bin-build/3.0.0 + bin-wrapper: registry.npmmirror.com/bin-wrapper-china/0.1.0 + dev: true + + registry.npmmirror.com/cz-conventional-changelog/3.3.0: + resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz} + name: cz-conventional-changelog + version: 3.3.0 + engines: {node: '>= 10'} + dependencies: + chalk: registry.npmmirror.com/chalk/2.4.2 + commitizen: registry.npmmirror.com/commitizen/4.3.0 + conventional-commit-types: registry.npmmirror.com/conventional-commit-types/3.0.0 + lodash.map: registry.npmmirror.com/lodash.map/4.6.0 + longest: registry.npmmirror.com/longest/2.0.1 + word-wrap: registry.npmmirror.com/word-wrap/1.2.3 + optionalDependencies: + '@commitlint/load': registry.npmmirror.com/@commitlint/load/17.4.4 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + registry.npmmirror.com/cz-git/1.5.1: + resolution: {integrity: sha512-6L92sB4TGu7qt4jmkQ2AB3VeihAJWLJKv+zvgp/BBE6jMI6rzZZi6H/VI4/i42+oq7oRPyOIF0ku+kShGrfzTQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cz-git/-/cz-git-1.5.1.tgz} + name: cz-git + version: 1.5.1 + dev: true + + registry.npmmirror.com/czg/1.5.1: + resolution: {integrity: sha512-iMxOMtHY2ONml97ag7fLZH3gSaifbKxXf1ijSUN9StahwdcgTbwSz0q7QE1903xMGF+HACdHkxf2+32XpSEG4A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/czg/-/czg-1.5.1.tgz} + name: czg + version: 1.5.1 + hasBin: true + dev: true + + registry.npmmirror.com/dargs/7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dargs/-/dargs-7.0.0.tgz} + name: dargs + version: 7.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/data-urls/2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/data-urls/-/data-urls-2.0.0.tgz} + name: data-urls + version: 2.0.0 + engines: {node: '>=10'} + dependencies: + abab: registry.npmmirror.com/abab/2.0.6 + whatwg-mimetype: registry.npmmirror.com/whatwg-mimetype/2.3.0 + whatwg-url: registry.npmmirror.com/whatwg-url/8.7.0 + dev: true + + registry.npmmirror.com/dateformat/3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dateformat/-/dateformat-3.0.3.tgz} + name: dateformat + version: 3.0.3 + dev: true + + registry.npmmirror.com/dayjs/1.11.7: + resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dayjs/-/dayjs-1.11.7.tgz} + name: dayjs + version: 1.11.7 + dev: false + + registry.npmmirror.com/debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz} + name: debug + version: 2.6.9 + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: registry.npmmirror.com/ms/2.0.0 + dev: true + + registry.npmmirror.com/debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz} + name: debug + version: 3.2.7 + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: registry.npmmirror.com/ms/2.1.3 + dev: true + + registry.npmmirror.com/debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz} + name: debug + version: 4.3.4 + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: registry.npmmirror.com/ms/2.1.2 + dev: true + + registry.npmmirror.com/debug/4.3.4_supports-color@9.3.1: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz} + id: registry.npmmirror.com/debug/4.3.4 + name: debug + version: 4.3.4 + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: registry.npmmirror.com/ms/2.1.2 + supports-color: registry.npmmirror.com/supports-color/9.3.1 + dev: true + + registry.npmmirror.com/decamelize-keys/1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz} + name: decamelize-keys + version: 1.1.1 + engines: {node: '>=0.10.0'} + dependencies: + decamelize: registry.npmmirror.com/decamelize/1.2.0 + map-obj: registry.npmmirror.com/map-obj/1.0.1 + dev: true + + registry.npmmirror.com/decamelize/1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz} + name: decamelize + version: 1.2.0 + engines: {node: '>=0.10.0'} + + registry.npmmirror.com/decimal.js/10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz} + name: decimal.js + version: 10.4.3 + dev: true + + registry.npmmirror.com/decode-uri-component/0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz} + name: decode-uri-component + version: 0.2.2 + engines: {node: '>=0.10'} + dev: true + + registry.npmmirror.com/decompress-response/3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/decompress-response/-/decompress-response-3.3.0.tgz} + name: decompress-response + version: 3.3.0 + engines: {node: '>=4'} + dependencies: + mimic-response: registry.npmmirror.com/mimic-response/1.0.1 + dev: true + + registry.npmmirror.com/decompress-tar/4.1.1: + resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/decompress-tar/-/decompress-tar-4.1.1.tgz} + name: decompress-tar + version: 4.1.1 + engines: {node: '>=4'} + dependencies: + file-type: registry.npmmirror.com/file-type/5.2.0 + is-stream: registry.npmmirror.com/is-stream/1.1.0 + tar-stream: registry.npmmirror.com/tar-stream/1.6.2 + dev: true + + registry.npmmirror.com/decompress-tarbz2/4.1.1: + resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz} + name: decompress-tarbz2 + version: 4.1.1 + engines: {node: '>=4'} + dependencies: + decompress-tar: registry.npmmirror.com/decompress-tar/4.1.1 + file-type: registry.npmmirror.com/file-type/6.2.0 + is-stream: registry.npmmirror.com/is-stream/1.1.0 + seek-bzip: registry.npmmirror.com/seek-bzip/1.0.6 + unbzip2-stream: registry.npmmirror.com/unbzip2-stream/1.4.3 + dev: true + + registry.npmmirror.com/decompress-targz/4.1.1: + resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/decompress-targz/-/decompress-targz-4.1.1.tgz} + name: decompress-targz + version: 4.1.1 + engines: {node: '>=4'} + dependencies: + decompress-tar: registry.npmmirror.com/decompress-tar/4.1.1 + file-type: registry.npmmirror.com/file-type/5.2.0 + is-stream: registry.npmmirror.com/is-stream/1.1.0 + dev: true + + registry.npmmirror.com/decompress-unzip/4.0.1: + resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz} + name: decompress-unzip + version: 4.0.1 + engines: {node: '>=4'} + dependencies: + file-type: registry.npmmirror.com/file-type/3.9.0 + get-stream: registry.npmmirror.com/get-stream/2.3.1 + pify: registry.npmmirror.com/pify/2.3.0 + yauzl: registry.npmmirror.com/yauzl/2.10.0 + dev: true + + registry.npmmirror.com/decompress/4.2.1: + resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/decompress/-/decompress-4.2.1.tgz} + name: decompress + version: 4.2.1 + engines: {node: '>=4'} + dependencies: + decompress-tar: registry.npmmirror.com/decompress-tar/4.1.1 + decompress-tarbz2: registry.npmmirror.com/decompress-tarbz2/4.1.1 + decompress-targz: registry.npmmirror.com/decompress-targz/4.1.1 + decompress-unzip: registry.npmmirror.com/decompress-unzip/4.0.1 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + make-dir: registry.npmmirror.com/make-dir/1.3.0 + pify: registry.npmmirror.com/pify/2.3.0 + strip-dirs: registry.npmmirror.com/strip-dirs/2.1.0 + dev: true + + registry.npmmirror.com/dedent/0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz} + name: dedent + version: 0.7.0 + dev: true + + registry.npmmirror.com/deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz} + name: deep-is + version: 0.1.4 + dev: true + + registry.npmmirror.com/deepmerge/4.3.0: + resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.0.tgz} + name: deepmerge + version: 4.3.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/defaults/1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz} + name: defaults + version: 1.0.4 + dependencies: + clone: registry.npmmirror.com/clone/1.0.4 + dev: true + + registry.npmmirror.com/define-lazy-prop/2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz} + name: define-lazy-prop + version: 2.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/define-properties/1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz} + name: define-properties + version: 1.2.0 + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: registry.npmmirror.com/has-property-descriptors/1.0.0 + object-keys: registry.npmmirror.com/object-keys/1.1.1 + + registry.npmmirror.com/define-property/0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz} + name: define-property + version: 0.2.5 + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: registry.npmmirror.com/is-descriptor/0.1.6 + dev: true + + registry.npmmirror.com/define-property/1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz} + name: define-property + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: registry.npmmirror.com/is-descriptor/1.0.2 + dev: true + + registry.npmmirror.com/define-property/2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz} + name: define-property + version: 2.0.2 + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: registry.npmmirror.com/is-descriptor/1.0.2 + isobject: registry.npmmirror.com/isobject/3.0.1 + dev: true + + registry.npmmirror.com/delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz} + name: delayed-stream + version: 1.0.0 + engines: {node: '>=0.4.0'} + dev: true + + registry.npmmirror.com/delegate/3.2.0: + resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz} + name: delegate + version: 3.2.0 + dev: false + + registry.npmmirror.com/deprecation/2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/deprecation/-/deprecation-2.3.1.tgz} + name: deprecation + version: 2.3.1 + dev: true + + registry.npmmirror.com/detect-file/1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/detect-file/-/detect-file-1.0.0.tgz} + name: detect-file + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/detect-indent/6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/detect-indent/-/detect-indent-6.1.0.tgz} + name: detect-indent + version: 6.1.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/detect-newline/3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz} + name: detect-newline + version: 3.1.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/diff-match-patch/1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz} + name: diff-match-patch + version: 1.0.5 + dev: false + + registry.npmmirror.com/diff-sequences/27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/diff-sequences/-/diff-sequences-27.5.1.tgz} + name: diff-sequences + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + registry.npmmirror.com/diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz} + name: diff + version: 4.0.2 + engines: {node: '>=0.3.1'} + dev: true + + registry.npmmirror.com/dijkstrajs/1.0.2: + resolution: {integrity: sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz} + name: dijkstrajs + version: 1.0.2 + dev: false + + registry.npmmirror.com/dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz} + name: dir-glob + version: 3.0.1 + engines: {node: '>=8'} + dependencies: + path-type: registry.npmmirror.com/path-type/4.0.0 + dev: true + + registry.npmmirror.com/doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz} + name: doctrine + version: 3.0.0 + engines: {node: '>=6.0.0'} + dependencies: + esutils: registry.npmmirror.com/esutils/2.0.3 + dev: true + + registry.npmmirror.com/dom-align/1.12.4: + resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dom-align/-/dom-align-1.12.4.tgz} + name: dom-align + version: 1.12.4 + dev: false + + registry.npmmirror.com/dom-scroll-into-view/2.0.1: + resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz} + name: dom-scroll-into-view + version: 2.0.1 + dev: false + + registry.npmmirror.com/dom-serializer/0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz} + name: dom-serializer + version: 0.2.2 + dependencies: + domelementtype: registry.npmmirror.com/domelementtype/2.3.0 + entities: registry.npmmirror.com/entities/2.2.0 + dev: true + + registry.npmmirror.com/dom-serializer/1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz} + name: dom-serializer + version: 1.4.1 + dependencies: + domelementtype: registry.npmmirror.com/domelementtype/2.3.0 + domhandler: registry.npmmirror.com/domhandler/4.3.1 + entities: registry.npmmirror.com/entities/2.2.0 + dev: true + + registry.npmmirror.com/dom-serializer/2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz} + name: dom-serializer + version: 2.0.0 + dependencies: + domelementtype: registry.npmmirror.com/domelementtype/2.3.0 + domhandler: registry.npmmirror.com/domhandler/5.0.3 + entities: registry.npmmirror.com/entities/4.4.0 + dev: true + + registry.npmmirror.com/domelementtype/1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz} + name: domelementtype + version: 1.3.1 + dev: true + + registry.npmmirror.com/domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz} + name: domelementtype + version: 2.3.0 + dev: true + + registry.npmmirror.com/domexception/2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/domexception/-/domexception-2.0.1.tgz} + name: domexception + version: 2.0.1 + engines: {node: '>=8'} + dependencies: + webidl-conversions: registry.npmmirror.com/webidl-conversions/5.0.0 + dev: true + + registry.npmmirror.com/domhandler/2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/domhandler/-/domhandler-2.4.2.tgz} + name: domhandler + version: 2.4.2 + dependencies: + domelementtype: registry.npmmirror.com/domelementtype/1.3.1 + dev: true + + registry.npmmirror.com/domhandler/4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz} + name: domhandler + version: 4.3.1 + engines: {node: '>= 4'} + dependencies: + domelementtype: registry.npmmirror.com/domelementtype/2.3.0 + dev: true + + registry.npmmirror.com/domhandler/5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz} + name: domhandler + version: 5.0.3 + engines: {node: '>= 4'} + dependencies: + domelementtype: registry.npmmirror.com/domelementtype/2.3.0 + dev: true + + registry.npmmirror.com/domutils/1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz} + name: domutils + version: 1.7.0 + dependencies: + dom-serializer: registry.npmmirror.com/dom-serializer/0.2.2 + domelementtype: registry.npmmirror.com/domelementtype/1.3.1 + dev: true + + registry.npmmirror.com/domutils/2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz} + name: domutils + version: 2.8.0 + dependencies: + dom-serializer: registry.npmmirror.com/dom-serializer/1.4.1 + domelementtype: registry.npmmirror.com/domelementtype/2.3.0 + domhandler: registry.npmmirror.com/domhandler/4.3.1 + dev: true + + registry.npmmirror.com/domutils/3.0.1: + resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/domutils/-/domutils-3.0.1.tgz} + name: domutils + version: 3.0.1 + dependencies: + dom-serializer: registry.npmmirror.com/dom-serializer/2.0.0 + domelementtype: registry.npmmirror.com/domelementtype/2.3.0 + domhandler: registry.npmmirror.com/domhandler/5.0.3 + dev: true + + registry.npmmirror.com/dot-case/3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz} + name: dot-case + version: 3.0.4 + dependencies: + no-case: registry.npmmirror.com/no-case/3.0.4 + tslib: registry.npmmirror.com/tslib/2.5.0 + dev: true + + registry.npmmirror.com/dot-prop/5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dot-prop/-/dot-prop-5.3.0.tgz} + name: dot-prop + version: 5.3.0 + engines: {node: '>=8'} + dependencies: + is-obj: registry.npmmirror.com/is-obj/2.0.0 + dev: true + + registry.npmmirror.com/dotenv-expand/8.0.3: + resolution: {integrity: sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-8.0.3.tgz} + name: dotenv-expand + version: 8.0.3 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/dotenv/16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dotenv/-/dotenv-16.0.3.tgz} + name: dotenv + version: 16.0.3 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/download/6.2.5: + resolution: {integrity: sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/download/-/download-6.2.5.tgz} + name: download + version: 6.2.5 + engines: {node: '>=4'} + dependencies: + caw: registry.npmmirror.com/caw/2.0.1 + content-disposition: registry.npmmirror.com/content-disposition/0.5.4 + decompress: registry.npmmirror.com/decompress/4.2.1 + ext-name: registry.npmmirror.com/ext-name/5.0.0 + file-type: registry.npmmirror.com/file-type/5.2.0 + filenamify: registry.npmmirror.com/filenamify/2.1.0 + get-stream: registry.npmmirror.com/get-stream/3.0.0 + got: registry.npmmirror.com/got/7.1.0 + make-dir: registry.npmmirror.com/make-dir/1.3.0 + p-event: registry.npmmirror.com/p-event/1.3.0 + pify: registry.npmmirror.com/pify/3.0.0 + dev: true + + registry.npmmirror.com/download/7.1.0: + resolution: {integrity: sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/download/-/download-7.1.0.tgz} + name: download + version: 7.1.0 + engines: {node: '>=6'} + dependencies: + archive-type: registry.npmmirror.com/archive-type/4.0.0 + caw: registry.npmmirror.com/caw/2.0.1 + content-disposition: registry.npmmirror.com/content-disposition/0.5.4 + decompress: registry.npmmirror.com/decompress/4.2.1 + ext-name: registry.npmmirror.com/ext-name/5.0.0 + file-type: registry.npmmirror.com/file-type/8.1.0 + filenamify: registry.npmmirror.com/filenamify/2.1.0 + get-stream: registry.npmmirror.com/get-stream/3.0.0 + got: registry.npmmirror.com/got/8.3.2 + make-dir: registry.npmmirror.com/make-dir/1.3.0 + p-event: registry.npmmirror.com/p-event/2.3.1 + pify: registry.npmmirror.com/pify/3.0.0 + dev: true + + registry.npmmirror.com/duplexer3/0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.5.tgz} + name: duplexer3 + version: 0.1.5 + dev: true + + registry.npmmirror.com/eastasianwidth/0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz} + name: eastasianwidth + version: 0.2.0 + dev: true + + registry.npmmirror.com/echarts/5.4.1: + resolution: {integrity: sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/echarts/-/echarts-5.4.1.tgz} + name: echarts + version: 5.4.1 + dependencies: + tslib: registry.npmmirror.com/tslib/2.3.0 + zrender: registry.npmmirror.com/zrender/5.4.1 + dev: false + + registry.npmmirror.com/editorconfig/0.15.3: + resolution: {integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/editorconfig/-/editorconfig-0.15.3.tgz} + name: editorconfig + version: 0.15.3 + hasBin: true + dependencies: + commander: registry.npmmirror.com/commander/2.20.3 + lru-cache: registry.npmmirror.com/lru-cache/4.1.5 + semver: registry.npmmirror.com/semver/5.7.1 + sigmund: registry.npmmirror.com/sigmund/1.0.1 + dev: true + + registry.npmmirror.com/ee-first/1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz} + name: ee-first + version: 1.1.1 + dev: true + + registry.npmmirror.com/ejs/3.1.8: + resolution: {integrity: sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ejs/-/ejs-3.1.8.tgz} + name: ejs + version: 3.1.8 + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: registry.npmmirror.com/jake/10.8.5 + dev: true + + registry.npmmirror.com/electron-to-chromium/1.4.320: + resolution: {integrity: sha512-h70iRscrNluMZPVICXYl5SSB+rBKo22XfuIS1ER0OQxQZpKTnFpuS6coj7wY9M/3trv7OR88rRMOlKmRvDty7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.320.tgz} + name: electron-to-chromium + version: 1.4.320 + dev: true + + registry.npmmirror.com/emittery/0.8.1: + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/emittery/-/emittery-0.8.1.tgz} + name: emittery + version: 0.8.1 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/emoji-mart-vue-fast/11.2.0_vue@3.2.47: + resolution: {integrity: sha512-dEVAJAbQop+efR8Zn4bvPQtSREwsVZccQxEBHdi1GNPO0JC9H6l0FswuCli/TrZXAQr1KS7dGEUhS9A1gURFRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/emoji-mart-vue-fast/-/emoji-mart-vue-fast-11.2.0.tgz} + id: registry.npmmirror.com/emoji-mart-vue-fast/11.2.0 + name: emoji-mart-vue-fast + version: 11.2.0 + peerDependencies: + vue: '>2.0.0' + dependencies: + '@babel/runtime': registry.npmmirror.com/@babel/runtime/7.21.0 + core-js: registry.npmmirror.com/core-js/3.29.0 + vue: registry.npmmirror.com/vue/3.2.47 + vue-virtual-scroller: registry.npmmirror.com/vue-virtual-scroller/1.1.2_vue@3.2.47 + dev: false + + registry.npmmirror.com/emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz} + name: emoji-regex + version: 8.0.0 + + registry.npmmirror.com/emoji-regex/9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz} + name: emoji-regex + version: 9.2.2 + dev: true + + registry.npmmirror.com/emojis-list/3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz} + name: emojis-list + version: 3.0.0 + engines: {node: '>= 4'} + dev: true + + registry.npmmirror.com/encode-utf8/1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/encode-utf8/-/encode-utf8-1.0.3.tgz} + name: encode-utf8 + version: 1.0.3 + dev: false + + registry.npmmirror.com/encodeurl/1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz} + name: encodeurl + version: 1.0.2 + engines: {node: '>= 0.8'} + dev: true + + registry.npmmirror.com/end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz} + name: end-of-stream + version: 1.4.4 + dependencies: + once: registry.npmmirror.com/once/1.4.0 + dev: true + + registry.npmmirror.com/enquire.js/2.1.6: + resolution: {integrity: sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/enquire.js/-/enquire.js-2.1.6.tgz} + name: enquire.js + version: 2.1.6 + dev: false + + registry.npmmirror.com/entities/1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/entities/-/entities-1.1.2.tgz} + name: entities + version: 1.1.2 + dev: true + + registry.npmmirror.com/entities/2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz} + name: entities + version: 2.2.0 + dev: true + + registry.npmmirror.com/entities/4.4.0: + resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/entities/-/entities-4.4.0.tgz} + name: entities + version: 4.4.0 + engines: {node: '>=0.12'} + dev: true + + registry.npmmirror.com/errno/0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz} + name: errno + version: 0.1.8 + hasBin: true + requiresBuild: true + dependencies: + prr: registry.npmmirror.com/prr/1.0.1 + dev: true + optional: true + + registry.npmmirror.com/error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz} + name: error-ex + version: 1.3.2 + dependencies: + is-arrayish: registry.npmmirror.com/is-arrayish/0.2.1 + dev: true + + registry.npmmirror.com/es-abstract/1.21.1: + resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/es-abstract/-/es-abstract-1.21.1.tgz} + name: es-abstract + version: 1.21.1 + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: registry.npmmirror.com/available-typed-arrays/1.0.5 + call-bind: registry.npmmirror.com/call-bind/1.0.2 + es-set-tostringtag: registry.npmmirror.com/es-set-tostringtag/2.0.1 + es-to-primitive: registry.npmmirror.com/es-to-primitive/1.2.1 + function-bind: registry.npmmirror.com/function-bind/1.1.1 + function.prototype.name: registry.npmmirror.com/function.prototype.name/1.1.5 + get-intrinsic: registry.npmmirror.com/get-intrinsic/1.2.0 + get-symbol-description: registry.npmmirror.com/get-symbol-description/1.0.0 + globalthis: registry.npmmirror.com/globalthis/1.0.3 + gopd: registry.npmmirror.com/gopd/1.0.1 + has: registry.npmmirror.com/has/1.0.3 + has-property-descriptors: registry.npmmirror.com/has-property-descriptors/1.0.0 + has-proto: registry.npmmirror.com/has-proto/1.0.1 + has-symbols: registry.npmmirror.com/has-symbols/1.0.3 + internal-slot: registry.npmmirror.com/internal-slot/1.0.5 + is-array-buffer: registry.npmmirror.com/is-array-buffer/3.0.2 + is-callable: registry.npmmirror.com/is-callable/1.2.7 + is-negative-zero: registry.npmmirror.com/is-negative-zero/2.0.2 + is-regex: registry.npmmirror.com/is-regex/1.1.4 + is-shared-array-buffer: registry.npmmirror.com/is-shared-array-buffer/1.0.2 + is-string: registry.npmmirror.com/is-string/1.0.7 + is-typed-array: registry.npmmirror.com/is-typed-array/1.1.10 + is-weakref: registry.npmmirror.com/is-weakref/1.0.2 + object-inspect: registry.npmmirror.com/object-inspect/1.12.3 + object-keys: registry.npmmirror.com/object-keys/1.1.1 + object.assign: registry.npmmirror.com/object.assign/4.1.4 + regexp.prototype.flags: registry.npmmirror.com/regexp.prototype.flags/1.4.3 + safe-regex-test: registry.npmmirror.com/safe-regex-test/1.0.0 + string.prototype.trimend: registry.npmmirror.com/string.prototype.trimend/1.0.6 + string.prototype.trimstart: registry.npmmirror.com/string.prototype.trimstart/1.0.6 + typed-array-length: registry.npmmirror.com/typed-array-length/1.0.4 + unbox-primitive: registry.npmmirror.com/unbox-primitive/1.0.2 + which-typed-array: registry.npmmirror.com/which-typed-array/1.1.9 + dev: true + + registry.npmmirror.com/es-module-lexer/0.9.3: + resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz} + name: es-module-lexer + version: 0.9.3 + dev: true + + registry.npmmirror.com/es-set-tostringtag/2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz} + name: es-set-tostringtag + version: 2.0.1 + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic/1.2.0 + has: registry.npmmirror.com/has/1.0.3 + has-tostringtag: registry.npmmirror.com/has-tostringtag/1.0.0 + dev: true + + registry.npmmirror.com/es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz} + name: es-to-primitive + version: 1.2.1 + engines: {node: '>= 0.4'} + dependencies: + is-callable: registry.npmmirror.com/is-callable/1.2.7 + is-date-object: registry.npmmirror.com/is-date-object/1.0.5 + is-symbol: registry.npmmirror.com/is-symbol/1.0.4 + dev: true + + registry.npmmirror.com/esbuild-android-64/0.14.54: + resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz} + name: esbuild-android-64 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-android-64/0.15.18: + resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz} + name: esbuild-android-64 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-android-arm64/0.14.54: + resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz} + name: esbuild-android-arm64 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-android-arm64/0.15.18: + resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz} + name: esbuild-android-arm64 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-darwin-64/0.14.54: + resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz} + name: esbuild-darwin-64 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-darwin-64/0.15.18: + resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz} + name: esbuild-darwin-64 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-darwin-arm64/0.14.54: + resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz} + name: esbuild-darwin-arm64 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-darwin-arm64/0.15.18: + resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz} + name: esbuild-darwin-arm64 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-freebsd-64/0.14.54: + resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz} + name: esbuild-freebsd-64 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-freebsd-64/0.15.18: + resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz} + name: esbuild-freebsd-64 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-freebsd-arm64/0.14.54: + resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz} + name: esbuild-freebsd-arm64 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-freebsd-arm64/0.15.18: + resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz} + name: esbuild-freebsd-arm64 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-32/0.14.54: + resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz} + name: esbuild-linux-32 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-32/0.15.18: + resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz} + name: esbuild-linux-32 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-64/0.14.54: + resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz} + name: esbuild-linux-64 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-64/0.15.18: + resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz} + name: esbuild-linux-64 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-arm/0.14.54: + resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz} + name: esbuild-linux-arm + version: 0.14.54 + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-arm/0.15.18: + resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz} + name: esbuild-linux-arm + version: 0.15.18 + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-arm64/0.14.54: + resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz} + name: esbuild-linux-arm64 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-arm64/0.15.18: + resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz} + name: esbuild-linux-arm64 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-mips64le/0.14.54: + resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz} + name: esbuild-linux-mips64le + version: 0.14.54 + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-mips64le/0.15.18: + resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz} + name: esbuild-linux-mips64le + version: 0.15.18 + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-ppc64le/0.14.54: + resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz} + name: esbuild-linux-ppc64le + version: 0.14.54 + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-ppc64le/0.15.18: + resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz} + name: esbuild-linux-ppc64le + version: 0.15.18 + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-riscv64/0.14.54: + resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz} + name: esbuild-linux-riscv64 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-riscv64/0.15.18: + resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz} + name: esbuild-linux-riscv64 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-s390x/0.14.54: + resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz} + name: esbuild-linux-s390x + version: 0.14.54 + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-linux-s390x/0.15.18: + resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz} + name: esbuild-linux-s390x + version: 0.15.18 + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-netbsd-64/0.14.54: + resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz} + name: esbuild-netbsd-64 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-netbsd-64/0.15.18: + resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz} + name: esbuild-netbsd-64 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-node-loader/0.6.5: + resolution: {integrity: sha512-uPP+dllWm38cFvDysdocutN3lfe5pTIbddAHp1ENyLzpHYqE2r+3Wo+pfg9X3p8DFWwzIisft5YkeBIthIcixw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-node-loader/-/esbuild-node-loader-0.6.5.tgz} + name: esbuild-node-loader + version: 0.6.5 + dependencies: + esbuild: registry.npmmirror.com/esbuild/0.17.11 + dev: true + + registry.npmmirror.com/esbuild-openbsd-64/0.14.54: + resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz} + name: esbuild-openbsd-64 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-openbsd-64/0.15.18: + resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz} + name: esbuild-openbsd-64 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-plugin-alias/0.1.2: + resolution: {integrity: sha512-WsX0OJy8IGOsGZV+4oHEU5B6XQUpxOsZN1iSoYf9COTDbY7WXcOwd1oCLYNWUIWCExyGXSghIGq2k7sXBldxwQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-plugin-alias/-/esbuild-plugin-alias-0.1.2.tgz} + name: esbuild-plugin-alias + version: 0.1.2 + dev: true + + registry.npmmirror.com/esbuild-register/3.4.2_esbuild@0.17.11: + resolution: {integrity: sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-register/-/esbuild-register-3.4.2.tgz} + id: registry.npmmirror.com/esbuild-register/3.4.2 + name: esbuild-register + version: 3.4.2 + peerDependencies: + esbuild: '>=0.12 <1' + dependencies: + debug: registry.npmmirror.com/debug/4.3.4 + esbuild: registry.npmmirror.com/esbuild/0.17.11 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/esbuild-sunos-64/0.14.54: + resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz} + name: esbuild-sunos-64 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-sunos-64/0.15.18: + resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz} + name: esbuild-sunos-64 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-windows-32/0.14.54: + resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz} + name: esbuild-windows-32 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-windows-32/0.15.18: + resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz} + name: esbuild-windows-32 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-windows-64/0.14.54: + resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz} + name: esbuild-windows-64 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-windows-64/0.15.18: + resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz} + name: esbuild-windows-64 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-windows-arm64/0.14.54: + resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz} + name: esbuild-windows-arm64 + version: 0.14.54 + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild-windows-arm64/0.15.18: + resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz} + name: esbuild-windows-arm64 + version: 0.15.18 + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/esbuild/0.11.23: + resolution: {integrity: sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.11.23.tgz} + name: esbuild + version: 0.11.23 + hasBin: true + requiresBuild: true + dev: true + + registry.npmmirror.com/esbuild/0.11.3: + resolution: {integrity: sha512-BzVRHcCtFepjS9WcqRjqoIxLqgpK21a8J4Zi4msSGxDxiXVO1IbcqT1KjhdDDnJxKfe7bvzZrvMEX+bVO0Elcw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.11.3.tgz} + name: esbuild + version: 0.11.3 + hasBin: true + requiresBuild: true + dev: true + + registry.npmmirror.com/esbuild/0.14.54: + resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.14.54.tgz} + name: esbuild + version: 0.14.54 + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/linux-loong64': registry.npmmirror.com/@esbuild/linux-loong64/0.14.54 + esbuild-android-64: registry.npmmirror.com/esbuild-android-64/0.14.54 + esbuild-android-arm64: registry.npmmirror.com/esbuild-android-arm64/0.14.54 + esbuild-darwin-64: registry.npmmirror.com/esbuild-darwin-64/0.14.54 + esbuild-darwin-arm64: registry.npmmirror.com/esbuild-darwin-arm64/0.14.54 + esbuild-freebsd-64: registry.npmmirror.com/esbuild-freebsd-64/0.14.54 + esbuild-freebsd-arm64: registry.npmmirror.com/esbuild-freebsd-arm64/0.14.54 + esbuild-linux-32: registry.npmmirror.com/esbuild-linux-32/0.14.54 + esbuild-linux-64: registry.npmmirror.com/esbuild-linux-64/0.14.54 + esbuild-linux-arm: registry.npmmirror.com/esbuild-linux-arm/0.14.54 + esbuild-linux-arm64: registry.npmmirror.com/esbuild-linux-arm64/0.14.54 + esbuild-linux-mips64le: registry.npmmirror.com/esbuild-linux-mips64le/0.14.54 + esbuild-linux-ppc64le: registry.npmmirror.com/esbuild-linux-ppc64le/0.14.54 + esbuild-linux-riscv64: registry.npmmirror.com/esbuild-linux-riscv64/0.14.54 + esbuild-linux-s390x: registry.npmmirror.com/esbuild-linux-s390x/0.14.54 + esbuild-netbsd-64: registry.npmmirror.com/esbuild-netbsd-64/0.14.54 + esbuild-openbsd-64: registry.npmmirror.com/esbuild-openbsd-64/0.14.54 + esbuild-sunos-64: registry.npmmirror.com/esbuild-sunos-64/0.14.54 + esbuild-windows-32: registry.npmmirror.com/esbuild-windows-32/0.14.54 + esbuild-windows-64: registry.npmmirror.com/esbuild-windows-64/0.14.54 + esbuild-windows-arm64: registry.npmmirror.com/esbuild-windows-arm64/0.14.54 + dev: true + + registry.npmmirror.com/esbuild/0.15.18: + resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.15.18.tgz} + name: esbuild + version: 0.15.18 + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': registry.npmmirror.com/@esbuild/android-arm/0.15.18 + '@esbuild/linux-loong64': registry.npmmirror.com/@esbuild/linux-loong64/0.15.18 + esbuild-android-64: registry.npmmirror.com/esbuild-android-64/0.15.18 + esbuild-android-arm64: registry.npmmirror.com/esbuild-android-arm64/0.15.18 + esbuild-darwin-64: registry.npmmirror.com/esbuild-darwin-64/0.15.18 + esbuild-darwin-arm64: registry.npmmirror.com/esbuild-darwin-arm64/0.15.18 + esbuild-freebsd-64: registry.npmmirror.com/esbuild-freebsd-64/0.15.18 + esbuild-freebsd-arm64: registry.npmmirror.com/esbuild-freebsd-arm64/0.15.18 + esbuild-linux-32: registry.npmmirror.com/esbuild-linux-32/0.15.18 + esbuild-linux-64: registry.npmmirror.com/esbuild-linux-64/0.15.18 + esbuild-linux-arm: registry.npmmirror.com/esbuild-linux-arm/0.15.18 + esbuild-linux-arm64: registry.npmmirror.com/esbuild-linux-arm64/0.15.18 + esbuild-linux-mips64le: registry.npmmirror.com/esbuild-linux-mips64le/0.15.18 + esbuild-linux-ppc64le: registry.npmmirror.com/esbuild-linux-ppc64le/0.15.18 + esbuild-linux-riscv64: registry.npmmirror.com/esbuild-linux-riscv64/0.15.18 + esbuild-linux-s390x: registry.npmmirror.com/esbuild-linux-s390x/0.15.18 + esbuild-netbsd-64: registry.npmmirror.com/esbuild-netbsd-64/0.15.18 + esbuild-openbsd-64: registry.npmmirror.com/esbuild-openbsd-64/0.15.18 + esbuild-sunos-64: registry.npmmirror.com/esbuild-sunos-64/0.15.18 + esbuild-windows-32: registry.npmmirror.com/esbuild-windows-32/0.15.18 + esbuild-windows-64: registry.npmmirror.com/esbuild-windows-64/0.15.18 + esbuild-windows-arm64: registry.npmmirror.com/esbuild-windows-arm64/0.15.18 + dev: true + + registry.npmmirror.com/esbuild/0.17.11: + resolution: {integrity: sha512-pAMImyokbWDtnA/ufPxjQg0fYo2DDuzAlqwnDvbXqHLphe+m80eF++perYKVm8LeTuj2zUuFXC+xgSVxyoHUdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.17.11.tgz} + name: esbuild + version: 0.17.11 + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': registry.npmmirror.com/@esbuild/android-arm/0.17.11 + '@esbuild/android-arm64': registry.npmmirror.com/@esbuild/android-arm64/0.17.11 + '@esbuild/android-x64': registry.npmmirror.com/@esbuild/android-x64/0.17.11 + '@esbuild/darwin-arm64': registry.npmmirror.com/@esbuild/darwin-arm64/0.17.11 + '@esbuild/darwin-x64': registry.npmmirror.com/@esbuild/darwin-x64/0.17.11 + '@esbuild/freebsd-arm64': registry.npmmirror.com/@esbuild/freebsd-arm64/0.17.11 + '@esbuild/freebsd-x64': registry.npmmirror.com/@esbuild/freebsd-x64/0.17.11 + '@esbuild/linux-arm': registry.npmmirror.com/@esbuild/linux-arm/0.17.11 + '@esbuild/linux-arm64': registry.npmmirror.com/@esbuild/linux-arm64/0.17.11 + '@esbuild/linux-ia32': registry.npmmirror.com/@esbuild/linux-ia32/0.17.11 + '@esbuild/linux-loong64': registry.npmmirror.com/@esbuild/linux-loong64/0.17.11 + '@esbuild/linux-mips64el': registry.npmmirror.com/@esbuild/linux-mips64el/0.17.11 + '@esbuild/linux-ppc64': registry.npmmirror.com/@esbuild/linux-ppc64/0.17.11 + '@esbuild/linux-riscv64': registry.npmmirror.com/@esbuild/linux-riscv64/0.17.11 + '@esbuild/linux-s390x': registry.npmmirror.com/@esbuild/linux-s390x/0.17.11 + '@esbuild/linux-x64': registry.npmmirror.com/@esbuild/linux-x64/0.17.11 + '@esbuild/netbsd-x64': registry.npmmirror.com/@esbuild/netbsd-x64/0.17.11 + '@esbuild/openbsd-x64': registry.npmmirror.com/@esbuild/openbsd-x64/0.17.11 + '@esbuild/sunos-x64': registry.npmmirror.com/@esbuild/sunos-x64/0.17.11 + '@esbuild/win32-arm64': registry.npmmirror.com/@esbuild/win32-arm64/0.17.11 + '@esbuild/win32-ia32': registry.npmmirror.com/@esbuild/win32-ia32/0.17.11 + '@esbuild/win32-x64': registry.npmmirror.com/@esbuild/win32-x64/0.17.11 + dev: true + + registry.npmmirror.com/escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz} + name: escalade + version: 3.1.1 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/escape-html/1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz} + name: escape-html + version: 1.0.3 + dev: true + + registry.npmmirror.com/escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz} + name: escape-string-regexp + version: 1.0.5 + engines: {node: '>=0.8.0'} + dev: true + + registry.npmmirror.com/escape-string-regexp/2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz} + name: escape-string-regexp + version: 2.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz} + name: escape-string-regexp + version: 4.0.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/escodegen/2.0.0: + resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escodegen/-/escodegen-2.0.0.tgz} + name: escodegen + version: 2.0.0 + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: registry.npmmirror.com/esprima/4.0.1 + estraverse: registry.npmmirror.com/estraverse/5.3.0 + esutils: registry.npmmirror.com/esutils/2.0.3 + optionator: registry.npmmirror.com/optionator/0.8.3 + optionalDependencies: + source-map: registry.npmmirror.com/source-map/0.6.1 + dev: true + + registry.npmmirror.com/eslint-config-prettier/8.6.0_eslint@8.35.0: + resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz} + id: registry.npmmirror.com/eslint-config-prettier/8.6.0 + name: eslint-config-prettier + version: 8.6.0 + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: registry.npmmirror.com/eslint/8.35.0 + dev: true + + registry.npmmirror.com/eslint-define-config/1.15.0: + resolution: {integrity: sha512-p6K61L6HrnDNRF2HzUsTdGaGPohO0TmSX/oQ0ttBhfApWHMyDcX+FCqSziCDywSf0U0bxe4e2HOfYho1nGHTLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint-define-config/-/eslint-define-config-1.15.0.tgz} + name: eslint-define-config + version: 1.15.0 + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13', pnpm: '>= 7.0.0'} + dev: true + + registry.npmmirror.com/eslint-plugin-jest/25.7.0_npuaqhfkjgus3nqfbgjmqmizqa: + resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz} + id: registry.npmmirror.com/eslint-plugin-jest/25.7.0 + name: eslint-plugin-jest + version: 25.7.0 + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': registry.npmmirror.com/@typescript-eslint/eslint-plugin/5.54.0_6mj2wypvdnknez7kws2nfdgupi + '@typescript-eslint/experimental-utils': registry.npmmirror.com/@typescript-eslint/experimental-utils/5.54.0_ycpbpc6yetojsgtrx3mwntkhsu + eslint: registry.npmmirror.com/eslint/8.35.0 + jest: registry.npmmirror.com/jest/27.5.1_ts-node@10.9.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + registry.npmmirror.com/eslint-plugin-prettier/4.2.1_u2zha4kiojzs42thzpgwygphmy: + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz} + id: registry.npmmirror.com/eslint-plugin-prettier/4.2.1 + name: eslint-plugin-prettier + version: 4.2.1 + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: registry.npmmirror.com/eslint/8.35.0 + eslint-config-prettier: registry.npmmirror.com/eslint-config-prettier/8.6.0_eslint@8.35.0 + prettier: registry.npmmirror.com/prettier/2.8.4 + prettier-linter-helpers: registry.npmmirror.com/prettier-linter-helpers/1.0.0 + dev: true + + registry.npmmirror.com/eslint-plugin-vue/8.7.1_eslint@8.35.0: + resolution: {integrity: sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz} + id: registry.npmmirror.com/eslint-plugin-vue/8.7.1 + name: eslint-plugin-vue + version: 8.7.1 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: registry.npmmirror.com/eslint/8.35.0 + eslint-utils: registry.npmmirror.com/eslint-utils/3.0.0_eslint@8.35.0 + natural-compare: registry.npmmirror.com/natural-compare/1.4.0 + nth-check: registry.npmmirror.com/nth-check/2.1.1 + postcss-selector-parser: registry.npmmirror.com/postcss-selector-parser/6.0.11 + semver: registry.npmmirror.com/semver/7.3.8 + vue-eslint-parser: registry.npmmirror.com/vue-eslint-parser/8.3.0_eslint@8.35.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz} + name: eslint-scope + version: 5.1.1 + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: registry.npmmirror.com/esrecurse/4.3.0 + estraverse: registry.npmmirror.com/estraverse/4.3.0 + dev: true + + registry.npmmirror.com/eslint-scope/7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.1.1.tgz} + name: eslint-scope + version: 7.1.1 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: registry.npmmirror.com/esrecurse/4.3.0 + estraverse: registry.npmmirror.com/estraverse/5.3.0 + dev: true + + registry.npmmirror.com/eslint-utils/3.0.0_eslint@8.35.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint-utils/-/eslint-utils-3.0.0.tgz} + id: registry.npmmirror.com/eslint-utils/3.0.0 + name: eslint-utils + version: 3.0.0 + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: registry.npmmirror.com/eslint/8.35.0 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys/2.1.0 + dev: true + + registry.npmmirror.com/eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz} + name: eslint-visitor-keys + version: 2.1.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/eslint-visitor-keys/3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz} + name: eslint-visitor-keys + version: 3.3.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + registry.npmmirror.com/eslint/8.35.0: + resolution: {integrity: sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint/-/eslint-8.35.0.tgz} + name: eslint + version: 8.35.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': registry.npmmirror.com/@eslint/eslintrc/2.0.0 + '@eslint/js': registry.npmmirror.com/@eslint/js/8.35.0 + '@humanwhocodes/config-array': registry.npmmirror.com/@humanwhocodes/config-array/0.11.8 + '@humanwhocodes/module-importer': registry.npmmirror.com/@humanwhocodes/module-importer/1.0.1 + '@nodelib/fs.walk': registry.npmmirror.com/@nodelib/fs.walk/1.2.8 + ajv: registry.npmmirror.com/ajv/6.12.6 + chalk: registry.npmmirror.com/chalk/4.1.2 + cross-spawn: registry.npmmirror.com/cross-spawn/7.0.3 + debug: registry.npmmirror.com/debug/4.3.4 + doctrine: registry.npmmirror.com/doctrine/3.0.0 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp/4.0.0 + eslint-scope: registry.npmmirror.com/eslint-scope/7.1.1 + eslint-utils: registry.npmmirror.com/eslint-utils/3.0.0_eslint@8.35.0 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys/3.3.0 + espree: registry.npmmirror.com/espree/9.4.1 + esquery: registry.npmmirror.com/esquery/1.5.0 + esutils: registry.npmmirror.com/esutils/2.0.3 + fast-deep-equal: registry.npmmirror.com/fast-deep-equal/3.1.3 + file-entry-cache: registry.npmmirror.com/file-entry-cache/6.0.1 + find-up: registry.npmmirror.com/find-up/5.0.0 + glob-parent: registry.npmmirror.com/glob-parent/6.0.2 + globals: registry.npmmirror.com/globals/13.20.0 + grapheme-splitter: registry.npmmirror.com/grapheme-splitter/1.0.4 + ignore: registry.npmmirror.com/ignore/5.2.4 + import-fresh: registry.npmmirror.com/import-fresh/3.3.0 + imurmurhash: registry.npmmirror.com/imurmurhash/0.1.4 + is-glob: registry.npmmirror.com/is-glob/4.0.3 + is-path-inside: registry.npmmirror.com/is-path-inside/3.0.3 + js-sdsl: registry.npmmirror.com/js-sdsl/4.3.0 + js-yaml: registry.npmmirror.com/js-yaml/4.1.0 + json-stable-stringify-without-jsonify: registry.npmmirror.com/json-stable-stringify-without-jsonify/1.0.1 + levn: registry.npmmirror.com/levn/0.4.1 + lodash.merge: registry.npmmirror.com/lodash.merge/4.6.2 + minimatch: registry.npmmirror.com/minimatch/3.1.2 + natural-compare: registry.npmmirror.com/natural-compare/1.4.0 + optionator: registry.npmmirror.com/optionator/0.9.1 + regexpp: registry.npmmirror.com/regexpp/3.2.0 + strip-ansi: registry.npmmirror.com/strip-ansi/6.0.1 + strip-json-comments: registry.npmmirror.com/strip-json-comments/3.1.1 + text-table: registry.npmmirror.com/text-table/0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/esno/0.14.1: + resolution: {integrity: sha512-yDFYw6dGUjCT1qKsdG7WOc/RzIh/qwxUEVZ+ohCltaxBxEFMNqeqbQL9xjRl6Yvdwrfc5OCjUA9JbFmuu/8BKg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esno/-/esno-0.14.1.tgz} + name: esno + version: 0.14.1 + hasBin: true + dependencies: + cross-spawn: registry.npmmirror.com/cross-spawn/7.0.3 + esbuild: registry.npmmirror.com/esbuild/0.17.11 + esbuild-node-loader: registry.npmmirror.com/esbuild-node-loader/0.6.5 + esbuild-register: registry.npmmirror.com/esbuild-register/3.4.2_esbuild@0.17.11 + import-meta-resolve: registry.npmmirror.com/import-meta-resolve/1.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/espree/9.4.1: + resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/espree/-/espree-9.4.1.tgz} + name: espree + version: 9.4.1 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: registry.npmmirror.com/acorn/8.8.2 + acorn-jsx: registry.npmmirror.com/acorn-jsx/5.3.2_acorn@8.8.2 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys/3.3.0 + dev: true + + registry.npmmirror.com/esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz} + name: esprima + version: 4.0.1 + engines: {node: '>=4'} + hasBin: true + dev: true + + registry.npmmirror.com/esquery/1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz} + name: esquery + version: 1.5.0 + engines: {node: '>=0.10'} + dependencies: + estraverse: registry.npmmirror.com/estraverse/5.3.0 + dev: true + + registry.npmmirror.com/esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz} + name: esrecurse + version: 4.3.0 + engines: {node: '>=4.0'} + dependencies: + estraverse: registry.npmmirror.com/estraverse/5.3.0 + dev: true + + registry.npmmirror.com/estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz} + name: estraverse + version: 4.3.0 + engines: {node: '>=4.0'} + dev: true + + registry.npmmirror.com/estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz} + name: estraverse + version: 5.3.0 + engines: {node: '>=4.0'} + dev: true + + registry.npmmirror.com/estree-walker/1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/estree-walker/-/estree-walker-1.0.1.tgz} + name: estree-walker + version: 1.0.1 + dev: true + + registry.npmmirror.com/estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz} + name: estree-walker + version: 2.0.2 + + registry.npmmirror.com/esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz} + name: esutils + version: 2.0.3 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/etag/1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz} + name: etag + version: 1.8.1 + engines: {node: '>= 0.6'} + dev: true + + registry.npmmirror.com/eventemitter3/4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz} + name: eventemitter3 + version: 4.0.7 + dev: true + + registry.npmmirror.com/exec-buffer/3.2.0: + resolution: {integrity: sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/exec-buffer/-/exec-buffer-3.2.0.tgz} + name: exec-buffer + version: 3.2.0 + engines: {node: '>=4'} + dependencies: + execa: registry.npmmirror.com/execa/0.7.0 + p-finally: registry.npmmirror.com/p-finally/1.0.0 + pify: registry.npmmirror.com/pify/3.0.0 + rimraf: registry.npmmirror.com/rimraf/2.7.1 + tempfile: registry.npmmirror.com/tempfile/2.0.0 + dev: true + + registry.npmmirror.com/execa/0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/execa/-/execa-0.7.0.tgz} + name: execa + version: 0.7.0 + engines: {node: '>=4'} + dependencies: + cross-spawn: registry.npmmirror.com/cross-spawn/5.1.0 + get-stream: registry.npmmirror.com/get-stream/3.0.0 + is-stream: registry.npmmirror.com/is-stream/1.1.0 + npm-run-path: registry.npmmirror.com/npm-run-path/2.0.2 + p-finally: registry.npmmirror.com/p-finally/1.0.0 + signal-exit: registry.npmmirror.com/signal-exit/3.0.7 + strip-eof: registry.npmmirror.com/strip-eof/1.0.0 + dev: true + + registry.npmmirror.com/execa/1.0.0: + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/execa/-/execa-1.0.0.tgz} + name: execa + version: 1.0.0 + engines: {node: '>=6'} + dependencies: + cross-spawn: registry.npmmirror.com/cross-spawn/6.0.5 + get-stream: registry.npmmirror.com/get-stream/4.1.0 + is-stream: registry.npmmirror.com/is-stream/1.1.0 + npm-run-path: registry.npmmirror.com/npm-run-path/2.0.2 + p-finally: registry.npmmirror.com/p-finally/1.0.0 + signal-exit: registry.npmmirror.com/signal-exit/3.0.7 + strip-eof: registry.npmmirror.com/strip-eof/1.0.0 + dev: true + + registry.npmmirror.com/execa/4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz} + name: execa + version: 4.1.0 + engines: {node: '>=10'} + dependencies: + cross-spawn: registry.npmmirror.com/cross-spawn/7.0.3 + get-stream: registry.npmmirror.com/get-stream/5.2.0 + human-signals: registry.npmmirror.com/human-signals/1.1.1 + is-stream: registry.npmmirror.com/is-stream/2.0.1 + merge-stream: registry.npmmirror.com/merge-stream/2.0.0 + npm-run-path: registry.npmmirror.com/npm-run-path/4.0.1 + onetime: registry.npmmirror.com/onetime/5.1.2 + signal-exit: registry.npmmirror.com/signal-exit/3.0.7 + strip-final-newline: registry.npmmirror.com/strip-final-newline/2.0.0 + dev: true + + registry.npmmirror.com/execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz} + name: execa + version: 5.1.1 + engines: {node: '>=10'} + dependencies: + cross-spawn: registry.npmmirror.com/cross-spawn/7.0.3 + get-stream: registry.npmmirror.com/get-stream/6.0.1 + human-signals: registry.npmmirror.com/human-signals/2.1.0 + is-stream: registry.npmmirror.com/is-stream/2.0.1 + merge-stream: registry.npmmirror.com/merge-stream/2.0.0 + npm-run-path: registry.npmmirror.com/npm-run-path/4.0.1 + onetime: registry.npmmirror.com/onetime/5.1.2 + signal-exit: registry.npmmirror.com/signal-exit/3.0.7 + strip-final-newline: registry.npmmirror.com/strip-final-newline/2.0.0 + dev: true + + registry.npmmirror.com/executable/4.1.1: + resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/executable/-/executable-4.1.1.tgz} + name: executable + version: 4.1.1 + engines: {node: '>=4'} + dependencies: + pify: registry.npmmirror.com/pify/2.3.0 + dev: true + + registry.npmmirror.com/exit/0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz} + name: exit + version: 0.1.2 + engines: {node: '>= 0.8.0'} + dev: true + + registry.npmmirror.com/expand-brackets/2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz} + name: expand-brackets + version: 2.1.4 + engines: {node: '>=0.10.0'} + dependencies: + debug: registry.npmmirror.com/debug/2.6.9 + define-property: registry.npmmirror.com/define-property/0.2.5 + extend-shallow: registry.npmmirror.com/extend-shallow/2.0.1 + posix-character-classes: registry.npmmirror.com/posix-character-classes/0.1.1 + regex-not: registry.npmmirror.com/regex-not/1.0.2 + snapdragon: registry.npmmirror.com/snapdragon/0.8.2 + to-regex: registry.npmmirror.com/to-regex/3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/expand-tilde/2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/expand-tilde/-/expand-tilde-2.0.2.tgz} + name: expand-tilde + version: 2.0.2 + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: registry.npmmirror.com/homedir-polyfill/1.0.3 + dev: true + + registry.npmmirror.com/expect/27.5.1: + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/expect/-/expect-27.5.1.tgz} + name: expect + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + jest-get-type: registry.npmmirror.com/jest-get-type/27.5.1 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils/27.5.1 + jest-message-util: registry.npmmirror.com/jest-message-util/27.5.1 + dev: true + + registry.npmmirror.com/ext-list/2.2.2: + resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ext-list/-/ext-list-2.2.2.tgz} + name: ext-list + version: 2.2.2 + engines: {node: '>=0.10.0'} + dependencies: + mime-db: registry.npmmirror.com/mime-db/1.52.0 + dev: true + + registry.npmmirror.com/ext-name/5.0.0: + resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ext-name/-/ext-name-5.0.0.tgz} + name: ext-name + version: 5.0.0 + engines: {node: '>=4'} + dependencies: + ext-list: registry.npmmirror.com/ext-list/2.2.2 + sort-keys-length: registry.npmmirror.com/sort-keys-length/1.0.1 + dev: true + + registry.npmmirror.com/extend-shallow/2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz} + name: extend-shallow + version: 2.0.1 + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: registry.npmmirror.com/is-extendable/0.1.1 + dev: true + + registry.npmmirror.com/extend-shallow/3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz} + name: extend-shallow + version: 3.0.2 + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: registry.npmmirror.com/assign-symbols/1.0.0 + is-extendable: registry.npmmirror.com/is-extendable/1.0.1 + dev: true + + registry.npmmirror.com/external-editor/3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz} + name: external-editor + version: 3.1.0 + engines: {node: '>=4'} + dependencies: + chardet: registry.npmmirror.com/chardet/0.7.0 + iconv-lite: registry.npmmirror.com/iconv-lite/0.4.24 + tmp: registry.npmmirror.com/tmp/0.0.33 + dev: true + + registry.npmmirror.com/extglob/2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz} + name: extglob + version: 2.0.4 + engines: {node: '>=0.10.0'} + dependencies: + array-unique: registry.npmmirror.com/array-unique/0.3.2 + define-property: registry.npmmirror.com/define-property/1.0.0 + expand-brackets: registry.npmmirror.com/expand-brackets/2.1.4 + extend-shallow: registry.npmmirror.com/extend-shallow/2.0.1 + fragment-cache: registry.npmmirror.com/fragment-cache/0.2.1 + regex-not: registry.npmmirror.com/regex-not/1.0.2 + snapdragon: registry.npmmirror.com/snapdragon/0.8.2 + to-regex: registry.npmmirror.com/to-regex/3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz} + name: fast-deep-equal + version: 3.1.3 + dev: true + + registry.npmmirror.com/fast-diff/1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz} + name: fast-diff + version: 1.2.0 + dev: true + + registry.npmmirror.com/fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz} + name: fast-glob + version: 3.2.12 + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': registry.npmmirror.com/@nodelib/fs.stat/2.0.5 + '@nodelib/fs.walk': registry.npmmirror.com/@nodelib/fs.walk/1.2.8 + glob-parent: registry.npmmirror.com/glob-parent/5.1.2 + merge2: registry.npmmirror.com/merge2/1.4.1 + micromatch: registry.npmmirror.com/micromatch/4.0.5 + dev: true + + registry.npmmirror.com/fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz} + name: fast-json-stable-stringify + version: 2.1.0 + dev: true + + registry.npmmirror.com/fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz} + name: fast-levenshtein + version: 2.0.6 + dev: true + + registry.npmmirror.com/fast-xml-parser/4.1.3: + resolution: {integrity: sha512-LsNDahCiCcJPe8NO7HijcnukHB24tKbfDDA5IILx9dmW3Frb52lhbeX6MPNUSvyGNfav2VTYpJ/OqkRoVLrh2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-4.1.3.tgz} + name: fast-xml-parser + version: 4.1.3 + hasBin: true + dependencies: + strnum: registry.npmmirror.com/strnum/1.0.5 + dev: true + + registry.npmmirror.com/fastest-levenshtein/1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz} + name: fastest-levenshtein + version: 1.0.16 + engines: {node: '>= 4.9.1'} + + registry.npmmirror.com/fastq/1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz} + name: fastq + version: 1.15.0 + dependencies: + reusify: registry.npmmirror.com/reusify/1.0.4 + dev: true + + registry.npmmirror.com/fb-watchman/2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz} + name: fb-watchman + version: 2.0.2 + dependencies: + bser: registry.npmmirror.com/bser/2.1.1 + dev: true + + registry.npmmirror.com/fd-slicer/1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz} + name: fd-slicer + version: 1.1.0 + dependencies: + pend: registry.npmmirror.com/pend/1.2.0 + dev: true + + registry.npmmirror.com/figures/1.7.0: + resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/figures/-/figures-1.7.0.tgz} + name: figures + version: 1.7.0 + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: registry.npmmirror.com/escape-string-regexp/1.0.5 + object-assign: registry.npmmirror.com/object-assign/4.1.1 + dev: true + + registry.npmmirror.com/figures/3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz} + name: figures + version: 3.2.0 + engines: {node: '>=8'} + dependencies: + escape-string-regexp: registry.npmmirror.com/escape-string-regexp/1.0.5 + dev: true + + registry.npmmirror.com/file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz} + name: file-entry-cache + version: 6.0.1 + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: registry.npmmirror.com/flat-cache/3.0.4 + dev: true + + registry.npmmirror.com/file-type/10.11.0: + resolution: {integrity: sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/file-type/-/file-type-10.11.0.tgz} + name: file-type + version: 10.11.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/file-type/12.4.2: + resolution: {integrity: sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/file-type/-/file-type-12.4.2.tgz} + name: file-type + version: 12.4.2 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/file-type/3.9.0: + resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/file-type/-/file-type-3.9.0.tgz} + name: file-type + version: 3.9.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/file-type/4.4.0: + resolution: {integrity: sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/file-type/-/file-type-4.4.0.tgz} + name: file-type + version: 4.4.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/file-type/5.2.0: + resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/file-type/-/file-type-5.2.0.tgz} + name: file-type + version: 5.2.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/file-type/6.2.0: + resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/file-type/-/file-type-6.2.0.tgz} + name: file-type + version: 6.2.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/file-type/8.1.0: + resolution: {integrity: sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/file-type/-/file-type-8.1.0.tgz} + name: file-type + version: 8.1.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/filelist/1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz} + name: filelist + version: 1.0.4 + dependencies: + minimatch: registry.npmmirror.com/minimatch/5.1.6 + dev: true + + registry.npmmirror.com/filename-reserved-regex/2.0.0: + resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz} + name: filename-reserved-regex + version: 2.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/filenamify/2.1.0: + resolution: {integrity: sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/filenamify/-/filenamify-2.1.0.tgz} + name: filenamify + version: 2.1.0 + engines: {node: '>=4'} + dependencies: + filename-reserved-regex: registry.npmmirror.com/filename-reserved-regex/2.0.0 + strip-outer: registry.npmmirror.com/strip-outer/1.0.1 + trim-repeated: registry.npmmirror.com/trim-repeated/1.0.0 + dev: true + + registry.npmmirror.com/fill-range/4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz} + name: fill-range + version: 4.0.0 + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: registry.npmmirror.com/extend-shallow/2.0.1 + is-number: registry.npmmirror.com/is-number/3.0.0 + repeat-string: registry.npmmirror.com/repeat-string/1.6.1 + to-regex-range: registry.npmmirror.com/to-regex-range/2.1.1 + dev: true + + registry.npmmirror.com/fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz} + name: fill-range + version: 7.0.1 + engines: {node: '>=8'} + dependencies: + to-regex-range: registry.npmmirror.com/to-regex-range/5.0.1 + dev: true + + registry.npmmirror.com/finalhandler/1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz} + name: finalhandler + version: 1.1.2 + engines: {node: '>= 0.8'} + dependencies: + debug: registry.npmmirror.com/debug/2.6.9 + encodeurl: registry.npmmirror.com/encodeurl/1.0.2 + escape-html: registry.npmmirror.com/escape-html/1.0.3 + on-finished: registry.npmmirror.com/on-finished/2.3.0 + parseurl: registry.npmmirror.com/parseurl/1.3.3 + statuses: registry.npmmirror.com/statuses/1.5.0 + unpipe: registry.npmmirror.com/unpipe/1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/find-node-modules/2.1.3: + resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/find-node-modules/-/find-node-modules-2.1.3.tgz} + name: find-node-modules + version: 2.1.3 + dependencies: + findup-sync: registry.npmmirror.com/findup-sync/4.0.0 + merge: registry.npmmirror.com/merge/2.1.1 + dev: true + + registry.npmmirror.com/find-root/1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/find-root/-/find-root-1.1.0.tgz} + name: find-root + version: 1.1.0 + dev: true + + registry.npmmirror.com/find-up/1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/find-up/-/find-up-1.1.2.tgz} + name: find-up + version: 1.1.2 + engines: {node: '>=0.10.0'} + dependencies: + path-exists: registry.npmmirror.com/path-exists/2.1.0 + pinkie-promise: registry.npmmirror.com/pinkie-promise/2.0.1 + dev: true + + registry.npmmirror.com/find-up/2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/find-up/-/find-up-2.1.0.tgz} + name: find-up + version: 2.1.0 + engines: {node: '>=4'} + dependencies: + locate-path: registry.npmmirror.com/locate-path/2.0.0 + dev: true + + registry.npmmirror.com/find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz} + name: find-up + version: 4.1.0 + engines: {node: '>=8'} + dependencies: + locate-path: registry.npmmirror.com/locate-path/5.0.0 + path-exists: registry.npmmirror.com/path-exists/4.0.0 + + registry.npmmirror.com/find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz} + name: find-up + version: 5.0.0 + engines: {node: '>=10'} + dependencies: + locate-path: registry.npmmirror.com/locate-path/6.0.0 + path-exists: registry.npmmirror.com/path-exists/4.0.0 + dev: true + + registry.npmmirror.com/find-versions/3.2.0: + resolution: {integrity: sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/find-versions/-/find-versions-3.2.0.tgz} + name: find-versions + version: 3.2.0 + engines: {node: '>=6'} + dependencies: + semver-regex: registry.npmmirror.com/semver-regex/2.0.0 + dev: true + + registry.npmmirror.com/findup-sync/4.0.0: + resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/findup-sync/-/findup-sync-4.0.0.tgz} + name: findup-sync + version: 4.0.0 + engines: {node: '>= 8'} + dependencies: + detect-file: registry.npmmirror.com/detect-file/1.0.0 + is-glob: registry.npmmirror.com/is-glob/4.0.3 + micromatch: registry.npmmirror.com/micromatch/4.0.5 + resolve-dir: registry.npmmirror.com/resolve-dir/1.0.1 + dev: true + + registry.npmmirror.com/flat-cache/3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz} + name: flat-cache + version: 3.0.4 + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: registry.npmmirror.com/flatted/3.2.7 + rimraf: registry.npmmirror.com/rimraf/3.0.2 + dev: true + + registry.npmmirror.com/flatted/3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz} + name: flatted + version: 3.2.7 + dev: true + + registry.npmmirror.com/follow-redirects/1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz} + name: follow-redirects + version: 1.15.2 + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + registry.npmmirror.com/follow-redirects/1.15.2_debug@4.3.4: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz} + id: registry.npmmirror.com/follow-redirects/1.15.2 + name: follow-redirects + version: 1.15.2 + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: registry.npmmirror.com/debug/4.3.4 + dev: true + + registry.npmmirror.com/for-each/0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz} + name: for-each + version: 0.3.3 + dependencies: + is-callable: registry.npmmirror.com/is-callable/1.2.7 + dev: true + + registry.npmmirror.com/for-in/1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz} + name: for-in + version: 1.0.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/form-data/3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz} + name: form-data + version: 3.0.1 + engines: {node: '>= 6'} + dependencies: + asynckit: registry.npmmirror.com/asynckit/0.4.0 + combined-stream: registry.npmmirror.com/combined-stream/1.0.8 + mime-types: registry.npmmirror.com/mime-types/2.1.35 + dev: true + + registry.npmmirror.com/form-data/4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz} + name: form-data + version: 4.0.0 + engines: {node: '>= 6'} + dependencies: + asynckit: registry.npmmirror.com/asynckit/0.4.0 + combined-stream: registry.npmmirror.com/combined-stream/1.0.8 + mime-types: registry.npmmirror.com/mime-types/2.1.35 + dev: true + + registry.npmmirror.com/fraction.js/4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz} + name: fraction.js + version: 4.2.0 + dev: true + + registry.npmmirror.com/fragment-cache/0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz} + name: fragment-cache + version: 0.2.1 + engines: {node: '>=0.10.0'} + dependencies: + map-cache: registry.npmmirror.com/map-cache/0.2.2 + dev: true + + registry.npmmirror.com/from2/2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/from2/-/from2-2.3.0.tgz} + name: from2 + version: 2.3.0 + dependencies: + inherits: registry.npmmirror.com/inherits/2.0.4 + readable-stream: registry.npmmirror.com/readable-stream/2.3.8 + dev: true + + registry.npmmirror.com/fs-constants/1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz} + name: fs-constants + version: 1.0.0 + dev: true + + registry.npmmirror.com/fs-extra/10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz} + name: fs-extra + version: 10.1.0 + engines: {node: '>=12'} + dependencies: + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + jsonfile: registry.npmmirror.com/jsonfile/6.1.0 + universalify: registry.npmmirror.com/universalify/2.0.0 + dev: true + + registry.npmmirror.com/fs-extra/9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz} + name: fs-extra + version: 9.1.0 + engines: {node: '>=10'} + dependencies: + at-least-node: registry.npmmirror.com/at-least-node/1.0.0 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + jsonfile: registry.npmmirror.com/jsonfile/6.1.0 + universalify: registry.npmmirror.com/universalify/2.0.0 + dev: true + + registry.npmmirror.com/fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz} + name: fs.realpath + version: 1.0.0 + dev: true + + registry.npmmirror.com/fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz} + name: fsevents + version: 2.3.2 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz} + name: function-bind + version: 1.1.1 + + registry.npmmirror.com/function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz} + name: function.prototype.name + version: 1.1.5 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + define-properties: registry.npmmirror.com/define-properties/1.2.0 + es-abstract: registry.npmmirror.com/es-abstract/1.21.1 + functions-have-names: registry.npmmirror.com/functions-have-names/1.2.3 + dev: true + + registry.npmmirror.com/functions-have-names/1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz} + name: functions-have-names + version: 1.2.3 + dev: true + + registry.npmmirror.com/gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz} + name: gensync + version: 1.0.0-beta.2 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz} + name: get-caller-file + version: 2.0.5 + engines: {node: 6.* || 8.* || >= 10.*} + + registry.npmmirror.com/get-intrinsic/1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz} + name: get-intrinsic + version: 1.2.0 + dependencies: + function-bind: registry.npmmirror.com/function-bind/1.1.1 + has: registry.npmmirror.com/has/1.0.3 + has-symbols: registry.npmmirror.com/has-symbols/1.0.3 + + registry.npmmirror.com/get-own-enumerable-property-symbols/3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz} + name: get-own-enumerable-property-symbols + version: 3.0.2 + dev: true + + registry.npmmirror.com/get-package-type/0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz} + name: get-package-type + version: 0.1.0 + engines: {node: '>=8.0.0'} + dev: true + + registry.npmmirror.com/get-pkg-repo/4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz} + name: get-pkg-repo + version: 4.2.1 + engines: {node: '>=6.9.0'} + hasBin: true + dependencies: + '@hutson/parse-repository-url': registry.npmmirror.com/@hutson/parse-repository-url/3.0.2 + hosted-git-info: registry.npmmirror.com/hosted-git-info/4.1.0 + through2: registry.npmmirror.com/through2/2.0.5 + yargs: registry.npmmirror.com/yargs/16.2.0 + dev: true + + registry.npmmirror.com/get-proxy/2.1.0: + resolution: {integrity: sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-proxy/-/get-proxy-2.1.0.tgz} + name: get-proxy + version: 2.1.0 + engines: {node: '>=4'} + dependencies: + npm-conf: registry.npmmirror.com/npm-conf/1.1.3 + dev: true + + registry.npmmirror.com/get-stdin/4.0.1: + resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-stdin/-/get-stdin-4.0.1.tgz} + name: get-stdin + version: 4.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/get-stream/2.3.1: + resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-2.3.1.tgz} + name: get-stream + version: 2.3.1 + engines: {node: '>=0.10.0'} + dependencies: + object-assign: registry.npmmirror.com/object-assign/4.1.1 + pinkie-promise: registry.npmmirror.com/pinkie-promise/2.0.1 + dev: true + + registry.npmmirror.com/get-stream/3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-3.0.0.tgz} + name: get-stream + version: 3.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/get-stream/4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz} + name: get-stream + version: 4.1.0 + engines: {node: '>=6'} + dependencies: + pump: registry.npmmirror.com/pump/3.0.0 + dev: true + + registry.npmmirror.com/get-stream/5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz} + name: get-stream + version: 5.2.0 + engines: {node: '>=8'} + dependencies: + pump: registry.npmmirror.com/pump/3.0.0 + dev: true + + registry.npmmirror.com/get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz} + name: get-stream + version: 6.0.1 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz} + name: get-symbol-description + version: 1.0.0 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + get-intrinsic: registry.npmmirror.com/get-intrinsic/1.2.0 + dev: true + + registry.npmmirror.com/get-value/2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz} + name: get-value + version: 2.0.6 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/gifsicle/5.2.0: + resolution: {integrity: sha512-vOIS3j0XoTCxq9pkGj43gEix82RkI5FveNgaFZutjbaui/HH+4fR8Y56dwXDuxYo8hR4xOo6/j2h1WHoQW6XLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gifsicle/-/gifsicle-5.2.0.tgz} + name: gifsicle + version: 5.2.0 + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + bin-build: registry.npmmirror.com/bin-build/3.0.0 + bin-wrapper: registry.npmmirror.com/bin-wrapper-china/0.1.0 + execa: registry.npmmirror.com/execa/5.1.1 + logalot: registry.npmmirror.com/logalot/2.1.0 + dev: true + + registry.npmmirror.com/git-raw-commits/2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz} + name: git-raw-commits + version: 2.0.11 + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: registry.npmmirror.com/dargs/7.0.0 + lodash: registry.npmmirror.com/lodash/4.17.21 + meow: registry.npmmirror.com/meow/8.1.2 + split2: registry.npmmirror.com/split2/3.2.2 + through2: registry.npmmirror.com/through2/4.0.2 + dev: true + + registry.npmmirror.com/git-remote-origin-url/2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz} + name: git-remote-origin-url + version: 2.0.0 + engines: {node: '>=4'} + dependencies: + gitconfiglocal: registry.npmmirror.com/gitconfiglocal/1.0.0 + pify: registry.npmmirror.com/pify/2.3.0 + dev: true + + registry.npmmirror.com/git-semver-tags/4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/git-semver-tags/-/git-semver-tags-4.1.1.tgz} + name: git-semver-tags + version: 4.1.1 + engines: {node: '>=10'} + hasBin: true + dependencies: + meow: registry.npmmirror.com/meow/8.1.2 + semver: registry.npmmirror.com/semver/6.3.0 + dev: true + + registry.npmmirror.com/gitconfiglocal/1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz} + name: gitconfiglocal + version: 1.0.0 + dependencies: + ini: registry.npmmirror.com/ini/1.3.8 + dev: true + + registry.npmmirror.com/glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz} + name: glob-parent + version: 5.1.2 + engines: {node: '>= 6'} + dependencies: + is-glob: registry.npmmirror.com/is-glob/4.0.3 + dev: true + + registry.npmmirror.com/glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz} + name: glob-parent + version: 6.0.2 + engines: {node: '>=10.13.0'} + dependencies: + is-glob: registry.npmmirror.com/is-glob/4.0.3 + dev: true + + registry.npmmirror.com/glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz} + name: glob + version: 7.2.3 + dependencies: + fs.realpath: registry.npmmirror.com/fs.realpath/1.0.0 + inflight: registry.npmmirror.com/inflight/1.0.6 + inherits: registry.npmmirror.com/inherits/2.0.4 + minimatch: registry.npmmirror.com/minimatch/3.1.2 + once: registry.npmmirror.com/once/1.4.0 + path-is-absolute: registry.npmmirror.com/path-is-absolute/1.0.1 + dev: true + + registry.npmmirror.com/glob/8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz} + name: glob + version: 8.1.0 + engines: {node: '>=12'} + dependencies: + fs.realpath: registry.npmmirror.com/fs.realpath/1.0.0 + inflight: registry.npmmirror.com/inflight/1.0.6 + inherits: registry.npmmirror.com/inherits/2.0.4 + minimatch: registry.npmmirror.com/minimatch/5.1.6 + once: registry.npmmirror.com/once/1.4.0 + dev: true + + registry.npmmirror.com/global-dirs/0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/global-dirs/-/global-dirs-0.1.1.tgz} + name: global-dirs + version: 0.1.1 + engines: {node: '>=4'} + dependencies: + ini: registry.npmmirror.com/ini/1.3.8 + dev: true + + registry.npmmirror.com/global-modules/1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/global-modules/-/global-modules-1.0.0.tgz} + name: global-modules + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: registry.npmmirror.com/global-prefix/1.0.2 + is-windows: registry.npmmirror.com/is-windows/1.0.2 + resolve-dir: registry.npmmirror.com/resolve-dir/1.0.1 + dev: true + + registry.npmmirror.com/global-modules/2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/global-modules/-/global-modules-2.0.0.tgz} + name: global-modules + version: 2.0.0 + engines: {node: '>=6'} + dependencies: + global-prefix: registry.npmmirror.com/global-prefix/3.0.0 + dev: true + + registry.npmmirror.com/global-prefix/1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/global-prefix/-/global-prefix-1.0.2.tgz} + name: global-prefix + version: 1.0.2 + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: registry.npmmirror.com/expand-tilde/2.0.2 + homedir-polyfill: registry.npmmirror.com/homedir-polyfill/1.0.3 + ini: registry.npmmirror.com/ini/1.3.8 + is-windows: registry.npmmirror.com/is-windows/1.0.2 + which: registry.npmmirror.com/which/1.3.1 + dev: true + + registry.npmmirror.com/global-prefix/3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/global-prefix/-/global-prefix-3.0.0.tgz} + name: global-prefix + version: 3.0.0 + engines: {node: '>=6'} + dependencies: + ini: registry.npmmirror.com/ini/1.3.8 + kind-of: registry.npmmirror.com/kind-of/6.0.3 + which: registry.npmmirror.com/which/1.3.1 + dev: true + + registry.npmmirror.com/globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz} + name: globals + version: 11.12.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/globals/13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz} + name: globals + version: 13.20.0 + engines: {node: '>=8'} + dependencies: + type-fest: registry.npmmirror.com/type-fest/0.20.2 + dev: true + + registry.npmmirror.com/globalthis/1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz} + name: globalthis + version: 1.0.3 + engines: {node: '>= 0.4'} + dependencies: + define-properties: registry.npmmirror.com/define-properties/1.2.0 + dev: true + + registry.npmmirror.com/globby/10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/globby/-/globby-10.0.2.tgz} + name: globby + version: 10.0.2 + engines: {node: '>=8'} + dependencies: + '@types/glob': registry.npmmirror.com/@types/glob/7.2.0 + array-union: registry.npmmirror.com/array-union/2.1.0 + dir-glob: registry.npmmirror.com/dir-glob/3.0.1 + fast-glob: registry.npmmirror.com/fast-glob/3.2.12 + glob: registry.npmmirror.com/glob/7.2.3 + ignore: registry.npmmirror.com/ignore/5.2.4 + merge2: registry.npmmirror.com/merge2/1.4.1 + slash: registry.npmmirror.com/slash/3.0.0 + dev: true + + registry.npmmirror.com/globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz} + name: globby + version: 11.1.0 + engines: {node: '>=10'} + dependencies: + array-union: registry.npmmirror.com/array-union/2.1.0 + dir-glob: registry.npmmirror.com/dir-glob/3.0.1 + fast-glob: registry.npmmirror.com/fast-glob/3.2.12 + ignore: registry.npmmirror.com/ignore/5.2.4 + merge2: registry.npmmirror.com/merge2/1.4.1 + slash: registry.npmmirror.com/slash/3.0.0 + dev: true + + registry.npmmirror.com/globjoin/0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/globjoin/-/globjoin-0.1.4.tgz} + name: globjoin + version: 0.1.4 + dev: true + + registry.npmmirror.com/good-listener/1.2.2: + resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz} + name: good-listener + version: 1.2.2 + dependencies: + delegate: registry.npmmirror.com/delegate/3.2.0 + dev: false + + registry.npmmirror.com/gopd/1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz} + name: gopd + version: 1.0.1 + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic/1.2.0 + dev: true + + registry.npmmirror.com/got/7.1.0: + resolution: {integrity: sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/got/-/got-7.1.0.tgz} + name: got + version: 7.1.0 + engines: {node: '>=4'} + dependencies: + '@types/keyv': registry.npmmirror.com/@types/keyv/3.1.4 + '@types/responselike': registry.npmmirror.com/@types/responselike/1.0.0 + decompress-response: registry.npmmirror.com/decompress-response/3.3.0 + duplexer3: registry.npmmirror.com/duplexer3/0.1.5 + get-stream: registry.npmmirror.com/get-stream/3.0.0 + is-plain-obj: registry.npmmirror.com/is-plain-obj/1.1.0 + is-retry-allowed: registry.npmmirror.com/is-retry-allowed/1.2.0 + is-stream: registry.npmmirror.com/is-stream/1.1.0 + isurl: registry.npmmirror.com/isurl/1.0.0 + lowercase-keys: registry.npmmirror.com/lowercase-keys/1.0.1 + p-cancelable: registry.npmmirror.com/p-cancelable/0.3.0 + p-timeout: registry.npmmirror.com/p-timeout/1.2.1 + safe-buffer: registry.npmmirror.com/safe-buffer/5.2.1 + timed-out: registry.npmmirror.com/timed-out/4.0.1 + url-parse-lax: registry.npmmirror.com/url-parse-lax/1.0.0 + url-to-options: registry.npmmirror.com/url-to-options/1.0.1 + dev: true + + registry.npmmirror.com/got/8.3.2: + resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/got/-/got-8.3.2.tgz} + name: got + version: 8.3.2 + engines: {node: '>=4'} + dependencies: + '@sindresorhus/is': registry.npmmirror.com/@sindresorhus/is/0.7.0 + '@types/keyv': registry.npmmirror.com/@types/keyv/3.1.4 + '@types/responselike': registry.npmmirror.com/@types/responselike/1.0.0 + cacheable-request: registry.npmmirror.com/cacheable-request/2.1.4 + decompress-response: registry.npmmirror.com/decompress-response/3.3.0 + duplexer3: registry.npmmirror.com/duplexer3/0.1.5 + get-stream: registry.npmmirror.com/get-stream/3.0.0 + into-stream: registry.npmmirror.com/into-stream/3.1.0 + is-retry-allowed: registry.npmmirror.com/is-retry-allowed/1.2.0 + isurl: registry.npmmirror.com/isurl/1.0.0 + lowercase-keys: registry.npmmirror.com/lowercase-keys/1.0.1 + mimic-response: registry.npmmirror.com/mimic-response/1.0.1 + p-cancelable: registry.npmmirror.com/p-cancelable/0.4.1 + p-timeout: registry.npmmirror.com/p-timeout/2.0.1 + pify: registry.npmmirror.com/pify/3.0.0 + safe-buffer: registry.npmmirror.com/safe-buffer/5.2.1 + timed-out: registry.npmmirror.com/timed-out/4.0.1 + url-parse-lax: registry.npmmirror.com/url-parse-lax/3.0.0 + url-to-options: registry.npmmirror.com/url-to-options/1.0.1 + dev: true + + registry.npmmirror.com/graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz} + name: graceful-fs + version: 4.2.10 + dev: true + + registry.npmmirror.com/grapheme-splitter/1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz} + name: grapheme-splitter + version: 1.0.4 + dev: true + + registry.npmmirror.com/handlebars/4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/handlebars/-/handlebars-4.7.7.tgz} + name: handlebars + version: 4.7.7 + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: registry.npmmirror.com/minimist/1.2.8 + neo-async: registry.npmmirror.com/neo-async/2.6.2 + source-map: registry.npmmirror.com/source-map/0.6.1 + wordwrap: registry.npmmirror.com/wordwrap/1.0.0 + optionalDependencies: + uglify-js: registry.npmmirror.com/uglify-js/3.17.4 + dev: true + + registry.npmmirror.com/hard-rejection/2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hard-rejection/-/hard-rejection-2.1.0.tgz} + name: hard-rejection + version: 2.1.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/has-ansi/2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz} + name: has-ansi + version: 2.0.0 + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: registry.npmmirror.com/ansi-regex/2.1.1 + dev: true + + registry.npmmirror.com/has-bigints/1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz} + name: has-bigints + version: 1.0.2 + dev: true + + registry.npmmirror.com/has-flag/1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-1.0.0.tgz} + name: has-flag + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz} + name: has-flag + version: 3.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz} + name: has-flag + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz} + name: has-property-descriptors + version: 1.0.0 + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic/1.2.0 + + registry.npmmirror.com/has-proto/1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz} + name: has-proto + version: 1.0.1 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/has-symbol-support-x/1.4.2: + resolution: {integrity: sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz} + name: has-symbol-support-x + version: 1.4.2 + dev: true + + registry.npmmirror.com/has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz} + name: has-symbols + version: 1.0.3 + engines: {node: '>= 0.4'} + + registry.npmmirror.com/has-to-string-tag-x/1.4.1: + resolution: {integrity: sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz} + name: has-to-string-tag-x + version: 1.4.1 + dependencies: + has-symbol-support-x: registry.npmmirror.com/has-symbol-support-x/1.4.2 + dev: true + + registry.npmmirror.com/has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz} + name: has-tostringtag + version: 1.0.0 + engines: {node: '>= 0.4'} + dependencies: + has-symbols: registry.npmmirror.com/has-symbols/1.0.3 + dev: true + + registry.npmmirror.com/has-value/0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz} + name: has-value + version: 0.3.1 + engines: {node: '>=0.10.0'} + dependencies: + get-value: registry.npmmirror.com/get-value/2.0.6 + has-values: registry.npmmirror.com/has-values/0.1.4 + isobject: registry.npmmirror.com/isobject/2.1.0 + dev: true + + registry.npmmirror.com/has-value/1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz} + name: has-value + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + get-value: registry.npmmirror.com/get-value/2.0.6 + has-values: registry.npmmirror.com/has-values/1.0.0 + isobject: registry.npmmirror.com/isobject/3.0.1 + dev: true + + registry.npmmirror.com/has-values/0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz} + name: has-values + version: 0.1.4 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/has-values/1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz} + name: has-values + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + is-number: registry.npmmirror.com/is-number/3.0.0 + kind-of: registry.npmmirror.com/kind-of/4.0.0 + dev: true + + registry.npmmirror.com/has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has/-/has-1.0.3.tgz} + name: has + version: 1.0.3 + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: registry.npmmirror.com/function-bind/1.1.1 + + registry.npmmirror.com/hash-sum/2.0.0: + resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz} + name: hash-sum + version: 2.0.0 + dev: true + + registry.npmmirror.com/he/1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/he/-/he-1.2.0.tgz} + name: he + version: 1.2.0 + hasBin: true + dev: true + + registry.npmmirror.com/header-case/2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/header-case/-/header-case-2.0.4.tgz} + name: header-case + version: 2.0.4 + dependencies: + capital-case: registry.npmmirror.com/capital-case/1.0.4 + tslib: registry.npmmirror.com/tslib/2.5.0 + dev: true + + registry.npmmirror.com/homedir-polyfill/1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz} + name: homedir-polyfill + version: 1.0.3 + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: registry.npmmirror.com/parse-passwd/1.0.0 + dev: true + + registry.npmmirror.com/hosted-git-info/2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz} + name: hosted-git-info + version: 2.8.9 + dev: true + + registry.npmmirror.com/hosted-git-info/4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz} + name: hosted-git-info + version: 4.1.0 + engines: {node: '>=10'} + dependencies: + lru-cache: registry.npmmirror.com/lru-cache/6.0.0 + dev: true + + registry.npmmirror.com/html-encoding-sniffer/2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz} + name: html-encoding-sniffer + version: 2.0.1 + engines: {node: '>=10'} + dependencies: + whatwg-encoding: registry.npmmirror.com/whatwg-encoding/1.0.5 + dev: true + + registry.npmmirror.com/html-encoding-sniffer/3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz} + name: html-encoding-sniffer + version: 3.0.0 + engines: {node: '>=12'} + dependencies: + whatwg-encoding: registry.npmmirror.com/whatwg-encoding/2.0.0 + dev: true + + registry.npmmirror.com/html-escaper/2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz} + name: html-escaper + version: 2.0.2 + dev: true + + registry.npmmirror.com/html-minifier-terser/6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz} + name: html-minifier-terser + version: 6.1.0 + engines: {node: '>=12'} + hasBin: true + dependencies: + camel-case: registry.npmmirror.com/camel-case/4.1.2 + clean-css: registry.npmmirror.com/clean-css/5.3.2 + commander: registry.npmmirror.com/commander/8.3.0 + he: registry.npmmirror.com/he/1.2.0 + param-case: registry.npmmirror.com/param-case/3.0.4 + relateurl: registry.npmmirror.com/relateurl/0.2.7 + terser: registry.npmmirror.com/terser/5.16.5 + dev: true + + registry.npmmirror.com/html-tags/3.2.0: + resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/html-tags/-/html-tags-3.2.0.tgz} + name: html-tags + version: 3.2.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/htmlparser2/3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/htmlparser2/-/htmlparser2-3.10.1.tgz} + name: htmlparser2 + version: 3.10.1 + dependencies: + domelementtype: registry.npmmirror.com/domelementtype/1.3.1 + domhandler: registry.npmmirror.com/domhandler/2.4.2 + domutils: registry.npmmirror.com/domutils/1.7.0 + entities: registry.npmmirror.com/entities/1.1.2 + inherits: registry.npmmirror.com/inherits/2.0.4 + readable-stream: registry.npmmirror.com/readable-stream/3.6.1 + dev: true + + registry.npmmirror.com/htmlparser2/8.0.1: + resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/htmlparser2/-/htmlparser2-8.0.1.tgz} + name: htmlparser2 + version: 8.0.1 + dependencies: + domelementtype: registry.npmmirror.com/domelementtype/2.3.0 + domhandler: registry.npmmirror.com/domhandler/5.0.3 + domutils: registry.npmmirror.com/domutils/3.0.1 + entities: registry.npmmirror.com/entities/4.4.0 + dev: true + + registry.npmmirror.com/http-cache-semantics/3.8.1: + resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz} + name: http-cache-semantics + version: 3.8.1 + dev: true + + registry.npmmirror.com/http-proxy-agent/4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz} + name: http-proxy-agent + version: 4.0.1 + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': registry.npmmirror.com/@tootallnate/once/1.1.2 + agent-base: registry.npmmirror.com/agent-base/6.0.2 + debug: registry.npmmirror.com/debug/4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/http-proxy/1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz} + name: http-proxy + version: 1.18.1 + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: registry.npmmirror.com/eventemitter3/4.0.7 + follow-redirects: registry.npmmirror.com/follow-redirects/1.15.2 + requires-port: registry.npmmirror.com/requires-port/1.0.0 + transitivePeerDependencies: + - debug + dev: true + + registry.npmmirror.com/http-server/14.1.1: + resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/http-server/-/http-server-14.1.1.tgz} + name: http-server + version: 14.1.1 + engines: {node: '>=12'} + hasBin: true + dependencies: + basic-auth: registry.npmmirror.com/basic-auth/2.0.1 + chalk: registry.npmmirror.com/chalk/4.1.2 + corser: registry.npmmirror.com/corser/2.0.1 + he: registry.npmmirror.com/he/1.2.0 + html-encoding-sniffer: registry.npmmirror.com/html-encoding-sniffer/3.0.0 + http-proxy: registry.npmmirror.com/http-proxy/1.18.1 + mime: registry.npmmirror.com/mime/1.6.0 + minimist: registry.npmmirror.com/minimist/1.2.8 + opener: registry.npmmirror.com/opener/1.5.2 + portfinder: registry.npmmirror.com/portfinder/1.0.32 + secure-compare: registry.npmmirror.com/secure-compare/3.0.1 + union: registry.npmmirror.com/union/0.5.0 + url-join: registry.npmmirror.com/url-join/4.0.1 + transitivePeerDependencies: + - debug + - supports-color + dev: true + + registry.npmmirror.com/https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz} + name: https-proxy-agent + version: 5.0.1 + engines: {node: '>= 6'} + dependencies: + agent-base: registry.npmmirror.com/agent-base/6.0.2 + debug: registry.npmmirror.com/debug/4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/human-signals/1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz} + name: human-signals + version: 1.1.1 + engines: {node: '>=8.12.0'} + dev: true + + registry.npmmirror.com/human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz} + name: human-signals + version: 2.1.0 + engines: {node: '>=10.17.0'} + dev: true + + registry.npmmirror.com/husky/7.0.4: + resolution: {integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/husky/-/husky-7.0.4.tgz} + name: husky + version: 7.0.4 + engines: {node: '>=12'} + hasBin: true + dev: true + + registry.npmmirror.com/iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz} + name: iconv-lite + version: 0.4.24 + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: registry.npmmirror.com/safer-buffer/2.1.2 + dev: true + + registry.npmmirror.com/iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz} + name: iconv-lite + version: 0.6.3 + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: registry.npmmirror.com/safer-buffer/2.1.2 + dev: true + + registry.npmmirror.com/idb/7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/idb/-/idb-7.1.1.tgz} + name: idb + version: 7.1.1 + dev: true + + registry.npmmirror.com/ids/1.0.0: + resolution: {integrity: sha512-Zvtq1xUto4LttpstyOlFum8lKx+i1OmRfg+6A9drFS9iSZsDPMHG4Sof/qwNR4kCU7jBeWFPrY2ocHxiz7cCRw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ids/-/ids-1.0.0.tgz} + name: ids + version: 1.0.0 + dev: false + + registry.npmmirror.com/ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz} + name: ieee754 + version: 1.2.1 + dev: true + + registry.npmmirror.com/ignore/5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz} + name: ignore + version: 5.2.4 + engines: {node: '>= 4'} + dev: true + + registry.npmmirror.com/image-size/0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz} + name: image-size + version: 0.5.5 + engines: {node: '>=0.10.0'} + hasBin: true + dev: true + + registry.npmmirror.com/imagemin-gifsicle/7.0.0: + resolution: {integrity: sha512-LaP38xhxAwS3W8PFh4y5iQ6feoTSF+dTAXFRUEYQWYst6Xd+9L/iPk34QGgK/VO/objmIlmq9TStGfVY2IcHIA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/imagemin-gifsicle/-/imagemin-gifsicle-7.0.0.tgz} + name: imagemin-gifsicle + version: 7.0.0 + engines: {node: '>=10'} + dependencies: + execa: registry.npmmirror.com/execa/1.0.0 + gifsicle: registry.npmmirror.com/gifsicle/5.2.0 + is-gif: registry.npmmirror.com/is-gif/3.0.0 + dev: true + + registry.npmmirror.com/imagemin-jpegtran/7.0.0: + resolution: {integrity: sha512-MJoyTCW8YjMJf56NorFE41SR/WkaGA3IYk4JgvMlRwguJEEd3PnP9UxA8Y2UWjquz8d+On3Ds/03ZfiiLS8xTQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/imagemin-jpegtran/-/imagemin-jpegtran-7.0.0.tgz} + name: imagemin-jpegtran + version: 7.0.0 + engines: {node: '>=10'} + dependencies: + exec-buffer: registry.npmmirror.com/exec-buffer/3.2.0 + is-jpg: registry.npmmirror.com/is-jpg/2.0.0 + jpegtran-bin: registry.npmmirror.com/jpegtran-bin/5.0.2 + dev: true + + registry.npmmirror.com/imagemin-mozjpeg/9.0.0: + resolution: {integrity: sha512-TwOjTzYqCFRgROTWpVSt5UTT0JeCuzF1jswPLKALDd89+PmrJ2PdMMYeDLYZ1fs9cTovI9GJd68mRSnuVt691w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/imagemin-mozjpeg/-/imagemin-mozjpeg-9.0.0.tgz} + name: imagemin-mozjpeg + version: 9.0.0 + engines: {node: '>=10'} + dependencies: + execa: registry.npmmirror.com/execa/4.1.0 + is-jpg: registry.npmmirror.com/is-jpg/2.0.0 + mozjpeg: registry.npmmirror.com/mozjpeg/7.1.1 + dev: true + + registry.npmmirror.com/imagemin-optipng/8.0.0: + resolution: {integrity: sha512-CUGfhfwqlPjAC0rm8Fy+R2DJDBGjzy2SkfyT09L8rasnF9jSoHFqJ1xxSZWK6HVPZBMhGPMxCTL70OgTHlLF5A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/imagemin-optipng/-/imagemin-optipng-8.0.0.tgz} + name: imagemin-optipng + version: 8.0.0 + engines: {node: '>=10'} + dependencies: + exec-buffer: registry.npmmirror.com/exec-buffer/3.2.0 + is-png: registry.npmmirror.com/is-png/2.0.0 + optipng-bin: registry.npmmirror.com/optipng-bin/7.0.1 + dev: true + + registry.npmmirror.com/imagemin-pngquant/9.0.2: + resolution: {integrity: sha512-cj//bKo8+Frd/DM8l6Pg9pws1pnDUjgb7ae++sUX1kUVdv2nrngPykhiUOgFeE0LGY/LmUbCf4egCHC4YUcZSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/imagemin-pngquant/-/imagemin-pngquant-9.0.2.tgz} + name: imagemin-pngquant + version: 9.0.2 + engines: {node: '>=10'} + dependencies: + execa: registry.npmmirror.com/execa/4.1.0 + is-png: registry.npmmirror.com/is-png/2.0.0 + is-stream: registry.npmmirror.com/is-stream/2.0.1 + ow: registry.npmmirror.com/ow/0.17.0 + pngquant-bin: registry.npmmirror.com/pngquant-bin/6.0.1 + dev: true + + registry.npmmirror.com/imagemin-svgo/9.0.0: + resolution: {integrity: sha512-uNgXpKHd99C0WODkrJ8OO/3zW3qjgS4pW7hcuII0RcHN3tnKxDjJWcitdVC/TZyfIqSricU8WfrHn26bdSW62g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/imagemin-svgo/-/imagemin-svgo-9.0.0.tgz} + name: imagemin-svgo + version: 9.0.0 + engines: {node: '>=10'} + dependencies: + is-svg: registry.npmmirror.com/is-svg/4.4.0 + svgo: registry.npmmirror.com/svgo/2.8.0 + dev: true + + registry.npmmirror.com/imagemin-webp/6.1.0: + resolution: {integrity: sha512-i8ZluZV1pfQX9aVzmZ/VZh9KBSdPwUlp5VruAa9c30GZnX/nMl5n7h+oUMnI7Mg7+SUpu9mYBsw2nsYGUEllWQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/imagemin-webp/-/imagemin-webp-6.1.0.tgz} + name: imagemin-webp + version: 6.1.0 + engines: {node: '>=10'} + dependencies: + cwebp-bin: registry.npmmirror.com/cwebp-bin/6.1.2 + exec-buffer: registry.npmmirror.com/exec-buffer/3.2.0 + is-cwebp-readable: registry.npmmirror.com/is-cwebp-readable/3.0.0 + dev: true + + registry.npmmirror.com/imagemin/7.0.1: + resolution: {integrity: sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/imagemin/-/imagemin-7.0.1.tgz} + name: imagemin + version: 7.0.1 + engines: {node: '>=8'} + dependencies: + file-type: registry.npmmirror.com/file-type/12.4.2 + globby: registry.npmmirror.com/globby/10.0.2 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + junk: registry.npmmirror.com/junk/3.1.0 + make-dir: registry.npmmirror.com/make-dir/3.1.0 + p-pipe: registry.npmmirror.com/p-pipe/3.1.0 + replace-ext: registry.npmmirror.com/replace-ext/1.0.1 + dev: true + + registry.npmmirror.com/import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz} + name: import-fresh + version: 3.3.0 + engines: {node: '>=6'} + dependencies: + parent-module: registry.npmmirror.com/parent-module/1.0.1 + resolve-from: registry.npmmirror.com/resolve-from/4.0.0 + dev: true + + registry.npmmirror.com/import-lazy/4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/import-lazy/-/import-lazy-4.0.0.tgz} + name: import-lazy + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/import-local/3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz} + name: import-local + version: 3.1.0 + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: registry.npmmirror.com/pkg-dir/4.2.0 + resolve-cwd: registry.npmmirror.com/resolve-cwd/3.0.0 + dev: true + + registry.npmmirror.com/import-meta-resolve/1.1.1: + resolution: {integrity: sha512-JiTuIvVyPaUg11eTrNDx5bgQ/yMKMZffc7YSjvQeSMXy58DO2SQ8BtAf3xteZvmzvjYh14wnqNjL8XVeDy2o9A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-1.1.1.tgz} + name: import-meta-resolve + version: 1.1.1 + dependencies: + builtins: registry.npmmirror.com/builtins/4.1.0 + dev: true + + registry.npmmirror.com/imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz} + name: imurmurhash + version: 0.1.4 + engines: {node: '>=0.8.19'} + dev: true + + registry.npmmirror.com/indent-string/2.1.0: + resolution: {integrity: sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/indent-string/-/indent-string-2.1.0.tgz} + name: indent-string + version: 2.1.0 + engines: {node: '>=0.10.0'} + dependencies: + repeating: registry.npmmirror.com/repeating/2.0.1 + dev: true + + registry.npmmirror.com/indent-string/4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz} + name: indent-string + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz} + name: inflight + version: 1.0.6 + dependencies: + once: registry.npmmirror.com/once/1.4.0 + wrappy: registry.npmmirror.com/wrappy/1.0.2 + dev: true + + registry.npmmirror.com/inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz} + name: inherits + version: 2.0.4 + dev: true + + registry.npmmirror.com/ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz} + name: ini + version: 1.3.8 + dev: true + + registry.npmmirror.com/inquirer/8.2.5: + resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/inquirer/-/inquirer-8.2.5.tgz} + name: inquirer + version: 8.2.5 + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: registry.npmmirror.com/ansi-escapes/4.3.2 + chalk: registry.npmmirror.com/chalk/4.1.2 + cli-cursor: registry.npmmirror.com/cli-cursor/3.1.0 + cli-width: registry.npmmirror.com/cli-width/3.0.0 + external-editor: registry.npmmirror.com/external-editor/3.1.0 + figures: registry.npmmirror.com/figures/3.2.0 + lodash: registry.npmmirror.com/lodash/4.17.21 + mute-stream: registry.npmmirror.com/mute-stream/0.0.8 + ora: registry.npmmirror.com/ora/5.4.1 + run-async: registry.npmmirror.com/run-async/2.4.1 + rxjs: registry.npmmirror.com/rxjs/7.8.0 + string-width: registry.npmmirror.com/string-width/4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi/6.0.1 + through: registry.npmmirror.com/through/2.3.8 + wrap-ansi: registry.npmmirror.com/wrap-ansi/7.0.0 + dev: true + + registry.npmmirror.com/internal-slot/1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz} + name: internal-slot + version: 1.0.5 + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic/1.2.0 + has: registry.npmmirror.com/has/1.0.3 + side-channel: registry.npmmirror.com/side-channel/1.0.4 + dev: true + + registry.npmmirror.com/into-stream/3.1.0: + resolution: {integrity: sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/into-stream/-/into-stream-3.1.0.tgz} + name: into-stream + version: 3.1.0 + engines: {node: '>=4'} + dependencies: + from2: registry.npmmirror.com/from2/2.3.0 + p-is-promise: registry.npmmirror.com/p-is-promise/1.1.0 + dev: true + + registry.npmmirror.com/intro.js/5.1.0: + resolution: {integrity: sha512-zwWl/duTh00eeNcZRU4o4/xxloNYPFKs4n4lMRDNx59jZr+qRI0jSOnzqYMOuVftD4beGrmxBHz4k8qp9/dCMA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/intro.js/-/intro.js-5.1.0.tgz} + name: intro.js + version: 5.1.0 + dev: false + + registry.npmmirror.com/is-accessor-descriptor/0.1.6: + resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz} + name: is-accessor-descriptor + version: 0.1.6 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of/3.2.2 + dev: true + + registry.npmmirror.com/is-accessor-descriptor/1.0.0: + resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz} + name: is-accessor-descriptor + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of/6.0.3 + dev: true + + registry.npmmirror.com/is-array-buffer/3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz} + name: is-array-buffer + version: 3.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + get-intrinsic: registry.npmmirror.com/get-intrinsic/1.2.0 + is-typed-array: registry.npmmirror.com/is-typed-array/1.1.10 + dev: true + + registry.npmmirror.com/is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz} + name: is-arrayish + version: 0.2.1 + dev: true + + registry.npmmirror.com/is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz} + name: is-bigint + version: 1.0.4 + dependencies: + has-bigints: registry.npmmirror.com/has-bigints/1.0.2 + dev: true + + registry.npmmirror.com/is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz} + name: is-binary-path + version: 2.1.0 + engines: {node: '>=8'} + dependencies: + binary-extensions: registry.npmmirror.com/binary-extensions/2.2.0 + dev: true + + registry.npmmirror.com/is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz} + name: is-boolean-object + version: 1.1.2 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + has-tostringtag: registry.npmmirror.com/has-tostringtag/1.0.0 + dev: true + + registry.npmmirror.com/is-buffer/1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz} + name: is-buffer + version: 1.1.6 + + registry.npmmirror.com/is-builtin-module/3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz} + name: is-builtin-module + version: 3.2.1 + engines: {node: '>=6'} + dependencies: + builtin-modules: registry.npmmirror.com/builtin-modules/3.3.0 + dev: true + + registry.npmmirror.com/is-callable/1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz} + name: is-callable + version: 1.2.7 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/is-ci/3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-ci/-/is-ci-3.0.1.tgz} + name: is-ci + version: 3.0.1 + hasBin: true + dependencies: + ci-info: registry.npmmirror.com/ci-info/3.8.0 + dev: true + + registry.npmmirror.com/is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz} + name: is-core-module + version: 2.11.0 + dependencies: + has: registry.npmmirror.com/has/1.0.3 + dev: true + + registry.npmmirror.com/is-cwebp-readable/3.0.0: + resolution: {integrity: sha512-bpELc7/Q1/U5MWHn4NdHI44R3jxk0h9ew9ljzabiRl70/UIjL/ZAqRMb52F5+eke/VC8yTiv4Ewryo1fPWidvA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-cwebp-readable/-/is-cwebp-readable-3.0.0.tgz} + name: is-cwebp-readable + version: 3.0.0 + dependencies: + file-type: registry.npmmirror.com/file-type/10.11.0 + dev: true + + registry.npmmirror.com/is-data-descriptor/0.1.4: + resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz} + name: is-data-descriptor + version: 0.1.4 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of/3.2.2 + dev: true + + registry.npmmirror.com/is-data-descriptor/1.0.0: + resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz} + name: is-data-descriptor + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of/6.0.3 + dev: true + + registry.npmmirror.com/is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz} + name: is-date-object + version: 1.0.5 + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag/1.0.0 + dev: true + + registry.npmmirror.com/is-descriptor/0.1.6: + resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.6.tgz} + name: is-descriptor + version: 0.1.6 + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: registry.npmmirror.com/is-accessor-descriptor/0.1.6 + is-data-descriptor: registry.npmmirror.com/is-data-descriptor/0.1.4 + kind-of: registry.npmmirror.com/kind-of/5.1.0 + dev: true + + registry.npmmirror.com/is-descriptor/1.0.2: + resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.2.tgz} + name: is-descriptor + version: 1.0.2 + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: registry.npmmirror.com/is-accessor-descriptor/1.0.0 + is-data-descriptor: registry.npmmirror.com/is-data-descriptor/1.0.0 + kind-of: registry.npmmirror.com/kind-of/6.0.3 + dev: true + + registry.npmmirror.com/is-docker/2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz} + name: is-docker + version: 2.2.1 + engines: {node: '>=8'} + hasBin: true + dev: true + + registry.npmmirror.com/is-expression/4.0.0: + resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-expression/-/is-expression-4.0.0.tgz} + name: is-expression + version: 4.0.0 + dependencies: + acorn: registry.npmmirror.com/acorn/7.4.1 + object-assign: registry.npmmirror.com/object-assign/4.1.1 + dev: true + + registry.npmmirror.com/is-extendable/0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz} + name: is-extendable + version: 0.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-extendable/1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz} + name: is-extendable + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: registry.npmmirror.com/is-plain-object/2.0.4 + dev: true + + registry.npmmirror.com/is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz} + name: is-extglob + version: 2.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-finite/1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-finite/-/is-finite-1.1.0.tgz} + name: is-finite + version: 1.1.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz} + name: is-fullwidth-code-point + version: 3.0.0 + engines: {node: '>=8'} + + registry.npmmirror.com/is-fullwidth-code-point/4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz} + name: is-fullwidth-code-point + version: 4.0.0 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/is-generator-fn/2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz} + name: is-generator-fn + version: 2.1.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/is-gif/3.0.0: + resolution: {integrity: sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-gif/-/is-gif-3.0.0.tgz} + name: is-gif + version: 3.0.0 + engines: {node: '>=6'} + dependencies: + file-type: registry.npmmirror.com/file-type/10.11.0 + dev: true + + registry.npmmirror.com/is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz} + name: is-glob + version: 4.0.3 + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: registry.npmmirror.com/is-extglob/2.1.1 + dev: true + + registry.npmmirror.com/is-interactive/1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz} + name: is-interactive + version: 1.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/is-jpg/2.0.0: + resolution: {integrity: sha512-ODlO0ruzhkzD3sdynIainVP5eoOFNN85rxA1+cwwnPe4dKyX0r5+hxNO5XpCrxlHcmb9vkOit9mhRD2JVuimHg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-jpg/-/is-jpg-2.0.0.tgz} + name: is-jpg + version: 2.0.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/is-module/1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz} + name: is-module + version: 1.0.0 + dev: true + + registry.npmmirror.com/is-nan/1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-nan/-/is-nan-1.3.2.tgz} + name: is-nan + version: 1.3.2 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + define-properties: registry.npmmirror.com/define-properties/1.2.0 + dev: false + + registry.npmmirror.com/is-natural-number/4.0.1: + resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-natural-number/-/is-natural-number-4.0.1.tgz} + name: is-natural-number + version: 4.0.1 + dev: true + + registry.npmmirror.com/is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz} + name: is-negative-zero + version: 2.0.2 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz} + name: is-number-object + version: 1.0.7 + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag/1.0.0 + dev: true + + registry.npmmirror.com/is-number/3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz} + name: is-number + version: 3.0.0 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of/3.2.2 + dev: true + + registry.npmmirror.com/is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz} + name: is-number + version: 7.0.0 + engines: {node: '>=0.12.0'} + dev: true + + registry.npmmirror.com/is-obj/1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-obj/-/is-obj-1.0.1.tgz} + name: is-obj + version: 1.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-obj/2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz} + name: is-obj + version: 2.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/is-object/1.0.2: + resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-object/-/is-object-1.0.2.tgz} + name: is-object + version: 1.0.2 + dev: true + + registry.npmmirror.com/is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz} + name: is-path-inside + version: 3.0.3 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/is-plain-obj/1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz} + name: is-plain-obj + version: 1.1.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-plain-object/2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz} + name: is-plain-object + version: 2.0.4 + engines: {node: '>=0.10.0'} + dependencies: + isobject: registry.npmmirror.com/isobject/3.0.1 + dev: true + + registry.npmmirror.com/is-plain-object/3.0.1: + resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-plain-object/-/is-plain-object-3.0.1.tgz} + name: is-plain-object + version: 3.0.1 + engines: {node: '>=0.10.0'} + dev: false + + registry.npmmirror.com/is-plain-object/5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz} + name: is-plain-object + version: 5.0.0 + engines: {node: '>=0.10.0'} + + registry.npmmirror.com/is-png/2.0.0: + resolution: {integrity: sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-png/-/is-png-2.0.0.tgz} + name: is-png + version: 2.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/is-potential-custom-element-name/1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz} + name: is-potential-custom-element-name + version: 1.0.1 + dev: true + + registry.npmmirror.com/is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz} + name: is-regex + version: 1.1.4 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + has-tostringtag: registry.npmmirror.com/has-tostringtag/1.0.0 + dev: true + + registry.npmmirror.com/is-regexp/1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-regexp/-/is-regexp-1.0.0.tgz} + name: is-regexp + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-retry-allowed/1.2.0: + resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz} + name: is-retry-allowed + version: 1.2.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz} + name: is-shared-array-buffer + version: 1.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + dev: true + + registry.npmmirror.com/is-stream/1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz} + name: is-stream + version: 1.1.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz} + name: is-stream + version: 2.0.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz} + name: is-string + version: 1.0.7 + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag/1.0.0 + dev: true + + registry.npmmirror.com/is-svg/4.4.0: + resolution: {integrity: sha512-v+AgVwiK5DsGtT9ng+m4mClp6zDAmwrW8nZi6Gg15qzvBnRWWdfWA1TGaXyCDnWq5g5asofIgMVl3PjKxvk1ug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-svg/-/is-svg-4.4.0.tgz} + name: is-svg + version: 4.4.0 + engines: {node: '>=6'} + dependencies: + fast-xml-parser: registry.npmmirror.com/fast-xml-parser/4.1.3 + dev: true + + registry.npmmirror.com/is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz} + name: is-symbol + version: 1.0.4 + engines: {node: '>= 0.4'} + dependencies: + has-symbols: registry.npmmirror.com/has-symbols/1.0.3 + dev: true + + registry.npmmirror.com/is-text-path/1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-text-path/-/is-text-path-1.0.1.tgz} + name: is-text-path + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: registry.npmmirror.com/text-extensions/1.9.0 + dev: true + + registry.npmmirror.com/is-typed-array/1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.10.tgz} + name: is-typed-array + version: 1.1.10 + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: registry.npmmirror.com/available-typed-arrays/1.0.5 + call-bind: registry.npmmirror.com/call-bind/1.0.2 + for-each: registry.npmmirror.com/for-each/0.3.3 + gopd: registry.npmmirror.com/gopd/1.0.1 + has-tostringtag: registry.npmmirror.com/has-tostringtag/1.0.0 + dev: true + + registry.npmmirror.com/is-typedarray/1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz} + name: is-typedarray + version: 1.0.0 + dev: true + + registry.npmmirror.com/is-unicode-supported/0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz} + name: is-unicode-supported + version: 0.1.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/is-utf8/0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-utf8/-/is-utf8-0.2.1.tgz} + name: is-utf8 + version: 0.2.1 + dev: true + + registry.npmmirror.com/is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz} + name: is-weakref + version: 1.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + dev: true + + registry.npmmirror.com/is-what/3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz} + name: is-what + version: 3.14.1 + dev: true + + registry.npmmirror.com/is-windows/1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz} + name: is-windows + version: 1.0.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-wsl/2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz} + name: is-wsl + version: 2.2.0 + engines: {node: '>=8'} + dependencies: + is-docker: registry.npmmirror.com/is-docker/2.2.1 + dev: true + + registry.npmmirror.com/isarray/1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz} + name: isarray + version: 1.0.0 + dev: true + + registry.npmmirror.com/isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz} + name: isexe + version: 2.0.0 + dev: true + + registry.npmmirror.com/isobject/2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz} + name: isobject + version: 2.1.0 + engines: {node: '>=0.10.0'} + dependencies: + isarray: registry.npmmirror.com/isarray/1.0.0 + dev: true + + registry.npmmirror.com/isobject/3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz} + name: isobject + version: 3.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/istanbul-lib-coverage/3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz} + name: istanbul-lib-coverage + version: 3.2.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/istanbul-lib-instrument/5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz} + name: istanbul-lib-instrument + version: 5.2.1 + engines: {node: '>=8'} + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/parser': registry.npmmirror.com/@babel/parser/7.21.2 + '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema/0.1.3 + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage/3.2.0 + semver: registry.npmmirror.com/semver/6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz} + name: istanbul-lib-report + version: 3.0.0 + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage/3.2.0 + make-dir: registry.npmmirror.com/make-dir/3.1.0 + supports-color: registry.npmmirror.com/supports-color/7.2.0 + dev: true + + registry.npmmirror.com/istanbul-lib-source-maps/4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz} + name: istanbul-lib-source-maps + version: 4.0.1 + engines: {node: '>=10'} + dependencies: + debug: registry.npmmirror.com/debug/4.3.4 + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage/3.2.0 + source-map: registry.npmmirror.com/source-map/0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/istanbul-reports/3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz} + name: istanbul-reports + version: 3.1.5 + engines: {node: '>=8'} + dependencies: + html-escaper: registry.npmmirror.com/html-escaper/2.0.2 + istanbul-lib-report: registry.npmmirror.com/istanbul-lib-report/3.0.0 + dev: true + + registry.npmmirror.com/isurl/1.0.0: + resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/isurl/-/isurl-1.0.0.tgz} + name: isurl + version: 1.0.0 + engines: {node: '>= 4'} + dependencies: + has-to-string-tag-x: registry.npmmirror.com/has-to-string-tag-x/1.4.1 + is-object: registry.npmmirror.com/is-object/1.0.2 + dev: true + + registry.npmmirror.com/jake/10.8.5: + resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jake/-/jake-10.8.5.tgz} + name: jake + version: 10.8.5 + engines: {node: '>=10'} + hasBin: true + dependencies: + async: registry.npmmirror.com/async/3.2.4 + chalk: registry.npmmirror.com/chalk/4.1.2 + filelist: registry.npmmirror.com/filelist/1.0.4 + minimatch: registry.npmmirror.com/minimatch/3.1.2 + dev: true + + registry.npmmirror.com/jest-changed-files/27.5.1: + resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz} + name: jest-changed-files + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + execa: registry.npmmirror.com/execa/5.1.1 + throat: registry.npmmirror.com/throat/6.0.2 + dev: true + + registry.npmmirror.com/jest-circus/27.5.1: + resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-circus/-/jest-circus-27.5.1.tgz} + name: jest-circus + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': registry.npmmirror.com/@jest/environment/27.5.1 + '@jest/test-result': registry.npmmirror.com/@jest/test-result/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + chalk: registry.npmmirror.com/chalk/4.1.2 + co: registry.npmmirror.com/co/4.6.0 + dedent: registry.npmmirror.com/dedent/0.7.0 + expect: registry.npmmirror.com/expect/27.5.1 + is-generator-fn: registry.npmmirror.com/is-generator-fn/2.1.0 + jest-each: registry.npmmirror.com/jest-each/27.5.1 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils/27.5.1 + jest-message-util: registry.npmmirror.com/jest-message-util/27.5.1 + jest-runtime: registry.npmmirror.com/jest-runtime/27.5.1 + jest-snapshot: registry.npmmirror.com/jest-snapshot/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + pretty-format: registry.npmmirror.com/pretty-format/27.5.1 + slash: registry.npmmirror.com/slash/3.0.0 + stack-utils: registry.npmmirror.com/stack-utils/2.0.6 + throat: registry.npmmirror.com/throat/6.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/jest-cli/27.5.1_ts-node@10.9.1: + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-cli/-/jest-cli-27.5.1.tgz} + id: registry.npmmirror.com/jest-cli/27.5.1 + name: jest-cli + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': registry.npmmirror.com/@jest/core/27.5.1_ts-node@10.9.1 + '@jest/test-result': registry.npmmirror.com/@jest/test-result/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + chalk: registry.npmmirror.com/chalk/4.1.2 + exit: registry.npmmirror.com/exit/0.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + import-local: registry.npmmirror.com/import-local/3.1.0 + jest-config: registry.npmmirror.com/jest-config/27.5.1_ts-node@10.9.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + jest-validate: registry.npmmirror.com/jest-validate/27.5.1 + prompts: registry.npmmirror.com/prompts/2.4.2 + yargs: registry.npmmirror.com/yargs/16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + registry.npmmirror.com/jest-config/27.5.1_ts-node@10.9.1: + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-config/-/jest-config-27.5.1.tgz} + id: registry.npmmirror.com/jest-config/27.5.1 + name: jest-config + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@jest/test-sequencer': registry.npmmirror.com/@jest/test-sequencer/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + babel-jest: registry.npmmirror.com/babel-jest/27.5.1_@babel+core@7.21.0 + chalk: registry.npmmirror.com/chalk/4.1.2 + ci-info: registry.npmmirror.com/ci-info/3.8.0 + deepmerge: registry.npmmirror.com/deepmerge/4.3.0 + glob: registry.npmmirror.com/glob/7.2.3 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + jest-circus: registry.npmmirror.com/jest-circus/27.5.1 + jest-environment-jsdom: registry.npmmirror.com/jest-environment-jsdom/27.5.1 + jest-environment-node: registry.npmmirror.com/jest-environment-node/27.5.1 + jest-get-type: registry.npmmirror.com/jest-get-type/27.5.1 + jest-jasmine2: registry.npmmirror.com/jest-jasmine2/27.5.1 + jest-regex-util: registry.npmmirror.com/jest-regex-util/27.5.1 + jest-resolve: registry.npmmirror.com/jest-resolve/27.5.1 + jest-runner: registry.npmmirror.com/jest-runner/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + jest-validate: registry.npmmirror.com/jest-validate/27.5.1 + micromatch: registry.npmmirror.com/micromatch/4.0.5 + parse-json: registry.npmmirror.com/parse-json/5.2.0 + pretty-format: registry.npmmirror.com/pretty-format/27.5.1 + slash: registry.npmmirror.com/slash/3.0.0 + strip-json-comments: registry.npmmirror.com/strip-json-comments/3.1.1 + ts-node: registry.npmmirror.com/ts-node/10.9.1_cin3sed6ohfsopbmt6orxeb4o4 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + registry.npmmirror.com/jest-diff/27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-diff/-/jest-diff-27.5.1.tgz} + name: jest-diff + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: registry.npmmirror.com/chalk/4.1.2 + diff-sequences: registry.npmmirror.com/diff-sequences/27.5.1 + jest-get-type: registry.npmmirror.com/jest-get-type/27.5.1 + pretty-format: registry.npmmirror.com/pretty-format/27.5.1 + dev: true + + registry.npmmirror.com/jest-docblock/27.5.1: + resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-docblock/-/jest-docblock-27.5.1.tgz} + name: jest-docblock + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + detect-newline: registry.npmmirror.com/detect-newline/3.1.0 + dev: true + + registry.npmmirror.com/jest-each/27.5.1: + resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-each/-/jest-each-27.5.1.tgz} + name: jest-each + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + chalk: registry.npmmirror.com/chalk/4.1.2 + jest-get-type: registry.npmmirror.com/jest-get-type/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + pretty-format: registry.npmmirror.com/pretty-format/27.5.1 + dev: true + + registry.npmmirror.com/jest-environment-jsdom/27.5.1: + resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz} + name: jest-environment-jsdom + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': registry.npmmirror.com/@jest/environment/27.5.1 + '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + jest-mock: registry.npmmirror.com/jest-mock/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + jsdom: registry.npmmirror.com/jsdom/16.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + registry.npmmirror.com/jest-environment-node/27.5.1: + resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz} + name: jest-environment-node + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': registry.npmmirror.com/@jest/environment/27.5.1 + '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + jest-mock: registry.npmmirror.com/jest-mock/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + dev: true + + registry.npmmirror.com/jest-get-type/27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-get-type/-/jest-get-type-27.5.1.tgz} + name: jest-get-type + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + registry.npmmirror.com/jest-haste-map/27.5.1: + resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz} + name: jest-haste-map + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/graceful-fs': registry.npmmirror.com/@types/graceful-fs/4.1.6 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + anymatch: registry.npmmirror.com/anymatch/3.1.3 + fb-watchman: registry.npmmirror.com/fb-watchman/2.0.2 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + jest-regex-util: registry.npmmirror.com/jest-regex-util/27.5.1 + jest-serializer: registry.npmmirror.com/jest-serializer/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + jest-worker: registry.npmmirror.com/jest-worker/27.5.1 + micromatch: registry.npmmirror.com/micromatch/4.0.5 + walker: registry.npmmirror.com/walker/1.0.8 + optionalDependencies: + fsevents: registry.npmmirror.com/fsevents/2.3.2 + dev: true + + registry.npmmirror.com/jest-jasmine2/27.5.1: + resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz} + name: jest-jasmine2 + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': registry.npmmirror.com/@jest/environment/27.5.1 + '@jest/source-map': registry.npmmirror.com/@jest/source-map/27.5.1 + '@jest/test-result': registry.npmmirror.com/@jest/test-result/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + chalk: registry.npmmirror.com/chalk/4.1.2 + co: registry.npmmirror.com/co/4.6.0 + expect: registry.npmmirror.com/expect/27.5.1 + is-generator-fn: registry.npmmirror.com/is-generator-fn/2.1.0 + jest-each: registry.npmmirror.com/jest-each/27.5.1 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils/27.5.1 + jest-message-util: registry.npmmirror.com/jest-message-util/27.5.1 + jest-runtime: registry.npmmirror.com/jest-runtime/27.5.1 + jest-snapshot: registry.npmmirror.com/jest-snapshot/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + pretty-format: registry.npmmirror.com/pretty-format/27.5.1 + throat: registry.npmmirror.com/throat/6.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/jest-leak-detector/27.5.1: + resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz} + name: jest-leak-detector + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + jest-get-type: registry.npmmirror.com/jest-get-type/27.5.1 + pretty-format: registry.npmmirror.com/pretty-format/27.5.1 + dev: true + + registry.npmmirror.com/jest-matcher-utils/27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz} + name: jest-matcher-utils + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: registry.npmmirror.com/chalk/4.1.2 + jest-diff: registry.npmmirror.com/jest-diff/27.5.1 + jest-get-type: registry.npmmirror.com/jest-get-type/27.5.1 + pretty-format: registry.npmmirror.com/pretty-format/27.5.1 + dev: true + + registry.npmmirror.com/jest-message-util/27.5.1: + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-message-util/-/jest-message-util-27.5.1.tgz} + name: jest-message-util + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/stack-utils': registry.npmmirror.com/@types/stack-utils/2.0.1 + chalk: registry.npmmirror.com/chalk/4.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + micromatch: registry.npmmirror.com/micromatch/4.0.5 + pretty-format: registry.npmmirror.com/pretty-format/27.5.1 + slash: registry.npmmirror.com/slash/3.0.0 + stack-utils: registry.npmmirror.com/stack-utils/2.0.6 + dev: true + + registry.npmmirror.com/jest-mock/27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-mock/-/jest-mock-27.5.1.tgz} + name: jest-mock + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + dev: true + + registry.npmmirror.com/jest-pnp-resolver/1.2.3_jest-resolve@27.5.1: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz} + id: registry.npmmirror.com/jest-pnp-resolver/1.2.3 + name: jest-pnp-resolver + version: 1.2.3 + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: registry.npmmirror.com/jest-resolve/27.5.1 + dev: true + + registry.npmmirror.com/jest-regex-util/27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz} + name: jest-regex-util + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + registry.npmmirror.com/jest-resolve-dependencies/27.5.1: + resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz} + name: jest-resolve-dependencies + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + jest-regex-util: registry.npmmirror.com/jest-regex-util/27.5.1 + jest-snapshot: registry.npmmirror.com/jest-snapshot/27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/jest-resolve/27.5.1: + resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-resolve/-/jest-resolve-27.5.1.tgz} + name: jest-resolve + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + chalk: registry.npmmirror.com/chalk/4.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + jest-haste-map: registry.npmmirror.com/jest-haste-map/27.5.1 + jest-pnp-resolver: registry.npmmirror.com/jest-pnp-resolver/1.2.3_jest-resolve@27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + jest-validate: registry.npmmirror.com/jest-validate/27.5.1 + resolve: registry.npmmirror.com/resolve/1.22.1 + resolve.exports: registry.npmmirror.com/resolve.exports/1.1.1 + slash: registry.npmmirror.com/slash/3.0.0 + dev: true + + registry.npmmirror.com/jest-runner/27.5.1: + resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-runner/-/jest-runner-27.5.1.tgz} + name: jest-runner + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': registry.npmmirror.com/@jest/console/27.5.1 + '@jest/environment': registry.npmmirror.com/@jest/environment/27.5.1 + '@jest/test-result': registry.npmmirror.com/@jest/test-result/27.5.1 + '@jest/transform': registry.npmmirror.com/@jest/transform/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + chalk: registry.npmmirror.com/chalk/4.1.2 + emittery: registry.npmmirror.com/emittery/0.8.1 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + jest-docblock: registry.npmmirror.com/jest-docblock/27.5.1 + jest-environment-jsdom: registry.npmmirror.com/jest-environment-jsdom/27.5.1 + jest-environment-node: registry.npmmirror.com/jest-environment-node/27.5.1 + jest-haste-map: registry.npmmirror.com/jest-haste-map/27.5.1 + jest-leak-detector: registry.npmmirror.com/jest-leak-detector/27.5.1 + jest-message-util: registry.npmmirror.com/jest-message-util/27.5.1 + jest-resolve: registry.npmmirror.com/jest-resolve/27.5.1 + jest-runtime: registry.npmmirror.com/jest-runtime/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + jest-worker: registry.npmmirror.com/jest-worker/27.5.1 + source-map-support: registry.npmmirror.com/source-map-support/0.5.21 + throat: registry.npmmirror.com/throat/6.0.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + registry.npmmirror.com/jest-runtime/27.5.1: + resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-runtime/-/jest-runtime-27.5.1.tgz} + name: jest-runtime + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': registry.npmmirror.com/@jest/environment/27.5.1 + '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers/27.5.1 + '@jest/globals': registry.npmmirror.com/@jest/globals/27.5.1 + '@jest/source-map': registry.npmmirror.com/@jest/source-map/27.5.1 + '@jest/test-result': registry.npmmirror.com/@jest/test-result/27.5.1 + '@jest/transform': registry.npmmirror.com/@jest/transform/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + chalk: registry.npmmirror.com/chalk/4.1.2 + cjs-module-lexer: registry.npmmirror.com/cjs-module-lexer/1.2.2 + collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage/1.0.1 + execa: registry.npmmirror.com/execa/5.1.1 + glob: registry.npmmirror.com/glob/7.2.3 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + jest-haste-map: registry.npmmirror.com/jest-haste-map/27.5.1 + jest-message-util: registry.npmmirror.com/jest-message-util/27.5.1 + jest-mock: registry.npmmirror.com/jest-mock/27.5.1 + jest-regex-util: registry.npmmirror.com/jest-regex-util/27.5.1 + jest-resolve: registry.npmmirror.com/jest-resolve/27.5.1 + jest-snapshot: registry.npmmirror.com/jest-snapshot/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + slash: registry.npmmirror.com/slash/3.0.0 + strip-bom: registry.npmmirror.com/strip-bom/4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/jest-serializer/27.5.1: + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-serializer/-/jest-serializer-27.5.1.tgz} + name: jest-serializer + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + dev: true + + registry.npmmirror.com/jest-snapshot/27.5.1: + resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz} + name: jest-snapshot + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/generator': registry.npmmirror.com/@babel/generator/7.21.1 + '@babel/plugin-syntax-typescript': registry.npmmirror.com/@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.21.0 + '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.21.2 + '@babel/types': registry.npmmirror.com/@babel/types/7.21.2 + '@jest/transform': registry.npmmirror.com/@jest/transform/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/babel__traverse': registry.npmmirror.com/@types/babel__traverse/7.18.3 + '@types/prettier': registry.npmmirror.com/@types/prettier/2.7.2 + babel-preset-current-node-syntax: registry.npmmirror.com/babel-preset-current-node-syntax/1.0.1_@babel+core@7.21.0 + chalk: registry.npmmirror.com/chalk/4.1.2 + expect: registry.npmmirror.com/expect/27.5.1 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + jest-diff: registry.npmmirror.com/jest-diff/27.5.1 + jest-get-type: registry.npmmirror.com/jest-get-type/27.5.1 + jest-haste-map: registry.npmmirror.com/jest-haste-map/27.5.1 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils/27.5.1 + jest-message-util: registry.npmmirror.com/jest-message-util/27.5.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + natural-compare: registry.npmmirror.com/natural-compare/1.4.0 + pretty-format: registry.npmmirror.com/pretty-format/27.5.1 + semver: registry.npmmirror.com/semver/7.3.8 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/jest-util/27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-util/-/jest-util-27.5.1.tgz} + name: jest-util + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + chalk: registry.npmmirror.com/chalk/4.1.2 + ci-info: registry.npmmirror.com/ci-info/3.8.0 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + picomatch: registry.npmmirror.com/picomatch/2.3.1 + dev: true + + registry.npmmirror.com/jest-validate/27.5.1: + resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-validate/-/jest-validate-27.5.1.tgz} + name: jest-validate + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + camelcase: registry.npmmirror.com/camelcase/6.3.0 + chalk: registry.npmmirror.com/chalk/4.1.2 + jest-get-type: registry.npmmirror.com/jest-get-type/27.5.1 + leven: registry.npmmirror.com/leven/3.1.0 + pretty-format: registry.npmmirror.com/pretty-format/27.5.1 + dev: true + + registry.npmmirror.com/jest-watcher/27.5.1: + resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-watcher/-/jest-watcher-27.5.1.tgz} + name: jest-watcher + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': registry.npmmirror.com/@jest/test-result/27.5.1 + '@jest/types': registry.npmmirror.com/@jest/types/27.5.1 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + ansi-escapes: registry.npmmirror.com/ansi-escapes/4.3.2 + chalk: registry.npmmirror.com/chalk/4.1.2 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + string-length: registry.npmmirror.com/string-length/4.0.2 + dev: true + + registry.npmmirror.com/jest-worker/26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-worker/-/jest-worker-26.6.2.tgz} + name: jest-worker + version: 26.6.2 + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + merge-stream: registry.npmmirror.com/merge-stream/2.0.0 + supports-color: registry.npmmirror.com/supports-color/7.2.0 + dev: true + + registry.npmmirror.com/jest-worker/27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz} + name: jest-worker + version: 27.5.1 + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + merge-stream: registry.npmmirror.com/merge-stream/2.0.0 + supports-color: registry.npmmirror.com/supports-color/8.1.1 + dev: true + + registry.npmmirror.com/jest/27.5.1_ts-node@10.9.1: + resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jest/-/jest-27.5.1.tgz} + id: registry.npmmirror.com/jest/27.5.1 + name: jest + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': registry.npmmirror.com/@jest/core/27.5.1_ts-node@10.9.1 + import-local: registry.npmmirror.com/import-local/3.1.0 + jest-cli: registry.npmmirror.com/jest-cli/27.5.1_ts-node@10.9.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + registry.npmmirror.com/jiti/1.17.1: + resolution: {integrity: sha512-NZIITw8uZQFuzQimqjUxIrIcEdxYDFIe/0xYfIlVXTkiBjjyBEvgasj5bb0/cHtPRD/NziPbT312sFrkI5ALpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jiti/-/jiti-1.17.1.tgz} + name: jiti + version: 1.17.1 + hasBin: true + dev: true + + registry.npmmirror.com/jpegtran-bin/5.0.2: + resolution: {integrity: sha512-4FSmgIcr8d5+V6T1+dHbPZjaFH0ogVyP4UVsE+zri7S9YLO4qAT2our4IN3sW3STVgNTbqPermdIgt2XuAJ4EA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jpegtran-bin/-/jpegtran-bin-5.0.2.tgz} + name: jpegtran-bin + version: 5.0.2 + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + bin-build: registry.npmmirror.com/bin-build/3.0.0 + bin-wrapper: registry.npmmirror.com/bin-wrapper-china/0.1.0 + logalot: registry.npmmirror.com/logalot/2.1.0 + dev: true + + registry.npmmirror.com/jpegtran-bin/6.0.1: + resolution: {integrity: sha512-WohhhHhqe22de7PU8hXs6Sr5d4BAvkrfA93NR5tGlHyPnFLgvEW/bH+q7fv65JgoiQDsd7SBwwQ/OGRBivU3Mw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jpegtran-bin/-/jpegtran-bin-6.0.1.tgz} + name: jpegtran-bin + version: 6.0.1 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + requiresBuild: true + dependencies: + bin-build: registry.npmmirror.com/bin-build/3.0.0 + bin-wrapper: registry.npmmirror.com/bin-wrapper-china/0.1.0 + dev: true + + registry.npmmirror.com/js-base64/2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz} + name: js-base64 + version: 2.6.4 + dev: true + + registry.npmmirror.com/js-beautify/1.14.6: + resolution: {integrity: sha512-GfofQY5zDp+cuHc+gsEXKPpNw2KbPddreEo35O6jT6i0RVK6LhsoYBhq5TvK4/n74wnA0QbK8gGd+jUZwTMKJw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-beautify/-/js-beautify-1.14.6.tgz} + name: js-beautify + version: 1.14.6 + engines: {node: '>=10'} + hasBin: true + dependencies: + config-chain: registry.npmmirror.com/config-chain/1.1.13 + editorconfig: registry.npmmirror.com/editorconfig/0.15.3 + glob: registry.npmmirror.com/glob/8.1.0 + nopt: registry.npmmirror.com/nopt/6.0.0 + dev: true + + registry.npmmirror.com/js-sdsl/4.3.0: + resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.3.0.tgz} + name: js-sdsl + version: 4.3.0 + dev: true + + registry.npmmirror.com/js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz} + name: js-tokens + version: 4.0.0 + + registry.npmmirror.com/js-tokens/8.0.1: + resolution: {integrity: sha512-3AGrZT6tuMm1ZWWn9mLXh7XMfi2YtiLNPALCVxBCiUVq0LD1OQMxV/AdS/s7rLJU5o9i/jBZw/N4vXXL5dm29A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-tokens/-/js-tokens-8.0.1.tgz} + name: js-tokens + version: 8.0.1 + dev: true + + registry.npmmirror.com/js-yaml/3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz} + name: js-yaml + version: 3.14.1 + hasBin: true + dependencies: + argparse: registry.npmmirror.com/argparse/1.0.10 + esprima: registry.npmmirror.com/esprima/4.0.1 + dev: true + + registry.npmmirror.com/js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz} + name: js-yaml + version: 4.1.0 + hasBin: true + dependencies: + argparse: registry.npmmirror.com/argparse/2.0.1 + dev: true + + registry.npmmirror.com/jsdom/16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsdom/-/jsdom-16.7.0.tgz} + name: jsdom + version: 16.7.0 + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: registry.npmmirror.com/abab/2.0.6 + acorn: registry.npmmirror.com/acorn/8.8.2 + acorn-globals: registry.npmmirror.com/acorn-globals/6.0.0 + cssom: registry.npmmirror.com/cssom/0.4.4 + cssstyle: registry.npmmirror.com/cssstyle/2.3.0 + data-urls: registry.npmmirror.com/data-urls/2.0.0 + decimal.js: registry.npmmirror.com/decimal.js/10.4.3 + domexception: registry.npmmirror.com/domexception/2.0.1 + escodegen: registry.npmmirror.com/escodegen/2.0.0 + form-data: registry.npmmirror.com/form-data/3.0.1 + html-encoding-sniffer: registry.npmmirror.com/html-encoding-sniffer/2.0.1 + http-proxy-agent: registry.npmmirror.com/http-proxy-agent/4.0.1 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent/5.0.1 + is-potential-custom-element-name: registry.npmmirror.com/is-potential-custom-element-name/1.0.1 + nwsapi: registry.npmmirror.com/nwsapi/2.2.2 + parse5: registry.npmmirror.com/parse5/6.0.1 + saxes: registry.npmmirror.com/saxes/5.0.1 + symbol-tree: registry.npmmirror.com/symbol-tree/3.2.4 + tough-cookie: registry.npmmirror.com/tough-cookie/4.1.2 + w3c-hr-time: registry.npmmirror.com/w3c-hr-time/1.0.2 + w3c-xmlserializer: registry.npmmirror.com/w3c-xmlserializer/2.0.0 + webidl-conversions: registry.npmmirror.com/webidl-conversions/6.1.0 + whatwg-encoding: registry.npmmirror.com/whatwg-encoding/1.0.5 + whatwg-mimetype: registry.npmmirror.com/whatwg-mimetype/2.3.0 + whatwg-url: registry.npmmirror.com/whatwg-url/8.7.0 + ws: registry.npmmirror.com/ws/7.5.9 + xml-name-validator: registry.npmmirror.com/xml-name-validator/3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + registry.npmmirror.com/jsesc/0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz} + name: jsesc + version: 0.5.0 + hasBin: true + dev: true + + registry.npmmirror.com/jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz} + name: jsesc + version: 2.5.2 + engines: {node: '>=4'} + hasBin: true + dev: true + + registry.npmmirror.com/json-buffer/3.0.0: + resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.0.tgz} + name: json-buffer + version: 3.0.0 + dev: true + + registry.npmmirror.com/json-parse-better-errors/1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz} + name: json-parse-better-errors + version: 1.0.2 + dev: true + + registry.npmmirror.com/json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz} + name: json-parse-even-better-errors + version: 2.3.1 + dev: true + + registry.npmmirror.com/json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz} + name: json-schema-traverse + version: 0.4.1 + dev: true + + registry.npmmirror.com/json-schema-traverse/1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz} + name: json-schema-traverse + version: 1.0.0 + dev: true + + registry.npmmirror.com/json-schema/0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz} + name: json-schema + version: 0.4.0 + dev: true + + registry.npmmirror.com/json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz} + name: json-stable-stringify-without-jsonify + version: 1.0.1 + dev: true + + registry.npmmirror.com/json-stringify-safe/5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz} + name: json-stringify-safe + version: 5.0.1 + dev: true + + registry.npmmirror.com/json5/1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz} + name: json5 + version: 1.0.2 + hasBin: true + dependencies: + minimist: registry.npmmirror.com/minimist/1.2.8 + dev: true + + registry.npmmirror.com/json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz} + name: json5 + version: 2.2.3 + engines: {node: '>=6'} + hasBin: true + dev: true + + registry.npmmirror.com/jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz} + name: jsonfile + version: 6.1.0 + dependencies: + universalify: registry.npmmirror.com/universalify/2.0.0 + optionalDependencies: + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + dev: true + + registry.npmmirror.com/jsonparse/1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz} + name: jsonparse + version: 1.3.1 + engines: {'0': node >= 0.2.0} + dev: true + + registry.npmmirror.com/jsonpointer/5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsonpointer/-/jsonpointer-5.0.1.tgz} + name: jsonpointer + version: 5.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/junk/3.1.0: + resolution: {integrity: sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/junk/-/junk-3.1.0.tgz} + name: junk + version: 3.1.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/keyv/3.0.0: + resolution: {integrity: sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/keyv/-/keyv-3.0.0.tgz} + name: keyv + version: 3.0.0 + dependencies: + json-buffer: registry.npmmirror.com/json-buffer/3.0.0 + dev: true + + registry.npmmirror.com/kind-of/3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz} + name: kind-of + version: 3.2.2 + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: registry.npmmirror.com/is-buffer/1.1.6 + dev: true + + registry.npmmirror.com/kind-of/4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz} + name: kind-of + version: 4.0.0 + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: registry.npmmirror.com/is-buffer/1.1.6 + dev: true + + registry.npmmirror.com/kind-of/5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/kind-of/-/kind-of-5.1.0.tgz} + name: kind-of + version: 5.1.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz} + name: kind-of + version: 6.0.3 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/kleur/3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz} + name: kleur + version: 3.0.3 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/known-css-properties/0.26.0: + resolution: {integrity: sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/known-css-properties/-/known-css-properties-0.26.0.tgz} + name: known-css-properties + version: 0.26.0 + dev: true + + registry.npmmirror.com/kolorist/1.7.0: + resolution: {integrity: sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/kolorist/-/kolorist-1.7.0.tgz} + name: kolorist + version: 1.7.0 + dev: true + + registry.npmmirror.com/less/4.1.3: + resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/less/-/less-4.1.3.tgz} + name: less + version: 4.1.3 + engines: {node: '>=6'} + hasBin: true + dependencies: + copy-anything: registry.npmmirror.com/copy-anything/2.0.6 + parse-node-version: registry.npmmirror.com/parse-node-version/1.0.1 + tslib: registry.npmmirror.com/tslib/2.5.0 + optionalDependencies: + errno: registry.npmmirror.com/errno/0.1.8 + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + image-size: registry.npmmirror.com/image-size/0.5.5 + make-dir: registry.npmmirror.com/make-dir/2.1.0 + mime: registry.npmmirror.com/mime/1.6.0 + needle: registry.npmmirror.com/needle/3.2.0 + source-map: registry.npmmirror.com/source-map/0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/leven/3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz} + name: leven + version: 3.1.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/levn/0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz} + name: levn + version: 0.3.0 + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: registry.npmmirror.com/prelude-ls/1.1.2 + type-check: registry.npmmirror.com/type-check/0.3.2 + dev: true + + registry.npmmirror.com/levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz} + name: levn + version: 0.4.1 + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: registry.npmmirror.com/prelude-ls/1.2.1 + type-check: registry.npmmirror.com/type-check/0.4.0 + dev: true + + registry.npmmirror.com/lilconfig/2.0.4: + resolution: {integrity: sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lilconfig/-/lilconfig-2.0.4.tgz} + name: lilconfig + version: 2.0.4 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz} + name: lines-and-columns + version: 1.2.4 + dev: true + + registry.npmmirror.com/lint-staged/12.3.7: + resolution: {integrity: sha512-/S4D726e2GIsDVWIk1XGvheCaDm1SJRQp8efamZFWJxQMVEbOwSysp7xb49Oo73KYCdy97mIWinhlxcoNqIfIQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lint-staged/-/lint-staged-12.3.7.tgz} + name: lint-staged + version: 12.3.7 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + cli-truncate: registry.npmmirror.com/cli-truncate/3.1.0 + colorette: registry.npmmirror.com/colorette/2.0.19 + commander: registry.npmmirror.com/commander/8.3.0 + debug: registry.npmmirror.com/debug/4.3.4_supports-color@9.3.1 + execa: registry.npmmirror.com/execa/5.1.1 + lilconfig: registry.npmmirror.com/lilconfig/2.0.4 + listr2: registry.npmmirror.com/listr2/4.0.5 + micromatch: registry.npmmirror.com/micromatch/4.0.5 + normalize-path: registry.npmmirror.com/normalize-path/3.0.0 + object-inspect: registry.npmmirror.com/object-inspect/1.12.3 + pidtree: registry.npmmirror.com/pidtree/0.5.0 + string-argv: registry.npmmirror.com/string-argv/0.3.1 + supports-color: registry.npmmirror.com/supports-color/9.3.1 + yaml: registry.npmmirror.com/yaml/1.10.2 + transitivePeerDependencies: + - enquirer + dev: true + + registry.npmmirror.com/listr2/4.0.5: + resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/listr2/-/listr2-4.0.5.tgz} + name: listr2 + version: 4.0.5 + engines: {node: '>=12'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: registry.npmmirror.com/cli-truncate/2.1.0 + colorette: registry.npmmirror.com/colorette/2.0.19 + log-update: registry.npmmirror.com/log-update/4.0.0 + p-map: registry.npmmirror.com/p-map/4.0.0 + rfdc: registry.npmmirror.com/rfdc/1.3.0 + rxjs: registry.npmmirror.com/rxjs/7.8.0 + through: registry.npmmirror.com/through/2.3.8 + wrap-ansi: registry.npmmirror.com/wrap-ansi/7.0.0 + dev: true + + registry.npmmirror.com/load-json-file/1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/load-json-file/-/load-json-file-1.1.0.tgz} + name: load-json-file + version: 1.1.0 + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + parse-json: registry.npmmirror.com/parse-json/2.2.0 + pify: registry.npmmirror.com/pify/2.3.0 + pinkie-promise: registry.npmmirror.com/pinkie-promise/2.0.1 + strip-bom: registry.npmmirror.com/strip-bom/2.0.0 + dev: true + + registry.npmmirror.com/load-json-file/4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/load-json-file/-/load-json-file-4.0.0.tgz} + name: load-json-file + version: 4.0.0 + engines: {node: '>=4'} + dependencies: + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + parse-json: registry.npmmirror.com/parse-json/4.0.0 + pify: registry.npmmirror.com/pify/3.0.0 + strip-bom: registry.npmmirror.com/strip-bom/3.0.0 + dev: true + + registry.npmmirror.com/loader-utils/1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz} + name: loader-utils + version: 1.4.2 + engines: {node: '>=4.0.0'} + dependencies: + big.js: registry.npmmirror.com/big.js/5.2.2 + emojis-list: registry.npmmirror.com/emojis-list/3.0.0 + json5: registry.npmmirror.com/json5/1.0.2 + dev: true + + registry.npmmirror.com/locate-path/2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-2.0.0.tgz} + name: locate-path + version: 2.0.0 + engines: {node: '>=4'} + dependencies: + p-locate: registry.npmmirror.com/p-locate/2.0.0 + path-exists: registry.npmmirror.com/path-exists/3.0.0 + dev: true + + registry.npmmirror.com/locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz} + name: locate-path + version: 5.0.0 + engines: {node: '>=8'} + dependencies: + p-locate: registry.npmmirror.com/p-locate/4.1.0 + + registry.npmmirror.com/locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz} + name: locate-path + version: 6.0.0 + engines: {node: '>=10'} + dependencies: + p-locate: registry.npmmirror.com/p-locate/5.0.0 + dev: true + + registry.npmmirror.com/lodash-es/4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz} + name: lodash-es + version: 4.17.21 + dev: false + + registry.npmmirror.com/lodash.debounce/4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz} + name: lodash.debounce + version: 4.0.8 + dev: true + + registry.npmmirror.com/lodash.get/4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.get/-/lodash.get-4.4.2.tgz} + name: lodash.get + version: 4.4.2 + dev: false + + registry.npmmirror.com/lodash.ismatch/4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz} + name: lodash.ismatch + version: 4.4.0 + dev: true + + registry.npmmirror.com/lodash.isplainobject/4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz} + name: lodash.isplainobject + version: 4.0.6 + dev: true + optional: true + + registry.npmmirror.com/lodash.map/4.6.0: + resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.map/-/lodash.map-4.6.0.tgz} + name: lodash.map + version: 4.6.0 + dev: true + + registry.npmmirror.com/lodash.memoize/4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz} + name: lodash.memoize + version: 4.1.2 + dev: true + + registry.npmmirror.com/lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz} + name: lodash.merge + version: 4.6.2 + dev: true + + registry.npmmirror.com/lodash.mergewith/4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz} + name: lodash.mergewith + version: 4.6.2 + dev: true + optional: true + + registry.npmmirror.com/lodash.sortby/4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz} + name: lodash.sortby + version: 4.7.0 + dev: true + + registry.npmmirror.com/lodash.truncate/4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz} + name: lodash.truncate + version: 4.4.2 + dev: true + + registry.npmmirror.com/lodash.uniq/4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz} + name: lodash.uniq + version: 4.5.0 + dev: true + optional: true + + registry.npmmirror.com/lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz} + name: lodash + version: 4.17.21 + + registry.npmmirror.com/log-symbols/4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz} + name: log-symbols + version: 4.1.0 + engines: {node: '>=10'} + dependencies: + chalk: registry.npmmirror.com/chalk/4.1.2 + is-unicode-supported: registry.npmmirror.com/is-unicode-supported/0.1.0 + dev: true + + registry.npmmirror.com/log-update/4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/log-update/-/log-update-4.0.0.tgz} + name: log-update + version: 4.0.0 + engines: {node: '>=10'} + dependencies: + ansi-escapes: registry.npmmirror.com/ansi-escapes/4.3.2 + cli-cursor: registry.npmmirror.com/cli-cursor/3.1.0 + slice-ansi: registry.npmmirror.com/slice-ansi/4.0.0 + wrap-ansi: registry.npmmirror.com/wrap-ansi/6.2.0 + dev: true + + registry.npmmirror.com/logalot/2.1.0: + resolution: {integrity: sha512-Ah4CgdSRfeCJagxQhcVNMi9BfGYyEKLa6d7OA6xSbld/Hg3Cf2QiOa1mDpmG7Ve8LOH6DN3mdttzjQAvWTyVkw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/logalot/-/logalot-2.1.0.tgz} + name: logalot + version: 2.1.0 + engines: {node: '>=0.10.0'} + dependencies: + figures: registry.npmmirror.com/figures/1.7.0 + squeak: registry.npmmirror.com/squeak/1.3.0 + dev: true + + registry.npmmirror.com/longest/1.0.1: + resolution: {integrity: sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/longest/-/longest-1.0.1.tgz} + name: longest + version: 1.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/longest/2.0.1: + resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/longest/-/longest-2.0.1.tgz} + name: longest + version: 2.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz} + name: loose-envify + version: 1.4.0 + hasBin: true + dependencies: + js-tokens: registry.npmmirror.com/js-tokens/4.0.0 + dev: false + + registry.npmmirror.com/loud-rejection/1.6.0: + resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/loud-rejection/-/loud-rejection-1.6.0.tgz} + name: loud-rejection + version: 1.6.0 + engines: {node: '>=0.10.0'} + dependencies: + currently-unhandled: registry.npmmirror.com/currently-unhandled/0.4.1 + signal-exit: registry.npmmirror.com/signal-exit/3.0.7 + dev: true + + registry.npmmirror.com/lower-case/2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz} + name: lower-case + version: 2.0.2 + dependencies: + tslib: registry.npmmirror.com/tslib/2.5.0 + dev: true + + registry.npmmirror.com/lowercase-keys/1.0.0: + resolution: {integrity: sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz} + name: lowercase-keys + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/lowercase-keys/1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz} + name: lowercase-keys + version: 1.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/lpad-align/1.1.2: + resolution: {integrity: sha512-MMIcFmmR9zlGZtBcFOows6c2COMekHCIFJz3ew/rRpKZ1wR4mXDPzvcVqLarux8M33X4TPSq2Jdw8WJj0q0KbQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lpad-align/-/lpad-align-1.1.2.tgz} + name: lpad-align + version: 1.1.2 + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + get-stdin: registry.npmmirror.com/get-stdin/4.0.1 + indent-string: registry.npmmirror.com/indent-string/2.1.0 + longest: registry.npmmirror.com/longest/1.0.1 + meow: registry.npmmirror.com/meow/3.7.0 + dev: true + + registry.npmmirror.com/lru-cache/4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz} + name: lru-cache + version: 4.1.5 + dependencies: + pseudomap: registry.npmmirror.com/pseudomap/1.0.2 + yallist: registry.npmmirror.com/yallist/2.1.2 + dev: true + + registry.npmmirror.com/lru-cache/5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz} + name: lru-cache + version: 5.1.1 + dependencies: + yallist: registry.npmmirror.com/yallist/3.1.1 + dev: true + + registry.npmmirror.com/lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz} + name: lru-cache + version: 6.0.0 + engines: {node: '>=10'} + dependencies: + yallist: registry.npmmirror.com/yallist/4.0.0 + dev: true + + registry.npmmirror.com/luxon/1.28.1: + resolution: {integrity: sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/luxon/-/luxon-1.28.1.tgz} + name: luxon + version: 1.28.1 + dev: false + + registry.npmmirror.com/magic-string/0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz} + name: magic-string + version: 0.25.9 + dependencies: + sourcemap-codec: registry.npmmirror.com/sourcemap-codec/1.4.8 + + registry.npmmirror.com/magic-string/0.26.7: + resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/magic-string/-/magic-string-0.26.7.tgz} + name: magic-string + version: 0.26.7 + engines: {node: '>=12'} + dependencies: + sourcemap-codec: registry.npmmirror.com/sourcemap-codec/1.4.8 + dev: true + + registry.npmmirror.com/magic-string/0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/magic-string/-/magic-string-0.27.0.tgz} + name: magic-string + version: 0.27.0 + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14 + dev: true + + registry.npmmirror.com/make-dir/1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/make-dir/-/make-dir-1.3.0.tgz} + name: make-dir + version: 1.3.0 + engines: {node: '>=4'} + dependencies: + pify: registry.npmmirror.com/pify/3.0.0 + dev: true + + registry.npmmirror.com/make-dir/2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz} + name: make-dir + version: 2.1.0 + engines: {node: '>=6'} + requiresBuild: true + dependencies: + pify: registry.npmmirror.com/pify/4.0.1 + semver: registry.npmmirror.com/semver/5.7.1 + dev: true + optional: true + + registry.npmmirror.com/make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz} + name: make-dir + version: 3.1.0 + engines: {node: '>=8'} + dependencies: + semver: registry.npmmirror.com/semver/6.3.0 + dev: true + + registry.npmmirror.com/make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz} + name: make-error + version: 1.3.6 + dev: true + + registry.npmmirror.com/makeerror/1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz} + name: makeerror + version: 1.0.12 + dependencies: + tmpl: registry.npmmirror.com/tmpl/1.0.5 + dev: true + + registry.npmmirror.com/map-cache/0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz} + name: map-cache + version: 0.2.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/map-obj/1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/map-obj/-/map-obj-1.0.1.tgz} + name: map-obj + version: 1.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/map-obj/4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/map-obj/-/map-obj-4.3.0.tgz} + name: map-obj + version: 4.3.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/map-visit/1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz} + name: map-visit + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + object-visit: registry.npmmirror.com/object-visit/1.0.1 + dev: true + + registry.npmmirror.com/mathml-tag-names/2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz} + name: mathml-tag-names + version: 2.1.3 + dev: true + + registry.npmmirror.com/md5/2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz} + name: md5 + version: 2.3.0 + dependencies: + charenc: registry.npmmirror.com/charenc/0.0.2 + crypt: registry.npmmirror.com/crypt/0.0.2 + is-buffer: registry.npmmirror.com/is-buffer/1.1.6 + dev: false + + registry.npmmirror.com/mdn-data/2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz} + name: mdn-data + version: 2.0.14 + dev: true + + registry.npmmirror.com/memorystream/0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz} + name: memorystream + version: 0.3.1 + engines: {node: '>= 0.10.0'} + dev: true + + registry.npmmirror.com/meow/3.7.0: + resolution: {integrity: sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/meow/-/meow-3.7.0.tgz} + name: meow + version: 3.7.0 + engines: {node: '>=0.10.0'} + dependencies: + camelcase-keys: registry.npmmirror.com/camelcase-keys/2.1.0 + decamelize: registry.npmmirror.com/decamelize/1.2.0 + loud-rejection: registry.npmmirror.com/loud-rejection/1.6.0 + map-obj: registry.npmmirror.com/map-obj/1.0.1 + minimist: registry.npmmirror.com/minimist/1.2.8 + normalize-package-data: registry.npmmirror.com/normalize-package-data/2.5.0 + object-assign: registry.npmmirror.com/object-assign/4.1.1 + read-pkg-up: registry.npmmirror.com/read-pkg-up/1.0.1 + redent: registry.npmmirror.com/redent/1.0.0 + trim-newlines: registry.npmmirror.com/trim-newlines/1.0.0 + dev: true + + registry.npmmirror.com/meow/8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/meow/-/meow-8.1.2.tgz} + name: meow + version: 8.1.2 + engines: {node: '>=10'} + dependencies: + '@types/minimist': registry.npmmirror.com/@types/minimist/1.2.2 + camelcase-keys: registry.npmmirror.com/camelcase-keys/6.2.2 + decamelize-keys: registry.npmmirror.com/decamelize-keys/1.1.1 + hard-rejection: registry.npmmirror.com/hard-rejection/2.1.0 + minimist-options: registry.npmmirror.com/minimist-options/4.1.0 + normalize-package-data: registry.npmmirror.com/normalize-package-data/3.0.3 + read-pkg-up: registry.npmmirror.com/read-pkg-up/7.0.1 + redent: registry.npmmirror.com/redent/3.0.0 + trim-newlines: registry.npmmirror.com/trim-newlines/3.0.1 + type-fest: registry.npmmirror.com/type-fest/0.18.1 + yargs-parser: registry.npmmirror.com/yargs-parser/20.2.9 + dev: true + + registry.npmmirror.com/meow/9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/meow/-/meow-9.0.0.tgz} + name: meow + version: 9.0.0 + engines: {node: '>=10'} + dependencies: + '@types/minimist': registry.npmmirror.com/@types/minimist/1.2.2 + camelcase-keys: registry.npmmirror.com/camelcase-keys/6.2.2 + decamelize: registry.npmmirror.com/decamelize/1.2.0 + decamelize-keys: registry.npmmirror.com/decamelize-keys/1.1.1 + hard-rejection: registry.npmmirror.com/hard-rejection/2.1.0 + minimist-options: registry.npmmirror.com/minimist-options/4.1.0 + normalize-package-data: registry.npmmirror.com/normalize-package-data/3.0.3 + read-pkg-up: registry.npmmirror.com/read-pkg-up/7.0.1 + redent: registry.npmmirror.com/redent/3.0.0 + trim-newlines: registry.npmmirror.com/trim-newlines/3.0.1 + type-fest: registry.npmmirror.com/type-fest/0.18.1 + yargs-parser: registry.npmmirror.com/yargs-parser/20.2.9 + dev: true + + registry.npmmirror.com/merge-options/1.0.1: + resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/merge-options/-/merge-options-1.0.1.tgz} + name: merge-options + version: 1.0.1 + engines: {node: '>=4'} + dependencies: + is-plain-obj: registry.npmmirror.com/is-plain-obj/1.1.0 + dev: true + + registry.npmmirror.com/merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz} + name: merge-stream + version: 2.0.0 + dev: true + + registry.npmmirror.com/merge/2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/merge/-/merge-2.1.1.tgz} + name: merge + version: 2.1.1 + dev: true + + registry.npmmirror.com/merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz} + name: merge2 + version: 1.4.1 + engines: {node: '>= 8'} + dev: true + + registry.npmmirror.com/micromatch/3.1.0: + resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/micromatch/-/micromatch-3.1.0.tgz} + name: micromatch + version: 3.1.0 + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: registry.npmmirror.com/arr-diff/4.0.0 + array-unique: registry.npmmirror.com/array-unique/0.3.2 + braces: registry.npmmirror.com/braces/2.3.2 + define-property: registry.npmmirror.com/define-property/1.0.0 + extend-shallow: registry.npmmirror.com/extend-shallow/2.0.1 + extglob: registry.npmmirror.com/extglob/2.0.4 + fragment-cache: registry.npmmirror.com/fragment-cache/0.2.1 + kind-of: registry.npmmirror.com/kind-of/5.1.0 + nanomatch: registry.npmmirror.com/nanomatch/1.2.13 + object.pick: registry.npmmirror.com/object.pick/1.3.0 + regex-not: registry.npmmirror.com/regex-not/1.0.2 + snapdragon: registry.npmmirror.com/snapdragon/0.8.2 + to-regex: registry.npmmirror.com/to-regex/3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz} + name: micromatch + version: 4.0.5 + engines: {node: '>=8.6'} + dependencies: + braces: registry.npmmirror.com/braces/3.0.2 + picomatch: registry.npmmirror.com/picomatch/2.3.1 + dev: true + + registry.npmmirror.com/mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz} + name: mime-db + version: 1.52.0 + engines: {node: '>= 0.6'} + dev: true + + registry.npmmirror.com/mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz} + name: mime-types + version: 2.1.35 + engines: {node: '>= 0.6'} + dependencies: + mime-db: registry.npmmirror.com/mime-db/1.52.0 + dev: true + + registry.npmmirror.com/mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz} + name: mime + version: 1.6.0 + engines: {node: '>=4'} + hasBin: true + dev: true + + registry.npmmirror.com/mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz} + name: mimic-fn + version: 2.1.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/mimic-response/1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz} + name: mimic-response + version: 1.0.1 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz} + name: min-indent + version: 1.0.1 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz} + name: minimatch + version: 3.1.2 + dependencies: + brace-expansion: registry.npmmirror.com/brace-expansion/1.1.11 + dev: true + + registry.npmmirror.com/minimatch/5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz} + name: minimatch + version: 5.1.6 + engines: {node: '>=10'} + dependencies: + brace-expansion: registry.npmmirror.com/brace-expansion/2.0.1 + dev: true + + registry.npmmirror.com/minimist-options/4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minimist-options/-/minimist-options-4.1.0.tgz} + name: minimist-options + version: 4.1.0 + engines: {node: '>= 6'} + dependencies: + arrify: registry.npmmirror.com/arrify/1.0.1 + is-plain-obj: registry.npmmirror.com/is-plain-obj/1.1.0 + kind-of: registry.npmmirror.com/kind-of/6.0.3 + dev: true + + registry.npmmirror.com/minimist/1.2.7: + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minimist/-/minimist-1.2.7.tgz} + name: minimist + version: 1.2.7 + dev: true + + registry.npmmirror.com/minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz} + name: minimist + version: 1.2.8 + dev: true + + registry.npmmirror.com/mixin-deep/1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz} + name: mixin-deep + version: 1.3.2 + engines: {node: '>=0.10.0'} + dependencies: + for-in: registry.npmmirror.com/for-in/1.0.2 + is-extendable: registry.npmmirror.com/is-extendable/1.0.1 + dev: true + + registry.npmmirror.com/mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz} + name: mkdirp + version: 0.5.6 + hasBin: true + dependencies: + minimist: registry.npmmirror.com/minimist/1.2.8 + dev: true + + registry.npmmirror.com/mockjs/1.1.0: + resolution: {integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz} + name: mockjs + version: 1.1.0 + hasBin: true + dependencies: + commander: registry.npmmirror.com/commander/10.0.0 + + registry.npmmirror.com/modify-values/1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/modify-values/-/modify-values-1.0.1.tgz} + name: modify-values + version: 1.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/mousetrap/1.6.5: + resolution: {integrity: sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mousetrap/-/mousetrap-1.6.5.tgz} + name: mousetrap + version: 1.6.5 + dev: false + + registry.npmmirror.com/mozjpeg/7.1.1: + resolution: {integrity: sha512-iIDxWvzhWvLC9mcRJ1uSkiKaj4drF58oCqK2bITm5c2Jt6cJ8qQjSSru2PCaysG+hLIinryj8mgz5ZJzOYTv1A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mozjpeg/-/mozjpeg-7.1.1.tgz} + name: mozjpeg + version: 7.1.1 + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + bin-build: registry.npmmirror.com/bin-build/3.0.0 + bin-wrapper: registry.npmmirror.com/bin-wrapper-china/0.1.0 + dev: true + + registry.npmmirror.com/mri/1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mri/-/mri-1.2.0.tgz} + name: mri + version: 1.2.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz} + name: ms + version: 2.0.0 + dev: true + + registry.npmmirror.com/ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz} + name: ms + version: 2.1.2 + dev: true + + registry.npmmirror.com/ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz} + name: ms + version: 2.1.3 + dev: true + + registry.npmmirror.com/multimatch/4.0.0: + resolution: {integrity: sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/multimatch/-/multimatch-4.0.0.tgz} + name: multimatch + version: 4.0.0 + engines: {node: '>=8'} + dependencies: + '@types/minimatch': registry.npmmirror.com/@types/minimatch/3.0.5 + array-differ: registry.npmmirror.com/array-differ/3.0.0 + array-union: registry.npmmirror.com/array-union/2.1.0 + arrify: registry.npmmirror.com/arrify/2.0.1 + minimatch: registry.npmmirror.com/minimatch/3.1.2 + dev: true + + registry.npmmirror.com/mute-stream/0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.8.tgz} + name: mute-stream + version: 0.0.8 + dev: true + + registry.npmmirror.com/nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz} + name: nanoid + version: 3.3.4 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + registry.npmmirror.com/nanomatch/1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz} + name: nanomatch + version: 1.2.13 + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: registry.npmmirror.com/arr-diff/4.0.0 + array-unique: registry.npmmirror.com/array-unique/0.3.2 + define-property: registry.npmmirror.com/define-property/2.0.2 + extend-shallow: registry.npmmirror.com/extend-shallow/3.0.2 + fragment-cache: registry.npmmirror.com/fragment-cache/0.2.1 + is-windows: registry.npmmirror.com/is-windows/1.0.2 + kind-of: registry.npmmirror.com/kind-of/6.0.3 + object.pick: registry.npmmirror.com/object.pick/1.3.0 + regex-not: registry.npmmirror.com/regex-not/1.0.2 + snapdragon: registry.npmmirror.com/snapdragon/0.8.2 + to-regex: registry.npmmirror.com/to-regex/3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/nanopop/2.2.0: + resolution: {integrity: sha512-E9JaHcxh3ere8/BEZHAcnuD10RluTSPyTToBvoFWS9/7DcCx6gyKjbn7M7Bx7E1veCxCuY1iO6h4+gdAf1j73Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nanopop/-/nanopop-2.2.0.tgz} + name: nanopop + version: 2.2.0 + dev: false + + registry.npmmirror.com/natural-compare-lite/1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz} + name: natural-compare-lite + version: 1.4.0 + dev: true + + registry.npmmirror.com/natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz} + name: natural-compare + version: 1.4.0 + dev: true + + registry.npmmirror.com/needle/3.2.0: + resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/needle/-/needle-3.2.0.tgz} + name: needle + version: 3.2.0 + engines: {node: '>= 4.4.x'} + hasBin: true + requiresBuild: true + dependencies: + debug: registry.npmmirror.com/debug/3.2.7 + iconv-lite: registry.npmmirror.com/iconv-lite/0.6.3 + sax: registry.npmmirror.com/sax/1.2.4 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + + registry.npmmirror.com/neo-async/2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz} + name: neo-async + version: 2.6.2 + dev: true + + registry.npmmirror.com/nice-try/1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz} + name: nice-try + version: 1.0.5 + dev: true + + registry.npmmirror.com/no-case/3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz} + name: no-case + version: 3.0.4 + dependencies: + lower-case: registry.npmmirror.com/lower-case/2.0.2 + tslib: registry.npmmirror.com/tslib/2.5.0 + dev: true + + registry.npmmirror.com/node-fetch/2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz} + name: node-fetch + version: 2.6.7 + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: registry.npmmirror.com/whatwg-url/5.0.0 + dev: true + + registry.npmmirror.com/node-fetch/2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.9.tgz} + name: node-fetch + version: 2.6.9 + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: registry.npmmirror.com/whatwg-url/5.0.0 + dev: true + + registry.npmmirror.com/node-html-parser/5.4.2: + resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-html-parser/-/node-html-parser-5.4.2.tgz} + name: node-html-parser + version: 5.4.2 + dependencies: + css-select: registry.npmmirror.com/css-select/4.3.0 + he: registry.npmmirror.com/he/1.2.0 + dev: true + + registry.npmmirror.com/node-int64/0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz} + name: node-int64 + version: 0.4.0 + dev: true + + registry.npmmirror.com/node-releases/2.0.10: + resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-releases/-/node-releases-2.0.10.tgz} + name: node-releases + version: 2.0.10 + dev: true + + registry.npmmirror.com/nopt/6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nopt/-/nopt-6.0.0.tgz} + name: nopt + version: 6.0.0 + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + dependencies: + abbrev: registry.npmmirror.com/abbrev/1.1.1 + dev: true + + registry.npmmirror.com/normalize-package-data/2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz} + name: normalize-package-data + version: 2.5.0 + dependencies: + hosted-git-info: registry.npmmirror.com/hosted-git-info/2.8.9 + resolve: registry.npmmirror.com/resolve/1.22.1 + semver: registry.npmmirror.com/semver/5.7.1 + validate-npm-package-license: registry.npmmirror.com/validate-npm-package-license/3.0.4 + dev: true + + registry.npmmirror.com/normalize-package-data/3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz} + name: normalize-package-data + version: 3.0.3 + engines: {node: '>=10'} + dependencies: + hosted-git-info: registry.npmmirror.com/hosted-git-info/4.1.0 + is-core-module: registry.npmmirror.com/is-core-module/2.11.0 + semver: registry.npmmirror.com/semver/7.3.8 + validate-npm-package-license: registry.npmmirror.com/validate-npm-package-license/3.0.4 + dev: true + + registry.npmmirror.com/normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz} + name: normalize-path + version: 3.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/normalize-range/0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz} + name: normalize-range + version: 0.1.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/normalize-url/2.0.1: + resolution: {integrity: sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/normalize-url/-/normalize-url-2.0.1.tgz} + name: normalize-url + version: 2.0.1 + engines: {node: '>=4'} + dependencies: + prepend-http: registry.npmmirror.com/prepend-http/2.0.0 + query-string: registry.npmmirror.com/query-string/5.1.1 + sort-keys: registry.npmmirror.com/sort-keys/2.0.0 + dev: true + + registry.npmmirror.com/npm-conf/1.1.3: + resolution: {integrity: sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/npm-conf/-/npm-conf-1.1.3.tgz} + name: npm-conf + version: 1.1.3 + engines: {node: '>=4'} + dependencies: + config-chain: registry.npmmirror.com/config-chain/1.1.13 + pify: registry.npmmirror.com/pify/3.0.0 + dev: true + + registry.npmmirror.com/npm-run-all/4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/npm-run-all/-/npm-run-all-4.1.5.tgz} + name: npm-run-all + version: 4.1.5 + engines: {node: '>= 4'} + hasBin: true + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles/3.2.1 + chalk: registry.npmmirror.com/chalk/2.4.2 + cross-spawn: registry.npmmirror.com/cross-spawn/6.0.5 + memorystream: registry.npmmirror.com/memorystream/0.3.1 + minimatch: registry.npmmirror.com/minimatch/3.1.2 + pidtree: registry.npmmirror.com/pidtree/0.3.1 + read-pkg: registry.npmmirror.com/read-pkg/3.0.0 + shell-quote: registry.npmmirror.com/shell-quote/1.8.0 + string.prototype.padend: registry.npmmirror.com/string.prototype.padend/3.1.4 + dev: true + + registry.npmmirror.com/npm-run-path/2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz} + name: npm-run-path + version: 2.0.2 + engines: {node: '>=4'} + dependencies: + path-key: registry.npmmirror.com/path-key/2.0.1 + dev: true + + registry.npmmirror.com/npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz} + name: npm-run-path + version: 4.0.1 + engines: {node: '>=8'} + dependencies: + path-key: registry.npmmirror.com/path-key/3.1.1 + dev: true + + registry.npmmirror.com/nprogress/0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz} + name: nprogress + version: 0.2.0 + dev: false + + registry.npmmirror.com/nth-check/2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz} + name: nth-check + version: 2.1.1 + dependencies: + boolbase: registry.npmmirror.com/boolbase/1.0.0 + dev: true + + registry.npmmirror.com/nwsapi/2.2.2: + resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.2.tgz} + name: nwsapi + version: 2.2.2 + dev: true + + registry.npmmirror.com/object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz} + name: object-assign + version: 4.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/object-copy/0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz} + name: object-copy + version: 0.1.0 + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: registry.npmmirror.com/copy-descriptor/0.1.1 + define-property: registry.npmmirror.com/define-property/0.2.5 + kind-of: registry.npmmirror.com/kind-of/3.2.2 + dev: true + + registry.npmmirror.com/object-inspect/1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz} + name: object-inspect + version: 1.12.3 + + registry.npmmirror.com/object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz} + name: object-keys + version: 1.1.1 + engines: {node: '>= 0.4'} + + registry.npmmirror.com/object-visit/1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz} + name: object-visit + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + isobject: registry.npmmirror.com/isobject/3.0.1 + dev: true + + registry.npmmirror.com/object.assign/4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz} + name: object.assign + version: 4.1.4 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + define-properties: registry.npmmirror.com/define-properties/1.2.0 + has-symbols: registry.npmmirror.com/has-symbols/1.0.3 + object-keys: registry.npmmirror.com/object-keys/1.1.1 + dev: true + + registry.npmmirror.com/object.pick/1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz} + name: object.pick + version: 1.3.0 + engines: {node: '>=0.10.0'} + dependencies: + isobject: registry.npmmirror.com/isobject/3.0.1 + dev: true + + registry.npmmirror.com/on-finished/2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz} + name: on-finished + version: 2.3.0 + engines: {node: '>= 0.8'} + dependencies: + ee-first: registry.npmmirror.com/ee-first/1.1.1 + dev: true + + registry.npmmirror.com/once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/once/-/once-1.4.0.tgz} + name: once + version: 1.4.0 + dependencies: + wrappy: registry.npmmirror.com/wrappy/1.0.2 + dev: true + + registry.npmmirror.com/onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz} + name: onetime + version: 5.1.2 + engines: {node: '>=6'} + dependencies: + mimic-fn: registry.npmmirror.com/mimic-fn/2.1.0 + dev: true + + registry.npmmirror.com/open/8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/open/-/open-8.4.2.tgz} + name: open + version: 8.4.2 + engines: {node: '>=12'} + dependencies: + define-lazy-prop: registry.npmmirror.com/define-lazy-prop/2.0.0 + is-docker: registry.npmmirror.com/is-docker/2.2.1 + is-wsl: registry.npmmirror.com/is-wsl/2.2.0 + dev: true + + registry.npmmirror.com/opener/1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/opener/-/opener-1.5.2.tgz} + name: opener + version: 1.5.2 + hasBin: true + dev: true + + registry.npmmirror.com/optionator/0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz} + name: optionator + version: 0.8.3 + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: registry.npmmirror.com/deep-is/0.1.4 + fast-levenshtein: registry.npmmirror.com/fast-levenshtein/2.0.6 + levn: registry.npmmirror.com/levn/0.3.0 + prelude-ls: registry.npmmirror.com/prelude-ls/1.1.2 + type-check: registry.npmmirror.com/type-check/0.3.2 + word-wrap: registry.npmmirror.com/word-wrap/1.2.3 + dev: true + + registry.npmmirror.com/optionator/0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz} + name: optionator + version: 0.9.1 + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: registry.npmmirror.com/deep-is/0.1.4 + fast-levenshtein: registry.npmmirror.com/fast-levenshtein/2.0.6 + levn: registry.npmmirror.com/levn/0.4.1 + prelude-ls: registry.npmmirror.com/prelude-ls/1.2.1 + type-check: registry.npmmirror.com/type-check/0.4.0 + word-wrap: registry.npmmirror.com/word-wrap/1.2.3 + dev: true + + registry.npmmirror.com/optipng-bin/7.0.1: + resolution: {integrity: sha512-W99mpdW7Nt2PpFiaO+74pkht7KEqkXkeRomdWXfEz3SALZ6hns81y/pm1dsGZ6ItUIfchiNIP6ORDr1zETU1jA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/optipng-bin/-/optipng-bin-7.0.1.tgz} + name: optipng-bin + version: 7.0.1 + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + bin-build: registry.npmmirror.com/bin-build/3.0.0 + bin-wrapper: registry.npmmirror.com/bin-wrapper-china/0.1.0 + dev: true + + registry.npmmirror.com/ora/5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz} + name: ora + version: 5.4.1 + engines: {node: '>=10'} + dependencies: + bl: registry.npmmirror.com/bl/4.1.0 + chalk: registry.npmmirror.com/chalk/4.1.2 + cli-cursor: registry.npmmirror.com/cli-cursor/3.1.0 + cli-spinners: registry.npmmirror.com/cli-spinners/2.7.0 + is-interactive: registry.npmmirror.com/is-interactive/1.0.0 + is-unicode-supported: registry.npmmirror.com/is-unicode-supported/0.1.0 + log-symbols: registry.npmmirror.com/log-symbols/4.1.0 + strip-ansi: registry.npmmirror.com/strip-ansi/6.0.1 + wcwidth: registry.npmmirror.com/wcwidth/1.0.1 + dev: true + + registry.npmmirror.com/os-filter-obj/2.0.0: + resolution: {integrity: sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz} + name: os-filter-obj + version: 2.0.0 + engines: {node: '>=4'} + dependencies: + arch: registry.npmmirror.com/arch/2.2.0 + dev: true + + registry.npmmirror.com/os-tmpdir/1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz} + name: os-tmpdir + version: 1.0.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/ow/0.17.0: + resolution: {integrity: sha512-i3keDzDQP5lWIe4oODyDFey1qVrq2hXKTuTH2VpqwpYtzPiKZt2ziRI4NBQmgW40AnV5Euz17OyWweCb+bNEQA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ow/-/ow-0.17.0.tgz} + name: ow + version: 0.17.0 + engines: {node: '>=10'} + dependencies: + type-fest: registry.npmmirror.com/type-fest/0.11.0 + dev: true + + registry.npmmirror.com/p-cancelable/0.3.0: + resolution: {integrity: sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-cancelable/-/p-cancelable-0.3.0.tgz} + name: p-cancelable + version: 0.3.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/p-cancelable/0.4.1: + resolution: {integrity: sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-cancelable/-/p-cancelable-0.4.1.tgz} + name: p-cancelable + version: 0.4.1 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/p-event/1.3.0: + resolution: {integrity: sha512-hV1zbA7gwqPVFcapfeATaNjQ3J0NuzorHPyG8GPL9g/Y/TplWVBVoCKCXL6Ej2zscrCEv195QNWJXuBH6XZuzA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-event/-/p-event-1.3.0.tgz} + name: p-event + version: 1.3.0 + engines: {node: '>=4'} + dependencies: + p-timeout: registry.npmmirror.com/p-timeout/1.2.1 + dev: true + + registry.npmmirror.com/p-event/2.3.1: + resolution: {integrity: sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-event/-/p-event-2.3.1.tgz} + name: p-event + version: 2.3.1 + engines: {node: '>=6'} + dependencies: + p-timeout: registry.npmmirror.com/p-timeout/2.0.1 + dev: true + + registry.npmmirror.com/p-finally/1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz} + name: p-finally + version: 1.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/p-is-promise/1.1.0: + resolution: {integrity: sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-is-promise/-/p-is-promise-1.1.0.tgz} + name: p-is-promise + version: 1.1.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/p-limit/1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-1.3.0.tgz} + name: p-limit + version: 1.3.0 + engines: {node: '>=4'} + dependencies: + p-try: registry.npmmirror.com/p-try/1.0.0 + dev: true + + registry.npmmirror.com/p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz} + name: p-limit + version: 2.3.0 + engines: {node: '>=6'} + dependencies: + p-try: registry.npmmirror.com/p-try/2.2.0 + + registry.npmmirror.com/p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz} + name: p-limit + version: 3.1.0 + engines: {node: '>=10'} + dependencies: + yocto-queue: registry.npmmirror.com/yocto-queue/0.1.0 + dev: true + + registry.npmmirror.com/p-locate/2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-2.0.0.tgz} + name: p-locate + version: 2.0.0 + engines: {node: '>=4'} + dependencies: + p-limit: registry.npmmirror.com/p-limit/1.3.0 + dev: true + + registry.npmmirror.com/p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz} + name: p-locate + version: 4.1.0 + engines: {node: '>=8'} + dependencies: + p-limit: registry.npmmirror.com/p-limit/2.3.0 + + registry.npmmirror.com/p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz} + name: p-locate + version: 5.0.0 + engines: {node: '>=10'} + dependencies: + p-limit: registry.npmmirror.com/p-limit/3.1.0 + dev: true + + registry.npmmirror.com/p-map-series/1.0.0: + resolution: {integrity: sha512-4k9LlvY6Bo/1FcIdV33wqZQES0Py+iKISU9Uc8p8AjWoZPnFKMpVIVD3s0EYn4jzLh1I+WeUZkJ0Yoa4Qfw3Kg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-map-series/-/p-map-series-1.0.0.tgz} + name: p-map-series + version: 1.0.0 + engines: {node: '>=4'} + dependencies: + p-reduce: registry.npmmirror.com/p-reduce/1.0.0 + dev: true + + registry.npmmirror.com/p-map/4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz} + name: p-map + version: 4.0.0 + engines: {node: '>=10'} + dependencies: + aggregate-error: registry.npmmirror.com/aggregate-error/3.1.0 + dev: true + + registry.npmmirror.com/p-pipe/3.1.0: + resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-pipe/-/p-pipe-3.1.0.tgz} + name: p-pipe + version: 3.1.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/p-reduce/1.0.0: + resolution: {integrity: sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-reduce/-/p-reduce-1.0.0.tgz} + name: p-reduce + version: 1.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/p-timeout/1.2.1: + resolution: {integrity: sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-timeout/-/p-timeout-1.2.1.tgz} + name: p-timeout + version: 1.2.1 + engines: {node: '>=4'} + dependencies: + p-finally: registry.npmmirror.com/p-finally/1.0.0 + dev: true + + registry.npmmirror.com/p-timeout/2.0.1: + resolution: {integrity: sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-timeout/-/p-timeout-2.0.1.tgz} + name: p-timeout + version: 2.0.1 + engines: {node: '>=4'} + dependencies: + p-finally: registry.npmmirror.com/p-finally/1.0.0 + dev: true + + registry.npmmirror.com/p-try/1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-try/-/p-try-1.0.0.tgz} + name: p-try + version: 1.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz} + name: p-try + version: 2.2.0 + engines: {node: '>=6'} + + registry.npmmirror.com/param-case/3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz} + name: param-case + version: 3.0.4 + dependencies: + dot-case: registry.npmmirror.com/dot-case/3.0.4 + tslib: registry.npmmirror.com/tslib/2.5.0 + dev: true + + registry.npmmirror.com/parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz} + name: parent-module + version: 1.0.1 + engines: {node: '>=6'} + dependencies: + callsites: registry.npmmirror.com/callsites/3.1.0 + dev: true + + registry.npmmirror.com/parse-json/2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parse-json/-/parse-json-2.2.0.tgz} + name: parse-json + version: 2.2.0 + engines: {node: '>=0.10.0'} + dependencies: + error-ex: registry.npmmirror.com/error-ex/1.3.2 + dev: true + + registry.npmmirror.com/parse-json/4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz} + name: parse-json + version: 4.0.0 + engines: {node: '>=4'} + dependencies: + error-ex: registry.npmmirror.com/error-ex/1.3.2 + json-parse-better-errors: registry.npmmirror.com/json-parse-better-errors/1.0.2 + dev: true + + registry.npmmirror.com/parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz} + name: parse-json + version: 5.2.0 + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6 + error-ex: registry.npmmirror.com/error-ex/1.3.2 + json-parse-even-better-errors: registry.npmmirror.com/json-parse-even-better-errors/2.3.1 + lines-and-columns: registry.npmmirror.com/lines-and-columns/1.2.4 + dev: true + + registry.npmmirror.com/parse-node-version/1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz} + name: parse-node-version + version: 1.0.1 + engines: {node: '>= 0.10'} + dev: true + + registry.npmmirror.com/parse-passwd/1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parse-passwd/-/parse-passwd-1.0.0.tgz} + name: parse-passwd + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/parse5/6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz} + name: parse5 + version: 6.0.1 + dev: true + + registry.npmmirror.com/parseurl/1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz} + name: parseurl + version: 1.3.3 + engines: {node: '>= 0.8'} + dev: true + + registry.npmmirror.com/pascal-case/3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz} + name: pascal-case + version: 3.1.2 + dependencies: + no-case: registry.npmmirror.com/no-case/3.0.4 + tslib: registry.npmmirror.com/tslib/2.5.0 + dev: true + + registry.npmmirror.com/pascalcase/0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz} + name: pascalcase + version: 0.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/path-case/3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-case/-/path-case-3.0.4.tgz} + name: path-case + version: 3.0.4 + dependencies: + dot-case: registry.npmmirror.com/dot-case/3.0.4 + tslib: registry.npmmirror.com/tslib/2.5.0 + dev: true + + registry.npmmirror.com/path-exists/2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-exists/-/path-exists-2.1.0.tgz} + name: path-exists + version: 2.1.0 + engines: {node: '>=0.10.0'} + dependencies: + pinkie-promise: registry.npmmirror.com/pinkie-promise/2.0.1 + dev: true + + registry.npmmirror.com/path-exists/3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz} + name: path-exists + version: 3.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz} + name: path-exists + version: 4.0.0 + engines: {node: '>=8'} + + registry.npmmirror.com/path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz} + name: path-is-absolute + version: 1.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/path-key/2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz} + name: path-key + version: 2.0.1 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz} + name: path-key + version: 3.1.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz} + name: path-parse + version: 1.0.7 + dev: true + + registry.npmmirror.com/path-to-regexp/6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz} + name: path-to-regexp + version: 6.2.1 + + registry.npmmirror.com/path-type/1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-type/-/path-type-1.1.0.tgz} + name: path-type + version: 1.1.0 + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + pify: registry.npmmirror.com/pify/2.3.0 + pinkie-promise: registry.npmmirror.com/pinkie-promise/2.0.1 + dev: true + + registry.npmmirror.com/path-type/3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz} + name: path-type + version: 3.0.0 + engines: {node: '>=4'} + dependencies: + pify: registry.npmmirror.com/pify/3.0.0 + dev: true + + registry.npmmirror.com/path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz} + name: path-type + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/pathe/0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pathe/-/pathe-0.2.0.tgz} + name: pathe + version: 0.2.0 + dev: true + + registry.npmmirror.com/pathe/1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pathe/-/pathe-1.1.0.tgz} + name: pathe + version: 1.1.0 + dev: true + + registry.npmmirror.com/pend/1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz} + name: pend + version: 1.2.0 + dev: true + + registry.npmmirror.com/picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz} + name: picocolors + version: 1.0.0 + + registry.npmmirror.com/picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz} + name: picomatch + version: 2.3.1 + engines: {node: '>=8.6'} + dev: true + + registry.npmmirror.com/pidtree/0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pidtree/-/pidtree-0.3.1.tgz} + name: pidtree + version: 0.3.1 + engines: {node: '>=0.10'} + hasBin: true + dev: true + + registry.npmmirror.com/pidtree/0.5.0: + resolution: {integrity: sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pidtree/-/pidtree-0.5.0.tgz} + name: pidtree + version: 0.5.0 + engines: {node: '>=0.10'} + hasBin: true + dev: true + + registry.npmmirror.com/pify/2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz} + name: pify + version: 2.3.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/pify/3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz} + name: pify + version: 3.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/pify/4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz} + name: pify + version: 4.0.1 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/pinia/2.0.12_hmuptsblhheur2tugfgucj7gc4: + resolution: {integrity: sha512-tUeuYGFrLU5irmGyRAIxp35q1OTcZ8sKpGT4XkPeVcG35W4R6cfXDbCGexzmVqH5lTQJJTXXbNGutIu9yS5yew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pinia/-/pinia-2.0.12.tgz} + id: registry.npmmirror.com/pinia/2.0.12 + name: pinia + version: 2.0.12 + peerDependencies: + '@vue/composition-api': ^1.4.0 + typescript: '>=4.4.4' + vue: ^2.6.14 || ^3.2.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + typescript: + optional: true + dependencies: + '@vue/devtools-api': registry.npmmirror.com/@vue/devtools-api/6.5.0 + typescript: registry.npmmirror.com/typescript/4.9.5 + vue: registry.npmmirror.com/vue/3.2.47 + vue-demi: registry.npmmirror.com/vue-demi/0.13.11_vue@3.2.47 + dev: false + + registry.npmmirror.com/pinkie-promise/2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz} + name: pinkie-promise + version: 2.0.1 + engines: {node: '>=0.10.0'} + dependencies: + pinkie: registry.npmmirror.com/pinkie/2.0.4 + dev: true + + registry.npmmirror.com/pinkie/2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pinkie/-/pinkie-2.0.4.tgz} + name: pinkie + version: 2.0.4 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/pinyin-pro/3.13.1: + resolution: {integrity: sha512-40mx64fuNWApC8FbW9xOu2hMDNBAPsYVYI29lx3vjMB94H8klF71r+zveC5x5bRy2nct7w4ZvD0DlglrmZX0vw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pinyin-pro/-/pinyin-pro-3.13.1.tgz} + name: pinyin-pro + version: 3.13.1 + dev: false + + registry.npmmirror.com/pirates/4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz} + name: pirates + version: 4.0.5 + engines: {node: '>= 6'} + dev: true + + registry.npmmirror.com/pkg-dir/4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz} + name: pkg-dir + version: 4.2.0 + engines: {node: '>=8'} + dependencies: + find-up: registry.npmmirror.com/find-up/4.1.0 + dev: true + + registry.npmmirror.com/pngjs/5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pngjs/-/pngjs-5.0.0.tgz} + name: pngjs + version: 5.0.0 + engines: {node: '>=10.13.0'} + dev: false + + registry.npmmirror.com/pngquant-bin/6.0.1: + resolution: {integrity: sha512-Q3PUyolfktf+hYio6wsg3SanQzEU/v8aICg/WpzxXcuCMRb7H2Q81okfpcEztbMvw25ILjd3a87doj2N9kvbpQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pngquant-bin/-/pngquant-bin-6.0.1.tgz} + name: pngquant-bin + version: 6.0.1 + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + bin-build: registry.npmmirror.com/bin-build/3.0.0 + bin-wrapper: registry.npmmirror.com/bin-wrapper-china/0.1.0 + execa: registry.npmmirror.com/execa/4.1.0 + dev: true + + registry.npmmirror.com/portfinder/1.0.32: + resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/portfinder/-/portfinder-1.0.32.tgz} + name: portfinder + version: 1.0.32 + engines: {node: '>= 0.12.0'} + dependencies: + async: registry.npmmirror.com/async/2.6.4 + debug: registry.npmmirror.com/debug/3.2.7 + mkdirp: registry.npmmirror.com/mkdirp/0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/posix-character-classes/0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz} + name: posix-character-classes + version: 0.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/postcss-html/1.5.0: + resolution: {integrity: sha512-kCMRWJRHKicpA166kc2lAVUGxDZL324bkj/pVOb6RhjB0Z5Krl7mN0AsVkBhVIRZZirY0lyQXG38HCVaoKVNoA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss-html/-/postcss-html-1.5.0.tgz} + name: postcss-html + version: 1.5.0 + engines: {node: ^12 || >=14} + dependencies: + htmlparser2: registry.npmmirror.com/htmlparser2/8.0.1 + js-tokens: registry.npmmirror.com/js-tokens/8.0.1 + postcss: registry.npmmirror.com/postcss/8.4.21 + postcss-safe-parser: registry.npmmirror.com/postcss-safe-parser/6.0.0_postcss@8.4.21 + dev: true + + registry.npmmirror.com/postcss-less/6.0.0_postcss@8.4.21: + resolution: {integrity: sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss-less/-/postcss-less-6.0.0.tgz} + id: registry.npmmirror.com/postcss-less/6.0.0 + name: postcss-less + version: 6.0.0 + engines: {node: '>=12'} + peerDependencies: + postcss: ^8.3.5 + dependencies: + postcss: registry.npmmirror.com/postcss/8.4.21 + dev: true + + registry.npmmirror.com/postcss-media-query-parser/0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz} + name: postcss-media-query-parser + version: 0.2.3 + dev: true + + registry.npmmirror.com/postcss-prefix-selector/1.16.0_postcss@5.2.18: + resolution: {integrity: sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz} + id: registry.npmmirror.com/postcss-prefix-selector/1.16.0 + name: postcss-prefix-selector + version: 1.16.0 + peerDependencies: + postcss: '>4 <9' + dependencies: + postcss: registry.npmmirror.com/postcss/5.2.18 + dev: true + + registry.npmmirror.com/postcss-resolve-nested-selector/0.1.1: + resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz} + name: postcss-resolve-nested-selector + version: 0.1.1 + dev: true + + registry.npmmirror.com/postcss-safe-parser/6.0.0_postcss@8.4.21: + resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz} + id: registry.npmmirror.com/postcss-safe-parser/6.0.0 + name: postcss-safe-parser + version: 6.0.0 + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.3.3 + dependencies: + postcss: registry.npmmirror.com/postcss/8.4.21 + dev: true + + registry.npmmirror.com/postcss-selector-parser/6.0.11: + resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz} + name: postcss-selector-parser + version: 6.0.11 + engines: {node: '>=4'} + dependencies: + cssesc: registry.npmmirror.com/cssesc/3.0.0 + util-deprecate: registry.npmmirror.com/util-deprecate/1.0.2 + dev: true + + registry.npmmirror.com/postcss-sorting/7.0.1_postcss@8.4.21: + resolution: {integrity: sha512-iLBFYz6VRYyLJEJsBJ8M3TCqNcckVzz4wFounSc5Oez35ogE/X+aoC5fFu103Ot7NyvjU3/xqIXn93Gp3kJk4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss-sorting/-/postcss-sorting-7.0.1.tgz} + id: registry.npmmirror.com/postcss-sorting/7.0.1 + name: postcss-sorting + version: 7.0.1 + peerDependencies: + postcss: ^8.3.9 + dependencies: + postcss: registry.npmmirror.com/postcss/8.4.21 + dev: true + + registry.npmmirror.com/postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz} + name: postcss-value-parser + version: 4.2.0 + dev: true + + registry.npmmirror.com/postcss/5.2.18: + resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss/-/postcss-5.2.18.tgz} + name: postcss + version: 5.2.18 + engines: {node: '>=0.12'} + dependencies: + chalk: registry.npmmirror.com/chalk/1.1.3 + js-base64: registry.npmmirror.com/js-base64/2.6.4 + source-map: registry.npmmirror.com/source-map/0.5.7 + supports-color: registry.npmmirror.com/supports-color/3.2.3 + dev: true + + registry.npmmirror.com/postcss/8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss/-/postcss-8.4.21.tgz} + name: postcss + version: 8.4.21 + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: registry.npmmirror.com/nanoid/3.3.4 + picocolors: registry.npmmirror.com/picocolors/1.0.0 + source-map-js: registry.npmmirror.com/source-map-js/1.0.2 + + registry.npmmirror.com/posthtml-parser/0.2.1: + resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.2.1.tgz} + name: posthtml-parser + version: 0.2.1 + dependencies: + htmlparser2: registry.npmmirror.com/htmlparser2/3.10.1 + isobject: registry.npmmirror.com/isobject/2.1.0 + dev: true + + registry.npmmirror.com/posthtml-rename-id/1.0.12: + resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz} + name: posthtml-rename-id + version: 1.0.12 + dependencies: + escape-string-regexp: registry.npmmirror.com/escape-string-regexp/1.0.5 + dev: true + + registry.npmmirror.com/posthtml-render/1.4.0: + resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/posthtml-render/-/posthtml-render-1.4.0.tgz} + name: posthtml-render + version: 1.4.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/posthtml-svg-mode/1.0.3: + resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz} + name: posthtml-svg-mode + version: 1.0.3 + dependencies: + merge-options: registry.npmmirror.com/merge-options/1.0.1 + posthtml: registry.npmmirror.com/posthtml/0.9.2 + posthtml-parser: registry.npmmirror.com/posthtml-parser/0.2.1 + posthtml-render: registry.npmmirror.com/posthtml-render/1.4.0 + dev: true + + registry.npmmirror.com/posthtml/0.9.2: + resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/posthtml/-/posthtml-0.9.2.tgz} + name: posthtml + version: 0.9.2 + engines: {node: '>=0.10.0'} + dependencies: + posthtml-parser: registry.npmmirror.com/posthtml-parser/0.2.1 + posthtml-render: registry.npmmirror.com/posthtml-render/1.4.0 + dev: true + + registry.npmmirror.com/preact/10.13.0: + resolution: {integrity: sha512-ERdIdUpR6doqdaSIh80hvzebHB7O6JxycOhyzAeLEchqOq/4yueslQbfnPwXaNhAYacFTyCclhwkEbOumT0tHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/preact/-/preact-10.13.0.tgz} + name: preact + version: 10.13.0 + dev: false + + registry.npmmirror.com/prelude-ls/1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz} + name: prelude-ls + version: 1.1.2 + engines: {node: '>= 0.8.0'} + dev: true + + registry.npmmirror.com/prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz} + name: prelude-ls + version: 1.2.1 + engines: {node: '>= 0.8.0'} + dev: true + + registry.npmmirror.com/prepend-http/1.0.4: + resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prepend-http/-/prepend-http-1.0.4.tgz} + name: prepend-http + version: 1.0.4 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/prepend-http/2.0.0: + resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prepend-http/-/prepend-http-2.0.0.tgz} + name: prepend-http + version: 2.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/prettier-linter-helpers/1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz} + name: prettier-linter-helpers + version: 1.0.0 + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: registry.npmmirror.com/fast-diff/1.2.0 + dev: true + + registry.npmmirror.com/prettier/2.8.4: + resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prettier/-/prettier-2.8.4.tgz} + name: prettier + version: 2.8.4 + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + registry.npmmirror.com/pretty-bytes/5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz} + name: pretty-bytes + version: 5.6.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/pretty-bytes/6.1.0: + resolution: {integrity: sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-6.1.0.tgz} + name: pretty-bytes + version: 6.1.0 + engines: {node: ^14.13.1 || >=16.0.0} + dev: true + + registry.npmmirror.com/pretty-format/27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pretty-format/-/pretty-format-27.5.1.tgz} + name: pretty-format + version: 27.5.1 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: registry.npmmirror.com/ansi-regex/5.0.1 + ansi-styles: registry.npmmirror.com/ansi-styles/5.2.0 + react-is: registry.npmmirror.com/react-is/17.0.2 + dev: true + + registry.npmmirror.com/pretty-quick/3.1.3_prettier@2.8.4: + resolution: {integrity: sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pretty-quick/-/pretty-quick-3.1.3.tgz} + id: registry.npmmirror.com/pretty-quick/3.1.3 + name: pretty-quick + version: 3.1.3 + engines: {node: '>=10.13'} + hasBin: true + peerDependencies: + prettier: '>=2.0.0' + dependencies: + chalk: registry.npmmirror.com/chalk/3.0.0 + execa: registry.npmmirror.com/execa/4.1.0 + find-up: registry.npmmirror.com/find-up/4.1.0 + ignore: registry.npmmirror.com/ignore/5.2.4 + mri: registry.npmmirror.com/mri/1.2.0 + multimatch: registry.npmmirror.com/multimatch/4.0.0 + prettier: registry.npmmirror.com/prettier/2.8.4 + dev: true + + registry.npmmirror.com/print-js/1.6.0: + resolution: {integrity: sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/print-js/-/print-js-1.6.0.tgz} + name: print-js + version: 1.6.0 + dev: false + + registry.npmmirror.com/process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz} + name: process-nextick-args + version: 2.0.1 + dev: true + + registry.npmmirror.com/prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz} + name: prompts + version: 2.4.2 + engines: {node: '>= 6'} + dependencies: + kleur: registry.npmmirror.com/kleur/3.0.3 + sisteransi: registry.npmmirror.com/sisteransi/1.0.5 + dev: true + + registry.npmmirror.com/proto-list/1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/proto-list/-/proto-list-1.2.4.tgz} + name: proto-list + version: 1.2.4 + dev: true + + registry.npmmirror.com/proxy-from-env/1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz} + name: proxy-from-env + version: 1.1.0 + dev: true + + registry.npmmirror.com/prr/1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz} + name: prr + version: 1.0.1 + dev: true + optional: true + + registry.npmmirror.com/pseudomap/1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz} + name: pseudomap + version: 1.0.2 + dev: true + + registry.npmmirror.com/psl/1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz} + name: psl + version: 1.9.0 + dev: true + + registry.npmmirror.com/pug-error/2.0.0: + resolution: {integrity: sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pug-error/-/pug-error-2.0.0.tgz} + name: pug-error + version: 2.0.0 + dev: true + + registry.npmmirror.com/pug-lexer/5.0.1: + resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pug-lexer/-/pug-lexer-5.0.1.tgz} + name: pug-lexer + version: 5.0.1 + dependencies: + character-parser: registry.npmmirror.com/character-parser/2.2.0 + is-expression: registry.npmmirror.com/is-expression/4.0.0 + pug-error: registry.npmmirror.com/pug-error/2.0.0 + dev: true + + registry.npmmirror.com/pug-parser/6.0.0: + resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pug-parser/-/pug-parser-6.0.0.tgz} + name: pug-parser + version: 6.0.0 + dependencies: + pug-error: registry.npmmirror.com/pug-error/2.0.0 + token-stream: registry.npmmirror.com/token-stream/1.0.0 + dev: true + + registry.npmmirror.com/pump/3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz} + name: pump + version: 3.0.0 + dependencies: + end-of-stream: registry.npmmirror.com/end-of-stream/1.4.4 + once: registry.npmmirror.com/once/1.4.0 + dev: true + + registry.npmmirror.com/punycode/2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz} + name: punycode + version: 2.3.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/q/1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/q/-/q-1.5.1.tgz} + name: q + version: 1.5.1 + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + + registry.npmmirror.com/qrcode/1.5.1: + resolution: {integrity: sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/qrcode/-/qrcode-1.5.1.tgz} + name: qrcode + version: 1.5.1 + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + dijkstrajs: registry.npmmirror.com/dijkstrajs/1.0.2 + encode-utf8: registry.npmmirror.com/encode-utf8/1.0.3 + pngjs: registry.npmmirror.com/pngjs/5.0.0 + yargs: registry.npmmirror.com/yargs/15.4.1 + dev: false + + registry.npmmirror.com/qrcodejs2/0.0.2: + resolution: {integrity: sha512-+Y4HA+cb6qUzdgvI3KML8GYpMFwB24dFwzMkS/yXq6hwtUGNUnZQdUnksrV1XGMc2mid5ROw5SAuY9XhI3ValA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/qrcodejs2/-/qrcodejs2-0.0.2.tgz} + name: qrcodejs2 + version: 0.0.2 + dev: false + + registry.npmmirror.com/qs/6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz} + name: qs + version: 6.11.0 + engines: {node: '>=0.6'} + dependencies: + side-channel: registry.npmmirror.com/side-channel/1.0.4 + + registry.npmmirror.com/query-string/4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/query-string/-/query-string-4.3.4.tgz} + name: query-string + version: 4.3.4 + engines: {node: '>=0.10.0'} + dependencies: + object-assign: registry.npmmirror.com/object-assign/4.1.1 + strict-uri-encode: registry.npmmirror.com/strict-uri-encode/1.1.0 + dev: true + + registry.npmmirror.com/query-string/5.1.1: + resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/query-string/-/query-string-5.1.1.tgz} + name: query-string + version: 5.1.1 + engines: {node: '>=0.10.0'} + dependencies: + decode-uri-component: registry.npmmirror.com/decode-uri-component/0.2.2 + object-assign: registry.npmmirror.com/object-assign/4.1.1 + strict-uri-encode: registry.npmmirror.com/strict-uri-encode/1.1.0 + dev: true + + registry.npmmirror.com/querystringify/2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz} + name: querystringify + version: 2.2.0 + dev: true + + registry.npmmirror.com/queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz} + name: queue-microtask + version: 1.2.3 + dev: true + + registry.npmmirror.com/quick-lru/4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/quick-lru/-/quick-lru-4.0.1.tgz} + name: quick-lru + version: 4.0.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/randombytes/2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz} + name: randombytes + version: 2.1.0 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer/5.2.1 + dev: true + + registry.npmmirror.com/react-is/17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz} + name: react-is + version: 17.0.2 + dev: true + + registry.npmmirror.com/read-pkg-up/1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz} + name: read-pkg-up + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + find-up: registry.npmmirror.com/find-up/1.1.2 + read-pkg: registry.npmmirror.com/read-pkg/1.1.0 + dev: true + + registry.npmmirror.com/read-pkg-up/3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz} + name: read-pkg-up + version: 3.0.0 + engines: {node: '>=4'} + dependencies: + find-up: registry.npmmirror.com/find-up/2.1.0 + read-pkg: registry.npmmirror.com/read-pkg/3.0.0 + dev: true + + registry.npmmirror.com/read-pkg-up/7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz} + name: read-pkg-up + version: 7.0.1 + engines: {node: '>=8'} + dependencies: + find-up: registry.npmmirror.com/find-up/4.1.0 + read-pkg: registry.npmmirror.com/read-pkg/5.2.0 + type-fest: registry.npmmirror.com/type-fest/0.8.1 + dev: true + + registry.npmmirror.com/read-pkg/1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/read-pkg/-/read-pkg-1.1.0.tgz} + name: read-pkg + version: 1.1.0 + engines: {node: '>=0.10.0'} + dependencies: + load-json-file: registry.npmmirror.com/load-json-file/1.1.0 + normalize-package-data: registry.npmmirror.com/normalize-package-data/2.5.0 + path-type: registry.npmmirror.com/path-type/1.1.0 + dev: true + + registry.npmmirror.com/read-pkg/3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/read-pkg/-/read-pkg-3.0.0.tgz} + name: read-pkg + version: 3.0.0 + engines: {node: '>=4'} + dependencies: + load-json-file: registry.npmmirror.com/load-json-file/4.0.0 + normalize-package-data: registry.npmmirror.com/normalize-package-data/2.5.0 + path-type: registry.npmmirror.com/path-type/3.0.0 + dev: true + + registry.npmmirror.com/read-pkg/5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz} + name: read-pkg + version: 5.2.0 + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': registry.npmmirror.com/@types/normalize-package-data/2.4.1 + normalize-package-data: registry.npmmirror.com/normalize-package-data/2.5.0 + parse-json: registry.npmmirror.com/parse-json/5.2.0 + type-fest: registry.npmmirror.com/type-fest/0.6.0 + dev: true + + registry.npmmirror.com/readable-stream/2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz} + name: readable-stream + version: 2.3.8 + dependencies: + core-util-is: registry.npmmirror.com/core-util-is/1.0.3 + inherits: registry.npmmirror.com/inherits/2.0.4 + isarray: registry.npmmirror.com/isarray/1.0.0 + process-nextick-args: registry.npmmirror.com/process-nextick-args/2.0.1 + safe-buffer: registry.npmmirror.com/safe-buffer/5.1.2 + string_decoder: registry.npmmirror.com/string_decoder/1.1.1 + util-deprecate: registry.npmmirror.com/util-deprecate/1.0.2 + dev: true + + registry.npmmirror.com/readable-stream/3.6.1: + resolution: {integrity: sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.1.tgz} + name: readable-stream + version: 3.6.1 + engines: {node: '>= 6'} + dependencies: + inherits: registry.npmmirror.com/inherits/2.0.4 + string_decoder: registry.npmmirror.com/string_decoder/1.3.0 + util-deprecate: registry.npmmirror.com/util-deprecate/1.0.2 + dev: true + + registry.npmmirror.com/readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz} + name: readdirp + version: 3.6.0 + engines: {node: '>=8.10.0'} + dependencies: + picomatch: registry.npmmirror.com/picomatch/2.3.1 + dev: true + + registry.npmmirror.com/redent/1.0.0: + resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/redent/-/redent-1.0.0.tgz} + name: redent + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + indent-string: registry.npmmirror.com/indent-string/2.1.0 + strip-indent: registry.npmmirror.com/strip-indent/1.0.1 + dev: true + + registry.npmmirror.com/redent/3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/redent/-/redent-3.0.0.tgz} + name: redent + version: 3.0.0 + engines: {node: '>=8'} + dependencies: + indent-string: registry.npmmirror.com/indent-string/4.0.0 + strip-indent: registry.npmmirror.com/strip-indent/3.0.0 + dev: true + + registry.npmmirror.com/regenerate-unicode-properties/10.1.0: + resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz} + name: regenerate-unicode-properties + version: 10.1.0 + engines: {node: '>=4'} + dependencies: + regenerate: registry.npmmirror.com/regenerate/1.4.2 + dev: true + + registry.npmmirror.com/regenerate/1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz} + name: regenerate + version: 1.4.2 + dev: true + + registry.npmmirror.com/regenerator-runtime/0.11.1: + resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz} + name: regenerator-runtime + version: 0.11.1 + dev: false + + registry.npmmirror.com/regenerator-runtime/0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz} + name: regenerator-runtime + version: 0.13.11 + + registry.npmmirror.com/regenerator-transform/0.15.1: + resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz} + name: regenerator-transform + version: 0.15.1 + dependencies: + '@babel/runtime': registry.npmmirror.com/@babel/runtime/7.21.0 + dev: true + + registry.npmmirror.com/regex-not/1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz} + name: regex-not + version: 1.0.2 + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: registry.npmmirror.com/extend-shallow/3.0.2 + safe-regex: registry.npmmirror.com/safe-regex/1.1.0 + dev: true + + registry.npmmirror.com/regexp.prototype.flags/1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz} + name: regexp.prototype.flags + version: 1.4.3 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + define-properties: registry.npmmirror.com/define-properties/1.2.0 + functions-have-names: registry.npmmirror.com/functions-have-names/1.2.3 + dev: true + + registry.npmmirror.com/regexpp/3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz} + name: regexpp + version: 3.2.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/regexpu-core/5.3.1: + resolution: {integrity: sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.1.tgz} + name: regexpu-core + version: 5.3.1 + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': registry.npmmirror.com/@babel/regjsgen/0.8.0 + regenerate: registry.npmmirror.com/regenerate/1.4.2 + regenerate-unicode-properties: registry.npmmirror.com/regenerate-unicode-properties/10.1.0 + regjsparser: registry.npmmirror.com/regjsparser/0.9.1 + unicode-match-property-ecmascript: registry.npmmirror.com/unicode-match-property-ecmascript/2.0.0 + unicode-match-property-value-ecmascript: registry.npmmirror.com/unicode-match-property-value-ecmascript/2.1.0 + dev: true + + registry.npmmirror.com/regjsparser/0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz} + name: regjsparser + version: 0.9.1 + hasBin: true + dependencies: + jsesc: registry.npmmirror.com/jsesc/0.5.0 + dev: true + + registry.npmmirror.com/relateurl/0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz} + name: relateurl + version: 0.2.7 + engines: {node: '>= 0.10'} + dev: true + + registry.npmmirror.com/repeat-element/1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz} + name: repeat-element + version: 1.1.4 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/repeat-string/1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz} + name: repeat-string + version: 1.6.1 + engines: {node: '>=0.10'} + dev: true + + registry.npmmirror.com/repeating/2.0.1: + resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/repeating/-/repeating-2.0.1.tgz} + name: repeating + version: 2.0.1 + engines: {node: '>=0.10.0'} + dependencies: + is-finite: registry.npmmirror.com/is-finite/1.1.0 + dev: true + + registry.npmmirror.com/replace-ext/1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/replace-ext/-/replace-ext-1.0.1.tgz} + name: replace-ext + version: 1.0.1 + engines: {node: '>= 0.10'} + dev: true + + registry.npmmirror.com/require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz} + name: require-directory + version: 2.1.1 + engines: {node: '>=0.10.0'} + + registry.npmmirror.com/require-from-string/2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz} + name: require-from-string + version: 2.0.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/require-main-filename/2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz} + name: require-main-filename + version: 2.0.0 + dev: false + + registry.npmmirror.com/requires-port/1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz} + name: requires-port + version: 1.0.0 + dev: true + + registry.npmmirror.com/resize-observer-polyfill/1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz} + name: resize-observer-polyfill + version: 1.5.1 + dev: false + + registry.npmmirror.com/resolve-cwd/3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz} + name: resolve-cwd + version: 3.0.0 + engines: {node: '>=8'} + dependencies: + resolve-from: registry.npmmirror.com/resolve-from/5.0.0 + dev: true + + registry.npmmirror.com/resolve-dir/1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve-dir/-/resolve-dir-1.0.1.tgz} + name: resolve-dir + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: registry.npmmirror.com/expand-tilde/2.0.2 + global-modules: registry.npmmirror.com/global-modules/1.0.0 + dev: true + + registry.npmmirror.com/resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz} + name: resolve-from + version: 4.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz} + name: resolve-from + version: 5.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/resolve-global/1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve-global/-/resolve-global-1.0.0.tgz} + name: resolve-global + version: 1.0.0 + engines: {node: '>=8'} + dependencies: + global-dirs: registry.npmmirror.com/global-dirs/0.1.1 + dev: true + + registry.npmmirror.com/resolve-url/0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz} + name: resolve-url + version: 0.2.1 + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + registry.npmmirror.com/resolve.exports/1.1.1: + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve.exports/-/resolve.exports-1.1.1.tgz} + name: resolve.exports + version: 1.1.1 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz} + name: resolve + version: 1.22.1 + hasBin: true + dependencies: + is-core-module: registry.npmmirror.com/is-core-module/2.11.0 + path-parse: registry.npmmirror.com/path-parse/1.0.7 + supports-preserve-symlinks-flag: registry.npmmirror.com/supports-preserve-symlinks-flag/1.0.0 + dev: true + + registry.npmmirror.com/responselike/1.0.2: + resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/responselike/-/responselike-1.0.2.tgz} + name: responselike + version: 1.0.2 + dependencies: + lowercase-keys: registry.npmmirror.com/lowercase-keys/1.0.1 + dev: true + + registry.npmmirror.com/restore-cursor/3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz} + name: restore-cursor + version: 3.1.0 + engines: {node: '>=8'} + dependencies: + onetime: registry.npmmirror.com/onetime/5.1.2 + signal-exit: registry.npmmirror.com/signal-exit/3.0.7 + dev: true + + registry.npmmirror.com/ret/0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz} + name: ret + version: 0.1.15 + engines: {node: '>=0.12'} + dev: true + + registry.npmmirror.com/reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz} + name: reusify + version: 1.0.4 + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/rfdc/1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz} + name: rfdc + version: 1.3.0 + dev: true + + registry.npmmirror.com/rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz} + name: rimraf + version: 2.7.1 + hasBin: true + dependencies: + glob: registry.npmmirror.com/glob/7.2.3 + dev: true + + registry.npmmirror.com/rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz} + name: rimraf + version: 3.0.2 + hasBin: true + dependencies: + glob: registry.npmmirror.com/glob/7.2.3 + dev: true + + registry.npmmirror.com/rollup-plugin-purge-icons/0.8.1: + resolution: {integrity: sha512-7ktMV+gWtXAdOIShE8EtTcnpGhozi5H2hKk1MQVGt+7FmlLkjR+XKu1Nyzjocwd6xJvKube2Lh+SfcJ8FYYySw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rollup-plugin-purge-icons/-/rollup-plugin-purge-icons-0.8.1.tgz} + name: rollup-plugin-purge-icons + version: 0.8.1 + engines: {node: '>= 12'} + dependencies: + '@purge-icons/core': registry.npmmirror.com/@purge-icons/core/0.8.0 + '@purge-icons/generated': registry.npmmirror.com/@purge-icons/generated/0.8.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + registry.npmmirror.com/rollup-plugin-terser/7.0.2_rollup@2.79.1: + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz} + id: registry.npmmirror.com/rollup-plugin-terser/7.0.2 + name: rollup-plugin-terser + version: 7.0.2 + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + dependencies: + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6 + jest-worker: registry.npmmirror.com/jest-worker/26.6.2 + rollup: registry.npmmirror.com/rollup/2.79.1 + serialize-javascript: registry.npmmirror.com/serialize-javascript/4.0.0 + terser: registry.npmmirror.com/terser/5.16.5 + dev: true + + registry.npmmirror.com/rollup-plugin-visualizer/5.9.0_rollup@2.79.1: + resolution: {integrity: sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.0.tgz} + id: registry.npmmirror.com/rollup-plugin-visualizer/5.9.0 + name: rollup-plugin-visualizer + version: 5.9.0 + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + open: registry.npmmirror.com/open/8.4.2 + picomatch: registry.npmmirror.com/picomatch/2.3.1 + rollup: registry.npmmirror.com/rollup/2.79.1 + source-map: registry.npmmirror.com/source-map/0.7.4 + yargs: registry.npmmirror.com/yargs/17.7.1 + dev: true + + registry.npmmirror.com/rollup/2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rollup/-/rollup-2.79.1.tgz} + name: rollup + version: 2.79.1 + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: registry.npmmirror.com/fsevents/2.3.2 + dev: true + + registry.npmmirror.com/run-async/2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/run-async/-/run-async-2.4.1.tgz} + name: run-async + version: 2.4.1 + engines: {node: '>=0.12.0'} + dev: true + + registry.npmmirror.com/run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz} + name: run-parallel + version: 1.2.0 + dependencies: + queue-microtask: registry.npmmirror.com/queue-microtask/1.2.3 + dev: true + + registry.npmmirror.com/rxjs/7.8.0: + resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rxjs/-/rxjs-7.8.0.tgz} + name: rxjs + version: 7.8.0 + dependencies: + tslib: registry.npmmirror.com/tslib/2.5.0 + dev: true + + registry.npmmirror.com/safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz} + name: safe-buffer + version: 5.1.2 + dev: true + + registry.npmmirror.com/safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz} + name: safe-buffer + version: 5.2.1 + dev: true + + registry.npmmirror.com/safe-regex-test/1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz} + name: safe-regex-test + version: 1.0.0 + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + get-intrinsic: registry.npmmirror.com/get-intrinsic/1.2.0 + is-regex: registry.npmmirror.com/is-regex/1.1.4 + dev: true + + registry.npmmirror.com/safe-regex/1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz} + name: safe-regex + version: 1.1.0 + dependencies: + ret: registry.npmmirror.com/ret/0.1.15 + dev: true + + registry.npmmirror.com/safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz} + name: safer-buffer + version: 2.1.2 + dev: true + + registry.npmmirror.com/sax/1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz} + name: sax + version: 1.2.4 + dev: true + optional: true + + registry.npmmirror.com/saxes/5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/saxes/-/saxes-5.0.1.tgz} + name: saxes + version: 5.0.1 + engines: {node: '>=10'} + dependencies: + xmlchars: registry.npmmirror.com/xmlchars/2.2.0 + dev: true + + registry.npmmirror.com/scroll-into-view-if-needed/2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz} + name: scroll-into-view-if-needed + version: 2.2.31 + dependencies: + compute-scroll-into-view: registry.npmmirror.com/compute-scroll-into-view/1.0.20 + dev: false + + registry.npmmirror.com/scrollparent/2.0.1: + resolution: {integrity: sha512-HSdN78VMvFCSGCkh0oYX/tY4R3P1DW61f8+TeZZ4j2VLgfwvw0bpRSOv4PCVKisktIwbzHCfZsx+rLbbDBqIBA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/scrollparent/-/scrollparent-2.0.1.tgz} + name: scrollparent + version: 2.0.1 + dev: false + + registry.npmmirror.com/secure-compare/3.0.1: + resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/secure-compare/-/secure-compare-3.0.1.tgz} + name: secure-compare + version: 3.0.1 + dev: true + + registry.npmmirror.com/seek-bzip/1.0.6: + resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/seek-bzip/-/seek-bzip-1.0.6.tgz} + name: seek-bzip + version: 1.0.6 + hasBin: true + dependencies: + commander: registry.npmmirror.com/commander/2.20.3 + dev: true + + registry.npmmirror.com/select/1.1.2: + resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/select/-/select-1.1.2.tgz} + name: select + version: 1.1.2 + dev: false + + registry.npmmirror.com/semver-regex/2.0.0: + resolution: {integrity: sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver-regex/-/semver-regex-2.0.0.tgz} + name: semver-regex + version: 2.0.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/semver-truncate/1.1.2: + resolution: {integrity: sha512-V1fGg9i4CL3qesB6U0L6XAm4xOJiHmt4QAacazumuasc03BvtFGIMCduv01JWQ69Nv+JST9TqhSCiJoxoY031w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver-truncate/-/semver-truncate-1.1.2.tgz} + name: semver-truncate + version: 1.1.2 + engines: {node: '>=0.10.0'} + dependencies: + semver: registry.npmmirror.com/semver/5.7.1 + dev: true + + registry.npmmirror.com/semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz} + name: semver + version: 5.7.1 + hasBin: true + dev: true + + registry.npmmirror.com/semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz} + name: semver + version: 6.3.0 + hasBin: true + dev: true + + registry.npmmirror.com/semver/7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-7.3.7.tgz} + name: semver + version: 7.3.7 + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: registry.npmmirror.com/lru-cache/6.0.0 + dev: true + + registry.npmmirror.com/semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz} + name: semver + version: 7.3.8 + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: registry.npmmirror.com/lru-cache/6.0.0 + dev: true + + registry.npmmirror.com/sentence-case/3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sentence-case/-/sentence-case-3.0.4.tgz} + name: sentence-case + version: 3.0.4 + dependencies: + no-case: registry.npmmirror.com/no-case/3.0.4 + tslib: registry.npmmirror.com/tslib/2.5.0 + upper-case-first: registry.npmmirror.com/upper-case-first/2.0.2 + dev: true + + registry.npmmirror.com/serialize-javascript/4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz} + name: serialize-javascript + version: 4.0.0 + dependencies: + randombytes: registry.npmmirror.com/randombytes/2.1.0 + dev: true + + registry.npmmirror.com/set-blocking/2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz} + name: set-blocking + version: 2.0.0 + dev: false + + registry.npmmirror.com/set-value/2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz} + name: set-value + version: 2.0.1 + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: registry.npmmirror.com/extend-shallow/2.0.1 + is-extendable: registry.npmmirror.com/is-extendable/0.1.1 + is-plain-object: registry.npmmirror.com/is-plain-object/2.0.4 + split-string: registry.npmmirror.com/split-string/3.1.0 + dev: true + + registry.npmmirror.com/shallow-equal/1.2.1: + resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shallow-equal/-/shallow-equal-1.2.1.tgz} + name: shallow-equal + version: 1.2.1 + dev: false + + registry.npmmirror.com/shebang-command/1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz} + name: shebang-command + version: 1.2.0 + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: registry.npmmirror.com/shebang-regex/1.0.0 + dev: true + + registry.npmmirror.com/shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz} + name: shebang-command + version: 2.0.0 + engines: {node: '>=8'} + dependencies: + shebang-regex: registry.npmmirror.com/shebang-regex/3.0.0 + dev: true + + registry.npmmirror.com/shebang-regex/1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz} + name: shebang-regex + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz} + name: shebang-regex + version: 3.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/shell-quote/1.8.0: + resolution: {integrity: sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.0.tgz} + name: shell-quote + version: 1.8.0 + dev: true + + registry.npmmirror.com/showdown/2.1.0: + resolution: {integrity: sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/showdown/-/showdown-2.1.0.tgz} + name: showdown + version: 2.1.0 + hasBin: true + dependencies: + commander: registry.npmmirror.com/commander/9.5.0 + dev: false + + registry.npmmirror.com/side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz} + name: side-channel + version: 1.0.4 + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + get-intrinsic: registry.npmmirror.com/get-intrinsic/1.2.0 + object-inspect: registry.npmmirror.com/object-inspect/1.12.3 + + registry.npmmirror.com/sigmund/1.0.1: + resolution: {integrity: sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sigmund/-/sigmund-1.0.1.tgz} + name: sigmund + version: 1.0.1 + dev: true + + registry.npmmirror.com/signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz} + name: signal-exit + version: 3.0.7 + dev: true + + registry.npmmirror.com/sisteransi/1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz} + name: sisteransi + version: 1.0.5 + dev: true + + registry.npmmirror.com/slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz} + name: slash + version: 3.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/slice-ansi/3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz} + name: slice-ansi + version: 3.0.0 + engines: {node: '>=8'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles/4.3.0 + astral-regex: registry.npmmirror.com/astral-regex/2.0.0 + is-fullwidth-code-point: registry.npmmirror.com/is-fullwidth-code-point/3.0.0 + dev: true + + registry.npmmirror.com/slice-ansi/4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz} + name: slice-ansi + version: 4.0.0 + engines: {node: '>=10'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles/4.3.0 + astral-regex: registry.npmmirror.com/astral-regex/2.0.0 + is-fullwidth-code-point: registry.npmmirror.com/is-fullwidth-code-point/3.0.0 + dev: true + + registry.npmmirror.com/slice-ansi/5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/slice-ansi/-/slice-ansi-5.0.0.tgz} + name: slice-ansi + version: 5.0.0 + engines: {node: '>=12'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles/6.2.1 + is-fullwidth-code-point: registry.npmmirror.com/is-fullwidth-code-point/4.0.0 + dev: true + + registry.npmmirror.com/snake-case/3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/snake-case/-/snake-case-3.0.4.tgz} + name: snake-case + version: 3.0.4 + dependencies: + dot-case: registry.npmmirror.com/dot-case/3.0.4 + tslib: registry.npmmirror.com/tslib/2.5.0 + dev: true + + registry.npmmirror.com/snapdragon-node/2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz} + name: snapdragon-node + version: 2.1.1 + engines: {node: '>=0.10.0'} + dependencies: + define-property: registry.npmmirror.com/define-property/1.0.0 + isobject: registry.npmmirror.com/isobject/3.0.1 + snapdragon-util: registry.npmmirror.com/snapdragon-util/3.0.1 + dev: true + + registry.npmmirror.com/snapdragon-util/3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz} + name: snapdragon-util + version: 3.0.1 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of/3.2.2 + dev: true + + registry.npmmirror.com/snapdragon/0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz} + name: snapdragon + version: 0.8.2 + engines: {node: '>=0.10.0'} + dependencies: + base: registry.npmmirror.com/base/0.11.2 + debug: registry.npmmirror.com/debug/2.6.9 + define-property: registry.npmmirror.com/define-property/0.2.5 + extend-shallow: registry.npmmirror.com/extend-shallow/2.0.1 + map-cache: registry.npmmirror.com/map-cache/0.2.2 + source-map: registry.npmmirror.com/source-map/0.5.7 + source-map-resolve: registry.npmmirror.com/source-map-resolve/0.5.3 + use: registry.npmmirror.com/use/3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/sort-keys-length/1.0.1: + resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz} + name: sort-keys-length + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + sort-keys: registry.npmmirror.com/sort-keys/1.1.2 + dev: true + + registry.npmmirror.com/sort-keys/1.1.2: + resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sort-keys/-/sort-keys-1.1.2.tgz} + name: sort-keys + version: 1.1.2 + engines: {node: '>=0.10.0'} + dependencies: + is-plain-obj: registry.npmmirror.com/is-plain-obj/1.1.0 + dev: true + + registry.npmmirror.com/sort-keys/2.0.0: + resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sort-keys/-/sort-keys-2.0.0.tgz} + name: sort-keys + version: 2.0.0 + engines: {node: '>=4'} + dependencies: + is-plain-obj: registry.npmmirror.com/is-plain-obj/1.1.0 + dev: true + + registry.npmmirror.com/sortablejs/1.14.0: + resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz} + name: sortablejs + version: 1.14.0 + dev: false + + registry.npmmirror.com/sortablejs/1.15.0: + resolution: {integrity: sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.0.tgz} + name: sortablejs + version: 1.15.0 + dev: false + + registry.npmmirror.com/source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz} + name: source-map-js + version: 1.0.2 + engines: {node: '>=0.10.0'} + + registry.npmmirror.com/source-map-resolve/0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz} + name: source-map-resolve + version: 0.5.3 + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: registry.npmmirror.com/atob/2.1.2 + decode-uri-component: registry.npmmirror.com/decode-uri-component/0.2.2 + resolve-url: registry.npmmirror.com/resolve-url/0.2.1 + source-map-url: registry.npmmirror.com/source-map-url/0.4.1 + urix: registry.npmmirror.com/urix/0.1.0 + dev: true + + registry.npmmirror.com/source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz} + name: source-map-support + version: 0.5.21 + dependencies: + buffer-from: registry.npmmirror.com/buffer-from/1.1.2 + source-map: registry.npmmirror.com/source-map/0.6.1 + dev: true + + registry.npmmirror.com/source-map-url/0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz} + name: source-map-url + version: 0.4.1 + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + + registry.npmmirror.com/source-map/0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz} + name: source-map + version: 0.5.7 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz} + name: source-map + version: 0.6.1 + engines: {node: '>=0.10.0'} + + registry.npmmirror.com/source-map/0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz} + name: source-map + version: 0.7.4 + engines: {node: '>= 8'} + dev: true + + registry.npmmirror.com/source-map/0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.8.0-beta.0.tgz} + name: source-map + version: 0.8.0-beta.0 + engines: {node: '>= 8'} + dependencies: + whatwg-url: registry.npmmirror.com/whatwg-url/7.1.0 + dev: true + + registry.npmmirror.com/sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz} + name: sourcemap-codec + version: 1.4.8 + deprecated: Please use @jridgewell/sourcemap-codec instead + + registry.npmmirror.com/spdx-correct/3.1.1: + resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.1.1.tgz} + name: spdx-correct + version: 3.1.1 + dependencies: + spdx-expression-parse: registry.npmmirror.com/spdx-expression-parse/3.0.1 + spdx-license-ids: registry.npmmirror.com/spdx-license-ids/3.0.12 + dev: true + + registry.npmmirror.com/spdx-exceptions/2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz} + name: spdx-exceptions + version: 2.3.0 + dev: true + + registry.npmmirror.com/spdx-expression-parse/3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz} + name: spdx-expression-parse + version: 3.0.1 + dependencies: + spdx-exceptions: registry.npmmirror.com/spdx-exceptions/2.3.0 + spdx-license-ids: registry.npmmirror.com/spdx-license-ids/3.0.12 + dev: true + + registry.npmmirror.com/spdx-license-ids/3.0.12: + resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz} + name: spdx-license-ids + version: 3.0.12 + dev: true + + registry.npmmirror.com/split-string/3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz} + name: split-string + version: 3.1.0 + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: registry.npmmirror.com/extend-shallow/3.0.2 + dev: true + + registry.npmmirror.com/split/1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/split/-/split-1.0.1.tgz} + name: split + version: 1.0.1 + dependencies: + through: registry.npmmirror.com/through/2.3.8 + dev: true + + registry.npmmirror.com/split2/3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/split2/-/split2-3.2.2.tgz} + name: split2 + version: 3.2.2 + dependencies: + readable-stream: registry.npmmirror.com/readable-stream/3.6.1 + dev: true + + registry.npmmirror.com/sprintf-js/1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz} + name: sprintf-js + version: 1.0.3 + dev: true + + registry.npmmirror.com/squeak/1.3.0: + resolution: {integrity: sha512-YQL1ulInM+ev8nXX7vfXsCsDh6IqXlrremc1hzi77776BtpWgYJUMto3UM05GSAaGzJgWekszjoKDrVNB5XG+A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/squeak/-/squeak-1.3.0.tgz} + name: squeak + version: 1.3.0 + engines: {node: '>=0.10.0'} + dependencies: + chalk: registry.npmmirror.com/chalk/1.1.3 + console-stream: registry.npmmirror.com/console-stream/0.1.1 + lpad-align: registry.npmmirror.com/lpad-align/1.1.2 + dev: true + + registry.npmmirror.com/stable/0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz} + name: stable + version: 0.1.8 + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: true + + registry.npmmirror.com/stack-utils/2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz} + name: stack-utils + version: 2.0.6 + engines: {node: '>=10'} + dependencies: + escape-string-regexp: registry.npmmirror.com/escape-string-regexp/2.0.0 + dev: true + + registry.npmmirror.com/static-extend/0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz} + name: static-extend + version: 0.1.2 + engines: {node: '>=0.10.0'} + dependencies: + define-property: registry.npmmirror.com/define-property/0.2.5 + object-copy: registry.npmmirror.com/object-copy/0.1.0 + dev: true + + registry.npmmirror.com/statuses/1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz} + name: statuses + version: 1.5.0 + engines: {node: '>= 0.6'} + dev: true + + registry.npmmirror.com/strict-uri-encode/1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz} + name: strict-uri-encode + version: 1.1.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/string-argv/0.3.1: + resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string-argv/-/string-argv-0.3.1.tgz} + name: string-argv + version: 0.3.1 + engines: {node: '>=0.6.19'} + dev: true + + registry.npmmirror.com/string-length/4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz} + name: string-length + version: 4.0.2 + engines: {node: '>=10'} + dependencies: + char-regex: registry.npmmirror.com/char-regex/1.0.2 + strip-ansi: registry.npmmirror.com/strip-ansi/6.0.1 + dev: true + + registry.npmmirror.com/string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz} + name: string-width + version: 4.2.3 + engines: {node: '>=8'} + dependencies: + emoji-regex: registry.npmmirror.com/emoji-regex/8.0.0 + is-fullwidth-code-point: registry.npmmirror.com/is-fullwidth-code-point/3.0.0 + strip-ansi: registry.npmmirror.com/strip-ansi/6.0.1 + + registry.npmmirror.com/string-width/5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz} + name: string-width + version: 5.1.2 + engines: {node: '>=12'} + dependencies: + eastasianwidth: registry.npmmirror.com/eastasianwidth/0.2.0 + emoji-regex: registry.npmmirror.com/emoji-regex/9.2.2 + strip-ansi: registry.npmmirror.com/strip-ansi/7.0.1 + dev: true + + registry.npmmirror.com/string.prototype.matchall/4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz} + name: string.prototype.matchall + version: 4.0.8 + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + define-properties: registry.npmmirror.com/define-properties/1.2.0 + es-abstract: registry.npmmirror.com/es-abstract/1.21.1 + get-intrinsic: registry.npmmirror.com/get-intrinsic/1.2.0 + has-symbols: registry.npmmirror.com/has-symbols/1.0.3 + internal-slot: registry.npmmirror.com/internal-slot/1.0.5 + regexp.prototype.flags: registry.npmmirror.com/regexp.prototype.flags/1.4.3 + side-channel: registry.npmmirror.com/side-channel/1.0.4 + dev: true + + registry.npmmirror.com/string.prototype.padend/3.1.4: + resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz} + name: string.prototype.padend + version: 3.1.4 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + define-properties: registry.npmmirror.com/define-properties/1.2.0 + es-abstract: registry.npmmirror.com/es-abstract/1.21.1 + dev: true + + registry.npmmirror.com/string.prototype.trimend/1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz} + name: string.prototype.trimend + version: 1.0.6 + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + define-properties: registry.npmmirror.com/define-properties/1.2.0 + es-abstract: registry.npmmirror.com/es-abstract/1.21.1 + dev: true + + registry.npmmirror.com/string.prototype.trimstart/1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz} + name: string.prototype.trimstart + version: 1.0.6 + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + define-properties: registry.npmmirror.com/define-properties/1.2.0 + es-abstract: registry.npmmirror.com/es-abstract/1.21.1 + dev: true + + registry.npmmirror.com/string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz} + name: string_decoder + version: 1.1.1 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer/5.1.2 + dev: true + + registry.npmmirror.com/string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz} + name: string_decoder + version: 1.3.0 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer/5.2.1 + dev: true + + registry.npmmirror.com/stringify-object/3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stringify-object/-/stringify-object-3.3.0.tgz} + name: stringify-object + version: 3.3.0 + engines: {node: '>=4'} + dependencies: + get-own-enumerable-property-symbols: registry.npmmirror.com/get-own-enumerable-property-symbols/3.0.2 + is-obj: registry.npmmirror.com/is-obj/1.0.1 + is-regexp: registry.npmmirror.com/is-regexp/1.0.0 + dev: true + + registry.npmmirror.com/strip-ansi/3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz} + name: strip-ansi + version: 3.0.1 + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: registry.npmmirror.com/ansi-regex/2.1.1 + dev: true + + registry.npmmirror.com/strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz} + name: strip-ansi + version: 6.0.1 + engines: {node: '>=8'} + dependencies: + ansi-regex: registry.npmmirror.com/ansi-regex/5.0.1 + + registry.npmmirror.com/strip-ansi/7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.0.1.tgz} + name: strip-ansi + version: 7.0.1 + engines: {node: '>=12'} + dependencies: + ansi-regex: registry.npmmirror.com/ansi-regex/6.0.1 + dev: true + + registry.npmmirror.com/strip-bom/2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-bom/-/strip-bom-2.0.0.tgz} + name: strip-bom + version: 2.0.0 + engines: {node: '>=0.10.0'} + dependencies: + is-utf8: registry.npmmirror.com/is-utf8/0.2.1 + dev: true + + registry.npmmirror.com/strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz} + name: strip-bom + version: 3.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/strip-bom/4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz} + name: strip-bom + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/strip-comments/2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-comments/-/strip-comments-2.0.1.tgz} + name: strip-comments + version: 2.0.1 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/strip-dirs/2.1.0: + resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-dirs/-/strip-dirs-2.1.0.tgz} + name: strip-dirs + version: 2.1.0 + dependencies: + is-natural-number: registry.npmmirror.com/is-natural-number/4.0.1 + dev: true + + registry.npmmirror.com/strip-eof/1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-eof/-/strip-eof-1.0.0.tgz} + name: strip-eof + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz} + name: strip-final-newline + version: 2.0.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/strip-indent/1.0.1: + resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-indent/-/strip-indent-1.0.1.tgz} + name: strip-indent + version: 1.0.1 + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + get-stdin: registry.npmmirror.com/get-stdin/4.0.1 + dev: true + + registry.npmmirror.com/strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz} + name: strip-indent + version: 3.0.0 + engines: {node: '>=8'} + dependencies: + min-indent: registry.npmmirror.com/min-indent/1.0.1 + dev: true + + registry.npmmirror.com/strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz} + name: strip-json-comments + version: 3.1.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/strip-outer/1.0.1: + resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-outer/-/strip-outer-1.0.1.tgz} + name: strip-outer + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: registry.npmmirror.com/escape-string-regexp/1.0.5 + dev: true + + registry.npmmirror.com/strnum/1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strnum/-/strnum-1.0.5.tgz} + name: strnum + version: 1.0.5 + dev: true + + registry.npmmirror.com/style-search/0.1.0: + resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/style-search/-/style-search-0.1.0.tgz} + name: style-search + version: 0.1.0 + dev: true + + registry.npmmirror.com/stylelint-config-html/1.1.0_kbto3rg3njmczth2rrsgfnlsqa: + resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stylelint-config-html/-/stylelint-config-html-1.1.0.tgz} + id: registry.npmmirror.com/stylelint-config-html/1.1.0 + name: stylelint-config-html + version: 1.1.0 + engines: {node: ^12 || >=14} + peerDependencies: + postcss-html: ^1.0.0 + stylelint: '>=14.0.0' + dependencies: + postcss-html: registry.npmmirror.com/postcss-html/1.5.0 + stylelint: registry.npmmirror.com/stylelint/14.16.1 + dev: true + + registry.npmmirror.com/stylelint-config-prettier/9.0.5_stylelint@14.16.1: + resolution: {integrity: sha512-U44lELgLZhbAD/xy/vncZ2Pq8sh2TnpiPvo38Ifg9+zeioR+LAkHu0i6YORIOxFafZoVg0xqQwex6e6F25S5XA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stylelint-config-prettier/-/stylelint-config-prettier-9.0.5.tgz} + id: registry.npmmirror.com/stylelint-config-prettier/9.0.5 + name: stylelint-config-prettier + version: 9.0.5 + engines: {node: '>= 12'} + hasBin: true + peerDependencies: + stylelint: '>= 11.x < 15' + dependencies: + stylelint: registry.npmmirror.com/stylelint/14.16.1 + dev: true + + registry.npmmirror.com/stylelint-config-recommended-vue/1.4.0_kbto3rg3njmczth2rrsgfnlsqa: + resolution: {integrity: sha512-DVJqyX2KvMCn9U0+keL12r7xlsH26K4Vg8NrIZuq5MoF7g82DpMp326Om4E0Q+Il1o+bTHuUyejf2XAI0iD04Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stylelint-config-recommended-vue/-/stylelint-config-recommended-vue-1.4.0.tgz} + id: registry.npmmirror.com/stylelint-config-recommended-vue/1.4.0 + name: stylelint-config-recommended-vue + version: 1.4.0 + engines: {node: ^12 || >=14} + peerDependencies: + postcss-html: ^1.0.0 + stylelint: '>=14.0.0' + dependencies: + postcss-html: registry.npmmirror.com/postcss-html/1.5.0 + semver: registry.npmmirror.com/semver/7.3.8 + stylelint: registry.npmmirror.com/stylelint/14.16.1 + stylelint-config-html: registry.npmmirror.com/stylelint-config-html/1.1.0_kbto3rg3njmczth2rrsgfnlsqa + stylelint-config-recommended: registry.npmmirror.com/stylelint-config-recommended/7.0.0_stylelint@14.16.1 + dev: true + + registry.npmmirror.com/stylelint-config-recommended/7.0.0_stylelint@14.16.1: + resolution: {integrity: sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz} + id: registry.npmmirror.com/stylelint-config-recommended/7.0.0 + name: stylelint-config-recommended + version: 7.0.0 + peerDependencies: + stylelint: ^14.4.0 + dependencies: + stylelint: registry.npmmirror.com/stylelint/14.16.1 + dev: true + + registry.npmmirror.com/stylelint-config-standard/25.0.0_stylelint@14.16.1: + resolution: {integrity: sha512-21HnP3VSpaT1wFjFvv9VjvOGDtAviv47uTp3uFmzcN+3Lt+RYRv6oAplLaV51Kf792JSxJ6svCJh/G18E9VnCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stylelint-config-standard/-/stylelint-config-standard-25.0.0.tgz} + id: registry.npmmirror.com/stylelint-config-standard/25.0.0 + name: stylelint-config-standard + version: 25.0.0 + peerDependencies: + stylelint: ^14.4.0 + dependencies: + stylelint: registry.npmmirror.com/stylelint/14.16.1 + stylelint-config-recommended: registry.npmmirror.com/stylelint-config-recommended/7.0.0_stylelint@14.16.1 + dev: true + + registry.npmmirror.com/stylelint-order/5.0.0_stylelint@14.16.1: + resolution: {integrity: sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stylelint-order/-/stylelint-order-5.0.0.tgz} + id: registry.npmmirror.com/stylelint-order/5.0.0 + name: stylelint-order + version: 5.0.0 + peerDependencies: + stylelint: ^14.0.0 + dependencies: + postcss: registry.npmmirror.com/postcss/8.4.21 + postcss-sorting: registry.npmmirror.com/postcss-sorting/7.0.1_postcss@8.4.21 + stylelint: registry.npmmirror.com/stylelint/14.16.1 + dev: true + + registry.npmmirror.com/stylelint/14.16.1: + resolution: {integrity: sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stylelint/-/stylelint-14.16.1.tgz} + name: stylelint + version: 14.16.1 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + '@csstools/selector-specificity': registry.npmmirror.com/@csstools/selector-specificity/2.1.1_wajs5nedgkikc5pcuwett7legi + balanced-match: registry.npmmirror.com/balanced-match/2.0.0 + colord: registry.npmmirror.com/colord/2.9.3 + cosmiconfig: registry.npmmirror.com/cosmiconfig/7.1.0 + css-functions-list: registry.npmmirror.com/css-functions-list/3.1.0 + debug: registry.npmmirror.com/debug/4.3.4 + fast-glob: registry.npmmirror.com/fast-glob/3.2.12 + fastest-levenshtein: registry.npmmirror.com/fastest-levenshtein/1.0.16 + file-entry-cache: registry.npmmirror.com/file-entry-cache/6.0.1 + global-modules: registry.npmmirror.com/global-modules/2.0.0 + globby: registry.npmmirror.com/globby/11.1.0 + globjoin: registry.npmmirror.com/globjoin/0.1.4 + html-tags: registry.npmmirror.com/html-tags/3.2.0 + ignore: registry.npmmirror.com/ignore/5.2.4 + import-lazy: registry.npmmirror.com/import-lazy/4.0.0 + imurmurhash: registry.npmmirror.com/imurmurhash/0.1.4 + is-plain-object: registry.npmmirror.com/is-plain-object/5.0.0 + known-css-properties: registry.npmmirror.com/known-css-properties/0.26.0 + mathml-tag-names: registry.npmmirror.com/mathml-tag-names/2.1.3 + meow: registry.npmmirror.com/meow/9.0.0 + micromatch: registry.npmmirror.com/micromatch/4.0.5 + normalize-path: registry.npmmirror.com/normalize-path/3.0.0 + picocolors: registry.npmmirror.com/picocolors/1.0.0 + postcss: registry.npmmirror.com/postcss/8.4.21 + postcss-media-query-parser: registry.npmmirror.com/postcss-media-query-parser/0.2.3 + postcss-resolve-nested-selector: registry.npmmirror.com/postcss-resolve-nested-selector/0.1.1 + postcss-safe-parser: registry.npmmirror.com/postcss-safe-parser/6.0.0_postcss@8.4.21 + postcss-selector-parser: registry.npmmirror.com/postcss-selector-parser/6.0.11 + postcss-value-parser: registry.npmmirror.com/postcss-value-parser/4.2.0 + resolve-from: registry.npmmirror.com/resolve-from/5.0.0 + string-width: registry.npmmirror.com/string-width/4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi/6.0.1 + style-search: registry.npmmirror.com/style-search/0.1.0 + supports-hyperlinks: registry.npmmirror.com/supports-hyperlinks/2.3.0 + svg-tags: registry.npmmirror.com/svg-tags/1.0.0 + table: registry.npmmirror.com/table/6.8.1 + v8-compile-cache: registry.npmmirror.com/v8-compile-cache/2.3.0 + write-file-atomic: registry.npmmirror.com/write-file-atomic/4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/supports-color/2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz} + name: supports-color + version: 2.0.0 + engines: {node: '>=0.8.0'} + dev: true + + registry.npmmirror.com/supports-color/3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-3.2.3.tgz} + name: supports-color + version: 3.2.3 + engines: {node: '>=0.8.0'} + dependencies: + has-flag: registry.npmmirror.com/has-flag/1.0.0 + dev: true + + registry.npmmirror.com/supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz} + name: supports-color + version: 5.5.0 + engines: {node: '>=4'} + dependencies: + has-flag: registry.npmmirror.com/has-flag/3.0.0 + dev: true + + registry.npmmirror.com/supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz} + name: supports-color + version: 7.2.0 + engines: {node: '>=8'} + dependencies: + has-flag: registry.npmmirror.com/has-flag/4.0.0 + dev: true + + registry.npmmirror.com/supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz} + name: supports-color + version: 8.1.1 + engines: {node: '>=10'} + dependencies: + has-flag: registry.npmmirror.com/has-flag/4.0.0 + dev: true + + registry.npmmirror.com/supports-color/9.3.1: + resolution: {integrity: sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-9.3.1.tgz} + name: supports-color + version: 9.3.1 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/supports-hyperlinks/2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz} + name: supports-hyperlinks + version: 2.3.0 + engines: {node: '>=8'} + dependencies: + has-flag: registry.npmmirror.com/has-flag/4.0.0 + supports-color: registry.npmmirror.com/supports-color/7.2.0 + dev: true + + registry.npmmirror.com/supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz} + name: supports-preserve-symlinks-flag + version: 1.0.0 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/svg-baker/1.7.0: + resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/svg-baker/-/svg-baker-1.7.0.tgz} + name: svg-baker + version: 1.7.0 + dependencies: + bluebird: registry.npmmirror.com/bluebird/3.7.2 + clone: registry.npmmirror.com/clone/2.1.2 + he: registry.npmmirror.com/he/1.2.0 + image-size: registry.npmmirror.com/image-size/0.5.5 + loader-utils: registry.npmmirror.com/loader-utils/1.4.2 + merge-options: registry.npmmirror.com/merge-options/1.0.1 + micromatch: registry.npmmirror.com/micromatch/3.1.0 + postcss: registry.npmmirror.com/postcss/5.2.18 + postcss-prefix-selector: registry.npmmirror.com/postcss-prefix-selector/1.16.0_postcss@5.2.18 + posthtml-rename-id: registry.npmmirror.com/posthtml-rename-id/1.0.12 + posthtml-svg-mode: registry.npmmirror.com/posthtml-svg-mode/1.0.3 + query-string: registry.npmmirror.com/query-string/4.3.4 + traverse: registry.npmmirror.com/traverse/0.6.7 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/svg-tags/1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz} + name: svg-tags + version: 1.0.0 + dev: true + + registry.npmmirror.com/svgo/2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz} + name: svgo + version: 2.8.0 + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': registry.npmmirror.com/@trysound/sax/0.2.0 + commander: registry.npmmirror.com/commander/7.2.0 + css-select: registry.npmmirror.com/css-select/4.3.0 + css-tree: registry.npmmirror.com/css-tree/1.1.3 + csso: registry.npmmirror.com/csso/4.2.0 + picocolors: registry.npmmirror.com/picocolors/1.0.0 + stable: registry.npmmirror.com/stable/0.1.8 + dev: true + + registry.npmmirror.com/symbol-tree/3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz} + name: symbol-tree + version: 3.2.4 + dev: true + + registry.npmmirror.com/systemjs/6.14.0: + resolution: {integrity: sha512-OMf+kFCYG9fLQerUyw/QVIPfZ+lo579R+usrDzSrZAkvMl6B0tHtc4rUP7DFaPCr7Sy6p5DYD4V9OCF1Sp6+vA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/systemjs/-/systemjs-6.14.0.tgz} + name: systemjs + version: 6.14.0 + dev: true + + registry.npmmirror.com/table/6.8.1: + resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/table/-/table-6.8.1.tgz} + name: table + version: 6.8.1 + engines: {node: '>=10.0.0'} + dependencies: + ajv: registry.npmmirror.com/ajv/8.12.0 + lodash.truncate: registry.npmmirror.com/lodash.truncate/4.4.2 + slice-ansi: registry.npmmirror.com/slice-ansi/4.0.0 + string-width: registry.npmmirror.com/string-width/4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi/6.0.1 + dev: true + + registry.npmmirror.com/tar-stream/1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tar-stream/-/tar-stream-1.6.2.tgz} + name: tar-stream + version: 1.6.2 + engines: {node: '>= 0.8.0'} + dependencies: + bl: registry.npmmirror.com/bl/1.2.3 + buffer-alloc: registry.npmmirror.com/buffer-alloc/1.2.0 + end-of-stream: registry.npmmirror.com/end-of-stream/1.4.4 + fs-constants: registry.npmmirror.com/fs-constants/1.0.0 + readable-stream: registry.npmmirror.com/readable-stream/2.3.8 + to-buffer: registry.npmmirror.com/to-buffer/1.1.1 + xtend: registry.npmmirror.com/xtend/4.0.2 + dev: true + + registry.npmmirror.com/temp-dir/1.0.0: + resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/temp-dir/-/temp-dir-1.0.0.tgz} + name: temp-dir + version: 1.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/temp-dir/2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/temp-dir/-/temp-dir-2.0.0.tgz} + name: temp-dir + version: 2.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/tempfile/2.0.0: + resolution: {integrity: sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tempfile/-/tempfile-2.0.0.tgz} + name: tempfile + version: 2.0.0 + engines: {node: '>=4'} + dependencies: + temp-dir: registry.npmmirror.com/temp-dir/1.0.0 + uuid: registry.npmmirror.com/uuid/3.4.0 + dev: true + + registry.npmmirror.com/tempfile/3.0.0: + resolution: {integrity: sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tempfile/-/tempfile-3.0.0.tgz} + name: tempfile + version: 3.0.0 + engines: {node: '>=8'} + dependencies: + temp-dir: registry.npmmirror.com/temp-dir/2.0.0 + uuid: registry.npmmirror.com/uuid/3.4.0 + dev: true + + registry.npmmirror.com/tempy/0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tempy/-/tempy-0.6.0.tgz} + name: tempy + version: 0.6.0 + engines: {node: '>=10'} + dependencies: + is-stream: registry.npmmirror.com/is-stream/2.0.1 + temp-dir: registry.npmmirror.com/temp-dir/2.0.0 + type-fest: registry.npmmirror.com/type-fest/0.16.0 + unique-string: registry.npmmirror.com/unique-string/2.0.0 + dev: true + + registry.npmmirror.com/terminal-link/2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/terminal-link/-/terminal-link-2.1.1.tgz} + name: terminal-link + version: 2.1.1 + engines: {node: '>=8'} + dependencies: + ansi-escapes: registry.npmmirror.com/ansi-escapes/4.3.2 + supports-hyperlinks: registry.npmmirror.com/supports-hyperlinks/2.3.0 + dev: true + + registry.npmmirror.com/terser/5.16.5: + resolution: {integrity: sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/terser/-/terser-5.16.5.tgz} + name: terser + version: 5.16.5 + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': registry.npmmirror.com/@jridgewell/source-map/0.3.2 + acorn: registry.npmmirror.com/acorn/8.8.2 + commander: registry.npmmirror.com/commander/2.20.3 + source-map-support: registry.npmmirror.com/source-map-support/0.5.21 + dev: true + + registry.npmmirror.com/test-exclude/6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz} + name: test-exclude + version: 6.0.0 + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema/0.1.3 + glob: registry.npmmirror.com/glob/7.2.3 + minimatch: registry.npmmirror.com/minimatch/3.1.2 + dev: true + + registry.npmmirror.com/text-extensions/1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/text-extensions/-/text-extensions-1.9.0.tgz} + name: text-extensions + version: 1.9.0 + engines: {node: '>=0.10'} + dev: true + + registry.npmmirror.com/text-table/0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz} + name: text-table + version: 0.2.0 + dev: true + + registry.npmmirror.com/throat/6.0.2: + resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/throat/-/throat-6.0.2.tgz} + name: throat + version: 6.0.2 + dev: true + + registry.npmmirror.com/through/2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/through/-/through-2.3.8.tgz} + name: through + version: 2.3.8 + dev: true + + registry.npmmirror.com/through2/2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz} + name: through2 + version: 2.0.5 + dependencies: + readable-stream: registry.npmmirror.com/readable-stream/2.3.8 + xtend: registry.npmmirror.com/xtend/4.0.2 + dev: true + + registry.npmmirror.com/through2/4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/through2/-/through2-4.0.2.tgz} + name: through2 + version: 4.0.2 + dependencies: + readable-stream: registry.npmmirror.com/readable-stream/3.6.1 + dev: true + + registry.npmmirror.com/timed-out/4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/timed-out/-/timed-out-4.0.1.tgz} + name: timed-out + version: 4.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/tiny-emitter/2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz} + name: tiny-emitter + version: 2.1.0 + dev: false + + registry.npmmirror.com/tinycolor2/1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.6.0.tgz} + name: tinycolor2 + version: 1.6.0 + dev: true + + registry.npmmirror.com/tinymce/5.10.7: + resolution: {integrity: sha512-9UUjaO0R7FxcFo0oxnd1lMs7H+D0Eh+dDVo5hKbVe1a+VB0nit97vOqlinj+YwgoBDt6/DSCUoWqAYlLI8BLYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tinymce/-/tinymce-5.10.7.tgz} + name: tinymce + version: 5.10.7 + dev: false + + registry.npmmirror.com/tmp/0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz} + name: tmp + version: 0.0.33 + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: registry.npmmirror.com/os-tmpdir/1.0.2 + dev: true + + registry.npmmirror.com/tmpl/1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz} + name: tmpl + version: 1.0.5 + dev: true + + registry.npmmirror.com/to-buffer/1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-buffer/-/to-buffer-1.1.1.tgz} + name: to-buffer + version: 1.1.1 + dev: true + + registry.npmmirror.com/to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz} + name: to-fast-properties + version: 2.0.0 + engines: {node: '>=4'} + + registry.npmmirror.com/to-object-path/0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz} + name: to-object-path + version: 0.3.0 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of/3.2.2 + dev: true + + registry.npmmirror.com/to-regex-range/2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz} + name: to-regex-range + version: 2.1.1 + engines: {node: '>=0.10.0'} + dependencies: + is-number: registry.npmmirror.com/is-number/3.0.0 + repeat-string: registry.npmmirror.com/repeat-string/1.6.1 + dev: true + + registry.npmmirror.com/to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz} + name: to-regex-range + version: 5.0.1 + engines: {node: '>=8.0'} + dependencies: + is-number: registry.npmmirror.com/is-number/7.0.0 + dev: true + + registry.npmmirror.com/to-regex/3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz} + name: to-regex + version: 3.0.2 + engines: {node: '>=0.10.0'} + dependencies: + define-property: registry.npmmirror.com/define-property/2.0.2 + extend-shallow: registry.npmmirror.com/extend-shallow/3.0.2 + regex-not: registry.npmmirror.com/regex-not/1.0.2 + safe-regex: registry.npmmirror.com/safe-regex/1.1.0 + dev: true + + registry.npmmirror.com/token-stream/1.0.0: + resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/token-stream/-/token-stream-1.0.0.tgz} + name: token-stream + version: 1.0.0 + dev: true + + registry.npmmirror.com/tough-cookie/4.1.2: + resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.2.tgz} + name: tough-cookie + version: 4.1.2 + engines: {node: '>=6'} + dependencies: + psl: registry.npmmirror.com/psl/1.9.0 + punycode: registry.npmmirror.com/punycode/2.3.0 + universalify: registry.npmmirror.com/universalify/0.2.0 + url-parse: registry.npmmirror.com/url-parse/1.5.10 + dev: true + + registry.npmmirror.com/tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz} + name: tr46 + version: 0.0.3 + dev: true + + registry.npmmirror.com/tr46/1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tr46/-/tr46-1.0.1.tgz} + name: tr46 + version: 1.0.1 + dependencies: + punycode: registry.npmmirror.com/punycode/2.3.0 + dev: true + + registry.npmmirror.com/tr46/2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tr46/-/tr46-2.1.0.tgz} + name: tr46 + version: 2.1.0 + engines: {node: '>=8'} + dependencies: + punycode: registry.npmmirror.com/punycode/2.3.0 + dev: true + + registry.npmmirror.com/traverse/0.6.7: + resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/traverse/-/traverse-0.6.7.tgz} + name: traverse + version: 0.6.7 + dev: true + + registry.npmmirror.com/trim-newlines/1.0.0: + resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/trim-newlines/-/trim-newlines-1.0.0.tgz} + name: trim-newlines + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/trim-newlines/3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/trim-newlines/-/trim-newlines-3.0.1.tgz} + name: trim-newlines + version: 3.0.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/trim-repeated/1.0.0: + resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/trim-repeated/-/trim-repeated-1.0.0.tgz} + name: trim-repeated + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: registry.npmmirror.com/escape-string-regexp/1.0.5 + dev: true + + registry.npmmirror.com/ts-jest/27.1.5_n4jzo3ixy42kfaqevs43wjx5ui: + resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ts-jest/-/ts-jest-27.1.5.tgz} + id: registry.npmmirror.com/ts-jest/27.1.5 + name: ts-jest + version: 27.1.5 + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@types/jest': ^27.0.0 + babel-jest: '>=27.0.0 <28' + esbuild: '*' + jest: ^27.0.0 + typescript: '>=3.8 <5.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/jest': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@types/jest': registry.npmmirror.com/@types/jest/27.5.2 + bs-logger: registry.npmmirror.com/bs-logger/0.2.6 + fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify/2.1.0 + jest: registry.npmmirror.com/jest/27.5.1_ts-node@10.9.1 + jest-util: registry.npmmirror.com/jest-util/27.5.1 + json5: registry.npmmirror.com/json5/2.2.3 + lodash.memoize: registry.npmmirror.com/lodash.memoize/4.1.2 + make-error: registry.npmmirror.com/make-error/1.3.6 + semver: registry.npmmirror.com/semver/7.3.8 + typescript: registry.npmmirror.com/typescript/4.9.5 + yargs-parser: registry.npmmirror.com/yargs-parser/20.2.9 + dev: true + + registry.npmmirror.com/ts-node/10.9.1_cin3sed6ohfsopbmt6orxeb4o4: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz} + id: registry.npmmirror.com/ts-node/10.9.1 + name: ts-node + version: 10.9.1 + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': registry.npmmirror.com/@cspotcode/source-map-support/0.8.1 + '@tsconfig/node10': registry.npmmirror.com/@tsconfig/node10/1.0.9 + '@tsconfig/node12': registry.npmmirror.com/@tsconfig/node12/1.0.11 + '@tsconfig/node14': registry.npmmirror.com/@tsconfig/node14/1.0.3 + '@tsconfig/node16': registry.npmmirror.com/@tsconfig/node16/1.0.3 + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + acorn: registry.npmmirror.com/acorn/8.8.2 + acorn-walk: registry.npmmirror.com/acorn-walk/8.2.0 + arg: registry.npmmirror.com/arg/4.1.3 + create-require: registry.npmmirror.com/create-require/1.1.1 + diff: registry.npmmirror.com/diff/4.0.2 + make-error: registry.npmmirror.com/make-error/1.3.6 + typescript: registry.npmmirror.com/typescript/4.9.5 + v8-compile-cache-lib: registry.npmmirror.com/v8-compile-cache-lib/3.0.1 + yn: registry.npmmirror.com/yn/3.1.1 + dev: true + + registry.npmmirror.com/tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz} + name: tslib + version: 1.14.1 + dev: true + + registry.npmmirror.com/tslib/2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz} + name: tslib + version: 2.3.0 + dev: false + + registry.npmmirror.com/tslib/2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tslib/-/tslib-2.5.0.tgz} + name: tslib + version: 2.5.0 + dev: true + + registry.npmmirror.com/tsutils/3.21.0_typescript@4.9.5: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz} + id: registry.npmmirror.com/tsutils/3.21.0 + name: tsutils + version: 3.21.0 + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: registry.npmmirror.com/tslib/1.14.1 + typescript: registry.npmmirror.com/typescript/4.9.5 + dev: true + + registry.npmmirror.com/tunnel-agent/0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz} + name: tunnel-agent + version: 0.6.0 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer/5.2.1 + dev: true + + registry.npmmirror.com/type-check/0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz} + name: type-check + version: 0.3.2 + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: registry.npmmirror.com/prelude-ls/1.1.2 + dev: true + + registry.npmmirror.com/type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz} + name: type-check + version: 0.4.0 + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: registry.npmmirror.com/prelude-ls/1.2.1 + dev: true + + registry.npmmirror.com/type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz} + name: type-detect + version: 4.0.8 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/type-fest/0.11.0: + resolution: {integrity: sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.11.0.tgz} + name: type-fest + version: 0.11.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/type-fest/0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.16.0.tgz} + name: type-fest + version: 0.16.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/type-fest/0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.18.1.tgz} + name: type-fest + version: 0.18.1 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz} + name: type-fest + version: 0.20.2 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz} + name: type-fest + version: 0.21.3 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/type-fest/0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.6.0.tgz} + name: type-fest + version: 0.6.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/type-fest/0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.8.1.tgz} + name: type-fest + version: 0.8.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/typed-array-length/1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz} + name: typed-array-length + version: 1.0.4 + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + for-each: registry.npmmirror.com/for-each/0.3.3 + is-typed-array: registry.npmmirror.com/is-typed-array/1.1.10 + dev: true + + registry.npmmirror.com/typedarray-to-buffer/3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz} + name: typedarray-to-buffer + version: 3.1.5 + dependencies: + is-typedarray: registry.npmmirror.com/is-typedarray/1.0.0 + dev: true + + registry.npmmirror.com/typescript/4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/typescript/-/typescript-4.9.5.tgz} + name: typescript + version: 4.9.5 + engines: {node: '>=4.2.0'} + hasBin: true + + registry.npmmirror.com/uglify-js/3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/uglify-js/-/uglify-js-3.17.4.tgz} + name: uglify-js + version: 3.17.4 + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/unbox-primitive/1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz} + name: unbox-primitive + version: 1.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind/1.0.2 + has-bigints: registry.npmmirror.com/has-bigints/1.0.2 + has-symbols: registry.npmmirror.com/has-symbols/1.0.3 + which-boxed-primitive: registry.npmmirror.com/which-boxed-primitive/1.0.2 + dev: true + + registry.npmmirror.com/unbzip2-stream/1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz} + name: unbzip2-stream + version: 1.4.3 + dependencies: + buffer: registry.npmmirror.com/buffer/5.7.1 + through: registry.npmmirror.com/through/2.3.8 + dev: true + + registry.npmmirror.com/unicode-canonical-property-names-ecmascript/2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz} + name: unicode-canonical-property-names-ecmascript + version: 2.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/unicode-match-property-ecmascript/2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz} + name: unicode-match-property-ecmascript + version: 2.0.0 + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: registry.npmmirror.com/unicode-canonical-property-names-ecmascript/2.0.0 + unicode-property-aliases-ecmascript: registry.npmmirror.com/unicode-property-aliases-ecmascript/2.1.0 + dev: true + + registry.npmmirror.com/unicode-match-property-value-ecmascript/2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz} + name: unicode-match-property-value-ecmascript + version: 2.1.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/unicode-property-aliases-ecmascript/2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz} + name: unicode-property-aliases-ecmascript + version: 2.1.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/union-value/1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz} + name: union-value + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + arr-union: registry.npmmirror.com/arr-union/3.1.0 + get-value: registry.npmmirror.com/get-value/2.0.6 + is-extendable: registry.npmmirror.com/is-extendable/0.1.1 + set-value: registry.npmmirror.com/set-value/2.0.1 + dev: true + + registry.npmmirror.com/union/0.5.0: + resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/union/-/union-0.5.0.tgz} + name: union + version: 0.5.0 + engines: {node: '>= 0.8.0'} + dependencies: + qs: registry.npmmirror.com/qs/6.11.0 + dev: true + + registry.npmmirror.com/unique-string/2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unique-string/-/unique-string-2.0.0.tgz} + name: unique-string + version: 2.0.0 + engines: {node: '>=8'} + dependencies: + crypto-random-string: registry.npmmirror.com/crypto-random-string/2.0.0 + dev: true + + registry.npmmirror.com/universal-user-agent/6.0.0: + resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz} + name: universal-user-agent + version: 6.0.0 + dev: true + + registry.npmmirror.com/universalify/0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz} + name: universalify + version: 0.2.0 + engines: {node: '>= 4.0.0'} + dev: true + + registry.npmmirror.com/universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz} + name: universalify + version: 2.0.0 + engines: {node: '>= 10.0.0'} + dev: true + + registry.npmmirror.com/unpipe/1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz} + name: unpipe + version: 1.0.0 + engines: {node: '>= 0.8'} + dev: true + + registry.npmmirror.com/unset-value/1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz} + name: unset-value + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + has-value: registry.npmmirror.com/has-value/0.3.1 + isobject: registry.npmmirror.com/isobject/3.0.1 + dev: true + + registry.npmmirror.com/upath/1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz} + name: upath + version: 1.2.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/upath/2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/upath/-/upath-2.0.1.tgz} + name: upath + version: 2.0.1 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/update-browserslist-db/1.0.10_browserslist@4.21.5: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz} + id: registry.npmmirror.com/update-browserslist-db/1.0.10 + name: update-browserslist-db + version: 1.0.10 + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: registry.npmmirror.com/browserslist/4.21.5 + escalade: registry.npmmirror.com/escalade/3.1.1 + picocolors: registry.npmmirror.com/picocolors/1.0.0 + dev: true + + registry.npmmirror.com/upper-case-first/2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/upper-case-first/-/upper-case-first-2.0.2.tgz} + name: upper-case-first + version: 2.0.2 + dependencies: + tslib: registry.npmmirror.com/tslib/2.5.0 + dev: true + + registry.npmmirror.com/upper-case/2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/upper-case/-/upper-case-2.0.2.tgz} + name: upper-case + version: 2.0.2 + dependencies: + tslib: registry.npmmirror.com/tslib/2.5.0 + dev: true + + registry.npmmirror.com/uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz} + name: uri-js + version: 4.4.1 + dependencies: + punycode: registry.npmmirror.com/punycode/2.3.0 + dev: true + + registry.npmmirror.com/urix/0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz} + name: urix + version: 0.1.0 + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + registry.npmmirror.com/url-join/4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/url-join/-/url-join-4.0.1.tgz} + name: url-join + version: 4.0.1 + dev: true + + registry.npmmirror.com/url-parse-lax/1.0.0: + resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz} + name: url-parse-lax + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + prepend-http: registry.npmmirror.com/prepend-http/1.0.4 + dev: true + + registry.npmmirror.com/url-parse-lax/3.0.0: + resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz} + name: url-parse-lax + version: 3.0.0 + engines: {node: '>=4'} + dependencies: + prepend-http: registry.npmmirror.com/prepend-http/2.0.0 + dev: true + + registry.npmmirror.com/url-parse/1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz} + name: url-parse + version: 1.5.10 + dependencies: + querystringify: registry.npmmirror.com/querystringify/2.2.0 + requires-port: registry.npmmirror.com/requires-port/1.0.0 + dev: true + + registry.npmmirror.com/url-to-options/1.0.1: + resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/url-to-options/-/url-to-options-1.0.1.tgz} + name: url-to-options + version: 1.0.1 + engines: {node: '>= 4'} + dev: true + + registry.npmmirror.com/use/3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/use/-/use-3.1.1.tgz} + name: use + version: 3.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz} + name: util-deprecate + version: 1.0.2 + dev: true + + registry.npmmirror.com/utils-merge/1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz} + name: utils-merge + version: 1.0.1 + engines: {node: '>= 0.4.0'} + dev: true + + registry.npmmirror.com/uuid/3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz} + name: uuid + version: 3.4.0 + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + registry.npmmirror.com/v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz} + name: v8-compile-cache-lib + version: 3.0.1 + dev: true + + registry.npmmirror.com/v8-compile-cache/2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz} + name: v8-compile-cache + version: 2.3.0 + dev: true + + registry.npmmirror.com/v8-to-istanbul/8.1.1: + resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz} + name: v8-to-istanbul + version: 8.1.1 + engines: {node: '>=10.12.0'} + dependencies: + '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage/2.0.4 + convert-source-map: registry.npmmirror.com/convert-source-map/1.9.0 + source-map: registry.npmmirror.com/source-map/0.7.4 + dev: true + + registry.npmmirror.com/validate-npm-package-license/3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz} + name: validate-npm-package-license + version: 3.0.4 + dependencies: + spdx-correct: registry.npmmirror.com/spdx-correct/3.1.1 + spdx-expression-parse: registry.npmmirror.com/spdx-expression-parse/3.0.1 + dev: true + + registry.npmmirror.com/vary/1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz} + name: vary + version: 1.1.2 + engines: {node: '>= 0.8'} + dev: true + + registry.npmmirror.com/vditor/3.9.0: + resolution: {integrity: sha512-CLLtrexUY/LGN1Lp1iu242Uq9GuNP98UTXFRY9hjTNFkpVH9L4M3jrQ9yIZ711zYwsl78GxKeskuU7WieA96ow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vditor/-/vditor-3.9.0.tgz} + name: vditor + version: 3.9.0 + dependencies: + diff-match-patch: registry.npmmirror.com/diff-match-patch/1.0.5 + dev: false + + registry.npmmirror.com/vite-plugin-compression/0.5.1_vite@3.2.5: + resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz} + id: registry.npmmirror.com/vite-plugin-compression/0.5.1 + name: vite-plugin-compression + version: 0.5.1 + peerDependencies: + vite: '>=2.0.0' + dependencies: + chalk: registry.npmmirror.com/chalk/4.1.2 + debug: registry.npmmirror.com/debug/4.3.4 + fs-extra: registry.npmmirror.com/fs-extra/10.1.0 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/vite-plugin-html/3.2.0_vite@3.2.5: + resolution: {integrity: sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-html/-/vite-plugin-html-3.2.0.tgz} + id: registry.npmmirror.com/vite-plugin-html/3.2.0 + name: vite-plugin-html + version: 3.2.0 + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@rollup/pluginutils': registry.npmmirror.com/@rollup/pluginutils/4.2.1 + colorette: registry.npmmirror.com/colorette/2.0.19 + connect-history-api-fallback: registry.npmmirror.com/connect-history-api-fallback/1.6.0 + consola: registry.npmmirror.com/consola/2.15.3 + dotenv: registry.npmmirror.com/dotenv/16.0.3 + dotenv-expand: registry.npmmirror.com/dotenv-expand/8.0.3 + ejs: registry.npmmirror.com/ejs/3.1.8 + fast-glob: registry.npmmirror.com/fast-glob/3.2.12 + fs-extra: registry.npmmirror.com/fs-extra/10.1.0 + html-minifier-terser: registry.npmmirror.com/html-minifier-terser/6.1.0 + node-html-parser: registry.npmmirror.com/node-html-parser/5.4.2 + pathe: registry.npmmirror.com/pathe/0.2.0 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + dev: true + + registry.npmmirror.com/vite-plugin-imagemin/0.6.1_vite@3.2.5: + resolution: {integrity: sha512-cP7LDn8euPrji7WYtDoNQpJEB9nkMxJHm/A+QZnvMrrCSuyo/clpMy/T1v7suDXPBavsDiDdFdVQB5p7VGD2cg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-imagemin/-/vite-plugin-imagemin-0.6.1.tgz} + id: registry.npmmirror.com/vite-plugin-imagemin/0.6.1 + name: vite-plugin-imagemin + version: 0.6.1 + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@types/imagemin': registry.npmmirror.com/@types/imagemin/7.0.1 + '@types/imagemin-gifsicle': registry.npmmirror.com/@types/imagemin-gifsicle/7.0.1 + '@types/imagemin-jpegtran': registry.npmmirror.com/@types/imagemin-jpegtran/5.0.1 + '@types/imagemin-mozjpeg': registry.npmmirror.com/@types/imagemin-mozjpeg/8.0.1 + '@types/imagemin-optipng': registry.npmmirror.com/@types/imagemin-optipng/5.2.1 + '@types/imagemin-svgo': registry.npmmirror.com/@types/imagemin-svgo/10.0.2 + '@types/imagemin-webp': registry.npmmirror.com/@types/imagemin-webp/7.0.0 + '@types/svgo': registry.npmmirror.com/@types/svgo/2.6.4 + chalk: registry.npmmirror.com/chalk/4.1.2 + debug: registry.npmmirror.com/debug/4.3.4 + esbuild: registry.npmmirror.com/esbuild/0.14.54 + fs-extra: registry.npmmirror.com/fs-extra/10.1.0 + gifsicle: registry.npmmirror.com/gifsicle/5.2.0 + imagemin: registry.npmmirror.com/imagemin/7.0.1 + imagemin-gifsicle: registry.npmmirror.com/imagemin-gifsicle/7.0.0 + imagemin-jpegtran: registry.npmmirror.com/imagemin-jpegtran/7.0.0 + imagemin-mozjpeg: registry.npmmirror.com/imagemin-mozjpeg/9.0.0 + imagemin-optipng: registry.npmmirror.com/imagemin-optipng/8.0.0 + imagemin-pngquant: registry.npmmirror.com/imagemin-pngquant/9.0.2 + imagemin-svgo: registry.npmmirror.com/imagemin-svgo/9.0.0 + imagemin-webp: registry.npmmirror.com/imagemin-webp/6.1.0 + jpegtran-bin: registry.npmmirror.com/jpegtran-bin/6.0.1 + pathe: registry.npmmirror.com/pathe/0.2.0 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/vite-plugin-mkcert/1.13.3_vite@3.2.5: + resolution: {integrity: sha512-cuAbOb6bHyTMhha9YimL6ZB/WoCcFy8d3uaf5n5Ovgybix1yvEu3pxARy2HjC5LJIS1qq6fFXG0+oj6/XMUapA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-mkcert/-/vite-plugin-mkcert-1.13.3.tgz} + id: registry.npmmirror.com/vite-plugin-mkcert/1.13.3 + name: vite-plugin-mkcert + version: 1.13.3 + engines: {node: '>=v16.7.0'} + peerDependencies: + vite: '>=3' + dependencies: + '@octokit/rest': registry.npmmirror.com/@octokit/rest/19.0.7 + axios: registry.npmmirror.com/axios/1.3.4_debug@4.3.4 + debug: registry.npmmirror.com/debug/4.3.4 + picocolors: registry.npmmirror.com/picocolors/1.0.0 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + registry.npmmirror.com/vite-plugin-mock/2.9.6_umj7dnwtpamrulvvz5fh6e7doq: + resolution: {integrity: sha512-/Rm59oPppe/ncbkSrUuAxIQihlI2YcBmnbR4ST1RA2VzM1C0tEQc1KlbQvnUGhXECAGTaQN2JyasiwXP6EtKgg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-mock/-/vite-plugin-mock-2.9.6.tgz} + id: registry.npmmirror.com/vite-plugin-mock/2.9.6 + name: vite-plugin-mock + version: 2.9.6 + engines: {node: '>=12.0.0'} + peerDependencies: + mockjs: '>=1.1.0' + vite: '>=2.0.0' + dependencies: + '@rollup/plugin-node-resolve': registry.npmmirror.com/@rollup/plugin-node-resolve/13.3.0_rollup@2.79.1 + '@types/mockjs': registry.npmmirror.com/@types/mockjs/1.0.7 + chalk: registry.npmmirror.com/chalk/4.1.2 + chokidar: registry.npmmirror.com/chokidar/3.5.3 + connect: registry.npmmirror.com/connect/3.7.0 + debug: registry.npmmirror.com/debug/4.3.4 + esbuild: registry.npmmirror.com/esbuild/0.11.3 + fast-glob: registry.npmmirror.com/fast-glob/3.2.12 + mockjs: registry.npmmirror.com/mockjs/1.1.0 + path-to-regexp: registry.npmmirror.com/path-to-regexp/6.2.1 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + transitivePeerDependencies: + - rollup + - supports-color + dev: true + + registry.npmmirror.com/vite-plugin-optimize-persist/0.1.2_hixcczfrsvi4wedfdfr7z5co24: + resolution: {integrity: sha512-H/Ebn2kZO8PvwUF08SsT5K5xMJNCWKoGX71+e9/ER3yNj7GHiFjNQlvGg5ih/zEx09MZ9m7WCxOwmEKbeIVzww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-optimize-persist/-/vite-plugin-optimize-persist-0.1.2.tgz} + id: registry.npmmirror.com/vite-plugin-optimize-persist/0.1.2 + name: vite-plugin-optimize-persist + version: 0.1.2 + peerDependencies: + vite: ^2.0.0 + vite-plugin-package-config: ^0.1.0 + dependencies: + debug: registry.npmmirror.com/debug/4.3.4 + fs-extra: registry.npmmirror.com/fs-extra/10.1.0 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + vite-plugin-package-config: registry.npmmirror.com/vite-plugin-package-config/0.1.1_vite@3.2.5 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/vite-plugin-package-config/0.1.1_vite@3.2.5: + resolution: {integrity: sha512-w9B3I8ZnqoyhlbzimXjXNk85imrMZgvI9m8f6j3zonK5IVA5KXzpT+PZOHlDz8lqh1vqvoEI1uhy+ZDoLAiA/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-package-config/-/vite-plugin-package-config-0.1.1.tgz} + id: registry.npmmirror.com/vite-plugin-package-config/0.1.1 + name: vite-plugin-package-config + version: 0.1.1 + peerDependencies: + vite: ^2.0.0 + dependencies: + debug: registry.npmmirror.com/debug/4.3.4 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/vite-plugin-purge-icons/0.8.2_vite@3.2.5: + resolution: {integrity: sha512-rW3RcNKj7QY3M7wcnwYVc3Ig+WwSQQ/Z67v+xdtk/8MA+ON05A3zc3qGaPdi6+8BUKYDpqvviKYiuLgRjleUOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-purge-icons/-/vite-plugin-purge-icons-0.8.2.tgz} + id: registry.npmmirror.com/vite-plugin-purge-icons/0.8.2 + name: vite-plugin-purge-icons + version: 0.8.2 + engines: {node: '>= 12'} + peerDependencies: + vite: ^2.0.0-beta.3 || ^3.0.0 + dependencies: + '@purge-icons/core': registry.npmmirror.com/@purge-icons/core/0.8.0 + '@purge-icons/generated': registry.npmmirror.com/@purge-icons/generated/0.8.1 + rollup-plugin-purge-icons: registry.npmmirror.com/rollup-plugin-purge-icons/0.8.1 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + registry.npmmirror.com/vite-plugin-pwa/0.12.8_vite@3.2.5: + resolution: {integrity: sha512-pSiFHmnJGMQJJL8aJzQ8SaraZBSBPMGvGUkCNzheIq9UQCEk/eP3UmANNmS9eupuhIpTK8AdxTOHcaMcAqAbCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-pwa/-/vite-plugin-pwa-0.12.8.tgz} + id: registry.npmmirror.com/vite-plugin-pwa/0.12.8 + name: vite-plugin-pwa + version: 0.12.8 + peerDependencies: + vite: ^2.0.0 || ^3.0.0-0 + dependencies: + debug: registry.npmmirror.com/debug/4.3.4 + fast-glob: registry.npmmirror.com/fast-glob/3.2.12 + pretty-bytes: registry.npmmirror.com/pretty-bytes/6.1.0 + rollup: registry.npmmirror.com/rollup/2.79.1 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + workbox-build: registry.npmmirror.com/workbox-build/6.5.4 + workbox-window: registry.npmmirror.com/workbox-window/6.5.4 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: true + + registry.npmmirror.com/vite-plugin-style-import/2.0.0_vite@3.2.5: + resolution: {integrity: sha512-qtoHQae5dSUQPo/rYz/8p190VU5y19rtBaeV7ryLa/AYAU/e9CG89NrN/3+k7MR8mJy/GPIu91iJ3zk9foUOSA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-style-import/-/vite-plugin-style-import-2.0.0.tgz} + id: registry.npmmirror.com/vite-plugin-style-import/2.0.0 + name: vite-plugin-style-import + version: 2.0.0 + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@rollup/pluginutils': registry.npmmirror.com/@rollup/pluginutils/4.2.1 + change-case: registry.npmmirror.com/change-case/4.1.2 + console: registry.npmmirror.com/console/0.7.2 + es-module-lexer: registry.npmmirror.com/es-module-lexer/0.9.3 + fs-extra: registry.npmmirror.com/fs-extra/10.1.0 + magic-string: registry.npmmirror.com/magic-string/0.25.9 + pathe: registry.npmmirror.com/pathe/0.2.0 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + dev: true + + registry.npmmirror.com/vite-plugin-svg-icons/2.0.1_vite@3.2.5: + resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz} + id: registry.npmmirror.com/vite-plugin-svg-icons/2.0.1 + name: vite-plugin-svg-icons + version: 2.0.1 + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@types/svgo': registry.npmmirror.com/@types/svgo/2.6.4 + cors: registry.npmmirror.com/cors/2.8.5 + debug: registry.npmmirror.com/debug/4.3.4 + etag: registry.npmmirror.com/etag/1.8.1 + fs-extra: registry.npmmirror.com/fs-extra/10.1.0 + pathe: registry.npmmirror.com/pathe/0.2.0 + svg-baker: registry.npmmirror.com/svg-baker/1.7.0 + svgo: registry.npmmirror.com/svgo/2.8.0 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/vite-plugin-vue-setup-extend/0.4.0_vite@3.2.5: + resolution: {integrity: sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-vue-setup-extend/-/vite-plugin-vue-setup-extend-0.4.0.tgz} + id: registry.npmmirror.com/vite-plugin-vue-setup-extend/0.4.0 + name: vite-plugin-vue-setup-extend + version: 0.4.0 + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@vue/compiler-sfc': registry.npmmirror.com/@vue/compiler-sfc/3.2.47 + magic-string: registry.npmmirror.com/magic-string/0.25.9 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + dev: true + + registry.npmmirror.com/vite-plugin-windicss/1.8.10_vite@3.2.5: + resolution: {integrity: sha512-scywsuzo46lcTBohspmF0WiwhWEte6p+OUVrX4yr7VMRvLHMHVfLtJReyD5pppjijG7YOwVsZn7XBWWZtF658Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-windicss/-/vite-plugin-windicss-1.8.10.tgz} + id: registry.npmmirror.com/vite-plugin-windicss/1.8.10 + name: vite-plugin-windicss + version: 1.8.10 + peerDependencies: + vite: ^2.0.1 || ^3.0.0 || ^4.0.0 + dependencies: + '@windicss/plugin-utils': registry.npmmirror.com/@windicss/plugin-utils/1.8.10 + debug: registry.npmmirror.com/debug/4.3.4 + kolorist: registry.npmmirror.com/kolorist/1.7.0 + vite: registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m + windicss: registry.npmmirror.com/windicss/3.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/vite/3.2.5_uakuilq6iygkg5ll5cv37w4i7m: + resolution: {integrity: sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite/-/vite-3.2.5.tgz} + id: registry.npmmirror.com/vite/3.2.5 + name: vite + version: 3.2.5 + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': registry.npmmirror.com/@types/node/17.0.45 + esbuild: registry.npmmirror.com/esbuild/0.15.18 + less: registry.npmmirror.com/less/4.1.3 + postcss: registry.npmmirror.com/postcss/8.4.21 + resolve: registry.npmmirror.com/resolve/1.22.1 + rollup: registry.npmmirror.com/rollup/2.79.1 + optionalDependencies: + fsevents: registry.npmmirror.com/fsevents/2.3.2 + dev: true + + registry.npmmirror.com/vscode-jsonrpc/8.1.0: + resolution: {integrity: sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz} + name: vscode-jsonrpc + version: 8.1.0 + engines: {node: '>=14.0.0'} + dev: true + + registry.npmmirror.com/vscode-languageserver-textdocument/1.0.8: + resolution: {integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz} + name: vscode-languageserver-textdocument + version: 1.0.8 + dev: true + + registry.npmmirror.com/vscode-languageserver-types/3.17.3: + resolution: {integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz} + name: vscode-languageserver-types + version: 3.17.3 + dev: true + + registry.npmmirror.com/vscode-uri/3.0.7: + resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.0.7.tgz} + name: vscode-uri + version: 3.0.7 + dev: true + + registry.npmmirror.com/vue-cropper/0.5.8: + resolution: {integrity: sha512-Xgi/aLQCcNCiBTUdovy/i4LWx0G7fQnAENBpDWA3J4i87Zlk9DJRksXrClsQ6nnaFRfQVkMimij5GEvAMaXdYw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-cropper/-/vue-cropper-0.5.8.tgz} + name: vue-cropper + version: 0.5.8 + dev: false + + registry.npmmirror.com/vue-cropperjs/5.0.0_vue@3.2.47: + resolution: {integrity: sha512-RhnC8O33uRZNkn74aiHZwNHnBJOXWlS4P6gsRI0lw4cZlWjKSCywZI9oSI9POlIPI6OYv30jvnHMXGch85tw7w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-cropperjs/-/vue-cropperjs-5.0.0.tgz} + id: registry.npmmirror.com/vue-cropperjs/5.0.0 + name: vue-cropperjs + version: 5.0.0 + peerDependencies: + vue: '>=3.0.0' + dependencies: + cropperjs: registry.npmmirror.com/cropperjs/1.5.13 + vue: registry.npmmirror.com/vue/3.2.47 + dev: false + + registry.npmmirror.com/vue-demi/0.13.11_vue@3.2.47: + resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz} + id: registry.npmmirror.com/vue-demi/0.13.11 + name: vue-demi + version: 0.13.11 + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: registry.npmmirror.com/vue/3.2.47 + dev: false + + registry.npmmirror.com/vue-eslint-parser/8.3.0_eslint@8.35.0: + resolution: {integrity: sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz} + id: registry.npmmirror.com/vue-eslint-parser/8.3.0 + name: vue-eslint-parser + version: 8.3.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: registry.npmmirror.com/debug/4.3.4 + eslint: registry.npmmirror.com/eslint/8.35.0 + eslint-scope: registry.npmmirror.com/eslint-scope/7.1.1 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys/3.3.0 + espree: registry.npmmirror.com/espree/9.4.1 + esquery: registry.npmmirror.com/esquery/1.5.0 + lodash: registry.npmmirror.com/lodash/4.17.21 + semver: registry.npmmirror.com/semver/7.3.8 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/vue-i18n/9.2.2_vue@3.2.47: + resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.2.2.tgz} + id: registry.npmmirror.com/vue-i18n/9.2.2 + name: vue-i18n + version: 9.2.2 + engines: {node: '>= 14'} + peerDependencies: + vue: ^3.0.0 + dependencies: + '@intlify/core-base': registry.npmmirror.com/@intlify/core-base/9.2.2 + '@intlify/shared': registry.npmmirror.com/@intlify/shared/9.2.2 + '@intlify/vue-devtools': registry.npmmirror.com/@intlify/vue-devtools/9.2.2 + '@vue/devtools-api': registry.npmmirror.com/@vue/devtools-api/6.5.0 + vue: registry.npmmirror.com/vue/3.2.47 + dev: false + + registry.npmmirror.com/vue-infinite-scroll/2.0.2: + resolution: {integrity: sha512-n+YghR059YmciANGJh9SsNWRi1YZEBVlODtmnb/12zI+4R72QZSWd+EuZ5mW6auEo/yaJXgxzwsuhvALVnm73A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-infinite-scroll/-/vue-infinite-scroll-2.0.2.tgz} + name: vue-infinite-scroll + version: 2.0.2 + dev: false + + registry.npmmirror.com/vue-json-pretty/2.2.3_vue@3.2.47: + resolution: {integrity: sha512-tJo+4eFclQBt3gJ6EELXNdvo50wDKTZYthwmLpy9YS7UDldeJln5ff+IpdmUglfk+FqLVOX/re0+Ni/EOUPZgw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-json-pretty/-/vue-json-pretty-2.2.3.tgz} + id: registry.npmmirror.com/vue-json-pretty/2.2.3 + name: vue-json-pretty + version: 2.2.3 + engines: {node: '>= 10.0.0', npm: '>= 5.0.0'} + peerDependencies: + vue: '>=3.0.0' + dependencies: + vue: registry.npmmirror.com/vue/3.2.47 + dev: false + + registry.npmmirror.com/vue-observe-visibility/0.4.6: + resolution: {integrity: sha512-xo0CEVdkjSjhJoDdLSvoZoQrw/H2BlzB5jrCBKGZNXN2zdZgMuZ9BKrxXDjNP2AxlcCoKc8OahI3F3r3JGLv2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-observe-visibility/-/vue-observe-visibility-0.4.6.tgz} + name: vue-observe-visibility + version: 0.4.6 + dev: false + + registry.npmmirror.com/vue-print-nb-jeecg/1.0.11: + resolution: {integrity: sha512-oKmXayXokyvm75p5RM+hJes/6NXsBJyeIx9sFjSKgnRxfyscFraFfAj9byb/sy4/P4Pn9FtawqWc5rkgiKHWVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-print-nb-jeecg/-/vue-print-nb-jeecg-1.0.11.tgz} + name: vue-print-nb-jeecg + version: 1.0.11 + dependencies: + babel-plugin-transform-runtime: registry.npmmirror.com/babel-plugin-transform-runtime/6.23.0 + dev: false + + registry.npmmirror.com/vue-resize/0.4.5_vue@3.2.47: + resolution: {integrity: sha512-bhP7MlgJQ8TIkZJXAfDf78uJO+mEI3CaLABLjv0WNzr4CcGRGPIAItyWYnP6LsPA4Oq0WE+suidNs6dgpO4RHg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-resize/-/vue-resize-0.4.5.tgz} + id: registry.npmmirror.com/vue-resize/0.4.5 + name: vue-resize + version: 0.4.5 + peerDependencies: + vue: ^2.3.0 + dependencies: + vue: registry.npmmirror.com/vue/3.2.47 + dev: false + + registry.npmmirror.com/vue-router/4.1.6_vue@3.2.47: + resolution: {integrity: sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-router/-/vue-router-4.1.6.tgz} + id: registry.npmmirror.com/vue-router/4.1.6 + name: vue-router + version: 4.1.6 + peerDependencies: + vue: ^3.2.0 + dependencies: + '@vue/devtools-api': registry.npmmirror.com/@vue/devtools-api/6.5.0 + vue: registry.npmmirror.com/vue/3.2.47 + dev: false + + registry.npmmirror.com/vue-tsc/0.33.9_typescript@4.9.5: + resolution: {integrity: sha512-s/+r4JNsCh4e3MUdsYrjEA8IgPPDzHL5kEah/OznxIHd1XMlYiIkXGdiyU6JE5J+lzXNOKdOlNliqwwpeETQWw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-tsc/-/vue-tsc-0.33.9.tgz} + id: registry.npmmirror.com/vue-tsc/0.33.9 + name: vue-tsc + version: 0.33.9 + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@volar/vue-typescript': registry.npmmirror.com/@volar/vue-typescript/0.33.9 + typescript: registry.npmmirror.com/typescript/4.9.5 + dev: true + + registry.npmmirror.com/vue-types/3.0.2_vue@3.2.47: + resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-types/-/vue-types-3.0.2.tgz} + id: registry.npmmirror.com/vue-types/3.0.2 + name: vue-types + version: 3.0.2 + engines: {node: '>=10.15.0'} + peerDependencies: + vue: ^3.0.0 + dependencies: + is-plain-object: registry.npmmirror.com/is-plain-object/3.0.1 + vue: registry.npmmirror.com/vue/3.2.47 + dev: false + + registry.npmmirror.com/vue-types/4.2.1_vue@3.2.47: + resolution: {integrity: sha512-DNQZmJuOvovLUIp0BENRkdnZHbI0V4e2mNvjAZOAXKD56YGvRchtUYOXA/XqTxdv7Ng5SJLZqRKRpAhm5NLaPQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-types/-/vue-types-4.2.1.tgz} + id: registry.npmmirror.com/vue-types/4.2.1 + name: vue-types + version: 4.2.1 + engines: {node: '>=12.16.0'} + peerDependencies: + vue: ^2.0.0 || ^3.0.0 + dependencies: + is-plain-object: registry.npmmirror.com/is-plain-object/5.0.0 + vue: registry.npmmirror.com/vue/3.2.47 + dev: false + + registry.npmmirror.com/vue-virtual-scroller/1.1.2_vue@3.2.47: + resolution: {integrity: sha512-SkUyc7QHCJFB5h1Fya7LxVizlVzOZZuFVipBGHYoTK8dwLs08bIz/tclvRApYhksaJIm/nn51inzO2UjpGJPMQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-virtual-scroller/-/vue-virtual-scroller-1.1.2.tgz} + id: registry.npmmirror.com/vue-virtual-scroller/1.1.2 + name: vue-virtual-scroller + version: 1.1.2 + peerDependencies: + vue: ^2.6.11 + dependencies: + scrollparent: registry.npmmirror.com/scrollparent/2.0.1 + vue: registry.npmmirror.com/vue/3.2.47 + vue-observe-visibility: registry.npmmirror.com/vue-observe-visibility/0.4.6 + vue-resize: registry.npmmirror.com/vue-resize/0.4.5_vue@3.2.47 + dev: false + + registry.npmmirror.com/vue/3.2.47: + resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue/-/vue-3.2.47.tgz} + name: vue + version: 3.2.47 + dependencies: + '@vue/compiler-dom': registry.npmmirror.com/@vue/compiler-dom/3.2.47 + '@vue/compiler-sfc': registry.npmmirror.com/@vue/compiler-sfc/3.2.47 + '@vue/runtime-dom': registry.npmmirror.com/@vue/runtime-dom/3.2.47 + '@vue/server-renderer': registry.npmmirror.com/@vue/server-renderer/3.2.47_vue@3.2.47 + '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.47 + + registry.npmmirror.com/vuedraggable/4.1.0_vue@3.2.47: + resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vuedraggable/-/vuedraggable-4.1.0.tgz} + id: registry.npmmirror.com/vuedraggable/4.1.0 + name: vuedraggable + version: 4.1.0 + peerDependencies: + vue: ^3.0.1 + dependencies: + sortablejs: registry.npmmirror.com/sortablejs/1.14.0 + vue: registry.npmmirror.com/vue/3.2.47 + dev: false + + registry.npmmirror.com/vxe-table-plugin-antd/3.0.5_vxe-table@4.1.0: + resolution: {integrity: sha512-qZXIxNKSqdvfVncvVopId7byy9FYUW+ygX4vwUhPceHwsUq0eyX5SVX/LLafqfsnkq4l8+EZ4zQ5/xQ6AfZ31Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vxe-table-plugin-antd/-/vxe-table-plugin-antd-3.0.5.tgz} + id: registry.npmmirror.com/vxe-table-plugin-antd/3.0.5 + name: vxe-table-plugin-antd + version: 3.0.5 + peerDependencies: + vxe-table: ^4.0.30 + dependencies: + vxe-table: registry.npmmirror.com/vxe-table/4.1.0_vue@3.2.47+xe-utils@3.5.7 + dev: false + + registry.npmmirror.com/vxe-table/4.1.0_vue@3.2.47+xe-utils@3.5.7: + resolution: {integrity: sha512-FX4nc4ckkQGWG/W94z97KBIGrfZsbcni3pm+4uMzNQUcEgxgchnY78/4PrRC4ZRsHJIMv4mtNrzdfJDCTfA65g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vxe-table/-/vxe-table-4.1.0.tgz} + id: registry.npmmirror.com/vxe-table/4.1.0 + name: vxe-table + version: 4.1.0 + peerDependencies: + vue: ^3.2.2 + xe-utils: ^3.2.0 + dependencies: + vue: registry.npmmirror.com/vue/3.2.47 + xe-utils: registry.npmmirror.com/xe-utils/3.5.7 + dev: false + + registry.npmmirror.com/w3c-hr-time/1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz} + name: w3c-hr-time + version: 1.0.2 + dependencies: + browser-process-hrtime: registry.npmmirror.com/browser-process-hrtime/1.0.0 + dev: true + + registry.npmmirror.com/w3c-xmlserializer/2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz} + name: w3c-xmlserializer + version: 2.0.0 + engines: {node: '>=10'} + dependencies: + xml-name-validator: registry.npmmirror.com/xml-name-validator/3.0.0 + dev: true + + registry.npmmirror.com/walker/1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz} + name: walker + version: 1.0.8 + dependencies: + makeerror: registry.npmmirror.com/makeerror/1.0.12 + dev: true + + registry.npmmirror.com/warning/4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz} + name: warning + version: 4.0.3 + dependencies: + loose-envify: registry.npmmirror.com/loose-envify/1.4.0 + dev: false + + registry.npmmirror.com/wcwidth/1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz} + name: wcwidth + version: 1.0.1 + dependencies: + defaults: registry.npmmirror.com/defaults/1.0.4 + dev: true + + registry.npmmirror.com/webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz} + name: webidl-conversions + version: 3.0.1 + dev: true + + registry.npmmirror.com/webidl-conversions/4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz} + name: webidl-conversions + version: 4.0.2 + dev: true + + registry.npmmirror.com/webidl-conversions/5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz} + name: webidl-conversions + version: 5.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/webidl-conversions/6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz} + name: webidl-conversions + version: 6.1.0 + engines: {node: '>=10.4'} + dev: true + + registry.npmmirror.com/whatwg-encoding/1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz} + name: whatwg-encoding + version: 1.0.5 + dependencies: + iconv-lite: registry.npmmirror.com/iconv-lite/0.4.24 + dev: true + + registry.npmmirror.com/whatwg-encoding/2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz} + name: whatwg-encoding + version: 2.0.0 + engines: {node: '>=12'} + dependencies: + iconv-lite: registry.npmmirror.com/iconv-lite/0.6.3 + dev: true + + registry.npmmirror.com/whatwg-mimetype/2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz} + name: whatwg-mimetype + version: 2.3.0 + dev: true + + registry.npmmirror.com/whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz} + name: whatwg-url + version: 5.0.0 + dependencies: + tr46: registry.npmmirror.com/tr46/0.0.3 + webidl-conversions: registry.npmmirror.com/webidl-conversions/3.0.1 + dev: true + + registry.npmmirror.com/whatwg-url/7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-7.1.0.tgz} + name: whatwg-url + version: 7.1.0 + dependencies: + lodash.sortby: registry.npmmirror.com/lodash.sortby/4.7.0 + tr46: registry.npmmirror.com/tr46/1.0.1 + webidl-conversions: registry.npmmirror.com/webidl-conversions/4.0.2 + dev: true + + registry.npmmirror.com/whatwg-url/8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-8.7.0.tgz} + name: whatwg-url + version: 8.7.0 + engines: {node: '>=10'} + dependencies: + lodash: registry.npmmirror.com/lodash/4.17.21 + tr46: registry.npmmirror.com/tr46/2.1.0 + webidl-conversions: registry.npmmirror.com/webidl-conversions/6.1.0 + dev: true + + registry.npmmirror.com/which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz} + name: which-boxed-primitive + version: 1.0.2 + dependencies: + is-bigint: registry.npmmirror.com/is-bigint/1.0.4 + is-boolean-object: registry.npmmirror.com/is-boolean-object/1.1.2 + is-number-object: registry.npmmirror.com/is-number-object/1.0.7 + is-string: registry.npmmirror.com/is-string/1.0.7 + is-symbol: registry.npmmirror.com/is-symbol/1.0.4 + dev: true + + registry.npmmirror.com/which-module/2.0.0: + resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/which-module/-/which-module-2.0.0.tgz} + name: which-module + version: 2.0.0 + dev: false + + registry.npmmirror.com/which-typed-array/1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.9.tgz} + name: which-typed-array + version: 1.1.9 + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: registry.npmmirror.com/available-typed-arrays/1.0.5 + call-bind: registry.npmmirror.com/call-bind/1.0.2 + for-each: registry.npmmirror.com/for-each/0.3.3 + gopd: registry.npmmirror.com/gopd/1.0.1 + has-tostringtag: registry.npmmirror.com/has-tostringtag/1.0.0 + is-typed-array: registry.npmmirror.com/is-typed-array/1.1.10 + dev: true + + registry.npmmirror.com/which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/which/-/which-1.3.1.tgz} + name: which + version: 1.3.1 + hasBin: true + dependencies: + isexe: registry.npmmirror.com/isexe/2.0.0 + dev: true + + registry.npmmirror.com/which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/which/-/which-2.0.2.tgz} + name: which + version: 2.0.2 + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: registry.npmmirror.com/isexe/2.0.0 + dev: true + + registry.npmmirror.com/windicss/3.5.6: + resolution: {integrity: sha512-P1mzPEjgFMZLX0ZqfFht4fhV/FX8DTG7ERG1fBLiWvd34pTLVReS5CVsewKn9PApSgXnVfPWwvq+qUsRwpnwFA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/windicss/-/windicss-3.5.6.tgz} + name: windicss + version: 3.5.6 + engines: {node: '>= 12'} + hasBin: true + dev: true + + registry.npmmirror.com/word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz} + name: word-wrap + version: 1.2.3 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/wordwrap/1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wordwrap/-/wordwrap-1.0.0.tgz} + name: wordwrap + version: 1.0.0 + dev: true + + registry.npmmirror.com/workbox-background-sync/6.5.4: + resolution: {integrity: sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz} + name: workbox-background-sync + version: 6.5.4 + dependencies: + idb: registry.npmmirror.com/idb/7.1.1 + workbox-core: registry.npmmirror.com/workbox-core/6.5.4 + dev: true + + registry.npmmirror.com/workbox-broadcast-update/6.5.4: + resolution: {integrity: sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz} + name: workbox-broadcast-update + version: 6.5.4 + dependencies: + workbox-core: registry.npmmirror.com/workbox-core/6.5.4 + dev: true + + registry.npmmirror.com/workbox-build/6.5.4: + resolution: {integrity: sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-build/-/workbox-build-6.5.4.tgz} + name: workbox-build + version: 6.5.4 + engines: {node: '>=10.0.0'} + dependencies: + '@apideck/better-ajv-errors': registry.npmmirror.com/@apideck/better-ajv-errors/0.3.6_ajv@8.12.0 + '@babel/core': registry.npmmirror.com/@babel/core/7.21.0 + '@babel/preset-env': registry.npmmirror.com/@babel/preset-env/7.20.2_@babel+core@7.21.0 + '@babel/runtime': registry.npmmirror.com/@babel/runtime/7.21.0 + '@rollup/plugin-babel': registry.npmmirror.com/@rollup/plugin-babel/5.3.1_4tnfxcmsyr7y5qv3uwkivwqysm + '@rollup/plugin-node-resolve': registry.npmmirror.com/@rollup/plugin-node-resolve/11.2.1_rollup@2.79.1 + '@rollup/plugin-replace': registry.npmmirror.com/@rollup/plugin-replace/2.4.2_rollup@2.79.1 + '@surma/rollup-plugin-off-main-thread': registry.npmmirror.com/@surma/rollup-plugin-off-main-thread/2.2.3 + ajv: registry.npmmirror.com/ajv/8.12.0 + common-tags: registry.npmmirror.com/common-tags/1.8.2 + fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify/2.1.0 + fs-extra: registry.npmmirror.com/fs-extra/9.1.0 + glob: registry.npmmirror.com/glob/7.2.3 + lodash: registry.npmmirror.com/lodash/4.17.21 + pretty-bytes: registry.npmmirror.com/pretty-bytes/5.6.0 + rollup: registry.npmmirror.com/rollup/2.79.1 + rollup-plugin-terser: registry.npmmirror.com/rollup-plugin-terser/7.0.2_rollup@2.79.1 + source-map: registry.npmmirror.com/source-map/0.8.0-beta.0 + stringify-object: registry.npmmirror.com/stringify-object/3.3.0 + strip-comments: registry.npmmirror.com/strip-comments/2.0.1 + tempy: registry.npmmirror.com/tempy/0.6.0 + upath: registry.npmmirror.com/upath/1.2.0 + workbox-background-sync: registry.npmmirror.com/workbox-background-sync/6.5.4 + workbox-broadcast-update: registry.npmmirror.com/workbox-broadcast-update/6.5.4 + workbox-cacheable-response: registry.npmmirror.com/workbox-cacheable-response/6.5.4 + workbox-core: registry.npmmirror.com/workbox-core/6.5.4 + workbox-expiration: registry.npmmirror.com/workbox-expiration/6.5.4 + workbox-google-analytics: registry.npmmirror.com/workbox-google-analytics/6.5.4 + workbox-navigation-preload: registry.npmmirror.com/workbox-navigation-preload/6.5.4 + workbox-precaching: registry.npmmirror.com/workbox-precaching/6.5.4 + workbox-range-requests: registry.npmmirror.com/workbox-range-requests/6.5.4 + workbox-recipes: registry.npmmirror.com/workbox-recipes/6.5.4 + workbox-routing: registry.npmmirror.com/workbox-routing/6.5.4 + workbox-strategies: registry.npmmirror.com/workbox-strategies/6.5.4 + workbox-streams: registry.npmmirror.com/workbox-streams/6.5.4 + workbox-sw: registry.npmmirror.com/workbox-sw/6.5.4 + workbox-window: registry.npmmirror.com/workbox-window/6.5.4 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: true + + registry.npmmirror.com/workbox-cacheable-response/6.5.4: + resolution: {integrity: sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz} + name: workbox-cacheable-response + version: 6.5.4 + dependencies: + workbox-core: registry.npmmirror.com/workbox-core/6.5.4 + dev: true + + registry.npmmirror.com/workbox-core/6.5.4: + resolution: {integrity: sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-core/-/workbox-core-6.5.4.tgz} + name: workbox-core + version: 6.5.4 + dev: true + + registry.npmmirror.com/workbox-expiration/6.5.4: + resolution: {integrity: sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-expiration/-/workbox-expiration-6.5.4.tgz} + name: workbox-expiration + version: 6.5.4 + dependencies: + idb: registry.npmmirror.com/idb/7.1.1 + workbox-core: registry.npmmirror.com/workbox-core/6.5.4 + dev: true + + registry.npmmirror.com/workbox-google-analytics/6.5.4: + resolution: {integrity: sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz} + name: workbox-google-analytics + version: 6.5.4 + dependencies: + workbox-background-sync: registry.npmmirror.com/workbox-background-sync/6.5.4 + workbox-core: registry.npmmirror.com/workbox-core/6.5.4 + workbox-routing: registry.npmmirror.com/workbox-routing/6.5.4 + workbox-strategies: registry.npmmirror.com/workbox-strategies/6.5.4 + dev: true + + registry.npmmirror.com/workbox-navigation-preload/6.5.4: + resolution: {integrity: sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz} + name: workbox-navigation-preload + version: 6.5.4 + dependencies: + workbox-core: registry.npmmirror.com/workbox-core/6.5.4 + dev: true + + registry.npmmirror.com/workbox-precaching/6.5.4: + resolution: {integrity: sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-precaching/-/workbox-precaching-6.5.4.tgz} + name: workbox-precaching + version: 6.5.4 + dependencies: + workbox-core: registry.npmmirror.com/workbox-core/6.5.4 + workbox-routing: registry.npmmirror.com/workbox-routing/6.5.4 + workbox-strategies: registry.npmmirror.com/workbox-strategies/6.5.4 + dev: true + + registry.npmmirror.com/workbox-range-requests/6.5.4: + resolution: {integrity: sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz} + name: workbox-range-requests + version: 6.5.4 + dependencies: + workbox-core: registry.npmmirror.com/workbox-core/6.5.4 + dev: true + + registry.npmmirror.com/workbox-recipes/6.5.4: + resolution: {integrity: sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-recipes/-/workbox-recipes-6.5.4.tgz} + name: workbox-recipes + version: 6.5.4 + dependencies: + workbox-cacheable-response: registry.npmmirror.com/workbox-cacheable-response/6.5.4 + workbox-core: registry.npmmirror.com/workbox-core/6.5.4 + workbox-expiration: registry.npmmirror.com/workbox-expiration/6.5.4 + workbox-precaching: registry.npmmirror.com/workbox-precaching/6.5.4 + workbox-routing: registry.npmmirror.com/workbox-routing/6.5.4 + workbox-strategies: registry.npmmirror.com/workbox-strategies/6.5.4 + dev: true + + registry.npmmirror.com/workbox-routing/6.5.4: + resolution: {integrity: sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-routing/-/workbox-routing-6.5.4.tgz} + name: workbox-routing + version: 6.5.4 + dependencies: + workbox-core: registry.npmmirror.com/workbox-core/6.5.4 + dev: true + + registry.npmmirror.com/workbox-strategies/6.5.4: + resolution: {integrity: sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-strategies/-/workbox-strategies-6.5.4.tgz} + name: workbox-strategies + version: 6.5.4 + dependencies: + workbox-core: registry.npmmirror.com/workbox-core/6.5.4 + dev: true + + registry.npmmirror.com/workbox-streams/6.5.4: + resolution: {integrity: sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-streams/-/workbox-streams-6.5.4.tgz} + name: workbox-streams + version: 6.5.4 + dependencies: + workbox-core: registry.npmmirror.com/workbox-core/6.5.4 + workbox-routing: registry.npmmirror.com/workbox-routing/6.5.4 + dev: true + + registry.npmmirror.com/workbox-sw/6.5.4: + resolution: {integrity: sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-sw/-/workbox-sw-6.5.4.tgz} + name: workbox-sw + version: 6.5.4 + dev: true + + registry.npmmirror.com/workbox-window/6.5.4: + resolution: {integrity: sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workbox-window/-/workbox-window-6.5.4.tgz} + name: workbox-window + version: 6.5.4 + dependencies: + '@types/trusted-types': registry.npmmirror.com/@types/trusted-types/2.0.3 + workbox-core: registry.npmmirror.com/workbox-core/6.5.4 + dev: true + + registry.npmmirror.com/wrap-ansi/6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz} + name: wrap-ansi + version: 6.2.0 + engines: {node: '>=8'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles/4.3.0 + string-width: registry.npmmirror.com/string-width/4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi/6.0.1 + + registry.npmmirror.com/wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz} + name: wrap-ansi + version: 7.0.0 + engines: {node: '>=10'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles/4.3.0 + string-width: registry.npmmirror.com/string-width/4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi/6.0.1 + dev: true + + registry.npmmirror.com/wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz} + name: wrappy + version: 1.0.2 + dev: true + + registry.npmmirror.com/write-file-atomic/3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz} + name: write-file-atomic + version: 3.0.3 + dependencies: + imurmurhash: registry.npmmirror.com/imurmurhash/0.1.4 + is-typedarray: registry.npmmirror.com/is-typedarray/1.0.0 + signal-exit: registry.npmmirror.com/signal-exit/3.0.7 + typedarray-to-buffer: registry.npmmirror.com/typedarray-to-buffer/3.1.5 + dev: true + + registry.npmmirror.com/write-file-atomic/4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz} + name: write-file-atomic + version: 4.0.2 + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: registry.npmmirror.com/imurmurhash/0.1.4 + signal-exit: registry.npmmirror.com/signal-exit/3.0.7 + dev: true + + registry.npmmirror.com/ws/7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz} + name: ws + version: 7.5.9 + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + registry.npmmirror.com/xe-utils/3.5.7: + resolution: {integrity: sha512-3H+fDBKBR2wLJgyA7k9C/w1Xljx6Maml5ukV0WDY06HjYyGs2FEz6XhcwRCLIDXX4pBP3Gu0nX9DbCeuuRA2Ew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/xe-utils/-/xe-utils-3.5.7.tgz} + name: xe-utils + version: 3.5.7 + dev: false + + registry.npmmirror.com/xml-name-validator/3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz} + name: xml-name-validator + version: 3.0.0 + dev: true + + registry.npmmirror.com/xmlchars/2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz} + name: xmlchars + version: 2.2.0 + dev: true + + registry.npmmirror.com/xss/1.0.14: + resolution: {integrity: sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/xss/-/xss-1.0.14.tgz} + name: xss + version: 1.0.14 + engines: {node: '>= 0.10.0'} + hasBin: true + dependencies: + commander: registry.npmmirror.com/commander/2.20.3 + cssfilter: registry.npmmirror.com/cssfilter/0.0.10 + dev: false + + registry.npmmirror.com/xtend/4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz} + name: xtend + version: 4.0.2 + engines: {node: '>=0.4'} + dev: true + + registry.npmmirror.com/y18n/4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz} + name: y18n + version: 4.0.3 + dev: false + + registry.npmmirror.com/y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz} + name: y18n + version: 5.0.8 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/yallist/2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz} + name: yallist + version: 2.1.2 + dev: true + + registry.npmmirror.com/yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz} + name: yallist + version: 3.1.1 + dev: true + + registry.npmmirror.com/yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz} + name: yallist + version: 4.0.0 + dev: true + + registry.npmmirror.com/yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz} + name: yaml + version: 1.10.2 + engines: {node: '>= 6'} + dev: true + + registry.npmmirror.com/yargs-parser/18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz} + name: yargs-parser + version: 18.1.3 + engines: {node: '>=6'} + dependencies: + camelcase: registry.npmmirror.com/camelcase/5.3.1 + decamelize: registry.npmmirror.com/decamelize/1.2.0 + dev: false + + registry.npmmirror.com/yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz} + name: yargs-parser + version: 20.2.9 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/yargs-parser/21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz} + name: yargs-parser + version: 21.1.1 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/yargs/15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz} + name: yargs + version: 15.4.1 + engines: {node: '>=8'} + dependencies: + cliui: registry.npmmirror.com/cliui/6.0.0 + decamelize: registry.npmmirror.com/decamelize/1.2.0 + find-up: registry.npmmirror.com/find-up/4.1.0 + get-caller-file: registry.npmmirror.com/get-caller-file/2.0.5 + require-directory: registry.npmmirror.com/require-directory/2.1.1 + require-main-filename: registry.npmmirror.com/require-main-filename/2.0.0 + set-blocking: registry.npmmirror.com/set-blocking/2.0.0 + string-width: registry.npmmirror.com/string-width/4.2.3 + which-module: registry.npmmirror.com/which-module/2.0.0 + y18n: registry.npmmirror.com/y18n/4.0.3 + yargs-parser: registry.npmmirror.com/yargs-parser/18.1.3 + dev: false + + registry.npmmirror.com/yargs/16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz} + name: yargs + version: 16.2.0 + engines: {node: '>=10'} + dependencies: + cliui: registry.npmmirror.com/cliui/7.0.4 + escalade: registry.npmmirror.com/escalade/3.1.1 + get-caller-file: registry.npmmirror.com/get-caller-file/2.0.5 + require-directory: registry.npmmirror.com/require-directory/2.1.1 + string-width: registry.npmmirror.com/string-width/4.2.3 + y18n: registry.npmmirror.com/y18n/5.0.8 + yargs-parser: registry.npmmirror.com/yargs-parser/20.2.9 + dev: true + + registry.npmmirror.com/yargs/17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yargs/-/yargs-17.7.1.tgz} + name: yargs + version: 17.7.1 + engines: {node: '>=12'} + dependencies: + cliui: registry.npmmirror.com/cliui/8.0.1 + escalade: registry.npmmirror.com/escalade/3.1.1 + get-caller-file: registry.npmmirror.com/get-caller-file/2.0.5 + require-directory: registry.npmmirror.com/require-directory/2.1.1 + string-width: registry.npmmirror.com/string-width/4.2.3 + y18n: registry.npmmirror.com/y18n/5.0.8 + yargs-parser: registry.npmmirror.com/yargs-parser/21.1.1 + dev: true + + registry.npmmirror.com/yauzl/2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz} + name: yauzl + version: 2.10.0 + dependencies: + buffer-crc32: registry.npmmirror.com/buffer-crc32/0.2.13 + fd-slicer: registry.npmmirror.com/fd-slicer/1.1.0 + dev: true + + registry.npmmirror.com/yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz} + name: yn + version: 3.1.1 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz} + name: yocto-queue + version: 0.1.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/zrender/5.4.1: + resolution: {integrity: sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/zrender/-/zrender-5.4.1.tgz} + name: zrender + version: 5.4.1 + dependencies: + tslib: registry.npmmirror.com/tslib/2.3.0 + dev: false diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..a47ef4f --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {}, + }, +}; diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 0000000..f16d810 --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,20 @@ +module.exports = { + printWidth: 150, + tabWidth: 2, + useTabs: false, + semi: true, //语句末尾使用分号 + vueIndentScriptAndStyle: true, + singleQuote: true, // 使用单引号 + quoteProps: 'as-needed', + bracketSpacing: true, + trailingComma: 'es5', + jsxBracketSameLine: false, + 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..ddd5fb3965f1b5d13ca315d62cd1057f10fa2c8a GIT binary patch literal 430 zcmZQzU<5(|0R|u`!7zi7fkBLcfuS?N&z+Y`iVMi(_4IHF0@6Sg3<4Z%KvMqm|3o0g zSRCZ;#IWw1%u67LCEd~2k%3`jKlh(RRv@3Vz$3Dlfr0NZ2s0kfUy%aTpzG=47-Hdn zcJf{?=0Jhg&stj3l2R8YJQe1!Ysi?Ge!(y$-MHy%Y5S-yTxO!O73KL zdKoCr~CPyi)*J{&Mx3Nv%_1}>06)f?(IFDvQGP)ZtO@gIqXqwAEwOfBjYr`+$E@o~kXoz92Cy*E7Co#edc;G%bX%G6H8 z2%oB|{-F24^uVgLONFfmOAnRwy}f=VST3`m#qj8rXE{Z`))w;YTFB1x@B19q`+t+J V6wDIebrKkw44$rjF6*2UngI2dskHzA literal 0 HcmV?d00001 diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8072ced742bd19a66596899cad918338ef71df40 GIT binary patch literal 7519 zcmcgx_cvV8w^w6CFlwSt^fF2$M2iwe?`4c`f*^VsC4^w2i#kM$7SRS{qIZ)JOhicZ zl0@{H5Cp-y`M$N@`v=~7Kb&>%x%;!v-FNSEK6{^g5{wPCXs@zgB_Sc9)zQ{4B_Sb& z{%fEsz?0A?&r!gI+E?2ufP{pG@n0hyUx@fiLc+zMqoHOVQm|9#mCR)s`t+-x9#e(N zB*vY?ZK#fE?qrN7=yHL_J=mto)S?P+GEr?FHO*35S?O$cwUqe*m4>R$O^z{oH4!Vb zL=v?bhz5=OaNg_M3HphPG2Phakf`vqkZ0GeU4xl|s&f^CgLmgoQK)2qBFK=P9kO-Zu&6i3p_0cIr$At#WL_^2XCzR`kcNIFT8 zq)+ccpd>%9{9l5M`)G!UY3qaiVVN5hi}L&3?~^fbuqD|gipBy9G7lKM!g zolP`8^5-dxdMsZ7(Lnl-_8ldrg~S+#8x~%OW?9(t-31J#p5tNT%u$8E<;qRajegRA zE&ccn28bXVbl{=Qw=rgn!##S!xAC``En07P@@IK;YI=jwNV%PQQhoV39`=F^Rqh0b zXAqP?&*i5L8vc2%D2bc;GINo6gQA1UOCYRRhkitw}DBZkpa2 z^e4O((B62UmCc_v^G808O~j>NrkecYQ=H?Y=?JNhHVc@!LyiOw>0yPBLhrc1tooF5 zdnr>?5*R~=L8Io;pVWR-rioHqXuNRAhXE7w)2o?cX91hD7rjq~i40)Y-!E%}>FLnv zxN+0rL=hv~FcdhO4+33RQS{dhau&3H#u`hRAu7so(cN3|j&=~KcF7h*6&zrO%qU8{ ztQpUWe%8vcrCGM?mWGA7J5*P+Yn;HW zA^np}-~LSAOFVgH{5(~sTH970MZmVkUhY7Pvc1(1-)L=olKEb*KaCgDJ?2DF9jqc) zG~ne+vpN}jdji9ojA+UW93L@V&KuEQ-2DErJp~4n@t`oPH6E`(fsDHDd2s~E(?i|g z8WbN9ki(#2m+}_cBcC=ZkRhWEJi8;nE2Z4JrJPN>#b2zW%dFQvOm@h3chi7bzbXi9IUmE`db=z0OejiFlT(4xNWfz9444>yjF z0u-(@e@FVFDfU->vqjy#$US9?vI%}acQaCG58Jm;bnG&`zv*oBnN9L?gJZX=cj!|# zgg_Qd9ak3ZWb*vVU8V5vd1(A==_e(PhN00BE?eD*WJgjor6K+#uWzOSM&xr}XB60w zc`a$4=z;H$;~1qS7lS~3pN}X~1xU~ON^(rBGYS&M3%ZT1T}^`yY+SGCg=frCA)~_3 zj4;dFZ6+y#V|U_late=R`;oQ}f_)Z<&_B(9rb z^f2PC1IHR+^#Falfg{F{uBOv4u=MxlD{giz~<|CeLnv99TU z$AccF7n!Qv+~TMN%PwZgn4ybq!6>L6STbIjo98{tV8X1PuQZD6cIq3}g*n3Dicczh0H}fB56l| zy0=l*n&Cb1PGn?6Yi~1XYd@9ra~S7g6qzt3QmsPiGHFPyf^ulf)^CER%Y(mn-l_Ks zw`&a`85mG{D%UgbD3i;dR5p>L(l}d)+A3kA6MQ3lCmFFx}pH8Azj85E0z{A zvnMaQ9Ozo7W*!H8=8p*4-*D!dye^9d(X=}WyoZD6FWxPn5Rc4AwVBV)EDwKVdVLGomL)K$s0cMIV3=v8BRVipE z%Wf!IC{sTRKkd1`LJ-}Q>YU(2Q!apqe=aXen`FW6v!m|hoK+HQ4NH00qj1F>yhyei zxmy~xD1W57UsaJcZQH-$Iwjkd;|UtOB4!olwy|@f$>YVWfU!5Tp2=#i25vGZ60@|0 zwtVjgs)Jbr@82;J8O%&%4y@4^?-Q}!y)F94GDDx;3m|=OklC9r7QEScd;tn5Yx{~; zzaRUQy#H-7SDWmqsb!+rc}JCioI&>4x~~5p#rHEDPs`;$(U#bLSZEgTVbfn&k)ho} z!%+91H4AP*pyU9p-hIW3ePJG$!QrQ)Mp33vUi`37>g1l=ksQa}h;1?;(!hJC(~~U9 zyqT6v*>W?3Hj@+ddc>cfNmHC5)m&{atJGT0%0FgWt{%@fMY;4$Rb?K34cOG5*E{*a z+5U@ZJH~~~AMuGxali7TtaJ&`MB8vzY=m>TGj3hTt)*e)fsfY8iiaE6SM)bIso5r? zMBgS(}-$u5@yc=vqZ2|+ zYCjg#XprtJvlc_m3=zM=o?rD6z9H2}VEB;?G=5A@L3B2|RWo8(wJ=30*(mJFTOc-B z`Q7Znxv}ZmQSpJLWesjM+kTHU{Mk{4JC~exeX^>EZ)E8>iJe8Q+*anYGJ@4XD6g6J zZ;vnXU6%*?j9xUW07KZSD9F9^^u2rAPvy$0oq_%zXub;OUXO9t$BlD`&R+g8R)Ey5 zO{LP6c8>BrJ9aX&J@r@Yy1eB)Aq%1@C^fYn56?bDx3Vi4`WG%<%Hi>(1hO^bjBL4^ zb+imt(>=q=md$`6{MO?cj6=?ml9gsog-f9f@@!$bNSHjVnT#jhqkkVnD-pF0o`MxyNQuOon;fEusMh+oz3NNo& zp{N*GL;4QOV%A?AyWRZNIexyG@{?s!hqo?(ad77R@`LlII^ZK%5?Wbd%joeZQ==ZW zIuPO*>T^#n%fyb+y9)bJfgby|aH@)p%4l4#UL6mYhQpss-d}lLPMA?OFJ`F>^Q_x8 z-5VKg={<8rY2-s)68x63LM^PY)SNv>*KtuG1&;y-kSBni3r*RUyo-I1m`w@`8+J&j zcZ+=jvGhKr4@m#AW0Xu?ZC$C(ok9_QLWf*#AVE_)KAkIyhskGTS-%u7(vtkjphC9{ z)Q^wSmP^J>zAUp3o))|gdqGbiGyZneQ~yCd*Li1ubX#!cCXg+Jza7=Td!SI28z--^clwGUqIf^6d6RR~UmT&lG0^)JSmYnAu+55(VRq!!^%#lNC zG^KsO@~;J@FWROnp~6XidPuX0LiY9;N(l64B46s>YKdm_I8oi|!_zx%iCp?LK=hTg zE`s!p7ne)epW?0peNHXzxe;}7VIRKFG7mfQ0;y>nv%m^#gE@B&j6;9B>F;>-^n#EK z8i-HS39nc^R!a8QM|(Ov=;mYIK%lsf-z5iZxQf1GMxX6EQiEu){(pRyyv%kt&ui>^ z%vv7(R(^biK<2@DvDJDu)s3|sB$?PNWkh10;(7)3;IsRRMbB`$stCttZyn+*L|Z$j zr&(UaSdbCO#L!467LJ=G_iSlMxjYr1D;6e4MseLIx4B>)Bs`+WEeyohi2|BQt8KX# zqkftQ7Qh^JZRxfw3609~8~CP(Aq`X*k%AkiOS(KVT|Ud3yqkjJg-jwz4Hy0VCJ}70Zz^L-yA# zlKkGRE0kc?Y3DNkfbNY2BSxf%Djm%>!_n>3@^Fkg0Of_^G%Gs%6c;D{p4NkrRX_!- z;M-9%)K`@V7)iBO$lM1i;ROLY1A0dDO3I6}KkUr2mxX}|&n*E%*sV1VIM6We{sRwq zk1v!$ujc#LgeBsb)ew$6N%)^Py@FPzHW;h_;lDFqTiDV{<*1$4G6KY@xRo&}m7GJV zOI>m_<$2$zI}=C`xI1#>hI8}J%K)B8`Sjz-Ld;Qnz6OFF_lFJJ5L997jvT|WT=V{t z(-n`q1C(#a8-AAlI};#1D!`97Q!%k#=`z6RImSpPm8n}fqrC0oXinDY@(sZV2}f@; z6?8c@11qAuA>eeP+!<}m^iL}e6ARM&cjq1!YRCkY+&LL==Y`r0BBSgQ{Sgw5$HrHi zVRb;hZteSxVwquW1NK7L@qrJ|^1j#Y0q02A(GXL-vNq@@fy&u} zP?uBIdP{c*J(iaiNL3TQb?85`PcbqnDZBFqpsneO`cUYhaT2IT5Qxm@SlnNQB^u-e z1@iDkOp?E;#&e<3pQ?CH{>|rDtR$-S4u6&mwe#dpr^jzw7JKmp?GP-tpYN^g&(Ye@ z>XQuDqrpCyyb!PJRF1+>g+`po3zlpZoVY(ZIQu=PZF1S`%!F5^dRk<`u*lC~@l$oFPO|j!oNgU>efQ{WPSpbE^En1iJ%3=KbMotCr}9r2*0~zN z$1Y*%lm6om&(ObwXQ+L?7C%h$^&uhnlcYGeu?@J$w68jxvdTvslG3Q}DzD+#gYFh} z=8Mo8s3N#NNm(r>hg+o#8_vGqGrzmR{YPd>l)f3}4I<#t-WXF?jbPkO5D@~;SV0+QT7;jk&pCf@JG0>) z+9WDL&m}||;D8o6R*1M|ELc;3Up{G-gsL1^fog7o^kVe!f1TGBIz{ieV6tGNTi7Hc z*K71;jTI58@(2TJLKQ;Dq=-LJ0i#`=?;OfC&Nw`%qvoixzuhrgDES*tb#7+(w%B{8 z>hAkc12+-|IO!OB2mkm_pLFlrRxnFum!=N$_bzrUFRH$af9ASFLKsd9Jj?DXOjxjm zXJ}+DfQXlEaG2D6HxjhWP_?C9&m9ZADH!pH%>C}~yXtCa7m}kuBR^l0?9MC;T~%xR zaGRzFP2}J1>~faj^6s4-dp`yw8wpZ?pXuIS(9**|Z4Gl_2yK)LcbOM*MkTq_2AoX_ zp5)%8UvU-5z%Xl>RFfs4Q3oAM;r3#}g%VD)R)>bIxBR@6&f!7sQly00vW`vzuEh4B z46~QwnYvc6%Y65H!`0Ed5NB0H*n(P%P}FM?1f1`IKD?~RsOgB45aMvGtW&kk``sIa zmU&l1{lts-Na;a-&&fUUE?Hp3NPvi75K$=68IyD8dY2M>>`ojct>3;oJBV^9gHs&> zbr8<9Ftl=M#8_JT6RkH`^9(&d3lz|Sv*WRn@)wehL-SR(RxVm}d}74Q&>3=Z zZK7`u?kz*_aQcYrViZn43U@T^yP`QDoSE1tQ8VV!Z8Ht0tML%rOYlmkjm91M`mDFX ztXA}y#hIoXaxP1nb~5wTf^kz2?7ewLxCMo|fY^i*yt(#4RBj<+D`IizOFt(x=AZP$ zaRW8AUnW2sm4dn6qH?((x75}5;Zy&3fp>czFzG-Z^mmmJkH!q$bC-vzi#sZXYfN$* zY$sdxGL!81dp*Lcy0;M-PT(L;13%w}?>*%PW7h{YavOzeOlC@i_GB}2P8z}#Bf7+Y zZYu^m*h!HvOv#oeV zi!zr?kArWb5p)~6nIn5=i*m7|Y3yVk7VsZa zrk`{Aa#!x`*y+1VT_fZhObmO&NA48@~Fnk37;M!xQ^ z$uRvq&on>f{k}*B65|OVj3)%$p@fUpcv=~rl`?o)G&Y43wSF5-`$d#>|05?-G)5g? z;&9+y;@#+E2+^D~olbmhKZWx&!V-EO{CXt&So@-y5)8jJQi|Oz6CBujs@%5p*_317av=t%t3AmI*RtBx zR6Oyj8kQD=V~&pNFl|P{%Wss1_1w386LHpLNDH%-dgAn z{yx;`@_`V>nI1P+VMWXl?V#xANxL{@yFB!sU9^H#>Q(WlIOZEk`2EsCcCt5YJHkZM z^4iCM`L#vv-&@1(B6*I1&Btbe%t`sjTCvPj4-I%V-aOPkZ&b$OVz9R8aQXN8zfdut z%e6UODE;dubF7)Wzeu074wM#p+OU(E74}-sPTJ25*QT;7B~KV=x3+)?z8apIDcx>U`Kdnxa$V#fjig5{k>OBeIR59 z1Zq&HEIbvh%4(Aogm=j}IJThR6>lmRC2p=MFv0j#e!le&sPL(@im$W2f}Hr)M&)cp zCco#|m?>)JEoLMeiXR6fteCUEM@uDFYPRGUyK4cqHSp|YWs5WwO~IS7mExCeS^843fM01tb}vHm-U`&Z zX%##Vn#EY8L(kMQe|%JBKu=_;8Xii_x`St`3^#6Ic9ix$h0R=Rk6~3s(1sq_`Az+N zxu~J&LYQDixSa9spGSbUlor$!fi1bxnV}W%3)ssJUQJfTwxh44xo`wCfOkZm(l4m# zL7-;WI%0q6o==t*c1p*L8M**IdyT)UVQ(9JVqo#W>j^b-h78HJH0Qb`<1AFGsW>A| zPS!9xnMBu9vI!9bTpkmCX5S_pRUpf@Lm@F-4Z({sdYha{Moh)rZ7N97T(gXp1reo2 zJMX=uOWl^pR08Fh{#t`K%;Qh-*Q`qsvvIyg$_C?V_q0B^R|28kSs7akIQ>nH`zBFqPS%$=lpJ&P4vTZoG@=jz{Am!J=nz z{Mvs|)=L{L!!p!M;!#ryDM9-e5zXhF%>c}6=%N%pATn zQLC!NTlLuL+QhZ?^Twh*SLvF;=DC{`lcmyyY=8XFhXpx4 zE?I6x**}I0D3Df5Rbk5y(w;YJs6ieG&5C5X7(}f!7l|g7*8HTD{5tRk%eKvmc1ahy z{=Os53pEv3R(Rjag~&WR>Lq5@eE2HI$KeYL|JdR!5K-Ew`_|&Z_mH$jExq=nAWx!b zBDVRjB8U9u)t7|21siSy+6~_!3YRH~%8y7m8f1(A$wZgY( zI}RE@q6GhkZ}8g(jOlAVs|z-$$4?U83fSHRz4e`Si1`@WPxYfVd-UCL32&Nbt}sZ$ z!m)HJq6Eu-@PZeAo;4VJIabrMI)BPo7A>KMULpDVw-$k@PtN!iRfpX#g$#*oA>d06 zfzPmX1?#j;s;EdP!5TNcWp3VFfUZA%|+fm=EhE~4Aa*VYO4u59CkdS9jbmu`cKd0 zW z#6hqxeYaeHWLA{19lRNs;#j4|J{9(1F#w}HdumdgCB^(LUdG@a4|o;ny~8B7ChzSU ztMXT+Sgh^C>EBR=MXDn1tu&9mzrA`r#*HqgQL-jp81L`4^&?;#JgWkRkIMgj7NYR3 zYI%4^B9YYU$(}>O^b4QBRuR`LN6cs$80U#;XL0Z?`DN5=&%78{d}6kRWI&$5r5eI) zIQ_koyEp~orMxmh*nV)+w9`|^`I-0E-%oL>&+7&j2GV<3gUaf!LW!cAyD-JbI*mx) zstpQcA4Q7_LoipW&>U7Hl3Q;oL6e-%3U*Ly&7W8-Avh%(P@xKDt<2E&lwh1bzR-#A zI%AXPjBv0Y|4GT|wQ+rD-FknGWtjp7fx3O@>qj^TTulvlR>yhgKc{@Su5154r+@!@ g*!U+Z{;!HMEkh{m?@wjm#FRt_W~fnj-!b~X00$cqH2?qr literal 0 HcmV?d00001 diff --git a/public/resource/img/logo.png b/public/resource/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8072ced742bd19a66596899cad918338ef71df40 GIT binary patch literal 7519 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 literal 0 HcmV?d00001 diff --git a/public/resource/img/pwa-192x192.png b/public/resource/img/pwa-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..00fb815215e1fcb171d1c62fca6c54018663cb72 GIT binary patch literal 12205 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 s+6jera.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}")}catch(c){console&&console.log(c)}}a=function(){var c,h=document.createElement("div");h.innerHTML=l._iconfont_svg_string_3814468,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(c=document.body).firstChild?v(h,c.firstChild):c.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(t=function(){document.removeEventListener("DOMContentLoaded",t,!1),a()},document.addEventListener("DOMContentLoaded",t,!1)):document.attachEvent&&(o=a,z=l.document,i=!1,m(),z.onreadystatechange=function(){"complete"==z.readyState&&(z.onreadystatechange=null,s())})}function s(){i||(i=!0,o())}function m(){try{z.documentElement.doScroll("left")}catch(c){return void setTimeout(m,50)}s()}}(window); \ No newline at end of file diff --git a/public/resource/tinymce/langs/en.js b/public/resource/tinymce/langs/en.js new file mode 100644 index 0000000..27337c3 --- /dev/null +++ b/public/resource/tinymce/langs/en.js @@ -0,0 +1,419 @@ +tinymce.addI18n('es', { + Redo: 'Rehacer', + Undo: 'Deshacer', + Cut: 'Cortar', + Copy: 'Copiar', + Paste: 'Pegar', + 'Select all': 'Seleccionar todo', + 'New document': 'Nuevo documento', + Ok: 'Ok', + Cancel: 'Cancelar', + 'Visual aids': 'Ayudas visuales', + Bold: 'Negrita', + Italic: 'Cursiva', + Underline: 'Subrayado', + Strikethrough: 'Tachado', + Superscript: 'Super\u00edndice', + Subscript: 'Sub\u00edndice', + 'Clear formatting': 'Limpiar formato', + 'Align left': 'Alinear a la izquierda', + 'Align center': 'Alinear al centro', + 'Align right': 'Alinear a la derecha', + Justify: 'Justificar', + 'Bullet list': 'Lista de vi\u00f1etas', + 'Numbered list': 'Lista numerada', + 'Decrease indent': 'Disminuir sangr\u00eda', + 'Increase indent': 'Incrementar sangr\u00eda', + Close: 'Cerrar', + Formats: 'Formatos', + "Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": 'Su navegador no es compatible con el acceso directo al portapapeles. Use las teclas Crtl+X\/C\/V de su teclado.', + Headers: 'Encabezados', + 'Header 1': 'Encabezado 1', + 'Header 2': 'Encabezado 2', + 'Header 3': 'Encabezado 3', + 'Header 4': 'Encabezado 4', + 'Header 5': 'Encabezado 5', + 'Header 6': 'Encabezado 6', + Headings: 'Encabezados', + 'Heading 1': 'Encabezado 1', + 'Heading 2': 'Encabezado 2', + 'Heading 3': 'Encabezado 3', + 'Heading 4': 'Encabezado 4', + 'Heading 5': 'Encabezado 5', + 'Heading 6': 'Encabezado 6', + Preformatted: 'Con formato previo', + Div: 'Div', + Pre: 'Pre', + Code: 'C\u00f3digo', + Paragraph: 'P\u00e1rrafo', + Blockquote: 'Blockquote', + Inline: 'Alineado', + Blocks: 'Bloques', + 'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.': 'Pegar est\u00e1 ahora en modo de texto plano. El contenido se pegar\u00e1 como texto plano hasta que desactive esta opci\u00f3n.', + Fonts: 'Fuentes', + 'Font Sizes': 'Tama\u00f1os de fuente', + Class: 'Clase', + 'Browse for an image': 'Buscar una imagen', + OR: 'OR', + 'Drop an image here': 'Arrastre una imagen aqu\u00ed', + Upload: 'Cargar', + Block: 'Bloque', + Align: 'Alinear', + Default: 'Por defecto', + Circle: 'C\u00edrculo', + Disc: 'Disco', + Square: 'Cuadrado', + 'Lower Alpha': 'Inferior Alfa', + 'Lower Greek': 'Inferior Griega', + 'Lower Roman': 'Inferior Romana', + 'Upper Alpha': 'Superior Alfa', + 'Upper Roman': 'Superior Romana', + 'Anchor...': 'Anclaje...', + Name: 'Nombre', + Id: 'Id', + 'Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.': 'Deber\u00eda comenzar por una letra, seguida solo de letras, n\u00fameros, guiones, puntos, dos puntos o guiones bajos.', + 'You have unsaved changes are you sure you want to navigate away?': 'Tiene cambios sin guardar. \u00bfEst\u00e1 seguro de que quiere salir?', + 'Restore last draft': 'Restaurar el \u00faltimo borrador', + 'Special character...': 'Car\u00e1cter especial...', + 'Source code': 'C\u00f3digo fuente', + 'Insert\/Edit code sample': 'Insertar\/editar c\u00f3digo de prueba', + Language: 'Idioma', + 'Code sample...': 'Ejemplo de c\u00f3digo...', + 'Color Picker': 'Selector de colores', + R: 'R', + G: 'V', + B: 'A', + 'Left to right': 'De izquierda a derecha', + 'Right to left': 'De derecha a izquierda', + 'Emoticons...': 'Emoticones...', + 'Metadata and Document Properties': 'Metadatos y propiedades del documento', + Title: 'T\u00edtulo', + Keywords: 'Palabras clave', + Description: 'Descripci\u00f3n', + Robots: 'Robots', + Author: 'Autor', + Encoding: 'Codificaci\u00f3n', + Fullscreen: 'Pantalla completa', + Action: 'Acci\u00f3n', + Shortcut: 'Atajo', + Help: 'Ayuda', + Address: 'Direcci\u00f3n', + 'Focus to menubar': 'Enfocar la barra del men\u00fa', + 'Focus to toolbar': 'Enfocar la barra de herramientas', + 'Focus to element path': 'Enfocar la ruta del elemento', + 'Focus to contextual toolbar': 'Enfocar la barra de herramientas contextual', + 'Insert link (if link plugin activated)': 'Insertar enlace (si el complemento de enlace est\u00e1 activado)', + 'Save (if save plugin activated)': 'Guardar (si el componente de salvar est\u00e1 activado)', + 'Find (if searchreplace plugin activated)': 'Buscar (si el complemento buscar-remplazar est\u00e1 activado)', + 'Plugins installed ({0}):': 'Plugins instalados ({0}):', + 'Premium plugins:': 'Complementos premium:', + 'Learn more...': 'Aprende m\u00e1s...', + 'You are using {0}': 'Estas usando {0}', + Plugins: 'Complementos', + 'Handy Shortcuts': 'Accesos directos', + 'Horizontal line': 'L\u00ednea horizontal', + 'Insert\/edit image': 'Insertar\/editar imagen', + 'Image description': 'Descripci\u00f3n de la imagen', + Source: 'Enlace', + Dimensions: 'Dimensiones', + 'Constrain proportions': 'Restringir proporciones', + General: 'General', + Advanced: 'Avanzado', + Style: 'Estilo', + 'Vertical space': 'Espacio vertical', + 'Horizontal space': 'Espacio horizontal', + Border: 'Borde', + 'Insert image': 'Insertar imagen', + 'Image...': 'Imagen...', + 'Image list': 'Lista de im\u00e1genes', + 'Rotate counterclockwise': 'Girar a la izquierda', + 'Rotate clockwise': 'Girar a la derecha', + 'Flip vertically': 'Invertir verticalmente', + 'Flip horizontally': 'Invertir horizontalmente', + 'Edit image': 'Editar imagen', + 'Image options': 'Opciones de imagen', + 'Zoom in': 'Acercar', + 'Zoom out': 'Alejar', + Crop: 'Recortar', + Resize: 'Redimensionar', + Orientation: 'Orientaci\u00f3n', + Brightness: 'Brillo', + Sharpen: 'Forma', + Contrast: 'Contraste', + 'Color levels': 'Niveles de color', + Gamma: 'Gamma', + Invert: 'Invertir', + Apply: 'Aplicar', + Back: 'Atr\u00e1s', + 'Insert date\/time': 'Insertar fecha\/hora', + 'Date\/time': 'Fecha\/hora', + 'Insert\/Edit Link': 'Insertar\/editar enlace', + 'Insert\/edit link': 'Insertar\/editar enlace', + 'Text to display': 'Texto para mostrar', + Url: 'URL', + 'Open link in...': 'Abrir enlace en...', + 'Current window': 'Ventana actual', + None: 'Ninguno', + 'New window': 'Nueva ventana', + 'Remove link': 'Quitar enlace', + Anchors: 'Anclas', + 'Link...': 'Enlace...', + 'Paste or type a link': 'Pega o introduce un enlace', + 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?': 'El enlace que has introducido no parece ser una direcci\u00f3n de correo electr\u00f3nico. Quieres a\u00f1adir el prefijo necesario mailto: ?', + 'The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?': 'El enlace que has introducido no parece ser una enlace externo. Quieres a\u00f1adir el prefijo necesario http:\/\/ ?', + 'Link list': 'Lista de enlaces', + 'Insert video': 'Insertar video', + 'Insert\/edit video': 'Insertar\/editar video', + 'Insert\/edit media': 'Insertar\/editar medio', + 'Alternative source': 'Enlace alternativo', + 'Alternative source URL': 'Origen de URL alternativo', + 'Media poster (Image URL)': 'P\u00f3ster de medio (URL de imagen)', + 'Paste your embed code below:': 'Pega tu c\u00f3digo embebido debajo', + Embed: 'Incrustado', + 'Media...': 'Medios...', + 'Nonbreaking space': 'Espacio fijo', + 'Page break': 'Salto de p\u00e1gina', + 'Paste as text': 'Pegar como texto', + Preview: 'Previsualizar', + 'Print...': 'Imprimir...', + Save: 'Guardar', + Find: 'Buscar', + 'Replace with': 'Reemplazar con', + Replace: 'Reemplazar', + 'Replace all': 'Reemplazar todo', + Previous: 'Anterior', + Next: 'Siguiente', + 'Find and replace...': 'Buscar y reemplazar...', + 'Could not find the specified string.': 'No se encuentra la cadena de texto especificada', + 'Match case': 'Coincidencia exacta', + 'Find whole words only': 'Solo palabras completas', + 'Spell check': 'Revisar ortograf\u00eda', + Ignore: 'Ignorar', + 'Ignore all': 'Ignorar todos', + Finish: 'Finalizar', + 'Add to Dictionary': 'A\u00f1adir al Diccionario', + 'Insert table': 'Insertar tabla', + 'Table properties': 'Propiedades de la tabla', + 'Delete table': 'Eliminar tabla', + Cell: 'Celda', + Row: 'Fila', + Column: 'Columna', + 'Cell properties': 'Propiedades de la celda', + 'Merge cells': 'Combinar celdas', + 'Split cell': 'Dividir celdas', + 'Insert row before': 'Insertar fila antes', + 'Insert row after': 'Insertar fila despu\u00e9s ', + 'Delete row': 'Eliminar fila', + 'Row properties': 'Propiedades de la fila', + 'Cut row': 'Cortar fila', + 'Copy row': 'Copiar fila', + 'Paste row before': 'Pegar la fila antes', + 'Paste row after': 'Pegar la fila despu\u00e9s', + 'Insert column before': 'Insertar columna antes', + 'Insert column after': 'Insertar columna despu\u00e9s', + 'Delete column': 'Eliminar columna', + Cols: 'Columnas', + Rows: 'Filas', + Width: 'Ancho', + Height: 'Alto', + 'Cell spacing': 'Espacio entre celdas', + 'Cell padding': 'Relleno de celda', + 'Show caption': 'Mostrar t\u00edtulo', + Left: 'Izquierda', + Center: 'Centrado', + Right: 'Derecha', + 'Cell type': 'Tipo de celda', + Scope: '\u00c1mbito', + Alignment: 'Alineaci\u00f3n', + 'H Align': 'Alineamiento Horizontal', + 'V Align': 'Alineamiento Vertical', + Top: 'Arriba', + Middle: 'Centro', + Bottom: 'Abajo', + 'Header cell': 'Celda de la cebecera', + 'Row group': 'Grupo de filas', + 'Column group': 'Grupo de columnas', + 'Row type': 'Tipo de fila', + Header: 'Cabecera', + Body: 'Cuerpo', + Footer: 'Pie de p\u00e1gina', + 'Border color': 'Color del borde', + 'Insert template...': 'Insertar plantilla...', + Templates: 'Plantillas', + Template: 'Plantilla', + 'Text color': 'Color del texto', + 'Background color': 'Color de fondo', + 'Custom...': 'Personalizar...', + 'Custom color': 'Color personalizado', + 'No color': 'Sin color', + 'Remove color': 'Quitar color', + 'Table of Contents': 'Tabla de contenidos', + 'Show blocks': 'Mostrar bloques', + 'Show invisible characters': 'Mostrar caracteres invisibles', + 'Word count': 'Contar palabras', + Count: 'Recuento', + Document: 'Documento', + Selection: 'Selecci\u00f3n', + Words: 'Palabras', + 'Words: {0}': 'Palabras: {0}', + '{0} words': '{0} palabras', + File: 'Archivo', + Edit: 'Editar', + Insert: 'Insertar', + View: 'Ver', + Format: 'Formato', + Table: 'Tabla', + Tools: 'Herramientas', + 'Powered by {0}': 'Desarrollado por {0}', + 'Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help': '\u00c1rea de texto enriquecido. Pulse ALT-F9 para el menu. Pulse ALT-F10 para la barra de herramientas. Pulse ALT-0 para ayuda', + 'Image title': 'Titulo de imagen', + 'Border width': 'Ancho de borde', + 'Border style': 'Estilo de borde', + Error: 'Error', + Warn: 'Advertencia', + Valid: 'V\u00e1lido', + 'To open the popup, press Shift+Enter': 'Para abrir el elemento emergente, pulse May\u00fas+Intro', + 'Rich Text Area. Press ALT-0 for help.': '\u00c1rea de texto enriquecido. Pulse ALT-0 para abrir la ayuda.', + 'System Font': 'Fuente de sistema', + 'Failed to upload image: {0}': 'Fallo al cargar imagen: {0}', + 'Failed to load plugin: {0} from url {1}': 'Fallo al cargar complemento: {0} desde URL {1}', + 'Failed to load plugin url: {0}': 'Fallo al cargar URL del complemento: {0}', + 'Failed to initialize plugin: {0}': 'Fallo al iniciar el complemento: {0}', + example: 'ejemplo', + Search: 'Buscar', + All: 'Todo', + Currency: 'Divisa', + Text: 'Texto', + Quotations: 'Comillas', + Mathematical: 'S\u00edmbolo matem\u00e1tico', + 'Extended Latin': 'Latino extendido A', + Symbols: 'S\u00edmbolos', + Arrows: 'Flechas', + 'User Defined': 'Definido por el usuario', + 'dollar sign': 'signo de d\u00f3lar', + 'currency sign': 'signo de divisa', + 'euro-currency sign': 'signo de euro', + 'colon sign': 'signo de dos puntos', + 'cruzeiro sign': 'signo de cruceiro', + 'french franc sign': 'signo de franco franc\u00e9s', + 'lira sign': 'signo de lira', + 'mill sign': 'signo de mill', + 'naira sign': 'signo de naira', + 'peseta sign': 'signo de peseta', + 'rupee sign': 'signo de rupia', + 'won sign': 'signo de won', + 'new sheqel sign': 'signo de nuevo s\u00e9quel', + 'dong sign': 'signo de dong', + 'kip sign': 'signo de kip', + 'tugrik sign': 'signo de tugrik', + 'drachma sign': 'signo de dracma', + 'german penny symbol': 'signo de penique alem\u00e1n', + 'peso sign': 'signo de peso', + 'guarani sign': 'signo de guaran\u00ed', + 'austral sign': 'signo de austral', + 'hryvnia sign': 'signo de grivna', + 'cedi sign': 'signo de cedi', + 'livre tournois sign': 'signo de libra tornesa', + 'spesmilo sign': 'signo de spesmilo', + 'tenge sign': 'signo de tenge', + 'indian rupee sign': 'signo de rupia india', + 'turkish lira sign': 'signo de lira turca', + 'nordic mark sign': 'signo de marco n\u00f3rdico', + 'manat sign': 'signo de manat', + 'ruble sign': 'signo de rublo', + 'yen character': 'car\u00e1cter de yen', + 'yuan character': 'car\u00e1cter de yuan', + 'yuan character, in hong kong and taiwan': 'car\u00e1cter de yuan en Hong Kong y Taiw\u00e1n', + 'yen\/yuan character variant one': 'Variante uno de car\u00e1cter de yen\/yuan', + 'Loading emoticons...': 'Cargando emoticonos...', + 'Could not load emoticons': 'No se han podido cargar los emoticonos', + People: 'Personas', + 'Animals and Nature': 'Animales y naturaleza', + 'Food and Drink': 'Comida y bebida', + Activity: 'Actividad', + 'Travel and Places': 'Viajes y lugares', + Objects: 'Objetos', + Flags: 'Banderas', + Characters: 'Caracteres', + 'Characters (no spaces)': 'Caracteres (sin espacios)', + '{0} characters': '{0} caracteres', + 'Error: Form submit field collision.': 'Error: Colisi\u00f3n de campo al enviar formulario.', + 'Error: No form element found.': 'Error: No se encuentra ning\u00fan elemento de formulario.', + Update: 'Actualizar', + 'Color swatch': 'Muestrario de colores', + Turquoise: 'Turquesa', + Green: 'Verde', + Blue: 'Azul', + Purple: 'P\u00farpura', + 'Navy Blue': 'Azul marino', + 'Dark Turquoise': 'Turquesa oscuro', + 'Dark Green': 'Verde oscuro', + 'Medium Blue': 'Azul medio', + 'Medium Purple': 'P\u00farpura medio', + 'Midnight Blue': 'Azul medio', + Yellow: 'Amarillo', + Orange: 'Naranja', + Red: 'Rojo', + 'Light Gray': 'Gris claro', + Gray: 'Gris', + 'Dark Yellow': 'Amarillo oscuro', + 'Dark Orange': 'Naranja oscuro', + 'Dark Red': 'Rojo oscuro', + 'Medium Gray': 'Gris medio', + 'Dark Gray': 'Gris oscuro', + 'Light Green': 'Verde claro', + 'Light Yellow': 'Amarillo claro', + 'Light Red': 'Rojo claro', + 'Light Purple': 'Morado claro', + 'Light Blue': 'Azul claro', + 'Dark Purple': 'Morado oscuro', + 'Dark Blue': 'Azul oscuro', + Black: 'Negro', + White: 'Blanco', + 'Switch to or from fullscreen mode': 'Activar o desactivar modo pantalla completa', + 'Open help dialog': 'Abrir di\u00e1logo de ayuda', + history: 'historial', + styles: 'estilos', + formatting: 'formato', + alignment: 'alineaci\u00f3n', + indentation: 'sangr\u00eda', + 'permanent pen': 'bol\u00edgrafo permanente', + comments: 'comentarios', + 'Format Painter': 'Copiar formato', + 'Insert\/edit iframe': 'Insertar\/editar iframe', + Capitalization: 'Uso de may\u00fasculas', + lowercase: 'min\u00fasculas', + UPPERCASE: 'MAY\u00daSCULAS', + 'Title Case': 'Tipo T\u00edtulo', + 'Permanent Pen Properties': 'Propiedades del bol\u00edgrafo permanente', + 'Permanent pen properties...': 'Propiedades del bol\u00edgrafo permanente...', + Font: 'Fuente', + Size: 'Tama\u00f1o', + 'More...': 'M\u00e1s...', + 'Spellcheck Language': 'Corrector', + 'Select...': 'Seleccionar...', + Preferences: 'Preferencias', + Yes: 'S\u00ed', + No: 'No', + 'Keyboard Navigation': 'Navegaci\u00f3n con el teclado', + Version: 'Versi\u00f3n', + Anchor: 'Ancla', + 'Special character': 'Car\u00e1cter especial', + 'Code sample': 'Ejemplo de c\u00f3digo', + Color: 'Color', + Emoticons: 'Emoticonos', + 'Document properties': 'Propiedades del documento', + Image: 'Imagen', + 'Insert link': 'Insertar enlace', + Target: 'Destino', + Link: 'Enlace', + Poster: 'Miniatura', + Media: 'Media', + Print: 'Imprimir', + Prev: 'Anterior', + 'Find and replace': 'Buscar y reemplazar', + 'Whole words': 'Palabras completas', + Spellcheck: 'Corrector ortogr\u00e1fico', + Caption: 'Subt\u00edtulo', + 'Insert template': 'Insertar plantilla' +}) diff --git a/public/resource/tinymce/langs/zh_CN.js b/public/resource/tinymce/langs/zh_CN.js new file mode 100644 index 0000000..f9d8b5c --- /dev/null +++ b/public/resource/tinymce/langs/zh_CN.js @@ -0,0 +1,389 @@ +tinymce.addI18n('zh_CN',{ +"Redo": "\u91cd\u505a", +"Undo": "\u64a4\u9500", +"Cut": "\u526a\u5207", +"Copy": "\u590d\u5236", +"Paste": "\u7c98\u8d34", +"Select all": "\u5168\u9009", +"New document": "\u65b0\u6587\u4ef6", +"Ok": "\u786e\u5b9a", +"Cancel": "\u53d6\u6d88", +"Visual aids": "\u7f51\u683c\u7ebf", +"Bold": "\u7c97\u4f53", +"Italic": "\u659c\u4f53", +"Underline": "\u4e0b\u5212\u7ebf", +"Strikethrough": "\u5220\u9664\u7ebf", +"Superscript": "\u4e0a\u6807", +"Subscript": "\u4e0b\u6807", +"Clear formatting": "\u6e05\u9664\u683c\u5f0f", +"Align left": "\u5de6\u8fb9\u5bf9\u9f50", +"Align center": "\u4e2d\u95f4\u5bf9\u9f50", +"Align right": "\u53f3\u8fb9\u5bf9\u9f50", +"Justify": "\u4e24\u7aef\u5bf9\u9f50", +"Bullet list": "\u9879\u76ee\u7b26\u53f7", +"Numbered list": "\u7f16\u53f7\u5217\u8868", +"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", +"Increase indent": "\u589e\u52a0\u7f29\u8fdb", +"Close": "\u5173\u95ed", +"Formats": "\u683c\u5f0f", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002", +"Headers": "\u6807\u9898", +"Header 1": "\u6807\u98981", +"Header 2": "\u6807\u98982", +"Header 3": "\u6807\u98983", +"Header 4": "\u6807\u98984", +"Header 5": "\u6807\u98985", +"Header 6": "\u6807\u98986", +"Headings": "\u6807\u9898", +"Heading 1": "\u6807\u98981", +"Heading 2": "\u6807\u98982", +"Heading 3": "\u6807\u98983", +"Heading 4": "\u6807\u98984", +"Heading 5": "\u6807\u98985", +"Heading 6": "\u6807\u98986", +"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684", +"Div": "Div", +"Pre": "Pre", +"Code": "\u4ee3\u7801", +"Paragraph": "\u6bb5\u843d", +"Blockquote": "\u5f15\u6587\u533a\u5757", +"Inline": "\u6587\u672c", +"Blocks": "\u57fa\u5757", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", +"Fonts": "\u5b57\u4f53", +"Font Sizes": "\u5b57\u53f7", +"Class": "\u7c7b\u578b", +"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", +"OR": "\u6216", +"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", +"Upload": "\u4e0a\u4f20", +"Block": "\u5757", +"Align": "\u5bf9\u9f50", +"Default": "\u9ed8\u8ba4", +"Circle": "\u7a7a\u5fc3\u5706", +"Disc": "\u5b9e\u5fc3\u5706", +"Square": "\u65b9\u5757", +"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", +"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", +"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", +"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Anchor...": "\u951a\u70b9...", +"Name": "\u540d\u79f0", +"Id": "\u6807\u8bc6\u7b26", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", +"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", +"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", +"Special characters...": "\u7279\u6b8a\u5b57\u7b26...", +"Source code": "\u6e90\u4ee3\u7801", +"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", +"Language": "\u8bed\u8a00", +"Code sample...": "\u793a\u4f8b\u4ee3\u7801...", +"Color Picker": "\u9009\u8272\u5668", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "\u4ece\u5de6\u5230\u53f3", +"Right to left": "\u4ece\u53f3\u5230\u5de6", +"Emoticons...": "\u8868\u60c5\u7b26\u53f7...", +"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027", +"Title": "\u6807\u9898", +"Keywords": "\u5173\u952e\u8bcd", +"Description": "\u63cf\u8ff0", +"Robots": "\u673a\u5668\u4eba", +"Author": "\u4f5c\u8005", +"Encoding": "\u7f16\u7801", +"Fullscreen": "\u5168\u5c4f", +"Action": "\u64cd\u4f5c", +"Shortcut": "\u5feb\u6377\u952e", +"Help": "\u5e2e\u52a9", +"Address": "\u5730\u5740", +"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", +"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", +"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", +"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", +"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", +"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", +"Learn more...": "\u4e86\u89e3\u66f4\u591a...", +"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", +"Plugins": "\u63d2\u4ef6", +"Handy Shortcuts": "\u5feb\u6377\u952e", +"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", +"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", +"Image description": "\u56fe\u7247\u63cf\u8ff0", +"Source": "\u5730\u5740", +"Dimensions": "\u5927\u5c0f", +"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", +"General": "\u666e\u901a", +"Advanced": "\u9ad8\u7ea7", +"Style": "\u6837\u5f0f", +"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", +"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", +"Border": "\u8fb9\u6846", +"Insert image": "\u63d2\u5165\u56fe\u7247", +"Image...": "\u56fe\u7247...", +"Image list": "\u56fe\u7247\u5217\u8868", +"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", +"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", +"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", +"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", +"Edit image": "\u7f16\u8f91\u56fe\u7247", +"Image options": "\u56fe\u7247\u9009\u9879", +"Zoom in": "\u653e\u5927", +"Zoom out": "\u7f29\u5c0f", +"Crop": "\u88c1\u526a", +"Resize": "\u8c03\u6574\u5927\u5c0f", +"Orientation": "\u65b9\u5411", +"Brightness": "\u4eae\u5ea6", +"Sharpen": "\u9510\u5316", +"Contrast": "\u5bf9\u6bd4\u5ea6", +"Color levels": "\u989c\u8272\u5c42\u6b21", +"Gamma": "\u4f3d\u9a6c\u503c", +"Invert": "\u53cd\u8f6c", +"Apply": "\u5e94\u7528", +"Back": "\u540e\u9000", +"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", +"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", +"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Text to display": "\u663e\u793a\u6587\u5b57", +"Url": "\u5730\u5740", +"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...", +"Current window": "\u5f53\u524d\u7a97\u53e3", +"None": "\u65e0", +"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", +"Remove link": "\u5220\u9664\u94fe\u63a5", +"Anchors": "\u951a\u70b9", +"Link...": "\u94fe\u63a5...", +"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", +"Link list": "\u94fe\u63a5\u5217\u8868", +"Insert video": "\u63d2\u5165\u89c6\u9891", +"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", +"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", +"Alternative source": "\u955c\u50cf", +"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740", +"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)", +"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", +"Embed": "\u5185\u5d4c", +"Media...": "\u591a\u5a92\u4f53...", +"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", +"Page break": "\u5206\u9875\u7b26", +"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", +"Preview": "\u9884\u89c8", +"Print...": "\u6253\u5370...", +"Save": "\u4fdd\u5b58", +"Find": "\u67e5\u627e", +"Replace with": "\u66ff\u6362\u4e3a", +"Replace": "\u66ff\u6362", +"Replace all": "\u5168\u90e8\u66ff\u6362", +"Previous": "\u4e0a\u4e00\u4e2a", +"Next": "\u4e0b\u4e00\u4e2a", +"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...", +"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", +"Match case": "\u533a\u5206\u5927\u5c0f\u5199", +"Find whole words only": "\u5168\u5b57\u5339\u914d", +"Spell check": "\u62fc\u5199\u68c0\u67e5", +"Ignore": "\u5ffd\u7565", +"Ignore all": "\u5168\u90e8\u5ffd\u7565", +"Finish": "\u5b8c\u6210", +"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", +"Insert table": "\u63d2\u5165\u8868\u683c", +"Table properties": "\u8868\u683c\u5c5e\u6027", +"Delete table": "\u5220\u9664\u8868\u683c", +"Cell": "\u5355\u5143\u683c", +"Row": "\u884c", +"Column": "\u5217", +"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", +"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", +"Split cell": "\u62c6\u5206\u5355\u5143\u683c", +"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", +"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", +"Delete row": "\u5220\u9664\u884c", +"Row properties": "\u884c\u5c5e\u6027", +"Cut row": "\u526a\u5207\u884c", +"Copy row": "\u590d\u5236\u884c", +"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", +"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", +"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", +"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", +"Delete column": "\u5220\u9664\u5217", +"Cols": "\u5217", +"Rows": "\u884c", +"Width": "\u5bbd", +"Height": "\u9ad8", +"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", +"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", +"Show caption": "\u663e\u793a\u6807\u9898", +"Left": "\u5de6\u5bf9\u9f50", +"Center": "\u5c45\u4e2d", +"Right": "\u53f3\u5bf9\u9f50", +"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", +"Scope": "\u8303\u56f4", +"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", +"H Align": "\u6c34\u5e73\u5bf9\u9f50", +"V Align": "\u5782\u76f4\u5bf9\u9f50", +"Top": "\u9876\u90e8\u5bf9\u9f50", +"Middle": "\u5782\u76f4\u5c45\u4e2d", +"Bottom": "\u5e95\u90e8\u5bf9\u9f50", +"Header cell": "\u8868\u5934\u5355\u5143\u683c", +"Row group": "\u884c\u7ec4", +"Column group": "\u5217\u7ec4", +"Row type": "\u884c\u7c7b\u578b", +"Header": "\u8868\u5934", +"Body": "\u8868\u4f53", +"Footer": "\u8868\u5c3e", +"Border color": "\u8fb9\u6846\u989c\u8272", +"Insert template...": "\u63d2\u5165\u6a21\u677f...", +"Templates": "\u6a21\u677f", +"Template": "\u6a21\u677f", +"Text color": "\u6587\u5b57\u989c\u8272", +"Background color": "\u80cc\u666f\u8272", +"Custom...": "\u81ea\u5b9a\u4e49...", +"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", +"No color": "\u65e0", +"Remove color": "\u79fb\u9664\u989c\u8272", +"Table of Contents": "\u5185\u5bb9\u5217\u8868", +"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", +"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", +"Word count": "\u5b57\u6570", +"Words: {0}": "\u5b57\u6570\uff1a{0}", +"{0} words": "{0} \u5b57", +"File": "\u6587\u4ef6", +"Edit": "\u7f16\u8f91", +"Insert": "\u63d2\u5165", +"View": "\u89c6\u56fe", +"Format": "\u683c\u5f0f", +"Table": "\u8868\u683c", +"Tools": "\u5de5\u5177", +"Powered by {0}": "\u7531{0}\u9a71\u52a8", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9", +"Image title": "\u56fe\u7247\u6807\u9898", +"Border width": "\u8fb9\u6846\u5bbd\u5ea6", +"Border style": "\u8fb9\u6846\u6837\u5f0f", +"Error": "\u9519\u8bef", +"Warn": "\u8b66\u544a", +"Valid": "\u6709\u6548", +"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846", +"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002", +"System Font": "\u7cfb\u7edf\u5b57\u4f53", +"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}", +"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}", +"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}", +"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}", +"example": "\u793a\u4f8b", +"Search": "\u641c\u7d22", +"All": "\u5168\u90e8", +"Currency": "\u8d27\u5e01", +"Text": "\u6587\u5b57", +"Quotations": "\u5f15\u7528", +"Mathematical": "\u6570\u5b66", +"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145", +"Symbols": "\u7b26\u53f7", +"Arrows": "\u7bad\u5934", +"User Defined": "\u81ea\u5b9a\u4e49", +"dollar sign": "\u7f8e\u5143\u7b26\u53f7", +"currency sign": "\u8d27\u5e01\u7b26\u53f7", +"euro-currency sign": "\u6b27\u5143\u7b26\u53f7", +"colon sign": "\u5192\u53f7", +"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7", +"french franc sign": "\u6cd5\u90ce\u7b26\u53f7", +"lira sign": "\u91cc\u62c9\u7b26\u53f7", +"mill sign": "\u5bc6\u5c14\u7b26\u53f7", +"naira sign": "\u5948\u62c9\u7b26\u53f7", +"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7", +"rupee sign": "\u5362\u6bd4\u7b26\u53f7", +"won sign": "\u97e9\u5143\u7b26\u53f7", +"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7", +"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7", +"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7", +"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7", +"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7", +"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7", +"peso sign": "\u6bd4\u7d22\u7b26\u53f7", +"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7", +"austral sign": "\u6fb3\u5143\u7b26\u53f7", +"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7", +"cedi sign": "\u585e\u5730\u7b26\u53f7", +"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7", +"spesmilo sign": "spesmilo\u7b26\u53f7", +"tenge sign": "\u575a\u6208\u7b26\u53f7", +"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4", +"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9", +"nordic mark sign": "\u5317\u6b27\u9a6c\u514b", +"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7", +"ruble sign": "\u5362\u5e03\u7b26\u53f7", +"yen character": "\u65e5\u5143\u5b57\u6837", +"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837", +"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09", +"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09", +"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...", +"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7", +"People": "\u4eba\u7c7b", +"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136", +"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1", +"Activity": "\u6d3b\u52a8", +"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9", +"Objects": "\u7269\u4ef6", +"Flags": "\u65d7\u5e1c", +"Characters": "\u5b57\u7b26", +"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)", +"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002", +"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002", +"Update": "\u66f4\u65b0", +"Color swatch": "\u989c\u8272\u6837\u672c", +"Turquoise": "\u9752\u7eff\u8272", +"Green": "\u7eff\u8272", +"Blue": "\u84dd\u8272", +"Purple": "\u7d2b\u8272", +"Navy Blue": "\u6d77\u519b\u84dd", +"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272", +"Dark Green": "\u6df1\u7eff\u8272", +"Medium Blue": "\u4e2d\u84dd\u8272", +"Medium Purple": "\u4e2d\u7d2b\u8272", +"Midnight Blue": "\u6df1\u84dd\u8272", +"Yellow": "\u9ec4\u8272", +"Orange": "\u6a59\u8272", +"Red": "\u7ea2\u8272", +"Light Gray": "\u6d45\u7070\u8272", +"Gray": "\u7070\u8272", +"Dark Yellow": "\u6697\u9ec4\u8272", +"Dark Orange": "\u6df1\u6a59\u8272", +"Dark Red": "\u6df1\u7ea2\u8272", +"Medium Gray": "\u4e2d\u7070\u8272", +"Dark Gray": "\u6df1\u7070\u8272", +"Black": "\u9ed1\u8272", +"White": "\u767d\u8272", +"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f", +"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846", +"history": "\u5386\u53f2", +"styles": "\u6837\u5f0f", +"formatting": "\u683c\u5f0f\u5316", +"alignment": "\u5bf9\u9f50", +"indentation": "\u7f29\u8fdb", +"permanent pen": "\u8bb0\u53f7\u7b14", +"comments": "\u5907\u6ce8", +"Anchor": "\u951a\u70b9", +"Special character": "\u7279\u6b8a\u7b26\u53f7", +"Code sample": "\u4ee3\u7801\u793a\u4f8b", +"Color": "\u989c\u8272", +"Emoticons": "\u8868\u60c5", +"Document properties": "\u6587\u6863\u5c5e\u6027", +"Image": "\u56fe\u7247", +"Insert link": "\u63d2\u5165\u94fe\u63a5", +"Target": "\u6253\u5f00\u65b9\u5f0f", +"Link": "\u94fe\u63a5", +"Poster": "\u5c01\u9762", +"Media": "\u5a92\u4f53", +"Print": "\u6253\u5370", +"Prev": "\u4e0a\u4e00\u4e2a", +"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", +"Whole words": "\u5168\u5b57\u5339\u914d", +"Spellcheck": "\u62fc\u5199\u68c0\u67e5", +"Caption": "\u6807\u9898", +"Insert template": "\u63d2\u5165\u6a21\u677f" +}); \ No newline at end of file diff --git a/public/resource/tinymce/skins/ui/jeecg/content.css b/public/resource/tinymce/skins/ui/jeecg/content.css new file mode 100644 index 0000000..c9dc16d --- /dev/null +++ b/public/resource/tinymce/skins/ui/jeecg/content.css @@ -0,0 +1,711 @@ +/** +* Copyright (c) Tiny Technologies, Inc. All rights reserved. +* Licensed under the LGPL or a commercial license. +* For LGPL see License.txt in the project root for license information. +* For commercial licenses see https://www.tiny.cloud/ +*/ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -ms-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment--active { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A"); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A"); +} +[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} +.token.punctuation { + color: #999; +} +.namespace { + opacity: 0.7; +} +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, 0.5); +} +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} +.token.function, +.token.class-name { + color: #DD4A68; +} +.token.regex, +.token.important, +.token.variable { + color: #e90; +} +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +/* stylelint-enable */ +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentColor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body *[contentEditable=false] { + cursor: default; +} +.mce-content-body *[contentEditable=true] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected="2"] .mce-shim { + display: none; +} +.mce-object { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected="2"] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} +.tiny-pageembed--4by3 { + padding-top: 75%; +} +.tiny-pageembed--1by1 { + padding-top: 100%; +} +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body[data-mce-placeholder] { + position: relative; +} +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(84, 111, 94, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} +.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} +.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 10000; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed black; + position: absolute; + z-index: 10001; +} +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td { + border: 0; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} +.tox-rtc-user-selection { + position: relative; +} +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: normal; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} +.tox-rtc-remote-image { + background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} +.mce-content-body img[data-mce-selected], +.mce-content-body video[data-mce-selected], +.mce-content-body audio[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #b4d7ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover { + outline: 3px solid #b4d7ff; +} +.mce-content-body *[contentEditable=false][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} +.mce-content-body.mce-content-readonly *[contentEditable=true]:focus, +.mce-content-body.mce-content-readonly *[contentEditable=true]:hover { + outline: none; +} +.mce-content-body *[data-mce-selected="inline-boundary"] { + background-color: #b4d7ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} +.mce-content-body img::selection { + background: none; +} +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +table[style*="border-width: 0px"], +.mce-item-table:not([border]), +.mce-item-table[border="0"], +table[style*="border-width: 0px"] td, +.mce-item-table:not([border]) td, +.mce-item-table[border="0"] td, +table[style*="border-width: 0px"] th, +.mce-item-table:not([border]) th, +.mce-item-table[border="0"] th, +table[style*="border-width: 0px"] caption, +.mce-item-table:not([border]) caption, +.mce-item-table[border="0"] caption { + border: 1px dashed #bbb; +} +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-visualblocks:not([dir=rtl]) p, +.mce-visualblocks:not([dir=rtl]) h1, +.mce-visualblocks:not([dir=rtl]) h2, +.mce-visualblocks:not([dir=rtl]) h3, +.mce-visualblocks:not([dir=rtl]) h4, +.mce-visualblocks:not([dir=rtl]) h5, +.mce-visualblocks:not([dir=rtl]) h6, +.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir=rtl]) section, +.mce-visualblocks:not([dir=rtl]) article, +.mce-visualblocks:not([dir=rtl]) blockquote, +.mce-visualblocks:not([dir=rtl]) address, +.mce-visualblocks:not([dir=rtl]) pre, +.mce-visualblocks:not([dir=rtl]) figure, +.mce-visualblocks:not([dir=rtl]) figcaption, +.mce-visualblocks:not([dir=rtl]) hgroup, +.mce-visualblocks:not([dir=rtl]) aside, +.mce-visualblocks:not([dir=rtl]) ul, +.mce-visualblocks:not([dir=rtl]) ol, +.mce-visualblocks:not([dir=rtl]) dl { + margin-left: 3px; +} +.mce-visualblocks[dir=rtl] p, +.mce-visualblocks[dir=rtl] h1, +.mce-visualblocks[dir=rtl] h2, +.mce-visualblocks[dir=rtl] h3, +.mce-visualblocks[dir=rtl] h4, +.mce-visualblocks[dir=rtl] h5, +.mce-visualblocks[dir=rtl] h6, +.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]), +.mce-visualblocks[dir=rtl] section, +.mce-visualblocks[dir=rtl] article, +.mce-visualblocks[dir=rtl] blockquote, +.mce-visualblocks[dir=rtl] address, +.mce-visualblocks[dir=rtl] pre, +.mce-visualblocks[dir=rtl] figure, +.mce-visualblocks[dir=rtl] figcaption, +.mce-visualblocks[dir=rtl] hgroup, +.mce-visualblocks[dir=rtl] aside, +.mce-visualblocks[dir=rtl] ul, +.mce-visualblocks[dir=rtl] ol, +.mce-visualblocks[dir=rtl] dl { + background-position-x: right; + margin-right: 3px; +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} +body { + font-family: sans-serif; +} +table { + border-collapse: collapse; +} diff --git a/public/resource/tinymce/skins/ui/jeecg/content.inline.css b/public/resource/tinymce/skins/ui/jeecg/content.inline.css new file mode 100644 index 0000000..9eebd5b --- /dev/null +++ b/public/resource/tinymce/skins/ui/jeecg/content.inline.css @@ -0,0 +1,705 @@ +/** +* Copyright (c) Tiny Technologies, Inc. All rights reserved. +* Licensed under the LGPL or a commercial license. +* For LGPL see License.txt in the project root for license information. +* For commercial licenses see https://www.tiny.cloud/ +*/ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -ms-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment--active { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A"); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A"); +} +[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} +.token.punctuation { + color: #999; +} +.namespace { + opacity: 0.7; +} +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, 0.5); +} +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} +.token.function, +.token.class-name { + color: #DD4A68; +} +.token.regex, +.token.important, +.token.variable { + color: #e90; +} +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +/* stylelint-enable */ +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentColor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body *[contentEditable=false] { + cursor: default; +} +.mce-content-body *[contentEditable=true] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected="2"] .mce-shim { + display: none; +} +.mce-object { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected="2"] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} +.tiny-pageembed--4by3 { + padding-top: 75%; +} +.tiny-pageembed--1by1 { + padding-top: 100%; +} +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body[data-mce-placeholder] { + position: relative; +} +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(84, 111, 94, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} +.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} +.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 10000; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed black; + position: absolute; + z-index: 10001; +} +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td { + border: 0; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} +.tox-rtc-user-selection { + position: relative; +} +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: normal; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} +.tox-rtc-remote-image { + background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} +.mce-content-body img[data-mce-selected], +.mce-content-body video[data-mce-selected], +.mce-content-body audio[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #b4d7ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover { + outline: 3px solid #b4d7ff; +} +.mce-content-body *[contentEditable=false][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} +.mce-content-body.mce-content-readonly *[contentEditable=true]:focus, +.mce-content-body.mce-content-readonly *[contentEditable=true]:hover { + outline: none; +} +.mce-content-body *[data-mce-selected="inline-boundary"] { + background-color: #b4d7ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} +.mce-content-body img::selection { + background: none; +} +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +table[style*="border-width: 0px"], +.mce-item-table:not([border]), +.mce-item-table[border="0"], +table[style*="border-width: 0px"] td, +.mce-item-table:not([border]) td, +.mce-item-table[border="0"] td, +table[style*="border-width: 0px"] th, +.mce-item-table:not([border]) th, +.mce-item-table[border="0"] th, +table[style*="border-width: 0px"] caption, +.mce-item-table:not([border]) caption, +.mce-item-table[border="0"] caption { + border: 1px dashed #bbb; +} +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-visualblocks:not([dir=rtl]) p, +.mce-visualblocks:not([dir=rtl]) h1, +.mce-visualblocks:not([dir=rtl]) h2, +.mce-visualblocks:not([dir=rtl]) h3, +.mce-visualblocks:not([dir=rtl]) h4, +.mce-visualblocks:not([dir=rtl]) h5, +.mce-visualblocks:not([dir=rtl]) h6, +.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir=rtl]) section, +.mce-visualblocks:not([dir=rtl]) article, +.mce-visualblocks:not([dir=rtl]) blockquote, +.mce-visualblocks:not([dir=rtl]) address, +.mce-visualblocks:not([dir=rtl]) pre, +.mce-visualblocks:not([dir=rtl]) figure, +.mce-visualblocks:not([dir=rtl]) figcaption, +.mce-visualblocks:not([dir=rtl]) hgroup, +.mce-visualblocks:not([dir=rtl]) aside, +.mce-visualblocks:not([dir=rtl]) ul, +.mce-visualblocks:not([dir=rtl]) ol, +.mce-visualblocks:not([dir=rtl]) dl { + margin-left: 3px; +} +.mce-visualblocks[dir=rtl] p, +.mce-visualblocks[dir=rtl] h1, +.mce-visualblocks[dir=rtl] h2, +.mce-visualblocks[dir=rtl] h3, +.mce-visualblocks[dir=rtl] h4, +.mce-visualblocks[dir=rtl] h5, +.mce-visualblocks[dir=rtl] h6, +.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]), +.mce-visualblocks[dir=rtl] section, +.mce-visualblocks[dir=rtl] article, +.mce-visualblocks[dir=rtl] blockquote, +.mce-visualblocks[dir=rtl] address, +.mce-visualblocks[dir=rtl] pre, +.mce-visualblocks[dir=rtl] figure, +.mce-visualblocks[dir=rtl] figcaption, +.mce-visualblocks[dir=rtl] hgroup, +.mce-visualblocks[dir=rtl] aside, +.mce-visualblocks[dir=rtl] ul, +.mce-visualblocks[dir=rtl] ol, +.mce-visualblocks[dir=rtl] dl { + background-position-x: right; + margin-right: 3px; +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} diff --git a/public/resource/tinymce/skins/ui/jeecg/content.inline.min.css b/public/resource/tinymce/skins/ui/jeecg/content.inline.min.css new file mode 100644 index 0000000..9acf095 --- /dev/null +++ b/public/resource/tinymce/skins/ui/jeecg/content.inline.min.css @@ -0,0 +1,7 @@ +/** +* Copyright (c) Tiny Technologies, Inc. All rights reserved. +* Licensed under the LGPL or a commercial license. +* For LGPL see License.txt in the project root for license information. +* For commercial licenses see https://www.tiny.cloud/ +*/ +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(84,111,94,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:10000}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:400;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'} \ No newline at end of file diff --git a/public/resource/tinymce/skins/ui/jeecg/content.min.css b/public/resource/tinymce/skins/ui/jeecg/content.min.css new file mode 100644 index 0000000..e9a1d89 --- /dev/null +++ b/public/resource/tinymce/skins/ui/jeecg/content.min.css @@ -0,0 +1,7 @@ +/** +* Copyright (c) Tiny Technologies, Inc. All rights reserved. +* Licensed under the LGPL or a commercial license. +* For LGPL see License.txt in the project root for license information. +* For commercial licenses see https://www.tiny.cloud/ +*/ +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(84,111,94,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:10000}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:400;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse} \ No newline at end of file diff --git a/public/resource/tinymce/skins/ui/jeecg/content.mobile.css b/public/resource/tinymce/skins/ui/jeecg/content.mobile.css new file mode 100644 index 0000000..64783f0 --- /dev/null +++ b/public/resource/tinymce/skins/ui/jeecg/content.mobile.css @@ -0,0 +1,29 @@ +/** +* Copyright (c) Tiny Technologies, Inc. All rights reserved. +* Licensed under the LGPL or a commercial license. +* For LGPL see License.txt in the project root for license information. +* For commercial licenses see https://www.tiny.cloud/ +*/ +.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection { + /* Note: this file is used inside the content, so isn't part of theming */ + background-color: green; + display: inline-block; + opacity: 0.5; + position: absolute; +} +body { + -webkit-text-size-adjust: none; +} +body img { + /* this is related to the content margin */ + max-width: 96vw; +} +body table img { + max-width: 95%; +} +body { + font-family: sans-serif; +} +table { + border-collapse: collapse; +} diff --git a/public/resource/tinymce/skins/ui/jeecg/content.mobile.min.css b/public/resource/tinymce/skins/ui/jeecg/content.mobile.min.css new file mode 100644 index 0000000..1b87246 --- /dev/null +++ b/public/resource/tinymce/skins/ui/jeecg/content.mobile.min.css @@ -0,0 +1,7 @@ +/** +* Copyright (c) Tiny Technologies, Inc. All rights reserved. +* Licensed under the LGPL or a commercial license. +* For LGPL see License.txt in the project root for license information. +* For commercial licenses see https://www.tiny.cloud/ +*/ +.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse} \ No newline at end of file diff --git a/public/resource/tinymce/skins/ui/jeecg/fonts/tinymce-mobile.woff b/public/resource/tinymce/skins/ui/jeecg/fonts/tinymce-mobile.woff new file mode 100644 index 0000000000000000000000000000000000000000..1e3be038a607cb7c2544ed8ae3d6621f77bf4c38 GIT binary patch literal 4624 zcmb7IeQaFC5#QN&AGUL{efE7g{=BM1W-|RaVdWQe^e?BC`eGz4^i8S3PQw?Hhd_eQHxTkckXZB zdzU((wCVGko!Qyh+1c6InRotvZ%+>+hNrBQtrFOI4t*}DZ$7=>Sr=uD3c$ZlKuKBQ z8~ervCczs9SOk2!>AAqrz+v$CC}f1JfYPDSqx->|V$6{ekbe8M#Bh3Gkg?)-Fdi3B zeB$}UFqn*$pv&q7*net~hsUOlfG7Ho2zaowY%JPRytMvu{&xRPm(h_~w##F>vqE&a5-ssH##mlfAk}44^ zXRJKd!Ifw&ce{$Y9BAg5c>e>p_Z;t!=P{izddGWie?aHLdKL3Cn9rG=d2vt;esWqH zoD}uAoi3Z~4+LABvADt+so4~t%VlyIJ{O3tm$NC+(!yenQD%NVr*btG$T3+_WX=LH z#1M2ZNEtrO+-x;l2i>M^5o%GQ@s?N+gw*19H@G~vl3Q5Zf*t6jjW0GOTmAmlWYgSS zJeiEo%~LA-FW|YAd_Em$OE#@dw)y*#@p!UtnWa);V1HY3ZBw!>(3gY{iFFa_c6iW9 zIQ@xck^{xu9_o;UyQH#ba@y?L$xW?8J35?$p1z46ZjIctZ8QCKCa29bMC1-t@pT>S zTUT1WMjQz-75d)5zJxv~@Yd)bY)ejQBx_XQiaMJ z>$5`NO3?L*ND{UQeF8%xl)$_>w9tmQpfEebzedazFeh#~d}suN+vzsqLiW~@TLhoe zk1%xEcxP2ZL)FuoXeYzb-J5goljDxPL2@@#RW)d&X#&6QO5U=04_628@ONSvtgpha zDqqmoVep`A4<+PK$V>K+T}}{8Rj+Q|UAzCtl!Fh)uXJg{x$}HMJH7LcBLzj-r{h;< zzote8Id%pcAyE;87D<8glyaFeq#k)OEDB%yA ze%CeZ!?4TEs#pj+%14DBZHn8jxaF2as6}p3+!6p-&@I>5lbP3&N$svcIF-`0R5(o2 zh7la++|;-euckH44a4BAwB++#-cZ z)kFyC=eUS-4D0t}H8LdZY!JD^sW@F85io)%=8HU)ouhEeo-K_dJ3BV+8fo0JXIjlP zZt0H`0=Yv~I|PpRZ)r5_iAYmY9V=wT@BsoN9<3vftB|}TOH;|yNk_e7(2-?y{&cSK zG=E5Nz^Ko4>KxcbY!Q13!=HBS$lM96_+0y3M1yWTAt2u5C;6MWMXbRN?RI{$eHnAx z&t=-PSjZ>Qe2V2-YGs1YWemAq zVHdG{9V$QvsY~Cgq-L*PZqMPGv|px$)K~3<%+fBtG{oIRPL_7ye$-(`C=tS)^xC}% zue73qiF&{nXJ*>-@668G!`IrAeB;ad09shzt{O?7omLE_X@H|#ozGt&64 zb-&_lLkZI8TzigPZvUr=4g2-8M6M8b9EQLgoPswYg)d)j&%gZHJO!2>(?;I*8d>aG z#oS295Kcq{uD4R2@VEG($}WWiF-6YK)kjqks%o_U{CIAVX2;tX7o|unkew5?Gn3(| zOePS^{$(;Xi4ph;`KO#;k+vaLt8n5@doi+OEvH&?*+3(WgqkT9-$b0fTHm;)r=NmR zJnJ9o>UvNR(JMoIdRBf{%kd}jmZ)b)#4>dnDfq0G(?~S%d zv50QeMR$Kzd*S$AEXdp5Fhqe0Pz zZ!oS2e!i-tWEJ2^YoVo}V7S0tV7CujimbVJtVNb#yB&<-f&xpSb@m2=wBZ|qU-_^; z?C{lk+;tlxk&Sh3Pwh(D7~kNh`O=~TMWuRUu^0=9)`CYEVwhvGWUt4Wd3`6*H)Zs>LLYQcC#*~B78EfTt7RQ*l)b{v zqntLNsC`h&zZCY{x*}gfPU4at;nfileU3>zeyLdO7;;lFIft~ zsm6#wb5Jjtv;_VxleU0<%cQON-O*ywHt`@C4fn-Y83}=|hJPOpN>1H%C#7)9etg_yG)$ div { + padding-bottom: 2.5px; +} +.tox .accessibility-issue__description > div > div { + align-items: center; + display: flex; + margin-bottom: 2.5px; +} +.tox .accessibility-issue__description > *:last-child:not(:only-child) { + border-color: #d9d9d9; + border-style: solid; +} +.tox .accessibility-issue__repair { + margin-top: 16px; +} +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description { + background-color: rgba(10, 143, 233, 0.1); + border-color: rgba(10, 143, 233, 0.4); + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > *:last-child { + border-color: rgba(10, 143, 233, 0.4); +} +.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 { + color: #0a8fe9; +} +.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg { + fill: #0a8fe9; +} +.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon { + color: #0a8fe9; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description { + background-color: rgba(255, 165, 0, 0.1); + border-color: rgba(255, 165, 0, 0.5); + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > *:last-child { + border-color: rgba(255, 165, 0, 0.5); +} +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 { + color: #cc8500; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg { + fill: #cc8500; +} +.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon { + color: #cc8500; +} +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description { + background-color: rgba(204, 0, 0, 0.1); + border-color: rgba(204, 0, 0, 0.4); + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > *:last-child { + border-color: rgba(204, 0, 0, 0.4); +} +.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 { + color: #c00; +} +.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg { + fill: #c00; +} +.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon { + color: #c00; +} +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description { + background-color: rgba(120, 171, 70, 0.1); + border-color: rgba(120, 171, 70, 0.4); + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > *:last-child { + border-color: rgba(120, 171, 70, 0.4); +} +.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 { + color: #78AB46; +} +.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg { + fill: #78AB46; +} +.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon { + color: #78AB46; +} +.tox .tox-dialog__body-content .accessibility-issue__header h1, +.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 { + margin-top: 0; +} +.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-left: 2.5px; +} +.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) { + margin-left: auto; +} +.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description { + padding: 2.5px 2.5px 2.5px 5px; +} +.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description > *:last-child { + border-left-width: 1px; + padding-left: 2.5px; +} +.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-right: 2.5px; +} +.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) { + margin-right: auto; +} +.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description { + padding: 2.5px 5px 2.5px 2.5px; +} +.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description > *:last-child { + border-right-width: 1px; + padding-right: 2.5px; +} +.tox .tox-anchorbar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-bar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-button { + background-color: #0a8fe9; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #0a8fe9; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 8.75px; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-height: 24px; + margin: 0; + outline: none; + padding: 2.5px 10px; + text-align: center; + text-decoration: none; + text-transform: none; + white-space: nowrap; +} +.tox .tox-button[disabled] { + background-color: #0a8fe9; + background-image: none; + border-color: #0a8fe9; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-button:focus:not(:disabled) { + background-color: #0980d1; + background-image: none; + border-color: #0980d1; + box-shadow: none; + color: #fff; +} +.tox .tox-button:hover:not(:disabled) { + background-color: #0980d1; + background-image: none; + border-color: #0980d1; + box-shadow: none; + color: #fff; +} +.tox .tox-button:active:not(:disabled) { + background-color: #0871b8; + background-image: none; + border-color: #0871b8; + box-shadow: none; + color: #fff; +} +.tox .tox-button--secondary { + background-color: #f0f0f0; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #f0f0f0; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + color: rgba(84, 111, 94, 0.85); + font-size: 8.75px; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + outline: none; + padding: 2.5px 10px; + text-decoration: none; + text-transform: none; +} +.tox .tox-button--secondary[disabled] { + background-color: #f0f0f0; + background-image: none; + border-color: #f0f0f0; + box-shadow: none; + color: rgba(84, 111, 94, 0.5); +} +.tox .tox-button--secondary:focus:not(:disabled) { + background-color: #e3e3e3; + background-image: none; + border-color: #e3e3e3; + box-shadow: none; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-button--secondary:hover:not(:disabled) { + background-color: #e3e3e3; + background-image: none; + border-color: #e3e3e3; + box-shadow: none; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-button--secondary:active:not(:disabled) { + background-color: #d6d6d6; + background-image: none; + border-color: #d6d6d6; + box-shadow: none; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-button--icon, +.tox .tox-button.tox-button--icon, +.tox .tox-button.tox-button--secondary.tox-button--icon { + padding: 2.5px; +} +.tox .tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg { + display: block; + fill: currentColor; +} +.tox .tox-button-link { + background: 0; + border: none; + box-sizing: border-box; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 10px; + font-weight: normal; + line-height: 1.3; + margin: 0; + padding: 0; + white-space: nowrap; +} +.tox .tox-button-link--sm { + font-size: 8.75px; +} +.tox .tox-button--naked { + background-color: transparent; + border-color: transparent; + box-shadow: unset; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-button--naked[disabled] { + background-color: #f0f0f0; + border-color: #f0f0f0; + box-shadow: none; + color: rgba(84, 111, 94, 0.5); +} +.tox .tox-button--naked:hover:not(:disabled) { + background-color: #e3e3e3; + border-color: #e3e3e3; + box-shadow: none; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-button--naked:focus:not(:disabled) { + background-color: #e3e3e3; + border-color: #e3e3e3; + box-shadow: none; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-button--naked:active:not(:disabled) { + background-color: #d6d6d6; + border-color: #d6d6d6; + box-shadow: none; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-button--naked .tox-icon svg { + fill: currentColor; +} +.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) { + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-checkbox { + align-items: center; + border-radius: 3px; + cursor: pointer; + display: flex; + height: 36px; + min-width: 36px; +} +.tox .tox-checkbox__input { + /* Hide from view but visible to screen readers */ + height: 1px; + overflow: hidden; + position: absolute; + top: auto; + width: 1px; +} +.tox .tox-checkbox__icons { + align-items: center; + border-radius: 3px; + box-shadow: 0 0 0 2px transparent; + box-sizing: content-box; + display: flex; + height: 24px; + justify-content: center; + padding: calc(2.5px - 1px); + width: 24px; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: block; + fill: rgba(84, 111, 94, 0.3); +} +.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: none; + fill: #0a8fe9; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: none; + fill: #0a8fe9; +} +.tox .tox-checkbox--disabled { + color: rgba(84, 111, 94, 0.5); + cursor: not-allowed; +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg { + fill: rgba(84, 111, 94, 0.5); +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + fill: rgba(84, 111, 94, 0.5); +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + fill: rgba(84, 111, 94, 0.5); +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: block; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: block; +} +.tox input.tox-checkbox__input:focus + .tox-checkbox__icons { + border-radius: 3px; + box-shadow: inset 0 0 0 1px #0a8fe9; + padding: calc(2.5px - 1px); +} +.tox:not([dir=rtl]) .tox-checkbox__label { + margin-left: 2.5px; +} +.tox:not([dir=rtl]) .tox-checkbox__input { + left: -10000px; +} +.tox:not([dir=rtl]) .tox-bar .tox-checkbox { + margin-left: 2.5px; +} +.tox[dir=rtl] .tox-checkbox__label { + margin-right: 2.5px; +} +.tox[dir=rtl] .tox-checkbox__input { + right: -10000px; +} +.tox[dir=rtl] .tox-bar .tox-checkbox { + margin-right: 2.5px; +} +.tox { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox .tox-collection--toolbar .tox-collection__group { + display: flex; + padding: 0; +} +.tox .tox-collection--grid .tox-collection__group { + display: flex; + flex-wrap: wrap; + max-height: 208px; + overflow-x: hidden; + overflow-y: auto; + padding: 0; +} +.tox .tox-collection--list .tox-collection__group { + border-bottom-width: 0; + border-color: #d9d9d9; + border-left-width: 0; + border-right-width: 0; + border-style: solid; + border-top-width: 1px; + padding: 2.5px 0; +} +.tox .tox-collection--list .tox-collection__group:first-child { + border-top-width: 0; +} +.tox .tox-collection__group-heading { + background-color: #f3f3f3; + color: rgba(84, 111, 94, 0.7); + cursor: default; + font-size: 12px; + font-style: normal; + font-weight: normal; + margin-bottom: 2.5px; + margin-top: -2.5px; + padding: 2.5px 5px; + text-transform: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tox .tox-collection__item { + align-items: center; + color: rgba(84, 111, 94, 0.85); + cursor: pointer; + display: flex; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tox .tox-collection--list .tox-collection__item { + padding: 2.5px 5px; +} +.tox .tox-collection--toolbar .tox-collection__item { + border-radius: 3px; + padding: 2.5px; +} +.tox .tox-collection--grid .tox-collection__item { + border-radius: 3px; + padding: 2.5px; +} +.tox .tox-collection--list .tox-collection__item--enabled { + background-color: #fff; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-collection--list .tox-collection__item--active { + background-color: #e5e9e7; +} +.tox .tox-collection--toolbar .tox-collection__item--enabled { + background-color: #e5e9e7; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-collection--toolbar .tox-collection__item--active { + background-color: #e5e9e7; +} +.tox .tox-collection--grid .tox-collection__item--enabled { + background-color: #e5e9e7; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + background-color: #e5e9e7; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-collection__item-icon, +.tox .tox-collection__item-checkmark { + align-items: center; + display: flex; + height: 24px; + justify-content: center; + width: 24px; +} +.tox .tox-collection__item-icon svg, +.tox .tox-collection__item-checkmark svg { + fill: currentColor; +} +.tox .tox-collection--toolbar-lg .tox-collection__item-icon { + height: 48px; + width: 48px; +} +.tox .tox-collection__item-label { + color: currentColor; + display: inline-block; + flex: 1; + -ms-flex-preferred-size: auto; + font-size: 8.75px; + font-style: normal; + font-weight: normal; + line-height: 24px; + text-transform: none; + word-break: break-all; +} +.tox .tox-collection__item-accessory { + color: rgba(84, 111, 94, 0.7); + display: inline-block; + font-size: 8.75px; + height: 24px; + line-height: 24px; + text-transform: none; +} +.tox .tox-collection__item-caret { + align-items: center; + display: flex; + min-height: 24px; +} +.tox .tox-collection__item-caret::after { + content: ''; + font-size: 0; + min-height: inherit; +} +.tox .tox-collection__item-caret svg { + fill: rgba(84, 111, 94, 0.85); +} +.tox .tox-collection__item--state-disabled { + background-color: transparent; + color: rgba(84, 111, 94, 0.5); + cursor: not-allowed; +} +.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg { + fill: rgba(84, 111, 94, 0.5); +} +.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg { + display: none; +} +.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory + .tox-collection__item-checkmark { + display: none; +} +.tox .tox-collection--horizontal { + background-color: #fff; + border: 1px solid #d9d9d9; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: nowrap; + margin-bottom: 0; + overflow-x: auto; + padding: 0; +} +.tox .tox-collection--horizontal .tox-collection__group { + align-items: center; + display: flex; + flex-wrap: nowrap; + margin: 0; + padding: 0 2.5px; +} +.tox .tox-collection--horizontal .tox-collection__item { + height: 34px; + margin: 2px 0 3px 0; + padding: 0 4px; +} +.tox .tox-collection--horizontal .tox-collection__item-label { + white-space: nowrap; +} +.tox .tox-collection--horizontal .tox-collection__item-caret { + margin-left: 4px; +} +.tox .tox-collection__item-container { + display: flex; +} +.tox .tox-collection__item-container--row { + align-items: center; + flex: 1 1 auto; + flex-direction: row; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--align-left { + margin-right: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--align-right { + justify-content: flex-end; + margin-left: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top { + align-items: flex-start; + margin-bottom: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle { + align-items: center; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom { + align-items: flex-end; + margin-top: auto; +} +.tox .tox-collection__item-container--column { + -ms-grid-row-align: center; + align-self: center; + flex: 1 1 auto; + flex-direction: column; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--align-left { + align-items: flex-start; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--align-right { + align-items: flex-end; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top { + align-self: flex-start; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle { + -ms-grid-row-align: center; + align-self: center; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom { + align-self: flex-end; +} +.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-right: 1px solid #d9d9d9; +} +.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-left: 5px; +} +.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-left: 2.5px; +} +.tox:not([dir=rtl]) .tox-collection__item-accessory { + margin-left: 10px; + text-align: right; +} +.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret { + margin-left: 10px; +} +.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-left: 1px solid #d9d9d9; +} +.tox[dir=rtl] .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-right: 5px; +} +.tox[dir=rtl] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-right: 2.5px; +} +.tox[dir=rtl] .tox-collection__item-accessory { + margin-right: 10px; + text-align: left; +} +.tox[dir=rtl] .tox-collection .tox-collection__item-caret { + margin-right: 10px; + transform: rotateY(180deg); +} +.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret { + margin-right: 4px; +} +.tox .tox-color-picker-container { + display: flex; + flex-direction: row; + height: 225px; + margin: 0; +} +.tox .tox-sv-palette { + box-sizing: border-box; + display: flex; + height: 100%; +} +.tox .tox-sv-palette-spectrum { + height: 100%; +} +.tox .tox-sv-palette, +.tox .tox-sv-palette-spectrum { + width: 225px; +} +.tox .tox-sv-palette-thumb { + background: none; + border: 1px solid black; + border-radius: 50%; + box-sizing: content-box; + height: 12px; + position: absolute; + width: 12px; +} +.tox .tox-sv-palette-inner-thumb { + border: 1px solid white; + border-radius: 50%; + height: 10px; + position: absolute; + width: 10px; +} +.tox .tox-hue-slider { + box-sizing: border-box; + height: 100%; + width: 25px; +} +.tox .tox-hue-slider-spectrum { + background: linear-gradient(to bottom, #f00, #ff0080, #f0f, #8000ff, #00f, #0080ff, #0ff, #00ff80, #0f0, #80ff00, #ff0, #ff8000, #f00); + height: 100%; + width: 100%; +} +.tox .tox-hue-slider, +.tox .tox-hue-slider-spectrum { + width: 20px; +} +.tox .tox-hue-slider-thumb { + background: white; + border: 1px solid black; + box-sizing: content-box; + height: 4px; + width: 100%; +} +.tox .tox-rgb-form { + display: flex; + flex-direction: column; + justify-content: space-between; +} +.tox .tox-rgb-form div { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 5px; + width: inherit; +} +.tox .tox-rgb-form input { + width: 6em; +} +.tox .tox-rgb-form input.tox-invalid { + /* Need !important to override Chrome's focus styling unfortunately */ + border: 1px solid red !important; +} +.tox .tox-rgb-form .tox-rgba-preview { + border: 1px solid black; + flex-grow: 2; + margin-bottom: 0; +} +.tox:not([dir=rtl]) .tox-sv-palette { + margin-right: 15px; +} +.tox:not([dir=rtl]) .tox-hue-slider { + margin-right: 15px; +} +.tox:not([dir=rtl]) .tox-hue-slider-thumb { + margin-left: -1px; +} +.tox:not([dir=rtl]) .tox-rgb-form label { + margin-right: 0.5em; +} +.tox[dir=rtl] .tox-sv-palette { + margin-left: 15px; +} +.tox[dir=rtl] .tox-hue-slider { + margin-left: 15px; +} +.tox[dir=rtl] .tox-hue-slider-thumb { + margin-right: -1px; +} +.tox[dir=rtl] .tox-rgb-form label { + margin-left: 0.5em; +} +.tox .tox-toolbar .tox-swatches, +.tox .tox-toolbar__primary .tox-swatches, +.tox .tox-toolbar__overflow .tox-swatches { + margin: 2px 0 3px 4px; +} +.tox .tox-collection--list .tox-collection__group .tox-swatches-menu { + border: 0; + margin: -2.5px 0; +} +.tox .tox-swatches__row { + display: flex; +} +.tox .tox-swatch { + height: 30px; + transition: transform 0.15s, box-shadow 0.15s; + width: 30px; +} +.tox .tox-swatch:hover, +.tox .tox-swatch:focus { + box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset; + transform: scale(0.8); +} +.tox .tox-swatch--remove { + align-items: center; + display: flex; + justify-content: center; +} +.tox .tox-swatch--remove svg path { + stroke: #e74c3c; +} +.tox .tox-swatches__picker-btn { + align-items: center; + background-color: transparent; + border: 0; + cursor: pointer; + display: flex; + height: 30px; + justify-content: center; + outline: none; + padding: 0; + width: 30px; +} +.tox .tox-swatches__picker-btn svg { + height: 24px; + width: 24px; +} +.tox .tox-swatches__picker-btn:hover { + background: #e5e9e7; +} +.tox:not([dir=rtl]) .tox-swatches__picker-btn { + margin-left: auto; +} +.tox[dir=rtl] .tox-swatches__picker-btn { + margin-right: auto; +} +.tox .tox-comment-thread { + background: #fff; + position: relative; +} +.tox .tox-comment-thread > *:not(:first-child) { + margin-top: 5px; +} +.tox .tox-comment { + background: #fff; + border: 1px solid #d9d9d9; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(84, 111, 94, 0.1); + padding: 5px 5px 10px 5px; + position: relative; +} +.tox .tox-comment__header { + align-items: center; + color: rgba(84, 111, 94, 0.85); + display: flex; + justify-content: space-between; +} +.tox .tox-comment__date { + color: rgba(84, 111, 94, 0.7); + font-size: 12px; +} +.tox .tox-comment__body { + color: rgba(84, 111, 94, 0.85); + font-size: 8.75px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin-top: 5px; + position: relative; + text-transform: initial; +} +.tox .tox-comment__body textarea { + resize: none; + white-space: normal; + width: 100%; +} +.tox .tox-comment__expander { + padding-top: 5px; +} +.tox .tox-comment__expander p { + color: rgba(84, 111, 94, 0.7); + font-size: 8.75px; + font-style: normal; +} +.tox .tox-comment__body p { + margin: 0; +} +.tox .tox-comment__buttonspacing { + padding-top: 10px; + text-align: center; +} +.tox .tox-comment-thread__overlay::after { + background: #fff; + bottom: 0; + content: ""; + display: flex; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + top: 0; + z-index: 5; +} +.tox .tox-comment__reply { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 5px; +} +.tox .tox-comment__reply > *:first-child { + margin-bottom: 5px; + width: 100%; +} +.tox .tox-comment__edit { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 10px; +} +.tox .tox-comment__gradient::after { + background: linear-gradient(rgba(255, 255, 255, 0), #fff); + bottom: 0; + content: ""; + display: block; + height: 5em; + margin-top: -40px; + position: absolute; + width: 100%; +} +.tox .tox-comment__overlay { + background: #fff; + bottom: 0; + display: flex; + flex-direction: column; + flex-grow: 1; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + text-align: center; + top: 0; + z-index: 5; +} +.tox .tox-comment__loading-text { + align-items: center; + color: rgba(84, 111, 94, 0.85); + display: flex; + flex-direction: column; + position: relative; +} +.tox .tox-comment__loading-text > div { + padding-bottom: 10px; +} +.tox .tox-comment__overlaytext { + bottom: 0; + flex-direction: column; + font-size: 8.75px; + left: 0; + padding: 1em; + position: absolute; + right: 0; + top: 0; + z-index: 10; +} +.tox .tox-comment__overlaytext p { + background-color: #fff; + box-shadow: 0 0 8px 8px #fff; + color: rgba(84, 111, 94, 0.85); + text-align: center; +} +.tox .tox-comment__overlaytext div:nth-of-type(2) { + font-size: 0.8em; +} +.tox .tox-comment__busy-spinner { + align-items: center; + background-color: #fff; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 20; +} +.tox .tox-comment__scroll { + display: flex; + flex-direction: column; + flex-shrink: 1; + overflow: auto; +} +.tox .tox-conversations { + margin: 5px; +} +.tox:not([dir=rtl]) .tox-comment__edit { + margin-left: 5px; +} +.tox:not([dir=rtl]) .tox-comment__buttonspacing > *:last-child, +.tox:not([dir=rtl]) .tox-comment__edit > *:last-child, +.tox:not([dir=rtl]) .tox-comment__reply > *:last-child { + margin-left: 5px; +} +.tox[dir=rtl] .tox-comment__edit { + margin-right: 5px; +} +.tox[dir=rtl] .tox-comment__buttonspacing > *:last-child, +.tox[dir=rtl] .tox-comment__edit > *:last-child, +.tox[dir=rtl] .tox-comment__reply > *:last-child { + margin-right: 5px; +} +.tox .tox-user { + align-items: center; + display: flex; +} +.tox .tox-user__avatar svg { + fill: rgba(84, 111, 94, 0.7); +} +.tox .tox-user__name { + color: rgba(84, 111, 94, 0.7); + font-size: 12px; + font-style: normal; + font-weight: normal; + text-transform: uppercase; +} +.tox:not([dir=rtl]) .tox-user__avatar svg { + margin-right: 5px; +} +.tox:not([dir=rtl]) .tox-user__avatar + .tox-user__name { + margin-left: 5px; +} +.tox[dir=rtl] .tox-user__avatar svg { + margin-left: 5px; +} +.tox[dir=rtl] .tox-user__avatar + .tox-user__name { + margin-right: 5px; +} +.tox .tox-dialog-wrap { + align-items: center; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 1100; +} +.tox .tox-dialog-wrap__backdrop { + background-color: rgba(255, 255, 255, 0.75); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1; +} +.tox .tox-dialog-wrap__backdrop--opaque { + background-color: #fff; +} +.tox .tox-dialog { + background-color: #fff; + border-color: #d9d9d9; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: 0 16px 16px -10px rgba(84, 111, 94, 0.15), 0 0 40px 1px rgba(84, 111, 94, 0.15); + display: flex; + flex-direction: column; + max-height: 100%; + max-width: 480px; + overflow: hidden; + position: relative; + width: 95vw; + z-index: 2; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox .tox-dialog { + align-self: flex-start; + margin: 5px auto; + width: calc(100vw - 10px); + } +} +.tox .tox-dialog-inline { + z-index: 1100; +} +.tox .tox-dialog__header { + align-items: center; + background-color: #fff; + border-bottom: none; + color: rgba(84, 111, 94, 0.85); + display: flex; + font-size: 10px; + justify-content: space-between; + padding: 5px 10px 0 10px; + position: relative; +} +.tox .tox-dialog__header .tox-button { + z-index: 1; +} +.tox .tox-dialog__draghandle { + cursor: grab; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tox .tox-dialog__draghandle:active { + cursor: grabbing; +} +.tox .tox-dialog__dismiss { + margin-left: auto; +} +.tox .tox-dialog__title { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 12.5px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin: 0; + text-transform: none; +} +.tox .tox-dialog__body { + color: rgba(84, 111, 94, 0.85); + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; + font-size: 10px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + min-width: 0; + text-align: left; + text-transform: none; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body { + flex-direction: column; + } +} +.tox .tox-dialog__body-nav { + align-items: flex-start; + display: flex; + flex-direction: column; + padding: 10px 10px; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body-nav { + flex-direction: row; + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding-bottom: 0; + } +} +.tox .tox-dialog__body-nav-item { + border-bottom: 2px solid transparent; + color: rgba(84, 111, 94, 0.7); + display: inline-block; + font-size: 8.75px; + line-height: 1.3; + margin-bottom: 5px; + text-decoration: none; + white-space: nowrap; +} +.tox .tox-dialog__body-nav-item:focus { + background-color: rgba(10, 143, 233, 0.1); +} +.tox .tox-dialog__body-nav-item--active { + border-bottom: 2px solid #0a8fe9; + color: #0a8fe9; +} +.tox .tox-dialog__body-content { + box-sizing: border-box; + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; + max-height: 650px; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 10px 10px; +} +.tox .tox-dialog__body-content > * { + margin-bottom: 0; + margin-top: 10px; +} +.tox .tox-dialog__body-content > *:first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content > *:last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content > *:only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog__body-content a { + color: #0a8fe9; + cursor: pointer; + text-decoration: none; +} +.tox .tox-dialog__body-content a:hover, +.tox .tox-dialog__body-content a:focus { + color: #0871b8; + text-decoration: none; +} +.tox .tox-dialog__body-content a:active { + color: #0871b8; + text-decoration: none; +} +.tox .tox-dialog__body-content svg { + fill: rgba(84, 111, 94, 0.85); +} +.tox .tox-dialog__body-content ul { + display: block; + list-style-type: disc; + margin-bottom: 10px; + -webkit-margin-end: 0; + margin-inline-end: 0; + -webkit-margin-start: 0; + margin-inline-start: 0; + -webkit-padding-start: 2.5rem; + padding-inline-start: 2.5rem; +} +.tox .tox-dialog__body-content .tox-form__group h1 { + color: rgba(84, 111, 94, 0.85); + font-size: 12.5px; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + margin-bottom: 10px; + margin-top: 2rem; + text-transform: none; +} +.tox .tox-dialog__body-content .tox-form__group h2 { + color: rgba(84, 111, 94, 0.85); + font-size: 10px; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + margin-bottom: 10px; + margin-top: 2rem; + text-transform: none; +} +.tox .tox-dialog__body-content .tox-form__group p { + margin-bottom: 10px; +} +.tox .tox-dialog__body-content .tox-form__group h1:first-child, +.tox .tox-dialog__body-content .tox-form__group h2:first-child, +.tox .tox-dialog__body-content .tox-form__group p:first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content .tox-form__group h1:last-child, +.tox .tox-dialog__body-content .tox-form__group h2:last-child, +.tox .tox-dialog__body-content .tox-form__group p:last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content .tox-form__group h1:only-child, +.tox .tox-dialog__body-content .tox-form__group h2:only-child, +.tox .tox-dialog__body-content .tox-form__group p:only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog--width-lg { + height: 650px; + max-width: 1200px; +} +.tox .tox-dialog--width-md { + max-width: 800px; +} +.tox .tox-dialog--width-md .tox-dialog__body-content { + overflow: auto; +} +.tox .tox-dialog__body-content--centered { + text-align: center; +} +.tox .tox-dialog__footer { + align-items: center; + background-color: #fff; + border-top: 1px solid #d9d9d9; + display: flex; + justify-content: space-between; + padding: 5px 10px; +} +.tox .tox-dialog__footer-start, +.tox .tox-dialog__footer-end { + display: flex; +} +.tox .tox-dialog__busy-spinner { + align-items: center; + background-color: rgba(255, 255, 255, 0.75); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 3; +} +.tox .tox-dialog__table { + border-collapse: collapse; + width: 100%; +} +.tox .tox-dialog__table thead th { + font-weight: normal; + padding-bottom: 5px; +} +.tox .tox-dialog__table tbody tr { + border-bottom: 1px solid #d9d9d9; +} +.tox .tox-dialog__table tbody tr:last-child { + border-bottom: none; +} +.tox .tox-dialog__table td { + padding-bottom: 5px; + padding-top: 5px; +} +.tox .tox-dialog__popups { + position: absolute; + width: 100%; + z-index: 1100; +} +.tox .tox-dialog__body-iframe { + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; +} +.tox .tox-dialog__body-iframe .tox-navobj { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) { + flex: 1; + -ms-flex-preferred-size: auto; + height: 100%; +} +.tox .tox-dialog-dock-fadeout { + opacity: 0; + visibility: hidden; +} +.tox .tox-dialog-dock-fadein { + opacity: 1; + visibility: visible; +} +.tox .tox-dialog-dock-transition { + transition: visibility 0s linear 0.3s, opacity 0.3s ease; +} +.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein { + transition-delay: 0s; +} +.tox.tox-platform-ie { + /* IE11 CSS styles go here */ +} +.tox.tox-platform-ie .tox-dialog-wrap { + position: -ms-device-fixed; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav { + margin-right: 0; + } +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child) { + margin-left: 5px; + } +} +.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start > *, +.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end > * { + margin-left: 5px; +} +.tox[dir=rtl] .tox-dialog__body { + text-align: right; +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav { + margin-left: 0; + } +} +@media only screen and (max-width:767px) { + body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child) { + margin-right: 5px; + } +} +.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start > *, +.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end > * { + margin-right: 5px; +} +body.tox-dialog__disable-scroll { + overflow: hidden; +} +.tox .tox-dropzone-container { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-dropzone { + align-items: center; + background: #fff; + border: 2px dashed #d9d9d9; + box-sizing: border-box; + display: flex; + flex-direction: column; + flex-grow: 1; + justify-content: center; + min-height: 100px; + padding: 10px; +} +.tox .tox-dropzone p { + color: rgba(84, 111, 94, 0.7); + margin: 0 0 10px 0; +} +.tox .tox-edit-area { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; + overflow: hidden; + position: relative; +} +.tox .tox-edit-area__iframe { + background-color: #fff; + border: 0; + box-sizing: border-box; + flex: 1; + -ms-flex-preferred-size: auto; + height: 100%; + position: absolute; + width: 100%; +} +.tox.tox-inline-edit-area { + border: 1px dotted #d9d9d9; +} +.tox .tox-editor-container { + display: flex; + flex: 1 1 auto; + flex-direction: column; + overflow: hidden; +} +.tox .tox-editor-header { + z-index: 1; +} +.tox:not(.tox-tinymce-inline) .tox-editor-header { + box-shadow: none; + transition: box-shadow 0.5s; +} +.tox.tox-tinymce--toolbar-bottom .tox-editor-header, +.tox.tox-tinymce-inline .tox-editor-header { + margin-bottom: -1px; +} +.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: transparent; + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); +} +.tox-editor-dock-fadeout { + opacity: 0; + visibility: hidden; +} +.tox-editor-dock-fadein { + opacity: 1; + visibility: visible; +} +.tox-editor-dock-transition { + transition: visibility 0s linear 0.25s, opacity 0.25s ease; +} +.tox-editor-dock-transition.tox-editor-dock-fadein { + transition-delay: 0s; +} +.tox .tox-control-wrap { + flex: 1; + position: relative; +} +.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid, +.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown, +.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid { + display: none; +} +.tox .tox-control-wrap svg { + display: block; +} +.tox .tox-control-wrap__status-icon-wrap { + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-control-wrap__status-icon-invalid svg { + fill: #c00; +} +.tox .tox-control-wrap__status-icon-unknown svg { + fill: orange; +} +.tox .tox-control-wrap__status-icon-valid svg { + fill: green; +} +.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield, +.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield, +.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield { + padding-right: 20px; +} +.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap { + right: 2.5px; +} +.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield, +.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield, +.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield { + padding-left: 20px; +} +.tox[dir=rtl] .tox-control-wrap__status-icon-wrap { + left: 2.5px; +} +.tox .tox-autocompleter { + max-width: 25em; +} +.tox .tox-autocompleter .tox-menu { + max-width: 25em; +} +.tox .tox-autocompleter .tox-autocompleter-highlight { + font-weight: normal; +} +.tox .tox-color-input { + display: flex; + position: relative; + z-index: 1; +} +.tox .tox-color-input .tox-textfield { + z-index: -1; +} +.tox .tox-color-input span { + border-color: rgba(84, 111, 94, 0.2); + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + height: 24px; + position: absolute; + top: 6px; + width: 24px; +} +.tox .tox-color-input span:hover:not([aria-disabled=true]), +.tox .tox-color-input span:focus:not([aria-disabled=true]) { + border-color: #0a8fe9; + cursor: pointer; +} +.tox .tox-color-input span::before { + background-image: linear-gradient(45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), linear-gradient(-45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%), linear-gradient(-45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%); + background-position: 0 0, 0 6px, 6px -6px, -6px 0; + background-size: 12px 12px; + border: 1px solid #fff; + border-radius: 3px; + box-sizing: border-box; + content: ''; + height: 24px; + left: -1px; + position: absolute; + top: -1px; + width: 24px; + z-index: -1; +} +.tox .tox-color-input span[aria-disabled=true] { + cursor: not-allowed; +} +.tox:not([dir=rtl]) .tox-color-input { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox:not([dir=rtl]) .tox-color-input .tox-textfield { + padding-left: 36px; +} +.tox:not([dir=rtl]) .tox-color-input span { + left: 6px; +} +.tox[dir="rtl"] .tox-color-input { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox[dir="rtl"] .tox-color-input .tox-textfield { + padding-right: 36px; +} +.tox[dir="rtl"] .tox-color-input span { + right: 6px; +} +.tox .tox-label, +.tox .tox-toolbar-label { + color: rgba(84, 111, 94, 0.7); + display: block; + font-size: 8.75px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + padding: 0 5px 0 0; + text-transform: none; + white-space: nowrap; +} +.tox .tox-toolbar-label { + padding: 0 5px; +} +.tox[dir=rtl] .tox-label { + padding: 0 0 0 5px; +} +.tox .tox-form { + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group { + box-sizing: border-box; + margin-bottom: 2.5px; +} +.tox .tox-form-group--maximize { + flex: 1; +} +.tox .tox-form__group--error { + color: #c00; +} +.tox .tox-form__group--collection { + display: flex; +} +.tox .tox-form__grid { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; +} +.tox .tox-form__grid--2col > .tox-form__group { + width: calc(50% - (5px / 2)); +} +.tox .tox-form__grid--3col > .tox-form__group { + width: calc(100% / 3 - (5px / 2)); +} +.tox .tox-form__grid--4col > .tox-form__group { + width: calc(25% - (5px / 2)); +} +.tox .tox-form__controls-h-stack { + align-items: center; + display: flex; +} +.tox .tox-form__group--inline { + align-items: center; + display: flex; +} +.tox .tox-form__group--stretched { + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group--stretched .tox-textarea { + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group--stretched .tox-navobj { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group--stretched .tox-navobj :nth-child(2) { + flex: 1; + -ms-flex-preferred-size: auto; + height: 100%; +} +.tox:not([dir=rtl]) .tox-form__controls-h-stack > *:not(:first-child) { + margin-left: 2.5px; +} +.tox[dir=rtl] .tox-form__controls-h-stack > *:not(:first-child) { + margin-right: 2.5px; +} +.tox .tox-lock.tox-locked .tox-lock-icon__unlock, +.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock { + display: none; +} +.tox .tox-textfield, +.tox .tox-toolbar-textfield, +.tox .tox-listboxfield .tox-listbox--select, +.tox .tox-textarea { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #d9d9d9; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: rgba(84, 111, 94, 0.85); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 10px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: none; + padding: 5px 3.25px; + resize: none; + width: 100%; +} +.tox .tox-textfield[disabled], +.tox .tox-textarea[disabled] { + background-color: #f2f2f2; + color: rgba(84, 111, 94, 0.85); + cursor: not-allowed; +} +.tox .tox-textfield:focus, +.tox .tox-listboxfield .tox-listbox--select:focus, +.tox .tox-textarea:focus { + background-color: #fff; + border-color: #0a8fe9; + box-shadow: none; + outline: none; +} +.tox .tox-toolbar-textfield { + border-width: 0; + margin-bottom: 3px; + margin-top: 2px; + max-width: 250px; +} +.tox .tox-naked-btn { + background-color: transparent; + border: 0; + border-color: transparent; + box-shadow: unset; + color: #0a8fe9; + cursor: pointer; + display: block; + margin: 0; + padding: 0; +} +.tox .tox-naked-btn svg { + display: block; + fill: rgba(84, 111, 94, 0.85); +} +.tox:not([dir=rtl]) .tox-toolbar-textfield + * { + margin-left: 2.5px; +} +.tox[dir=rtl] .tox-toolbar-textfield + * { + margin-right: 2.5px; +} +.tox .tox-listboxfield { + cursor: pointer; + position: relative; +} +.tox .tox-listboxfield .tox-listbox--select[disabled] { + background-color: #f2f2f2; + color: rgba(84, 111, 94, 0.85); + cursor: not-allowed; +} +.tox .tox-listbox__select-label { + cursor: default; + flex: 1; + margin: 0 4px; +} +.tox .tox-listbox__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 10px; +} +.tox .tox-listbox__select-chevron svg { + fill: rgba(84, 111, 94, 0.85); +} +.tox .tox-listboxfield .tox-listbox--select { + align-items: center; + display: flex; +} +.tox:not([dir=rtl]) .tox-listboxfield svg { + right: 5px; +} +.tox[dir=rtl] .tox-listboxfield svg { + left: 5px; +} +.tox .tox-selectfield { + cursor: pointer; + position: relative; +} +.tox .tox-selectfield select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #d9d9d9; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: rgba(84, 111, 94, 0.85); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 10px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: none; + padding: 5px 3.25px; + resize: none; + width: 100%; +} +.tox .tox-selectfield select[disabled] { + background-color: #f2f2f2; + color: rgba(84, 111, 94, 0.85); + cursor: not-allowed; +} +.tox .tox-selectfield select::-ms-expand { + display: none; +} +.tox .tox-selectfield select:focus { + background-color: #fff; + border-color: #0a8fe9; + box-shadow: none; + outline: none; +} +.tox .tox-selectfield svg { + pointer-events: none; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox:not([dir=rtl]) .tox-selectfield select[size="0"], +.tox:not([dir=rtl]) .tox-selectfield select[size="1"] { + padding-right: 15px; +} +.tox:not([dir=rtl]) .tox-selectfield svg { + right: 5px; +} +.tox[dir=rtl] .tox-selectfield select[size="0"], +.tox[dir=rtl] .tox-selectfield select[size="1"] { + padding-left: 15px; +} +.tox[dir=rtl] .tox-selectfield svg { + left: 5px; +} +.tox .tox-textarea { + -webkit-appearance: textarea; + -moz-appearance: textarea; + appearance: textarea; + white-space: pre-wrap; +} +.tox-fullscreen { + border: 0; + height: 100%; + left: 0; + margin: 0; + overflow: hidden; + -ms-scroll-chaining: none; + overscroll-behavior: none; + padding: 0; + position: fixed; + top: 0; + touch-action: pinch-zoom; + width: 100%; +} +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; + z-index: 1200; +} +.tox-shadowhost.tox-fullscreen { + z-index: 1200; +} +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} +.tox .tox-help__more-link { + list-style: none; + margin-top: 1em; +} +.tox .tox-image-tools { + width: 100%; +} +.tox .tox-image-tools__toolbar { + align-items: center; + display: flex; + justify-content: center; +} +.tox .tox-image-tools__image { + background-color: #666; + height: 380px; + overflow: auto; + position: relative; + width: 100%; +} +.tox .tox-image-tools__image, +.tox .tox-image-tools__image + .tox-image-tools__toolbar { + margin-top: 5px; +} +.tox .tox-image-tools__image-bg { + background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==); +} +.tox .tox-image-tools__toolbar > .tox-spacer { + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-croprect-block { + background: black; + filter: alpha(opacity=50); + opacity: 0.5; + position: absolute; + zoom: 1; +} +.tox .tox-croprect-handle { + border: 2px solid white; + height: 20px; + left: 0; + position: absolute; + top: 0; + width: 20px; +} +.tox .tox-croprect-handle-move { + border: 0; + cursor: move; + position: absolute; +} +.tox .tox-croprect-handle-nw { + border-width: 2px 0 0 2px; + cursor: nw-resize; + left: 100px; + margin: -2px 0 0 -2px; + top: 100px; +} +.tox .tox-croprect-handle-ne { + border-width: 2px 2px 0 0; + cursor: ne-resize; + left: 200px; + margin: -2px 0 0 -20px; + top: 100px; +} +.tox .tox-croprect-handle-sw { + border-width: 0 0 2px 2px; + cursor: sw-resize; + left: 100px; + margin: -20px 2px 0 -2px; + top: 200px; +} +.tox .tox-croprect-handle-se { + border-width: 0 2px 2px 0; + cursor: se-resize; + left: 200px; + margin: -20px 0 0 -20px; + top: 200px; +} +.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-slider:not(:first-of-type) { + margin-left: 5px; +} +.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-button + .tox-slider { + margin-left: 20px; +} +.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-slider + .tox-button { + margin-left: 20px; +} +.tox[dir=rtl] .tox-image-tools__toolbar > .tox-slider:not(:first-of-type) { + margin-right: 5px; +} +.tox[dir=rtl] .tox-image-tools__toolbar > .tox-button + .tox-slider { + margin-right: 20px; +} +.tox[dir=rtl] .tox-image-tools__toolbar > .tox-slider + .tox-button { + margin-right: 20px; +} +.tox .tox-insert-table-picker { + display: flex; + flex-wrap: wrap; + width: 110px; +} +.tox .tox-insert-table-picker > div { + border-color: #d9d9d9; + border-style: solid; + border-width: 0 1px 1px 0; + box-sizing: border-box; + height: 11px; + width: 11px; +} +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: -2.5px 0; +} +.tox .tox-insert-table-picker .tox-insert-table-picker__selected { + background-color: rgba(10, 143, 233, 0.5); + border-color: rgba(10, 143, 233, 0.5); +} +.tox .tox-insert-table-picker__label { + color: rgba(84, 111, 94, 0.7); + display: block; + font-size: 8.75px; + padding: 2.5px; + text-align: center; + width: 100%; +} +.tox:not([dir=rtl]) { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox:not([dir=rtl]) .tox-insert-table-picker > div:nth-child(10n) { + border-right: 0; +} +.tox[dir=rtl] { + /* stylelint-disable-next-line no-descending-specificity */ +} +.tox[dir=rtl] .tox-insert-table-picker > div:nth-child(10n+1) { + border-right: 0; +} +.tox { + /* stylelint-disable */ + /* stylelint-enable */ +} +.tox .tox-menu { + background-color: #fff; + border: 1px solid #d9d9d9; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(84, 111, 94, 0.1); + display: inline-block; + overflow: hidden; + vertical-align: top; + z-index: 1150; +} +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0; +} +.tox .tox-menu.tox-collection.tox-collection--toolbar { + padding: 2.5px; +} +.tox .tox-menu.tox-collection.tox-collection--grid { + padding: 2.5px; +} +.tox .tox-menu__label h1, +.tox .tox-menu__label h2, +.tox .tox-menu__label h3, +.tox .tox-menu__label h4, +.tox .tox-menu__label h5, +.tox .tox-menu__label h6, +.tox .tox-menu__label p, +.tox .tox-menu__label blockquote, +.tox .tox-menu__label code { + margin: 0; +} +.tox .tox-menubar { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23d9d9d9'/%3E%3C/svg%3E") left 0 top 0 #fff; + background-color: #fff; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 4px 0 4px; +} +.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar { + border-top: 1px solid #d9d9d9; +} +/* Deprecated. Remove in next major release */ +.tox .tox-mbtn { + align-items: center; + background: transparent; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #817f7c; + display: flex; + flex: 0 0 auto; + font-size: 8.75px; + font-style: normal; + font-weight: normal; + height: 34px; + justify-content: center; + margin: 2px 0 3px 0; + outline: none; + overflow: hidden; + padding: 0 4px; + text-transform: none; + width: auto; +} +.tox .tox-mbtn[disabled] { + background-color: transparent; + border: 0; + box-shadow: none; + color: rgba(129, 127, 124, 0.5); + cursor: not-allowed; +} +.tox .tox-mbtn:focus:not(:disabled) { + background: #e5e9e7; + border: 0; + box-shadow: none; + color: #0a9fe5; +} +.tox .tox-mbtn--active { + background: #e5e9e7; + border: 0; + box-shadow: none; + color: rgba(41, 159, 250, 0.88); +} +.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) { + background: #e5e9e7; + border: 0; + box-shadow: none; + color: #0a9fe5; +} +.tox .tox-mbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} +.tox .tox-mbtn[disabled] .tox-mbtn__select-label { + cursor: not-allowed; +} +.tox .tox-mbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; + display: none; +} +.tox .tox-notification { + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + display: -ms-grid; + display: grid; + font-size: 8.75px; + font-weight: normal; + -ms-grid-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + margin-top: 2.5px; + opacity: 0; + padding: 2.5px; + transition: transform 100ms ease-in, opacity 150ms ease-in; +} +.tox .tox-notification p { + font-size: 8.75px; + font-weight: normal; +} +.tox .tox-notification a { + cursor: pointer; + text-decoration: underline; +} +.tox .tox-notification--in { + opacity: 1; +} +.tox .tox-notification--success { + background-color: #e4eeda; + border-color: #d7e6c8; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-notification--success p { + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-notification--success a { + color: #547831; +} +.tox .tox-notification--success svg { + fill: rgba(84, 111, 94, 0.85); +} +.tox .tox-notification--error { + background-color: #f8dede; + border-color: #f2bfbf; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-notification--error p { + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-notification--error a { + color: #c00; +} +.tox .tox-notification--error svg { + fill: rgba(84, 111, 94, 0.85); +} +.tox .tox-notification--warn, +.tox .tox-notification--warning { + background-color: #fffaea; + border-color: #ffe89d; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-notification--warn p, +.tox .tox-notification--warning p { + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-notification--warn a, +.tox .tox-notification--warning a { + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-notification--warn svg, +.tox .tox-notification--warning svg { + fill: rgba(84, 111, 94, 0.85); +} +.tox .tox-notification--info { + background-color: #d9edf7; + border-color: #779ecb; + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-notification--info p { + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-notification--info a { + color: rgba(84, 111, 94, 0.85); +} +.tox .tox-notification--info svg { + fill: rgba(84, 111, 94, 0.85); +} +.tox .tox-notification__body { + -ms-grid-row-align: center; + align-self: center; + color: rgba(84, 111, 94, 0.85); + font-size: 14px; + -ms-grid-column-span: 1; + grid-column-end: 3; + -ms-grid-column: 2; + grid-column-start: 2; + -ms-grid-row-span: 1; + grid-row-end: 2; + -ms-grid-row: 1; + grid-row-start: 1; + text-align: center; + white-space: normal; + word-break: break-all; + word-break: break-word; +} +.tox .tox-notification__body > * { + margin: 0; +} +.tox .tox-notification__body > * + * { + margin-top: 1rem; +} +.tox .tox-notification__icon { + -ms-grid-row-align: center; + align-self: center; + -ms-grid-column-span: 1; + grid-column-end: 2; + -ms-grid-column: 1; + grid-column-start: 1; + -ms-grid-row-span: 1; + grid-row-end: 2; + -ms-grid-row: 1; + grid-row-start: 1; + -ms-grid-column-align: end; + justify-self: end; +} +.tox .tox-notification__icon svg { + display: block; +} +.tox .tox-notification__dismiss { + -ms-grid-row-align: start; + align-self: start; + -ms-grid-column-span: 1; + grid-column-end: 4; + -ms-grid-column: 3; + grid-column-start: 3; + -ms-grid-row-span: 1; + grid-row-end: 2; + -ms-grid-row: 1; + grid-row-start: 1; + -ms-grid-column-align: end; + justify-self: end; +} +.tox .tox-notification .tox-progress-bar { + -ms-grid-column-span: 3; + grid-column-end: 4; + -ms-grid-column: 1; + grid-column-start: 1; + -ms-grid-row-span: 1; + grid-row-end: 3; + -ms-grid-row: 2; + grid-row-start: 2; + -ms-grid-column-align: center; + justify-self: center; +} +.tox .tox-pop { + display: inline-block; + position: relative; +} +.tox .tox-pop--resizing { + transition: width 0.1s ease; +} +.tox .tox-pop--resizing .tox-toolbar, +.tox .tox-pop--resizing .tox-toolbar__group { + flex-wrap: nowrap; +} +.tox .tox-pop--transition { + transition: 0.15s ease; + transition-property: left, right, top, bottom; +} +.tox .tox-pop--transition::before, +.tox .tox-pop--transition::after { + transition: all 0.15s, visibility 0s, opacity 0.075s ease 0.075s; +} +.tox .tox-pop__dialog { + background-color: #fff; + border: 1px solid #d9d9d9; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); + min-width: 0; + overflow: hidden; +} +.tox .tox-pop__dialog > *:not(.tox-toolbar) { + margin: 2.5px 2.5px 2.5px 5px; +} +.tox .tox-pop__dialog .tox-toolbar { + background-color: transparent; + margin-bottom: -1px; +} +.tox .tox-pop::before, +.tox .tox-pop::after { + border-style: solid; + content: ''; + display: block; + height: 0; + opacity: 1; + position: absolute; + width: 0; +} +.tox .tox-pop.tox-pop--inset::before, +.tox .tox-pop.tox-pop--inset::after { + opacity: 0; + transition: all 0s 0.15s, visibility 0s, opacity 0.075s ease; +} +.tox .tox-pop.tox-pop--bottom::before, +.tox .tox-pop.tox-pop--bottom::after { + left: 50%; + top: 100%; +} +.tox .tox-pop.tox-pop--bottom::after { + border-color: #fff transparent transparent transparent; + border-width: 8px; + margin-left: -8px; + margin-top: -1px; +} +.tox .tox-pop.tox-pop--bottom::before { + border-color: #d9d9d9 transparent transparent transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--top::before, +.tox .tox-pop.tox-pop--top::after { + left: 50%; + top: 0; + transform: translateY(-100%); +} +.tox .tox-pop.tox-pop--top::after { + border-color: transparent transparent #fff transparent; + border-width: 8px; + margin-left: -8px; + margin-top: 1px; +} +.tox .tox-pop.tox-pop--top::before { + border-color: transparent transparent #d9d9d9 transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--left::before, +.tox .tox-pop.tox-pop--left::after { + left: 0; + top: calc(50% - 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--left::after { + border-color: transparent #fff transparent transparent; + border-width: 8px; + margin-left: -15px; +} +.tox .tox-pop.tox-pop--left::before { + border-color: transparent #d9d9d9 transparent transparent; + border-width: 10px; + margin-left: -19px; +} +.tox .tox-pop.tox-pop--right::before, +.tox .tox-pop.tox-pop--right::after { + left: 100%; + top: calc(50% + 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--right::after { + border-color: transparent transparent transparent #fff; + border-width: 8px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--right::before { + border-color: transparent transparent transparent #d9d9d9; + border-width: 10px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--align-left::before, +.tox .tox-pop.tox-pop--align-left::after { + left: 20px; +} +.tox .tox-pop.tox-pop--align-right::before, +.tox .tox-pop.tox-pop--align-right::after { + left: calc(100% - 20px); +} +.tox .tox-sidebar-wrap { + display: flex; + flex-direction: row; + flex-grow: 1; + -ms-flex-preferred-size: 0; + min-height: 0; +} +.tox .tox-sidebar { + background-color: #fff; + display: flex; + flex-direction: row; + justify-content: flex-end; +} +.tox .tox-sidebar__slider { + display: flex; + overflow: hidden; +} +.tox .tox-sidebar__pane-container { + display: flex; +} +.tox .tox-sidebar__pane { + display: flex; +} +.tox .tox-sidebar--sliding-closed { + opacity: 0; +} +.tox .tox-sidebar--sliding-open { + opacity: 1; +} +.tox .tox-sidebar--sliding-growing, +.tox .tox-sidebar--sliding-shrinking { + transition: width 0.5s ease, opacity 0.5s ease; +} +.tox .tox-selector { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + display: inline-block; + height: 10px; + position: absolute; + width: 10px; +} +.tox.tox-platform-touch .tox-selector { + height: 12px; + width: 12px; +} +.tox .tox-slider { + align-items: center; + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; + height: 24px; + justify-content: center; + position: relative; +} +.tox .tox-slider__rail { + background-color: transparent; + border: 1px solid #d9d9d9; + border-radius: 3px; + height: 10px; + min-width: 120px; + width: 100%; +} +.tox .tox-slider__handle { + background-color: #0a8fe9; + border: 2px solid #0871b8; + border-radius: 3px; + box-shadow: none; + height: 24px; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: 14px; +} +.tox .tox-source-code { + overflow: auto; +} +.tox .tox-spinner { + display: flex; +} +.tox .tox-spinner > div { + animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both; + background-color: rgba(84, 111, 94, 0.7); + border-radius: 100%; + height: 5px; + width: 5px; +} +.tox .tox-spinner > div:nth-child(1) { + animation-delay: -0.32s; +} +.tox .tox-spinner > div:nth-child(2) { + animation-delay: -0.16s; +} +@keyframes tam-bouncing-dots { + 0%, + 80%, + 100% { + transform: scale(0); + } + 40% { + transform: scale(1); + } +} +.tox:not([dir=rtl]) .tox-spinner > div:not(:first-child) { + margin-left: 2.5px; +} +.tox[dir=rtl] .tox-spinner > div:not(:first-child) { + margin-right: 2.5px; +} +.tox .tox-statusbar { + align-items: center; + background-color: #fff; + border-top: 1px solid #d9d9d9; + color: rgba(84, 111, 94, 0.7); + display: flex; + flex: 0 0 auto; + font-size: 12px; + font-weight: normal; + height: 18px; + overflow: hidden; + padding: 0 5px; + position: relative; + text-transform: uppercase; +} +.tox .tox-statusbar__text-container { + display: flex; + flex: 1 1 auto; + justify-content: flex-end; + overflow: hidden; +} +.tox .tox-statusbar__path { + display: flex; + flex: 1 1 auto; + margin-right: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tox .tox-statusbar__path > * { + display: inline; + white-space: nowrap; +} +.tox .tox-statusbar__wordcount { + flex: 0 0 auto; + margin-left: 1ch; +} +.tox .tox-statusbar a, +.tox .tox-statusbar__path-item, +.tox .tox-statusbar__wordcount { + color: rgba(84, 111, 94, 0.7); + text-decoration: none; +} +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]) { + cursor: pointer; + text-decoration: underline; +} +.tox .tox-statusbar__resize-handle { + align-items: flex-end; + align-self: stretch; + cursor: nwse-resize; + display: flex; + flex: 0 0 auto; + justify-content: flex-end; + margin-left: auto; + margin-right: -5px; + padding-left: 1ch; +} +.tox .tox-statusbar__resize-handle svg { + display: block; + fill: rgba(84, 111, 94, 0.7); +} +.tox .tox-statusbar__resize-handle:focus svg { + background-color: #e5e9e7; + border-radius: 1px; + box-shadow: 0 0 0 2px #e5e9e7; +} +.tox:not([dir=rtl]) .tox-statusbar__path > * { + margin-right: 2.5px; +} +.tox:not([dir=rtl]) .tox-statusbar__branding { + margin-left: 1ch; +} +.tox[dir=rtl] .tox-statusbar { + flex-direction: row-reverse; +} +.tox[dir=rtl] .tox-statusbar__path > * { + margin-left: 2.5px; +} +.tox .tox-throbber { + z-index: 1299; +} +.tox .tox-throbber__busy-spinner { + align-items: center; + background-color: rgba(255, 255, 255, 0.6); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.tox .tox-tbtn { + align-items: center; + background: transparent; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #817f7c; + display: flex; + flex: 0 0 auto; + font-size: 8.75px; + font-style: normal; + font-weight: normal; + height: 34px; + justify-content: center; + margin: 2px 0 3px 0; + outline: none; + overflow: hidden; + padding: 0; + text-transform: none; + width: 34px; +} +.tox .tox-tbtn svg { + display: block; + fill: #817f7c; +} +.tox .tox-tbtn.tox-tbtn-more { + padding-left: 5px; + padding-right: 5px; + width: inherit; +} +.tox .tox-tbtn:focus { + background: #e5e9e7; + border: 0; + box-shadow: none; +} +.tox .tox-tbtn:hover { + background: #e5e9e7; + border: 0; + box-shadow: none; + color: #0a9fe5; +} +.tox .tox-tbtn:hover svg { + fill: #0a9fe5; +} +.tox .tox-tbtn:active { + background: #e5e9e7; + border: 0; + box-shadow: none; + color: rgba(41, 159, 250, 0.88); +} +.tox .tox-tbtn:active svg { + fill: rgba(41, 159, 250, 0.88); +} +.tox .tox-tbtn--disabled, +.tox .tox-tbtn--disabled:hover, +.tox .tox-tbtn:disabled, +.tox .tox-tbtn:disabled:hover { + background: transparent; + border: 0; + box-shadow: none; + color: rgba(129, 127, 124, 0.5); + cursor: not-allowed; +} +.tox .tox-tbtn--disabled svg, +.tox .tox-tbtn--disabled:hover svg, +.tox .tox-tbtn:disabled svg, +.tox .tox-tbtn:disabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: rgba(129, 127, 124, 0.5); +} +.tox .tox-tbtn--enabled, +.tox .tox-tbtn--enabled:hover { + background: #e5e9e7; + border: 0; + box-shadow: none; + color: rgba(41, 159, 250, 0.88); +} +.tox .tox-tbtn--enabled > *, +.tox .tox-tbtn--enabled:hover > * { + transform: none; +} +.tox .tox-tbtn--enabled svg, +.tox .tox-tbtn--enabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: rgba(41, 159, 250, 0.88); +} +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) { + color: #ee930e; +} +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg { + fill: #ee930e; +} +.tox .tox-tbtn:active > * { + transform: none; +} +.tox .tox-tbtn--md { + height: 51px; + width: 51px; +} +.tox .tox-tbtn--lg { + flex-direction: column; + height: 68px; + width: 68px; +} +.tox .tox-tbtn--return { + -ms-grid-row-align: stretch; + align-self: stretch; + height: unset; + width: 16px; +} +.tox .tox-tbtn--labeled { + padding: 0 4px; + width: unset; +} +.tox .tox-tbtn__vlabel { + display: block; + font-size: 10px; + font-weight: normal; + letter-spacing: -0.025em; + margin-bottom: 2.5px; + white-space: nowrap; +} +.tox .tox-tbtn--select { + margin: 2px 0 3px 0; + padding: 0 4px; + width: auto; +} +.tox .tox-tbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} +.tox .tox-tbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 10px; +} +.tox .tox-tbtn__select-chevron svg { + fill: rgba(129, 127, 124, 0.5); +} +.tox .tox-tbtn--bespoke .tox-tbtn__select-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 7em; +} +.tox .tox-split-button { + border: 0; + border-radius: 3px; + box-sizing: border-box; + display: flex; + margin: 2px 0 3px 0; + overflow: hidden; +} +.tox .tox-split-button:hover { + box-shadow: 0 0 0 1px #e5e9e7 inset; +} +.tox .tox-split-button:focus { + background: #e5e9e7; + box-shadow: none; + color: #ee930e; +} +.tox .tox-split-button > * { + border-radius: 0; +} +.tox .tox-split-button__chevron { + width: 10px; +} +.tox .tox-split-button__chevron svg { + fill: rgba(129, 127, 124, 0.5); +} +.tox .tox-split-button .tox-tbtn { + margin: 0; +} +.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child { + width: 30px; +} +.tox.tox-platform-touch .tox-split-button__chevron { + width: 14px; +} +.tox .tox-split-button.tox-tbtn--disabled:hover, +.tox .tox-split-button.tox-tbtn--disabled:focus, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus { + background: transparent; + box-shadow: none; + color: rgba(129, 127, 124, 0.5); +} +.tox .tox-toolbar-overlord { + background-color: #fff; +} +.tox .tox-toolbar, +.tox .tox-toolbar__primary, +.tox .tox-toolbar__overflow { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23d9d9d9'/%3E%3C/svg%3E") left 0 top 0 #fff; + background-color: #fff; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 0; +} +.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed { + height: 0; + opacity: 0; + padding-bottom: 0; + padding-top: 0; + visibility: hidden; +} +.tox .tox-toolbar__overflow--growing { + transition: height 0.3s ease, opacity 0.2s linear 0.1s; +} +.tox .tox-toolbar__overflow--shrinking { + transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s; +} +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord .tox-toolbar__primary { + border-top: 1px solid #d9d9d9; + margin-top: -1px; +} +.tox .tox-toolbar--scrolling { + flex-wrap: nowrap; + overflow-x: auto; +} +.tox .tox-pop .tox-toolbar { + border-width: 0; +} +.tox .tox-toolbar--no-divider { + background-image: none; +} +.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child, +.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary { + border-top: 1px solid #d9d9d9; +} +.tox.tox-tinymce-aux .tox-toolbar__overflow { + background-color: #fff; + border: 1px solid #d9d9d9; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); +} +.tox .tox-toolbar__group { + align-items: center; + display: flex; + flex-wrap: wrap; + margin: 0 0; + padding: 0 4px 0 4px; +} +.tox .tox-toolbar__group--pull-right { + margin-left: auto; +} +.tox .tox-toolbar--scrolling .tox-toolbar__group { + flex-shrink: 0; + flex-wrap: nowrap; +} +.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type) { + border-right: 1px solid #d9d9d9; +} +.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type) { + border-left: 1px solid #d9d9d9; +} +.tox .tox-tooltip { + display: inline-block; + padding: 5px; + position: relative; +} +.tox .tox-tooltip__body { + background-color: rgba(84, 111, 94, 0.85); + border-radius: 3px; + box-shadow: 0 2px 4px rgba(84, 111, 94, 0.3); + color: rgba(255, 255, 255, 0.75); + font-size: 8.75px; + font-style: normal; + font-weight: normal; + padding: 2.5px 5px; + text-transform: none; +} +.tox .tox-tooltip__arrow { + position: absolute; +} +.tox .tox-tooltip--down .tox-tooltip__arrow { + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid rgba(84, 111, 94, 0.85); + bottom: 0; + left: 50%; + position: absolute; + transform: translateX(-50%); +} +.tox .tox-tooltip--up .tox-tooltip__arrow { + border-bottom: 5px solid rgba(84, 111, 94, 0.85); + border-left: 5px solid transparent; + border-right: 5px solid transparent; + left: 50%; + position: absolute; + top: 0; + transform: translateX(-50%); +} +.tox .tox-tooltip--right .tox-tooltip__arrow { + border-bottom: 5px solid transparent; + border-left: 5px solid rgba(84, 111, 94, 0.85); + border-top: 5px solid transparent; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-tooltip--left .tox-tooltip__arrow { + border-bottom: 5px solid transparent; + border-right: 5px solid rgba(84, 111, 94, 0.85); + border-top: 5px solid transparent; + left: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-well { + border: 1px solid #d9d9d9; + border-radius: 3px; + padding: 5px; + width: 100%; +} +.tox .tox-well > *:first-child { + margin-top: 0; +} +.tox .tox-well > *:last-child { + margin-bottom: 0; +} +.tox .tox-well > *:only-child { + margin: 0; +} +.tox .tox-custom-editor { + border: 1px solid #d9d9d9; + border-radius: 3px; + display: flex; + flex: 1; + position: relative; +} +/* stylelint-disable */ +.tox { + /* stylelint-enable */ +} +.tox .tox-dialog-loading::before { + background-color: rgba(0, 0, 0, 0.5); + content: ""; + height: 100%; + position: absolute; + width: 100%; + z-index: 1000; +} +.tox .tox-tab { + cursor: pointer; +} +.tox .tox-dialog__content-js { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-dialog__body-content .tox-collection { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-image-tools-edit-panel { + height: 60px; +} +.tox .tox-image-tools__sidebar { + height: 60px; +} diff --git a/public/resource/tinymce/skins/ui/jeecg/skin.min.css b/public/resource/tinymce/skins/ui/jeecg/skin.min.css new file mode 100644 index 0000000..c86e0c1 --- /dev/null +++ b/public/resource/tinymce/skins/ui/jeecg/skin.min.css @@ -0,0 +1,7 @@ +/** +* Copyright (c) Tiny Technologies, Inc. All rights reserved. +* Licensed under the LGPL or a commercial license. +* For LGPL see License.txt in the project root for license information. +* For commercial licenses see https://www.tiny.cloud/ +*/ +.tox{box-shadow:none;box-sizing:content-box;color:rgba(84,111,94,.85);cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:10px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #d9d9d9;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce-inline{border:none;box-shadow:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #d9d9d9;border-radius:0;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{transform:rotateY(180deg)}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:2.5px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #d9d9d9;border-radius:3px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:2.5px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:2.5px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#d9d9d9;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(10,143,233,.1);border-color:rgba(10,143,233,.4);color:rgba(84,111,94,.85)}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:rgba(10,143,233,.4)}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#0a8fe9}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#0a8fe9}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#0a8fe9}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.1);border-color:rgba(255,165,0,.5);color:rgba(84,111,94,.85)}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.5)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.1);border-color:rgba(204,0,0,.4);color:rgba(84,111,94,.85)}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.4)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#c00}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.1);border-color:rgba(120,171,70,.4);color:rgba(84,111,94,.85)}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.4)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:2.5px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:2.5px 2.5px 2.5px 5px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:2.5px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:2.5px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:2.5px 5px 2.5px 2.5px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:2.5px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#0a8fe9;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#0a8fe9;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:8.75px;font-style:normal;font-weight:400;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:2.5px 10px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button[disabled]{background-color:#0a8fe9;background-image:none;border-color:#0a8fe9;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#0980d1;background-image:none;border-color:#0980d1;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#0980d1;background-image:none;border-color:#0980d1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#0871b8;background-image:none;border-color:#0871b8;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#f0f0f0;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#f0f0f0;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;color:rgba(84,111,94,.85);font-size:8.75px;font-style:normal;font-weight:400;letter-spacing:normal;outline:0;padding:2.5px 10px;text-decoration:none;text-transform:none}.tox .tox-button--secondary[disabled]{background-color:#f0f0f0;background-image:none;border-color:#f0f0f0;box-shadow:none;color:rgba(84,111,94,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:rgba(84,111,94,.85)}.tox .tox-button--secondary:hover:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:rgba(84,111,94,.85)}.tox .tox-button--secondary:active:not(:disabled){background-color:#d6d6d6;background-image:none;border-color:#d6d6d6;box-shadow:none;color:rgba(84,111,94,.85)}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:2.5px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:10px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:8.75px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:rgba(84,111,94,.85)}.tox .tox-button--naked[disabled]{background-color:#f0f0f0;border-color:#f0f0f0;box-shadow:none;color:rgba(84,111,94,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:rgba(84,111,94,.85)}.tox .tox-button--naked:focus:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:rgba(84,111,94,.85)}.tox .tox-button--naked:active:not(:disabled){background-color:#d6d6d6;border-color:#d6d6d6;box-shadow:none;color:rgba(84,111,94,.85)}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:rgba(84,111,94,.85)}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(2.5px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(84,111,94,.3)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#0a8fe9}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#0a8fe9}.tox .tox-checkbox--disabled{color:rgba(84,111,94,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(84,111,94,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(84,111,94,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(84,111,94,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #0a8fe9;padding:calc(2.5px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:2.5px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:2.5px}.tox[dir=rtl] .tox-checkbox__label{margin-right:2.5px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:2.5px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#d9d9d9;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:2.5px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#f3f3f3;color:rgba(84,111,94,.7);cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:2.5px;margin-top:-2.5px;padding:2.5px 5px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:rgba(84,111,94,.85);cursor:pointer;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:2.5px 5px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:2.5px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:2.5px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#fff;color:rgba(84,111,94,.85)}.tox .tox-collection--list .tox-collection__item--active{background-color:#e5e9e7}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#e5e9e7;color:rgba(84,111,94,.85)}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#e5e9e7}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#e5e9e7;color:rgba(84,111,94,.85)}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#e5e9e7;color:rgba(84,111,94,.85)}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:rgba(84,111,94,.85)}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:rgba(84,111,94,.85)}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;-ms-flex-preferred-size:auto;font-size:8.75px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(84,111,94,.7);display:inline-block;font-size:8.75px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:rgba(84,111,94,.85)}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(84,111,94,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(84,111,94,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#fff;border:1px solid #d9d9d9;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 2.5px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #d9d9d9}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:5px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:2.5px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:10px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:10px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #d9d9d9}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:5px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:2.5px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:10px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:10px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-2.5px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#e5e9e7}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#fff;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:5px}.tox .tox-comment{background:#fff;border:1px solid #d9d9d9;border-radius:3px;box-shadow:0 4px 8px 0 rgba(84,111,94,.1);padding:5px 5px 10px 5px;position:relative}.tox .tox-comment__header{align-items:center;color:rgba(84,111,94,.85);display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(84,111,94,.7);font-size:12px}.tox .tox-comment__body{color:rgba(84,111,94,.85);font-size:8.75px;font-style:normal;font-weight:400;line-height:1.3;margin-top:5px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:5px}.tox .tox-comment__expander p{color:rgba(84,111,94,.7);font-size:8.75px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:10px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#fff;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:5px}.tox .tox-comment__reply>:first-child{margin-bottom:5px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:10px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(255,255,255,0),#fff);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#fff;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:rgba(84,111,94,.85);display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:10px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:8.75px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#fff;box-shadow:0 0 8px 8px #fff;color:rgba(84,111,94,.85);text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#fff;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:5px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:5px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:5px}.tox[dir=rtl] .tox-comment__edit{margin-right:5px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:5px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(84,111,94,.7)}.tox .tox-user__name{color:rgba(84,111,94,.7);font-size:12px;font-style:normal;font-weight:400;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:5px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:5px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:5px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:5px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(255,255,255,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#fff}.tox .tox-dialog{background-color:#fff;border-color:#d9d9d9;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(84,111,94,.15),0 0 40px 1px rgba(84,111,94,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:5px auto;width:calc(100vw - 10px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#fff;border-bottom:none;color:rgba(84,111,94,.85);display:flex;font-size:10px;justify-content:space-between;padding:5px 10px 0 10px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:12.5px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:rgba(84,111,94,.85);display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:10px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:10px 10px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(84,111,94,.7);display:inline-block;font-size:8.75px;line-height:1.3;margin-bottom:5px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(10,143,233,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #0a8fe9;color:#0a8fe9}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:10px 10px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:10px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#0a8fe9;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#0871b8;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#0871b8;text-decoration:none}.tox .tox-dialog__body-content svg{fill:rgba(84,111,94,.85)}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:10px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:rgba(84,111,94,.85);font-size:12.5px;font-style:normal;font-weight:400;letter-spacing:normal;margin-bottom:10px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:rgba(84,111,94,.85);font-size:10px;font-style:normal;font-weight:400;letter-spacing:normal;margin-bottom:10px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:10px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#fff;border-top:1px solid #d9d9d9;display:flex;justify-content:space-between;padding:5px 10px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(255,255,255,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:400;padding-bottom:5px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #d9d9d9}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:5px;padding-top:5px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:5px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:5px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:5px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:5px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #d9d9d9;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(84,111,94,.7);margin:0 0 10px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #d9d9d9}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:20px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:2.5px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:20px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:2.5px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:400}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(84,111,94,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#0a8fe9;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(0,0,0,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #fff;border-radius:3px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(84,111,94,.7);display:block;font-size:8.75px;font-style:normal;font-weight:400;line-height:1.3;padding:0 5px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 5px}.tox[dir=rtl] .tox-label{padding:0 0 0 5px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:2.5px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (5px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (5px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (5px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:2.5px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:2.5px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d9d9d9;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:rgba(84,111,94,.85);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:10px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 3.25px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#f2f2f2;color:rgba(84,111,94,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#fff;border-color:#0a8fe9;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#0a8fe9;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:rgba(84,111,94,.85)}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:2.5px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:2.5px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#f2f2f2;color:rgba(84,111,94,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:10px}.tox .tox-listbox__select-chevron svg{fill:rgba(84,111,94,.85)}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:5px}.tox[dir=rtl] .tox-listboxfield svg{left:5px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d9d9d9;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:rgba(84,111,94,.85);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:10px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 3.25px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#f2f2f2;color:rgba(84,111,94,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#fff;border-color:#0a8fe9;box-shadow:none;outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:15px}.tox:not([dir=rtl]) .tox-selectfield svg{right:5px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:15px}.tox[dir=rtl] .tox-selectfield svg{left:5px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:5px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:5px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left:20px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:20px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:5px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right:20px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:20px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:110px}.tox .tox-insert-table-picker>div{border-color:#d9d9d9;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:11px;width:11px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-2.5px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(10,143,233,.5);border-color:rgba(10,143,233,.5)}.tox .tox-insert-table-picker__label{color:rgba(84,111,94,.7);display:block;font-size:8.75px;padding:2.5px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#fff;border:1px solid #d9d9d9;border-radius:3px;box-shadow:0 4px 8px 0 rgba(84,111,94,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:2.5px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:2.5px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23d9d9d9'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #d9d9d9}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#817f7c;display:flex;flex:0 0 auto;font-size:8.75px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(129,127,124,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#e5e9e7;border:0;box-shadow:none;color:#0a9fe5}.tox .tox-mbtn--active{background:#e5e9e7;border:0;box-shadow:none;color:rgba(41,159,250,.88)}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#e5e9e7;border:0;box-shadow:none;color:#0a9fe5}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;font-size:8.75px;font-weight:400;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:2.5px;opacity:0;padding:2.5px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:8.75px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:rgba(84,111,94,.85)}.tox .tox-notification--success p{color:rgba(84,111,94,.85)}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:rgba(84,111,94,.85)}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:rgba(84,111,94,.85)}.tox .tox-notification--error p{color:rgba(84,111,94,.85)}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:rgba(84,111,94,.85)}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:rgba(84,111,94,.85)}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:rgba(84,111,94,.85)}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:rgba(84,111,94,.85)}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:rgba(84,111,94,.85)}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:rgba(84,111,94,.85)}.tox .tox-notification--info p{color:rgba(84,111,94,.85)}.tox .tox-notification--info a{color:rgba(84,111,94,.85)}.tox .tox-notification--info svg{fill:rgba(84,111,94,.85)}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:rgba(84,111,94,.85);font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{flex-wrap:nowrap}.tox .tox-pop--transition{transition:.15s ease;transition-property:left,right,top,bottom}.tox .tox-pop--transition::after,.tox .tox-pop--transition::before{transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#fff;border:1px solid #d9d9d9;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:2.5px 2.5px 2.5px 5px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset::after,.tox .tox-pop.tox-pop--inset::before{opacity:0;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#fff transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#d9d9d9 transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #fff transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #d9d9d9 transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #fff transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #d9d9d9 transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #fff;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #d9d9d9;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#fff;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #d9d9d9;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#0a8fe9;border:2px solid #0871b8;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(84,111,94,.7);border-radius:100%;height:5px;width:5px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:2.5px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:2.5px}.tox .tox-statusbar{align-items:center;background-color:#fff;border-top:1px solid #d9d9d9;color:rgba(84,111,94,.7);display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 5px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:rgba(84,111,94,.7);text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-5px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(84,111,94,.7)}.tox .tox-statusbar__resize-handle:focus svg{background-color:#e5e9e7;border-radius:1px;box-shadow:0 0 0 2px #e5e9e7}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:2.5px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:2.5px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(255,255,255,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#817f7c;display:flex;flex:0 0 auto;font-size:8.75px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#817f7c}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#e5e9e7;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#e5e9e7;border:0;box-shadow:none;color:#0a9fe5}.tox .tox-tbtn:hover svg{fill:#0a9fe5}.tox .tox-tbtn:active{background:#e5e9e7;border:0;box-shadow:none;color:rgba(41,159,250,.88)}.tox .tox-tbtn:active svg{fill:rgba(41,159,250,.88)}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(129,127,124,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(129,127,124,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#e5e9e7;border:0;box-shadow:none;color:rgba(41,159,250,.88)}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:rgba(41,159,250,.88)}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#ee930e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#ee930e}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:2.5px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:10px}.tox .tox-tbtn__select-chevron svg{fill:rgba(129,127,124,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #e5e9e7 inset}.tox .tox-split-button:focus{background:#e5e9e7;box-shadow:none;color:#ee930e}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:10px}.tox .tox-split-button__chevron svg{fill:rgba(129,127,124,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:14px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(129,127,124,.5)}.tox .tox-toolbar-overlord{background-color:#fff}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23d9d9d9'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #d9d9d9;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #d9d9d9}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#fff;border:1px solid #d9d9d9;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #d9d9d9}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #d9d9d9}.tox .tox-tooltip{display:inline-block;padding:5px;position:relative}.tox .tox-tooltip__body{background-color:rgba(84,111,94,.85);border-radius:3px;box-shadow:0 2px 4px rgba(84,111,94,.3);color:rgba(255,255,255,.75);font-size:8.75px;font-style:normal;font-weight:400;padding:2.5px 5px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid rgba(84,111,94,.85);bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:5px solid rgba(84,111,94,.85);border-left:5px solid transparent;border-right:5px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:5px solid transparent;border-left:5px solid rgba(84,111,94,.85);border-top:5px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:5px solid transparent;border-right:5px solid rgba(84,111,94,.85);border-top:5px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #d9d9d9;border-radius:3px;padding:5px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #d9d9d9;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel{height:60px}.tox .tox-image-tools__sidebar{height:60px} \ No newline at end of file diff --git a/public/resource/tinymce/skins/ui/jeecg/skin.mobile.css b/public/resource/tinymce/skins/ui/jeecg/skin.mobile.css new file mode 100644 index 0000000..df458d5 --- /dev/null +++ b/public/resource/tinymce/skins/ui/jeecg/skin.mobile.css @@ -0,0 +1,677 @@ +/** +* Copyright (c) Tiny Technologies, Inc. All rights reserved. +* Licensed under the LGPL or a commercial license. +* For LGPL see License.txt in the project root for license information. +* For commercial licenses see https://www.tiny.cloud/ +*/ +/* RESET all the things! */ +.tinymce-mobile-outer-container { + all: initial; + display: block; +} +.tinymce-mobile-outer-container * { + border: 0; + box-sizing: initial; + cursor: inherit; + float: none; + line-height: 1; + margin: 0; + outline: 0; + padding: 0; + -webkit-tap-highlight-color: transparent; + /* TBIO-3691, stop the gray flicker on touch. */ + text-shadow: none; + white-space: nowrap; +} +.tinymce-mobile-icon-arrow-back::before { + content: "\e5cd"; +} +.tinymce-mobile-icon-image::before { + content: "\e412"; +} +.tinymce-mobile-icon-cancel-circle::before { + content: "\e5c9"; +} +.tinymce-mobile-icon-full-dot::before { + content: "\e061"; +} +.tinymce-mobile-icon-align-center::before { + content: "\e234"; +} +.tinymce-mobile-icon-align-left::before { + content: "\e236"; +} +.tinymce-mobile-icon-align-right::before { + content: "\e237"; +} +.tinymce-mobile-icon-bold::before { + content: "\e238"; +} +.tinymce-mobile-icon-italic::before { + content: "\e23f"; +} +.tinymce-mobile-icon-unordered-list::before { + content: "\e241"; +} +.tinymce-mobile-icon-ordered-list::before { + content: "\e242"; +} +.tinymce-mobile-icon-font-size::before { + content: "\e245"; +} +.tinymce-mobile-icon-underline::before { + content: "\e249"; +} +.tinymce-mobile-icon-link::before { + content: "\e157"; +} +.tinymce-mobile-icon-unlink::before { + content: "\eca2"; +} +.tinymce-mobile-icon-color::before { + content: "\e891"; +} +.tinymce-mobile-icon-previous::before { + content: "\e314"; +} +.tinymce-mobile-icon-next::before { + content: "\e315"; +} +.tinymce-mobile-icon-large-font::before, +.tinymce-mobile-icon-style-formats::before { + content: "\e264"; +} +.tinymce-mobile-icon-undo::before { + content: "\e166"; +} +.tinymce-mobile-icon-redo::before { + content: "\e15a"; +} +.tinymce-mobile-icon-removeformat::before { + content: "\e239"; +} +.tinymce-mobile-icon-small-font::before { + content: "\e906"; +} +.tinymce-mobile-icon-readonly-back::before, +.tinymce-mobile-format-matches::after { + content: "\e5ca"; +} +.tinymce-mobile-icon-small-heading::before { + content: "small"; +} +.tinymce-mobile-icon-large-heading::before { + content: "large"; +} +.tinymce-mobile-icon-small-heading::before, +.tinymce-mobile-icon-large-heading::before { + font-family: sans-serif; + font-size: 80%; +} +.tinymce-mobile-mask-edit-icon::before { + content: "\e254"; +} +.tinymce-mobile-icon-back::before { + content: "\e5c4"; +} +.tinymce-mobile-icon-heading::before { + /* TODO: Translate */ + content: "Headings"; + font-family: sans-serif; + font-size: 80%; + font-weight: bold; +} +.tinymce-mobile-icon-h1::before { + content: "H1"; + font-weight: bold; +} +.tinymce-mobile-icon-h2::before { + content: "H2"; + font-weight: bold; +} +.tinymce-mobile-icon-h3::before { + content: "H3"; + font-weight: bold; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask { + align-items: center; + display: flex; + justify-content: center; + background: rgba(51, 51, 51, 0.5); + height: 100%; + position: absolute; + top: 0; + width: 100%; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container { + align-items: center; + border-radius: 50%; + display: flex; + flex-direction: column; + font-family: sans-serif; + font-size: 1em; + justify-content: space-between; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item { + align-items: center; + display: flex; + justify-content: center; + border-radius: 50%; + height: 2.1em; + width: 2.1em; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section { + align-items: center; + display: flex; + justify-content: center; + flex-direction: column; + font-size: 1em; +} +@media only screen and (min-device-width:700px) { + .tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section { + font-size: 1.2em; + } +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon { + align-items: center; + display: flex; + justify-content: center; + border-radius: 50%; + height: 2.1em; + width: 2.1em; + background-color: white; + color: #207ab7; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before { + content: "\e900"; + font-family: 'tinymce-mobile', sans-serif; +} +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon { + z-index: 2; +} +.tinymce-mobile-android-container.tinymce-mobile-android-maximized { + background: #ffffff; + border: none; + bottom: 0; + display: flex; + flex-direction: column; + left: 0; + position: fixed; + right: 0; + top: 0; +} +.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized) { + position: relative; +} +.tinymce-mobile-android-container .tinymce-mobile-editor-socket { + display: flex; + flex-grow: 1; +} +.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe { + display: flex !important; + flex-grow: 1; + height: auto !important; +} +.tinymce-mobile-android-scroll-reload { + overflow: hidden; +} +:not(.tinymce-mobile-readonly-mode) > .tinymce-mobile-android-selection-context-toolbar { + margin-top: 23px; +} +.tinymce-mobile-toolstrip { + background: #fff; + display: flex; + flex: 0 0 auto; + z-index: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar { + align-items: center; + background-color: #fff; + border-bottom: 1px solid #cccccc; + display: flex; + flex: 1; + height: 2.5em; + width: 100%; + /* Make it no larger than the toolstrip, so that it needs to scroll */ +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group { + align-items: center; + display: flex; + height: 100%; + flex-shrink: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group > div { + align-items: center; + display: flex; + height: 100%; + flex: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container { + background: #f44336; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group { + flex-grow: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item { + padding-left: 0.5em; + padding-right: 0.5em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button { + align-items: center; + display: flex; + height: 80%; + margin-left: 2px; + margin-right: 2px; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected { + background: #d4dbd7; + color: #cccccc; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type { + background: #207ab7; + color: #eceff1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar { + /* Note, this file is imported inside .tinymce-mobile-context-toolbar, so that prefix is on everything here. */ +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group { + align-items: center; + display: flex; + height: 100%; + flex: 1; + padding-bottom: 0.4em; + padding-top: 0.4em; + /* Make any buttons appearing on the left and right display in the centre (e.g. color edges) */ + /* For widgets like the colour picker, use the whole height */ +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog { + display: flex; + min-height: 1.5em; + overflow: hidden; + padding-left: 0; + padding-right: 0; + position: relative; + width: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain { + display: flex; + height: 100%; + transition: left cubic-bezier(0.4, 0, 1, 1) 0.15s; + width: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen { + display: flex; + flex: 0 0 auto; + justify-content: space-between; + width: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input { + font-family: Sans-serif; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container { + display: flex; + flex-grow: 1; + position: relative; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x { + -ms-grid-row-align: center; + align-self: center; + background: inherit; + border: none; + border-radius: 50%; + color: #888; + font-size: 0.6em; + font-weight: bold; + height: 100%; + padding-right: 2px; + position: absolute; + right: 0; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x { + display: none; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next { + align-items: center; + display: flex; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before { + align-items: center; + display: flex; + font-weight: bold; + height: 100%; + padding-left: 0.5em; + padding-right: 0.5em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before { + visibility: hidden; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item { + color: #cccccc; + font-size: 10px; + line-height: 10px; + margin: 0 2px; + padding-top: 3px; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active { + color: #d4dbd7; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before { + margin-left: 0.5em; + margin-right: 0.9em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before { + margin-left: 0.9em; + margin-right: 0.5em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider { + display: flex; + flex: 1; + margin-left: 0; + margin-right: 0; + padding: 0.28em 0; + position: relative; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container { + align-items: center; + display: flex; + flex-grow: 1; + height: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line { + background: #cccccc; + display: flex; + flex: 1; + height: 0.2em; + margin-bottom: 0.3em; + margin-top: 0.3em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container { + padding-left: 2em; + padding-right: 2em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container { + align-items: center; + display: flex; + flex-grow: 1; + height: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient { + background: linear-gradient(to right, hsl(0, 100%, 50%) 0%, hsl(60, 100%, 50%) 17%, hsl(120, 100%, 50%) 33%, hsl(180, 100%, 50%) 50%, hsl(240, 100%, 50%) 67%, hsl(300, 100%, 50%) 83%, hsl(0, 100%, 50%) 100%); + display: flex; + flex: 1; + height: 0.2em; + margin-bottom: 0.3em; + margin-top: 0.3em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black { + /* Not part of theming */ + background: black; + height: 0.2em; + margin-bottom: 0.3em; + margin-top: 0.3em; + width: 1.2em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white { + /* Not part of theming */ + background: white; + height: 0.2em; + margin-bottom: 0.3em; + margin-top: 0.3em; + width: 1.2em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb { + /* vertically centering trick (margin: auto, top: 0, bottom: 0). On iOS and Safari, if you leave + * out these values, then it shows the thumb at the top of the spectrum. This is probably because it is + * absolutely positioned with only a left value, and not a top. Note, on Chrome it seems to be fine without + * this approach. + */ + align-items: center; + background-clip: padding-box; + background-color: #455a64; + border: 0.5em solid rgba(136, 136, 136, 0); + border-radius: 3em; + bottom: 0; + color: #fff; + display: flex; + height: 0.5em; + justify-content: center; + left: -10px; + margin: auto; + position: absolute; + top: 0; + transition: border 120ms cubic-bezier(0.39, 0.58, 0.57, 1); + width: 0.5em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active { + border: 0.5em solid rgba(136, 136, 136, 0.39); +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper, +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group > div { + align-items: center; + display: flex; + height: 100%; + flex: 1; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper { + flex-direction: column; + justify-content: center; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item { + align-items: center; + display: flex; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog) { + height: 100%; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container { + display: flex; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input { + background: #ffffff; + border: none; + border-radius: 0; + color: #455a64; + flex-grow: 1; + font-size: 0.85em; + padding-bottom: 0.1em; + padding-left: 5px; + padding-top: 0.1em; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder { + /* WebKit, Blink, Edge */ + color: #888; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input:-ms-input-placeholder { + /* WebKit, Blink, Edge */ + color: #888; +} +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder { + /* WebKit, Blink, Edge */ + color: #888; +} +/* dropup */ +.tinymce-mobile-dropup { + background: white; + display: flex; + overflow: hidden; + width: 100%; +} +.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking { + transition: height 0.3s ease-out; +} +.tinymce-mobile-dropup.tinymce-mobile-dropup-growing { + transition: height 0.3s ease-in; +} +.tinymce-mobile-dropup.tinymce-mobile-dropup-closed { + flex-grow: 0; +} +.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing) { + flex-grow: 1; +} +/* TODO min-height for device size and orientation */ +.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) { + min-height: 200px; +} +@media only screen and (orientation: landscape) { + .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) { + min-height: 200px; + } +} +@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) { + .tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) { + min-height: 150px; + } +} +/* styles menu */ +.tinymce-mobile-styles-menu { + font-family: sans-serif; + outline: 4px solid black; + overflow: hidden; + position: relative; + width: 100%; +} +.tinymce-mobile-styles-menu [role="menu"] { + display: flex; + flex-direction: column; + height: 100%; + position: absolute; + width: 100%; +} +.tinymce-mobile-styles-menu [role="menu"].transitioning { + transition: transform 0.5s ease-in-out; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item { + border-bottom: 1px solid #ddd; + color: #455a64; + cursor: pointer; + display: flex; + padding: 1em 1em; + position: relative; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before { + color: #455a64; + content: "\e314"; + font-family: 'tinymce-mobile', sans-serif; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after { + color: #455a64; + content: "\e315"; + font-family: 'tinymce-mobile', sans-serif; + padding-left: 1em; + padding-right: 1em; + position: absolute; + right: 0; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after { + font-family: 'tinymce-mobile', sans-serif; + padding-left: 1em; + padding-right: 1em; + position: absolute; + right: 0; +} +.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator, +.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser { + align-items: center; + background: #fff; + border-top: #455a64; + color: #455a64; + display: flex; + min-height: 2.5em; + padding-left: 1em; + padding-right: 1em; +} +.tinymce-mobile-styles-menu [data-transitioning-destination="before"][data-transitioning-state], +.tinymce-mobile-styles-menu [data-transitioning-state="before"] { + transform: translate(-100%); +} +.tinymce-mobile-styles-menu [data-transitioning-destination="current"][data-transitioning-state], +.tinymce-mobile-styles-menu [data-transitioning-state="current"] { + transform: translate(0%); +} +.tinymce-mobile-styles-menu [data-transitioning-destination="after"][data-transitioning-state], +.tinymce-mobile-styles-menu [data-transitioning-state="after"] { + transform: translate(100%); +} +@font-face { + font-family: 'tinymce-mobile'; + font-style: normal; + font-weight: normal; + src: url('fonts/tinymce-mobile.woff?8x92w3') format('woff'); +} +@media (min-device-width: 700px) { + .tinymce-mobile-outer-container, + .tinymce-mobile-outer-container input { + font-size: 25px; + } +} +@media (max-device-width: 700px) { + .tinymce-mobile-outer-container, + .tinymce-mobile-outer-container input { + font-size: 18px; + } +} +.tinymce-mobile-icon { + font-family: 'tinymce-mobile', sans-serif; +} +.mixin-flex-and-centre { + align-items: center; + display: flex; + justify-content: center; +} +.mixin-flex-bar { + align-items: center; + display: flex; + height: 100%; +} +.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe { + background-color: #fff; + width: 100%; +} +.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon { + /* Note, on the iPod touch in landscape, this isn't visible when the navbar appears */ + background-color: #207ab7; + border-radius: 50%; + bottom: 1em; + color: white; + font-size: 1em; + height: 2.1em; + position: fixed; + right: 2em; + width: 2.1em; + align-items: center; + display: flex; + justify-content: center; +} +@media only screen and (min-device-width:700px) { + .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon { + font-size: 1.2em; + } +} +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket { + height: 300px; + overflow: hidden; +} +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe { + height: 100%; +} +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip { + display: none; +} +/* + Note, that if you don't include this (::-webkit-file-upload-button), the toolbar width gets + increased and the whole body becomes scrollable. It's important! + */ +input[type="file"]::-webkit-file-upload-button { + display: none; +} +@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) { + .tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon { + bottom: 50%; + } +} diff --git a/public/resource/tinymce/skins/ui/jeecg/skin.mobile.min.css b/public/resource/tinymce/skins/ui/jeecg/skin.mobile.min.css new file mode 100644 index 0000000..eaad954 --- /dev/null +++ b/public/resource/tinymce/skins/ui/jeecg/skin.mobile.min.css @@ -0,0 +1,7 @@ +/** +* Copyright (c) Tiny Technologies, Inc. All rights reserved. +* Licensed under the LGPL or a commercial license. +* For LGPL see License.txt in the project root for license information. +* For commercial licenses see https://www.tiny.cloud/ +*/ +.tinymce-mobile-outer-container{all:initial;display:block}.tinymce-mobile-outer-container *{border:0;box-sizing:initial;cursor:inherit;float:none;line-height:1;margin:0;outline:0;padding:0;-webkit-tap-highlight-color:transparent;text-shadow:none;white-space:nowrap}.tinymce-mobile-icon-arrow-back::before{content:"\e5cd"}.tinymce-mobile-icon-image::before{content:"\e412"}.tinymce-mobile-icon-cancel-circle::before{content:"\e5c9"}.tinymce-mobile-icon-full-dot::before{content:"\e061"}.tinymce-mobile-icon-align-center::before{content:"\e234"}.tinymce-mobile-icon-align-left::before{content:"\e236"}.tinymce-mobile-icon-align-right::before{content:"\e237"}.tinymce-mobile-icon-bold::before{content:"\e238"}.tinymce-mobile-icon-italic::before{content:"\e23f"}.tinymce-mobile-icon-unordered-list::before{content:"\e241"}.tinymce-mobile-icon-ordered-list::before{content:"\e242"}.tinymce-mobile-icon-font-size::before{content:"\e245"}.tinymce-mobile-icon-underline::before{content:"\e249"}.tinymce-mobile-icon-link::before{content:"\e157"}.tinymce-mobile-icon-unlink::before{content:"\eca2"}.tinymce-mobile-icon-color::before{content:"\e891"}.tinymce-mobile-icon-previous::before{content:"\e314"}.tinymce-mobile-icon-next::before{content:"\e315"}.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content:"\e264"}.tinymce-mobile-icon-undo::before{content:"\e166"}.tinymce-mobile-icon-redo::before{content:"\e15a"}.tinymce-mobile-icon-removeformat::before{content:"\e239"}.tinymce-mobile-icon-small-font::before{content:"\e906"}.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content:"\e5ca"}.tinymce-mobile-icon-small-heading::before{content:"small"}.tinymce-mobile-icon-large-heading::before{content:"large"}.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family:sans-serif;font-size:80%}.tinymce-mobile-mask-edit-icon::before{content:"\e254"}.tinymce-mobile-icon-back::before{content:"\e5c4"}.tinymce-mobile-icon-heading::before{content:"Headings";font-family:sans-serif;font-size:80%;font-weight:700}.tinymce-mobile-icon-h1::before{content:"H1";font-weight:700}.tinymce-mobile-icon-h2::before{content:"H2";font-weight:700}.tinymce-mobile-icon-h3::before{content:"H3";font-weight:700}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{align-items:center;display:flex;justify-content:center;background:rgba(51,51,51,.5);height:100%;position:absolute;top:0;width:100%}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{align-items:center;border-radius:50%;display:flex;flex-direction:column;font-family:sans-serif;font-size:1em;justify-content:space-between}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items:center;display:flex;justify-content:center;flex-direction:column;font-size:1em}@media only screen and (min-device-width:700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size:1.2em}}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em;background-color:#fff;color:#207ab7}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{content:"\e900";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index:2}.tinymce-mobile-android-container.tinymce-mobile-android-maximized{background:#fff;border:none;bottom:0;display:flex;flex-direction:column;left:0;position:fixed;right:0;top:0}.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position:relative}.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display:flex;flex-grow:1}.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display:flex!important;flex-grow:1;height:auto!important}.tinymce-mobile-android-scroll-reload{overflow:hidden}:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top:23px}.tinymce-mobile-toolstrip{background:#fff;display:flex;flex:0 0 auto;z-index:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{align-items:center;background-color:#fff;border-bottom:1px solid #ccc;display:flex;flex:1;height:2.5em;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex-shrink:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background:#f44336}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{align-items:center;display:flex;height:80%;margin-left:2px;margin-right:2px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{background:#d4dbd7;color:#ccc}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{background:#207ab7;color:#eceff1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex:1;padding-bottom:.4em;padding-top:.4em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{display:flex;min-height:1.5em;overflow:hidden;padding-left:0;padding-right:0;position:relative;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display:flex;height:100%;transition:left cubic-bezier(.4,0,1,1) .15s;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display:flex;flex:0 0 auto;justify-content:space-between;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family:Sans-serif}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{display:flex;flex-grow:1;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{-ms-grid-row-align:center;align-self:center;background:inherit;border:none;border-radius:50%;color:#888;font-size:.6em;font-weight:700;height:100%;padding-right:2px;position:absolute;right:0}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display:none}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before{align-items:center;display:flex;font-weight:700;height:100%;padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before{visibility:hidden}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{color:#ccc;font-size:10px;line-height:10px;margin:0 2px;padding-top:3px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color:#d4dbd7}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-left:.5em;margin-right:.9em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-left:.9em;margin-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{display:flex;flex:1;margin-left:0;margin-right:0;padding:.28em 0;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{background:#ccc;display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-left:2em;padding-right:2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{background:linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{background:#000;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{background:#fff;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{align-items:center;background-clip:padding-box;background-color:#455a64;border:.5em solid rgba(136,136,136,0);border-radius:3em;bottom:0;color:#fff;display:flex;height:.5em;justify-content:center;left:-10px;margin:auto;position:absolute;top:0;transition:border 120ms cubic-bezier(.39,.58,.57,1);width:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border:.5em solid rgba(136,136,136,.39)}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction:column;justify-content:center}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{background:#fff;border:none;border-radius:0;color:#455a64;flex-grow:1;font-size:.85em;padding-bottom:.1em;padding-left:5px;padding-top:.1em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color:#888}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input:-ms-input-placeholder{color:#888}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color:#888}.tinymce-mobile-dropup{background:#fff;display:flex;overflow:hidden;width:100%}.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition:height .3s ease-out}.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition:height .3s ease-in}.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow:0}.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow:1}.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}@media only screen and (orientation:landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:150px}}.tinymce-mobile-styles-menu{font-family:sans-serif;outline:4px solid #000;overflow:hidden;position:relative;width:100%}.tinymce-mobile-styles-menu [role=menu]{display:flex;flex-direction:column;height:100%;position:absolute;width:100%}.tinymce-mobile-styles-menu [role=menu].transitioning{transition:transform .5s ease-in-out}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{border-bottom:1px solid #ddd;color:#455a64;cursor:pointer;display:flex;padding:1em 1em;position:relative}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{color:#455a64;content:"\e314";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{color:#455a64;content:"\e315";font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{align-items:center;background:#fff;border-top:#455a64;color:#455a64;display:flex;min-height:2.5em;padding-left:1em;padding-right:1em}.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform:translate(-100%)}.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform:translate(0)}.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform:translate(100%)}@font-face{font-family:tinymce-mobile;font-style:normal;font-weight:400;src:url(fonts/tinymce-mobile.woff?8x92w3) format('woff')}@media (min-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:25px}}@media (max-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:18px}}.tinymce-mobile-icon{font-family:tinymce-mobile,sans-serif}.mixin-flex-and-centre{align-items:center;display:flex;justify-content:center}.mixin-flex-bar{align-items:center;display:flex;height:100%}.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{background-color:#fff;width:100%}.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{background-color:#207ab7;border-radius:50%;bottom:1em;color:#fff;font-size:1em;height:2.1em;position:fixed;right:2em;width:2.1em;align-items:center;display:flex;justify-content:center}@media only screen and (min-device-width:700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size:1.2em}}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height:300px;overflow:hidden}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height:100%}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display:none}input[type=file]::-webkit-file-upload-button{display:none}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom:50%}} \ No newline at end of file diff --git a/public/resource/tinymce/skins/ui/oxide-dark/content.inline.min.css b/public/resource/tinymce/skins/ui/oxide-dark/content.inline.min.css new file mode 100644 index 0000000..748f313 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide-dark/content.inline.min.css @@ -0,0 +1,239 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{display: inline-block;width: 8px !important;height: 12px !important;padding: 0 2px;cursor: default;background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;-webkit-user-select: all;-moz-user-select: all;-ms-user-select: all;user-select: all;-webkit-user-modify: read-only;-moz-user-modify: read-only;} + +.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset: 1px;} + +.tox-comments-visible .tox-comment{background-color: #fff0b7;} + +.tox-comments-visible .tox-comment--active{background-color: #ffe168;} + +.tox-checklist>li:not(.tox-checklist--hidden){margin: .25em 0;list-style: none;} + +.tox-checklist>li:not(.tox-checklist--hidden)::before{position: absolute;width: 1em;height: 1em;margin-top: .125em;margin-left: -1.5em;cursor: pointer;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");background-size: 100%;content: '';} + +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");} + +[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-right: -1.5em;margin-left: 0;} + +code[class*=language-],pre[class*=language-]{font-family: Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size: .875rem;-webkit-hyphens: none;-ms-hyphens: none;hyphens: none;line-height: 1.5;word-spacing: normal;color: #000;text-shadow: 0 1px #fff;word-break: normal;word-wrap: normal;white-space: pre;-moz-tab-size: 4;tab-size: 4;} + +code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow: none;background: #b3d4fc;} + +code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow: none;background: #b3d4fc;}@media print{code[class*=language-],pre[class*=language-]{text-shadow: none;}} + +pre[class*=language-]{padding: 1em;margin: .5em 0;overflow: auto;} + +:not(pre)>code[class*=language-],pre[class*=language-]{background: 0 0 !important;border: 1px solid #ccc;} + +:not(pre)>code[class*=language-]{padding: .1em;border-radius: .3em;} + +.token.cdata,.token.comment,.token.doctype,.token.prolog{color: #708090;} + +.token.punctuation{color: #999;} + +.namespace{opacity: .7;} + +.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color: #905;} + +.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color: #690;} + +.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color: #a67f59;background: hsla(0,0%,100%,.5);} + +.token.atrule,.token.attr-value,.token.keyword{color: #07a;} + +.token.function{color: #dd4a68;} + +.token.important,.token.regex,.token.variable{color: #e90;} + +.token.bold,.token.important{font-weight: 700;} + +.token.italic{font-style: italic;} + +.token.entity{cursor: help;} + +:not([dir=rtl]) code[class*=language-],:not([dir=rtl]) pre[class*=language-]{text-align: left;direction: ltr;} + +[dir=rtl] code[class*=language-],[dir=rtl] pre[class*=language-]{text-align: right;direction: rtl;} + +.mce-content-body{overflow-wrap: break-word;word-wrap: break-word;} + +.mce-content-body .mce-visual-caret{position: absolute;background-color: #000;background-color: currentColor;} + +.mce-content-body .mce-visual-caret-hidden{display: none;} + +.mce-content-body [data-mce-caret]{position: absolute;top: 0;right: auto;left: -1000px;padding: 0;margin: 0;} + +.mce-content-body .mce-offscreen-selection{position: absolute;left: -9999999999px;max-width: 1000000px;} + +.mce-content-body [contentEditable=false]{cursor: default;} + +.mce-content-body [contentEditable=true]{cursor: text;} + +.tox-cursor-format-painter{cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default;} + +.mce-content-body figure.align-left{float: left;} + +.mce-content-body figure.align-right{float: right;} + +.mce-content-body figure.image.align-center{display: table;margin-right: auto;margin-left: auto;} + +.mce-preview-object{position: relative;display: inline-block;margin: 0 2px 0 2px;line-height: 0;border: 1px solid gray;} + +.mce-preview-object .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);} + +.mce-preview-object[data-mce-selected="2"] .mce-shim{display: none;} + +.mce-object{background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border: 1px dashed #aaa;} + +.mce-pagebreak{display: block;width: 100%;height: 5px;margin-top: 15px;cursor: default;border: 1px dashed #aaa;page-break-before: always;}@media print{.mce-pagebreak{border: 0;}} + +.tiny-pageembed .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);} + +.tiny-pageembed[data-mce-selected="2"] .mce-shim{display: none;} + +.tiny-pageembed{position: relative;display: inline-block;} + +.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{position: relative;display: block;width: 100%;padding: 0;overflow: hidden;} + +.tiny-pageembed--16by9::before,.tiny-pageembed--1by1::before,.tiny-pageembed--21by9::before,.tiny-pageembed--4by3::before{display: block;content: "";} + +.tiny-pageembed--21by9::before{padding-top: 42.857143%;} + +.tiny-pageembed--16by9::before{padding-top: 56.25%;} + +.tiny-pageembed--4by3::before{padding-top: 75%;} + +.tiny-pageembed--1by1::before{padding-top: 100%;} + +.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{position: absolute;top: 0;left: 0;width: 100%;height: 100%;border: 0;} + +.mce-content-body div.mce-resizehandle{position: absolute;z-index: 10000;width: 10px;height: 10px;background-color: #4099ff;border-color: #4099ff;border-style: solid;border-width: 1px;box-sizing: border-box;} + +.mce-content-body div.mce-resizehandle:hover{background-color: #4099ff;} + +.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor: nwse-resize;} + +.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor: nesw-resize;} + +.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor: nwse-resize;} + +.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor: nesw-resize;} + +.mce-content-body .mce-clonedresizable{position: absolute;z-index: 10000;outline: 1px dashed #000;opacity: .5;} + +.mce-content-body .mce-resize-helper{position: absolute;z-index: 10001;display: none;padding: 5px;margin: 5px 10px;font-family: sans-serif;font-size: 12px;line-height: 14px;color: #fff;white-space: nowrap;background: #555;background: rgba(0,0,0,.75);border: 1px;border-radius: 3px;} + +.mce-match-marker{color: #fff;background: #aaa;} + +.mce-match-marker-selected{color: #fff;background: #39f;} + +.mce-content-body img[data-mce-selected],.mce-content-body table[data-mce-selected]{outline: 3px solid #b4d7ff;} + +.mce-content-body hr[data-mce-selected]{outline: 3px solid #b4d7ff;outline-offset: 1px;} + +.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline: 3px solid #b4d7ff;} + +.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline: 3px solid #b4d7ff;} + +.mce-content-body [contentEditable=false][data-mce-selected]{cursor: not-allowed;outline: 3px solid #b4d7ff;} + +.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline: 0;} + +.mce-content-body [data-mce-selected=inline-boundary]{background-color: #b4d7ff;} + +.mce-content-body .mce-edit-focus{outline: 3px solid #b4d7ff;} + +.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{background-color: #b4d7ff !important;} + +.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background: 0 0;} + +.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background: 0 0;} + +.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{-webkit-touch-callout: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;} + +.mce-content-body img::-moz-selection{background: 0 0;} + +.mce-content-body img::selection{background: 0 0;} + +.ephox-snooker-resizer-bar{background-color: #b4d7ff;opacity: 0;} + +.ephox-snooker-resizer-cols{cursor: col-resize;} + +.ephox-snooker-resizer-rows{cursor: row-resize;} + +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity: 1;} + +.mce-spellchecker-word{height: 2rem;cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.5'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;} + +.mce-spellchecker-grammar{cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23008800'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;} + +.mce-toc{border: 1px solid gray;} + +.mce-toc h2{margin: 4px;} + +.mce-toc li{list-style-type: none;} + +.mce-item-table,.mce-item-table caption,.mce-item-table td,.mce-item-table th{border: 1px dashed #bbb;} + +.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{padding-top: 10px;margin-left: 3px;background-repeat: no-repeat;border: 1px dashed #bbb;} + +.mce-visualblocks p{background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);} + +.mce-visualblocks h1{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);} + +.mce-visualblocks h2{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);} + +.mce-visualblocks h3{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);} + +.mce-visualblocks h4{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);} + +.mce-visualblocks h5{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);} + +.mce-visualblocks h6{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);} + +.mce-visualblocks div:not([data-mce-bogus]){background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);} + +.mce-visualblocks section{background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);} + +.mce-visualblocks article{background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);} + +.mce-visualblocks blockquote{background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);} + +.mce-visualblocks address{background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);} + +.mce-visualblocks pre{background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);} + +.mce-visualblocks figure{background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);} + +.mce-visualblocks figcaption{border: 1px dashed #bbb;} + +.mce-visualblocks hgroup{background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);} + +.mce-visualblocks aside{background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);} + +.mce-visualblocks ul{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);} + +.mce-visualblocks ol{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);} + +.mce-visualblocks dl{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);} + +.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left: 3px;} + +.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x: right;margin-right: 3px;} + +.mce-nbsp,.mce-shy{background: #aaa;} + +.mce-shy::after{content: '-';} + +.tox-toolbar-dock-fadeout{opacity: 0;visibility: hidden;} + +.tox-toolbar-dock-fadein{opacity: 1;visibility: visible;} + +.tox-toolbar-dock-transition{transition: visibility 0s linear .3s,opacity .3s ease;} + +.tox-toolbar-dock-transition.tox-toolbar-dock-fadein{transition-delay: 0s;} diff --git a/public/resource/tinymce/skins/ui/oxide-dark/content.min.css b/public/resource/tinymce/skins/ui/oxide-dark/content.min.css new file mode 100644 index 0000000..6e7165f --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide-dark/content.min.css @@ -0,0 +1,235 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{display: inline-block;width: 8px !important;height: 12px !important;padding: 0 2px;cursor: default;background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;-webkit-user-select: all;-moz-user-select: all;-ms-user-select: all;user-select: all;-webkit-user-modify: read-only;-moz-user-modify: read-only;} + +.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset: 1px;} + +.tox-comments-visible .tox-comment{background-color: #fff0b7;} + +.tox-comments-visible .tox-comment--active{background-color: #ffe168;} + +.tox-checklist>li:not(.tox-checklist--hidden){margin: .25em 0;list-style: none;} + +.tox-checklist>li:not(.tox-checklist--hidden)::before{position: absolute;width: 1em;height: 1em;margin-top: .125em;margin-left: -1.5em;cursor: pointer;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");background-size: 100%;content: '';} + +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");} + +[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-right: -1.5em;margin-left: 0;} + +code[class*=language-],pre[class*=language-]{font-family: Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size: .875rem;-webkit-hyphens: none;-ms-hyphens: none;hyphens: none;line-height: 1.5;word-spacing: normal;color: #000;text-shadow: 0 1px #fff;word-break: normal;word-wrap: normal;white-space: pre;-moz-tab-size: 4;tab-size: 4;} + +code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow: none;background: #b3d4fc;} + +code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow: none;background: #b3d4fc;}@media print{code[class*=language-],pre[class*=language-]{text-shadow: none;}} + +pre[class*=language-]{padding: 1em;margin: .5em 0;overflow: auto;} + +:not(pre)>code[class*=language-],pre[class*=language-]{background: 0 0 !important;border: 1px solid #ccc;} + +:not(pre)>code[class*=language-]{padding: .1em;border-radius: .3em;} + +.token.cdata,.token.comment,.token.doctype,.token.prolog{color: #708090;} + +.token.punctuation{color: #999;} + +.namespace{opacity: .7;} + +.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color: #905;} + +.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color: #690;} + +.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color: #a67f59;background: hsla(0,0%,100%,.5);} + +.token.atrule,.token.attr-value,.token.keyword{color: #07a;} + +.token.function{color: #dd4a68;} + +.token.important,.token.regex,.token.variable{color: #e90;} + +.token.bold,.token.important{font-weight: 700;} + +.token.italic{font-style: italic;} + +.token.entity{cursor: help;} + +:not([dir=rtl]) code[class*=language-],:not([dir=rtl]) pre[class*=language-]{text-align: left;direction: ltr;} + +[dir=rtl] code[class*=language-],[dir=rtl] pre[class*=language-]{text-align: right;direction: rtl;} + +.mce-content-body{overflow-wrap: break-word;word-wrap: break-word;} + +.mce-content-body .mce-visual-caret{position: absolute;background-color: #000;background-color: currentColor;} + +.mce-content-body .mce-visual-caret-hidden{display: none;} + +.mce-content-body [data-mce-caret]{position: absolute;top: 0;right: auto;left: -1000px;padding: 0;margin: 0;} + +.mce-content-body .mce-offscreen-selection{position: absolute;left: -9999999999px;max-width: 1000000px;} + +.mce-content-body [contentEditable=false]{cursor: default;} + +.mce-content-body [contentEditable=true]{cursor: text;} + +.tox-cursor-format-painter{cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default;} + +.mce-content-body figure.align-left{float: left;} + +.mce-content-body figure.align-right{float: right;} + +.mce-content-body figure.image.align-center{display: table;margin-right: auto;margin-left: auto;} + +.mce-preview-object{position: relative;display: inline-block;margin: 0 2px 0 2px;line-height: 0;border: 1px solid gray;} + +.mce-preview-object .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);} + +.mce-preview-object[data-mce-selected="2"] .mce-shim{display: none;} + +.mce-object{background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border: 1px dashed #aaa;} + +.mce-pagebreak{display: block;width: 100%;height: 5px;margin-top: 15px;cursor: default;border: 1px dashed #aaa;page-break-before: always;}@media print{.mce-pagebreak{border: 0;}} + +.tiny-pageembed .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);} + +.tiny-pageembed[data-mce-selected="2"] .mce-shim{display: none;} + +.tiny-pageembed{position: relative;display: inline-block;} + +.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{position: relative;display: block;width: 100%;padding: 0;overflow: hidden;} + +.tiny-pageembed--16by9::before,.tiny-pageembed--1by1::before,.tiny-pageembed--21by9::before,.tiny-pageembed--4by3::before{display: block;content: "";} + +.tiny-pageembed--21by9::before{padding-top: 42.857143%;} + +.tiny-pageembed--16by9::before{padding-top: 56.25%;} + +.tiny-pageembed--4by3::before{padding-top: 75%;} + +.tiny-pageembed--1by1::before{padding-top: 100%;} + +.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{position: absolute;top: 0;left: 0;width: 100%;height: 100%;border: 0;} + +.mce-content-body div.mce-resizehandle{position: absolute;z-index: 10000;width: 10px;height: 10px;background-color: #4099ff;border-color: #4099ff;border-style: solid;border-width: 1px;box-sizing: border-box;} + +.mce-content-body div.mce-resizehandle:hover{background-color: #4099ff;} + +.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor: nwse-resize;} + +.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor: nesw-resize;} + +.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor: nwse-resize;} + +.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor: nesw-resize;} + +.mce-content-body .mce-clonedresizable{position: absolute;z-index: 10000;outline: 1px dashed #000;opacity: .5;} + +.mce-content-body .mce-resize-helper{position: absolute;z-index: 10001;display: none;padding: 5px;margin: 5px 10px;font-family: sans-serif;font-size: 12px;line-height: 14px;color: #fff;white-space: nowrap;background: #555;background: rgba(0,0,0,.75);border: 1px;border-radius: 3px;} + +.mce-match-marker{color: #fff;background: #aaa;} + +.mce-match-marker-selected{color: #fff;background: #39f;} + +.mce-content-body img[data-mce-selected],.mce-content-body table[data-mce-selected]{outline: 3px solid #b4d7ff;} + +.mce-content-body hr[data-mce-selected]{outline: 3px solid #b4d7ff;outline-offset: 1px;} + +.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline: 3px solid #b4d7ff;} + +.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline: 3px solid #b4d7ff;} + +.mce-content-body [contentEditable=false][data-mce-selected]{cursor: not-allowed;outline: 3px solid #b4d7ff;} + +.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline: 0;} + +.mce-content-body [data-mce-selected=inline-boundary]{background-color: #b4d7ff;} + +.mce-content-body .mce-edit-focus{outline: 3px solid #b4d7ff;} + +.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{background-color: #b4d7ff !important;} + +.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background: 0 0;} + +.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background: 0 0;} + +.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{-webkit-touch-callout: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;} + +.mce-content-body img::-moz-selection{background: 0 0;} + +.mce-content-body img::selection{background: 0 0;} + +.ephox-snooker-resizer-bar{background-color: #b4d7ff;opacity: 0;} + +.ephox-snooker-resizer-cols{cursor: col-resize;} + +.ephox-snooker-resizer-rows{cursor: row-resize;} + +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity: 1;} + +.mce-spellchecker-word{height: 2rem;cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.5'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;} + +.mce-spellchecker-grammar{cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23008800'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;} + +.mce-toc{border: 1px solid gray;} + +.mce-toc h2{margin: 4px;} + +.mce-toc li{list-style-type: none;} + +.mce-item-table,.mce-item-table caption,.mce-item-table td,.mce-item-table th{border: 1px dashed #bbb;} + +.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{padding-top: 10px;margin-left: 3px;background-repeat: no-repeat;border: 1px dashed #bbb;} + +.mce-visualblocks p{background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);} + +.mce-visualblocks h1{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);} + +.mce-visualblocks h2{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);} + +.mce-visualblocks h3{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);} + +.mce-visualblocks h4{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);} + +.mce-visualblocks h5{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);} + +.mce-visualblocks h6{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);} + +.mce-visualblocks div:not([data-mce-bogus]){background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);} + +.mce-visualblocks section{background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);} + +.mce-visualblocks article{background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);} + +.mce-visualblocks blockquote{background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);} + +.mce-visualblocks address{background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);} + +.mce-visualblocks pre{background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);} + +.mce-visualblocks figure{background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);} + +.mce-visualblocks figcaption{border: 1px dashed #bbb;} + +.mce-visualblocks hgroup{background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);} + +.mce-visualblocks aside{background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);} + +.mce-visualblocks ul{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);} + +.mce-visualblocks ol{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);} + +.mce-visualblocks dl{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);} + +.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left: 3px;} + +.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x: right;margin-right: 3px;} + +.mce-nbsp,.mce-shy{background: #aaa;} + +.mce-shy::after{content: '-';} + +body{font-family: sans-serif;} + +table{border-collapse: collapse;} diff --git a/public/resource/tinymce/skins/ui/oxide-dark/content.mobile.min.css b/public/resource/tinymce/skins/ui/oxide-dark/content.mobile.min.css new file mode 100644 index 0000000..c052252 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide-dark/content.mobile.min.css @@ -0,0 +1,17 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{position: absolute;display: inline-block;background-color: green;opacity: .5;} + +body{-webkit-text-size-adjust: none;} + +body img{max-width: 96vw;} + +body table img{max-width: 95%;} + +body{font-family: sans-serif;} + +table{border-collapse: collapse;} diff --git a/public/resource/tinymce/skins/ui/oxide-dark/skin.min.css b/public/resource/tinymce/skins/ui/oxide-dark/skin.min.css new file mode 100644 index 0000000..d8dc9b2 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide-dark/skin.min.css @@ -0,0 +1,875 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tox{font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 16px;font-style: normal;font-weight: 400;line-height: normal;color: #222f3e;text-decoration: none;text-shadow: none;text-transform: none;white-space: normal;vertical-align: initial;cursor: auto;box-sizing: content-box;-webkit-tap-highlight-color: transparent;} + +.tox :not(svg){font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;line-height: inherit;color: inherit;text-align: inherit;text-decoration: inherit;text-shadow: inherit;text-transform: inherit;white-space: inherit;vertical-align: inherit;cursor: inherit;box-sizing: inherit;direction: inherit;-webkit-tap-highlight-color: inherit;} + +.tox :not(svg){position: static;float: none;width: auto;height: auto;max-width: none;padding: 0;margin: 0;background: 0 0;border: 0;outline: 0;} + +.tox:not([dir=rtl]){text-align: left;direction: ltr;} + +.tox[dir=rtl]{text-align: right;direction: rtl;} + +.tox-tinymce{position: relative;display: flex;overflow: hidden;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;border: 1px solid #000;border-radius: 0;visibility: inherit !important;box-shadow: none;box-sizing: border-box;flex-direction: column;} + +.tox-editor-container{display: flex;flex: 1 1 auto;flex-direction: column;overflow: hidden;} + +.tox-editor-container>:first-child{border-top: none !important;} + +.tox-tinymce-aux{font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;} + +.tox-tinymce :focus,.tox-tinymce-aux :focus{outline: 0;} + +button::-moz-focus-inner{border: 0;} + +.tox-silver-sink{z-index: 1300;} + +.tox .tox-anchorbar{display: flex;flex: 0 0 auto;} + +.tox .tox-bar{display: flex;flex: 0 0 auto;} + +.tox .tox-button{display: inline-block;padding: 4px 16px;margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 14px;font-weight: 700;line-height: 24px;letter-spacing: 1;color: #fff;text-align: center;text-decoration: none;text-transform: capitalize;white-space: nowrap;cursor: pointer;background-color: #207ab7;background-image: none;background-position: none;background-repeat: none;border-color: #207ab7;border-style: solid;border-width: 1px;border-radius: 3px;outline: 0;box-shadow: none;box-sizing: border-box;} + +.tox .tox-button[disabled]{color: rgba(255,255,255,.5);cursor: not-allowed;background-color: #207ab7;background-image: none;border-color: #207ab7;box-shadow: none;} + +.tox .tox-button:focus:not(:disabled){color: #fff;background-color: #1c6ca1;background-image: none;border-color: #1c6ca1;box-shadow: none;} + +.tox .tox-button:hover:not(:disabled){color: #fff;background-color: #1c6ca1;background-image: none;border-color: #1c6ca1;box-shadow: none;} + +.tox .tox-button:active:not(:disabled){color: #fff;background-color: #185d8c;background-image: none;border-color: #185d8c;box-shadow: none;} + +.tox .tox-button--secondary{padding: 4px 16px;color: #fff;text-decoration: none;text-transform: capitalize;background-color: #3d546f;background-image: none;background-position: none;background-repeat: none;border-color: #3d546f;border-style: solid;border-width: 1px;border-radius: 3px;outline: 0;box-shadow: none;} + +.tox .tox-button--secondary[disabled]{color: rgba(255,255,255,.5);background-color: #3d546f;background-image: none;border-color: #3d546f;box-shadow: none;} + +.tox .tox-button--secondary:focus:not(:disabled){color: #fff;background-color: #34485f;background-image: none;border-color: #34485f;box-shadow: none;} + +.tox .tox-button--secondary:hover:not(:disabled){color: #fff;background-color: #34485f;background-image: none;border-color: #34485f;box-shadow: none;} + +.tox .tox-button--secondary:active:not(:disabled){color: #fff;background-color: #2b3b4e;background-image: none;border-color: #2b3b4e;box-shadow: none;} + +.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding: 4px;} + +.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display: block;fill: currentColor;} + +.tox .tox-button-link{display: inline-block;padding: 0;margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 16px;font-weight: 400;line-height: 1.3;white-space: nowrap;cursor: pointer;background: 0;border: none;box-sizing: border-box;} + +.tox .tox-button-link--sm{font-size: 14px;} + +.tox .tox-button--naked{color: #fff;background-color: transparent;border-color: transparent;box-shadow: unset;} + +.tox .tox-button--naked:hover:not(:disabled){color: #fff;background-color: #34485f;border-color: #34485f;box-shadow: none;} + +.tox .tox-button--naked:focus:not(:disabled){color: #fff;background-color: #34485f;border-color: #34485f;box-shadow: none;} + +.tox .tox-button--naked:active:not(:disabled){color: #fff;background-color: #2b3b4e;border-color: #2b3b4e;box-shadow: none;} + +.tox .tox-button--naked .tox-icon svg{fill: currentColor;} + +.tox .tox-button--naked.tox-button--icon{color: currentColor;} + +.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color: #fff;} + +.tox .tox-checkbox{display: flex;height: 36px;min-width: 36px;cursor: pointer;border-radius: 3px;align-items: center;} + +.tox .tox-checkbox__input{position: absolute;top: auto;left: -10000px;width: 1px;height: 1px;overflow: hidden;} + +.tox .tox-checkbox__icons{width: 24px;height: 24px;padding: calc(4px - 1px);border-radius: 3px;box-shadow: 0 0 0 2px transparent;box-sizing: content-box;} + +.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display: block;fill: rgba(255,255,255,.2);} + +.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display: none;fill: #207ab7;} + +.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display: none;fill: #207ab7;} + +.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display: none;} + +.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display: block;} + +.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display: none;} + +.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display: block;} + +.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{padding: calc(4px - 1px);border-radius: 3px;box-shadow: inset 0 0 0 1px #207ab7;} + +.tox:not([dir=rtl]) .tox-checkbox__label{margin-left: 4px;} + +.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left: 4px;} + +.tox[dir=rtl] .tox-checkbox__label{margin-right: 4px;} + +.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right: 4px;} + +.tox .tox-collection--toolbar .tox-collection__group{display: flex;padding: 0;} + +.tox .tox-collection--grid .tox-collection__group{display: flex;max-height: 208px;padding: 0;overflow-x: hidden;overflow-y: auto;flex-wrap: wrap;} + +.tox .tox-collection--list .tox-collection__group{padding: 4px 0;border-color: #1a1a1a;border-style: solid;border-top-width: 1px;border-right-width: 0;border-bottom-width: 0;border-left-width: 0;} + +.tox .tox-collection--list .tox-collection__group:first-child{border-top-width: 0;} + +.tox .tox-collection__group-heading{padding: 4px 8px;margin-top: -4px;margin-bottom: 4px;font-size: 12px;font-style: normal;font-weight: 400;color: #fff;text-transform: none;cursor: default;background-color: #333;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;-webkit-touch-callout: none;} + +.tox .tox-collection__item{display: flex;color: #fff;cursor: pointer;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;align-items: center;-webkit-touch-callout: none;} + +.tox .tox-collection--list .tox-collection__item{padding: 4px 8px;} + +.tox .tox-collection--toolbar .tox-collection__item{padding: 4px;border-radius: 3px;} + +.tox .tox-collection--grid .tox-collection__item{padding: 4px;border-radius: 3px;} + +.tox .tox-collection--list .tox-collection__item--enabled{color: contrast(inherit,#222f3e,#fff);background-color: inherit;} + +.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color: #fff;background-color: #434e5b;} + +.tox .tox-collection--toolbar .tox-collection__item--enabled{color: #fff;background-color: #6f7882;} + +.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color: #fff;background-color: #434e5b;} + +.tox .tox-collection--grid .tox-collection__item--enabled{color: #fff;background-color: #6f7882;} + +.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){color: #fff;background-color: #434e5b;} + +.tox .tox-collection__item--state-disabled{color: rgba(255,255,255,.5);cursor: default;background-color: transparent;} + +.tox .tox-collection__item-icon{display: flex;width: 24px;height: 24px;align-items: center;justify-content: center;} + +.tox .tox-collection__item-icon svg{fill: currentColor;} + +.tox .tox-collection--toolbar-lg .tox-collection__item-icon{width: 48px;height: 48px;} + +.tox .tox-collection__item[role=menuitemcheckbox]:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display: none;} + +.tox .tox-collection__item-label{display: inline-block;font-size: 14px;font-style: normal;font-weight: 400;line-height: 24px;color: currentColor;text-transform: none;word-break: break-all;flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-collection__item-accessory{display: inline-block;height: 24px;font-size: 14px;line-height: 24px;color: rgba(255,255,255,.5);text-transform: normal;} + +.tox .tox-collection__item-caret{align-items: center;display: flex;min-height: 24px;} + +.tox .tox-collection__item-caret::after{min-height: inherit;font-size: 0;content: '';} + +.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left: 8px;} + +.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item-label:first-child{margin-left: 4px;} + +.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left: 16px;text-align: right;} + +.tox:not([dir=rtl]) .tox-collection__item-caret{margin-left: 16px;} + +.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right: 8px;} + +.tox[dir=rtl] .tox-collection--list .tox-collection__item-label:first-child{margin-right: 4px;} + +.tox[dir=rtl] .tox-collection__item-icon-rtl .tox-collection__item-icon svg{transform: rotateY(180deg);} + +.tox[dir=rtl] .tox-collection__item-accessory{margin-right: 16px;text-align: left;} + +.tox[dir=rtl] .tox-collection__item-caret{margin-right: 16px;transform: rotateY(180deg);} + +.tox .tox-color-picker-container{display: flex;flex-direction: row;height: 225px;margin: 0;} + +.tox .tox-sv-palette{display: flex;height: 100%;box-sizing: border-box;} + +.tox .tox-sv-palette-spectrum{height: 100%;} + +.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width: 225px;} + +.tox .tox-sv-palette-thumb{position: absolute;width: 12px;height: 12px;background: 0 0;border: 1px solid #000;border-radius: 50%;box-sizing: content-box;} + +.tox .tox-sv-palette-inner-thumb{position: absolute;width: 10px;height: 10px;border: 1px solid #fff;border-radius: 50%;} + +.tox .tox-hue-slider{width: 25px;height: 100%;box-sizing: border-box;} + +.tox .tox-hue-slider-spectrum{width: 100%;height: 100%;background: linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);} + +.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width: 20px;} + +.tox .tox-hue-slider-thumb{width: 100%;height: 4px;background: #fff;border: 1px solid #000;box-sizing: content-box;} + +.tox .tox-rgb-form{display: flex;flex-direction: column;justify-content: space-between;} + +.tox .tox-rgb-form div{display: flex;width: inherit;margin-bottom: 5px;align-items: center;justify-content: space-between;} + +.tox .tox-rgb-form input{width: 6em;} + +.tox .tox-rgb-form input.tox-invalid{border: 1px solid red !important;} + +.tox .tox-rgb-form .tox-rgba-preview{margin-bottom: 0;border: 1px solid #000;flex-grow: 2;} + +.tox:not([dir=rtl]) .tox-sv-palette{margin-right: 15px;} + +.tox:not([dir=rtl]) .tox-hue-slider{margin-right: 15px;} + +.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left: -1px;} + +.tox:not([dir=rtl]) .tox-rgb-form label{margin-right: .5em;} + +.tox[dir=rtl] .tox-sv-palette{margin-left: 15px;} + +.tox[dir=rtl] .tox-hue-slider{margin-left: 15px;} + +.tox[dir=rtl] .tox-hue-slider-thumb{margin-right: -1px;} + +.tox[dir=rtl] .tox-rgb-form label{margin-left: .5em;} + +.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin: 2px 0 3px 4px;} + +.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{margin: -4px 0;border: 0;} + +.tox .tox-swatches__row{display: flex;} + +.tox .tox-swatch{width: 30px;height: 30px;transition: transform .15s,box-shadow .15s;} + +.tox .tox-swatch:focus,.tox .tox-swatch:hover{transform: scale(.8);box-shadow: 0 0 0 1px rgba(127,127,127,.3) inset;} + +.tox .tox-swatch--remove{align-items: center;display: flex;justify-content: center;} + +.tox .tox-swatch--remove svg path{stroke: #e74c3c;} + +.tox .tox-swatches__picker-btn{display: flex;width: 30px;height: 30px;padding: 0;cursor: pointer;background-color: transparent;border: 0;outline: 0;align-items: center;justify-content: center;} + +.tox .tox-swatches__picker-btn svg{width: 24px;height: 24px;} + +.tox .tox-swatches__picker-btn:hover{background: #434e5b;} + +.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left: auto;} + +.tox[dir=rtl] .tox-swatches__picker-btn{margin-right: auto;} + +.tox .tox-comment-thread{position: relative;background: #2b3b4e;} + +.tox .tox-comment-thread>:not(:first-child){margin-top: 8px;} + +.tox .tox-comment{position: relative;padding: 8px 8px 16px 8px;background: #2b3b4e;border: 1px solid #000;border-radius: 3px;box-shadow: 0 4px 8px 0 rgba(34,47,62,.1);} + +.tox .tox-comment__header{display: flex;color: #fff;align-items: center;justify-content: space-between;} + +.tox .tox-comment__date{font-size: 12px;color: rgba(255,255,255,.5);} + +.tox .tox-comment__body{position: relative;margin-top: 8px;font-size: 14px;font-style: normal;font-weight: 400;line-height: 1.3;color: #fff;text-transform: initial;} + +.tox .tox-comment__body textarea{width: 100%;white-space: normal;resize: none;} + +.tox .tox-comment__expander{padding-top: 8px;} + +.tox .tox-comment__expander p{font-size: 14px;font-style: normal;color: rgba(255,255,255,.5);} + +.tox .tox-comment__body p{margin: 0;} + +.tox .tox-comment__buttonspacing{padding-top: 16px;text-align: center;} + +.tox .tox-comment-thread__overlay::after{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 5;display: flex;background: #2b3b4e;content: "";opacity: .9;} + +.tox .tox-comment__reply{display: flex;flex-shrink: 0;flex-wrap: wrap;justify-content: flex-end;margin-top: 8px;} + +.tox .tox-comment__reply>:first-child{width: 100%;margin-bottom: 8px;} + +.tox .tox-comment__edit{display: flex;flex-wrap: wrap;justify-content: flex-end;margin-top: 16px;} + +.tox .tox-comment__gradient::after{position: absolute;bottom: 0;display: block;width: 100%;height: 5em;margin-top: -40px;background: linear-gradient(rgba(43,59,78,0),#2b3b4e);content: "";} + +.tox .tox-comment__overlay{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 5;display: flex;text-align: center;background: #2b3b4e;opacity: .9;flex-direction: column;flex-grow: 1;} + +.tox .tox-comment__loading-text{position: relative;display: flex;color: #fff;align-items: center;flex-direction: column;} + +.tox .tox-comment__loading-text>div{padding-bottom: 16px;} + +.tox .tox-comment__overlaytext{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 10;padding: 1em;font-size: 14px;flex-direction: column;} + +.tox .tox-comment__overlaytext p{color: #fff;text-align: center;background-color: #2b3b4e;box-shadow: 0 0 8px 8px #2b3b4e;} + +.tox .tox-comment__overlaytext div:nth-of-type(2){font-size: .8em;} + +.tox .tox-comment__busy-spinner{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 1103;display: flex;background-color: #2b3b4e;align-items: center;justify-content: center;} + +.tox .tox-comment__scroll{display: flex;flex-direction: column;flex-shrink: 1;overflow: auto;} + +.tox .tox-conversations{margin: 8px;} + +.tox:not([dir=rtl]) .tox-comment__edit{margin-left: 8px;} + +.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left: 8px;} + +.tox[dir=rtl] .tox-comment__edit{margin-right: 8px;} + +.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right: 8px;} + +.tox .tox-user{align-items: center;display: flex;} + +.tox .tox-user__avatar svg{fill: rgba(255,255,255,.5);} + +.tox .tox-user__name{font-size: 12px;font-style: normal;font-weight: 700;color: rgba(255,255,255,.5);text-transform: uppercase;} + +.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right: 8px;} + +.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left: 8px;} + +.tox[dir=rtl] .tox-user__avatar svg{margin-left: 8px;} + +.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right: 8px;} + +.tox .tox-dialog-wrap{position: fixed;top: 0;right: 0;bottom: 0;left: 0;z-index: 1100;display: flex;align-items: center;justify-content: center;} + +.tox .tox-dialog-wrap__backdrop{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 1101;background-color: rgba(34,47,62,.75);} + +.tox .tox-dialog{position: relative;z-index: 1102;display: flex;width: 95vw;max-width: 480px;max-height: 100%;overflow: hidden;background-color: #2b3b4e;border-color: #000;border-style: solid;border-width: 1px;border-radius: 3px;box-shadow: 0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);flex-direction: column;} + +.tox .tox-dialog__header{position: relative;display: flex;padding: 8px 16px 0 16px;margin-bottom: 16px;font-size: 16px;color: #fff;background-color: #2b3b4e;border-bottom: none;align-items: center;justify-content: space-between;} + +.tox .tox-dialog__header .tox-button{z-index: 1;} + +.tox .tox-dialog__draghandle{position: absolute;top: 0;left: 0;width: 100%;height: 100%;cursor: grab;} + +.tox .tox-dialog__draghandle:active{cursor: grabbing;} + +.tox .tox-dialog__dismiss{margin-left: auto;} + +.tox .tox-dialog__title{margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 20px;font-style: normal;font-weight: 400;line-height: 1.3;text-transform: normal;} + +.tox .tox-dialog__body{display: flex;min-width: 0;padding: 0 16px;font-size: 16px;font-style: normal;font-weight: 400;line-height: 1.3;color: #fff;text-align: left;text-transform: normal;flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-dialog__body-nav{align-items: flex-start;display: flex;flex-direction: column;} + +.tox .tox-dialog__body-nav-item{display: inline-block;margin-bottom: 8px;font-size: 14px;line-height: 1.3;color: rgba(255,255,255,.5);text-decoration: none;border-bottom: 2px solid transparent;} + +.tox .tox-dialog__body-nav-item--active{color: #207ab7;border-bottom: 2px solid #207ab7;} + +.tox .tox-dialog__body-content{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;max-height: 650px;overflow: auto;} + +.tox .tox-dialog__body-content>*{margin-top: 16px;margin-bottom: 0;} + +.tox .tox-dialog__body-content>:first-child{margin-top: 0;} + +.tox .tox-dialog__body-content>:last-child{margin-bottom: 0;} + +.tox .tox-dialog__body-content>:only-child{margin-top: 0;margin-bottom: 0;} + +.tox .tox-dialog--width-lg{height: 650px;max-width: 1200px;} + +.tox .tox-dialog--width-md{max-width: 800px;} + +.tox .tox-dialog--width-md .tox-dialog__body-content{overflow: auto;} + +.tox .tox-dialog__body-content--centered{text-align: center;} + +.tox .tox-dialog__body-content--spacious{margin-bottom: 16px;} + +.tox .tox-dialog__footer{display: flex;padding: 8px 16px;margin-top: 16px;background-color: #2b3b4e;border-top: 1px solid #000;align-items: center;justify-content: space-between;} + +.tox .tox-dialog__busy-spinner{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 1103;display: flex;background-color: rgba(34,47,62,.75);align-items: center;justify-content: center;} + +.tox .tox-dialog__table{width: 100%;border-collapse: collapse;} + +.tox .tox-dialog__table thead th{padding-bottom: 8px;font-weight: 700;} + +.tox .tox-dialog__table tbody tr{border-bottom: 1px solid #000;} + +.tox .tox-dialog__table tbody tr:last-child{border-bottom: none;} + +.tox .tox-dialog__table td{padding-top: 8px;padding-bottom: 8px;} + +.tox .tox-dialog__popups{position: absolute;z-index: 1100;width: 100%;} + +.tox .tox-dialog__body-iframe{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;} + +.tox .tox-dialog__body-iframe .tox-navobj{display: flex;flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex: 1;-ms-flex-preferred-size: auto;height: 100%;} + +body.tox-dialog__disable-scroll{overflow: hidden;} + +.tox.tox-platform-ie .tox-dialog-wrap{position: -ms-device-fixed;} + +.tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right: 32px;} + +.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left: 8px;} + +.tox[dir=rtl] .tox-dialog__body{text-align: right;} + +.tox[dir=rtl] .tox-dialog__body-nav{margin-left: 32px;} + +.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right: 8px;} + +.tox .tox-dropzone-container{display: flex;flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-dropzone{display: flex;min-height: 100px;padding: 10px;background: #fff;border: 2px dashed #000;box-sizing: border-box;align-items: center;flex-direction: column;flex-grow: 1;justify-content: center;} + +.tox .tox-dropzone p{margin: 0 0 16px 0;color: rgba(255,255,255,.5);} + +.tox .tox-edit-area{position: relative;display: flex;overflow: hidden;border-top: 1px solid #000;flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-edit-area__iframe{position: absolute;width: 100%;height: 100%;background-color: #fff;border: 0;box-sizing: border-box;flex: 1;-ms-flex-preferred-size: auto;} + +.tox.tox-inline-edit-area{border: 1px dotted #000;} + +.tox .tox-control-wrap{flex: 1;position: relative;} + +.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display: none;} + +.tox .tox-control-wrap svg{display: block;} + +.tox .tox-control-wrap__status-icon-wrap{position: absolute;top: 50%;transform: translateY(-50%);} + +.tox .tox-control-wrap__status-icon-invalid svg{fill: #c00;} + +.tox .tox-control-wrap__status-icon-unknown svg{fill: orange;} + +.tox .tox-control-wrap__status-icon-valid svg{fill: green;} + +.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right: 32px;} + +.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right: 4px;} + +.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left: 32px;} + +.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left: 4px;} + +.tox .tox-autocompleter{max-width: 25em;} + +.tox .tox-autocompleter .tox-menu{max-width: 25em;} + +.tox .tox-color-input{display: flex;} + +.tox .tox-color-input .tox-textfield{display: flex;border-radius: 3px 0 0 3px;} + +.tox .tox-color-input span{display: flex;width: 35px;cursor: pointer;border-color: rgba(34,47,62,.2);border-style: solid;border-width: 1px 1px 1px 0;border-radius: 0 3px 3px 0;box-shadow: none;box-sizing: border-box;} + +.tox .tox-color-input span:focus{border-color: #207ab7;} + +.tox[dir=rtl] .tox-color-input .tox-textfield{border-radius: 0 3px 3px 0;} + +.tox[dir=rtl] .tox-color-input span{border-width: 1px 0 1px 1px;border-radius: 3px 0 0 3px;} + +.tox .tox-label,.tox .tox-toolbar-label{display: block;padding: 0 8px 0 0;font-size: 14px;font-style: normal;font-weight: 400;line-height: 1.3;color: rgba(255,255,255,.5);text-transform: normal;white-space: nowrap;} + +.tox .tox-toolbar-label{padding: 0 8px;} + +.tox[dir=rtl] .tox-label{padding: 0 0 0 8px;} + +.tox .tox-form{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;} + +.tox .tox-form__group{margin-bottom: 4px;box-sizing: border-box;} + +.tox .tox-form__group--error{color: #c00;} + +.tox .tox-form__group--collection{display: flex;} + +.tox .tox-form__grid{display: flex;flex-direction: row;flex-wrap: wrap;justify-content: space-between;} + +.tox .tox-form__grid--2col>.tox-form__group{width: calc(50% - (8px / 2));} + +.tox .tox-form__grid--3col>.tox-form__group{width: calc(100% / 3 - (8px / 2));} + +.tox .tox-form__grid--4col>.tox-form__group{width: calc(25% - (8px / 2));} + +.tox .tox-form__controls-h-stack{align-items: center;display: flex;} + +.tox .tox-form__group--inline{align-items: center;display: flex;} + +.tox .tox-form__group--stretched{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;} + +.tox .tox-form__group--stretched .tox-textarea{flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-form__group--stretched .tox-navobj{display: flex;flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex: 1;-ms-flex-preferred-size: auto;height: 100%;} + +.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left: 4px;} + +.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right: 4px;} + +.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display: none;} + +.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield,.tox:not([dir=rtl]) .tox-selectfield select,.tox[dir=rtl] .tox-selectfield select{width: 100%;padding: 5px 4.75px;margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 16px;line-height: 24px;color: #fff;background-color: #2b3b4e;border-color: #000;border-style: solid;border-width: 1px;border-radius: 3px;outline: 0;box-shadow: none;box-sizing: border-box;resize: none;-webkit-appearance: none;-moz-appearance: none;appearance: none;} + +.tox .tox-selectfield select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{border-color: #207ab7;outline: 0;box-shadow: none;} + +.tox .tox-toolbar-textfield{max-width: 250px;margin-top: 2px;margin-bottom: 3px;border-width: 0;} + +.tox .tox-naked-btn{display: block;padding: 0;margin: 0;color: #207ab7;cursor: pointer;background-color: transparent;border: 0;border-color: transparent;box-shadow: unset;} + +.tox .tox-naked-btn svg{display: block;fill: #fff;} + +.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left: 4px;} + +.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right: 4px;} + +.tox .tox-selectfield{position: relative;cursor: pointer;} + +.tox .tox-selectfield select::-ms-expand{display: none;} + +.tox .tox-selectfield svg{position: absolute;top: 50%;pointer-events: none;transform: translateY(-50%);} + +.tox:not([dir=rtl]) .tox-selectfield select{padding-right: 24px;} + +.tox:not([dir=rtl]) .tox-selectfield svg{right: 8px;} + +.tox[dir=rtl] .tox-selectfield select{padding-left: 24px;} + +.tox[dir=rtl] .tox-selectfield svg{left: 8px;} + +.tox .tox-textarea{white-space: pre-wrap;-webkit-appearance: textarea;-moz-appearance: textarea;appearance: textarea;} + +.tox-fullscreen{position: fixed;top: 0;left: 0;width: 100%;height: 100%;padding: 0;margin: 0;overflow: hidden;border: 0;} + +.tox-fullscreen .tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display: none;} + +.tox-fullscreen .tox.tox-tinymce.tox-fullscreen{z-index: 1200;} + +.tox-fullscreen .tox.tox-tinymce-aux{z-index: 1201;} + +.tox .tox-image-tools{width: 100%;} + +.tox .tox-image-tools__toolbar{align-items: center;display: flex;justify-content: center;} + +.tox .tox-image-tools__image{position: relative;width: 100%;height: 380px;overflow: auto;background-color: #666;} + +.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top: 8px;} + +.tox .tox-image-tools__image-bg{background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==);} + +.tox .tox-image-tools__toolbar>.tox-spacer{flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-croprect-block{position: absolute;background: #000;opacity: .5;zoom: 1;} + +.tox .tox-croprect-handle{position: absolute;top: 0;left: 0;width: 20px;height: 20px;border: 2px solid #fff;} + +.tox .tox-croprect-handle-move{position: absolute;cursor: move;border: 0;} + +.tox .tox-croprect-handle-nw{top: 100px;left: 100px;margin: -2px 0 0 -2px;cursor: nw-resize;border-width: 2px 0 0 2px;} + +.tox .tox-croprect-handle-ne{top: 100px;left: 200px;margin: -2px 0 0 -20px;cursor: ne-resize;border-width: 2px 2px 0 0;} + +.tox .tox-croprect-handle-sw{top: 200px;left: 100px;margin: -20px 2px 0 -2px;cursor: sw-resize;border-width: 0 0 2px 2px;} + +.tox .tox-croprect-handle-se{top: 200px;left: 200px;margin: -20px 0 0 -20px;cursor: se-resize;border-width: 0 2px 2px 0;} + +.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left: 8px;} + +.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left: 32px;} + +.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left: 32px;} + +.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right: 8px;} + +.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right: 32px;} + +.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right: 32px;} + +.tox .tox-insert-table-picker{display: flex;flex-wrap: wrap;width: 169px;} + +.tox .tox-insert-table-picker>div{width: 16px;height: 16px;border-color: #070a0d;border-style: solid;border-width: 0 1px 1px 0;box-sizing: content-box;} + +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin: -4px 0;} + +.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color: rgba(32,122,183,.5);border-color: rgba(32,122,183,.5);} + +.tox .tox-insert-table-picker__label{display: block;width: 100%;padding: 4px;font-size: 14px;color: #fff;text-align: center;} + +.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right: 0;} + +.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right: 0;} + +.tox .tox-menu{z-index: 1;display: inline-block;overflow: hidden;vertical-align: top;background-color: #2b3b4e;border: 1px solid #000;border-radius: 3px;box-shadow: 0 4px 8px 0 rgba(34,47,62,.1);} + +.tox .tox-menu.tox-collection.tox-collection--list{padding: 0;} + +.tox .tox-menu.tox-collection.tox-collection--toolbar{padding: 4px;} + +.tox .tox-menu.tox-collection.tox-collection--grid{padding: 4px;} + +.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin: 0;} + +.tox .tox-menubar{display: flex;padding: 0 4px;margin-bottom: -1px;background: url("data:image/svg+xml;charset=utf8,%3Csvg height='43px' viewBox='0 0 40 43px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='42px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color: #222f3e;flex: 0 0 auto;flex-shrink: 0;flex-wrap: wrap;} + +.tox .tox-mbtn{display: flex;width: auto;height: 34px;padding: 0 4px;margin: 2px 0 3px 0;overflow: hidden;font-size: 14px;font-style: normal;font-weight: 400;color: #fff;text-transform: normal;background: 0 0;border: 0;border-radius: 3px;outline: 0;box-shadow: none;align-items: center;flex: 0 0 auto;justify-content: center;} + +.tox .tox-mbtn[disabled]{color: rgba(255,255,255,.5);cursor: not-allowed;background-color: none;border-color: none;box-shadow: none;} + +.tox .tox-mbtn:hover:not(:disabled){color: #fff;background: #434e5b;box-shadow: none;} + +.tox .tox-mbtn:focus:not(:disabled){color: #fff;background: #434e5b;box-shadow: none;} + +.tox .tox-mbtn--active{color: #fff;background: #6f7882;box-shadow: none;} + +.tox .tox-mbtn__select-label{margin: 0 4px;font-weight: 400;cursor: default;} + +.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor: not-allowed;} + +.tox .tox-mbtn__select-chevron{display: flex;display: none;width: 16px;align-items: center;justify-content: center;} + +.tox .tox-notification{display: grid;padding: 5px;margin-top: 5px;background-color: #fffaea;border-color: #ffe89d;border-style: solid;border-width: 1px;opacity: 0;box-sizing: border-box;transition: transform .1s ease-in,opacity 150ms ease-in;grid-template-columns: minmax(40px,1fr) auto minmax(40px,1fr);} + +.tox .tox-notification--in{opacity: 1;} + +.tox .tox-notification--success{background-color: #dff0d8;border-color: #d6e9c6;} + +.tox .tox-notification--error{background-color: #f2dede;border-color: #ebccd1;} + +.tox .tox-notification--warn{background-color: #fcf8e3;border-color: #faebcc;} + +.tox .tox-notification--info{background-color: #d9edf7;border-color: #779ecb;} + +.tox .tox-notification__body{font-size: 14px;color: #fff;text-align: center;word-break: break-all;word-break: break-word;white-space: normal;align-self: center;grid-column-end: 3;-ms-grid-column-span: 1;grid-column-start: 2;grid-row-end: 2;grid-row-start: 1;} + +.tox .tox-notification__body>*{margin: 0;} + +.tox .tox-notification__body>*+*{margin-top: 1rem;} + +.tox .tox-notification__icon{align-self: center;-ms-grid-column-align: end;grid-column-end: 2;-ms-grid-column-span: 1;grid-column-start: 1;grid-row-end: 2;grid-row-start: 1;justify-self: end;} + +.tox .tox-notification__icon svg{display: block;} + +.tox .tox-notification__dismiss{align-self: start;-ms-grid-column-align: end;grid-column-end: 4;-ms-grid-column-span: 1;grid-column-start: 3;grid-row-end: 2;grid-row-start: 1;justify-self: end;} + +.tox .tox-notification .tox-progress-bar{-ms-grid-column-align: center;grid-column-end: 4;-ms-grid-column-span: 3;grid-column-start: 1;grid-row-end: 3;-ms-grid-row-span: 1;grid-row-start: 2;justify-self: center;} + +.tox .tox-pop{position: relative;display: inline-block;} + +.tox .tox-pop--resizing{transition: width .1s ease;} + +.tox .tox-pop--resizing .tox-toolbar{flex-wrap: nowrap;} + +.tox .tox-pop__dialog{min-width: 0;overflow: hidden;background-color: #222f3e;border: 1px solid #000;border-radius: 3px;box-shadow: 0 1px 3px rgba(0,0,0,.15);} + +.tox .tox-pop__dialog>:not(.tox-toolbar){margin: 4px 4px 4px 8px;} + +.tox .tox-pop__dialog .tox-toolbar{background-color: transparent;} + +.tox .tox-pop::after,.tox .tox-pop::before{position: absolute;display: block;width: 0;height: 0;border-style: solid;content: '';} + +.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{top: 100%;left: 50%;} + +.tox .tox-pop.tox-pop--bottom::after{margin-top: -1px;margin-left: -8px;border-color: #222f3e transparent transparent transparent;border-width: 8px;} + +.tox .tox-pop.tox-pop--bottom::before{margin-left: -9px;border-color: #000 transparent transparent transparent;border-width: 9px;} + +.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{top: 0;left: 50%;transform: translateY(-100%);} + +.tox .tox-pop.tox-pop--top::after{margin-top: 1px;margin-left: -8px;border-color: transparent transparent #222f3e transparent;border-width: 8px;} + +.tox .tox-pop.tox-pop--top::before{margin-left: -9px;border-color: transparent transparent #000 transparent;border-width: 9px;} + +.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{top: calc(50% - 1px);left: 0;transform: translateY(-50%);} + +.tox .tox-pop.tox-pop--left::after{margin-left: -15px;border-color: transparent #222f3e transparent transparent;border-width: 8px;} + +.tox .tox-pop.tox-pop--left::before{margin-left: -19px;border-color: transparent #000 transparent transparent;border-width: 10px;} + +.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{top: calc(50% + 1px);left: 100%;transform: translateY(-50%);} + +.tox .tox-pop.tox-pop--right::after{margin-left: -1px;border-color: transparent transparent transparent #222f3e;border-width: 8px;} + +.tox .tox-pop.tox-pop--right::before{margin-left: -1px;border-color: transparent transparent transparent #000;border-width: 10px;} + +.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left: 20px;} + +.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left: calc(100% - 20px);} + +.tox .tox-sidebar-wrap{display: flex;flex-direction: row;flex-grow: 1;min-height: 0;} + +.tox .tox-sidebar{display: flex;flex-direction: row;justify-content: flex-end;} + +.tox .tox-sidebar__slider{display: flex;overflow: hidden;} + +.tox .tox-sidebar__pane-container{display: flex;} + +.tox .tox-sidebar__pane{display: flex;} + +.tox .tox-sidebar--sliding-closed{opacity: 0;} + +.tox .tox-sidebar--sliding-open{opacity: 1;} + +.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition: width .5s ease,opacity .5s ease;} + +.tox .tox-slider{position: relative;display: flex;height: 24px;align-items: center;flex: 1;-ms-flex-preferred-size: auto;justify-content: center;} + +.tox .tox-slider__rail{width: 100%;height: 10px;min-width: 120px;background-color: transparent;border: 1px solid #000;border-radius: 3px;} + +.tox .tox-slider__handle{position: absolute;top: 50%;left: 50%;width: 14px;height: 24px;background-color: #207ab7;border: 2px solid #185d8c;border-radius: 3px;transform: translateX(-50%) translateY(-50%);box-shadow: none;} + +.tox .tox-source-code{overflow: auto;} + +.tox .tox-spinner{display: flex;} + +.tox .tox-spinner>div{width: 8px;height: 8px;background-color: rgba(255,255,255,.5);border-radius: 100%;animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both;} + +.tox .tox-spinner>div:nth-child(1){animation-delay: -.32s;} + +.tox .tox-spinner>div:nth-child(2){animation-delay: -.16s;}@keyframes tam-bouncing-dots{0%,100%,80%{transform: scale(0);} + +40%{transform: scale(1);}} + +.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left: 4px;} + +.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right: 4px;} + +.tox .tox-statusbar{position: relative;display: flex;height: 18px;padding: 0 8px;overflow: hidden;font-size: 12px;color: rgba(255,255,255,.5);text-transform: uppercase;background-color: #222f3e;border-top: 1px solid #000;align-items: center;flex: 0 0 auto;} + +.tox .tox-statusbar a{color: rgba(255,255,255,.5);text-decoration: none;} + +.tox .tox-statusbar a:hover{text-decoration: underline;} + +.tox .tox-statusbar__text-container{display: flex;flex: 1 1 auto;justify-content: flex-end;overflow: hidden;} + +.tox .tox-statusbar__path{display: flex;flex: 1 1 auto;margin-right: auto;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;} + +.tox .tox-statusbar__path>*{display: inline;white-space: nowrap;} + +.tox .tox-statusbar__wordcount{flex: 0 0 auto;margin-left: 1ch;} + +.tox .tox-statusbar__resize-handle{display: flex;padding-left: 1ch;margin-right: -8px;margin-left: auto;cursor: nwse-resize;align-items: flex-end;align-self: stretch;flex: 0 0 auto;justify-content: flex-end;} + +.tox .tox-statusbar__resize-handle svg{display: block;fill: rgba(255,255,255,.5);} + +.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right: 4px;} + +.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left: 1ch;} + +.tox[dir=rtl] .tox-statusbar{flex-direction: row-reverse;} + +.tox[dir=rtl] .tox-statusbar__path>*{margin-left: 4px;} + +.tox .tox-throbber{z-index: 1400;} + +.tox .tox-throbber__busy-spinner{position: absolute;top: 0;right: 0;bottom: 0;left: 0;display: flex;background-color: rgba(34,47,62,.6);align-items: center;justify-content: center;} + +.tox .tox-tbtn{display: flex;width: 34px;height: 34px;padding: 0;margin: 2px 0 3px 0;overflow: hidden;font-size: 14px;font-style: normal;font-weight: 400;color: #fff;text-transform: normal;background: 0 0;border: 0;border-radius: 3px;outline: 0;box-shadow: none;align-items: center;flex: 0 0 auto;justify-content: center;} + +.tox .tox-tbtn svg{display: block;fill: #fff;} + +.tox .tox-tbtn.tox-tbtn-more{width: inherit;padding-right: 5px;padding-left: 5px;} + +.tox .tox-tbtn--enabled{color: #fff;background: #6f7882;box-shadow: none;} + +.tox .tox-tbtn--enabled>*{transform: none;} + +.tox .tox-tbtn--enabled svg{fill: #fff;} + +.tox .tox-tbtn:hover{color: #fff;background: #434e5b;box-shadow: none;} + +.tox .tox-tbtn:hover svg{fill: #fff;} + +.tox .tox-tbtn:focus{color: #fff;background: #434e5b;box-shadow: none;} + +.tox .tox-tbtn:focus svg{fill: #fff;} + +.tox .tox-tbtn:active{color: #fff;background: #6f7882;box-shadow: none;} + +.tox .tox-tbtn:active svg{fill: #fff;} + +.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{color: rgba(255,255,255,.5);cursor: not-allowed;background: 0 0;box-shadow: none;} + +.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill: rgba(255,255,255,.5);} + +.tox .tox-tbtn:active>*{transform: none;} + +.tox .tox-tbtn--md{width: 51px;height: 51px;} + +.tox .tox-tbtn--lg{width: 68px;height: 68px;flex-direction: column;} + +.tox .tox-tbtn--return{width: 16px;height: unset;align-self: stretch;} + +.tox .tox-tbtn--labeled{width: unset;padding: 0 4px;} + +.tox .tox-tbtn__vlabel{display: block;margin-bottom: 4px;font-size: 10px;font-weight: 400;letter-spacing: -.025em;white-space: nowrap;} + +.tox .tox-tbtn--select{width: auto;padding: 0 4px;margin: 2px 0 3px 0;} + +.tox .tox-tbtn__select-label{margin: 0 4px;font-weight: 400;cursor: default;} + +.tox .tox-tbtn__select-chevron{align-items: center;display: flex;justify-content: center;width: 16px;} + +.tox .tox-tbtn__select-chevron svg{fill: rgba(255,255,255,.5);} + +.tox .tox-tbtn--bespoke .tox-tbtn__select-label{width: 7em;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;} + +.tox .tox-split-button{display: flex;margin: 2px 0 3px 0;overflow: hidden;border: 0;border-radius: 3px;box-sizing: border-box;} + +.tox .tox-split-button:hover{box-shadow: 0 0 0 1px #434e5b inset;} + +.tox .tox-split-button:focus{color: #fff;background: #434e5b;box-shadow: none;} + +.tox .tox-split-button>*{border-radius: 0;} + +.tox .tox-split-button__chevron{width: 16px;} + +.tox .tox-split-button__chevron svg{fill: rgba(255,255,255,.5);} + +.tox .tox-pop .tox-split-button__chevron svg{transform: rotate(-90deg);} + +.tox .tox-split-button .tox-tbtn{margin: 0;} + +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{color: rgba(255,255,255,.5);background: 0 0;box-shadow: none;} + +.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{display: flex;padding: 0 0;margin-bottom: -1px;background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color: #222f3e;border-top: 1px solid #000;flex: 0 0 auto;flex-shrink: 0;flex-wrap: wrap;} + +.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height: 0;opacity: 0;visibility: hidden;} + +.tox .tox-toolbar__overflow--growing{transition: height .3s ease,opacity .2s linear .1s;} + +.tox .tox-toolbar__overflow--shrinking{transition: opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s;} + +.tox .tox-pop .tox-toolbar{border-width: 0;} + +.tox .tox-toolbar--no-divider{background-image: none;} + +.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color: #222f3e;border: 1px solid #000;border-radius: 3px;box-shadow: 0 1px 3px rgba(0,0,0,.15);} + +.tox.tox-tinymce-aux:not([dir=rtl]) .tox-toolbar__overflow{margin-left: 4px;} + +.tox[dir=rtl] .tox-tbtn__icon-rtl svg{transform: rotateY(180deg);} + +.tox[dir=rtl].tox-tinymce-aux .tox-toolbar__overflow{margin-right: 4px;} + +.tox .tox-toolbar__group{display: flex;padding: 0 4px;margin: 0 0;align-items: center;flex-wrap: wrap;} + +.tox .tox-toolbar__group--pull-right{margin-left: auto;} + +.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right: 1px solid #000;} + +.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left: 1px solid #000;} + +.tox .tox-tooltip{position: relative;display: inline-block;padding: 8px;} + +.tox .tox-tooltip__body{padding: 4px 8px;font-size: 14px;font-style: normal;font-weight: 400;color: rgba(255,255,255,.75);text-transform: normal;background-color: #3d546f;border-radius: 3px;box-shadow: 0 2px 4px rgba(34,47,62,.3);} + +.tox .tox-tooltip__arrow{position: absolute;} + +.tox .tox-tooltip--down .tox-tooltip__arrow{position: absolute;bottom: 0;left: 50%;border-top: 8px solid #3d546f;border-right: 8px solid transparent;border-left: 8px solid transparent;transform: translateX(-50%);} + +.tox .tox-tooltip--up .tox-tooltip__arrow{position: absolute;top: 0;left: 50%;border-right: 8px solid transparent;border-bottom: 8px solid #3d546f;border-left: 8px solid transparent;transform: translateX(-50%);} + +.tox .tox-tooltip--right .tox-tooltip__arrow{position: absolute;top: 50%;right: 0;border-top: 8px solid transparent;border-bottom: 8px solid transparent;border-left: 8px solid #3d546f;transform: translateY(-50%);} + +.tox .tox-tooltip--left .tox-tooltip__arrow{position: absolute;top: 50%;left: 0;border-top: 8px solid transparent;border-right: 8px solid #3d546f;border-bottom: 8px solid transparent;transform: translateY(-50%);} + +.tox .tox-well{width: 100%;padding: 8px;border: 1px solid #000;border-radius: 3px;} + +.tox .tox-well>:first-child{margin-top: 0;} + +.tox .tox-well>:last-child{margin-bottom: 0;} + +.tox .tox-well>:only-child{margin: 0;} + +.tox .tox-custom-editor{display: flex;height: 525px;border: 1px solid #000;border-radius: 3px;} + +.tox .tox-dialog-loading::before{position: absolute;z-index: 1000;width: 100%;height: 100%;background-color: rgba(0,0,0,.5);content: "";} + +.tox .tox-tab{cursor: pointer;} + +.tox .tox-dialog__content-js{display: flex;flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-dialog__body-content .tox-collection{display: flex;flex: 1;-ms-flex-preferred-size: auto;} + +.tox ul{display: block;list-style-type: disc;-webkit-margin-before: 1em;margin-block-start: 1em;-webkit-margin-after: 1em;margin-block-end: 1em;-webkit-margin-start: 0;margin-inline-start: 0;-webkit-margin-end: 0;margin-inline-end: 0;-webkit-padding-start: 40px;padding-inline-start: 40px;} + +.tox a{color: #2276d2;cursor: pointer;} + +.tox .tox-image-tools-edit-panel{height: 60px;} + +.tox .tox-image-tools__sidebar{height: 60px;} diff --git a/public/resource/tinymce/skins/ui/oxide-dark/skin.mobile.min.css b/public/resource/tinymce/skins/ui/oxide-dark/skin.mobile.min.css new file mode 100644 index 0000000..14847d0 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide-dark/skin.mobile.min.css @@ -0,0 +1,239 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-outer-container{all: initial;display: block;} + +.tinymce-mobile-outer-container *{float: none;padding: 0;margin: 0;line-height: 1;text-shadow: none;white-space: nowrap;cursor: inherit;border: 0;outline: 0;box-sizing: initial;-webkit-tap-highlight-color: transparent;} + +.tinymce-mobile-icon-arrow-back::before{content: "\e5cd";} + +.tinymce-mobile-icon-image::before{content: "\e412";} + +.tinymce-mobile-icon-cancel-circle::before{content: "\e5c9";} + +.tinymce-mobile-icon-full-dot::before{content: "\e061";} + +.tinymce-mobile-icon-align-center::before{content: "\e234";} + +.tinymce-mobile-icon-align-left::before{content: "\e236";} + +.tinymce-mobile-icon-align-right::before{content: "\e237";} + +.tinymce-mobile-icon-bold::before{content: "\e238";} + +.tinymce-mobile-icon-italic::before{content: "\e23f";} + +.tinymce-mobile-icon-unordered-list::before{content: "\e241";} + +.tinymce-mobile-icon-ordered-list::before{content: "\e242";} + +.tinymce-mobile-icon-font-size::before{content: "\e245";} + +.tinymce-mobile-icon-underline::before{content: "\e249";} + +.tinymce-mobile-icon-link::before{content: "\e157";} + +.tinymce-mobile-icon-unlink::before{content: "\eca2";} + +.tinymce-mobile-icon-color::before{content: "\e891";} + +.tinymce-mobile-icon-previous::before{content: "\e314";} + +.tinymce-mobile-icon-next::before{content: "\e315";} + +.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content: "\e264";} + +.tinymce-mobile-icon-undo::before{content: "\e166";} + +.tinymce-mobile-icon-redo::before{content: "\e15a";} + +.tinymce-mobile-icon-removeformat::before{content: "\e239";} + +.tinymce-mobile-icon-small-font::before{content: "\e906";} + +.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content: "\e5ca";} + +.tinymce-mobile-icon-small-heading::before{content: "small";} + +.tinymce-mobile-icon-large-heading::before{content: "large";} + +.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family: sans-serif;font-size: 80%;} + +.tinymce-mobile-mask-edit-icon::before{content: "\e254";} + +.tinymce-mobile-icon-back::before{content: "\e5c4";} + +.tinymce-mobile-icon-heading::before{font-family: sans-serif;font-size: 80%;font-weight: 700;content: "Headings";} + +.tinymce-mobile-icon-h1::before{font-weight: 700;content: "H1";} + +.tinymce-mobile-icon-h2::before{font-weight: 700;content: "H2";} + +.tinymce-mobile-icon-h3::before{font-weight: 700;content: "H3";} + +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{position: absolute;top: 0;display: flex;width: 100%;height: 100%;background: rgba(51,51,51,.5);align-items: center;justify-content: center;} + +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{display: flex;font-family: sans-serif;font-size: 1em;border-radius: 50%;align-items: center;flex-direction: column;justify-content: space-between;} + +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{display: flex;width: 2.1em;height: 2.1em;border-radius: 50%;align-items: center;justify-content: center;} + +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items: center;display: flex;justify-content: center;flex-direction: column;font-size: 1em;}@media only screen and (min-device-width: 700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size: 1.2em;}} + +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{display: flex;width: 2.1em;height: 2.1em;color: #207ab7;background-color: #fff;border-radius: 50%;align-items: center;justify-content: center;} + +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{font-family: tinymce-mobile,sans-serif;content: "\e900";} + +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index: 2;} + +.tinymce-mobile-android-container.tinymce-mobile-android-maximized{position: fixed;top: 0;right: 0;bottom: 0;left: 0;display: flex;background: #fff;border: none;flex-direction: column;} + +.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position: relative;} + +.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display: flex;flex-grow: 1;} + +.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display: flex !important;flex-grow: 1;height: auto !important;} + +.tinymce-mobile-android-scroll-reload{overflow: hidden;} + +:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top: 23px;} + +.tinymce-mobile-toolstrip{z-index: 1;display: flex;background: #fff;flex: 0 0 auto;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{display: flex;width: 100%;height: 2.5em;background-color: #fff;border-bottom: 1px solid #ccc;align-items: center;flex: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items: center;display: flex;height: 100%;flex-shrink: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items: center;display: flex;height: 100%;flex: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background: #f44336;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-right: .5em;padding-left: .5em;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{display: flex;height: 80%;margin-right: 2px;margin-left: 2px;align-items: center;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{color: #ccc;background: #c8cbcf;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{color: #eceff1;background: #207ab7;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{display: flex;height: 100%;padding-top: .4em;padding-bottom: .4em;align-items: center;flex: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{position: relative;display: flex;width: 100%;min-height: 1.5em;padding-right: 0;padding-left: 0;overflow: hidden;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display: flex;width: 100%;height: 100%;transition: left cubic-bezier(.4,0,1,1) .15s;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display: flex;flex: 0 0 auto;justify-content: space-between;width: 100%;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family: sans-serif;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{position: relative;display: flex;flex-grow: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{position: absolute;right: 0;height: 100%;padding-right: 2px;font-size: .6em;font-weight: 700;color: #888;background: inherit;border: none;border-radius: 50%;align-self: center;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display: none;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous{align-items: center;display: flex;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before{display: flex;height: 100%;padding-right: .5em;padding-left: .5em;font-weight: 700;align-items: center;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before{visibility: hidden;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{padding-top: 3px;margin: 0 2px;font-size: 10px;line-height: 10px;color: #ccc;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color: #c8cbcf;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-right: .9em;margin-left: .5em;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-right: .5em;margin-left: .9em;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{position: relative;display: flex;padding: .28em 0;margin-right: 0;margin-left: 0;flex: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items: center;display: flex;flex-grow: 1;height: 100%;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{display: flex;height: .2em;margin-top: .3em;margin-bottom: .3em;background: #ccc;flex: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-right: 2em;padding-left: 2em;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items: center;display: flex;flex-grow: 1;height: 100%;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{display: flex;height: .2em;margin-top: .3em;margin-bottom: .3em;background: linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);flex: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{width: 1.2em;height: .2em;margin-top: .3em;margin-bottom: .3em;background: #000;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{width: 1.2em;height: .2em;margin-top: .3em;margin-bottom: .3em;background: #fff;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{position: absolute;top: 0;bottom: 0;left: -10px;display: flex;width: .5em;height: .5em;margin: auto;color: #fff;background-color: #455a64;border: .5em solid rgba(136,136,136,0);border-radius: 3em;transition: border 120ms cubic-bezier(.39,.58,.57,1);background-clip: padding-box;align-items: center;justify-content: center;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border: .5em solid rgba(136,136,136,.39);} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items: center;display: flex;height: 100%;flex: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction: column;justify-content: center;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items: center;display: flex;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height: 100%;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display: flex;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{padding-top: .1em;padding-bottom: .1em;padding-left: 5px;font-size: .85em;color: #455a64;background: #fff;border: none;border-radius: 0;flex-grow: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color: #888;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color: #888;} + +.tinymce-mobile-dropup{display: flex;width: 100%;overflow: hidden;background: #fff;} + +.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition: height .3s ease-out;} + +.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition: height .3s ease-in;} + +.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow: 0;} + +.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow: 1;} + +.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height: 200px;}@media only screen and (orientation: landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height: 200px;}}@media only screen and (min-device-width: 320px) and (max-device-width: 568px) and (orientation: landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height: 150px;}} + +.tinymce-mobile-styles-menu{position: relative;width: 100%;overflow: hidden;font-family: sans-serif;outline: 4px solid #000;} + +.tinymce-mobile-styles-menu [role=menu]{position: absolute;display: flex;width: 100%;height: 100%;flex-direction: column;} + +.tinymce-mobile-styles-menu [role=menu].transitioning{transition: transform .5s ease-in-out;} + +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{position: relative;display: flex;padding: 1em 1em;color: #455a64;cursor: pointer;border-bottom: 1px solid #ddd;} + +.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{font-family: tinymce-mobile,sans-serif;color: #455a64;content: "\e314";} + +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{position: absolute;right: 0;padding-right: 1em;padding-left: 1em;font-family: tinymce-mobile,sans-serif;color: #455a64;content: "\e315";} + +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{position: absolute;right: 0;padding-right: 1em;padding-left: 1em;font-family: tinymce-mobile,sans-serif;} + +.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{display: flex;min-height: 2.5em;padding-right: 1em;padding-left: 1em;color: #455a64;background: #fff;border-top: #455a64;align-items: center;} + +.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform: translate(-100%);} + +.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform: translate(0);} + +.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform: translate(100%);}@font-face{font-family: tinymce-mobile;font-style: normal;font-weight: 400;src: url(fonts/tinymce-mobile.woff?8x92w3) format('woff');}@media (min-device-width: 700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size: 25px;}}@media (max-device-width: 700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size: 18px;}} + +.tinymce-mobile-icon{font-family: tinymce-mobile,sans-serif;} + +.mixin-flex-and-centre{align-items: center;display: flex;justify-content: center;} + +.mixin-flex-bar{align-items: center;display: flex;height: 100%;} + +.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{width: 100%;background-color: #fff;} + +.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{position: fixed;right: 2em;bottom: 1em;display: flex;width: 2.1em;height: 2.1em;font-size: 1em;color: #fff;background-color: #207ab7;border-radius: 50%;align-items: center;justify-content: center;}@media only screen and (min-device-width: 700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size: 1.2em;}} + +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height: 300px;overflow: hidden;} + +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height: 100%;} + +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display: none;} + +input[type=file]::-webkit-file-upload-button{display: none;}@media only screen and (min-device-width: 320px) and (max-device-width: 568px) and (orientation: landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom: 50%;}} diff --git a/public/resource/tinymce/skins/ui/oxide/content.inline.min.css b/public/resource/tinymce/skins/ui/oxide/content.inline.min.css new file mode 100644 index 0000000..748f313 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide/content.inline.min.css @@ -0,0 +1,239 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{display: inline-block;width: 8px !important;height: 12px !important;padding: 0 2px;cursor: default;background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;-webkit-user-select: all;-moz-user-select: all;-ms-user-select: all;user-select: all;-webkit-user-modify: read-only;-moz-user-modify: read-only;} + +.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset: 1px;} + +.tox-comments-visible .tox-comment{background-color: #fff0b7;} + +.tox-comments-visible .tox-comment--active{background-color: #ffe168;} + +.tox-checklist>li:not(.tox-checklist--hidden){margin: .25em 0;list-style: none;} + +.tox-checklist>li:not(.tox-checklist--hidden)::before{position: absolute;width: 1em;height: 1em;margin-top: .125em;margin-left: -1.5em;cursor: pointer;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");background-size: 100%;content: '';} + +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");} + +[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-right: -1.5em;margin-left: 0;} + +code[class*=language-],pre[class*=language-]{font-family: Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size: .875rem;-webkit-hyphens: none;-ms-hyphens: none;hyphens: none;line-height: 1.5;word-spacing: normal;color: #000;text-shadow: 0 1px #fff;word-break: normal;word-wrap: normal;white-space: pre;-moz-tab-size: 4;tab-size: 4;} + +code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow: none;background: #b3d4fc;} + +code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow: none;background: #b3d4fc;}@media print{code[class*=language-],pre[class*=language-]{text-shadow: none;}} + +pre[class*=language-]{padding: 1em;margin: .5em 0;overflow: auto;} + +:not(pre)>code[class*=language-],pre[class*=language-]{background: 0 0 !important;border: 1px solid #ccc;} + +:not(pre)>code[class*=language-]{padding: .1em;border-radius: .3em;} + +.token.cdata,.token.comment,.token.doctype,.token.prolog{color: #708090;} + +.token.punctuation{color: #999;} + +.namespace{opacity: .7;} + +.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color: #905;} + +.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color: #690;} + +.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color: #a67f59;background: hsla(0,0%,100%,.5);} + +.token.atrule,.token.attr-value,.token.keyword{color: #07a;} + +.token.function{color: #dd4a68;} + +.token.important,.token.regex,.token.variable{color: #e90;} + +.token.bold,.token.important{font-weight: 700;} + +.token.italic{font-style: italic;} + +.token.entity{cursor: help;} + +:not([dir=rtl]) code[class*=language-],:not([dir=rtl]) pre[class*=language-]{text-align: left;direction: ltr;} + +[dir=rtl] code[class*=language-],[dir=rtl] pre[class*=language-]{text-align: right;direction: rtl;} + +.mce-content-body{overflow-wrap: break-word;word-wrap: break-word;} + +.mce-content-body .mce-visual-caret{position: absolute;background-color: #000;background-color: currentColor;} + +.mce-content-body .mce-visual-caret-hidden{display: none;} + +.mce-content-body [data-mce-caret]{position: absolute;top: 0;right: auto;left: -1000px;padding: 0;margin: 0;} + +.mce-content-body .mce-offscreen-selection{position: absolute;left: -9999999999px;max-width: 1000000px;} + +.mce-content-body [contentEditable=false]{cursor: default;} + +.mce-content-body [contentEditable=true]{cursor: text;} + +.tox-cursor-format-painter{cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default;} + +.mce-content-body figure.align-left{float: left;} + +.mce-content-body figure.align-right{float: right;} + +.mce-content-body figure.image.align-center{display: table;margin-right: auto;margin-left: auto;} + +.mce-preview-object{position: relative;display: inline-block;margin: 0 2px 0 2px;line-height: 0;border: 1px solid gray;} + +.mce-preview-object .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);} + +.mce-preview-object[data-mce-selected="2"] .mce-shim{display: none;} + +.mce-object{background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border: 1px dashed #aaa;} + +.mce-pagebreak{display: block;width: 100%;height: 5px;margin-top: 15px;cursor: default;border: 1px dashed #aaa;page-break-before: always;}@media print{.mce-pagebreak{border: 0;}} + +.tiny-pageembed .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);} + +.tiny-pageembed[data-mce-selected="2"] .mce-shim{display: none;} + +.tiny-pageembed{position: relative;display: inline-block;} + +.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{position: relative;display: block;width: 100%;padding: 0;overflow: hidden;} + +.tiny-pageembed--16by9::before,.tiny-pageembed--1by1::before,.tiny-pageembed--21by9::before,.tiny-pageembed--4by3::before{display: block;content: "";} + +.tiny-pageembed--21by9::before{padding-top: 42.857143%;} + +.tiny-pageembed--16by9::before{padding-top: 56.25%;} + +.tiny-pageembed--4by3::before{padding-top: 75%;} + +.tiny-pageembed--1by1::before{padding-top: 100%;} + +.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{position: absolute;top: 0;left: 0;width: 100%;height: 100%;border: 0;} + +.mce-content-body div.mce-resizehandle{position: absolute;z-index: 10000;width: 10px;height: 10px;background-color: #4099ff;border-color: #4099ff;border-style: solid;border-width: 1px;box-sizing: border-box;} + +.mce-content-body div.mce-resizehandle:hover{background-color: #4099ff;} + +.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor: nwse-resize;} + +.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor: nesw-resize;} + +.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor: nwse-resize;} + +.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor: nesw-resize;} + +.mce-content-body .mce-clonedresizable{position: absolute;z-index: 10000;outline: 1px dashed #000;opacity: .5;} + +.mce-content-body .mce-resize-helper{position: absolute;z-index: 10001;display: none;padding: 5px;margin: 5px 10px;font-family: sans-serif;font-size: 12px;line-height: 14px;color: #fff;white-space: nowrap;background: #555;background: rgba(0,0,0,.75);border: 1px;border-radius: 3px;} + +.mce-match-marker{color: #fff;background: #aaa;} + +.mce-match-marker-selected{color: #fff;background: #39f;} + +.mce-content-body img[data-mce-selected],.mce-content-body table[data-mce-selected]{outline: 3px solid #b4d7ff;} + +.mce-content-body hr[data-mce-selected]{outline: 3px solid #b4d7ff;outline-offset: 1px;} + +.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline: 3px solid #b4d7ff;} + +.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline: 3px solid #b4d7ff;} + +.mce-content-body [contentEditable=false][data-mce-selected]{cursor: not-allowed;outline: 3px solid #b4d7ff;} + +.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline: 0;} + +.mce-content-body [data-mce-selected=inline-boundary]{background-color: #b4d7ff;} + +.mce-content-body .mce-edit-focus{outline: 3px solid #b4d7ff;} + +.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{background-color: #b4d7ff !important;} + +.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background: 0 0;} + +.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background: 0 0;} + +.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{-webkit-touch-callout: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;} + +.mce-content-body img::-moz-selection{background: 0 0;} + +.mce-content-body img::selection{background: 0 0;} + +.ephox-snooker-resizer-bar{background-color: #b4d7ff;opacity: 0;} + +.ephox-snooker-resizer-cols{cursor: col-resize;} + +.ephox-snooker-resizer-rows{cursor: row-resize;} + +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity: 1;} + +.mce-spellchecker-word{height: 2rem;cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.5'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;} + +.mce-spellchecker-grammar{cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23008800'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;} + +.mce-toc{border: 1px solid gray;} + +.mce-toc h2{margin: 4px;} + +.mce-toc li{list-style-type: none;} + +.mce-item-table,.mce-item-table caption,.mce-item-table td,.mce-item-table th{border: 1px dashed #bbb;} + +.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{padding-top: 10px;margin-left: 3px;background-repeat: no-repeat;border: 1px dashed #bbb;} + +.mce-visualblocks p{background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);} + +.mce-visualblocks h1{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);} + +.mce-visualblocks h2{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);} + +.mce-visualblocks h3{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);} + +.mce-visualblocks h4{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);} + +.mce-visualblocks h5{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);} + +.mce-visualblocks h6{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);} + +.mce-visualblocks div:not([data-mce-bogus]){background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);} + +.mce-visualblocks section{background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);} + +.mce-visualblocks article{background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);} + +.mce-visualblocks blockquote{background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);} + +.mce-visualblocks address{background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);} + +.mce-visualblocks pre{background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);} + +.mce-visualblocks figure{background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);} + +.mce-visualblocks figcaption{border: 1px dashed #bbb;} + +.mce-visualblocks hgroup{background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);} + +.mce-visualblocks aside{background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);} + +.mce-visualblocks ul{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);} + +.mce-visualblocks ol{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);} + +.mce-visualblocks dl{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);} + +.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left: 3px;} + +.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x: right;margin-right: 3px;} + +.mce-nbsp,.mce-shy{background: #aaa;} + +.mce-shy::after{content: '-';} + +.tox-toolbar-dock-fadeout{opacity: 0;visibility: hidden;} + +.tox-toolbar-dock-fadein{opacity: 1;visibility: visible;} + +.tox-toolbar-dock-transition{transition: visibility 0s linear .3s,opacity .3s ease;} + +.tox-toolbar-dock-transition.tox-toolbar-dock-fadein{transition-delay: 0s;} diff --git a/public/resource/tinymce/skins/ui/oxide/content.min.css b/public/resource/tinymce/skins/ui/oxide/content.min.css new file mode 100644 index 0000000..6e7165f --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide/content.min.css @@ -0,0 +1,235 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{display: inline-block;width: 8px !important;height: 12px !important;padding: 0 2px;cursor: default;background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;-webkit-user-select: all;-moz-user-select: all;-ms-user-select: all;user-select: all;-webkit-user-modify: read-only;-moz-user-modify: read-only;} + +.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset: 1px;} + +.tox-comments-visible .tox-comment{background-color: #fff0b7;} + +.tox-comments-visible .tox-comment--active{background-color: #ffe168;} + +.tox-checklist>li:not(.tox-checklist--hidden){margin: .25em 0;list-style: none;} + +.tox-checklist>li:not(.tox-checklist--hidden)::before{position: absolute;width: 1em;height: 1em;margin-top: .125em;margin-left: -1.5em;cursor: pointer;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");background-size: 100%;content: '';} + +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");} + +[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-right: -1.5em;margin-left: 0;} + +code[class*=language-],pre[class*=language-]{font-family: Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size: .875rem;-webkit-hyphens: none;-ms-hyphens: none;hyphens: none;line-height: 1.5;word-spacing: normal;color: #000;text-shadow: 0 1px #fff;word-break: normal;word-wrap: normal;white-space: pre;-moz-tab-size: 4;tab-size: 4;} + +code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow: none;background: #b3d4fc;} + +code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow: none;background: #b3d4fc;}@media print{code[class*=language-],pre[class*=language-]{text-shadow: none;}} + +pre[class*=language-]{padding: 1em;margin: .5em 0;overflow: auto;} + +:not(pre)>code[class*=language-],pre[class*=language-]{background: 0 0 !important;border: 1px solid #ccc;} + +:not(pre)>code[class*=language-]{padding: .1em;border-radius: .3em;} + +.token.cdata,.token.comment,.token.doctype,.token.prolog{color: #708090;} + +.token.punctuation{color: #999;} + +.namespace{opacity: .7;} + +.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color: #905;} + +.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color: #690;} + +.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color: #a67f59;background: hsla(0,0%,100%,.5);} + +.token.atrule,.token.attr-value,.token.keyword{color: #07a;} + +.token.function{color: #dd4a68;} + +.token.important,.token.regex,.token.variable{color: #e90;} + +.token.bold,.token.important{font-weight: 700;} + +.token.italic{font-style: italic;} + +.token.entity{cursor: help;} + +:not([dir=rtl]) code[class*=language-],:not([dir=rtl]) pre[class*=language-]{text-align: left;direction: ltr;} + +[dir=rtl] code[class*=language-],[dir=rtl] pre[class*=language-]{text-align: right;direction: rtl;} + +.mce-content-body{overflow-wrap: break-word;word-wrap: break-word;} + +.mce-content-body .mce-visual-caret{position: absolute;background-color: #000;background-color: currentColor;} + +.mce-content-body .mce-visual-caret-hidden{display: none;} + +.mce-content-body [data-mce-caret]{position: absolute;top: 0;right: auto;left: -1000px;padding: 0;margin: 0;} + +.mce-content-body .mce-offscreen-selection{position: absolute;left: -9999999999px;max-width: 1000000px;} + +.mce-content-body [contentEditable=false]{cursor: default;} + +.mce-content-body [contentEditable=true]{cursor: text;} + +.tox-cursor-format-painter{cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default;} + +.mce-content-body figure.align-left{float: left;} + +.mce-content-body figure.align-right{float: right;} + +.mce-content-body figure.image.align-center{display: table;margin-right: auto;margin-left: auto;} + +.mce-preview-object{position: relative;display: inline-block;margin: 0 2px 0 2px;line-height: 0;border: 1px solid gray;} + +.mce-preview-object .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);} + +.mce-preview-object[data-mce-selected="2"] .mce-shim{display: none;} + +.mce-object{background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border: 1px dashed #aaa;} + +.mce-pagebreak{display: block;width: 100%;height: 5px;margin-top: 15px;cursor: default;border: 1px dashed #aaa;page-break-before: always;}@media print{.mce-pagebreak{border: 0;}} + +.tiny-pageembed .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);} + +.tiny-pageembed[data-mce-selected="2"] .mce-shim{display: none;} + +.tiny-pageembed{position: relative;display: inline-block;} + +.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{position: relative;display: block;width: 100%;padding: 0;overflow: hidden;} + +.tiny-pageembed--16by9::before,.tiny-pageembed--1by1::before,.tiny-pageembed--21by9::before,.tiny-pageembed--4by3::before{display: block;content: "";} + +.tiny-pageembed--21by9::before{padding-top: 42.857143%;} + +.tiny-pageembed--16by9::before{padding-top: 56.25%;} + +.tiny-pageembed--4by3::before{padding-top: 75%;} + +.tiny-pageembed--1by1::before{padding-top: 100%;} + +.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{position: absolute;top: 0;left: 0;width: 100%;height: 100%;border: 0;} + +.mce-content-body div.mce-resizehandle{position: absolute;z-index: 10000;width: 10px;height: 10px;background-color: #4099ff;border-color: #4099ff;border-style: solid;border-width: 1px;box-sizing: border-box;} + +.mce-content-body div.mce-resizehandle:hover{background-color: #4099ff;} + +.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor: nwse-resize;} + +.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor: nesw-resize;} + +.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor: nwse-resize;} + +.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor: nesw-resize;} + +.mce-content-body .mce-clonedresizable{position: absolute;z-index: 10000;outline: 1px dashed #000;opacity: .5;} + +.mce-content-body .mce-resize-helper{position: absolute;z-index: 10001;display: none;padding: 5px;margin: 5px 10px;font-family: sans-serif;font-size: 12px;line-height: 14px;color: #fff;white-space: nowrap;background: #555;background: rgba(0,0,0,.75);border: 1px;border-radius: 3px;} + +.mce-match-marker{color: #fff;background: #aaa;} + +.mce-match-marker-selected{color: #fff;background: #39f;} + +.mce-content-body img[data-mce-selected],.mce-content-body table[data-mce-selected]{outline: 3px solid #b4d7ff;} + +.mce-content-body hr[data-mce-selected]{outline: 3px solid #b4d7ff;outline-offset: 1px;} + +.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline: 3px solid #b4d7ff;} + +.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline: 3px solid #b4d7ff;} + +.mce-content-body [contentEditable=false][data-mce-selected]{cursor: not-allowed;outline: 3px solid #b4d7ff;} + +.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline: 0;} + +.mce-content-body [data-mce-selected=inline-boundary]{background-color: #b4d7ff;} + +.mce-content-body .mce-edit-focus{outline: 3px solid #b4d7ff;} + +.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{background-color: #b4d7ff !important;} + +.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background: 0 0;} + +.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background: 0 0;} + +.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{-webkit-touch-callout: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;} + +.mce-content-body img::-moz-selection{background: 0 0;} + +.mce-content-body img::selection{background: 0 0;} + +.ephox-snooker-resizer-bar{background-color: #b4d7ff;opacity: 0;} + +.ephox-snooker-resizer-cols{cursor: col-resize;} + +.ephox-snooker-resizer-rows{cursor: row-resize;} + +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity: 1;} + +.mce-spellchecker-word{height: 2rem;cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.5'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;} + +.mce-spellchecker-grammar{cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23008800'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;} + +.mce-toc{border: 1px solid gray;} + +.mce-toc h2{margin: 4px;} + +.mce-toc li{list-style-type: none;} + +.mce-item-table,.mce-item-table caption,.mce-item-table td,.mce-item-table th{border: 1px dashed #bbb;} + +.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{padding-top: 10px;margin-left: 3px;background-repeat: no-repeat;border: 1px dashed #bbb;} + +.mce-visualblocks p{background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);} + +.mce-visualblocks h1{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);} + +.mce-visualblocks h2{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);} + +.mce-visualblocks h3{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);} + +.mce-visualblocks h4{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);} + +.mce-visualblocks h5{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);} + +.mce-visualblocks h6{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);} + +.mce-visualblocks div:not([data-mce-bogus]){background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);} + +.mce-visualblocks section{background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);} + +.mce-visualblocks article{background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);} + +.mce-visualblocks blockquote{background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);} + +.mce-visualblocks address{background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);} + +.mce-visualblocks pre{background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);} + +.mce-visualblocks figure{background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);} + +.mce-visualblocks figcaption{border: 1px dashed #bbb;} + +.mce-visualblocks hgroup{background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);} + +.mce-visualblocks aside{background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);} + +.mce-visualblocks ul{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);} + +.mce-visualblocks ol{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);} + +.mce-visualblocks dl{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);} + +.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left: 3px;} + +.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x: right;margin-right: 3px;} + +.mce-nbsp,.mce-shy{background: #aaa;} + +.mce-shy::after{content: '-';} + +body{font-family: sans-serif;} + +table{border-collapse: collapse;} diff --git a/public/resource/tinymce/skins/ui/oxide/content.mobile.min.css b/public/resource/tinymce/skins/ui/oxide/content.mobile.min.css new file mode 100644 index 0000000..c052252 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide/content.mobile.min.css @@ -0,0 +1,17 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{position: absolute;display: inline-block;background-color: green;opacity: .5;} + +body{-webkit-text-size-adjust: none;} + +body img{max-width: 96vw;} + +body table img{max-width: 95%;} + +body{font-family: sans-serif;} + +table{border-collapse: collapse;} diff --git a/public/resource/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff b/public/resource/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff new file mode 100644 index 0000000000000000000000000000000000000000..1e3be038a607cb7c2544ed8ae3d6621f77bf4c38 GIT binary patch literal 4624 zcmb7IeQaFC5#QN&AGUL{efE7g{=BM1W-|RaVdWQe^e?BC`eGz4^i8S3PQw?Hhd_eQHxTkckXZB zdzU((wCVGko!Qyh+1c6InRotvZ%+>+hNrBQtrFOI4t*}DZ$7=>Sr=uD3c$ZlKuKBQ z8~ervCczs9SOk2!>AAqrz+v$CC}f1JfYPDSqx->|V$6{ekbe8M#Bh3Gkg?)-Fdi3B zeB$}UFqn*$pv&q7*net~hsUOlfG7Ho2zaowY%JPRytMvu{&xRPm(h_~w##F>vqE&a5-ssH##mlfAk}44^ zXRJKd!Ifw&ce{$Y9BAg5c>e>p_Z;t!=P{izddGWie?aHLdKL3Cn9rG=d2vt;esWqH zoD}uAoi3Z~4+LABvADt+so4~t%VlyIJ{O3tm$NC+(!yenQD%NVr*btG$T3+_WX=LH z#1M2ZNEtrO+-x;l2i>M^5o%GQ@s?N+gw*19H@G~vl3Q5Zf*t6jjW0GOTmAmlWYgSS zJeiEo%~LA-FW|YAd_Em$OE#@dw)y*#@p!UtnWa);V1HY3ZBw!>(3gY{iFFa_c6iW9 zIQ@xck^{xu9_o;UyQH#ba@y?L$xW?8J35?$p1z46ZjIctZ8QCKCa29bMC1-t@pT>S zTUT1WMjQz-75d)5zJxv~@Yd)bY)ejQBx_XQiaMJ z>$5`NO3?L*ND{UQeF8%xl)$_>w9tmQpfEebzedazFeh#~d}suN+vzsqLiW~@TLhoe zk1%xEcxP2ZL)FuoXeYzb-J5goljDxPL2@@#RW)d&X#&6QO5U=04_628@ONSvtgpha zDqqmoVep`A4<+PK$V>K+T}}{8Rj+Q|UAzCtl!Fh)uXJg{x$}HMJH7LcBLzj-r{h;< zzote8Id%pcAyE;87D<8glyaFeq#k)OEDB%yA ze%CeZ!?4TEs#pj+%14DBZHn8jxaF2as6}p3+!6p-&@I>5lbP3&N$svcIF-`0R5(o2 zh7la++|;-euckH44a4BAwB++#-cZ z)kFyC=eUS-4D0t}H8LdZY!JD^sW@F85io)%=8HU)ouhEeo-K_dJ3BV+8fo0JXIjlP zZt0H`0=Yv~I|PpRZ)r5_iAYmY9V=wT@BsoN9<3vftB|}TOH;|yNk_e7(2-?y{&cSK zG=E5Nz^Ko4>KxcbY!Q13!=HBS$lM96_+0y3M1yWTAt2u5C;6MWMXbRN?RI{$eHnAx z&t=-PSjZ>Qe2V2-YGs1YWemAq zVHdG{9V$QvsY~Cgq-L*PZqMPGv|px$)K~3<%+fBtG{oIRPL_7ye$-(`C=tS)^xC}% zue73qiF&{nXJ*>-@668G!`IrAeB;ad09shzt{O?7omLE_X@H|#ozGt&64 zb-&_lLkZI8TzigPZvUr=4g2-8M6M8b9EQLgoPswYg)d)j&%gZHJO!2>(?;I*8d>aG z#oS295Kcq{uD4R2@VEG($}WWiF-6YK)kjqks%o_U{CIAVX2;tX7o|unkew5?Gn3(| zOePS^{$(;Xi4ph;`KO#;k+vaLt8n5@doi+OEvH&?*+3(WgqkT9-$b0fTHm;)r=NmR zJnJ9o>UvNR(JMoIdRBf{%kd}jmZ)b)#4>dnDfq0G(?~S%d zv50QeMR$Kzd*S$AEXdp5Fhqe0Pz zZ!oS2e!i-tWEJ2^YoVo}V7S0tV7CujimbVJtVNb#yB&<-f&xpSb@m2=wBZ|qU-_^; z?C{lk+;tlxk&Sh3Pwh(D7~kNh`O=~TMWuRUu^0=9)`CYEVwhvGWUt4Wd3`6*H)Zs>LLYQcC#*~B78EfTt7RQ*l)b{v zqntLNsC`h&zZCY{x*}gfPU4at;nfileU3>zeyLdO7;;lFIft~ zsm6#wb5Jjtv;_VxleU0<%cQON-O*ywHt`@C4fn-Y83}=|hJPOpN>1H%C#7)9etg_yG)$:first-child{border-top: none !important;} + +.tox-tinymce-aux{font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;} + +.tox-tinymce :focus,.tox-tinymce-aux :focus{outline: 0;} + +button::-moz-focus-inner{border: 0;} + +.tox-silver-sink{z-index: 1300;} + +.tox .tox-anchorbar{display: flex;flex: 0 0 auto;} + +.tox .tox-bar{display: flex;flex: 0 0 auto;} + +.tox .tox-button{display: inline-block;padding: 4px 16px;margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 14px;font-weight: 700;line-height: 24px;letter-spacing: 1;color: #fff;text-align: center;text-decoration: none;text-transform: capitalize;white-space: nowrap;cursor: pointer;background-color: #207ab7;background-image: none;background-position: none;background-repeat: none;border-color: #207ab7;border-style: solid;border-width: 1px;border-radius: 3px;outline: 0;box-shadow: none;box-sizing: border-box;} + +.tox .tox-button[disabled]{color: rgba(255,255,255,.5);cursor: not-allowed;background-color: #207ab7;background-image: none;border-color: #207ab7;box-shadow: none;} + +.tox .tox-button:focus:not(:disabled){color: #fff;background-color: #1c6ca1;background-image: none;border-color: #1c6ca1;box-shadow: none;} + +.tox .tox-button:hover:not(:disabled){color: #fff;background-color: #1c6ca1;background-image: none;border-color: #1c6ca1;box-shadow: none;} + +.tox .tox-button:active:not(:disabled){color: #fff;background-color: #185d8c;background-image: none;border-color: #185d8c;box-shadow: none;} + +.tox .tox-button--secondary{padding: 4px 16px;color: #222f3e;text-decoration: none;text-transform: capitalize;background-color: #f0f0f0;background-image: none;background-position: none;background-repeat: none;border-color: #f0f0f0;border-style: solid;border-width: 1px;border-radius: 3px;outline: 0;box-shadow: none;} + +.tox .tox-button--secondary[disabled]{color: rgba(34,47,62,.5);background-color: #f0f0f0;background-image: none;border-color: #f0f0f0;box-shadow: none;} + +.tox .tox-button--secondary:focus:not(:disabled){color: #222f3e;background-color: #e3e3e3;background-image: none;border-color: #e3e3e3;box-shadow: none;} + +.tox .tox-button--secondary:hover:not(:disabled){color: #222f3e;background-color: #e3e3e3;background-image: none;border-color: #e3e3e3;box-shadow: none;} + +.tox .tox-button--secondary:active:not(:disabled){color: #222f3e;background-color: #d6d6d6;background-image: none;border-color: #d6d6d6;box-shadow: none;} + +.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding: 4px;} + +.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display: block;fill: currentColor;} + +.tox .tox-button-link{display: inline-block;padding: 0;margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 16px;font-weight: 400;line-height: 1.3;white-space: nowrap;cursor: pointer;background: 0;border: none;box-sizing: border-box;} + +.tox .tox-button-link--sm{font-size: 14px;} + +.tox .tox-button--naked{color: #222f3e;background-color: transparent;border-color: transparent;box-shadow: unset;} + +.tox .tox-button--naked:hover:not(:disabled){color: #222f3e;background-color: #e3e3e3;border-color: #e3e3e3;box-shadow: none;} + +.tox .tox-button--naked:focus:not(:disabled){color: #222f3e;background-color: #e3e3e3;border-color: #e3e3e3;box-shadow: none;} + +.tox .tox-button--naked:active:not(:disabled){color: #222f3e;background-color: #d6d6d6;border-color: #d6d6d6;box-shadow: none;} + +.tox .tox-button--naked .tox-icon svg{fill: currentColor;} + +.tox .tox-button--naked.tox-button--icon{color: currentColor;} + +.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color: #222f3e;} + +.tox .tox-checkbox{display: flex;height: 36px;min-width: 36px;cursor: pointer;border-radius: 3px;align-items: center;} + +.tox .tox-checkbox__input{position: absolute;top: auto;left: -10000px;width: 1px;height: 1px;overflow: hidden;} + +.tox .tox-checkbox__icons{width: 24px;height: 24px;padding: calc(4px - 1px);border-radius: 3px;box-shadow: 0 0 0 2px transparent;box-sizing: content-box;} + +.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display: block;fill: rgba(34,47,62,.3);} + +.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display: none;fill: #207ab7;} + +.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display: none;fill: #207ab7;} + +.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display: none;} + +.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display: block;} + +.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display: none;} + +.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display: block;} + +.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{padding: calc(4px - 1px);border-radius: 3px;box-shadow: inset 0 0 0 1px #207ab7;} + +.tox:not([dir=rtl]) .tox-checkbox__label{margin-left: 4px;} + +.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left: 4px;} + +.tox[dir=rtl] .tox-checkbox__label{margin-right: 4px;} + +.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right: 4px;} + +.tox .tox-collection--toolbar .tox-collection__group{display: flex;padding: 0;} + +.tox .tox-collection--grid .tox-collection__group{display: flex;max-height: 208px;padding: 0;overflow-x: hidden;overflow-y: auto;flex-wrap: wrap;} + +.tox .tox-collection--list .tox-collection__group{padding: 4px 0;border-color: #ccc;border-style: solid;border-top-width: 1px;border-right-width: 0;border-bottom-width: 0;border-left-width: 0;} + +.tox .tox-collection--list .tox-collection__group:first-child{border-top-width: 0;} + +.tox .tox-collection__group-heading{padding: 4px 8px;margin-top: -4px;margin-bottom: 4px;font-size: 12px;font-style: normal;font-weight: 400;color: rgba(34,47,62,.7);text-transform: none;cursor: default;background-color: #e6e6e6;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;-webkit-touch-callout: none;} + +.tox .tox-collection__item{display: flex;color: #222f3e;cursor: pointer;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;align-items: center;-webkit-touch-callout: none;} + +.tox .tox-collection--list .tox-collection__item{padding: 4px 8px;} + +.tox .tox-collection--toolbar .tox-collection__item{padding: 4px;border-radius: 3px;} + +.tox .tox-collection--grid .tox-collection__item{padding: 4px;border-radius: 3px;} + +.tox .tox-collection--list .tox-collection__item--enabled{color: contrast(inherit,#222f3e,#fff);background-color: inherit;} + +.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color: #222f3e;background-color: #dee0e2;} + +.tox .tox-collection--toolbar .tox-collection__item--enabled{color: #222f3e;background-color: #c8cbcf;} + +.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color: #222f3e;background-color: #dee0e2;} + +.tox .tox-collection--grid .tox-collection__item--enabled{color: #222f3e;background-color: #c8cbcf;} + +.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){color: #222f3e;background-color: #dee0e2;} + +.tox .tox-collection__item--state-disabled{color: rgba(34,47,62,.5);cursor: default;background-color: transparent;} + +.tox .tox-collection__item-icon{display: flex;width: 24px;height: 24px;align-items: center;justify-content: center;} + +.tox .tox-collection__item-icon svg{fill: currentColor;} + +.tox .tox-collection--toolbar-lg .tox-collection__item-icon{width: 48px;height: 48px;} + +.tox .tox-collection__item[role=menuitemcheckbox]:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display: none;} + +.tox .tox-collection__item-label{display: inline-block;font-size: 14px;font-style: normal;font-weight: 400;line-height: 24px;color: currentColor;text-transform: none;word-break: break-all;flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-collection__item-accessory{display: inline-block;height: 24px;font-size: 14px;line-height: 24px;color: rgba(34,47,62,.7);text-transform: normal;} + +.tox .tox-collection__item-caret{align-items: center;display: flex;min-height: 24px;} + +.tox .tox-collection__item-caret::after{min-height: inherit;font-size: 0;content: '';} + +.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left: 8px;} + +.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item-label:first-child{margin-left: 4px;} + +.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left: 16px;text-align: right;} + +.tox:not([dir=rtl]) .tox-collection__item-caret{margin-left: 16px;} + +.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right: 8px;} + +.tox[dir=rtl] .tox-collection--list .tox-collection__item-label:first-child{margin-right: 4px;} + +.tox[dir=rtl] .tox-collection__item-icon-rtl .tox-collection__item-icon svg{transform: rotateY(180deg);} + +.tox[dir=rtl] .tox-collection__item-accessory{margin-right: 16px;text-align: left;} + +.tox[dir=rtl] .tox-collection__item-caret{margin-right: 16px;transform: rotateY(180deg);} + +.tox .tox-color-picker-container{display: flex;flex-direction: row;height: 225px;margin: 0;} + +.tox .tox-sv-palette{display: flex;height: 100%;box-sizing: border-box;} + +.tox .tox-sv-palette-spectrum{height: 100%;} + +.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width: 225px;} + +.tox .tox-sv-palette-thumb{position: absolute;width: 12px;height: 12px;background: 0 0;border: 1px solid #000;border-radius: 50%;box-sizing: content-box;} + +.tox .tox-sv-palette-inner-thumb{position: absolute;width: 10px;height: 10px;border: 1px solid #fff;border-radius: 50%;} + +.tox .tox-hue-slider{width: 25px;height: 100%;box-sizing: border-box;} + +.tox .tox-hue-slider-spectrum{width: 100%;height: 100%;background: linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);} + +.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width: 20px;} + +.tox .tox-hue-slider-thumb{width: 100%;height: 4px;background: #fff;border: 1px solid #000;box-sizing: content-box;} + +.tox .tox-rgb-form{display: flex;flex-direction: column;justify-content: space-between;} + +.tox .tox-rgb-form div{display: flex;width: inherit;margin-bottom: 5px;align-items: center;justify-content: space-between;} + +.tox .tox-rgb-form input{width: 6em;} + +.tox .tox-rgb-form input.tox-invalid{border: 1px solid red !important;} + +.tox .tox-rgb-form .tox-rgba-preview{margin-bottom: 0;border: 1px solid #000;flex-grow: 2;} + +.tox:not([dir=rtl]) .tox-sv-palette{margin-right: 15px;} + +.tox:not([dir=rtl]) .tox-hue-slider{margin-right: 15px;} + +.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left: -1px;} + +.tox:not([dir=rtl]) .tox-rgb-form label{margin-right: .5em;} + +.tox[dir=rtl] .tox-sv-palette{margin-left: 15px;} + +.tox[dir=rtl] .tox-hue-slider{margin-left: 15px;} + +.tox[dir=rtl] .tox-hue-slider-thumb{margin-right: -1px;} + +.tox[dir=rtl] .tox-rgb-form label{margin-left: .5em;} + +.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin: 2px 0 3px 4px;} + +.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{margin: -4px 0;border: 0;} + +.tox .tox-swatches__row{display: flex;} + +.tox .tox-swatch{width: 30px;height: 30px;transition: transform .15s,box-shadow .15s;} + +.tox .tox-swatch:focus,.tox .tox-swatch:hover{transform: scale(.8);box-shadow: 0 0 0 1px rgba(127,127,127,.3) inset;} + +.tox .tox-swatch--remove{align-items: center;display: flex;justify-content: center;} + +.tox .tox-swatch--remove svg path{stroke: #e74c3c;} + +.tox .tox-swatches__picker-btn{display: flex;width: 30px;height: 30px;padding: 0;cursor: pointer;background-color: transparent;border: 0;outline: 0;align-items: center;justify-content: center;} + +.tox .tox-swatches__picker-btn svg{width: 24px;height: 24px;} + +.tox .tox-swatches__picker-btn:hover{background: #dee0e2;} + +.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left: auto;} + +.tox[dir=rtl] .tox-swatches__picker-btn{margin-right: auto;} + +.tox .tox-comment-thread{position: relative;background: #fff;} + +.tox .tox-comment-thread>:not(:first-child){margin-top: 8px;} + +.tox .tox-comment{position: relative;padding: 8px 8px 16px 8px;background: #fff;border: 1px solid #ccc;border-radius: 3px;box-shadow: 0 4px 8px 0 rgba(34,47,62,.1);} + +.tox .tox-comment__header{display: flex;color: #222f3e;align-items: center;justify-content: space-between;} + +.tox .tox-comment__date{font-size: 12px;color: rgba(34,47,62,.7);} + +.tox .tox-comment__body{position: relative;margin-top: 8px;font-size: 14px;font-style: normal;font-weight: 400;line-height: 1.3;color: #222f3e;text-transform: initial;} + +.tox .tox-comment__body textarea{width: 100%;white-space: normal;resize: none;} + +.tox .tox-comment__expander{padding-top: 8px;} + +.tox .tox-comment__expander p{font-size: 14px;font-style: normal;color: rgba(34,47,62,.7);} + +.tox .tox-comment__body p{margin: 0;} + +.tox .tox-comment__buttonspacing{padding-top: 16px;text-align: center;} + +.tox .tox-comment-thread__overlay::after{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 5;display: flex;background: #fff;content: "";opacity: .9;} + +.tox .tox-comment__reply{display: flex;flex-shrink: 0;flex-wrap: wrap;justify-content: flex-end;margin-top: 8px;} + +.tox .tox-comment__reply>:first-child{width: 100%;margin-bottom: 8px;} + +.tox .tox-comment__edit{display: flex;flex-wrap: wrap;justify-content: flex-end;margin-top: 16px;} + +.tox .tox-comment__gradient::after{position: absolute;bottom: 0;display: block;width: 100%;height: 5em;margin-top: -40px;background: linear-gradient(rgba(255,255,255,0),#fff);content: "";} + +.tox .tox-comment__overlay{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 5;display: flex;text-align: center;background: #fff;opacity: .9;flex-direction: column;flex-grow: 1;} + +.tox .tox-comment__loading-text{position: relative;display: flex;color: #222f3e;align-items: center;flex-direction: column;} + +.tox .tox-comment__loading-text>div{padding-bottom: 16px;} + +.tox .tox-comment__overlaytext{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 10;padding: 1em;font-size: 14px;flex-direction: column;} + +.tox .tox-comment__overlaytext p{color: #222f3e;text-align: center;background-color: #fff;box-shadow: 0 0 8px 8px #fff;} + +.tox .tox-comment__overlaytext div:nth-of-type(2){font-size: .8em;} + +.tox .tox-comment__busy-spinner{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 1103;display: flex;background-color: #fff;align-items: center;justify-content: center;} + +.tox .tox-comment__scroll{display: flex;flex-direction: column;flex-shrink: 1;overflow: auto;} + +.tox .tox-conversations{margin: 8px;} + +.tox:not([dir=rtl]) .tox-comment__edit{margin-left: 8px;} + +.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left: 8px;} + +.tox[dir=rtl] .tox-comment__edit{margin-right: 8px;} + +.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right: 8px;} + +.tox .tox-user{align-items: center;display: flex;} + +.tox .tox-user__avatar svg{fill: rgba(34,47,62,.7);} + +.tox .tox-user__name{font-size: 12px;font-style: normal;font-weight: 700;color: rgba(34,47,62,.7);text-transform: uppercase;} + +.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right: 8px;} + +.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left: 8px;} + +.tox[dir=rtl] .tox-user__avatar svg{margin-left: 8px;} + +.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right: 8px;} + +.tox .tox-dialog-wrap{position: fixed;top: 0;right: 0;bottom: 0;left: 0;z-index: 1100;display: flex;align-items: center;justify-content: center;} + +.tox .tox-dialog-wrap__backdrop{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 1101;background-color: rgba(255,255,255,.75);} + +.tox .tox-dialog{position: relative;z-index: 1102;display: flex;width: 95vw;max-width: 480px;max-height: 100%;overflow: hidden;background-color: #fff;border-color: #ccc;border-style: solid;border-width: 1px;border-radius: 3px;box-shadow: 0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);flex-direction: column;} + +.tox .tox-dialog__header{position: relative;display: flex;padding: 8px 16px 0 16px;margin-bottom: 16px;font-size: 16px;color: #222f3e;background-color: #fff;border-bottom: none;align-items: center;justify-content: space-between;} + +.tox .tox-dialog__header .tox-button{z-index: 1;} + +.tox .tox-dialog__draghandle{position: absolute;top: 0;left: 0;width: 100%;height: 100%;cursor: grab;} + +.tox .tox-dialog__draghandle:active{cursor: grabbing;} + +.tox .tox-dialog__dismiss{margin-left: auto;} + +.tox .tox-dialog__title{margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 20px;font-style: normal;font-weight: 400;line-height: 1.3;text-transform: normal;} + +.tox .tox-dialog__body{display: flex;min-width: 0;padding: 0 16px;font-size: 16px;font-style: normal;font-weight: 400;line-height: 1.3;color: #222f3e;text-align: left;text-transform: normal;flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-dialog__body-nav{align-items: flex-start;display: flex;flex-direction: column;} + +.tox .tox-dialog__body-nav-item{display: inline-block;margin-bottom: 8px;font-size: 14px;line-height: 1.3;color: rgba(34,47,62,.7);text-decoration: none;border-bottom: 2px solid transparent;} + +.tox .tox-dialog__body-nav-item--active{color: #207ab7;border-bottom: 2px solid #207ab7;} + +.tox .tox-dialog__body-content{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;max-height: 650px;overflow: auto;} + +.tox .tox-dialog__body-content>*{margin-top: 16px;margin-bottom: 0;} + +.tox .tox-dialog__body-content>:first-child{margin-top: 0;} + +.tox .tox-dialog__body-content>:last-child{margin-bottom: 0;} + +.tox .tox-dialog__body-content>:only-child{margin-top: 0;margin-bottom: 0;} + +.tox .tox-dialog--width-lg{height: 650px;max-width: 1200px;} + +.tox .tox-dialog--width-md{max-width: 800px;} + +.tox .tox-dialog--width-md .tox-dialog__body-content{overflow: auto;} + +.tox .tox-dialog__body-content--centered{text-align: center;} + +.tox .tox-dialog__body-content--spacious{margin-bottom: 16px;} + +.tox .tox-dialog__footer{display: flex;padding: 8px 16px;margin-top: 16px;background-color: #fff;border-top: 1px solid #ccc;align-items: center;justify-content: space-between;} + +.tox .tox-dialog__busy-spinner{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 1103;display: flex;background-color: rgba(255,255,255,.75);align-items: center;justify-content: center;} + +.tox .tox-dialog__table{width: 100%;border-collapse: collapse;} + +.tox .tox-dialog__table thead th{padding-bottom: 8px;font-weight: 700;} + +.tox .tox-dialog__table tbody tr{border-bottom: 1px solid #ccc;} + +.tox .tox-dialog__table tbody tr:last-child{border-bottom: none;} + +.tox .tox-dialog__table td{padding-top: 8px;padding-bottom: 8px;} + +.tox .tox-dialog__popups{position: absolute;z-index: 1100;width: 100%;} + +.tox .tox-dialog__body-iframe{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;} + +.tox .tox-dialog__body-iframe .tox-navobj{display: flex;flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex: 1;-ms-flex-preferred-size: auto;height: 100%;} + +body.tox-dialog__disable-scroll{overflow: hidden;} + +.tox.tox-platform-ie .tox-dialog-wrap{position: -ms-device-fixed;} + +.tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right: 32px;} + +.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left: 8px;} + +.tox[dir=rtl] .tox-dialog__body{text-align: right;} + +.tox[dir=rtl] .tox-dialog__body-nav{margin-left: 32px;} + +.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right: 8px;} + +.tox .tox-dropzone-container{display: flex;flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-dropzone{display: flex;min-height: 100px;padding: 10px;background: #fff;border: 2px dashed #ccc;box-sizing: border-box;align-items: center;flex-direction: column;flex-grow: 1;justify-content: center;} + +.tox .tox-dropzone p{margin: 0 0 16px 0;color: rgba(34,47,62,.7);} + +.tox .tox-edit-area{position: relative;display: flex;overflow: hidden;border-top: 1px solid #ccc;flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-edit-area__iframe{position: absolute;width: 100%;height: 100%;background-color: #fff;border: 0;box-sizing: border-box;flex: 1;-ms-flex-preferred-size: auto;} + +.tox.tox-inline-edit-area{border: 1px dotted #ccc;} + +.tox .tox-control-wrap{flex: 1;position: relative;} + +.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display: none;} + +.tox .tox-control-wrap svg{display: block;} + +.tox .tox-control-wrap__status-icon-wrap{position: absolute;top: 50%;transform: translateY(-50%);} + +.tox .tox-control-wrap__status-icon-invalid svg{fill: #c00;} + +.tox .tox-control-wrap__status-icon-unknown svg{fill: orange;} + +.tox .tox-control-wrap__status-icon-valid svg{fill: green;} + +.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right: 32px;} + +.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right: 4px;} + +.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left: 32px;} + +.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left: 4px;} + +.tox .tox-autocompleter{max-width: 25em;} + +.tox .tox-autocompleter .tox-menu{max-width: 25em;} + +.tox .tox-color-input{display: flex;} + +.tox .tox-color-input .tox-textfield{display: flex;border-radius: 3px 0 0 3px;} + +.tox .tox-color-input span{display: flex;width: 35px;cursor: pointer;border-color: rgba(34,47,62,.2);border-style: solid;border-width: 1px 1px 1px 0;border-radius: 0 3px 3px 0;box-shadow: none;box-sizing: border-box;} + +.tox .tox-color-input span:focus{border-color: #207ab7;} + +.tox[dir=rtl] .tox-color-input .tox-textfield{border-radius: 0 3px 3px 0;} + +.tox[dir=rtl] .tox-color-input span{border-width: 1px 0 1px 1px;border-radius: 3px 0 0 3px;} + +.tox .tox-label,.tox .tox-toolbar-label{display: block;padding: 0 8px 0 0;font-size: 14px;font-style: normal;font-weight: 400;line-height: 1.3;color: rgba(34,47,62,.7);text-transform: normal;white-space: nowrap;} + +.tox .tox-toolbar-label{padding: 0 8px;} + +.tox[dir=rtl] .tox-label{padding: 0 0 0 8px;} + +.tox .tox-form{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;} + +.tox .tox-form__group{margin-bottom: 4px;box-sizing: border-box;} + +.tox .tox-form__group--error{color: #c00;} + +.tox .tox-form__group--collection{display: flex;} + +.tox .tox-form__grid{display: flex;flex-direction: row;flex-wrap: wrap;justify-content: space-between;} + +.tox .tox-form__grid--2col>.tox-form__group{width: calc(50% - (8px / 2));} + +.tox .tox-form__grid--3col>.tox-form__group{width: calc(100% / 3 - (8px / 2));} + +.tox .tox-form__grid--4col>.tox-form__group{width: calc(25% - (8px / 2));} + +.tox .tox-form__controls-h-stack{align-items: center;display: flex;} + +.tox .tox-form__group--inline{align-items: center;display: flex;} + +.tox .tox-form__group--stretched{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;} + +.tox .tox-form__group--stretched .tox-textarea{flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-form__group--stretched .tox-navobj{display: flex;flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex: 1;-ms-flex-preferred-size: auto;height: 100%;} + +.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left: 4px;} + +.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right: 4px;} + +.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display: none;} + +.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield,.tox:not([dir=rtl]) .tox-selectfield select,.tox[dir=rtl] .tox-selectfield select{width: 100%;padding: 5px 4.75px;margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 16px;line-height: 24px;color: #222f3e;background-color: #fff;border-color: #ccc;border-style: solid;border-width: 1px;border-radius: 3px;outline: 0;box-shadow: none;box-sizing: border-box;resize: none;-webkit-appearance: none;-moz-appearance: none;appearance: none;} + +.tox .tox-selectfield select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{border-color: #207ab7;outline: 0;box-shadow: none;} + +.tox .tox-toolbar-textfield{max-width: 250px;margin-top: 2px;margin-bottom: 3px;border-width: 0;} + +.tox .tox-naked-btn{display: block;padding: 0;margin: 0;color: #207ab7;cursor: pointer;background-color: transparent;border: 0;border-color: transparent;box-shadow: unset;} + +.tox .tox-naked-btn svg{display: block;fill: #222f3e;} + +.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left: 4px;} + +.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right: 4px;} + +.tox .tox-selectfield{position: relative;cursor: pointer;} + +.tox .tox-selectfield select::-ms-expand{display: none;} + +.tox .tox-selectfield svg{position: absolute;top: 50%;pointer-events: none;transform: translateY(-50%);} + +.tox:not([dir=rtl]) .tox-selectfield select{padding-right: 24px;} + +.tox:not([dir=rtl]) .tox-selectfield svg{right: 8px;} + +.tox[dir=rtl] .tox-selectfield select{padding-left: 24px;} + +.tox[dir=rtl] .tox-selectfield svg{left: 8px;} + +.tox .tox-textarea{white-space: pre-wrap;-webkit-appearance: textarea;-moz-appearance: textarea;appearance: textarea;} + +.tox-fullscreen{position: fixed;top: 0;left: 0;width: 100%;height: 100%;padding: 0;margin: 0;overflow: hidden;border: 0;} + +.tox-fullscreen .tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display: none;} + +.tox-fullscreen .tox.tox-tinymce.tox-fullscreen{z-index: 1200;} + +.tox-fullscreen .tox.tox-tinymce-aux{z-index: 1201;} + +.tox .tox-image-tools{width: 100%;} + +.tox .tox-image-tools__toolbar{align-items: center;display: flex;justify-content: center;} + +.tox .tox-image-tools__image{position: relative;width: 100%;height: 380px;overflow: auto;background-color: #666;} + +.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top: 8px;} + +.tox .tox-image-tools__image-bg{background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==);} + +.tox .tox-image-tools__toolbar>.tox-spacer{flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-croprect-block{position: absolute;background: #000;opacity: .5;zoom: 1;} + +.tox .tox-croprect-handle{position: absolute;top: 0;left: 0;width: 20px;height: 20px;border: 2px solid #fff;} + +.tox .tox-croprect-handle-move{position: absolute;cursor: move;border: 0;} + +.tox .tox-croprect-handle-nw{top: 100px;left: 100px;margin: -2px 0 0 -2px;cursor: nw-resize;border-width: 2px 0 0 2px;} + +.tox .tox-croprect-handle-ne{top: 100px;left: 200px;margin: -2px 0 0 -20px;cursor: ne-resize;border-width: 2px 2px 0 0;} + +.tox .tox-croprect-handle-sw{top: 200px;left: 100px;margin: -20px 2px 0 -2px;cursor: sw-resize;border-width: 0 0 2px 2px;} + +.tox .tox-croprect-handle-se{top: 200px;left: 200px;margin: -20px 0 0 -20px;cursor: se-resize;border-width: 0 2px 2px 0;} + +.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left: 8px;} + +.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left: 32px;} + +.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left: 32px;} + +.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right: 8px;} + +.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right: 32px;} + +.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right: 32px;} + +.tox .tox-insert-table-picker{display: flex;flex-wrap: wrap;width: 169px;} + +.tox .tox-insert-table-picker>div{width: 16px;height: 16px;border-color: #ccc;border-style: solid;border-width: 0 1px 1px 0;box-sizing: content-box;} + +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin: -4px 0;} + +.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color: rgba(32,122,183,.5);border-color: rgba(32,122,183,.5);} + +.tox .tox-insert-table-picker__label{display: block;width: 100%;padding: 4px;font-size: 14px;color: rgba(34,47,62,.7);text-align: center;} + +.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right: 0;} + +.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right: 0;} + +.tox .tox-menu{z-index: 1;display: inline-block;overflow: hidden;vertical-align: top;background-color: #fff;border: 1px solid #ccc;border-radius: 3px;box-shadow: 0 4px 8px 0 rgba(34,47,62,.1);} + +.tox .tox-menu.tox-collection.tox-collection--list{padding: 0;} + +.tox .tox-menu.tox-collection.tox-collection--toolbar{padding: 4px;} + +.tox .tox-menu.tox-collection.tox-collection--grid{padding: 4px;} + +.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin: 0;} + +.tox .tox-menubar{display: flex;padding: 0 4px;margin-bottom: -1px;background: url("data:image/svg+xml;charset=utf8,%3Csvg height='43px' viewBox='0 0 40 43px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='42px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color: #fff;flex: 0 0 auto;flex-shrink: 0;flex-wrap: wrap;} + +.tox .tox-mbtn{display: flex;width: auto;height: 34px;padding: 0 4px;margin: 2px 0 3px 0;overflow: hidden;font-size: 14px;font-style: normal;font-weight: 400;color: #222f3e;text-transform: normal;background: 0 0;border: 0;border-radius: 3px;outline: 0;box-shadow: none;align-items: center;flex: 0 0 auto;justify-content: center;} + +.tox .tox-mbtn[disabled]{color: rgba(34,47,62,.5);cursor: not-allowed;background-color: none;border-color: none;box-shadow: none;} + +.tox .tox-mbtn:hover:not(:disabled){color: #222f3e;background: #dee0e2;box-shadow: none;} + +.tox .tox-mbtn:focus:not(:disabled){color: #222f3e;background: #dee0e2;box-shadow: none;} + +.tox .tox-mbtn--active{color: #222f3e;background: #c8cbcf;box-shadow: none;} + +.tox .tox-mbtn__select-label{margin: 0 4px;font-weight: 400;cursor: default;} + +.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor: not-allowed;} + +.tox .tox-mbtn__select-chevron{display: flex;display: none;width: 16px;align-items: center;justify-content: center;} + +.tox .tox-notification{display: grid;padding: 5px;margin-top: 5px;background-color: #fffaea;border-color: #ffe89d;border-style: solid;border-width: 1px;opacity: 0;box-sizing: border-box;transition: transform .1s ease-in,opacity 150ms ease-in;grid-template-columns: minmax(40px,1fr) auto minmax(40px,1fr);} + +.tox .tox-notification--in{opacity: 1;} + +.tox .tox-notification--success{background-color: #dff0d8;border-color: #d6e9c6;} + +.tox .tox-notification--error{background-color: #f2dede;border-color: #ebccd1;} + +.tox .tox-notification--warn{background-color: #fcf8e3;border-color: #faebcc;} + +.tox .tox-notification--info{background-color: #d9edf7;border-color: #779ecb;} + +.tox .tox-notification__body{font-size: 14px;color: #222f3e;text-align: center;word-break: break-all;word-break: break-word;white-space: normal;align-self: center;grid-column-end: 3;-ms-grid-column-span: 1;grid-column-start: 2;grid-row-end: 2;grid-row-start: 1;} + +.tox .tox-notification__body>*{margin: 0;} + +.tox .tox-notification__body>*+*{margin-top: 1rem;} + +.tox .tox-notification__icon{align-self: center;-ms-grid-column-align: end;grid-column-end: 2;-ms-grid-column-span: 1;grid-column-start: 1;grid-row-end: 2;grid-row-start: 1;justify-self: end;} + +.tox .tox-notification__icon svg{display: block;} + +.tox .tox-notification__dismiss{align-self: start;-ms-grid-column-align: end;grid-column-end: 4;-ms-grid-column-span: 1;grid-column-start: 3;grid-row-end: 2;grid-row-start: 1;justify-self: end;} + +.tox .tox-notification .tox-progress-bar{-ms-grid-column-align: center;grid-column-end: 4;-ms-grid-column-span: 3;grid-column-start: 1;grid-row-end: 3;-ms-grid-row-span: 1;grid-row-start: 2;justify-self: center;} + +.tox .tox-pop{position: relative;display: inline-block;} + +.tox .tox-pop--resizing{transition: width .1s ease;} + +.tox .tox-pop--resizing .tox-toolbar{flex-wrap: nowrap;} + +.tox .tox-pop__dialog{min-width: 0;overflow: hidden;background-color: #fff;border: 1px solid #ccc;border-radius: 3px;box-shadow: 0 1px 3px rgba(0,0,0,.15);} + +.tox .tox-pop__dialog>:not(.tox-toolbar){margin: 4px 4px 4px 8px;} + +.tox .tox-pop__dialog .tox-toolbar{background-color: transparent;} + +.tox .tox-pop::after,.tox .tox-pop::before{position: absolute;display: block;width: 0;height: 0;border-style: solid;content: '';} + +.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{top: 100%;left: 50%;} + +.tox .tox-pop.tox-pop--bottom::after{margin-top: -1px;margin-left: -8px;border-color: #fff transparent transparent transparent;border-width: 8px;} + +.tox .tox-pop.tox-pop--bottom::before{margin-left: -9px;border-color: #ccc transparent transparent transparent;border-width: 9px;} + +.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{top: 0;left: 50%;transform: translateY(-100%);} + +.tox .tox-pop.tox-pop--top::after{margin-top: 1px;margin-left: -8px;border-color: transparent transparent #fff transparent;border-width: 8px;} + +.tox .tox-pop.tox-pop--top::before{margin-left: -9px;border-color: transparent transparent #ccc transparent;border-width: 9px;} + +.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{top: calc(50% - 1px);left: 0;transform: translateY(-50%);} + +.tox .tox-pop.tox-pop--left::after{margin-left: -15px;border-color: transparent #fff transparent transparent;border-width: 8px;} + +.tox .tox-pop.tox-pop--left::before{margin-left: -19px;border-color: transparent #ccc transparent transparent;border-width: 10px;} + +.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{top: calc(50% + 1px);left: 100%;transform: translateY(-50%);} + +.tox .tox-pop.tox-pop--right::after{margin-left: -1px;border-color: transparent transparent transparent #fff;border-width: 8px;} + +.tox .tox-pop.tox-pop--right::before{margin-left: -1px;border-color: transparent transparent transparent #ccc;border-width: 10px;} + +.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left: 20px;} + +.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left: calc(100% - 20px);} + +.tox .tox-sidebar-wrap{display: flex;flex-direction: row;flex-grow: 1;min-height: 0;} + +.tox .tox-sidebar{display: flex;flex-direction: row;justify-content: flex-end;} + +.tox .tox-sidebar__slider{display: flex;overflow: hidden;} + +.tox .tox-sidebar__pane-container{display: flex;} + +.tox .tox-sidebar__pane{display: flex;} + +.tox .tox-sidebar--sliding-closed{opacity: 0;} + +.tox .tox-sidebar--sliding-open{opacity: 1;} + +.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition: width .5s ease,opacity .5s ease;} + +.tox .tox-slider{position: relative;display: flex;height: 24px;align-items: center;flex: 1;-ms-flex-preferred-size: auto;justify-content: center;} + +.tox .tox-slider__rail{width: 100%;height: 10px;min-width: 120px;background-color: transparent;border: 1px solid #ccc;border-radius: 3px;} + +.tox .tox-slider__handle{position: absolute;top: 50%;left: 50%;width: 14px;height: 24px;background-color: #207ab7;border: 2px solid #185d8c;border-radius: 3px;transform: translateX(-50%) translateY(-50%);box-shadow: none;} + +.tox .tox-source-code{overflow: auto;} + +.tox .tox-spinner{display: flex;} + +.tox .tox-spinner>div{width: 8px;height: 8px;background-color: rgba(34,47,62,.7);border-radius: 100%;animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both;} + +.tox .tox-spinner>div:nth-child(1){animation-delay: -.32s;} + +.tox .tox-spinner>div:nth-child(2){animation-delay: -.16s;}@keyframes tam-bouncing-dots{0%,100%,80%{transform: scale(0);} + +40%{transform: scale(1);}} + +.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left: 4px;} + +.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right: 4px;} + +.tox .tox-statusbar{position: relative;display: flex;height: 18px;padding: 0 8px;overflow: hidden;font-size: 12px;color: rgba(34,47,62,.7);text-transform: uppercase;background-color: #fff;border-top: 1px solid #ccc;align-items: center;flex: 0 0 auto;} + +.tox .tox-statusbar a{color: rgba(34,47,62,.7);text-decoration: none;} + +.tox .tox-statusbar a:hover{text-decoration: underline;} + +.tox .tox-statusbar__text-container{display: flex;flex: 1 1 auto;justify-content: flex-end;overflow: hidden;} + +.tox .tox-statusbar__path{display: flex;flex: 1 1 auto;margin-right: auto;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;} + +.tox .tox-statusbar__path>*{display: inline;white-space: nowrap;} + +.tox .tox-statusbar__wordcount{flex: 0 0 auto;margin-left: 1ch;} + +.tox .tox-statusbar__resize-handle{display: flex;padding-left: 1ch;margin-right: -8px;margin-left: auto;cursor: nwse-resize;align-items: flex-end;align-self: stretch;flex: 0 0 auto;justify-content: flex-end;} + +.tox .tox-statusbar__resize-handle svg{display: block;fill: rgba(34,47,62,.7);} + +.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right: 4px;} + +.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left: 1ch;} + +.tox[dir=rtl] .tox-statusbar{flex-direction: row-reverse;} + +.tox[dir=rtl] .tox-statusbar__path>*{margin-left: 4px;} + +.tox .tox-throbber{z-index: 1400;} + +.tox .tox-throbber__busy-spinner{position: absolute;top: 0;right: 0;bottom: 0;left: 0;display: flex;background-color: rgba(255,255,255,.6);align-items: center;justify-content: center;} + +.tox .tox-tbtn{display: flex;width: 34px;height: 34px;padding: 0;margin: 2px 0 3px 0;overflow: hidden;font-size: 14px;font-style: normal;font-weight: 400;color: #222f3e;text-transform: normal;background: 0 0;border: 0;border-radius: 3px;outline: 0;box-shadow: none;align-items: center;flex: 0 0 auto;justify-content: center;} + +.tox .tox-tbtn svg{display: block;fill: #222f3e;} + +.tox .tox-tbtn.tox-tbtn-more{width: inherit;padding-right: 5px;padding-left: 5px;} + +.tox .tox-tbtn--enabled{color: #222f3e;background: #c8cbcf;box-shadow: none;} + +.tox .tox-tbtn--enabled>*{transform: none;} + +.tox .tox-tbtn--enabled svg{fill: #222f3e;} + +.tox .tox-tbtn:hover{color: #222f3e;background: #dee0e2;box-shadow: none;} + +.tox .tox-tbtn:hover svg{fill: #222f3e;} + +.tox .tox-tbtn:focus{color: #222f3e;background: #dee0e2;box-shadow: none;} + +.tox .tox-tbtn:focus svg{fill: #222f3e;} + +.tox .tox-tbtn:active{color: #222f3e;background: #c8cbcf;box-shadow: none;} + +.tox .tox-tbtn:active svg{fill: #222f3e;} + +.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{color: rgba(34,47,62,.5);cursor: not-allowed;background: 0 0;box-shadow: none;} + +.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill: rgba(34,47,62,.5);} + +.tox .tox-tbtn:active>*{transform: none;} + +.tox .tox-tbtn--md{width: 51px;height: 51px;} + +.tox .tox-tbtn--lg{width: 68px;height: 68px;flex-direction: column;} + +.tox .tox-tbtn--return{width: 16px;height: unset;align-self: stretch;} + +.tox .tox-tbtn--labeled{width: unset;padding: 0 4px;} + +.tox .tox-tbtn__vlabel{display: block;margin-bottom: 4px;font-size: 10px;font-weight: 400;letter-spacing: -.025em;white-space: nowrap;} + +.tox .tox-tbtn--select{width: auto;padding: 0 4px;margin: 2px 0 3px 0;} + +.tox .tox-tbtn__select-label{margin: 0 4px;font-weight: 400;cursor: default;} + +.tox .tox-tbtn__select-chevron{align-items: center;display: flex;justify-content: center;width: 16px;} + +.tox .tox-tbtn__select-chevron svg{fill: rgba(34,47,62,.7);} + +.tox .tox-tbtn--bespoke .tox-tbtn__select-label{width: 7em;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;} + +.tox .tox-split-button{display: flex;margin: 2px 0 3px 0;overflow: hidden;border: 0;border-radius: 3px;box-sizing: border-box;} + +.tox .tox-split-button:hover{box-shadow: 0 0 0 1px #dee0e2 inset;} + +.tox .tox-split-button:focus{color: #222f3e;background: #dee0e2;box-shadow: none;} + +.tox .tox-split-button>*{border-radius: 0;} + +.tox .tox-split-button__chevron{width: 16px;} + +.tox .tox-split-button__chevron svg{fill: rgba(34,47,62,.7);} + +.tox .tox-pop .tox-split-button__chevron svg{transform: rotate(-90deg);} + +.tox .tox-split-button .tox-tbtn{margin: 0;} + +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{color: rgba(34,47,62,.5);background: 0 0;box-shadow: none;} + +.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{display: flex;padding: 0 0;margin-bottom: -1px;background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color: #fff;border-top: 1px solid #ccc;flex: 0 0 auto;flex-shrink: 0;flex-wrap: wrap;} + +.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height: 0;opacity: 0;visibility: hidden;} + +.tox .tox-toolbar__overflow--growing{transition: height .3s ease,opacity .2s linear .1s;} + +.tox .tox-toolbar__overflow--shrinking{transition: opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s;} + +.tox .tox-pop .tox-toolbar{border-width: 0;} + +.tox .tox-toolbar--no-divider{background-image: none;} + +.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color: #fff;border: 1px solid #ccc;border-radius: 3px;box-shadow: 0 1px 3px rgba(0,0,0,.15);} + +.tox.tox-tinymce-aux:not([dir=rtl]) .tox-toolbar__overflow{margin-left: 4px;} + +.tox[dir=rtl] .tox-tbtn__icon-rtl svg{transform: rotateY(180deg);} + +.tox[dir=rtl].tox-tinymce-aux .tox-toolbar__overflow{margin-right: 4px;} + +.tox .tox-toolbar__group{display: flex;padding: 0 4px;margin: 0 0;align-items: center;flex-wrap: wrap;} + +.tox .tox-toolbar__group--pull-right{margin-left: auto;} + +.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right: 1px solid #ccc;} + +.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left: 1px solid #ccc;} + +.tox .tox-tooltip{position: relative;display: inline-block;padding: 8px;} + +.tox .tox-tooltip__body{padding: 4px 8px;font-size: 14px;font-style: normal;font-weight: 400;color: rgba(255,255,255,.75);text-transform: normal;background-color: #222f3e;border-radius: 3px;box-shadow: 0 2px 4px rgba(34,47,62,.3);} + +.tox .tox-tooltip__arrow{position: absolute;} + +.tox .tox-tooltip--down .tox-tooltip__arrow{position: absolute;bottom: 0;left: 50%;border-top: 8px solid #222f3e;border-right: 8px solid transparent;border-left: 8px solid transparent;transform: translateX(-50%);} + +.tox .tox-tooltip--up .tox-tooltip__arrow{position: absolute;top: 0;left: 50%;border-right: 8px solid transparent;border-bottom: 8px solid #222f3e;border-left: 8px solid transparent;transform: translateX(-50%);} + +.tox .tox-tooltip--right .tox-tooltip__arrow{position: absolute;top: 50%;right: 0;border-top: 8px solid transparent;border-bottom: 8px solid transparent;border-left: 8px solid #222f3e;transform: translateY(-50%);} + +.tox .tox-tooltip--left .tox-tooltip__arrow{position: absolute;top: 50%;left: 0;border-top: 8px solid transparent;border-right: 8px solid #222f3e;border-bottom: 8px solid transparent;transform: translateY(-50%);} + +.tox .tox-well{width: 100%;padding: 8px;border: 1px solid #ccc;border-radius: 3px;} + +.tox .tox-well>:first-child{margin-top: 0;} + +.tox .tox-well>:last-child{margin-bottom: 0;} + +.tox .tox-well>:only-child{margin: 0;} + +.tox .tox-custom-editor{display: flex;height: 525px;border: 1px solid #ccc;border-radius: 3px;} + +.tox .tox-dialog-loading::before{position: absolute;z-index: 1000;width: 100%;height: 100%;background-color: rgba(0,0,0,.5);content: "";} + +.tox .tox-tab{cursor: pointer;} + +.tox .tox-dialog__content-js{display: flex;flex: 1;-ms-flex-preferred-size: auto;} + +.tox .tox-dialog__body-content .tox-collection{display: flex;flex: 1;-ms-flex-preferred-size: auto;} + +.tox ul{display: block;list-style-type: disc;-webkit-margin-before: 1em;margin-block-start: 1em;-webkit-margin-after: 1em;margin-block-end: 1em;-webkit-margin-start: 0;margin-inline-start: 0;-webkit-margin-end: 0;margin-inline-end: 0;-webkit-padding-start: 40px;padding-inline-start: 40px;} + +.tox a{color: #2276d2;cursor: pointer;} + +.tox .tox-image-tools-edit-panel{height: 60px;} + +.tox .tox-image-tools__sidebar{height: 60px;} diff --git a/public/resource/tinymce/skins/ui/oxide/skin.mobile.min.css b/public/resource/tinymce/skins/ui/oxide/skin.mobile.min.css new file mode 100644 index 0000000..14847d0 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide/skin.mobile.min.css @@ -0,0 +1,239 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-outer-container{all: initial;display: block;} + +.tinymce-mobile-outer-container *{float: none;padding: 0;margin: 0;line-height: 1;text-shadow: none;white-space: nowrap;cursor: inherit;border: 0;outline: 0;box-sizing: initial;-webkit-tap-highlight-color: transparent;} + +.tinymce-mobile-icon-arrow-back::before{content: "\e5cd";} + +.tinymce-mobile-icon-image::before{content: "\e412";} + +.tinymce-mobile-icon-cancel-circle::before{content: "\e5c9";} + +.tinymce-mobile-icon-full-dot::before{content: "\e061";} + +.tinymce-mobile-icon-align-center::before{content: "\e234";} + +.tinymce-mobile-icon-align-left::before{content: "\e236";} + +.tinymce-mobile-icon-align-right::before{content: "\e237";} + +.tinymce-mobile-icon-bold::before{content: "\e238";} + +.tinymce-mobile-icon-italic::before{content: "\e23f";} + +.tinymce-mobile-icon-unordered-list::before{content: "\e241";} + +.tinymce-mobile-icon-ordered-list::before{content: "\e242";} + +.tinymce-mobile-icon-font-size::before{content: "\e245";} + +.tinymce-mobile-icon-underline::before{content: "\e249";} + +.tinymce-mobile-icon-link::before{content: "\e157";} + +.tinymce-mobile-icon-unlink::before{content: "\eca2";} + +.tinymce-mobile-icon-color::before{content: "\e891";} + +.tinymce-mobile-icon-previous::before{content: "\e314";} + +.tinymce-mobile-icon-next::before{content: "\e315";} + +.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content: "\e264";} + +.tinymce-mobile-icon-undo::before{content: "\e166";} + +.tinymce-mobile-icon-redo::before{content: "\e15a";} + +.tinymce-mobile-icon-removeformat::before{content: "\e239";} + +.tinymce-mobile-icon-small-font::before{content: "\e906";} + +.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content: "\e5ca";} + +.tinymce-mobile-icon-small-heading::before{content: "small";} + +.tinymce-mobile-icon-large-heading::before{content: "large";} + +.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family: sans-serif;font-size: 80%;} + +.tinymce-mobile-mask-edit-icon::before{content: "\e254";} + +.tinymce-mobile-icon-back::before{content: "\e5c4";} + +.tinymce-mobile-icon-heading::before{font-family: sans-serif;font-size: 80%;font-weight: 700;content: "Headings";} + +.tinymce-mobile-icon-h1::before{font-weight: 700;content: "H1";} + +.tinymce-mobile-icon-h2::before{font-weight: 700;content: "H2";} + +.tinymce-mobile-icon-h3::before{font-weight: 700;content: "H3";} + +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{position: absolute;top: 0;display: flex;width: 100%;height: 100%;background: rgba(51,51,51,.5);align-items: center;justify-content: center;} + +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{display: flex;font-family: sans-serif;font-size: 1em;border-radius: 50%;align-items: center;flex-direction: column;justify-content: space-between;} + +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{display: flex;width: 2.1em;height: 2.1em;border-radius: 50%;align-items: center;justify-content: center;} + +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items: center;display: flex;justify-content: center;flex-direction: column;font-size: 1em;}@media only screen and (min-device-width: 700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size: 1.2em;}} + +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{display: flex;width: 2.1em;height: 2.1em;color: #207ab7;background-color: #fff;border-radius: 50%;align-items: center;justify-content: center;} + +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{font-family: tinymce-mobile,sans-serif;content: "\e900";} + +.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index: 2;} + +.tinymce-mobile-android-container.tinymce-mobile-android-maximized{position: fixed;top: 0;right: 0;bottom: 0;left: 0;display: flex;background: #fff;border: none;flex-direction: column;} + +.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position: relative;} + +.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display: flex;flex-grow: 1;} + +.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display: flex !important;flex-grow: 1;height: auto !important;} + +.tinymce-mobile-android-scroll-reload{overflow: hidden;} + +:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top: 23px;} + +.tinymce-mobile-toolstrip{z-index: 1;display: flex;background: #fff;flex: 0 0 auto;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{display: flex;width: 100%;height: 2.5em;background-color: #fff;border-bottom: 1px solid #ccc;align-items: center;flex: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items: center;display: flex;height: 100%;flex-shrink: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items: center;display: flex;height: 100%;flex: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background: #f44336;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-right: .5em;padding-left: .5em;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{display: flex;height: 80%;margin-right: 2px;margin-left: 2px;align-items: center;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{color: #ccc;background: #c8cbcf;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{color: #eceff1;background: #207ab7;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{display: flex;height: 100%;padding-top: .4em;padding-bottom: .4em;align-items: center;flex: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{position: relative;display: flex;width: 100%;min-height: 1.5em;padding-right: 0;padding-left: 0;overflow: hidden;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display: flex;width: 100%;height: 100%;transition: left cubic-bezier(.4,0,1,1) .15s;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display: flex;flex: 0 0 auto;justify-content: space-between;width: 100%;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family: sans-serif;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{position: relative;display: flex;flex-grow: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{position: absolute;right: 0;height: 100%;padding-right: 2px;font-size: .6em;font-weight: 700;color: #888;background: inherit;border: none;border-radius: 50%;align-self: center;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display: none;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous{align-items: center;display: flex;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before{display: flex;height: 100%;padding-right: .5em;padding-left: .5em;font-weight: 700;align-items: center;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before{visibility: hidden;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{padding-top: 3px;margin: 0 2px;font-size: 10px;line-height: 10px;color: #ccc;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color: #c8cbcf;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-right: .9em;margin-left: .5em;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-right: .5em;margin-left: .9em;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{position: relative;display: flex;padding: .28em 0;margin-right: 0;margin-left: 0;flex: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items: center;display: flex;flex-grow: 1;height: 100%;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{display: flex;height: .2em;margin-top: .3em;margin-bottom: .3em;background: #ccc;flex: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-right: 2em;padding-left: 2em;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items: center;display: flex;flex-grow: 1;height: 100%;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{display: flex;height: .2em;margin-top: .3em;margin-bottom: .3em;background: linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);flex: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{width: 1.2em;height: .2em;margin-top: .3em;margin-bottom: .3em;background: #000;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{width: 1.2em;height: .2em;margin-top: .3em;margin-bottom: .3em;background: #fff;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{position: absolute;top: 0;bottom: 0;left: -10px;display: flex;width: .5em;height: .5em;margin: auto;color: #fff;background-color: #455a64;border: .5em solid rgba(136,136,136,0);border-radius: 3em;transition: border 120ms cubic-bezier(.39,.58,.57,1);background-clip: padding-box;align-items: center;justify-content: center;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border: .5em solid rgba(136,136,136,.39);} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items: center;display: flex;height: 100%;flex: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction: column;justify-content: center;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items: center;display: flex;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height: 100%;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display: flex;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{padding-top: .1em;padding-bottom: .1em;padding-left: 5px;font-size: .85em;color: #455a64;background: #fff;border: none;border-radius: 0;flex-grow: 1;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color: #888;} + +.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color: #888;} + +.tinymce-mobile-dropup{display: flex;width: 100%;overflow: hidden;background: #fff;} + +.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition: height .3s ease-out;} + +.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition: height .3s ease-in;} + +.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow: 0;} + +.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow: 1;} + +.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height: 200px;}@media only screen and (orientation: landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height: 200px;}}@media only screen and (min-device-width: 320px) and (max-device-width: 568px) and (orientation: landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height: 150px;}} + +.tinymce-mobile-styles-menu{position: relative;width: 100%;overflow: hidden;font-family: sans-serif;outline: 4px solid #000;} + +.tinymce-mobile-styles-menu [role=menu]{position: absolute;display: flex;width: 100%;height: 100%;flex-direction: column;} + +.tinymce-mobile-styles-menu [role=menu].transitioning{transition: transform .5s ease-in-out;} + +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{position: relative;display: flex;padding: 1em 1em;color: #455a64;cursor: pointer;border-bottom: 1px solid #ddd;} + +.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{font-family: tinymce-mobile,sans-serif;color: #455a64;content: "\e314";} + +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{position: absolute;right: 0;padding-right: 1em;padding-left: 1em;font-family: tinymce-mobile,sans-serif;color: #455a64;content: "\e315";} + +.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{position: absolute;right: 0;padding-right: 1em;padding-left: 1em;font-family: tinymce-mobile,sans-serif;} + +.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{display: flex;min-height: 2.5em;padding-right: 1em;padding-left: 1em;color: #455a64;background: #fff;border-top: #455a64;align-items: center;} + +.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform: translate(-100%);} + +.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform: translate(0);} + +.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform: translate(100%);}@font-face{font-family: tinymce-mobile;font-style: normal;font-weight: 400;src: url(fonts/tinymce-mobile.woff?8x92w3) format('woff');}@media (min-device-width: 700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size: 25px;}}@media (max-device-width: 700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size: 18px;}} + +.tinymce-mobile-icon{font-family: tinymce-mobile,sans-serif;} + +.mixin-flex-and-centre{align-items: center;display: flex;justify-content: center;} + +.mixin-flex-bar{align-items: center;display: flex;height: 100%;} + +.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{width: 100%;background-color: #fff;} + +.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{position: fixed;right: 2em;bottom: 1em;display: flex;width: 2.1em;height: 2.1em;font-size: 1em;color: #fff;background-color: #207ab7;border-radius: 50%;align-items: center;justify-content: center;}@media only screen and (min-device-width: 700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size: 1.2em;}} + +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height: 300px;overflow: hidden;} + +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height: 100%;} + +.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display: none;} + +input[type=file]::-webkit-file-upload-button{display: none;}@media only screen and (min-device-width: 320px) and (max-device-width: 568px) and (orientation: landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom: 50%;}} diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..7cb7cca --- /dev/null +++ b/src/App.vue @@ -0,0 +1,21 @@ + + + diff --git a/src/api/common/api.ts b/src/api/common/api.ts new file mode 100644 index 0000000..47d5cfb --- /dev/null +++ b/src/api/common/api.ts @@ -0,0 +1,150 @@ +import { defHttp } from '/@/utils/http/axios'; +import { message } from 'ant-design-vue'; +import { useGlobSetting } from '/@/hooks/setting'; +const globSetting = useGlobSetting(); +const baseUploadUrl = globSetting.uploadUrl; +enum Api { + positionList = '/sys/position/list', + userList = '/sys/user/list', + roleList = '/sys/role/list', + queryDepartTreeSync = '/sys/sysDepart/queryDepartTreeSync', + queryTreeList = '/sys/sysDepart/queryTreeList', + loadTreeData = '/sys/category/loadTreeData', + loadDictItem = '/sys/category/loadDictItem/', + getDictItems = '/sys/dict/getDictItems/', + getTableList = '/sys/user/queryUserComponentData', + getCategoryData = '/sys/category/loadAllData', +} + +/** + * 上传父路径 + */ +export const uploadUrl = `${baseUploadUrl}/sys/common/upload`; + +/** + * 职务列表 + * @param params + */ +export const getPositionList = (params) => { + return defHttp.get({ url: Api.positionList, params }); +}; + +/** + * 用户列表 + * @param params + */ +export const getUserList = (params) => { + return defHttp.get({ url: Api.userList, params }); +}; + +/** + * 角色列表 + * @param params + */ +export const getRoleList = (params) => { + return defHttp.get({ url: Api.roleList, params }); +}; + +/** + * 异步获取部门树列表 + */ +export const queryDepartTreeSync = (params?) => { + return defHttp.get({ url: Api.queryDepartTreeSync, params }); +}; +/** + * 获取部门树列表 + */ +export const queryTreeList = (params?) => { + return defHttp.get({ url: Api.queryTreeList, params }); +}; + +/** + * 分类字典树控件 加载节点 + */ +export const loadTreeData = (params?) => { + return defHttp.get({ url: Api.loadTreeData, params }); +}; + +/** + * 根据字典code加载字典text + */ +export const loadDictItem = (params?) => { + return defHttp.get({ url: Api.loadDictItem, params }); +}; + +/** + * 根据字典code加载字典text + */ +export const getDictItems = (dictCode) => { + return defHttp.get({ url: Api.getDictItems + dictCode }, { joinTime: false }); +}; +/** + * 部门用户modal选择列表加载list + */ +export const getTableList = (params) => { + return defHttp.get({ url: Api.getTableList, params }); +}; +/** + * 加载全部分类字典数据 + */ +export const loadCategoryData = (params) => { + return defHttp.get({ url: Api.getCategoryData, params }); +}; +/** + * 文件上传 + */ +export const uploadFile = (params, success) => { + return defHttp.uploadFile({ url: uploadUrl }, params, { success }); +}; +/** + * 下载文件 + * @param url 文件路径 + * @param fileName 文件名 + * @param parameter + * @returns {*} + */ +export const downloadFile = (url, fileName?, parameter?) => { + return getFileblob(url, parameter).then((data) => { + if (!data || data.size === 0) { + message.warning('文件下载失败'); + return; + } + if (typeof window.navigator.msSaveBlob !== 'undefined') { + window.navigator.msSaveBlob(new Blob([data]), fileName); + } else { + let url = window.URL.createObjectURL(new Blob([data])); + let link = document.createElement('a'); + link.style.display = 'none'; + link.href = url; + link.setAttribute('download', fileName); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); //下载完成移除元素 + window.URL.revokeObjectURL(url); //释放掉blob对象 + } + }); +}; + +/** + * 下载文件 用于excel导出 + * @param url + * @param parameter + * @returns {*} + */ +export const getFileblob = (url, parameter) => { + return defHttp.get( + { + url: url, + params: parameter, + responseType: 'blob', + }, + { isTransformResponse: false } + ); +}; + +/** + * 【用于评论功能】自定义文件上传-方法 + */ +export const uploadMyFile = (url, data) => { + return defHttp.uploadMyFile(url, data); +}; diff --git a/src/api/demo/account.ts b/src/api/demo/account.ts new file mode 100644 index 0000000..2c3ea06 --- /dev/null +++ b/src/api/demo/account.ts @@ -0,0 +1,16 @@ +import { defHttp } from '/@/utils/http/axios'; +import { GetAccountInfoModel } from './model/accountModel'; + +enum Api { + ACCOUNT_INFO = '/mock/account/getAccountInfo', + SESSION_TIMEOUT = '/mock/user/sessionTimeout', + TOKEN_EXPIRED = '/mock/user/tokenExpired', +} + +// Get personal center-basic settings + +export const accountInfoApi = () => defHttp.get({ url: Api.ACCOUNT_INFO }); + +export const sessionTimeoutApi = () => defHttp.post({ url: Api.SESSION_TIMEOUT }); + +export const tokenExpiredApi = () => defHttp.post({ url: Api.TOKEN_EXPIRED }); diff --git a/src/api/demo/error.ts b/src/api/demo/error.ts new file mode 100644 index 0000000..3ce6072 --- /dev/null +++ b/src/api/demo/error.ts @@ -0,0 +1,12 @@ +import { defHttp } from '/@/utils/http/axios'; + +enum Api { + // The address does not exist + Error = '/error', +} + +/** + * @description: Trigger ajax error + */ + +export const fireErrorApi = () => defHttp.get({ url: Api.Error }); diff --git a/src/api/demo/model/accountModel.ts b/src/api/demo/model/accountModel.ts new file mode 100644 index 0000000..4594393 --- /dev/null +++ b/src/api/demo/model/accountModel.ts @@ -0,0 +1,7 @@ +export interface GetAccountInfoModel { + email: string; + name: string; + introduction: string; + phone: string; + address: string; +} diff --git a/src/api/demo/model/optionsModel.ts b/src/api/demo/model/optionsModel.ts new file mode 100644 index 0000000..c15ef8f --- /dev/null +++ b/src/api/demo/model/optionsModel.ts @@ -0,0 +1,15 @@ +import { BasicFetchResult } from '/@/api/model/baseModel'; + +export interface DemoOptionsItem { + label: string; + value: string; +} + +export interface selectParams { + id: number | string; +} + +/** + * @description: Request list return value + */ +export type DemoOptionsGetResultModel = BasicFetchResult; diff --git a/src/api/demo/model/systemModel.ts b/src/api/demo/model/systemModel.ts new file mode 100644 index 0000000..72904de --- /dev/null +++ b/src/api/demo/model/systemModel.ts @@ -0,0 +1,103 @@ +import { BasicPageParams, BasicFetchResult } from '/@/api/model/baseModel'; + +export type AccountParams = BasicPageParams & { + account?: string; + nickname?: string; +}; + +export type RoleParams = { + roleName?: string; + status?: string; +}; + +export type TestParams = { + testName?: string; +}; + +export type RolePageParams = BasicPageParams & RoleParams; + +export type TestPageParams = BasicPageParams & TestParams; + +export type UserPageParams = BasicPageParams & UserParams; + +export type DeptParams = { + deptName?: string; + status?: string; +}; + +export type UserParams = { + username?: string; +}; + +export type MenuParams = { + menuName?: string; + status?: string; +}; + +export interface AccountListItem { + id: string; + account: string; + email: string; + nickname: string; + role: number; + createTime: string; + remark: string; + status: number; +} + +export interface DeptListItem { + id: string; + orderNo: string; + createTime: string; + remark: string; + status: number; +} + +export interface MenuListItem { + id: string; + orderNo: string; + createTime: string; + status: number; + icon: string; + component: string; + permission: string; +} + +export interface RoleListItem { + id: string; + roleName: string; + roleValue: string; + status: number; + orderNo: string; + createTime: string; +} +export interface TestListItem { + id: string; + testName: string; + testValue: string; + createTime: string; +} + +export interface UserListItem { + id: string; + username: string; + password: string; + realname: string; +} + +/** + * @description: Request list return value + */ +export type AccountListGetResultModel = BasicFetchResult; + +export type DeptListGetResultModel = BasicFetchResult; + +export type MenuListGetResultModel = BasicFetchResult; + +export type RolePageListGetResultModel = BasicFetchResult; + +export type RoleListGetResultModel = RoleListItem[]; + +export type TestListGetResultModel = TestListItem[]; + +export type UserListGetResultModel = UserListItem[]; diff --git a/src/api/demo/model/tableModel.ts b/src/api/demo/model/tableModel.ts new file mode 100644 index 0000000..322a8b4 --- /dev/null +++ b/src/api/demo/model/tableModel.ts @@ -0,0 +1,20 @@ +import { BasicPageParams, BasicFetchResult } from '/@/api/model/baseModel'; +/** + * @description: Request list interface parameters + */ +export type DemoParams = BasicPageParams; + +export interface DemoListItem { + id: string; + beginTime: string; + endTime: string; + address: string; + name: string; + no: number; + status: number; +} + +/** + * @description: Request list return value + */ +export type DemoListGetResultModel = BasicFetchResult; diff --git a/src/api/demo/select.ts b/src/api/demo/select.ts new file mode 100644 index 0000000..9fb5cae --- /dev/null +++ b/src/api/demo/select.ts @@ -0,0 +1,10 @@ +import { defHttp } from '/@/utils/http/axios'; +import { DemoOptionsItem, selectParams } from './model/optionsModel'; +enum Api { + OPTIONS_LIST = '/mock/select/getDemoOptions', +} + +/** + * @description: Get sample options value + */ +export const optionsListApi = (params?: selectParams) => defHttp.get({ url: Api.OPTIONS_LIST, params }); diff --git a/src/api/demo/system.ts b/src/api/demo/system.ts new file mode 100644 index 0000000..01c1fd5 --- /dev/null +++ b/src/api/demo/system.ts @@ -0,0 +1,45 @@ +import { + AccountParams, + DeptListItem, + MenuParams, + RoleParams, + TestPageParams, + RolePageParams, + MenuListGetResultModel, + DeptListGetResultModel, + AccountListGetResultModel, + RolePageListGetResultModel, + RoleListGetResultModel, + TestListGetResultModel, +} from './model/systemModel'; +import { defHttp } from '/@/utils/http/axios'; + +enum Api { + AccountList = '/mock/system/getAccountList', + IsAccountExist = '/mock/system/accountExist', + DeptList = '/mock/system/getDeptList', + setRoleStatus = '/mock/system/setRoleStatus', + MenuList = '/mock/system/getMenuList', + RolePageList = '/mock/system/getRoleListByPage', + DemoTableList = '/mock/system/getDemoTableListByPage', + TestPageList = '/mock/system/getTestListByPage', + GetAllRoleList = '/mock/system/getAllRoleList', +} + +export const getAccountList = (params: AccountParams) => defHttp.get({ url: Api.AccountList, params }); + +export const getDeptList = (params?: DeptListItem) => defHttp.get({ url: Api.DeptList, params }); + +export const getMenuList = (params?: MenuParams) => defHttp.get({ url: Api.MenuList, params }); + +export const getRoleListByPage = (params?: RolePageParams) => defHttp.get({ url: Api.RolePageList, params }); + +export const getAllRoleList = (params?: RoleParams) => defHttp.get({ url: Api.GetAllRoleList, params }); + +export const setRoleStatus = (id: number, status: string) => defHttp.post({ url: Api.setRoleStatus, params: { id, status } }); + +export const getTestListByPage = (params?: TestPageParams) => defHttp.get({ url: Api.TestPageList, params }); + +export const getDemoTableListByPage = (params) => defHttp.get({ url: Api.DemoTableList, params }); + +export const isAccountExist = (account: string) => defHttp.post({ url: Api.IsAccountExist, params: { account } }, { errorMessageMode: 'none' }); diff --git a/src/api/demo/table.ts b/src/api/demo/table.ts new file mode 100644 index 0000000..41ada55 --- /dev/null +++ b/src/api/demo/table.ts @@ -0,0 +1,19 @@ +import { defHttp } from '/@/utils/http/axios'; +import { DemoParams, DemoListGetResultModel } from './model/tableModel'; + +enum Api { + DEMO_LIST = '/mock/table/getDemoList', +} + +/** + * @description: Get sample list value + */ + +export const demoListApi = (params: DemoParams) => + defHttp.get({ + url: Api.DEMO_LIST, + params, + headers: { + ignoreCancelToken: true, + }, + }); diff --git a/src/api/demo/tree.ts b/src/api/demo/tree.ts new file mode 100644 index 0000000..8fe3acf --- /dev/null +++ b/src/api/demo/tree.ts @@ -0,0 +1,10 @@ +import { defHttp } from '/@/utils/http/axios'; + +enum Api { + TREE_OPTIONS_LIST = '/mock/tree/getDemoOptions', +} + +/** + * @description: Get sample options value + */ +export const treeOptionsListApi = (params?: Recordable) => defHttp.get({ url: Api.TREE_OPTIONS_LIST, params }); diff --git a/src/api/model/baseModel.ts b/src/api/model/baseModel.ts new file mode 100644 index 0000000..7a4d797 --- /dev/null +++ b/src/api/model/baseModel.ts @@ -0,0 +1,14 @@ +export interface BasicPageParams { + page: number; + pageSize: number; +} + +export interface BasicFetchResult { + items: T[]; + total: number; +} + +export interface BasicResult { + records: T[]; + total: number; +} diff --git a/src/api/sys/menu.ts b/src/api/sys/menu.ts new file mode 100644 index 0000000..ea873df --- /dev/null +++ b/src/api/sys/menu.ts @@ -0,0 +1,33 @@ +import { defHttp } from '/@/utils/http/axios'; +import { getMenuListResultModel } from './model/menuModel'; + +enum Api { + GetMenuList = '/sys/permission/getUserPermissionByToken', + SwitchVue3Menu = '/sys/switchVue3Menu', +} + +/** + * @description: Get user menu based on id + */ + +export const getMenuList = () => { + return new Promise((resolve) => { + //为了兼容mock和接口数据 + defHttp.get({ url: Api.GetMenuList }).then((res) => { + if (Array.isArray(res)) { + resolve(res); + } else { + resolve(res['menu']); + } + }); + }); +}; + +/** + * 切换成vue3菜单 + */ +export const switchVue3Menu = () => { + return new Promise((resolve) => { + defHttp.get({ url: Api.SwitchVue3Menu }); + }); +}; diff --git a/src/api/sys/model/menuModel.ts b/src/api/sys/model/menuModel.ts new file mode 100644 index 0000000..8d19eea --- /dev/null +++ b/src/api/sys/model/menuModel.ts @@ -0,0 +1,16 @@ +import type { RouteMeta } from 'vue-router'; +export interface RouteItem { + path: string; + component: any; + meta: RouteMeta; + name?: string; + alias?: string | string[]; + redirect?: string; + caseSensitive?: boolean; + children?: RouteItem[]; +} + +/** + * @description: Get menu return value + */ +export type getMenuListResultModel = RouteItem[]; diff --git a/src/api/sys/model/uploadModel.ts b/src/api/sys/model/uploadModel.ts new file mode 100644 index 0000000..d770c64 --- /dev/null +++ b/src/api/sys/model/uploadModel.ts @@ -0,0 +1,5 @@ +export interface UploadApiResult { + message: string; + code: number; + url: string; +} diff --git a/src/api/sys/model/userModel.ts b/src/api/sys/model/userModel.ts new file mode 100644 index 0000000..f1d9be7 --- /dev/null +++ b/src/api/sys/model/userModel.ts @@ -0,0 +1,58 @@ +/** + * @description: Login interface parameters + */ +export interface LoginParams { + username: string; + password: string; +} + +export interface ThirdLoginParams { + token: string; + thirdType: string; +} + +export interface RoleInfo { + roleName: string; + value: string; +} + +/** + * @description: Login interface return value + */ +export interface LoginResultModel { + userId: string | number; + token: string; + role: RoleInfo; + userInfo?: any +} + +/** + * @description: Get user information return value + */ +export interface GetUserInfoModel { + roles: RoleInfo[]; + // 用户id + userId: string | number; + // 用户名 + username: string; + // 真实名字 + realname: string; + // 头像 + avatar: string; + // 介绍 + desc?: string; + // 用户信息 + userInfo?: any; + // 缓存字典项 + sysAllDictItems?: any; +} + +/** + * @description: Get user information return value + */ +export interface GetResultModel { + code: number; + message: string; + result: object; + success: Boolean; +} diff --git a/src/api/sys/upload.ts b/src/api/sys/upload.ts new file mode 100644 index 0000000..1a83e93 --- /dev/null +++ b/src/api/sys/upload.ts @@ -0,0 +1,32 @@ +import { UploadApiResult } from './model/uploadModel'; +import { defHttp } from '/@/utils/http/axios'; +import { UploadFileParams } from '/#/axios'; +import { useGlobSetting } from '/@/hooks/setting'; + +const { uploadUrl = '' } = useGlobSetting(); + +/** + * @description: Upload interface + */ +export function uploadApi(params: UploadFileParams, onUploadProgress: (progressEvent: ProgressEvent) => void) { + return defHttp.uploadFile( + { + url: uploadUrl, + onUploadProgress, + }, + params + ); +} +/** + * @description: Upload interface + */ +export function uploadImg(params: UploadFileParams, onUploadProgress: (progressEvent: ProgressEvent) => void) { + return defHttp.uploadFile( + { + url: `${uploadUrl}/sys/common/upload`, + onUploadProgress, + }, + params, + { isReturnResponse: true } + ); +} diff --git a/src/api/sys/user.ts b/src/api/sys/user.ts new file mode 100644 index 0000000..253c4a2 --- /dev/null +++ b/src/api/sys/user.ts @@ -0,0 +1,197 @@ +import { defHttp } from '/@/utils/http/axios'; +import { LoginParams, LoginResultModel, GetUserInfoModel } from './model/userModel'; + +import { ErrorMessageMode } from '/#/axios'; +import { useMessage } from '/@/hooks/web/useMessage'; +import { useUserStoreWithOut } from '/@/store/modules/user'; +import { setAuthCache } from '/@/utils/auth'; +import { TOKEN_KEY } from '/@/enums/cacheEnum'; +import { router } from '/@/router'; +import { PageEnum } from '/@/enums/pageEnum'; + +const { createErrorModal } = useMessage(); +enum Api { + Login = '/sys/login', + phoneLogin = '/sys/phoneLogin', + Logout = '/sys/logout', + GetUserInfo = '/sys/user/getUserInfo', + // 获取系统权限 + // 1、查询用户拥有的按钮/表单访问权限 + // 2、所有权限 + // 3、系统安全模式 + GetPermCode = '/sys/permission/getPermCode', + //新加的获取图形验证码的接口 + getInputCode = '/sys/randomImage', + //获取短信验证码的接口 + getCaptcha = '/sys/sms', + //注册接口 + registerApi = '/sys/user/register', + //校验用户接口 + checkOnlyUser = '/sys/user/checkOnlyUser', + //SSO登录校验 + validateCasLogin = '/sys/cas/client/validateLogin', + //校验手机号 + phoneVerify = '/sys/user/phoneVerification', + //修改密码 + passwordChange = '/sys/user/passwordChange', + //第三方登录 + thirdLogin = '/sys/thirdLogin/getLoginUser', + //第三方登录 + getThirdCaptcha = '/sys/thirdSms', + //获取二维码信息 + getLoginQrcode = '/sys/getLoginQrcode', + //监控二维码扫描状态 + getQrcodeToken = '/sys/getQrcodeToken', +} + +/** + * @description: user login api + */ +export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal') { + return defHttp.post( + { + url: Api.Login, + params, + }, + { + errorMessageMode: mode, + } + ); +} + +/** + * @description: user phoneLogin api + */ +export function phoneLoginApi(params: LoginParams, mode: ErrorMessageMode = 'modal') { + return defHttp.post( + { + url: Api.phoneLogin, + params, + }, + { + errorMessageMode: mode, + } + ); +} + +/** + * @description: getUserInfo + */ +export function getUserInfo() { + return defHttp.get({ url: Api.GetUserInfo }, {}).catch((e) => { + // update-begin--author:zyf---date:20220425---for:【VUEN-76】捕获接口超时异常,跳转到登录界面 + if (e && (e.message.includes('timeout') || e.message.includes('401'))) { + //接口不通时跳转到登录界面 + const userStore = useUserStoreWithOut(); + userStore.setToken(''); + setAuthCache(TOKEN_KEY, null); + router.push(PageEnum.BASE_LOGIN); + } + // update-end--author:zyf---date:20220425---for:【VUEN-76】捕获接口超时异常,跳转到登录界面 + }); +} + +export function getPermCode() { + return defHttp.get({ url: Api.GetPermCode }); +} + +export function doLogout() { + return defHttp.get({ url: Api.Logout }); +} + +export function getCodeInfo(currdatetime) { + let url = Api.getInputCode + `/${currdatetime}`; + return defHttp.get({ url: url }); +} +/** + * @description: 获取短信验证码 + */ +export function getCaptcha(params) { + return new Promise((resolve, reject) => { + defHttp.post({ url: Api.getCaptcha, params }, { isTransformResponse: false }).then((res) => { + console.log(res); + if (res.success) { + resolve(true); + } else { + createErrorModal({ title: '错误提示', content: res.message || '未知问题' }); + reject(); + } + }); + }); +} + +/** + * @description: 注册接口 + */ +export function register(params) { + return defHttp.post({ url: Api.registerApi, params }, { isReturnNativeResponse: true }); +} + +/** + *校验用户是否存在 + * @param params + */ +export const checkOnlyUser = (params) => defHttp.get({ url: Api.checkOnlyUser, params }, { isTransformResponse: false }); +/** + *校验手机号码 + * @param params + */ +export const phoneVerify = (params) => defHttp.post({ url: Api.phoneVerify, params }, { isTransformResponse: false }); +/** + *密码修改 + * @param params + */ +export const passwordChange = (params) => defHttp.get({ url: Api.passwordChange, params }, { isTransformResponse: false }); +/** + * @description: 第三方登录 + */ +export function thirdLogin(params, mode: ErrorMessageMode = 'modal') { + return defHttp.get( + { + url: `${Api.thirdLogin}/${params.token}/${params.thirdType}`, + }, + { + errorMessageMode: mode, + } + ); +} +/** + * @description: 获取第三方短信验证码 + */ +export function setThirdCaptcha(params) { + return new Promise((resolve, reject) => { + defHttp.post({ url: Api.getThirdCaptcha, params }, { isTransformResponse: false }).then((res) => { + console.log(res); + if (res.success) { + resolve(true); + } else { + createErrorModal({ title: '错误提示', content: res.message || '未知问题' }); + reject(); + } + }); + }); +} + +/** + * 获取登录二维码信息 + */ +export function getLoginQrcode() { + let url = Api.getLoginQrcode; + return defHttp.get({ url: url }); +} + +/** + * 监控扫码状态 + */ +export function getQrcodeToken(params) { + let url = Api.getQrcodeToken; + return defHttp.get({ url: url, params }); +} + +/** + * SSO登录校验 + */ +export async function validateCasLogin(params) { + let url = Api.validateCasLogin; + return defHttp.get({ url: url, params }); +} diff --git a/src/assets/icons/download-count.svg b/src/assets/icons/download-count.svg new file mode 100644 index 0000000..1c95195 --- /dev/null +++ b/src/assets/icons/download-count.svg @@ -0,0 +1 @@ +Asset 91 \ No newline at end of file diff --git a/src/assets/icons/dynamic-avatar-1.svg b/src/assets/icons/dynamic-avatar-1.svg new file mode 100644 index 0000000..e1553e5 --- /dev/null +++ b/src/assets/icons/dynamic-avatar-1.svg @@ -0,0 +1 @@ +Asset 15 \ No newline at end of file diff --git a/src/assets/icons/dynamic-avatar-2.svg b/src/assets/icons/dynamic-avatar-2.svg new file mode 100644 index 0000000..c4c1722 --- /dev/null +++ b/src/assets/icons/dynamic-avatar-2.svg @@ -0,0 +1 @@ +Asset 16 \ No newline at end of file diff --git a/src/assets/icons/dynamic-avatar-3.svg b/src/assets/icons/dynamic-avatar-3.svg new file mode 100644 index 0000000..81145f9 --- /dev/null +++ b/src/assets/icons/dynamic-avatar-3.svg @@ -0,0 +1 @@ +Asset 17 \ No newline at end of file diff --git a/src/assets/icons/dynamic-avatar-4.svg b/src/assets/icons/dynamic-avatar-4.svg new file mode 100644 index 0000000..e586ed4 --- /dev/null +++ b/src/assets/icons/dynamic-avatar-4.svg @@ -0,0 +1 @@ +Asset 120 \ No newline at end of file diff --git a/src/assets/icons/dynamic-avatar-5.svg b/src/assets/icons/dynamic-avatar-5.svg new file mode 100644 index 0000000..746e4b8 --- /dev/null +++ b/src/assets/icons/dynamic-avatar-5.svg @@ -0,0 +1 @@ +Asset 110 \ No newline at end of file diff --git a/src/assets/icons/dynamic-avatar-6.svg b/src/assets/icons/dynamic-avatar-6.svg new file mode 100644 index 0000000..b2432f2 --- /dev/null +++ b/src/assets/icons/dynamic-avatar-6.svg @@ -0,0 +1 @@ +Asset 100 \ No newline at end of file diff --git a/src/assets/icons/js/iconfont.js b/src/assets/icons/js/iconfont.js new file mode 100644 index 0000000..dead26b --- /dev/null +++ b/src/assets/icons/js/iconfont.js @@ -0,0 +1 @@ +window._iconfont_svg_string_3814468='',function(l){var c=(c=document.getElementsByTagName("script"))[c.length-1],h=c.getAttribute("data-injectcss"),c=c.getAttribute("data-disable-injectsvg");if(!c){var a,t,o,z,i,v=function(c,h){h.parentNode.insertBefore(c,h)};if(h&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}a=function(){var c,h=document.createElement("div");h.innerHTML=l._iconfont_svg_string_3814468,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(c=document.body).firstChild?v(h,c.firstChild):c.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(t=function(){document.removeEventListener("DOMContentLoaded",t,!1),a()},document.addEventListener("DOMContentLoaded",t,!1)):document.attachEvent&&(o=a,z=l.document,i=!1,m(),z.onreadystatechange=function(){"complete"==z.readyState&&(z.onreadystatechange=null,s())})}function s(){i||(i=!0,o())}function m(){try{z.documentElement.doScroll("left")}catch(c){return void setTimeout(m,50)}s()}}(window); \ No newline at end of file diff --git a/src/assets/icons/lock.svg b/src/assets/icons/lock.svg new file mode 100644 index 0000000..c55da4d --- /dev/null +++ b/src/assets/icons/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/moon.svg b/src/assets/icons/moon.svg new file mode 100644 index 0000000..e6667f0 --- /dev/null +++ b/src/assets/icons/moon.svg @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/src/assets/icons/sun.svg b/src/assets/icons/sun.svg new file mode 100644 index 0000000..a3997cb --- /dev/null +++ b/src/assets/icons/sun.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/test.svg b/src/assets/icons/test.svg new file mode 100644 index 0000000..244252d --- /dev/null +++ b/src/assets/icons/test.svg @@ -0,0 +1,21 @@ + + + + Icon1@3x + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/total-sales.svg b/src/assets/icons/total-sales.svg new file mode 100644 index 0000000..eff7964 --- /dev/null +++ b/src/assets/icons/total-sales.svg @@ -0,0 +1 @@ +Asset 500 \ No newline at end of file diff --git a/src/assets/icons/transaction.svg b/src/assets/icons/transaction.svg new file mode 100644 index 0000000..7ba9e2f --- /dev/null +++ b/src/assets/icons/transaction.svg @@ -0,0 +1 @@ +Asset 480% \ No newline at end of file diff --git a/src/assets/icons/visit-count.svg b/src/assets/icons/visit-count.svg new file mode 100644 index 0000000..ba2a306 --- /dev/null +++ b/src/assets/icons/visit-count.svg @@ -0,0 +1 @@ +Asset 510 \ No newline at end of file diff --git a/src/assets/images/checkcode.png b/src/assets/images/checkcode.png new file mode 100644 index 0000000000000000000000000000000000000000..844fa70c56861efed68553088cfa059cd2a3a612 GIT binary patch literal 2236 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 EKedoLDgXcg literal 0 HcmV?d00001 diff --git a/src/assets/images/daiban.png b/src/assets/images/daiban.png new file mode 100644 index 0000000000000000000000000000000000000000..19002c1792705f793a9233b153815758044b8a98 GIT binary patch literal 3632 zcmV-04$tw4P)_{$P zNe1eqsgni>V6^DtOM$fL0}1*>>o#>n(z0b+Qc^pVVpFzEks?KM$t5Z7?P|)toJ#+VuGjqoGP-2)Q99bgRj z7`P662wVl0H}$PoAU2t}y}(z1CxFMQB=cQh5cm#;)J?%=5Z42I1NZ{4qsC)R0B-}{c{X~ zs^Y=fIB~~-zXkRLb<)XE^EW?=PS0&*JYR@dGoqmv8uuZa9xB!S1K>A+pHw{F28jD2 z@ZF#eIx&JuTu0B{05-?%5eP(cAGGX8w)6*ewSi}W?^iTVg~YuE{GMN7I|jVv z`c^xr@xcd@v>b#0)p?xoPS2S+iP>XM`8^*rRU0wRtqc0j+YdBpU}mbEd<$ptJ+J02 z;Gct@4S^c>wsP-?M&G^(e-Q77moWiTdn~2f`4n z2O`#j=zSI$YbkC@0=t3v;s!sBd)@U-CTaY%pE1$^NF`8X|BY5oaZ4_M;er=&U&A9b zq^7Ukx6bWGp#hm3#hLbuI6a5ax&n9+cgiI=dDCp8eukj{F*S@zC%u}#Q~X6SaVPMI z+^X3R?wh@5MGzoDAVLBWWDc`SICne^->(7%k%D3|uKBDJBU>8f*eGOJAj1MX1=&S~ zQVY9XT`mp(eI<@u5aw^w+L2LurQhB|NiRE4r#(kr>r%sNp1R)qL}C#lmCW$*za$Wr_mmZARKjzXSgbSi=;UaX ze#+*-iV7C)WEph~XapSx>U}4Z26SrLgrVHH0IS5g!p3^3rZ)(x4x?!{LlL?C}t1NnPys}@g1+Ze$XxjNPCNItflGbvlo+D>> z60NsTcEI|rH6rP`Q+gbb5|6tbxfAvW0ah$$2yQcZF@c5mf^VZ}Jygf>bGztxB#x6U zbsjCy3!^xW?bTQ(G56C7@Suj&rnMZb>00?9*Nm%6~HG#a9_ZR2^J?Z3|$y6 zZ+f1qkTd`xkXg^E+HGO(+!jEW83_>rq$Lnx0ScUq!tFCw4_0)=dS1vGf)dkn9c!8w zGy<}VUQJyV=Av>ToK#7nA|ya-5;rrwh&xb~a;vh@+XhJjc-4F=l>} z!rE4mXczK++WE24nszA8u|MpgZN1jh2Lj*QhgxFt2nr#?!4f4*yt{xxAy%W^v1C7xei?_g8)Z+a&b>$k}rziI8dGjwAP+J zx`kwJB+1|gHP1}X@(e-ip_Mi5KpZ<=z4cX~A?#ksfLV#jSSdg#Tpuh@LHChHK%zZD z40-a-tdJL9A9<_Ov$UVKVV5HaTCptLwiB3=cqLMlAkN7s9{S}*`k(8>0e|vtd1O#3YmzBGy_`sIoOe2nNpXp#S+U zU-Cjo=0@fj{OTCfANa3%#<{f_Iv*5-G@8~m(8%Mj?x`_pkhVdF>%5u=B_<26@S$kC z&$Y2aes+-4ZMP=?EKu#SP3s^g~xLTiY&6OKf@S|=oMt@v9J z?}Vu5+;+i`2Lms4(|@`P2VG*?-Y&4Vxif;*cv@-e*}88V_PrXC1_&Wg4ZTPi@@h`! z{J6qPV$wp?cb7egvW;tUuA*gOD}Vv=u0= zvD#gsN-#InRqjm(i(5sVD`*ltP)_sC?4a*-32Qr&Wa#W|ZeLvF(yQa#d9&1xppN6` zcGt{$7DEWI2@|gC@M<1})sy_am@Kclo#6W4O<_{h+zX~c z6RwY7FJ=${;qDE^(<+1%kZO9Ac(3a;|6Sk+te$dxj7gHsLqr-7jqA^x%o~iAX=~%H zc@hywS{5fC<=9Np0Bog+ZU3BCQ+{Tyoge?>>ejRmFKsD>ysL6%2mQ|(SH;WT25DN? zKqF7Qx|@zFZP?3&K$8u3Amg6K@!ProtR>Es2rC;OMz-`-^a8mx@5qZg=sV@FdBw=P z9A|oH?c0W(-aOJ^<&b9AFXEvv!@wuG4{M1V!&Fr$MDzX%bj~1eFwO=Wj2zYmA=~=4 zVJ~eiX;MH+wi0c2UBHAQ16pj#zU&g#(r>cxD#TiA+yBKbl#i=oqv-s611BzQp3C8S z2c?MZea0(k6*4Sil+WLj$hbC`+= z;UHFnr~mqftG`F5e{gkb*bS|R%i4zdA?G9yoY~I)-|Rw1EwU(VG);Z=9DjK?&AX#D z-w}902*{|Ym-_*xn#2pPXMFM;-om6K<)Q6m)TjTta%Zk`NK2q>&E1g{Q-ew3yJBoV z8mGQ9jFZ{?yLbW%f-~-iK391OMUo zd{9W%22Oi5Sl!3b9Y;50EVdE?jT33X>VMvkv~LkW8kCpl`|FqzJB831d;B6|>e2(H zc|w2_ZpG?<9_f98^$vc;8rGnk6O@0#l$db6fz^Eyz2nIZuX&pVAz&%Ao$w=H@+0j% z;MdBMwT@y2gZNZQa1u9Q{7pzF?#s*lV&$Jy^AX~EegWYf)%^&Q@b+$5GS^u?V+fP) z<$_wCM&15j#KP!(HFX7$6%oYlUm@DI&#&7@z;9uGUwLvXDA?kwd0N>xcdsGtUV_Zh zmTI36pp+)taFE!;Px(zvF#hWAQl_TmgmsptP}A=tW`67w6R8ezZjn-&bf|^M z?xzU1^dbUtEcqtz`xTG5!7^w&f$ssI59*}SN!08J%v^zV0wE>n%Cp3T0Ca9TI@mcgH_jolp#d$w_7{<6w>n^BQE;g(3 z^lO-`yMY>xaRo!xw}6{990%C^lHF0@Jch)wi`)g^Z46o8#-pAE5{{R30UbFgLy!>9I_gk&^U$6RJtodK5_*RqthH1UyJNogyiSz@ME_7W4ruX zlJQ}e@no&|S%T|Tc;m6b?Pk0CS)KN1viVo0_hrrfSG4+s!1-CW{O@p-zTf?0mhrCC z{DYkA=`{EnUSXQS+yuIHGw_ocPw`@Ya_f5h6`vg+D!+1bO_+23xA z?_!+kVuRY-+@OG~^4i&u;m>GkmE+6M;%AKAgNVBH=Y76bmdNh^+S}5vyX2FRtzVYr zxx(aHkmA9}cPie~3(3_ss{dAw;(ax#Ec&5+EwXtEL*w=!Dj`f+K+^M6|pPr|G zt>2Wi%FW2XwXxBpy|BE*ow&rk$j6Ar&eEoRx3;X2xvaPEywdph!|kWR>xrrR@SE1X z+QiQY=>Px#1awkPQ~jnK0Q?=)ZvX&)+(|@1RCwCFUAeC8L=?P$Eo-=LIiv|30@kEV zhCnPoz$cIq5V8CO5`qAc6Cn_YZ{+ONi|v`qR^9Gy4~sm0HFfHow&CfuS6_LWUXEo4 z!yTminA6;1d@;6dyE4`{?qj_gHpckxV(vlT@IHn+SavY|OL%(a)z_Y0eHkSdqJtjV zhG|%KT7lGaVwWCc8u^}e7^&Nk#_?J-!rC?Zd>d)JUdJ~c!AN{?PHf});>MT{8e{g( zUyTm_p7%MCq}5pV+7ylYze5e8#4FR|Sh&eNL}S|8im@vfNrrQbI>?P1lQ+4Yw=~}9 zrqaPo;16wFM;mZlX@pQbfR#zH8Sw9W_*jX9)B(F{;RF~>JGo+xGNNk9mBNO z7HZu8IbL~sTqqVD20elkHZI2HPAG!%`1V6f2<_BNVjW3-V%*b>hE0~+m}o)Ms!CDJ zgv7kKLMZNHl;GjOzw6PN;MXXNz^p?OLa1`2s|ezKt&rA;#iG4xH7kS|{~S**4j#q} z#E!|St2EAyNG#L_YKPHd^l4P3aP7sfO_87xjy0%J{%YxfP~68_kwX7H>slzmo!Oco z1wTNFS-;Fx$uOrYeg-v$&Q+ujhYC5Ag4G#Kf21Mf{}?YLgsCPnaV^M5xT2j_?yf;BZ#A<9*EVzIt3C$gj-%1u)U9%!-wAV%y71;$DxOkJr9 zFJRSdN^30@Yp6w|6dQ!%rBWdTGe82?P^JD{hApi|40N}dGT4_Q#zQ5Jr2@aBCFPP5 zU_@mmln$9s{#T_iY0B<5jh`CVf*hIk!Bv7NF)=4TJWV}DOd~a8g-j(ObP>eBp9chd zQ^%nu;UPXiDr&D8pmpUT`g71EjlkSq{mf0Z(BkA_=z#HBv<-oYkDvv0r$rLwp3b7j zzfTIdOw+5R$tirr64y=8Z|C6TxCE`r4B8gHA z;Wo3)gMW=Bxy{7a#R@Me)ud=?(I^8m5#6Yn)Xv~4 zmDV7%PvArkaKhS@(h|)?IJ-LQ?NFpE5+0)h0efO zGvYd;NMSMo$%xNPCR$&yrfpSHKqy`=70wA@bVY(v1Ti+muO>w@D`6+Wc2z`Y#du5$ zQ3}3;Sw)uzIC&Qe?kFVwk4mvjCHpcmQ@0ezl!k0N0ZOEyG!;A_)+uIcej`DKE*(YY zfy84qmnlH%@gO=<)U+rJrE5kNLky{1B+r|~HJgK$FDb3Z0HI(jrds=9_Fx5kZ`x zSTIsdsp56AW%3wu<}C(l{=3R%H^sQ=fV?kJtK-LVz>9x9e3(vHPAom>YT2kFEx~Q; zgLfMai`>ou;zw1sQWxi1L8wh$aaKBt^(}61&_UdIgT}YtSRb>R5DEYZX)G{e>WZO{S^SfOW24pt!j zFis4|;X@sT=Wg6*?+Dc^_s#wo@MDGZtAv91z)BG#VS7j_fL&hHrFAd@SQB>w>Mcrk z9lTgUM-Ol!N)-}8zzft0WoAAY8x|n`fD2xj97BULT}kpyiHy^!AV!6!2nA{9Z4 z9L8dz)~16fY3|9zzaBn{eXzv?7~-0NO@&=PD8bP0Y9jzj%<|iT#5Oi_jr+WgRmW0* z=)u|`Q=McyE*0at1E@rO5zr9qeH8geS+U?V!bt*xo5lGDyrwG!n+g+VEgKS|aOB%# zCH`enfO9-r#1d8t8cVT2D)bvz^f)bAY1bASi`$uyci6C^H(BBap>R*ZW`YjxMncDT&=$3B?4OTa<^iQpRzNA_kf31=O5tVAj9Melz<&@vyojoN%%T-2 zQ^ay9ltPEW8dB4tqy)V9=%rv!>fzaZg725!ct4Or0>@iyGCMbU_OMN0J>f+kx{442 zK<%X0oxDk}2t_eqH z{vS&5pYMI3s;x>9o+8DDxmzD71$IcGgR(eEJwzfr1Y1cs@=)w|Fc8GCEQG>SkGFPe z*{lW+k>XS>f`rg0IL@m0iaZ3hZW`}}58SSSdrs~$-BM)FKWvnrs^%XVsRxMhUwH~E zqAmm_hB_Pu@({b~W{0#AieX?ofG(JR2qT1Mu1Y-1_+A$N`Rm@%}B*8efn&)+jar6-m6V$+^ zh^s)sUgC$*f)2M8uvChnl8Pn)fz?D!b6BKL8a)WvDizYufqyq8)kKHKqHe_(Br1V@ z8Yc2&!4JQDe0y`LFS}+{;S0o)mhN zG-%R}P1qY}s&)EpG^-M;IlHT9;s>~Z*FPj8gA&<)fhHBxA{FmsL^!Qk{o7^k*djHT zIb;i@Z2c#{sPEuYoh5)HWZwb#_noPbbJ(*+;?C(hU&i65(C zJJ1R_z=m#9M39URH(3fLypPO&iyVhJsUCwO<&cU99~L|YIj|`uN#cKByaEunxD6A6 zn(;z`t7kax4{F^rH9UYKWROD;5*$ubs8N;=8<)8%7kscYyz?W(Smo2RtaRlD>}iEP z){QI(SmT2ItAzrFZ?gD-yc8;mtq%h%X3`t2v{0q68lq){mL~4wxm{!Ra#CFUkzL^< zp6=%}4QdLfMK)Rt6-vEO_%@hSDRklwoEREE>`fpA#JPDI&bPwe1`%w4P(&9mdTKSt zeW^gs+4>rvQ8h_+-8WYXLy`lz=nPJvH7{JU@M?jA2IhicFuCUAAw27Vd7l#GW z4U{;Nies-yeBllfv?c=E=QrOJ^Nl>lWQx#XuPjb0Is5h$5(s#R#gH@fi$0h)eTOwuoTxidaN{XqrO@6 zKq352R(evQP#{0H!;uP8ag**`u+b`4{+$`Bs|jk_BC+}|UfQp35t(XZ;2`Gh#@Px2l)&_?5rd#7)Oh)9BUGeTiW5#;GAk1wdC_8bc4kaotbn?yQVb37oe@6CV1 z4w8L%_CN6?sVJV1JR!sf_>7wq1f;OVfv0$W#8SxHX~-gS3@avY+EDn{id zW><+FQdrdrrh*tjgX%<22k=3e5cuF3m@rN8nG)oQK55BwYA-HyOc%K*Is|mWM_e$_ zX+``N-i?%$5T;z%fI0@D;{#R>cy@(69 zi%}xdQj2gwW-Lk+b_!4%4snGobIDN6&|1)HYK{LGL6SeAa1;ToVJPm$4<`j!(Q~4H z$F#g8j~70J2{z99U12fj)=un_Vo9EN$fzz~=fn6@By{aiP zBPJig7n(aVAcQaf&Y;Mz&r6XD-xJ~#8J-C;-Jl?m%kI!6Zy%Dl;7RZi5QqbT6PGB=% zC>6%L8WKB@3KzswM&N3l8M@;E*tbRmNppmc11#KehZWO0L(CLEcu25YvrUawKrP~RD;5rOce48sLh-h#1M7ss__1B#9v^WP z`=kK+!uEIzHvvsklj+78h%zp`1>X)h%p+Q$x~)ILs2k-5)0>&wl;4zIVagY3JklRy zCR_+KRP=bl8Mt%N1{UZ5Fe|v#O0hI<^E5Aw`{HU*lVToCfM>N6CKR6Y(K@iD`ah6p zjG&Ix0{|(G(2(LV0omGIRHaM?JX;FMb0mh1vn`1fe4HtT4k#e|vo!oi`!08aPVeUm zZ&vLH6KEjW2g9cmrMNUok*WKZ7@wN`xuX+l@Sg?EDXLe!Qg}+5YD3Qll8}`sp-Qou zHuzNSnQx_eeAHEpkc#tn2oX8xz@;*c@p2fD6d=Xj@Ucj@yNkjVHG)uq+WS1d&nJ3b zVM2fNpt;4ENGZyg6O+mX*no+ZM_92;%nW3uAOz zx>AfT5k5mG2yHw7DNeFdnA#RKBW|TwG`R*I~-Ly|A56aH?LQAU;Tcu3UstLdn5rSuL<2%Qf<43oq_E3O?q9v@DnraNAx` zp{#Y!{%4^=akV{j4I2&!MV(@9#tPdbA?Vaw&0|um^&?<6K9Y1d6h>puO7~fTy>z`P z_oO0rAZw*Cd0?#|_y9~yg*R;mN2*?tBJxw{#Kn5;EwMJCusyoG2wd0jp8Q$(n1cez z(8|P&*NY((NyBweVuet=)xjJBp-VA0W(9UiFgH@M*=A@@imrCmD~07BH{aabVMUZS zACU@V9|J6fDur^uVh9b8ivp8742>do(5cem`GXHCqluDMsT5VYiZNwwwv$f5BU5*^ z$djj|)1yj}(jhBo=OBK15DN2}a|retNe>PuT*U)Yp|E@d_Q%o> zyYA9ev`WF0(5QN@6wHfk+hM3tAaF3057Ge@3Tcy^8YQw*Vxk68Kq)RN5;C+xL44qr z^^6i2i5)B$c&F4t2Z|JTlwvU9JW>iHLgDIz84B!GrcMNWng~yNigcV^av|5P$NtFr}3SO94^iV=D8<4v4C%sY#1rR`#9x}jU z(k#pnp-`Wh!%qwvK_<5p_p=W=kg4yILOcUY!i-eZA6c;o4#nO^2t|onC{_URLpTx5 zI;2ARa6pRP=yAhC6qbHKFwRJEKY+kfNQB0A7?M%Ue7Io1RLCHwdS;*Nls_O8O5rjw z*&0f5F+KmKH-jqim)<{1JU*SWc6r(sKAwBhu6*AqaUWKQK$92O~ghF5j zBfte%OC2+8CiPY+Bn_p}r;D|ETNGN6>BO-BrW7Uj_R_-#Hr68OaxfwKq6PlFy z>Bm=Ez5ChcAAR}tx8MEz>kqcAL@jw&tf3U+TL-|Nc}od*7WJD$D1{bPO+)`m5FXz3 zOM)R*HzeIs>rub3d5gL-<4SP=ygf?j!^gXI*{V-IKnG=k6GP-8_)>-sSP2A>S}HDX zBxIpJ(}g0770#+^)U4Khf_SIeekWe*b$rfb`18*{e45aZ&g&W|_nH&%5(Va{aKlL8|4~7}LuU16PfCxFB9eY9Qz(=LNIS%6z9~~* z>GsG0J26r3!$;sE2jCm89xj*=SgNm(rfQM>wRkrdhlr=xai2mq-eop?qaaRv^2JY2 zq6ZKPmJJOk8x2<$ihZ96p+NNLTm?c#q^6OTUX>M{RKR@}d@!GBbl{ctYU88GHwp~Y z&od7p1@;{?FC6d_dmCa19oED~pvDQ);iN!HIw5LYyqV3oC>NynSRy%{^kPFSmP1C! zQNJ+dg7NWJ-voaDgz&`|zhvWpbl(qAT^G*)p=dBdD8}`G6d(c)fjz*t$B6(QEWZ^s zdF{cBR6dFaD^YIs=v_HN9XT?BN2?U?Q@0cFp^*ys3ilS~K&KDh0V!Z3dQ40gj~TU2 zSaX%&0aR8D=a^e0#`jK%-$*8e6kq(n?j0qI+YF%?MJNvNhH&Cq7r5^fu#6wDn){vt zz|*4YCeX1-Iy>6>1UNy*3GkW+Fgc6@ou7C=Xn~R@_emxjuv>NkC(6AKSPC@bhM|`V zd*2w9O)t@(lEQ<>P`1QE@p&0Kj1@oq0Hvslnp-*(iuEc$fxAUtzyeUf0%}emHI`{+ zH&GR<++g(eZ3GT!j5Ddg&&(9L^%TfHbmIe30XGS)5L!f$+hWM;<}+b5@qmSUi*5(~ z(!$aYEmwH#;B^rC%u@&@dY$uoSGs zM#VxzP;5W2@i#i>mM4?R#VEd$%(#l8@yUD6oJ?k4RZO^5NU}*zF|ctbTj6TmC@4bB zQ$cy6(n?lw0U_}*u=RA)SEIL1;r9V(9J)0oc-H8XJh|ebC~J>nhs+aW)+nQ{1Ca3ZSrwhc>F3kw9ujH1W=rxalP&G`>Os8 zqhRha4+Z%w9STH<%C=bFP${@NO zO%Ca6kopg z3Pb0HVM&EDapB}toEoEmiN)|C+W2Z1sNmZv5nu!fOg&;I>KiYQ3s(dV7WU_b#~lL| zX+EdWXkkZGD$>Ix-PSG+enw-*?b~%uVcq;J1iNSyWH9&e11J`k`s>>tU2PQ~2pts^ zU%tiS3X+OD21UW)G;b8^DFu(k)}R0h?4rhj5(NoG&=Jch>gpxM+<>B6UW>L5R?Ar(`1Hh^(cYdUa5K z{u3sELaF#+7GaUvpDzv3<0NW~!h}=IY8DDo%_$ZOHW8%yVX>t1Rd@(2kbGJR8`h%~ z15n%p2A_poifAB;@pjcTeuy_%D?ic!D4YvaKP|;38WBUPzyaAnftZyG6BwzbnWPg; zKZ?%Zcx97aDJ^=46pJOJaI09zDWGC0euyang`bGHCRp%(N_HOb3hk(CZzL2%4%EwO zDI9MA+5D4SQ{+rYlHfFm7X%pgBk5ECq38q@DAin8M}eXtB7Ttg>$W;9sy2#yzep!) zr|P`;TXk-nt#0gYSgt zIwPVJqd=8W0L2OwyezhE6?b7GJu6CwPW^(psK+%eY7ehE^7w1IH2FYV*423>UG-Ku z1yc_h%_$s-+r~vGf(2w$V)l{b;GA)aq6I8)ir&9ya&Rz{I>$?1aLW#nw=;g2MX9Dfo{!6aohj zn6zW%6u1Rkgi#bNLUFZ9DtcXCv5SgvRqp}mL<_}tWkNznYZNUMCkJAM3fotA%PN}q z@o~`m1M!13{bj@{mg^H3mAV{F?ODdAM@ukV^gM}0!q6Z?o zJO&})QMzCXA9ecf_1C7@vQLR zdd)75_q)*+-?LoYMH^X^<5EI0L9q_HZc~pM$weHU2LAXTWsk)R4QH@529o~5wE%uMP#s)g8j}G zbBdgIK;f@y_L9H>gv^##NA6HJn>pxXav8jrP zT~6WJ%qdE+({X2+g3_K{p||hAVg$u!OY^1K-ik5xK(nj4`SE_8Y%nOi+MR=mmoHyt zgQ9W@W+9y<6%jvhihr(C^o|8kRF6GeK(SZbiDp>EW?GRb%0o2A;ql?no=OE$FwRO^ z5nKSpdF+y>hOEYXH=k-XNW=jY|85n%G4ZnKj3;5dB*;+BKj!Nc`wJCG4Y{8Brm=S7a}&9H>K62 z!pZpbwMfVSi!W!s#~ek9JVXyPlT+*sA28C+N+p2Y6ex^|9wcyzYVDQ3-2@f{%c5|} zjqMRpvgqM=AW$&z2>maoAjfnj)`}I3)gD;v$s7Mt?g^l#Pz$T$}or1T`afP)NEM zNMIEI3yL`K|4W&Oo8tnSAtgo@h^-0CP`!!4n=)G;1dqTAuiXa^S5sc4dvSR5mdrFfaMecLnIY2ob?RYt7jh(JpXXoanVEZ5Uw2wfuh;^jEd$G2uE#l z?1W-}vKc>0`U%Jf0mDQYrzq+LhrUB`mD!GUmI*m@WRpDUTahu4U{1t)Ag7_$Em(B2 z*~8iOvmPWOZbWq=6yM<<`6bd>$GtgO%}V;5*5;|x&&0f140hr2_+Oj?MXITcAlR_mL5`_# zicuz(a|?y){%Mg4X)+C24I$Syg_D#&cZeU-D%n!2NGe!Hk%vWB9Y%p5qS@i4DNR_4 zrq{FQ<})ZnJz9a{wly1$@q=JPyZuf973)dGFeVbsdJ>ZL@GF6E3I;T(3$8N3tW?gw zM&cGwm{s5v$Vp<}a`O=``r%W7aBAuYFE>=FwVy4<7Cla&UghvlMO2sQ4-P6gat<|zoK!q`3Tb9=FJ30_+HNlc3~|1^sxB{KBJ}+}QGh}K!E#aO@d+M-Xf#Zp zQP57^GnU!}LJ0OQ83jfljDr>~PNCwa4q1!|+LWEDwNqh0w4QR};o+??;e(FA1ID4L zPn2b=Dlk!bUsW9)H%Td|#Z=%{K12>U1w)}+Y)?c(q1Y%6m=_IW;sjYGJ)DA>020th z1nCuvxzdrJq=jKf)n-_vZi-_#9zE7) zfMO!4xI)tm6k-XvO_Vi_n~~NBMS=ndo*piR34cnW|3H&WniU98ZehcxQkC1O9V$6` z?6?TdF%+uN@FBO0BAYlxn<%H)I0^uyP*s}86cezydf`f}KFccnD5m%7r$#aF6w+bG zgop!avPAX)B48C7KS+#)sr9olOoVq<*k&?7c3!b+cq-K<$Eo8^NB0F29zF`Eco1_z zx_C*oy)-A|27Upja9tL@HXH1L#IUk)YDLVJRG{s6&TAH{IW_Z6u_B{5fr_OH7Gsg_ z1QLnv2oz1g!s3TbSshd6Rpu04vg*q;6W?pEZehZqJjE%Xz3WnFSFbV%)Y~SZvuAqd zoPs1j*-QqIN+zH|TQk*7^$J0u<4#o_5IZ2)s$-E{;c85fQHZ9PD0a+<;TaeHA;gcI z3e>FzT8L1bX!?R|u+V2jh>%W%v!ewQ%Q*#rpav*RwxVEA!`2p5m{SlFGT#y;v`0jl z79O%#FoDKpuJ~PP^?`jLZ2>wv;lRQjzUG#Bv!!-yC}?>4Mf}Q zB)P1C{4t3`2nje}S^#n!cC6mSaT;vQpgRr~^=Y%hZfbqWwsXnCBfaU^_y&s~P5#3Z4QMd!Bg{PGPc~V$>tFZI-zZr!bA?6?jydxA~j`)|;gikx>*-9N`nXI1LI| z1!704=1`75cxvq?B{vG4Sa}=_IYoVrYbeH;fU0o&#cWF9NWdzt?v)F;gzVT}4peM5 zHu`{3lwvT5j@jWzNkuvaSqTuSS9C=Hv5%5RV48BHXwPPiB1Pff!iW{VO06@iU?LDc z%qd8{7Ol`$#s+kk zHK{dhjW(PTO};h}c9G{4%T_V(6hwt; zGNpjbC)gWc5^5CEs;m0|1<^oI2o>j&)zeERxam@rIt3w*V!rytSWe+}ZmVLY#*2&s zP$Us#K$aftf^mT)OuB$`lPv6C=&g&Qy|9jaz1`+T?oPs9HEfoyp6o7)oP#6>Y zT-~%lYOE5A;1#Id+IpU9))qo!hT%FBc5#jy1+3yMHwvVJ83958Ry~B6X~^1A{8-Dc zXcY#UJboafXjhsGp~3X#PJGyyJ&CdZ>l9#uCX79>U?4oXh@qgfq@*b(w9|f^jnpa> zi!rZ2jT<+OmFhhm^UqdvzvY29&tjz`1CqG}$-poO&Rfn3R#6ImWLDvm_(a(3m1796 zMrmJ4DR7i>B1%m{fp;!1Q`!%ks&Cec(X;%&w?a;s1#GOvh6A5}1l zdY9KUi&F#U6HEn+qDU)-z(fNjBs69S+&9#Te4qbdG1YAJ*SIyT9SSXG_Cg2jA-m4qD3XDEB(@=zeyIatu#4eZ#YDN5j zJL0L`3I*1hIyrj!jSoV^!HohECZuH190C>Xv4QMXEpM&Bp`92AknuY}=dEI}-(vMk z+ ztMFe#&3;9As%}=C7irKy)adgUo!v|TJ4+5{A& z3(CahiSQ8?fZ{_!fPv&0g}$wSJ(7GhqZi#y@&qvLuC3bu+Bm>?m$ zz?C4$oo~HcMa?Y>9!^ELF7qN!ITIt=294)mby$B%)AqtN7RIOZ|R@=DA8lVC}_ai9^K5@BJ%H-vPolw0@4lv ziS?cLKY#vwGg#S6tO6|PLZn$mFbO!*>H{B%?_v+S{?hHvjiRHbSbzyS4ko)5?3_%@ zgpWNz;Y?8DH#}~GxYCp`_Dk9qU$SOC%2_Jx1`L7k#b zpnz3$LWm?3yVvx`-!L6)6zUbWgj$CJ(ZdRj)EN-*qwBH@A-8M&7@Tfu9d{I z))g{|m)A)Og|C;VI`Cp^g920}#R;s8Y6~nz5(O}Kra=HEWI4`+ zE5^a0@b{eMeDEy2Z}LLuVcW1jfbc=vi%_7RWmfS(z_|G7x?oUS^pLHO@fBI6QveF* zLJyP*Q6zz)7aFKT52M&Q6LxoRD^$=s%$?mE-Z%n7t1GQ;YW@+RSQ`}002ERYgfNSy zfI@`z1{Yd|rM+Guf+ncGcuuF-Mv90CbxfxKRM>11F2b5avZ2YKpjAL|E-@4|2^jAL zgEtRqL=TE4Th~MKii&2gUH}RinN}>LV&_#o9K9F{+TXLz2Jwo)EQ0caK{JZ@O=^#f z1a+z-iQoOfzG2FT8?=wR#_k0?2o&oh{{{NzS{eW|6KnPfg2p6;DzOSev1KhmA+O6` z+m6LNR3v`Uarn6CX9wza2?^wr2;IQ_aj(> zwj#7$P^rrdJg~2KgP&USyMaj+IVW^Z?JGzz=jK);}8m?)_nnrjygq|3Jn_?Nz@>e3o#0Sg7kK$2xtLFpicz* z5krw86!zwG)~4wZ6VZGy0u5GCAIB(`ZC#wg$_Jp;*ajxNSpxMw9~}m9iK)*a&NE1b|`*>2$fC z9%wZ~&qkk!@PjNmGilS4vns+za2m@>cgaRKWmyeKoxRXTqHd@#hD){A6F?0|L ztTUC0qxi1LHW8GdP@}kgqu!}gIG>1hv=oTfgiv%m!lE_94?B|aM~L5=zB&5Fr;V3Upe(<5>rFQJSEMIQ@G1=BPbNQno*yis1(jDw1tQp zWl9i?QrkeG^$@L8(J)ZNd7e@$oq!4{T5Q(5 zWnpjK9cb@4pC|O>`~hPIRzfB+d~yLX<;?rtIiIWqigtF6v1|gp41uD@>zbd>Yg*T; zdx0W3?}oIo2;dtz2$~6^q|38}$8?hC(g+I0D4yjrdis!A2!#|rap3^_6(Jc}KRPZq zb0WYoP#pT3C#n}S6trooPJv_0xB3JF@y@{;L-DqG3Jo9gk;$xP zL>qev-smk?B`CIIdQ8F8ZD4*rZa~(f{UZMu3SXdzPu=c`S|>A5q&Nvc_?;Rz{)$}v z^zhKlpc*0Y{Q}EQ00pv>bODouYIUL3DHSLlKFu+MBN~CCP3t z;Gid2aUx8Vo#MSYl%YoPuB2OC6rQ1zh>K2f_r~}Uu+S-Z@bR=i(D;MK9vk)oFp55X zA%_$lis2)oMqUFGP1jzcy>G^>H3D)u;nqOW5GW3r??1E`WX-V5D1aTAyb>sSw64hmDVtK@5h!w?!}1UKw8e*Iu0t`Q zMsR5wKROhlNIlnX!VWX1ok*aNo-nav=*}J~}!K#k_?b`4nI4)rAkx4J+K%sQz5=oCRGgwSD}A~=o+2mI`*^F&`SBs8F>NfF!;%@qpiW5uD3P*^#Y zh^Dv-iXTl^q3{KYm5<6s1t{iL&u#R!3`Orun8^IZgtoF|rrqyz3On#PXX{{{OHgzb z3a%xSm=jv@r<5LWB+_%Kn#)Ki6f5mh5ERr1rpBrWMds4P6~nNUj^wOAk$a09g>Y^1$2qxeD5 zqv<6`JV1fz@KGi#h6)8M32lY~4MjyQqgQJvLy@+9zw0lHP^>MS6!J$51@&;uq!o=d zPUr>)+P!%V0!h*qWz52-RVa8}X3lCsAq$`&zM$mBT@e)3@Uig6Ab)526pW5e&oUHj z4m4|LkI7~&f?_IDnhx!3OK1OiRsBbXBBEB^C=}Jv$9s+*C}iSgt5CCW5Q~aayx!4d zBtSIyU>dyR0U;)f;QnO{eTu08nweH8Mij@FmQ7bmgT}9Dc@2tn8<_A<3I!TCRyI(e zozBZp;1p$y+n2|qWhfqAfFdnG(cTrHNU+535fqjD?%}}1d3r13g4y~ZaX|+ zvk4StCUehFKx*9pja23g2s9YSmkB24~rU81g?j|@4f_uZf+AL#t6j@yDbTA zx(pN?OAHjKhCrbz&u9u16j%)uX#tAS7^6oM4-u+U3_@}Wi78tv9HBW33yMC5B4nfJ z6y)%su3Pm8;X%$3bwH5gL?sVOPI1S7oWZ4eBkh5Z=>PsGd;}{F752=G!kc_h>=1f( zif!LvD!gfFo?=D=ld*-@+T5_&cs|H$LgMlNsr?V9Xt2x6vFy1Lf*+FyBg_G4hgo!y zDijX_g*XdSF=rSGP_*9!g&Wi7XZ!G{#Xd!DQTVWi)P1m+gN^*)&YHG1H`|jk z-(O5a?Sc9jtJ6&zQ8-+23R%~Qj}Cv7CNNkkyC-9Rd9-+3I#cZ7=;kQsg~ef4MLORJjGpb2SOSo zAvQR3`yO;_{y_&sY=C9(-~$LI%MdG*;Rg>_N9i#LkL!a#!Cj}N<8cFpI4DbL)@Tb} zu}lZ6*%qLHzbjCTUvi4}&6;3aoW|Muz=I7Ck46zaI9$pz-=Njv)Low8iFzp7007rI z?RZ_8Z=mo23xUFYC4BhY2-$d?r6Yv`mE?PWpHJB}%;eQ-6NdX46-ExwLBr1|^n!4f zOw*|2)P)a;9=gFyM^ihHghM%y2rQgeR*It!3>Jt(KtvcQXn{~5IQYl9m4pW$0rfZ~ zdVmr>`r$qC^z~{rg^V}_Lt*n&%qaDMitUuD&10%}Sff?A^-w^nQ246~6p$H1H5$b6 zTjp&Yo(du|g(0;F)-n`rfx@h7nha=NXCQ&0AfvcAMeoIqrn}%q;7_Db@CR5W2ewSx zK%s@PXM_4wwu2hGFVvEUK*3*$^Id%QRWP!VJ4x(QT7)8g@jj1H#5Uo8~cr!ZYT z4Ig+qS(X&ubB)_rBSzXb+6}Z)dGbo3Xg6S8s&&^lQ24$=;ktEBp-?ouNu?3oroEI0 zqGV||1q#(_4~@jlr0TayPI1prkWB^15Mg^R?rJq52K6uyDtrnD}a#u6yNDn5q7t#yh<)4w!A zN|RTXj6R0uNZFj4!y(r-g`@arv-bT9z|&didJFi7G}_!Ot{6MT;_ zjpLMef@O;J#x_u~&10xHP2zkjNEj$~P-o)%4SxukO#?N?RctNGn!!3Z3l3yL7BM8;H~_&Dx0jPSm~7EhroGH$Z(YjWOfZYuX()Cb>UNu9e&G3+lL4E?mNrX z__2*a%VOT8|IPKO5vKEnpF?3TPBGdp`^glF^SuprDNyXAHPw9zZKE*iucr7R`cdFG z+Jp$jF;3GyP7f5BASfh!T${~QRg1Jw0al<+p;9QQ3hSNDi8db?RMEo&f+6s;R$_1)jegq49Xr(+7uR(oXS@5`3_h0c ziW>CZB+QjA%ENP+g}et$pc+1WIrwfieafalvA4r56(bV{iqH;^P#Ai4LE%1%q9e9q zt7XGI1mPJz@c1WeR#X8BkUE7#kn3&%RVp?iP+$aV-CY&*DUdvoyts7TO`yU|Yt>&p z+z}OjM5bv{6eJbNNf4IEm4q^`WLfpsan|#||A&Z)hKSy%XZ3JVl)QVb2!>|81Pc1< zxS+&hC>*;WygV{z5CB9%PWqxmE~)JV<=}y0rx3{;Q;7z7aH|2N;uNf}Uxb3Vk@r!j zxTje$M57Z3uXR*7kM-Ag$M#VmDn#I&FV+jU3lHvN?-7=8@6~J+Uv5Pr{2~^yYqNM@C*n?$Nw@Uc}`4tLY zN5NMbI3p_(Ebz}QsVBGpjD$jgS+a^+C`24FaA{Ylko}+f`PZG|-SdYJzoGsD{qVy# zmt$lm)oc}t_X0(|v`;}kp-y3DMlpb>YU0P0U%eHVsAa>pnF{&AMYy>(Fj4)9twuq< z@roiBrR%C`>esSTyxx9WkpLM8Oj^9;ejN}mKw;64l%NnK>Y;E53ABmMKFZjpT(pE#`PbkGF8PazSn>H5ft^^@s8z+!zFW7 z_I3pdd6&2lu!ORC*(v1I@s0zDgbx)qJwibytxS}i;)@R-0E)kU2OR$X`*=J?pueBL zt|D<;A3i?&`ei7HoT^h0swD1f2CR-3RH4vbg>wyv4*jXfTC1noVoLibW_nf$3b~*K zrJUD`nwmQ&f`iuAwNo=zbQFy`wG1Jx4q?%$hk}9!$^>mjLZSHK1L)U3|NJxkXGlcIA_6Fk zS=@e&Xw-#|&)(n^@2f_kZo$dD*cdL!CkP6WgH$LMRVfZ-EZ~{ii~N|YTkz1ev>}^- zgZ`XM+r$(J3{_M#r6)_bqIy*-cy_HRR%M`ggEUmyP4$WTQ-~1=@{4*Imo_F51a}I> z`_KMjn*hcC{IlK&66h2^{`kv}fQ1@Gy;Hmuin_@T#~hO_LSYQ!0>!-`f%iJ8Q&hVZ zZrvYBpeTDqyV=&>h4Mi;l<*;L!ihX5#rpgO8rN&Etb#khLY6|st0YwX(7q<|3A=+p zbXxV|=>UhJkR~rc@g0VapMeO5;-7S*P614Sz%0xeAF!-KfmU%9if^wtg-Uq6mG~iO zNTN{G4nS1@l6EFNPs2bMz62 z*ij+^m~qaiCW$C!QingV)&3 zQzJ}M@RP27LndBFCJ2hCS{9_pMAX~IBbSNoLNPxge2i0Zmb~IZgo2_68wO{ZI~tE4 zhgQL$P^z9&?wJO`sg0%*#d+lBM@|#iGKds9;S@p6@c}wW@Q@aN{(9p`B$#nVV#+Dv zG}zb~#bVMaHj`!U9j2MLzL8Ck>H!K)ES@C2{rK&|fsTOUc3jyhrsGF~;^dNjA}ZlQ zP~7+%6x@Q+Zp<_|peOP5>B%sF`CupD8`SX&WCrXG2Y-vx&1o<;|AV9R2^4?C$>4Ej z8$31x6yu^fR0KuDVsq9uHnGLx$41H)QN+ZXkKg8_*OVR~J{YC(@WD`QdEl&K#^HlL z>$p{n!oZ%(VkjnilAKR43LGrh8=|Pj5#`V;W|LMyRn}s53?Zi{p-7b>c*J5#^qa>M zvLvJ6(DCK%a>#Uaft6r5DBc$@;Emwn>B`zL+kOJySDd6c8wF2QK5&ruVq;y zh^?$u-@&mga2P!Ohl~O%6gpy;bXqBD6BIN`aqAOin6D8E)a!RI^|cKX3`XUg{T`VZ zp!hbQQ=q^`&-!Dci3>x)ARTJNDLB=PMnO=pR}d2iI&4pWmlt6rg{{F!7uwM2vhADB z+a_y`d1jr+VXdTlrZZc6VMJw%S~ykKJ@iVLx-<5K+0#v$^cUJt?GL?eq`d0!`p-ec0LEgSW@hm5>LF{(?&gm7imZA>pO6a0>-YrCeqH`jHwKEY4)k-DS$`?YoI;dXvvQ@Py01%3%D)UBFCIqpy z3Qz`#k{!rewm~6IqF%XLgaw3WQm%UF8W1bc*|AQsGip16MAWcLb0{c+OpB*g(s<_8 zXcNc;uHRqk`{~jDh{T9qy!iTdFp5vNZjw%(oL^utrlGhUm%ru|j0Hi#83ig4GC*;X ziAbM)3<|>GSS{+(8D(n->)N(fQa>v3R8NL zkEg$lSM7k1##A!P%a8^in%;(?L*oo$Aeu&2zS64(d}q4O1PI0`hi{Y5Nc$Kc`d#{P z`!Mi6p@7>FKCz2L?0sB%{O!$?FHgR|idTUw&?g=+6r)aY;>A`c_n|-%2#Ps}kK42m zAiGX6pN4{F@#2N+y8{&L7X$@~kf5w$ERM{Gh$Su40`DIz8jbsS)sUY(Sm-FwfGsLVLf^%>tvvZ{E)5wTU2#<9n!0 zVh&1j&|%d}S1iPM5j^+<^iaHd7ojR_O+eF=g%)f)2>t;c^iUzSUIhO~-^_fcUuW{h zZ5qsXlbz|ZZDIG5?|W}{XVZSxw#FcTMmEZSvf93T)>1UJ2nC5wBNc;S6y&1XAKOvu zmu2Z6Sa|o*10)qUGpXj4QzmXy5fqjRKw+`)P5~4=6|@T3oz{|zAbs&M4@F#($_n8F zP7%g%8AdfKM6vtYW??0_(ypCL`n(>7Ih6)74dc^%0&W?ufHeaVkf8ea#3t(6&Cl_V z(1%k1iYxzw!j&J;!x#$b!YN{-D1b@70Se4EDy=*e@;c>1Ufq5uKR`tUMpBD#GK5l| znuW1gPVI$cw7`K(f>6*Pc_2)44eGf_nb;b?uIs9_f>VeM2CKL(A`}#m=)WCRIVhwT zI|Upfw2e?8x|L3J3MQKC?ja}e3LFW7;SbK7StRyrn{#r}UIh{+gNDJRAAMjVMne~9 zV3JAQ-V!1zduE5FoWa4xmXrUQ3;E89&CSj03KT8)#Aq}~pb$k+4Cxd~P9gi}pun6& zcnt#wtJ7Q7DVSykD(DnebI}763yuCsJhRpu7AYCrpazz<5;e~06sPr6l2HJHjt8RC z5I0nxsBVwTD#gKLWbhh6eeP@GOA5d3Wy zHl=W1Lv~Jg@-uGPH^&frbnd z_QN==Ut5jq-O6GCBoIAl6><5oHOfOFP9b7W0S@9$3`K8_3b#37!Wi55@Bxy1Nt(`H zD2`^c+41r5$>HJQ*H2cze?94fiL^3B8`UJ-x&rAS;2mv)$8{)BAd7E+NP~!jCgk_E zyA@Z+sCNf(PNAooEn&iHOAQ}AKoL6yJB4&2C_EPPP^?E#p!M;?MGtQk3KX;BuhZ$C zlK|nNxGzvpAwm-jqtzsCKg=80SycqbP6D{$Y7PO(n;LnDOB$kWJ0xyo7E@} zg@{nh83bYooPtzT@&*l>QBWAR@H+sCi>XegBG1HLfZ}JDmdooQ>YaM%u8Itk!a+>a ziX$1h1QfcfOsYP7MP&=8WbGGBpF!st_3Or5){}db22h=m3NAcha!ZJ zJwWm6Q8zyYAnz1r1ynRT1$}~I6oFF!kmX|sQ~cpTPT{Z?D#(R^u`OUYt9bW(=Ys&@ z_1ZCUJD7xsOsGylGO$AUh_ebxXM*VkjKWHZ9;Jt3>X{%E2*a|l3_%qVSO{FAbe;m1VN8TjY{&#MisJZj!_UM7 zxDYb_((n;ad{^ca0A%;sMf~$>oFZmI`Bs~t)s`w{T5bXb#I_+=JkJZD2)KCRv9w(6 zBBww@SAxRF4`?+E$vX8$ktFwctBBP4fr$vg`0GQv4X1bvLRG=&gA`^QXzU`NM90@U z#rj<|mQ_pGs8?pOqZt#RB9wDy&phw-j4}Z(%9)6r!m>;l1vTLm1yE3#bt;wU*CG)P zrZp(Of9F?2;_F|3{pA;$-u&T*C9xxh8*!mX6u)!hTr+}YQ{gp&eU(m8db74S2RKEw zkYv`YfC}WC&mew4G%C5QWFm5k*eIwCrw|1$l_Z@yCh{o-qp_Y;{QR?$@I7mfbbCjU zptZm&s3;kI#QUJeVBB7a1uykZVa{c4+N$4+6ZUGwmp4257}Vjz+XNK_gH zM~~nyVD6Xec6&$pm3D*!eo%o}5`a-1G2kav7c!z=x241>JezB`V6Mmr<}vG)B~5|A zC;rkZyXZT@;+c9PzyzSM=z#|InPoi9=Qk6Be04}FyIs-j{}77B}GTa zWLSkogc_Y5;}G?IWlmwgiXIq2GN%A(C~?b0*@P!iJ#>E`R}+U}t=e)L=sYZly7iljKqLg70z> zeg#k@>!Y}jckC264?opQo1WW!Uf^_4vsrDan@eCYBH92zx0;~J)UYv7J=tkF62Z%pA7tRxg0=7vroUg7UbfLFx& zx10hwL=hB9EAk+9ielaS5bNe!(`}J}Qtizw<=#~`oae-GQwysA4YoWH89$j;uET2| zArDcy0HcV9uD}P%vV?~prB>l%X=A6rwl#~fz(huCSMnc9Di0dED5|wi(SG{rr@#F2 zp_gC2b8(ewlPv{~sBJ_NsMz zW(94c`!ml7RiGi$XNfOp%MKe>2p@<5MYnY4-Gim=#pSb5E1*eEH>@Uw-iAmyeQvz=Ttu$h4ai zwG3|^wBqeAm6XO1BV%@vnce7lVWO!55uiky*ulav9I|0-G&GI>d}Ztv*%nSASdgrW zbv&95`EUO2M)UcAUhkyx8`f-65uFaRD9tN2AR=@M%`6Z`BAtv+2Pdlx;P!u1 zh;BR?j89L>W+qrjG4b108O3ueDBgUtpKO~^q>g(McHv_}kWZ*xNS)a!x(ClyPF9IX zK~4c4uoa9gL;%RUN^p8~t+d1{5IweViqfp&cs!m*Nuhjg_GU$#qO4P4Awx_2X1tW^ zrcYoLZxRtKGK=jK3hrfu1ib65w~<&VCbF%bV(!7Uw-3d}A*b+>f{Sq6X@`8v6plw@ zdnqxCqS=aOXyly&ghWo5hc=1Jg zu-sNw5u_B-lr8OY<3t~Z1?(V!dl(_Mz$tpYUWT~94eNbd5jCVXDI(w@3;ZRf;+_(( zU@$gGI^h%;nQCcFEFT}V;2H&406H9(F>*)Cgx3Y7K7NHb)EmY7Ld1*D(yDUVM!5v9 z?KDg&5Eyh7RLm|sC$>X2%^&1sJK$3hhN4Hxd{8J6LPw?G93dMCB1pi+Ht{6(3l`!@ z>-@ZhZ!1MZSDtieNz*a{z|ay|FUL=1+J>j}WJEHq{6=FXZ$JI?>rX$YBs@zJH1Ibe z>jfGtle7fEH%VN!t>Rs_lO&}-!HmI<=`(cqo-)zRe6NaS0E3Jc-G4}nG&4OnR_2|= z#~TbwbZly>Lc&v_{!t4?@HVwxI(hs_?)BpPolce_YCPH6ADqyh7L|iJ9~!XeQ211+ zHGh2GvVE{CL$O-shNQQM2{Hy`C_!f+FKi zCjw;ErnWn_P*cv~!y@AZn?_ZXTqO7==f(mTjnx`FCEaN$9~!*0mZR~E9{c+jqy3ZN zlI|Km9$w5&hm+-_gW<*L~oFBK2Pp7lVY%tt!T@06_>3B4MbT%GLCl{wDaq0rKhQmjL9UFf> zc>k@}Nl(A83?%N7m|#&Qa-hJA+t_e6Xr#KVi{08ofoUQ@p;Y+ZcZ@?&7$3$A$@wJ@ zh5AaEmcS?^{xB8z(v#-G2lJaiF-FhbzP1czQ+~|%hZCBcrsi*IvWnA zvjIba)6o_vCZ~X+$;X4&p?IH-;&mS`h>EjNmu?j!oUJ5kB=W#j&9?7u@Ibrj1y+24 zJ=nJ=J|Rw#Y41CQLm6QNsE|FjHauQ8)tJNGG`5-xTpLmO-&9a(~J53 z`Q&0Unv70PCXnYu?-39n+p;^gsVYn_FLK)@(0d%*oqj;Sy%u4p+cG6LWbrIhGb^zqROlL{tQ z2i6boiBUXq;H3Y#P&3FILbpmiLBm_cp;Up42~pAo71dK&+grzUQf~5diVmH*texdz zvFz+G=F9o962mXg;$$SQw8IYUGg!X4)+s37C=QM z@(&zL{05E|JvEs;wM?MxjN$_}3YK|7Q=<2%vNROrcEix2<2Kp3` z__I)j2h;L2(;f_kO5flvuR~8pmywXdaDae^VPRC|6>brOy%nZNv$;%mq~&zD*sTS% z7sKgb>nDp+M&bi93YJR~A)$lldg#uG3dX{8b=mF3NMrviG zJ&O!Jxjf7*Ufkuzg`VxL0eZy1==Gfm(J1tdRE95kw{SYOuS$IC`A-;G4yUsP{|PG+ z6;fg29uk+fS1Ob^h^zgJ*>t?EPx$*3-u>VM!a@fa*UZCVC^n0Tit9AOLWN-_Iu*TL zrEZghfZ`zM5B)=12n=DPcmDyatE(j!TtL|ByI4q2U==wo@WG^%i&)7vT3n1zX&QSs zn$S(av&Hrv;iP>11ES)Km#$b&h=|1@VQ-uB@19W5nb^t+}QiashT+H4pQJ_g60VSw0MSB#ujmhWI`o5OSW8Uct)9}^Wi`*5u|fD5jHMe>yzg+OuDceb#O zg8ynGq=t=y%DweYp@L&@J9dg#KIg=?oJ6M{DG_+tqNKtU8bv=xM>`FLw_@-O9ctY0 zZx{*0CSWq#Fmwb6sRb8*1U%TwDS*y4l+Ez>(A9y7o-pBF`GA@DR+zW~4ywp0%qV^% zB;Nb{vQJ_njEn**XhBD#-eNB{Ln!QLQ!TkBH+ajSK=cU59zi-mF@#SutKgyl3uMNC zBEFUf<;ZZ>32rq9iqAgbYkH&~5&E6AObJR7hQ0cd!UO_>^}R(2u!5h6VCG;FxW3I7 zkI5)VW)x}+EJxzDRHn8W#e1yR`himz759f!1loQ0@V^2Y$^}6oRD?{xyCS#f%4ud5 z#+ZdhK%q|z0*GG3gL?g*I7TddL7=Ru)Og=obfGo)f=PsZq#QV!C=d1mso;TC_oDML zPf3sPvsX}$q)fOE2njU`ns>leM>xc~Q3w>*X zR@hS}2ny~zmDXq~6qZ&5Gn;~fRH1l|OP&n(vqIF*N41<+fC^mkY4qt8>PH>P#=U5U z4r-{@2l`o`h;xzBuAbri4y3g@Mv?{uBEWPq+sh zoLgF<=Wx*1U}FUZAP58~M4+M~-Bgs1@`QsBaSlTXW+6Bz21l!Ffz$#O&4h0Q^h(2R zvlnckvbM4jKUGUaGc>B1AgNIZ6Cb%i&5R}Fz3SP`)q7XvGQO|n@2no69$i?lp^-TIpLp z-r;-K>1Npd!5+ttZPbGt>kBmso{XZ)TUF}!)hK>^gLPHdB}bkL-x0gU0!~p6MRoXq z{0tYJ+K=RrGa)qr6cHMXh4#K~M19rJEgbsUlG1f_d{ms3(?8Z?~U)6Q%>UO*9>%VGx z>}w(M-7jVoUyqFV3CDP|wKY+8{}qz9^w(oSu_Q1RfI|0bF|!YF>p zM)9?z7nCC=Jg}O4&yC{7p!ha!*JhQae@^a_37{APikZY^fTlqK7j_MULdmIETojE@ z7sx9$D4Z_rq7q!R@UVhY;He8_%v-GB(HsX9z@nmpQ(6+kUbQ=Y5Rp~h5jX&+-~A%} z_H~w=;zO7)K|~mZbou1T<>iyF?B2DsEJG4hFeYnZ;raHR)n1^OZ4glO)ispdlR!e7 zQ;|=(E=Qt3;aEV$HY{>U7ScpS;%R0vqC`a=>s*s&(XIwwk1(v!3}?~B#6cV7L@3Ty zMxno=dh@mG3%mlSD0=U^Fp5j*2lLjpmZQfs#-dh=#%d>x99m5uJD~`LQ;fg>M$gUG zr0PWY&oZFED%w=c-k%AIk!B4vO2!0Yc9AzmoX6hSh*l2e9F6lfgi9#Iy4(cz$kEvSuu*omsu|{ipB)8?i5K|6&RniVQ(t?DyJA+%Pmk0W2eBbU<^za zl6P&N&_Lhj6lkd_T4A$h7Ey6@vji-oD0cFuOd%#0CIcvF9NOl>F4y1s7e{z$Oc)lv ze*EH;)ur(;i#ONrKQks?853`|8^ux*6|UxDlh&lXt$JsB`aqe91!hrsj|I30Du7}c z0lhy+Tb%;UViOs~KNJrVZ_e9$=~7iFw!{MSNcxz+M?8J`n~1o%x%u_Y6W0%4t$mdd z3&!u=D1N=XlvjK{L)^rXm_PcApW%x}ZT z+uA5d*7sEYLBm139HbVHLL@ikbYB&WBagbB&2Su;o;vzO0MQ2wE6am80wp_Htp};FzV5qDF8ejttvEiu1 zh$Cj9g9L7?bGLqK`L@`NLYprdUjBCD5*4OzKbx6JI1LI?7{$%wtj~2jK>?2#Yi&pl zTvHIb>d-x*ka~XpQlknBEHTGdIYvBO!ZM)P@kXwIVNr>5p?p92ldYf#B8LLe5SW5Q zXjZ-%_VC%QtRn02<&(>-pS}_jg2AK7jp9#Z;?0@ea42?v^9mbF1+Z{T_G7~w!ea^h$vf|(@H4Kr08w=M z^7YNla|K~xdh@w|{<3>e8O3e6fm@Y^vG4^&!hWse>fY1GqIZ)J5~tT^3(l4|i~`|% zP*GxZ+3PDddjg@r3YijwpCfjX+d%I*RqV?{T$2P8njA0+E6OY~6q2YgefwGPFg6O) zXTxqPlHYBFFRW6kL+u~*st?_F`mimXot<8oz>|wZ)_aN2Op)o(&2y(uM24V4iI?`V zj5aXrJ5(S66ruoO7SByG3tvpW^v`IkHR(*s5J~BCFAZU*1Ci8FTwTEJwDKi#C6SbS<+mJ+4lsms&N!Y;l&9Tv)YZN85Z z*5P@2KUpnoBcisu6zEY?*sR53+4y47&Em?iFuk_nUtkoEvR-o^p`t<}-{RqZ1Qco3 zRyY41Afzv)c>@Rw#VC?u+GKuw#*OJ?KP*5ZNbqO@9PSng&RD>!d7x>bID>@BES^hO zSI-|g6~Er5!B-TfN2ZrU$b2AeT1@nP?C*wq(K{MMhhjP7ZBr>Ko}5900U>?bf}&IG z?4na~3aFqI<~R71%7V42RF%O(4N-_CsE-?n5D)xsD%{7JYkLGpX#23G*-U03B(5Bb zJX!p9ty>UA@yd-N4I`xri9DMtQRupbKZNLxpy;~%Q_`|h<|BO{JOIR}pMLppKJPXm zVH$erNC*^p(V&Q;qb}K6lTR;OsYnr`rsyR)MDEjjK|-ZA721gzu#>%U>{6+=@(Ls5biY8@8otm2ZYd0EiuEGqJ+W#P`$UJkDr0K0=>5%mNg19bd;XSEF_tQ z>E`yrjp7dx@$~6U3dfD4AA$;y=oBm;LDAhY6g^NN5djcRgquW%V8P^9+bO24IttW5 ze4|tBLq>v+9B5@E8MyZwPddc3JJe1^vI1g}w;41P9*}0v?&9_;%)<5BUtC>1&AP>N zrP0kCI!7YFP((YJ=o-~F6g^Nt#E(t_JY+rmpzlykM5tS&t?Gaxm}odff($Rvv3h(% z5K*@`#6j(SJH($2#8*D>P^t>bk}V#ey}G(OS9mIOkUd=ek&VKbcz)sQvf6f!hGG&! zBv14Nz03nxH{6O;Ni`gH+?WDt;eLwrKJ{yjr+E-Z|Sr+;7+BP0~V zDjW$!50`^bip4wNByU!dB5fS11DQSw5f6g`^ofXgIO(~ZVT7n(I&4`$*vlGo8y+5hnKYMj}85CU0+hg`)ZESMYw)UjhoJJd!0fY_Dd zU8}MH1P-E_R&k+_GuE5Kc%W%xpfMI~fiQB700~BF4^b8=hxliy@Q4!+j>F8#C$pph z^~Y+O&Ek*q7X^#+9M69*<_;5C;ld$CK;cdW6fu1y5g`H`3EKjXhx5s#N1)MppgQ0a z+ti1!3WUZ^p^C*yX~YYwPR!m4j3_-29iRwA*t38^I$5h)x?xfNVxUmqKop-iITI98 z4CTdbHj5XAMULl6uQLwFSM950@ThQaIN%hWLGj>|pMU=Olb^vNXAkC6jUrGC3OGY8 zIbAAJk$^hjG8q=r9FsW)LQVyLaau~HVUrP1!Bl9&3M}9{Y~H#uCAh-GQXzGaRhYU0 zMGnS-9HLZC{3B&ZW+A6|VOUr^f8DKV%_Iiy^F0cum?j}1D3F;%k_3f*(mS|5s^(I zpqLmIid)si;46AYfD9lqTQtQdrWy$r93wa!2?m7HkyF7c!^a*sp_2CzqR|N&*hwfT zDx`?8Sdb7Df*?oBESP|z<6+2V@d7MfO}knkfx7z=PT|wX@_``{R6O`#o{CPOVH+4j zF$WOXW)vWiH5C>h(b5V5CK1K8QdE+n4W|2o1uI%}R1rI(RKJLbgdYZwssKey71~Bx z;uMM@nZ+Lkix;;#L9LZHcW%u?ZkykyRp1n9?na@AN#GR6Hkf7eOfl*j)u~Z1vWVQ4 ztR9=n9aNc#B8;Mqgej@yv1E#@M!g+>_h&qw{?UsvvLW}8JYi$~;^&RC2bTOeSLaa7 zFbd%zMuG{0LSak=X7TExtK|LE9g{E|6z@?$k$nF6=mA6kh15&OC4mf)%jl1t0wFu3 zZG(fN6q%AWO;=f}iD7)0Yk0&NW9mu45*582Cx}DiEKN)kHUA9^0g+JoL^@e^I0cWy z#k1SnXVP_tP@f~ytsQpnYl^Nwk*z}0#tI4KJ>$vlqv&tTrjk>jf^Aj{B2pDIUtuna z4Gk29g~gppjV6dm!3@Tt4Qm)B9K2&LbAiMP3Y2L`ip#Y%1)7?=jhg#Sm*UuaHwv8M zIFIDRFo{|?fe$+nl)*w4mIfpNp1_UGrD8)vle)?-$+E-xQ59=^kmQ>3cz3$md z(R+Mge~(xI#UzFu0w_$WBzBdNr&PrnmdUYwkO7K=#Or*r;c!idyHi{X>bu}Uq2vfC z_WAw8mdDBsv5yRGukP6wrx*`81#fk8fDx7O0t@3fwu=b;#8lQK-N71SQz}_`AMcnp z8_?lhR+lvX4ofVUHAKh}5h*Zv&Vs8L;@koc8>8~%IO4AsOWpAfJ7;pu08a-pJAUbs{V6Ts3K@+>?3a; z8cuO6C`^D5G%#6sLLQZ7s5H09qoU&OG;9z^blcF_YB-%8M|F$xl3frWDp`48=sY4gm!SD5*^#t#H^=b6Ze26vySBfcjm-fp@GP z>FId7@q(JWs7%#E)%wtBI8nD#@kz7bV4+gaqN*vz@ZV9MKC;~E0f0q>SBPWV*lHB> z65J;O3T_IpJ0Wks>}CH}`3JE75CKxxf?}i*9HTf_3J^Q(f#T%dV`;(!GTC@(Z#5ac zDYfJ_+__y&`W!s|*8~(}43KJwj}uB;D3D_n@`(`?iU?NUW-fZ(1Fi`JP4NOR?!tVM zW5HwI|3~!B#1$M&t8Xu=*@AL|29Ti5e1hqN?@-YH0Si-CAu*x@DtsnYlIi%*5HW%x zW(^jbwpC033IMDd16V|xd;%!23T^W?7jGRKeP|;Qd{11cKyfoHujv@IvX?fr`%r{8 zwV*hTp-yBtMP(8&Q5c{^rC?!9yeq4K341tp`=xR5);LFBG=BM8NC+P`bz>xgi@9Pf zGbl{#KE?1lHqk11g&6txP|1oV_%4HmL%r2|0)-DcL{Mr7ORzwRnjbZj5}iTAN~wvvZ`L5lhaY5lnt4G~^Lq@lyX?J5)@ow|`P17AjEf8!qls zJmEBkyuB9P!hr}tHaa$#>fI^i?tA{fPo$Or3Q)$dXs z)xX;}m+a_iAPV;id=BT}iAH$XBexkjtbm0uWhv~LTMy;KRus289SD#sSt>pJtj{H< z`S~G(tZDzI5iI=2yuR$uLXJuW3AeNkj^uK4obe%)ma0vlpyIRRj0}&*|Cr%t)>FSd#@+GI5NtG9 zbhV2VfPsgb_`!7Gpbxb6v)Gm8<5AtVfMg}xe*+wWO6Jkq9Wb^<(|W z?PLuPM3Ts9-kO;5scJ3&ATm_60*QEJW*8PcAP*b=yadH6Du&xVNFaE?M1h2diI$3E z!GntAynaG!bCVDfrlhiF6^|=^7TDz`#aVB80r>}1)w)7O@3~=Xzcs@tXxPKLdQ$$I zb+I_nfdZOQd@LME^pE3^T2b-4d{6|96ssWXX@&^gc-uOaMYR|H`TKp7RcQNbFs^6a z>S|upjot_ew>xybmRGIl8ZQ!LplcMLq00&s4b@o$4BqP8q~Cnx{FZ=;;r0HcE%}Fc z*39ir%>Z$uqk8M=1NKg52vK3=_~wa5Omm-KIZ~dT3JZw_FC@WVM8zpxZ$DkjIF>zlq;>Sf#2A6+Y9rf0_~k`sr}7AuhPOOm4I zhN5Cy?}6gSMBtSJOUmew3_Yr~jKf&QG7s}B5_wnfF6E_Xk-n8lFi5*5%k0nX;!d7{ z8(}hp8#$V)+QSL3@)BNII8?C|nx@IAxRNkCDHf4woTRZ#N(~#111Cdz%-SFZS@S2` zq5&R9Pz*|}6)G&>sjCHComS2tO>+=24iPO%K^ZDUDVM&ghswt5>y{2e#S>z%>3US9 zb0*wSYMQFOq+xYgmStLu2&D;kFEvVNlI2aZf!eEb>S*z!-leN;QK-y^TU5B>m((m( zcc5@8e!RV-?cnQsWIisU!8Odqi0~lc9iORc)zwku3I6 z;Zr3%;b5#S85a$jhsN{KF0IZ&{X zdCEQXSnS1mO~ngIwYjf8Vm!%IuS#x8wQ|!ZBbqrfl_lJ9s5rl0Lm2l;`@T%`bdQ## zp*GE^$n=6sP~rLu5M>)FiUZ-!3=hkUG{~0kt;>7Wl99=sKTJN2wEBJ?KnjYuax;4XAg0FXlrt*_>R@{89A>cMMy6AGi9*%#h`@pr`9MiU+)7wV zlHZ*&QY@}itefv|ppYy^*p?2inMN8j6F>okRy&G#@NX>@XIvju3%C2oiZrYa_qkDh zUwu8jx|laQr^sM5uz(}$aZ|k?(+g?&7#5k8Fixr@<7MX!ekj`@kx-ODGh*S0coA&m z=OPZz+Ir~(oUt+!*P$F-nCazxP@pNqs3Y+jd;E_oYfsWK3CnvuG}C>= ziif2G5GSZlqk%^@V60X3)6-6nsZX2JffG=E%4ean z7a^9DSO7+Y#FP~oA>vo^upy%lL}_sFx@LW&8*0%8OKV~o~31_u^l zGKLiAVw&T`f+JRpp?pjbk~q`~I9g1UN%S+)NpE&GDrX|a`6UD(sCJNbkl=bTO&MM@ z!^8#(0*2d{AVRq>81du5h>{Ut{f3F`R|m@8YxVRc)Mp}>9TiJ$+f6aygaBj7-zQXC z5v5Yr)rZNbYf%=q(>5(}4<0jlnTmQB-g)J9Afcf8{E6 zR{DFjU_QjuIu#WSUE3f&PqS;e-mPRLaw?88O{#Us(Tq3?4=rQDf%3gpjf@K4fPx?) zW864?&W{JaJ9mV5ps0S`dOFXJqHn03O%RDOD>y_mbJ*1D>cyR|zS@@7=gZKLALCbl zX=+@5LdCEsb1dAW7ls9apw&RVvBI^=xE(mEabY-iVRE={_QPd=k$9StqgLo+|P|>SFb{=%+(tdT^-FBcJ6T=lxkhxe?%M z>shsr`)E1Xl{S0U^23g12hov=dD77Ih zr)188$m&)H_}xQp9)3Xz4<(OH)d|3;N}9if2m%iwqE_;t%^*bQ-qE)4&n{N>UWJeR3^cC}Ti{lU6)lJYC;Ve1eKA!bHY-Ljo#ZUS1R~ihiOh zDK(V%;Zd7+?mAX0e0S5RRL19H@eRe3rO+@G6?6U*B;Q<<@qnC*Wihu;!a-R@Cd-o> zsxv9q6o+vvaupe#tc2q5xJ;r+b?034gk8UmM(RmZ}F-gNp!mfE#cfub9eYB&0^U55d< z0Z0DcuC?flw!2oyh&M5>Ht=hm*!E-AibBFhyQf#6!HF>2TzC%_Eh4{>y$Kb3Z{GR% z(Sg$iMPD5B-=+pX6}HjW8O&yizB7+tMnc2L0Ev#w*V>L0)0FFeQ1J`_#eY=Co*X{s zJ(%aA@}MjrY2cx z6O*NvIikg+1P^W?)`+xRY12`Z=Wi(fH8Lc$Wwn*BBmnTvRN>(eW?fqpe$|`mX$oxFdT{PXYWaW1M+Q*>8=!sn!W8pou>+xCV<6Xzc z&#HXSS@HU@-l2m3xy1}jHRzd>3ApIojbFXe-JZMr@~v;}bou!U>DMSQDSp-F$+Ozg z@~Ul1(R#Nn9kov#ue~0wH%jgYQw8_`HT0#Rh^NBC+O{#?Xv54=``5OubkIIJ{_*wo e@8|2lQ1vG(gBQr1xX^F_0000 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 N002ovPDHLkV1l?AYCr%0 literal 0 HcmV?d00001 diff --git a/src/assets/images/header.jpg b/src/assets/images/header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..977584b6877cf4abc6c3e3a3d51bfbb0d474da74 GIT binary patch literal 16880 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 K^riIu-2VXLS6svZ literal 0 HcmV?d00001 diff --git a/src/assets/images/link.png b/src/assets/images/link.png new file mode 100644 index 0000000000000000000000000000000000000000..4a0319cc0a29299d0fc76fe8dfea10c53a484cff GIT binary patch literal 4211 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/nodata.png b/src/assets/images/nodata.png new file mode 100644 index 0000000000000000000000000000000000000000..2cebdb380f5c1aba7e0acab147563d2352e0917c GIT binary patch literal 101556 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 z�XmFaOi+!IwI#2AFq*c>>?F7YZuR`%x(zpU>#;?f0^=9~EdpDy$-sd7b+2NR>4yaz zWGCgMJ3dkKQ}&hUciipp_}ol(CyGN+D7+$_sOAUuA2K~Jyb=yDMojBOw-!cypPmdi zi^}sd>*bY52^3=gq*fJu-o!)C^;GyxXe#wf#t4Ulo2Ae-BWg6XKzTLB1Ruq4I;{}I z;-FE8PI^=0B_TZEX&&z^Sl-`5L68G43TvS`=>i8|?0ODgqTN^cDs4g!Nk$_N;#*#S zFUeYPd|Fbo=UbB!m_c))vm;MM`NS-&2n0_JV@k!vv4!5@_LL}FBX+^$@rQ~vON4R> zDk(HsZE1HNl8}FDJ#`b`Il{-XQRC5HdRJh>`MW5ULWn69R4gyALt5j&4j)D8PN6un zd#g1q<<74=1-bBAbpSu%WUHB<@#T` z=b080N)xlOgO`PFl7iRmqg)Ry!%6L{Pu}D69v|xkoCK$S(Tl5$bG#u+0jmKl8d&TI z5%QtR+U^~&GkUidzXLDeJB|8(=s?K^mH!X1QP0y&oGEY!FO?{8eI1HDhMf&#<_&Tg zVTZjS;IO`ZI|O|%cn~)Bl@vDB6p@j`NOK2TXFw4Nv9u3~HzB-c0ArKpoWBUZ%tm94 zQJooBBPrLZ(hUX~7sVfXxPT#rqfae7vbhNt1wbXZaVEO@u_c}E@Nn$rJ-dB(q9??d ze*kozknC-_>FvwlAFm<#>UqaS>1Y$>qrs#3+)J$*f4gLE;5$38vrlCtXVyrHk%YT< zVFxkd{vn7}h{Tbpe3vI0fj%ivVE$EfZG<}#=h|}hh*A>>z~s#M@9CP9f5$aBumfoj zdM~|~&NGX#jm%U0KFNQD^OUDq4HX+k61{zICgYC#ozI@M|2URv48R2fT65NH+509~ z40bQ;mO#e8K>}_S=lqU$NYAnc!2mmrtd1^ey%o!+Zcp~t1-JV75!2FuJuDr4dd3hh zM!Pf)sSJS908;{n6*$%7#(5NiU*Kv3Tq62B$#E^(H@K!S(@bt9K)!48LCS2dM)y+R zRA^Q-uTnnHM{IM(+WAp+gYy6=pB*6&VvyqO5Vy?d9MeJk1}Pi$%3zNY%0nWZlhB(D z%=)I|t2N2>b*6o}i~xM+HeddAwP?{uvNuHc8>%#-=HYz0s`dfS(S6@Y?*7SAEr^Oz^5+h~AJ+xC_I#gsqTO{A}mF^q@_WVN`dm@*s9%*7h zKL`}RzPa8zp5ZWg?Py$<9GE}k^`2(XE~ziIh^c=3O8KkF@2@8srSY8$;-6QmURpY( za?JJw{(SPH9qNT}kp$x3nM%nxHupg!{Dr13z9tGSIbM^l%sK0$DkG?yQ75s z$yw4D3AN=Sr6m|Fly{Q4an6o$_@)tFOe%Q2tz88eUxD_#SPH-w09!OKTf{t5 zLDz8!Ss^(C2{<;z7(asF+A&5h@4j#E^BSuz>t*oWiR$TrN*Ai=nz3&d2Rkevr30y# zjf8kCUF=m=RM!7-0sQ$x_QV#YHZ(%NXy3?(XFwuAVp&3)=e{6yv`{28r5MP>2rO6P zoGg!mG5yIzPzI++d6X04y z^ZCKsulW{a*qI~tOlST(o48vd^+eR;pFtx?M4~~-32=!ZOjCRkHJNcNCAf!%;r?M1 zhy%e72*ZsIK|fP8Bz~E1wt8k& zCe~e&+qkCD;n0n!7mTJNEkwx}BWwP~KMIcF=8pVlHQgS}WWO|8&G4jm8|(Zf-ETZA z)Mc#E4;NL6KveNB0C(d>lR?e#$kst@_z;b4{=u6+MS<9A5$Zieh8cH2Q4l~?Wqv^9ar~5#p zyHAp~xLD!UdLgH7Z5_LLu zy3vg=9QCf9IqT9t zG>XH+K5FGbNe!!qI@MIcZ$gwIL<3?E*X5m6cZ`rfzx%^S9iqb_Bsv)8o-S4U96!lfX z2&$8MZ@}a;G;F%PjcTq+nA_M~{;^s~iLJ1Ua>WH-Oyoy3SNDcLL)56$7=n3&;JhYm z4o#cx>_B)e;3AohidgH0+HMuO<GOI1rOS8#WID?c~{@B?4yrRN%`;HD1KNtV!3!~wJn?C$yYN{z6 z9UAbV(848Akb$%iXDSGUB{;9L|K7@aXd@z~K~E|U%=g-zAU71{(sm%J zHnR(J6FMVWF?pRbSAqWps9I222b>>+H*m}#r-J0iXTf&w6n19S;ndebNvWP_XqU2{e5%phujJ!XV39#L;VCo10HPp~nq(VR4adNf0CUx=K`Pe`6?^AHg@HH7`s7?Uq#%06jp~8g9Z0qO-q6;&Nq{tjG#zAWUVBREWUL zG0<^ARv!ohuAq4|a%bo^ZOvUZTOXK?v6eZ}_)|(}=um1I17_$^MbS_^#1YO8^t<1N zLt%6b$IC(4AI4i!r!+4cAG*X-q^;x?k|F2i7^Zmoewms-yhP_3WY|}P8790!D94g? zR6q8mstlB}AWA;KYm&GG87BBBw%p?7Wd-MRV}}HS!)Luw%@GwquQD{uEk21+yD#6X zmwW;yo*86RX%dJyF$w=kMrY8!0a{sP-W$?J8*$}4S%VNqR>(R85Cr(T+SsKW|6I^{ zXgwpzQf_Ey_No1jQF39284IUdzalJ|@P-OrvXr*my6oC12m(-KK}`b>(aYMFykKFq zg%)}SOFDg1KqLEKQv`Si0WA*~>NVQse#;7KwDkdJ2>gT^1H5vwBJz+APHL|4yNv%W z_}Hf>4}cB|CUjdK7y_%fCE*G?ry7&#nO7#psxu6^YMgeugD~+jg64;?4=l3Dr`CY4 zim{kyLXMVPGq7$ut1sr)Ug0;-Qf<|B#N6T;58ct%?@l^D23z6RihjkXhBq_>4-EZg z=!1_hSA{EunBu%{7W#>F11ae1+H5c4m%u3<)-aZY!Z+XOzKb^-XnIU8gYq}{RlYmn zeA)pPzk0LY6c9tVVm+MP2M)hKMm!1A@c1 z2%iFdeeebR5nZFO4n*i`JlRof3(JH#wmr}&8J;wNPC%@bu1QFyOWnjS1i_1f;Z5MX zkqGtVsHF4Q&}OgDtA-mFZzNQylc|kmz0NV&C*Q9#4_vx%Wt)W@By=IV0{R2b2N({3 z@H(V%a|wzjLi!0RUwJ~{h(LAu$b+6(U&W&n%7|8 zblpdwj%U>vM(Lt=byR6~o4@-e5_98@L%!ZkawI?O(>-v9?m3kR6;+(?VW_*Qbo^0q z(b2hyUTD(8fDw3Fn8?o)`Zz}fRTzjGP=~{hs-6vA_1MD)UCZ(FIb(vAuRxG0-j)qPJAv>7Sq4*u@N7<{tNnE_c*F^Rvip&d;#npXIkdL+*+!_L zYUxpq<>aQqWZ+KXXz0K)lzQ6OM-14(96(wJJZnO zlaa^$*m1d;5pSN~j&FeNYlXrH2Oo&w(>;kFIgJ`r?_ln#vxXt-(*TaX{}vVf8+-q4 z%Ex>1K;#C-T=(~Z=+|FLPUsE-h(Fkxw{}j*8EPk6q^E#AKo67N;{)jnH$Kt0ix z4F+0}Sx2>QPb_Np0pnSL85Th14J`|J z;`l5nw-t^1;)h;A3r|84ng5w^hWr_3v5k^7MEUg#v>UpBRt&iL@d{yYE;n=Yv>fc5 zl$!BZ{z(vUVFLB=xR^dB^0#{7&uZ6@<4bb+s@Tvb?yZw*+f~tfgA~yL{)`1hV_KwL zo8lCYrez=mk^k0e@zKLTMgbBK;pEYkhIQHLaIEJZ!t^zm}Hf5_P2{O8K+D2p*M;PMMHnNj-`NV$$% z6%|R0EO5S|6av7l3#rq`F*{^`OT=pMS1Pc=Xp^zuLPkRW2vBl(DfS46v3`#lWb+CUh;YB%c8DfH04&%7rZ` z&?Gvm+9&tS&2MyPXJh%*9B)drf6vJBt**{^Pa7ECK?EBiQ6T8fYn{Md*z{3=J_RD- zqVD%OHUvcQfy5>BB5KE=cZu$I#wK^>sAmLNU;w;9d%= z-tUoGLVajMoo5E9A!`=q3Zc6JvC~~=b5|iND+`tcvF)Gy_QGd&UEvZl701kIf;%(^ z|22fb`63dVg)!PaJgJhBFscWvc*yemp7uo7hM}%N>ij?Yja*5_Ti_Ag$dG{-u*5DKtCy>zxo>k6-KaZ#$DMVVG}?iWv$l2? zDk2mo#gc5SHC}mlUy+-eJNod&%hLU1FBPybYJ{#s#&YoCQ%$i{b(xjcntJA#cD>vH zQ6u(Xx>JwJs={IH5XIVm3nl<;<6x8%rY#^Zf$9?yI%p7K$Ota>)-VMR8{X zv+2PyqMV%fywnl056J8xP{XJdbUq=%DOZmzK?4{ND?o-|DeFiK^HFptty@WDiKrWQ zQ)45Hq~!@k=0|fYBukM%Wx$pB&>v<_pfsGz4dReqhba^ClnX*@LSm|y_k<+$Iox&Nd%L@-0kt+tMgi&vc{~t!0h+oaEteJ!dC=;xEPsF2 zy6ewv1~)NaHjS#yG@V?Y4*a{84Mp{PPs>?Lz(pV}$9q?uy~t^Wv#BgO1>iW`^(m5V z3F6wlFlvQwpiznDs8$uHIjl+MTpbe2tq}lT_x9v~gkF;;dM#qtRLT-gut- z5Sc^vR2Tbn2waecp1iuo9>uV`(dFpDc@!W+G#PY?C%3?Xfo4D&GAs#@CA1GgV-VaH2k*>y|1aw88$>B6^sC282m%hX2{PvZdjUfHl#HUW(wsg(+HMPo zH;>N_$BgR-?IN=P2r4f}6?9#iAnYc_=37wWRS<6Ql(+yIZD60D?5vHiw1pyRh@|cc zv`k=+EWjVXEO^fC*Ht#syY+;tsHpb9paeLy+3f^hl}Yo$Oi14NJcg~f1&@L`*BO#n zdY9kR{ao;BKpJG+iRZC=>}6e5mMzRC!%!b&&BF9EG*!Sa0++$K1nTRL;=t$!JQDyj zppUoOOG=0eq0Fn6P$@~;Kp*j*jC}AyL>s&rzm^pzn@=V*pn#0LA26vyc{?r4+8Ded zJyP1Ex4Y&RY0TO*e8IwJ@;6$@SIGB@zYYx^`x#M&a*3A*;!pgP}l(3Z|xT zz3vdFtz|QDH1GIwXG(;nLNd+*vg43u1#68;7xEcOjafm)6zT$?(C=mWJ9jOEulUz7 zL2ri+_rS`EPk)FokoyW-)5Pr2|8&f$%?Ufm!+#4Q9mHBAU@6zrQjmp?%BKWbO!nER zEI%O6Fy$G^5*5C^=R^X}AB zRR6RoSBLohREbzUXWx0v^1{OkRdRrRqAa4Mde>ZKICZqO=*j;qAN+Mebgcl)m_AN^ z=x6Oi!BLd%|fe=iT^gsT=fOFUvsm=$-ac2o?TlYhz=7v3-u88 zp?tLa{QaBj8^Ei9xxT&tij{76AoGh<`fB2JKU~lY&4+DaqI?aS&tTxXgHPr)p_t9q zZdPxZgoVmK?pCQBmQkEs-@%JfE1bAEB(dxAvE?-2?nsL%#E*BvnHVklSXg-K4yyV1 zUX9gh(A$VEdxY$-1B42iW^jD6W|4BR6`8Q5C%2P)xlr$FMhxdj)cxw6b-pyjk9@!m z#~15)23A-DRn-o!k5LoQR%tu$mf2ZfO7!1OA43|DtL%usT0Jz^U!Y&xJvUHas%L2U z;?>H~ewWi}HnZAx0ss+E%Ky_a`7{SZL_j+wAk(AnzF%eR^^QJbTuqo;8}u||B0G7g zZlLfuXL9I}!+jWB|6bZJZD^yy^ z7cQew%0oyUVLJ)0l!Pr~dBVAN1SuMCe11_Z!KAN z33>JpnaGmt_&8NLF^}4kXs5^73u{I_6qHmah!2{Y=MQ*P$A?l+{r}r(NmyR0pU0bf zxwTh8(>|5Vt;CvBEhwJs5|zC75*RJu7r<}lPn)fyWcX5wXo98cK!tsNBP4@jfXtTq zIPPZTFjn;Ba@Qc1_<;HK;wF=3dDmkeP9X=$ksq5Wk;cR<&cI4) zNIdd{t|Wg?5E@wW(iI3bMLB+(W>h^kcDv;C%+q~!YNdZ*CUm!6j{q2xc8!bRYGdRj ziB&s#`e&a0a&-4rkPDva@NQ?^z>t7lb~es#c(N#G#ofVi|4)PCQ*(~>$`h#fwz*>w z9wrgB;vUY4FO4eR3u*cPr~_O1Eo^R z2`@fx@~l}lL14B5X&DHm)=+vQWg9HyLqtJf)rKW28492{5+ld7+@E-97c{)-5FD&6iXevA&}GUu zQy!EA<}*~n0Bb@a*Qz{fTzRIz#2;YeIMF-yHnbGYy4(zh@Tyn+m5l#9O2+Q{*99&$ z0$H!NLv@aR>q+gh4cDrCul#>-Kg+uJNddG9M;rlB)C|0d>B=)K|-_7fwGA`!dCeO(W40 z>lp03HYn<7Xb38$gE*mum>Fx$xpMT0ovn?XX>Zt52{;x27ZB&5KV@6;Y6*@>GieGz z4BhZ5c|tywo$RZSl!Y5EXyKLc0sq+yY+PAjZ}Rw2etw zHN1DwW*<5KxMP3~DC!Gv7}$@p2Ia3=$O+C!PbDUKF|f6Wmhk&<*4W&vR49D;jlc=* zXy7+Nd}J5MQ#WCzKCB9n8u8(#7_VcsT=K+)jVp$a>xP+4)~cezD#!4PnTA|{gr~sl z!5q>*y|)1+Ov}i4NW}m;>9QdMsR&nGM=TvJzVxs^_gIPds@@RYQgb}BG@;GVFjT(x zQ^-@1?r0{J$rSTI+svU~vOv@b!y@`9XW-T_Y8qCd<8gEeUzCX3JdhwokIfBPJiO@F%-$7jXwzASca|gop^l1FV7btdPb1{-$Z=uh8 zXK`(~XE;6%7Zhm^mTgYq9qFiY)HgB+`?jY-APSjxrSB+bBZ}f5_VmTi=9)R|)QwC| zkE){UZ2ujc0k11nH1X?(< z)y4^=f?()0gr4xGQ*5p(TqR`uq)W+tKr5@_GzG%A8%|!5@s*%LP5*|62m~E1ZD5w5 z$q?d)XxC0&zv#*8E4dmqqfDm5I1O~2C+RXC-?aD)mC^f*+vkFto9Ny)hD=#nRf5q%<-8R>@4+tQEX4BAdCzTo#?-^e!!5W@)`c+yv)Z zcZrWuKy5^cG&Wm@_gHZ<$pK}C+uHs6|BX(##z3J82Bk@aqf6?pA(I|NL_`d5NFd~Z zXv~oZ_eWx?R8*H3;-J}PU#?u^H6NkAx>g;B;~bq$^AmNGF0H zAv9ExEcTSjvi>N`0HeAf9o_u#vW1;zw@lo1+v{Ni8a#BligzcO^pSG+Nw9tSjVFq` zP-UN?u{f@eiekq9_n>FPfx6}Mpu+kx+Q&c9^HR^3`qG#+yyC^6qL(fZqbHqq=juyA zGOiwWoq&JJ))os>kILBDo{s}h62L{eeJY37O4^$b$Va;9@@<@kr_tZ1rOX}?J^ep- zpH}z-AOr*;XjKdkJmtMOh{;w81kr=HP!(FLpT7P7+I#bGsN3*;cv_?_38P(zxUtw z{r@|MqdHXPGxvSn*L9xfb>8>=V0<8EuLLF3IKP0gYpaj`6`g0}4xiQ&Ag-!C3yQae z&79?K{s?m9tus%YZ+`OaN-2%*ISfGT_@7TNQnUMK=RJ|XefpJJ;?${vD*Dm*Dk;D4 z#}-{b>0rn}Hsu4AfUVBD_Y#Azc7@(qKhHywvXM@!dYfBFByympS=SOY^7$|X#r(Snt zSIf20>m!Wf^@GVFhb_GwCn#24(WF4ZEhta1)E%f`jy%Q@Cp_ze#j%``IYQ^8Onh@$ z*vBmOF;|e>2OS&do=DhMa>CiNa6A1^pZ<_E>pU~khY!<@6u3=lpU2m)UvD`&*3k#v zI&QN_4%;bsu&<}oi~u(Vz$w$e$bS7jf76&wY&+lbLBq%B1oLtmefTLD-le8oD+O+m zc8?w|5woOk_>FRoI)Z4d;x<&Z#Uo+Vyuk9kD=92?lX~Posz(~&>{L%FaRt{~fi+q4 zV*zU!9pAi2?WBH>fZxV;T*q>K;5P1x_EPhF8>8ZWlj8oauV0@srOG-d%NC+vUDJWa z82vagJUu{uQz=1#IsBb)lQeur)9D@q$%>-N9ZiOf=sS`^6;Dc(yx}pfB(JBCCBvZ zU-yKb)E)6?@mq$I53DgJ+rE)D<*bAzyuQp|dbds?q{q;_cwI}W^5;v=k4<$G@`;&Y zICmm@rg>uN^G_dH!6?s~51W;~8Z0~)<*@SWM6)P zui23|m?Qg@v1iuQ)l?71qiW1WAlzy!-D@RnY2{$VO=z8nSgEkCK}SU@DRjlBTx6yk zjzDL%B&i;a{KvLB*fLtD-qZrFNix?T@hnw7eR^`M1lOevj6$=|CQ0yh&4jX>@MDc% zT~BvO##@`zDRwz1-lld~<-K5rlrA)F3hrf&aH_pvGd-!M$3D!LMqALs*f&ic$K`S_ ziQGHkB7mCxGkd1d>r&lUYV#(-DfYu};(H7w%VqE-X;%)t{NmdAUT;_Ec{qjE%F60` zL9ek;_!NVwwfDM?9YcK~NRbW?6KZg5H`Pq|a-&yG^4{xiS+$MtjwbWyR=r^^7$8mK#mu`dp(!~9(9_b_vEa>};^9^!vv1rO(a3p5d@ z=oRlXGi~dQ;-_`%GC!~W6FsoQh2pz8_km6++>>K=&pEYWaj}S5&G!13L)ySeZ;Ep% zAC{IjJtk(q}I9(o97DXXW@~y{duHl`RyA9{+OfT(V_Gp z&x{Aj6!A~1>=^?k*vku%hkPYmsqpz336BB5jO(sP)D>8SU0u)9WPBK33I-h7!yu-G z3}yIjP-sffCZ$&=JvE?mCJ-&vlx+nAz>vmUoQDg14R0ICCJe6Z5y?*EK5E7#iSLc) z-g?Q_UAW!^RnsB?;p}1Iv+&)E@GRqc_V~GG(y#lQTc-l-9abf-6|v7BjyF2cB>%i{ zcnd5@7^PkHh7izUB5=1M{>96e0P|qDNEoWhzDIq>@hyT6tefXz(QFmW`r{Bx$ZU&naFy&Ct{8haS9!`E#kQ4@oc7|+ku&^BUjV&U*ayIZr?;6 zDp)>UaQ9|rsY*|mpaHflE*M)Be767VZPMbR!eRw}!mamLgc#mN0d^fI9X~$$KK+=S z+>sckpFXGkD{Vv8Co|z}?8M~c?&;~=G#M*zg^jSGtiSep7?oG8C7kQ{JmSq9w%U6e zZ>_n3fdErk^YY5elj`A2hl~x0@0^g}*>#qp2ko*-k}2Qz*$>kr%UL>a%(9(LFS}bF z^{`NQ-1kX^A61k5#Bdwx_LtSDXdC$nLF)^AS$|S~nGa*!WV^0b^p2UEo8q{?n`dNR ze#yR`EwdA-*mxiYoFzOvw!vY`bY=+2N={E-zrs#r<*)Kq`vX+X&aM1|Z#G6+yF)o$ zZ#cNH&2p_AN!5R^%*m8%e;&EwNWGf-Bdz^bmKmY^uR|+dt-QPQ7V8Q=&6nbzf4QM; zltCmO@BMx^}7niiS7{jFzd-v{z0E8TPRImX{+VP-qrqwG$Z7OK%eIB99(yVTo_}ZdSn=f|4EmEal z-MB=o&-eEki*VA|#L2%_?y~>IeVLI~t*_%G==Vd7-4zxZdQfPW3dB9(2YgCo8X@rE z+cd3zTz|*2uoN8Co}K&+huavjb}cInV< z8&C;X6vAOO^Z>Y=7k-bnqL;pWx*lSU@!@^21NHrjX4V!|*$tJV!Uck=hlGosHik>b zXE{UewI{=kM-A>^r3oJ%_+*{*%#p?IG4LoP4Vo>=YHDgeYB3=vaFt$^+S@mbihSy^ z8XICqu!kN=?VDd?9|l(|JydIa}%i9})-_$7EAl3wA1d$UedG ztf;wCot{?pWYG@y!Bp)>M#+Acbrw@y6;dz3WL_ld{X5NC`;P;eG{{s&{N=iQ-EO8= zuU^f^foG`u$B#4-))^I*_sz|^=G}OY!bobbo1O-Xt-pDWdhu_huSu`34PeiTz zDc+>1$gB>*jB1zL^z`-pd*vPe%DWE3Id1j`*4qZ&zgbQHjxWvJ8RFGIp;oPtl{k2U zCij8W7}|V14sX-SWBuFGxL!$aYNjIh+DPDj=VD8}YuCy?M+a8T>bMTPco0yTx3J(1 zix9po!>x6vbz|mq8EdV3uV9Cz*M4RdSab8I(uO=Mb&AaLM%lY99bUYSbkuXLSL|9{ zElZQRPP8!L*VejlNhQgjYM`ThTvQqJ39B-7x;X_2=l`BaV+Mk!rNuJ&89tYrdv zue*mxGbHgJrvlI~qSaP{zDSkkt;XvDIf4htHu0%aoQ_q_BDH;G+m`rpg*s@*UuS!# z2M(+@&Ev=eWmXW?J%8rw3~s?IXjQIHhJTlQSK;v1O^YjR<8jja2q|f$U?Z+VBd!nQ zWPV*p>azU1pq3-4J*PW|77O>B`z`#?hE#wV{$OcrY@F{_PnPK0+MO8rYw2F8jNOb_ zuqnpRsA^zLhn2rNvQ+x_8cQGVWW_=O>*Wp;1SF;$MH&`b8NmMgU3F&*AQ%2!`QDir zr=mP5v`~KK&w5JFxWDwJCeLx9l!*xlvA91AQJHP*hLiFrI!hUut33X)nd5_8g~yiF z8_`ens^2K{!6}`P1aiy>@?~*=v~o_xbOUBkSD$J0SRYfzT!k~+uk&rERsS+?54?~t zw2jR&&=-mG+%C{e%q6duDz=EZw-zhb=O_qAhg0pG)1z2dcH)8wBfMJp(1W*m&dPl# zM0uEKaHCMOehB8Hz8UeY7kos1Rw5_cal19fC|wD2Vf}{LNhuNCfm1D4-lZMfX_9AV zO6VS>ce^P=fWfbN1_thqj+#GxEb%tok#bMx9-*A%1ec|>c54J*UKID*Vsv7;@bh0H zJjAhoRjdh0tcFh_inz3rw48eZpT|62&@`59NF%^TR1!wYT(ePZ%}yOga4YR<=Zzm z509^OQKCx*`Ifl99`^f^Daq! zA3r{VfGf8NNH<~G2{pIpY_6?!YU88T<9q*tBJ&6-GSvOuS#7-186wd_tX*&gySmcf zJt?p82j0EPow_W>j{0sME5!_UKJiMRYOhBZK|K@dm`?o3lP8brP#}2d5vw_z!X2N# zyW}zaOz00ytt}L|Y0+qPMUOL2qWkGV727X-59M_4aebi8uMI|LjChgjp=RIWXGizf z<(fr%OD|vDf^ty*Ggo#+O|@ zEiD%uAAMc!{QS`XNRPCK=ycOOP05%sfzepZ-lBry{#-6uJnoW_62H%C{Pm5`F-Ci@ zdMrlor(^R}C%2>StL*_a_nlnaz9)HQ@}5ryAtchXMF`_~StwkqMVsXkBXX}QiPRIY z#rl2(T1I!u@62cC6R`X}|7q;#z!MICaz5c{0I+?Ae`25jau699&ZY`L8fkUq3fh1{XF;9=z;+ZMOzbF84C}%v&ZG9W{%5+o8xWwOb_N7Ma>yW>al{{ zxPmIpl1$<~785<5yHZc#_0;ls;f_h~=yPhx-`c8HTH8}}93`|<4R4QzaR`l#jcGmT zck8Ws(@oxragGu|p@ejh>g%-1WkEgc5EV#$<7m$`Hrdc#wu(3Dp{_4jmVS`h_nBM; z(i|WgctBWbnor=crOFxp`1p9pr=Hx|8v0!^nBF(d&ONzG7O}YGX1<0xVcl60UR`$D zX1W~95o2H5=2;pM`W~1f)F++v(M|IC`o_uu_x_Rtu6`O%fz3gJk%=_PHW{ocp5k%6 zA!&d@&Ht1{>R+5ks(XkG9NB1ya=_tDx!pPTHBUXY9xAOD9PN1q=So6U5!!E+d6R+H zc%n6cSCI=~F$L=Mt*v+ONV(%4NvSD4C}BC{*exAU5O0m$DAX1fBTg9<6LYu-*NAdb zD@}8$aluts%A97TBDbk*0`P~SyWIzO+LXm}-<=MzC1i43-~?Q-TayP>BU+z>GCRs* zWLj9*@1Q3BP}=~d*bWY ze%8_(vOC#!!NYPg*xM)F1|GNO$oEV+IaVod%t)?~MtEUMMt&Ka?B5`J99cN$9gTH; z$_Lx}Y`9M9*uK=5eAKoT()C^>@?(f*fCxO8Q~{4I9_Vmbcuk?}30vGnnJ#Pb2Gbjn z4QaGJ*X3W53JVpLM(ek3b;qAZhR1f*lure7BYon#JvGZ+&vR%Y$Z*x3`tN`l;peyR zK*x{X)750Qe#}|Y*w3YV3_D8-KP}1#n3eoX0qyoraw?lWFUN%}LZNzi;vgfTZv9-@ zgG&mR3tw8>FcfkyJs{}O_v3Dr)9}~R>rR?--vM<&tia;S>2?DLsMwU;sJYkE*w{)% zXOf(X$mv+4jhY6pf8AQn&e&NxpgVN|di^+MR@`sXUgp>JoKNHKpK4n1Mu_~g5m&9S zCYDFa`zX%oPT@>>x8)dMB}Zhz-A=Y|KAuzIXp(M3xn3`9xt_2KYY>rSi;`~YU9XZ{ zT>Id1^X8CQ6bLyv%DL=|0N=*PGY%gNKFoGExG8DXn^}_z>DXCSRP@;0Tg$nW zcOTd9uQI;mAL$=InbcCzPDa@3dR=4AfVvQgb;vTc*p7a!=(BSk6NN%m+aMWQZNM$1 zqM+wyEmp-X_a@)=d`C&k+PK^wWv`a#_9Jx|0*kY_d2 zLOIM-vrk-O+9Gc>i#^HC+J*1VIXt}z=@c2$3P>}M{`Oh)S#&{?$N?*%&&0I(D~sE4 z&CWK5bn?uM)7x*y>*gASV_JwbhULlY8ebtHBg&u%(al!!Hy!pw5AoN%0c|h}MA=#ZkPMBn+={yGuLT9)2HNEq(pu2mWvjVZt>9|@tLBEPE5>-)}yLYd86 zjq|W6?{N$<5#J38AqE{m@z?G!jO7Uu#cjQs+1U$XU9JzsiS6H07T+gmBh$q$ z@l30ty|q5jzwZTjU?Hid0!n=M?oe+;y=J8IA)TV**&5yrZ_HuU9uqv&9BoE&dup`z z#>QKhyttfZ_P(&&Fi=u|R!!3CF=M3-hnhY!KDN;23Llp=;C8@`5DlcVvMit$IVyNb zr#$J$(ZEMD$nX9`Zb&Jdk#3&iVQ=6^mMs6pPm5^&y9EY9>%ZZT`y7>YdR8aKwOhoD z_1*mLYUj0Fyb~IIVd7hI=g%)MZSSH5L{xO&0Was)>b={Q7;9zRMhcBIns6RDNz;=? zJIjL8kSAIbN|bhwwO@fsZN03#nTYkeWuVXMmItD$z~b&cRsK8q)hioe-IzVI4%{r|uDK3t&`~C9>7*&a{FqVWrW9j8gYFG;+&=79$p3W({FC&+e8;-O>3yr_ zDI-t)Na3&(6J;+5-y^GnLe^Rh^o!0Ug1(EpCnpFsHEIQriuf&{|< z_cT)GsVH(td&>pB0iQ)Zw#3&D-1fDu5Ey}-vUT8~}Pww_zh5J|npw;i8vd$pj~+Iy(k zm+VAkK)LiOe=SuWgtRf6ouSVNzdmnqi4aqr3ZAJVPUK6ko#JxRNq)(O)AXQoRXDq# z`g!&h`wT9MA%wbL@~0$K0RIrAlJBnU8yoV3zM|(4$9vHxG54mDiB1OsE3~QMwl|n6zn95IPa#e9NIp zoO_4-*~{k|c`r^YZ`_uEkDbzr`*pBJR$6xiow8fd{b0)1S62ZY$X#JZrdzOK7Z#N_nix!$K*|P_%au826t$ty5!fp|R3^xE zf0}kG25^V%&L1NY-T4i&X4B{Th^!`y`SFz2EVoF~x6}7#@n(;9H9HNQF0qp1xbPM} z{A^2JmuD%s4@aRS5s-I3C=ugSdVl#LY;Yh@Ht7YCX_qhX-D1oR;mzdJFiB5X9$k)i zOu|CxS)cxN4UdLyVZX*lt=JWmx+yp1k$dR=XGDK4t(k7yr*W$Ae41SWv=?B`-2(#y zwK*<=hQ_Zg87rYX(VAi|6b{Xmgey0GpPkvne9V$Nj(n4EJG>?GP4&X5=hgx;&?>GY z?*)v*C|zS?p=xen`VHG>F!h9K^oq@m3608}hjP|r8SeVH)G)b=th}Sx-wxfo8t1gy zZz=grbsec<&Q?}1hJ)yzBxAWvC08FjF!k#Th*H4gstLCCC)x^^;C2?bQtDJdCA3lv z5663NspS+8e*4lMYx%JDyvF82tUqJuPUYLfFTYIo5uFAq@5~t%q8YBPuDX=!cr&UjXtU41{Pa8% zJkQMRQxT>e`oRXkKKKVg`;&K){}R5ymz&iAt^^=(i76?)AX*3IQ`A4c853_3{7qIQ zafJLwTL|49m&8Ldif^_~bsA`x@@xOc^~~N~Z{OJXKvN!N*v>zEc0GGJY*<{QOvpc^ zN95y(i?IxUmxl_SIl{KP`R#SP?VX`_H{aaT0dc`|>ouSoAj&lroli5A`CZSe(Uqzd z;kP=EW_{<>XakNEdeD$>J3JTQbbP+ts&(EAnjF5_d61mo92-MgHB|(BALDfA7<-r* zZ5S)2p3~6Kkn|?pQT^;R!#Oa}igWjY+Zup_j{bqcwnE`B@PU)>UM`PDh*xa#U{QO* zQvn3i+b@YvB6h%tb&b9;j|Un;+)5f61(_*WE3^>2w<};;q^AlDj%3x{O)xht=pDM% zsmPts>}&#bYWsu6rY2Ao_?s3YWp`R{kgeoclLoks$<9nl8#8{|Del8LkxOo-hXj}T zqqOz(^d>jfmMZQpq=-TVvEr3mV+TBNA zleA?u9}V!JM1B+t`d+i8YU!IANakmPR}00kt7v+ldapyL?7@x5$ECx8K*O#=|0r<2 zmQxvC%XW|`T#6?(?>~9+m${r%uS~P@;&MGtWpB^4@;&<*o7}&0s|+?t%+4ztbFd3G z^>BIsH|}VsjM>l+%CD>^$ALuc*esAjp?dp&Eaz9w`cSU{&w);nyxoW2Vkcozp~~cJ znf7wWyP_|gOX&q=SPh$J=DX!S-Ls6AU#X;~2I>24dHHF9C~bkLhSXhrYSrpZf|O?B zdl58CT&mp3%D+DFSjl{;b6;OSP)b2MR1djNOjb3hIbuQ6$E#oy5UlR?FZP>huwYDp z{34%nVhO%EyAI*zzx>+>etLsyc|7ks-inrPyON_TsKyIq`bF zpn+Ej-|4zRBpayHpOZ1v_mCxFTA`0j?$0d^lS*otfwz3I(xp5iETL=^QUUBVk zx=V33i^-r7o5Xy_lz7F@O_NWb-I%Wrgx+n$xzyM(3rHLdpA1~f>e6iFL0^MnL5tAX zNF{p?$-3UyYs419Du+>6wIgCiGW^SVULjXo)ft1~`M!!mzdyxEdM<3Nj>T5GWYE+V z$`uWE@NAm>g(Hs8=*#ogwJg& z+(A`{uf!@Z$3~u)<1*GXDvTd$h6py@xUy-bscvWGZl@~EjozZ(e-jfsK**_76@2Vb z^5jE@>Om`I98~ZMV zEiSei+}3c3>r84doq5XQ89JqdDZqJ-;&$-mmm`sB{`=|#!&h0SfM3R|sVoMosj{tD z?uDPZ2|n}nu*;V|9&eCil{YmUG-nF(x#^KG%?nV-!D-al*%`Rff75^b(;nLoca4Hp zro9UirhU=YcZ&LRH|HZX$|B?8!SplJK?zml9$MKOWUyQ8Y?fY5M`B@`~deL+huM+wB-XoNb_Jg!1x`L?Mr+$&cBsycKS zXR8=?NPDY;ggKzWUTX!L6|z)A*vt{}b)|FVwl#vaw=}gc{E;RLI6C&Y@kaf!U7l_?2;Lp$;^jlw^OcfIqbX*;? zm6KU*RIN@8K35P}l`j(sI119|;Ki4au8x}LmrcOc;Bv=~l}+&O*kXNuv7^^9j-$K=rOgOF(PW+N@TOzWx!Te>Y9>=;lz}hQl@HS# zJ*k{l(#r^P>04W?lHQ=PTfDGi!i83a2b-1mlXQ>(R`@U<3d&Wh7s(31gAspr`>o%Z z8mvjfhN$R|^h@P%z}Y@eZpcoIW}Tn%^73wAHv@AZ1SnjgzS(5zV{zGe6saW0g_V^~ zjo!JqwU;>W0@v;Kd%#ihy&%A>P2LG5i>-Qy)?m8ne!bm2d z6;Sdad%^vfHh=1JvCHcKdys4^$#w-3>mC+PhU_Z((KFK%_+`jL7xK)$=+zS$U0d@= zeap!|f8GES5=5NpVvpCgU7)V~fseI`mtg&19bcJb!;K6BXsR2G*2Ww^eQD;?MGFSYOsqs^{ ztrfyt@_4-q??yKd3ih3)cNx#V;kfYq8#@-akq$Hf9+`?Qa%$QQ9eD0&ZTeiMss2Ty z3^=v|swE`#=H}*9zJ_lNby7(>V+N7LNMWwMzkdC)=`^3TI`j!9#)kd~qh7RBg!-KF z>^j6hV`EQVvi{AXH^OASMl2i&f4S)R5s-r({I}fE;(#w28wbt!sI%x0nL0(AcBM|i zmLAo5!Sa>Au%K}RB7q|n`NKyITRGh2U8$lVa#960S? zdAYf{{XT=QI*xB5VfZ%#c2RbH+`6~&Ca?N(Tcq!4?;nq7BE*}mVxp&gE`kqnpS(?5 zjHp_P@5Hy%Y}tT3LGIvJA>&X6nT;9ntF{6G`vbDaSD zxXd<=$l`65EE6AXMHQYwG@1P3FxSKJ?a=XjgWJ3Z9CF_di<6fLf~){R zEq8iejif}QJv^>;kizDn1qfYVq44#d(rRTTVg_K$udhxbk%5;A^#D2x5NB}n_ zE{lF=_1LlVL~TC=kM8dlsV7HyWMn>+o5h4)gN7UHqDN9V=Fr;E95xf+fmiUDh?`21 z{3*av>+}L#-sGe!l63~im?Wy56XQHy-lpt3IqMiCvt8U!w)nv-$)LN9#@dS(4_6ga z;;kP|TQO#+nWAa|WkGRgXV;b{{8y$e!_Zl;UhNNIRF3!yh+^-LGK?3bKY=cX{!{5D zRHqMc@5m3m(9xDQ0zDjA1@QHS$2e_yBvtyeUhoHySzljYyyvybLOD)kAL>xRF6yj9 zHz)ZvBgq~sNPgQov2+Hv`2mtM)oPT{Jl{mJl581QdTDg*Y+>(0YpZY;cClF+Xa@GD zPTuTrm332$sBaVYcWT5ku#~cf7tnW3twOt-xggK0b3BF91)hSIzc$fEdVD4fgZ{&0^Ue78Xn!Gbg0X8U<;?qy!NGi8FzIM5lC0@Q-S*^z(A7g&YLY`b2C%(I{wOQ38*I60t?)=yL&xLg9>4Lx4s=05==`YGq~UfKmVhbbZ4%680v=?g&S zH|(tM9j*!jCnA({byhEq_0lec4rT&5-3|c$IbmTOrRvbuLZEtnXx%qea95(ywaNBi zTZttGp(VcRKvLMsLl`7tE(P$iei5+S%(jJp%Mh26y5Vv8r`$W`Gp(kN7J3?k*` z7juy5+4K9JlUdHLuFZNag)VU~d2-U>`RPRlS{Y) z-3=g4`42MbYZh09!UI=FBM^6q;O_wTa0tV;YVB82MIb!~YV@1nMO{-_0TLB+r(i~` z_1m|p{+lV?klBX=X>z6n(<=5R)6=K9IbOPZj?sNfY0&vq?78*Jv1b=Q8Q#zX10&cv z6BN^Bt*5<3vWMrT(=GlT6|Y}^3rEC5LmMh&m7M`S&=ycLx!p7HynoL({`18sM#FeC&(RX|nj3TSPqTAtq1s-q=g%kT(8$H`tJvw=<) zHzG_i7XAvI3~bK;gC^bt>BAb*vc3hq)x?%xZT@p36nnsT zfA|Y-!&~+56#zx~TYt<}&h=y)XCn0!X)p=)35rr3#|$p%4)3L0YP6cJBJId0M}HhP z=PJvsXk15IIQ79CLs*&b2V`>&&f-ZOmf5th=Q=_5=+`9uKZ-~V5M~n@em_VCU|Le0 z1dtEqxRT>0bjG4^*3&L0_Cpnnj*dRUtpyb^IyROz-W-nz3Vvq>%6&6wQKRNN`?mH~ zuZV=YoOqRLFq!wcE@x}5rjsP~V(!)&vi|Dcv%pl&B!4rMGzyB2HgW6oo_3$K3af+4 zoQq(HkvUq>2=fh6v-q4QU?cxDc?mQe$W1Unz%da#6DB@a&CG{9a^ls~mDwQze0vI@ z{`CV*NPYo@V&+>@j)jyfBq(j=#+x&F=vZ4jyBX_I&}m!W z@}er=bZX&AabYs^j$WKQ5oh6+zl8JP;baV zP)uSDoKA!F172*JID0`nBJrWsJ55k5M(ZQs+$qQ?Vt2o9>3!PuK4X>3-Fm~y|8Yht zF`wKg$GPWCLw6Kg1G$DUg0_NLNo*y?gn6Ies7kSz9 zys)$)({44~>hGSlFSikM`wilYeoJdB4P5T)qrA8*C`P@i7x5xTDuWoFKBlo5mj|C*RMG?e95IAM9vF*Pz8 zuctD%OnLMAwT<_t3O=B#ZbB?VYfl)g7j{o^^O*jJkDLaA9Qa z+a0OqFaa<`e2!v_;OxB*xU)A|h$%wie333e@9L|hq|OL&Y?f_h0AkXNZ@z`a+9BAG z=+v|fK)Vy8SAKgmRIN16x^%ZPC;g!SsCvCc%we#`9Y3B55Q{dlIWscI^s?6Rh>BKc zKaqZ82n&Pi@9|G$7(bXW<~}UNaMcIQ3@CSL)Q`kKH35}!=mliq!at3$UQ0fSp`E)o zwBP%sb810lue~p|Pt!u2CukGGX&G?KRD!u(`&g{TY|NZO+DsX_s$oROF={;;Yc;3w zO_p<`FwH8j;>uoKPwpJ$sSo=%tBPwH>vn3qF8rR=?KY`OS&N2n1X2d0p2D3RMc+f5 z0Jsvuq>l6eP6IS)P=34=M7^H&^h*NUA0XvvsPazbXC6Xu;lc+&lS8GWtEPhZl9G~) zt1sn`K*yZszwgxc3vVG#wu%$7h(W3v8gq3bDIDquI)jn3LA1uRMQP?wD9N9OOOy6% zA@peffAmN~yXam9$F>fVc2KHeTkS*6gfBl~E5J}%53d~X3dnK@5(3{QW~4ggR#X&+ z1m5Px$Grw;Q)?aG_V@SmsG^j~t1p%KT~-0v|6F&zrl(iVLC^c$?;yZy#)0m=iN0SI zPM2Oo&z$(yD*I`O*6rLguz)S>-!vYW&))EO%g@+HA?i=08 zBhq9IpU1s_wWrqMyR7>3xqhb&Mhnhh<9!Yy2O*i`?`h+pk#|>L+O(n7rIBq1vC&cc z6eh6 z>&M3DrQfa2J=9CL#9RX}4Z@si7MSL%5}H8jE9a^S@zMqra$C$298yZCUAt)yo;5oI z^8}PkO>^La`>Y3@fcJ1ocx=@L3_ikUjUYRLQe0_I?5n5Piib3dmo;*~}QopMY zqYsjToTw)~K4zQR^xf;f7mm(46%#S*RBmGi87JH1I&66Y+yMCx@O+S{#=#0GyM7Q6 zfOKGtOkjr|kxK{`G3mz{xqk~?Rl#MszT9bmkentWXszH6Cm3hymp4%X?!jY19pWOx zN4Mb>bp3hCZgOA_c$H80xy|KQ&V|m=&hM;^b+`Rr$skWl8;;Y*`qx-(7%*AqweZ9DCPdA(9rhY{ z9@1zlTqsa^1>B;nAsDy=RUNT=?{t2k4Tc3UTvtXI@guu(JcXmwzad-C0s_nsd&HBy z(&2&OCb9x|G;%*T&c5Ri@9}kNeWP9hWfd_}0}G#mx(=IpKo6KzFS!lDRZgUswM*D? z-GR+zHZ`MO_bhE}KwX3Y1ye&CaC@6Fbgse|c$c<&%wBM;*YU-|Cn+I}7|KirnTNzJ0$} z9*zs{P+I{55s<-OWcTS23a)!1*bXwiVy(tV%I0#W)|Sr*lGTdX4Jiwl@$V*p+ifz| zRIyHw|LeFEZh3nf0i$eiH2SlPqmoHuye$K0=|9?D&H|<1J55eORCWqbtnL5=6g{hhUKaTt*Z)h3eHb zLRX>FzFiy`Dp?Q5xPzPc2IqUDP)`vh{C*QT$UOW z0n0lzJ@MH(y6L@Mk{>*swvm#F-u%5wfdlRUgF-;72JYus`E}^d$V@)N41+1$^ImYp z!c+^Oi$9`(ygoIm`4&1fbwln{Jlgs=0x!Y812h#;Vcf;N3U;h;WBvl|Pp zTo!8@adhNza*Cw@4M4I}sUmJFJJY7k;lX{|0=aosqyXj8BesyPR)MPkf3kj)o|^8P zR!BZz8Tx(rgU3)scNmAD3!K&htF~(K^HF?;A~(He8*f=};X=NO<;OWoZ)jxEAc=Q^ zAhj|>9rBjT5>`H}43VsO`1A^R$X4elVZ0!r0v7Q{U&}TT-c<*>5&+MV8(&_eZVC}# zyH?;>v}$-GZC%d}Iv9VfD;|cGLx7)pf!}{i(I|lQ^iSVh()>N(Dy45pZd=&@Zo2FG zBm`+Uw*~aa(h;n6Wxx!W z#Ki^z$2hk`S2$v~D5Md*lsbE3DSzLS!&xxy=hd zxeuqY8_4boz`r1VB9ApgEv>APx~Gws(xkI)YO&L~wF(BB>vZm7gV(0;_6JbBQlas8 zyW#P7BLLB$U7zJY*1v`wb`u4c;S|D+`ri7K=YnXwS6ct~>cW`k1NV^qJ=P`pO|qzC z4)Z}Lo(c=N#V%0D4dooX6xNJaw;Ku0O+&nnNSp!v!z*8E&T#OOp6Iz?3;4(#Q0zyyic=!OFb{~I!}r+-8zGtv%o_n=1N|Pdk^ivZET4kP zeE3YXP3GL4US~$lw=Y|HbdhEnU~nkt0I|Vh2=D988kg4CUvU#_!3TmA`#EVfK^lY! z@sQ;>+RGEFsuOiPMOp_uOKlH6&rRFkAZr2zm}y%$5=DOluq8Q?%>|bH9hNEKNN=S8 zyL!7gHJp-g=-x4Ri^L7PqR={V!g`ebh9+cD-wRC-ws9iqjIj#Zu$Wg=u=RJQ=|7wN zLbz1Sg{udeK%bFcz3lmtSn%a%(QNsI7(!+t!>#{Lk42U?gu^u`S_pBn3z|_jC!T=8 zgB0m0b9p|K(06MPLb_4J>-S)}FIdK)RCn}NuP9g1d#v#pa9|%JfAT$rR392X{vweC zTXlN*=m-Usb@}o_PV%V5w3vs~bMTSm7vdar4^@f!ISjf$jt4h2r|@m;R8JV!KBTJ+j((sE zK!e?(k_P^Ib#rhG^CMielU&(Hw-AW*lPsGrt+?#Nl9!r<&a{8(X9TbLvX&N^IOw;k z1Jw=$)$-3oLSsrkx6t>S^NBOCV3CF-FzAA^)_`1K=2gobS3S?PY_gdCAQ6FS2`xdG z6i;p`L`jRDCdaB0H#2B9N2-w;?UqbLyqPUSXY@S`kD4*xH3Bl!V&AI~H&E zG!X$=ya)W71Al=LHsVK~s2gS?LU3A8$U^4241ajz^MUON@I0^_V0(J5(1Ke5oT`A} z2P7;Lu4vxc0O7fyP1e>x5khDUw08gSilr2GF64cnEVgC0 zFMwviPJPJ9I|U%bgl{{d>#nupkbVVd9x{>3)5Wc_-1Vu7-{UTcwSy#?21A`qotfgr ztv-Yfh*-$7(H*Sdr`&x9`&bmeN&Gq1vN81Zq1W#UF+OWSroT6ofz6haQ1ClJl(40@ zSOF^l@dDs%gsioSa3pv|rIGG!jT6*wS_I{7Y}(~agOnbGXgCsohwdf>lt@I`@=3!))dhoI*Izajz%GMDMrERIUirV-CkT-A*)g2|_S;SP{V_U0UW z`Sa0&vbS~Lj4FDRNM;1Yn@%jWXAblZ5_1>f)-xL7!$9mLh~P^jY5;x(TpGCCe#us# zxjKaDHxj~_1ZWya%PR%k0$dWw4KqWP=F{)Ff^U% zl_M&XYU%q{_>#|Bsl>vgee3H?^V6_9vT>Xt$}j@qlp1qhfJiD zE(i+jw&%js3a5nQuqvXz+s0xrpnGYJlrnvaB_D1m4V(kK8cK;R6i7ZJOgh%g}7`G?}Se0+Sgjg1Mf zLC#tKcBeXhWOJpo0%8gFcp?2w5KUY`j+eg+Z@{~}&?J5oHY+enJ10Swb9ZyQ(m~>D z$hkI+U3>6wNRs;bBvdk)NR_T)Noee|7$fGeOGqM7|SnA&q<9u)j*v*tJ{=AKrraz@to?W-vXiA6LCF{p&1a&^K^2Y#%tdlvPzTy>Lt_ z{6~4A!U>Gu1!z^4fYt?@u93zOOd@P{rUwpHx$tcV3iDr+94&-&&b#4J3cx{C=G6b< zHMHsf*nR-XLApV7L~u_TKpzRVKF+?e^nVxvA};8WN4d3-SYfWr7=vX9px;B@b6HMJ zF|N?*VJ{o7Gh`yeXDP~>Fp&@uh`AdYNlUF71wcoTSVd+R5esr;;B8=w2;zDNKN|Tv zpjXg6Y6GAfC3V zUt2K%ueB<&Gwyb>21mX9d6!~K@aKRd3EVZM2N@XW_KG)<5X`lI!GXBzlB5vhL6ff9$ZwosA^KnZoNH!g`RIcyYzIn zf+jx{G*^Z9^r(XVTLoaCp@8R*NkL|Vozm{Gr7}cg=T=0w!I!xA$}?;TE1z775w!-g zGGuR%6b6;}E5o~?&@if}}x#ZC=F#M4FlOD+><_Xsc zzA1HFe>Sj8GDhtr;T!^w z5B;8{&}XnMbC|dR2QgeE_7*wyk4+P?^|SSp z6w8flcKcpo#D%ebet6#ix$U{9iQHhMK}S57Cncvwuzy7zM-8)=7)^=7aP;rw+MOFH zak|+#T_VPm)Hj0t`NV$6fh(l)m-FwAIR<16+Br7PqPJ5`!cp)P&Cm)$1Z7!Xguz_oNgBMy6UE&;Em#b$h|OS`bZWyuj#Xg66Y3X zy*7{@GikoxLg<-|Oaa|SBg5kA;yRvjuzW^pEwMS06KAC0I_|sS#u@b0jnNgly^@aBwBLy&XRdtseLPyVIckipU>_ m`Ty=qfV=^(|G!%<*t{FctjdWB-rLCk*45U(n6K#&`hNhGkhvHD literal 0 HcmV?d00001 diff --git a/src/assets/images/panel_cover.png b/src/assets/images/panel_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..faf0065fcb6c7c9bf7ef6c0e1b459c4621d481eb GIT binary patch literal 2351 zcmeH}YdlnG9LLW&9d%HQ6-mlOX;aL!LrE7WX2@o`$faBwON%Zdw_K)~gO81^S-T;F za#=n~qD8r-nWN97vW+RxOu4lqT^5Uw>u8@B`+9q|`>Hq3^L(EB|M`Fa|KF3kf3MRL z4MPnGf|fY%X1YQUYyjF1v4x;yJeXewDmcQ`$sVd`HF^(0*n4N@F1HwXsGEJ_3Tx@2 zk@RAAak*C+>z)0m+UWycr&qsZEvuMYtb9J)*P2-u*5}$a1uvB>EB-p9FwrFVwiWY7 z_6cdOtlW}$x$y=^UIKLrg&s&i305$i?pU@7Mv&&k6zb1rRKK=hYcm`t zh47a{Kl8j=tEv0-Y$jYKsc&0)t9a{`SvOmvGL!Wwbj`DKlVPJ}+AO0T?(@yPJaf65 z{t?om?OqxLA+f+cGLIlclScK^=b;egA#h)8jjisX7#OY|F@*>`k02gZcVv_IG%;ba zF$|#}&_*pYSxs7NnYQEhdHYz}Ha^owb;BpL{4&qfKlXN4f2X#|snCo8a|f`bFl~6% zW^vp`W&4Ky&@NHt3cB`o!^$cT-uznAL(R*@O8sMVj7T-KL61W3UL_Fd7;td%0{@2! z0W=Ud%RBpXG!h(P_!*{9eRv@Y6!B_jLteh(YSgiEWD!yBXak4|U!x>8MYs>F9*eD5 zbjJNH=O>#nZhdd^`3a7mcsfqv)o;P*{Y3Zg_71$1@Sp+{R?2An$!c+*rA21`Rgc_q zuRKFH@zu6Fb2rSBusW9E>w=T%WD0@=N)A>BA^&uJyeqw9>>Xay$c>*-T+Fwl$=xw4 z3==MFTz#oWrMMW;U*5X2hDm0eb<07!Osq!_yAU`Cr(dvaI9Ba zBWMoD4!ZgGQLG&_*iHf{!3@|b2?B9#4Z{bY9WccUoN?0Xzu9KwQZ}2rU}I0GK#|>Z zrgmH*I(U7`HX#sP!9@|9Bt4oSoJJZi8+RsvhKw3_s>$7KYOEl-c~ zMQte~4A56NVBs^p)4$I#_PqSl+oS=zyq)bsPri*+Nu}ZJ??Hqx=5)+BWXJn+l4`rz zvpx+~y_wIY350j?RvTs(Uf>Dylip7p)jG~Om&P>W*K~!1Ztz!y*H_pV>;ftyRIU7QwKE7y2N(PJC*1Xa$O_lj0=y3plNs%LgrxV06Wwj7W$RYBZ+9TsieYrIM z(ht3fL%n0sGm`0)^q>~iP2ZHM(e!ZDVD7U4zvnFzzYjZgd3_q5(Y9kXGCKC8bzgD4 zFW;s^pl$sF5R=+_Bi`NZqNToM8p5e`)>qzHh1U|*|9{og0W6n0-*cjo47 zPiGnb{2LD2mQnx! literal 0 HcmV?d00001 diff --git a/src/assets/images/pdf4.jpg b/src/assets/images/pdf4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..10166e09eb8fd10c134e9d708fb91017baf0d406 GIT binary patch literal 50960 zcmXtg1z6MX_x1-AQBY92L1_V{l@bhMbO}{=AF>r3S{H zd#0uS03wop=Cl?kfPcB*sbS^=LDcl5Ut~~P1`C)D!5-W-4xHJ-2c%d|`K^Z#4`501 zlw28`|4Odj^WIR%B?b-@x)PB7Uh5E&sAI>FZG$6ajAC86Ec)K8d*QIko1nW zg?Ss}rxWsw8C1=L`&FZA4H)WSn{VIS9rBu(!b15I0G5YD$^ZphLCYJv;QGE z`N8h{$5H}IeRLnYO?R{%V|3!J?!;(`HVFag_?!8EFxiiP_26*=U*9T(m)f}6tgo4y zIG1WW$JETB<7<{Y<{9qE5txvM-!0U0JxfMRlE5VJXJv zI?|u4qsgt-dy0M8O}5+Y2J6l352VS^U&-#<4GC#>3Z-UQ^3@1?#J8MUrHh)e6sx%* z`5zV80;2avyeYza1Kr}BLX2!P6!=0C_)Lz-NOPCPv+P1l%^Ly=m+Rrzqy7`j|9CR? zQSrn^wea5D=)~4T*|Ce^v|(Y{Hnxhah3{81HMQadh3V4{#ByP+rnMe%otny|br!vo z@_XAY?*7FX6cVr4RK!bMXG@KW?pG`NSFd;TW)J5|p>rB}2c>fRa9pB{p_-bTngD%Y z7FXIqfO>amyX{&xCogH8oQJCF42bsY@IUDSWf=()LA*vEMmMIy^5vo+9RuiJ#{#x4 z+918apVv*tA~;_T_eizQ5;c>KKl8WR}p6a~qdzlA3@^LnO7Mph)*JT;r4kaHPr;%&a*i(D~OJV6Hx7*{#=>sfD8$p&Gtf~Zf{YxKfaVoWTRCq-AYhma!#^)0!tC`wPw84;f zQTvxiKe=J{c5^kSkK^f-$0=}~n9G^*$-+=B{yFTIDLgcYCBU|Z8T$Em+DcajeJe{l zv9?0H8tY4-WIYazuV`A}Io(Y_DDl7QnJ<61g|BBM86%9N`G_tOOytkRpwD)q2m_31~Q=#z*yMQ$ISfkkNaix?icv|rJ?!qdQb&`2E4 zL=+$yR-;#kybVL)¬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 AKL7v# literal 0 HcmV?d00001 diff --git a/src/assets/loginmini/icon/icon-eye-g.png b/src/assets/loginmini/icon/icon-eye-g.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf83d6474b526c21939587b3b05d39fa11d8be4 GIT binary patch literal 6778 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 Isp$~?KR*6Fn*aa+ literal 0 HcmV?d00001 diff --git a/src/assets/loginmini/icon/icon-eye-k.png b/src/assets/loginmini/icon/icon-eye-k.png new file mode 100644 index 0000000000000000000000000000000000000000..e1cacb00361ee09d23276052f341961a3c59907e GIT binary patch literal 5682 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 YAf%QP0fzVO{;J{{>Rv+BXuHJz54!{}<^TWy literal 0 HcmV?d00001 diff --git a/src/assets/loginmini/icon/icon-line-msg.png b/src/assets/loginmini/icon/icon-line-msg.png new file mode 100644 index 0000000000000000000000000000000000000000..08e7bea74c19c8703ddae25849ccdf09eb7da875 GIT binary patch literal 4230 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 O1Lm0H=u#t>i~j?2%`H>_ literal 0 HcmV?d00001 diff --git a/src/assets/loginmini/icon/icon-line-pad.png b/src/assets/loginmini/icon/icon-line-pad.png new file mode 100644 index 0000000000000000000000000000000000000000..2aaccec4a307f68b66e01ecc908fe01286a8b626 GIT binary patch literal 3114 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 literal 0 HcmV?d00001 diff --git a/src/assets/loginmini/icon/icon-line-tel.png b/src/assets/loginmini/icon/icon-line-tel.png new file mode 100644 index 0000000000000000000000000000000000000000..c3efe1ce8605991bd6a8433782d1aa2a4eecc993 GIT binary patch literal 2450 zcma)8Yg7~07ES>zieOY)8&Erjh*Tw+gpe0cB?&|gNPq$YVwg-!jLF1gB!Mavy%mv% zXyp>LfDgor5)e?(0>0n^)l@1d*5|DS;{zWH0lg^#H&H>mv|V@BI-+Zp_Bs2< zWUL4dw4dxW8H2&t^Mcp{b8NFL+ll74KB}U~9B?Qn3JpWVs79!QF^fe=0u1ov!Zok} z7K)PA{{(wuFxK;=;ZbN5e>n?6m?VJJ$OaW;zBsXqrIeBtpn`=cq6$Zlbz`TvLV}=(T7oD6 z3WW#)ZhRpmRalU(UQ76V7Ehr@g$fAfv3>C7Bt)rH#G+B@R1TF+p;6gnGMU3>fLt~Q z4B&du$kZhPix-b+*$A{j4lB?xt>~TB<1e+AX^<<;mD#XLnh1-yDnt&v?wTe2h!+Yi zfWl>fOd2)7^W$FLXhk3K@>aX}FSR7I8It90-@EHE$UH!n?fB%HKgMStR+tA~WuENr ziIHRsW}-EZy*ONZvLQ^mbeRkkH5l|Adx=x+|u{EFu#5$ZEj zzN=jL-@)D-CbnkTEZ)Nl&pNI99P49%!RuIcTW49%m!S?Eg0qca?}%moRLF zE0&Wp%L{62-0;_3b4TmE#d#+>YQN?XE>57-9wK{{@2stJ!ACF1JqkZtUtULR)9(mk z*{BL$GENF2PrKSo7q^sGx&Eu#bq+^d`^QqpyM+U=DXd(~_)JYPmJfQ~RctHBYd`Ml z^JG=mqrhEwn~vMRy_gAAd)&!sex)e<{QT^^%bh&h39X#EPOz}un4SI$uCF`Rx}NcQ z4QQmxs&k8SOrUtF_0Y-2!)xxD5;xg*v?1H>=!Tj@CB-dh%aq-Np(R(-3>E77O=M^N znGS8k1Q{X2UwozN=XNqFMt$gcq+!{NliVAuTslOIRv)UFZ?sE`9dh z_KxmbsEMICOe!%s#6)VhPZ+OmQAiA;^nKXUmRou4Kj>nhi3urLxGd&&tZi?7<e|gVRckHLg#4zex`R%B03R?JNyr!md3B`M0ipmF_X@PrRx%#Vk!}2x)yRJD);q z-WdHHB6mCKca~T&*EJ8Vl#bl*%U7{3Gm<&~=2JD0K$Y_bh5J$Yn$eC^X zvPqWP{bW{b;Nx-^%2;z7Ru|Zng%sG zks}dux73w8SI#QTyG+{uK=ricyalUKF1b{_4tI@QpY-;7>8H9W(V zyY<{g{_)t*OaHzwCzu{HvxnAtu=SXKMQz=#7O!Ticv*8*om*t7WKDlX_H`utxPEwA z>kWL|etgl>qQ-qUrTXKAh0|KkABZbEkTOTaF(k-J<%@C{Upw|~|IB0^HcVDS4lDhB zy72VoscC_!p_QvI`-SQn4>s(hBpqX^v7YCkg5q*k6zJ*DI>%5%Kqg%V2kL*eF&RPc7&mEl%Vq{Z{ V`>XqOQI@|X9w(Sxv1Ik;{{i0m$kG4+ literal 0 HcmV?d00001 diff --git a/src/assets/loginmini/icon/icon-line-user.png b/src/assets/loginmini/icon/icon-line-user.png new file mode 100644 index 0000000000000000000000000000000000000000..30a280ce4e0e1efe3bbc1822492d000c6337321f GIT binary patch literal 5173 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 literal 0 HcmV?d00001 diff --git a/src/assets/loginmini/icon/icon-password.png b/src/assets/loginmini/icon/icon-password.png new file mode 100644 index 0000000000000000000000000000000000000000..edf6d31b689457b1dc19c520349c59b6943582c2 GIT binary patch literal 2101 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 literal 0 HcmV?d00001 diff --git a/src/assets/loginmini/icon/icon_dow.png b/src/assets/loginmini/icon/icon_dow.png new file mode 100644 index 0000000000000000000000000000000000000000..03d928dea74e2c7d2fe695a271ef72e0472c8b7b GIT binary patch literal 536 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8jKx9jP7LeL$-D%zFL}B+hGaOu zy|K}Y*-?P)LH*9N+7X=lT3YAkFYrC#-JzhA@ld;Cs$I*H%iw9<4r0ksSuq!oh-_Q1B;r7njJ4f~ye7GUJy+!xoMBf8pRVj^mg*u7e6)D0SrpiSw z_;zX2)NNDcZn9Xd-}3#RNy~@0Lo&aeU^~a`p!-2iOJg9+#N@yCFQ(wEWy% zCX2kPot=jJo&wc;yJyd|_d*(Z8C5t`)Y5m`{Z^_~UN2m7VKbP0l+XkK DjaBx~ literal 0 HcmV?d00001 diff --git a/src/assets/loginmini/icon/jeecg_ad.png b/src/assets/loginmini/icon/jeecg_ad.png new file mode 100644 index 0000000000000000000000000000000000000000..19a2583d43e49ed899d24fa2e4a7c18bf344ad1a GIT binary patch literal 85653 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⪼lv=43gr!U&! zio~R?+Gx0pB(h=k!Fx4I*$V;5OmW^t&ls6ClSN-}XRdhsZt1GNh~m)O?%mUlN7}%W zxXBk!)S2i1UB+Qf(FP;>vx5mkqC?JK^C{ge8GeZUV?9)cU*iagaHDnp-WGlv6~2h< z^yJ_fK!29mNIK*qNzW6UfB3>JcIZm|lUiPraOcF!k>YacwyQYIrOfWm52E7D_BRI3 zCK@-A-m zu&=<%_7~c^e6&%sFW$t99;@v|22`#c{peQle)YyoGXBRLN5HhDQ3~X{dK@Oy z4cOq)nlObuBxI~$yM&Y(8t`_u2Y$|K8GAWTjp+b)HAvUP*6$eipM{qdALdP22ujbz9y<9@78fCWmv^Gxo zAf_zKLWE*|fYrltFU4+l@MaBd^*lUi+50{h#zq_>sdA|q<3>LaY^qpKqsaMv5E5~{ znaPDXM24q@DDS;Xja@%Kc91O?_i_0Gue`iHK!sj1@x^*AC4Mjb-nfy{dU>{=vwd)I zk-?vqf zN`;JNNTiO$g;LSe^^{`VMXr=chKG{Qme=*R)nA4}V;)U2JU~SUH`nq+Jhb+LIw|FoE|VWy{f_v0zFxOha~X;1bI>{k%&A zZjwG7v`T!dYwHXy-^+d)4|jZ*Wk9<}uX!g8ks*}HCQl&|jiFTDXT!~;tNNe9V0|4t zwuE;OU4s|vkx-sGpU^>?a0E&}e}L(4eqVOBRg8*)mw;%1*)dhZ1VNoNO`Cq6OfvSstV)Hu61z<$5pQ4jlS+G z^>QoPIK@M!fIo;TW5Wm87kM@yEiyzP-!J5+_!w1%pz}DI#@wcR_+MsB2nJ!e$+W2# z5Gfwn&~h@=k?luUeDA;$*rss%%ONnpqFe~Z*tff#s~(A2?>ppwKDhOfXcV#nzeI>( zOgqF28D(xY(xDgyKhqk$y;c7fI>#03JFZt~{G=)zU>6iduZq4s13)Apx>Oh7Oo$h^ z1|8!59}0(f@!Dt?jPN+Co}s;TPFpWIgd5>jcleD2U0g+uw*LQ2HN?vm*f98^tGNhJ zuzaTw#DWlhpIv#1AL>S9Bw%ksyUY$d-P+=!FyyK;eOXJ&iT|g`iHHyNe`-rez4-1U zofDnYjXOKix}=*1GtJs4eBlcL>yc&i-k*B4)Nbv^$uecbS67$Vh*i8$CzXKi5i1q( z3Qp1T!L_a33u0emhFNd@7D(*jE(@y|vp)i9xXC*%xiWQKR;FdYoL0$a?coliODeWv z`hQeR1H&Q>5Gets49_bp;wv4jWrZ33Ya5Qma2_<-WgXu}XSRtrOT@2}UtMli$z^wG z;)C!<>w0g%Ima0H`#{sK(Yd-iiGM|7F@Aphp;`>Uz{LEvxz(kO{!hD%VPu70zQY2Q z7bITDt>U|hRDLiem__DDOWuqcFX~E$AnxG!5;Dws>f!&)8{!{0b^gZ{rt5o`*u%m5 z#D)Mr1xn&H$HghMIK~Swc}F}2-%Gzxpb2A9Kwjg}#EyAJ z&4+b%Jiw<)bSmhSFFL?f+oVxxm9}?M+8RLksb~5e*31!(tRPBjx9lCg79gUJ@DS=X z1$v<74JC=T)5N4G!jZTW^dWe+hLFvK_$wM_a8DcEUSh(8Sm%t9g1OaleW=3;7)50I z5S3Z$Ljg;jU5v3_YT0Nq*}Yb0d&OyYQivFWo)In>QTMB+-l7LLSn#Y`=AJOT2vxle zKRpwHiwi~nagU$Z$e=A_patt`7LMjIUqKKHK@6^^(EAMlFiJk?ytXf!q<-W^3LB(z z-5FD$ka=)mn8N*-1g%F-{NV(vQZge-G9ToAv?Di*>ECfHrNA|SS-M@!{43a*U_n(hf}@TaPn`#^nSX)REs$dxc{>T zsciGbA5X}@Ag)rS(T;sDLwd)0Jf&?&P8VtM=!1S|qq}fP9b6(J*;;)9?q}ROqB98lwpKGP)B$ypy??)dE;Y z)mQDY%A9(}z9mP+faJq_5HG~28L}<(ylf&9lROb;y&qhdK3}EI_?Kp#B(*b~UoPc5 zP5ReG(DmoI&ITQ#P6vo)vkgS^W?P#VO^i~~gW)hp7gc?MX)i924k5V&Dj~Xr0yRra zonB01M?XoYz6ghHH9{Dyax@;gef%y@RolkRuhg{YZ(MtZ>G?dFHK^ydFo(iQi!p@U z`~Zn?bojO-`{B_3iz5>pMk6h+FCI%oEAx8311TN%PYc5bE5&Y5Z`0ypJ@!xVRfHti_@H0>!gu@R3CI-xU6%>vfkj{89>G`w11%B(IxaZ{N z1IDfE9!j&-W-#{J!vo97;M+jW2or*59JoY#WjQ?iR&EW0HX*;ys37A2C63?uCyoJK zcTU8uauI|5c4u~MDEC8RiYk4sE-;Xh zYz`?}bLcfdhaPOp<*kXSxY-oJIQ*QoMGt`WKeD{Nj74^t!g`jmbspYtdI}ib){^1{ zHM`Y#l6qJWnu4Dw^B52c_J5+G&ePl|wfnd1<#(9a3K~Y)C8sj7db8-ZCXPQn0h&rS zn8&SB=bS^py*TG2NM~351)(C9oFvEEIMZsWO#w*Pm+i-xz|ccn%r++vSrC42S0|9L zXU^B}%b>Q9PC^be1rUqb{&-_t(lRD&i1`5k0rH@)jco9B{1w#7ivXwT-wVfdPZ2W& zGN~DPf7`zgUKWYqzR~nrjE9Qic_LL1p#uo! z-wmqz-Mbl0JvwE2s@5ARvG&%;djz>=Du72OhkP&;3xQ((z1ZO5hkur_$T>gW zb>1EN^|{YN#ajV*UA?Nmm4CS|ex=7kQ~U7wz(fHf8A9{!I&Pw96@JH#9Hl0G>p{ae zxQ;>u(3W*HJ4G3#0bXkj64H-gf^_nV!*@P4>m6Ce=sHaQ^6)|EwR#_HH89r*e-NCP z_*rvgd=)Na`up=KsBKk$hp4P1)EoT#2~qe@n5)$4-f!=Z z#gNXegT!3bgOJX&H14IQB1(@WDnx3aa_R`3ANHTYb7TK2^%b?1@tHZvI%a+D%FcL! zu81rR@C|TLf#$;X&j_YjWpp%@pn|Nw_-6bKk|)tbc51u zKUyKuy7_70$pnoj;4|Nnaw9W~C#2}Qz_HhTfRn?Yx69uiu>T_dmlxqwe7#Es9*O5#Y?8)?I;kkL zn`SuxfnfSm`y#)&5Y2*pbB^U0=UwFm+H(F%_F3?L%mH6-@JC3e^8pvAzN@UxuISH6 zjw+lz^E$Cg1g`pY?V_Wp`?=frm@h$WEvxR<>$-if`*aA=&8mCr1IqxUJPo|><|n-y z=r6X1N<@F6QT?YI_$I+O5Oe59aUNLm+YWgBiX5E-#VT`;c%bl`qZzBmFxL?PxB_dR zW)=%A;Y!zS_b#LuBd}csdX@P28WhhAJdSyt22_c{!5C!emXQ{#Sr}S{h z#W}~n4Ll9s)Sz@7kGS4Dg!zcVt}kt2&C!@Z891`dt*Bh>WcoE1DLN2kH#X=PK;RwN zy!QPPo@z${j|mezbf2T zwMN94@=<@?J*)yE)tVI7*rmnuzsF?w6|em6IRV?{Pk-G{1;=}$vMF6|S6taP5p-B` z#9NuKFD|>Tb0=|^wlk_Cogy@F55PhQko9(zfCymns=AaF4C-=-r20fSKA__a6#f?& z0f{hKc;s{FQvaY5@8uZqXLK2Wj*vuaEG(65^07XIGa$&mGX{EmJzMTe*4i7-^A(+b zz3j+^nxl4-(NvQa$xb>GTlPV2YbYrXHb1Zx?i^9hG`N#Rg774#5m-p$f%7{Zh3^_k z!Mj)!aY*)z>+>UJ+@<&9*Upcxuhx&KOE9)nxe_YZVM3UA4ZNt+BPG*x+(8ugFTeE3 z>~37wwS9bgpcK(tyI;N+LebT#dfHW~=sbOy?|||!JK(>(G3mEoifPK2@Tplw;rsPA zi%?50>f+Af0zhba-N{v@d%61u(Kt*qH6@yw3cQ;uRLU;x$N+x#nj8^GbV|3MmoPd+ zL+4ogTZI0S7cKw2y=M~BFg-v8As~L~qwv(R@|5z-Z!pMKs18t-aIXCXM)ZkO55oi< z}+UVM~El!doLfGT`@hLevM5#HobkQ8B zx~TdV#`J1&PnE^6NB3n+)T}G2+AySVAMHI-b7TN2eDel?=U`-;W?ahcS>|Cm3$GPE zXL^9nO|fN4h3E8y#d$dC>Gt6!CG~q+>@i*0go|9EPwlMdS21G)*4*Q4dHuWLvBU715G5{M>IxelHl z4}r1SiNO?+6w5(=f=5AhIC%lVB3gj;XzH)cqjMK$b6YwVM6XBfiE>j4CA>m2hVOX& zunX8AoR__TrykYrk5TVbSq%gC;IOlhPK-)kha**xv!edh>Vsa~Q>Hx6Y1{xa$pT$2 zFY2#KTq9j@@7VnR&=zKl9OxQD7HDtuX#(F#nf0{T}nW@Qb15CZW?W;Ayz>3}XyK6dCDr+H0{;ww@8 zvkdOZj$_b#M6DMBgzb;4szJ)K{;kR-3*N~-JRo?O+?42!ZV)UaLCCJ$B+Uf?$(628 z2L-Q*Zo9tIlwi=c4)+8L0tx$;(F_YiOEZw7sdvE6kcjh;@`vuvAL1V(uWF`2OgUq9 zC`H8i04DfaZ%7Zo{@ONK!{leG%yK>ipjc`x5-|E9`h(N5e8sD0( ziXZo(JRryb=$dj>7W zGq<$7CN@H^T?O>xF`h9{^B%5EF`#5nVLeY0YQHOfOrsr)J4^$CMn4i;9hudJrSlYNz z9!6+@AQ_VkdA1$uTN?HWA8tSbvbJbcUDThEo&E@Tl1HHro10mga9?q=)wKY z0(w}@YY`$;lr;Ej+@$b%dic!SO`HDh!@4QoEl6i*WQ_6KbHU@3ozSGmm;c%l5m6oo zPR}MeAPfN>kJM}z{{_^86yEoiG10EHI-8I+K_dJ<;H2ME$_x2fvk%#{?2rWbVbWKE(&-nVbmNHM_&~6i(4^ z8uZ)iV35pJ{>a3!z|Mush7(w&%}9I&kP^@kL>EYYM_C#dDrM6q`f;s_kG^;1gc99G zC?nr{(SDhVPuO$w-Yl!9Mrabq=5O&41P9z0z`CAqoacqluLc=clrQXhaT0+lqohlL zSXUI@MOBGxf9vavS@8@NqE8aj|kLM*t z%gBB-bdaN4JU{GmSmLp-kkmp`HCW7#UjY>@4Y_&#h!1UitrX;gqyW2kN5>(A9_z82 z4|M9eQIb}n+YWF+gh-yl^zZe8EkL0X^ut31-|2Y(`jBYpF%RxNRf3AgZ!@u}5f(xB z|CMuzV%EiJTA0cjKD|%jon({-HteVnQsU*Cf8NR?-{0z-Ut&QVhRyf^l|IBx*0Tub zIS{i;Mb+KVGcrUJ&VF@?_x`2rPpPN_0Y2feR0@e2B4>)9D}(rJx-iruAsm_a zJ0>`-sNY_#wpS4Sd>yTU*1RU}i$?v!hALA-tbsNOM(O~D5@ijVT5o(e> zeaA2>cR&D`eg{rmlf7pdZ_`Rig5AWcCYNFLq|qb35kcoT%-}?U-}hf#5fSksPlog_ z8N;Nyh&Zg5oN!ob9ES5=pk_Q&B;#H=88Vm!0aj3c%#53Z^S^HD~kfYog!6dpP(R_j`d4CQ@#v`Ozr9YiVZlP!WKQHW}C7RCzZwU=))?w`naz6 z504f_LRBWwNKa)BP$V9@!0EV^oqMfqoOb!qbv>bs&&&u%6K65sV)j(;-XTH`o=RU| z3&U}@*=RSr8o6~~*L&y!Eb+EJ*Xw9OM`^U6Xffhwx{U+jR&941-layOp!_xaki{&Z zAaBZZj)|VGysgvcp_aHEh8=a>w5N9hqujA&oQ%UPp_Xg{uOw&XOIa*iQ#(q6#~=hO z@|O#-a3YAHoLDSxb{}V0?d%4+4l6vg>;_4HOz|Tbf^>wy8s>%PGgGA;+XdM<4#z#J$_$F@<6aB?-#oLHrkCFe4n!ZWy>?g>C=t_&XmnnJ1iTsvggtXry*}AJFtPnPGspM|&yn=h z-YdC_;JGWq+uPgr`X5T>>6!N-a;H=;K`H`xsY)RzcqkzBiQnb>f?9WRt?@pwaf|}- zouwW(vj3YV3e)w68v%U-wPoAMGlc2(EQA=hUtAb0vQ7R;el{(NU1t1p;3FOE-FqmO z*YWZ6gR++GOvT&I>(e^emCcpug?ZB{64t=p(iKu!$(>@`)teUeVSJ#n+>-sG`GI90 z=$9YEJ@{e`-wY{2b4^FlnGU@Y{U$W^ey#q(Kj@Mg@aEU5EvoW&UaA%fQd@g{$v+M> zF9VfEL*X;`&#DG?_jQohzI&moN48y^&D5T@Z8v{yWa%W_dyvfN=?;vqdCA_rmFaHU z(dI=9?ogJ+Q;o3_mFeD(w%~*GI(Se)9P8tU+l_)3Lfj6!=*%_Y*wi~zSro{)`rcqj zeO@DkFbw;Iw~^$z3ro>Rd45Yt$->Du1jV!&&hyfU%nM1rybMuo0BBW3KHAJgYw z9gr%(>8mKq#yYf%w-Oryo4tAo>a%$$@>Q))9kq@Cv-~F)z zMhM0VDIJ#55-VF`BzWOnyfrOYz2MuVN~S_aqSiheOgX+$VBmgBcPGNQ&K8GJdlC&zjTNr&H(ECkjEvtnjdjPk)BM87QSG*n z*`c5G=yuj%|5#|OLkST~P78(w3IS$Z7I<&3N~TG)eW|NksA5B&i|xA{|C38h=JuTX z>zZF?)#t#4eDsJVHbios;k=bds~G8a+6#xhsW>@nH7b5Is!RFIG+TW8Jv-gZK#Cr> zG@gCQI2Nk1mk9@6axYcM2xAB+r4>5l%WP{xY&H(7D9_|oA!2|=^ zdXC!{j!obp$%Day8_!|P^yqyLB~-f#Vpv>20VdB(Va>hK2%(}kmb+P1L^0BHM}9>) z&>nlwWm9{man*tQcy+1U%VK?u%B>+S_2fNcs4^V7vozpC6$`jvbdst43(V@}Hr>H- z&nLCcaK=1RotI|PqNWPai_=_W2U8;^)PV8dFN!eH<6XY8@aAZe zs1LeBj|He?XV|0ISMB_TslX=3(-V5MNh^25N<&Fh0QO7yq9;mi(r~179&rs=KL|+a zaf03?byB~j7uJ4>f}>TMec|eJ7CoHNm_g(R?i~eO+(fYNQbl|&h05-sQSFz^l^BYZNwk8s7a|;8|2R>q-UTmm}zAvGI3#&{#9&CZ92+Ma@FVI); zwDEyC5t>iV6rQA^1kK_<5R3{Y=z(LEesj?68)yU8=m=gb4>J^NZJ#Rr&`6|H%9gBM zl_-1% z5F`GCx?yJ;MCMvMQ3%}s<~u8Y74(86Q4pn8BG<`1N8)XMc|2xy@Vn3FHP^xKAo;kY z2sv1YnPS{0)&$&B@H}sBoch(%82_rD4yEe$rlj?zT}P2gQu9_sY0%}4jvIGviyqHH z&#a}X>ssIxISFU)_`ixSA3K{(oE6tJMC=AG=ns1Y&JtMb$kFEsFS>IxdbbtwuH6%P zuCESZ_9>V$L+c5g)papq3tv;xt3Pa^iqO5pbaQK!U|7t5*Wk1Wc>;J^?V`J;K*nca zHLMG`eY@agxBkMbPN;qraXw!CX3H`REXe@2fW*cIfLZO>$d*aYoCh{uJhV zdG}wx8KsXJn!C6Zm8AO>&+k&HeaY{_6^5=0Ltj!_ziFumS)=^p^WqbE@0h3k&+%hR=z#M-F#A z0Fdd4UW?!uZPo(|W6N2RQD?iPwI&6*yPnq6h_DG7V(!#DbWf8~`GQJnVRoZ>POiMj z<3dDBO8iPLB)`59tJc-a+r*}Pw+AHV(a25|l`*Xxcs0l!+prEYQi=h{W(%AKf+t!K z398wYZIQ+*lwfAY*Fj%md=2@5tPm%I({rh1XSOHH_jU6VjVxp3wt1UycOlM~)>=kB zsc&XUmcGU0g`2BOkD&i!>MY};c%!~gcXx+~s31r!OM^%#NJ@7u&BD?k-4fEZlqk~D zNS6W%3?-dQEnQ1W-FyG<7tiy4K4$x}Rj17v8@Qx(ys}0t-Kj)*qbi+@x-Gmba zelM-Af5$^|aAXxyLh>|94{pe?#0kysT6!Z~K^6=FX9i}5xWGQ{N)D@4;LrD+XVyJY z7bQg;3x4-ERIy@7a9N4`@q4$=PaZsk5%D3Q0y@;lWB0&%9#5NkI^VZD|pWK4m_Ntw_|bQf_5a_W1$Uv1RYYWEi?!;Lv)rOl>N-<$;O|I{Fhs@ za;b-RUN4UkRfB^^+q(;1D+-d<>snr3*FqP z+N%>OqY|I$yq|NIkuoc$hljR$>c4#9NMXA1TW0Bg2VeFRp}pSy0fBf5ld(CWL@u1) z4)*TSPfi{j{hIXK!)Uy$+KTi zykdeX99a>8J&f|%%`SCwkE)`VV!;$VLPm>=ILFmhM}@PI4=1mn_y4HQ?k0kzXU)y& z2DXPl--LmX869Z}>|UiY_bq&`w&q}*{Qxv#Szvixm~4vVN^?|vBcDotfx=uWC*HLC z9n3D#1}~mpZC$F7u>-@`irJ`3!z(A8ws&GUBDK!85yZRt1W1^lE0pH*xT+22P54o*q z=52V9xl>waV=_eMIUw14?cW;3?MQL7ft3;&ZgaGLtWpW8lT|pWI_bQk0zg6|zC`%I zt{4IEX6o80(7=B%(|cIqAB?b_vedB@hXw}HOt|5l!VO5Rs|Fi|Ph1;&%=Zf~H*U|3 z=c630vm%TZELPfVzfleQq%}?f){b-!-ZTX_J=gx9>s4eqf2TSY+{Pza3T=>)AOCAR z?2>WRbNDv9n$ctT%*q$aPXX#bQN={_(K=q3E?mY^h=+>FfgkXp@J6Fz1?A3enOS4F z*9w^r487&>(haI7lFk{`Gqxs-{y83}_%^_J`~8xcRAcG;)$?(FpUtN(#mw;Qi7sud4{3Lu1Qqu#3$_DV1pf%=g){T>WZP{{Wc z+Q=_m&PebVG5nEb$M`nDoIK$BvH5)!rY2YAyD23yIO~94gQ?eQs9eSB+WC2KtOOq9 zr0bQ)W#ZJ7Q0`<%Q*GwosJ?##(LLhIeq?U)9gvEK-XeVC=t*AM7RhbAHq*Qvl|4MJXYGXP(0^ zuI7)?=h1Y$zJW1&I>uk;s)_S!s5+ztSM|vx?M2fYCSn=zlf*$r)h4i|cVJ90K4jQ0+1)^MM6O@ULn5=j^Vu*c6OMLt`}7@@VZah1SgS8U<7=> zc>g81`K1=5&o8mpa2P`fFW1flSwM)4&u(9Jrk@+OYrw(g*>z%$;Is47N?|v8q`Hf_ zSHf}rTXtlV=;KZxx&~@m+?%#K`ZAs%fj7Ucz6D7rTE^!bQra-ki^(iY82d8{)fZj= z+mg7(&Un(xZ01Yf*mnX4X>=GyYU+4w_nGFY4wnkeO;(_aduK_ zT#4-Nn2xSz-d2u0ZC9_Vej;*-hDfwl^d{ z{+9FXzCN3L|LB8yBjT1Idh&y`2f~@^3Ufh!TN)cUdboVZE@GN+Z&uK0&nq7f6feCA z!kgV!ax#G05$n{yc|BAW7$gK2UJKsiOdTUSvNwDnyfmU7`>8BgWC~ft{nWFC`37Vi zK^v2>wwL98(+jQs;zYt_huOb}I4cr{py1SsGaDjNE+m8WZ!GXZ20oy*Be%l-Anhl~ zMO2;PE;i-9j{TW_7<&TiF(khY#R1=2EE=SR=AWx$txR0VD2&Wx3-#>}Q}+9-D!LR- ztS6tHt3`!>cz+IiGaZ06F8_6JiSs~)7d$DtE)ubcwU!ky7W3UOzzdv8IFm(n%lLBi zK1+q&GQ3`#=Vk-S%*C;Yg*-o}1gM86YS?2x$iflQ@p@}w#K62e*+AZv5$YfNPYFg9 zeN5mAg;;ccXZej;Tv)l3g5`M5i8L~UDV;hru!Xy$@~zThRD`hk<fui-s%YQFlw+ zo)ntZ7x10OYq-M6Fmps3dM`)ZCr(_vD!B@`&{H#8RwA7Ayic-2F~AdW97yYcJfinq z&%mi_VAM|WXcX+9V6Yon{cl=qd+Hfxe6&w8zM-fqtnodH$6ZBw=h>l*6ZqqUfmD5l z=-A|yqO-dLxa(rlk7cT^LYOHLg6i5I?p}YvZiwp~?iykpp05p^jw13WFJufs!MNax z5lfIhacok_DZI5Ol@!%4a3&~x&Xqo8v(>L&KeM%xrj?`3*j_Bm5Z(56?0L~C{BMTu z*H+i6_>6nr3o!ek_~^Ca0&69%kpAV2Br$H{-n3cz7Gjc-bgqq&o%65lYbTo?zit%T zs1ek{IEcYHOiw!IH)^qOrKZxuXozZvee_qUp`W9HB!_IU!H&&>=L{16fCYa;I>Sh4 z82;!KI$~Jow-fxF)2UZY)?yurF))X=Fy03boaYQ&(Z0^3MZ#&{iebBV5mfldvIC5A zi+Xbj@49>TDqdgz$R2G{ZTAO+zwJ-n$E)zeNsA2e9kY6vUd{awfjj*GWU=Y0QF~A@ zv-9DH=kiX!)Q}=9oR0SUt<|VMTT+5ICozS<3A~_R!%Oj>x+sXqQHWs}5(cB=Xlg*~ zdCrfBSS41a-CmS$3}4n7Z%|wRv9of^h^l|G^A=(RJjXD)lkLk- z5J50uup}(Zd_8MufECS;l7IrzgE0#%XqR3ZD~KzJix(Am#;iH5I@#*cr>IaJb{*RH zwnNQWLFXZFhs6nyxM5dt4i7z|r(vkn;L5KUoh0z|z4nj5dbbRb2n)*=-(2A9)88Pc z&GC6L`4aHVAMf9>gXp`9JtH_pbVHfNYsKANp#5~Ye#>WC zQ17?SHmvJhhalxuDW28aD(0Zvo2xWjGt|pZA+PWAKOIzk&K?~Rm--r3U17(ySq_w+ z73_7D)0?!&aw+DTkuw%~ioqKRXZ)!1Ae+#KF#)vyAzGC$*b@^&b5|s0bm1@xw_fo> z@JE)u$2nZkd$Ixd;pArEk<&}n(VIZ2NDafFOy)WUvu{SzRf~j91yei z&jIw^^S&&=N0u5cESKEk20Q^U`suIi&tRW>QEGp-h){PZB4EZ(Vxg@LW4JYt*a#N6`zpc@LvAO(dI{$zF> z|A_e9ujhR&>VNC8Ax2B2!ddesSaw_cDxl|>F<7syrYO-Cek52Q^aOtIJNrr7s1ejv zQjZw23M71i4X+Nb1paxLrX&K7PIut0WA5Cb(dkkSmRt#tiyv2`4eI%*N)*;jL2ry` zL_H129}F1H$}v)%E6$lL!PL=tOY^QrNWEzlhrvR=InhK?GqUN`2u>URm4VZXKPidj)-`@py??{FP+L`vD@pX$s~j;mZMuHp%q;)wU{NSEn3K!q4*{- z``;o@1nRvK(yyd>Jo(J%>h+J2j$N@#0|n1hD&`Irhzw5_6x5^hjXYi;&~_^&P1;_Fp=Qfx*o ziPZOtI9;pJ7;p#>V%8G7mIdzx#)=)C7DW_K)A(TFx%07E-W`>6u^)k$^z^V+lP6uid7L>EX~!~7x>ASu*p4V}&m7=rIN|- zAK71GHRgveNeg@E2<^k6dUe94!#E=M*%H%b1WV60?CcT{i>AA`O86@5&UJZ@ClZzeaO5X><=Kj` z%Mj;26e9U%5WDYy`o3)E_yrDzFZFkgHg(nb$gqEI!es9xb955Qh10%H7PiuESFejR zXNSp4z+{XIc9PL*FSi39PZrU}#pUYobB9}8k!JIf=Pj6(E*$%+1Y5SipI?~ixrA{{ zO|+xOrJv#!3hx9V668QACCOvMVNZ%EIy<1Pf5ld;efjLAnk|vi_Wt$g03q{)OHe_- z%adSgAh_2_1_RJZ8O200sa$+QgZE8%pF6kM7{ABIA(`8=k5t%sN8VQ=C83J{Zx$+% zUO4DF)S;oW0mBKW*K8h<&yv}8HnUto0$dZB|0+va0fGMm-34;o)6W!h)lPwEl> z=8E##FSI93dHbBOqlgS7A%bGer$Py2eu2~P6kJ{Pc&UWc>Bb-Oda>d*2`(0pGv9OyZzND zx}#D|TB=xRv`fgLm^06-NINh}n<@Y98Tc}4GZLYuJ+HJ)T08uFURD%Bw)F$s&DL;W zESIhGx7s0=LoschXwC||c?)BcEH-k0JynD(3I+^Y7%Z&%1$f=fref!8jJ1eK2O8s_ ze|*?fb`dGAS3(U>sLLFia37#Q3&oxZkReHkyE8dTElgy7Wpob>j9r%otpc)RPfS-B zk%*R{!Km8PKYJ!cBN=y;;0Mvh7IJtqFv7{hR{fJMURXcF#fo4i0p@*?4=(E1!JPl{ zH9g_rr-tfl$O}E>44E}br)WL@yljv|M zOUGR?yk5N7ajrVKlc}BNJ2-{j>pTnP359v5C=wY9spQcAA=q!6i)a0_+u7?LwQ_Bc zo3&~Ku4VLGZe(dz+@hCpiHLHTi4-GtL z>%Fr2x{NHWZsZ#ibN&SAX}-=ODzT9C`Q@hlmtRxQ?a_G#Lb!uGxC>2}4mKPgj1ra))fKN2 zy0E(52#b^Y{jNzr+&XS+t(?|m11z^dG5KlP5wqcAczAxmB$vb4-Z{wBh~~UN)q2;i zU^r_~K>o;j#f?4+Wp2O?m4#CRX8vUj;H`cuubsO`Rra40b^KMe+DQASg_4)Z=fmyZ zs!ncG9C=UYvN;sn!bzlrAH;i+oaTPsJ!(jd^ohVIoz$kG-fJZk8Mx1Bb7b@p7`Xws zSTc^sML~B(%g3>V3dT0Ye1};p)`scj3|%^|08kNa1ujfELeyeKU!%qN_pa$Rjy$Ls>gA?nqzX*o`kHWvYGw&Pe zuLiZI-t@c=8`iET=5J+i-B`pV&oopbInn+dQTnL9t?L zrjR~~=QQn+qFKyTrTvt1r(gqFQ-{!t4$-S6fy$d4`~$cqDhQn;LLFX(iIwSZ@tMf| zQ=TM|e2C?P+)MLEu4Fa5z1Mmo5$WC89?EK@)iZc@!Cd#Bx2EyH-#)Bk1uYDD7ta+I z2hEu?P(0fQsJh6iAxH=Y;C;DUvgKvoh0*2STB+khXB~ciHB2E*tir5x{&}t@7<1jC zvv73yAP(BOWM^p$eF7hW|H-<06w`qXEU3o5vcr!jXzX=2-C@QF6DF55WR5NF6H-&W z`}yw#am{jj=(5FiJ&4F>c)crNid#^(eD?IEpxN7{nJ%IyQd@f|*(M}F(s$VcA1gyl zxPEYUCBLvcbfdUyNs$a6@vJs3#;if9>w^ZNWMH z=i^N6w_Z#Nl-9N_4@^x|<040^NgYiN`@Z#D|4y@WK6dYD4ezBgLcOn_0zr=OaV|KqLsgxJwJ{>x9D|;G$jh#CUbmPK8n~EPqMq#ibF4~ zd)X=QOeNEL)&?x*udWSwieZ)?IND$YA$#Pl4FZM;l88Is<*TVSw3795=dK1oJwarlVo@atc;i=j4_* zLb~sWD+Gs~19GdH52`|~n5u}H8&YVqCU*}P_VY;H92zY$T7O$`E}oSPxV&>wI~|P_ zjyNiI9=;}Oo+4gcmiiQR!s=pI*Cq-t#{6|A9kG(2dijOE>=C70pJKvw0JjgV^-_s7vj2Gy%(U_~P5${1g~n-a;#YIsT{)^K>Pw_nwJGo&q?D zsW}f`Y^|OrbFnsZc2W3{>G!Lc%5o7rOu}vA?IytOWTI9o2=^oX6#L65iT%~u4Q*)1qgc9fl*~(@mJ&tR8^y^)c8gm-^2`s?D zsU#<-$#A@>k<{zMBb#Zn!TIr$Y{}f7)3-){4vCpH7)LF>bR@M;y!Nr4o5{pMkGPF?QAEI|*HTCVX+o5*+cIuWvwp(~#vjBY8;9tN(nK!dLbYL{gK@1g!RnJBa>hOxYwHl|IvgMHze%(xc(=VTxDOs&o z8~T{c?>JAMW_Y2|#gBK5f65{xE@cGLhj|0jdfkqf#`zQ*?p@zZ?Gg9?O8{7kDPAh^ z3IwbMdN(8tJjH*>5nBVV?8tyBg-W*`NhCMOBJ33Gd0V)+9!r!AfT8NjDzg;eermPM z&%}ww83h&3pKY*%5I*>aATe2uX+lGpUReHcjNON2yqbct2Uyf@IJx^DhRjII}_+)8+tG7>I zy6(fJvj?$*JDohUI5tmKqSXF;vWU6er(#ZGQr=@*gu!r(y19=Hw3-i|UB%+E zy{SQhu5OVqiK^EF;W!ze>%;^IUoR}gv8!hl^qXNr)mbEojuvD!IN+)U|MWFH5cSSV zEN`(2a&M z^ynPtEkS`#pe5@obH3ej3c(2L?8-oIqT93sNa|PpqH@b2D}F51tjooB@LB6TgnM60 zRcKv5fwI07N5Q{ZV!+z$SusIw2e+*1Y&#{u&!e@SprWEA2#4|Okpr7yPqlCbep^+k z1e3sh{wn+t(_0?73LqR{OXULTk>a8tBhWYjd>YVm#aZ~RwGJ#ZK*`F`bnjL<}h3BSD1}E-N zlO>&dW)`UV7dG^P>s7a0nsgc8Ql+pII#weFT;3Er1U17CR-lfDnwUxLJ^sP^Q+Fu- zsO9`0!^&@l?P+Q0WWm0@Vznaah)1tKBg-DAC3?^o(jhoWcSjW(5g=PSnU^&&T;UwtK1?%^8cC6R>h08f9UYRZOh3DfiyYjoNzQ12K2eXf zg0SjVW3xz!8kp}XR#HSQzVHV$N=T#&%1K1b=b5(s-hWKp+x%U7o_T$b2~j4yBB*bz zlK{em$J&4R+-SI^62Ns>|M<{@ZaNT^O}8Sipm@;TzPW1dR$PF3aSL&g{ye80>oNYw z)GCQnhgSb#80>WiLrAC!7-{M0?m0X44G#GzH27RUkmP@bMn0wit7(Qjf}m<=JKrE+ zaQRPx;#bJVHM~W-Y~+;uq`BdI6xBD!brROd`FVHl8)9ETZ*m5H(a1+G&2#x z3~KZrr|j_|G=V(S0AGz-@u!KnI={OWgO9QPc_mL4@<$ujLHjwQID#1-Gjn7W*oa$_ z+5IlhAapC}mwj!L`^%$qx>uTbaO@FxwjO)-E^nvSZ6de)Fky2a?~aO2JC=5L-!?Ha zekb3Ex}32Y!~fFTv`)Sb;yJRkH7K9`t!590=hGeKY8`pLq%0;(|~sUE&T zamc$l6O~W16>`ZdTy%_;;*`k0=dWY>{C@E^sXu7rAid~;QPrO8Ee#`Q8j`e-_&)K! zx9OWj69de*_w>%yVrK}c*o&jpRkX?P;$1E)TqbI4yS~8Lc*X*zQLbjjB@AEL3tUD>8 z%vI}Yg@sy)->xq}&|K!T(7!S_l;HY$tGMA)@}6s_9&r@`OqHg$0XV>40a8(O!XH0b z-$!lf{}6xE<43i}95;U5X8swU=TcTNN~~>U!x-IBK7o&Op$<;Eh64O~*#vW?xR62B zdnqu4y9mr_V{a=&JD#=g+)fseBk29enVHsQ=W(v6#zoqZ9lJ`kE%9iO;w>f#ZM2o% zWB8ogqdNx+r>ZzEcx~93?y565A2Y0o0lvc(Tq(ZpbcOL$5@`UtWsVe<7ROt_oDp}2 zX8i;NjkTxQbvBbYeqeFD)ThtsTp&Z{{B-v2 zQxL`xBU6&frM3}9&-TXF83Gvy55X@+N2D79|#+b+7+IkBs zz~?hVh1(b(J}$(~aKMFgy0$ZgX9M8-deNV@oa^VJh1C<(gLJW-@uKx5r`vFVlay=p zd&1r;!4Z1l7q`|oi@rY8wtaqgRA1R|Vl^x+{3uOfeS!vwXfu-nV<}|3B3^w%!uux@ zT_y5Ss^AJ`%yaAtc9rMMGa;~?#Nn<81RPs`9xpl|_^WY6j0^#QlM;Tuy|rhQXpXl}MhDB{McO5Qd|MyP#)fy=m|ka2RDL z6}*01<%Ff%+z#c#kr?*n)~G^R6V`;kn#d1Ml1kcWA}(N*jh?OpNcSu^ZIWAJ_P3-^A^D< zVUTj>AgDTq6Aw8>{W6`D^^1EMVGpS@h z0`ts0OE2`k99>ZQZSPEsyh^F4THUXDzQBqa~V~4-AT3{Izxqd`Mc}wDC0GWg-T6l%tOJD%9w#GA|^~CFcsaDyE zk%Rxnr}epsAkQEckdk=n7b`G3DnE;&gLsFoSvtg5gOTDd(2ENy)mJShQH25wU4|2) z!v04%*Ogj~PU^Q?-mjN7L4oH#omy5nL-4G>5u->cc> zS5m&^cjv$7J`h)ZQt$8fyuU?mn&SkQd=i>yKUtZhv&%6T$bkb9`xg;O@{02rD$oNw zxvG+@G5hQYd(DtXKyqZoH&(3q)@VlfL(2+5@6wSWYB?0P=*BPoBl8_3^FW~f!+Fvp zETr%Ka#j?I3m5sFChZR+FMkQw>b^;YwG|F60v?dh0;V?Lk9no~Acq;_1hz)V7?0k+ z^;Pf7w)y*HNyn3LXSa|#Q1OKxLZV_*XKTF194A^gf@5?J@c?HAsw+9xJ|tWsz~Z=& zwrk>;2A`bKSsM7kQ_+kvs|q%1)N=9;=|X<}yBTr1Qo(@Om+|-01Y!)CkI3WUYILlkK>m zPyBeTY;8R8kzzYmJg$nGURjUzT5`%+BhUpQwmvyuZHc0;6aNnpt&97YCxa8CFILso zJRgVR(EgJ9m>|c*al`R)_U|4m*8|69X1DLJ5EKmRvH(Ic+Diffo^ec)LXJTBi&XkaQ%_!agHv<-_GOf@B0TB z-fH4{Q<*hpg8BD-P{5SS5z@;+D+X8mg|=tpc;8wscS&_i8e;LW{ET$)auv`58+I+0@*6NFpoBV(W|T?!_nMW(;AywacMo7mnb zy1ltAlf;COXuXh=b5k9yA7Syt0IJ=b4rF$xjL$DOqng$hm)+C{nJi7Q!(j4WY~y>@ zIP)BRE;M%mQ1w~PodsD+Q|zx|Y<1pWK&WO--)UNga%Okan3Fnd zSj!tIah1TNQwZx>hWxCHMCG_CD?VMYQG^6C+B`Df zaj9~g@uy*-T|Ac>N_Og9i3Qm$KsuWfAp_g7KBO6VbWg3qy|(9|WS>>O@4xkp=}*z} z#h%xwR;#&nHT~_SG28#;^@W@TEEiL^c^6z$f=%szs+OUKrU96IaZs6?k&-5Kdf70px<) zeq)8R3pF)16YeSRyz9N|N3i&lK;GgZQj`vPb`Q8zdldtOK|;N}y&-h+b6@OA6{BXg zCwEa8#-6Hj<6lj)`7B*upiO_ZMCHI;@I}T_S%`ph08i)`m@w7LHPHg52+rJQD#r59 zP&L3qzQg*Z#LLiQ28OT%GQt&_V&)|4*2PUD1iq}cycuiy_uJqthxREUeKcqRpD@rz zgA_t7cf{Qo;Ko_nyA@S@+pFVn)Snm#ChnSxLVaH^yTLx)^Y6YEdWf2wuec}04r9AFYr>jL#kDJnrSRx4Rk@0Fu;bD$NtUbZ%HT* zHV??h-Vs$%~TH3g>e_{LaiRNxm+f|w=&R?b_^i?7PYWAe+p4!WKk*RY?ObCta z2W{x^umiajFz3c?C^4Fq<|P-aoSIOF7gC*LNITMjBylOery$4`jC2xZrEAv8#hVmz z>i+6;)HA0x#p|N}HkY}$2|-e}sqMstks#d}k!+b8Z;Wo?DZm9S3{UCCFPYaii2uZ2;yj>e`w+;V1+jB9K8D0I-C%S#4 zBwp7Ly$MJXtFxs;s_IpqCdvA|s*zEl6C*1YEe{Hwv@RFL)600bpD;CHTo~KKHNjS~ z-i@Kz56{Ghu0cLZRwQ@5{yJyoB^PM5|}nJEpH z|8)=i2Nx@S8@-*z#A$hS9imX~6p3+)Fc}N1^VKH@padRcungMro|mK*iH+{igCWP4 zs(+ZcY9!vMGy4xVe7)!q&JdMX;oBChG1KyG>#3pi!m4LWv>ZP;y9j-uv|ef@$uvSu zF>g!>uNc>PucY)dk74h-v_4}va}ZBPXXM3V&U~Z8OT&CvOQqJf_(EM2E|Lmik%{CZ zD(tmnDj-9CciGZhTzqH#>7JW64p!Yy>6dvb)b+-i6~yCg&Cc(z{)=9)bWpyq&3Mm) z86E1*QOY%&;`T0ru!m&CuSpsrpoaY}apg7}x*TSEbsqh+VI(Y_+a;-`pk6K0uy*6kx1Blc+(pXKs!B8CjMhj;D*HWTwoavueb54}e>P8qe zaelp)UA%eIND%H5;Qw=YuQ2ImW4o93og0RPhpXifkxcCg*7xF#W(Tma0VAG{<>y}j z7_!#WqD@6q>I_bojJNjv#%#_2JZiFTU)r)hfR6gPuLsd5jf@D3T-bU>lPBoC(YA)z zZw+yke+C{?TrAd@d709w>3ByKYT7iakW7e*cCPrM_T9r7!({TR#{V#lSY+Y(dQ=la z`0WD|#B#`+-a(^;TT#OTy0v_VHip3t){o_rw$Ky?Fmw}4B z3{LlJweJjc>mGVJYY5fv=*@FKj?a;7Kk>YyFRfSlSn__L=e=gSE0)D>M*2s(Js-u@ z9Bzdk64%Ss)t3pHl=o=4#yeMXF1aqM)-KNEm6}FI%VXy%7n@JbP)f|3PK7a;-5&Sa zx$IsohbFI=I4N9}Na$wj)O6D#4&>vslAHEI<&0nkM&>if%XMwZl&nZCKmb92R-6wl z77!*|`f;MIzsw0fHkzHM=<{v27?&&gj^P?FkmL64N{*g!RH>;v%4iSEX%>%~2W`@O zHjU%)b(+?Fdg}*+Y54IL`A&&;zf3qrpc_1rjK{Za0;G^w-s4_vUb8IL!W;wq1Piqs zRmJ&}5(00KffdCbg{nWp8Z)dE!uAmPxWG?CoR?9r170`=Q+E3_NZ|in+?D1TGun3? zVhY>a4pG$j?8Ih9j%H(aJUdr*`Bs@ss9}{^sa!EM3>nI=56a>pK5ak>6OPKMaBzla z+EB-_NRh%vZ1szQiVix_O|WF1JrJH(b@68*gz+Q&x%I&ZMZJ}#XlK_L)T`~n^$sfd z0@Zd=)oI(e<_;*JKwo>OY+daPN}v9fqpg#WE5{pfdA;;)y>afGX7IH`+H->f{OPQBU6AC=B89*dBIaxu&4Ono z@ZNL8G)#laTSj+?X7>GwUfxPUn^>&m7(eA2P9^Db7X3bLf4C;T{ykDz2BsAg6BmuA zJ2}DWe;&N6RL|PDKYlG1;?7pWIq*+EMbmqdKW^fI)bMO%yN&EK^>9>S{@N|&(QY&E zYp0Fw5kk#EgbipcOcAnwkUTl z!7O(ER32fgDQecCL4i5KQz(x0kwJXGwP!9d0k+NJndhgRdUAIv*}(+AEE~}p1U1mH zU7zUT13F4?9$~1F_MkUs!m5&@K~g7W-ktg-wuSl;tyh(5CO- zFyPGT!H!`#qiuof=D&66UJyhS{>tUDD#cZ8Xib_G}hk-uB(Oog?Ja+c$k4%(-&aA#;2agj{o&&_rF2 zoM9c2=9I7Xw_O|G1)w#}+qz}VVJ|7V5<>(ME$!+cnn4XXh{U%!gboZ=-{c2sCQe|mDNa=(*Sxn^B_fW3>ohr?)S+v;Y9@Qr(|vJj%Xaz_M=1haKaww?NQLsX0g$@18<(f2+W_n zI~!waYk80k3g%XG*lqbv!^6AK`DiV;A*%+qjsH@Qqrg%%vxqGq=5x0z^u(frled0kIiRNf;lS(K|HQLitOCR#<9 zNf)m@UHD?tPdIyEjDkc&UJ~;q%QM=vo-UsT@wZFN@wOPEa6h(|(qcC~ac#3Esc^!7 zUDidO$OxFq_>b_+wpq(x7qR9Z>ZT+S#o}?V&)}kPMYX(qP8v+FMk(ZNylYO&U`hg| zs#V%R$ooY+N_=|B_9#^XkmAoYX#R?YqqjGTaj+MbGjQzSzog^|r@VDO=nfNpsC|9$ zfK`6T{O5uZL86YcY;p*3StSv$er58i%;|B_fXAY=?HAO)By}-_Q>nzW=c0>aCMF(9 zSyhX1qT$J%3!nZLiKdF2iM!gyf5*JMtP;xa8`+tU9p8!t`mSjF!ppfZ0J^-n=LT!K zri=DVvfy^cz{ep04vw^lefo`-+Qk_oKY(LCM%eI4mt~suGl*_)i&j*jn`)~~Ob(-o z9?}3Wew!P2w$^UZ$1z}Jy3CmbKY8R9Yuk3iMma~r0!6R>+3>8>;^o?WWpPH(=H7l<)2vpD_INtGs~``v^u6sNT6l>UXYNea&!N<`mriQgl)5 zh_!YZvE|=3MObnUx~i-^%)6b)UvUll(Gr}4x&ryI6KdHE2tov~Y8D)O=5%x2M1n&a zBZMnm>@D@=U+{>lqnm0Yk*}-yM=KgvD(TbpYRKY}f4`s?wX{xTGd@?O?!aW1Cs-a4 zpkg2X{D&S*_k#fTiHfKcz(Jhs+>`_7Y<5oRW0J1f@yjQ!#y6Sx^ox3c6pQ=v8&a?W z@sDMjdjd(1a~IdaEI#857DcYk<_v3YM#ma3oxdN9;(HQae_i7^rrvkN{t5+o*w2RV z3*}V`JwBn$6Q*?WhqLu&zhOa(_V+4ivuimE)=3af?&ZGB&`z~Ee z;WIW(*7wszx)KYX$C1E1!ft(lAaP=*8C5O$OxYA!hWDivY~iC_;}d4!Ao}yqo5$Y9 zlBQ@7e^$qiyRps!ImFndbNp7`ySTD6=Vsh+`j~gc>RT*Fxis=A``? zzisg*fXlbO@H$`XpI0LLH}`~ih()1&m^+M1S>-&U`}o*@a=odfi5yrT+0tlIuj}85 z|DvNElT0~?!yIJ?{euF7R-m0thETG~b(YttD*M1DRs-Yp5Xg1YGVH!cNU*Qe5YiEF zY~k8gmjKGb9}Q~=dirL)I{&1|8;)F5qL!iY+EEx=BeJAq7AecUSH2}BV|xGJFI2+a zD*DUjKefM1(@NT4ZJRJ3@+4sWO9i>PTkq~)LU1#@sU2~f>2fR7a~tdt?M*Ml8jqNqs(_I! z#*LRxSVsI&U;oJoA1eHpd*0(LQjv#(A~7G=p&Bx1^~PMBqxa*Qd);~j^5@^3_`~~? z56z}?aXo=;Bgk6x0XTr-UyZfK{iVF7bc(l*Q>=pdvjpgMFFAMCo+sAabeQ!+fW zBA>>v_0C1VY5Dd?RgqWH^wSXf^H=E$QbpIl_54f;tMvX^3rB`LEXI#1f8$D7*t@X73v(GYJG121bcxrY6|z?G?Rd5Jm6=ih6- zI`v-LEA)oKS)*0b3H9q^E}^QZ@D33Ox*tBJZ0__nro#6%Z!cu-eA{(xw)}R}E&k2M z!28sSWX}EiJ*&-l^`t90uXZll7MSP{PT=5(y`_HWr+ApG03XBEf4dg#k($e$XZojV zT`}*u?}*Tv&+)wB@QxeVk?b#;jUL|FmU8hqODlLa8ZE@kXP2;KvLD#_nk%wM z0GJ&iHeD>>6Fq6peO^%4?7Lj9>T1bu;B4X}NT2}sNuJ=zZMHm}BlRJfN#)JLyolXP z(*7d_$@9aKJ(a*}9Jasw=0Zqtqi=Qls5^n$(|;~APa_+$I6 z`_K8t{Ji&N$J&(;%_;?a4X2|W49?#QwY^o`l3OwjNm8dEZO+H|n?g$*_g}VkoB!$R zZJt$#P_Y)Bv#{sgz2;k{zxJ4ymsQ_xg~SbT7b2_B_jO|8FZSi#>nuJ3EJ?s&RHkL& zU;Xmd+_T5^jcy?MjrZK$pHow7to0@HjLlhwX!RpqfAHAlWAAd*8_oW*~+Sq-sw z`z9Tz2Guf<==prea&z3#j|a2ory@m3<-;>4H`jM}MThpmaj-NE7M3hZ;ifJrEQWL7H@srt}_q4_#1N=%GjH zJ<@`dzzcfLx%aJm&s%S;x9<1;_`X@J#cw7vd+*tM&u;Te!qin2NN&;G0ssIciZ5j~ z0f1|r0KgUf8-(}~Zzax5{6A_BIeiZ;XKN2{b2l(R+RE7i%%JFK4gqU|&8>W0zk|i_ ztC(%I^*!`eltnC^9XZV}=WzNsy5Ls>0Ai9pF6Nf@U=IchFvQkLoDtL1%E(}ACC;eF zufnb3A_KOued*^0*78%;w)C^N6t-fNlwc6^5y1m+1bdh>_&7Q^xr_LSGyZ`qf`7go z=3->{GsVMRobfMF`YP%SGR|&b1_4fP4ohxsUIsy7P96b1J|Q7?23~GnZZ2*?E*@?U zUS1Jy0TF&6!#^4$9-Et$wTPyy{6BEvd*X~X9v&_tTwLDX-kjb*PG>g=7mu*8Fc&v3 z7cVadeg=oTuak$l4~LUG(?21|g553MY+XETot+piA(~q_dwPg7;wk;R1xJ^Efpv2K z2b=H=A|m4kHurFL({^@t_$L?DZJa%v-EEv*7X1Et^Q-J(7#=KsSS=Uc+9e3H(M{TmAsp?Bg3Cvi`f1*vr*#drRt`(P)$!n@%$8%7gN3jmmC zD#}W0`%G^kZhy2=GDIg0koH-w69#{j;twb2$hs~1@ofkVSu{B5>RX0-Q97#Nt%m`0 zS8uMU-o8l?0lmxn*2Cyp?Gq(&?`8@!Ct&Qv>$Mg=Mh3F4mF(Y!21ruM+xWxT&COnQ z#71(>_1V91gkb%raGqG-C1Dn|@xmfB*MjUo_F!Qg26F*kNn*>-&nEf!NorT04%5g_fsX!;6zr}08c17=p7_m`aq}^A!<_# zcxHv|vG%LG000j$AbbEgv39Coc?Cf63yj_1kP?}NK?Ie~8ty*(2N2}b+W>|u&IX^W z{XZf=<{?!7Sf>zo9q{pWv|;&ykaV;2^<4#xY5*YA9H6fZQo9e3x?09z_9?CEm*ZWI zKY#!LvniK~dlJzO0Du(nHM})se;Am+{vVx8Uq8Q-n|N|BX}_FZFLxhsxnX=KF;Xz* zIsmXgz+VY4bNZb{vqtuv2EsBTFp zh)afo{ zi@zF00u4w*NMyasJmG-ivJkLAkfakFmynQP%2-;OcNDzU^I&q*efyBbNZHxZp{1nX zV5$WLYP}o3%{3Iq4n`jnp6=#vA6i3ku238~v|%yx6XDhgf1zdc_8}(}_qo*aBIH0d zT_ts8ATeWm}E1zczGW3Es(y@yw_nc3yQ|F!SemAwEVg99vmT8cE z)yqZ%>>DU>G;i62V|8~VM`z@eXsZV`waL}biqN9$q+>PeiJshq&*Yp<#vVvQ1xk?v zKTOgAr)ay`lgu2k2U9HycxVVj%NWQxS#vLN1QgfL|r{>^hLffwQXxQQq0o>zabe)TcQex&veS%DJW zKJ~9d!05&MJ0|Mx)S=LVYI@ht1hwvlM5$Gwj)Wku1Kz7KApn;`C~%s^Yv*|dZm}-K z$v3yPA0%ms-X^pyO`pG0i#nQ?Y;n9P>!R0(Rmydcd^d0Xb0aNP{K5c=^W7h7;AfNg z4!Y=QL88l1n=iTk=-fg?>Kz`nqz#y_g6VD~_C(_}!})P(!szK2?Be_FL*}u?lu@7> zBn)j~rm-=bSw)X2M=5wOC8P-exmr#QAHpebskpEwefiGxrkvlGh7xB^x5K)D@0%h-!=&ri0bSgHHt@Bc zL;5E7lM_=$Y2%mnUViWaSHGmvM}Yze4GNIyeoNek!)@I5``bgE z?yEnXGxMD+N3jg{BUM+HvOx!7WB!H3V01Y1RtMEHrG<;}XzB&`I zm}Z?oS#A2l@5<$2r2429J###J{beu5h#xb8-bqp-)lW=MtV-%@rLTzG76vDYJ$a;s zIorxC`i+ycheszbRvsJv#S5^MaFjlY7L1u-^AGX$!#+Lqftdv^I{a?=fWCmQiXk%H z@RmtIkqf|1vGpGCTI3AEk2xjX=hIw;Ki%n(K#N6wYBt=Rm#{^=n8Q_Fw1LpELI{)6 z9><&-#VJ_U8{7T;ypI0zdpc#xl86;&T&*w7(!lkslXrxet@)qsTQ!dGi|Q4igz1Q? zU+S(Gbk3>JDPu(J3jWXxaUy7r@W;ipp|WzMTM8FlvO7-sM)O_t<5I;D(OQ&VP5gY> z_@cn*MlZGz*DU$YLkf6q{Z-^wVcz_6f(NB1``gYqs~~UK0ElZ!1go~S+Q)dec#rxi z=gCQBZryWCjjexaY45QI5dhHD#%l{G=zKp>znX7!UrB*~#}~m*15z;LsxVxff)9Qn zD>JHf%sw)1{gMpd7AZ&*v1Y3()6o=>T1%;r&vwWHR-oK`%f) z$jHcO$@mXfMM>`fS9|&p09d(`sCZ4*1+Ng7k->+$fc@UyUcneB05IG<2daY{%CpJj_n0o~|w^b=bMp3%`09yN^!UP}uN)B1Z(^4lGxu!Q*Xv z_5<$~$a#zt1V7>-UfK`e#k!Yl09IJiKRhM7$e$B*-xlu<|9BmCN=a$MOCNdZt@^sJ zja+6hmnKpFX^T4;y!;-&9N+Lh)y&{`=JugZ&OLnB%=c#+-c{c}mxLnvKwM?`L&^Ow zkjlYzGn?25*r{MC>zU&pfS0r+3t(y(xB36}OBC(&oz-Un0L8*ZE80nzf9_ZB zMuWu+)L;9X7|p`JbIdMU9=Jh_KHgMD)B{?{cGJs7mYi+NuB(t1*4xG01kao~ZZYR~W zHkeE9j5p)v$kE3&G)P>0BI4Y!LfO`HEM>T%LKY0QjOx4Jdpa0hNgr5_hrja)ejsqF znwcmRNpB%}9)^&p?B0&1jA9Cpofl#2ITtD=!P_BjwKF(B2AYk4O_O#XZH?EVh-z%Q z0t!;YYEgB4ZKnAFYP!0*7S516anvc*V{hK#?G~jg91B1&IKtgM|G%&+cmZqCtTZy!u(Ym zrm`^Slo2Dy@+8ZYH`ELsolAcunS-sCJoYwVxgHF^m>=6`M^d8Azy8vbrJ^x4lZ2U( zjviU3ws`CE6(v3`jh*MJrH8Y30U*y5H#2MLCF_Z8(_`8^4lyc9yz&Q*=tHIm$%ufR0N0SbnLAi4^UDp%4`&&v&jQi0cQ1Hz z$9E~MeHjbRmtqq*syhQ&DLXnO)Al{iJxa(xl?R+!nK$ujt8W1^{&fWd**YA2x%zrv zEIRSaP|`CzU8a$xMDZML)Tc3M_rdN9@2JsZ@8__uc;hTwNxL?1 z7@)n1H=TX=HdC8ck<*)XtE}l4GU;aiees}mAZF;vpW|XC78w1I{lOFAR$DmNy%i0f)-L2Y8z<;~P^BsZ6;4hn;-Bbh;I z=AiQSGgI>`VxQ`lgIl9C41@FL0B#dSngih(p>C%>-^DhI~-FmK1&A+CFlCPn=A@PwhY3n5~-k+ZA$VW-6>Yv15@@`)mQubi|-|w-Dl65G_&ELh11}&{laJ34InA2l= zSSQHT?&7zOH4l>$7uZn8ueIxZw|LvL`G+k|1={dh(kXh;{=g+tu3azLX^=p7In1~5 zEf$_b(eXSJrriC}S+GjH?>w*$1(`ZJE`F9M&*koyi#+3{W?ECYl=W@r1Dq-L#NxC^ z5)2Q3;+)=tFnZg|iTME~0X?nOaI~E;*Q{@NrWyPKcJuA%WthHs)efhz?*VQ59+ZDL zljG0|rtYo%>hEF1lg9cxQdlJ@ycToyd4RzuSW>fvLk^9aPe6z zD?X2+a^8v1e?YvHj-{D8x=1%zN*#EAr;^^(434ZqvCM2PZXJ>X*?R?1;*4*rt@BXh zyU6XAepS=kud=FPpL0BI;19#oChl+c^(5y@_qKckIrGhVc3%+fA2d(OKyl?wnn(hL z71aCWd?iQpmTc-+Lv%H2lSX2?)an?#f3Rg*mp_vpcjhdjE{WF_y9k$nl}v{UdRN1p?Cx#~oZ{#?%2*0VC zu0WkQ*2%(1_jd46da(WMNmC^YY`*)$J2mIqxNn69LEEB$!g~4pfHq>;UU;1Dh>{_Y zWbueyx}_mS7ppPRC;FiDHzFqqmXkyOr2-(^kzs!6ZU0k3_&0&Yk6ij^zz{{(-akKO zr^_^0d^E^~_v8gv9@*eMDYd(w-^SoW+zV(xK;%qd7%jm+0P&IM?tII0UiIs`m?EjRJ^1A#{U zTwf*HIxN&BaIRFq17YAmeY=XMPxY4(_CyYfW4jDVh;#vxkB#s^rr%^I;Q!&9+4^M$ z`KSHgnR+>Nxx+sVpTYcXf2s(VkN-Yd|NjQ&e;uZORTusX!T+@Y@n5F=&$H%_W?ypp z{|6!bi#7k_;{F$=f6w9n7gH`X?7!`QoZ$a;nEw5~|BrtDDRtr{{$IphUXRa5Gfe*~ zgYLtF@7MJ`%3`jUzfM0�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

  • _XO zy&1Hdy5*YXc+Xt@AmgV$$zfk~E3_cbS~7e08R{tZ1F zK2i2XFC$$$WuhWjw(Otn`?Ro6Xd0j3Ic4j`^ymIea3A!kr$oq2bNL+JnD^S6a(jqA z!e~bQjy`5?;mHVSJE~ZpdvlW1^|tNKd6*gQlU#$07jtg7SAWKhNeEJ!S28 zGvhaMSDZ+D4p+?hKKRgFp5^qxt(pcwxtH;dce_|GB;Q7=4tsGN#%Ty04_yxuvuiG9 z-KIXg+i>xC%V$*GA)wNWPG3nR*b6=|A49ME*p!2;eZM)JDq4N|;yGDOf zdM0?Hz*2SXxt%u4c82H~>{jf~YZWs;b`AKty60i!<3~9&vg4qWFWpqGmYQS*inub9 zsR9Ri5q5rVS#ZYQVSzCk?nirmmYsqO2*#AmPOD`;S%!30Ub*~#RxP1k)1ufs^>+H% zjKiuOdJqU;p3m!xO>1uozY{$}5#ARXslhB(TZ8pj{lkKoxT>qjJgyE5B- zOZqZ>9OaQb*FB^1$_H6`K2p!tOTPUxn;QS#;Z|wOi%eF$Ro-nFyxXWsdQ&)ulnt2G zzv_5Am5vDYCks@3onBBUE87kob%dw38@Drr?DH90QO;K8WYzT`Qv9rre_bz&myr>W z_;DLAQgvpyZ>pc)7yJFZ89BYQWi+{U$~Yj9Eb@vOIg8 z*pHSM=~p$TJVV+K7W)Oy&Kjt-w`nN9H8GJ#Fl8*!n%ndGR7dnm4Y8H-9kxtlpg2|b zzRf-?I7Z{RMI&}UXunnZoZRJQ(w;Z! zdl`EminXobe)Exz*4#h{WjRWVY?zU%i}y?V@u>8*+=kj}qt7(B*Qa~01AUEKo`27j zJLaoK`5&74=Y1PfZwdIWNx%K*B*8ORO@d%j8BVKQA*`HJk0NZ9QN#Dj(uTc~-}8OQ zD-~?1){bB5{4!}t_^9GNd+G=eFM`XAU1umhTQIm~iHBQ((5SntXzF)YCN+H$$-(;q>w|dy|&(%?-}C&BY%7 zm>FE(PaKr&h0Q99{m8WFqsHozXZ%fa@;s}oUJyaMroIz(PM?YpuLbL+S=5pv*Crxb z^Jbt%8H2T7vRNi#eN@m;{MB*5_;;N9{bSy!mt&}g=3=(X&%!y!%v-zYI8@6*w@uDU zt%w=ZvIw-b@>Isaynb$6HvULk7-iTCQT4rs9pq;_{Zi%>vtZ#;{FpuaJJJ@11x~O1 zMW3NtFh(XjSgIFWdmRhV*EFr;Dt(11k8B;|bb6TJ-H(EDDr~PA=WpkgZ`0!pj|-d^ zqnzkL!1 z+$eg6Ldvn1CstFw-;~QEjC?$)n)foW)$#I9Ou-75V6TziPkT@h5YW^$P}H*RVIZn^ z672c+{b%$!i6!mF2T*)r+6J~NlcQPJ-HbZugF+@fPqVEwXKcxt>GJiA)fk?`*uGM& zX7T~?j;4_w=~MSp*c1$3Z9r2XNCO>onO#skWc+gx4&w$L+7Bi+EKVh=7dUc+y(#u z6gxEln$)2+asdFAy(2^nLnj0=xc~qF0002f;{O+50Ig1IXT%Vxq5uE@07*qoM6N<$ Eg6zs>BLDyZ literal 0 HcmV?d00001 diff --git a/src/assets/loginmini/icon/jeecg_bg.png b/src/assets/loginmini/icon/jeecg_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b1bb62fb1099f77e1ce46151dc40d023241d010a GIT binary patch literal 23254 zcmaHTc_7qX+wd7QQAC@NJqg(i7A-wMZN@PDFV=FVXbK|W!TUi)dtWOvXmnzUtrmoLqp=C%7k$P=0YLfnD=+nvLl zZLIaYg922&@EX;qfMD2-kb!Yju$T8ul6*g3V}t z{ua^uX%5l0+r6XrdT-b*YiuNK5TyqI0%&1g(oq5X0z>tp3}p$pdhjR(wgd;>T2pbY8vV)nwom*>-E-Y zN&o#%7O?H#?W1SEanoO1@MS3L7Zw(*r=}Je8L1knr5d!~S50HXh7D@!nrfPwDzHK& z^gv*kSCmR%=&FAqY@~&H@AnT5^A8G?#t^-B1%-zh$^xYv76O88Z2ki{F!ZmWKxArB zUcqV_s_JS10hljhb!eD9?Z0IFud7419|)$Y+0#OU!uNZFK73aFyBTEne$XU<-f1$z5RBPS3O(xnp8`qfv{iY_m>$Oca z)J@lKP}f>#Zl)>wckk~1MRtGpuKWM)RRdzwu#x-^qxp9TED`_t9~Xd+|2PpX5Iko; zxX9Fhsoke1>VaGpS z1y_u@k=hzM83EKzN$+@jGSW>aX5)IcHuRZ@qMm(Rez17but@VqWD7#qWr)>3OG>J{ zi$2dM(Vc`S+z2rvy9O^RWRTDfOM;s2@!(_Lh5TqJnzQ}rjAF!Qpgn~{OO-9n;5)2V zT}?o{zMcAEP}zVNIZ1QAKMY=629&SktWMdyP>_o`#`(Buw%F~zpVEq@)m1~%$UTFg z`o-xZ{=Fs_3rIaBJS-slq6>$Sj!M4XuMLI zd~1mDq#dz@NZPRX<=73KDN!UQhe`6hFkW(as~9h*CYS5Mw5T7#;+zO+SZ)%!~OEYdwKyRirY3hfOE&Xq1*{$8aNd z0_W?X?neJ{EfltqpwLeu`E9{j64F~m5RuE@jp)z#u*HZJC7HD_Nc2UVFPVBB#1Q0Q zx1ly3>0OCf+#Kv*dWA0k_jA){zezG0JxX93zAF1e06=~u%tBq#4MVZxKxrsW9o#00 z7@Plo5+JoWAUzLSORx~-I>Efiy-KT>1tj_dj%1<)|J)drMx!SQ3|{)n{JBxI1;GuS z`bLt6F3C}^XQ!DMjEg1I3MCFe?#2f+h1X?PX*53Pl{7#EMZE7^LZRkQ8<4$6~)a9KQH4$@&*vPIO z)Sv;(9?sY8N~;kaM3-5D4U)CDc*bQp@;paiA9ZqR-0?>X@n;fpn8g^55PUL^ z2>r4ZF%@A16;l?lJe6ZSMtJ!uLKKWhyj+)qFfVW17m3Ux>}|%LTA{DVjZzO07~qS1t3|R|0M{aJ`RY@7JmoQ4k zie$~SMBw}?2X$f@MlC_?>MAYKb&eB4n>G`>CL)TiZYTZcOWBwgT_l9b@J^DongI?s z5s3BfbYSpAxM6IeW$1yOZ{x^rHCUQw10lIE|9E?DB%(rK%G=0AmR?gkWArbUg7|FQf#dSqWDU9D{BeHzK63PM+*mzIs~W< zII1uG`&A_SG@eW^<`^j%Z#m4_(!0HcgsjsDn`jb+9WObm2uUQdkh&$I2r=JTGP34) zXcHzko7k&u``_g*)a8i)L!QVal$)5{-Gt=*utCcc?o7G)6omeSqd{fh-c4HdO6LgZXDR@5O?682){qHyi)WR8l%)1Dk(bk%uI- zl*qvhMNG>l0x3e;rX0|zJ&1msunur^jyc#ohbhh;gcyqnyaTC+YD7Irwx3RQ(S}(+;7`;s@dTB+&oBc2&srhpjhQy@yYdH^#@$HE2gV{>t0r2 zcxCj!hV<74iO-2e+5uNdqlL!?Wo$o-#$QT4>)6p5Bb-B1Zp7(Tp!Ji!fEi+H^Q+NS zTcUI?ee8GA&j_j763eP;)y{*+1X)j>Upc<3;8WlDh0)(D#!_CXQR}4f-Y3e9-00={ zON-deW@4XX%&84CMz^=#Y_-vEEoA+{Q;#84o@X?7A@1E&BR=$?>T)k0R(jG~ ziIp)kQ;kv(5fO5#>wm=s0;v;W&#C^fvl%m*bDa_XVgmTxvqZ6GVg(r~nv&xx_dDue z8sPIxc|^M+olHNzlYca3PI8fdF*9Pjmk6YN=DM$Vd>|afDtvOjHI+8jDX}1aE#4CL zpDhRa?<5u9Q-swDpF#NN?#z-|&9b&0*1OBQN3ZfhuJ2Kr$kkeh=>C8pqJ6wb@xeM+ zeeN6y$n1EDYLa!svbZ{eJbsq~SHTreMKF|nGOOr9D{po5d(5h8R?Z`^j5jYA9(q=! zzLFd4EOr^p3Gaq>S zG^;i6h03{T)asjIt5 zo_okb)o)fPi2rxek*@0d)e4BE>!f3 z+H8>0rkN>u7r=yhohs6=y|A4RiPROA&)#_Ieb+LU^~XWncH8})^xb0x*+r6jy2nA+ zY{%HW<5645u+U4*_}=4}j%A;=UsA78xOnx#wNIhad5y{`23ykK49o@OyM2WXj1_N2 zM$6t<$so_~UsmZJ{r=MuAB^j((_44lKGwBuHS+xD+CwbO`ENqO*#G9RLou21;Cp?4 z^W#9G7-BvqLMFQ@MtDo>Z%FK%&!;}cWTfsx#4kN99dMk#={9S9%43|?t%wkq_3Qj= zUXtf6A~1$2uQM3{!_eTw{tD%kl{R3(oHSokwd2w}J`(*@NHmbeSP_`H2P|64>G1Ql zrMkJFwl-8))NRPvW)RRmrztWNFo^Saso8K;i;9P=rq4}&dLyOP90Yz_5 zGygEy7Z-Uu^H85d_h^wvgU7dxQ8&}7O3zvWcx{xsAl_7$>y%D*zL8#pM7T+#TQjIJQK^ERju-oPmUd65O(_1E^*^(V{UHHjUyoI# zGL03fpMmHPmr?{@GzUzN72ah3?)Vmab>g4;^|MhqyI>i;)cK45)Xt0EWD;GNmoeWb zK6&n7M{UZD3)Tn6{8!A)1Y~!Bkq6(+q2(s)W+;&mw@=_B&+Uunej3eo#E(_YV|=WL zp7@rheH9{Cwfnd>|N9GCNZpT%?WMa+v2$ifm+ny(S^1H=))9n~)e3$H*H003(kS}y zvp}}%rDsI-$JfzG16_conzbj8C58CUp_-qw`=#b)HA)I?ZeNY8{x}%j4?#gStTy>> zjuR4*?;n~ik)7>xm>vvaCT;y06U)2F6vKZk`>}kLmVg){Tc9q7;v zdGh8~`~d@wxArzQk3Bc`5a#Z=3J=@D!P~4StZN~)p)Njkk66m+>!ja5fl5GmhNkI< zL{R^?9h0rG;*5|JX}nH0NHetmlrxF~CQSONMO6~>D7I^wp)y0BcJ zLRkjgvO`^W=Epur1__7l&TqEMIaj-!OuwT$aHs9p5n}Yf%G}0U8)cO(yl61@Kn8>6 zCR+Ll_UE<8ess+gLas9OK&ne)#nz)gOHv%Ncp<*c!$g2{x`p4EW-I}k@1M$C{ozuf zIOI1TR+*k(yd%h%VfRG~lXfK6+l@BcBnSr_gj_QXRkl>GUm}LYr0IbfVPi?VMdU4{K6N89XIgB<|Oj8Ctniq8V=?4-6w7JjIjQ;T{K zaEeew9;xScu6d_Q)tY|e3wQDMj2PjcClbi?jwO_rYQKB|Ptt@UcrL94kCI{N*9+^8l5-KfR>J4=Pjw_z$os+C_T zr?r^^bjNG8Z%aWR~kuKZbn`JLEccjsXEh5Jr;*Duq>BR-d3qpQ`u6BJBt1kNTUxY&2@Dr^&nQ(BBsdV(V_n#@Ku0ed-G^*+1F zG$<8lzOJirXE5S28QVargBag^tdj>ql&S!ul#KB42eb`#_~a{cOIeGUm<;bZVbmRT zpi~(Sl+H1dd;#*>=*$}W4@&Iv!<8ViKH&U1NW=46E}#C5$7OdW+`>(SuUrBkeWy7{ zJzwy!x~{63Yz5Eo9IY(6e(<9*m5Y9S2_>>`uw~-LgR5J-5JWWfT{-6W04?2e$>E5L z55BWT{-o3_E3XIML);8bB;?mFobS0ScS>*M%&Rd=kA#BV!$1_zKR2VQj=y$ajm`;? z!m^ws4|hZ@_++yR2#}XeiMpu?0QpW$hkq5Ua%kV->oOhFrv?gAR{@QwgVbzG3oi3V zx6Dp%f~o{kH%~E$m3jpd-PC@!-210aMeeuh>r>3K2GF1N#8CrGA7AdzvkW(vhJtR} z(YFKK6N#|V^HWtqkYmVRIc?Opn*QTs^kQS1phdsza>9B*O0RS_W4rRa#KXEjRHXA# ztYMqf_kxd86`+Qg^*R9a)c*YgiOQb}y6rxPM8=-`>N)cYIEagl4+Mx84IV0**eQ=p z7Db-XeKDmza0KpDJvwosd}Xxx^yfm935(dg;gPpVCLQygrQ`u&_sty*`d~sL3rS&h z(_d}wd8CiCznPT^;^@@vi(&Ted!rv8w?e0Nv7}S%*7&&o=7k6iRd$BsZOx)Kd{go% zlUWlLqE2KFsb_W0QLwe=X{Q;U)+2?fscBYDO8snpIp0IdB3AcH7La@I@F^DJ2fHi! zwl^jIw?F>~W5DdHV8i7lpr}$&J^^O%hS)JD;bFU0bG`kC&Req^c_P?+jlVF#i@ES6lgA6QbfysC@=}id&Ins)5)m;BdEl>~fP{K(nmj z=z~t3N~_-e`KJ9<1EXOQAfdP}kxex_4;nO#Uj^95;M^#DV7hmGK#{D9S%v3||!N&A+nym0Q_0d$Z9(i#o{^?Pb@Z z-hXR7)o-p;scfj!?(3h^ZqL4#+x+XR(?}k$bCmWw%s8s*XVjBu6eUlWtaHh9JvRUc zG`iwr-{H7CP4-1Fn6Q8=5LS`8X8YcG{^neaP~wCxQq&1|n8bIlKt34^JqZ?vm~7gqFDBhM*f!If+&% zcpbrFPf89gxzHwo+@nNXHkeM1BT-ehW*gw_!&y-E<-on2MU8x)jB&P9(Om9%6de~wLwcMowUriomjntck(hf4y6IBYE>}dv&@-YMiQ@LHOOG6Q zB_#0oB?j%-eX68-8)C{5>*U$zn~Y_(a@4-A{eKrk4tuA#bc1-irjTL%Oc$^ znT?&{*$V_v9q|x>a#bMGCXYd8n>6H*kr9{`auXgS9uNgIbnm0jDc3@+MAYNPq1)VX zM0<%VS%7Iw+^kTR>p!48;Wa$;ot)~ElX^kppYW%Aam@90b}NH)g($6|TQ+0?bx!q+!3}5>IX2OC(u6xTp8(8G z$vYpKT=q@#Z0{wrkt zV2IKF<$&uMA^OAfc`eo5#TXZBZ>vFIRtr*B_a{TKula~Q-h2Pfjs_oi!!!GJVDY0t zjfl;!@o4m*k7(&#O~l{yJ*(SL@{_XyX#MD8hFbCkL~vKF2=AUL3@yvUVCrZH%f*H!HM)F-rVrt%XatMqj1ZUEE)nat7`& zuuuaJy-eq3D}8!tWP8~alRIJ@3$WIx z#cDbm(O4NAAf+yua0_E>E_kXox6_Um^FEQoN13^#&K4SCr;PZl%4;by@}pr5OzpX8 zp`ndpgU5qsy%$gDhZBPXZ7qOuM^xLl8%eT1CamC!gGOH|gF&ILc4SE|!CMVs zlu?v<;M$iK#Hx5#I`_{Hk#xBE!RYlsr&FL6#+DVa{6XpPYzEvFDt~GN+pP)v8p>=w z!XdW!fMgE1UD%feJ2xIMxD95^I zk?ZTnN;f9{yp?z@48Yh~owVKL5OmA$4Qs$i92^cOz1=SGD(TmD?QT|_Zi6Fd`;$GA zBj+{ItxNChK5PbYfCXx0Gf1v4Cs)-qo4to`6um2Oohkj!t>L^ggBmCL@DTfW4$V1L zh%rw^!0^39Uz}7%G!}`Wdh0IC*TRCTvimRLm0h0$ap8b@av{lYdui(f$>hmfC#-m} zeTJzV1hG&q`l!@(7pL0&U3>qv!51wW^4mJUpt4BQXx~MJ_DdP{q{9-%N>jo&W(6{^-CUs;D8y4z%b?fO{Q6Kn_!T#TdX0d;8H zyMA_GI-~*kPoPEFoHuy&kzD_?O(6zX9%4g6HW1$38@DEXb6Py{=N8o!iaxl$_N7=* zjJ{CdAhlygvCKNEQd0)j1_xxy@>GA=$DY5{aX4g!prbrK5S8!A0P$S*>C;W^(lFYS zh#jEZH*mpxW~0x=4W}=>g8U0<@Qk83T9JL?d(`{8L zY!MYzGxuGae+L&|bo~fOJJzN+`yD33ctf+JBfO%x6|cbYC@SN!1`Dk?cVd=T(0or~ zoc1XURkvV~AAQTyE5RqJ4debHk1oQA1C9n8d|dtkJB%7EVuvldt)aJ+Hj}^xRJEL?r(&Vu8hPXoErTY3TZ{8QLpJ^4wjXsM9%w1X78+#6B!h6(? zy*24WB}!%1lf4?Ni8rC{GosuAL#_^Ulgg#g1X3uzi{R>@buWsNkSeg;22KN#{Rv6? zURrv)TD~_sy;FBtGB&UnNW)Q|`-_%LHx;MWdgxu>mnkd?
  • eMl__v#SS`{Ryg8v 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 literal 0 HcmV?d00001 diff --git a/src/assets/loginmini/icon/logo.png b/src/assets/loginmini/icon/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ad1cb65ffcfb034fe8e1d34f755b3ad204721011 GIT binary patch literal 3978 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 literal 0 HcmV?d00001 diff --git a/src/assets/loginmini/style/base.less b/src/assets/loginmini/style/base.less new file mode 100644 index 0000000..c6777c7 --- /dev/null +++ b/src/assets/loginmini/style/base.less @@ -0,0 +1,365 @@ +::-webkit-input-placeholder { + /* WebKit browsers */ + color: #868686; + font-size: 15px; +} + +::-moz-placeholder { + /* Mozilla Firefox 19+ */ + color: #868686; + font-size: 15px; +} + +:-ms-input-placeholder { + /* Internet Explorer 10+ */ + color: #868686; + font-size: 15px; +} + +input:-webkit-autofill { + transition: background-color 5000s ease-in-out 0s; +} + +html { + scroll-behavior: smooth; +} + +html, +body { + color: #333; + margin: 0; + height: 100%; + font-family: 'Myriad Set Pro', 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-weight: normal; +} + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +a { + text-decoration: none; + color: #000; +} + +a, +label, +button, +input, +select { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +img { + max-width: 100%; + height: auto; + display: block; + border: 0; +} + +body { + background: #e3f0ff; + color: #666; +} + +html, +body, +div, +dl, +dt, +dd, +ol, +ul, +li, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +button, +fieldset, +form, +input, +legend, +textarea, +th, +td { + margin: 0; + padding: 0; +} + +a { + text-decoration: none; + color: #08acee; +} + +button { + outline: 0; +} + +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; + outline: none; +} + +li { + list-style: none; +} + +a { + color: #666; +} + +.clearfix::after { + clear: both; + content: '.'; + display: block; + height: 0; + visibility: hidden; +} + +.clearfix { +} + +.divHeight { + width: 100%; + height: 10px; + background: #f5f5f5; + position: relative; + overflow: hidden; +} + +.r-line { + position: relative; +} + +.r-line:after { + content: ''; + position: absolute; + z-index: 0; + top: 0; + right: 0; + height: 100%; + border-right: 1px solid #d9d9d9; + -webkit-transform: scaleX(0.5); + transform: scaleX(0.5); + -webkit-transform-origin: 100% 0; + transform-origin: 100% 0; +} + +.b-line { + position: relative; +} + +.b-line:after { + content: ''; + position: absolute; + z-index: 2; + bottom: 0; + left: 0; + width: 100%; + height: 1px; + border-bottom: 1px solid #dedede; + -webkit-transform: scaleY(0.5); + transform: scaleY(0.5); + -webkit-transform-origin: 0 100%; + transform-origin: 0 100%; +} + +.aui-arrow { + position: relative; + padding-right: 0.8rem; +} + +.aui-arrow span { + font-size: 0.8rem; + color: #9b9b9b; +} + +.aui-arrow:after { + content: ' '; + display: inline-block; + height: 6px; + width: 6px; + border-width: 2px 2px 0 0; + border-color: #848484; + border-style: solid; + -webkit-transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0); + transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0); + position: relative; + position: absolute; + top: 50%; + margin-top: -4px; + right: 2px; + border-radius: 1px; +} + +.aui-flex { + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; + position: relative; +} + +.aui-flex-box { + -webkit-box-flex: 1; + -webkit-flex: 1; + flex: 1; + min-width: 0; + font-size: 14px; + color: #333; +} + +/* 必要布局样式css */ +.aui-flexView { + width: 100%; + height: 100%; + margin: 0 auto; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; +} + +.aui-scrollView { + width: 100%; + height: 100%; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + overflow-y: auto; + overflow-x: hidden; + -webkit-overflow-scrolling: touch; + position: relative; + padding-bottom: 53px; +} + +.aui-navBar { + height: 44px; + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + z-index: 102; + background-color: #5064eb; +} + +.aui-navBar-item { + height: 44px; + min-width: 15%; + -webkit-box-flex: 0; + -webkit-flex: 0 0 15%; + -ms-flex: 0 0 15%; + flex: 0 0 15%; + padding: 0 0.9rem; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + font-size: 0.7rem; + white-space: nowrap; + overflow: hidden; + color: #808080; + position: relative; +} + +.aui-navBar-item:first-child { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; + margin-right: -25%; + font-size: 0.9rem; + font-weight: bold; +} + +.aui-navBar-item:last-child { + -webkit-box-ordinal-group: 4; + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.aui-center { + -webkit-box-ordinal-group: 3; + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + height: 44px; + width: 80%; + margin-left: 22%; +} + +.aui-center-title { + text-align: center; + width: 100%; + white-space: nowrap; + overflow: hidden; + display: block; + text-overflow: ellipsis; + font-size: 0.95rem; + color: #fff; + font-weight: 500; +} + +.icon { + width: 20px; + height: 20px; + display: block; + border: none; + float: left; + background-size: 20px; + background-repeat: no-repeat; + position: relative; +} + +.login-background-img { + background-image: url(../icon/jeecg_bg.png); + background-size: cover; + background-position: top center; + background-repeat: no-repeat; +} diff --git a/src/assets/loginmini/style/home.less b/src/assets/loginmini/style/home.less new file mode 100644 index 0000000..908dc7a --- /dev/null +++ b/src/assets/loginmini/style/home.less @@ -0,0 +1,612 @@ +.aui-content { + padding: 40px 60px; + min-height: 100vh; +} + +.aui-container { + max-width: 1000px; + margin: 0 auto; + box-shadow: 0 4px 8px 1px rgba(0, 0, 0, 0.2); + position: fixed; + top: 50%; + left: 50%; + width: 92%; + height: auto; + -webkit-transform: translateX(-50%) translateY(-50%); + -moz-transform: translateX(-50%) translateY(-50%); + -ms-transform: translateX(-50%) translateY(-50%); + transform: translateX(-50%) translateY(-50%); + -webkit-transform: translateX(-50%) translateY(-50%); +} + +.aui-form { + width: 100%; + background: #eee; + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; +} + +.aui-image { + padding: 180px 80px; + flex-basis: 60%; + -webkit-flex-basis: 60%; + background-color: #0198cd; + background-image: url(../icon/jeecg_ad.png); + background-size: cover; +} + +.aui-image-text { + top: 50%; + left: 50%; + width: 100%; +} + +.aui-formBox { + flex-basis: 40%; + -webkit-flex-basis: 40%; + box-sizing: border-box; + padding: 30px 20px; + background: #fff; + box-shadow: 2px 9px 49px -17px rgba(0, 0, 0, 0.1); +} + +.aui-logo { + width: 180px; + height: 80px; + position: absolute; + top: 2%; + left: 8%; + z-index: 4; +} + +.aui-account-line { + padding-top: 20px; + padding-bottom: 40px; +} + +.aui-code-line { + position: absolute; + right: 0; + top: 0; + border-left: 3px solid #fff; + height: 42px; + padding: 0 15px; + line-height: 40px; + font-size: 14px; + cursor: pointer; +} + +.aui-eye { + position: absolute; + right: 20px; + top: 10px; + width: 20px; + cursor: pointer; +} + +.aui-input-line { + background: #f5f5f9; + border-radius: 2px; + position: relative; + margin: 12px 0; +} + +.aui-input-line input { + width: 100%; + padding: 12px 10px; + border: none; + color: #333333; + font-size: 14px; + background: unset; + padding-left: 40px; +} + +.aui-input-line .icon { + position: absolute; + top: 10px; + left: 10px; +} + +.icon-line-user { + background-image: url(../icon/icon-line-user.png); +} + +.icon-line-tel { + background-image: url(../icon/icon-line-tel.png); +} + +.icon-line-msg { + background-image: url(../icon/icon-line-msg.png); +} + +.icon-line-pad { + background-image: url(../icon/icon-line-pad.png); +} + +.aui-forgot .aui-input-line input { + padding-left: 20px; +} + +.aui-forgot .aui-input-line { + background: none; + border: 1px solid #dbdbdb; + border-radius: 2px; +} + +.aui-forgot .aui-input-line:focus { + border-color: #1b90ff; +} + +.aui-forgot .aui-input-line:hover { + border-color: #1b90ff; +} + +.aui-forgot .aui-input-line .aui-code-line { + border-left: 1px solid #dbdbdb; + height: 40px; + color: #1b90ff; +} + +.aui-step-box { + width: 100%; + height: auto; + position: relative; + overflow: hidden; + margin-top: 50px; + margin-bottom: 20px; +} + +.aui-step-box::after { + position: absolute; + top: 20px; + left: 50%; + width: 76%; + margin-left: -38%; + height: 1px; + background: #bcbcbc; + content: ''; +} + +.aui-step-item { + width: 33.333%; + float: left; + text-align: center; + position: relative; + z-index: 2; +} + +.aui-step-tags em { + width: 40px; + height: 40px; + border: 8px solid #fff; + line-height: 1.3; + border-radius: 100px; + background: #bcbcbc; + display: block; + margin: 0 auto; + font-style: normal; + color: #fff; + font-size: 19px; + font-weight: 500; +} + +.aui-step-tags p { + font-size: 14px; + color: #bcbcbc; +} + +.activeStep .aui-step-tags em { + background: #1b90ff; +} + +.activeStep .aui-step-tags p { + color: #1b90ff; +} + +.aui-success { + position: absolute; + top: 50%; + left: 50%; + height: 80px; + width: 100%; + margin-top: -40px; + margin-left: -50%; +} + +.aui-success-icon { + width: 40px; + margin: 0 auto; +} + +.aui-success h3 { + width: 100%; + text-align: center; + color: #515151; + font-size: 18px; + padding-top: 20px; +} + +.aui-form-nav { + text-align: center; + padding-bottom: 20px; +} + +.aui-form-nav .aui-flex-box { + color: #040404; + font-size: 18px; + font-weight: 500; + cursor: pointer; +} + +.aui-clear-left { + text-align: left; +} + +.aui-clear-left .activeNav::after { + left: 18px; +} + +.activeNav { + position: relative; +} + +.activeNav::after { + content: ''; + position: absolute; + z-index: 0; + bottom: -10px; + left: 50%; + margin-left: -15px; + width: 30px; + height: 4px; + background: #1b90ff; + border-radius: 100px; +} + +.phone .aui-inputClear { + padding-left: 0; +} + +.phone .aui-inputClear input { + //padding-left: 1px; +} + +.phone .aui-inputClear .aui-code { + text-align: right; + width: auto; + bottom: 10px; +} + +.phone .aui-inputClear .aui-code a { + color: #1b90ff; + font-size: 14px; +} + +.phoneChina { + position: absolute; + bottom: 10px; + left: 0; + font-size: 14px; + color: #040404; +} + +.phoneChina::after { + position: absolute; + right: -25px; + bottom: 0; + content: ''; + background-image: url(../icon/icon_dow.png); + background-size: 18px; + width: 18px; + height: 18px; +} + +.phoneChina:before { + position: absolute; + right: -42px; + bottom: -15px; + content: ' '; + background: #fff; + width: 18px; + height: 18px; +} + +.aui-ewm { + width: 280px; + margin: 0 auto; +} + +.aui-formEwm { + padding: 50px 40px 55px 40px; +} + +.aui-inputClear { + width: 100%; + border-bottom: 1px solid #cccccc; + position: relative; + padding-left: 20px; + background: #fff; + margin-bottom: 8px; + margin-top: 20px; +} + +.aui-inputClear .icon { + position: absolute; + top: 10px; + left: 0; +} + +.aui-inputClear input { + width: 100%; + padding: 10px; + border: none; + color: #333333; + font-size: 14px; + background: none; +} + +.aui-code { + position: absolute; + right: 8px; + bottom: 0; + width: 115px; + cursor: pointer; +} + +.icon-code { + background-image: url(../icon/icon-user.png); +} + +.icon-password { + background-image: url(../icon/icon-password.png); +} + +.icon-code { + background-image: url(../icon/icon-code.png); +} + +.aui-inputClear:focus { + border-bottom: 1px solid #1b90ff; +} + +.aui-inputClear:hover { + border-bottom: 1px solid #1b90ff; +} + +.aui-choice { + position: relative; + font-size: 12px; + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; + position: relative; + color: #040404; +} + +.aui-choice input { + width: 14px; + height: 14px; + cursor: pointer; +} + +.aui-forget a { + color: #1b90ff; + font-size: 12px; +} + +.aui-forget a:hover { + text-decoration: underline; +} + +.aui-formButton { + padding-top: 10px; +} + +.aui-formButton a { + height: 42px; + padding: 10px 15px; + font-size: 14px; + border-radius: 8px; + border-color: #67b5ff; + background: #1b90ff; + width: 100%; + cursor: pointer; + border: none; + color: #fff; + margin: 8px 0; + display: block; + text-align: center; +} + +.aui-formButton a:focus { + opacity: 0.9; +} + +.aui-formButton a:hover { + opacity: 0.9; +} + +.aui-formButton .aui-linek-code { + background: #fff; + color: #3c3c3c; + border: 1px solid #dbdbdb; +} + +.aui-formButton .aui-linek-code:hover { + color: #1b90ff; + border: 1px solid #1b90ff; +} + +.aui-third-text { + font-size: 12px; + color: #3c3c3c; + margin-top: 25px; + margin-bottom: 25px; +} + +.aui-third-text span { + color: #afafaf; + display: block; + width: 38%; + margin: 0 auto; + text-align: center; + position: relative; + background: #fff; + z-index: 100; + font-size: 12px; +} + +.aui-third-border { + position: relative; +} + +.aui-third-border::after { + content: ''; + position: absolute; + z-index: 0; + top: 8px; + left: 0; + width: 100%; + height: 1px; + border-top: 1px solid #d9d9d9; + -webkit-transform: scaleY(0.5); + transform: scaleY(0.5); + -webkit-transform-origin: 0 100%; + transform-origin: 0 100%; +} + +.aui-third-login { + width: 30px; + height: 30px; + margin: 0 auto; + border-radius: 100px; +} + +.aui-third-login a { + font-size: 22px; + margin: 0 auto; + border-radius: 100px; + display: inline-block; + color: #888; +} + +.aui-third-login a:hover { + color: #1b90ff; + cursor: pointer; +} + +.aui-third-login:hover { + cursor: pointer; +} + +@media (max-width: 320px) { + .aui-form { + flex-direction: column; + } + + .aui-image { + order: 2; + display: none; + } + + .aui-container { + width: 100%; + max-width: 550px; + margin-top: 10px; + } + + .aui-content { + justify-content: initial; + width: 100%; + padding: 20px; + } +} + +@media (min-width: 321px) and (max-width: 375px) { + .aui-form { + flex-direction: column; + } + + .aui-image { + order: 2; + display: none; + } + + .aui-container { + width: 90%; + max-width: 550px; + } + + .aui-content { + justify-content: initial; + width: 100%; + padding: 20px; + } +} + +@media (min-width: 375px) and (max-width: 425px) { + .aui-form { + flex-direction: column; + } + + .aui-image { + order: 2; + display: none; + } + + .aui-container { + width: 90%; + max-width: 550px; + } + + .aui-content { + justify-content: initial; + width: 100%; + padding: 40px; + } +} + +@media (min-width: 425px) and (max-width: 768px) { + .aui-form { + flex-direction: column; + } + + .aui-image { + order: 2; + display: none; + } + + .aui-container { + width: 90%; + max-width: 550px; + } + + .aui-content { + justify-content: initial; + width: 100%; + padding: 40px; + } + + .aui-step-box::after { + width: 70%; + margin-left: -35%; + } +} + +@media only screen and (max-width: 767px) { + .aui-logo { + top: 3%; + } +} + +@media screen and (max-width: 300px) { + .aui-logo { + top: 3%; + } +} diff --git a/src/assets/svg/fileType/excel.svg b/src/assets/svg/fileType/excel.svg new file mode 100644 index 0000000..debdb36 --- /dev/null +++ b/src/assets/svg/fileType/excel.svg @@ -0,0 +1 @@ +MACWIN图形/印刷产品/思维导图影视/广告代码通用工业/建筑 \ No newline at end of file diff --git a/src/assets/svg/fileType/other.svg b/src/assets/svg/fileType/other.svg new file mode 100644 index 0000000..59b0c41 --- /dev/null +++ b/src/assets/svg/fileType/other.svg @@ -0,0 +1 @@ +MACWIN图形/印刷产品/思维导图影视/广告代码通用工业/建筑 \ No newline at end of file diff --git a/src/assets/svg/fileType/pdf.svg b/src/assets/svg/fileType/pdf.svg new file mode 100644 index 0000000..67c0f10 --- /dev/null +++ b/src/assets/svg/fileType/pdf.svg @@ -0,0 +1 @@ +MACWIN图形/印刷产品/思维导图影视/广告代码通用工业/建筑 \ No newline at end of file diff --git a/src/assets/svg/fileType/txt.svg b/src/assets/svg/fileType/txt.svg new file mode 100644 index 0000000..602c3b9 --- /dev/null +++ b/src/assets/svg/fileType/txt.svg @@ -0,0 +1 @@ +MACWIN图形/印刷产品/思维导图影视/广告代码通用工业/建筑 \ No newline at end of file diff --git a/src/assets/svg/fileType/word.svg b/src/assets/svg/fileType/word.svg new file mode 100644 index 0000000..16aa1a4 --- /dev/null +++ b/src/assets/svg/fileType/word.svg @@ -0,0 +1 @@ +MACWIN图形/印刷产品/思维导图影视/广告代码通用工业/建筑 \ No newline at end of file diff --git a/src/assets/svg/illustration.svg b/src/assets/svg/illustration.svg new file mode 100644 index 0000000..b45215b --- /dev/null +++ b/src/assets/svg/illustration.svg @@ -0,0 +1 @@ +Asset 336 \ No newline at end of file diff --git a/src/assets/svg/login-bg-dark.svg b/src/assets/svg/login-bg-dark.svg new file mode 100644 index 0000000..888da7a --- /dev/null +++ b/src/assets/svg/login-bg-dark.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svg/login-bg.svg b/src/assets/svg/login-bg.svg new file mode 100644 index 0000000..7b66baf --- /dev/null +++ b/src/assets/svg/login-bg.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/svg/login-box-bg.svg b/src/assets/svg/login-box-bg.svg new file mode 100644 index 0000000..ee7dbdc --- /dev/null +++ b/src/assets/svg/login-box-bg.svg @@ -0,0 +1 @@ +responsive \ No newline at end of file diff --git a/src/assets/svg/net-error.svg b/src/assets/svg/net-error.svg new file mode 100644 index 0000000..81f2004 --- /dev/null +++ b/src/assets/svg/net-error.svg @@ -0,0 +1 @@ +personal settings \ No newline at end of file diff --git a/src/assets/svg/no-data.svg b/src/assets/svg/no-data.svg new file mode 100644 index 0000000..2b9f257 --- /dev/null +++ b/src/assets/svg/no-data.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg/preview/p-rotate.svg b/src/assets/svg/preview/p-rotate.svg new file mode 100644 index 0000000..5153a81 --- /dev/null +++ b/src/assets/svg/preview/p-rotate.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg/preview/resume.svg b/src/assets/svg/preview/resume.svg new file mode 100644 index 0000000..0e86c5f --- /dev/null +++ b/src/assets/svg/preview/resume.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg/preview/scale.svg b/src/assets/svg/preview/scale.svg new file mode 100644 index 0000000..1f7adae --- /dev/null +++ b/src/assets/svg/preview/scale.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg/preview/unrotate.svg b/src/assets/svg/preview/unrotate.svg new file mode 100644 index 0000000..e4708be --- /dev/null +++ b/src/assets/svg/preview/unrotate.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg/preview/unscale.svg b/src/assets/svg/preview/unscale.svg new file mode 100644 index 0000000..1359b34 --- /dev/null +++ b/src/assets/svg/preview/unscale.svg @@ -0,0 +1 @@ + diff --git a/src/components/Application/index.ts b/src/components/Application/index.ts new file mode 100644 index 0000000..d7c5133 --- /dev/null +++ b/src/components/Application/index.ts @@ -0,0 +1,15 @@ +import { withInstall } from '/@/utils'; + +import appLogo from './src/AppLogo.vue'; +import appProvider from './src/AppProvider.vue'; +import appSearch from './src/search/AppSearch.vue'; +import appLocalePicker from './src/AppLocalePicker.vue'; +import appDarkModeToggle from './src/AppDarkModeToggle.vue'; + +export { useAppProviderContext } from './src/useAppContext'; + +export const AppLogo = withInstall(appLogo); +export const AppProvider = withInstall(appProvider); +export const AppSearch = withInstall(appSearch); +export const AppLocalePicker = withInstall(appLocalePicker); +export const AppDarkModeToggle = withInstall(appDarkModeToggle); diff --git a/src/components/Application/src/AppDarkModeToggle.vue b/src/components/Application/src/AppDarkModeToggle.vue new file mode 100644 index 0000000..6b07d92 --- /dev/null +++ b/src/components/Application/src/AppDarkModeToggle.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/components/Application/src/AppLocalePicker.vue b/src/components/Application/src/AppLocalePicker.vue new file mode 100644 index 0000000..d600bba --- /dev/null +++ b/src/components/Application/src/AppLocalePicker.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/components/Application/src/AppLogo.vue b/src/components/Application/src/AppLogo.vue new file mode 100644 index 0000000..f7c1b51 --- /dev/null +++ b/src/components/Application/src/AppLogo.vue @@ -0,0 +1,89 @@ + + + + diff --git a/src/components/Application/src/AppProvider.vue b/src/components/Application/src/AppProvider.vue new file mode 100644 index 0000000..4c277bd --- /dev/null +++ b/src/components/Application/src/AppProvider.vue @@ -0,0 +1,77 @@ + diff --git a/src/components/Application/src/search/AppSearch.vue b/src/components/Application/src/search/AppSearch.vue new file mode 100644 index 0000000..63d346e --- /dev/null +++ b/src/components/Application/src/search/AppSearch.vue @@ -0,0 +1,33 @@ + diff --git a/src/components/Application/src/search/AppSearchFooter.vue b/src/components/Application/src/search/AppSearchFooter.vue new file mode 100644 index 0000000..06e1372 --- /dev/null +++ b/src/components/Application/src/search/AppSearchFooter.vue @@ -0,0 +1,55 @@ + + + + diff --git a/src/components/Application/src/search/AppSearchKeyItem.vue b/src/components/Application/src/search/AppSearchKeyItem.vue new file mode 100644 index 0000000..aba36a5 --- /dev/null +++ b/src/components/Application/src/search/AppSearchKeyItem.vue @@ -0,0 +1,11 @@ + + diff --git a/src/components/Application/src/search/AppSearchModal.vue b/src/components/Application/src/search/AppSearchModal.vue new file mode 100644 index 0000000..b1e7a63 --- /dev/null +++ b/src/components/Application/src/search/AppSearchModal.vue @@ -0,0 +1,260 @@ + + + + diff --git a/src/components/Application/src/search/useMenuSearch.ts b/src/components/Application/src/search/useMenuSearch.ts new file mode 100644 index 0000000..d5c5282 --- /dev/null +++ b/src/components/Application/src/search/useMenuSearch.ts @@ -0,0 +1,170 @@ +import type { Menu } from '/@/router/types'; +import { ref, onBeforeMount, unref, Ref, nextTick } from 'vue'; +import { getMenus } from '/@/router/menus'; +import { cloneDeep } from 'lodash-es'; +import { filter, forEach } from '/@/utils/helper/treeHelper'; +import { useGo } from '/@/hooks/web/usePage'; +import { useScrollTo } from '/@/hooks/event/useScrollTo'; +import { onKeyStroke, useDebounceFn } from '@vueuse/core'; +import { useI18n } from '/@/hooks/web/useI18n'; + +export interface SearchResult { + name: string; + path: string; + icon?: string; +} + +// Translate special characters +function transform(c: string) { + const code: string[] = ['$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|']; + return code.includes(c) ? `\\${c}` : c; +} + +function createSearchReg(key: string) { + const keys = [...key].map((item) => transform(item)); + const str = ['', ...keys, ''].join('.*'); + return new RegExp(str); +} + +export function useMenuSearch(refs: Ref, scrollWrap: Ref, emit: EmitType) { + const searchResult = ref([]); + const keyword = ref(''); + const activeIndex = ref(-1); + + let menuList: Menu[] = []; + + const { t } = useI18n(); + const go = useGo(); + const handleSearch = useDebounceFn(search, 200); + + onBeforeMount(async () => { + const list = await getMenus(); + menuList = cloneDeep(list); + forEach(menuList, (item) => { + item.name = t(item.name); + }); + }); + + function search(e: ChangeEvent) { + e?.stopPropagation(); + const key = e.target.value; + keyword.value = key.trim(); + if (!key) { + searchResult.value = []; + return; + } + const reg = createSearchReg(unref(keyword)); + const filterMenu = filter(menuList, (item) => { + // 【issues/33】包含子菜单时,不添加到搜索队列 + if (Array.isArray(item.children)) { + return false; + } + return reg.test(item.name) && !item.hideMenu; + }); + searchResult.value = handlerSearchResult(filterMenu, reg); + activeIndex.value = 0; + } + + function handlerSearchResult(filterMenu: Menu[], reg: RegExp, parent?: Menu) { + const ret: SearchResult[] = []; + filterMenu.forEach((item) => { + const { name, path, icon, children, hideMenu, meta } = item; + if (!hideMenu && reg.test(name) && (!children?.length || meta?.hideChildrenInMenu)) { + ret.push({ + name: parent?.name ? `${parent.name} > ${name}` : name, + path, + icon, + }); + } + if (!meta?.hideChildrenInMenu && Array.isArray(children) && children.length) { + ret.push(...handlerSearchResult(children, reg, item)); + } + }); + return ret; + } + + // Activate when the mouse moves to a certain line + function handleMouseenter(e: any) { + const index = e.target.dataset.index; + activeIndex.value = Number(index); + } + + // Arrow key up + function handleUp() { + if (!searchResult.value.length) return; + activeIndex.value--; + if (activeIndex.value < 0) { + activeIndex.value = searchResult.value.length - 1; + } + handleScroll(); + } + + // Arrow key down + function handleDown() { + if (!searchResult.value.length) return; + activeIndex.value++; + if (activeIndex.value > searchResult.value.length - 1) { + activeIndex.value = 0; + } + handleScroll(); + } + + // When the keyboard up and down keys move to an invisible place + // the scroll bar needs to scroll automatically + function handleScroll() { + const refList = unref(refs); + if (!refList || !Array.isArray(refList) || refList.length === 0 || !unref(scrollWrap)) { + return; + } + + const index = unref(activeIndex); + const currentRef = refList[index]; + if (!currentRef) { + return; + } + const wrapEl = unref(scrollWrap); + if (!wrapEl) { + return; + } + const scrollHeight = currentRef.offsetTop + currentRef.offsetHeight; + const wrapHeight = wrapEl.offsetHeight; + const { start } = useScrollTo({ + el: wrapEl, + duration: 100, + to: scrollHeight - wrapHeight, + }); + start(); + } + + // enter keyboard event + async function handleEnter() { + if (!searchResult.value.length) { + return; + } + const result = unref(searchResult); + const index = unref(activeIndex); + if (result.length === 0 || index < 0) { + return; + } + const to = result[index]; + handleClose(); + await nextTick(); + go(to.path); + } + + // close search modal + function handleClose() { + searchResult.value = []; + emit('close'); + } + + // enter search + onKeyStroke('Enter', handleEnter); + // Monitor keyboard arrow keys + onKeyStroke('ArrowUp', handleUp); + onKeyStroke('ArrowDown', handleDown); + // esc close + onKeyStroke('Escape', handleClose); + + return { handleSearch, searchResult, keyword, activeIndex, handleMouseenter, handleEnter }; +} diff --git a/src/components/Application/src/useAppContext.ts b/src/components/Application/src/useAppContext.ts new file mode 100644 index 0000000..8bdfb4f --- /dev/null +++ b/src/components/Application/src/useAppContext.ts @@ -0,0 +1,17 @@ +import { InjectionKey, Ref } from 'vue'; +import { createContext, useContext } from '/@/hooks/core/useContext'; + +export interface AppProviderContextProps { + prefixCls: Ref; + isMobile: Ref; +} + +const key: InjectionKey = Symbol(); + +export function createAppProviderContext(context: AppProviderContextProps) { + return createContext(context, key); +} + +export function useAppProviderContext() { + return useContext(key); +} diff --git a/src/components/Authority/index.ts b/src/components/Authority/index.ts new file mode 100644 index 0000000..2f0eab7 --- /dev/null +++ b/src/components/Authority/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '/@/utils'; +import authority from './src/Authority.vue'; + +export const Authority = withInstall(authority); diff --git a/src/components/Authority/src/Authority.vue b/src/components/Authority/src/Authority.vue new file mode 100644 index 0000000..0d35938 --- /dev/null +++ b/src/components/Authority/src/Authority.vue @@ -0,0 +1,45 @@ + + diff --git a/src/components/Basic/index.ts b/src/components/Basic/index.ts new file mode 100644 index 0000000..97a53a1 --- /dev/null +++ b/src/components/Basic/index.ts @@ -0,0 +1,8 @@ +import { withInstall } from '/@/utils'; +import basicArrow from './src/BasicArrow.vue'; +import basicTitle from './src/BasicTitle.vue'; +import basicHelp from './src/BasicHelp.vue'; + +export const BasicArrow = withInstall(basicArrow); +export const BasicTitle = withInstall(basicTitle); +export const BasicHelp = withInstall(basicHelp); diff --git a/src/components/Basic/src/BasicArrow.vue b/src/components/Basic/src/BasicArrow.vue new file mode 100644 index 0000000..6a4cd01 --- /dev/null +++ b/src/components/Basic/src/BasicArrow.vue @@ -0,0 +1,84 @@ + + + + diff --git a/src/components/Basic/src/BasicHelp.vue b/src/components/Basic/src/BasicHelp.vue new file mode 100644 index 0000000..396bd75 --- /dev/null +++ b/src/components/Basic/src/BasicHelp.vue @@ -0,0 +1,112 @@ + + diff --git a/src/components/Basic/src/BasicTitle.vue b/src/components/Basic/src/BasicTitle.vue new file mode 100644 index 0000000..07d39ce --- /dev/null +++ b/src/components/Basic/src/BasicTitle.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/components/Button/index.ts b/src/components/Button/index.ts new file mode 100644 index 0000000..71bd2e4 --- /dev/null +++ b/src/components/Button/index.ts @@ -0,0 +1,11 @@ +import { withInstall } from '/@/utils'; +import type { ExtractPropTypes } from 'vue'; +import button from './src/BasicButton.vue'; +import jUploadButton from './src/JUploadButton.vue'; +import popConfirmButton from './src/PopConfirmButton.vue'; +import { buttonProps } from './src/props'; + +export const Button = withInstall(button); +export const JUploadButton = withInstall(jUploadButton); +export const PopConfirmButton = withInstall(popConfirmButton); +export declare type ButtonProps = Partial>; diff --git a/src/components/Button/src/BasicButton.vue b/src/components/Button/src/BasicButton.vue new file mode 100644 index 0000000..efbb7c3 --- /dev/null +++ b/src/components/Button/src/BasicButton.vue @@ -0,0 +1,41 @@ + + + + diff --git a/src/components/Button/src/JUploadButton.vue b/src/components/Button/src/JUploadButton.vue new file mode 100644 index 0000000..ec0df2c --- /dev/null +++ b/src/components/Button/src/JUploadButton.vue @@ -0,0 +1,41 @@ + + + + diff --git a/src/components/Button/src/PopConfirmButton.vue b/src/components/Button/src/PopConfirmButton.vue new file mode 100644 index 0000000..05d0f9a --- /dev/null +++ b/src/components/Button/src/PopConfirmButton.vue @@ -0,0 +1,56 @@ + diff --git a/src/components/Button/src/props.ts b/src/components/Button/src/props.ts new file mode 100644 index 0000000..b5026d6 --- /dev/null +++ b/src/components/Button/src/props.ts @@ -0,0 +1,21 @@ +export const buttonProps = { + color: { type: String, validator: (v) => ['error', 'warning', 'success', ''].includes(v) }, + loading: { type: Boolean }, + disabled: { type: Boolean }, + /** + * Text before icon. + */ + preIcon: { type: String }, + /** + * Text after icon. + */ + postIcon: { type: String }, + type: { type: String }, + /** + * preIcon and postIcon icon size. + * @default: 15 + */ + iconSize: { type: Number, default: 15 }, + isUpload: { type: Boolean, default: false }, + onClick: { type: Function as PropType<(...args) => any>, default: null }, +}; diff --git a/src/components/CardList/index.ts b/src/components/CardList/index.ts new file mode 100644 index 0000000..b977c1b --- /dev/null +++ b/src/components/CardList/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '/@/utils'; +import cardList from './src/CardList.vue'; + +export const CardList = withInstall(cardList); diff --git a/src/components/CardList/src/CardList.vue b/src/components/CardList/src/CardList.vue new file mode 100644 index 0000000..e2d369c --- /dev/null +++ b/src/components/CardList/src/CardList.vue @@ -0,0 +1,164 @@ + + diff --git a/src/components/CardList/src/data.ts b/src/components/CardList/src/data.ts new file mode 100644 index 0000000..ac56cad --- /dev/null +++ b/src/components/CardList/src/data.ts @@ -0,0 +1,25 @@ +import { ref } from 'vue'; +//每行个数 +export const grid = ref(12); +// slider属性 +export const useSlider = (min = 6, max = 12) => { + // 每行显示个数滑动条 + const getMarks = () => { + const l = {}; + for (let i = min; i < max + 1; i++) { + l[i] = { + style: { + color: '#fff', + }, + label: i, + }; + } + return l; + }; + return { + min, + max, + marks: getMarks(), + step: 1, + }; +}; diff --git a/src/components/ClickOutSide/index.ts b/src/components/ClickOutSide/index.ts new file mode 100644 index 0000000..5e7dd2d --- /dev/null +++ b/src/components/ClickOutSide/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '/@/utils'; +import clickOutSide from './src/ClickOutSide.vue'; + +export const ClickOutSide = withInstall(clickOutSide); diff --git a/src/components/ClickOutSide/src/ClickOutSide.vue b/src/components/ClickOutSide/src/ClickOutSide.vue new file mode 100644 index 0000000..c043cc1 --- /dev/null +++ b/src/components/ClickOutSide/src/ClickOutSide.vue @@ -0,0 +1,19 @@ + + diff --git a/src/components/CodeEditor/index.ts b/src/components/CodeEditor/index.ts new file mode 100644 index 0000000..a9b0c30 --- /dev/null +++ b/src/components/CodeEditor/index.ts @@ -0,0 +1,6 @@ +import { withInstall } from '/@/utils'; +import codeEditor from './src/CodeEditor.vue'; +import jsonPreview from './src/json-preview/JsonPreview.vue'; + +export const CodeEditor = withInstall(codeEditor); +export const JsonPreview = withInstall(jsonPreview); diff --git a/src/components/CodeEditor/src/CodeEditor.vue b/src/components/CodeEditor/src/CodeEditor.vue new file mode 100644 index 0000000..660ab63 --- /dev/null +++ b/src/components/CodeEditor/src/CodeEditor.vue @@ -0,0 +1,49 @@ + + + + diff --git a/src/components/CodeEditor/src/codemirror/CodeMirror.vue b/src/components/CodeEditor/src/codemirror/CodeMirror.vue new file mode 100644 index 0000000..2d3bca1 --- /dev/null +++ b/src/components/CodeEditor/src/codemirror/CodeMirror.vue @@ -0,0 +1,102 @@ + + + diff --git a/src/components/CodeEditor/src/codemirror/codeMirror.ts b/src/components/CodeEditor/src/codemirror/codeMirror.ts new file mode 100644 index 0000000..e04f51b --- /dev/null +++ b/src/components/CodeEditor/src/codemirror/codeMirror.ts @@ -0,0 +1,21 @@ +import CodeMirror from 'codemirror'; +import './codemirror.css'; +import 'codemirror/theme/idea.css'; +import 'codemirror/theme/material-palenight.css'; +// import 'codemirror/addon/lint/lint.css'; + +// modes +import 'codemirror/mode/javascript/javascript'; +import 'codemirror/mode/css/css'; +import 'codemirror/mode/htmlmixed/htmlmixed'; +// addons +// import 'codemirror/addon/edit/closebrackets'; +// import 'codemirror/addon/edit/closetag'; +// import 'codemirror/addon/comment/comment'; +// import 'codemirror/addon/fold/foldcode'; +// import 'codemirror/addon/fold/foldgutter'; +// import 'codemirror/addon/fold/brace-fold'; +// import 'codemirror/addon/fold/indent-fold'; +// import 'codemirror/addon/lint/json-lint'; +// import 'codemirror/addon/fold/comment-fold'; +export { CodeMirror }; diff --git a/src/components/CodeEditor/src/codemirror/codemirror.css b/src/components/CodeEditor/src/codemirror/codemirror.css new file mode 100644 index 0000000..dc7c681 --- /dev/null +++ b/src/components/CodeEditor/src/codemirror/codemirror.css @@ -0,0 +1,539 @@ +/* BASICS */ + +.CodeMirror { + --base: #545281; + --comment: hsl(210, 25%, 60%); + --keyword: #af4ab1; + --variable: #0055d1; + --function: #c25205; + --string: #2ba46d; + --number: #c25205; + --tags: #d00; + --qualifier: #ff6032; + --important: var(--string); + + position: relative; + height: auto; + height: 100%; + overflow: hidden; + font-family: var(--font-code); + background: white; + direction: ltr; +} + +/* PADDING */ + +.CodeMirror-lines { + min-height: 1px; /* prevents collapsing before first draw */ + padding: 4px 0; /* Vertical padding around content */ + cursor: text; +} + +.CodeMirror-scrollbar-filler, +.CodeMirror-gutter-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + position: absolute; + top: 0; + left: 0; + z-index: 3; + min-height: 100%; + white-space: nowrap; + background-color: transparent; + border-right: 1px solid #ddd; +} + +.CodeMirror-linenumber { + min-width: 20px; + padding: 0 3px 0 5px; + color: var(--comment); + text-align: right; + white-space: nowrap; + opacity: 0.6; +} + +.CodeMirror-guttermarker { + color: black; +} + +.CodeMirror-guttermarker-subtle { + color: #999; +} + +/* FOLD GUTTER */ + +.CodeMirror-foldmarker { + font-family: arial; + line-height: 0.3; + color: #414141; + text-shadow: #f96 1px 1px 2px, #f96 -1px -1px 2px, #f96 1px -1px 2px, #f96 -1px 1px 2px; + cursor: pointer; +} + +.CodeMirror-foldgutter { + width: 0.7em; +} + +.CodeMirror-foldgutter-open, +.CodeMirror-foldgutter-folded { + cursor: pointer; +} + +.CodeMirror-foldgutter-open::after, +.CodeMirror-foldgutter-folded::after { + position: relative; + top: -0.1em; + display: inline-block; + font-size: 0.8em; + content: '>'; + opacity: 0.8; + transform: rotate(90deg); + transition: transform 0.2s; +} + +.CodeMirror-foldgutter-folded::after { + transform: none; +} + +/* CURSOR */ + +.CodeMirror-cursor { + position: absolute; + width: 0; + pointer-events: none; + border-right: none; + border-left: 1px solid black; +} + +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} + +.cm-fat-cursor .CodeMirror-cursor { + width: auto; + background: #7e7; + border: 0 !important; +} + +.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} + +.cm-fat-cursor-mark { + background-color: rgba(20, 255, 20, 0.5); + -webkit-animation: blink 1.06s steps(1) infinite; + -moz-animation: blink 1.06s steps(1) infinite; + animation: blink 1.06s steps(1) infinite; +} + +.cm-animate-fat-cursor { + width: auto; + background-color: #7e7; + border: 0; + -webkit-animation: blink 1.06s steps(1) infinite; + -moz-animation: blink 1.06s steps(1) infinite; + animation: blink 1.06s steps(1) infinite; +} +@-moz-keyframes blink { + 50% { + background-color: transparent; + } +} +@-webkit-keyframes blink { + 50% { + background-color: transparent; + } +} +@keyframes blink { + 50% { + background-color: transparent; + } +} + +.cm-tab { + display: inline-block; + text-decoration: inherit; +} + +.CodeMirror-rulers { + position: absolute; + top: -50px; + right: 0; + bottom: -20px; + left: 0; + overflow: hidden; +} + +.CodeMirror-ruler { + position: absolute; + top: 0; + bottom: 0; + border-left: 1px solid #ccc; +} + +/* DEFAULT THEME */ +.cm-s-default.CodeMirror { + background-color: transparent; +} + +.cm-s-default .cm-header { + color: blue; +} + +.cm-s-default .cm-quote { + color: #090; +} + +.cm-negative { + color: #d44; +} + +.cm-positive { + color: #292; +} + +.cm-header, +.cm-strong { + font-weight: bold; +} + +.cm-em { + font-style: italic; +} + +.cm-link { + text-decoration: underline; +} + +.cm-strikethrough { + text-decoration: line-through; +} + +.cm-s-default .cm-atom, +.cm-s-default .cm-def, +.cm-s-default .cm-property, +.cm-s-default .cm-variable-2, +.cm-s-default .cm-variable-3, +.cm-s-default .cm-punctuation { + color: var(--base); +} + +.cm-s-default .cm-hr, +.cm-s-default .cm-comment { + color: var(--comment); +} + +.cm-s-default .cm-attribute, +.cm-s-default .cm-keyword { + color: var(--keyword); +} + +.cm-s-default .cm-variable { + color: var(--variable); +} + +.cm-s-default .cm-bracket, +.cm-s-default .cm-tag { + color: var(--tags); +} + +.cm-s-default .cm-number { + color: var(--number); +} + +.cm-s-default .cm-string, +.cm-s-default .cm-string-2 { + color: var(--string); +} + +.cm-s-default .cm-type { + color: #085; +} + +.cm-s-default .cm-meta { + color: #555; +} + +.cm-s-default .cm-qualifier { + color: var(--qualifier); +} + +.cm-s-default .cm-builtin { + color: #7539ff; +} + +.cm-s-default .cm-link { + color: var(--flash); +} + +.cm-s-default .cm-error { + color: #ff008c; +} + +.cm-invalidchar { + color: #ff008c; +} + +.CodeMirror-composing { + border-bottom: 2px solid; +} + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket { + color: #0b0; +} + +div.CodeMirror span.CodeMirror-nonmatchingbracket { + color: #a22; +} + +.CodeMirror-matchingtag { + background: rgba(255, 150, 0, 0.3); +} + +.CodeMirror-activeline-background { + background: #e8f2ff; +} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror-scroll { + position: relative; + height: 100%; + padding-bottom: 30px; + margin-right: -30px; + + /* 30px is the magic margin used to hide the element's real scrollbars */ + + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -30px; + overflow: scroll !important; /* Things will break if this is overridden */ + outline: none; /* Prevent dragging from highlighting the element */ +} + +.CodeMirror-sizer { + position: relative; + margin-bottom: 20px !important; + border-right: 30px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actual scrolling happens, thus preventing shaking and + flickering artifacts. */ +.CodeMirror-vscrollbar, +.CodeMirror-hscrollbar, +.CodeMirror-scrollbar-filler, +.CodeMirror-gutter-filler { + position: absolute; + z-index: 6; + display: none; +} + +.CodeMirror-vscrollbar { + top: 0; + right: 0; + overflow-x: hidden; + overflow-y: scroll; +} + +.CodeMirror-hscrollbar { + bottom: 0; + left: 0; + overflow-x: scroll; + overflow-y: hidden; +} + +.CodeMirror-scrollbar-filler { + right: 0; + bottom: 0; +} + +.CodeMirror-gutter-filler { + bottom: 0; + left: 0; +} + +.CodeMirror-gutter { + display: inline-block; + height: 100%; + margin-bottom: -30px; + white-space: normal; + vertical-align: top; +} + +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} + +.CodeMirror-gutter-background { + position: absolute; + top: 0; + bottom: 0; + z-index: 4; +} + +.CodeMirror-gutter-elt { + position: absolute; + z-index: 4; + cursor: default; +} + +.CodeMirror-gutter-wrapper ::selection { + background-color: transparent; +} + +.CodeMirror-gutter-wrapper ::-moz-selection { + background-color: transparent; +} + +.CodeMirror pre { + position: relative; + z-index: 2; + padding: 0 4px; /* Horizontal padding of content */ + margin: 0; + overflow: visible; + font-family: inherit; + font-size: inherit; + line-height: inherit; + color: inherit; + word-wrap: normal; + white-space: pre; + background: transparent; + border-width: 0; + + /* Reset some styles that the rest of the page might have set */ + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + -webkit-tap-highlight-color: transparent; + -webkit-font-variant-ligatures: contextual; + font-variant-ligatures: contextual; +} + +.CodeMirror-wrap pre { + word-break: normal; + word-wrap: break-word; + white-space: pre-wrap; +} + +.CodeMirror-linebackground { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + padding: 0.1px; /* Force widget margins to stay inside of the container */ +} + +.CodeMirror-rtl pre { + direction: rtl; +} + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.CodeMirror-measure pre { + position: static; +} + +div.CodeMirror-cursors { + position: relative; + z-index: 3; + visibility: hidden; +} + +div.CodeMirror-dragcursors { + visibility: visible; +} + +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { + background: #d9d9d9; +} + +.CodeMirror-focused .CodeMirror-selected { + background: #d7d4f0; +} + +.CodeMirror-crosshair { + cursor: crosshair; +} + +.CodeMirror-line::selection, +.CodeMirror-line > span::selection, +.CodeMirror-line > span > span::selection { + background: #d7d4f0; +} + +.CodeMirror-line::-moz-selection, +.CodeMirror-line > span::-moz-selection, +.CodeMirror-line > span > span::-moz-selection { + background: #d7d4f0; +} + +.cm-searching { + background-color: #ffa; + background-color: rgba(255, 255, 0, 0.4); +} + +/* Used to force a border model for a node */ +.cm-force-border { + padding-right: 0.1px; +} + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ +.cm-tab-wrap-hack::after { + content: ''; +} + +/* Help users use markselection to safely style text background */ +span.CodeMirror-selectedtext { + background: none; +} diff --git a/src/components/CodeEditor/src/json-preview/JsonPreview.vue b/src/components/CodeEditor/src/json-preview/JsonPreview.vue new file mode 100644 index 0000000..75890c3 --- /dev/null +++ b/src/components/CodeEditor/src/json-preview/JsonPreview.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/CodeEditor/src/typing.ts b/src/components/CodeEditor/src/typing.ts new file mode 100644 index 0000000..34b5ed1 --- /dev/null +++ b/src/components/CodeEditor/src/typing.ts @@ -0,0 +1,5 @@ +export enum MODE { + JSON = 'application/json', + HTML = 'htmlmixed', + JS = 'javascript', +} diff --git a/src/components/Container/index.ts b/src/components/Container/index.ts new file mode 100644 index 0000000..e1230a0 --- /dev/null +++ b/src/components/Container/index.ts @@ -0,0 +1,10 @@ +import { withInstall } from '/@/utils'; +import collapseContainer from './src/collapse/CollapseContainer.vue'; +import scrollContainer from './src/ScrollContainer.vue'; +import lazyContainer from './src/LazyContainer.vue'; + +export const CollapseContainer = withInstall(collapseContainer); +export const ScrollContainer = withInstall(scrollContainer); +export const LazyContainer = withInstall(lazyContainer); + +export * from './src/typing'; diff --git a/src/components/Container/src/LazyContainer.vue b/src/components/Container/src/LazyContainer.vue new file mode 100644 index 0000000..4e26242 --- /dev/null +++ b/src/components/Container/src/LazyContainer.vue @@ -0,0 +1,138 @@ + + diff --git a/src/components/Container/src/ScrollContainer.vue b/src/components/Container/src/ScrollContainer.vue new file mode 100644 index 0000000..65c71ed --- /dev/null +++ b/src/components/Container/src/ScrollContainer.vue @@ -0,0 +1,93 @@ + + + + diff --git a/src/components/Container/src/collapse/CollapseContainer.vue b/src/components/Container/src/collapse/CollapseContainer.vue new file mode 100644 index 0000000..4b629f2 --- /dev/null +++ b/src/components/Container/src/collapse/CollapseContainer.vue @@ -0,0 +1,105 @@ + + + diff --git a/src/components/Container/src/collapse/CollapseHeader.vue b/src/components/Container/src/collapse/CollapseHeader.vue new file mode 100644 index 0000000..4196c0a --- /dev/null +++ b/src/components/Container/src/collapse/CollapseHeader.vue @@ -0,0 +1,38 @@ + + diff --git a/src/components/Container/src/typing.ts b/src/components/Container/src/typing.ts new file mode 100644 index 0000000..86c03be --- /dev/null +++ b/src/components/Container/src/typing.ts @@ -0,0 +1,17 @@ +export type ScrollType = 'default' | 'main'; + +export interface CollapseContainerOptions { + canExpand?: boolean; + title?: string; + helpMessage?: Array | string; +} +export interface ScrollContainerOptions { + enableScroll?: boolean; + type?: ScrollType; +} + +export type ScrollActionType = RefType<{ + scrollBottom: () => void; + getScrollWrap: () => Nullable; + scrollTo: (top: number) => void; +}>; diff --git a/src/components/ContextMenu/index.ts b/src/components/ContextMenu/index.ts new file mode 100644 index 0000000..ed294d7 --- /dev/null +++ b/src/components/ContextMenu/index.ts @@ -0,0 +1,3 @@ +export { createContextMenu, destroyContextMenu } from './src/createContextMenu'; + +export * from './src/typing'; diff --git a/src/components/ContextMenu/src/ContextMenu.vue b/src/components/ContextMenu/src/ContextMenu.vue new file mode 100644 index 0000000..8f400fb --- /dev/null +++ b/src/components/ContextMenu/src/ContextMenu.vue @@ -0,0 +1,196 @@ + + diff --git a/src/components/ContextMenu/src/createContextMenu.ts b/src/components/ContextMenu/src/createContextMenu.ts new file mode 100644 index 0000000..8f7a1c8 --- /dev/null +++ b/src/components/ContextMenu/src/createContextMenu.ts @@ -0,0 +1,75 @@ +import contextMenuVue from './ContextMenu.vue'; +import { isClient } from '/@/utils/is'; +import { CreateContextOptions, ContextMenuProps } from './typing'; +import { createVNode, render } from 'vue'; + +const menuManager: { + domList: Element[]; + resolve: Fn; +} = { + domList: [], + resolve: () => {}, +}; + +export const createContextMenu = function (options: CreateContextOptions) { + const { event } = options || {}; + + event && event?.preventDefault(); + + if (!isClient) { + return; + } + return new Promise((resolve) => { + const body = document.body; + + const container = document.createElement('div'); + const propsData: Partial = {}; + if (options.styles) { + propsData.styles = options.styles; + } + + if (options.items) { + propsData.items = options.items; + } + + if (options.event) { + propsData.customEvent = event; + propsData.axis = { x: event.clientX, y: event.clientY }; + } + + const vm = createVNode(contextMenuVue, propsData); + render(vm, container); + + const handleClick = function () { + menuManager.resolve(''); + }; + + menuManager.domList.push(container); + + const remove = function () { + menuManager.domList.forEach((dom: Element) => { + try { + dom && body.removeChild(dom); + } catch (error) {} + }); + body.removeEventListener('click', handleClick); + body.removeEventListener('scroll', handleClick); + }; + + menuManager.resolve = function (arg) { + remove(); + resolve(arg); + }; + remove(); + body.appendChild(container); + body.addEventListener('click', handleClick); + body.addEventListener('scroll', handleClick); + }); +}; + +export const destroyContextMenu = function () { + if (menuManager) { + menuManager.resolve(''); + menuManager.domList = []; + } +}; diff --git a/src/components/ContextMenu/src/typing.ts b/src/components/ContextMenu/src/typing.ts new file mode 100644 index 0000000..899d36b --- /dev/null +++ b/src/components/ContextMenu/src/typing.ts @@ -0,0 +1,35 @@ +export interface Axis { + x: number; + y: number; +} + +export interface ContextMenuItem { + label: string; + icon?: string; + disabled?: boolean; + handler?: Fn; + divider?: boolean; + children?: ContextMenuItem[]; +} +export interface CreateContextOptions { + event: MouseEvent; + icon?: string; + styles?: any; + items?: ContextMenuItem[]; +} + +export interface ContextMenuProps { + event?: MouseEvent; + styles?: any; + items: ContextMenuItem[]; + customEvent?: MouseEvent; + axis?: Axis; + width?: number; + showIcon?: boolean; +} + +export interface ItemContentProps { + showIcon: boolean | undefined; + item: ContextMenuItem; + handler: Fn; +} diff --git a/src/components/CountDown/index.ts b/src/components/CountDown/index.ts new file mode 100644 index 0000000..9809416 --- /dev/null +++ b/src/components/CountDown/index.ts @@ -0,0 +1,6 @@ +import { withInstall } from '/@/utils'; +import countButton from './src/CountButton.vue'; +import countdownInput from './src/CountdownInput.vue'; + +export const CountdownInput = withInstall(countdownInput); +export const CountButton = withInstall(countButton); diff --git a/src/components/CountDown/src/CountButton.vue b/src/components/CountDown/src/CountButton.vue new file mode 100644 index 0000000..fd14900 --- /dev/null +++ b/src/components/CountDown/src/CountButton.vue @@ -0,0 +1,60 @@ + + diff --git a/src/components/CountDown/src/CountdownInput.vue b/src/components/CountDown/src/CountdownInput.vue new file mode 100644 index 0000000..8da89cd --- /dev/null +++ b/src/components/CountDown/src/CountdownInput.vue @@ -0,0 +1,54 @@ + + + diff --git a/src/components/CountDown/src/useCountdown.ts b/src/components/CountDown/src/useCountdown.ts new file mode 100644 index 0000000..316d69a --- /dev/null +++ b/src/components/CountDown/src/useCountdown.ts @@ -0,0 +1,51 @@ +import { ref, unref } from 'vue'; +import { tryOnUnmounted } from '@vueuse/core'; + +export function useCountdown(count: number) { + const currentCount = ref(count); + + const isStart = ref(false); + + let timerId: ReturnType | null; + + function clear() { + timerId && window.clearInterval(timerId); + } + + function stop() { + isStart.value = false; + clear(); + timerId = null; + } + + function start() { + if (unref(isStart) || !!timerId) { + return; + } + isStart.value = true; + timerId = setInterval(() => { + if (unref(currentCount) === 1) { + stop(); + currentCount.value = count; + } else { + currentCount.value -= 1; + } + }, 1000); + } + + function reset() { + currentCount.value = count; + stop(); + } + + function restart() { + reset(); + start(); + } + + tryOnUnmounted(() => { + reset(); + }); + + return { start, reset, restart, clear, stop, currentCount, isStart }; +} diff --git a/src/components/CountTo/index.ts b/src/components/CountTo/index.ts new file mode 100644 index 0000000..36a4e65 --- /dev/null +++ b/src/components/CountTo/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '/@/utils'; +import countTo from './src/CountTo.vue'; + +export const CountTo = withInstall(countTo); diff --git a/src/components/CountTo/src/CountTo.vue b/src/components/CountTo/src/CountTo.vue new file mode 100644 index 0000000..7de3361 --- /dev/null +++ b/src/components/CountTo/src/CountTo.vue @@ -0,0 +1,110 @@ + + diff --git a/src/components/Cropper/index.ts b/src/components/Cropper/index.ts new file mode 100644 index 0000000..88d6d1d --- /dev/null +++ b/src/components/Cropper/index.ts @@ -0,0 +1,7 @@ +import { withInstall } from '/@/utils'; +import cropperImage from './src/Cropper.vue'; +import avatarCropper from './src/CropperAvatar.vue'; + +export * from './src/typing'; +export const CropperImage = withInstall(cropperImage); +export const CropperAvatar = withInstall(avatarCropper); diff --git a/src/components/Cropper/src/CopperModal.vue b/src/components/Cropper/src/CopperModal.vue new file mode 100644 index 0000000..33a6fef --- /dev/null +++ b/src/components/Cropper/src/CopperModal.vue @@ -0,0 +1,237 @@ + + + + diff --git a/src/components/Cropper/src/Cropper.vue b/src/components/Cropper/src/Cropper.vue new file mode 100644 index 0000000..6146652 --- /dev/null +++ b/src/components/Cropper/src/Cropper.vue @@ -0,0 +1,181 @@ + + + diff --git a/src/components/Cropper/src/CropperAvatar.vue b/src/components/Cropper/src/CropperAvatar.vue new file mode 100644 index 0000000..e95329a --- /dev/null +++ b/src/components/Cropper/src/CropperAvatar.vue @@ -0,0 +1,136 @@ + + + + diff --git a/src/components/Cropper/src/typing.ts b/src/components/Cropper/src/typing.ts new file mode 100644 index 0000000..e76cc6f --- /dev/null +++ b/src/components/Cropper/src/typing.ts @@ -0,0 +1,8 @@ +import type Cropper from 'cropperjs'; + +export interface CropendResult { + imgBase64: string; + imgInfo: Cropper.Data; +} + +export type { Cropper }; diff --git a/src/components/Description/index.ts b/src/components/Description/index.ts new file mode 100644 index 0000000..58277d0 --- /dev/null +++ b/src/components/Description/index.ts @@ -0,0 +1,6 @@ +import { withInstall } from '/@/utils'; +import description from './src/Description.vue'; + +export * from './src/typing'; +export { useDescription } from './src/useDescription'; +export const Description = withInstall(description); diff --git a/src/components/Description/src/Description.vue b/src/components/Description/src/Description.vue new file mode 100644 index 0000000..17b8c74 --- /dev/null +++ b/src/components/Description/src/Description.vue @@ -0,0 +1,181 @@ + diff --git a/src/components/Description/src/typing.ts b/src/components/Description/src/typing.ts new file mode 100644 index 0000000..897b7d2 --- /dev/null +++ b/src/components/Description/src/typing.ts @@ -0,0 +1,47 @@ +import type { VNode, CSSProperties } from 'vue'; +import type { CollapseContainerOptions } from '/@/components/Container/index'; +import type { DescriptionsProps } from 'ant-design-vue/es/descriptions/index'; + +export interface DescItem { + labelMinWidth?: number; + contentMinWidth?: number; + labelStyle?: CSSProperties; + field: string; + label: string | VNode | JSX.Element; + // Merge column + span?: number; + show?: (...arg: any) => boolean; + // render + render?: (val: any, data: Recordable) => VNode | undefined | JSX.Element | Element | string | number; +} + +export interface DescriptionProps extends DescriptionsProps { + // Whether to include the collapse component + useCollapse?: boolean; + /** + * item configuration + * @type DescItem + */ + schema: DescItem[]; + /** + * 数据 + * @type object + */ + data: Recordable; + /** + * Built-in CollapseContainer component configuration + * @type CollapseContainerOptions + */ + collapseOptions?: CollapseContainerOptions; +} + +export interface DescInstance { + setDescProps(descProps: Partial): void; +} + +export type Register = (descInstance: DescInstance) => void; + +/** + * @description: + */ +export type UseDescReturnType = [Register, DescInstance]; diff --git a/src/components/Description/src/useDescription.ts b/src/components/Description/src/useDescription.ts new file mode 100644 index 0000000..d1037d0 --- /dev/null +++ b/src/components/Description/src/useDescription.ts @@ -0,0 +1,28 @@ +import type { DescriptionProps, DescInstance, UseDescReturnType } from './typing'; +import { ref, getCurrentInstance, unref } from 'vue'; +import { isProdMode } from '/@/utils/env'; + +export function useDescription(props?: Partial): UseDescReturnType { + if (!getCurrentInstance()) { + throw new Error('useDescription() can only be used inside setup() or functional components!'); + } + const desc = ref>(null); + const loaded = ref(false); + + function register(instance: DescInstance) { + if (unref(loaded) && isProdMode()) { + return; + } + desc.value = instance; + props && instance.setDescProps(props); + loaded.value = true; + } + + const methods: DescInstance = { + setDescProps: (descProps: Partial): void => { + unref(desc)?.setDescProps(descProps); + }, + }; + + return [register, methods]; +} diff --git a/src/components/Drawer/index.ts b/src/components/Drawer/index.ts new file mode 100644 index 0000000..820ade5 --- /dev/null +++ b/src/components/Drawer/index.ts @@ -0,0 +1,6 @@ +import { withInstall } from '/@/utils'; +import basicDrawer from './src/BasicDrawer.vue'; + +export const BasicDrawer = withInstall(basicDrawer); +export * from './src/typing'; +export { useDrawer, useDrawerInner } from './src/useDrawer'; diff --git a/src/components/Drawer/src/BasicDrawer.vue b/src/components/Drawer/src/BasicDrawer.vue new file mode 100644 index 0000000..d3a454b --- /dev/null +++ b/src/components/Drawer/src/BasicDrawer.vue @@ -0,0 +1,237 @@ + + + diff --git a/src/components/Drawer/src/components/DrawerFooter.vue b/src/components/Drawer/src/components/DrawerFooter.vue new file mode 100644 index 0000000..9e6d322 --- /dev/null +++ b/src/components/Drawer/src/components/DrawerFooter.vue @@ -0,0 +1,75 @@ + + + + diff --git a/src/components/Drawer/src/components/DrawerHeader.vue b/src/components/Drawer/src/components/DrawerHeader.vue new file mode 100644 index 0000000..8232128 --- /dev/null +++ b/src/components/Drawer/src/components/DrawerHeader.vue @@ -0,0 +1,74 @@ + + + + diff --git a/src/components/Drawer/src/props.ts b/src/components/Drawer/src/props.ts new file mode 100644 index 0000000..8d134ee --- /dev/null +++ b/src/components/Drawer/src/props.ts @@ -0,0 +1,45 @@ +import type { PropType } from 'vue'; + +import { useI18n } from '/@/hooks/web/useI18n'; +const { t } = useI18n(); + +export const footerProps = { + confirmLoading: { type: Boolean }, + /** + * @description: Show close button + */ + showCancelBtn: { type: Boolean, default: true }, + cancelButtonProps: Object as PropType, + cancelText: { type: String, default: t('common.cancelText') }, + /** + * @description: Show confirmation button + */ + showOkBtn: { type: Boolean, default: true }, + okButtonProps: Object as PropType, + okText: { type: String, default: t('common.okText') }, + okType: { type: String, default: 'primary' }, + showFooter: { type: Boolean }, + footerHeight: { + type: [String, Number] as PropType, + default: 60, + }, +}; +export const basicProps = { + class: {type: [String, Object, Array]}, + isDetail: { type: Boolean }, + title: { type: String, default: '' }, + loadingText: { type: String }, + showDetailBack: { type: Boolean, default: true }, + visible: { type: Boolean }, + loading: { type: Boolean }, + maskClosable: { type: Boolean, default: true }, + getContainer: { + type: [Object, String] as PropType, + }, + closeFunc: { + type: [Function, Object] as PropType, + default: null, + }, + destroyOnClose: { type: Boolean }, + ...footerProps, +}; diff --git a/src/components/Drawer/src/typing.ts b/src/components/Drawer/src/typing.ts new file mode 100644 index 0000000..c1ef346 --- /dev/null +++ b/src/components/Drawer/src/typing.ts @@ -0,0 +1,196 @@ +import type { ButtonProps } from 'ant-design-vue/lib/button/buttonTypes'; +import type { CSSProperties, VNodeChild, ComputedRef } from 'vue'; +import type { ScrollContainerOptions } from '/@/components/Container/index'; + +export interface DrawerInstance { + setDrawerProps: (props: Partial | boolean) => void; + emitVisible?: (visible: boolean, uid: number) => void; +} + +export interface ReturnMethods extends DrawerInstance { + openDrawer: (visible?: boolean, data?: T, openOnSet?: boolean) => void; + closeDrawer: () => void; + getVisible?: ComputedRef; +} + +export type RegisterFn = (drawerInstance: DrawerInstance, uuid?: string) => void; + +export interface ReturnInnerMethods extends DrawerInstance { + closeDrawer: () => void; + changeLoading: (loading: boolean) => void; + changeOkLoading: (loading: boolean) => void; + getVisible?: ComputedRef; +} + +export type UseDrawerReturnType = [RegisterFn, ReturnMethods]; + +export type UseDrawerInnerReturnType = [RegisterFn, ReturnInnerMethods]; + +export interface DrawerFooterProps { + showOkBtn: boolean; + showCancelBtn: boolean; + /** + * Text of the Cancel button + * @default 'cancel' + * @type string + */ + cancelText: string; + /** + * Text of the OK button + * @default 'OK' + * @type string + */ + okText: string; + + /** + * Button type of the OK button + * @default 'primary' + * @type string + */ + okType: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default'; + /** + * The ok button props, follow jsx rules + * @type object + */ + okButtonProps: { props: ButtonProps; on: {} }; + + /** + * The cancel button props, follow jsx rules + * @type object + */ + cancelButtonProps: { props: ButtonProps; on: {} }; + /** + * Whether to apply loading visual effect for OK button or not + * @default false + * @type boolean + */ + confirmLoading: boolean; + + showFooter: boolean; + footerHeight: string | number; +} +export interface DrawerProps extends DrawerFooterProps { + isDetail?: boolean; + loading?: boolean; + showDetailBack?: boolean; + visible?: boolean; + /** + * Built-in ScrollContainer component configuration + * @type ScrollContainerOptions + */ + scrollOptions?: ScrollContainerOptions; + closeFunc?: () => Promise; + triggerWindowResize?: boolean; + /** + * Whether a close (x) button is visible on top right of the Drawer dialog or not. + * @default true + * @type boolean + */ + closable?: boolean; + + /** + * Whether to unmount child components on closing drawer or not. + * @default false + * @type boolean + */ + destroyOnClose?: boolean; + + /** + * Return the mounted node for Drawer. + * @default 'body' + * @type any ( HTMLElement| () => HTMLElement | string) + */ + getContainer?: () => HTMLElement | string; + + /** + * Whether to show mask or not. + * @default true + * @type boolean + */ + mask?: boolean; + + /** + * Clicking on the mask (area outside the Drawer) to close the Drawer or not. + * @default true + * @type boolean + */ + maskClosable?: boolean; + + /** + * Style for Drawer's mask element. + * @default {} + * @type object + */ + maskStyle?: CSSProperties; + + /** + * The title for Drawer. + * @type any (string | slot) + */ + title?: VNodeChild | JSX.Element; + + /** + * The class name of the container of the Drawer dialog. + * @type string + */ + class?: string; + // 兼容老版本的写法(后续可能会删除,优先写class) + wrapClassName?: string; + + /** + * Style of wrapper element which **contains mask** compare to `drawerStyle` + * @type object + */ + wrapStyle?: CSSProperties; + + /** + * Style of the popup layer element + * @type object + */ + drawerStyle?: CSSProperties; + + /** + * Style of floating layer, typically used for adjusting its position. + * @type object + */ + bodyStyle?: CSSProperties; + headerStyle?: CSSProperties; + + /** + * Width of the Drawer dialog. + * @default 256 + * @type string | number + */ + width?: string | number; + + /** + * placement is top or bottom, height of the Drawer dialog. + * @type string | number + */ + height?: string | number; + + /** + * The z-index of the Drawer. + * @default 1000 + * @type number + */ + zIndex?: number; + + /** + * The placement of the Drawer. + * @default 'right' + * @type string + */ + placement?: 'top' | 'right' | 'bottom' | 'left'; + afterVisibleChange?: (visible?: boolean) => void; + keyboard?: boolean; + /** + * Specify a callback that will be called when a user clicks mask, close button or Cancel button. + */ + onClose?: (e?: Event) => void; +} +export interface DrawerActionType { + scrollBottom: () => void; + scrollTo: (to: number) => void; + getScrollWrap: () => Element | null; +} diff --git a/src/components/Drawer/src/useDrawer.ts b/src/components/Drawer/src/useDrawer.ts new file mode 100644 index 0000000..2792463 --- /dev/null +++ b/src/components/Drawer/src/useDrawer.ts @@ -0,0 +1,146 @@ +import type { UseDrawerReturnType, DrawerInstance, ReturnMethods, DrawerProps, UseDrawerInnerReturnType } from './typing'; +import { ref, getCurrentInstance, unref, reactive, watchEffect, nextTick, toRaw, computed } from 'vue'; +import { isProdMode } from '/@/utils/env'; +import { isFunction } from '/@/utils/is'; +import { tryOnUnmounted } from '@vueuse/core'; +import { isEqual } from 'lodash-es'; +import { error } from '/@/utils/log'; + +const dataTransferRef = reactive({}); + +const visibleData = reactive<{ [key: number]: boolean }>({}); + +/** + * @description: Applicable to separate drawer and call outside + */ +export function useDrawer(): UseDrawerReturnType { + if (!getCurrentInstance()) { + throw new Error('useDrawer() can only be used inside setup() or functional components!'); + } + const drawer = ref(null); + const loaded = ref>(false); + const uid = ref(''); + + function register(drawerInstance: DrawerInstance, uuid: string) { + isProdMode() && + tryOnUnmounted(() => { + drawer.value = null; + loaded.value = null; + dataTransferRef[unref(uid)] = null; + }); + + if (unref(loaded) && isProdMode() && drawerInstance === unref(drawer)) { + return; + } + uid.value = uuid; + drawer.value = drawerInstance; + loaded.value = true; + + drawerInstance.emitVisible = (visible: boolean, uid: number) => { + visibleData[uid] = visible; + }; + } + + const getInstance = () => { + const instance = unref(drawer); + if (!instance) { + error('useDrawer instance is undefined!'); + } + return instance; + }; + + const methods: ReturnMethods = { + setDrawerProps: (props: Partial): void => { + getInstance()?.setDrawerProps(props); + }, + + getVisible: computed((): boolean => { + return visibleData[~~unref(uid)]; + }), + + openDrawer: (visible = true, data?: T, openOnSet = true): void => { + getInstance()?.setDrawerProps({ + visible: visible, + }); + if (!data) return; + + if (openOnSet) { + dataTransferRef[unref(uid)] = null; + dataTransferRef[unref(uid)] = toRaw(data); + return; + } + const equal = isEqual(toRaw(dataTransferRef[unref(uid)]), toRaw(data)); + if (!equal) { + dataTransferRef[unref(uid)] = toRaw(data); + } + }, + closeDrawer: () => { + getInstance()?.setDrawerProps({ visible: false }); + }, + }; + + return [register, methods]; +} + +export const useDrawerInner = (callbackFn?: Fn): UseDrawerInnerReturnType => { + const drawerInstanceRef = ref>(null); + const currentInstance = getCurrentInstance(); + const uidRef = ref(''); + + if (!getCurrentInstance()) { + throw new Error('useDrawerInner() can only be used inside setup() or functional components!'); + } + + const getInstance = () => { + const instance = unref(drawerInstanceRef); + if (!instance) { + error('useDrawerInner instance is undefined!'); + return; + } + return instance; + }; + + const register = (modalInstance: DrawerInstance, uuid: string) => { + isProdMode() && + tryOnUnmounted(() => { + drawerInstanceRef.value = null; + }); + + uidRef.value = uuid; + drawerInstanceRef.value = modalInstance; + currentInstance?.emit('register', modalInstance, uuid); + }; + + watchEffect(() => { + const data = dataTransferRef[unref(uidRef)]; + if (!data) return; + if (!callbackFn || !isFunction(callbackFn)) return; + nextTick(() => { + callbackFn(data); + }); + }); + + return [ + register, + { + changeLoading: (loading = true) => { + getInstance()?.setDrawerProps({ loading }); + }, + + changeOkLoading: (loading = true) => { + getInstance()?.setDrawerProps({ confirmLoading: loading }); + }, + getVisible: computed((): boolean => { + return visibleData[~~unref(uidRef)]; + }), + + closeDrawer: () => { + getInstance()?.setDrawerProps({ visible: false }); + }, + + setDrawerProps: (props: Partial) => { + getInstance()?.setDrawerProps(props); + }, + }, + ]; +}; diff --git a/src/components/Dropdown/index.ts b/src/components/Dropdown/index.ts new file mode 100644 index 0000000..80439e5 --- /dev/null +++ b/src/components/Dropdown/index.ts @@ -0,0 +1,5 @@ +import { withInstall } from '/@/utils'; +import dropdown from './src/Dropdown.vue'; + +export * from './src/typing'; +export const Dropdown = withInstall(dropdown); diff --git a/src/components/Dropdown/src/Dropdown.vue b/src/components/Dropdown/src/Dropdown.vue new file mode 100644 index 0000000..164d444 --- /dev/null +++ b/src/components/Dropdown/src/Dropdown.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/src/components/Dropdown/src/typing.ts b/src/components/Dropdown/src/typing.ts new file mode 100644 index 0000000..29de8cb --- /dev/null +++ b/src/components/Dropdown/src/typing.ts @@ -0,0 +1,9 @@ +export interface DropMenu { + onClick?: Fn; + to?: string; + icon?: string; + event: string | number; + text: string; + disabled?: boolean; + divider?: boolean; +} diff --git a/src/components/Form/index.ts b/src/components/Form/index.ts new file mode 100644 index 0000000..b18d36d --- /dev/null +++ b/src/components/Form/index.ts @@ -0,0 +1,35 @@ +import BasicForm from './src/BasicForm.vue'; + +export * from './src/types/form'; +export * from './src/types/formItem'; + +export { useComponentRegister } from './src/hooks/useComponentRegister'; +export { useForm } from './src/hooks/useForm'; + +export { default as ApiSelect } from './src/components/ApiSelect.vue'; +export { default as RadioButtonGroup } from './src/components/RadioButtonGroup.vue'; +export { default as ApiTreeSelect } from './src/components/ApiTreeSelect.vue'; +export { default as ApiRadioGroup } from './src/components/ApiRadioGroup.vue'; +//Jeecg自定义组件 +export { default as JAreaLinkage } from './src/jeecg/components/JAreaLinkage.vue'; +export { default as JSelectUser } from './src/jeecg/components/JSelectUser.vue'; +export { default as JSelectDept } from './src/jeecg/components/JSelectDept.vue'; +export { default as JCodeEditor } from './src/jeecg/components/JCodeEditor.vue'; +export { default as JCategorySelect } from './src/jeecg/components/JCategorySelect.vue'; +export { default as JSelectMultiple } from './src/jeecg/components/JSelectMultiple.vue'; +export { default as JPopup } from './src/jeecg/components/JPopup.vue'; +export { default as JAreaSelect } from './src/jeecg/components/JAreaSelect.vue'; +export { JEasyCron, JEasyCronInner, JEasyCronModal } from '/@/components/Form/src/jeecg/components/JEasyCron'; +export { default as JCheckbox } from './src/jeecg/components/JCheckbox.vue'; +export { default as JInput } from './src/jeecg/components/JInput.vue'; +export { default as JEllipsis } from './src/jeecg/components/JEllipsis.vue'; +export { default as JDictSelectTag } from './src/jeecg/components/JDictSelectTag.vue'; +export { default as JTreeSelect } from './src/jeecg/components/JTreeSelect.vue'; +export { default as JSearchSelect } from './src/jeecg/components/JSearchSelect.vue'; +export { default as JSelectUserByDept } from './src/jeecg/components/JSelectUserByDept.vue'; +export { default as JEditor } from './src/jeecg/components/JEditor.vue'; +export { default as JImageUpload } from './src/jeecg/components/JImageUpload.vue'; +// Jeecg自定义校验 +export { JCronValidator } from '/@/components/Form/src/jeecg/components/JEasyCron'; + +export { BasicForm }; diff --git a/src/components/Form/src/BasicForm.vue b/src/components/Form/src/BasicForm.vue new file mode 100644 index 0000000..27a76fd --- /dev/null +++ b/src/components/Form/src/BasicForm.vue @@ -0,0 +1,381 @@ + + + diff --git a/src/components/Form/src/componentMap.ts b/src/components/Form/src/componentMap.ts new file mode 100644 index 0000000..3878c31 --- /dev/null +++ b/src/components/Form/src/componentMap.ts @@ -0,0 +1,143 @@ +import type { Component } from 'vue'; +import type { ComponentType } from './types/index'; + +/** + * Component list, register here to setting it in the form + */ +import { + Input, + Select, + Radio, + Checkbox, + AutoComplete, + Cascader, + DatePicker, + InputNumber, + Switch, + TimePicker, + TreeSelect, + Slider, + Rate, + Divider, +} from 'ant-design-vue'; +import ApiRadioGroup from './components/ApiRadioGroup.vue'; +import RadioButtonGroup from './components/RadioButtonGroup.vue'; +import ApiSelect from './components/ApiSelect.vue'; +import ApiTreeSelect from './components/ApiTreeSelect.vue'; +import { BasicUpload } from '/@/components/Upload'; +import { StrengthMeter } from '/@/components/StrengthMeter'; +import { IconPicker } from '/@/components/Icon'; +import { CountdownInput } from '/@/components/CountDown'; +//自定义组件 +import JAreaLinkage from './jeecg/components/JAreaLinkage.vue'; +import JSelectUser from './jeecg/components/JSelectUser.vue'; +import JSelectPosition from './jeecg/components/JSelectPosition.vue'; +import JSelectRole from './jeecg/components/JSelectRole.vue'; +import JImageUpload from './jeecg/components/JImageUpload.vue'; +import JDictSelectTag from './jeecg/components/JDictSelectTag.vue'; +import JSelectDept from './jeecg/components/JSelectDept.vue'; +import JAreaSelect from './jeecg/components/JAreaSelect.vue'; +import JEditor from './jeecg/components/JEditor.vue'; +import JMarkdownEditor from './jeecg/components/JMarkdownEditor.vue'; +import JSelectInput from './jeecg/components/JSelectInput.vue'; +import JCodeEditor from './jeecg/components/JCodeEditor.vue'; +import JCategorySelect from './jeecg/components/JCategorySelect.vue'; +import JSelectMultiple from './jeecg/components/JSelectMultiple.vue'; +import JPopup from './jeecg/components/JPopup.vue'; +import JSwitch from './jeecg/components/JSwitch.vue'; +import JTreeDict from './jeecg/components/JTreeDict.vue'; +import JInputPop from './jeecg/components/JInputPop.vue'; +import { JEasyCron } from './jeecg/components/JEasyCron'; +import JCheckbox from './jeecg/components/JCheckbox.vue'; +import JInput from './jeecg/components/JInput.vue'; +import JTreeSelect from './jeecg/components/JTreeSelect.vue'; +import JEllipsis from './jeecg/components/JEllipsis.vue'; +import JSelectUserByDept from './jeecg/components/JSelectUserByDept.vue'; +import JUpload from './jeecg/components/JUpload/JUpload.vue'; +import JSearchSelect from './jeecg/components/JSearchSelect.vue'; +import JAddInput from './jeecg/components/JAddInput.vue'; +import { Time } from '/@/components/Time'; +import JRangeNumber from './jeecg/components/JRangeNumber.vue'; +import UserSelect from './jeecg/components/userSelect/index.vue'; +import JRangeDate from './jeecg/components/JRangeDate.vue' +import JRangeTime from './jeecg/components/JRangeTime.vue' + +const componentMap = new Map(); + +componentMap.set('Time', Time); +componentMap.set('Input', Input); +componentMap.set('InputGroup', Input.Group); +componentMap.set('InputPassword', Input.Password); +componentMap.set('InputSearch', Input.Search); +componentMap.set('InputTextArea', Input.TextArea); +componentMap.set('InputNumber', InputNumber); +componentMap.set('AutoComplete', AutoComplete); + +componentMap.set('Select', Select); +componentMap.set('ApiSelect', ApiSelect); +componentMap.set('TreeSelect', TreeSelect); +componentMap.set('ApiTreeSelect', ApiTreeSelect); +componentMap.set('ApiRadioGroup', ApiRadioGroup); +componentMap.set('Switch', Switch); +componentMap.set('RadioButtonGroup', RadioButtonGroup); +componentMap.set('RadioGroup', Radio.Group); +componentMap.set('Checkbox', Checkbox); +componentMap.set('CheckboxGroup', Checkbox.Group); +componentMap.set('Cascader', Cascader); +componentMap.set('Slider', Slider); +componentMap.set('Rate', Rate); + +componentMap.set('DatePicker', DatePicker); +componentMap.set('MonthPicker', DatePicker.MonthPicker); +componentMap.set('RangePicker', DatePicker.RangePicker); +componentMap.set('WeekPicker', DatePicker.WeekPicker); +componentMap.set('TimePicker', TimePicker); +componentMap.set('StrengthMeter', StrengthMeter); +componentMap.set('IconPicker', IconPicker); +componentMap.set('InputCountDown', CountdownInput); + +componentMap.set('Upload', BasicUpload); +componentMap.set('Divider', Divider); + +//注册自定义组件 +componentMap.set('JAreaLinkage', JAreaLinkage); +componentMap.set('JSelectPosition', JSelectPosition); +componentMap.set('JSelectUser', JSelectUser); +componentMap.set('JSelectRole', JSelectRole); +componentMap.set('JImageUpload', JImageUpload); +componentMap.set('JDictSelectTag', JDictSelectTag); +componentMap.set('JSelectDept', JSelectDept); +componentMap.set('JAreaSelect', JAreaSelect); +componentMap.set('JEditor', JEditor); +componentMap.set('JMarkdownEditor', JMarkdownEditor); +componentMap.set('JSelectInput', JSelectInput); +componentMap.set('JCodeEditor', JCodeEditor); +componentMap.set('JCategorySelect', JCategorySelect); +componentMap.set('JSelectMultiple', JSelectMultiple); +componentMap.set('JPopup', JPopup); +componentMap.set('JSwitch', JSwitch); +componentMap.set('JTreeDict', JTreeDict); +componentMap.set('JInputPop', JInputPop); +componentMap.set('JEasyCron', JEasyCron); +componentMap.set('JCheckbox', JCheckbox); +componentMap.set('JInput', JInput); +componentMap.set('JTreeSelect', JTreeSelect); +componentMap.set('JEllipsis', JEllipsis); +componentMap.set('JSelectUserByDept', JSelectUserByDept); +componentMap.set('JUpload', JUpload); +componentMap.set('JSearchSelect', JSearchSelect); +componentMap.set('JAddInput', JAddInput); +componentMap.set('JRangeNumber', JRangeNumber); +componentMap.set('UserSelect', UserSelect); +componentMap.set('RangeDate', JRangeDate); +componentMap.set('RangeTime', JRangeTime); + +export function add(compName: ComponentType, component: Component) { + componentMap.set(compName, component); +} + +export function del(compName: ComponentType) { + componentMap.delete(compName); +} + +export { componentMap }; diff --git a/src/components/Form/src/components/ApiRadioGroup.vue b/src/components/Form/src/components/ApiRadioGroup.vue new file mode 100644 index 0000000..b58b421 --- /dev/null +++ b/src/components/Form/src/components/ApiRadioGroup.vue @@ -0,0 +1,130 @@ + + + diff --git a/src/components/Form/src/components/ApiSelect.vue b/src/components/Form/src/components/ApiSelect.vue new file mode 100644 index 0000000..fb08216 --- /dev/null +++ b/src/components/Form/src/components/ApiSelect.vue @@ -0,0 +1,149 @@ + + diff --git a/src/components/Form/src/components/ApiTreeSelect.vue b/src/components/Form/src/components/ApiTreeSelect.vue new file mode 100644 index 0000000..31a1fbb --- /dev/null +++ b/src/components/Form/src/components/ApiTreeSelect.vue @@ -0,0 +1,86 @@ + + + diff --git a/src/components/Form/src/components/FormAction.vue b/src/components/Form/src/components/FormAction.vue new file mode 100644 index 0000000..4f7e721 --- /dev/null +++ b/src/components/Form/src/components/FormAction.vue @@ -0,0 +1,121 @@ + + diff --git a/src/components/Form/src/components/FormItem.vue b/src/components/Form/src/components/FormItem.vue new file mode 100644 index 0000000..9f0b863 --- /dev/null +++ b/src/components/Form/src/components/FormItem.vue @@ -0,0 +1,364 @@ + diff --git a/src/components/Form/src/components/RadioButtonGroup.vue b/src/components/Form/src/components/RadioButtonGroup.vue new file mode 100644 index 0000000..c2c7b22 --- /dev/null +++ b/src/components/Form/src/components/RadioButtonGroup.vue @@ -0,0 +1,57 @@ + + + diff --git a/src/components/Form/src/helper.ts b/src/components/Form/src/helper.ts new file mode 100644 index 0000000..ac76f26 --- /dev/null +++ b/src/components/Form/src/helper.ts @@ -0,0 +1,68 @@ +import type { ValidationRule } from 'ant-design-vue/lib/form/Form'; +import type { ComponentType } from './types/index'; +import { useI18n } from '/@/hooks/web/useI18n'; +import { dateUtil } from '/@/utils/dateUtil'; +import { isNumber, isObject } from '/@/utils/is'; + +const { t } = useI18n(); + +/** + * @description: 生成placeholder + */ +export function createPlaceholderMessage(component: ComponentType) { + if (component.includes('Input') || component.includes('Complete')) { + return t('common.inputText'); + } + if (component.includes('Picker')) { + return t('common.chooseText'); + } + if ( + component.includes('Select') || + component.includes('Cascader') || + component.includes('Checkbox') || + component.includes('Radio') || + component.includes('Switch') + ) { + // return `请选择${label}`; + return t('common.chooseText'); + } + return ''; +} + +const DATE_TYPE = ['DatePicker', 'MonthPicker', 'WeekPicker', 'TimePicker']; + +function genType() { + return [...DATE_TYPE, 'RangePicker']; +} + +export function setComponentRuleType(rule: ValidationRule, component: ComponentType, valueFormat: string) { + if (['DatePicker', 'MonthPicker', 'WeekPicker', 'TimePicker'].includes(component)) { + rule.type = valueFormat ? 'string' : 'object'; + } else if (['RangePicker', 'Upload', 'CheckboxGroup', 'TimePicker'].includes(component)) { + rule.type = 'array'; + } else if (['InputNumber'].includes(component)) { + rule.type = 'number'; + } +} + +export function processDateValue(attr: Recordable, component: string) { + const { valueFormat, value } = attr; + if (valueFormat) { + attr.value = isObject(value) ? dateUtil(value).format(valueFormat) : value; + } else if (DATE_TYPE.includes(component) && value) { + attr.value = dateUtil(attr.value); + } +} + +export function handleInputNumberValue(component?: ComponentType, val?: any) { + if (!component) return val; + if (['Input', 'InputPassword', 'InputSearch', 'InputTextArea'].includes(component)) { + return val && isNumber(val) ? `${val}` : val; + } + return val; +} + +/** + * 时间字段 + */ +export const dateItemType = genType(); diff --git a/src/components/Form/src/hooks/useAdvanced.ts b/src/components/Form/src/hooks/useAdvanced.ts new file mode 100644 index 0000000..6842c0a --- /dev/null +++ b/src/components/Form/src/hooks/useAdvanced.ts @@ -0,0 +1,164 @@ +import type { ColEx } from '../types'; +import type { AdvanceState } from '../types/hooks'; +import type { ComputedRef, Ref } from 'vue'; +import type { FormProps, FormSchema } from '../types/form'; +import { computed, unref, watch } from 'vue'; +import { isBoolean, isFunction, isNumber, isObject } from '/@/utils/is'; +import { useBreakpoint } from '/@/hooks/event/useBreakpoint'; +import { useDebounceFn } from '@vueuse/core'; + +const BASIC_COL_LEN = 24; + +interface UseAdvancedContext { + advanceState: AdvanceState; + emit: EmitType; + getProps: ComputedRef; + getSchema: ComputedRef; + formModel: Recordable; + defaultValueRef: Ref; +} + +export default function ({ advanceState, emit, getProps, getSchema, formModel, defaultValueRef }: UseAdvancedContext) { + const { realWidthRef, screenEnum, screenRef } = useBreakpoint(); + + const getEmptySpan = computed((): number => { + if (!advanceState.isAdvanced) { + return 0; + } + // For some special cases, you need to manually specify additional blank lines + const emptySpan = unref(getProps).emptySpan || 0; + + if (isNumber(emptySpan)) { + return emptySpan; + } + if (isObject(emptySpan)) { + const { span = 0 } = emptySpan; + const screen = unref(screenRef) as string; + + const screenSpan = (emptySpan as any)[screen.toLowerCase()]; + return screenSpan || span || 0; + } + return 0; + }); + + const debounceUpdateAdvanced = useDebounceFn(updateAdvanced, 30); + + watch( + [() => unref(getSchema), () => advanceState.isAdvanced, () => unref(realWidthRef)], + () => { + const { showAdvancedButton } = unref(getProps); + if (showAdvancedButton) { + debounceUpdateAdvanced(); + } + }, + { immediate: true } + ); + + function getAdvanced(itemCol: Partial, itemColSum = 0, isLastAction = false, index = 0) { + const width = unref(realWidthRef); + + const mdWidth = + parseInt(itemCol.md as string) || parseInt(itemCol.xs as string) || parseInt(itemCol.sm as string) || (itemCol.span as number) || BASIC_COL_LEN; + + const lgWidth = parseInt(itemCol.lg as string) || mdWidth; + const xlWidth = parseInt(itemCol.xl as string) || lgWidth; + const xxlWidth = parseInt(itemCol.xxl as string) || xlWidth; + if (width <= screenEnum.LG) { + itemColSum += mdWidth; + } else if (width < screenEnum.XL) { + itemColSum += lgWidth; + } else if (width < screenEnum.XXL) { + itemColSum += xlWidth; + } else { + itemColSum += xxlWidth; + } + + let autoAdvancedCol = unref(getProps).autoAdvancedCol ?? 3; + + if (isLastAction) { + advanceState.hideAdvanceBtn = unref(getSchema).length <= autoAdvancedCol; + // update-begin--author:sunjianlei---date:20211108---for: 注释掉该逻辑,使小于等于2行时,也显示展开收起按钮 + /* if (itemColSum <= BASIC_COL_LEN * 2) { + // 小于等于2行时,不显示折叠和展开按钮 + advanceState.hideAdvanceBtn = true; + advanceState.isAdvanced = true; + } else */ + // update-end--author:sunjianlei---date:20211108---for: 注释掉该逻辑,使小于等于2行时,也显示展开收起按钮 + if (itemColSum > BASIC_COL_LEN * 2 && itemColSum <= BASIC_COL_LEN * (unref(getProps).autoAdvancedLine || 3)) { + advanceState.hideAdvanceBtn = false; + + // 默认超过 3 行折叠 + } else if (!advanceState.isLoad) { + advanceState.isLoad = true; + advanceState.isAdvanced = !advanceState.isAdvanced; + // update-begin--author:sunjianlei---date:20211108---for: 如果总列数大于 autoAdvancedCol,就默认折叠 + if (unref(getSchema).length > autoAdvancedCol) { + advanceState.hideAdvanceBtn = false; + advanceState.isAdvanced = false; + } + // update-end--author:sunjianlei---date:20211108---for: 如果总列数大于 autoAdvancedCol,就默认折叠 + } + return { isAdvanced: advanceState.isAdvanced, itemColSum }; + } + if (itemColSum > BASIC_COL_LEN * (unref(getProps).alwaysShowLines || 1)) { + return { isAdvanced: advanceState.isAdvanced, itemColSum }; + } else if (!advanceState.isAdvanced && index + 1 > autoAdvancedCol) { + // 如果当前是收起状态,并且当前列下标 > autoAdvancedCol,就隐藏 + return { isAdvanced: false, itemColSum }; + } else { + // The first line is always displayed + return { isAdvanced: true, itemColSum }; + } + } + + function updateAdvanced() { + let itemColSum = 0; + let realItemColSum = 0; + const { baseColProps = {} } = unref(getProps); + + const schemas = unref(getSchema); + for (let i = 0; i < schemas.length; i++) { + const schema = schemas[i]; + const { show, colProps } = schema; + let isShow = true; + + if (isBoolean(show)) { + isShow = show; + } + + if (isFunction(show)) { + isShow = show({ + schema: schema, + model: formModel, + field: schema.field, + values: { + ...unref(defaultValueRef), + ...formModel, + }, + }); + } + + if (isShow && (colProps || baseColProps)) { + const { itemColSum: sum, isAdvanced } = getAdvanced({ ...baseColProps, ...colProps }, itemColSum, false, i); + + itemColSum = sum || 0; + if (isAdvanced) { + realItemColSum = itemColSum; + } + schema.isAdvanced = isAdvanced; + } + } + + advanceState.actionSpan = (realItemColSum % BASIC_COL_LEN) + unref(getEmptySpan); + + getAdvanced(unref(getProps).actionColOptions || { span: BASIC_COL_LEN }, itemColSum, true); + + emit('advanced-change'); + } + + function handleToggleAdvanced() { + advanceState.isAdvanced = !advanceState.isAdvanced; + } + + return { handleToggleAdvanced }; +} diff --git a/src/components/Form/src/hooks/useAutoFocus.ts b/src/components/Form/src/hooks/useAutoFocus.ts new file mode 100644 index 0000000..85dcc2f --- /dev/null +++ b/src/components/Form/src/hooks/useAutoFocus.ts @@ -0,0 +1,35 @@ +import type { ComputedRef, Ref } from 'vue'; +import type { FormSchema, FormActionType, FormProps } from '../types/form'; + +import { unref, nextTick, watchEffect } from 'vue'; + +interface UseAutoFocusContext { + getSchema: ComputedRef; + getProps: ComputedRef; + isInitedDefault: Ref; + formElRef: Ref; +} +export async function useAutoFocus({ getSchema, getProps, formElRef, isInitedDefault }: UseAutoFocusContext) { + watchEffect(async () => { + if (unref(isInitedDefault) || !unref(getProps).autoFocusFirstItem) { + return; + } + await nextTick(); + const schemas = unref(getSchema); + const formEl = unref(formElRef); + const el = (formEl as any)?.$el as HTMLElement; + if (!formEl || !el || !schemas || schemas.length === 0) { + return; + } + + const firstItem = schemas[0]; + // Only open when the first form item is input type + if (!firstItem.component.includes('Input')) { + return; + } + + const inputEl = el.querySelector('.ant-row:first-child input') as Nullable; + if (!inputEl) return; + inputEl?.focus(); + }); +} diff --git a/src/components/Form/src/hooks/useComponentRegister.ts b/src/components/Form/src/hooks/useComponentRegister.ts new file mode 100644 index 0000000..218aaa9 --- /dev/null +++ b/src/components/Form/src/hooks/useComponentRegister.ts @@ -0,0 +1,11 @@ +import type { ComponentType } from '../types/index'; +import { tryOnUnmounted } from '@vueuse/core'; +import { add, del } from '../componentMap'; +import type { Component } from 'vue'; + +export function useComponentRegister(compName: ComponentType, comp: Component) { + add(compName, comp); + tryOnUnmounted(() => { + del(compName); + }); +} diff --git a/src/components/Form/src/hooks/useForm.ts b/src/components/Form/src/hooks/useForm.ts new file mode 100644 index 0000000..fd5885f --- /dev/null +++ b/src/components/Form/src/hooks/useForm.ts @@ -0,0 +1,159 @@ +import type { FormProps, FormActionType, UseFormReturnType, FormSchema } from '../types/form'; +import type { NamePath } from 'ant-design-vue/lib/form/interface'; +import type { DynamicProps } from '/#/utils'; +import { handleRangeValue } from '../utils/formUtils'; +import { ref, onUnmounted, unref, nextTick, watch } from 'vue'; +import { isProdMode } from '/@/utils/env'; +import { error } from '/@/utils/log'; +import { getDynamicProps, getValueType } from '/@/utils'; +import { add } from "/@/components/Form/src/componentMap"; +//集成online专用控件 +import { OnlineSelectCascade, LinkTableCard, LinkTableSelect } from '@jeecg/online'; + +export declare type ValidateFields = (nameList?: NamePath[]) => Promise; + +type Props = Partial>; + +export function useForm(props?: Props): UseFormReturnType { + const formRef = ref>(null); + const loadedRef = ref>(false); + + //集成online专用控件 + add("OnlineSelectCascade", OnlineSelectCascade) + add("LinkTableCard", LinkTableCard) + add("LinkTableSelect", LinkTableSelect) + + async function getForm() { + const form = unref(formRef); + if (!form) { + error('The form instance has not been obtained, please make sure that the form has been rendered when performing the form operation!'); + } + await nextTick(); + return form as FormActionType; + } + + function register(instance: FormActionType) { + isProdMode() && + onUnmounted(() => { + formRef.value = null; + loadedRef.value = null; + }); + if (unref(loadedRef) && isProdMode() && instance === unref(formRef)) return; + + formRef.value = instance; + loadedRef.value = true; + + watch( + () => props, + () => { + props && instance.setProps(getDynamicProps(props)); + }, + { + immediate: true, + deep: true, + } + ); + } + + const methods: FormActionType = { + scrollToField: async (name: NamePath, options?: ScrollOptions | undefined) => { + const form = await getForm(); + form.scrollToField(name, options); + }, + setProps: async (formProps: Partial) => { + const form = await getForm(); + form.setProps(formProps); + }, + + updateSchema: async (data: Partial | Partial[]) => { + const form = await getForm(); + form.updateSchema(data); + }, + + resetSchema: async (data: Partial | Partial[]) => { + const form = await getForm(); + form.resetSchema(data); + }, + + clearValidate: async (name?: string | string[]) => { + const form = await getForm(); + form.clearValidate(name); + }, + + resetFields: async () => { + getForm().then(async (form) => { + await form.resetFields(); + }); + }, + + removeSchemaByFiled: async (field: string | string[]) => { + unref(formRef)?.removeSchemaByFiled(field); + }, + + // TODO promisify + getFieldsValue: () => { + //update-begin-author:taoyan date:2022-7-5 for: VUEN-1341【流程】编码方式 流程节点编辑表单时,填写数据报错 包括用户组件、部门组件、省市区 + let values = unref(formRef)?.getFieldsValue() as T; + if(values){ + Object.keys(values).map(key=>{ + if (values[key] instanceof Array) { + // update-begin-author:sunjianlei date:20221205 for: 【issues/4330】判断如果是对象数组,则不拼接 + let isObject = typeof (values[key][0] || '') === 'object'; + if (!isObject) { + values[key] = values[key].join(','); + } + // update-end-author:sunjianlei date:20221205 for: 【issues/4330】判断如果是对象数组,则不拼接 + } + }); + } + return values; + //update-end-author:taoyan date:2022-7-5 for: VUEN-1341【流程】编码方式 流程节点编辑表单时,填写数据报错 包括用户组件、部门组件、省市区 + }, + + setFieldsValue: async (values: T) => { + const form = await getForm(); + form.setFieldsValue(values); + }, + + appendSchemaByField: async (schema: FormSchema, prefixField: string | undefined, first: boolean) => { + const form = await getForm(); + form.appendSchemaByField(schema, prefixField, first); + }, + + submit: async (): Promise => { + const form = await getForm(); + return form.submit(); + }, + + /** + * 表单验证并返回表单值 + * @update:添加表单值转换逻辑 + * @updateBy:zyf + * @updateDate:2021-09-02 + */ + validate: async (nameList?: NamePath[]): Promise => { + const form = await getForm(); + let getProps = props || form.getProps; + let values = form.validate(nameList).then((values) => { + for (let key in values) { + if (values[key] instanceof Array) { + let valueType = getValueType(getProps, key); + if (valueType === 'string') { + values[key] = values[key].join(','); + } + } + } + //--@updateBy-begin----author:liusq---date:20210916------for:处理区域事件字典信息------ + return handleRangeValue(getProps, values); + //--@updateBy-end----author:liusq---date:20210916------for:处理区域事件字典信息------ + }); + return values; + }, + validateFields: async (nameList?: NamePath[]): Promise => { + const form = await getForm(); + return form.validateFields(nameList); + }, + }; + + return [register, methods]; +} diff --git a/src/components/Form/src/hooks/useFormContext.ts b/src/components/Form/src/hooks/useFormContext.ts new file mode 100644 index 0000000..01dfadd --- /dev/null +++ b/src/components/Form/src/hooks/useFormContext.ts @@ -0,0 +1,17 @@ +import type { InjectionKey } from 'vue'; +import { createContext, useContext } from '/@/hooks/core/useContext'; + +export interface FormContextProps { + resetAction: () => Promise; + submitAction: () => Promise; +} + +const key: InjectionKey = Symbol(); + +export function createFormContext(context: FormContextProps) { + return createContext(context, key); +} + +export function useFormContext() { + return useContext(key); +} diff --git a/src/components/Form/src/hooks/useFormEvents.ts b/src/components/Form/src/hooks/useFormEvents.ts new file mode 100644 index 0000000..3bb6664 --- /dev/null +++ b/src/components/Form/src/hooks/useFormEvents.ts @@ -0,0 +1,276 @@ +import type { ComputedRef, Ref } from 'vue'; +import type { FormProps, FormSchema, FormActionType } from '../types/form'; +import type { NamePath } from 'ant-design-vue/lib/form/interface'; +import { unref, toRaw } from 'vue'; +import { isArray, isFunction, isObject, isString } from '/@/utils/is'; +import { deepMerge, getValueType } from '/@/utils'; +import { dateItemType, handleInputNumberValue } from '../helper'; +import { dateUtil } from '/@/utils/dateUtil'; +import { cloneDeep, uniqBy } from 'lodash-es'; +import { error } from '/@/utils/log'; + +interface UseFormActionContext { + emit: EmitType; + getProps: ComputedRef; + getSchema: ComputedRef; + formModel: Recordable; + defaultValueRef: Ref; + formElRef: Ref; + schemaRef: Ref; + handleFormValues: Fn; +} +export function useFormEvents({ + emit, + getProps, + formModel, + getSchema, + defaultValueRef, + formElRef, + schemaRef, + handleFormValues, +}: UseFormActionContext) { + async function resetFields(): Promise { + const { resetFunc, submitOnReset } = unref(getProps); + resetFunc && isFunction(resetFunc) && (await resetFunc()); + + const formEl = unref(formElRef); + if (!formEl) return; + + Object.keys(formModel).forEach((key) => { + formModel[key] = defaultValueRef.value[key]; + }); + clearValidate(); + emit('reset', toRaw(formModel)); + submitOnReset && handleSubmit(); + } + + /** + * @description: Set form value + */ + async function setFieldsValue(values: Recordable): Promise { + const fields = unref(getSchema) + .map((item) => item.field) + .filter(Boolean); + + const validKeys: string[] = []; + Object.keys(values).forEach((key) => { + const schema = unref(getSchema).find((item) => item.field === key); + let value = values[key]; + + //antd3升级后,online表单时间控件选中值报js错 TypeError: Reflect.has called on non-object + if(!(values instanceof Object)){ + return; + } + + const hasKey = Reflect.has(values, key); + + value = handleInputNumberValue(schema?.component, value); + // 0| '' is allow + if (hasKey && fields.includes(key)) { + // time type + if (itemIsDateType(key)) { + if (Array.isArray(value)) { + const arr: any[] = []; + for (const ele of value) { + arr.push(ele ? dateUtil(ele) : null); + } + formModel[key] = arr; + } else { + const { componentProps } = schema || {}; + let _props = componentProps as any; + if (typeof componentProps === 'function') { + _props = _props({ formModel }); + } + formModel[key] = value ? (_props?.valueFormat ? value : dateUtil(value)) : null; + } + } else { + formModel[key] = value; + } + validKeys.push(key); + } + }); + validateFields(validKeys).catch((_) => {}); + } + /** + * @description: Delete based on field name + */ + async function removeSchemaByFiled(fields: string | string[]): Promise { + const schemaList: FormSchema[] = cloneDeep(unref(getSchema)); + if (!fields) { + return; + } + + let fieldList: string[] = isString(fields) ? [fields] : fields; + if (isString(fields)) { + fieldList = [fields]; + } + for (const field of fieldList) { + _removeSchemaByFiled(field, schemaList); + } + schemaRef.value = schemaList; + } + + /** + * @description: Delete based on field name + */ + function _removeSchemaByFiled(field: string, schemaList: FormSchema[]): void { + if (isString(field)) { + const index = schemaList.findIndex((schema) => schema.field === field); + if (index !== -1) { + delete formModel[field]; + schemaList.splice(index, 1); + } + } + } + + /** + * @description: Insert after a certain field, if not insert the last + */ + async function appendSchemaByField(schema: FormSchema, prefixField?: string, first = false) { + const schemaList: FormSchema[] = cloneDeep(unref(getSchema)); + + const index = schemaList.findIndex((schema) => schema.field === prefixField); + const hasInList = schemaList.some((item) => item.field === prefixField || schema.field); + + if (!hasInList) return; + + if (!prefixField || index === -1 || first) { + first ? schemaList.unshift(schema) : schemaList.push(schema); + schemaRef.value = schemaList; + return; + } + if (index !== -1) { + schemaList.splice(index + 1, 0, schema); + } + schemaRef.value = schemaList; + } + + async function resetSchema(data: Partial | Partial[]) { + let updateData: Partial[] = []; + if (isObject(data)) { + updateData.push(data as FormSchema); + } + if (isArray(data)) { + updateData = [...data]; + } + + const hasField = updateData.every((item) => item.component === 'Divider' || (Reflect.has(item, 'field') && item.field)); + + if (!hasField) { + error('All children of the form Schema array that need to be updated must contain the `field` field'); + return; + } + schemaRef.value = updateData as FormSchema[]; + } + + async function updateSchema(data: Partial | Partial[]) { + let updateData: Partial[] = []; + if (isObject(data)) { + updateData.push(data as FormSchema); + } + if (isArray(data)) { + updateData = [...data]; + } + + const hasField = updateData.every((item) => item.component === 'Divider' || (Reflect.has(item, 'field') && item.field)); + + if (!hasField) { + error('All children of the form Schema array that need to be updated must contain the `field` field'); + return; + } + const schema: FormSchema[] = []; + updateData.forEach((item) => { + unref(getSchema).forEach((val) => { + if (val.field === item.field) { + const newSchema = deepMerge(val, item); + schema.push(newSchema as FormSchema); + } else { + schema.push(val); + } + }); + }); + schemaRef.value = uniqBy(schema, 'field'); + } + + function getFieldsValue(): Recordable { + const formEl = unref(formElRef); + if (!formEl) return {}; + return handleFormValues(toRaw(unref(formModel))); + } + + /** + * @description: Is it time + */ + function itemIsDateType(key: string) { + return unref(getSchema).some((item) => { + return item.field === key ? dateItemType.includes(item.component) : false; + }); + } + + async function validateFields(nameList?: NamePath[] | undefined) { + return unref(formElRef)?.validateFields(nameList); + } + + async function validate(nameList?: NamePath[] | undefined) { + return await unref(formElRef)?.validate(nameList); + } + + async function clearValidate(name?: string | string[]) { + await unref(formElRef)?.clearValidate(name); + } + + async function scrollToField(name: NamePath, options?: ScrollOptions | undefined) { + await unref(formElRef)?.scrollToField(name, options); + } + + /** + * @description: Form submission + */ + async function handleSubmit(e?: Event): Promise { + e && e.preventDefault(); + const { submitFunc } = unref(getProps); + if (submitFunc && isFunction(submitFunc)) { + await submitFunc(); + return; + } + const formEl = unref(formElRef); + if (!formEl) return; + try { + const values = await validate(); + //update-begin---author:zhangdaihao Date:20140212 for:[bug号]树机构调整------------ + //--updateBy-begin----author:zyf---date:20211206------for:对查询表单提交的数组处理成字符串------ + for (let key in values) { + if (values[key] instanceof Array) { + let valueType = getValueType(getProps, key); + if (valueType === 'string') { + values[key] = values[key].join(','); + } + } + } + //--updateBy-end----author:zyf---date:20211206------for:对查询表单提交的数组处理成字符串------ + const res = handleFormValues(values); + emit('submit', res); + } catch (error) { + //update-begin-author:taoyan date:2022-11-4 for: 列表查询表单会触发校验错误导致重置失败,原因不明 + emit('submit', {}); + console.error('query form validate error, please ignore!', error) + //throw new Error(error); + //update-end-author:taoyan date:2022-11-4 for: 列表查询表单会触发校验错误导致重置失败,原因不明 + } + } + + return { + handleSubmit, + clearValidate, + validate, + validateFields, + getFieldsValue, + updateSchema, + resetSchema, + appendSchemaByField, + removeSchemaByFiled, + resetFields, + setFieldsValue, + scrollToField, + }; +} diff --git a/src/components/Form/src/hooks/useFormValues.ts b/src/components/Form/src/hooks/useFormValues.ts new file mode 100644 index 0000000..db63c8d --- /dev/null +++ b/src/components/Form/src/hooks/useFormValues.ts @@ -0,0 +1,59 @@ +import { isArray, isFunction, isObject, isString, isNullOrUnDef } from '/@/utils/is'; +import { unref } from 'vue'; +import type { Ref, ComputedRef } from 'vue'; +import type { FormProps, FormSchema } from '../types/form'; +import dayjs from "dayjs"; +import { set } from 'lodash-es'; +import { handleRangeValue } from '/@/components/Form/src/utils/formUtils'; + +interface UseFormValuesContext { + defaultValueRef: Ref; + getSchema: ComputedRef; + getProps: ComputedRef; + formModel: Recordable; +} +export function useFormValues({ defaultValueRef, getSchema, formModel, getProps }: UseFormValuesContext) { + // Processing form values + function handleFormValues(values: Recordable) { + if (!isObject(values)) { + return {}; + } + const res: Recordable = {}; + for (const item of Object.entries(values)) { + let [, value] = item; + const [key] = item; + if (!key || (isArray(value) && value.length === 0) || isFunction(value)) { + continue; + } + const transformDateFunc = unref(getProps).transformDateFunc; + if (isObject(value)) { + value = transformDateFunc?.(value); + } + // 判断是否是dayjs实例 + if (isArray(value) && dayjs.isDayjs(value[0]) && dayjs.isDayjs(value[1])) { + value = value.map((item) => transformDateFunc?.(item)); + } + // Remove spaces + if (isString(value)) { + value = value.trim(); + } + set(res, key, value); + } + return handleRangeValue(getProps, res); + } + + function initDefault() { + const schemas = unref(getSchema); + const obj: Recordable = {}; + schemas.forEach((item) => { + const { defaultValue } = item; + if (!isNullOrUnDef(defaultValue)) { + obj[item.field] = defaultValue; + formModel[item.field] = defaultValue; + } + }); + defaultValueRef.value = obj; + } + + return { handleFormValues, initDefault }; +} diff --git a/src/components/Form/src/hooks/useLabelWidth.ts b/src/components/Form/src/hooks/useLabelWidth.ts new file mode 100644 index 0000000..f994985 --- /dev/null +++ b/src/components/Form/src/hooks/useLabelWidth.ts @@ -0,0 +1,44 @@ +import type { Ref } from 'vue'; +import type { FormProps, FormSchema } from '../types/form'; + +import { computed, unref } from 'vue'; +import { isNumber } from '/@/utils/is'; + +export function useItemLabelWidth(schemaItemRef: Ref, propsRef: Ref) { + return computed(() => { + const schemaItem = unref(schemaItemRef); + const { labelCol = {}, wrapperCol = {} } = schemaItem.itemProps || {}; + const { labelWidth, disabledLabelWidth } = schemaItem; + + const { labelWidth: globalLabelWidth, labelCol: globalLabelCol, wrapperCol: globWrapperCol,layout } = unref(propsRef); + + // update-begin--author:sunjianlei---date:20211104---for: 禁用全局 labelWidth,不自动设置 textAlign -------- + if (disabledLabelWidth) { + return { labelCol, wrapperCol }; + } + // update-begin--author:sunjianlei---date:20211104---for: 禁用全局 labelWidth,不自动设置 textAlign -------- + + // If labelWidth is set globally, all items setting + if (!globalLabelWidth && !labelWidth && !globalLabelCol) { + labelCol.style = { + textAlign: 'left', + }; + return { labelCol, wrapperCol }; + } + let width = labelWidth || globalLabelWidth; + const col = { ...globalLabelCol, ...labelCol }; + const wrapCol = { ...globWrapperCol, ...wrapperCol }; + + if (width) { + width = isNumber(width) ? `${width}px` : width; + } + + return { + labelCol: { style: { width: width ? width : '100%' }, ...col }, + wrapperCol: { + style: { width: layout === 'vertical' ? '100%' : `calc(100% - ${width})` }, + ...wrapCol, + }, + }; + }); +} diff --git a/src/components/Form/src/jeecg/components/JAddInput.vue b/src/components/Form/src/jeecg/components/JAddInput.vue new file mode 100644 index 0000000..f3bd2d6 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JAddInput.vue @@ -0,0 +1,123 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JAreaLinkage.vue b/src/components/Form/src/jeecg/components/JAreaLinkage.vue new file mode 100644 index 0000000..5fbeffb --- /dev/null +++ b/src/components/Form/src/jeecg/components/JAreaLinkage.vue @@ -0,0 +1,76 @@ + + diff --git a/src/components/Form/src/jeecg/components/JAreaSelect.vue b/src/components/Form/src/jeecg/components/JAreaSelect.vue new file mode 100644 index 0000000..91cda9f --- /dev/null +++ b/src/components/Form/src/jeecg/components/JAreaSelect.vue @@ -0,0 +1,165 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JCategorySelect.vue b/src/components/Form/src/jeecg/components/JCategorySelect.vue new file mode 100644 index 0000000..0155acc --- /dev/null +++ b/src/components/Form/src/jeecg/components/JCategorySelect.vue @@ -0,0 +1,258 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JCheckbox.vue b/src/components/Form/src/jeecg/components/JCheckbox.vue new file mode 100644 index 0000000..b69ac4c --- /dev/null +++ b/src/components/Form/src/jeecg/components/JCheckbox.vue @@ -0,0 +1,91 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JCodeEditor.vue b/src/components/Form/src/jeecg/components/JCodeEditor.vue new file mode 100644 index 0000000..9f06e4d --- /dev/null +++ b/src/components/Form/src/jeecg/components/JCodeEditor.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/JDictSelectTag.vue b/src/components/Form/src/jeecg/components/JDictSelectTag.vue new file mode 100644 index 0000000..e6d1b8e --- /dev/null +++ b/src/components/Form/src/jeecg/components/JDictSelectTag.vue @@ -0,0 +1,211 @@ + + diff --git a/src/components/Form/src/jeecg/components/JEasyCron/EasyCronInner.vue b/src/components/Form/src/jeecg/components/JEasyCron/EasyCronInner.vue new file mode 100644 index 0000000..de8796c --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/EasyCronInner.vue @@ -0,0 +1,319 @@ + + + + diff --git a/src/components/Form/src/jeecg/components/JEasyCron/EasyCronInput.vue b/src/components/Form/src/jeecg/components/JEasyCron/EasyCronInput.vue new file mode 100644 index 0000000..51e8abe --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/EasyCronInput.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/JEasyCron/EasyCronModal.vue b/src/components/Form/src/jeecg/components/JEasyCron/EasyCronModal.vue new file mode 100644 index 0000000..b5fa5da --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/EasyCronModal.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JEasyCron/LICENSE b/src/components/Form/src/jeecg/components/JEasyCron/LICENSE new file mode 100644 index 0000000..08eddc9 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 知行合一 + +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/src/components/Form/src/jeecg/components/JEasyCron/easy.cron.data.ts b/src/components/Form/src/jeecg/components/JEasyCron/easy.cron.data.ts new file mode 100644 index 0000000..335a8c0 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/easy.cron.data.ts @@ -0,0 +1,10 @@ +import { propTypes } from '/@/utils/propTypes'; + +export const cronEmits = ['change', 'update:value']; +export const cronProps = { + value: propTypes.string.def(''), + disabled: propTypes.bool.def(false), + hideSecond: propTypes.bool.def(false), + hideYear: propTypes.bool.def(false), + remote: propTypes.func, +}; diff --git a/src/components/Form/src/jeecg/components/JEasyCron/easy.cron.inner.less b/src/components/Form/src/jeecg/components/JEasyCron/easy.cron.inner.less new file mode 100644 index 0000000..3aab6ba --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/easy.cron.inner.less @@ -0,0 +1,59 @@ +//noinspection LessUnresolvedVariable +@prefix-cls: ~'@{namespace}-easy-cron-inner'; + +.@{prefix-cls} { + .content { + .ant-checkbox-wrapper + .ant-checkbox-wrapper { + margin-left: 0; + } + } + + &-config-list { + text-align: left; + margin: 0 10px 10px 10px; + + .item { + margin-top: 5px; + font-size: 14px; + + span { + padding: 0 2px; + } + } + + .choice { + padding: 5px 8px; + } + + .w60 { + width: 60px; + min-width: 60px; + } + + .w80 { + width: 80px; + min-width: 80px; + } + + .list { + margin: 0 20px; + } + + .list-check-item { + padding: 1px 3px; + width: 4em; + } + + .list-cn .list-check-item { + width: 5em; + } + + .tip-info { + color: #999; + } + } + + .allow-click { + cursor: pointer; + } +} diff --git a/src/components/Form/src/jeecg/components/JEasyCron/easy.cron.input.less b/src/components/Form/src/jeecg/components/JEasyCron/easy.cron.input.less new file mode 100644 index 0000000..d72aa15 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/easy.cron.input.less @@ -0,0 +1,14 @@ +//noinspection LessUnresolvedVariable +@prefix-cls: ~'@{namespace}-easy-cron-input'; + +.@{prefix-cls} { + a.open-btn { + cursor: pointer; + + .app-iconify { + position: relative; + top: 1px; + right: 2px; + } + } +} diff --git a/src/components/Form/src/jeecg/components/JEasyCron/index.ts b/src/components/Form/src/jeecg/components/JEasyCron/index.ts new file mode 100644 index 0000000..1513f0d --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/index.ts @@ -0,0 +1,6 @@ +// 原开源项目地址:https://gitee.com/toktok/easy-cron + +export { default as JEasyCron } from './EasyCronInput.vue'; +export { default as JEasyCronInner } from './EasyCronInner.vue'; +export { default as JEasyCronModal } from './EasyCronModal.vue'; +export { default as JCronValidator } from './validator'; diff --git a/src/components/Form/src/jeecg/components/JEasyCron/tabs/DayUI.vue b/src/components/Form/src/jeecg/components/JEasyCron/tabs/DayUI.vue new file mode 100644 index 0000000..1cd215c --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/tabs/DayUI.vue @@ -0,0 +1,94 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JEasyCron/tabs/HourUI.vue b/src/components/Form/src/jeecg/components/JEasyCron/tabs/HourUI.vue new file mode 100644 index 0000000..c3c5224 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/tabs/HourUI.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JEasyCron/tabs/MinuteUI.vue b/src/components/Form/src/jeecg/components/JEasyCron/tabs/MinuteUI.vue new file mode 100644 index 0000000..34617bf --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/tabs/MinuteUI.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JEasyCron/tabs/MonthUI.vue b/src/components/Form/src/jeecg/components/JEasyCron/tabs/MonthUI.vue new file mode 100644 index 0000000..78f7f4e --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/tabs/MonthUI.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JEasyCron/tabs/SecondUI.vue b/src/components/Form/src/jeecg/components/JEasyCron/tabs/SecondUI.vue new file mode 100644 index 0000000..6b65b85 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/tabs/SecondUI.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JEasyCron/tabs/WeekUI.vue b/src/components/Form/src/jeecg/components/JEasyCron/tabs/WeekUI.vue new file mode 100644 index 0000000..c3b15dc --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/tabs/WeekUI.vue @@ -0,0 +1,125 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JEasyCron/tabs/YearUI.vue b/src/components/Form/src/jeecg/components/JEasyCron/tabs/YearUI.vue new file mode 100644 index 0000000..2be7972 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/tabs/YearUI.vue @@ -0,0 +1,49 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JEasyCron/tabs/useTabMixin.ts b/src/components/Form/src/jeecg/components/JEasyCron/tabs/useTabMixin.ts new file mode 100644 index 0000000..291ca19 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/tabs/useTabMixin.ts @@ -0,0 +1,199 @@ +// 主要用于日和星期的互斥使用 +import { computed, inject, reactive, ref, unref, watch } from 'vue'; +import { propTypes } from '/@/utils/propTypes'; + +export enum TypeEnum { + unset = 'UNSET', + every = 'EVERY', + range = 'RANGE', + loop = 'LOOP', + work = 'WORK', + last = 'LAST', + specify = 'SPECIFY', +} + +// use 公共 props +export function useTabProps(options) { + const defaultValue = options?.defaultValue ?? '?'; + return { + value: propTypes.string.def(defaultValue), + disabled: propTypes.bool.def(false), + ...options?.props, + }; +} + +// use 公共 emits +export function useTabEmits() { + return ['change', 'update:value']; +} + +// use 公共 setup +export function useTabSetup(props, context, options) { + const { emit } = context; + const prefixCls = inject('prefixCls'); + const defaultValue = ref(options?.defaultValue ?? '?'); + // 类型 + const type = ref(options.defaultType ?? TypeEnum.every); + const valueList = ref([]); + // 对于不同的类型,所定义的值也有所不同 + const valueRange = reactive(options.valueRange); + const valueLoop = reactive(options.valueLoop); + const valueWeek = reactive(options.valueWeek); + const valueWork = ref(options.valueWork); + const maxValue = ref(options.maxValue); + const minValue = ref(options.minValue); + + // 根据不同的类型计算出的value + const computeValue = computed(() => { + let valueArray: any[] = []; + switch (type.value) { + case TypeEnum.unset: + valueArray.push('?'); + break; + case TypeEnum.every: + valueArray.push('*'); + break; + case TypeEnum.range: + valueArray.push(`${valueRange.start}-${valueRange.end}`); + break; + case TypeEnum.loop: + valueArray.push(`${valueLoop.start}/${valueLoop.interval}`); + break; + case TypeEnum.work: + valueArray.push(`${valueWork.value}W`); + break; + case TypeEnum.last: + valueArray.push('L'); + break; + case TypeEnum.specify: + if (valueList.value.length === 0) { + valueList.value.push(minValue.value); + } + valueArray.push(valueList.value.join(',')); + break; + default: + valueArray.push(defaultValue.value); + break; + } + return valueArray.length > 0 ? valueArray.join('') : defaultValue.value; + }); + // 指定值范围区间,介于最小值和最大值之间 + const specifyRange = computed(() => { + let range: number[] = []; + if (maxValue.value != null) { + for (let i = minValue.value; i <= maxValue.value; i++) { + range.push(i); + } + } + return range; + }); + + watch( + () => props.value, + (val) => { + if (val !== computeValue.value) { + parseValue(val); + } + }, + { immediate: true } + ); + + watch(computeValue, (v) => updateValue(v)); + + function updateValue(value) { + emit('change', value); + emit('update:value', value); + } + + /** + * parseValue + * @param value + */ + function parseValue(value) { + if (value === computeValue.value) { + return; + } + try { + if (!value || value === defaultValue.value) { + type.value = TypeEnum.every; + } else if (value.indexOf('?') >= 0) { + type.value = TypeEnum.unset; + } else if (value.indexOf('-') >= 0) { + type.value = TypeEnum.range; + const values = value.split('-'); + if (values.length >= 2) { + valueRange.start = parseInt(values[0]); + valueRange.end = parseInt(values[1]); + } + } else if (value.indexOf('/') >= 0) { + type.value = TypeEnum.loop; + const values = value.split('/'); + if (values.length >= 2) { + valueLoop.start = value[0] === '*' ? 0 : parseInt(values[0]); + valueLoop.interval = parseInt(values[1]); + } + } else if (value.indexOf('W') >= 0) { + type.value = TypeEnum.work; + const values = value.split('W'); + if (!values[0] && !isNaN(values[0])) { + valueWork.value = parseInt(values[0]); + } + } else if (value.indexOf('L') >= 0) { + type.value = TypeEnum.last; + } else if (value.indexOf(',') >= 0 || !isNaN(value)) { + type.value = TypeEnum.specify; + valueList.value = value.split(',').map((item) => parseInt(item)); + } else { + type.value = TypeEnum.every; + } + } catch (e) { + type.value = TypeEnum.every; + } + } + + const beforeRadioAttrs = computed(() => ({ + class: ['choice'], + disabled: props.disabled || unref(options.disabled), + })); + const inputNumberAttrs = computed(() => ({ + class: ['w60'], + max: maxValue.value, + min: minValue.value, + precision: 0, + })); + const typeRangeAttrs = computed(() => ({ + disabled: type.value !== TypeEnum.range || props.disabled || unref(options.disabled), + ...inputNumberAttrs.value, + })); + const typeLoopAttrs = computed(() => ({ + disabled: type.value !== TypeEnum.loop || props.disabled || unref(options.disabled), + ...inputNumberAttrs.value, + })); + const typeSpecifyAttrs = computed(() => ({ + disabled: type.value !== TypeEnum.specify || props.disabled || unref(options.disabled), + class: ['list-check-item'], + })); + + return { + type, + TypeEnum, + prefixCls, + defaultValue, + valueRange, + valueLoop, + valueWeek, + valueList, + valueWork, + maxValue, + minValue, + computeValue, + specifyRange, + updateValue, + parseValue, + beforeRadioAttrs, + inputNumberAttrs, + typeRangeAttrs, + typeLoopAttrs, + typeSpecifyAttrs, + }; +} diff --git a/src/components/Form/src/jeecg/components/JEasyCron/validator.ts b/src/components/Form/src/jeecg/components/JEasyCron/validator.ts new file mode 100644 index 0000000..308f1e8 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEasyCron/validator.ts @@ -0,0 +1,48 @@ +import CronParser from 'cron-parser'; +import type { ValidatorRule } from 'ant-design-vue/lib/form/interface'; + +const cronRule: ValidatorRule = { + validator({}, value) { + // 没填写就不校验 + if (!value) { + return Promise.resolve(); + } + const values: string[] = value.split(' ').filter((item) => !!item); + if (values.length > 7) { + return Promise.reject('Cron表达式最多7项!'); + } + // 检查第7项 + let val: string = value; + if (values.length === 7) { + const year = values[6]; + if (year !== '*' && year !== '?') { + let yearValues: string[] = []; + if (year.indexOf('-') >= 0) { + yearValues = year.split('-'); + } else if (year.indexOf('/')) { + yearValues = year.split('/'); + } else { + yearValues = [year]; + } + // 判断是否都是数字 + const checkYear = yearValues.some((item) => isNaN(Number(item))); + if (checkYear) { + return Promise.reject('Cron表达式参数[年]错误:' + year); + } + } + // 取其中的前六项 + val = values.slice(0, 6).join(' '); + } + // 6位 没有年 + // 5位没有秒、年 + try { + const iter = CronParser.parseExpression(val); + iter.next(); + return Promise.resolve(); + } catch (e) { + return Promise.reject('Cron表达式错误:' + e); + } + }, +}; + +export default cronRule.validator; diff --git a/src/components/Form/src/jeecg/components/JEditor.vue b/src/components/Form/src/jeecg/components/JEditor.vue new file mode 100644 index 0000000..3928fc9 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEditor.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/JEllipsis.vue b/src/components/Form/src/jeecg/components/JEllipsis.vue new file mode 100644 index 0000000..5eac646 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JEllipsis.vue @@ -0,0 +1,21 @@ + + diff --git a/src/components/Form/src/jeecg/components/JFormContainer.vue b/src/components/Form/src/jeecg/components/JFormContainer.vue new file mode 100644 index 0000000..6fe2398 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JFormContainer.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/JImageUpload.vue b/src/components/Form/src/jeecg/components/JImageUpload.vue new file mode 100644 index 0000000..3c03734 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JImageUpload.vue @@ -0,0 +1,260 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JImportModal.vue b/src/components/Form/src/jeecg/components/JImportModal.vue new file mode 100644 index 0000000..8a1c0f8 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JImportModal.vue @@ -0,0 +1,181 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JInput.vue b/src/components/Form/src/jeecg/components/JInput.vue new file mode 100644 index 0000000..a7e8077 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JInput.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/JInputPop.vue b/src/components/Form/src/jeecg/components/JInputPop.vue new file mode 100644 index 0000000..ad5dd22 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JInputPop.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/JMarkdownEditor.vue b/src/components/Form/src/jeecg/components/JMarkdownEditor.vue new file mode 100644 index 0000000..b9d2b5c --- /dev/null +++ b/src/components/Form/src/jeecg/components/JMarkdownEditor.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/JPopup.vue b/src/components/Form/src/jeecg/components/JPopup.vue new file mode 100644 index 0000000..9ecefe0 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JPopup.vue @@ -0,0 +1,154 @@ + + + + diff --git a/src/components/Form/src/jeecg/components/JRangeDate.vue b/src/components/Form/src/jeecg/components/JRangeDate.vue new file mode 100644 index 0000000..865e388 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JRangeDate.vue @@ -0,0 +1,65 @@ + + + + + \ No newline at end of file diff --git a/src/components/Form/src/jeecg/components/JRangeNumber.vue b/src/components/Form/src/jeecg/components/JRangeNumber.vue new file mode 100644 index 0000000..7d34f05 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JRangeNumber.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/JRangeTime.vue b/src/components/Form/src/jeecg/components/JRangeTime.vue new file mode 100644 index 0000000..645b99d --- /dev/null +++ b/src/components/Form/src/jeecg/components/JRangeTime.vue @@ -0,0 +1,53 @@ + + + \ No newline at end of file diff --git a/src/components/Form/src/jeecg/components/JSearchSelect.vue b/src/components/Form/src/jeecg/components/JSearchSelect.vue new file mode 100644 index 0000000..e7d25b7 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JSearchSelect.vue @@ -0,0 +1,329 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/JSelectDept.vue b/src/components/Form/src/jeecg/components/JSelectDept.vue new file mode 100644 index 0000000..2a4ca38 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JSelectDept.vue @@ -0,0 +1,169 @@ + + + + diff --git a/src/components/Form/src/jeecg/components/JSelectInput.vue b/src/components/Form/src/jeecg/components/JSelectInput.vue new file mode 100644 index 0000000..9fa1c65 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JSelectInput.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/JSelectMultiple.vue b/src/components/Form/src/jeecg/components/JSelectMultiple.vue new file mode 100644 index 0000000..eaad64b --- /dev/null +++ b/src/components/Form/src/jeecg/components/JSelectMultiple.vue @@ -0,0 +1,164 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JSelectPosition.vue b/src/components/Form/src/jeecg/components/JSelectPosition.vue new file mode 100644 index 0000000..be458c4 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JSelectPosition.vue @@ -0,0 +1,153 @@ + + + + diff --git a/src/components/Form/src/jeecg/components/JSelectRole.vue b/src/components/Form/src/jeecg/components/JSelectRole.vue new file mode 100644 index 0000000..ea56187 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JSelectRole.vue @@ -0,0 +1,154 @@ + + + + diff --git a/src/components/Form/src/jeecg/components/JSelectUser.vue b/src/components/Form/src/jeecg/components/JSelectUser.vue new file mode 100644 index 0000000..82866b2 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JSelectUser.vue @@ -0,0 +1,157 @@ + + + + diff --git a/src/components/Form/src/jeecg/components/JSelectUserByDept.vue b/src/components/Form/src/jeecg/components/JSelectUserByDept.vue new file mode 100644 index 0000000..5039150 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JSelectUserByDept.vue @@ -0,0 +1,153 @@ + + + + diff --git a/src/components/Form/src/jeecg/components/JSwitch.vue b/src/components/Form/src/jeecg/components/JSwitch.vue new file mode 100644 index 0000000..251bcdc --- /dev/null +++ b/src/components/Form/src/jeecg/components/JSwitch.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/JTreeDict.vue b/src/components/Form/src/jeecg/components/JTreeDict.vue new file mode 100644 index 0000000..6439290 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JTreeDict.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/JTreeSelect.vue b/src/components/Form/src/jeecg/components/JTreeSelect.vue new file mode 100644 index 0000000..18343f0 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JTreeSelect.vue @@ -0,0 +1,352 @@ + + + + diff --git a/src/components/Form/src/jeecg/components/JUpload/JUpload.vue b/src/components/Form/src/jeecg/components/JUpload/JUpload.vue new file mode 100644 index 0000000..2c71fee --- /dev/null +++ b/src/components/Form/src/jeecg/components/JUpload/JUpload.vue @@ -0,0 +1,430 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/JUpload/JUploadModal.vue b/src/components/Form/src/jeecg/components/JUpload/JUploadModal.vue new file mode 100644 index 0000000..083e1ec --- /dev/null +++ b/src/components/Form/src/jeecg/components/JUpload/JUploadModal.vue @@ -0,0 +1,45 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JUpload/components/UploadItemActions.vue b/src/components/Form/src/jeecg/components/JUpload/components/UploadItemActions.vue new file mode 100644 index 0000000..61586ab --- /dev/null +++ b/src/components/Form/src/jeecg/components/JUpload/components/UploadItemActions.vue @@ -0,0 +1,90 @@ + + + diff --git a/src/components/Form/src/jeecg/components/JUpload/index.ts b/src/components/Form/src/jeecg/components/JUpload/index.ts new file mode 100644 index 0000000..740bf2d --- /dev/null +++ b/src/components/Form/src/jeecg/components/JUpload/index.ts @@ -0,0 +1,3 @@ +export { UploadTypeEnum } from './upload.data'; +export { default as JUpload } from './JUpload.vue'; +export { default as JUploadModal } from './JUploadModal.vue'; diff --git a/src/components/Form/src/jeecg/components/JUpload/upload.data.ts b/src/components/Form/src/jeecg/components/JUpload/upload.data.ts new file mode 100644 index 0000000..820146d --- /dev/null +++ b/src/components/Form/src/jeecg/components/JUpload/upload.data.ts @@ -0,0 +1,5 @@ +export enum UploadTypeEnum { + all = 'all', + image = 'image', + file = 'file', +} diff --git a/src/components/Form/src/jeecg/components/base/JSelectBiz.vue b/src/components/Form/src/jeecg/components/base/JSelectBiz.vue new file mode 100644 index 0000000..96f8de5 --- /dev/null +++ b/src/components/Form/src/jeecg/components/base/JSelectBiz.vue @@ -0,0 +1,122 @@ + + + diff --git a/src/components/Form/src/jeecg/components/base/JTreeBiz.vue b/src/components/Form/src/jeecg/components/base/JTreeBiz.vue new file mode 100644 index 0000000..cd65c5f --- /dev/null +++ b/src/components/Form/src/jeecg/components/base/JTreeBiz.vue @@ -0,0 +1,91 @@ + + + diff --git a/src/components/Form/src/jeecg/components/modal/DeptSelectModal.vue b/src/components/Form/src/jeecg/components/modal/DeptSelectModal.vue new file mode 100644 index 0000000..120d22a --- /dev/null +++ b/src/components/Form/src/jeecg/components/modal/DeptSelectModal.vue @@ -0,0 +1,122 @@ + + + diff --git a/src/components/Form/src/jeecg/components/modal/JPopupOnlReportModal.vue b/src/components/Form/src/jeecg/components/modal/JPopupOnlReportModal.vue new file mode 100644 index 0000000..645ad95 --- /dev/null +++ b/src/components/Form/src/jeecg/components/modal/JPopupOnlReportModal.vue @@ -0,0 +1,284 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/modal/PositionSelectModal.vue b/src/components/Form/src/jeecg/components/modal/PositionSelectModal.vue new file mode 100644 index 0000000..1103607 --- /dev/null +++ b/src/components/Form/src/jeecg/components/modal/PositionSelectModal.vue @@ -0,0 +1,182 @@ + + + diff --git a/src/components/Form/src/jeecg/components/modal/RoleSelectModal.vue b/src/components/Form/src/jeecg/components/modal/RoleSelectModal.vue new file mode 100644 index 0000000..c5a1024 --- /dev/null +++ b/src/components/Form/src/jeecg/components/modal/RoleSelectModal.vue @@ -0,0 +1,120 @@ + + + diff --git a/src/components/Form/src/jeecg/components/modal/UserSelectByDepModal.vue b/src/components/Form/src/jeecg/components/modal/UserSelectByDepModal.vue new file mode 100644 index 0000000..5ce39fc --- /dev/null +++ b/src/components/Form/src/jeecg/components/modal/UserSelectByDepModal.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/modal/UserSelectModal.vue b/src/components/Form/src/jeecg/components/modal/UserSelectModal.vue new file mode 100644 index 0000000..673e312 --- /dev/null +++ b/src/components/Form/src/jeecg/components/modal/UserSelectModal.vue @@ -0,0 +1,233 @@ + + + diff --git a/src/components/Form/src/jeecg/components/positionSelect/PositionSelectModal.vue b/src/components/Form/src/jeecg/components/positionSelect/PositionSelectModal.vue new file mode 100644 index 0000000..88866c1 --- /dev/null +++ b/src/components/Form/src/jeecg/components/positionSelect/PositionSelectModal.vue @@ -0,0 +1,282 @@ + + + + + + diff --git a/src/components/Form/src/jeecg/components/roleSelect/RoleSelectModal.vue b/src/components/Form/src/jeecg/components/roleSelect/RoleSelectModal.vue new file mode 100644 index 0000000..5d92be4 --- /dev/null +++ b/src/components/Form/src/jeecg/components/roleSelect/RoleSelectModal.vue @@ -0,0 +1,282 @@ + + + + + + diff --git a/src/components/Form/src/jeecg/components/userSelect/SelectedUserItem.vue b/src/components/Form/src/jeecg/components/userSelect/SelectedUserItem.vue new file mode 100644 index 0000000..e45a5bf --- /dev/null +++ b/src/components/Form/src/jeecg/components/userSelect/SelectedUserItem.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/userSelect/UserList.vue b/src/components/Form/src/jeecg/components/userSelect/UserList.vue new file mode 100644 index 0000000..2c03bbb --- /dev/null +++ b/src/components/Form/src/jeecg/components/userSelect/UserList.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/userSelect/UserListAndDepart.vue b/src/components/Form/src/jeecg/components/userSelect/UserListAndDepart.vue new file mode 100644 index 0000000..a37a7f4 --- /dev/null +++ b/src/components/Form/src/jeecg/components/userSelect/UserListAndDepart.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/userSelect/UserListAndRole.vue b/src/components/Form/src/jeecg/components/userSelect/UserListAndRole.vue new file mode 100644 index 0000000..0424d66 --- /dev/null +++ b/src/components/Form/src/jeecg/components/userSelect/UserListAndRole.vue @@ -0,0 +1,136 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/userSelect/UserSelectModal.vue b/src/components/Form/src/jeecg/components/userSelect/UserSelectModal.vue new file mode 100644 index 0000000..11ebc22 --- /dev/null +++ b/src/components/Form/src/jeecg/components/userSelect/UserSelectModal.vue @@ -0,0 +1,347 @@ + + + + + diff --git a/src/components/Form/src/jeecg/components/userSelect/index.vue b/src/components/Form/src/jeecg/components/userSelect/index.vue new file mode 100644 index 0000000..1fd2eae --- /dev/null +++ b/src/components/Form/src/jeecg/components/userSelect/index.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/src/components/Form/src/jeecg/hooks/useSelectBiz.ts b/src/components/Form/src/jeecg/hooks/useSelectBiz.ts new file mode 100644 index 0000000..2509423 --- /dev/null +++ b/src/components/Form/src/jeecg/hooks/useSelectBiz.ts @@ -0,0 +1,168 @@ +import { inject, reactive, ref, watch, unref, Ref } from 'vue'; +import { useMessage } from '/@/hooks/web/useMessage'; + +export function useSelectBiz(getList, props) { + //接收下拉框选项 + const selectOptions = inject('selectOptions', ref>([])); + //接收已选择的值 + const selectValues = inject('selectValues', reactive({ value: [], change: false })); + // 是否正在加载回显 + const loadingEcho = inject>('loadingEcho', ref(false)); + //数据集 + const dataSource = ref>([]); + //已选择的值 + const checkedKeys = ref>([]); + //选则的行记录 + const selectRows = ref>([]); + //提示弹窗 + const $message = useMessage(); + // 是否是首次加载回显,只有首次加载,才会显示 loading + let isFirstLoadEcho = true; + + /** + * 监听selectValues变化 + */ + watch( + selectValues, + () => { + if (selectValues['change'] == false) { + //update-begin---author:wangshuai ---date:20220412 for:[VUEN-672]发文草稿箱编辑时拟稿人显示用户名------------ + let params = {}; + params[props.rowKey] = selectValues['value'].join(','); + //update-end---author:wangshuai ---date:20220412 for:[VUEN-672]发文草稿箱编辑时拟稿人显示用户名-------------- + loadingEcho.value = isFirstLoadEcho; + isFirstLoadEcho = false; + getDataSource(params, true) + .then() + .finally(() => { + loadingEcho.value = isFirstLoadEcho; + }); + } + //设置列表默认选中 + checkedKeys['value'] = selectValues['value']; + }, + { immediate: true } + ); + + async function onSelectChange(selectedRowKeys: (string | number)[], selectRow) { + checkedKeys.value = selectedRowKeys; + //判断全选的问题checkedKeys和selectRows必须一致 + if (props.showSelected && unref(checkedKeys).length !== unref(selectRow).length) { + let { records } = await getList({ + code: unref(checkedKeys).join(','), + pageSize: unref(checkedKeys).length, + }); + selectRows.value = records; + } else { + selectRows.value = selectRow; + } + } + + /** + * 选择列配置 + */ + const rowSelection = { + //update-begin-author:liusq---date:20220517--for: 动态设置rowSelection的type值,默认是'checkbox' --- + type: props.isRadioSelection ? 'radio' : 'checkbox', + //update-end-author:liusq---date:20220517--for: 动态设置rowSelection的type值,默认是'checkbox' --- + columnWidth: 20, + selectedRowKeys: checkedKeys, + onChange: onSelectChange, + //update-begin-author:wangshuai---date:20221102--for: [VUEN-2562]用户选择,跨页选择后,只有当前页人员 --- + //table4.4.0新增属性选中之后是否清空上一页下一页的数据,默认false + preserveSelectedRowKeys:true, + //update-end-author:wangshuai---date:20221102--for: [VUEN-2562]用户选择,跨页选择后,只有当前页人员 --- + }; + + /** + * 序号列配置 + */ + const indexColumnProps = { + dataIndex: 'index', + width: 20, + }; + + /** + * 加载列表数据集 + * @param params + * @param flag 是否是默认回显模式加载 + */ + async function getDataSource(params, flag) { + let { records } = await getList(params); + dataSource.value = records; + if (flag) { + let options = []; + records.forEach((item) => { + options.push({ label: item[props.labelKey], value: item[props.rowKey] }); + }); + selectOptions.value = options; + } + } + async function initSelectRows() { + let { records } = await getList({ + code: selectValues['value'].join(','), + pageSize: selectValues['value'].length, + }); + checkedKeys['value'] = selectValues['value']; + selectRows['value'] = records; + } + + /** + * 弹出框显示隐藏触发事件 + */ + async function visibleChange(visible) { + if (visible) { + //设置列表默认选中 + props.showSelected && initSelectRows(); + } + } + + /** + * 确定选择 + */ + function getSelectResult(success) { + let options = []; + let values = []; + selectRows.value.forEach((item) => { + options.push({ label: item[props.labelKey], value: item[props.rowKey] }); + }); + checkedKeys.value.forEach((item) => { + values.push(item); + }); + selectOptions.value = options; + if (props.maxSelectCount && values.length > props.maxSelectCount) { + $message.createMessage.warning(`最多只能选择${props.maxSelectCount}条数据`); + return false; + } + success && success(options, values); + } + //删除已选择的信息 + function handleDeleteSelected(record) { + //update-begin---author:wangshuai ---date:20230404 for:【issues/424】开启右侧列表后,在右侧列表中删除用户时,逻辑有问题------------ + checkedKeys.value = checkedKeys.value.filter((item) => item != record[props.rowKey]); + selectRows.value = selectRows.value.filter((item) => item[props.rowKey] !== record[props.rowKey]); + //update-end---author:wangshuai ---date:20230404 for:【issues/424】开启右侧列表后,在右侧列表中删除用户时,逻辑有问题------------ + } + //清空选择项 + function reset() { + checkedKeys.value = []; + selectRows.value = []; + } + return [ + { + onSelectChange, + getDataSource, + visibleChange, + selectOptions, + selectValues, + rowSelection, + indexColumnProps, + checkedKeys, + selectRows, + dataSource, + getSelectResult, + handleDeleteSelected, + reset, + }, + ]; +} diff --git a/src/components/Form/src/jeecg/hooks/useTreeBiz.ts b/src/components/Form/src/jeecg/hooks/useTreeBiz.ts new file mode 100644 index 0000000..11eb301 --- /dev/null +++ b/src/components/Form/src/jeecg/hooks/useTreeBiz.ts @@ -0,0 +1,275 @@ +import type { Ref } from 'vue'; +import { inject, reactive, ref, computed, unref, watch, nextTick } from 'vue'; +import { TreeActionType } from '/@/components/Tree'; +import { listToTree } from '/@/utils/common/compUtils'; + +export function useTreeBiz(treeRef, getList, props) { + //接收下拉框选项 + const selectOptions = inject('selectOptions', ref>([])); + //接收已选择的值 + const selectValues = inject('selectValues', reactive({})); + // 是否正在加载回显 + const loadingEcho = inject>('loadingEcho', ref(false)); + //数据集 + const treeData = ref>([]); + //已选择的值 + const checkedKeys = ref>([]); + //选则的行记录 + const selectRows = ref>([]); + //是否是打开弹框模式 + const openModal = ref(false); + // 是否开启父子关联,如果不可以多选,就始终取消父子关联 + const getCheckStrictly = computed(() => (props.multiple ? props.checkStrictly : true)); + // 是否是首次加载回显,只有首次加载,才会显示 loading + let isFirstLoadEcho = true; + + /** + * 监听selectValues变化 + */ + watch( + selectValues, + ({ value: values }: Recordable) => { + if(!values){ + return; + } + if (openModal.value == false && values.length > 0) { + loadingEcho.value = isFirstLoadEcho; + isFirstLoadEcho = false; + onLoadData(null, values.join(',')).finally(() => { + loadingEcho.value = false; + }); + } + }, + { immediate: true } + ); + + /** + * 获取树实例 + */ + function getTree() { + const tree = unref(treeRef); + if (!tree) { + throw new Error('tree is null!'); + } + return tree; + } + + /** + * 设置树展开级别 + */ + function expandTree() { + nextTick(() => { + if (props.defaultExpandLevel && props.defaultExpandLevel > 0) { + getTree().filterByLevel(props.defaultExpandLevel); + } + //设置列表默认选中 + checkedKeys.value = selectValues['value']; + }).then(); + } + + /** + * 树节点选择 + */ + function onSelect(keys, info) { + if (props.checkable == false) { + checkedKeys.value = props.checkStrictly ? keys.checked : keys; + const { selectedNodes } = info; + let rows = []; + selectedNodes.forEach((item) => { + rows.push(item); + }); + selectRows.value = rows; + } + } + + /** + * 树节点选择 + */ + function onCheck(keys, info) { + if (props.checkable == true) { + // 如果不能多选,就只保留最后一个选中的 + if (!props.multiple) { + if (info.checked) { + //update-begin-author:taoyan date:20220408 for: 单选模式下,设定rowKey,无法选中数据- + checkedKeys.value = [info.node.eventKey]; + let rowKey = props.rowKey; + let temp = info.checkedNodes.find((n) => n[rowKey] === info.node.eventKey); + selectRows.value = [temp]; + //update-end-author:taoyan date:20220408 for: 单选模式下,设定rowKey,无法选中数据- + } else { + checkedKeys.value = []; + selectRows.value = []; + } + return; + } + checkedKeys.value = props.checkStrictly ? keys.checked : keys; + const { checkedNodes } = info; + let rows = []; + checkedNodes.forEach((item) => { + rows.push(item); + }); + selectRows.value = rows; + } + } + + /** + * 勾选全部 + */ + async function checkALL(checkAll) { + getTree().checkAll(checkAll); + //update-begin---author:wangshuai ---date:20230403 for:【issues/394】所属部门树操作全部勾选不生效/【issues/4646】部门全部勾选后,点击确认按钮,部门信息丢失------------ + await nextTick(); + checkedKeys.value = getTree().getCheckedKeys(); + if(checkAll){ + getTreeRow(); + }else{ + selectRows.value = []; + } + //update-end---author:wangshuai ---date:20230403 for:【issues/394】所属部门树操作全部勾选不生效/【issues/4646】部门全部勾选后,点击确认按钮,部门信息丢失------------ + } + + /** + * 获取数列表 + * @param res + */ + function getTreeRow() { + let ids = ""; + if(unref(checkedKeys).length>0){ + ids = checkedKeys.value.join(","); + } + getList({ids:ids}).then((res) =>{ + selectRows.value = res; + }) + } + + /** + * 展开全部 + */ + function expandAll(expandAll) { + getTree().expandAll(expandAll); + } + + /** + * 加载树数据 + */ + async function onLoadData(treeNode, ids) { + let params = {}; + let startPid = ''; + if (treeNode) { + startPid = treeNode.eventKey; + //update-begin---author:wangshuai ---date:20220407 for:rowkey不设置成id,sync开启异步的时候,点击上级下级不显示------------ + params['pid'] = treeNode.value; + //update-end---author:wangshuai ---date:20220407 for:rowkey不设置成id,sync开启异步的时候,点击上级下级不显示------------ + } + if (ids) { + startPid = ''; + params['ids'] = ids; + } + let record = await getList(params); + let optionData = record; + if (!props.serverTreeData) { + //前端处理数据为tree结构 + record = listToTree(record, props, startPid); + if (record.length == 0 && treeNode) { + checkHasChild(startPid, treeData.value); + } + } + + if (openModal.value == true) { + //弹框模式下加载全部数据 + if (!treeNode) { + treeData.value = record; + } else { + return new Promise((resolve: (value?: unknown) => void) => { + if (!treeNode.children) { + resolve(); + return; + } + const asyncTreeAction: TreeActionType | null = unref(treeRef); + if (asyncTreeAction) { + asyncTreeAction.updateNodeByKey(treeNode.eventKey, { children: record }); + asyncTreeAction.setExpandedKeys([treeNode.eventKey, ...asyncTreeAction.getExpandedKeys()]); + } + resolve(); + return; + }); + } + expandTree(); + } else { + const options = []; + optionData.forEach((item) => { + //update-begin-author:taoyan date:2022-7-4 for: issues/I5F3P4 online配置部门选择后编辑,查看数据应该显示部门名称,不是部门代码 + options.push({ label: item[props.titleKey], value: item[props.rowKey] }); + //update-end-author:taoyan date:2022-7-4 for: issues/I5F3P4 online配置部门选择后编辑,查看数据应该显示部门名称,不是部门代码 + }); + selectOptions.value = options; + } + } + + /** + * 异步加载时检测是否含有下级节点 + * @param pid 父节点 + * @param treeArray tree数据 + */ + function checkHasChild(pid, treeArray) { + if (treeArray && treeArray.length > 0) { + for (let item of treeArray) { + if (item.key == pid) { + if (!item.child) { + item.isLeaf = true; + } + break; + } else { + checkHasChild(pid, item.children); + } + } + } + } + + /** + * 获取已选择数据 + */ + function getSelectTreeData(success) { + const options = []; + const values = []; + selectRows.value.forEach((item) => { + options.push({ label: item[props.labelKey], value: item[props.rowKey] }); + }); + checkedKeys.value.forEach((item) => { + values.push(item); + }); + selectOptions.value = options; + success && success(options, values); + } + + /** + * 弹出框显示隐藏触发事件 + */ + async function visibleChange(visible) { + if (visible) { + //弹出框打开时加载全部数据 + openModal.value = true; + await onLoadData(null, null); + } else { + openModal.value = false; + } + } + + return [ + { + visibleChange, + selectOptions, + selectValues, + onLoadData, + onCheck, + onSelect, + checkALL, + expandAll, + checkedKeys, + selectRows, + treeData, + getCheckStrictly, + getSelectTreeData, + }, + ]; +} diff --git a/src/components/Form/src/jeecg/props/props.ts b/src/components/Form/src/jeecg/props/props.ts new file mode 100644 index 0000000..3a5fa79 --- /dev/null +++ b/src/components/Form/src/jeecg/props/props.ts @@ -0,0 +1,87 @@ +//下拉选择框组件公共props +import { propTypes } from '/@/utils/propTypes'; + +export const selectProps = { + //是否多选 + isRadioSelection: { + type: Boolean, + //update-begin---author:wangshuai ---date:20220527 for:部门用户组件默认应该单选,否则其他地方有问题------------ + default: false, + //update-end---author:wangshuai ---date:20220527 for:部门用户组件默认应该单选,否则其他地方有问题-------------- + }, + //回传value字段名 + rowKey: { + type: String, + default: 'id', + }, + //回传文本字段名 + labelKey: { + type: String, + default: 'name', + }, + //查询参数 + params: { + type: Object, + default: () => {}, + }, + //是否显示选择按钮 + showButton: propTypes.bool.def(true), + //是否显示右侧选中列表 + showSelected: propTypes.bool.def(false), + //最大选择数量 + maxSelectCount: { + type: Number, + default: 0, + }, +}; + +//树形选择组件公共props +export const treeProps = { + //回传value字段名 + rowKey: { + type: String, + default: 'key', + }, + //回传文本字段名 + labelKey: { + type: String, + default: 'title', + }, + //初始展开的层级 + defaultExpandLevel: { + type: [Number], + default: 0, + }, + //根pid值 + startPid: { + type: [Number, String], + default: '', + }, + //主键字段 + primaryKey: { + type: [String], + default: 'id', + }, + //父ID字段 + parentKey: { + type: [String], + default: 'parentId', + }, + //title字段 + titleKey: { + type: [String], + default: 'title', + }, + //是否开启服务端转换tree数据结构 + serverTreeData: propTypes.bool.def(true), + //是否开启异步加载数据 + sync: propTypes.bool.def(true), + //是否显示选择按钮 + showButton: propTypes.bool.def(true), + //是否显示复选框 + checkable: propTypes.bool.def(true), + //checkable 状态下节点选择完全受控(父子节点选中状态不再关联) + checkStrictly: propTypes.bool.def(false), + // 是否允许多选,默认 true + multiple: propTypes.bool.def(true), +}; diff --git a/src/components/Form/src/props.ts b/src/components/Form/src/props.ts new file mode 100644 index 0000000..1c8a645 --- /dev/null +++ b/src/components/Form/src/props.ts @@ -0,0 +1,121 @@ +import type { FieldMapToTime, FormSchema } from './types/form'; +import type { CSSProperties, PropType } from 'vue'; +import type { ColEx } from './types'; +import type { TableActionType } from '/@/components/Table'; +import type { ButtonProps } from 'ant-design-vue/es/button/buttonTypes'; +import type { RowProps } from 'ant-design-vue/lib/grid/Row'; +import dayjs from "dayjs"; +import { propTypes } from '/@/utils/propTypes'; +import componentSetting from '/@/settings/componentSetting'; + +const { form } = componentSetting; +export const basicProps = { + model: { + type: Object as PropType, + default: {}, + }, + // 标签宽度 固定宽度 + labelWidth: { + type: [Number, String] as PropType, + default: 0, + }, + fieldMapToTime: { + type: Array as PropType, + default: () => [], + }, + fieldMapToNumber: { + type: Array as PropType, + default: () => [], + }, + compact: propTypes.bool, + // 表单配置规则 + schemas: { + type: [Array] as PropType, + default: () => [], + }, + mergeDynamicData: { + type: Object as PropType, + default: null, + }, + baseRowStyle: { + type: Object as PropType, + }, + baseColProps: { + type: Object as PropType>, + }, + autoSetPlaceHolder: propTypes.bool.def(true), + // 在INPUT组件上单击回车时,是否自动提交 + autoSubmitOnEnter: propTypes.bool.def(false), + submitOnReset: propTypes.bool, + size: propTypes.oneOf(['default', 'small', 'large']).def('default'), + // 禁用表单 + disabled: propTypes.bool, + emptySpan: { + type: [Number, Object] as PropType, + default: 0, + }, + // 是否显示收起展开按钮 + showAdvancedButton: propTypes.bool, + // 转化时间 + transformDateFunc: { + type: Function as PropType, + default: (date: any) => { + // 判断是否是dayjs实例 + return dayjs.isDayjs(date) ? date?.format('YYYY-MM-DD HH:mm:ss') : date; + }, + }, + rulesMessageJoinLabel: propTypes.bool.def(true), + // 【jeecg】超过3列自动折叠 + autoAdvancedCol: propTypes.number.def(3), + // 超过3行自动折叠 + autoAdvancedLine: propTypes.number.def(3), + // 不受折叠影响的行数 + alwaysShowLines: propTypes.number.def(1), + + // 是否显示操作按钮 + showActionButtonGroup: propTypes.bool.def(true), + // 操作列Col配置 + actionColOptions: Object as PropType>, + // 显示重置按钮 + showResetButton: propTypes.bool.def(true), + // 是否聚焦第一个输入框,只在第一个表单项为input的时候作用 + autoFocusFirstItem: propTypes.bool, + // 重置按钮配置 + resetButtonOptions: Object as PropType>, + + // 显示确认按钮 + showSubmitButton: propTypes.bool.def(true), + // 确认按钮配置 + submitButtonOptions: Object as PropType>, + + // 自定义重置函数 + resetFunc: Function as PropType<() => Promise>, + submitFunc: Function as PropType<() => Promise>, + + // 以下为默认props + hideRequiredMark: propTypes.bool, + + labelCol: { + type: Object as PropType>, + default: form.labelCol, + }, + + layout: propTypes.oneOf(['horizontal', 'vertical', 'inline']).def('horizontal'), + tableAction: { + type: Object as PropType, + }, + + wrapperCol: { + type: Object as PropType>, + default: form.wrapperCol, + }, + + colon: propTypes.bool.def(form.colon), + + labelAlign: propTypes.string, + + rowProps: Object as PropType, + + // 当表单是查询条件的时候 当表单改变后自动查询,不需要点击查询按钮 + autoSearch: propTypes.bool.def(false), +}; diff --git a/src/components/Form/src/types/form.ts b/src/components/Form/src/types/form.ts new file mode 100644 index 0000000..5cddf3d --- /dev/null +++ b/src/components/Form/src/types/form.ts @@ -0,0 +1,216 @@ +import type { NamePath, RuleObject } from 'ant-design-vue/lib/form/interface'; +import type { VNode, ComputedRef } from 'vue'; +import type { ButtonProps as AntdButtonProps } from '/@/components/Button'; +import type { FormItem } from './formItem'; +import type { ColEx, ComponentType } from './index'; +import type { TableActionType } from '/@/components/Table/src/types/table'; +import type { CSSProperties } from 'vue'; +import type { RowProps } from 'ant-design-vue/lib/grid/Row'; + +export type FieldMapToTime = [string, [string, string], string?][]; +export type FieldMapToNumber = [string, [string, string]][]; + +export type Rule = RuleObject & { + trigger?: 'blur' | 'change' | ['change', 'blur']; +}; + +export interface RenderCallbackParams { + schema: FormSchema; + values: Recordable; + model: Recordable; + field: string; +} + +export interface ButtonProps extends AntdButtonProps { + text?: string; +} + +export interface FormActionType { + submit: () => Promise; + setFieldsValue: (values: T) => Promise; + resetFields: () => Promise; + getFieldsValue: () => Recordable; + clearValidate: (name?: string | string[]) => Promise; + updateSchema: (data: Partial | Partial[]) => Promise; + resetSchema: (data: Partial | Partial[]) => Promise; + setProps: (formProps: Partial) => Promise; + getProps: ComputedRef>; + removeSchemaByFiled: (field: string | string[]) => Promise; + appendSchemaByField: (schema: FormSchema, prefixField: string | undefined, first?: boolean | undefined) => Promise; + validateFields: (nameList?: NamePath[]) => Promise; + validate: (nameList?: NamePath[]) => Promise; + scrollToField: (name: NamePath, options?: ScrollOptions) => Promise; +} + +export type RegisterFn = (formInstance: FormActionType) => void; + +export type UseFormReturnType = [RegisterFn, FormActionType]; + +export interface FormProps { + layout?: 'vertical' | 'inline' | 'horizontal'; + // Form value + model?: Recordable; + // The width of all items in the entire form + labelWidth?: number | string; + //alignment + labelAlign?: 'left' | 'right'; + //Row configuration for the entire form + rowProps?: RowProps; + // Submit form on reset + submitOnReset?: boolean; + // Col configuration for the entire form + labelCol?: Partial; + // Col configuration for the entire form + wrapperCol?: Partial; + + // General row style + baseRowStyle?: CSSProperties; + + // General col configuration + baseColProps?: Partial; + + // Form configuration rules + schemas?: FormSchema[]; + // Function values used to merge into dynamic control form items + mergeDynamicData?: Recordable; + // Compact mode for search forms + compact?: boolean; + // Blank line span + emptySpan?: number | Partial; + // Internal component size of the form + size?: 'default' | 'small' | 'large'; + // Whether to disable + disabled?: boolean; + // Time interval fields are mapped into multiple + fieldMapToTime?: FieldMapToTime; + // number interval fields are mapped into multiple + fieldMapToNumber?: FieldMapToNumber; + // Placeholder is set automatically + autoSetPlaceHolder?: boolean; + // Auto submit on press enter on input + autoSubmitOnEnter?: boolean; + // Check whether the information is added to the label + rulesMessageJoinLabel?: boolean; + // 是否显示展开收起按钮 + showAdvancedButton?: boolean; + // Whether to focus on the first input box, only works when the first form item is input + autoFocusFirstItem?: boolean; + // 【jeecg】如果 showAdvancedButton 为 true,超过指定列数默认折叠,默认为3 + autoAdvancedCol?: number; + // 如果 showAdvancedButton 为 true,超过指定行数行默认折叠 + autoAdvancedLine?: number; + // 折叠时始终保持显示的行数 + alwaysShowLines?: number; + // Whether to show the operation button + showActionButtonGroup?: boolean; + + // Reset button configuration + resetButtonOptions?: Partial; + + // Confirm button configuration + submitButtonOptions?: Partial; + + // Operation column configuration + actionColOptions?: Partial; + + // Show reset button + showResetButton?: boolean; + // Show confirmation button + showSubmitButton?: boolean; + + resetFunc?: () => Promise; + submitFunc?: () => Promise; + transformDateFunc?: (date: any) => string; + colon?: boolean; +} +export interface FormSchema { + // Field name + field: string; + // Event name triggered by internal value change, default change + changeEvent?: string; + // Variable name bound to v-model Default value + valueField?: string; + // Label name + label: string | VNode; + // Auxiliary text + subLabel?: string; + // Help text on the right side of the text + helpMessage?: string | string[] | ((renderCallbackParams: RenderCallbackParams) => string | string[]); + // BaseHelp component props + helpComponentProps?: Partial; + // Label width, if it is passed, the labelCol and WrapperCol configured by itemProps will be invalid + labelWidth?: string | number; + // Disable the adjustment of labelWidth with global settings of formModel, and manually set labelCol and wrapperCol by yourself + disabledLabelWidth?: boolean; + // render component + component: ComponentType; + // Component parameters + componentProps?: + | ((opt: { schema: FormSchema; tableAction: TableActionType; formActionType: FormActionType; formModel: Recordable }) => Recordable) + | object; + // Required + required?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean); + + suffix?: string | number | ((values: RenderCallbackParams) => string | number); + + // Validation rules + rules?: Rule[]; + // Check whether the information is added to the label + rulesMessageJoinLabel?: boolean; + + // Reference formModelItem + itemProps?: Partial; + + // col configuration outside formModelItem + colProps?: Partial; + + // 默认值 + defaultValue?: any; + isAdvanced?: boolean; + + // Matching details components + span?: number; + + ifShow?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean); + + show?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean); + + // Render the content in the form-item tag + render?: (renderCallbackParams: RenderCallbackParams) => VNode | VNode[] | string; + + // Rendering col content requires outer wrapper form-item + renderColContent?: (renderCallbackParams: RenderCallbackParams) => VNode | VNode[] | string; + + renderComponentContent?: ((renderCallbackParams: RenderCallbackParams) => any) | VNode | VNode[] | string; + + // Custom slot, in from-item + slot?: string; + + // Custom slot, similar to renderColContent + colSlot?: string; + + dynamicDisabled?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean); + + dynamicRules?: (renderCallbackParams: RenderCallbackParams) => Rule[]; + + // 这个属性自定义的 用于自定义的业务 比如在表单打开的时候修改表单的禁用状态,但是又不能重写componentProps,因为他的内容太多了,所以使用dynamicDisabled和buss实现 + buss?: any; + + //label字数控制(label宽度) + labelLength?: number +} +export interface HelpComponentProps { + maxWidth: string; + // Whether to display the serial number + showIndex: boolean; + // Text list + text: any; + // colour + color: string; + // font size + fontSize: string; + icon: string; + absolute: boolean; + // Positioning + position: any; +} diff --git a/src/components/Form/src/types/formItem.ts b/src/components/Form/src/types/formItem.ts new file mode 100644 index 0000000..77b238a --- /dev/null +++ b/src/components/Form/src/types/formItem.ts @@ -0,0 +1,91 @@ +import type { NamePath } from 'ant-design-vue/lib/form/interface'; +import type { ColProps } from 'ant-design-vue/lib/grid/Col'; +import type { HTMLAttributes, VNodeChild } from 'vue'; + +export interface FormItem { + /** + * Used with label, whether to display : after label text. + * @default true + * @type boolean + */ + colon?: boolean; + + /** + * The extra prompt message. It is similar to help. Usage example: to display error message and prompt message at the same time. + * @type any (string | slot) + */ + extra?: string | VNodeChild | JSX.Element; + + /** + * Used with validateStatus, this option specifies the validation status icon. Recommended to be used only with Input. + * @default false + * @type boolean + */ + hasFeedback?: boolean; + + /** + * The prompt message. If not provided, the prompt message will be generated by the validation rule. + * @type any (string | slot) + */ + help?: string | VNodeChild | JSX.Element; + + /** + * Label test + * @type any (string | slot) + */ + label?: string | VNodeChild | JSX.Element; + + /** + * The layout of label. You can set span offset to something like {span: 3, offset: 12} or sm: {span: 3, offset: 12} same as with + * @type Col + */ + labelCol?: ColProps & HTMLAttributes; + + /** + * Whether provided or not, it will be generated by the validation rule. + * @default false + * @type boolean + */ + required?: boolean; + + /** + * The validation status. If not provided, it will be generated by validation rule. options: 'success' 'warning' 'error' 'validating' + * @type string + */ + validateStatus?: '' | 'success' | 'warning' | 'error' | 'validating'; + + /** + * The layout for input controls, same as labelCol + * @type Col + */ + wrapperCol?: ColProps; + /** + * Set sub label htmlFor. + */ + htmlFor?: string; + /** + * text align of label + */ + labelAlign?: 'left' | 'right'; + /** + * a key of model. In the setting of validate and resetFields method, the attribute is required + */ + name?: NamePath; + /** + * validation rules of form + */ + rules?: object | object[]; + /** + * Whether to automatically associate form fields. In most cases, you can setting automatic association. + * If the conditions for automatic association are not met, you can manually associate them. See the notes below. + */ + autoLink?: boolean; + /** + * Whether stop validate on first rule of error for this field. + */ + validateFirst?: boolean; + /** + * When to validate the value of children node + */ + validateTrigger?: string | string[] | false; +} diff --git a/src/components/Form/src/types/hooks.ts b/src/components/Form/src/types/hooks.ts new file mode 100644 index 0000000..0308e73 --- /dev/null +++ b/src/components/Form/src/types/hooks.ts @@ -0,0 +1,6 @@ +export interface AdvanceState { + isAdvanced: boolean; + hideAdvanceBtn: boolean; + isLoad: boolean; + actionSpan: number; +} diff --git a/src/components/Form/src/types/index.ts b/src/components/Form/src/types/index.ts new file mode 100644 index 0000000..15f1991 --- /dev/null +++ b/src/components/Form/src/types/index.ts @@ -0,0 +1,154 @@ +type ColSpanType = number | string; + +export interface ColEx { + style?: any; + /** + * raster number of cells to occupy, 0 corresponds to display: none + * @default none (0) + * @type ColSpanType + */ + span?: ColSpanType; + + /** + * raster order, used in flex layout mode + * @default 0 + * @type ColSpanType + */ + order?: ColSpanType; + + /** + * the layout fill of flex + * @default none + * @type ColSpanType + */ + flex?: ColSpanType; + + /** + * the number of cells to offset Col from the left + * @default 0 + * @type ColSpanType + */ + offset?: ColSpanType; + + /** + * the number of cells that raster is moved to the right + * @default 0 + * @type ColSpanType + */ + push?: ColSpanType; + + /** + * the number of cells that raster is moved to the left + * @default 0 + * @type ColSpanType + */ + pull?: ColSpanType; + + /** + * <576px and also default setting, could be a span value or an object containing above props + * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType + */ + xs?: { span: ColSpanType; offset?: ColSpanType } | ColSpanType; + + /** + * ≥576px, could be a span value or an object containing above props + * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType + */ + sm?: { span: ColSpanType; offset?: ColSpanType } | ColSpanType; + + /** + * ≥768px, could be a span value or an object containing above props + * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType + */ + md?: { span: ColSpanType; offset?: ColSpanType } | ColSpanType; + + /** + * ≥992px, could be a span value or an object containing above props + * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType + */ + lg?: { span: ColSpanType; offset?: ColSpanType } | ColSpanType; + + /** + * ≥1200px, could be a span value or an object containing above props + * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType + */ + xl?: { span: ColSpanType; offset?: ColSpanType } | ColSpanType; + + /** + * ≥1600px, could be a span value or an object containing above props + * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType + */ + xxl?: { span: ColSpanType; offset?: ColSpanType } | ColSpanType; +} + +export type ComponentType = + | 'Input' + | 'InputGroup' + | 'InputPassword' + | 'InputSearch' + | 'InputTextArea' + | 'InputNumber' + | 'InputCountDown' + | 'Select' + | 'ApiSelect' + | 'TreeSelect' + | 'ApiTreeSelect' + | 'ApiRadioGroup' + | 'RadioButtonGroup' + | 'RadioGroup' + | 'Checkbox' + | 'CheckboxGroup' + | 'AutoComplete' + | 'Cascader' + | 'DatePicker' + | 'MonthPicker' + | 'RangePicker' + | 'WeekPicker' + | 'TimePicker' + | 'Switch' + | 'StrengthMeter' + | 'Upload' + | 'IconPicker' + | 'Render' + | 'Slider' + | 'Rate' + | 'Divider' + | 'JAreaLinkage' + | 'JSelectPosition' + | 'JSelectRole' + | 'JSelectUser' + | 'JImageUpload' + | 'JDictSelectTag' + | 'JSelectDept' + | 'JAreaSelect' + | 'JEditor' + | 'JMarkdownEditor' + | 'JSelectInput' + | 'JCodeEditor' + | 'JCategorySelect' + | 'JSelectMultiple' + | 'JPopup' + | 'JSwitch' + | 'JEasyCron' + | 'JTreeDict' + | 'JInputPop' + | 'JCheckbox' + | 'JInput' + | 'JTreeSelect' + | 'JEllipsis' + | 'JSelectUserByDept' + | 'JUpload' + | 'JSearchSelect' + | 'JAddInput' + | 'Time' + | 'OnlineSelectCascade' + | 'LinkTableCard' + | 'LinkTableSelect' + | 'LinkTableForQuery' + | 'CascaderPcaForQuery' + | 'UserSelect' + | 'RangeDate' + | 'RangeNumber' + | 'linkRecordSelect' + | 'RangeTime' + | 'JRangeNumber'; diff --git a/src/components/Form/src/utils/Area.ts b/src/components/Form/src/utils/Area.ts new file mode 100644 index 0000000..5b96051 --- /dev/null +++ b/src/components/Form/src/utils/Area.ts @@ -0,0 +1,113 @@ +import REGION_DATA from 'china-area-data'; + +/** + * Area 属性all的类型 + */ +interface PlainPca { + id: string; + text: string; + pid: string; + index: Number; +} + +/** + * 省市区工具类 -解决列表省市区组件的翻译问题 + */ +class Area { + all: PlainPca[]; + + /** + * 构造器 + * @param express + */ + constructor(pcaa?) { + if (!pcaa) { + pcaa = REGION_DATA; + } + let arr: PlainPca[] = []; + const province = pcaa['86']; + Object.keys(province).map((key) => { + arr.push({ id: key, text: province[key], pid: '86', index: 1 }); + const city = pcaa[key]; + Object.keys(city).map((key2) => { + arr.push({ id: key2, text: city[key2], pid: key, index: 2 }); + const qu = pcaa[key2]; + if (qu) { + Object.keys(qu).map((key3) => { + arr.push({ id: key3, text: qu[key3], pid: key2, index: 3 }); + }); + } + }); + }); + this.all = arr; + } + + get pca() { + return this.all; + } + + getCode(text) { + if (!text || text.length == 0) { + return ''; + } + for (let item of this.all) { + if (item.text === text) { + return item.id; + } + } + } + +//update-begin-author:liusq---date:20230404--for: [issue/382]省市区组件JAreaLinkage数据不回显--- + getText(code,index=3) { + if (!code || code.length == 0) { + return ''; + } + let arr = []; + this.getAreaBycode(code, arr, index); + return arr.join('/'); + } +//update-end-author:liusq---date:20230404--for: [issue/382]省市区组件JAreaLinkage数据不回显--- + + getRealCode(code) { + let arr = []; + this.getPcode(code, arr, 3); + return arr; + } + + getPcode(id, arr, index) { + for (let item of this.all) { + if (item.id === id && item.index == index) { + arr.unshift(id); + if (item.pid != '86') { + this.getPcode(item.pid, arr, --index); + } + } + } + } + + getAreaBycode(code, arr, index) { + for (let item of this.all) { + if (item.id === code && item.index == index) { + arr.unshift(item.text); + if (item.pid != '86') { + this.getAreaBycode(item.pid, arr, --index); + } + } + } + } +} +const jeecgAreaData = new Area(); + +// 根据code找文本 +const getAreaTextByCode = function (code) { + let index = 3; + //update-begin-author:liusq---date:20220531--for: 判断code是否是多code逗号分割的字符串,是的话,获取最后一位的code --- + if (code && code.includes(',')) { + index = code.split(",").length; + code = code.substr(code.lastIndexOf(',') + 1); + } + //update-end-author:liusq---date:20220531--for: 判断code是否是多code逗号分割的字符串,是的话,获取最后一位的code --- + return jeecgAreaData.getText(code,index); +}; + +export { getAreaTextByCode }; diff --git a/src/components/Form/src/utils/GroupRequest.ts b/src/components/Form/src/utils/GroupRequest.ts new file mode 100644 index 0000000..ce813df --- /dev/null +++ b/src/components/Form/src/utils/GroupRequest.ts @@ -0,0 +1,27 @@ +import { getAuthCache, setAuthCache } from '/@/utils/auth'; +/** + * 将一个请求分组 + * + * @param getPromise 传入一个可以获取到Promise对象的方法 + * @param groupId 分组ID,如果不传或者为空则不分组 + * @param expire 过期时间,默认 半分钟 + */ +export function httpGroupRequest(getPromise, groupId, expire = 1000 * 30) { + if (groupId == null || groupId === '') { + console.log('--------popup----------getFrom DB-------with---no--groupId '); + return getPromise(); + } + + if (getAuthCache(groupId)) { + console.log('---------popup--------getFrom Cache--------groupId = ' + groupId); + return Promise.resolve(getAuthCache(groupId)); + } else { + console.log('--------popup----------getFrom DB---------groupId = ' + groupId); + } + + // 还没有发出请求,就发出第一次的请求 + return getPromise().then((res) => { + setAuthCache(groupId, res); + return Promise.resolve(res); + }); +} diff --git a/src/components/Form/src/utils/areaDataUtil.js b/src/components/Form/src/utils/areaDataUtil.js new file mode 100644 index 0000000..14aa7ae --- /dev/null +++ b/src/components/Form/src/utils/areaDataUtil.js @@ -0,0 +1,193 @@ +import REGION_DATA from 'china-area-data'; +import { cloneDeep } from 'lodash-es'; + +// code转汉字大对象 +const CodeToText = {}; +// 汉字转code大对象 +const TextToCode = {}; +const provinceObject = REGION_DATA['86']; // 省份对象 +const regionData = []; +let provinceAndCityData = []; + +CodeToText[''] = '全部'; + +// 计算省 +for (const prop in provinceObject) { + regionData.push({ + value: prop, // 省份code值 + label: provinceObject[prop], // 省份汉字 + }); + CodeToText[prop] = provinceObject[prop]; + TextToCode[provinceObject[prop]] = { + code: prop, + }; + TextToCode[provinceObject[prop]]['全部'] = { + code: '', + }; +} +// 计算市 +for (let i = 0, len = regionData.length; i < len; i++) { + const provinceCode = regionData[i].value; + const provinceText = regionData[i].label; + const provinceChildren = []; + for (const prop in REGION_DATA[provinceCode]) { + provinceChildren.push({ + value: prop, + label: REGION_DATA[provinceCode][prop], + }); + CodeToText[prop] = REGION_DATA[provinceCode][prop]; + TextToCode[provinceText][REGION_DATA[provinceCode][prop]] = { + code: prop, + }; + TextToCode[provinceText][REGION_DATA[provinceCode][prop]]['全部'] = { + code: '', + }; + } + if (provinceChildren.length) { + regionData[i].children = provinceChildren; + } +} +provinceAndCityData = cloneDeep(regionData); + +// 计算区 +for (let i = 0, len = regionData.length; i < len; i++) { + const province = regionData[i].children; + const provinceText = regionData[i].label; + if (province) { + for (let j = 0, len = province.length; j < len; j++) { + const cityCode = province[j].value; + const cityText = province[j].label; + const cityChildren = []; + for (const prop in REGION_DATA[cityCode]) { + cityChildren.push({ + value: prop, + label: REGION_DATA[cityCode][prop], + }); + CodeToText[prop] = REGION_DATA[cityCode][prop]; + TextToCode[provinceText][cityText][REGION_DATA[cityCode][prop]] = { + code: prop, + }; + } + if (cityChildren.length) { + province[j].children = cityChildren; + } + } + } +} + +// 添加“全部”选项 +const provinceAndCityDataPlus = cloneDeep(provinceAndCityData); +provinceAndCityDataPlus.unshift({ + value: '', + label: '全部', +}); +for (let i = 0, len = provinceAndCityDataPlus.length; i < len; i++) { + const province = provinceAndCityDataPlus[i].children; + if (province && province.length) { + province.unshift({ + value: '', + label: '全部', + }); + for (let j = 0, len = province.length; j < len; j++) { + const city = province[j].children; + if (city && city.length) { + city.unshift({ + value: '', + label: '全部', + }); + } + } + } +} + +const regionDataPlus = cloneDeep(regionData); +regionDataPlus.unshift({ + value: '', + label: '全部', +}); +for (let i = 0, len = regionDataPlus.length; i < len; i++) { + const province = regionDataPlus[i].children; + if (province && province.length) { + province.unshift({ + value: '', + label: '全部', + }); + + for (let j = 0, len = province.length; j < len; j++) { + const city = province[j].children; + if (city && city.length) { + city.unshift({ + value: '', + label: '全部', + }); + } + } + } +} +//--begin--@updateBy:liusq----date:20210922---for:省市区三级联动需求方法----- +//省份数据 +const provinceOptions = []; +for (const prop in provinceObject) { + provinceOptions.push({ + value: prop, // 省份code值 + label: provinceObject[prop], // 省份汉字 + }); +} +/** + * 根据code获取下拉option的数据 + * @param code + * @returns [] + */ +function getDataByCode(code) { + let data = []; + for (const prop in REGION_DATA[code]) { + data.push({ + value: prop, // 省份code值 + label: REGION_DATA[code][prop], // 省份汉字 + }); + } + return data; +} + +/** + * 获取全部省市区的层级 + * @type {Array} + */ +const pca = []; +Object.keys(provinceObject).map((province) => { + pca.push({ id: province, text: provinceObject[province], pid: '86', index: 1 }); + const cityObject = REGION_DATA[province]; + Object.keys(cityObject).map((city) => { + pca.push({ id: city, text: cityObject[city], pid: province, index: 2 }); + const areaObject = REGION_DATA[city]; + if (areaObject) { + Object.keys(areaObject).map((area) => { + pca.push({ id: area, text: areaObject[area], pid: city, index: 3 }); + }); + } + }); +}); + +/** + * 根据code反推value + * @param code + * @param level + * @returns {Array} + */ +function getRealCode(code, level) { + let arr = []; + getPcode(code, arr, level); + return arr; +} +function getPcode(id, arr, index) { + for (let item of pca) { + if (item.id === id && item.index == index) { + arr.unshift(id); + if (item.pid != '86') { + getPcode(item.pid, arr, --index); + } + } + } +} +//--end--@updateBy:liusq----date:20210922---for:省市区三级联动需求方法----- +export { provinceAndCityData, regionData, provinceAndCityDataPlus, regionDataPlus, getDataByCode, provinceOptions, getRealCode }; diff --git a/src/components/Form/src/utils/formUtils.ts b/src/components/Form/src/utils/formUtils.ts new file mode 100644 index 0000000..ea04960 --- /dev/null +++ b/src/components/Form/src/utils/formUtils.ts @@ -0,0 +1,73 @@ +import { unref } from 'vue'; +import { dateUtil } from '/@/utils/dateUtil'; + +/** + * 表单区间时间数值字段转换 + * @param props + * @param values + */ +export function handleRangeValue(props, values) { + //判断是否配置并处理fieldMapToTime + const fieldMapToTime = unref(props)?.fieldMapToTime; + fieldMapToTime && (values = handleRangeTimeValue(props, values)); + //判断是否配置并处理fieldMapToNumber + const fieldMapToNumber = unref(props)?.fieldMapToNumber; + fieldMapToNumber && (values = handleRangeNumberValue(props, values)); + return values; +} +/** + * 处理时间转换成2个字段 + * @param props + * @param values + */ +export function handleRangeTimeValue(props, values) { + const fieldMapToTime = unref(props).fieldMapToTime; + if (!fieldMapToTime || !Array.isArray(fieldMapToTime)) { + return values; + } + for (const [field, [startTimeKey, endTimeKey], format = 'YYYY-MM-DD'] of fieldMapToTime) { + if (!field || !startTimeKey || !endTimeKey || !values[field]) { + continue; + } + + // 【issues/I53G9Y】 日期区间组件有可能是字符串 + let timeValue = values[field]; + if (!Array.isArray(timeValue)) { + timeValue = timeValue.split(','); + } + const [startTime, endTime]: string[] = timeValue; + values[startTimeKey] = dateUtil(startTime).format(format); + values[endTimeKey] = dateUtil(endTime).format(format); + Reflect.deleteProperty(values, field); + } + return values; +} +/** + * 处理数字转换成2个字段 + * @param props + * @param values + * @updateby liusq + * @updateDate:2021-09-16 + */ +export function handleRangeNumberValue(props, values) { + const fieldMapToNumber = unref(props).fieldMapToNumber; + if (!fieldMapToNumber || !Array.isArray(fieldMapToNumber)) { + return values; + } + for (const [field, [startNumberKey, endNumberKey]] of fieldMapToNumber) { + if (!field || !startNumberKey || !endNumberKey || !values[field]) { + continue; + } + //update-begin-author:taoyan date:2022-5-10 for: 用于数值的范围查询 数组格式的中间转换不知道哪里出了问题,这里会变成字符串,需要再强制转成数组 + let temp = values[field]; + if (typeof temp === 'string') { + temp = temp.split(','); + } + const [startNumber, endNumber]: number[] = temp; + //update-end-author:taoyan date:2022-5-10 for: 用于数值的范围查询 数组格式的中间转换不知道哪里出了问题,这里会变成字符串,需要再强制转成数组 + values[startNumberKey] = startNumber; + values[endNumberKey] = endNumber; + Reflect.deleteProperty(values, field); + } + return values; +} diff --git a/src/components/Icon/data/icons.data.ts b/src/components/Icon/data/icons.data.ts new file mode 100644 index 0000000..bcac58e --- /dev/null +++ b/src/components/Icon/data/icons.data.ts @@ -0,0 +1,791 @@ +export default [ + 'ant-design:account-book-filled', + 'ant-design:account-book-outlined', + 'ant-design:account-book-twotone', + 'ant-design:aim-outlined', + 'ant-design:alert-filled', + 'ant-design:alert-outlined', + 'ant-design:alert-twotone', + 'ant-design:alibaba-outlined', + 'ant-design:align-center-outlined', + 'ant-design:align-left-outlined', + 'ant-design:align-right-outlined', + 'ant-design:alipay-circle-filled', + 'ant-design:alipay-circle-outlined', + 'ant-design:alipay-outlined', + 'ant-design:alipay-square-filled', + 'ant-design:aliwangwang-filled', + 'ant-design:aliwangwang-outlined', + 'ant-design:aliyun-outlined', + 'ant-design:amazon-circle-filled', + 'ant-design:amazon-outlined', + 'ant-design:amazon-square-filled', + 'ant-design:android-filled', + 'ant-design:android-outlined', + 'ant-design:ant-cloud-outlined', + 'ant-design:ant-design-outlined', + 'ant-design:apartment-outlined', + 'ant-design:api-filled', + 'ant-design:api-outlined', + 'ant-design:api-twotone', + 'ant-design:apple-filled', + 'ant-design:apple-outlined', + 'ant-design:appstore-add-outlined', + 'ant-design:appstore-filled', + 'ant-design:appstore-outlined', + 'ant-design:appstore-twotone', + 'ant-design:area-chart-outlined', + 'ant-design:arrow-down-outlined', + 'ant-design:arrow-left-outlined', + 'ant-design:arrow-right-outlined', + 'ant-design:arrow-up-outlined', + 'ant-design:arrows-alt-outlined', + 'ant-design:audio-filled', + 'ant-design:audio-muted-outlined', + 'ant-design:audio-outlined', + 'ant-design:audio-twotone', + 'ant-design:audit-outlined', + 'ant-design:backward-filled', + 'ant-design:backward-outlined', + 'ant-design:bank-filled', + 'ant-design:bank-outlined', + 'ant-design:bank-twotone', + 'ant-design:bar-chart-outlined', + 'ant-design:barcode-outlined', + 'ant-design:bars-outlined', + 'ant-design:behance-circle-filled', + 'ant-design:behance-outlined', + 'ant-design:behance-square-filled', + 'ant-design:behance-square-outlined', + 'ant-design:bell-filled', + 'ant-design:bell-outlined', + 'ant-design:bell-twotone', + 'ant-design:bg-colors-outlined', + 'ant-design:block-outlined', + 'ant-design:bold-outlined', + 'ant-design:book-filled', + 'ant-design:book-outlined', + 'ant-design:book-twotone', + 'ant-design:border-bottom-outlined', + 'ant-design:border-horizontal-outlined', + 'ant-design:border-inner-outlined', + 'ant-design:border-left-outlined', + 'ant-design:border-outer-outlined', + 'ant-design:border-outlined', + 'ant-design:border-right-outlined', + 'ant-design:border-top-outlined', + 'ant-design:border-verticle-outlined', + 'ant-design:borderless-table-outlined', + 'ant-design:box-plot-filled', + 'ant-design:box-plot-outlined', + 'ant-design:box-plot-twotone', + 'ant-design:branches-outlined', + 'ant-design:bug-filled', + 'ant-design:bug-outlined', + 'ant-design:bug-twotone', + 'ant-design:build-filled', + 'ant-design:build-outlined', + 'ant-design:build-twotone', + 'ant-design:bulb-filled', + 'ant-design:bulb-outlined', + 'ant-design:bulb-twotone', + 'ant-design:calculator-filled', + 'ant-design:calculator-outlined', + 'ant-design:calculator-twotone', + 'ant-design:calendar-filled', + 'ant-design:calendar-outlined', + 'ant-design:calendar-twotone', + 'ant-design:camera-filled', + 'ant-design:camera-outlined', + 'ant-design:camera-twotone', + 'ant-design:car-filled', + 'ant-design:car-outlined', + 'ant-design:car-twotone', + 'ant-design:caret-down-filled', + 'ant-design:caret-down-outlined', + 'ant-design:caret-left-filled', + 'ant-design:caret-left-outlined', + 'ant-design:caret-right-filled', + 'ant-design:caret-right-outlined', + 'ant-design:caret-up-filled', + 'ant-design:caret-up-outlined', + 'ant-design:carry-out-filled', + 'ant-design:carry-out-outlined', + 'ant-design:carry-out-twotone', + 'ant-design:check-circle-filled', + 'ant-design:check-circle-outlined', + 'ant-design:check-circle-twotone', + 'ant-design:check-outlined', + 'ant-design:check-square-filled', + 'ant-design:check-square-outlined', + 'ant-design:check-square-twotone', + 'ant-design:chrome-filled', + 'ant-design:chrome-outlined', + 'ant-design:ci-circle-filled', + 'ant-design:ci-circle-outlined', + 'ant-design:ci-circle-twotone', + 'ant-design:ci-outlined', + 'ant-design:ci-twotone', + 'ant-design:clear-outlined', + 'ant-design:clock-circle-filled', + 'ant-design:clock-circle-outlined', + 'ant-design:clock-circle-twotone', + 'ant-design:close-circle-filled', + 'ant-design:close-circle-outlined', + 'ant-design:close-circle-twotone', + 'ant-design:close-outlined', + 'ant-design:close-square-filled', + 'ant-design:close-square-outlined', + 'ant-design:close-square-twotone', + 'ant-design:cloud-download-outlined', + 'ant-design:cloud-filled', + 'ant-design:cloud-outlined', + 'ant-design:cloud-server-outlined', + 'ant-design:cloud-sync-outlined', + 'ant-design:cloud-twotone', + 'ant-design:cloud-upload-outlined', + 'ant-design:cluster-outlined', + 'ant-design:code-filled', + 'ant-design:code-outlined', + 'ant-design:code-sandbox-circle-filled', + 'ant-design:code-sandbox-outlined', + 'ant-design:code-sandbox-square-filled', + 'ant-design:code-twotone', + 'ant-design:codepen-circle-filled', + 'ant-design:codepen-circle-outlined', + 'ant-design:codepen-outlined', + 'ant-design:codepen-square-filled', + 'ant-design:coffee-outlined', + 'ant-design:column-height-outlined', + 'ant-design:column-width-outlined', + 'ant-design:comment-outlined', + 'ant-design:compass-filled', + 'ant-design:compass-outlined', + 'ant-design:compass-twotone', + 'ant-design:compress-outlined', + 'ant-design:console-sql-outlined', + 'ant-design:contacts-filled', + 'ant-design:contacts-outlined', + 'ant-design:contacts-twotone', + 'ant-design:container-filled', + 'ant-design:container-outlined', + 'ant-design:container-twotone', + 'ant-design:control-filled', + 'ant-design:control-outlined', + 'ant-design:control-twotone', + 'ant-design:copy-filled', + 'ant-design:copy-outlined', + 'ant-design:copy-twotone', + 'ant-design:copyright-circle-filled', + 'ant-design:copyright-circle-outlined', + 'ant-design:copyright-circle-twotone', + 'ant-design:copyright-outlined', + 'ant-design:copyright-twotone', + 'ant-design:credit-card-filled', + 'ant-design:credit-card-outlined', + 'ant-design:credit-card-twotone', + 'ant-design:crown-filled', + 'ant-design:crown-outlined', + 'ant-design:crown-twotone', + 'ant-design:customer-service-filled', + 'ant-design:customer-service-outlined', + 'ant-design:customer-service-twotone', + 'ant-design:dash-outlined', + 'ant-design:dashboard-filled', + 'ant-design:dashboard-outlined', + 'ant-design:dashboard-twotone', + 'ant-design:database-filled', + 'ant-design:database-outlined', + 'ant-design:database-twotone', + 'ant-design:delete-column-outlined', + 'ant-design:delete-filled', + 'ant-design:delete-outlined', + 'ant-design:delete-row-outlined', + 'ant-design:delete-twotone', + 'ant-design:delivered-procedure-outlined', + 'ant-design:deployment-unit-outlined', + 'ant-design:desktop-outlined', + 'ant-design:diff-filled', + 'ant-design:diff-outlined', + 'ant-design:diff-twotone', + 'ant-design:dingding-outlined', + 'ant-design:dingtalk-circle-filled', + 'ant-design:dingtalk-outlined', + 'ant-design:dingtalk-square-filled', + 'ant-design:disconnect-outlined', + 'ant-design:dislike-filled', + 'ant-design:dislike-outlined', + 'ant-design:dislike-twotone', + 'ant-design:dollar-circle-filled', + 'ant-design:dollar-circle-outlined', + 'ant-design:dollar-circle-twotone', + 'ant-design:dollar-outlined', + 'ant-design:dollar-twotone', + 'ant-design:dot-chart-outlined', + 'ant-design:double-left-outlined', + 'ant-design:double-right-outlined', + 'ant-design:down-circle-filled', + 'ant-design:down-circle-outlined', + 'ant-design:down-circle-twotone', + 'ant-design:down-outlined', + 'ant-design:down-square-filled', + 'ant-design:down-square-outlined', + 'ant-design:down-square-twotone', + 'ant-design:download-outlined', + 'ant-design:drag-outlined', + 'ant-design:dribbble-circle-filled', + 'ant-design:dribbble-outlined', + 'ant-design:dribbble-square-filled', + 'ant-design:dribbble-square-outlined', + 'ant-design:dropbox-circle-filled', + 'ant-design:dropbox-outlined', + 'ant-design:dropbox-square-filled', + 'ant-design:edit-filled', + 'ant-design:edit-outlined', + 'ant-design:edit-twotone', + 'ant-design:ellipsis-outlined', + 'ant-design:enter-outlined', + 'ant-design:environment-filled', + 'ant-design:environment-outlined', + 'ant-design:environment-twotone', + 'ant-design:euro-circle-filled', + 'ant-design:euro-circle-outlined', + 'ant-design:euro-circle-twotone', + 'ant-design:euro-outlined', + 'ant-design:euro-twotone', + 'ant-design:exception-outlined', + 'ant-design:exclamation-circle-filled', + 'ant-design:exclamation-circle-outlined', + 'ant-design:exclamation-circle-twotone', + 'ant-design:exclamation-outlined', + 'ant-design:expand-alt-outlined', + 'ant-design:expand-outlined', + 'ant-design:experiment-filled', + 'ant-design:experiment-outlined', + 'ant-design:experiment-twotone', + 'ant-design:export-outlined', + 'ant-design:eye-filled', + 'ant-design:eye-invisible-filled', + 'ant-design:eye-invisible-outlined', + 'ant-design:eye-invisible-twotone', + 'ant-design:eye-outlined', + 'ant-design:eye-twotone', + 'ant-design:facebook-filled', + 'ant-design:facebook-outlined', + 'ant-design:fall-outlined', + 'ant-design:fast-backward-filled', + 'ant-design:fast-backward-outlined', + 'ant-design:fast-forward-filled', + 'ant-design:fast-forward-outlined', + 'ant-design:field-binary-outlined', + 'ant-design:field-number-outlined', + 'ant-design:field-string-outlined', + 'ant-design:field-time-outlined', + 'ant-design:file-add-filled', + 'ant-design:file-add-outlined', + 'ant-design:file-add-twotone', + 'ant-design:file-done-outlined', + 'ant-design:file-excel-filled', + 'ant-design:file-excel-outlined', + 'ant-design:file-excel-twotone', + 'ant-design:file-exclamation-filled', + 'ant-design:file-exclamation-outlined', + 'ant-design:file-exclamation-twotone', + 'ant-design:file-filled', + 'ant-design:file-gif-outlined', + 'ant-design:file-image-filled', + 'ant-design:file-image-outlined', + 'ant-design:file-image-twotone', + 'ant-design:file-jpg-outlined', + 'ant-design:file-markdown-filled', + 'ant-design:file-markdown-outlined', + 'ant-design:file-markdown-twotone', + 'ant-design:file-outlined', + 'ant-design:file-pdf-filled', + 'ant-design:file-pdf-outlined', + 'ant-design:file-pdf-twotone', + 'ant-design:file-ppt-filled', + 'ant-design:file-ppt-outlined', + 'ant-design:file-ppt-twotone', + 'ant-design:file-protect-outlined', + 'ant-design:file-search-outlined', + 'ant-design:file-sync-outlined', + 'ant-design:file-text-filled', + 'ant-design:file-text-outlined', + 'ant-design:file-text-twotone', + 'ant-design:file-twotone', + 'ant-design:file-unknown-filled', + 'ant-design:file-unknown-outlined', + 'ant-design:file-unknown-twotone', + 'ant-design:file-word-filled', + 'ant-design:file-word-outlined', + 'ant-design:file-word-twotone', + 'ant-design:file-zip-filled', + 'ant-design:file-zip-outlined', + 'ant-design:file-zip-twotone', + 'ant-design:filter-filled', + 'ant-design:filter-outlined', + 'ant-design:filter-twotone', + 'ant-design:fire-filled', + 'ant-design:fire-outlined', + 'ant-design:fire-twotone', + 'ant-design:flag-filled', + 'ant-design:flag-outlined', + 'ant-design:flag-twotone', + 'ant-design:folder-add-filled', + 'ant-design:folder-add-outlined', + 'ant-design:folder-add-twotone', + 'ant-design:folder-filled', + 'ant-design:folder-open-filled', + 'ant-design:folder-open-outlined', + 'ant-design:folder-open-twotone', + 'ant-design:folder-outlined', + 'ant-design:folder-twotone', + 'ant-design:folder-view-outlined', + 'ant-design:font-colors-outlined', + 'ant-design:font-size-outlined', + 'ant-design:fork-outlined', + 'ant-design:form-outlined', + 'ant-design:format-painter-filled', + 'ant-design:format-painter-outlined', + 'ant-design:forward-filled', + 'ant-design:forward-outlined', + 'ant-design:frown-filled', + 'ant-design:frown-outlined', + 'ant-design:frown-twotone', + 'ant-design:fullscreen-exit-outlined', + 'ant-design:fullscreen-outlined', + 'ant-design:function-outlined', + 'ant-design:fund-filled', + 'ant-design:fund-outlined', + 'ant-design:fund-projection-screen-outlined', + 'ant-design:fund-twotone', + 'ant-design:fund-view-outlined', + 'ant-design:funnel-plot-filled', + 'ant-design:funnel-plot-outlined', + 'ant-design:funnel-plot-twotone', + 'ant-design:gateway-outlined', + 'ant-design:gif-outlined', + 'ant-design:gift-filled', + 'ant-design:gift-outlined', + 'ant-design:gift-twotone', + 'ant-design:github-filled', + 'ant-design:github-outlined', + 'ant-design:gitlab-filled', + 'ant-design:gitlab-outlined', + 'ant-design:global-outlined', + 'ant-design:gold-filled', + 'ant-design:gold-outlined', + 'ant-design:gold-twotone', + 'ant-design:golden-filled', + 'ant-design:google-circle-filled', + 'ant-design:google-outlined', + 'ant-design:google-plus-circle-filled', + 'ant-design:google-plus-outlined', + 'ant-design:google-plus-square-filled', + 'ant-design:google-square-filled', + 'ant-design:group-outlined', + 'ant-design:hdd-filled', + 'ant-design:hdd-outlined', + 'ant-design:hdd-twotone', + 'ant-design:heart-filled', + 'ant-design:heart-outlined', + 'ant-design:heart-twotone', + 'ant-design:heat-map-outlined', + 'ant-design:highlight-filled', + 'ant-design:highlight-outlined', + 'ant-design:highlight-twotone', + 'ant-design:history-outlined', + 'ant-design:holder-outlined', + 'ant-design:home-filled', + 'ant-design:home-outlined', + 'ant-design:home-twotone', + 'ant-design:hourglass-filled', + 'ant-design:hourglass-outlined', + 'ant-design:hourglass-twotone', + 'ant-design:html5-filled', + 'ant-design:html5-outlined', + 'ant-design:html5-twotone', + 'ant-design:idcard-filled', + 'ant-design:idcard-outlined', + 'ant-design:idcard-twotone', + 'ant-design:ie-circle-filled', + 'ant-design:ie-outlined', + 'ant-design:ie-square-filled', + 'ant-design:import-outlined', + 'ant-design:inbox-outlined', + 'ant-design:info-circle-filled', + 'ant-design:info-circle-outlined', + 'ant-design:info-circle-twotone', + 'ant-design:info-outlined', + 'ant-design:insert-row-above-outlined', + 'ant-design:insert-row-below-outlined', + 'ant-design:insert-row-left-outlined', + 'ant-design:insert-row-right-outlined', + 'ant-design:instagram-filled', + 'ant-design:instagram-outlined', + 'ant-design:insurance-filled', + 'ant-design:insurance-outlined', + 'ant-design:insurance-twotone', + 'ant-design:interaction-filled', + 'ant-design:interaction-outlined', + 'ant-design:interaction-twotone', + 'ant-design:issues-close-outlined', + 'ant-design:italic-outlined', + 'ant-design:key-outlined', + 'ant-design:laptop-outlined', + 'ant-design:layout-filled', + 'ant-design:layout-outlined', + 'ant-design:layout-twotone', + 'ant-design:left-circle-filled', + 'ant-design:left-circle-outlined', + 'ant-design:left-circle-twotone', + 'ant-design:left-outlined', + 'ant-design:left-square-filled', + 'ant-design:left-square-outlined', + 'ant-design:left-square-twotone', + 'ant-design:like-filled', + 'ant-design:like-outlined', + 'ant-design:like-twotone', + 'ant-design:line-chart-outlined', + 'ant-design:line-height-outlined', + 'ant-design:line-outlined', + 'ant-design:link-outlined', + 'ant-design:linkedin-filled', + 'ant-design:linkedin-outlined', + 'ant-design:loading-3-quarters-outlined', + 'ant-design:loading-outlined', + 'ant-design:lock-filled', + 'ant-design:lock-outlined', + 'ant-design:lock-twotone', + 'ant-design:login-outlined', + 'ant-design:logout-outlined', + 'ant-design:mac-command-filled', + 'ant-design:mac-command-outlined', + 'ant-design:mail-filled', + 'ant-design:mail-outlined', + 'ant-design:mail-twotone', + 'ant-design:man-outlined', + 'ant-design:medicine-box-filled', + 'ant-design:medicine-box-outlined', + 'ant-design:medicine-box-twotone', + 'ant-design:medium-circle-filled', + 'ant-design:medium-outlined', + 'ant-design:medium-square-filled', + 'ant-design:medium-workmark-outlined', + 'ant-design:meh-filled', + 'ant-design:meh-outlined', + 'ant-design:meh-twotone', + 'ant-design:menu-fold-outlined', + 'ant-design:menu-outlined', + 'ant-design:menu-unfold-outlined', + 'ant-design:merge-cells-outlined', + 'ant-design:message-filled', + 'ant-design:message-outlined', + 'ant-design:message-twotone', + 'ant-design:minus-circle-filled', + 'ant-design:minus-circle-outlined', + 'ant-design:minus-circle-twotone', + 'ant-design:minus-outlined', + 'ant-design:minus-square-filled', + 'ant-design:minus-square-outlined', + 'ant-design:minus-square-twotone', + 'ant-design:mobile-filled', + 'ant-design:mobile-outlined', + 'ant-design:mobile-twotone', + 'ant-design:money-collect-filled', + 'ant-design:money-collect-outlined', + 'ant-design:money-collect-twotone', + 'ant-design:monitor-outlined', + 'ant-design:more-outlined', + 'ant-design:node-collapse-outlined', + 'ant-design:node-expand-outlined', + 'ant-design:node-index-outlined', + 'ant-design:notification-filled', + 'ant-design:notification-outlined', + 'ant-design:notification-twotone', + 'ant-design:number-outlined', + 'ant-design:one-to-one-outlined', + 'ant-design:ordered-list-outlined', + 'ant-design:paper-clip-outlined', + 'ant-design:partition-outlined', + 'ant-design:pause-circle-filled', + 'ant-design:pause-circle-outlined', + 'ant-design:pause-circle-twotone', + 'ant-design:pause-outlined', + 'ant-design:pay-circle-filled', + 'ant-design:pay-circle-outlined', + 'ant-design:percentage-outlined', + 'ant-design:phone-filled', + 'ant-design:phone-outlined', + 'ant-design:phone-twotone', + 'ant-design:pic-center-outlined', + 'ant-design:pic-left-outlined', + 'ant-design:pic-right-outlined', + 'ant-design:picture-filled', + 'ant-design:picture-outlined', + 'ant-design:picture-twotone', + 'ant-design:pie-chart-filled', + 'ant-design:pie-chart-outlined', + 'ant-design:pie-chart-twotone', + 'ant-design:play-circle-filled', + 'ant-design:play-circle-outlined', + 'ant-design:play-circle-twotone', + 'ant-design:play-square-filled', + 'ant-design:play-square-outlined', + 'ant-design:play-square-twotone', + 'ant-design:plus-circle-filled', + 'ant-design:plus-circle-outlined', + 'ant-design:plus-circle-twotone', + 'ant-design:plus-outlined', + 'ant-design:plus-square-filled', + 'ant-design:plus-square-outlined', + 'ant-design:plus-square-twotone', + 'ant-design:pound-circle-filled', + 'ant-design:pound-circle-outlined', + 'ant-design:pound-circle-twotone', + 'ant-design:pound-outlined', + 'ant-design:poweroff-outlined', + 'ant-design:printer-filled', + 'ant-design:printer-outlined', + 'ant-design:printer-twotone', + 'ant-design:profile-filled', + 'ant-design:profile-outlined', + 'ant-design:profile-twotone', + 'ant-design:project-filled', + 'ant-design:project-outlined', + 'ant-design:project-twotone', + 'ant-design:property-safety-filled', + 'ant-design:property-safety-outlined', + 'ant-design:property-safety-twotone', + 'ant-design:pull-request-outlined', + 'ant-design:pushpin-filled', + 'ant-design:pushpin-outlined', + 'ant-design:pushpin-twotone', + 'ant-design:qq-circle-filled', + 'ant-design:qq-outlined', + 'ant-design:qq-square-filled', + 'ant-design:qrcode-outlined', + 'ant-design:question-circle-filled', + 'ant-design:question-circle-outlined', + 'ant-design:question-circle-twotone', + 'ant-design:question-outlined', + 'ant-design:radar-chart-outlined', + 'ant-design:radius-bottomleft-outlined', + 'ant-design:radius-bottomright-outlined', + 'ant-design:radius-setting-outlined', + 'ant-design:radius-upleft-outlined', + 'ant-design:radius-upright-outlined', + 'ant-design:read-filled', + 'ant-design:read-outlined', + 'ant-design:reconciliation-filled', + 'ant-design:reconciliation-outlined', + 'ant-design:reconciliation-twotone', + 'ant-design:red-envelope-filled', + 'ant-design:red-envelope-outlined', + 'ant-design:red-envelope-twotone', + 'ant-design:reddit-circle-filled', + 'ant-design:reddit-outlined', + 'ant-design:reddit-square-filled', + 'ant-design:redo-outlined', + 'ant-design:reload-outlined', + 'ant-design:rest-filled', + 'ant-design:rest-outlined', + 'ant-design:rest-twotone', + 'ant-design:retweet-outlined', + 'ant-design:right-circle-filled', + 'ant-design:right-circle-outlined', + 'ant-design:right-circle-twotone', + 'ant-design:right-outlined', + 'ant-design:right-square-filled', + 'ant-design:right-square-outlined', + 'ant-design:right-square-twotone', + 'ant-design:rise-outlined', + 'ant-design:robot-filled', + 'ant-design:robot-outlined', + 'ant-design:rocket-filled', + 'ant-design:rocket-outlined', + 'ant-design:rocket-twotone', + 'ant-design:rollback-outlined', + 'ant-design:rotate-left-outlined', + 'ant-design:rotate-right-outlined', + 'ant-design:safety-certificate-filled', + 'ant-design:safety-certificate-outlined', + 'ant-design:safety-certificate-twotone', + 'ant-design:safety-outlined', + 'ant-design:save-filled', + 'ant-design:save-outlined', + 'ant-design:save-twotone', + 'ant-design:scan-outlined', + 'ant-design:schedule-filled', + 'ant-design:schedule-outlined', + 'ant-design:schedule-twotone', + 'ant-design:scissor-outlined', + 'ant-design:search-outlined', + 'ant-design:security-scan-filled', + 'ant-design:security-scan-outlined', + 'ant-design:security-scan-twotone', + 'ant-design:select-outlined', + 'ant-design:send-outlined', + 'ant-design:setting-filled', + 'ant-design:setting-outlined', + 'ant-design:setting-twotone', + 'ant-design:shake-outlined', + 'ant-design:share-alt-outlined', + 'ant-design:shop-filled', + 'ant-design:shop-outlined', + 'ant-design:shop-twotone', + 'ant-design:shopping-cart-outlined', + 'ant-design:shopping-filled', + 'ant-design:shopping-outlined', + 'ant-design:shopping-twotone', + 'ant-design:shrink-outlined', + 'ant-design:signal-filled', + 'ant-design:sisternode-outlined', + 'ant-design:sketch-circle-filled', + 'ant-design:sketch-outlined', + 'ant-design:sketch-square-filled', + 'ant-design:skin-filled', + 'ant-design:skin-outlined', + 'ant-design:skin-twotone', + 'ant-design:skype-filled', + 'ant-design:skype-outlined', + 'ant-design:slack-circle-filled', + 'ant-design:slack-outlined', + 'ant-design:slack-square-filled', + 'ant-design:slack-square-outlined', + 'ant-design:sliders-filled', + 'ant-design:sliders-outlined', + 'ant-design:sliders-twotone', + 'ant-design:small-dash-outlined', + 'ant-design:smile-filled', + 'ant-design:smile-outlined', + 'ant-design:smile-twotone', + 'ant-design:snippets-filled', + 'ant-design:snippets-outlined', + 'ant-design:snippets-twotone', + 'ant-design:solution-outlined', + 'ant-design:sort-ascending-outlined', + 'ant-design:sort-descending-outlined', + 'ant-design:sound-filled', + 'ant-design:sound-outlined', + 'ant-design:sound-twotone', + 'ant-design:split-cells-outlined', + 'ant-design:star-filled', + 'ant-design:star-outlined', + 'ant-design:star-twotone', + 'ant-design:step-backward-filled', + 'ant-design:step-backward-outlined', + 'ant-design:step-forward-filled', + 'ant-design:step-forward-outlined', + 'ant-design:stock-outlined', + 'ant-design:stop-filled', + 'ant-design:stop-outlined', + 'ant-design:stop-twotone', + 'ant-design:strikethrough-outlined', + 'ant-design:subnode-outlined', + 'ant-design:swap-left-outlined', + 'ant-design:swap-outlined', + 'ant-design:swap-right-outlined', + 'ant-design:switcher-filled', + 'ant-design:switcher-outlined', + 'ant-design:switcher-twotone', + 'ant-design:sync-outlined', + 'ant-design:table-outlined', + 'ant-design:tablet-filled', + 'ant-design:tablet-outlined', + 'ant-design:tablet-twotone', + 'ant-design:tag-filled', + 'ant-design:tag-outlined', + 'ant-design:tag-twotone', + 'ant-design:tags-filled', + 'ant-design:tags-outlined', + 'ant-design:tags-twotone', + 'ant-design:taobao-circle-filled', + 'ant-design:taobao-circle-outlined', + 'ant-design:taobao-outlined', + 'ant-design:taobao-square-filled', + 'ant-design:team-outlined', + 'ant-design:thunderbolt-filled', + 'ant-design:thunderbolt-outlined', + 'ant-design:thunderbolt-twotone', + 'ant-design:to-top-outlined', + 'ant-design:tool-filled', + 'ant-design:tool-outlined', + 'ant-design:tool-twotone', + 'ant-design:trademark-circle-filled', + 'ant-design:trademark-circle-outlined', + 'ant-design:trademark-circle-twotone', + 'ant-design:trademark-outlined', + 'ant-design:transaction-outlined', + 'ant-design:translation-outlined', + 'ant-design:trophy-filled', + 'ant-design:trophy-outlined', + 'ant-design:trophy-twotone', + 'ant-design:twitter-circle-filled', + 'ant-design:twitter-outlined', + 'ant-design:twitter-square-filled', + 'ant-design:underline-outlined', + 'ant-design:undo-outlined', + 'ant-design:ungroup-outlined', + 'ant-design:unlock-filled', + 'ant-design:unlock-outlined', + 'ant-design:unlock-twotone', + 'ant-design:unordered-list-outlined', + 'ant-design:up-circle-filled', + 'ant-design:up-circle-outlined', + 'ant-design:up-circle-twotone', + 'ant-design:up-outlined', + 'ant-design:up-square-filled', + 'ant-design:up-square-outlined', + 'ant-design:up-square-twotone', + 'ant-design:upload-outlined', + 'ant-design:usb-filled', + 'ant-design:usb-outlined', + 'ant-design:usb-twotone', + 'ant-design:user-add-outlined', + 'ant-design:user-delete-outlined', + 'ant-design:user-outlined', + 'ant-design:user-switch-outlined', + 'ant-design:usergroup-add-outlined', + 'ant-design:usergroup-delete-outlined', + 'ant-design:verified-outlined', + 'ant-design:vertical-align-bottom-outlined', + 'ant-design:vertical-align-middle-outlined', + 'ant-design:vertical-align-top-outlined', + 'ant-design:vertical-left-outlined', + 'ant-design:vertical-right-outlined', + 'ant-design:video-camera-add-outlined', + 'ant-design:video-camera-filled', + 'ant-design:video-camera-outlined', + 'ant-design:video-camera-twotone', + 'ant-design:wallet-filled', + 'ant-design:wallet-outlined', + 'ant-design:wallet-twotone', + 'ant-design:warning-filled', + 'ant-design:warning-outlined', + 'ant-design:warning-twotone', + 'ant-design:wechat-filled', + 'ant-design:wechat-outlined', + 'ant-design:weibo-circle-filled', + 'ant-design:weibo-circle-outlined', + 'ant-design:weibo-outlined', + 'ant-design:weibo-square-filled', + 'ant-design:weibo-square-outlined', + 'ant-design:whats-app-outlined', + 'ant-design:wifi-outlined', + 'ant-design:windows-filled', + 'ant-design:windows-outlined', + 'ant-design:woman-outlined', + 'ant-design:yahoo-filled', + 'ant-design:yahoo-outlined', + 'ant-design:youtube-filled', + 'ant-design:youtube-outlined', + 'ant-design:yuque-filled', + 'ant-design:yuque-outlined', + 'ant-design:zhihu-circle-filled', + 'ant-design:zhihu-outlined', + 'ant-design:zhihu-square-filled', + 'ant-design:zoom-in-outlined', + 'ant-design:zoom-out-outlined', +]; diff --git a/src/components/Icon/index.ts b/src/components/Icon/index.ts new file mode 100644 index 0000000..01e7d23 --- /dev/null +++ b/src/components/Icon/index.ts @@ -0,0 +1,7 @@ +import Icon from './src/Icon.vue'; +import SvgIcon from './src/SvgIcon.vue'; +import IconPicker from './src/IconPicker.vue'; + +export { Icon, IconPicker, SvgIcon }; + +export default Icon; diff --git a/src/components/Icon/src/Icon.vue b/src/components/Icon/src/Icon.vue new file mode 100644 index 0000000..d6b1349 --- /dev/null +++ b/src/components/Icon/src/Icon.vue @@ -0,0 +1,101 @@ + + + diff --git a/src/components/Icon/src/IconPicker.vue b/src/components/Icon/src/IconPicker.vue new file mode 100644 index 0000000..144ffc2 --- /dev/null +++ b/src/components/Icon/src/IconPicker.vue @@ -0,0 +1,178 @@ + + + diff --git a/src/components/Icon/src/SvgIcon.vue b/src/components/Icon/src/SvgIcon.vue new file mode 100644 index 0000000..20bfcca --- /dev/null +++ b/src/components/Icon/src/SvgIcon.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/components/JVxeCustom/index.ts b/src/components/JVxeCustom/index.ts new file mode 100644 index 0000000..e2d0caa --- /dev/null +++ b/src/components/JVxeCustom/index.ts @@ -0,0 +1,27 @@ +import { registerComponent, registerAsyncComponent } from '/@/components/jeecg/JVxeTable'; +import { JVxeTypes } from '/@/components/jeecg/JVxeTable/types'; +import { DictSearchSpanCell, DictSearchInputCell } from './src/components/JVxeSelectDictSearchCell'; + +export async function registerJVxeCustom() { + // ----------------- ⚠ 注意事项 ⚠ ----------------- + // 当组件内包含 BasicModal 时,必须使用异步引入! + // 否则将会导致 i18n 失效! + // ----------------- ⚠ 注意事项 ⚠ ----------------- + + // 注册【Popup】(普通封装方式) + await registerAsyncComponent(JVxeTypes.popup, import('./src/components/JVxePopupCell.vue')); + + // 注册【字典搜索下拉】组件(高级封装方式) + registerComponent(JVxeTypes.selectDictSearch, DictSearchInputCell, DictSearchSpanCell); + + // 注册【文件上传】组件 + await registerAsyncComponent(JVxeTypes.file, import('./src/components/JVxeFileCell.vue')); + // 注册【图片上传】组件 + await registerAsyncComponent(JVxeTypes.image, import('./src/components/JVxeImageCell.vue')); + // 注册【用户选择】组件 + await registerAsyncComponent(JVxeTypes.userSelect, import('./src/components/JVxeUserSelectCell.vue')); + // 注册【部门选择】组件 + await registerAsyncComponent(JVxeTypes.departSelect, import('./src/components/JVxeDepartSelectCell.vue')); + // 注册【省市区选择】组件 + await registerAsyncComponent(JVxeTypes.pca, import('./src/components/JVxePcaCell.vue')); +} diff --git a/src/components/JVxeCustom/src/components/JVxeDepartSelectCell.vue b/src/components/JVxeCustom/src/components/JVxeDepartSelectCell.vue new file mode 100644 index 0000000..edafba1 --- /dev/null +++ b/src/components/JVxeCustom/src/components/JVxeDepartSelectCell.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/src/components/JVxeCustom/src/components/JVxeFileCell.vue b/src/components/JVxeCustom/src/components/JVxeFileCell.vue new file mode 100644 index 0000000..c27602e --- /dev/null +++ b/src/components/JVxeCustom/src/components/JVxeFileCell.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/src/components/JVxeCustom/src/components/JVxeImageCell.vue b/src/components/JVxeCustom/src/components/JVxeImageCell.vue new file mode 100644 index 0000000..0a7eb12 --- /dev/null +++ b/src/components/JVxeCustom/src/components/JVxeImageCell.vue @@ -0,0 +1,128 @@ + + + + diff --git a/src/components/JVxeCustom/src/components/JVxePcaCell.vue b/src/components/JVxeCustom/src/components/JVxePcaCell.vue new file mode 100644 index 0000000..b547892 --- /dev/null +++ b/src/components/JVxeCustom/src/components/JVxePcaCell.vue @@ -0,0 +1,77 @@ + + + + diff --git a/src/components/JVxeCustom/src/components/JVxePopupCell.vue b/src/components/JVxeCustom/src/components/JVxePopupCell.vue new file mode 100644 index 0000000..e3144fd --- /dev/null +++ b/src/components/JVxeCustom/src/components/JVxePopupCell.vue @@ -0,0 +1,67 @@ + + diff --git a/src/components/JVxeCustom/src/components/JVxeSelectDictSearchCell.ts b/src/components/JVxeCustom/src/components/JVxeSelectDictSearchCell.ts new file mode 100644 index 0000000..e03c395 --- /dev/null +++ b/src/components/JVxeCustom/src/components/JVxeSelectDictSearchCell.ts @@ -0,0 +1,288 @@ +import { computed, ref, watch, defineComponent, h } from 'vue'; +import { cloneDeep, debounce } from 'lodash-es'; +import { defHttp } from '/@/utils/http/axios'; +import { filterDictText } from '/@/utils/dict/JDictSelectUtil'; +import { ajaxGetDictItems, getDictItemsByCode } from '/@/utils/dict'; +import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types'; +import { dispatchEvent } from '/@/components/jeecg/JVxeTable/utils'; +import { useResolveComponent as rc } from '/@/components/jeecg/JVxeTable/hooks'; +import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks'; +import { useMessage } from '/@/hooks/web/useMessage'; + +/** value - label map,防止重复查询(刷新清空缓存) */ +const LabelMap = new Map(); +// 请求id +let requestId = 0; + +/** 显示组件,自带翻译 */ +export const DictSearchSpanCell = defineComponent({ + name: 'JVxeSelectSearchSpanCell', + props: useJVxeCompProps(), + setup(props: JVxeComponent.Props) { + const { innerOptions, innerSelectValue, innerValue } = useSelectDictSearch(props); + return () => { + return h('span', {}, [filterDictText(innerOptions.value, innerSelectValue.value || innerValue.value)]); + }; + }, +}); + +// 输入选择组件 +export const DictSearchInputCell = defineComponent({ + name: 'JVxeSelectSearchInputCell', + props: useJVxeCompProps(), + setup(props: JVxeComponent.Props) { + const { createMessage } = useMessage(); + const { dict, loading, isAsync, options, innerOptions, originColumn, cellProps, innerSelectValue, handleChangeCommon } = + useSelectDictSearch(props); + const hasRequest = ref(false); + // 提示信息 + const tipsContent = computed(() => { + return originColumn.value.tipsContent || '请输入搜索内容'; + }); + // 筛选函数 + const filterOption = computed(() => { + if (isAsync.value) { + //【jeecgboot-vue3/issues/I5QRT8】JVxeTypes.selectDictSearch sync问题 + return ()=>true; + } + return (input, option) => option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0; + }); + + /** 加载数据 */ + const loadData = debounce((value) => { + const currentRequestId = ++requestId; + loading.value = true; + innerOptions.value = []; + if (value == null || value.trim() === '') { + loading.value = false; + hasRequest.value = false; + return; + } + // 字典code格式:table,text,code + hasRequest.value = true; + loadDictByKeyword(dict.value, value) + .then((res) => { + if (currentRequestId !== requestId) { + return; + } + let { success, result, message } = res; + if (success) { + innerOptions.value = result; + result.forEach((item) => { + LabelMap.set(item.value, [item]); + }); + } else { + createMessage.warning(message || '查询失败'); + } + }) + .finally(() => { + loading.value = false; + }); + }, 300); + + function handleChange(selectedValue) { + innerSelectValue.value = selectedValue; + handleChangeCommon(innerSelectValue.value); + } + + function handleSearch(value) { + if (isAsync.value) { + // 在输入时也应该开启加载,因为loadData加了消抖,所以会有800ms的用户主观上认为的卡顿时间 + loading.value = true; + if (innerOptions.value.length > 0) { + innerOptions.value = []; + } + loadData(value); + } + } + + function renderOptionItem() { + let optionItems: any[] = []; + options.value.forEach(({ value, text, label, title, disabled }) => { + optionItems.push( + h( + rc('a-select-option'), + { + key: value, + value: value, + disabled: disabled, + }, + { + default: () => text || label || title, + } + ) + ); + }); + return optionItems; + } + + return () => { + return h( + rc('a-select'), + { + ...cellProps.value, + value: innerSelectValue.value, + filterOption: filterOption.value, + showSearch: true, + allowClear: true, + autofocus: true, + defaultOpen: true, + style: 'width: 100%', + onSearch: handleSearch, + onChange: handleChange, + }, + { + default: () => renderOptionItem(), + notFoundContent: () => { + if (loading.value) { + return h(rc('a-spin'), { size: 'small' }); + } else if (hasRequest.value) { + return h('div', '没有查询到任何数据'); + } else { + return h('div', [tipsContent.value]); + } + }, + } + ); + }; + }, + // 【组件增强】注释详见:JVxeComponent.Enhanced + enhanced: { + aopEvents: { + editActived({ $event }) { + dispatchEvent({ + $event, + props: this.props, + className: '.ant-select .ant-select-selection-search-input', + isClick: false, + handler: (el) => el.focus(), + }); + }, + }, + } as JVxeComponent.EnhancedPartial, +}); + +function useSelectDictSearch(props) { + const setup = useJVxeComponent(props); + const { innerValue, originColumn } = setup; + + // 加载状态 + const loading = ref(false); + // 内部选择值 + const innerSelectValue = ref(null); + // 内部 options + const innerOptions = ref([]); + + const dict = computed(() => originColumn.value.dict); + // 是否是异步模式 + const isAsync = computed(() => { + let isAsync = originColumn.value.async; + return isAsync != null && isAsync !== '' ? !!isAsync : true; + }); + const options = computed(() => { + if (isAsync.value) { + return innerOptions.value; + } else { + return originColumn.value.options || []; + } + }); + + /** 公共属性监听 */ + watch( + innerValue, + (value: string) => { + if (value == null || value === '') { + innerSelectValue.value = null; + } else { + loadDataByValue(value); + } + }, + { immediate: true } + ); + watch(dict, () => loadDataByDict()); + + // 根据 value 查询数据,用于回显 + async function loadDataByValue(value) { + if (isAsync.value) { + if (innerSelectValue.value !== value) { + if (LabelMap.has(value)) { + innerOptions.value = cloneDeep(LabelMap.get(value)); + } else { + let result = await loadDictItem(dict.value, value); + if (result && result.length > 0) { + innerOptions.value = [{ value: value, text: result[0] }]; + LabelMap.set(value, cloneDeep(innerOptions.value)); + } + } + } + } + innerSelectValue.value = (value || '').toString(); + } + + // 初始化字典 + async function loadDataByDict() { + if (!isAsync.value) { + // 如果字典项集合有数据 + if (!originColumn.value.options || originColumn.value.options.length === 0) { + // 根据字典Code, 初始化字典数组 + let dictStr = ''; + if (dict.value) { + let arr = dict.value.split(','); + if (arr[0].indexOf('where') > 0) { + let tbInfo = arr[0].split('where'); + dictStr = tbInfo[0].trim() + ',' + arr[1] + ',' + arr[2] + ',' + encodeURIComponent(tbInfo[1]); + } else { + dictStr = dict.value; + } + if (dict.value.indexOf(',') === -1) { + //优先从缓存中读取字典配置 + let cache = getDictItemsByCode(dict.value); + if (cache) { + innerOptions.value = cache; + return; + } + } + let { success, result } = await ajaxGetDictItems(dictStr, null); + if (success) { + innerOptions.value = result; + } + } + } + } + } + + return { + ...setup, + loading, + innerOptions, + innerSelectValue, + dict, + isAsync, + options, + }; +} + +/** 获取字典项 */ +function loadDictItem(dict: string, key: string) { + return defHttp.get({ + url: `/sys/dict/loadDictItem/${dict}`, + params: { + key: key, + }, + }); +} + +/** 根据关键字获取字典项(搜索) */ +function loadDictByKeyword(dict: string, keyword: string) { + return defHttp.get( + { + url: `/sys/dict/loadDict/${dict}`, + params: { + keyword: keyword, + }, + }, + { + isTransformResponse: false, + } + ); +} diff --git a/src/components/JVxeCustom/src/components/JVxeUserSelectCell.vue b/src/components/JVxeCustom/src/components/JVxeUserSelectCell.vue new file mode 100644 index 0000000..773d023 --- /dev/null +++ b/src/components/JVxeCustom/src/components/JVxeUserSelectCell.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/components/JVxeCustom/src/hooks/useFileCell.ts b/src/components/JVxeCustom/src/hooks/useFileCell.ts new file mode 100644 index 0000000..216721a --- /dev/null +++ b/src/components/JVxeCustom/src/hooks/useFileCell.ts @@ -0,0 +1,93 @@ +import { computed } from 'vue'; +import { fileGetValue, fileSetValue, useJVxeUploadCell } from '/@/components/jeecg/JVxeTable/src/hooks/cells/useJVxeUploadCell'; +import { uploadUrl } from '/@/api/common/api'; +import { JUploadModal, UploadTypeEnum } from '/@/components/Form/src/jeecg/components/JUpload'; +import { useModal } from '/@/components/Modal'; +import { JVxeComponent } from '/@/components/jeecg/JVxeTable/src/types/JVxeComponent'; +import { Icon } from '/@/components/Icon'; +import { Dropdown } from 'ant-design-vue'; +import { LoadingOutlined } from '@ant-design/icons-vue'; + +export function useFileCell(props, fileType: UploadTypeEnum, options?) { + const setup = useJVxeUploadCell(props, { token: true, action: uploadUrl, ...options }); + + const { innerFile, handleChangeCommon, originColumn } = setup; + const [registerModel, { openModal }] = useModal(); + + // 截取文件名 + const ellipsisFileName = computed(() => { + let length = 5; + let file = innerFile.value; + if (!file || !file.name) { + return ''; + } + if (file.name.length > length) { + return file.name.substr(0, length) + '…'; + } + return file.name; + }); + + const modalValue = computed(() => { + if (innerFile.value) { + if (innerFile.value['url']) { + return innerFile.value['url']; + } else if (innerFile.value['path']) { + return innerFile.value['path']; + } + } + return ''; + }); + + const maxCount = computed(() => { + let maxCount = originColumn.value.maxCount; + // online 扩展JSON + if (originColumn.value && originColumn.value.fieldExtendJson) { + let json = JSON.parse(originColumn.value.fieldExtendJson); + maxCount = json.uploadnum ? json.uploadnum : 0; + } + return maxCount ?? 0; + }); + + // 点击更多按钮 + function handleMoreOperation() { + openModal(true, { + removeConfirm: true, + mover: true, + download: true, + ...originColumn.value.props, + maxCount: maxCount.value, + fileType: fileType, + }); + } + + // 更多上传回调 + function onModalChange(path) { + if (path) { + innerFile.value.path = path; + handleChangeCommon(innerFile.value); + } + } + + return { + ...setup, + modalValue, + maxCount, + ellipsisFileName, + registerModel, + onModalChange, + handleMoreOperation, + }; +} + +export const components = { + Icon, + Dropdown, + LoadingOutlined, + JUploadModal, +}; + +export const enhanced = { + switches: { visible: true }, + getValue: (value) => fileGetValue(value), + setValue: (value) => fileSetValue(value), +} as JVxeComponent.EnhancedPartial; diff --git a/src/components/Loading/index.ts b/src/components/Loading/index.ts new file mode 100644 index 0000000..3673a44 --- /dev/null +++ b/src/components/Loading/index.ts @@ -0,0 +1,5 @@ +import Loading from './src/Loading.vue'; + +export { Loading }; +export { useLoading } from './src/useLoading'; +export { createLoading } from './src/createLoading'; diff --git a/src/components/Loading/src/Loading.vue b/src/components/Loading/src/Loading.vue new file mode 100644 index 0000000..f626b18 --- /dev/null +++ b/src/components/Loading/src/Loading.vue @@ -0,0 +1,79 @@ + + + diff --git a/src/components/Loading/src/createLoading.ts b/src/components/Loading/src/createLoading.ts new file mode 100644 index 0000000..5efff7f --- /dev/null +++ b/src/components/Loading/src/createLoading.ts @@ -0,0 +1,65 @@ +import { VNode, defineComponent } from 'vue'; +import type { LoadingProps } from './typing'; + +import { createVNode, render, reactive, h } from 'vue'; +import Loading from './Loading.vue'; + +export function createLoading(props?: Partial, target?: HTMLElement, wait = false) { + let vm: Nullable = null; + const data = reactive({ + tip: '', + loading: true, + ...props, + }); + + const LoadingWrap = defineComponent({ + render() { + return h(Loading, { ...data }); + }, + }); + + vm = createVNode(LoadingWrap); + + if (wait) { + // TODO fix https://github.com/anncwb/vue-Jeecg-admin/issues/438 + setTimeout(() => { + render(vm, document.createElement('div')); + }, 0); + } else { + render(vm, document.createElement('div')); + } + + function close() { + if (vm?.el && vm.el.parentNode) { + vm.el.parentNode.removeChild(vm.el); + } + } + + function open(target: HTMLElement = document.body) { + if (!vm || !vm.el) { + return; + } + target.appendChild(vm.el as HTMLElement); + } + + if (target) { + open(target); + } + return { + vm, + close, + open, + setTip: (tip: string) => { + data.tip = tip; + }, + setLoading: (loading: boolean) => { + data.loading = loading; + }, + get loading() { + return data.loading; + }, + get $el() { + return vm?.el as HTMLElement; + }, + }; +} diff --git a/src/components/Loading/src/typing.ts b/src/components/Loading/src/typing.ts new file mode 100644 index 0000000..9af60e6 --- /dev/null +++ b/src/components/Loading/src/typing.ts @@ -0,0 +1,10 @@ +import { SizeEnum } from '/@/enums/sizeEnum'; + +export interface LoadingProps { + tip: string; + size: SizeEnum; + absolute: boolean; + loading: boolean; + background: string; + theme: 'dark' | 'light'; +} diff --git a/src/components/Loading/src/useLoading.ts b/src/components/Loading/src/useLoading.ts new file mode 100644 index 0000000..b5f1215 --- /dev/null +++ b/src/components/Loading/src/useLoading.ts @@ -0,0 +1,47 @@ +import { unref } from 'vue'; +import { createLoading } from './createLoading'; +import type { LoadingProps } from './typing'; +import type { Ref } from 'vue'; + +export interface UseLoadingOptions { + target?: any; + props?: Partial; +} + +interface Fn { + (): void; +} + +export function useLoading(props: Partial): [Fn, Fn, (string) => void]; +export function useLoading(opt: Partial): [Fn, Fn, (string) => void]; + +export function useLoading(opt: Partial | Partial): [Fn, Fn, (string) => void] { + let props: Partial; + let target: HTMLElement | Ref = document.body; + + if (Reflect.has(opt, 'target') || Reflect.has(opt, 'props')) { + const options = opt as Partial; + props = options.props || {}; + target = options.target || document.body; + } else { + props = opt as Partial; + } + + const instance = createLoading(props, undefined, true); + + const open = (): void => { + const t = unref(target as Ref); + if (!t) return; + instance.open(t); + }; + + const close = (): void => { + instance.close(); + }; + + const setTip = (tip: string) => { + instance.setTip(tip); + }; + + return [open, close, setTip]; +} diff --git a/src/components/Markdown/index.ts b/src/components/Markdown/index.ts new file mode 100644 index 0000000..d337681 --- /dev/null +++ b/src/components/Markdown/index.ts @@ -0,0 +1,7 @@ +import { withInstall } from '/@/utils'; +import markDown from './src/Markdown.vue'; +import markDownViewer from './src/MarkdownViewer.vue'; + +export const MarkDown = withInstall(markDown); +export const MarkdownViewer = withInstall(markDownViewer); +export * from './src/typing'; diff --git a/src/components/Markdown/src/Markdown.vue b/src/components/Markdown/src/Markdown.vue new file mode 100644 index 0000000..8d272ce --- /dev/null +++ b/src/components/Markdown/src/Markdown.vue @@ -0,0 +1,184 @@ + + diff --git a/src/components/Markdown/src/MarkdownViewer.vue b/src/components/Markdown/src/MarkdownViewer.vue new file mode 100644 index 0000000..b453451 --- /dev/null +++ b/src/components/Markdown/src/MarkdownViewer.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/src/components/Markdown/src/typing.ts b/src/components/Markdown/src/typing.ts new file mode 100644 index 0000000..b4bb465 --- /dev/null +++ b/src/components/Markdown/src/typing.ts @@ -0,0 +1,4 @@ +import Vditor from 'vditor'; +export interface MarkDownActionType { + getVditor: () => Vditor; +} diff --git a/src/components/Menu/index.ts b/src/components/Menu/index.ts new file mode 100644 index 0000000..4a59225 --- /dev/null +++ b/src/components/Menu/index.ts @@ -0,0 +1,3 @@ +import BasicMenu from './src/BasicMenu.vue'; + +export { BasicMenu }; diff --git a/src/components/Menu/src/BasicMenu.vue b/src/components/Menu/src/BasicMenu.vue new file mode 100644 index 0000000..a61fe97 --- /dev/null +++ b/src/components/Menu/src/BasicMenu.vue @@ -0,0 +1,159 @@ + + + diff --git a/src/components/Menu/src/components/BasicMenuItem.vue b/src/components/Menu/src/components/BasicMenuItem.vue new file mode 100644 index 0000000..fd54497 --- /dev/null +++ b/src/components/Menu/src/components/BasicMenuItem.vue @@ -0,0 +1,20 @@ + + diff --git a/src/components/Menu/src/components/BasicSubMenuItem.vue b/src/components/Menu/src/components/BasicSubMenuItem.vue new file mode 100644 index 0000000..5f92f96 --- /dev/null +++ b/src/components/Menu/src/components/BasicSubMenuItem.vue @@ -0,0 +1,53 @@ + + diff --git a/src/components/Menu/src/components/MenuItemContent.vue b/src/components/Menu/src/components/MenuItemContent.vue new file mode 100644 index 0000000..3044fbc --- /dev/null +++ b/src/components/Menu/src/components/MenuItemContent.vue @@ -0,0 +1,34 @@ + + diff --git a/src/components/Menu/src/index.less b/src/components/Menu/src/index.less new file mode 100644 index 0000000..8bfbb0d --- /dev/null +++ b/src/components/Menu/src/index.less @@ -0,0 +1,74 @@ +@basic-menu-prefix-cls: ~'@{namespace}-basic-menu'; + +.app-top-menu-popup { + min-width: 150px; +} + +.@{basic-menu-prefix-cls} { + width: 100%; + + .ant-menu-item { + transition: unset; + } + + &__sidebar-hor { + &.ant-menu-horizontal { + display: flex; + align-items: center; + + &.ant-menu-dark { + background-color: transparent; + + .ant-menu-submenu:hover, + .ant-menu-item-open, + .ant-menu-submenu-open, + .ant-menu-item-selected, + .ant-menu-submenu-selected, + .ant-menu-item:hover, + .ant-menu-item-active, + .ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open, + .ant-menu-submenu-active, + .ant-menu-submenu-title:hover { + color: #fff; + background-color: @top-menu-active-bg-color !important; + } + + .ant-menu-item:hover, + .ant-menu-item-active, + .ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open, + .ant-menu-submenu-active, + .ant-menu-submenu-title:hover { + background-color: @top-menu-active-bg-color; + } + + .@{basic-menu-prefix-cls}-item__level1 { + background-color: transparent; + + &.ant-menu-item-selected, + &.ant-menu-submenu-selected { + background-color: @top-menu-active-bg-color !important; + } + } + + .ant-menu-item, + .ant-menu-submenu { + &.@{basic-menu-prefix-cls}-item__level1, + .ant-menu-submenu-title { + height: @header-height; + line-height: @header-height; + } + } + } + } + } + + .ant-menu-submenu, + .ant-menu-submenu-inline { + transition: unset; + } + + .ant-menu-inline.ant-menu-sub { + box-shadow: unset !important; + transition: unset; + } +} diff --git a/src/components/Menu/src/props.ts b/src/components/Menu/src/props.ts new file mode 100644 index 0000000..ed3f010 --- /dev/null +++ b/src/components/Menu/src/props.ts @@ -0,0 +1,60 @@ +import type { Menu } from '/@/router/types'; +import type { PropType } from 'vue'; + +import { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum'; +import { ThemeEnum } from '/@/enums/appEnum'; +import { propTypes } from '/@/utils/propTypes'; +import type { MenuTheme } from 'ant-design-vue'; +import type { MenuMode } from 'ant-design-vue/lib/menu/src/interface'; +export const basicProps = { + items: { + type: Array as PropType, + default: () => [], + }, + collapsedShowTitle: propTypes.bool, + // 最好是4 倍数 + inlineIndent: propTypes.number.def(20), + // 菜单组件的mode属性 + mode: { + type: String as PropType, + default: MenuModeEnum.INLINE, + }, + + type: { + type: String as PropType, + default: MenuTypeEnum.MIX, + }, + theme: { + type: String as PropType, + default: ThemeEnum.DARK, + }, + inlineCollapsed: propTypes.bool, + mixSider: propTypes.bool, + + isHorizontal: propTypes.bool, + accordion: propTypes.bool.def(true), + beforeClickFn: { + type: Function as PropType<(key: string) => Promise>, + }, +}; + +export const itemProps = { + item: { + type: Object as PropType, + default: {}, + }, + level: propTypes.number, + theme: propTypes.oneOf(['dark', 'light']), + showTitle: propTypes.bool, + isHorizontal: propTypes.bool, +}; + +export const contentProps = { + item: { + type: Object as PropType, + default: null, + }, + showTitle: propTypes.bool.def(true), + level: propTypes.number.def(0), + isHorizontal: propTypes.bool.def(true), +}; diff --git a/src/components/Menu/src/types.ts b/src/components/Menu/src/types.ts new file mode 100644 index 0000000..ad711c2 --- /dev/null +++ b/src/components/Menu/src/types.ts @@ -0,0 +1,25 @@ +// import { ComputedRef } from 'vue'; +// import { ThemeEnum } from '/@/enums/appEnum'; +// import { MenuModeEnum } from '/@/enums/menuEnum'; +export interface MenuState { + // 默认选中的列表 + defaultSelectedKeys: string[]; + + // 模式 + // mode: MenuModeEnum; + + // // 主题 + // theme: ComputedRef | ThemeEnum; + + // 缩进 + inlineIndent?: number; + + // 展开数组 + openKeys: string[]; + + // 当前选中的菜单项 key 数组 + selectedKeys: string[]; + + // 收缩状态下展开的数组 + collapsedOpenKeys: string[]; +} diff --git a/src/components/Menu/src/useOpenKeys.ts b/src/components/Menu/src/useOpenKeys.ts new file mode 100644 index 0000000..3e35eac --- /dev/null +++ b/src/components/Menu/src/useOpenKeys.ts @@ -0,0 +1,78 @@ +import { MenuModeEnum } from '/@/enums/menuEnum'; +import type { Menu as MenuType } from '/@/router/types'; +import type { MenuState } from './types'; + +import { computed, Ref, toRaw } from 'vue'; + +import { unref } from 'vue'; +import { uniq } from 'lodash-es'; +import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; +import { getAllParentPath } from '/@/router/helper/menuHelper'; +import { useTimeoutFn } from '/@/hooks/core/useTimeout'; + +export function useOpenKeys(menuState: MenuState, menus: Ref, mode: Ref, accordion: Ref) { + const { getCollapsed, getIsMixSidebar } = useMenuSetting(); + + async function setOpenKeys(path: string) { + if (mode.value === MenuModeEnum.HORIZONTAL) { + return; + } + const native = unref(getIsMixSidebar); + useTimeoutFn( + () => { + const menuList = toRaw(menus.value); + if (menuList?.length === 0) { + menuState.openKeys = []; + return; + } + if (!unref(accordion)) { + menuState.openKeys = uniq([...menuState.openKeys, ...getAllParentPath(menuList, path)]); + } else { + menuState.openKeys = getAllParentPath(menuList, path); + } + }, + 16, + !native + ); + } + + const getOpenKeys = computed(() => { + const collapse = unref(getIsMixSidebar) ? false : unref(getCollapsed); + + return collapse ? menuState.collapsedOpenKeys : menuState.openKeys; + }); + + /** + * @description: 重置值 + */ + function resetKeys() { + menuState.selectedKeys = []; + menuState.openKeys = []; + } + + function handleOpenChange(openKeys: string[]) { + if (unref(mode) === MenuModeEnum.HORIZONTAL || !unref(accordion) || unref(getIsMixSidebar)) { + menuState.openKeys = openKeys; + } else { + // const menuList = toRaw(menus.value); + // getAllParentPath(menuList, path); + const rootSubMenuKeys: string[] = []; + for (const { children, path } of unref(menus)) { + if (children && children.length > 0) { + rootSubMenuKeys.push(path); + } + } + if (!unref(getCollapsed)) { + const latestOpenKey = openKeys.find((key) => menuState.openKeys.indexOf(key) === -1); + if (rootSubMenuKeys.indexOf(latestOpenKey as string) === -1) { + menuState.openKeys = openKeys; + } else { + menuState.openKeys = latestOpenKey ? [latestOpenKey] : []; + } + } else { + menuState.collapsedOpenKeys = openKeys; + } + } + } + return { setOpenKeys, resetKeys, getOpenKeys, handleOpenChange }; +} diff --git a/src/components/Modal/index.ts b/src/components/Modal/index.ts new file mode 100644 index 0000000..6188c5c --- /dev/null +++ b/src/components/Modal/index.ts @@ -0,0 +1,8 @@ +import { withInstall } from '/@/utils'; +import './src/index.less'; +import basicModal from './src/BasicModal.vue'; + +export const BasicModal = withInstall(basicModal); +export { useModalContext } from './src/hooks/useModalContext'; +export { useModal, useModalInner } from './src/hooks/useModal'; +export * from './src/typing'; diff --git a/src/components/Modal/src/BasicModal.vue b/src/components/Modal/src/BasicModal.vue new file mode 100644 index 0000000..157ed9f --- /dev/null +++ b/src/components/Modal/src/BasicModal.vue @@ -0,0 +1,279 @@ + + + diff --git a/src/components/Modal/src/components/Modal.tsx b/src/components/Modal/src/components/Modal.tsx new file mode 100644 index 0000000..684e3bf --- /dev/null +++ b/src/components/Modal/src/components/Modal.tsx @@ -0,0 +1,30 @@ +import { Modal } from 'ant-design-vue'; +import { defineComponent, toRefs, unref } from 'vue'; +import { basicProps } from '../props'; +import { useModalDragMove } from '../hooks/useModalDrag'; +import { useAttrs } from '/@/hooks/core/useAttrs'; +import { extendSlots } from '/@/utils/helper/tsxHelper'; + +export default defineComponent({ + name: 'Modal', + inheritAttrs: false, + props: basicProps, + emits: ['cancel'], + setup(props, { slots, emit }) { + const { visible, draggable, destroyOnClose } = toRefs(props); + const attrs = useAttrs(); + useModalDragMove({ + visible, + destroyOnClose, + draggable, + }); + const onCancel = (e: Event) => { + emit('cancel', e); + }; + + return () => { + const propsData = { ...unref(attrs), ...props, onCancel } as Recordable; + return {extendSlots(slots)}; + }; + }, +}); diff --git a/src/components/Modal/src/components/ModalClose.vue b/src/components/Modal/src/components/ModalClose.vue new file mode 100644 index 0000000..72fe1c9 --- /dev/null +++ b/src/components/Modal/src/components/ModalClose.vue @@ -0,0 +1,159 @@ + + + diff --git a/src/components/Modal/src/components/ModalFooter.vue b/src/components/Modal/src/components/ModalFooter.vue new file mode 100644 index 0000000..7bc5786 --- /dev/null +++ b/src/components/Modal/src/components/ModalFooter.vue @@ -0,0 +1,34 @@ + + diff --git a/src/components/Modal/src/components/ModalHeader.vue b/src/components/Modal/src/components/ModalHeader.vue new file mode 100644 index 0000000..bf6c112 --- /dev/null +++ b/src/components/Modal/src/components/ModalHeader.vue @@ -0,0 +1,22 @@ + + diff --git a/src/components/Modal/src/components/ModalWrapper.vue b/src/components/Modal/src/components/ModalWrapper.vue new file mode 100644 index 0000000..3b5aa45 --- /dev/null +++ b/src/components/Modal/src/components/ModalWrapper.vue @@ -0,0 +1,149 @@ + + diff --git a/src/components/Modal/src/hooks/useModal.ts b/src/components/Modal/src/hooks/useModal.ts new file mode 100644 index 0000000..1c88323 --- /dev/null +++ b/src/components/Modal/src/hooks/useModal.ts @@ -0,0 +1,148 @@ +import type { UseModalReturnType, ModalMethods, ModalProps, ReturnMethods, UseModalInnerReturnType } from '../typing'; +import { ref, onUnmounted, unref, getCurrentInstance, reactive, watchEffect, nextTick, toRaw } from 'vue'; +import { isProdMode } from '/@/utils/env'; +import { isFunction } from '/@/utils/is'; +import { isEqual } from 'lodash-es'; +import { tryOnUnmounted } from '@vueuse/core'; +import { error } from '/@/utils/log'; +import { computed } from 'vue'; + +const dataTransfer = reactive({}); + +const visibleData = reactive<{ [key: number]: boolean }>({}); + +/** + * @description: Applicable to independent modal and call outside + */ +export function useModal(): UseModalReturnType { + const modal = ref>(null); + const loaded = ref>(false); + const uid = ref(''); + + function register(modalMethod: ModalMethods, uuid: string) { + if (!getCurrentInstance()) { + throw new Error('useModal() can only be used inside setup() or functional components!'); + } + uid.value = uuid; + isProdMode() && + onUnmounted(() => { + modal.value = null; + loaded.value = false; + dataTransfer[unref(uid)] = null; + }); + if (unref(loaded) && isProdMode() && modalMethod === unref(modal)) return; + + modal.value = modalMethod; + loaded.value = true; + modalMethod.emitVisible = (visible: boolean, uid: number) => { + visibleData[uid] = visible; + }; + } + + const getInstance = () => { + const instance = unref(modal); + if (!instance) { + error('useModal instance is undefined!'); + } + return instance; + }; + + const methods: ReturnMethods = { + setModalProps: (props: Partial): void => { + getInstance()?.setModalProps(props); + }, + + getVisible: computed((): boolean => { + return visibleData[~~unref(uid)]; + }), + + redoModalHeight: () => { + getInstance()?.redoModalHeight?.(); + }, + + openModal: (visible = true, data?: T, openOnSet = true): void => { + getInstance()?.setModalProps({ + visible: visible, + }); + + if (!data) return; + const id = unref(uid); + if (openOnSet) { + dataTransfer[id] = null; + dataTransfer[id] = toRaw(data); + return; + } + const equal = isEqual(toRaw(dataTransfer[id]), toRaw(data)); + if (!equal) { + dataTransfer[id] = toRaw(data); + } + }, + + closeModal: () => { + getInstance()?.setModalProps({ visible: false }); + }, + }; + return [register, methods]; +} + +export const useModalInner = (callbackFn?: Fn): UseModalInnerReturnType => { + const modalInstanceRef = ref>(null); + const currentInstance = getCurrentInstance(); + const uidRef = ref(''); + + const getInstance = () => { + const instance = unref(modalInstanceRef); + if (!instance) { + error('useModalInner instance is undefined!'); + } + return instance; + }; + + const register = (modalInstance: ModalMethods, uuid: string) => { + isProdMode() && + tryOnUnmounted(() => { + modalInstanceRef.value = null; + }); + uidRef.value = uuid; + modalInstanceRef.value = modalInstance; + currentInstance?.emit('register', modalInstance, uuid); + }; + + watchEffect(() => { + const data = dataTransfer[unref(uidRef)]; + if (!data) return; + if (!callbackFn || !isFunction(callbackFn)) return; + nextTick(() => { + callbackFn(data); + }); + }); + + return [ + register, + { + changeLoading: (loading = true) => { + getInstance()?.setModalProps({ loading }); + }, + getVisible: computed((): boolean => { + return visibleData[~~unref(uidRef)]; + }), + + changeOkLoading: (loading = true) => { + getInstance()?.setModalProps({ confirmLoading: loading }); + }, + + closeModal: () => { + getInstance()?.setModalProps({ visible: false }); + }, + + setModalProps: (props: Partial) => { + getInstance()?.setModalProps(props); + }, + + redoModalHeight: () => { + const callRedo = getInstance()?.redoModalHeight; + callRedo && callRedo(); + }, + }, + ]; +}; diff --git a/src/components/Modal/src/hooks/useModalContext.ts b/src/components/Modal/src/hooks/useModalContext.ts new file mode 100644 index 0000000..94d4c4e --- /dev/null +++ b/src/components/Modal/src/hooks/useModalContext.ts @@ -0,0 +1,16 @@ +import { InjectionKey } from 'vue'; +import { createContext, useContext } from '/@/hooks/core/useContext'; + +export interface ModalContextProps { + redoModalHeight: () => void; +} + +const key: InjectionKey = Symbol(); + +export function createModalContext(context: ModalContextProps) { + return createContext(context, key); +} + +export function useModalContext() { + return useContext(key); +} diff --git a/src/components/Modal/src/hooks/useModalDrag.ts b/src/components/Modal/src/hooks/useModalDrag.ts new file mode 100644 index 0000000..220bfc4 --- /dev/null +++ b/src/components/Modal/src/hooks/useModalDrag.ts @@ -0,0 +1,112 @@ +import { Ref, unref, watchEffect } from 'vue'; +import { useTimeoutFn } from '/@/hooks/core/useTimeout'; + +export interface UseModalDragMoveContext { + draggable: Ref; + destroyOnClose: Ref | undefined; + visible: Ref; +} + +export function useModalDragMove(context: UseModalDragMoveContext) { + const getStyle = (dom: any, attr: any) => { + return getComputedStyle(dom)[attr]; + }; + const drag = (wrap: any) => { + if (!wrap) return; + wrap.setAttribute('data-drag', unref(context.draggable)); + const dialogHeaderEl = wrap.querySelector('.ant-modal-header'); + const dragDom = wrap.querySelector('.ant-modal'); + + if (!dialogHeaderEl || !dragDom || !unref(context.draggable)) return; + + dialogHeaderEl.style.cursor = 'move'; + + dialogHeaderEl.onmousedown = (e: any) => { + if (!e) return; + // 鼠标按下,计算当前元素距离可视区的距离 + const disX = e.clientX; + const disY = e.clientY; + const screenWidth = document.body.clientWidth; // body当前宽度 + const screenHeight = document.documentElement.clientHeight; // 可见区域高度(应为body高度,可某些环境下无法获取) + + const dragDomWidth = dragDom.offsetWidth; // 对话框宽度 + const dragDomheight = dragDom.offsetHeight; // 对话框高度 + + const minDragDomLeft = dragDom.offsetLeft; + + const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth; + const minDragDomTop = dragDom.offsetTop; + let maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight; + //update-begin-author:liusq---date:20230407--for: [issue/430]弹出页面出现自动吸顶,无法移动和显示头部--- + if(maxDragDomTop<0){ + maxDragDomTop = screenHeight - dragDom.offsetTop + } + //update-end-author:liusq---date:20230407--for: [issue/430]弹出页面出现自动吸顶,无法移动和显示头部--- + // 获取到的值带px 正则匹配替换 + const domLeft = getStyle(dragDom, 'left'); + const domTop = getStyle(dragDom, 'top'); + let styL = +domLeft; + let styT = +domTop; + + // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px + if (domLeft.includes('%')) { + styL = +document.body.clientWidth * (+domLeft.replace(/%/g, '') / 100); + styT = +document.body.clientHeight * (+domTop.replace(/%/g, '') / 100); + } else { + styL = +domLeft.replace(/px/g, ''); + styT = +domTop.replace(/px/g, ''); + } + + document.onmousemove = function (e) { + // 通过事件委托,计算移动的距离 + let left = e.clientX - disX; + let top = e.clientY - disY; + + // 边界处理 + if (-left > minDragDomLeft) { + left = -minDragDomLeft; + } else if (left > maxDragDomLeft) { + left = maxDragDomLeft; + } + + if (-top > minDragDomTop) { + top = -minDragDomTop; + } else if (top > maxDragDomTop) { + top = maxDragDomTop; + } + + // 移动当前元素 + dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`; + }; + + document.onmouseup = () => { + document.onmousemove = null; + document.onmouseup = null; + }; + }; + }; + + const handleDrag = () => { + const dragWraps = document.querySelectorAll('.ant-modal-wrap'); + for (const wrap of Array.from(dragWraps)) { + if (!wrap) continue; + const display = getStyle(wrap, 'display'); + const draggable = wrap.getAttribute('data-drag'); + if (display !== 'none') { + // 拖拽位置 + if (draggable === null || unref(context.destroyOnClose)) { + drag(wrap); + } + } + } + }; + + watchEffect(() => { + if (!unref(context.visible) || !unref(context.draggable)) { + return; + } + useTimeoutFn(() => { + handleDrag(); + }, 30); + }); +} diff --git a/src/components/Modal/src/hooks/useModalFullScreen.ts b/src/components/Modal/src/hooks/useModalFullScreen.ts new file mode 100644 index 0000000..b53563a --- /dev/null +++ b/src/components/Modal/src/hooks/useModalFullScreen.ts @@ -0,0 +1,43 @@ +import { computed, Ref, ref, unref } from 'vue'; + +export interface UseFullScreenContext { + wrapClassName: Ref; + modalWrapperRef: Ref; + extHeightRef: Ref; +} + +export function useFullScreen(context: UseFullScreenContext) { + // const formerHeightRef = ref(0); + const fullScreenRef = ref(false); + + const getWrapClassName = computed(() => { + const clsName = unref(context.wrapClassName) || ''; + return unref(fullScreenRef) ? `fullscreen-modal ${clsName} ` : unref(clsName); + }); + + function handleFullScreen(e: Event) { + e && e.stopPropagation(); + fullScreenRef.value = !unref(fullScreenRef); + + // const modalWrapper = unref(context.modalWrapperRef); + + // if (!modalWrapper) return; + + // const wrapperEl = modalWrapper.$el as HTMLElement; + // if (!wrapperEl) return; + // const modalWrapSpinEl = wrapperEl.querySelector('.ant-spin-nested-loading') as HTMLElement; + + // if (!modalWrapSpinEl) return; + + // if (!unref(formerHeightRef) && unref(fullScreenRef)) { + // formerHeightRef.value = modalWrapSpinEl.offsetHeight; + // } + + // if (unref(fullScreenRef)) { + // modalWrapSpinEl.style.height = `${window.innerHeight - unref(context.extHeightRef)}px`; + // } else { + // modalWrapSpinEl.style.height = `${unref(formerHeightRef)}px`; + // } + } + return { getWrapClassName, handleFullScreen, fullScreenRef }; +} diff --git a/src/components/Modal/src/index.less b/src/components/Modal/src/index.less new file mode 100644 index 0000000..58ee1e4 --- /dev/null +++ b/src/components/Modal/src/index.less @@ -0,0 +1,136 @@ +.fullscreen-modal { + overflow: hidden; + + .ant-modal { + top: 0 !important; + right: 0 !important; + bottom: 0 !important; + left: 0 !important; + width: 100% !important; + height: 100% !important; + max-width: 100% !important; + max-height: 100% !important; + + &-content { + height: 100%; + } + + .ant-modal-header, + .@{namespace}-basic-title { + cursor: default !important; + } + } +} + +.ant-modal { + width: 520px; + padding-bottom: 0; + + .ant-modal-body > .scrollbar { + padding: 14px; + } + + &-title { + font-size: 16px; + font-weight: bold; + line-height: 16px; + + .base-title { + cursor: move !important; + } + } + + .ant-modal-body { + padding: 0; + + > .scrollbar > .scrollbar__bar.is-horizontal { + display: none; + } + } + + &-large { + top: 60px; + + &--mini { + top: 16px; + } + } + + &-header { + padding: 16px; + } + + &-content { + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); + } + + &-footer { + button + button { + margin-left: 10px; + } + } + + &-close { + font-weight: normal; + outline: none; + } + + &-close-x { + display: inline-block; + width: 96px; +/* width: auto;*/ + height: 56px; + line-height: 56px; + } + + &-confirm-body { + .ant-modal-confirm-content { + // color: #fff; + + > * { + color: @text-color-help-dark; + } + } + } + + &-confirm-confirm.error .ant-modal-confirm-body > .anticon { + color: @error-color; + } + + &-confirm-btns { + .ant-btn:last-child { + margin-right: 0; + } + } + + &-confirm-info { + .ant-modal-confirm-body > .anticon { + color: @warning-color; + } + } + + &-confirm-confirm.success { + .ant-modal-confirm-body > .anticon { + color: @success-color; + } + } +} + +.ant-modal-confirm .ant-modal-body { + padding: 24px !important; +} +@media screen and (max-height: 600px) { + .ant-modal { + top: 60px; + } +} +@media screen and (max-height: 540px) { + .ant-modal { + top: 30px; + } +} +@media screen and (max-height: 480px) { + .ant-modal { + top: 10px; + } +} diff --git a/src/components/Modal/src/props.ts b/src/components/Modal/src/props.ts new file mode 100644 index 0000000..cb8a3c3 --- /dev/null +++ b/src/components/Modal/src/props.ts @@ -0,0 +1,86 @@ +import type { PropType, CSSProperties } from 'vue'; +import type { ModalWrapperProps } from './typing'; +import { ButtonProps } from 'ant-design-vue/es/button/buttonTypes'; +import { useI18n } from '/@/hooks/web/useI18n'; + +const { t } = useI18n(); + +export const modalProps = { + visible: { type: Boolean }, + scrollTop: { type: Boolean, default: true }, + height: { type: Number }, + minHeight: { type: Number }, + // open drag + draggable: { type: Boolean, default: true }, + centered: { type: Boolean }, + cancelText: { type: String, default: t('common.cancelText') }, + okText: { type: String, default: t('common.okText') }, + + closeFunc: Function as PropType<() => Promise>, +}; + +export const basicProps = Object.assign({}, modalProps, { + defaultFullscreen: { type: Boolean }, + // Can it be full screen + canFullscreen: { type: Boolean, default: true }, + // After enabling the wrapper, the bottom can be increased in height + wrapperFooterOffset: { type: Number, default: 0 }, + // Warm reminder message + helpMessage: [String, Array] as PropType, + // Whether to setting wrapper + useWrapper: { type: Boolean, default: true }, + loading: { type: Boolean }, + loadingTip: { type: String }, + /** + * @description: Show close button + */ + showCancelBtn: { type: Boolean, default: true }, + /** + * @description: Show confirmation button + */ + showOkBtn: { type: Boolean, default: true }, + + wrapperProps: Object as PropType>, + + afterClose: Function as PropType<() => Promise>, + + bodyStyle: Object as PropType, + + closable: { type: Boolean, default: true }, + + closeIcon: Object as PropType, + + confirmLoading: { type: Boolean }, + + destroyOnClose: { type: Boolean }, + + footer: Object as PropType, + + getContainer: Function as PropType<() => any>, + + mask: { type: Boolean, default: true }, + + maskClosable: { type: Boolean, default: true }, + keyboard: { type: Boolean, default: true }, + + maskStyle: Object as PropType, + + okType: { type: String, default: 'primary' }, + + okButtonProps: Object as PropType, + + cancelButtonProps: Object as PropType, + + title: { type: String }, + + visible: { type: Boolean }, + + width: [String, Number] as PropType, + + wrapClassName: { type: String }, + + zIndex: { type: Number }, + + // 是否开启评论区域 + enableComment: { type: Boolean, default: false }, +}); diff --git a/src/components/Modal/src/typing.ts b/src/components/Modal/src/typing.ts new file mode 100644 index 0000000..7bd9497 --- /dev/null +++ b/src/components/Modal/src/typing.ts @@ -0,0 +1,211 @@ +import type { ButtonProps } from 'ant-design-vue/lib/button/buttonTypes'; +import type { CSSProperties, VNodeChild, ComputedRef } from 'vue'; +/** + * @description: 弹窗对外暴露的方法 + */ +export interface ModalMethods { + setModalProps: (props: Partial) => void; + emitVisible?: (visible: boolean, uid: number) => void; + redoModalHeight?: () => void; +} + +export type RegisterFn = (modalMethods: ModalMethods, uuid?: string) => void; + +export interface ReturnMethods extends ModalMethods { + openModal: (props?: boolean, data?: T, openOnSet?: boolean) => void; + closeModal: () => void; + getVisible?: ComputedRef; +} + +export type UseModalReturnType = [RegisterFn, ReturnMethods]; + +export interface ReturnInnerMethods extends ModalMethods { + closeModal: () => void; + changeLoading: (loading: boolean) => void; + changeOkLoading: (loading: boolean) => void; + getVisible?: ComputedRef; + redoModalHeight: () => void; +} + +export type UseModalInnerReturnType = [RegisterFn, ReturnInnerMethods]; + +export interface ModalProps { + minHeight?: number; + height?: number; + // 启用wrapper后 底部可以适当增加高度 + wrapperFooterOffset?: number; + draggable?: boolean; + scrollTop?: boolean; + + // 是否可以进行全屏 + canFullscreen?: boolean; + defaultFullscreen?: boolean; + visible?: boolean; + // 温馨提醒信息 + helpMessage: string | string[]; + + // 是否使用modalWrapper + useWrapper: boolean; + + loading: boolean; + loadingTip?: string; + + wrapperProps: Omit; + + showOkBtn: boolean; + showCancelBtn: boolean; + closeFunc: () => Promise; + + /** + * Specify a function that will be called when modal is closed completely. + * @type Function + */ + afterClose?: () => any; + + /** + * Body style for modal body element. Such as height, padding etc. + * @default {} + * @type object + */ + bodyStyle?: CSSProperties; + + /** + * Text of the Cancel button + * @default 'cancel' + * @type string + */ + cancelText?: string; + + /** + * Centered Modal + * @default false + * @type boolean + */ + centered?: boolean; + + /** + * Whether a close (x) button is visible on top right of the modal dialog or not + * @default true + * @type boolean + */ + closable?: boolean; + /** + * Whether a close (x) button is visible on top right of the modal dialog or not + */ + closeIcon?: VNodeChild | JSX.Element; + + /** + * Whether to apply loading visual effect for OK button or not + * @default false + * @type boolean + */ + confirmLoading?: boolean; + + /** + * Whether to unmount child components on onClose + * @default false + * @type boolean + */ + destroyOnClose?: boolean; + + /** + * Footer content, set as :footer="null" when you don't need default buttons + * @default OK and Cancel buttons + * @type any (string | slot) + */ + footer?: VNodeChild | JSX.Element; + + /** + * Return the mount node for Modal + * @default () => document.body + * @type Function + */ + getContainer?: (instance: any) => HTMLElement; + + /** + * Whether show mask or not. + * @default true + * @type boolean + */ + mask?: boolean; + + /** + * Whether to close the modal dialog when the mask (area outside the modal) is clicked + * @default true + * @type boolean + */ + maskClosable?: boolean; + + /** + * Style for modal's mask element. + * @default {} + * @type object + */ + maskStyle?: CSSProperties; + + /** + * Text of the OK button + * @default 'OK' + * @type string + */ + okText?: string; + + /** + * Button type of the OK button + * @default 'primary' + * @type string + */ + okType?: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default'; + + /** + * The ok button props, follow jsx rules + * @type object + */ + okButtonProps?: ButtonProps; + + /** + * The cancel button props, follow jsx rules + * @type object + */ + cancelButtonProps?: ButtonProps; + + /** + * The modal dialog's title + * @type any (string | slot) + */ + title?: VNodeChild | JSX.Element; + + /** + * Width of the modal dialog + * @default 520 + * @type string | number + */ + width?: string | number; + + /** + * The class name of the container of the modal dialog + * @type string + */ + wrapClassName?: string; + + /** + * The z-index of the Modal + * @default 1000 + * @type number + */ + zIndex?: number; + + enableComment?: boolean; +} + +export interface ModalWrapperProps { + footerOffset?: number; + loading: boolean; + modalHeaderHeight: number; + modalFooterHeight: number; + minHeight: number; + height: number; + visible: boolean; + fullScreen: boolean; + useWrapper: boolean; +} diff --git a/src/components/Page/index.ts b/src/components/Page/index.ts new file mode 100644 index 0000000..d096264 --- /dev/null +++ b/src/components/Page/index.ts @@ -0,0 +1,7 @@ +import { withInstall } from '/@/utils'; + +import pageFooter from './src/PageFooter.vue'; +import pageWrapper from './src/PageWrapper.vue'; + +export const PageFooter = withInstall(pageFooter); +export const PageWrapper = withInstall(pageWrapper); diff --git a/src/components/Page/injectionKey.ts b/src/components/Page/injectionKey.ts new file mode 100644 index 0000000..9cc4278 --- /dev/null +++ b/src/components/Page/injectionKey.ts @@ -0,0 +1 @@ +export const PageWrapperFixedHeightKey = 'PageWrapperFixedHeight'; diff --git a/src/components/Page/src/PageFooter.vue b/src/components/Page/src/PageFooter.vue new file mode 100644 index 0000000..5440d2a --- /dev/null +++ b/src/components/Page/src/PageFooter.vue @@ -0,0 +1,49 @@ + + + diff --git a/src/components/Page/src/PageWrapper.vue b/src/components/Page/src/PageWrapper.vue new file mode 100644 index 0000000..a9a5536 --- /dev/null +++ b/src/components/Page/src/PageWrapper.vue @@ -0,0 +1,186 @@ + + + diff --git a/src/components/Preview/index.ts b/src/components/Preview/index.ts new file mode 100644 index 0000000..c0b4685 --- /dev/null +++ b/src/components/Preview/index.ts @@ -0,0 +1,2 @@ +export { default as ImagePreview } from './src/Preview.vue'; +export { createImgPreview } from './src/functional'; diff --git a/src/components/Preview/src/Functional.vue b/src/components/Preview/src/Functional.vue new file mode 100644 index 0000000..7de37ec --- /dev/null +++ b/src/components/Preview/src/Functional.vue @@ -0,0 +1,528 @@ + + diff --git a/src/components/Preview/src/Preview.vue b/src/components/Preview/src/Preview.vue new file mode 100644 index 0000000..3bb0b14 --- /dev/null +++ b/src/components/Preview/src/Preview.vue @@ -0,0 +1,94 @@ + + + diff --git a/src/components/Preview/src/functional.ts b/src/components/Preview/src/functional.ts new file mode 100644 index 0000000..e4b27d6 --- /dev/null +++ b/src/components/Preview/src/functional.ts @@ -0,0 +1,18 @@ +import type { Options, Props } from './typing'; +import ImgPreview from './Functional.vue'; +import { isClient } from '/@/utils/is'; +import { createVNode, render } from 'vue'; + +let instance: ReturnType | null = null; + +export function createImgPreview(options: Options) { + if (!isClient) return; + const propsData: Partial = {}; + const container = document.createElement('div'); + Object.assign(propsData, { show: true, index: 0, scaleStep: 100 }, options); + + instance = createVNode(ImgPreview, propsData); + render(instance, container); + document.body.appendChild(container); + return instance.component?.exposed; +} diff --git a/src/components/Preview/src/typing.ts b/src/components/Preview/src/typing.ts new file mode 100644 index 0000000..bbb8a83 --- /dev/null +++ b/src/components/Preview/src/typing.ts @@ -0,0 +1,49 @@ +export interface Options { + show?: boolean; + imageList: string[]; + index?: number; + scaleStep?: number; + defaultWidth?: number; + maskClosable?: boolean; + rememberState?: boolean; + onImgLoad?: ({ index: number, url: string, dom: HTMLImageElement }) => void; + onImgError?: ({ index: number, url: string, dom: HTMLImageElement }) => void; +} + +export interface Props { + show: boolean; + instance: Props; + imageList: string[]; + index: number; + scaleStep: number; + defaultWidth: number; + maskClosable: boolean; + rememberState: boolean; +} + +export interface PreviewActions { + resume: () => void; + close: () => void; + prev: () => void; + next: () => void; + setScale: (scale: number) => void; + setRotate: (rotate: number) => void; +} + +export interface ImageProps { + alt?: string; + fallback?: string; + src: string; + width: string | number; + height?: string | number; + placeholder?: string | boolean; + preview?: + | boolean + | { + visible?: boolean; + onVisibleChange?: (visible: boolean, prevVisible: boolean) => void; + getContainer: string | HTMLElement | (() => HTMLElement); + }; +} + +export type ImageItem = string | ImageProps; diff --git a/src/components/Qrcode/index.ts b/src/components/Qrcode/index.ts new file mode 100644 index 0000000..16a2f40 --- /dev/null +++ b/src/components/Qrcode/index.ts @@ -0,0 +1,5 @@ +import { withInstall } from '/@/utils'; +import qrCode from './src/Qrcode.vue'; + +export const QrCode = withInstall(qrCode); +export * from './src/typing'; diff --git a/src/components/Qrcode/src/Qrcode.vue b/src/components/Qrcode/src/Qrcode.vue new file mode 100644 index 0000000..a8df59f --- /dev/null +++ b/src/components/Qrcode/src/Qrcode.vue @@ -0,0 +1,112 @@ + + diff --git a/src/components/Qrcode/src/drawCanvas.ts b/src/components/Qrcode/src/drawCanvas.ts new file mode 100644 index 0000000..82aee5f --- /dev/null +++ b/src/components/Qrcode/src/drawCanvas.ts @@ -0,0 +1,32 @@ +import { toCanvas } from 'qrcode'; +import type { QRCodeRenderersOptions } from 'qrcode'; +import { RenderQrCodeParams, ContentType } from './typing'; +import { cloneDeep } from 'lodash-es'; + +export const renderQrCode = ({ canvas, content, width = 0, options: params = {} }: RenderQrCodeParams) => { + const options = cloneDeep(params); + // 容错率,默认对内容少的二维码采用高容错率,内容多的二维码采用低容错率 + options.errorCorrectionLevel = options.errorCorrectionLevel || getErrorCorrectionLevel(content); + + return getOriginWidth(content, options).then((_width: number) => { + options.scale = width === 0 ? undefined : (width / _width) * 4; + return toCanvas(canvas, content, options); + }); +}; + +// 得到原QrCode的大小,以便缩放得到正确的QrCode大小 +function getOriginWidth(content: ContentType, options: QRCodeRenderersOptions) { + const _canvas = document.createElement('canvas'); + return toCanvas(_canvas, content, options).then(() => _canvas.width); +} + +// 对于内容少的QrCode,增大容错率 +function getErrorCorrectionLevel(content: ContentType) { + if (content.length > 36) { + return 'M'; + } else if (content.length > 16) { + return 'Q'; + } else { + return 'H'; + } +} diff --git a/src/components/Qrcode/src/drawLogo.ts b/src/components/Qrcode/src/drawLogo.ts new file mode 100644 index 0000000..dbfe292 --- /dev/null +++ b/src/components/Qrcode/src/drawLogo.ts @@ -0,0 +1,81 @@ +import { isString } from '/@/utils/is'; +import { RenderQrCodeParams, LogoType } from './typing'; +export const drawLogo = ({ canvas, logo }: RenderQrCodeParams) => { + if (!logo) { + return new Promise((resolve) => { + resolve((canvas as HTMLCanvasElement).toDataURL()); + }); + } + const canvasWidth = (canvas as HTMLCanvasElement).width; + const { logoSize = 0.15, bgColor = '#ffffff', borderSize = 0.05, crossOrigin, borderRadius = 8, logoRadius = 0 } = logo as LogoType; + + const logoSrc: string = isString(logo) ? logo : logo.src; + const logoWidth = canvasWidth * logoSize; + const logoXY = (canvasWidth * (1 - logoSize)) / 2; + const logoBgWidth = canvasWidth * (logoSize + borderSize); + const logoBgXY = (canvasWidth * (1 - logoSize - borderSize)) / 2; + + const ctx = canvas.getContext('2d'); + if (!ctx) return; + + // logo 底色 + canvasRoundRect(ctx)(logoBgXY, logoBgXY, logoBgWidth, logoBgWidth, borderRadius); + ctx.fillStyle = bgColor; + ctx.fill(); + + // logo + const image = new Image(); + if (crossOrigin || logoRadius) { + image.setAttribute('crossOrigin', crossOrigin || 'anonymous'); + } + image.src = logoSrc; + + // 使用image绘制可以避免某些跨域情况 + const drawLogoWithImage = (image: CanvasImageSource) => { + ctx.drawImage(image, logoXY, logoXY, logoWidth, logoWidth); + }; + + // 使用canvas绘制以获得更多的功能 + const drawLogoWithCanvas = (image: HTMLImageElement) => { + const canvasImage = document.createElement('canvas'); + canvasImage.width = logoXY + logoWidth; + canvasImage.height = logoXY + logoWidth; + const imageCanvas = canvasImage.getContext('2d'); + if (!imageCanvas || !ctx) return; + imageCanvas.drawImage(image, logoXY, logoXY, logoWidth, logoWidth); + + canvasRoundRect(ctx)(logoXY, logoXY, logoWidth, logoWidth, logoRadius); + if (!ctx) return; + const fillStyle = ctx.createPattern(canvasImage, 'no-repeat'); + if (fillStyle) { + ctx.fillStyle = fillStyle; + ctx.fill(); + } + }; + + // 将 logo绘制到 canvas上 + return new Promise((resolve) => { + image.onload = () => { + logoRadius ? drawLogoWithCanvas(image) : drawLogoWithImage(image); + resolve((canvas as HTMLCanvasElement).toDataURL()); + }; + }); +}; + +// copy来的方法,用于绘制圆角 +function canvasRoundRect(ctx: CanvasRenderingContext2D) { + return (x: number, y: number, w: number, h: number, r: number) => { + const minSize = Math.min(w, h); + if (r > minSize / 2) { + r = minSize / 2; + } + ctx.beginPath(); + ctx.moveTo(x + r, y); + ctx.arcTo(x + w, y, x + w, y + h, r); + ctx.arcTo(x + w, y + h, x, y + h, r); + ctx.arcTo(x, y + h, x, y, r); + ctx.arcTo(x, y, x + w, y, r); + ctx.closePath(); + return ctx; + }; +} diff --git a/src/components/Qrcode/src/qrcodePlus.ts b/src/components/Qrcode/src/qrcodePlus.ts new file mode 100644 index 0000000..6439861 --- /dev/null +++ b/src/components/Qrcode/src/qrcodePlus.ts @@ -0,0 +1,4 @@ +// 参考 qr-code-with-logo 进行ts版本修改 +import { toCanvas } from './toCanvas'; +export * from './typing'; +export { toCanvas }; diff --git a/src/components/Qrcode/src/toCanvas.ts b/src/components/Qrcode/src/toCanvas.ts new file mode 100644 index 0000000..f74d596 --- /dev/null +++ b/src/components/Qrcode/src/toCanvas.ts @@ -0,0 +1,10 @@ +import { renderQrCode } from './drawCanvas'; +import { drawLogo } from './drawLogo'; +import { RenderQrCodeParams } from './typing'; +export const toCanvas = (options: RenderQrCodeParams) => { + return renderQrCode(options) + .then(() => { + return options; + }) + .then(drawLogo) as Promise; +}; diff --git a/src/components/Qrcode/src/typing.ts b/src/components/Qrcode/src/typing.ts new file mode 100644 index 0000000..3a037e9 --- /dev/null +++ b/src/components/Qrcode/src/typing.ts @@ -0,0 +1,38 @@ +import type { QRCodeSegment, QRCodeRenderersOptions } from 'qrcode'; + +export type ContentType = string | QRCodeSegment[]; + +export type { QRCodeRenderersOptions }; + +export type LogoType = { + src: string; + logoSize: number; + borderColor: string; + bgColor: string; + borderSize: number; + crossOrigin: string; + borderRadius: number; + logoRadius: number; +}; + +export interface RenderQrCodeParams { + canvas: any; + content: ContentType; + width?: number; + options?: QRCodeRenderersOptions; + logo?: LogoType | string; + image?: HTMLImageElement; + downloadName?: string; + download?: boolean | Fn; +} + +export type ToCanvasFn = (options: RenderQrCodeParams) => Promise; + +export interface QrCodeActionType { + download: (fileName?: string) => void; +} + +export interface QrcodeDoneEventParams { + url: string; + ctx?: CanvasRenderingContext2D | null; +} diff --git a/src/components/Scrollbar/index.ts b/src/components/Scrollbar/index.ts new file mode 100644 index 0000000..e5b2cb2 --- /dev/null +++ b/src/components/Scrollbar/index.ts @@ -0,0 +1,8 @@ +/** + * copy from element-ui + */ + +import Scrollbar from './src/Scrollbar.vue'; + +export { Scrollbar }; +export type { ScrollbarType } from './src/types'; diff --git a/src/components/Scrollbar/src/Scrollbar.vue b/src/components/Scrollbar/src/Scrollbar.vue new file mode 100644 index 0000000..3ea4a02 --- /dev/null +++ b/src/components/Scrollbar/src/Scrollbar.vue @@ -0,0 +1,193 @@ + + + diff --git a/src/components/Scrollbar/src/bar.ts b/src/components/Scrollbar/src/bar.ts new file mode 100644 index 0000000..d56b56c --- /dev/null +++ b/src/components/Scrollbar/src/bar.ts @@ -0,0 +1,92 @@ +import { defineComponent, h, computed, ref, getCurrentInstance, onUnmounted, inject, Ref } from 'vue'; +import { on, off } from '/@/utils/domUtils'; + +import { renderThumbStyle, BAR_MAP } from './util'; + +export default defineComponent({ + name: 'Bar', + + props: { + vertical: Boolean, + size: String, + move: Number, + }, + + setup(props) { + const instance = getCurrentInstance(); + const thumb = ref(); + const wrap = inject('scroll-bar-wrap', {} as Ref>) as any; + const bar = computed(() => { + return BAR_MAP[props.vertical ? 'vertical' : 'horizontal']; + }); + const barStore = ref({}); + const cursorDown = ref(); + const clickThumbHandler = (e: any) => { + // prevent click event of right button + if (e.ctrlKey || e.button === 2) { + return; + } + window.getSelection()?.removeAllRanges(); + startDrag(e); + barStore.value[bar.value.axis] = + e.currentTarget[bar.value.offset] - (e[bar.value.client] - e.currentTarget.getBoundingClientRect()[bar.value.direction]); + }; + + const clickTrackHandler = (e: any) => { + const offset = Math.abs(e.target.getBoundingClientRect()[bar.value.direction] - e[bar.value.client]); + const thumbHalf = thumb.value[bar.value.offset] / 2; + const thumbPositionPercentage = ((offset - thumbHalf) * 100) / instance?.vnode.el?.[bar.value.offset]; + + wrap.value[bar.value.scroll] = (thumbPositionPercentage * wrap.value[bar.value.scrollSize]) / 100; + }; + const startDrag = (e: any) => { + e.stopImmediatePropagation(); + cursorDown.value = true; + on(document, 'mousemove', mouseMoveDocumentHandler); + on(document, 'mouseup', mouseUpDocumentHandler); + document.onselectstart = () => false; + }; + + const mouseMoveDocumentHandler = (e: any) => { + if (cursorDown.value === false) return; + const prevPage = barStore.value[bar.value.axis]; + + if (!prevPage) return; + + const offset = (instance?.vnode.el?.getBoundingClientRect()[bar.value.direction] - e[bar.value.client]) * -1; + const thumbClickPosition = thumb.value[bar.value.offset] - prevPage; + const thumbPositionPercentage = ((offset - thumbClickPosition) * 100) / instance?.vnode.el?.[bar.value.offset]; + wrap.value[bar.value.scroll] = (thumbPositionPercentage * wrap.value[bar.value.scrollSize]) / 100; + }; + + function mouseUpDocumentHandler() { + cursorDown.value = false; + barStore.value[bar.value.axis] = 0; + off(document, 'mousemove', mouseMoveDocumentHandler); + document.onselectstart = null; + } + + onUnmounted(() => { + off(document, 'mouseup', mouseUpDocumentHandler); + }); + + return () => + h( + 'div', + { + class: ['scrollbar__bar', 'is-' + bar.value.key], + onMousedown: clickTrackHandler, + }, + h('div', { + ref: thumb, + class: 'scrollbar__thumb', + onMousedown: clickThumbHandler, + style: renderThumbStyle({ + size: props.size, + move: props.move, + bar: bar.value, + }), + }) + ); + }, +}); diff --git a/src/components/Scrollbar/src/types.d.ts b/src/components/Scrollbar/src/types.d.ts new file mode 100644 index 0000000..4c7eeea --- /dev/null +++ b/src/components/Scrollbar/src/types.d.ts @@ -0,0 +1,18 @@ +export interface BarMapItem { + offset: string; + scroll: string; + scrollSize: string; + size: string; + key: string; + axis: string; + client: string; + direction: string; +} +export interface BarMap { + vertical: BarMapItem; + horizontal: BarMapItem; +} + +export interface ScrollbarType { + wrap: ElRef; +} diff --git a/src/components/Scrollbar/src/util.ts b/src/components/Scrollbar/src/util.ts new file mode 100644 index 0000000..b7c4845 --- /dev/null +++ b/src/components/Scrollbar/src/util.ts @@ -0,0 +1,50 @@ +import type { BarMap } from './types'; +export const BAR_MAP: BarMap = { + vertical: { + offset: 'offsetHeight', + scroll: 'scrollTop', + scrollSize: 'scrollHeight', + size: 'height', + key: 'vertical', + axis: 'Y', + client: 'clientY', + direction: 'top', + }, + horizontal: { + offset: 'offsetWidth', + scroll: 'scrollLeft', + scrollSize: 'scrollWidth', + size: 'width', + key: 'horizontal', + axis: 'X', + client: 'clientX', + direction: 'left', + }, +}; + +// @ts-ignore +export function renderThumbStyle({ move, size, bar }) { + const style = {} as any; + const translate = `translate${bar.axis}(${move}%)`; + + style[bar.size] = size; + style.transform = translate; + style.msTransform = translate; + style.webkitTransform = translate; + + return style; +} + +function extend(to: T, _from: K): T & K { + return Object.assign(to, _from); +} + +export function toObject(arr: Array): Recordable { + const res = {}; + for (let i = 0; i < arr.length; i++) { + if (arr[i]) { + extend(res, arr[i]); + } + } + return res; +} diff --git a/src/components/SimpleMenu/index.ts b/src/components/SimpleMenu/index.ts new file mode 100644 index 0000000..0dfd248 --- /dev/null +++ b/src/components/SimpleMenu/index.ts @@ -0,0 +1,2 @@ +export { default as SimpleMenu } from './src/SimpleMenu.vue'; +export { default as SimpleMenuTag } from './src/SimpleMenuTag.vue'; diff --git a/src/components/SimpleMenu/src/SimpleMenu.vue b/src/components/SimpleMenu/src/SimpleMenu.vue new file mode 100644 index 0000000..d6699fa --- /dev/null +++ b/src/components/SimpleMenu/src/SimpleMenu.vue @@ -0,0 +1,155 @@ + + + diff --git a/src/components/SimpleMenu/src/SimpleMenuTag.vue b/src/components/SimpleMenu/src/SimpleMenuTag.vue new file mode 100644 index 0000000..b7d3cb3 --- /dev/null +++ b/src/components/SimpleMenu/src/SimpleMenuTag.vue @@ -0,0 +1,68 @@ + + diff --git a/src/components/SimpleMenu/src/SimpleSubMenu.vue b/src/components/SimpleMenu/src/SimpleSubMenu.vue new file mode 100644 index 0000000..e713f62 --- /dev/null +++ b/src/components/SimpleMenu/src/SimpleSubMenu.vue @@ -0,0 +1,105 @@ + + diff --git a/src/components/SimpleMenu/src/components/Menu.vue b/src/components/SimpleMenu/src/components/Menu.vue new file mode 100644 index 0000000..80c0f65 --- /dev/null +++ b/src/components/SimpleMenu/src/components/Menu.vue @@ -0,0 +1,148 @@ + + + + diff --git a/src/components/SimpleMenu/src/components/MenuCollapseTransition.vue b/src/components/SimpleMenu/src/components/MenuCollapseTransition.vue new file mode 100644 index 0000000..5295439 --- /dev/null +++ b/src/components/SimpleMenu/src/components/MenuCollapseTransition.vue @@ -0,0 +1,78 @@ + + diff --git a/src/components/SimpleMenu/src/components/MenuItem.vue b/src/components/SimpleMenu/src/components/MenuItem.vue new file mode 100644 index 0000000..0b7afc7 --- /dev/null +++ b/src/components/SimpleMenu/src/components/MenuItem.vue @@ -0,0 +1,127 @@ + + + diff --git a/src/components/SimpleMenu/src/components/SubMenuItem.vue b/src/components/SimpleMenu/src/components/SubMenuItem.vue new file mode 100644 index 0000000..9300b48 --- /dev/null +++ b/src/components/SimpleMenu/src/components/SubMenuItem.vue @@ -0,0 +1,311 @@ + + + diff --git a/src/components/SimpleMenu/src/components/menu.less b/src/components/SimpleMenu/src/components/menu.less new file mode 100644 index 0000000..84ff2da --- /dev/null +++ b/src/components/SimpleMenu/src/components/menu.less @@ -0,0 +1,309 @@ +@menu-prefix-cls: ~'@{namespace}-menu'; +@menu-popup-prefix-cls: ~'@{namespace}-menu-popup'; +@submenu-popup-prefix-cls: ~'@{namespace}-menu-submenu-popup'; + +@transition-time: 0.2s; +@menu-dark-subsidiary-color: rgba(255, 255, 255, 0.7); + +.light-border { + &::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + display: block; + width: 2px; + background-color: @primary-color; + content: ''; + } +} + +.@{menu-prefix-cls}-menu-popover { + .ant-popover-arrow { + display: none; + } + + .ant-popover-inner-content { + padding: 0; + } + + .@{menu-prefix-cls} { + &-opened > * > &-submenu-title-icon { + transform: translateY(-50%) rotate(90deg) !important; + } + + &-item, + &-submenu-title { + position: relative; + z-index: 1; + padding: 12px 20px; + color: @menu-dark-subsidiary-color; + cursor: pointer; + transition: all @transition-time @ease-in-out; + + &-icon { + position: absolute; + top: 50%; + right: 18px; + transform: translateY(-50%) rotate(-90deg); + transition: transform @transition-time @ease-in-out; + } + } + + &-dark { + .@{menu-prefix-cls}-item, + .@{menu-prefix-cls}-submenu-title { + color: @menu-dark-subsidiary-color; + // background: @menu-dark-active-bg; + + &:hover { + color: #fff; + } + + &-selected { + color: #fff; + background-color: @primary-color !important; + } + } + } + + &-light { + .@{menu-prefix-cls}-item, + .@{menu-prefix-cls}-submenu-title { + color: @text-color-base; + + &:hover { + color: @primary-color; + } + + &-selected { + z-index: 2; + color: @primary-color; + background-color: fade(@primary-color, 10); + + .light-border(); + } + } + } + } +} + +.content(); +.content() { + .@{menu-prefix-cls} { + position: relative; + display: block; + width: 100%; + padding: 0; + margin: 0; + font-size: @font-size-base; + color: @text-color-base; + list-style: none; + outline: none; + + // .collapse-transition { + // transition: @transition-time height ease-in-out, @transition-time padding-top ease-in-out, + // @transition-time padding-bottom ease-in-out; + // } + + &-light { + background-color: #fff; + + .@{menu-prefix-cls}-submenu-active { + color: @primary-color !important; + + &-border { + .light-border(); + } + } + } + + &-dark { + .@{menu-prefix-cls}-submenu-active { + color: #fff !important; + } + } + + &-item { + position: relative; + z-index: 1; + display: flex; + font-size: @font-size-base; + color: inherit; + list-style: none; + cursor: pointer; + outline: none; + align-items: center; + + &:hover, + &:active { + color: inherit; + } + } + + &-item > i { + margin-right: 6px; + } + + &-submenu-title > i, + &-submenu-title span > i { + margin-right: 8px; + } + + // vertical + &-vertical &-item, + &-vertical &-submenu-title { + position: relative; + z-index: 1; + padding: 14px 24px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + cursor: pointer; + + &:hover { + color: @primary-color; + } + + .@{menu-prefix-cls}-tooltip { + width: calc(100% - 0px); + padding: 12px 0; + text-align: center; + } + .@{menu-prefix-cls}-submenu-popup { + padding: 12px 0; + } + } + + &-vertical &-submenu-collapse { + .@{submenu-popup-prefix-cls} { + display: flex; + justify-content: center; + align-items: center; + } + .@{menu-prefix-cls}-submenu-collapsed-show-tit { + flex-direction: column; + } + } + + &-vertical&-collapse &-item, + &-vertical&-collapse &-submenu-title { + padding: 0 0; + } + + &-vertical &-submenu-title-icon { + position: absolute; + top: 50%; + right: 18px; + transform: translateY(-50%); + } + + &-submenu-title-icon { + transition: transform @transition-time @ease-in-out; + } + + &-vertical &-opened > * > &-submenu-title-icon { + transform: translateY(-50%) rotate(180deg); + } + + &-vertical &-submenu { + &-nested { + padding-left: 20px; + } + .@{menu-prefix-cls}-item { + padding-left: 43px; + } + } + + &-light&-vertical &-item { + &-active:not(.@{menu-prefix-cls}-submenu) { + z-index: 2; + color: @primary-color; + background-color: fade(@primary-color, 10); + + .light-border(); + } + &-active.@{menu-prefix-cls}-submenu { + color: @primary-color; + } + } + + &-light&-vertical&-collapse { + > li.@{menu-prefix-cls}-item-active, + .@{menu-prefix-cls}-submenu-active { + position: relative; + background-color: fade(@primary-color, 5); + + &::after { + display: none; + } + + &::before { + position: absolute; + top: 0; + left: 0; + width: 3px; + height: 100%; + background-color: @primary-color; + content: ''; + } + } + } + + &-dark&-vertical &-item, + &-dark&-vertical &-submenu-title { + color: @menu-dark-subsidiary-color; + &-active:not(.@{menu-prefix-cls}-submenu) { + color: #fff !important; + background-color: @primary-color !important; + } + + &:hover { + color: #fff; + } + } + + &-dark&-vertical&-collapse { + > li.@{menu-prefix-cls}-item-active, + .@{menu-prefix-cls}-submenu-active { + position: relative; + color: #fff !important; + background-color: @sider-dark-darken-bg-color !important; + + &::before { + position: absolute; + top: 0; + left: 0; + width: 3px; + height: 100%; + background-color: @primary-color; + content: ''; + } + + .@{menu-prefix-cls}-submenu-collapse { + background-color: transparent; + } + } + } + + &-dark&-vertical &-submenu &-item { + &-active, + &-active:hover { + color: #fff; + border-right: none; + } + } + + &-dark&-vertical &-child-item-active > &-submenu-title { + color: #fff; + } + + &-dark&-vertical &-opened { + .@{menu-prefix-cls}-submenu-has-parent-submenu { + .@{menu-prefix-cls}-submenu-title { + background-color: transparent; + } + } + } + } +} diff --git a/src/components/SimpleMenu/src/components/types.ts b/src/components/SimpleMenu/src/components/types.ts new file mode 100644 index 0000000..d828e89 --- /dev/null +++ b/src/components/SimpleMenu/src/components/types.ts @@ -0,0 +1,25 @@ +import { Ref } from 'vue'; + +export interface Props { + theme: string; + activeName?: string | number | undefined; + openNames: string[]; + accordion: boolean; + width: string; + collapsedWidth: string; + indentSize: number; + collapse: boolean; + activeSubMenuNames: (string | number)[]; +} + +export interface SubMenuProvider { + addSubMenu: (name: string | number, update?: boolean) => void; + removeSubMenu: (name: string | number, update?: boolean) => void; + removeAll: () => void; + sliceIndex: (index: number) => void; + isRemoveAllPopup: Ref; + getOpenNames: () => (string | number)[]; + handleMouseleave?: Fn; + level: number; + props: Props; +} diff --git a/src/components/SimpleMenu/src/components/useMenu.ts b/src/components/SimpleMenu/src/components/useMenu.ts new file mode 100644 index 0000000..8830559 --- /dev/null +++ b/src/components/SimpleMenu/src/components/useMenu.ts @@ -0,0 +1,84 @@ +import { computed, ComponentInternalInstance, unref } from 'vue'; +import type { CSSProperties } from 'vue'; + +export function useMenuItem(instance: ComponentInternalInstance | null) { + const getParentMenu = computed(() => { + return findParentMenu(['Menu', 'SubMenu']); + }); + + const getParentRootMenu = computed(() => { + return findParentMenu(['Menu']); + }); + + const getParentSubMenu = computed(() => { + return findParentMenu(['SubMenu']); + }); + + const getItemStyle = computed((): CSSProperties => { + let parent = instance?.parent; + if (!parent) return {}; + const indentSize = (unref(getParentRootMenu)?.props.indentSize as number) ?? 20; + let padding = indentSize; + + if (unref(getParentRootMenu)?.props.collapse) { + padding = indentSize; + } else { + while (parent && parent.type.name !== 'Menu') { + if (parent.type.name === 'SubMenu') { + padding += indentSize; + } + parent = parent.parent; + } + } + return { paddingLeft: padding + 'px' }; + }); + + function findParentMenu(name: string[]) { + let parent = instance?.parent; + if (!parent) return null; + while (parent && name.indexOf(parent.type.name!) === -1) { + parent = parent.parent; + } + return parent; + } + + function getParentList() { + let parent = instance; + if (!parent) + return { + uidList: [], + list: [], + }; + const ret: any[] = []; + while (parent && parent.type.name !== 'Menu') { + if (parent.type.name === 'SubMenu') { + ret.push(parent); + } + parent = parent.parent; + } + return { + uidList: ret.map((item) => item.uid), + list: ret, + }; + } + + function getParentInstance(instance: ComponentInternalInstance, name = 'SubMenu') { + let parent = instance.parent; + while (parent) { + if (parent.type.name !== name) { + return parent; + } + parent = parent.parent; + } + return parent; + } + + return { + getParentMenu, + getParentInstance, + getParentRootMenu, + getParentList, + getParentSubMenu, + getItemStyle, + }; +} diff --git a/src/components/SimpleMenu/src/components/useSimpleMenuContext.ts b/src/components/SimpleMenu/src/components/useSimpleMenuContext.ts new file mode 100644 index 0000000..f3d8100 --- /dev/null +++ b/src/components/SimpleMenu/src/components/useSimpleMenuContext.ts @@ -0,0 +1,18 @@ +import type { InjectionKey, Ref } from 'vue'; +import type { Emitter } from '/@/utils/mitt'; +import { createContext, useContext } from '/@/hooks/core/useContext'; + +export interface SimpleRootMenuContextProps { + rootMenuEmitter: Emitter; + activeName: Ref; +} + +const key: InjectionKey = Symbol(); + +export function createSimpleRootMenuContext(context: SimpleRootMenuContextProps) { + return createContext(context, key, { readonly: false, native: true }); +} + +export function useSimpleRootMenuContext() { + return useContext(key); +} diff --git a/src/components/SimpleMenu/src/index.less b/src/components/SimpleMenu/src/index.less new file mode 100644 index 0000000..4f9c9ce --- /dev/null +++ b/src/components/SimpleMenu/src/index.less @@ -0,0 +1,77 @@ +@simple-prefix-cls: ~'@{namespace}-simple-menu'; +@prefix-cls: ~'@{namespace}-menu'; + +.@{prefix-cls} { + &-dark&-vertical .@{simple-prefix-cls}__parent { + background-color: @sider-dark-bg-color; + > .@{prefix-cls}-submenu-title { + background-color: @sider-dark-bg-color; + } + } + + &-dark&-vertical .@{simple-prefix-cls}__children, + &-dark&-popup .@{simple-prefix-cls}__children { + background-color: @sider-dark-lighten-bg-color; + > .@{prefix-cls}-submenu-title { + background-color: @sider-dark-lighten-bg-color; + } + } + + .collapse-title { + overflow: hidden; + font-size: 12px; + text-overflow: ellipsis; + white-space: nowrap; + } +} + +.@{simple-prefix-cls} { + &-sub-title { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + transition: all 0.3s; + } + + &-tag { + position: absolute; + top: calc(50% - 8px); + right: 30px; + display: inline-block; + padding: 2px 3px; + margin-right: 4px; + font-size: 10px; + line-height: 14px; + color: #fff; + border-radius: 2px; + + &--collapse { + top: 6px !important; + right: 2px; + } + + &--dot { + top: calc(50% - 2px); + width: 6px; + height: 6px; + padding: 0; + border-radius: 50%; + } + + &--primary { + background-color: @primary-color; + } + + &--error { + background-color: @error-color; + } + + &--success { + background-color: @success-color; + } + + &--warn { + background-color: @warning-color; + } + } +} diff --git a/src/components/SimpleMenu/src/types.ts b/src/components/SimpleMenu/src/types.ts new file mode 100644 index 0000000..2e292d4 --- /dev/null +++ b/src/components/SimpleMenu/src/types.ts @@ -0,0 +1,5 @@ +export interface MenuState { + activeName: string; + openNames: string[]; + activeSubMenuNames: string[]; +} diff --git a/src/components/SimpleMenu/src/useOpenKeys.ts b/src/components/SimpleMenu/src/useOpenKeys.ts new file mode 100644 index 0000000..c38b92c --- /dev/null +++ b/src/components/SimpleMenu/src/useOpenKeys.ts @@ -0,0 +1,44 @@ +import type { Menu as MenuType } from '/@/router/types'; +import type { MenuState } from './types'; + +import { computed, Ref, toRaw } from 'vue'; + +import { unref } from 'vue'; +import { uniq } from 'lodash-es'; +import { getAllParentPath } from '/@/router/helper/menuHelper'; + +import { useTimeoutFn } from '/@/hooks/core/useTimeout'; +import { useDebounceFn } from '@vueuse/core'; + +export function useOpenKeys(menuState: MenuState, menus: Ref, accordion: Ref, mixSider: Ref, collapse: Ref) { + const debounceSetOpenKeys = useDebounceFn(setOpenKeys, 50); + async function setOpenKeys(path: string) { + const native = !mixSider.value; + const menuList = toRaw(menus.value); + useTimeoutFn( + () => { + if (menuList?.length === 0) { + menuState.activeSubMenuNames = []; + menuState.openNames = []; + return; + } + const keys = getAllParentPath(menuList, path); + + if (!unref(accordion)) { + menuState.openNames = uniq([...menuState.openNames, ...keys]); + } else { + menuState.openNames = keys; + } + menuState.activeSubMenuNames = menuState.openNames; + }, + 30, + native + ); + } + + const getOpenKeys = computed(() => { + return unref(collapse) ? [] : menuState.openNames; + }); + + return { setOpenKeys: debounceSetOpenKeys, getOpenKeys }; +} diff --git a/src/components/StrengthMeter/index.ts b/src/components/StrengthMeter/index.ts new file mode 100644 index 0000000..9763afa --- /dev/null +++ b/src/components/StrengthMeter/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '/@/utils'; +import strengthMeter from './src/StrengthMeter.vue'; + +export const StrengthMeter = withInstall(strengthMeter); diff --git a/src/components/StrengthMeter/src/StrengthMeter.vue b/src/components/StrengthMeter/src/StrengthMeter.vue new file mode 100644 index 0000000..ffb6548 --- /dev/null +++ b/src/components/StrengthMeter/src/StrengthMeter.vue @@ -0,0 +1,135 @@ + + + + diff --git a/src/components/Table/index.ts b/src/components/Table/index.ts new file mode 100644 index 0000000..7fe08c9 --- /dev/null +++ b/src/components/Table/index.ts @@ -0,0 +1,10 @@ +export { default as BasicTable } from './src/BasicTable.vue'; +export { default as TableAction } from './src/components/TableAction.vue'; +export { default as EditTableHeaderIcon } from './src/components/EditTableHeaderIcon.vue'; +export { default as TableImg } from './src/components/TableImg.vue'; +export * from './src/types/table'; +export * from './src/types/pagination'; +export * from './src/types/tableAction'; +export { useTable } from './src/hooks/useTable'; +export type { FormSchema, FormProps } from '/@/components/Form/src/types/form'; +export type { EditRecordRow } from './src/components/editable'; diff --git a/src/components/Table/src/BasicTable.vue b/src/components/Table/src/BasicTable.vue new file mode 100644 index 0000000..5059744 --- /dev/null +++ b/src/components/Table/src/BasicTable.vue @@ -0,0 +1,433 @@ + + + diff --git a/src/components/Table/src/componentMap.ts b/src/components/Table/src/componentMap.ts new file mode 100644 index 0000000..0578a60 --- /dev/null +++ b/src/components/Table/src/componentMap.ts @@ -0,0 +1,26 @@ +import type { Component } from 'vue'; +import { Input, Select, Checkbox, InputNumber, Switch, DatePicker, TimePicker } from 'ant-design-vue'; +import type { ComponentType } from './types/componentType'; +import { ApiSelect, ApiTreeSelect } from '/@/components/Form'; + +const componentMap = new Map(); + +componentMap.set('Input', Input); +componentMap.set('InputNumber', InputNumber); +componentMap.set('Select', Select); +componentMap.set('ApiSelect', ApiSelect); +componentMap.set('ApiTreeSelect', ApiTreeSelect); +componentMap.set('Switch', Switch); +componentMap.set('Checkbox', Checkbox); +componentMap.set('DatePicker', DatePicker); +componentMap.set('TimePicker', TimePicker); + +export function add(compName: ComponentType, component: Component) { + componentMap.set(compName, component); +} + +export function del(compName: ComponentType) { + componentMap.delete(compName); +} + +export { componentMap }; diff --git a/src/components/Table/src/components/EditTableHeaderIcon.vue b/src/components/Table/src/components/EditTableHeaderIcon.vue new file mode 100644 index 0000000..369820e --- /dev/null +++ b/src/components/Table/src/components/EditTableHeaderIcon.vue @@ -0,0 +1,16 @@ + + diff --git a/src/components/Table/src/components/ExpandIcon.tsx b/src/components/Table/src/components/ExpandIcon.tsx new file mode 100644 index 0000000..3d1d98d --- /dev/null +++ b/src/components/Table/src/components/ExpandIcon.tsx @@ -0,0 +1,23 @@ +import { BasicArrow } from '/@/components/Basic'; + +export default () => { + return (props: Recordable) => { + if (!props.expandable) { + if (props.needIndentSpaced) { + return ; + } else { + return ; + } + } + return ( + { + props.onExpand(props.record, e); + }} + expand={props.expanded} + /> + ); + }; +}; diff --git a/src/components/Table/src/components/HeaderCell.vue b/src/components/Table/src/components/HeaderCell.vue new file mode 100644 index 0000000..c21bfd0 --- /dev/null +++ b/src/components/Table/src/components/HeaderCell.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/components/Table/src/components/TableAction.vue b/src/components/Table/src/components/TableAction.vue new file mode 100644 index 0000000..4fe82a6 --- /dev/null +++ b/src/components/Table/src/components/TableAction.vue @@ -0,0 +1,201 @@ + + + diff --git a/src/components/Table/src/components/TableFooter.vue b/src/components/Table/src/components/TableFooter.vue new file mode 100644 index 0000000..68e556b --- /dev/null +++ b/src/components/Table/src/components/TableFooter.vue @@ -0,0 +1,94 @@ + + diff --git a/src/components/Table/src/components/TableHeader.vue b/src/components/Table/src/components/TableHeader.vue new file mode 100644 index 0000000..341cd40 --- /dev/null +++ b/src/components/Table/src/components/TableHeader.vue @@ -0,0 +1,165 @@ + + + diff --git a/src/components/Table/src/components/TableImg.vue b/src/components/Table/src/components/TableImg.vue new file mode 100644 index 0000000..29a0907 --- /dev/null +++ b/src/components/Table/src/components/TableImg.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/components/Table/src/components/TableTitle.vue b/src/components/Table/src/components/TableTitle.vue new file mode 100644 index 0000000..0b797e1 --- /dev/null +++ b/src/components/Table/src/components/TableTitle.vue @@ -0,0 +1,53 @@ + + + diff --git a/src/components/Table/src/components/editable/CellComponent.ts b/src/components/Table/src/components/editable/CellComponent.ts new file mode 100644 index 0000000..8441715 --- /dev/null +++ b/src/components/Table/src/components/editable/CellComponent.ts @@ -0,0 +1,38 @@ +import type { FunctionalComponent, defineComponent } from 'vue'; +import type { ComponentType } from '../../types/componentType'; +import { componentMap } from '/@/components/Table/src/componentMap'; + +import { Popover } from 'ant-design-vue'; +import { h } from 'vue'; + +export interface ComponentProps { + component: ComponentType; + rule: boolean; + popoverVisible: boolean; + ruleMessage: string; + getPopupContainer?: Fn; +} + +export const CellComponent: FunctionalComponent = ( + { component = 'Input', rule = true, ruleMessage, popoverVisible, getPopupContainer }: ComponentProps, + { attrs } +) => { + const Comp = componentMap.get(component) as typeof defineComponent; + + const DefaultComp = h(Comp, attrs); + if (!rule) { + return DefaultComp; + } + return h( + Popover, + { + overlayClassName: 'edit-cell-rule-popover', + visible: !!popoverVisible, + ...(getPopupContainer ? { getPopupContainer } : {}), + }, + { + default: () => DefaultComp, + content: () => ruleMessage, + } + ); +}; diff --git a/src/components/Table/src/components/editable/EditableCell.vue b/src/components/Table/src/components/editable/EditableCell.vue new file mode 100644 index 0000000..d334c25 --- /dev/null +++ b/src/components/Table/src/components/editable/EditableCell.vue @@ -0,0 +1,480 @@ + + + diff --git a/src/components/Table/src/components/editable/helper.ts b/src/components/Table/src/components/editable/helper.ts new file mode 100644 index 0000000..d901729 --- /dev/null +++ b/src/components/Table/src/components/editable/helper.ts @@ -0,0 +1,28 @@ +import { ComponentType } from '../../types/componentType'; +import { useI18n } from '/@/hooks/web/useI18n'; + +const { t } = useI18n(); + +/** + * @description: 生成placeholder + */ +export function createPlaceholderMessage(component: ComponentType) { + if (component.includes('Input')) { + return t('common.inputText'); + } + if (component.includes('Picker')) { + return t('common.chooseText'); + } + + if ( + component.includes('Select') || + component.includes('Checkbox') || + component.includes('Radio') || + component.includes('Switch') || + component.includes('DatePicker') || + component.includes('TimePicker') + ) { + return t('common.chooseText'); + } + return ''; +} diff --git a/src/components/Table/src/components/editable/index.ts b/src/components/Table/src/components/editable/index.ts new file mode 100644 index 0000000..4f7d4da --- /dev/null +++ b/src/components/Table/src/components/editable/index.ts @@ -0,0 +1,68 @@ +import type { BasicColumn } from '/@/components/Table/src/types/table'; + +import { h, Ref } from 'vue'; + +import EditableCell from './EditableCell.vue'; +import { isArray } from '/@/utils/is'; + +interface Params { + text: string; + record: Recordable; + index: number; +} + +export function renderEditCell(column: BasicColumn) { + return ({ text: value, record, index }: Params) => { + record.onValid = async () => { + if (isArray(record?.validCbs)) { + const validFns = (record?.validCbs || []).map((fn) => fn()); + const res = await Promise.all(validFns); + return res.every((item) => !!item); + } else { + return false; + } + }; + + record.onEdit = async (edit: boolean, submit = false) => { + if (!submit) { + record.editable = edit; + } + + if (!edit && submit) { + if (!(await record.onValid())) return false; + const res = await record.onSubmitEdit?.(); + if (res) { + record.editable = false; + return true; + } + return false; + } + // cancel + if (!edit && !submit) { + record.onCancelEdit?.(); + } + return true; + }; + + return h(EditableCell, { + value, + record, + column, + index, + }); + }; +} + +export type EditRecordRow = Partial< + { + onEdit: (editable: boolean, submit?: boolean) => Promise; + onValid: () => Promise; + editable: boolean; + onCancel: Fn; + onSubmit: Fn; + submitCbs: Fn[]; + cancelCbs: Fn[]; + validCbs: Fn[]; + editValueRefs: Recordable; + } & T +>; diff --git a/src/components/Table/src/components/settings/ColumnSetting.vue b/src/components/Table/src/components/settings/ColumnSetting.vue new file mode 100644 index 0000000..62d7972 --- /dev/null +++ b/src/components/Table/src/components/settings/ColumnSetting.vue @@ -0,0 +1,505 @@ + + + diff --git a/src/components/Table/src/components/settings/FullScreenSetting.vue b/src/components/Table/src/components/settings/FullScreenSetting.vue new file mode 100644 index 0000000..046d647 --- /dev/null +++ b/src/components/Table/src/components/settings/FullScreenSetting.vue @@ -0,0 +1,48 @@ + + diff --git a/src/components/Table/src/components/settings/RedoSetting.vue b/src/components/Table/src/components/settings/RedoSetting.vue new file mode 100644 index 0000000..e584c13 --- /dev/null +++ b/src/components/Table/src/components/settings/RedoSetting.vue @@ -0,0 +1,45 @@ + + diff --git a/src/components/Table/src/components/settings/SizeSetting.vue b/src/components/Table/src/components/settings/SizeSetting.vue new file mode 100644 index 0000000..e681747 --- /dev/null +++ b/src/components/Table/src/components/settings/SizeSetting.vue @@ -0,0 +1,74 @@ + + diff --git a/src/components/Table/src/components/settings/index.vue b/src/components/Table/src/components/settings/index.vue new file mode 100644 index 0000000..3a615ad --- /dev/null +++ b/src/components/Table/src/components/settings/index.vue @@ -0,0 +1,74 @@ + + + diff --git a/src/components/Table/src/const.ts b/src/components/Table/src/const.ts new file mode 100644 index 0000000..9968ec5 --- /dev/null +++ b/src/components/Table/src/const.ts @@ -0,0 +1,30 @@ +import componentSetting from '/@/settings/componentSetting'; + +const { table } = componentSetting; + +const { pageSizeOptions, defaultPageSize, defaultSize, fetchSetting, defaultSortFn, defaultFilterFn } = table; + +export const ROW_KEY = 'key'; + +// Optional display number per page; +export const PAGE_SIZE_OPTIONS = pageSizeOptions; + +// Number of items displayed per page +export const PAGE_SIZE = defaultPageSize; + +// Common interface field settings +export const FETCH_SETTING = fetchSetting; + +// Configure general sort function +export const DEFAULT_SORT_FN = defaultSortFn; + +export const DEFAULT_FILTER_FN = defaultFilterFn; + +// Default layout of table cells +export const DEFAULT_ALIGN = 'center'; +// Default Size +export const DEFAULT_SIZE = defaultSize; + +export const INDEX_COLUMN_FLAG = 'INDEX'; + +export const ACTION_COLUMN_FLAG = 'ACTION'; diff --git a/src/components/Table/src/hooks/useColumns.ts b/src/components/Table/src/hooks/useColumns.ts new file mode 100644 index 0000000..ee805d0 --- /dev/null +++ b/src/components/Table/src/hooks/useColumns.ts @@ -0,0 +1,310 @@ +import type { BasicColumn, BasicTableProps, CellFormat, GetColumnsParams } from '../types/table'; +import type { PaginationProps } from '../types/pagination'; +import type { ComputedRef } from 'vue'; +import { computed, Ref, ref, toRaw, unref, watch, reactive } from 'vue'; +import { renderEditCell } from '../components/editable'; +import { usePermission } from '/@/hooks/web/usePermission'; +import { useI18n } from '/@/hooks/web/useI18n'; +import { isArray, isBoolean, isFunction, isMap, isString } from '/@/utils/is'; +import { cloneDeep, isEqual } from 'lodash-es'; +import { formatToDate } from '/@/utils/dateUtil'; +import { ACTION_COLUMN_FLAG, DEFAULT_ALIGN, INDEX_COLUMN_FLAG, PAGE_SIZE } from '../const'; + +function handleItem(item: BasicColumn, ellipsis: boolean) { + const { key, dataIndex, children } = item; + item.align = item.align || DEFAULT_ALIGN; + if (ellipsis) { + if (!key) { + item.key = dataIndex; + } + if (!isBoolean(item.ellipsis)) { + Object.assign(item, { + ellipsis, + }); + } + } + if (children && children.length) { + handleChildren(children, !!ellipsis); + } +} + +function handleChildren(children: BasicColumn[] | undefined, ellipsis: boolean) { + if (!children) return; + children.forEach((item) => { + const { children } = item; + handleItem(item, ellipsis); + handleChildren(children, ellipsis); + }); +} + +function handleIndexColumn(propsRef: ComputedRef, getPaginationRef: ComputedRef, columns: BasicColumn[]) { + const { t } = useI18n(); + + const { showIndexColumn, indexColumnProps, isTreeTable } = unref(propsRef); + + let pushIndexColumns = false; + if (unref(isTreeTable)) { + return; + } + columns.forEach(() => { + const indIndex = columns.findIndex((column) => column.flag === INDEX_COLUMN_FLAG); + if (showIndexColumn) { + pushIndexColumns = indIndex === -1; + } else if (!showIndexColumn && indIndex !== -1) { + columns.splice(indIndex, 1); + } + }); + + if (!pushIndexColumns) return; + + const isFixedLeft = columns.some((item) => item.fixed === 'left'); + + columns.unshift({ + flag: INDEX_COLUMN_FLAG, + width: 50, + title: t('component.table.index'), + align: 'center', + customRender: ({ index }) => { + const getPagination = unref(getPaginationRef); + if (isBoolean(getPagination)) { + return `${index + 1}`; + } + const { current = 1, pageSize = PAGE_SIZE } = getPagination; + return ((current < 1 ? 1 : current) - 1) * pageSize + index + 1; + }, + ...(isFixedLeft + ? { + fixed: 'left', + } + : {}), + ...indexColumnProps, + }); +} + +function handleActionColumn(propsRef: ComputedRef, columns: BasicColumn[]) { + const { actionColumn, showActionColumn } = unref(propsRef); + if (!actionColumn || !showActionColumn) return; + + const hasIndex = columns.findIndex((column) => column.flag === ACTION_COLUMN_FLAG); + if (hasIndex === -1) { + columns.push({ + ...columns[hasIndex], + ...actionColumn, + flag: ACTION_COLUMN_FLAG, + }); + } +} + +export function useColumns(propsRef: ComputedRef, getPaginationRef: ComputedRef) { + const columnsRef = ref(unref(propsRef).columns) as unknown as Ref; + let cacheColumns = unref(propsRef).columns; + + const getColumnsRef = computed(() => { + const columns = cloneDeep(unref(columnsRef)); + + handleIndexColumn(propsRef, getPaginationRef, columns); + handleActionColumn(propsRef, columns); + if (!columns) { + return []; + } + const { ellipsis } = unref(propsRef); + + columns.forEach((item) => { + const { customRender, slots } = item; + + handleItem(item, Reflect.has(item, 'ellipsis') ? !!item.ellipsis : !!ellipsis && !customRender && !slots); + }); + return columns; + }); + + function isIfShow(column: BasicColumn): boolean { + const ifShow = column.ifShow; + + let isIfShow = true; + + if (isBoolean(ifShow)) { + isIfShow = ifShow; + } + if (isFunction(ifShow)) { + isIfShow = ifShow(column); + } + return isIfShow; + } + const { hasPermission } = usePermission(); + + const getViewColumns = computed(() => { + const viewColumns = sortFixedColumn(unref(getColumnsRef)); + + const columns = cloneDeep(viewColumns); + return columns + .filter((column) => { + return hasPermission(column.auth) && isIfShow(column); + }) + .map((column) => { + const { slots, customRender, format, edit, editRow, flag, title: metaTitle } = column; + + if (!slots || !slots?.title) { + // column.slots = { title: `header-${dataIndex}`, ...(slots || {}) }; + column.customTitle = column.title as string; + Reflect.deleteProperty(column, 'title'); + } + //update-begin-author:taoyan date:20211203 for:【online报表】分组标题显示错误,都显示成了联系信息 LOWCOD-2343 + if (column.children) { + column.title = metaTitle; + } + //update-end-author:taoyan date:20211203 for:【online报表】分组标题显示错误,都显示成了联系信息 LOWCOD-2343 + + const isDefaultAction = [INDEX_COLUMN_FLAG, ACTION_COLUMN_FLAG].includes(flag!); + if (!customRender && format && !edit && !isDefaultAction) { + column.customRender = ({ text, record, index }) => { + return formatCell(text, format, record, index); + }; + } + + // edit table + if ((edit || editRow) && !isDefaultAction) { + column.customRender = renderEditCell(column); + } + return reactive(column); + }); + }); + + watch( + () => unref(propsRef).columns, + (columns) => { + columnsRef.value = columns; + cacheColumns = columns?.filter((item) => !item.flag) ?? []; + } + ); + + function setCacheColumnsByField(dataIndex: string | undefined, value: Partial) { + if (!dataIndex || !value) { + return; + } + cacheColumns.forEach((item) => { + if (item.dataIndex === dataIndex) { + Object.assign(item, value); + return; + } + }); + } + + // update-begin--author:sunjianlei---date:20220523---for: 【VUEN-1089】合并vben最新版代码,解决表格字段排序问题 + /** + * set columns + * @param columnList key|column + */ + function setColumns(columnList: Partial[] | (string | string[])[]) { + const columns = cloneDeep(columnList); + if (!isArray(columns)) return; + + if (columns.length <= 0) { + columnsRef.value = []; + return; + } + + const firstColumn = columns[0]; + + const cacheKeys = cacheColumns.map((item) => item.dataIndex); + + if (!isString(firstColumn) && !isArray(firstColumn)) { + columnsRef.value = columns as BasicColumn[]; + } else { + const columnKeys = (columns as (string | string[])[]).map((m) => m.toString()); + const newColumns: BasicColumn[] = []; + cacheColumns.forEach((item) => { + newColumns.push({ + ...item, + defaultHidden: !columnKeys.includes(item.dataIndex?.toString() || (item.key as string)), + }); + }); + // Sort according to another array + if (!isEqual(cacheKeys, columns)) { + newColumns.sort((prev, next) => { + return columnKeys.indexOf(prev.dataIndex?.toString() as string) - columnKeys.indexOf(next.dataIndex?.toString() as string); + }); + } + columnsRef.value = newColumns; + } + } + // update-end--author:sunjianlei---date:20220523---for: 【VUEN-1089】合并vben最新版代码,解决表格字段排序问题 + + function getColumns(opt?: GetColumnsParams) { + const { ignoreIndex, ignoreAction, sort } = opt || {}; + let columns = toRaw(unref(getColumnsRef)); + if (ignoreIndex) { + columns = columns.filter((item) => item.flag !== INDEX_COLUMN_FLAG); + } + if (ignoreAction) { + columns = columns.filter((item) => item.flag !== ACTION_COLUMN_FLAG); + } + + if (sort) { + columns = sortFixedColumn(columns); + } + + return columns; + } + function getCacheColumns() { + return cacheColumns; + } + + return { + getColumnsRef, + getCacheColumns, + getColumns, + setColumns, + getViewColumns, + setCacheColumnsByField, + }; +} + +function sortFixedColumn(columns: BasicColumn[]) { + const fixedLeftColumns: BasicColumn[] = []; + const fixedRightColumns: BasicColumn[] = []; + const defColumns: BasicColumn[] = []; + for (const column of columns) { + if (column.fixed === 'left') { + fixedLeftColumns.push(column); + continue; + } + if (column.fixed === 'right') { + fixedRightColumns.push(column); + continue; + } + defColumns.push(column); + } + return [...fixedLeftColumns, ...defColumns, ...fixedRightColumns].filter((item) => !item.defaultHidden); +} + +// format cell +export function formatCell(text: string, format: CellFormat, record: Recordable, index: number) { + if (!format) { + return text; + } + + // custom function + if (isFunction(format)) { + return format(text, record, index); + } + + try { + // date type + const DATE_FORMAT_PREFIX = 'date|'; + if (isString(format) && format.startsWith(DATE_FORMAT_PREFIX)) { + const dateFormat = format.replace(DATE_FORMAT_PREFIX, ''); + + if (!dateFormat) { + return text; + } + return formatToDate(text, dateFormat); + } + + // Map + if (isMap(format)) { + return format.get(text); + } + } catch (error) { + return text; + } +} diff --git a/src/components/Table/src/hooks/useColumnsCache.ts b/src/components/Table/src/hooks/useColumnsCache.ts new file mode 100644 index 0000000..1650608 --- /dev/null +++ b/src/components/Table/src/hooks/useColumnsCache.ts @@ -0,0 +1,137 @@ +import { computed, nextTick, unref, watchEffect } from 'vue'; +import { router } from '/@/router'; +import { createLocalStorage } from '/@/utils/cache'; +import { useTableContext } from './useTableContext'; +import { useMessage } from '/@/hooks/web/useMessage'; + +/** + * 列表配置缓存 + */ +export function useColumnsCache(opt, setColumns, handleColumnFixed) { + let isInit = false; + const table = useTableContext(); + const $ls = createLocalStorage(); + const { createMessage: $message } = useMessage(); + // 列表配置缓存key + const cacheKey = computed(() => { + let { fullPath } = router.currentRoute.value; + let key = fullPath.replace(/[\/\\]/g, '_'); + let cacheKey = table.getBindValues.value.tableSetting?.cacheKey; + if (cacheKey) { + key += ':' + cacheKey; + } + return 'columnCache:' + key; + }); + + watchEffect(() => { + const columns = table.getColumns(); + if (columns.length) { + init(); + } + }); + + async function init() { + if (isInit) { + return; + } + isInit = true; + let columnCache = $ls.get(cacheKey.value); + if (columnCache && columnCache.checkedList) { + const { checkedList, sortedList, sortableOrder, checkIndex } = columnCache; + await nextTick(); + // checkbox的排序缓存 + opt.sortableOrder.value = sortableOrder; + // checkbox的选中缓存 + opt.state.checkedList = checkedList; + // tableColumn的排序缓存 + opt.plainSortOptions.value.sort((prev, next) => { + return sortedList.indexOf(prev.value) - sortedList.indexOf(next.value); + }); + // 重新排序tableColumn + checkedList.sort((prev, next) => sortedList.indexOf(prev) - sortedList.indexOf(next)); + // 是否显示行号列 + if (checkIndex) { + table.setProps({ showIndexColumn: true }); + } + setColumns(checkedList); + // 设置固定列 + setColumnFixed(columnCache); + } + } + + /** 设置被固定的列 */ + async function setColumnFixed(columnCache) { + const { fixedColumns } = columnCache; + const columns = opt.plainOptions.value; + for (const column of columns) { + let fixedCol = fixedColumns.find((fc) => fc.key === (column.key || column.dataIndex)); + if (fixedCol) { + await nextTick(); + handleColumnFixed(column, fixedCol.fixed); + } + } + } + + // 判断列固定状态 + const fixedReg = /^(true|left|right)$/; + + /** 获取被固定的列 */ + function getFixedColumns() { + let fixedColumns: any[] = []; + const columns = opt.plainOptions.value; + for (const column of columns) { + if (fixedReg.test((column.fixed ?? '').toString())) { + fixedColumns.push({ + key: column.key || column.dataIndex, + fixed: column.fixed === true ? 'left' : column.fixed, + }); + } + } + return fixedColumns; + } + + /** 保存列配置 */ + function saveSetting() { + const { checkedList } = opt.state; + const sortedList = unref(opt.plainSortOptions).map((item) => item.value); + $ls.set(cacheKey.value, { + // 保存的列 + checkedList, + // 排序后的列 + sortedList, + // 是否显示行号列 + checkIndex: unref(opt.checkIndex), + // checkbox原始排序 + sortableOrder: unref(opt.sortableOrder), + // 固定列 + fixedColumns: getFixedColumns(), + }); + $message.success('保存成功'); + // 保存之后直接关闭 + opt.popoverVisible.value = false; + } + + /** 重置(删除)列配置 */ + async function resetSetting() { + // 重置固定列 + await resetFixedColumn(); + $ls.remove(cacheKey.value); + $message.success('重置成功'); + } + + async function resetFixedColumn() { + const columns = opt.plainOptions.value; + for (const column of columns) { + column.fixed; + if (fixedReg.test((column.fixed ?? '').toString())) { + await nextTick(); + handleColumnFixed(column, null); + } + } + } + + return { + saveSetting, + resetSetting, + }; +} diff --git a/src/components/Table/src/hooks/useCustomRow.ts b/src/components/Table/src/hooks/useCustomRow.ts new file mode 100644 index 0000000..d7230f4 --- /dev/null +++ b/src/components/Table/src/hooks/useCustomRow.ts @@ -0,0 +1,94 @@ +import type { ComputedRef } from 'vue'; +import type { BasicTableProps } from '../types/table'; +import { unref } from 'vue'; +import { ROW_KEY } from '../const'; +import { isString, isFunction } from '/@/utils/is'; + +interface Options { + setSelectedRowKeys: (keys: string[]) => void; + getSelectRowKeys: () => string[]; + clearSelectedRowKeys: () => void; + emit: EmitType; + getAutoCreateKey: ComputedRef; +} + +function getKey(record: Recordable, rowKey: string | ((record: Record) => string) | undefined, autoCreateKey?: boolean) { + if (!rowKey || autoCreateKey) { + return record[ROW_KEY]; + } + if (isString(rowKey)) { + return record[rowKey]; + } + if (isFunction(rowKey)) { + return record[rowKey(record)]; + } + return null; +} + +export function useCustomRow( + propsRef: ComputedRef, + { setSelectedRowKeys, getSelectRowKeys, getAutoCreateKey, clearSelectedRowKeys, emit }: Options +) { + const customRow = (record: Recordable, index: number) => { + return { + onClick: (e: Event) => { + e?.stopPropagation(); + function handleClick() { + const { rowSelection, rowKey, clickToRowSelect } = unref(propsRef); + if (!rowSelection || !clickToRowSelect) return; + const keys = getSelectRowKeys(); + const key = getKey(record, rowKey, unref(getAutoCreateKey)); + if (!key) return; + + const isCheckbox = rowSelection.type === 'checkbox'; + if (isCheckbox) { + // 找到tr + const tr: HTMLElement = (e as MouseEvent).composedPath?.().find((dom: HTMLElement) => dom.tagName === 'TR') as HTMLElement; + if (!tr) return; + // 找到Checkbox,检查是否为disabled + const checkBox = tr.querySelector('input[type=checkbox]'); + if (!checkBox || checkBox.hasAttribute('disabled')) return; + if (!keys.includes(key)) { + setSelectedRowKeys([...keys, key]); + return; + } + const keyIndex = keys.findIndex((item) => item === key); + keys.splice(keyIndex, 1); + setSelectedRowKeys(keys); + return; + } + + const isRadio = rowSelection.type === 'radio'; + if (isRadio) { + if (!keys.includes(key)) { + if (keys.length) { + clearSelectedRowKeys(); + } + setSelectedRowKeys([key]); + return; + } + clearSelectedRowKeys(); + } + } + handleClick(); + emit('row-click', record, index, e); + }, + onDblclick: (event: Event) => { + emit('row-dbClick', record, index, event); + }, + onContextmenu: (event: Event) => { + emit('row-contextmenu', record, index, event); + }, + onMouseenter: (event: Event) => { + emit('row-mouseenter', record, index, event); + }, + onMouseleave: (event: Event) => { + emit('row-mouseleave', record, index, event); + }, + }; + }; + + return { + customRow, + }; +} diff --git a/src/components/Table/src/hooks/useDataSource.ts b/src/components/Table/src/hooks/useDataSource.ts new file mode 100644 index 0000000..4b805ec --- /dev/null +++ b/src/components/Table/src/hooks/useDataSource.ts @@ -0,0 +1,338 @@ +import type { BasicTableProps, FetchParams, SorterResult } from '../types/table'; +import type { PaginationProps } from '../types/pagination'; +import { ref, unref, ComputedRef, computed, onMounted, watch, reactive, Ref, watchEffect } from 'vue'; +import { useTimeoutFn } from '/@/hooks/core/useTimeout'; +import { buildUUID } from '/@/utils/uuid'; +import { isFunction, isBoolean } from '/@/utils/is'; +import { get, cloneDeep } from 'lodash-es'; +import { FETCH_SETTING, ROW_KEY, PAGE_SIZE } from '../const'; + +interface ActionType { + getPaginationInfo: ComputedRef; + setPagination: (info: Partial) => void; + setLoading: (loading: boolean) => void; + // update-begin--author:sunjianlei---date:220220419---for:由于 getFieldsValue 返回的不是逗号分割的数据,所以改用 validate + validate: () => Recordable; + // update-end--author:sunjianlei---date:220220419---for:由于 getFieldsValue 返回的不是逗号分割的数据,所以改用 validate + clearSelectedRowKeys: () => void; + tableData: Ref; +} + +interface SearchState { + sortInfo: Recordable; + filterInfo: Record; +} +export function useDataSource( + propsRef: ComputedRef, + { getPaginationInfo, setPagination, setLoading, validate, clearSelectedRowKeys, tableData }: ActionType, + emit: EmitType +) { + const searchState = reactive({ + sortInfo: {}, + filterInfo: {}, + }); + const dataSourceRef = ref([]); + const rawDataSourceRef = ref({}); + + watchEffect(() => { + tableData.value = unref(dataSourceRef); + }); + + watch( + () => unref(propsRef).dataSource, + () => { + const { dataSource, api } = unref(propsRef); + !api && dataSource && (dataSourceRef.value = dataSource); + }, + { + immediate: true, + } + ); + + function handleTableChange(pagination: PaginationProps, filters: Partial>, sorter: SorterResult) { + const { clearSelectOnPageChange, sortFn, filterFn } = unref(propsRef); + if (clearSelectOnPageChange) { + clearSelectedRowKeys(); + } + setPagination(pagination); + + const params: Recordable = {}; + if (sorter && isFunction(sortFn)) { + const sortInfo = sortFn(sorter); + searchState.sortInfo = sortInfo; + params.sortInfo = sortInfo; + } + + if (filters && isFunction(filterFn)) { + const filterInfo = filterFn(filters); + searchState.filterInfo = filterInfo; + params.filterInfo = filterInfo; + } + fetch(params); + } + + function setTableKey(items: any[]) { + if (!items || !Array.isArray(items)) return; + items.forEach((item) => { + if (!item[ROW_KEY]) { + item[ROW_KEY] = buildUUID(); + } + if (item.children && item.children.length) { + setTableKey(item.children); + } + }); + } + + const getAutoCreateKey = computed(() => { + return unref(propsRef).autoCreateKey && !unref(propsRef).rowKey; + }); + + const getRowKey = computed(() => { + const { rowKey } = unref(propsRef); + return unref(getAutoCreateKey) ? ROW_KEY : rowKey; + }); + + const getDataSourceRef = computed(() => { + const dataSource = unref(dataSourceRef); + if (!dataSource || dataSource.length === 0) { + return unref(dataSourceRef); + } + if (unref(getAutoCreateKey)) { + const firstItem = dataSource[0]; + const lastItem = dataSource[dataSource.length - 1]; + + if (firstItem && lastItem) { + if (!firstItem[ROW_KEY] || !lastItem[ROW_KEY]) { + const data = cloneDeep(unref(dataSourceRef)); + data.forEach((item) => { + if (!item[ROW_KEY]) { + item[ROW_KEY] = buildUUID(); + } + if (item.children && item.children.length) { + setTableKey(item.children); + } + }); + dataSourceRef.value = data; + } + } + } + return unref(dataSourceRef); + }); + + async function updateTableData(index: number, key: string, value: any) { + const record = dataSourceRef.value[index]; + if (record) { + dataSourceRef.value[index][key] = value; + } + return dataSourceRef.value[index]; + } + + function updateTableDataRecord(rowKey: string | number, record: Recordable): Recordable | undefined { + const row = findTableDataRecord(rowKey); + + if (row) { + for (const field in row) { + if (Reflect.has(record, field)) row[field] = record[field]; + } + return row; + } + } + function deleteTableDataRecord(rowKey: string | number | string[] | number[]) { + if (!dataSourceRef.value || dataSourceRef.value.length == 0) return; + const rowKeyName = unref(getRowKey); + if (!rowKeyName) return; + const rowKeys = !Array.isArray(rowKey) ? [rowKey] : rowKey; + for (const key of rowKeys) { + let index: number | undefined = dataSourceRef.value.findIndex((row) => { + let targetKeyName: string; + if (typeof rowKeyName === 'function') { + targetKeyName = rowKeyName(row); + } else { + targetKeyName = rowKeyName as string; + } + return row[targetKeyName] === key; + }); + if (index >= 0) { + dataSourceRef.value.splice(index, 1); + } + index = unref(propsRef).dataSource?.findIndex((row) => { + let targetKeyName: string; + if (typeof rowKeyName === 'function') { + targetKeyName = rowKeyName(row); + } else { + targetKeyName = rowKeyName as string; + } + return row[targetKeyName] === key; + }); + if (typeof index !== 'undefined' && index !== -1) unref(propsRef).dataSource?.splice(index, 1); + } + setPagination({ + total: unref(propsRef).dataSource?.length, + }); + } + + function insertTableDataRecord(record: Recordable, index: number): Recordable | undefined { + //【issues/136】同步Vben:BasicTable 调用插入函数异常插入两条记录] + // if (!dataSourceRef.value || dataSourceRef.value.length == 0) return; + index = index ?? dataSourceRef.value?.length; + unref(dataSourceRef).splice(index, 0, record); + return unref(dataSourceRef); + } + function findTableDataRecord(rowKey: string | number) { + if (!dataSourceRef.value || dataSourceRef.value.length == 0) return; + + const rowKeyName = unref(getRowKey); + if (!rowKeyName) return; + + const { childrenColumnName = 'children' } = unref(propsRef); + + const findRow = (array: any[]) => { + let ret; + array.some(function iter(r) { + if (typeof rowKeyName === 'function') { + if ((rowKeyName(r) as string) === rowKey) { + ret = r; + return true; + } + } else { + if (Reflect.has(r, rowKeyName) && r[rowKeyName] === rowKey) { + ret = r; + return true; + } + } + return r[childrenColumnName] && r[childrenColumnName].some(iter); + }); + return ret; + }; + + // const row = dataSourceRef.value.find(r => { + // if (typeof rowKeyName === 'function') { + // return (rowKeyName(r) as string) === rowKey + // } else { + // return Reflect.has(r, rowKeyName) && r[rowKeyName] === rowKey + // } + // }) + return findRow(dataSourceRef.value); + } + + async function fetch(opt?: FetchParams) { + const { api, searchInfo, defSort, fetchSetting, beforeFetch, afterFetch, useSearchForm, pagination } = unref(propsRef); + if (!api || !isFunction(api)) return; + try { + setLoading(true); + const { pageField, sizeField, listField, totalField } = Object.assign({}, FETCH_SETTING, fetchSetting); + let pageParams: Recordable = {}; + + const { current = 1, pageSize = PAGE_SIZE } = unref(getPaginationInfo) as PaginationProps; + + if ((isBoolean(pagination) && !pagination) || isBoolean(getPaginationInfo)) { + pageParams = {}; + } else { + pageParams[pageField] = (opt && opt.page) || current; + pageParams[sizeField] = pageSize; + } + + const { sortInfo = {}, filterInfo } = searchState; + + let params: Recordable = { + ...pageParams, + // 由于 getFieldsValue 返回的不是逗号分割的数据,所以改用 validate + ...(useSearchForm ? await validate() : {}), + ...searchInfo, + ...defSort, + ...(opt?.searchInfo ?? {}), + ...sortInfo, + ...filterInfo, + ...(opt?.sortInfo ?? {}), + ...(opt?.filterInfo ?? {}), + }; + if (beforeFetch && isFunction(beforeFetch)) { + params = (await beforeFetch(params)) || params; + } + + const res = await api(params); + rawDataSourceRef.value = res; + + const isArrayResult = Array.isArray(res); + + let resultItems: Recordable[] = isArrayResult ? res : get(res, listField); + const resultTotal: number = isArrayResult ? 0 : get(res, totalField); + + // 假如数据变少,导致总页数变少并小于当前选中页码,通过getPaginationRef获取到的页码是不正确的,需获取正确的页码再次执行 + if (resultTotal) { + const currentTotalPage = Math.ceil(Number(resultTotal) / pageSize); + if (current > currentTotalPage) { + setPagination({ + current: currentTotalPage, + }); + return await fetch(opt); + } + } + + if (afterFetch && isFunction(afterFetch)) { + resultItems = (await afterFetch(resultItems)) || resultItems; + } + dataSourceRef.value = resultItems; + setPagination({ + total: Number(resultTotal) || 0, + }); + if (opt && opt.page) { + setPagination({ + current: opt.page || 1, + }); + } + emit('fetch-success', { + items: unref(resultItems), + total: Number(resultTotal), + }); + return resultItems; + } catch (error) { + emit('fetch-error', error); + dataSourceRef.value = []; + setPagination({ + total: 0, + }); + } finally { + setLoading(false); + } + } + + function setTableData(values: T[]) { + dataSourceRef.value = values; + } + + function getDataSource() { + return getDataSourceRef.value as T[]; + } + + function getRawDataSource() { + return rawDataSourceRef.value as T; + } + + async function reload(opt?: FetchParams) { + return await fetch(opt); + } + + onMounted(() => { + useTimeoutFn(() => { + unref(propsRef).immediate && fetch(); + }, 16); + }); + + return { + getDataSourceRef, + getDataSource, + getRawDataSource, + getRowKey, + setTableData, + getAutoCreateKey, + fetch, + reload, + updateTableData, + updateTableDataRecord, + deleteTableDataRecord, + insertTableDataRecord, + findTableDataRecord, + handleTableChange, + }; +} diff --git a/src/components/Table/src/hooks/useLoading.ts b/src/components/Table/src/hooks/useLoading.ts new file mode 100644 index 0000000..0a670b0 --- /dev/null +++ b/src/components/Table/src/hooks/useLoading.ts @@ -0,0 +1,21 @@ +import { ref, ComputedRef, unref, computed, watch } from 'vue'; +import type { BasicTableProps } from '../types/table'; + +export function useLoading(props: ComputedRef) { + const loadingRef = ref(unref(props).loading); + + watch( + () => unref(props).loading, + (loading) => { + loadingRef.value = loading; + } + ); + + const getLoading = computed(() => unref(loadingRef)); + + function setLoading(loading: boolean) { + loadingRef.value = loading; + } + + return { getLoading, setLoading }; +} diff --git a/src/components/Table/src/hooks/usePagination.tsx b/src/components/Table/src/hooks/usePagination.tsx new file mode 100644 index 0000000..d90eb29 --- /dev/null +++ b/src/components/Table/src/hooks/usePagination.tsx @@ -0,0 +1,85 @@ +import type { PaginationProps } from '../types/pagination'; +import type { BasicTableProps } from '../types/table'; +import { computed, unref, ref, ComputedRef, watch } from 'vue'; +import { LeftOutlined, RightOutlined } from '@ant-design/icons-vue'; +import { isBoolean } from '/@/utils/is'; +import { PAGE_SIZE, PAGE_SIZE_OPTIONS } from '../const'; +import { useI18n } from '/@/hooks/web/useI18n'; + +interface ItemRender { + page: number; + type: 'page' | 'prev' | 'next'; + originalElement: any; +} + +function itemRender({ page, type, originalElement }: ItemRender) { + if (type === 'prev') { + return page === 0 ? null : ; + } else if (type === 'next') { + return page === 1 ? null : ; + } + return originalElement; +} + +export function usePagination(refProps: ComputedRef) { + const { t } = useI18n(); + + const configRef = ref({}); + const show = ref(true); + + watch( + () => unref(refProps).pagination, + (pagination) => { + if (!isBoolean(pagination) && pagination) { + configRef.value = { + ...unref(configRef), + ...(pagination ?? {}), + }; + } + } + ); + + const getPaginationInfo = computed((): PaginationProps | boolean => { + const { pagination } = unref(refProps); + + if (!unref(show) || (isBoolean(pagination) && !pagination)) { + return false; + } + + return { + current: 1, + pageSize: PAGE_SIZE, + size: 'small', + defaultPageSize: PAGE_SIZE, + showTotal: (total) => t('component.table.total', { total }), + showSizeChanger: true, + pageSizeOptions: PAGE_SIZE_OPTIONS, + itemRender: itemRender, + showQuickJumper: true, + ...(isBoolean(pagination) ? {} : pagination), + ...unref(configRef), + }; + }); + + function setPagination(info: Partial) { + const paginationInfo = unref(getPaginationInfo); + configRef.value = { + ...(!isBoolean(paginationInfo) ? paginationInfo : {}), + ...info, + }; + } + + function getPagination() { + return unref(getPaginationInfo); + } + + function getShowPagination() { + return unref(show); + } + + async function setShowPagination(flag: boolean) { + show.value = flag; + } + + return { getPagination, getPaginationInfo, setShowPagination, getShowPagination, setPagination }; +} diff --git a/src/components/Table/src/hooks/useRowSelection.ts b/src/components/Table/src/hooks/useRowSelection.ts new file mode 100644 index 0000000..dc0d2f2 --- /dev/null +++ b/src/components/Table/src/hooks/useRowSelection.ts @@ -0,0 +1,122 @@ +import { isFunction } from '/@/utils/is'; +import type { BasicTableProps, TableRowSelection } from '../types/table'; +import { computed, ComputedRef, nextTick, Ref, ref, toRaw, unref, watch } from 'vue'; +import { ROW_KEY } from '../const'; +import { omit } from 'lodash-es'; +import { findNodeAll } from '/@/utils/helper/treeHelper'; + +export function useRowSelection(propsRef: ComputedRef, tableData: Ref, emit: EmitType) { + const selectedRowKeysRef = ref([]); + const selectedRowRef = ref([]); + + const getRowSelectionRef = computed((): TableRowSelection | null => { + const { rowSelection } = unref(propsRef); + if (!rowSelection) { + return null; + } + + return { + // AntDV3.0 之后使用远程加载数据进行分页时, + // 默认会清空上一页选择的行数据(导致无法跨页选择), + // 将此属性设置为 true 即可解决。 + preserveSelectedRowKeys: true, + selectedRowKeys: unref(selectedRowKeysRef), + onChange: (selectedRowKeys: string[]) => { + setSelectedRowKeys(selectedRowKeys); + }, + ...omit(rowSelection, ['onChange']), + }; + }); + + watch( + () => unref(propsRef).rowSelection?.selectedRowKeys, + (v: string[]) => { + setSelectedRowKeys(v); + } + ); + + watch( + () => unref(selectedRowKeysRef), + () => { + nextTick(() => { + const { rowSelection } = unref(propsRef); + if (rowSelection) { + const { onChange } = rowSelection; + if (onChange && isFunction(onChange)) onChange(getSelectRowKeys(), getSelectRows()); + } + emit('selection-change', { + keys: getSelectRowKeys(), + rows: getSelectRows(), + }); + }); + }, + { deep: true } + ); + + const getAutoCreateKey = computed(() => { + return unref(propsRef).autoCreateKey && !unref(propsRef).rowKey; + }); + + const getRowKey = computed(() => { + const { rowKey } = unref(propsRef); + return unref(getAutoCreateKey) ? ROW_KEY : rowKey; + }); + + function setSelectedRowKeys(rowKeys: string[]) { + selectedRowKeysRef.value = rowKeys; + const allSelectedRows = findNodeAll( + toRaw(unref(tableData)).concat(toRaw(unref(selectedRowRef))), + (item) => rowKeys.includes(item[unref(getRowKey) as string]), + { + children: propsRef.value.childrenColumnName ?? 'children', + } + ); + const trueSelectedRows: any[] = []; + rowKeys.forEach((key: string) => { + const found = allSelectedRows.find((item) => item[unref(getRowKey) as string] === key); + found && trueSelectedRows.push(found); + }); + selectedRowRef.value = trueSelectedRows; + } + + function setSelectedRows(rows: Recordable[]) { + selectedRowRef.value = rows; + } + + function clearSelectedRowKeys() { + selectedRowRef.value = []; + selectedRowKeysRef.value = []; + } + + function deleteSelectRowByKey(key: string) { + const selectedRowKeys = unref(selectedRowKeysRef); + const index = selectedRowKeys.findIndex((item) => item === key); + if (index !== -1) { + unref(selectedRowKeysRef).splice(index, 1); + } + } + + function getSelectRowKeys() { + return unref(selectedRowKeysRef); + } + + function getSelectRows() { + // const ret = toRaw(unref(selectedRowRef)).map((item) => toRaw(item)); + return unref(selectedRowRef) as T[]; + } + + function getRowSelection() { + return unref(getRowSelectionRef)!; + } + + return { + getRowSelection, + getRowSelectionRef, + getSelectRows, + getSelectRowKeys, + setSelectedRowKeys, + clearSelectedRowKeys, + deleteSelectRowByKey, + setSelectedRows, + }; +} diff --git a/src/components/Table/src/hooks/useTable.ts b/src/components/Table/src/hooks/useTable.ts new file mode 100644 index 0000000..40575a3 --- /dev/null +++ b/src/components/Table/src/hooks/useTable.ts @@ -0,0 +1,168 @@ +import type { BasicTableProps, TableActionType, FetchParams, BasicColumn } from '../types/table'; +import type { PaginationProps } from '../types/pagination'; +import type { DynamicProps } from '/#/utils'; +import type { FormActionType } from '/@/components/Form'; +import type { WatchStopHandle } from 'vue'; +import { getDynamicProps } from '/@/utils'; +import { ref, onUnmounted, unref, watch, toRaw } from 'vue'; +import { isProdMode } from '/@/utils/env'; +import { error } from '/@/utils/log'; + +type Props = Partial>; + +type UseTableMethod = TableActionType & { + getForm: () => FormActionType; +}; + +export function useTable(tableProps?: Props): [ + (instance: TableActionType, formInstance: UseTableMethod) => void, + TableActionType & { + getForm: () => FormActionType; + } +] { + const tableRef = ref>(null); + const loadedRef = ref>(false); + const formRef = ref>(null); + + let stopWatch: WatchStopHandle; + + function register(instance: TableActionType, formInstance: UseTableMethod) { + isProdMode() && + onUnmounted(() => { + tableRef.value = null; + loadedRef.value = null; + }); + + if (unref(loadedRef) && isProdMode() && instance === unref(tableRef)) return; + + tableRef.value = instance; + formRef.value = formInstance; + tableProps && instance.setProps(getDynamicProps(tableProps)); + loadedRef.value = true; + + stopWatch?.(); + + stopWatch = watch( + () => tableProps, + () => { + tableProps && instance.setProps(getDynamicProps(tableProps)); + }, + { + immediate: true, + deep: true, + } + ); + } + + function getTableInstance(): TableActionType { + const table = unref(tableRef); + if (!table) { + error('The table instance has not been obtained yet, please make sure the table is presented when performing the table operation!'); + } + return table as TableActionType; + } + + function getTableRef(){ + return tableRef; + } + + const methods: TableActionType & { + getForm: () => FormActionType; + } & { + getTableRef: () => any; + } = { + reload: async (opt?: FetchParams) => { + return await getTableInstance().reload(opt); + }, + setProps: (props: Partial) => { + getTableInstance().setProps(props); + }, + redoHeight: () => { + getTableInstance().redoHeight(); + }, + setLoading: (loading: boolean) => { + getTableInstance().setLoading(loading); + }, + getDataSource: () => { + return getTableInstance().getDataSource(); + }, + getRawDataSource: () => { + return getTableInstance().getRawDataSource(); + }, + getColumns: ({ ignoreIndex = false }: { ignoreIndex?: boolean } = {}) => { + const columns = getTableInstance().getColumns({ ignoreIndex }) || []; + return toRaw(columns); + }, + setColumns: (columns: BasicColumn[]) => { + getTableInstance().setColumns(columns); + }, + setTableData: (values: any[]) => { + return getTableInstance().setTableData(values); + }, + setPagination: (info: Partial) => { + return getTableInstance().setPagination(info); + }, + deleteSelectRowByKey: (key: string) => { + getTableInstance().deleteSelectRowByKey(key); + }, + getSelectRowKeys: () => { + return toRaw(getTableInstance().getSelectRowKeys()); + }, + getSelectRows: () => { + return toRaw(getTableInstance().getSelectRows()); + }, + clearSelectedRowKeys: () => { + getTableInstance().clearSelectedRowKeys(); + }, + setSelectedRowKeys: (keys: string[] | number[]) => { + getTableInstance().setSelectedRowKeys(keys); + }, + getPaginationRef: () => { + return getTableInstance().getPaginationRef(); + }, + getSize: () => { + return toRaw(getTableInstance().getSize()); + }, + updateTableData: (index: number, key: string, value: any) => { + return getTableInstance().updateTableData(index, key, value); + }, + deleteTableDataRecord: (rowKey: string | number | string[] | number[]) => { + return getTableInstance().deleteTableDataRecord(rowKey); + }, + insertTableDataRecord: (record: Recordable | Recordable[], index?: number) => { + return getTableInstance().insertTableDataRecord(record, index); + }, + updateTableDataRecord: (rowKey: string | number, record: Recordable) => { + return getTableInstance().updateTableDataRecord(rowKey, record); + }, + findTableDataRecord: (rowKey: string | number) => { + return getTableInstance().findTableDataRecord(rowKey); + }, + getRowSelection: () => { + return toRaw(getTableInstance().getRowSelection()); + }, + getCacheColumns: () => { + return toRaw(getTableInstance().getCacheColumns()); + }, + getForm: () => { + return unref(formRef) as unknown as FormActionType; + }, + setShowPagination: async (show: boolean) => { + getTableInstance().setShowPagination(show); + }, + getShowPagination: () => { + return toRaw(getTableInstance().getShowPagination()); + }, + expandAll: () => { + getTableInstance().expandAll(); + }, + collapseAll: () => { + getTableInstance().collapseAll(); + }, + getTableRef: () => { + return getTableRef(); + } + }; + + return [register, methods]; +} diff --git a/src/components/Table/src/hooks/useTableContext.ts b/src/components/Table/src/hooks/useTableContext.ts new file mode 100644 index 0000000..b657bb2 --- /dev/null +++ b/src/components/Table/src/hooks/useTableContext.ts @@ -0,0 +1,22 @@ +import type { Ref } from 'vue'; +import type { BasicTableProps, TableActionType } from '../types/table'; +import { provide, inject, ComputedRef } from 'vue'; + +const key = Symbol('basic-table'); + +type Instance = TableActionType & { + wrapRef: Ref>; + getBindValues: ComputedRef; +}; + +type RetInstance = Omit & { + getBindValues: ComputedRef; +}; + +export function createTableContext(instance: Instance) { + provide(key, instance); +} + +export function useTableContext(): RetInstance { + return inject(key) as RetInstance; +} diff --git a/src/components/Table/src/hooks/useTableExpand.ts b/src/components/Table/src/hooks/useTableExpand.ts new file mode 100644 index 0000000..8008690 --- /dev/null +++ b/src/components/Table/src/hooks/useTableExpand.ts @@ -0,0 +1,54 @@ +import type { ComputedRef, Ref } from 'vue'; +import type { BasicTableProps } from '../types/table'; +import { computed, unref, ref, toRaw } from 'vue'; +import { ROW_KEY } from '../const'; + +export function useTableExpand(propsRef: ComputedRef, tableData: Ref, emit: EmitType) { + const expandedRowKeys = ref([]); + + const getAutoCreateKey = computed(() => { + return unref(propsRef).autoCreateKey && !unref(propsRef).rowKey; + }); + + const getRowKey = computed(() => { + const { rowKey } = unref(propsRef); + return unref(getAutoCreateKey) ? ROW_KEY : rowKey; + }); + + const getExpandOption = computed(() => { + const { isTreeTable } = unref(propsRef); + if (!isTreeTable) return {}; + + return { + expandedRowKeys: unref(expandedRowKeys), + onExpandedRowsChange: (keys: string[]) => { + expandedRowKeys.value = keys; + emit('expanded-rows-change', keys); + }, + }; + }); + + function expandAll() { + const keys = getAllKeys(); + expandedRowKeys.value = keys; + } + + function getAllKeys(data?: Recordable[]) { + const keys: string[] = []; + const { childrenColumnName } = unref(propsRef); + toRaw(data || unref(tableData)).forEach((item) => { + keys.push(item[unref(getRowKey) as string]); + const children = item[childrenColumnName || 'children']; + if (children?.length) { + keys.push(...getAllKeys(children)); + } + }); + return keys; + } + + function collapseAll() { + expandedRowKeys.value = []; + } + + return { getExpandOption, expandAll, collapseAll }; +} diff --git a/src/components/Table/src/hooks/useTableFooter.ts b/src/components/Table/src/hooks/useTableFooter.ts new file mode 100644 index 0000000..bc1f32f --- /dev/null +++ b/src/components/Table/src/hooks/useTableFooter.ts @@ -0,0 +1,52 @@ +import type { ComputedRef, Ref } from 'vue'; +import type { BasicTableProps } from '../types/table'; +import { unref, computed, h, nextTick, watchEffect } from 'vue'; +import TableFooter from '../components/TableFooter.vue'; +import { useEventListener } from '/@/hooks/event/useEventListener'; + +export function useTableFooter( + propsRef: ComputedRef, + scrollRef: ComputedRef<{ + x: string | number | true; + y: Nullable; + scrollToFirstRowOnChange: boolean; + }>, + tableElRef: Ref, + getDataSourceRef: ComputedRef +) { + const getIsEmptyData = computed(() => { + return (unref(getDataSourceRef) || []).length === 0; + }); + + const getFooterProps = computed((): Recordable | undefined => { + const { summaryFunc, showSummary, summaryData } = unref(propsRef); + return showSummary && !unref(getIsEmptyData) ? () => h(TableFooter, { summaryFunc, summaryData, scroll: unref(scrollRef) }) : undefined; + }); + + watchEffect(() => { + handleSummary(); + }); + + function handleSummary() { + const { showSummary } = unref(propsRef); + if (!showSummary || unref(getIsEmptyData)) return; + + nextTick(() => { + const tableEl = unref(tableElRef); + if (!tableEl) return; + const bodyDom = tableEl.$el.querySelector('.ant-table-content'); + useEventListener({ + el: bodyDom, + name: 'scroll', + listener: () => { + const footerBodyDom = tableEl.$el.querySelector('.ant-table-footer .ant-table-content') as HTMLDivElement; + if (!footerBodyDom || !bodyDom) return; + footerBodyDom.scrollLeft = bodyDom.scrollLeft; + }, + wait: 0, + options: true, + }); + }); + } + return { getFooterProps }; +} diff --git a/src/components/Table/src/hooks/useTableForm.ts b/src/components/Table/src/hooks/useTableForm.ts new file mode 100644 index 0000000..a2a215d --- /dev/null +++ b/src/components/Table/src/hooks/useTableForm.ts @@ -0,0 +1,49 @@ +import type { ComputedRef, Slots } from 'vue'; +import type { BasicTableProps, FetchParams } from '../types/table'; +import { unref, computed } from 'vue'; +import type { FormProps } from '/@/components/Form'; +import { isFunction } from '/@/utils/is'; + +export function useTableForm( + propsRef: ComputedRef, + slots: Slots, + fetch: (opt?: FetchParams | undefined) => Promise, + getLoading: ComputedRef +) { + const getFormProps = computed((): Partial => { + const { formConfig } = unref(propsRef); + const { submitButtonOptions } = formConfig || {}; + return { + showAdvancedButton: true, + ...formConfig, + submitButtonOptions: { loading: unref(getLoading), ...submitButtonOptions }, + compact: true, + autoSubmitOnEnter: true, + }; + }); + + const getFormSlotKeys: ComputedRef = computed(() => { + const keys = Object.keys(slots); + return keys.map((item) => (item.startsWith('form-') ? item : null)).filter((item) => !!item) as string[]; + }); + + function replaceFormSlotKey(key: string) { + if (!key) return ''; + return key?.replace?.(/form\-/, '') ?? ''; + } + + function handleSearchInfoChange(info: Recordable) { + const { handleSearchInfoFn } = unref(propsRef); + if (handleSearchInfoFn && isFunction(handleSearchInfoFn)) { + info = handleSearchInfoFn(info) || info; + } + fetch({ searchInfo: info, page: 1 }); + } + + return { + getFormProps, + replaceFormSlotKey, + getFormSlotKeys, + handleSearchInfoChange, + }; +} diff --git a/src/components/Table/src/hooks/useTableHeader.ts b/src/components/Table/src/hooks/useTableHeader.ts new file mode 100644 index 0000000..597b5ec --- /dev/null +++ b/src/components/Table/src/hooks/useTableHeader.ts @@ -0,0 +1,58 @@ +import type { ComputedRef, Slots } from 'vue'; +import type { BasicTableProps, InnerHandlers } from '../types/table'; +import { unref, computed, h } from 'vue'; +import TableHeader from '../components/TableHeader.vue'; +import { isString } from '/@/utils/is'; +import { getSlot } from '/@/utils/helper/tsxHelper'; + +export function useTableHeader(propsRef: ComputedRef, slots: Slots, handlers: InnerHandlers) { + const getHeaderProps = computed((): Recordable => { + const { title, showTableSetting, titleHelpMessage, tableSetting } = unref(propsRef); + const hideTitle = !slots.tableTitle && !title && !slots.toolbar && !showTableSetting; + if (hideTitle && !isString(title)) { + return {}; + } + + return { + title: hideTitle + ? null + : () => + h( + TableHeader, + { + title, + titleHelpMessage, + showTableSetting, + tableSetting, + onColumnsChange: handlers.onColumnsChange, + } as Recordable, + { + ...(slots.toolbar + ? { + toolbar: () => getSlot(slots, 'toolbar'), + } + : {}), + ...(slots.tableTitle + ? { + tableTitle: () => getSlot(slots, 'tableTitle'), + } + : {}), + ...(slots.headerTop + ? { + headerTop: () => getSlot(slots, 'headerTop'), + } + : {}), + //添加tableTop插槽 + ...(slots.tableTop + ? { + tableTop: () => getSlot(slots, 'tableTop'), + } + : {}), + // 添加alertAfter插槽 + ...(slots.alertAfter ? { alertAfter: () => getSlot(slots, 'alertAfter') } : {}), + } + ), + }; + }); + return { getHeaderProps }; +} diff --git a/src/components/Table/src/hooks/useTableScroll.ts b/src/components/Table/src/hooks/useTableScroll.ts new file mode 100644 index 0000000..d9bb192 --- /dev/null +++ b/src/components/Table/src/hooks/useTableScroll.ts @@ -0,0 +1,188 @@ +import type { BasicTableProps, TableRowSelection, BasicColumn } from '../types/table'; +import type { Ref, ComputedRef } from 'vue'; +import { computed, unref, ref, nextTick, watch } from 'vue'; +import { getViewportOffset } from '/@/utils/domUtils'; +import { isBoolean } from '/@/utils/is'; +import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn'; +import { useModalContext } from '/@/components/Modal'; +import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated'; +import { useDebounceFn } from '@vueuse/core'; + +export function useTableScroll( + propsRef: ComputedRef, + tableElRef: Ref, + columnsRef: ComputedRef, + rowSelectionRef: ComputedRef | null>, + getDataSourceRef: ComputedRef +) { + const tableHeightRef: Ref> = ref(null); + + const modalFn = useModalContext(); + + // Greater than animation time 280 + const debounceRedoHeight = useDebounceFn(redoHeight, 100); + + const getCanResize = computed(() => { + const { canResize, scroll } = unref(propsRef); + return canResize && !(scroll || {}).y; + }); + + watch( + () => [unref(getCanResize), unref(getDataSourceRef)?.length], + () => { + debounceRedoHeight(); + }, + { + flush: 'post', + } + ); + + function redoHeight() { + nextTick(() => { + calcTableHeight(); + }); + } + + function setHeight(heigh: number) { + tableHeightRef.value = heigh; + // Solve the problem of modal adaptive height calculation when the form is placed in the modal + modalFn?.redoModalHeight?.(); + } + + // No need to repeat queries + let paginationEl: HTMLElement | null; + let footerEl: HTMLElement | null; + let bodyEl: HTMLElement | null; + + async function calcTableHeight() { + const { resizeHeightOffset, pagination, maxHeight, minHeight } = unref(propsRef); + const tableData = unref(getDataSourceRef); + + const table = unref(tableElRef); + if (!table) return; + + const tableEl: Element = table.$el; + if (!tableEl) return; + + if (!bodyEl) { + //update-begin-author:taoyan date:2023-2-11 for: issues/355 前端-jeecgboot-vue3 3.4.4版本,BasicTable高度自适应功能失效,设置BasicTable组件maxHeight失效; 原因已找到,请看详情 + bodyEl = tableEl.querySelector('.ant-table-tbody'); + //update-end-author:taoyan date:2023-2-11 for: issues/355 前端-jeecgboot-vue3 3.4.4版本,BasicTable高度自适应功能失效,设置BasicTable组件maxHeight失效; 原因已找到,请看详情 + if (!bodyEl) return; + } + + const hasScrollBarY = bodyEl.scrollHeight > bodyEl.clientHeight; + const hasScrollBarX = bodyEl.scrollWidth > bodyEl.clientWidth; + + if (hasScrollBarY) { + tableEl.classList.contains('hide-scrollbar-y') && tableEl.classList.remove('hide-scrollbar-y'); + } else { + !tableEl.classList.contains('hide-scrollbar-y') && tableEl.classList.add('hide-scrollbar-y'); + } + + if (hasScrollBarX) { + tableEl.classList.contains('hide-scrollbar-x') && tableEl.classList.remove('hide-scrollbar-x'); + } else { + !tableEl.classList.contains('hide-scrollbar-x') && tableEl.classList.add('hide-scrollbar-x'); + } + + bodyEl!.style.height = 'unset'; + + if (!unref(getCanResize) || tableData.length === 0) return; + + await nextTick(); + //Add a delay to get the correct bottomIncludeBody paginationHeight footerHeight headerHeight + + const headEl = tableEl.querySelector('.ant-table-thead'); + + if (!headEl) return; + + // Table height from bottom + const { bottomIncludeBody } = getViewportOffset(headEl); + // Table height from bottom height-custom offset + + const paddingHeight = 32; + // Pager height + let paginationHeight = 2; + if (!isBoolean(pagination)) { + paginationEl = tableEl.querySelector('.ant-pagination') as HTMLElement; + if (paginationEl) { + const offsetHeight = paginationEl.offsetHeight; + paginationHeight += offsetHeight || 0; + } else { + // TODO First fix 24 + paginationHeight += 24; + } + } else { + paginationHeight = -8; + } + + let footerHeight = 0; + if (!isBoolean(pagination)) { + if (!footerEl) { + footerEl = tableEl.querySelector('.ant-table-footer') as HTMLElement; + } else { + const offsetHeight = footerEl.offsetHeight; + footerHeight += offsetHeight || 0; + } + } + + let headerHeight = 0; + if (headEl) { + headerHeight = (headEl as HTMLElement).offsetHeight; + } + + let height = bottomIncludeBody - (resizeHeightOffset || 0) - paddingHeight - paginationHeight - footerHeight - headerHeight; + + height = (height < minHeight! ? (minHeight as number) : height) ?? height; + height = (height > maxHeight! ? (maxHeight as number) : height) ?? height; + setHeight(height); + + bodyEl!.style.height = `${height}px`; + } + useWindowSizeFn(calcTableHeight, 280); + onMountedOrActivated(() => { + calcTableHeight(); + nextTick(() => { + debounceRedoHeight(); + }); + }); + + const getScrollX = computed(() => { + let width = 0; + if (unref(rowSelectionRef)) { + width += 60; + } + + // TODO props ?? 0; + const NORMAL_WIDTH = 150; + + const columns = unref(columnsRef).filter((item) => !item.defaultHidden); + columns.forEach((item) => { + width += Number.parseInt(item.width as string) || 0; + }); + const unsetWidthColumns = columns.filter((item) => !Reflect.has(item, 'width')); + + const len = unsetWidthColumns.length; + if (len !== 0) { + width += len * NORMAL_WIDTH; + } + + const table = unref(tableElRef); + const tableWidth = table?.$el?.offsetWidth ?? 0; + return tableWidth > width ? '100%' : width; + }); + + const getScrollRef = computed(() => { + const tableHeight = unref(tableHeightRef); + const { canResize, scroll } = unref(propsRef); + return { + x: unref(getScrollX), + y: canResize ? tableHeight : null, + scrollToFirstRowOnChange: false, + ...scroll, + }; + }); + + return { getScrollRef, redoHeight }; +} diff --git a/src/components/Table/src/hooks/useTableStyle.ts b/src/components/Table/src/hooks/useTableStyle.ts new file mode 100644 index 0000000..292187d --- /dev/null +++ b/src/components/Table/src/hooks/useTableStyle.ts @@ -0,0 +1,20 @@ +import type { ComputedRef } from 'vue'; +import type { BasicTableProps, TableCustomRecord } from '../types/table'; +import { unref } from 'vue'; +import { isFunction } from '/@/utils/is'; + +export function useTableStyle(propsRef: ComputedRef, prefixCls: string) { + function getRowClassName(record: TableCustomRecord, index: number) { + const { striped, rowClassName } = unref(propsRef); + const classNames: string[] = []; + if (striped) { + classNames.push((index || 0) % 2 === 1 ? `${prefixCls}-row__striped` : ''); + } + if (rowClassName && isFunction(rowClassName)) { + classNames.push(rowClassName(record, index)); + } + return classNames.filter((cls) => !!cls).join(' '); + } + + return { getRowClassName }; +} diff --git a/src/components/Table/src/props.ts b/src/components/Table/src/props.ts new file mode 100644 index 0000000..2d409fc --- /dev/null +++ b/src/components/Table/src/props.ts @@ -0,0 +1,139 @@ +import type { PropType } from 'vue'; +import type { PaginationProps } from './types/pagination'; +import type { BasicColumn, FetchSetting, TableSetting, SorterResult, TableCustomRecord, TableRowSelection, SizeType } from './types/table'; +import type { FormProps } from '/@/components/Form'; +import { DEFAULT_FILTER_FN, DEFAULT_SORT_FN, FETCH_SETTING, DEFAULT_SIZE } from './const'; +import { propTypes } from '/@/utils/propTypes'; + +export const basicProps = { + clickToRowSelect: propTypes.bool.def(true), + isTreeTable: propTypes.bool.def(false), + tableSetting: propTypes.shape({}), + inset: propTypes.bool, + sortFn: { + type: Function as PropType<(sortInfo: SorterResult) => any>, + default: DEFAULT_SORT_FN, + }, + filterFn: { + type: Function as PropType<(data: Partial>) => any>, + default: DEFAULT_FILTER_FN, + }, + showTableSetting: propTypes.bool, + autoCreateKey: propTypes.bool.def(true), + striped: propTypes.bool.def(false), + showSummary: propTypes.bool, + summaryFunc: { + type: [Function, Array] as PropType<(...arg: any[]) => any[]>, + default: null, + }, + summaryData: { + type: Array as PropType, + default: null, + }, + indentSize: propTypes.number.def(24), + canColDrag: propTypes.bool.def(true), + api: { + type: Function as PropType<(...arg: any[]) => Promise>, + default: null, + }, + beforeFetch: { + type: Function as PropType, + default: null, + }, + afterFetch: { + type: Function as PropType, + default: null, + }, + handleSearchInfoFn: { + type: Function as PropType, + default: null, + }, + fetchSetting: { + type: Object as PropType, + default: () => { + return FETCH_SETTING; + }, + }, + // 立即请求接口 + immediate: propTypes.bool.def(true), + emptyDataIsShowTable: propTypes.bool.def(true), + // 额外的请求参数 + searchInfo: { + type: Object as PropType, + default: null, + }, + // 默认的排序参数 + defSort: { + type: Object as PropType, + default: null, + }, + // 使用搜索表单 + useSearchForm: propTypes.bool, + // 表单配置 + formConfig: { + type: Object as PropType>, + default: null, + }, + columns: { + type: [Array] as PropType, + default: () => [], + }, + showIndexColumn: propTypes.bool.def(true), + indexColumnProps: { + type: Object as PropType, + default: null, + }, + showActionColumn: { + type: Boolean, + default: true, + }, + actionColumn: { + type: Object as PropType, + default: null, + }, + ellipsis: propTypes.bool.def(true), + canResize: propTypes.bool.def(true), + clearSelectOnPageChange: propTypes.bool, + resizeHeightOffset: propTypes.number.def(0), + rowSelection: { + type: Object as PropType, + default: null, + }, + title: { + type: [String, Function] as PropType string)>, + default: null, + }, + titleHelpMessage: { + type: [String, Array] as PropType, + }, + minHeight: propTypes.number, + maxHeight: propTypes.number, + dataSource: { + type: Array as PropType, + default: null, + }, + rowKey: { + type: [String, Function] as PropType string)>, + default: '', + }, + bordered: propTypes.bool, + pagination: { + type: [Object, Boolean] as PropType, + default: null, + }, + loading: propTypes.bool, + rowClassName: { + type: Function as PropType<(record: TableCustomRecord, index: number) => string>, + }, + scroll: { + type: Object as PropType<{ x: number | true; y: number }>, + default: null, + }, + beforeEditSubmit: { + type: Function as PropType<(data: { record: Recordable; index: number; key: string | number; value: any }) => Promise>, + }, + size: { + type: String as PropType, + default: DEFAULT_SIZE, + }, +}; diff --git a/src/components/Table/src/types/column.ts b/src/components/Table/src/types/column.ts new file mode 100644 index 0000000..437e4c2 --- /dev/null +++ b/src/components/Table/src/types/column.ts @@ -0,0 +1,195 @@ +import { VNodeChild } from 'vue'; + +export interface ColumnFilterItem { + text?: string; + value?: string; + children?: any; +} + +export declare type SortOrder = 'ascend' | 'descend'; + +export interface RecordProps { + text: any; + record: T; + index: number; +} + +export interface FilterDropdownProps { + prefixCls?: string; + setSelectedKeys?: (selectedKeys: string[]) => void; + selectedKeys?: string[]; + confirm?: () => void; + clearFilters?: () => void; + filters?: ColumnFilterItem[]; + getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement; + visible?: boolean; +} + +export declare type CustomRenderFunction = (record: RecordProps) => VNodeChild | JSX.Element; + +export interface ColumnProps { + /** + * specify how content is aligned + * @default 'left' + * @type string + */ + align?: 'left' | 'right' | 'center'; + + /** + * ellipsize cell content, not working with sorter and filters for now. + * tableLayout would be fixed when ellipsis is true. + * @default false + * @type boolean + */ + ellipsis?: boolean; + + /** + * Span of this column's title + * @type number + */ + colSpan?: number; + + /** + * Display field of the data record, could be set like a.b.c + * @type string + */ + dataIndex?: string; + + /** + * Default filtered values + * @type string[] + */ + defaultFilteredValue?: string[]; + + /** + * Default order of sorted values: 'ascend' 'descend' null + * @type string + */ + defaultSortOrder?: SortOrder; + + /** + * Customized filter overlay + * @type any (slot) + */ + filterDropdown?: VNodeChild | JSX.Element | ((props: FilterDropdownProps) => VNodeChild | JSX.Element); + + /** + * Whether filterDropdown is visible + * @type boolean + */ + filterDropdownVisible?: boolean; + + /** + * Whether the dataSource is filtered + * @default false + * @type boolean + */ + filtered?: boolean; + + /** + * Controlled filtered value, filter icon will highlight + * @type string[] + */ + filteredValue?: string[]; + + /** + * Customized filter icon + * @default false + * @type any + */ + filterIcon?: boolean | VNodeChild | JSX.Element; + + /** + * Whether multiple filters can be selected + * @default true + * @type boolean + */ + filterMultiple?: boolean; + + /** + * Filter menu config + * @type object[] + */ + filters?: ColumnFilterItem[]; + + /** + * Set column to be fixed: true(same as left) 'left' 'right' + * @default false + * @type boolean | string + */ + fixed?: boolean | 'left' | 'right'; + + /** + * Unique key of this column, you can ignore this prop if you've set a unique dataIndex + * @type string + */ + key?: string; + + /** + * Renderer of the table cell. The return value should be a VNode, or an object for colSpan/rowSpan config + * @type Function | ScopedSlot + */ + customRender?: CustomRenderFunction | VNodeChild | JSX.Element; + + /** + * Sort function for local sort, see Array.sort's compareFunction. If you need sort buttons only, set to true + * @type boolean | Function + */ + sorter?: boolean | Function; + + /** + * Order of sorted values: 'ascend' 'descend' false + * @type boolean | string + */ + sortOrder?: boolean | SortOrder; + + /** + * supported sort way, could be 'ascend', 'descend' + * @default ['ascend', 'descend'] + * @type string[] + */ + sortDirections?: SortOrder[]; + + /** + * Title of this column + * @type any (string | slot) + */ + title?: VNodeChild | JSX.Element; + + /** + * Width of this column + * @type string | number + */ + width?: string | number; + + /** + * Set props on per cell + * @type Function + */ + customCell?: (record: T, rowIndex: number) => object; + + /** + * Set props on per header cell + * @type object + */ + customHeaderCell?: (column: ColumnProps) => object; + + /** + * Callback executed when the confirm filter button is clicked, Use as a filter event when using template or jsx + * @type Function + */ + onFilter?: (value: any, record: T) => boolean; + + /** + * Callback executed when filterDropdownVisible is changed, Use as a filterDropdownVisible event when using template or jsx + * @type Function + */ + onFilterDropdownVisibleChange?: (visible: boolean) => void; + + /** + * When using columns, you can setting this property to configure the properties that support the slot, + * such as slots: { filterIcon: 'XXX'} + * @type object + */ + slots?: Recordable; +} diff --git a/src/components/Table/src/types/componentType.ts b/src/components/Table/src/types/componentType.ts new file mode 100644 index 0000000..6e66af6 --- /dev/null +++ b/src/components/Table/src/types/componentType.ts @@ -0,0 +1 @@ +export type ComponentType = 'Input' | 'InputNumber' | 'Select' | 'ApiSelect' | 'ApiTreeSelect' | 'Checkbox' | 'Switch' | 'DatePicker' | 'TimePicker'; diff --git a/src/components/Table/src/types/pagination.ts b/src/components/Table/src/types/pagination.ts new file mode 100644 index 0000000..fd2ecbe --- /dev/null +++ b/src/components/Table/src/types/pagination.ts @@ -0,0 +1,99 @@ +import Pagination from 'ant-design-vue/lib/pagination'; +import { VNodeChild } from 'vue'; + +interface PaginationRenderProps { + page: number; + type: 'page' | 'prev' | 'next'; + originalElement: any; +} + +export declare class PaginationConfig extends Pagination { + position?: 'top' | 'bottom' | 'both'; +} +export interface PaginationProps { + /** + * total number of data items + * @default 0 + * @type number + */ + total?: number; + + /** + * default initial page number + * @default 1 + * @type number + */ + defaultCurrent?: number; + + /** + * current page number + * @type number + */ + current?: number; + + /** + * default number of data items per page + * @default 10 + * @type number + */ + defaultPageSize?: number; + + /** + * number of data items per page + * @type number + */ + pageSize?: number; + + /** + * Whether to hide pager on single page + * @default false + * @type boolean + */ + hideOnSinglePage?: boolean; + + /** + * determine whether pageSize can be changed + * @default false + * @type boolean + */ + showSizeChanger?: boolean; + + /** + * specify the sizeChanger options + * @default ['10', '20', '30', '40'] + * @type string[] + */ + pageSizeOptions?: string[]; + + /** + * determine whether you can jump to pages directly + * @default false + * @type boolean + */ + showQuickJumper?: boolean | object; + + /** + * to display the total number and range + * @type Function + */ + showTotal?: (total: number, range: [number, number]) => any; + + /** + * specify the size of Pagination, can be set to small + * @default '' + * @type string + */ + size?: string; + + /** + * whether to setting simple mode + * @type boolean + */ + simple?: boolean; + + /** + * to customize item innerHTML + * @type Function + */ + itemRender?: (props: PaginationRenderProps) => VNodeChild | JSX.Element; +} diff --git a/src/components/Table/src/types/table.ts b/src/components/Table/src/types/table.ts new file mode 100644 index 0000000..7193f04 --- /dev/null +++ b/src/components/Table/src/types/table.ts @@ -0,0 +1,462 @@ +import type { VNodeChild } from 'vue'; +import type { PaginationProps } from './pagination'; +import type { FormProps } from '/@/components/Form'; +import type { TableRowSelection as ITableRowSelection } from 'ant-design-vue/lib/table/interface'; +import type { ColumnProps } from 'ant-design-vue/lib/table'; + +import { ComponentType } from './componentType'; +import { VueNode } from '/@/utils/propTypes'; +import { RoleEnum } from '/@/enums/roleEnum'; + +export declare type SortOrder = 'ascend' | 'descend'; + +export interface TableCurrentDataSource { + currentDataSource: T[]; +} + +export interface TableRowSelection extends ITableRowSelection { + /** + * Callback executed when selected rows change + * @type Function + */ + onChange?: (selectedRowKeys: string[] | number[], selectedRows: T[]) => any; + + /** + * Callback executed when select/deselect one row + * @type Function + */ + onSelect?: (record: T, selected: boolean, selectedRows: Object[], nativeEvent: Event) => any; + + /** + * Callback executed when select/deselect all rows + * @type Function + */ + onSelectAll?: (selected: boolean, selectedRows: T[], changeRows: T[]) => any; + + /** + * Callback executed when row selection is inverted + * @type Function + */ + onSelectInvert?: (selectedRows: string[] | number[]) => any; +} + +export interface TableCustomRecord { + record?: T; + index?: number; +} + +export interface ExpandedRowRenderRecord extends TableCustomRecord { + indent?: number; + expanded?: boolean; +} + +export interface ColumnFilterItem { + text?: string; + value?: string; + children?: any; +} + +export interface TableCustomRecord { + record?: T; + index?: number; +} + +export interface SorterResult { + column: ColumnProps; + order: SortOrder; + field: string; + columnKey: string; +} + +export interface FetchParams { + searchInfo?: Recordable; + page?: number; + sortInfo?: Recordable; + filterInfo?: Recordable; +} + +export interface GetColumnsParams { + ignoreIndex?: boolean; + ignoreAction?: boolean; + sort?: boolean; +} + +export type SizeType = 'default' | 'middle' | 'small' | 'large'; + +export interface TableActionType { + reload: (opt?: FetchParams) => Promise; + getSelectRows: () => T[]; + clearSelectedRowKeys: () => void; + expandAll: () => void; + collapseAll: () => void; + getSelectRowKeys: () => string[]; + deleteSelectRowByKey: (key: string) => void; + setPagination: (info: Partial) => void; + setTableData: (values: T[]) => void; + updateTableDataRecord: (rowKey: string | number, record: Recordable) => Recordable | void; + deleteTableDataRecord: (rowKey: string | number | string[] | number[]) => void; + insertTableDataRecord: (record: Recordable, index?: number) => Recordable | void; + findTableDataRecord: (rowKey: string | number) => Recordable | void; + getColumns: (opt?: GetColumnsParams) => BasicColumn[]; + setColumns: (columns: BasicColumn[] | string[]) => void; + getDataSource: () => T[]; + getRawDataSource: () => T; + setLoading: (loading: boolean) => void; + setProps: (props: Partial) => void; + redoHeight: () => void; + setSelectedRowKeys: (rowKeys: string[] | number[]) => void; + getPaginationRef: () => PaginationProps | boolean; + getSize: () => SizeType; + getRowSelection: () => TableRowSelection; + getCacheColumns: () => BasicColumn[]; + emit?: EmitType; + updateTableData: (index: number, key: string, value: any) => Recordable; + setShowPagination: (show: boolean) => Promise; + getShowPagination: () => boolean; + setCacheColumnsByField?: (dataIndex: string | undefined, value: BasicColumn) => void; +} + +export interface FetchSetting { + // 请求接口当前页数 + pageField: string; + // 每页显示多少条 + sizeField: string; + // 请求结果列表字段 支持 a.b.c + listField: string; + // 请求结果总数字段 支持 a.b.c + totalField: string; +} + +export interface TableSetting { + // 是否显示刷新按钮 + redo?: boolean; + // 是否显示尺寸调整按钮 + size?: boolean; + // 是否显示字段调整按钮 + setting?: boolean; + // 缓存“字段调整”配置的key,用于页面上有多个表格需要区分的情况 + cacheKey?: string; + // 是否显示全屏按钮 + fullScreen?: boolean; +} + +export interface BasicTableProps { + // 点击行选中 + clickToRowSelect?: boolean; + isTreeTable?: boolean; + // 自定义排序方法 + sortFn?: (sortInfo: SorterResult) => any; + // 排序方法 + filterFn?: (data: Partial>) => any; + // 取消表格的默认padding + inset?: boolean; + // 显示表格设置 + showTableSetting?: boolean; + tableSetting?: TableSetting; + // 斑马纹 + striped?: boolean; + // 是否自动生成key + autoCreateKey?: boolean; + // 计算合计行的方法 + summaryFunc?: (...arg: any) => Recordable[]; + // 自定义合计表格内容 + summaryData?: Recordable[]; + // 是否显示合计行 + showSummary?: boolean; + // 是否可拖拽列 + canColDrag?: boolean; + // 接口请求对象 + api?: (...arg: any) => Promise; + // 请求之前处理参数 + beforeFetch?: Fn; + // 自定义处理接口返回参数 + afterFetch?: Fn; + // 查询条件请求之前处理 + handleSearchInfoFn?: Fn; + // 请求接口配置 + fetchSetting?: Partial; + // 立即请求接口 + immediate?: boolean; + // 在开起搜索表单的时候,如果没有数据是否显示表格 + emptyDataIsShowTable?: boolean; + // 额外的请求参数 + searchInfo?: Recordable; + // 默认的排序参数 + defSort?: Recordable; + // 使用搜索表单 + useSearchForm?: boolean; + // 表单配置 + formConfig?: Partial; + // 列配置 + columns: BasicColumn[]; + // 是否显示序号列 + showIndexColumn?: boolean; + // 序号列配置 + indexColumnProps?: BasicColumn; + // 是否显示操作列 + showActionColumn?: boolean; + // 操作列配置 + actionColumn?: BasicColumn; + // 文本超过宽度是否显示。。。 + ellipsis?: boolean; + // 是否可以自适应高度 + canResize?: boolean; + // 自适应高度偏移, 计算结果-偏移量 + resizeHeightOffset?: number; + + // 在分页改变的时候清空选项 + clearSelectOnPageChange?: boolean; + // + rowKey?: string | ((record: Recordable) => string); + // 数据 + dataSource?: Recordable[]; + // 标题右侧提示 + titleHelpMessage?: string | string[]; + // 表格最小高度 + minHeight?: number; + // 表格滚动最大高度 + maxHeight?: number; + // 是否显示边框 + bordered?: boolean; + // 分页配置 + pagination?: PaginationProps | boolean; + // loading加载 + loading?: boolean; + + /** + * The column contains children to display + * @default 'children' + * @type string | string[] + */ + childrenColumnName?: string; + + /** + * Override default table elements + * @type object + */ + components?: object; + + /** + * Expand all rows initially + * @default false + * @type boolean + */ + defaultExpandAllRows?: boolean; + + /** + * Initial expanded row keys + * @type string[] + */ + defaultExpandedRowKeys?: string[]; + + /** + * Current expanded row keys + * @type string[] + */ + expandedRowKeys?: string[]; + + /** + * Expanded container render for each row + * @type Function + */ + expandedRowRender?: (record?: ExpandedRowRenderRecord) => VNodeChild | JSX.Element; + + /** + * Customize row expand Icon. + * @type Function | VNodeChild + */ + expandIcon?: Function | VNodeChild | JSX.Element; + + /** + * Whether to expand row by clicking anywhere in the whole row + * @default false + * @type boolean + */ + expandRowByClick?: boolean; + + /** + * The index of `expandIcon` which column will be inserted when `expandIconAsCell` is false. default 0 + */ + expandIconColumnIndex?: number; + + /** + * Table footer renderer + * @type Function | VNodeChild + */ + footer?: Function | VNodeChild | JSX.Element; + + /** + * Indent size in pixels of tree data + * @default 15 + * @type number + */ + indentSize?: number; + + /** + * i18n text including filter, sort, empty text, etc + * @default { filterConfirm: 'Ok', filterReset: 'Reset', emptyText: 'No Data' } + * @type object + */ + locale?: object; + + /** + * Row's className + * @type Function + */ + rowClassName?: (record: TableCustomRecord, index: number) => string; + + /** + * Row selection config + * @type object + */ + rowSelection?: TableRowSelection; + + /** + * Set horizontal or vertical scrolling, can also be used to specify the width and height of the scroll area. + * It is recommended to set a number for x, if you want to set it to true, + * you need to add style .ant-table td { white-space: nowrap; }. + * @type object + */ + scroll?: { x?: number | true; y?: number }; + + /** + * Whether to show table header + * @default true + * @type boolean + */ + showHeader?: boolean; + + /** + * Size of table + * @default 'default' + * @type string + */ + size?: SizeType; + + /** + * Table title renderer + * @type Function | ScopedSlot + */ + title?: VNodeChild | JSX.Element | string | ((data: Recordable) => string); + + /** + * Set props on per header row + * @type Function + */ + customHeaderRow?: (column: ColumnProps, index: number) => object; + + /** + * Set props on per row + * @type Function + */ + customRow?: (record: T, index: number) => object; + + /** + * `table-layout` attribute of table element + * `fixed` when header/columns are fixed, or using `column.ellipsis` + * + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/table-layout + * @version 1.5.0 + */ + tableLayout?: 'auto' | 'fixed' | string; + + /** + * the render container of dropdowns in table + * @param triggerNode + * @version 1.5.0 + */ + getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement; + + /** + * Data can be changed again before rendering. + * The default configuration of general user empty data. + * You can configured globally through [ConfigProvider](https://antdv.com/components/config-provider-cn/) + * + * @version 1.5.4 + */ + transformCellText?: Function; + + /** + * Callback executed before editable cell submit value, not for row-editor + * + * The cell will not submit data while callback return false + */ + beforeEditSubmit?: (data: { record: Recordable; index: number; key: string | number; value: any }) => Promise; + + /** + * Callback executed when pagination, filters or sorter is changed + * @param pagination + * @param filters + * @param sorter + * @param currentDataSource + */ + onChange?: (pagination: any, filters: any, sorter: any, extra: any) => void; + + /** + * Callback executed when the row expand icon is clicked + * + * @param expanded + * @param record + */ + onExpand?: (expande: boolean, record: T) => void; + + /** + * Callback executed when the expanded rows change + * @param expandedRows + */ + onExpandedRowsChange?: (expandedRows: string[] | number[]) => void; + + onColumnsChange?: (data: ColumnChangeParam[]) => void; +} + +export type CellFormat = string | ((text: string, record: Recordable, index: number) => string | number) | Map; + +// @ts-ignore +export interface BasicColumn extends ColumnProps { + children?: BasicColumn[]; + filters?: { + text: string; + value: string; + children?: unknown[] | (((props: Record) => unknown[]) & (() => unknown[]) & (() => unknown[])); + }[]; + + // + flag?: 'INDEX' | 'DEFAULT' | 'CHECKBOX' | 'RADIO' | 'ACTION'; + customTitle?: VueNode; + + slots?: Recordable; + + // Whether to hide the column by default, it can be displayed in the column configuration + defaultHidden?: boolean; + + // Help text for table column header + helpMessage?: string | string[]; + + format?: CellFormat; + + // Editable + edit?: boolean; + editRow?: boolean; + editable?: boolean; + editComponent?: ComponentType; + editComponentProps?: Recordable; + editRule?: boolean | ((text: string, record: Recordable) => Promise); + editValueMap?: (value: any) => string; + onEditRow?: () => void; + // 权限编码控制是否显示 + auth?: RoleEnum | RoleEnum[] | string | string[]; + // 业务控制是否显示 + ifShow?: boolean | ((column: BasicColumn) => boolean); + //compType-用于记录类型 + compType?: string; +} + +export type ColumnChangeParam = { + dataIndex: string; + fixed: boolean | 'left' | 'right' | undefined; + visible: boolean; +}; + +export interface InnerHandlers { + onColumnsChange: (data: ColumnChangeParam[]) => void; +} diff --git a/src/components/Table/src/types/tableAction.ts b/src/components/Table/src/types/tableAction.ts new file mode 100644 index 0000000..5bd1ce6 --- /dev/null +++ b/src/components/Table/src/types/tableAction.ts @@ -0,0 +1,31 @@ +import { ButtonProps } from 'ant-design-vue/es/button/buttonTypes'; +import { TooltipProps } from 'ant-design-vue/es/tooltip/Tooltip'; +import { RoleEnum } from '/@/enums/roleEnum'; +export interface ActionItem extends ButtonProps { + onClick?: Fn; + label?: string; + color?: 'success' | 'error' | 'warning'; + icon?: string; + popConfirm?: PopConfirm; + disabled?: boolean; + divider?: boolean; + // 权限编码控制是否显示 + auth?: RoleEnum | RoleEnum[] | string | string[]; + // 业务控制是否显示 + ifShow?: boolean | ((action: ActionItem) => boolean); + tooltip?: string | TooltipProps; + // 自定义类名 + class?: string | Record | any[]; + // 自定义图标颜色 + iconColor?: string; +} + +export interface PopConfirm { + title: string; + okText?: string; + cancelText?: string; + confirm: Fn; + cancel?: Fn; + icon?: string; + placement?: string; +} diff --git a/src/components/Time/index.ts b/src/components/Time/index.ts new file mode 100644 index 0000000..7e2f4c0 --- /dev/null +++ b/src/components/Time/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '/@/utils/index'; +import time from './src/Time.vue'; + +export const Time = withInstall(time); diff --git a/src/components/Time/src/Time.vue b/src/components/Time/src/Time.vue new file mode 100644 index 0000000..be49ba3 --- /dev/null +++ b/src/components/Time/src/Time.vue @@ -0,0 +1,107 @@ + + diff --git a/src/components/Tinymce/index.ts b/src/components/Tinymce/index.ts new file mode 100644 index 0000000..ce07f95 --- /dev/null +++ b/src/components/Tinymce/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '/@/utils/index'; +import tinymce from './src/Editor.vue'; + +export const Tinymce = withInstall(tinymce); diff --git a/src/components/Tinymce/src/Editor.vue b/src/components/Tinymce/src/Editor.vue new file mode 100644 index 0000000..ff9279b --- /dev/null +++ b/src/components/Tinymce/src/Editor.vue @@ -0,0 +1,360 @@ + + + + + + + diff --git a/src/components/Tinymce/src/ImgUpload.vue b/src/components/Tinymce/src/ImgUpload.vue new file mode 100644 index 0000000..e0e532f --- /dev/null +++ b/src/components/Tinymce/src/ImgUpload.vue @@ -0,0 +1,118 @@ + + + diff --git a/src/components/Tinymce/src/helper.ts b/src/components/Tinymce/src/helper.ts new file mode 100644 index 0000000..2526ae7 --- /dev/null +++ b/src/components/Tinymce/src/helper.ts @@ -0,0 +1,81 @@ +const validEvents = [ + 'onActivate', + 'onAddUndo', + 'onBeforeAddUndo', + 'onBeforeExecCommand', + 'onBeforeGetContent', + 'onBeforeRenderUI', + 'onBeforeSetContent', + 'onBeforePaste', + 'onBlur', + 'onChange', + 'onClearUndos', + 'onClick', + 'onContextMenu', + 'onCopy', + 'onCut', + 'onDblclick', + 'onDeactivate', + 'onDirty', + 'onDrag', + 'onDragDrop', + 'onDragEnd', + 'onDragGesture', + 'onDragOver', + 'onDrop', + 'onExecCommand', + 'onFocus', + 'onFocusIn', + 'onFocusOut', + 'onGetContent', + 'onHide', + 'onInit', + 'onKeyDown', + 'onKeyPress', + 'onKeyUp', + 'onLoadContent', + 'onMouseDown', + 'onMouseEnter', + 'onMouseLeave', + 'onMouseMove', + 'onMouseOut', + 'onMouseOver', + 'onMouseUp', + 'onNodeChange', + 'onObjectResizeStart', + 'onObjectResized', + 'onObjectSelected', + 'onPaste', + 'onPostProcess', + 'onPostRender', + 'onPreProcess', + 'onProgressState', + 'onRedo', + 'onRemove', + 'onReset', + 'onSaveContent', + 'onSelectionChange', + 'onSetAttrib', + 'onSetContent', + 'onShow', + 'onSubmit', + 'onUndo', + 'onVisualAid', +]; + +const isValidKey = (key: string) => validEvents.indexOf(key) !== -1; + +export const bindHandlers = (initEvent: Event, listeners: any, editor: any): void => { + Object.keys(listeners) + .filter(isValidKey) + .forEach((key: string) => { + const handler = listeners[key]; + if (typeof handler === 'function') { + if (key === 'onInit') { + handler(initEvent, editor); + } else { + editor.on(key.substring(2), (e: any) => handler(e, editor)); + } + } + }); +}; diff --git a/src/components/Tinymce/src/tinymce.ts b/src/components/Tinymce/src/tinymce.ts new file mode 100644 index 0000000..6a3d97a --- /dev/null +++ b/src/components/Tinymce/src/tinymce.ts @@ -0,0 +1,20 @@ +// Any plugins you want to setting has to be imported +// Detail plugins list see https://www.tinymce.com/docs/plugins/ +// Custom builds see https://www.tinymce.com/download/custom-builds/ +// colorpicker/contextmenu/textcolor plugin is now built in to the core editor, please remove it from your editor configuration + +export const plugins = [ + 'advlist anchor autolink autosave code codesample directionality fullscreen hr insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus template textpattern visualblocks visualchars wordcount image', +]; + +export const toolbar = + 'fullscreen code preview | undo redo | bold italic underline strikethrough | fontselect fontsizeselect formatselect | alignleft aligncenter alignright alignjustify | outdent indent lineheight|subscript superscript blockquote| numlist bullist checklist | forecolor backcolor casechange permanentpen formatpainter removeformat | pagebreak | charmap emoticons | insertfile image media pageembed link anchor codesample insertdatetime hr| a11ycheck ltr rtl'; + +export const simplePlugins = ['lists image link media table textcolor wordcount contextmenu fullscreen']; + +export const simpleToolbar = [ + 'undo redo formatselect bold italic alignleft aligncenter alignright alignjustify bullist numlist outdent indent', + 'lists link unlink image media table removeformat fullscreen', +]; + +export const menubar = 'file edit insert view format table'; diff --git a/src/components/Transition/index.ts b/src/components/Transition/index.ts new file mode 100644 index 0000000..55cbe54 --- /dev/null +++ b/src/components/Transition/index.ts @@ -0,0 +1,21 @@ +import { createSimpleTransition, createJavascriptTransition } from './src/CreateTransition'; + +import ExpandTransitionGenerator from './src/ExpandTransition'; + +export { default as CollapseTransition } from './src/CollapseTransition.vue'; + +export const FadeTransition = createSimpleTransition('fade-transition'); +export const ScaleTransition = createSimpleTransition('scale-transition'); +export const SlideYTransition = createSimpleTransition('slide-y-transition'); +export const ScrollYTransition = createSimpleTransition('scroll-y-transition'); +export const SlideYReverseTransition = createSimpleTransition('slide-y-reverse-transition'); +export const ScrollYReverseTransition = createSimpleTransition('scroll-y-reverse-transition'); +export const SlideXTransition = createSimpleTransition('slide-x-transition'); +export const ScrollXTransition = createSimpleTransition('scroll-x-transition'); +export const SlideXReverseTransition = createSimpleTransition('slide-x-reverse-transition'); +export const ScrollXReverseTransition = createSimpleTransition('scroll-x-reverse-transition'); +export const ScaleRotateTransition = createSimpleTransition('scale-rotate-transition'); + +export const ExpandXTransition = createJavascriptTransition('expand-x-transition', ExpandTransitionGenerator('', true)); + +export const ExpandTransition = createJavascriptTransition('expand-transition', ExpandTransitionGenerator('')); diff --git a/src/components/Transition/src/CollapseTransition.vue b/src/components/Transition/src/CollapseTransition.vue new file mode 100644 index 0000000..6b50fa1 --- /dev/null +++ b/src/components/Transition/src/CollapseTransition.vue @@ -0,0 +1,78 @@ + + diff --git a/src/components/Transition/src/CreateTransition.tsx b/src/components/Transition/src/CreateTransition.tsx new file mode 100644 index 0000000..bad23b5 --- /dev/null +++ b/src/components/Transition/src/CreateTransition.tsx @@ -0,0 +1,69 @@ +import type { PropType } from 'vue'; + +import { defineComponent, Transition, TransitionGroup } from 'vue'; +import { getSlot } from '/@/utils/helper/tsxHelper'; + +type Mode = 'in-out' | 'out-in' | 'default' | undefined; + +export function createSimpleTransition(name: string, origin = 'top center 0', mode?: Mode) { + return defineComponent({ + name, + props: { + group: { + type: Boolean as PropType, + default: false, + }, + mode: { + type: String as PropType, + default: mode, + }, + origin: { + type: String as PropType, + default: origin, + }, + }, + setup(props, { slots, attrs }) { + const onBeforeEnter = (el: HTMLElement) => { + el.style.transformOrigin = props.origin; + }; + + return () => { + const Tag = !props.group ? Transition : TransitionGroup; + return ( + + {() => getSlot(slots)} + + ); + }; + }, + }); +} +export function createJavascriptTransition(name: string, functions: Recordable, mode: Mode = 'in-out') { + return defineComponent({ + name, + props: { + mode: { + type: String as PropType, + default: mode, + }, + }, + setup(props, { attrs, slots }) { + return () => { + return ( + + {() => getSlot(slots)} + + ); + }; + }, + }); +} diff --git a/src/components/Transition/src/ExpandTransition.ts b/src/components/Transition/src/ExpandTransition.ts new file mode 100644 index 0000000..2aaef9a --- /dev/null +++ b/src/components/Transition/src/ExpandTransition.ts @@ -0,0 +1,89 @@ +/** + * Makes the first character of a string uppercase + */ +export function upperFirst(str: string): string { + return str.charAt(0).toUpperCase() + str.slice(1); +} + +interface HTMLExpandElement extends HTMLElement { + _parent?: (Node & ParentNode & HTMLElement) | null; + _initialStyle: { + transition: string; + overflow: string | null; + height?: string | null; + width?: string | null; + }; +} + +export default function (expandedParentClass = '', x = false) { + const sizeProperty = x ? 'width' : ('height' as 'width' | 'height'); + const offsetProperty = `offset${upperFirst(sizeProperty)}` as 'offsetHeight' | 'offsetWidth'; + + return { + beforeEnter(el: HTMLExpandElement) { + el._parent = el.parentNode as (Node & ParentNode & HTMLElement) | null; + el._initialStyle = { + transition: el.style.transition, + overflow: el.style.overflow, + [sizeProperty]: el.style[sizeProperty], + }; + }, + + enter(el: HTMLExpandElement) { + const initialStyle = el._initialStyle; + + el.style.setProperty('transition', 'none', 'important'); + el.style.overflow = 'hidden'; + // const offset = `${el[offsetProperty]}px`; + + // el.style[sizeProperty] = '0'; + + void el.offsetHeight; // force reflow + + el.style.transition = initialStyle.transition; + + if (expandedParentClass && el._parent) { + el._parent.classList.add(expandedParentClass); + } + + requestAnimationFrame(() => { + // el.style[sizeProperty] = offset; + }); + }, + + afterEnter: resetStyles, + enterCancelled: resetStyles, + + leave(el: HTMLExpandElement) { + el._initialStyle = { + transition: '', + overflow: el.style.overflow, + [sizeProperty]: el.style[sizeProperty], + }; + + el.style.overflow = 'hidden'; + el.style[sizeProperty] = `${el[offsetProperty]}px`; + /* eslint-disable-next-line */ + void el.offsetHeight; // force reflow + + requestAnimationFrame(() => (el.style[sizeProperty] = '0')); + }, + + afterLeave, + leaveCancelled: afterLeave, + }; + + function afterLeave(el: HTMLExpandElement) { + if (expandedParentClass && el._parent) { + el._parent.classList.remove(expandedParentClass); + } + resetStyles(el); + } + + function resetStyles(el: HTMLExpandElement) { + const size = el._initialStyle[sizeProperty]; + el.style.overflow = el._initialStyle.overflow!; + if (size != null) el.style[sizeProperty] = size; + Reflect.deleteProperty(el, '_initialStyle'); + } +} diff --git a/src/components/Tree/index.ts b/src/components/Tree/index.ts new file mode 100644 index 0000000..169035a --- /dev/null +++ b/src/components/Tree/index.ts @@ -0,0 +1,6 @@ +import BasicTree from './src/BasicTree.vue'; +import './style'; + +export { BasicTree }; +export type { ContextMenuItem } from '/@/hooks/web/useContextMenu'; +export * from './src/types/tree'; diff --git a/src/components/Tree/src/BasicTree.vue b/src/components/Tree/src/BasicTree.vue new file mode 100644 index 0000000..a18bde8 --- /dev/null +++ b/src/components/Tree/src/BasicTree.vue @@ -0,0 +1,458 @@ + diff --git a/src/components/Tree/src/TreeIcon.ts b/src/components/Tree/src/TreeIcon.ts new file mode 100644 index 0000000..900d6bf --- /dev/null +++ b/src/components/Tree/src/TreeIcon.ts @@ -0,0 +1,13 @@ +import type { VNode, FunctionalComponent } from 'vue'; + +import { h } from 'vue'; +import { isString } from '@vue/shared'; +import { Icon } from '/@/components/Icon'; + +export const TreeIcon: FunctionalComponent = ({ icon }: { icon: VNode | string }) => { + if (!icon) return null; + if (isString(icon)) { + return h(Icon, { icon, class: 'mr-1' }); + } + return Icon; +}; diff --git a/src/components/Tree/src/components/TreeHeader.vue b/src/components/Tree/src/components/TreeHeader.vue new file mode 100644 index 0000000..a1792d2 --- /dev/null +++ b/src/components/Tree/src/components/TreeHeader.vue @@ -0,0 +1,171 @@ + + diff --git a/src/components/Tree/src/hooks/useTree.ts b/src/components/Tree/src/hooks/useTree.ts new file mode 100644 index 0000000..17345a2 --- /dev/null +++ b/src/components/Tree/src/hooks/useTree.ts @@ -0,0 +1,207 @@ +import type { InsertNodeParams, KeyType, FieldNames, TreeItem } from '../types/tree'; +import type { Ref, ComputedRef } from 'vue'; +import type { TreeDataItem } from 'ant-design-vue/es/tree/Tree'; + +import { cloneDeep } from 'lodash-es'; +import { unref } from 'vue'; +import { forEach } from '/@/utils/helper/treeHelper'; + +export function useTree(treeDataRef: Ref, getFieldNames: ComputedRef) { + function getAllKeys(list?: TreeDataItem[]) { + const keys: string[] = []; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return keys; + + for (let index = 0; index < treeData.length; index++) { + const node = treeData[index]; + keys.push(node[keyField]!); + const children = node[childrenField]; + if (children && children.length) { + keys.push(...(getAllKeys(children) as string[])); + } + } + return keys as KeyType[]; + } + + // get keys that can be checked and selected + function getEnabledKeys(list?: TreeDataItem[]) { + const keys: string[] = []; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return keys; + + for (let index = 0; index < treeData.length; index++) { + const node = treeData[index]; + node.disabled !== true && node.selectable !== false && keys.push(node[keyField]!); + const children = node[childrenField]; + if (children && children.length) { + keys.push(...(getEnabledKeys(children) as string[])); + } + } + return keys as KeyType[]; + } + + function getChildrenKeys(nodeKey: string | number, list?: TreeDataItem[]) { + const keys: KeyType[] = []; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return keys; + for (let index = 0; index < treeData.length; index++) { + const node = treeData[index]; + const children = node[childrenField]; + if (nodeKey === node[keyField]) { + keys.push(node[keyField]!); + if (children && children.length) { + keys.push(...(getAllKeys(children) as string[])); + } + } else { + if (children && children.length) { + keys.push(...getChildrenKeys(nodeKey, children)); + } + } + } + return keys as KeyType[]; + } + + // Update node + function updateNodeByKey(key: string, node: TreeDataItem, list?: TreeDataItem[]) { + if (!key) return; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getFieldNames); + + if (!childrenField || !keyField) return; + + for (let index = 0; index < treeData.length; index++) { + const element: any = treeData[index]; + const children = element[childrenField]; + + if (element[keyField] === key) { + treeData[index] = { ...treeData[index], ...node }; + break; + } else if (children && children.length) { + updateNodeByKey(key, node, element[childrenField]); + } + } + } + + // Expand the specified level + function filterByLevel(level = 1, list?: TreeDataItem[], currentLevel = 1) { + if (!level) { + return []; + } + const res: (string | number)[] = []; + const data = list || unref(treeDataRef) || []; + for (let index = 0; index < data.length; index++) { + const item = data[index]; + + const { key: keyField, children: childrenField } = unref(getFieldNames); + const key = keyField ? item[keyField] : ''; + const children = childrenField ? item[childrenField] : []; + res.push(key); + if (children && children.length && currentLevel < level) { + currentLevel += 1; + res.push(...filterByLevel(level, children, currentLevel)); + } + } + return res as string[] | number[]; + } + + /** + * 添加节点 + */ + function insertNodeByKey({ parentKey = null, node, push = 'push' }: InsertNodeParams) { + const treeData: any = cloneDeep(unref(treeDataRef)); + if (!parentKey) { + treeData[push](node); + treeDataRef.value = treeData; + return; + } + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return; + + forEach(treeData, (treeItem) => { + if (treeItem[keyField] === parentKey) { + treeItem[childrenField] = treeItem[childrenField] || []; + treeItem[childrenField][push](node); + return true; + } + }); + treeDataRef.value = treeData; + } + /** + * 批量添加节点 + */ + function insertNodesByKey({ parentKey = null, list, push = 'push' }: InsertNodeParams) { + const treeData: any = cloneDeep(unref(treeDataRef)); + if (!list || list.length < 1) { + return; + } + if (!parentKey) { + for (let i = 0; i < list.length; i++) { + treeData[push](list[i]); + } + } else { + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return; + + forEach(treeData, (treeItem) => { + if (treeItem[keyField] === parentKey) { + treeItem[childrenField] = treeItem[childrenField] || []; + for (let i = 0; i < list.length; i++) { + treeItem[childrenField][push](list[i]); + } + treeDataRef.value = treeData; + return true; + } + }); + } + } + // Delete node + function deleteNodeByKey(key: string, list?: TreeDataItem[]) { + if (!key) return; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return; + + for (let index = 0; index < treeData.length; index++) { + const element: any = treeData[index]; + const children = element[childrenField]; + + if (element[keyField] === key) { + treeData.splice(index, 1); + break; + } else if (children && children.length) { + deleteNodeByKey(key, element[childrenField]); + } + } + } + + // Get selected node + function getSelectedNode(key: KeyType, list?: TreeItem[], selectedNode?: TreeItem | null) { + if (!key && key !== 0) return null; + const treeData = list || unref(treeDataRef); + treeData.forEach((item) => { + if (selectedNode?.key || selectedNode?.key === 0) return selectedNode; + if (item.key === key) { + selectedNode = item; + return; + } + if (item.children && item.children.length) { + selectedNode = getSelectedNode(key, item.children, selectedNode); + } + }); + return selectedNode || null; + } + return { + deleteNodeByKey, + insertNodeByKey, + insertNodesByKey, + filterByLevel, + updateNodeByKey, + getAllKeys, + getChildrenKeys, + getEnabledKeys, + getSelectedNode, + }; +} diff --git a/src/components/Tree/src/types/tree.ts b/src/components/Tree/src/types/tree.ts new file mode 100644 index 0000000..691daae --- /dev/null +++ b/src/components/Tree/src/types/tree.ts @@ -0,0 +1,195 @@ +import type { ExtractPropTypes } from 'vue'; +import type { TreeDataItem } from 'ant-design-vue/es/tree/Tree'; + +import { buildProps } from '/@/utils/props'; + +export enum ToolbarEnum { + SELECT_ALL, + UN_SELECT_ALL, + EXPAND_ALL, + UN_EXPAND_ALL, + CHECK_STRICTLY, + CHECK_UN_STRICTLY, +} + +export const treeEmits = [ + 'update:expandedKeys', + 'update:selectedKeys', + 'update:value', + 'change', + 'check', + 'search', + 'update:searchValue', +]; + +export interface TreeState { + expandedKeys: KeyType[]; + selectedKeys: KeyType[]; + checkedKeys: CheckKeys; + checkStrictly: boolean; +} + +export interface FieldNames { + children?: string; + title?: string; + key?: string; +} + +export type KeyType = string | number; + +export type CheckKeys = + | KeyType[] + | { checked: string[] | number[]; halfChecked: string[] | number[] }; + +export const treeProps = buildProps({ + value: { + type: [Object, Array] as PropType, + }, + + renderIcon: { + type: Function as PropType<(params: Recordable) => string>, + }, + + helpMessage: { + type: [String, Array] as PropType, + default: '', + }, + + title: { + type: String, + default: '', + }, + toolbar: Boolean, + search: Boolean, + searchValue: { + type: String, + default: '', + }, + checkStrictly: Boolean, + clickRowToExpand: { + type: Boolean, + default: false, + }, + checkable: Boolean, + defaultExpandLevel: { + type: [String, Number] as PropType, + default: '', + }, + defaultExpandAll: Boolean, + + fieldNames: { + type: Object as PropType, + }, + + treeData: { + type: Array as PropType, + }, + + actionList: { + type: Array as PropType, + default: () => [], + }, + + expandedKeys: { + type: Array as PropType, + default: () => [], + }, + + selectedKeys: { + type: Array as PropType, + default: () => [], + }, + + checkedKeys: { + type: Array as PropType, + default: () => [], + }, + + beforeRightClick: { + type: Function as PropType<(...arg: any) => ContextMenuItem[] | ContextMenuOptions>, + default: undefined, + }, + + rightMenuList: { + type: Array as PropType, + }, + // 自定义数据过滤判断方法(注: 不是整个过滤方法,而是内置过滤的判断方法,用于增强原本仅能通过title进行过滤的方式) + filterFn: { + type: Function as PropType< + (searchValue: any, node: TreeItem, fieldNames: FieldNames) => boolean + >, + default: undefined, + }, + // 高亮搜索值,仅高亮具体匹配值(通过title)值为true时使用默认色值,值为#xxx时使用此值替代且高亮开启 + highlight: { + type: [Boolean, String] as PropType, + default: false, + }, + // 搜索完成时自动展开结果 + expandOnSearch: Boolean, + // 搜索完成自动选中所有结果,当且仅当 checkable===true 时生效 + checkOnSearch: Boolean, + // 搜索完成自动select所有结果 + selectedOnSearch: Boolean, + loading: { + type: Boolean, + default: false, + }, +}); + +export type TreeProps = ExtractPropTypes; + +export interface ContextMenuItem { + label: string; + icon?: string; + hidden?: boolean; + disabled?: boolean; + handler?: Fn; + divider?: boolean; + children?: ContextMenuItem[]; +} + +export interface ContextMenuOptions { + icon?: string; + styles?: any; + items?: ContextMenuItem[]; +} + +export interface TreeItem extends TreeDataItem { + icon?: any; +} + +export interface TreeActionItem { + render: (record: Recordable) => any; + show?: boolean | ((record: Recordable) => boolean); +} + +export interface InsertNodeParams { + parentKey: string | null; + node: TreeDataItem; + list?: TreeDataItem[]; + push?: 'push' | 'unshift'; +} + +export interface TreeActionType { + checkAll: (checkAll: boolean) => void; + expandAll: (expandAll: boolean) => void; + setExpandedKeys: (keys: KeyType[]) => void; + getExpandedKeys: () => KeyType[]; + setSelectedKeys: (keys: KeyType[]) => void; + getSelectedKeys: () => KeyType[]; + setCheckedKeys: (keys: CheckKeys) => void; + getCheckedKeys: () => CheckKeys; + filterByLevel: (level: number) => void; + insertNodeByKey: (opt: InsertNodeParams) => void; + insertNodesByKey: (opt: InsertNodeParams) => void; + deleteNodeByKey: (key: string) => void; + updateNodeByKey: (key: string, node: Omit) => void; + setSearchValue: (value: string) => void; + getSearchValue: () => string; + getSelectedNode: ( + key: KeyType, + treeList?: TreeItem[], + selectNode?: TreeItem | null, + ) => TreeItem | null; +} diff --git a/src/components/Tree/style/index.less b/src/components/Tree/style/index.less new file mode 100644 index 0000000..472d4ca --- /dev/null +++ b/src/components/Tree/style/index.less @@ -0,0 +1,52 @@ +@tree-prefix-cls: ~'@{namespace}-tree'; + +.@{tree-prefix-cls} { + background-color: @component-background; + + .ant-tree-node-content-wrapper { + position: relative; + + .ant-tree-title { + position: absolute; + left: 0; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + + &__title { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding-right: 10px; + + &:hover { + .@{tree-prefix-cls}__action { + visibility: visible; + } + } + } + + &__content { + overflow: hidden; + } + + &__actions { + position: absolute; + //top: 2px; + right: 3px; + display: flex; + } + + &__action { + margin-left: 4px; + visibility: hidden; + } + + &-header { + border-bottom: 1px solid @border-color-base; + } +} diff --git a/src/components/Tree/style/index.ts b/src/components/Tree/style/index.ts new file mode 100644 index 0000000..d74e52e --- /dev/null +++ b/src/components/Tree/style/index.ts @@ -0,0 +1 @@ +import './index.less'; diff --git a/src/components/Tree_backup/index.ts b/src/components/Tree_backup/index.ts new file mode 100644 index 0000000..f47820d --- /dev/null +++ b/src/components/Tree_backup/index.ts @@ -0,0 +1,5 @@ +import BasicTree from './src/Tree.vue'; + +export { BasicTree }; +export type { ContextMenuItem } from '/@/hooks/web/useContextMenu'; +export * from './src/typing'; diff --git a/src/components/Tree_backup/src/Tree.vue b/src/components/Tree_backup/src/Tree.vue new file mode 100644 index 0000000..e1eb8f3 --- /dev/null +++ b/src/components/Tree_backup/src/Tree.vue @@ -0,0 +1,449 @@ + + diff --git a/src/components/Tree_backup/src/TreeHeader.vue b/src/components/Tree_backup/src/TreeHeader.vue new file mode 100644 index 0000000..fbe36cf --- /dev/null +++ b/src/components/Tree_backup/src/TreeHeader.vue @@ -0,0 +1,181 @@ + + + diff --git a/src/components/Tree_backup/src/TreeIcon.ts b/src/components/Tree_backup/src/TreeIcon.ts new file mode 100644 index 0000000..69e7cd0 --- /dev/null +++ b/src/components/Tree_backup/src/TreeIcon.ts @@ -0,0 +1,17 @@ +import type { VNode, FunctionalComponent } from 'vue'; + +import { h } from 'vue'; +import { isString } from '/@/utils/is'; +import { Icon } from '/@/components/Icon'; + +export interface ComponentProps { + icon: VNode | string; +} + +export const TreeIcon: FunctionalComponent = ({ icon }: ComponentProps) => { + if (!icon) return null; + if (isString(icon)) { + return h(Icon, { icon, class: 'mr-1' }); + } + return Icon; +}; diff --git a/src/components/Tree_backup/src/props.ts b/src/components/Tree_backup/src/props.ts new file mode 100644 index 0000000..e6f6d73 --- /dev/null +++ b/src/components/Tree_backup/src/props.ts @@ -0,0 +1,99 @@ +import type { PropType } from 'vue'; +import type { ReplaceFields, ActionItem, Keys, CheckKeys, ContextMenuOptions, TreeItem } from './typing'; +import type { ContextMenuItem } from '/@/hooks/web/useContextMenu'; +import type { TreeDataItem } from 'ant-design-vue/es/tree/Tree'; +import { propTypes } from '/@/utils/propTypes'; + +export const basicProps = { + value: { + type: [Object, Array] as PropType, + }, + renderIcon: { + type: Function as PropType<(params: Recordable) => string>, + }, + + helpMessage: { + type: [String, Array] as PropType, + default: '', + }, + + title: propTypes.string, + toolbar: propTypes.bool, + search: propTypes.bool, + searchValue: propTypes.string, + checkStrictly: propTypes.bool, + clickRowToExpand: propTypes.bool.def(true), + checkable: propTypes.bool.def(false), + defaultExpandLevel: { + type: [String, Number] as PropType, + default: '', + }, + // 高亮搜索值,仅高亮具体匹配值(通过title)值为true时使用默认色值,值为#xxx时使用此值替代且高亮开启 + highlight: { + type: [Boolean, String] as PropType, + default: false, + }, + defaultExpandAll: propTypes.bool.def(false), + + replaceFields: { + type: Object as PropType, + }, + + treeData: { + type: Array as PropType, + }, + + actionList: { + type: Array as PropType, + default: () => [], + }, + + expandedKeys: { + type: Array as PropType, + default: () => [], + }, + + selectedKeys: { + type: Array as PropType, + default: () => [], + }, + + checkedKeys: { + type: Array as PropType, + default: () => [], + }, + + beforeRightClick: { + type: Function as PropType<(...arg: any) => ContextMenuItem[] | ContextMenuOptions>, + default: null, + }, + + rightMenuList: { + type: Array as PropType, + }, + // 自定义数据过滤判断方法(注: 不是整个过滤方法,而是内置过滤的判断方法,用于增强原本仅能通过title进行过滤的方式) + filterFn: { + type: Function as PropType<(searchValue: any, node: TreeItem, replaceFields: ReplaceFields) => boolean>, + default: null, + }, + // 搜索完成时自动展开结果 + expandOnSearch: propTypes.bool.def(false), + // 搜索完成自动选中所有结果,当且仅当 checkable===true 时生效 + checkOnSearch: propTypes.bool.def(false), + // 搜索完成自动select所有结果 + selectedOnSearch: propTypes.bool.def(false), +}; + +export const treeNodeProps = { + actionList: { + type: Array as PropType, + default: () => [], + }, + replaceFields: { + type: Object as PropType, + }, + treeData: { + type: Array as PropType, + default: () => [], + }, +}; diff --git a/src/components/Tree_backup/src/typing.ts b/src/components/Tree_backup/src/typing.ts new file mode 100644 index 0000000..c606d4d --- /dev/null +++ b/src/components/Tree_backup/src/typing.ts @@ -0,0 +1,53 @@ +import type { TreeDataItem, CheckEvent as CheckEventOrigin } from 'ant-design-vue/es/tree/Tree'; +import { ContextMenuItem } from '/@/hooks/web/useContextMenu'; + +export interface ActionItem { + render: (record: Recordable) => any; + show?: boolean | ((record: Recordable) => boolean); +} + +export interface TreeItem extends TreeDataItem { + icon?: any; +} + +export interface ReplaceFields { + children?: string; + title?: string; + key?: string; +} + +export type Keys = (string | number)[]; +export type CheckKeys = (string | number)[] | { checked: (string | number)[]; halfChecked: (string | number)[] }; + +export interface TreeActionType { + checkAll: (checkAll: boolean) => void; + expandAll: (expandAll: boolean) => void; + setExpandedKeys: (keys: Keys) => void; + getExpandedKeys: () => Keys; + setSelectedKeys: (keys: Keys) => void; + getSelectedKeys: () => Keys; + setCheckedKeys: (keys: CheckKeys) => void; + getCheckedKeys: () => CheckKeys; + filterByLevel: (level: number) => void; + insertNodeByKey: (opt: InsertNodeParams) => void; + insertNodesByKey: (opt: InsertNodeParams) => void; + deleteNodeByKey: (key: string) => void; + updateNodeByKey: (key: string, node: Omit) => void; + setSearchValue: (value: string) => void; + getSearchValue: () => string; +} + +export interface InsertNodeParams { + parentKey: string | null; + node: TreeDataItem; + list?: TreeDataItem[]; + push?: 'push' | 'unshift'; +} + +export interface ContextMenuOptions { + icon?: string; + styles?: any; + items?: ContextMenuItem[]; +} + +export type CheckEvent = CheckEventOrigin; diff --git a/src/components/Tree_backup/src/useTree.ts b/src/components/Tree_backup/src/useTree.ts new file mode 100644 index 0000000..1ba6f69 --- /dev/null +++ b/src/components/Tree_backup/src/useTree.ts @@ -0,0 +1,192 @@ +import type { InsertNodeParams, Keys, ReplaceFields } from './typing'; +import type { Ref, ComputedRef } from 'vue'; +import type { TreeDataItem } from 'ant-design-vue/es/tree/Tree'; + +import { cloneDeep } from 'lodash-es'; +import { unref } from 'vue'; +import { forEach } from '/@/utils/helper/treeHelper'; + +export function useTree(treeDataRef: Ref, getReplaceFields: ComputedRef) { + function getAllKeys(list?: TreeDataItem[]) { + const keys: string[] = []; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getReplaceFields); + if (!childrenField || !keyField) return keys; + + for (let index = 0; index < treeData.length; index++) { + const node = treeData[index]; + keys.push(node[keyField]!); + const children = node[childrenField]; + if (children && children.length) { + keys.push(...(getAllKeys(children) as string[])); + } + } + return keys as Keys; + } + + // get keys that can be checked and selected + function getEnabledKeys(list?: TreeDataItem[]) { + const keys: string[] = []; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getReplaceFields); + if (!childrenField || !keyField) return keys; + + for (let index = 0; index < treeData.length; index++) { + const node = treeData[index]; + node.disabled !== true && node.selectable !== false && keys.push(node[keyField]!); + const children = node[childrenField]; + if (children && children.length) { + keys.push(...(getEnabledKeys(children) as string[])); + } + } + return keys as Keys; + } + + function getChildrenKeys(nodeKey: string | number, list?: TreeDataItem[]): Keys { + const keys: Keys = []; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getReplaceFields); + if (!childrenField || !keyField) return keys; + for (let index = 0; index < treeData.length; index++) { + const node = treeData[index]; + const children = node[childrenField]; + if (nodeKey === node[keyField]) { + keys.push(node[keyField]!); + if (children && children.length) { + keys.push(...(getAllKeys(children) as string[])); + } + } else { + if (children && children.length) { + keys.push(...getChildrenKeys(nodeKey, children)); + } + } + } + return keys as Keys; + } + + // Update node + function updateNodeByKey(key: string, node: TreeDataItem, list?: TreeDataItem[]) { + if (!key) return; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getReplaceFields); + + if (!childrenField || !keyField) return; + + for (let index = 0; index < treeData.length; index++) { + const element: any = treeData[index]; + const children = element[childrenField]; + + if (element[keyField] === key) { + treeData[index] = { ...treeData[index], ...node }; + break; + } else if (children && children.length) { + updateNodeByKey(key, node, element[childrenField]); + } + } + } + + // Expand the specified level + function filterByLevel(level = 1, list?: TreeDataItem[], currentLevel = 1) { + if (!level) { + return []; + } + const res: (string | number)[] = []; + const data = list || unref(treeDataRef) || []; + for (let index = 0; index < data.length; index++) { + const item = data[index]; + + const { key: keyField, children: childrenField } = unref(getReplaceFields); + const key = keyField ? item[keyField] : ''; + const children = childrenField ? item[childrenField] : []; + res.push(key); + if (children && children.length && currentLevel < level) { + currentLevel += 1; + res.push(...filterByLevel(level, children, currentLevel)); + } + } + return res as string[] | number[]; + } + + /** + * 添加节点 + */ + function insertNodeByKey({ parentKey = null, node, push = 'push' }: InsertNodeParams) { + const treeData: any = cloneDeep(unref(treeDataRef)); + if (!parentKey) { + treeData[push](node); + treeDataRef.value = treeData; + return; + } + const { key: keyField, children: childrenField } = unref(getReplaceFields); + if (!childrenField || !keyField) return; + + forEach(treeData, (treeItem) => { + if (treeItem[keyField] === parentKey) { + treeItem[childrenField] = treeItem[childrenField] || []; + treeItem[childrenField][push](node); + return true; + } + }); + treeDataRef.value = treeData; + } + + /** + * 批量添加节点 + */ + function insertNodesByKey({ parentKey = null, list, push = 'push' }: InsertNodeParams) { + const treeData: any = cloneDeep(unref(treeDataRef)); + if (!list || list.length < 1) { + return; + } + if (!parentKey) { + for (let i = 0; i < list.length; i++) { + treeData[push](list[i]); + } + } else { + const { key: keyField, children: childrenField } = unref(getReplaceFields); + if (!childrenField || !keyField) return; + + forEach(treeData, (treeItem) => { + if (treeItem[keyField] === parentKey) { + treeItem[childrenField] = treeItem[childrenField] || []; + for (let i = 0; i < list.length; i++) { + treeItem[childrenField][push](list[i]); + } + treeDataRef.value = treeData; + return true; + } + }); + } + } + + // Delete node + function deleteNodeByKey(key: string, list?: TreeDataItem[]) { + if (!key) return; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getReplaceFields); + if (!childrenField || !keyField) return; + + for (let index = 0; index < treeData.length; index++) { + const element: any = treeData[index]; + const children = element[childrenField]; + + if (element[keyField] === key) { + treeData.splice(index, 1); + break; + } else if (children && children.length) { + deleteNodeByKey(key, element[childrenField]); + } + } + } + + return { + deleteNodeByKey, + insertNodeByKey, + insertNodesByKey, + filterByLevel, + updateNodeByKey, + getAllKeys, + getChildrenKeys, + getEnabledKeys, + }; +} diff --git a/src/components/Upload/index.ts b/src/components/Upload/index.ts new file mode 100644 index 0000000..568a7d9 --- /dev/null +++ b/src/components/Upload/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '/@/utils'; +import basicUpload from './src/BasicUpload.vue'; + +export const BasicUpload = withInstall(basicUpload); diff --git a/src/components/Upload/src/BasicUpload.vue b/src/components/Upload/src/BasicUpload.vue new file mode 100644 index 0000000..7e2f4c5 --- /dev/null +++ b/src/components/Upload/src/BasicUpload.vue @@ -0,0 +1,113 @@ + + diff --git a/src/components/Upload/src/FileList.vue b/src/components/Upload/src/FileList.vue new file mode 100644 index 0000000..19ffb57 --- /dev/null +++ b/src/components/Upload/src/FileList.vue @@ -0,0 +1,102 @@ + + diff --git a/src/components/Upload/src/ThumbUrl.vue b/src/components/Upload/src/ThumbUrl.vue new file mode 100644 index 0000000..80fb203 --- /dev/null +++ b/src/components/Upload/src/ThumbUrl.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/components/Upload/src/UploadModal.vue b/src/components/Upload/src/UploadModal.vue new file mode 100644 index 0000000..66e5982 --- /dev/null +++ b/src/components/Upload/src/UploadModal.vue @@ -0,0 +1,309 @@ + + + diff --git a/src/components/Upload/src/UploadPreviewModal.vue b/src/components/Upload/src/UploadPreviewModal.vue new file mode 100644 index 0000000..0e51cb9 --- /dev/null +++ b/src/components/Upload/src/UploadPreviewModal.vue @@ -0,0 +1,99 @@ + + + diff --git a/src/components/Upload/src/data.tsx b/src/components/Upload/src/data.tsx new file mode 100644 index 0000000..5480788 --- /dev/null +++ b/src/components/Upload/src/data.tsx @@ -0,0 +1,147 @@ +import type { BasicColumn, ActionItem } from '/@/components/Table'; +import { FileItem, PreviewFileItem, UploadResultStatus } from './typing'; +import { + // checkImgType, + isImgTypeByName, +} from './helper'; +import { Progress, Tag } from 'ant-design-vue'; +import TableAction from '/@/components/Table/src/components/TableAction.vue'; +import ThumbUrl from './ThumbUrl.vue'; +import { useI18n } from '/@/hooks/web/useI18n'; + +const { t } = useI18n(); + +// 文件上传列表 +export function createTableColumns(): BasicColumn[] { + return [ + { + dataIndex: 'thumbUrl', + title: t('component.upload.legend'), + width: 100, + customRender: ({ record }) => { + const { thumbUrl } = (record as FileItem) || {}; + return thumbUrl && ; + }, + }, + { + dataIndex: 'name', + title: t('component.upload.fileName'), + align: 'left', + customRender: ({ text, record }) => { + const { percent, status: uploadStatus } = (record as FileItem) || {}; + let status: 'normal' | 'exception' | 'active' | 'success' = 'normal'; + if (uploadStatus === UploadResultStatus.ERROR) { + status = 'exception'; + } else if (uploadStatus === UploadResultStatus.UPLOADING) { + status = 'active'; + } else if (uploadStatus === UploadResultStatus.SUCCESS) { + status = 'success'; + } + return ( + +

    + {text} +

    + +
    + ); + }, + }, + { + dataIndex: 'size', + title: t('component.upload.fileSize'), + width: 100, + customRender: ({ text = 0 }) => { + return text && (text / 1024).toFixed(2) + 'KB'; + }, + }, + // { + // dataIndex: 'type', + // title: '文件类型', + // width: 100, + // }, + { + dataIndex: 'status', + title: t('component.upload.fileStatue'), + width: 100, + customRender: ({ text }) => { + if (text === UploadResultStatus.SUCCESS) { + return {() => t('component.upload.uploadSuccess')}; + } else if (text === UploadResultStatus.ERROR) { + return {() => t('component.upload.uploadError')}; + } else if (text === UploadResultStatus.UPLOADING) { + return {() => t('component.upload.uploading')}; + } + + return text; + }, + }, + ]; +} +export function createActionColumn(handleRemove: Function): BasicColumn { + return { + width: 120, + title: t('component.upload.operating'), + dataIndex: 'action', + fixed: false, + customRender: ({ record }) => { + const actions: ActionItem[] = [ + { + label: t('component.upload.del'), + color: 'error', + onClick: handleRemove.bind(null, record), + }, + ]; + // if (checkImgType(record)) { + // actions.unshift({ + // label: t('component.upload.preview'), + // onClick: handlePreview.bind(null, record), + // }); + // } + return ; + }, + }; +} +// 文件预览列表 +export function createPreviewColumns(): BasicColumn[] { + return [ + { + dataIndex: 'url', + title: t('component.upload.legend'), + width: 100, + customRender: ({ record }) => { + const { url } = (record as PreviewFileItem) || {}; + return isImgTypeByName(url) && ; + }, + }, + { + dataIndex: 'name', + title: t('component.upload.fileName'), + align: 'left', + }, + ]; +} + +export function createPreviewActionColumn({ handleRemove, handleDownload }: { handleRemove: Fn; handleDownload: Fn }): BasicColumn { + return { + width: 160, + title: t('component.upload.operating'), + dataIndex: 'action', + fixed: false, + customRender: ({ record }) => { + const actions: ActionItem[] = [ + { + label: t('component.upload.del'), + color: 'error', + onClick: handleRemove.bind(null, record), + }, + { + label: t('component.upload.download'), + onClick: handleDownload.bind(null, record), + }, + ]; + + return ; + }, + }; +} diff --git a/src/components/Upload/src/helper.ts b/src/components/Upload/src/helper.ts new file mode 100644 index 0000000..a0c574b --- /dev/null +++ b/src/components/Upload/src/helper.ts @@ -0,0 +1,27 @@ +export function checkFileType(file: File, accepts: string[]) { + const newTypes = accepts.join('|'); + // const reg = /\.(jpg|jpeg|png|gif|txt|doc|docx|xls|xlsx|xml)$/i; + const reg = new RegExp('\\.(' + newTypes + ')$', 'i'); + + return reg.test(file.name); +} + +export function checkImgType(file: File) { + return isImgTypeByName(file.name); +} + +export function isImgTypeByName(name: string) { + return /\.(jpg|jpeg|png|gif)$/i.test(name); +} + +export function getBase64WithFile(file: File) { + return new Promise<{ + result: string; + file: File; + }>((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve({ result: reader.result as string, file }); + reader.onerror = (error) => reject(error); + }); +} diff --git a/src/components/Upload/src/props.ts b/src/components/Upload/src/props.ts new file mode 100644 index 0000000..413b95d --- /dev/null +++ b/src/components/Upload/src/props.ts @@ -0,0 +1,83 @@ +import type { PropType } from 'vue'; +import { FileBasicColumn } from './typing'; + +export const basicProps = { + helpText: { + type: String as PropType, + default: '', + }, + // 文件最大多少MB + maxSize: { + type: Number as PropType, + default: 2, + }, + // 最大数量的文件,Infinity不限制 + maxNumber: { + type: Number as PropType, + default: Infinity, + }, + // 根据后缀,或者其他 + accept: { + type: Array as PropType, + default: () => [], + }, + multiple: { + type: Boolean as PropType, + default: true, + }, + uploadParams: { + type: Object as PropType, + default: {}, + }, + api: { + type: Function as PropType, + default: null, + required: true, + }, + name: { + type: String as PropType, + default: 'file', + }, + filename: { + type: String as PropType, + default: null, + }, +}; + +export const uploadContainerProps = { + value: { + type: Array as PropType, + default: () => [], + }, + ...basicProps, + showPreviewNumber: { + type: Boolean as PropType, + default: true, + }, + emptyHidePreview: { + type: Boolean as PropType, + default: false, + }, +}; + +export const previewProps = { + value: { + type: Array as PropType, + default: () => [], + }, +}; + +export const fileListProps = { + columns: { + type: [Array] as PropType, + default: null, + }, + actionColumn: { + type: Object as PropType, + default: null, + }, + dataSource: { + type: Array as PropType, + default: null, + }, +}; diff --git a/src/components/Upload/src/typing.ts b/src/components/Upload/src/typing.ts new file mode 100644 index 0000000..c630110 --- /dev/null +++ b/src/components/Upload/src/typing.ts @@ -0,0 +1,55 @@ +import { UploadApiResult } from '/@/api/sys/model/uploadModel'; + +export enum UploadResultStatus { + SUCCESS = 'success', + ERROR = 'error', + UPLOADING = 'uploading', +} + +export interface FileItem { + thumbUrl?: string; + name: string; + size: string | number; + type?: string; + percent: number; + file: File; + status?: UploadResultStatus; + responseData?: UploadApiResult; + uuid: string; +} + +export interface PreviewFileItem { + url: string; + name: string; + type: string; +} + +export interface FileBasicColumn { + /** + * Renderer of the table cell. The return value should be a VNode, or an object for colSpan/rowSpan config + * @type Function | ScopedSlot + */ + customRender?: Function; + /** + * Title of this column + * @type any (string | slot) + */ + title: string; + + /** + * Width of this column + * @type string | number + */ + width?: number; + /** + * Display field of the data record, could be set like a.b.c + * @type string + */ + dataIndex: string; + /** + * specify how content is aligned + * @default 'left' + * @type string + */ + align?: 'left' | 'right' | 'center'; +} diff --git a/src/components/Upload/src/useUpload.ts b/src/components/Upload/src/useUpload.ts new file mode 100644 index 0000000..694cc27 --- /dev/null +++ b/src/components/Upload/src/useUpload.ts @@ -0,0 +1,60 @@ +import { Ref, unref, computed } from 'vue'; +import { useI18n } from '/@/hooks/web/useI18n'; +const { t } = useI18n(); +export function useUploadType({ + acceptRef, + helpTextRef, + maxNumberRef, + maxSizeRef, +}: { + acceptRef: Ref; + helpTextRef: Ref; + maxNumberRef: Ref; + maxSizeRef: Ref; +}) { + // 文件类型限制 + const getAccept = computed(() => { + const accept = unref(acceptRef); + if (accept && accept.length > 0) { + return accept; + } + return []; + }); + const getStringAccept = computed(() => { + return unref(getAccept) + .map((item) => { + if (item.indexOf('/') > 0 || item.startsWith('.')) { + return item; + } else { + return `.${item}`; + } + }) + .join(','); + }); + + // 支持jpg、jpeg、png格式,不超过2M,最多可选择10张图片,。 + const getHelpText = computed(() => { + const helpText = unref(helpTextRef); + if (helpText) { + return helpText; + } + const helpTexts: string[] = []; + + const accept = unref(acceptRef); + if (accept.length > 0) { + helpTexts.push(t('component.upload.accept', [accept.join(',')])); + } + + const maxSize = unref(maxSizeRef); + if (maxSize) { + helpTexts.push(t('component.upload.maxSize', [maxSize])); + } + + const maxNumber = unref(maxNumberRef); + if (maxNumber && maxNumber !== Infinity) { + helpTexts.push(t('component.upload.maxNumber', [maxNumber])); + } + return helpTexts.join(','); + }); + return { getAccept, getStringAccept, getHelpText }; +} diff --git a/src/components/Verify/index.ts b/src/components/Verify/index.ts new file mode 100644 index 0000000..7c67101 --- /dev/null +++ b/src/components/Verify/index.ts @@ -0,0 +1,7 @@ +import { withInstall } from '/@/utils/index'; +import basicDragVerify from './src/DragVerify.vue'; +import rotateDragVerify from './src/ImgRotate.vue'; + +export const BasicDragVerify = withInstall(basicDragVerify); +export const RotateDragVerify = withInstall(rotateDragVerify); +export * from './src/typing'; diff --git a/src/components/Verify/src/DragVerify.vue b/src/components/Verify/src/DragVerify.vue new file mode 100644 index 0000000..26ce84a --- /dev/null +++ b/src/components/Verify/src/DragVerify.vue @@ -0,0 +1,361 @@ + + diff --git a/src/components/Verify/src/ImgRotate.vue b/src/components/Verify/src/ImgRotate.vue new file mode 100644 index 0000000..e900188 --- /dev/null +++ b/src/components/Verify/src/ImgRotate.vue @@ -0,0 +1,216 @@ + + diff --git a/src/components/Verify/src/props.ts b/src/components/Verify/src/props.ts new file mode 100644 index 0000000..1e14970 --- /dev/null +++ b/src/components/Verify/src/props.ts @@ -0,0 +1,87 @@ +import type { PropType } from 'vue'; +import { useI18n } from '/@/hooks/web/useI18n'; + +const { t } = useI18n(); +export const basicProps = { + value: { + type: Boolean as PropType, + default: false, + }, + + isSlot: { + type: Boolean as PropType, + default: false, + }, + + text: { + type: [String] as PropType, + default: t('component.verify.dragText'), + }, + successText: { + type: [String] as PropType, + default: t('component.verify.successText'), + }, + height: { + type: [Number, String] as PropType, + default: 40, + }, + + width: { + type: [Number, String] as PropType, + default: 220, + }, + + circle: { + type: Boolean as PropType, + default: false, + }, + + wrapStyle: { + type: Object as PropType, + default: {}, + }, + contentStyle: { + type: Object as PropType, + default: {}, + }, + barStyle: { + type: Object as PropType, + default: {}, + }, + actionStyle: { + type: Object as PropType, + default: {}, + }, +}; + +export const rotateProps = { + ...basicProps, + src: { + type: String as PropType, + }, + + imgWidth: { + type: Number as PropType, + default: 260, + }, + + imgWrapStyle: { + type: Object as PropType, + default: {}, + }, + + minDegree: { + type: Number as PropType, + default: 90, + }, + + maxDegree: { + type: Number as PropType, + default: 270, + }, + + diffDegree: { + type: Number as PropType, + default: 20, + }, +}; diff --git a/src/components/Verify/src/typing.ts b/src/components/Verify/src/typing.ts new file mode 100644 index 0000000..48f7d4c --- /dev/null +++ b/src/components/Verify/src/typing.ts @@ -0,0 +1,14 @@ +export interface DragVerifyActionType { + resume: () => void; +} + +export interface PassingData { + isPassing: boolean; + time: number; +} + +export interface MoveData { + event: MouseEvent | TouchEvent; + moveDistance: number; + moveX: number; +} diff --git a/src/components/VirtualScroll/index.ts b/src/components/VirtualScroll/index.ts new file mode 100644 index 0000000..a4c6089 --- /dev/null +++ b/src/components/VirtualScroll/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '/@/utils/index'; +import vScroll from './src/VirtualScroll.vue'; + +export const VScroll = withInstall(vScroll); diff --git a/src/components/VirtualScroll/src/VirtualScroll.vue b/src/components/VirtualScroll/src/VirtualScroll.vue new file mode 100644 index 0000000..e010423 --- /dev/null +++ b/src/components/VirtualScroll/src/VirtualScroll.vue @@ -0,0 +1,180 @@ + + diff --git a/src/components/chart/Bar.vue b/src/components/chart/Bar.vue new file mode 100644 index 0000000..3822eaa --- /dev/null +++ b/src/components/chart/Bar.vue @@ -0,0 +1,79 @@ + + diff --git a/src/components/chart/BarAndLine.vue b/src/components/chart/BarAndLine.vue new file mode 100644 index 0000000..2c4cd34 --- /dev/null +++ b/src/components/chart/BarAndLine.vue @@ -0,0 +1,86 @@ + + diff --git a/src/components/chart/BarMulti.vue b/src/components/chart/BarMulti.vue new file mode 100644 index 0000000..a094f3f --- /dev/null +++ b/src/components/chart/BarMulti.vue @@ -0,0 +1,98 @@ + + diff --git a/src/components/chart/ChartCard.vue b/src/components/chart/ChartCard.vue new file mode 100644 index 0000000..ea8ad19 --- /dev/null +++ b/src/components/chart/ChartCard.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/src/components/chart/Gauge.vue b/src/components/chart/Gauge.vue new file mode 100644 index 0000000..2cf852e --- /dev/null +++ b/src/components/chart/Gauge.vue @@ -0,0 +1,100 @@ + + diff --git a/src/components/chart/HeadInfo.vue b/src/components/chart/HeadInfo.vue new file mode 100644 index 0000000..741745c --- /dev/null +++ b/src/components/chart/HeadInfo.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/components/chart/Line.vue b/src/components/chart/Line.vue new file mode 100644 index 0000000..3a2443f --- /dev/null +++ b/src/components/chart/Line.vue @@ -0,0 +1,81 @@ + + diff --git a/src/components/chart/LineMulti.vue b/src/components/chart/LineMulti.vue new file mode 100644 index 0000000..73a9a28 --- /dev/null +++ b/src/components/chart/LineMulti.vue @@ -0,0 +1,98 @@ + + diff --git a/src/components/chart/Pie.vue b/src/components/chart/Pie.vue new file mode 100644 index 0000000..6dafddc --- /dev/null +++ b/src/components/chart/Pie.vue @@ -0,0 +1,89 @@ + + diff --git a/src/components/chart/README.md b/src/components/chart/README.md new file mode 100644 index 0000000..ee301ef --- /dev/null +++ b/src/components/chart/README.md @@ -0,0 +1,282 @@ +# 报表组件文档 + +## 柱状图 + +##### 引用方式 + +```js +import Bar from '/@/components/chart/Bar.vue'; +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ------ | ---- | ---------- | +| chartData | array | ✔️ | 报表数据源 | +| width | number | | 报表宽度 | +| height | number | | 报表高度 | + +##### chartData 示例 + +```json +[ + { + "name": "1月", + "value": 320 + }, + { + "name": "2月", + "value": 457 + }, + { + "name": "3月", + "value": 182 + } +] +``` + +##### 代码示例 + +```html + + + + + +``` + +## 多列柱状图 + +##### 引用方式 + +```js +import BarMulti from '/@/components/chart/BarMulti.vue'; +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ------ | ---- | ---------- | +| chartData | array | ✔️ | 报表数据源 | +| width | number | | 报表宽度 | +| height | number | | 报表高度 | + +##### chartData 示例 + +```json +[ + { + "name": "1月", + "value": 320, + "type": "2021" + }, + { + "name": "2月", + "value": 457, + "type": "2021" + }, + { + "name": "3月", + "value": 182, + "type": "2021" + }, + { + "name": "1月", + "value": 240, + "type": "2022" + }, + { + "name": "2月", + "value": 357, + "type": "2022" + }, + { + "name": "3月", + "value": 456, + "type": "2022" + } +] +``` + +## 迷你柱状图 + +同柱形图,修改配置即可 + +## 面积图 + +##### 引用方式 + +```js +import Line from '/@/components/chart/Line.vue'; +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ------ | ---- | ---------- | +| chartData | array | ✔️ | 报表数据源 | +| width | number | | 报表宽度 | +| height | number | | 报表高度 | +| option | object | | 配置项 | + +##### chartData 示例 + +```json +[ + { + "name": "1月", + "value": 320 + }, + { + "name": "2月", + "value": 457 + }, + { + "name": "3月", + "value": 182 + } +] +``` + +## 多行折线图 + +##### 引用方式 + +```js +import LineMulti from '/@/components/chart/LineMulti.vue'; +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ------ | ---- | ---------- | +| chartData | array | ✔️ | 报表数据源 | +| width | number | | 报表宽度 | +| height | number | | 报表高度 | +| option | object | | 配置项 | + +##### chartData 示例 + +同柱形图 + +## 饼状图 + +##### 引用方式 + +```js +import Pie from '/@/components/chart/Pie'; +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ------ | ---- | ---------- | +| chartData | array | ✔️ | 报表数据源 | +| width | number | | 报表宽度 | +| height | number | | 报表高度 | +| option | object | | 配置项 | + +##### chartData 示例 + +```json +[ + { "name": "一月", "value": 40 }, + { "name": "二月", "value": 21 }, + { "name": "三月", "value": 17 }, + { "name": "四月", "value": 13 }, + { "name": "五月", "value": 9 } +] +``` + +## 雷达图 + +##### 引用方式 + +```js +import Radar from '/@/components/chart/Radar'; +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ------ | ---- | ---------- | +| chartData | array | ✔️ | 报表数据源 | +| width | number | | 报表宽度 | +| height | number | | 报表高度 | +| option | object | | 配置项 | + +##### chartData 示例 + +```json +[ + { "item": "一月", "score": 40 }, + { "item": "二月", "score": 20 }, + { "item": "三月", "score": 67 }, + { "item": "四月", "score": 43 }, + { "item": "五月", "score": 90 } +] +``` + +## 仪表盘 + +##### 引用方式 + +```js +import Gauge from '/@/components/chart/Gauge'; +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +| --------- | ------ | ---- | ---------- | +| chartData | array | ✔️ | 报表数据源 | +| width | number | | 报表宽度 | +| height | number | | 报表高度 | +| option | object | | 配置项 | + +## 排名列表 + +##### 引用方式 + +```js +import RankList from '@/components/chart/RankList'; +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +| ------ | ------ | ---- | ------------------------ | +| title | string | | 报表标题 | +| list | array | | 排名列表数据 | +| height | number | | 报表高度,默认自适应高度 | + +##### list 示例 + +```json +[ + { "name": "北京朝阳 1 号店", "total": 1981 }, + { "name": "北京朝阳 2 号店", "total": 1359 }, + { "name": "北京朝阳 3 号店", "total": 1354 }, + { "name": "北京朝阳 4 号店", "total": 263 }, + { "name": "北京朝阳 5 号店", "total": 446 }, + { "name": "北京朝阳 6 号店", "total": 796 } +] +``` diff --git a/src/components/chart/Radar.vue b/src/components/chart/Radar.vue new file mode 100644 index 0000000..e4ef64c --- /dev/null +++ b/src/components/chart/Radar.vue @@ -0,0 +1,96 @@ + + diff --git a/src/components/chart/RankList.vue b/src/components/chart/RankList.vue new file mode 100644 index 0000000..e2022a4 --- /dev/null +++ b/src/components/chart/RankList.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/src/components/chart/StackBar.vue b/src/components/chart/StackBar.vue new file mode 100644 index 0000000..30b2f3d --- /dev/null +++ b/src/components/chart/StackBar.vue @@ -0,0 +1,107 @@ + + diff --git a/src/components/chart/Trend.vue b/src/components/chart/Trend.vue new file mode 100644 index 0000000..9294219 --- /dev/null +++ b/src/components/chart/Trend.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/src/components/jeecg/AIcon.vue b/src/components/jeecg/AIcon.vue new file mode 100644 index 0000000..699f5ce --- /dev/null +++ b/src/components/jeecg/AIcon.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/src/components/jeecg/ExcelButton.vue b/src/components/jeecg/ExcelButton.vue new file mode 100644 index 0000000..98d5fec --- /dev/null +++ b/src/components/jeecg/ExcelButton.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/components/jeecg/JPrompt/JPrompt.vue b/src/components/jeecg/JPrompt/JPrompt.vue new file mode 100644 index 0000000..146df0a --- /dev/null +++ b/src/components/jeecg/JPrompt/JPrompt.vue @@ -0,0 +1,160 @@ + + + diff --git a/src/components/jeecg/JPrompt/hooks/useJPrompt.ts b/src/components/jeecg/JPrompt/hooks/useJPrompt.ts new file mode 100644 index 0000000..4f7cd21 --- /dev/null +++ b/src/components/jeecg/JPrompt/hooks/useJPrompt.ts @@ -0,0 +1,57 @@ +import type { JPromptProps } from '../typing'; +import { render, createVNode, nextTick } from 'vue'; +import { error } from '/@/utils/log'; +import JPrompt from '../JPrompt.vue'; + +export function useJPrompt() { + + function createJPrompt(options: JPromptProps) { + let instance = null; + const box = document.createElement('div'); + const vm = createVNode(JPrompt, { + // 注册 + async onRegister(ins) { + instance = ins; + await nextTick(); + ins.openModal(options); + }, + // 销毁 + afterClose() { + render(null, box); + document.body.removeChild(box); + }, + }); + // 挂载到 body + render(vm, box); + document.body.appendChild(box); + + function getInstance(): any { + if (instance == null) { + error('useJPrompt instance is undefined!'); + } + return instance; + } + + function updateModal(options: JPromptProps) { + getInstance()?.updateModal(options); + } + + function closeModal() { + getInstance()?.closeModal(); + } + + function setLoading(loading) { + getInstance()?.setLoading(loading); + } + + return { + closeModal, + updateModal, + setLoading, + }; + } + + return { + createJPrompt, + }; +} diff --git a/src/components/jeecg/JPrompt/index.ts b/src/components/jeecg/JPrompt/index.ts new file mode 100644 index 0000000..850fc09 --- /dev/null +++ b/src/components/jeecg/JPrompt/index.ts @@ -0,0 +1,2 @@ +export { useJPrompt } from './hooks/useJPrompt'; +export { default as JPrompt } from './JPrompt.vue'; diff --git a/src/components/jeecg/JPrompt/typing.ts b/src/components/jeecg/JPrompt/typing.ts new file mode 100644 index 0000000..785efe0 --- /dev/null +++ b/src/components/jeecg/JPrompt/typing.ts @@ -0,0 +1,15 @@ +import { ModalOptionsPartial } from '/@/hooks/web/useMessage'; +import { RenderCallbackParams, Rule } from '/@/components/Form'; + +export interface JPromptProps extends ModalOptionsPartial { + // 输入框是否必填 + required?: boolean; + // 校验 + rules?: Rule[]; + // 动态校验 + dynamicRules?: (renderCallbackParams: RenderCallbackParams) => Rule[]; + // 占位字符 + placeholder?: string; + // 输入框默认值 + defaultValue?: string; +} diff --git a/src/components/jeecg/JVxeTable/hooks.ts b/src/components/jeecg/JVxeTable/hooks.ts new file mode 100644 index 0000000..54c46fa --- /dev/null +++ b/src/components/jeecg/JVxeTable/hooks.ts @@ -0,0 +1,2 @@ +export { useJVxeCompProps, useJVxeComponent } from './src/hooks/useJVxeComponent'; +export { useResolveComponent } from './src/hooks/useData'; diff --git a/src/components/jeecg/JVxeTable/index.ts b/src/components/jeecg/JVxeTable/index.ts new file mode 100644 index 0000000..b288fbb --- /dev/null +++ b/src/components/jeecg/JVxeTable/index.ts @@ -0,0 +1,4 @@ +export { default as JVxeTable } from './src/JVxeTable'; +export { registerJVxeTable } from './src/install'; +export { deleteComponent } from './src/componentMap'; +export { registerComponent, registerAsyncComponent } from './src/utils/registerUtils'; diff --git a/src/components/jeecg/JVxeTable/src/JVxeTable.ts b/src/components/jeecg/JVxeTable/src/JVxeTable.ts new file mode 100644 index 0000000..a6da7bf --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/JVxeTable.ts @@ -0,0 +1,77 @@ +import { defineComponent, h, ref, useSlots } from 'vue'; +import { vxeEmits, vxeProps } from './vxe.data'; +import { useData, useRefs, useResolveComponent as rc } from './hooks/useData'; +import { useColumns } from './hooks/useColumns'; +import { useMethods } from './hooks/useMethods'; +import { useDataSource } from './hooks/useDataSource'; +import { useDragSort } from './hooks/useDragSort'; +import { useRenderComponents } from './hooks/useRenderComponents'; +import { useFinallyProps } from './hooks/useFinallyProps'; +import { JVxeTableProps } from './types'; +import './style/index.less'; + +export default defineComponent({ + name: 'JVxeTable', + inheritAttrs: false, + props: vxeProps(), + emits: [...vxeEmits], + setup(props: JVxeTableProps, context) { + const instanceRef = ref(); + const refs = useRefs(); + const slots = useSlots(); + const data = useData(props); + const { methods, publicMethods, created } = useMethods(props, context, data, refs, instanceRef); + created(); + useColumns(props, data, methods, slots); + useDataSource(props, data, methods, refs); + useDragSort(props, methods); + // 最终传入到 template 里的 props + const finallyProps = useFinallyProps(props, data, methods); + // 渲染子组件 + const renderComponents = useRenderComponents(props, data, methods, slots); + return { + instanceRef, + ...refs, + ...publicMethods, + ...finallyProps, + ...renderComponents, + vxeDataSource: data.vxeDataSource, + }; + }, + render() { + return h( + 'div', + { + class: this.$attrs.class, + style: this.$attrs.style, + }, + h( + rc('a-spin'), + { + spinning: this.loading, + wrapperClassName: this.prefixCls, + }, + { + default: () => [ + this.renderSubPopover(), + this.renderToolbar(), + this.renderToolbarAfterSlot(), + h( + rc('vxe-grid'), + { + ...this.vxeProps, + data: this.vxeDataSource, + }, + this.$slots + ), + this.renderPagination(), + this.renderDetailsModal(), + ], + } + ) + ); + }, + created() { + this.instanceRef = this; + }, +}); diff --git a/src/components/jeecg/JVxeTable/src/componentMap.ts b/src/components/jeecg/JVxeTable/src/componentMap.ts new file mode 100644 index 0000000..72dcf75 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/componentMap.ts @@ -0,0 +1,86 @@ +import type { JVxeVueComponent } from './types'; +import { JVxeTypes } from './types/JVxeTypes'; + +import JVxeSlotCell from './components/cells/JVxeSlotCell'; +import JVxeNormalCell from './components/cells/JVxeNormalCell.vue'; +import JVxeDragSortCell from './components/cells/JVxeDragSortCell.vue'; + +import JVxeInputCell from './components/cells/JVxeInputCell.vue'; +import JVxeDateCell from './components/cells/JVxeDateCell.vue'; +import JVxeTimeCell from './components/cells/JVxeTimeCell.vue'; +import JVxeSelectCell from './components/cells/JVxeSelectCell.vue'; +import JVxeRadioCell from './components/cells/JVxeRadioCell.vue'; +import JVxeCheckboxCell from './components/cells/JVxeCheckboxCell.vue'; +import JVxeUploadCell from './components/cells/JVxeUploadCell.vue'; +// import { TagsInputCell, TagsSpanCell } from './components/cells/JVxeTagsCell.vue' +import JVxeProgressCell from './components/cells/JVxeProgressCell.vue'; +import JVxeTextareaCell from './components/cells/JVxeTextareaCell.vue'; +// import JVxeDepartSelectCell from './components/cells/JVxeDepartSelectCell.vue' +// import JVxeUserSelectCell from './components/cells/JVxeUserSelectCell.vue' + +const componentMap = new Map(); + +/** span 组件结尾 */ +export const spanEnds: string = ':span'; + +/** 定义不能用于注册的关键字 */ +export const excludeKeywords: Array = [ + JVxeTypes.hidden, + JVxeTypes.rowNumber, + JVxeTypes.rowCheckbox, + JVxeTypes.rowRadio, + JVxeTypes.rowExpand, +]; + +/** + * 注册组件 + * + * @param type 组件 type + * @param component Vue组件 + * @param spanComponent 显示组件,可空,默认为 JVxeNormalCell 组件 + */ +export function addComponent(type: JVxeTypes, component: JVxeVueComponent, spanComponent?: JVxeVueComponent) { + if (excludeKeywords.includes(type)) { + throw new Error(`【addComponent】不能使用"${type}"作为组件的name,因为这是关键字。`); + } + if (componentMap.has(type)) { + throw new Error(`【addComponent】组件"${type}"已存在`); + } + componentMap.set(type, component); + if (spanComponent) { + componentMap.set(type + spanEnds, spanComponent); + } +} + +export function deleteComponent(type: JVxeTypes) { + componentMap.delete(type); + componentMap.delete(type + spanEnds); +} + +/** 定义内置自定义组件 */ +export function definedComponent() { + addComponent(JVxeTypes.slot, JVxeSlotCell); + addComponent(JVxeTypes.normal, JVxeNormalCell); + addComponent(JVxeTypes.rowDragSort, JVxeDragSortCell); + + addComponent(JVxeTypes.input, JVxeInputCell); + addComponent(JVxeTypes.inputNumber, JVxeInputCell); + addComponent(JVxeTypes.radio, JVxeRadioCell); + addComponent(JVxeTypes.checkbox, JVxeCheckboxCell); + addComponent(JVxeTypes.select, JVxeSelectCell); + addComponent(JVxeTypes.selectSearch, JVxeSelectCell); // 下拉搜索 + addComponent(JVxeTypes.selectMultiple, JVxeSelectCell); // 下拉多选 + addComponent(JVxeTypes.date, JVxeDateCell); + addComponent(JVxeTypes.datetime, JVxeDateCell); + addComponent(JVxeTypes.time, JVxeTimeCell); + addComponent(JVxeTypes.upload, JVxeUploadCell); + addComponent(JVxeTypes.textarea, JVxeTextareaCell); + + // addComponent(JVxeTypes.tags, TagsInputCell, TagsSpanCell) + addComponent(JVxeTypes.progress, JVxeProgressCell); + + // addComponent(JVxeTypes.departSelect, JVxeDepartSelectCell) + // addComponent(JVxeTypes.userSelect, JVxeUserSelectCell) +} + +export { componentMap }; diff --git a/src/components/jeecg/JVxeTable/src/components/JVxeDetailsModal.vue b/src/components/jeecg/JVxeTable/src/components/JVxeDetailsModal.vue new file mode 100644 index 0000000..48d63d0 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/JVxeDetailsModal.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/components/jeecg/JVxeTable/src/components/JVxeReloadEffect.ts b/src/components/jeecg/JVxeTable/src/components/JVxeReloadEffect.ts new file mode 100644 index 0000000..7dd3276 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/JVxeReloadEffect.ts @@ -0,0 +1,89 @@ +import { defineComponent, h, ref, watch } from 'vue'; +import { randomString } from '/@/utils/common/compUtils'; +import '../style/reload-effect.less'; + +// 修改数据特效 +export default defineComponent({ + props: { + vNode: null, + // 是否启用特效 + effect: Boolean, + }, + emits: ['effectBegin', 'effectEnd'], + setup(props, { emit }) { + // vNode: null, + const innerEffect = ref(props.effect); + // 应付同时多个特效 + const effectIdx = ref(0); + const effectList = ref([]); + + watch( + () => props.effect, + () => (innerEffect.value = props.effect) + ); + watch( + () => props.vNode, + (_vNode, old) => { + if (props.effect && old != null) { + let topLayer = renderSpan(old, 'top'); + effectList.value.push(topLayer); + } + }, + { deep: true, immediate: true } + ); + + // 条件渲染内容 span + function renderVNode() { + if (props.vNode == null) { + return null; + } + let bottom = renderSpan(props.vNode, 'bottom'); + // 启用了特效,并且有旧数据,就渲染特效顶层 + if (innerEffect.value && effectList.value.length > 0) { + emit('effectBegin'); + // 1.4s 以后关闭特效 + window.setTimeout(() => { + let item = effectList.value[effectIdx.value]; + if (item && item.elm) { + // 特效结束后,展示先把 display 设为 none,而不是直接删掉该元素, + // 目的是为了防止页面重新渲染,导致动画重置 + item.elm.style.display = 'none'; + } + // 当所有的层级动画都结束时,再删掉所有元素 + if (++effectIdx.value === effectList.value.length) { + innerEffect.value = false; + effectIdx.value = 0; + effectList.value = []; + emit('effectEnd'); + } + }, 1400); + return [effectList.value, bottom]; + } else { + return bottom; + } + } + + // 渲染内容 span + function renderSpan(vNode, layer) { + let options = { + key: layer + effectIdx.value + randomString(6), + class: ['j-vxe-reload-effect-span', `layer-${layer}`], + style: {}, + }; + if (layer === 'top') { + // 最新渲染的在下面 + options.style['z-index'] = 9999 - effectIdx.value; + } + return h('span', options, [vNode]); + } + + return () => + h( + 'div', + { + class: ['j-vxe-reload-effect-box'], + }, + [renderVNode()] + ); + }, +}); diff --git a/src/components/jeecg/JVxeTable/src/components/JVxeSubPopover.vue b/src/components/jeecg/JVxeTable/src/components/JVxeSubPopover.vue new file mode 100644 index 0000000..21698ff --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/JVxeSubPopover.vue @@ -0,0 +1,207 @@ + + + + diff --git a/src/components/jeecg/JVxeTable/src/components/JVxeToolbar.vue b/src/components/jeecg/JVxeTable/src/components/JVxeToolbar.vue new file mode 100644 index 0000000..6a9fc8e --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/JVxeToolbar.vue @@ -0,0 +1,117 @@ + + + diff --git a/src/components/jeecg/JVxeTable/src/components/cells/JVxeCheckboxCell.vue b/src/components/jeecg/JVxeTable/src/components/cells/JVxeCheckboxCell.vue new file mode 100644 index 0000000..683abfb --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/cells/JVxeCheckboxCell.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/src/components/jeecg/JVxeTable/src/components/cells/JVxeDateCell.vue b/src/components/jeecg/JVxeTable/src/components/cells/JVxeDateCell.vue new file mode 100644 index 0000000..f8a1b2a --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/cells/JVxeDateCell.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/components/jeecg/JVxeTable/src/components/cells/JVxeDragSortCell.vue b/src/components/jeecg/JVxeTable/src/components/cells/JVxeDragSortCell.vue new file mode 100644 index 0000000..c32efe3 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/cells/JVxeDragSortCell.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/src/components/jeecg/JVxeTable/src/components/cells/JVxeInputCell.vue b/src/components/jeecg/JVxeTable/src/components/cells/JVxeInputCell.vue new file mode 100644 index 0000000..f54fb45 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/cells/JVxeInputCell.vue @@ -0,0 +1,81 @@ + + + \ No newline at end of file diff --git a/src/components/jeecg/JVxeTable/src/components/cells/JVxeNormalCell.vue b/src/components/jeecg/JVxeTable/src/components/cells/JVxeNormalCell.vue new file mode 100644 index 0000000..d6107f1 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/cells/JVxeNormalCell.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/src/components/jeecg/JVxeTable/src/components/cells/JVxeProgressCell.vue b/src/components/jeecg/JVxeTable/src/components/cells/JVxeProgressCell.vue new file mode 100644 index 0000000..39a3a56 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/cells/JVxeProgressCell.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/components/jeecg/JVxeTable/src/components/cells/JVxeRadioCell.vue b/src/components/jeecg/JVxeTable/src/components/cells/JVxeRadioCell.vue new file mode 100644 index 0000000..503adf5 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/cells/JVxeRadioCell.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/src/components/jeecg/JVxeTable/src/components/cells/JVxeSelectCell.vue b/src/components/jeecg/JVxeTable/src/components/cells/JVxeSelectCell.vue new file mode 100644 index 0000000..d48696c --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/cells/JVxeSelectCell.vue @@ -0,0 +1,234 @@ + + + diff --git a/src/components/jeecg/JVxeTable/src/components/cells/JVxeSlotCell.ts b/src/components/jeecg/JVxeTable/src/components/cells/JVxeSlotCell.ts new file mode 100644 index 0000000..35fcb9f --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/cells/JVxeSlotCell.ts @@ -0,0 +1,41 @@ +import { computed, defineComponent, h } from 'vue'; +import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/src/hooks/useJVxeComponent'; +import { JVxeComponent } from '/@/components/jeecg/JVxeTable/src/types/JVxeComponent'; + +export default defineComponent({ + name: 'JVxeSlotCell', + props: useJVxeCompProps(), + setup(props: JVxeComponent.Props) { + const data = useJVxeComponent(props); + const slotProps = computed(() => { + return { + value: data.innerValue.value, + row: data.row.value, + column: data.originColumn.value, + params: props.params, + $table: props.params.$table, + rowId: props.params.rowid, + index: props.params.rowIndex, + rowIndex: props.params.rowIndex, + columnIndex: props.params.columnIndex, + scrolling: props.renderOptions.scrolling, + reloadEffect: props.renderOptions.reloadEffect.enabled, + triggerChange: (v) => data.handleChangeCommon(v), + }; + }); + return () => { + let { slot } = props.renderOptions; + if (slot) { + return h('div', {}, slot(slotProps.value)); + } else { + return h('div'); + } + }; + }, + // 【组件增强】注释详见:JVxeComponent.Enhanced + enhanced: { + switches: { + editRender: false, + }, + } as JVxeComponent.EnhancedPartial, +}); diff --git a/src/components/jeecg/JVxeTable/src/components/cells/JVxeTextareaCell.vue b/src/components/jeecg/JVxeTable/src/components/cells/JVxeTextareaCell.vue new file mode 100644 index 0000000..fa892ef --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/cells/JVxeTextareaCell.vue @@ -0,0 +1,57 @@ + + + diff --git a/src/components/jeecg/JVxeTable/src/components/cells/JVxeTimeCell.vue b/src/components/jeecg/JVxeTable/src/components/cells/JVxeTimeCell.vue new file mode 100644 index 0000000..4a6e1dc --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/cells/JVxeTimeCell.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/components/jeecg/JVxeTable/src/components/cells/JVxeUploadCell.vue b/src/components/jeecg/JVxeTable/src/components/cells/JVxeUploadCell.vue new file mode 100644 index 0000000..0c8f0d3 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/cells/JVxeUploadCell.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/components/jeecg/JVxeTable/src/hooks/cells/useJVxeUploadCell.ts b/src/components/jeecg/JVxeTable/src/hooks/cells/useJVxeUploadCell.ts new file mode 100644 index 0000000..707d89d --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/cells/useJVxeUploadCell.ts @@ -0,0 +1,137 @@ +import { ref, computed, watch } from 'vue'; + +import { getToken } from '/@/utils/auth'; +import { getFileAccessHttpUrl } from '/@/utils/common/compUtils'; +import { JVxeComponent } from '../../types/JVxeComponent'; +import { useJVxeComponent } from '../useJVxeComponent'; + +/** + * use 公共上传组件 + * @param props + * @param options 组件选项,token:默认是否传递token,action:默认上传路径,multiple:是否允许多文件 + */ +export function useJVxeUploadCell(props: JVxeComponent.Props, options?) { + const setup = useJVxeComponent(props); + const { innerValue, originColumn, handleChangeCommon } = setup; + + const innerFile = ref(null); + + /** upload headers */ + const uploadHeaders = computed(() => { + let headers = {}; + if ((originColumn.value.token ?? options?.token ?? false) === true) { + headers['X-Access-Token'] = getToken(); + } + return headers; + }); + + /** 上传请求地址 */ + const uploadAction = computed(() => { + if (!originColumn.value.action) { + return options?.action ?? ''; + } else { + return originColumn.value.action; + } + }); + const hasFile = computed(() => innerFile.value != null); + const responseName = computed(() => originColumn.value.responseName ?? 'message'); + + watch( + innerValue, + (val) => { + if (val) { + innerFile.value = val; + } else { + innerFile.value = null; + } + }, + { immediate: true } + ); + + function handleChangeUpload(info) { + let { file } = info; + let value = { + name: file.name, + type: file.type, + size: file.size, + status: file.status, + percent: file.percent, + path: innerFile.value?.path ?? '', + }; + if (file.response) { + value['responseName'] = file.response[responseName.value]; + } + let paths: string[] = []; + if (options?.multiple && innerFile.value && innerFile.value.path) { + paths = innerFile.value.path.split(','); + } + if (file.status === 'done') { + if (typeof file.response.success === 'boolean') { + if (file.response.success) { + paths.push(file.response[responseName.value]); + value['path'] = paths.join(','); + handleChangeCommon(value); + } else { + value['status'] = 'error'; + value['message'] = file.response.message || '未知错误'; + } + } else { + // 考虑到如果设置action上传路径为非jeecg-boot后台,可能不会返回 success 属性的情况,就默认为成功 + paths.push(file.response[responseName.value]); + value['path'] = paths.join(','); + handleChangeCommon(value); + } + } else if (file.status === 'error') { + value['message'] = file.response.message || '未知错误'; + } + innerFile.value = value; + } + + function handleClickDownloadFile() { + let { url, path } = innerFile.value || {}; + if (!url || url.length === 0) { + if (path && path.length > 0) { + url = getFileAccessHttpUrl(path.split(',')[0]); + } + } + if (url) { + window.open(url); + } + } + + function handleClickDeleteFile() { + handleChangeCommon(null); + } + + return { + ...setup, + innerFile, + uploadAction, + uploadHeaders, + hasFile, + responseName, + handleChangeUpload, + handleClickDownloadFile, + handleClickDeleteFile, + }; +} + +export function fileGetValue(value) { + if (value && value.path) { + return value.path; + } + return value; +} + +export function fileSetValue(value) { + if (value) { + let first = value.split(',')[0]; + let name = first.substring(first.lastIndexOf('/') + 1); + return { + name: name, + path: value, + status: 'done', + }; + } + return value; +} diff --git a/src/components/jeecg/JVxeTable/src/hooks/useColumns.ts b/src/components/jeecg/JVxeTable/src/hooks/useColumns.ts new file mode 100644 index 0000000..cba07a2 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/useColumns.ts @@ -0,0 +1,361 @@ +import type { JVxeColumn, JVxeDataProps, JVxeTableProps } from '../types'; +import { computed, nextTick } from 'vue'; +import { isArray, isEmpty, isPromise } from '/@/utils/is'; +import { cloneDeep } from 'lodash-es'; +import { JVxeTypePrefix, JVxeTypes } from '../types/JVxeTypes'; +import { initDictOptions } from '/@/utils/dict'; +import { pushIfNotExist } from '/@/utils/common/compUtils'; +import { getEnhanced } from '../utils/enhancedUtils'; +import { isRegistered } from '../utils/registerUtils'; +import { JVxeComponent } from '../types/JVxeComponent'; +import { useValidateRules } from './useValidateRules'; +import { JVxeTableMethods } from '../types'; + +// handle 方法参数 +export interface HandleArgs { + props: JVxeTableProps; + slots: any; + data: JVxeDataProps; + methods: JVxeTableMethods; + col?: JVxeColumn; + columns: JVxeColumn[]; + renderOptions?: any; + enhanced?: JVxeComponent.Enhanced; +} + +export function useColumns(props: JVxeTableProps, data: JVxeDataProps, methods: JVxeTableMethods, slots) { + data.vxeColumns = computed(() => { + let columns: JVxeColumn[] = []; + if (isArray(props.columns)) { + // handle 方法参数 + const args: HandleArgs = { props, slots, data, methods, columns }; + let seqColumn, selectionColumn, expandColumn, dragSortColumn; + props.columns.forEach((column: JVxeColumn) => { + // 排除未授权的列 1 = 显示/隐藏; 2 = 禁用 + let auth = methods.getColAuth(column.key); + if (auth?.type == '1' && !auth.isAuth) { + return; + } else if (auth?.type == '2' && !auth.isAuth) { + column.disabled = true; + } + // type 不填,默认为 normal + if (column.type == null || isEmpty(column.type)) { + column.type = JVxeTypes.normal; + } + let col: JVxeColumn = cloneDeep(column); + // 处理隐藏列 + if (col.type === JVxeTypes.hidden) { + return handleInnerColumn(args, col, handleHiddenColumn); + } + // 组件未注册,自动设置为 normal + if (!isRegistered(col.type)) { + col.type = JVxeTypes.normal; + } + args.enhanced = getEnhanced(col.type); + args.col = col; + args.renderOptions = { + bordered: props.bordered, + disabled: props.disabled, + scrolling: data.scrolling, + isDisabledRow: methods.isDisabledRow, + listeners: { + trigger: (name, event) => methods.trigger(name, event), + valueChange: (event) => methods.trigger('valueChange', event), + /** 重新排序行 */ + rowResort: (event) => { + methods.doSort(event.oldIndex, event.newIndex); + methods.trigger('dragged', event); + }, + /** 在当前行下面插入一行 */ + rowInsertDown: (rowIndex) => methods.insertRows({}, rowIndex + 1), + }, + }; + if (col.type === JVxeTypes.rowNumber) { + seqColumn = col; + columns.push(col); + } else if (col.type === JVxeTypes.rowRadio || col.type === JVxeTypes.rowCheckbox) { + selectionColumn = col; + columns.push(col); + } else if (col.type === JVxeTypes.rowExpand) { + expandColumn = col; + columns.push(col); + } else if (col.type === JVxeTypes.rowDragSort) { + dragSortColumn = col; + columns.push(col); + } else { + col.params = column; + handlerCol(args); + } + }); + handleInnerColumn(args, seqColumn, handleSeqColumn); + handleInnerColumn(args, selectionColumn, handleSelectionColumn); + handleInnerColumn(args, expandColumn, handleExpandColumn); + handleInnerColumn(args, dragSortColumn, handleDragSortColumn, true); + } + return columns; + }); +} + +/** 处理内置列 */ +function handleInnerColumn(args: HandleArgs, col: JVxeColumn, handler: (args: HandleArgs) => void, assign?: boolean) { + let renderOptions = col?.editRender || col?.cellRender; + return handler({ + ...args, + col: col, + renderOptions: assign ? Object.assign({}, args.renderOptions, renderOptions) : renderOptions, + }); +} + +/** + * 处理隐藏列 + */ +function handleHiddenColumn({ col, columns }: HandleArgs) { + delete col!.type; + col!.visible = false; + columns.push(col!); +} + +/** + * 处理行号列 + */ +function handleSeqColumn({ props, col, columns }: HandleArgs) { + // 判断是否开启了行号列 + if (props.rowNumber) { + let column = { + type: 'seq', + title: '#', + width: 60, + fixed: 'left', + align: 'center', + }; + if (col) { + Object.assign(col, column); + } else { + columns.unshift(column as any); + } + } +} + +/** + * 处理可选择列 + */ +function handleSelectionColumn({ props, data, col, columns }: HandleArgs) { + // 判断是否开启了可选择行 + if (props.rowSelection) { + let width = 40; + if (data.statistics.has && !props.rowExpand && !props.dragSort) { + width = 60; + } + let column = { + type: props.rowSelectionType, + width: width, + fixed: 'left', + align: 'center', + }; + if (col) { + Object.assign(col, column); + } else { + columns.unshift(column as any); + } + } +} + +/** + * 处理可展开行 + */ +function handleExpandColumn({ props, data, col, columns }: HandleArgs) { + // 是否可展开行 + if (props.rowExpand) { + let width = 40; + if (data.statistics.has && !props.dragSort) { + width = 60; + } + let column = { + type: 'expand', + title: '', + width: width, + fixed: 'left', + align: 'center', + slots: { content: 'expandContent' }, + }; + if (col) { + Object.assign(col, column); + } else { + columns.unshift(column as any); + } + } +} + +/** 处理可排序列 */ +function handleDragSortColumn({ props, data, col, columns, renderOptions }: HandleArgs) { + // 是否可拖动排序 + if (props.dragSort) { + let width = 40; + if (data.statistics.has) { + width = 60; + } + let column: any = { + title: '', + width: width, + fixed: 'left', + align: 'center', + }; + let cellRender = { + name: JVxeTypePrefix + JVxeTypes.rowDragSort, + sortKey: props.sortKey, + }; + if (renderOptions) { + column.cellRender = Object.assign(renderOptions, cellRender); + } else { + column.cellRender = cellRender; + } + if (col) { + Object.assign(col, column); + } else { + columns.unshift(column); + } + } +} + +/** 处理自定义组件列 */ +function handlerCol(args: HandleArgs) { + const { props, col, columns, enhanced } = args; + if (!col) return; + let { type } = col; + col.field = col.key; + delete col.type; + let renderName = 'cellRender'; + // 渲染选项 + let $renderOptions: any = { name: JVxeTypePrefix + type }; + if (enhanced?.switches.editRender) { + if (!(enhanced.switches.visible || props.alwaysEdit)) { + renderName = 'editRender'; + } + // $renderOptions.type = (enhanced.switches.visible || props.alwaysEdit) ? 'visible' : 'default' + } + col[renderName] = $renderOptions; + + handleDict(args); + handleRules(args); + handleStatistics(args); + handleSlots(args); + handleLinkage(args); + handleReloadEffect(args); + + if (col.editRender) { + Object.assign(col.editRender, args.renderOptions); + } + if (col.cellRender) { + Object.assign(col.cellRender, args.renderOptions); + } + + columns.push(col); +} + +/** + * 处理字典 + */ +async function handleDict({ col, methods }: HandleArgs) { + if (col && col.params.dictCode) { + /** 加载数据字典并合并到 options */ + try { + // 查询字典 + if (!isPromise(col.params.optionsPromise)) { + col.params.optionsPromise = new Promise(async (resolve) => { + //update-begin-author:taoyan date:2022-6-1 for: VUEN-1180 【代码生成】子表不支持带条件? + let dictCodeString = col.params.dictCode; + if (dictCodeString) { + dictCodeString = encodeURI(dictCodeString); + } + const dictOptions: any = await initDictOptions(dictCodeString); + //update-end-author:taoyan date:2022-6-1 for: VUEN-1180 【代码生成】子表不支持带条件? + let options = col.params.options ?? []; + dictOptions.forEach((dict) => { + // 过滤重复数据 + if (options.findIndex((o) => o.value === dict.value) === -1) { + options.push(dict); + } + }); + resolve(options); + }); + } + col.params.options = await col.params.optionsPromise; + await nextTick(); + await methods.getXTable().updateData(); + } catch (e) { + console.group(`[JVxeTable] 查询字典 "${col.params.dictCode}" 时发生异常!`); + console.warn(e); + console.groupEnd(); + } + } +} + +/** + * 处理校验 + */ +function handleRules(args: HandleArgs) { + if (isArray(args.col?.validateRules)) { + useValidateRules(args); + } +} + +/** + * 处理统计列 + */ +function handleStatistics({ col, data }: HandleArgs) { + // sum = 求和、average = 平均值 + if (col && isArray(col.statistics)) { + data.statistics.has = true; + col.statistics.forEach((item) => { + if (!isEmpty(item)) { + let arr = data.statistics[(item as string).toLowerCase()]; + if (isArray(arr)) { + pushIfNotExist(arr, col.key); + } + } + }); + } +} + +/** + * 处理插槽 + */ +function handleSlots({ slots, col, renderOptions }: HandleArgs) { + // slot 组件特殊处理 + if (col && col.params.type === JVxeTypes.slot) { + if (!isEmpty(col.slotName) && slots.hasOwnProperty(col.slotName)) { + renderOptions.slot = slots[col.slotName]; + } + } +} + +/** 处理联动列 */ +function handleLinkage({ data, col, renderOptions, methods }: HandleArgs) { + // 处理联动列,联动列只能作用于 select 组件 + if (col && col.params.type === JVxeTypes.select && data.innerLinkageConfig != null) { + // 判断当前列是否是联动列 + if (data.innerLinkageConfig.has(col.key)) { + renderOptions.linkage = { + config: data.innerLinkageConfig.get(col.key), + getLinkageOptionsAsync: methods.getLinkageOptionsAsync, + getLinkageOptionsSibling: methods.getLinkageOptionsSibling, + handleLinkageSelectChange: methods.handleLinkageSelectChange, + }; + } + } +} + +function handleReloadEffect({ props, data, renderOptions }: HandleArgs) { + renderOptions.reloadEffect = { + enabled: props.reloadEffect, + getMap() { + return data.reloadEffectRowKeysMap; + }, + isEffect(rowId) { + return data.reloadEffectRowKeysMap[rowId] === true; + }, + removeEffect(rowId) { + return (data.reloadEffectRowKeysMap[rowId] = false); + }, + }; +} diff --git a/src/components/jeecg/JVxeTable/src/hooks/useData.ts b/src/components/jeecg/JVxeTable/src/hooks/useData.ts new file mode 100644 index 0000000..a3847d1 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/useData.ts @@ -0,0 +1,94 @@ +import { ref, reactive, provide, resolveComponent } from 'vue'; +import { useDesign } from '/@/hooks/web/useDesign'; +import { JVxeDataProps, JVxeRefs, JVxeTableProps } from '../types'; +import { VxeGridInstance } from 'vxe-table'; +import { randomString } from '/@/utils/common/compUtils'; + +export function useData(props: JVxeTableProps): JVxeDataProps { + const { prefixCls } = useDesign('j-vxe-table'); + provide('prefixCls', prefixCls); + return { + prefixCls: prefixCls, + caseId: `j-vxe-${randomString(8)}`, + vxeDataSource: ref([]), + scroll: reactive({ top: 0, left: 0 }), + scrolling: ref(false), + defaultVxeProps: reactive({ + rowId: props.rowKey, + // 高亮hover的行 + highlightHoverRow: true, + + // --- 【issues/209】自带的tooltip会错位,所以替换成原生的title --- + // 溢出隐藏并显示tooltip + showOverflow: "title", + // 表头溢出隐藏并显示tooltip + showHeaderOverflow: "title", + // --- 【issues/209】自带的tooltip会错位,所以替换成原生的title --- + + showFooterOverflow: true, + // 可编辑配置 + editConfig: { + trigger: 'click', + mode: 'cell', + activeMethod: () => !props.disabled, + }, + expandConfig: { + iconClose: 'ant-table-row-expand-icon ant-table-row-expand-icon-collapsed', + iconOpen: 'ant-table-row-expand-icon ant-table-row-expand-icon-expanded', + }, + // 虚拟滚动配置,y轴大于xx条数据时启用虚拟滚动 + scrollY: { + gt: 30, + }, + scrollX: { + gt: 20, + // 暂时关闭左右虚拟滚动 + enabled: false, + }, + radioConfig: { highlight: true }, + checkboxConfig: { highlight: true }, + mouseConfig: { selected: false }, + keyboardConfig: { + // 删除键功能 + isDel: false, + // Esc键关闭编辑功能 + isEsc: true, + // Tab 键功能 + isTab: true, + // 任意键进入编辑(功能键除外) + isEdit: true, + // 方向键功能 + isArrow: true, + // 回车键功能 + isEnter: true, + // 如果功能被支持,用于 column.type=checkbox|radio,开启空格键切换复选框或单选框状态功能 + isChecked: true, + }, + }), + selectedRows: ref([]), + selectedRowIds: ref([]), + disabledRowIds: [], + statistics: reactive({ + has: false, + sum: [], + average: [], + }), + authsMap: ref(null), + innerEditRules: {}, + innerLinkageConfig: new Map(), + reloadEffectRowKeysMap: reactive({}), + }; +} + +export function useRefs(): JVxeRefs { + return { + gridRef: ref(), + subPopoverRef: ref(), + detailsModalRef: ref(), + }; +} + +export function useResolveComponent(...t: any[]): any { + // @ts-ignore + return resolveComponent(...t); +} diff --git a/src/components/jeecg/JVxeTable/src/hooks/useDataSource.ts b/src/components/jeecg/JVxeTable/src/hooks/useDataSource.ts new file mode 100644 index 0000000..eeb9328 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/useDataSource.ts @@ -0,0 +1,36 @@ +import { nextTick, watch } from 'vue'; +import { JVxeDataProps, JVxeRefs, JVxeTableMethods } from '../types'; +import { cloneDeep } from 'lodash-es'; + +export function useDataSource(props, data: JVxeDataProps, methods: JVxeTableMethods, refs: JVxeRefs) { + watch( + () => props.dataSource, + async () => { + data.disabledRowIds = []; + data.vxeDataSource.value = cloneDeep(props.dataSource); + data.vxeDataSource.value.forEach((row) => { + // 判断是否是禁用行 + if (methods.isDisabledRow(row)) { + data.disabledRowIds.push(row.id); + } + // 处理联动回显数据 + methods.handleLinkageBackData(row); + }); + await waitRef(refs.gridRef); + methods.recalcSortNumber(); + }, + { immediate: true } + ); +} + +function waitRef($ref) { + return new Promise((resolve) => { + (function next() { + if ($ref.value) { + resolve($ref); + } else { + nextTick(() => next()); + } + })(); + }); +} diff --git a/src/components/jeecg/JVxeTable/src/hooks/useDragSort.ts b/src/components/jeecg/JVxeTable/src/hooks/useDragSort.ts new file mode 100644 index 0000000..5d8dd63 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/useDragSort.ts @@ -0,0 +1,75 @@ +import { onMounted, onUnmounted, nextTick } from 'vue'; +import { JVxeTableMethods, JVxeTableProps } from '/@/components/jeecg/JVxeTable/src/types'; +import Sortable from 'sortablejs'; + +export function useDragSort(props: JVxeTableProps, methods: JVxeTableMethods) { + if (props.dragSort) { + let sortable2: Sortable; + let initTime: any; + + onMounted(() => { + // 加载完成之后再绑定拖动事件 + initTime = setTimeout(createSortable, 300); + }); + + onUnmounted(() => { + clearTimeout(initTime); + if (sortable2) { + sortable2.destroy(); + } + }); + + function createSortable() { + let xTable = methods.getXTable(); + // let dom = xTable.$el.querySelector('.vxe-table--fixed-wrapper .vxe-table--body tbody') + let dom = xTable.$el.querySelector('.body--wrapper>.vxe-table--body tbody'); + let startChildren = []; + sortable2 = Sortable.create(dom as HTMLElement, { + handle: '.drag-btn', + direction: 'vertical', + animation: 300, + onStart(e) { + let from = e.from; + // @ts-ignore + startChildren = [...from.children]; + }, + onEnd(e) { + let oldIndex = e.oldIndex as number; + let newIndex = e.newIndex as number; + if (oldIndex === newIndex) { + return; + } + // 【VUEN-2505】获取当前行数据 + let rowNode = xTable.getRowNode(e.item); + if (!rowNode) { + return; + } + let from = e.from; + let element = startChildren[oldIndex]; + let target = null; + if (oldIndex > newIndex) { + // 向上移动 + if (oldIndex + 1 < startChildren.length) { + target = startChildren[oldIndex + 1]; + } + } else { + // 向下移动 + target = startChildren[oldIndex + 1]; + } + from.removeChild(element); + from.insertBefore(element, target); + nextTick(() => { + // 【VUEN-2505】算出因虚拟滚动导致的偏移量 + let diffIndex = rowNode!.index - oldIndex; + if (diffIndex > 0) { + oldIndex = oldIndex + diffIndex; + newIndex = newIndex + diffIndex; + } + methods.doSort(oldIndex, newIndex); + methods.trigger('dragged', { oldIndex, newIndex }); + }); + }, + }); + } + } +} diff --git a/src/components/jeecg/JVxeTable/src/hooks/useFinallyProps.ts b/src/components/jeecg/JVxeTable/src/hooks/useFinallyProps.ts new file mode 100644 index 0000000..11db9f7 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/useFinallyProps.ts @@ -0,0 +1,83 @@ +import { unref, computed } from 'vue'; +import { merge } from 'lodash-es'; +import { isArray } from '/@/utils/is'; +import { useAttrs } from '/@/hooks/core/useAttrs'; +import { useKeyboardEdit } from '../hooks/useKeyboardEdit'; +import { JVxeDataProps, JVxeTableMethods, JVxeTableProps } from '../types'; + +export function useFinallyProps(props: JVxeTableProps, data: JVxeDataProps, methods: JVxeTableMethods) { + const attrs = useAttrs(); + // vxe 键盘操作配置 + const { keyboardEditConfig } = useKeyboardEdit(props); + // vxe 最终 editRules + const vxeEditRules = computed(() => merge({}, props.editRules, data.innerEditRules)); + // vxe 最终 events + const vxeEvents = computed(() => { + let listeners = { ...unref(attrs) }; + let events = { + onScroll: methods.handleVxeScroll, + onCellClick: methods.handleCellClick, + onEditClosed: methods.handleEditClosed, + onEditActived: methods.handleEditActived, + onRadioChange: methods.handleVxeRadioChange, + onCheckboxAll: methods.handleVxeCheckboxAll, + onCheckboxChange: methods.handleVxeCheckboxChange, + }; + // 用户传递的事件,进行合并操作 + Object.keys(listeners).forEach((key) => { + let listen = listeners[key]; + if (events.hasOwnProperty(key)) { + if (isArray(listen)) { + listen.push(events[key]); + } else { + listen = [events[key], listen]; + } + } + events[key] = listen; + }); + return events; + }); + // vxe 最终 props + const vxeProps = computed(() => { + return merge( + {}, + data.defaultVxeProps, + { + showFooter: data.statistics.has, + }, + unref(attrs), + { + ref: 'gridRef', + size: props.size, + loading: false, + disabled: props.disabled, + columns: unref(data.vxeColumns), + editRules: unref(vxeEditRules), + height: props.height === 'auto' ? null : props.height, + maxHeight: props.maxHeight, + border: props.bordered, + footerMethod: methods.handleFooterMethod, + // 展开行配置 + expandConfig: { + toggleMethod: methods.handleExpandToggleMethod, + }, + // 可编辑配置 + editConfig: { + activeMethod: methods.handleActiveMethod, + }, + radioConfig: { + checkMethod: methods.handleCheckMethod, + }, + checkboxConfig: { + checkMethod: methods.handleCheckMethod, + }, + }, + unref(vxeEvents), + unref(keyboardEditConfig) + ); + }); + return { + vxeProps, + prefixCls: data.prefixCls, + }; +} diff --git a/src/components/jeecg/JVxeTable/src/hooks/useJVxeComponent.ts b/src/components/jeecg/JVxeTable/src/hooks/useJVxeComponent.ts new file mode 100644 index 0000000..7bc5cbd --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/useJVxeComponent.ts @@ -0,0 +1,252 @@ +import { computed, nextTick, ref, unref, watch } from 'vue'; +import { propTypes } from '/@/utils/propTypes'; +import { useDesign } from '/@/hooks/web/useDesign'; +import { getEnhanced, replaceProps, vModel } from '../utils/enhancedUtils'; +import { JVxeRenderType } from '../types/JVxeTypes'; +import { isBoolean, isFunction, isObject, isPromise } from '/@/utils/is'; +import { JVxeComponent } from '../types/JVxeComponent'; +import { filterDictText } from '/@/utils/dict/JDictSelectUtil'; + +export function useJVxeCompProps() { + return { + // 组件类型 + type: propTypes.string, + // 渲染类型 + renderType: propTypes.string.def('default'), + // 渲染参数 + params: propTypes.object, + // 渲染自定义选项 + renderOptions: propTypes.object, + }; +} + +export function useJVxeComponent(props: JVxeComponent.Props) { + const value = computed(() => props.params.row[props.params.column.property]); + const innerValue = ref(value.value); + const row = computed(() => props.params.row); + const rows = computed(() => props.params.data); + const column = computed(() => props.params.column); + // 用户配置的原始 column + const originColumn = computed(() => column.value.params); + const rowIndex = computed(() => props.params._rowIndex); + const columnIndex = computed(() => props.params._columnIndex); + // 表格数据长度 + const fullDataLength = computed(() => props.params.$table.internalData.tableFullData.length); + // 是否正在滚动中 + const scrolling = computed(() => !!props.renderOptions.scrolling); + const cellProps = computed(() => { + let renderOptions = props.renderOptions; + let col = originColumn.value; + + let cellProps = {}; + + // 输入占位符 + cellProps['placeholder'] = replaceProps(col, col.placeholder); + + // 解析props + if (isObject(col.props)) { + Object.keys(col.props).forEach((key) => { + cellProps[key] = replaceProps(col, col.props[key]); + }); + } + + // 判断是否是禁用的列 + cellProps['disabled'] = isBoolean(col['disabled']) ? col['disabled'] : cellProps['disabled']; + // 判断是否禁用行 + if (renderOptions.isDisabledRow(row.value)) { + cellProps['disabled'] = true; + } + // 判断是否禁用所有组件 + if (renderOptions.disabled === true) { + cellProps['disabled'] = true; + } + //update-begin-author:taoyan date:2022-5-25 for: VUEN-1111 一对多子表 部门选择 不应该级联 + if (col.checkStrictly === true) { + cellProps['checkStrictly'] = true; + } + //update-end-author:taoyan date:2022-5-25 for: VUEN-1111 一对多子表 部门选择 不应该级联 + + //update-begin-author:taoyan date:2022-5-27 for: 用户组件 控制单选多选新的参数配置 + if (col.isRadioSelection === true) { + cellProps['isRadioSelection'] = true; + } else if (col.isRadioSelection === false) { + cellProps['isRadioSelection'] = false; + } + //update-end-author:taoyan date:2022-5-27 for: 用户组件 控制单选多选新的参数配置 + + return cellProps; + }); + + const listeners = computed(() => { + let listeners = Object.assign({}, props.renderOptions.listeners || {}); + // 默认change事件 + if (!listeners.change) { + listeners.change = async (event) => { + vModel(event.value, row, column); + await nextTick(); + // 处理 change 事件相关逻辑(例如校验) + props.params.$table.updateStatus(props.params); + }; + } + return listeners; + }); + const context = { + innerValue, + row, + rows, + rowIndex, + column, + columnIndex, + originColumn, + fullDataLength, + cellProps, + scrolling, + handleChangeCommon, + handleBlurCommon, + }; + const ctx = { props, context }; + + // 获取组件增强 + const enhanced = getEnhanced(props.type); + + watch( + value, + (newValue) => { + // 验证值格式 + let getValue = enhanced.getValue(newValue, ctx); + if (newValue !== getValue) { + // 值格式不正确,重新赋值 + newValue = getValue; + vModel(newValue, row, column); + } + innerValue.value = enhanced.setValue(newValue, ctx); + // 判断是否启用翻译 + if (props.renderType === JVxeRenderType.spaner && enhanced.translate.enabled === true) { + if (isFunction(enhanced.translate.handler)) { + let res = enhanced.translate.handler(newValue, ctx); + // 异步翻译,可解决字典查询慢的问题 + if (isPromise(res)) { + res.then((v) => (innerValue.value = v)); + } else { + innerValue.value = res; + } + } + } + }, + { immediate: true } + ); + + /** 通用处理 change 事件 */ + function handleChangeCommon($value) { + let newValue = enhanced.getValue($value, ctx); + let oldValue = value.value + trigger('change', { value: newValue }); + // 触发valueChange事件 + parentTrigger('valueChange', { + type: props.type, + value: newValue, + oldValue: oldValue, + col: originColumn.value, + rowIndex: rowIndex.value, + columnIndex: columnIndex.value, + }); + } + + /** 通用处理 blur 事件 */ + function handleBlurCommon(value) { + trigger('blur', { value }); + } + + /** + * 如果事件存在的话,就触发 + * @param name 事件名 + * @param event 事件参数 + * @param args 其他附带参数 + */ + function trigger(name, event?, args: any[] = []) { + let listener = listeners.value[name]; + if (isFunction(listener)) { + if (isObject(event)) { + event = packageEvent(name, event); + } + listener(event, ...args); + } + } + + function parentTrigger(name, event, args: any[] = []) { + args.unshift(packageEvent(name, event)); + trigger('trigger', name, args); + } + + function packageEvent(name, event: any = {}) { + event.row = row.value; + event.column = column.value; + // online增强参数兼容 + event.column['key'] = column.value['property']; + // event.cellTarget = this + if (!event.type) { + event.type = name; + } + if (!event.cellType) { + event.cellType = props.type; + } + // 是否校验表单,默认为true + if (isBoolean(event.validate)) { + event.validate = true; + } + return event; + } + + /** + * 防样式冲突类名生成器 + * @param scope + */ + function useCellDesign(scope: string) { + return useDesign(`vxe-cell-${scope}`); + } + + return { + ...context, + enhanced, + trigger, + useCellDesign, + }; +} + +/** + * 获取组件默认增强 + */ +export function useDefaultEnhanced(): JVxeComponent.EnhancedPartial { + return { + installOptions: { + autofocus: '', + }, + interceptor: { + 'event.clearActived': () => true, + 'event.clearActived.className': () => true, + }, + switches: { + editRender: true, + visible: false, + }, + aopEvents: { + editActived() {}, + editClosed() {}, + activeMethod: () => true, + }, + translate: { + enabled: false, + handler(value, ctx) { + // 默认翻译方法 + if (ctx) { + return filterDictText(unref(ctx.context.column).params.options, value); + } else { + return value; + } + }, + }, + getValue: (value) => value, + setValue: (value) => value, + createValue: (defaultValue) => defaultValue, + } as JVxeComponent.Enhanced; +} diff --git a/src/components/jeecg/JVxeTable/src/hooks/useKeyboardEdit.ts b/src/components/jeecg/JVxeTable/src/hooks/useKeyboardEdit.ts new file mode 100644 index 0000000..a6bb9b9 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/useKeyboardEdit.ts @@ -0,0 +1,37 @@ +/* + * JVxeTable 键盘操作 + */ +import type { VxeTablePropTypes } from 'vxe-table'; +import type { JVxeTableProps } from '../types'; +import { computed } from 'vue'; + +/** + * JVxeTable 键盘操作 + * + * @param props + */ +export function useKeyboardEdit(props: JVxeTableProps) { + // 是否开启了键盘操作 + const enabledKeyboard = computed(() => props.keyboardEdit ?? false); + // 重写 keyboardConfig + const keyboardConfig: VxeTablePropTypes.KeyboardConfig = { + editMethod({ row, column, $table }) { + // 重写默认的覆盖式,改为追加式 + $table.setActiveCell(row, column); + return true; + }, + }; + // 键盘操作配置 + const keyboardEditConfig = computed(() => { + return { + mouseConfig: { + selected: enabledKeyboard.value, + }, + keyboardConfig, + }; + }); + + return { + keyboardEditConfig, + }; +} diff --git a/src/components/jeecg/JVxeTable/src/hooks/useLinkage.ts b/src/components/jeecg/JVxeTable/src/hooks/useLinkage.ts new file mode 100644 index 0000000..f5916d1 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/useLinkage.ts @@ -0,0 +1,145 @@ +import { watch } from 'vue'; +import { isFunction, isPromise, isArray } from '/@/utils/is'; +import { JVxeColumn, JVxeDataProps, JVxeTableProps, JVxeLinkageConfig } from '../types'; + +/** + * 多级联动 + */ +export function useLinkage(props: JVxeTableProps, data: JVxeDataProps, methods) { + // 整理多级联动配置 + watch( + () => props.linkageConfig, + (linkageConfig: JVxeLinkageConfig[]) => { + data.innerLinkageConfig.clear(); + if (isArray(linkageConfig) && linkageConfig.length > 0) { + linkageConfig.forEach((config) => { + let keys = getLinkageKeys(config.key, []); + // 多个key共享一个,引用地址 + let configItem = { + ...config, + keys, + optionsMap: new Map(), + }; + keys.forEach((k) => data.innerLinkageConfig.set(k, configItem)); + }); + } + }, + { immediate: true } + ); + + // 获取联动的key顺序 + function getLinkageKeys(key: string, keys: string[]): string[] { + let col = props.columns?.find((col: JVxeColumn) => col.key === key) as JVxeColumn; + if (col) { + keys.push(col.key); + // 寻找下级 + if (col.linkageKey) { + return getLinkageKeys(col.linkageKey, keys); + } + } + return keys; + } + + // 处理联动回显数据 + function handleLinkageBackData(row) { + if (data.innerLinkageConfig.size > 0) { + for (let configItem of data.innerLinkageConfig.values()) { + autoSetLinkageOptionsByData(row, '', configItem, 0); + } + } + } + + /** 【多级联动】获取同级联动下拉选项 */ + function getLinkageOptionsSibling(row, col, config, request) { + // 如果当前列不是顶级列 + let key = ''; + if (col.key !== config.key) { + // 就找出联动上级列 + let idx = config.keys.findIndex((k) => col.key === k); + let parentKey = config.keys[idx - 1]; + key = row[parentKey]; + // 如果联动上级列没有选择数据,就直接返回空数组 + if (key === '' || key == null) { + return []; + } + } else { + key = 'root'; + } + let options = config.optionsMap.get(key); + if (!Array.isArray(options)) { + if (request) { + let parent = key === 'root' ? '' : key; + return getLinkageOptionsAsync(config, parent); + } else { + options = []; + } + } + return options; + } + + /** 【多级联动】获取联动下拉选项(异步) */ + function getLinkageOptionsAsync(config, parent) { + return new Promise((resolve) => { + let key = parent ? parent : 'root'; + let options; + if (config.optionsMap.has(key)) { + options = config.optionsMap.get(key); + if (isPromise(options)) { + options.then((opt) => { + config.optionsMap.set(key, opt); + resolve(opt); + }); + } else { + resolve(options); + } + } else if (isFunction(config.requestData)) { + // 调用requestData方法,通过传入parent来获取子级 + // noinspection JSVoidFunctionReturnValueUsed,TypeScriptValidateJSTypes + let promise = config.requestData(parent); + config.optionsMap.set(key, promise); + promise.then((opt) => { + config.optionsMap.set(key, opt); + resolve(opt); + }); + } else { + resolve([]); + } + }); + } + + // 【多级联动】 用于回显数据,自动填充 optionsMap + function autoSetLinkageOptionsByData(data, parent, config, level) { + if (level === 0) { + getLinkageOptionsAsync(config, ''); + } else { + getLinkageOptionsAsync(config, parent); + } + if (config.keys.length - 1 > level) { + let value = data[config.keys[level]]; + if (value) { + autoSetLinkageOptionsByData(data, value, config, level + 1); + } + } + } + + // 【多级联动】联动组件change时,清空下级组件 + function handleLinkageSelectChange(row, col, config, value) { + if (col.linkageKey) { + getLinkageOptionsAsync(config, value); + let idx = config.keys.findIndex((k) => k === col.key); + let values = {}; + for (let i = idx; i < config.keys.length; i++) { + values[config.keys[i]] = ''; + } + // 清空后几列的数据 + methods.setValues([{ rowKey: row.id, values }]); + } + } + + return { + getLinkageOptionsAsync, + getLinkageOptionsSibling, + handleLinkageSelectChange, + handleLinkageBackData, + }; +} diff --git a/src/components/jeecg/JVxeTable/src/hooks/useMethods.ts b/src/components/jeecg/JVxeTable/src/hooks/useMethods.ts new file mode 100644 index 0000000..4d042e0 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/useMethods.ts @@ -0,0 +1,818 @@ +import { Ref, watch } from 'vue'; +import XEUtils from 'xe-utils'; +import { simpleDebounce } from '/@/utils/common/compUtils'; +import { JVxeDataProps, JVxeRefs, JVxeTableProps, JVxeTypes } from '../types'; +import { getEnhanced } from '../utils/enhancedUtils'; +import { VxeTableInstance, VxeTablePrivateMethods } from 'vxe-table'; +import { cloneDeep } from 'lodash-es'; +import { isArray, isEmpty, isNull, isString } from '/@/utils/is'; +import { useLinkage } from './useLinkage'; +import { useWebSocket } from './useWebSocket'; +import { getPrefix, getJVxeAuths } from '../utils/authUtils'; + +export function useMethods(props: JVxeTableProps, { emit }, data: JVxeDataProps, refs: JVxeRefs, instanceRef: Ref) { + let xTableTemp: VxeTableInstance & VxeTablePrivateMethods; + + function getXTable() { + if (!xTableTemp) { + // !. 为 typescript 的非空断言 + xTableTemp = refs.gridRef.value!.getRefMaps().refTable.value; + } + return xTableTemp; + } + + // noinspection JSUnusedGlobalSymbols + const hookMethods = { + getXTable, + addRows, + pushRows, + insertRows, + addOrInsert, + setValues, + getValues, + getTableData, + getNewData, + getNewDataWithId, + getIfRowById, + getNewRowById, + getDeleteData, + getSelectionData, + getSelectedData, + removeRows, + removeRowsById, + removeSelection, + resetScrollTop, + validateTable, + fullValidateTable, + clearSelection, + filterNewRows, + isDisabledRow, + recalcDisableRows, + rowResort, + }; + + // 多级联动 + const linkageMethods = useLinkage(props, data, hookMethods); + // WebSocket 无痕刷新 + const socketMethods = useWebSocket(props, data, hookMethods); + + // 可显式供外部调用的方法 + const publicMethods = { + ...hookMethods, + ...linkageMethods, + ...socketMethods, + }; + + /** 监听vxe滚动条位置 */ + function handleVxeScroll(event) { + let { scroll } = data; + + // 记录滚动条的位置 + scroll.top = event.scrollTop; + scroll.left = event.scrollLeft; + + refs.subPopoverRef.value?.close(); + data.scrolling.value = true; + closeScrolling(); + } + + // 当手动勾选单选时触发的事件 + function handleVxeRadioChange(event) { + let row = event.$table.getRadioRecord(); + data.selectedRows.value = row ? [row] : []; + handleSelectChange('radio', data.selectedRows.value, event); + } + + // 当手动勾选全选时触发的事件 + function handleVxeCheckboxAll(event) { + data.selectedRows.value = event.$table.getCheckboxRecords(); + handleSelectChange('checkbox-all', data.selectedRows.value, event); + } + + // 当手动勾选并且值发生改变时触发的事件 + function handleVxeCheckboxChange(event) { + data.selectedRows.value = event.$table.getCheckboxRecords(); + handleSelectChange('checkbox', data.selectedRows.value, event); + } + + // 行选择change事件 + function handleSelectChange(type, selectedRows, $event) { + let action; + if (type === 'radio') { + action = 'selected'; + } else if (type === 'checkbox') { + action = selectedRows.includes($event.row) ? 'selected' : 'unselected'; + } else { + action = 'selected-all'; + } + + data.selectedRowIds.value = selectedRows.map((row) => row.id); + trigger('selectRowChange', { + type: type, + action: action, + $event: $event, + row: $event.row, + selectedRows: data.selectedRows.value, + selectedRowIds: data.selectedRowIds.value, + }); + } + + // 点击单元格时触发的事件 + function handleCellClick(event) { + let { row, column, $event, $table } = event; + + // 点击了可编辑的 + if (column.editRender) { + refs.subPopoverRef.value?.close(); + return; + } + + // 显示详细信息 + if (column.params?.showDetails) { + refs.detailsModalRef.value?.open(event); + } else if (refs.subPopoverRef.value) { + refs.subPopoverRef.value.toggle(event); + } else if (props.clickSelectRow) { + let className = $event.target.className || ''; + className = isString(className) ? className : className.toString(); + // 点击的是expand,不做处理 + if (className.includes('vxe-table--expand-btn')) { + return; + } + // 点击的是checkbox,不做处理 + if (className.includes('vxe-checkbox--icon') || className.includes('vxe-cell--checkbox')) { + return; + } + // 点击的是radio,不做处理 + if (className.includes('vxe-radio--icon') || className.includes('vxe-cell--radio')) { + return; + } + if (props.rowSelectionType === 'radio') { + $table.setRadioRow(row); + handleVxeRadioChange(event); + } else { + $table.toggleCheckboxRow(row); + handleVxeCheckboxChange(event); + } + } + } + + // 单元格被激活编辑时会触发该事件 + function handleEditActived({ column }) { + // 执行增强 + getEnhanced(column.params.type).aopEvents.editActived!.apply(instanceRef.value, arguments as any); + } + + // 单元格编辑状态下被关闭时会触发该事件 + function handleEditClosed({ column }) { + // 执行增强 + getEnhanced(column.params.type).aopEvents.editClosed!.apply(instanceRef.value, arguments as any); + } + + // 返回值决定行是否可选中 + function handleCheckMethod({ row }) { + if (props.disabled) { + return false; + } + return !data.disabledRowIds.includes(row.id); + } + + // 返回值决定单元格是否可以编辑 + function handleActiveMethod({ row, column }) { + let flag = (() => { + if (props.disabled) { + return false; + } + if (data.disabledRowIds.includes(row.id)) { + return false; + } + if (column.params?.disabled) { + return false; + } + // 执行增强 + return getEnhanced(column.params.type).aopEvents.activeMethod!.apply(instanceRef.value, arguments as any) ?? true; + })(); + if (!flag) { + getXTable().clearActived(); + } + return flag; + } + + /** + * 判断是否是禁用行 + * @param row 行数据 + * @param force 是否强制判断 + */ + function isDisabledRow(row, force = true) { + if (!force) { + return !data.disabledRowIds.includes(row.id); + } + if (props.disabledRows == null || isEmpty(props.disabledRows)) { + return false; + } + let disabled: boolean = false; + let keys: string[] = Object.keys(props.disabledRows); + for (const key of keys) { + // 判断是否有该属性 + if (row.hasOwnProperty(key)) { + let temp: any = props.disabledRows![key]; + // 禁用规则可以是一个数组 + if (isArray(temp)) { + disabled = temp.includes(row[key]); + } else { + disabled = temp === row[key]; + } + if (disabled) { + break; + } + } + } + return disabled; + } + + // 重新计算禁用行 + function recalcDisableRows() { + let xTable = getXTable(); + data.disabledRowIds = []; + const { tableFullData } = xTable.internalData; + tableFullData.forEach((row) => { + // 判断是否是禁用行 + if (isDisabledRow(row)) { + data.disabledRowIds.push(row.id); + } + }); + xTable.updateData(); + } + + // 监听 disabledRows,更改时重新计算禁用行 + watch( + () => props.disabledRows, + () => recalcDisableRows() + ); + + // 返回值决定是否允许展开、收起行 + function handleExpandToggleMethod({ expanded }) { + return !(expanded && props.disabled); + } + + // 设置 data.scrolling 防抖模式 + const closeScrolling = simpleDebounce(function () { + data.scrolling.value = false; + }, 100); + + /** 表尾数据处理方法,用于显示统计信息 */ + function handleFooterMethod({ columns, data: $data }) { + const { statistics } = data; + let footers: any[] = []; + if (statistics.has) { + if (statistics.sum.length > 0) { + footers.push( + getFooterStatisticsMap({ + columns: columns, + title: '合计', + checks: statistics.sum, + method: (column) => XEUtils.sum($data, column.property), + }) + ); + } + if (statistics.average.length > 0) { + footers.push( + getFooterStatisticsMap({ + columns: columns, + title: '平均', + checks: statistics.average, + method: (column) => XEUtils.mean($data, column.property), + }) + ); + } + } + return footers; + } + + /** 获取底部统计Map */ + function getFooterStatisticsMap({ columns, title, checks, method }) { + return columns.map((column, columnIndex) => { + if (columnIndex === 0) { + return title; + } + if (checks.includes(column.property)) { + return method(column, columnIndex); + } + return null; + }); + } + + // 创建新行,自动添加默认值 + function createRow(record: Recordable = {}) { + let xTable = getXTable(); + // 添加默认值 + xTable.internalData.tableFullColumn.forEach((column) => { + let col = column.params; + if (col) { + if (col.key && (record[col.key] == null || record[col.key] === '')) { + // 设置默认值 + let createValue = getEnhanced(col.type).createValue; + let defaultValue = col.defaultValue ?? ''; + let ctx = { context: { row: record, column, $table: xTable } }; + record[col.key] = createValue(defaultValue, ctx); + } + // 处理联动列 + if (col.type === JVxeTypes.select && data.innerLinkageConfig.size > 0) { + // 判断当前列是否是联动列 + if (data.innerLinkageConfig.has(col.key)) { + let configItem = data.innerLinkageConfig.get(col.key); + linkageMethods.getLinkageOptionsAsync(configItem, ''); + } + } + } + }); + return record; + } + + async function addOrInsert(rows: Recordable | Recordable[] = {}, index, triggerName, options?: IAddRowsOptions) { + let xTable = getXTable(); + let records; + if (isArray(rows)) { + records = rows; + } else { + records = [rows]; + } + // 遍历添加默认值 + records.forEach((record) => createRow(record)); + let setActive = options?.setActive ?? props.addSetActive ?? true; + let result = await pushRows(records, { index: index, setActive }); + // 遍历插入的行 + // online js增强时以传过来值为准,不再赋默认值 + if (!(options?.isOnlineJS ?? false)) { + if (triggerName != null) { + for (let i = 0; i < result.rows.length; i++) { + let row = result.rows[i]; + trigger(triggerName, { + row: row, + rows: result.rows, + insertIndex: index, + $table: xTable, + target: instanceRef.value, + isModalData: options?.isModalData + }); + } + } + } + return result; + } + + // 新增、插入一行时的可选参数 + interface IAddRowsOptions { + // 是否是 onlineJS增强 触发的 + isOnlineJS?: boolean; + // 是否激活编辑状态 + setActive?: boolean; + //是否需要触发change事件 + emitChange?:boolean + // 是否是modal弹窗添加的数据 + isModalData?:boolean + } + + /** + * 添加一行或多行 + * + * @param rows + * @param options 参数 + * @return + */ + async function addRows(rows: Recordable | Recordable[] = {}, options?: IAddRowsOptions) { + //update-begin-author:taoyan date:2022-8-12 for: VUEN-1892【online子表弹框】有主从关联js时,子表弹框修改了数据,主表字段未修改 + let result = await addOrInsert(rows, -1, 'added', options); + if(options && options!.emitChange==true){ + trigger('valueChange', {column: 'all', row: result.row}) + } + return result; + //update-end-author:taoyan date:2022-8-12 for: VUEN-1892【online子表弹框】有主从关联js时,子表弹框修改了数据,主表字段未修改 + } + + /** + * 添加一行或多行临时数据,不会填充默认值,传什么就添加进去什么 + * @param rows + * @param options 选项 + * @param options.setActive 是否激活最后一行的编辑模式 + */ + async function pushRows(rows: Recordable | Recordable[] = {}, options = { setActive: false, index: -1 }) { + let xTable = getXTable(); + let { setActive, index } = options; + index = index === -1 ? index : xTable.internalData.tableFullData[index]; + // 插入行 + let result = await xTable.insertAt(rows, index); + if (setActive) { + // 激活最后一行的编辑模式 + xTable.setActiveRow(result.rows[result.rows.length - 1]); + } + await recalcSortNumber(); + return result; + } + + /** + * 插入一行或多行临时数据 + * + * @param rows + * @param index 添加下标,数字,必填 + * @param options 参数 + * @return + */ + function insertRows(rows: Recordable | Recordable[] = {}, index: number, options?: IAddRowsOptions) { + if (index < 0) { + console.warn(`【JVxeTable】insertRows:index必须传递数字,且大于-1`); + return; + } + return addOrInsert(rows, index, 'inserted', options); + } + + /** 获取表格表单里的值 */ + function getValues(callback, rowIds) { + let tableData = getTableData({ rowIds: rowIds }); + callback('', tableData); + } + + /** 获取表格数据 */ + function getTableData(options: any = {}) { + let { rowIds } = options; + let tableData; + // 仅查询指定id的行 + if (isArray(rowIds) && rowIds.length > 0) { + tableData = []; + rowIds.forEach((rowId) => { + let { row } = getIfRowById(rowId); + if (row) { + tableData.push(row); + } + }); + } else { + // 查询所有行 + tableData = getXTable().getTableData().fullData; + } + return filterNewRows(tableData, false); + } + + /** 仅获取新增的数据 */ + function getNewData() { + let newData = getNewDataWithId(); + newData.forEach((row) => delete row.id); + return newData; + } + + /** 仅获取新增的数据,带有id */ + function getNewDataWithId() { + let xTable = getXTable(); + return cloneDeep(xTable.getInsertRecords()); + } + + /** 根据ID获取行,新增的行也能查出来 */ + function getIfRowById(id) { + let xTable = getXTable(); + let row = xTable.getRowById(id), + isNew = false; + if (!row) { + row = getNewRowById(id); + if (!row) { + console.warn(`JVxeTable.getIfRowById:没有找到id为"${id}"的行`); + return { row: null }; + } + isNew = true; + } + return { row, isNew }; + } + + /** 通过临时ID获取新增的行 */ + function getNewRowById(id) { + let records = getXTable().getInsertRecords(); + for (let record of records) { + if (record.id === id) { + return record; + } + } + return null; + } + + /** + * 过滤添加的行 + * @param rows 要筛选的行数据 + * @param remove true = 删除新增,false=只删除id + * @param handler function + */ + function filterNewRows(rows, remove = true, handler?: Fn) { + let insertRecords = getXTable().getInsertRecords(); + let records: Recordable[] = []; + for (let row of rows) { + let item = cloneDeep(row); + if (insertRecords.includes(row)) { + handler ? handler({ item, row, insertRecords }) : null; + if (remove) { + continue; + } + delete item.id; + } + records.push(item); + } + return records; + } + + /** + * 重置滚动条Top位置 + * @param top 新top位置,留空则滚动到上次记录的位置,用于解决切换tab选项卡时导致白屏以及自动将滚动条滚动到顶部的问题 + */ + function resetScrollTop(top?) { + let xTable = getXTable(); + xTable.scrollTo(null, top == null || top === '' ? data.scroll.top : top); + } + + /** 校验table,失败返回errMap,成功返回null */ + async function validateTable(rows?) { + let xTable = getXTable(); + const errMap = await xTable.validate(rows ?? true).catch((errMap) => errMap); + return errMap ? errMap : null; + } + + /** 完整校验 */ + async function fullValidateTable(rows?) { + let xTable = getXTable(); + const errMap = await xTable.fullValidate(rows ?? true).catch((errMap) => errMap); + return errMap ? errMap : null; + } + + type setValuesParam = { rowKey: string; values: Recordable }; + + /** + * 设置某行某列的值 + * + * @param values + * @return 返回受影响的单元格数量 + */ + function setValues(values: setValuesParam[]): number { + if (!isArray(values)) { + console.warn(`[JVxeTable] setValues 必须传递数组`); + return 0; + } + let xTable = getXTable(); + let count = 0; + values.forEach((item) => { + let { rowKey, values: record } = item; + let { row } = getIfRowById(rowKey); + if (!row) { + return; + } + Object.keys(record).forEach((colKey) => { + let column = xTable.getColumnByField(colKey); + if (column) { + let oldValue = row[colKey]; + let newValue = record[colKey]; + if (newValue !== oldValue) { + row[colKey] = newValue; + // 触发 valueChange 事件 + trigger('valueChange', { + type: column.params.type, + value: newValue, + oldValue: oldValue, + col: column.params, + column: column, + isSetValues: true, + row: {...row} + }); + count++; + } + } else { + console.warn(`[JVxeTable] setValues 没有找到key为"${colKey}"的列`); + } + }); + }); + if (count > 0) { + xTable.updateData(); + } + return count; + } + + /** 清空选择行 */ + async function clearSelection() { + const xTable = getXTable(); + let event = { $table: xTable, target: instanceRef.value }; + if (props.rowSelectionType === JVxeTypes.rowRadio) { + await xTable.clearRadioRow(); + handleVxeRadioChange(event); + } else { + await xTable.clearCheckboxRow(); + handleVxeCheckboxChange(event); + } + } + + /** + * 获取选中数据 + * @param isFull 如果 isFull=true 则获取全表已选中的数据 + */ + function getSelectionData(isFull?: boolean) { + const xTable = getXTable(); + if (props.rowSelectionType === JVxeTypes.rowRadio) { + let row = xTable.getRadioRecord(isFull); + if (isNull(row)) { + return []; + } + return filterNewRows([row], false); + } else { + return filterNewRows(xTable.getCheckboxRecords(isFull), false); + } + } + + /** 仅获取被删除的数据(新增又被删除的数据不会被获取到) */ + function getDeleteData() { + return filterNewRows(getXTable().getRemoveRecords(), false); + } + + /** 删除一行或多行数据 */ + async function removeRows(rows) { + const xTable = getXTable(); + const res = await xTable.remove(rows); + let removeEvent: any = { deleteRows: rows, $table: xTable }; + trigger('removed', removeEvent); + await recalcSortNumber(); + return res; + } + + /** 根据id删除一行或多行 */ + function removeRowsById(rowId) { + let rowIds; + if (isArray(rowId)) { + rowIds = rowId; + } else { + rowIds = [rowId]; + } + let rows = rowIds + .map((id) => { + let { row } = getIfRowById(id); + if (!row) { + return; + } + if (row) { + return row; + } else { + console.warn(`【JVxeTable】removeRowsById:${id}不存在`); + return null; + } + }) + .filter((row) => row != null); + return removeRows(rows); + } + + // 删除选中的数据 + async function removeSelection() { + let xTable = getXTable(); + let res; + if (props.rowSelectionType === JVxeTypes.rowRadio) { + res = await xTable.removeRadioRow(); + } else { + res = await xTable.removeCheckboxRow(); + } + await clearSelection(); + await recalcSortNumber(); + return res; + } + + /** 重新计算排序字段的数值 */ + async function recalcSortNumber(force = false) { + if (props.dragSort || force) { + let xTable = getXTable(); + let sortKey = props.sortKey ?? 'orderNum'; + let sortBegin = props.sortBegin ?? 0; + xTable.internalData.tableFullData.forEach((data) => (data[sortKey] = sortBegin++)); + // 4.1.0 + await xTable.updateCache(); + // 4.1.1 + // await xTable.cacheRowMap() + return await xTable.updateData(); + } + } + + /** + * 排序表格 + * @param oldIndex + * @param newIndex + * @param force 强制排序 + */ + async function doSort(oldIndex: number, newIndex: number, force = false) { + if (props.dragSort || force) { + let xTable = getXTable(); + let sort = (array) => { + // 存储old数据,并删除该项 + let row = array.splice(oldIndex, 1)[0]; + // 向newIndex处添加old数据 + array.splice(newIndex, 0, row); + }; + sort(xTable.internalData.tableFullData); + if (xTable.keepSource) { + sort(xTable.internalData.tableSourceData); + } + return await recalcSortNumber(force); + } + } + + /** 行重新排序 */ + function rowResort(oldIndex: number, newIndex: number) { + return doSort(oldIndex, newIndex, true); + } + + // ---------------- begin 权限控制 ---------------- + // 加载权限 + function loadAuthsMap() { + if (!props.authPre || props.authPre.length == 0) { + data.authsMap.value = null; + } else { + data.authsMap.value = getJVxeAuths(props.authPre); + } + } + + /** + * 根据 权限code 获取权限 + * @param authCode + */ + function getAuth(authCode) { + if (data.authsMap.value != null && props.authPre) { + let prefix = getPrefix(props.authPre); + return data.authsMap.value.get(prefix + authCode); + } + return null; + } + + // 获取列权限 + function getColAuth(key: string) { + return getAuth(key); + } + + // 判断按钮权限 + function hasBtnAuth(key: string) { + return getAuth('btn:' + key)?.isAuth ?? true; + } + + // ---------------- end 权限控制 ---------------- + + /* --- 辅助方法 ---*/ + + function created() { + loadAuthsMap(); + } + + // 触发事件 + function trigger(name, event: any = {}) { + event.$target = instanceRef.value; + event.$table = getXTable(); + //online增强参数兼容 + event.target = instanceRef.value; + emit(name, event); + } + + + /** + * 获取选中的行-和 getSelectionData 区别在于对于新增的行也会返回ID + * 用于onlinePopForm + * @param isFull + */ + function getSelectedData(isFull?: boolean) { + const xTable = getXTable(); + let rows:any[] = [] + if (props.rowSelectionType === JVxeTypes.rowRadio) { + let row = xTable.getRadioRecord(isFull); + if (isNull(row)) { + return []; + } + rows = [row] + } else { + rows = xTable.getCheckboxRecords(isFull) + } + let records: Recordable[] = []; + for (let row of rows) { + let item = cloneDeep(row); + records.push(item); + } + return records; + } + + return { + methods: { + trigger, + ...publicMethods, + closeScrolling, + doSort, + recalcSortNumber, + handleVxeScroll, + handleVxeRadioChange, + handleVxeCheckboxAll, + handleVxeCheckboxChange, + handleFooterMethod, + handleCellClick, + handleEditActived, + handleEditClosed, + handleCheckMethod, + handleActiveMethod, + handleExpandToggleMethod, + getColAuth, + hasBtnAuth, + }, + publicMethods, + created, + }; +} diff --git a/src/components/jeecg/JVxeTable/src/hooks/usePagination.ts b/src/components/jeecg/JVxeTable/src/hooks/usePagination.ts new file mode 100644 index 0000000..5bd6546 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/usePagination.ts @@ -0,0 +1,66 @@ +import { computed, reactive, h } from 'vue'; +import { JVxeTableMethods, JVxeTableProps } from '/@/components/jeecg/JVxeTable/src/types'; +import { isEmpty } from '/@/utils/is'; +import { Pagination } from 'ant-design-vue'; + +export function usePagination(props: JVxeTableProps, methods: JVxeTableMethods) { + const innerPagination = reactive({ + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + '-' + range[1] + ' 共 ' + total + ' 条'; + }, + showQuickJumper: true, + showSizeChanger: true, + total: 100, + }); + + const bindProps = computed(() => { + return { + ...innerPagination, + ...props.pagination, + size: props.size === 'tiny' ? 'small' : '', + }; + }); + + const boxClass = computed(() => { + return { + 'j-vxe-pagination': true, + 'show-quick-jumper': !!bindProps.value.showQuickJumper, + }; + }); + + function handleChange(current, pageSize) { + innerPagination.current = current; + methods.trigger('pageChange', { current, pageSize }); + } + + function handleShowSizeChange(current, pageSize) { + innerPagination.pageSize = pageSize; + methods.trigger('pageChange', { current, pageSize }); + } + + /** 渲染分页器 */ + function renderPagination() { + if (props.pagination && !isEmpty(props.pagination)) { + return h( + 'div', + { + class: boxClass.value, + }, + [ + h(Pagination, { + ...bindProps.value, + disabled: props.disabled, + onChange: handleChange, + onShowSizeChange: handleShowSizeChange, + }), + ] + ); + } + return null; + } + + return { renderPagination }; +} diff --git a/src/components/jeecg/JVxeTable/src/hooks/useRenderComponents.ts b/src/components/jeecg/JVxeTable/src/hooks/useRenderComponents.ts new file mode 100644 index 0000000..e8ad036 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/useRenderComponents.ts @@ -0,0 +1,61 @@ +import { h } from 'vue'; +import { JVxeDataProps, JVxeTableMethods, JVxeTableProps } from '../types'; +import JVxeSubPopover from '../components/JVxeSubPopover.vue'; +import JVxeDetailsModal from '../components/JVxeDetailsModal.vue'; +import { useToolbar } from '/@/components/jeecg/JVxeTable/src/hooks/useToolbar'; +import { usePagination } from '/@/components/jeecg/JVxeTable/src/hooks/usePagination'; + +export function useRenderComponents(props: JVxeTableProps, data: JVxeDataProps, methods: JVxeTableMethods, slots) { + // 渲染 toolbar + const { renderToolbar } = useToolbar(props, data, methods, slots); + // 渲染分页器 + const { renderPagination } = usePagination(props, methods); + + // 渲染 toolbarAfter 插槽 + function renderToolbarAfterSlot() { + if (slots['toolbarAfter']) { + return slots['toolbarAfter'](); + } + return null; + } + + // 渲染点击时弹出的子表 + function renderSubPopover() { + if (props.clickRowShowSubForm && slots.subForm) { + return h( + JVxeSubPopover, + { + ref: 'subPopoverRef', + }, + { + subForm: slots.subForm, + } + ); + } + return null; + } + + // 渲染点击时弹出的详细信息 + function renderDetailsModal() { + if (props.clickRowShowMainForm && slots.mainForm) { + return h( + JVxeDetailsModal, + { + ref: 'detailsModalRef', + trigger: methods.trigger, + }, + { + mainForm: slots.mainForm, + } + ); + } + } + + return { + renderToolbar, + renderPagination, + renderSubPopover, + renderDetailsModal, + renderToolbarAfterSlot, + }; +} diff --git a/src/components/jeecg/JVxeTable/src/hooks/useToolbar.ts b/src/components/jeecg/JVxeTable/src/hooks/useToolbar.ts new file mode 100644 index 0000000..05b51c1 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/useToolbar.ts @@ -0,0 +1,53 @@ +import { h } from 'vue'; +import JVxeToolbar from '../components/JVxeToolbar.vue'; +import { JVxeDataProps, JVxeTableMethods, JVxeTableProps } from '../types'; + +export function useToolbar(props: JVxeTableProps, data: JVxeDataProps, methods: JVxeTableMethods, $slots) { + /** 渲染工具栏 */ + function renderToolbar() { + if (props.toolbar) { + return h( + JVxeToolbar, + { + size: props.size, + disabled: props.disabled, + toolbarConfig: props.toolbarConfig, + disabledRows: props.disabledRows, + hasBtnAuth: methods.hasBtnAuth, + selectedRowIds: data.selectedRowIds.value, + // 新增事件 + onAdd: () => methods.addRows(), + // 保存事件 + onSave: () => methods.trigger('save'), + onRemove() { + let $table = methods.getXTable(); + let deleteRows = methods.filterNewRows(data.selectedRows.value); + // 触发删除事件 + if (deleteRows.length > 0) { + let removeEvent: any = { deleteRows, $table}; + if (props.asyncRemove) { + // 确认删除,只有调用这个方法才会真删除 + removeEvent.confirmRemove = () => methods.removeSelection(); + } else { + methods.removeSelection(); + } + methods.trigger('removed', removeEvent); + } else { + methods.removeSelection(); + } + }, + // 清除选择事件 + onClearSelection: () => methods.clearSelection(), + onRegister: ({ xToolbarRef }) => methods.getXTable().connect(xToolbarRef.value), + }, + { + toolbarPrefix: $slots.toolbarPrefix, + toolbarSuffix: $slots.toolbarSuffix, + } + ); + } + return null; + } + + return { renderToolbar }; +} diff --git a/src/components/jeecg/JVxeTable/src/hooks/useValidateRules.ts b/src/components/jeecg/JVxeTable/src/hooks/useValidateRules.ts new file mode 100644 index 0000000..2535b41 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/useValidateRules.ts @@ -0,0 +1,103 @@ +import { VxeTablePropTypes } from 'vxe-table'; +import { isArray } from '/@/utils/is'; +import { HandleArgs } from './useColumns'; +import { replaceProps } from '../utils/enhancedUtils'; + +export function useValidateRules(args: HandleArgs) { + const { data } = args; + const col = args.col!; + let rules: VxeTablePropTypes.EditRules[] = []; + if (isArray(col.validateRules)) { + for (let rule of col.validateRules) { + let replace = { + message: replaceProps(col, rule.message), + }; + if (rule.unique || rule.pattern === 'only') { + // 唯一校验器 + rule.validator = uniqueValidator(args); + } else if (rule.pattern) { + // 非空 + if (rule.pattern === fooPatterns[0].value) { + rule.required = true; + delete rule.pattern; + } else { + // 兼容Online表单的特殊规则 + for (let foo of fooPatterns) { + if (foo.value === rule.pattern) { + rule.pattern = foo.pattern; + break; + } + } + } + } else if (typeof rule.handler === 'function') { + // 自定义函数校验 + rule.validator = handlerConvertToValidator; + } + rules.push(Object.assign({}, rule, replace)); + } + } + data.innerEditRules[col.key] = rules; +} + +/** 唯一校验器 */ +function uniqueValidator({ methods }: HandleArgs) { + return function (event) { + const { cellValue, column, rule } = event; + let tableData = methods.getTableData(); + let findCount = 0; + for (let rowData of tableData) { + if (rowData[column.params.key] === cellValue) { + if (++findCount >= 2) { + return Promise.reject(new Error(rule.message)); + } + } + } + return Promise.resolve(); + }; +} + +/** 旧版handler转为新版Validator */ +function handlerConvertToValidator(event) { + const { column, rule } = event; + return new Promise((resolve, reject) => { + rule.handler(event, (flag, msg) => { + let message = rule.message; + if (typeof msg === 'string') { + message = replaceProps(column.params, msg); + } + if (flag == null) { + resolve(message); + } else if (!!flag) { + resolve(message); + } else { + reject(new Error(message)); + } + }); + }); +} + +// 兼容 online 的规则 +const fooPatterns = [ + { title: '非空', value: '*', pattern: /^.+$/ }, + { title: '6到16位数字', value: 'n6-16', pattern: /^\d{6,16}$/ }, + { title: '6到16位任意字符', value: '*6-16', pattern: /^.{6,16}$/ }, + { title: '6到18位字母', value: 's6-18', pattern: /^[a-z|A-Z]{6,18}$/ }, + //update-begin-author:taoyan date:2022-6-1 for: VUEN-1160 对多子表,网址校验不正确 + { + title: '网址', + value: 'url', + pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, + }, + //update-end-author:taoyan date:2022-6-1 for: VUEN-1160 对多子表,网址校验不正确 + { title: '电子邮件', value: 'e', pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/ }, + { title: '手机号码', value: 'm', pattern: /^1[3456789]\d{9}$/ }, + { title: '邮政编码', value: 'p', pattern: /^[1-9]\d{5}$/ }, + { title: '字母', value: 's', pattern: /^[A-Z|a-z]+$/ }, + { title: '数字', value: 'n', pattern: /^-?\d+(\.?\d+|\d?)$/ }, + { title: '整数', value: 'z', pattern: /^-?\d+$/ }, + { + title: '金额', + value: 'money', + pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,5}))$/, + }, +]; diff --git a/src/components/jeecg/JVxeTable/src/hooks/useWebSocket.ts b/src/components/jeecg/JVxeTable/src/hooks/useWebSocket.ts new file mode 100644 index 0000000..ba0d355 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/useWebSocket.ts @@ -0,0 +1,236 @@ +import { watch, onUnmounted } from 'vue'; +import { buildUUID } from '/@/utils/uuid'; +import { useGlobSetting } from '/@/hooks/setting'; +import { useUserStore } from '/@/store/modules/user'; +import { JVxeDataProps, JVxeTableMethods, JVxeTableProps } from '../types'; +import { isArray } from '/@/utils/is'; +import { getToken } from '/@/utils/auth'; + +// vxe socket +const vs = { + // 页面唯一 id,用于标识同一用户,不同页面的websocket + pageId: buildUUID(), + // webSocket 对象 + ws: null, + // 一些常量 + constants: { + // 消息类型 + TYPE: 'type', + // 消息数据 + DATA: 'data', + // 消息类型:心跳检测 + TYPE_HB: 'heart_beat', + // 消息类型:更新vxe table数据 + TYPE_UVT: 'update_vxe_table', + }, + // 心跳检测 + heartCheck: { + // 间隔时间,间隔多久发送一次心跳消息 + interval: 10000, + // 心跳消息超时时间,心跳消息多久没有回复后重连 + timeout: 6000, + timeoutTimer: -1, + clear() { + clearTimeout(this.timeoutTimer); + return this; + }, + start() { + vs.sendMessage(vs.constants.TYPE_HB, ''); + // 如果超过一定时间还没重置,说明后端主动断开了 + this.timeoutTimer = window.setTimeout(() => { + vs.reconnect(); + }, this.timeout); + return this; + }, + // 心跳消息返回 + back() { + this.clear(); + window.setTimeout(() => this.start(), this.interval); + }, + }, + + /** 初始化 WebSocket */ + initialWebSocket() { + if (this.ws === null) { + const userId = useUserStore().getUserInfo?.id; + const domainURL = useGlobSetting().uploadUrl!; + const domain = domainURL.replace('https://', 'wss://').replace('http://', 'ws://'); + const url = `${domain}/vxeSocket/${userId}/${this.pageId}`; + //update-begin-author:taoyan date:2022-4-24 for: v2.4.6 的 websocket 服务端,存在性能和安全问题。 #3278 + let token = (getToken() || '') as string; + this.ws = new WebSocket(url, [token]); + //update-end-author:taoyan date:2022-4-24 for: v2.4.6 的 websocket 服务端,存在性能和安全问题。 #3278 + this.ws.onopen = this.on.open.bind(this); + this.ws.onerror = this.on.error.bind(this); + this.ws.onmessage = this.on.message.bind(this); + this.ws.onclose = this.on.close.bind(this); + } + }, + + // 发送消息 + sendMessage(type, message) { + try { + let ws = this.ws; + if (ws != null && ws.readyState === ws.OPEN) { + ws.send( + JSON.stringify({ + type: type, + data: message, + }) + ); + } + } catch (err: any) { + console.warn('【JVxeWebSocket】发送消息失败:(' + err.code + ')'); + } + }, + + /** 绑定全局VXE表格 */ + tableMap: new Map(), + /** 添加绑定 */ + addBind(map, key, value: VmArgs) { + let binds = map.get(key); + if (isArray(binds)) { + binds.push(value); + } else { + map.set(key, [value]); + } + }, + /** 移除绑定 */ + removeBind(map, key, value: VmArgs) { + let binds = map.get(key); + if (isArray(binds)) { + for (let i = 0; i < binds.length; i++) { + let bind = binds[i]; + if (bind === value) { + binds.splice(i, 1); + break; + } + } + if (binds.length === 0) { + map.delete(key); + } + } else { + map.delete(key); + } + }, + // 呼叫绑定的表单 + callBind(map, key, callback) { + let binds = map.get(key); + if (isArray(binds)) { + binds.forEach(callback); + } + }, + + lockReconnect: false, + /** 尝试重连 */ + reconnect() { + if (this.lockReconnect) return; + this.lockReconnect = true; + setTimeout(() => { + if (this.ws && this.ws.close) { + this.ws.close(); + } + this.ws = null; + console.info('【JVxeWebSocket】尝试重连...'); + this.initialWebSocket(); + this.lockReconnect = false; + }, 5000); + }, + + on: { + open() { + console.info('【JVxeWebSocket】连接成功'); + this.heartCheck.start(); + }, + error(e) { + console.warn('【JVxeWebSocket】连接发生错误:', e); + this.reconnect(); + }, + message(e) { + // 解析消息 + let json; + try { + json = JSON.parse(e.data); + } catch (e: any) { + console.warn('【JVxeWebSocket】收到无法解析的消息:', e.data); + return; + } + let type = json[this.constants.TYPE]; + let data = json[this.constants.DATA]; + switch (type) { + // 心跳检测 + case this.constants.TYPE_HB: + this.heartCheck.back(); + break; + // 更新form数据 + case this.constants.TYPE_UVT: + this.callBind(this.tableMap, data.socketKey, (args) => this.onVM.onUpdateTable(args, ...data.args)); + break; + default: + console.warn('【JVxeWebSocket】收到不识别的消息类型:' + type); + break; + } + }, + close(e) { + console.info('【JVxeWebSocket】连接被关闭:', e); + this.reconnect(); + }, + }, + + onVM: { + /** 收到更新表格的消息 */ + onUpdateTable({ props, data, methods }: VmArgs, row, caseId) { + if (data.caseId !== caseId) { + const tableRow = methods.getIfRowById(row.id).row; + // 局部保更新数据 + if (tableRow) { + if (props.reloadEffect) { + data.reloadEffectRowKeysMap[row.id] = true; + } + Object.assign(tableRow, row, { id: tableRow.id }); + methods.getXTable().reloadRow(tableRow); + } + } + }, + }, +} as { + ws: Nullable; +} & Recordable; + +type VmArgs = { + props: JVxeTableProps; + data: JVxeDataProps; + methods: JVxeTableMethods; +}; + +export function useWebSocket(props: JVxeTableProps, data: JVxeDataProps, methods) { + const args: VmArgs = { props, data, methods }; + watch( + () => props.socketReload, + (socketReload: boolean) => { + if (socketReload) { + vs.initialWebSocket(); + vs.addBind(vs.tableMap, props.socketKey, args); + } else { + vs.removeBind(vs.tableMap, props.socketKey, args); + } + }, + { immediate: true } + ); + + /** 发送socket消息更新行 */ + function socketSendUpdateRow(row) { + vs.sendMessage(vs.constants.TYPE_UVT, { + socketKey: props.socketKey, + args: [row, data.caseId], + }); + } + + onUnmounted(() => { + vs.removeBind(vs.tableMap, props.socketKey, args); + }); + + return { + socketSendUpdateRow, + }; +} diff --git a/src/components/jeecg/JVxeTable/src/install.ts b/src/components/jeecg/JVxeTable/src/install.ts new file mode 100644 index 0000000..fa85dea --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/install.ts @@ -0,0 +1,67 @@ +import type { App } from 'vue'; +// 引入 vxe-table +import 'xe-utils'; +import VXETable /*Grid*/ from 'vxe-table'; +import VXETablePluginAntd from 'vxe-table-plugin-antd'; +import 'vxe-table/lib/style.css'; + +import JVxeTable from './JVxeTable'; +import { getEventPath } from '/@/utils/common/compUtils'; +import { registerAllComponent } from './utils/registerUtils'; +import { getEnhanced } from './utils/enhancedUtils'; + +export function registerJVxeTable(app: App) { + // VXETable 全局配置 + const VXETableSettings = { + // z-index 起始值 + zIndex: 1000, + table: {}, + }; + + // 添加事件拦截器 event.clearActived + // 比如点击了某个组件的弹出层面板之后,此时被激活单元格不应该被自动关闭,通过返回 false 可以阻止默认的行为。 + VXETable.interceptor.add('event.clearActived', function (this: any, params) { + // 获取组件增强 + let col = params.column.params; + let { $event } = params; + const interceptor = getEnhanced(col.type).interceptor; + // 执行增强 + let flag = interceptor['event.clearActived']?.call(this, ...arguments); + if (flag === false) { + return false; + } + + let path = getEventPath($event); + for (let p of path) { + let className: any = p.className || ''; + className = typeof className === 'string' ? className : className.toString(); + + /* --- 特殊处理以下组件,点击以下标签时不清空编辑状态 --- */ + + // 点击的标签是JInputPop + if (className.includes('j-input-pop')) { + return false; + } + // 点击的标签是JPopup的弹出层、部门选择、用户选择 + if (className.includes('j-popup-modal') || className.includes('j-depart-select-modal') || className.includes('j-user-select-modal')) { + return false; + } + // 点击的是日期选择器 + if (className.includes('j-vxe-date-picker')) { + return false; + } + // 执行增强 + let flag = interceptor['event.clearActived.className']?.call(this, className, ...arguments); + if (flag === false) { + return false; + } + } + }); + // 注册插件 + VXETable.use(VXETablePluginAntd); + // 注册自定义组件 + registerAllComponent(); + // 执行注册方法 + app.use(VXETable, VXETableSettings); + app.component('JVxeTable', JVxeTable); +} diff --git a/src/components/jeecg/JVxeTable/src/style/index.less b/src/components/jeecg/JVxeTable/src/style/index.less new file mode 100644 index 0000000..510209a --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/style/index.less @@ -0,0 +1,102 @@ +@import 'vxe.const'; +@import 'vxe.dark'; + +.@{prefix-cls} { + // 编辑按钮样式 + .vxe-cell--edit-icon { + border-color: #606266; + } + + .sort--active { + border-color: @primary-color; + } + + // toolbar 样式 + &-toolbar { + &-collapsed { + [data-collapse] { + display: none; + } + } + + &-button.div .ant-btn { + margin-right: 8px; + } + } + + // 分页器 + .j-vxe-pagination { + margin-top: 8px; + text-align: right; + + .ant-pagination-options-size-changer.ant-select { + margin-right: 0; + } + + &.show-quick-jumper { + .ant-pagination-options-size-changer.ant-select { + margin-right: 8px; + } + } + } + + // 更改 header 底色 + .vxe-table.border--default .vxe-table--header-wrapper, + .vxe-table.border--full .vxe-table--header-wrapper, + .vxe-table.border--outer .vxe-table--header-wrapper { + //background-color: #FFFFFF; + } + + // 更改 tooltip 校验失败的颜色 + .vxe-table--tooltip-wrapper.vxe-table--valid-error { + background-color: #f5222d !important; + } + + // 更改 输入框 校验失败的颜色 + .col--valid-error > .vxe-cell > .ant-input, + .col--valid-error > .vxe-cell > .ant-select .ant-input, + .col--valid-error > .vxe-cell > .ant-select .ant-select-selection, + .col--valid-error > .vxe-cell > .ant-input-number, + .col--valid-error > .vxe-cell > .ant-cascader-picker .ant-cascader-input, + .col--valid-error > .vxe-cell > .ant-calendar-picker .ant-calendar-picker-input, + .col--valid-error > .vxe-tree-cell > .ant-input, + .col--valid-error > .vxe-tree-cell > .ant-select .ant-input, + .col--valid-error > .vxe-tree-cell > .ant-select .ant-select-selection, + .col--valid-error > .vxe-tree-cell > .ant-input-number, + .col--valid-error > .vxe-tree-cell > .ant-cascader-picker .ant-cascader-input, + .col--valid-error > .vxe-tree-cell > .ant-calendar-picker .ant-calendar-picker-input { + border-color: #f5222d !important; + } + + .vxe-body--row.sortable-ghost, + .vxe-body--row.sortable-chosen { + background-color: #dfecfb; + } + + // ----------- 【VUEN-1691】默认隐藏滚动条,鼠标放上去才显示 ------------------------------------------- + .vxe-table { + //.vxe-table--footer-wrapper.body--wrapper, + .vxe-table--body-wrapper.body--wrapper { + overflow-x: hidden; + } + + &:hover { + //.vxe-table--footer-wrapper.body--wrapper, + .vxe-table--body-wrapper.body--wrapper { + overflow-x: auto; + } + } + } + // ----------- 【VUEN-1691】默认隐藏滚动条,鼠标放上去才显示 ------------------------------------------- + + // 调整展开/收起图标样式 + .vxe-table--render-default .vxe-table--expanded .vxe-table--expand-btn { + width: 17px; + height: 17px; + } + /*【美化表单】行编辑table的title字体改小一号*/ + .vxe-header--column.col--ellipsis>.vxe-cell .vxe-cell--title{ + font-size: 13px; + } + +} diff --git a/src/components/jeecg/JVxeTable/src/style/reload-effect.less b/src/components/jeecg/JVxeTable/src/style/reload-effect.less new file mode 100644 index 0000000..0333c81 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/style/reload-effect.less @@ -0,0 +1,44 @@ +.j-vxe-reload-effect-box { + &, + .j-vxe-reload-effect-span { + display: inline; + height: 100%; + position: relative; + } + + .j-vxe-reload-effect-span { + &.layer-top { + display: inline-block; + width: 100%; + + position: absolute; + z-index: 2; + background-color: white; + + transform-origin: 0 0; + animation: reload-effect 1.5s forwards; + } + + &.layer-bottom { + z-index: 1; + } + } + + // 定义动画 + @keyframes reload-effect { + 0% { + opacity: 1; + transform: rotateX(0); + } + 10% { + opacity: 1; + } + 90% { + opacity: 0; + } + 100% { + opacity: 0; + transform: rotateX(180deg); + } + } +} diff --git a/src/components/jeecg/JVxeTable/src/style/vxe.const.less b/src/components/jeecg/JVxeTable/src/style/vxe.const.less new file mode 100644 index 0000000..49db4e3 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/style/vxe.const.less @@ -0,0 +1,2 @@ +//noinspection LessUnresolvedVariable +@prefix-cls: ~'@{namespace}-j-vxe-table'; diff --git a/src/components/jeecg/JVxeTable/src/style/vxe.dark.less b/src/components/jeecg/JVxeTable/src/style/vxe.dark.less new file mode 100644 index 0000000..a33c872 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/style/vxe.dark.less @@ -0,0 +1,112 @@ +@import 'vxe.const'; + +[data-theme='dark'] .@{prefix-cls} { + @fontColor: #c9d1d9; + @bgColor: #151515; + @borderColor: #606060; + + .vxe-cell--item, + .vxe-cell--title, + .vxe-cell, + .vxe-body--expanded-cell { + color: @fontColor; + } + + .vxe-toolbar { + background-color: @bgColor; + } + + .vxe-table--render-default .vxe-table--body-wrapper, + .vxe-table--render-default .vxe-table--footer-wrapper { + background-color: @bgColor; + } + + // 外边框 + .vxe-table--render-default .vxe-table--border-line { + border-color: @borderColor; + } + + // header 下边框 + .vxe-table .vxe-table--header-wrapper .vxe-table--header-border-line { + border-bottom-color: @borderColor; + } + + // footer 上边框 + .vxe-table--render-default .vxe-table--footer-wrapper { + border-top-color: @borderColor; + } + + // 展开行 边框 + .vxe-table--render-default .vxe-body--expanded-column { + border-bottom-color: @borderColor; + } + + // 行斑马纹 + .vxe-table--render-default .vxe-body--row.row--stripe { + background-color: #1e1e1e; + } + + // 行hover + .vxe-table--render-default .vxe-body--row.row--hover { + background-color: #262626; + } + + // 选中行 + .vxe-table--render-default .vxe-body--row.row--checked { + background-color: #44403a; + + &.row--hover { + background-color: #59524b; + } + } + + .vxe-table--render-default.border--default .vxe-table--header-wrapper, + .vxe-table--render-default.border--full .vxe-table--header-wrapper, + .vxe-table--render-default.border--outer .vxe-table--header-wrapper { + background-color: #1d1d1d; + } + + .vxe-table--render-default.border--default .vxe-body--column, + .vxe-table--render-default.border--default .vxe-footer--column, + .vxe-table--render-default.border--default .vxe-header--column, + .vxe-table--render-default.border--inner .vxe-body--column, + .vxe-table--render-default.border--inner .vxe-footer--column, + .vxe-table--render-default.border--inner .vxe-header--column { + background-image: linear-gradient(#1d1d1d, #1d1d1d); + } + + // 列宽拖动 + .vxe-header--column .vxe-resizable.is--line:before { + background-color: #505050; + } + + // checkbox + .vxe-custom--option .vxe-checkbox--icon:before, + .vxe-export--panel-column-option .vxe-checkbox--icon:before, + .vxe-table--filter-option .vxe-checkbox--icon:before, + .vxe-table--render-default .vxe-cell--checkbox .vxe-checkbox--icon:before { + background-color: @bgColor; + border-color: @borderColor; + } + + .vxe-toolbar .vxe-custom--option-wrapper { + background-color: @bgColor; + } + + .vxe-button { + background-color: @bgColor; + border-color: @borderColor; + } + + .vxe-button.type--button:not(.is--disabled):active { + background-color: @bgColor; + } + + .vxe-toolbar .vxe-custom--wrapper.is--active > .vxe-button { + background-color: @bgColor; + } + + .vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--footer button { + color: @fontColor; + } +} diff --git a/src/components/jeecg/JVxeTable/src/types/JVxeComponent.ts b/src/components/jeecg/JVxeTable/src/types/JVxeComponent.ts new file mode 100644 index 0000000..1e7009a --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/types/JVxeComponent.ts @@ -0,0 +1,87 @@ +import { ComponentInternalInstance, ExtractPropTypes } from 'vue'; +import { useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks'; + +export namespace JVxeComponent { + export type Props = ExtractPropTypes>; + + interface EnhancedCtx { + props?: JVxeComponent.Props; + context?: any; + } + + /** 组件增强类型 */ + export interface Enhanced { + // 注册参数(详见:https://xuliangzhan_admin.gitee.io/vxe-table/v4/table/renderer/edit) + installOptions: { + // 自动聚焦的 class 类名 + autofocus?: string; + } & Recordable; + // 事件拦截器(用于兼容) + interceptor: { + // 已实现:event.clearActived + // 说明:比如点击了某个组件的弹出层面板之后,此时被激活单元格不应该被自动关闭,通过返回 false 可以阻止默认的行为。 + 'event.clearActived'?: (params, event, target, ctx?: EnhancedCtx) => boolean; + // 自定义:event.clearActived.className + // 说明:比原生的多了一个参数:className,用于判断点击的元素的样式名(递归到顶层) + 'event.clearActived.className'?: (params, event, target, ctx?: EnhancedCtx) => boolean; + }; + // 【功能开关】 + switches: { + // 是否使用 editRender 模式(仅当前组件,并非全局) + // 如果设为true,则表头上方会出现一个可编辑的图标 + editRender?: boolean; + // false = 组件触发后可视);true = 组件一直可视 + visible?: boolean; + }; + // 【切面增强】切面事件处理,一般在某些方法执行后同步执行 + aopEvents: { + // 单元格被激活编辑时会触发该事件 + editActived?: (this: ComponentInternalInstance, ...args) => any; + // 单元格编辑状态下被关闭时会触发该事件 + editClosed?: (this: ComponentInternalInstance, ...args) => any; + // 返回值决定单元格是否可以编辑 + activeMethod?: (this: ComponentInternalInstance, ...args) => boolean; + }; + // 【翻译增强】可以实现例如select组件保存的value,但是span模式下需要显示成text + translate: { + // 是否启用翻译 + enabled?: boolean; + /** + * 【翻译处理方法】如果handler留空,则使用默认的翻译方法 + * + * @param value 需要翻译的值 + * @returns{*} 返回翻译后的数据 + */ + handler?: (value, ctx?: EnhancedCtx) => any; + }; + /** + * 【获取值增强】组件抛出的值 + * + * @param value 保存到数据库里的值 + * @returns{*} 返回处理后的值 + */ + getValue: (value, ctx?: EnhancedCtx) => any; + /** + * 【设置值增强】设置给组件的值 + * + * @param value 组件触发的值 + * @returns{*} 返回处理后的值 + */ + setValue: (value, ctx?: EnhancedCtx) => any; + /** + * 【新增行增强】在用户点击新增时触发的事件,返回新行的默认值 + * + * @param defaultValue 默认值 + * @param row 行数据 + * @param column 列配置,.params 是用户配置的参数 + * @param $table vxe 实例 + * @param renderOptions 渲染选项 + * @param params 可以在这里获取 $table + * + * @returns 返回新值 + */ + createValue: (defaultValue: any, ctx?: EnhancedCtx) => any; + } + + export type EnhancedPartial = Partial; +} diff --git a/src/components/jeecg/JVxeTable/src/types/JVxeTypes.ts b/src/components/jeecg/JVxeTable/src/types/JVxeTypes.ts new file mode 100644 index 0000000..c6e7d7b --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/types/JVxeTypes.ts @@ -0,0 +1,60 @@ +/** 组件类型 */ +export enum JVxeTypes { + // 行号列 + rowNumber = 'row-number', + // 选择列 + rowCheckbox = 'row-checkbox', + // 单选列 + rowRadio = 'row-radio', + // 展开列 + rowExpand = 'row-expand', + // 上下排序 + rowDragSort = 'row-drag-sort', + + input = 'input', + inputNumber = 'input-number', + textarea = 'textarea', + select = 'select', + date = 'date', + datetime = 'datetime', + time = 'time', + checkbox = 'checkbox', + upload = 'upload', + // 下拉搜索 + selectSearch = 'select-search', + // 下拉多选 + selectMultiple = 'select-multiple', + // 进度条 + progress = 'progress', + //部门选择 + departSelect = 'depart-select', + //用户选择 + userSelect = 'user-select', + + // 拖轮Tags(暂无用) + tags = 'tags', // TODO 待实现 + + slot = 'slot', + normal = 'normal', + hidden = 'hidden', + + // 以下为自定义组件 + popup = 'popup', + selectDictSearch = 'selectDictSearch', + radio = 'radio', + image = 'image', + file = 'file', + // 省市区 + pca = 'pca', +} + +// 为了防止和 vxe 内置的类型冲突,所以加上一个前缀 +// 前缀是自动加的,代码中直接用就行(JVxeTypes.input) +export const JVxeTypePrefix = 'j-'; + +/** VxeTable 渲染类型 */ +export enum JVxeRenderType { + editer = 'editer', + spaner = 'spaner', + default = 'default', +} diff --git a/src/components/jeecg/JVxeTable/src/types/index.ts b/src/components/jeecg/JVxeTable/src/types/index.ts new file mode 100644 index 0000000..a7dca8e --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/types/index.ts @@ -0,0 +1,120 @@ +import type { Component, Ref, ComputedRef, ExtractPropTypes } from 'vue'; +import type { VxeColumnProps } from 'vxe-table/types/column'; +import type { JVxeComponent } from './JVxeComponent'; +import type { VxeGridInstance, VxeTablePropTypes } from 'vxe-table'; +import { JVxeTypes } from './JVxeTypes'; +import { vxeProps } from '../vxe.data'; +import { useMethods } from '../hooks/useMethods'; +import { getJVxeAuths } from '../utils/authUtils'; + +export type JVxeTableProps = Partial>>; +export type JVxeTableMethods = ReturnType['methods']; + +export type JVxeVueComponent = { + enhanced?: JVxeComponent.EnhancedPartial; +} & Component; + +type statisticsTypes = 'sum' | 'average'; + +export type JVxeColumn = IJVxeColumn & Recordable; + +/** + * JVxe 列配置项 + */ +export interface IJVxeColumn extends VxeColumnProps { + type?: any; + // 行唯一标识 + key: string; + // 表单预期值的提示信息,可以使用${...}变量替换文本 + placeholder?: string; + // 默认值 + defaultValue?: any; + // 是否禁用当前列,默认false + disabled?: boolean; + // 校验规则 TODO 类型待定义 + validateRules?: any; + // 联动下一级的字段key + linkageKey?: string; + // 自定义传入组件的其他属性 + props?: Recordable; + allowClear?: boolean; // 允许清除 + // 【inputNumber】是否是统计列,只有 inputNumber 才能设置统计列。统计列:sum 求和;average 平均值 + statistics?: boolean | [statisticsTypes, statisticsTypes?]; + // 【select】 + dictCode?: string; // 字典 code + options?: { title?: string; label?: string; text?: string; value: any; disabled?: boolean }[]; // 下拉选项列表 + allowInput?: boolean; // 允许输入 + allowSearch?: boolean; // 允许搜索 + // 【slot】 + slotName?: string; // 插槽名 + // 【checkbox】 + customValue?: [any, any]; // 自定义值 + defaultChecked?: boolean; // 默认选中 + // 【upload】 upload + btnText?: string; // 上传按钮文字 + token?: boolean; // 是否传递 token + responseName?: string; // 返回取值名称 + action?: string; // 上传地址 + allowRemove?: boolean; // 是否允许删除 + allowDownload?: boolean; // 是否允许下载 + // 【下拉字典搜索】 + dict?: string; // 字典表配置信息:数据库表名,显示字段名,存储字段名 + async?: boolean; // 是否同步模式 + tipsContent?: string; + // 【popup】 + popupCode?: string; + field?: string; + orgFields?: string; + destFields?: string; +} + +export interface JVxeRefs { + gridRef: Ref; + subPopoverRef: Ref; + detailsModalRef: Ref; +} + +export interface JVxeDataProps { + prefixCls: string; + // vxe 实例ID + caseId: string; + // vxe 最终 columns + vxeColumns?: ComputedRef; + // vxe 最终 dataSource + vxeDataSource: Ref; + // 记录滚动条位置 + scroll: { top: number; left: number }; + // 当前是否正在滚动 + scrolling: Ref; + // vxe 默认配置 + defaultVxeProps: object; + // 绑定左侧选择框 + selectedRows: Ref; + // 绑定左侧选择框已选择的id + selectedRowIds: Ref; + disabledRowIds: string[]; + // 统计列配置 + statistics: { + has: boolean; + sum: string[]; + average: string[]; + }; + // 所有和当前表格相关的授权信息 + authsMap: Ref>>; + // 内置 EditRules + innerEditRules: Recordable; + // 联动下拉选项(用于隔离不同的下拉选项) + // 内部联动配置,map + innerLinkageConfig: Map; + // 开启了数据刷新效果的行 + reloadEffectRowKeysMap: Recordable; +} + +export interface JVxeLinkageConfig { + // 联动第一级的 key + key: string; + // 获取数据的方法 + requestData: (parent: string) => Promise; +} + +export { JVxeTypes }; diff --git a/src/components/jeecg/JVxeTable/src/utils/authUtils.ts b/src/components/jeecg/JVxeTable/src/utils/authUtils.ts new file mode 100644 index 0000000..1b4ca73 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/utils/authUtils.ts @@ -0,0 +1,50 @@ +/* JVxeTable 行编辑 权限 */ +import { usePermissionStoreWithOut } from '/@/store/modules/permission'; + +const permissionStore = usePermissionStoreWithOut(); + +/** + * JVxe 专用,获取权限 + * @param prefix + */ +export function getJVxeAuths(prefix) { + prefix = getPrefix(prefix); + let { authList, allAuthList } = permissionStore; + let authsMap = new Map(); + if (!prefix || prefix.length == 0) { + return authsMap; + } + // 将所有vxe用到的权限取出来 + for (let auth of allAuthList) { + if (auth.status == '1' && (auth.action || '').startsWith(prefix)) { + authsMap.set(auth.action, { ...auth, isAuth: false }); + } + } + // 设置是否已授权 + for (let auth of authList) { + let getAuth = authsMap.get(auth.action); + if (getAuth != null) { + getAuth.isAuth = true; + } + } + //update-begin-author:taoyan date:2022-6-1 for: VUEN-1162 子表按钮没控制 + let onlineButtonAuths = permissionStore.getOnlineSubTableAuth(prefix); + if (onlineButtonAuths && onlineButtonAuths.length > 0) { + for (let auth of onlineButtonAuths) { + authsMap.set(prefix + 'btn:' + auth, { action: auth, type: 1, status: 1, isAuth: false }); + } + } + //update-end-author:taoyan date:2022-6-1 for: VUEN-1162 子表按钮没控制 + return authsMap; +} + +/** + * 获取前缀 + * @param prefix + */ +export function getPrefix(prefix: string) { + if (prefix && !prefix.endsWith(':')) { + return prefix + ':'; + } + return prefix; +} diff --git a/src/components/jeecg/JVxeTable/src/utils/enhancedUtils.ts b/src/components/jeecg/JVxeTable/src/utils/enhancedUtils.ts new file mode 100644 index 0000000..18b360a --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/utils/enhancedUtils.ts @@ -0,0 +1,155 @@ +import type { Ref, ComponentInternalInstance } from 'vue'; +import { unref, isRef } from 'vue'; +import { useDefaultEnhanced } from '../hooks/useJVxeComponent'; +import { isFunction, isObject, isString } from '/@/utils/is'; +import { JVxeTypes } from '../types'; +import { JVxeComponent } from '../types/JVxeComponent'; +import { componentMap } from '../componentMap'; + +// 已注册的组件增强 +const enhancedMap = new Map(); + +/** + * 获取某个组件的增强 + * @param type JVxeTypes + */ +export function getEnhanced(type: JVxeTypes | string): JVxeComponent.Enhanced { + let $type: JVxeTypes = type; + if (!enhancedMap.has($type)) { + let defaultEnhanced = useDefaultEnhanced(); + if (componentMap.has($type)) { + let enhanced = componentMap.get($type)?.enhanced ?? {}; + if (isObject(enhanced)) { + Object.keys(defaultEnhanced).forEach((key) => { + let def = defaultEnhanced[key]; + if (enhanced.hasOwnProperty(key)) { + // 方法如果存在就不覆盖 + if (!isFunction(def) && !isString(def)) { + enhanced[key] = Object.assign({}, def, enhanced[key]); + } + } else { + enhanced[key] = def; + } + }); + enhancedMap.set($type, enhanced); + return enhanced; + } + } else { + throw new Error(`[JVxeTable] ${$type} 组件尚未注册,获取增强失败`); + } + enhancedMap.set($type, defaultEnhanced); + } + return enhancedMap.get($type); +} + +/** 辅助方法:替换${...}变量 */ +export function replaceProps(col, value) { + if (value && typeof value === 'string') { + let text = value; + text = text.replace(/\${title}/g, col.title); + text = text.replace(/\${key}/g, col.key); + text = text.replace(/\${defaultValue}/g, col.defaultValue); + return text; + } + return value; +} + +type dispatchEventOptions = { + // JVxeTable 的 props + props; + // 触发的 event 事件对象 + $event; + // 行、列 + row?; + column?; + // JVxeTable的vue3实例 + instance?: ComponentInternalInstance; + // 要寻找的className + className: string; + // 重写找到dom后的处理方法 + handler?: Fn; + // 是否直接执行click方法而不是模拟click事件 + isClick?: boolean; +}; + +/** 模拟触发事件 */ +export function dispatchEvent(options: dispatchEventOptions) { + const { props, $event, row, column, instance, className, handler, isClick } = options; + if ((!$event || !$event.path) && !instance) { + return; + } + // alwaysEdit 下不模拟触发事件,否者会导致触发两次 + if (props && props.alwaysEdit) { + return; + } + let getCell = () => { + let paths: HTMLElement[] = [...($event?.path ?? [])]; + // 通过 instance 获取 cell dom对象 + if (row && column) { + let selector = `table.vxe-table--body tbody tr[rowid='${row.id}'] td[colid='${column.id}']`; + let cellDom = instance!.vnode?.el?.querySelector(selector); + if (cellDom) { + paths.unshift(cellDom); + } + } + for (const el of paths) { + if (el.classList?.contains('vxe-body--column')) { + return el; + } + } + return null; + }; + let cell = getCell(); + if (cell) { + window.setTimeout(() => { + let getElement = () => { + let classList = className.split(' '); + if (classList.length > 0) { + const getClassName = (cls: string) => { + if (cls.startsWith('.')) { + return cls.substring(1, cls.length); + } + return cls; + }; + let get = (target, className, idx = 0) => { + let elements = target.getElementsByClassName(getClassName(className)); + if (elements && elements.length > 0) { + return elements[idx]; + } + return null; + }; + let element: HTMLElement = get(cell, classList[0]); + for (let i = 1; i < classList.length; i++) { + if (!element) { + break; + } + element = get(element, classList[i]); + } + return element; + } + return null; + }; + let element = getElement(); + if (element) { + if (isFunction(handler)) { + handler(element); + } else { + // 模拟触发点击事件 + if (isClick) { + element.click(); + } else { + element.dispatchEvent($event); + } + } + } + }, 10); + } else { + console.warn('【JVxeTable】dispatchEvent 获取 cell 失败'); + } +} + +/** 绑定 VxeTable 数据 */ +export function vModel(value, row, column: Ref | string) { + let property = isRef(column) ? column.value.property : column; + unref(row)[property] = value; +} diff --git a/src/components/jeecg/JVxeTable/src/utils/registerUtils.ts b/src/components/jeecg/JVxeTable/src/utils/registerUtils.ts new file mode 100644 index 0000000..374f5a6 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/utils/registerUtils.ts @@ -0,0 +1,130 @@ +import type { Component } from 'vue'; +import { h } from 'vue'; +import VXETable from 'vxe-table'; +import { definedComponent, addComponent, componentMap, spanEnds, excludeKeywords } from '../componentMap'; +import { JVxeRenderType, JVxeTypePrefix, JVxeTypes } from '../types/JVxeTypes'; +import { getEnhanced } from './enhancedUtils'; +import { isFunction } from '/@/utils/is'; + +/** + * 判断某个组件是否已注册 + * @param type + */ +export function isRegistered(type: JVxeTypes | string) { + if (excludeKeywords.includes(type)) { + return true; + } + return componentMap.has(type); +} + +/** + * 注册vxe自定义组件 + * + * @param type + * @param component 编辑状态显示的组件 + * @param spanComponent 非编辑状态显示的组件,可以为空 + */ +export function registerComponent(type: JVxeTypes, component: Component, spanComponent?: Component) { + addComponent(type, component, spanComponent); + registerOneComponent(type); +} + +/** + * 异步注册vxe自定义组件 + * + * @param type + * @param promise + */ +export async function registerAsyncComponent(type: JVxeTypes, promise: Promise) { + const result = await promise; + if (isFunction(result.installJVxe)) { + result.install((component: Component, spanComponent?: Component) => { + addComponent(type, component, spanComponent); + registerOneComponent(type); + }); + } else { + addComponent(type, result.default); + registerOneComponent(type); + } +} + +/** + * 安装所有vxe组件 + */ +export function registerAllComponent() { + definedComponent(); + // 遍历所有组件批量注册 + const components = [...componentMap.keys()]; + components.forEach((type) => { + if (!type.endsWith(spanEnds)) { + registerOneComponent(type); + } + }); +} + +/** + * 注册单个vxe组件 + * + * @param type 组件 type + */ +export function registerOneComponent(type: JVxeTypes) { + const component = componentMap.get(type); + if (component) { + const switches = getEnhanced(type).switches; + if (switches.editRender && !switches.visible) { + createEditRender(type, component); + } else { + createCellRender(type, component); + } + } else { + throw new Error(`【registerOneComponent】"${type}"不存在于componentMap中`); + } +} + +/** 注册可编辑组件 */ +function createEditRender(type: JVxeTypes, component: Component, spanComponent?: Component) { + // 获取当前组件的增强 + const enhanced = getEnhanced(type); + if (!spanComponent) { + if (componentMap.has(type + spanEnds)) { + spanComponent = componentMap.get(type + spanEnds); + } else { + // 默认的 span 组件为 normal + spanComponent = componentMap.get(JVxeTypes.normal); + } + } + // 添加渲染 + VXETable.renderer.add(JVxeTypePrefix + type, { + // 可编辑模板 + renderEdit: createRender(type, component, JVxeRenderType.editer), + // 显示模板 + renderCell: createRender(type, spanComponent, JVxeRenderType.spaner), + // 增强注册 + ...enhanced.installOptions, + }); +} + +/** 注册普通组件 */ +function createCellRender(type: JVxeTypes, component: Component = componentMap.get(JVxeTypes.normal)) { + // 获取当前组件的增强 + const enhanced = getEnhanced(type); + VXETable.renderer.add(JVxeTypePrefix + type, { + // 默认显示模板 + renderDefault: createRender(type, component, JVxeRenderType.default), + // 增强注册 + ...enhanced.installOptions, + }); +} + +function createRender(type, component, renderType) { + return function (renderOptions, params) { + return [ + h(component, { + type: type, + params: params, + renderOptions: renderOptions, + renderType: renderType, + }), + ]; + }; +} diff --git a/src/components/jeecg/JVxeTable/src/utils/vxeUtils.ts b/src/components/jeecg/JVxeTable/src/utils/vxeUtils.ts new file mode 100644 index 0000000..108fd67 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/utils/vxeUtils.ts @@ -0,0 +1,21 @@ +/** + * + * 根据 tagName 获取父级节点 + * + * @param dom 一级dom节点 + * @param tagName 标签名,不区分大小写 + */ +export function getParentNodeByTagName(dom: HTMLElement, tagName: string = 'body'): HTMLElement | null { + if (tagName === 'body') { + return document.body; + } + if (dom.parentElement) { + if (dom.parentElement.tagName.toLowerCase() === tagName.trim().toLowerCase()) { + return dom.parentElement; + } else { + return getParentNodeByTagName(dom.parentElement, tagName); + } + } else { + return null; + } +} diff --git a/src/components/jeecg/JVxeTable/src/vxe.data.ts b/src/components/jeecg/JVxeTable/src/vxe.data.ts new file mode 100644 index 0000000..8a109c2 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/vxe.data.ts @@ -0,0 +1,93 @@ +import { propTypes } from '/@/utils/propTypes'; + +export const vxeProps = () => ({ + rowKey: propTypes.string.def('id'), + // 列信息 + columns: { + type: Array, + required: true, + }, + // 数据源 + dataSource: { + type: Array, + required: true, + }, + authPre: { + type: String, + required: false, + default: '', + }, + // 是否显示工具栏 + toolbar: propTypes.bool.def(false), + // 工具栏配置 + toolbarConfig: propTypes.object.def(() => ({ + // prefix 前缀;suffix 后缀; + slots: ['prefix', 'suffix'], + // add 新增按钮;remove 删除按钮;clearSelection 清空选择按钮;collapse 展开收起 + btns: ['add', 'remove', 'clearSelection'], + })), + // 是否显示行号 + rowNumber: propTypes.bool.def(false), + // 是否可选择行 + rowSelection: propTypes.bool.def(false), + // 选择行类型 + rowSelectionType: propTypes.oneOf(['checkbox', 'radio']).def('checkbox'), + // 是否可展开行 + rowExpand: propTypes.bool.def(false), + // 展开行配置 + expandConfig: propTypes.object.def(() => ({})), + // 页面是否在加载中 + loading: propTypes.bool.def(false), + // 表格高度 + height: propTypes.oneOfType([propTypes.number, propTypes.string]).def('auto'), + // 最大高度 + maxHeight: { + type: Number, + default: () => null, + }, + // 要禁用的行 + disabledRows: propTypes.object.def(() => ({})), + // 是否禁用全部组件 + disabled: propTypes.bool.def(false), + // 是否可拖拽排序(有固定列的情况下无法拖拽排序,仅可上下排序) + dragSort: propTypes.bool.def(false), + // 排序字段保存的Key + sortKey: propTypes.string.def('orderNum'), + // 排序序号开始值,默认为 0 + sortBegin: propTypes.number.def(0), + // 大小,可选值有:medium(中)、small(小)、mini(微) + size: propTypes.oneOf(['medium', 'small', 'mini']).def('medium'), + // 是否显示边框线 + bordered: propTypes.bool.def(false), + // 分页器参数,设置了即可显示分页器 + pagination: propTypes.object.def(() => ({})), + // 点击行时是否显示子表单 + clickRowShowSubForm: propTypes.bool.def(false), + // 点击行时是否显示主表单 + clickRowShowMainForm: propTypes.bool.def(false), + // 是否点击选中行,优先级最低 + clickSelectRow: propTypes.bool.def(false), + // 是否开启 reload 数据效果 + reloadEffect: propTypes.bool.def(false), + // 校验规则 + editRules: propTypes.object.def(() => ({})), + // 是否异步删除行,如果你要实现异步删除,那么需要把这个选项开启, + // 在remove事件里调用confirmRemove方法才会真正删除(除非删除的全是新增的行) + asyncRemove: propTypes.bool.def(false), + // 是否一直显示组件,如果为false则只有点击的时候才出现组件 + // 注:该参数不能动态修改;如果行、列字段多的情况下,会根据机器性能造成不同程度的卡顿。 + // TODO 新版vxe-table取消了 visible 参数,导致无法实现该功能 + alwaysEdit: propTypes.bool.def(false), + // 联动配置,数组,详情配置见文档 + linkageConfig: propTypes.array.def(() => []), + // 是否开启使用 webSocket 无痕刷新 + socketReload: propTypes.bool.def(false), + // 相同的socketKey更改时会互相刷新 + socketKey: propTypes.string.def('vxe-default'), + // 新增行时切换行的激活状态 + addSetActive: propTypes.bool.def(true), + // 是否开启键盘编辑 + keyboardEdit: propTypes.bool.def(false), +}); + +export const vxeEmits = ['save', 'added', 'removed', 'inserted', 'dragged', 'selectRowChange', 'pageChange', 'valueChange']; diff --git a/src/components/jeecg/JVxeTable/types.ts b/src/components/jeecg/JVxeTable/types.ts new file mode 100644 index 0000000..7e668f7 --- /dev/null +++ b/src/components/jeecg/JVxeTable/types.ts @@ -0,0 +1,6 @@ +import JVxeTable from './src/JVxeTable'; + +export type { JVxeComponent } from './src/types/JVxeComponent'; +export type { JVxeColumn, JVxeLinkageConfig } from './src/types'; +export { JVxeTypes } from './src/types/JVxeTypes'; +export type JVxeTableInstance = InstanceType; diff --git a/src/components/jeecg/JVxeTable/utils.ts b/src/components/jeecg/JVxeTable/utils.ts new file mode 100644 index 0000000..edd3e2c --- /dev/null +++ b/src/components/jeecg/JVxeTable/utils.ts @@ -0,0 +1 @@ +export { dispatchEvent, vModel } from './src/utils/enhancedUtils'; diff --git a/src/components/jeecg/OnLine/JPopupOnlReport.vue b/src/components/jeecg/OnLine/JPopupOnlReport.vue new file mode 100644 index 0000000..37d2b15 --- /dev/null +++ b/src/components/jeecg/OnLine/JPopupOnlReport.vue @@ -0,0 +1,249 @@ + + + + + diff --git a/src/components/jeecg/OnLine/SearchFormItem.vue b/src/components/jeecg/OnLine/SearchFormItem.vue new file mode 100644 index 0000000..e60d6b6 --- /dev/null +++ b/src/components/jeecg/OnLine/SearchFormItem.vue @@ -0,0 +1,328 @@ + + + + + diff --git a/src/components/jeecg/OnLine/hooks/usePopBiz.ts b/src/components/jeecg/OnLine/hooks/usePopBiz.ts new file mode 100644 index 0000000..c25c085 --- /dev/null +++ b/src/components/jeecg/OnLine/hooks/usePopBiz.ts @@ -0,0 +1,852 @@ +import { reactive, ref, unref, defineAsyncComponent, toRaw, markRaw } from 'vue'; +import { httpGroupRequest } from '/@/components/Form/src/utils/GroupRequest'; +import { defHttp } from '/@/utils/http/axios'; +import { filterMultiDictText } from '/@/utils/dict/JDictSelectUtil.js'; +import { useMessage } from '/@/hooks/web/useMessage'; +import { OnlineColumn } from '/@/components/jeecg/OnLine/types/onlineConfig'; +import { h } from 'vue'; +import { useRouter, useRoute } from 'vue-router'; +import { useMethods } from '/@/hooks/system/useMethods'; +import { importViewsFile } from '/@/utils'; + +export function usePopBiz(props, tableRef?) { + const { createMessage } = useMessage(); + //弹窗可视状态 + const visible = ref(false); + //表格加载 + const loading = ref(false); + //cgRpConfigId + const cgRpConfigId = ref(''); + //标题 + const title = ref('列表'); + // 排序字段,默认无排序 + const iSorter = ref(''); + // 查询对象 + const queryInfo = ref([]); + // 查询参数 + const queryParam = ref({}); + // 动态参数 + const dynamicParam = ref({}); + //字典配置项 + const dictOptions = ref({}); + //数据集 + const dataSource = ref>([]); + //定义表格信息 + const columns = ref>([]); + // 当前路由 + const route = useRoute(); + //定义请求url信息 + const configUrl = reactive({ + //列表页加载column和data + getColumnsAndData: '/online/cgreport/api/getColumnsAndData/', + getColumns: '/online/cgreport/api/getRpColumns/', + getData: '/online/cgreport/api/getData/', + getQueryInfo: '/online/cgreport/api/getQueryInfo/', + export: '/online/cgreport/api/exportManySheetXls/', + }); + //已选择的值 + const checkedKeys = ref>([]); + //选择的行记录 + const selectRows = ref>([]); + // 点击单元格选中行 popup需要 但是报表预览不需要 + let clickThenCheckFlag = true; + if (props.clickToRowSelect === false) { + clickThenCheckFlag = false; + } + + /** + * 选择列配置 + */ + const rowSelection = { + fixed: true, + selectedRowKeys: checkedKeys, + selectionRows: selectRows, + onChange: onSelectChange, + }; + + /** + * 序号列配置 + */ + const indexColumnProps = { + dataIndex: 'index', + width: '15px', + }; + /** + * 分页配置 + */ + const pagination = reactive({ + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + // showTotal: (total, range) => { + // return range[0] + '-' + range[1] + ' 共' + total + '条' + // }, + showQuickJumper: true, + showSizeChanger: true, + total: 0, + // 合计逻辑 [待优化 3.0] + showTotal: (total) => onShowTotal(total), + realPageSize: 10, + realTotal: 0, + // 是否有合计列,默认为"",在第一次获取到数据之后会设计为ture或者false + isTotal: '', + onShowSizeChange: (current, pageSize) => onSizeChange(current, pageSize), + }); + + /** + * 表格选择事件 + * @param selectedRowKeys + * @param selectRow + */ + function onSelectChange(selectedRowKeys: (string | number)[]) { + if (!selectedRowKeys || selectedRowKeys.length == 0) { + selectRows.value = []; + } else { + for (let i = 0; i < selectedRowKeys.length; i++) { + let combineKey = combineRowKey(getRowByKey(selectedRowKeys[i])); + let keys = unref(checkedKeys); + if (combineKey && keys.indexOf(combineKey) < 0) { + let row = getRowByKey(selectedRowKeys[i]); + row && selectRows.value.push(row); + } + } + } + checkedKeys.value = selectedRowKeys; + } + + /** + * 过滤没用选项 + * @param selectedRowKeys + */ + function filterUnuseSelect() { + selectRows.value = unref(selectRows).filter((item) => { + let combineKey = combineRowKey(item); + return unref(checkedKeys).indexOf(combineKey) >= 0; + }); + } + + /** + * 根据key获取row信息 + * @param key + */ + function getRowByKey(key) { + let row = unref(dataSource).filter((record) => combineRowKey(record) === key); + return row && row.length > 0 ? row[0] : ''; + } + + /** + * 加载rowKey + */ + function combineRowKey(record) { + let res = record?.id || ''; + Object.keys(record).forEach((key) => { + res = key == 'rowIndex' ? record[key] + res : res + record[key]; + }); + res = res.length > 50 ? res.substring(0, 50) : res; + return res; + } + + /** + * 加载列信息 + */ + function loadColumnsInfo() { + let url = `${configUrl.getColumns}${props.code}`; + //缓存key + let groupIdKey = props.groupId ? `${props.groupId}${url}` : ''; + httpGroupRequest(() => defHttp.get({ url }, { isTransformResponse: false, successMessageMode: 'none' }), groupIdKey).then((res) => { + if (res.success) { + initDictOptionData(res.result.dictOptions); + cgRpConfigId.value = res.result.cgRpConfigId; + title.value = res.result.cgRpConfigName; + let currColumns = res.result.columns; + for (let a = 0; a < currColumns.length; a++) { + if (currColumns[a].customRender) { + let dictCode = currColumns[a].customRender; + currColumns[a].customRender = ({ text }) => { + return filterMultiDictText(unref(dictOptions)[dictCode], text + ''); + }; + } + // 排序字段受控 + if (unref(iSorter) && currColumns[a].dataIndex === unref(iSorter).column) { + currColumns[a].sortOrder = unref(iSorter).order === 'asc' ? 'ascend' : 'descend'; + } + } + if (currColumns[0].key !== 'rowIndex') { + currColumns.unshift({ + title: '序号', + dataIndex: 'rowIndex', + key: 'rowIndex', + width: 60, + align: 'center', + customRender: function ({ text }) { + return parseInt(text) + 1; + }, + }); + } + columns.value = [...currColumns]; + initQueryInfo(null); + } + }); + } + + /** + * 加载列和数据[列表专用] + */ + function loadColumnsAndData() { + // 第一次加载 置空isTotal 在这里调用确保 该方法只是进入页面后 加载一次 其余查询不走该方法 + pagination.isTotal = ''; + let url = `${configUrl.getColumnsAndData}${props.id}`; + //缓存key + let groupIdKey = props.groupId ? `${props.groupId}${url}` : ''; + httpGroupRequest(() => defHttp.get({ url }, { isTransformResponse: false, successMessageMode: 'none' }), groupIdKey).then((res) => { + if (res.success) { + initDictOptionData(res.result.dictOptions); + cgRpConfigId.value = props.id; + let { columns: metaColumnList, cgreportHeadName, fieldHrefSlots, isGroupTitle } = res.result; + title.value = cgreportHeadName; + // href 跳转 + const fieldHrefSlotKeysMap = {}; + fieldHrefSlots.forEach((item) => (fieldHrefSlotKeysMap[item.slotName] = item)); + let currColumns = handleColumnHrefAndDict(metaColumnList, fieldHrefSlotKeysMap); + + // popup需要序号, 普通列表不需要 + if (clickThenCheckFlag === true) { + currColumns.unshift({ + title: '序号', + dataIndex: 'rowIndex', + key: 'rowIndex', + width: 60, + align: 'center', + customRender: function ({ text }) { + return parseInt(text) + 1; + }, + }); + } + + // 合并表头 + if (isGroupTitle === true) { + currColumns = handleGroupTitle(currColumns); + } + columns.value = [...currColumns]; + initQueryInfo(res.result.data); + } else { + //update-begin-author:taoyan date:20220401 for: VUEN-583【vue3】JeecgBootException: sql黑名单校验不通过,请联系管理员!,前台无提示 + createMessage.warning(res.message); + //update-end-author:taoyan date:20220401 for: VUEN-583【vue3】JeecgBootException: sql黑名单校验不通过,请联系管理员!,前台无提示 + } + }); + } + + /** + * 处理求和的列 合计逻辑 [待优化 3.0] + */ + function handleSumColumn(metaColumnList: OnlineColumn[], dataTotal: number): void { + // 获取需要合计列的dataIndex + let sumColumnList = getNeedSumColumns(metaColumnList); + // 判断是否为第一次获取数据,如果是的话,则需要重新设置pageSize + if (pagination.isTotal == '') { + if (sumColumnList.length > 0) { + pagination.isTotal = true; + // 有合计字段时,每次最多查询原pageSize-1条记录,另外需要第一次时将查询的10条中删除最后一条 + // 删除最后一条数据 如果第一次得到的数据长度等于pageSize的话,则删除最后一条 + if (dataSource.value.length == pagination.pageSize) { + let remove_data = dataSource.value.pop(); + } + pagination.realPageSize = pagination.pageSize - 1; + } else { + pagination.isTotal = false; + } + } + // 需要添加合计字段 + if (pagination.isTotal) { + let totalRow = {}; + sumColumnList.forEach((dataIndex) => { + let count = 0; + dataSource.value.forEach((row) => { + // 统计去除null及空数据 + if (row[dataIndex] != null && row[dataIndex] != '') { + count += parseFloat(row[dataIndex]); + } + }); + totalRow[dataIndex] = isNaN(count) ? '包含非数字内容' : count.toFixed(2); + + // 长整形时合计不显示.00后缀 + let v = metaColumnList.find((v) => v.dataIndex == dataIndex); + if (v && v.fieldType == 'Long') { + totalRow[dataIndex] = parseInt(totalRow[dataIndex]); + } + }); + dataSource.value.push(totalRow); + pagination.realTotal = dataTotal; + pagination.total = Number(dataTotal) + Number(Math.floor(dataTotal / pagination.realPageSize)); + } + } + + /** + * 获取需要求和的列 dataIndex + * @param columns + */ + function getNeedSumColumns(columns: OnlineColumn[]): string[] { + let arr: string[] = []; + for (let column of columns) { + if (column.isTotal === '1') { + arr.push(column.dataIndex!); + } + // 【VUEN-1569】【online报表】合计无效 + if (column.children && column.children.length > 0) { + let subArray = getNeedSumColumns(column.children); + if (subArray.length > 0) { + arr.push(...subArray); + } + } + } + return arr; + } + + /** + * 处理列的href和字典翻译 + */ + function handleColumnHrefAndDict(columns: OnlineColumn[], fieldHrefSlotKeysMap: {}): OnlineColumn[] { + for (let column of columns) { + let { customRender, hrefSlotName, fieldType } = column; + // online 报表中类型配置为日期(yyyy-MM-dd ),但是实际展示为日期时间格式(yyyy-MM-dd HH:mm:ss) issues/3042 + if (fieldType == 'Date') { + column.customRender = ({ text }) => { + if (!text) { + return ''; + } + if (text.length > 10) { + return text.substring(0, 10); + } + return text; + }; + } else { + if (!hrefSlotName && column.scopedSlots && column.scopedSlots.customRender) { + //【Online报表】字典和href互斥 这里通过fieldHrefSlotKeysMap 先找到是href的列 + if (fieldHrefSlotKeysMap.hasOwnProperty(column.scopedSlots.customRender)) { + hrefSlotName = column.scopedSlots.customRender; + } + } + // 如果 customRender 有值则代表使用了字典 + // 如果 hrefSlotName 有值则代表使用了href跳转 + // 两者可以兼容。兼容的具体思路为:先获取到字典替换的值,再添加href链接跳转 + if (customRender || hrefSlotName) { + let dictCode = customRender as string; + let replaceFlag = '_replace_text_'; + column.customRender = ({ text, record }) => { + let value = text; + // 如果 dictCode 有值,就进行字典转换 + if (dictCode) { + if (dictCode.startsWith(replaceFlag)) { + let textFieldName = dictCode.replace(replaceFlag, ''); + value = record[textFieldName]; + } else { + value = filterMultiDictText(unref(dictOptions)[dictCode], text + ''); + } + } + // 扩展参数设置列的内容长度 + if (column.showLength) { + if (value && value.length > column.showLength) { + value = value.substr(0, column.showLength) + '...'; + } + } + // 如果 hrefSlotName 有值,就生成一个 a 标签,包裹住字典替换后(或原生)的值 + if (hrefSlotName) { + let field = fieldHrefSlotKeysMap[hrefSlotName]; + if (field) { + return h( + 'a', + { + onClick: () => handleClickFieldHref(field, record), + }, + value + ); + } + } + return value; + }; + } + } + } + return columns; + } + + /** + * 处理合并表头 + * @param columns + */ + function handleGroupTitle(columns: OnlineColumn[]): OnlineColumn[] { + let newColumns: OnlineColumn[] = []; + for (let column of columns) { + //排序字段受控 ---- 此逻辑为新增逻辑 待 + if (unref(iSorter) && column.dataIndex === unref(iSorter).column) { + column.sortOrder = unref(iSorter).order === 'asc' ? 'ascend' : 'descend'; + } + //判断字段是否需要合并表头 + if (column.groupTitle) { + let clIndex = newColumns.findIndex((im) => im.title === column.groupTitle); + if (clIndex !== -1) { + //表头已存在直接push children + newColumns[clIndex].children!.push(column); + } else { + //表头不存在组装表头信息 + let clGroup: OnlineColumn = {}, + child: OnlineColumn[] = []; + child.push(column); + clGroup.title = column.groupTitle; + clGroup.align = 'center'; + clGroup.children = child; + newColumns.push(clGroup); + } + } else { + newColumns.push(column); + } + } + return newColumns; + } + + // 获取路由器对象 href跳转用到 + let router = useRouter(); + /** + * href 点击事件 + * @param field + * @param record + */ + function handleClickFieldHref(field, record) { + let href = field.href; + let urlPattern = /(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?/; + let compPattern = /\.vue(\?.*)?$/; + let jsPattern = /{{([^}]+)}}/g; // {{ xxx }} + if (typeof href === 'string') { + href = href.trim().replace(/\${([^}]+)?}/g, (s1, s2) => record[s2]); + // 执行 {{...}} JS增强语句 + if (jsPattern.test(href)) { + href = href.replace(jsPattern, function (text, s0) { + try { + return eval(s0); + } catch (e) { + console.error(e); + return text; + } + }); + } + if (urlPattern.test(href)) { + window.open(href, '_blank'); + } else if (compPattern.test(href)) { + // 处理弹框 + openHrefCompModal(href); + } else { + router.push(href); + } + } + } + + /** + * 导出 + */ + function handleExport() { + const { handleExportXls } = useMethods(); + let url = `${configUrl.export}${cgRpConfigId.value}`; + let params = getQueryParams(); //查询条件 + // 【VUEN-1568】如果选中了某些行,就只导出选中的行 + let keys = unref(checkedKeys); + if (keys.length > 0) { + params['force_id'] = keys + .map((i) => (getRowByKey(i) as any)?.id) + .filter((i) => i != null && i !== '') + .join(','); + } + handleExportXls(title.value, url, params); + } + + /** + * 合计逻辑 [待优化 3.0] + * 分页 大小改变事件 + * @param _current + * @param size + */ + function onSizeChange(_current, size) { + pagination.isTotal = ''; + pagination.pageSize = size; + if (pagination.isTotal) { + pagination.realPageSize = size - 1; + } else { + pagination.realPageSize = size; + } + pagination.current = 1; + } + + /** + * 合计逻辑 [待优化 3.0] + * 显示总条数 + * @param total + */ + function onShowTotal(total) { + // 重新根据是否有合计计算每页显示的数据 + let start = (pagination.current - 1) * pagination.realPageSize + 1; + let end = start + (pagination.isTotal ? dataSource.value.length - 1 : dataSource.value.length) - 1; + let realTotal = pagination.isTotal ? pagination.realTotal : total; + return start + '-' + end + ' 共' + realTotal + '条'; + } + + /** + * 弹出框显示隐藏触发事件 + */ + async function visibleChange($event) { + visible.value = $event; + $event && loadColumnsInfo(); + } + + /** + * 初始化查询条件 + * @param data 数据结果集 + */ + function initQueryInfo(data) { + let url = `${configUrl.getQueryInfo}${unref(cgRpConfigId)}`; + //缓存key + let groupIdKey = props.groupId ? `${props.groupId}${url}` : ''; + httpGroupRequest(() => defHttp.get({ url }, { isTransformResponse: false, successMessageMode: 'none' }), groupIdKey).then((res) => { + // console.log("获取查询条件", res); + if (res.success) { + dynamicParamHandler(res.result); + queryInfo.value = res.result; + console.log('queryInfo==>', queryInfo.value); + //查询条件加载后再请求数据 + if (data) { + setDataSource(data); + //传递路由参数和动态参数,不生效, + loadData(1); + } else { + //没有传递data时查询数据 + loadData(1); + } + } else { + createMessage.warning(res.message); + } + }); + } + + /** + * 加载表格数据 + * @param arg + */ + function loadData(arg?) { + if (arg == 1) { + pagination.current = 1; + } + let params = getQueryParams(); //查询条件 + params['onlRepUrlParamStr'] = getUrlParamString(); + console.log('params', params); + loading.value = true; + let url = `${configUrl.getData}${unref(cgRpConfigId)}`; + //缓存key + let groupIdKey = props.groupId ? `${props.groupId}${url}${JSON.stringify(params)}` : ''; + httpGroupRequest(() => defHttp.get({ url, params }, { isTransformResponse: false, successMessageMode: 'none' }), groupIdKey).then((res) => { + loading.value = false; + let data = res.result; + console.log('表格信息:', data); + setDataSource(data); + }); + } + + /** + * 获取地址栏的参数 + */ + function getUrlParamString() { + let query = route.query; + let arr:any[] = [] + if(query && Object.keys(query).length>0){ + Object.keys(query).map(k=>{ + arr.push(`${k}=${query[k]}`) + }) + } + return arr.join('&') + } + + /** + * 设置dataSource + */ + function setDataSource(data) { + if (data) { + pagination.total = Number(data.total); + let currentPage = pagination?.current ?? 1; + for (let a = 0; a < data.records.length; a++) { + if (!data.records[a].rowIndex) { + data.records[a].rowIndex = a + (currentPage - 1) * 10; + } + } + dataSource.value = data.records; + //update-begin-author:taoyan date:2023-2-11 for:issues/356 在线报表分页有问题 + //update-begin-author:liusq date:2023-4-04 for:issues/426 修复356时候引入的回归错误 JPopupOnlReportModal.vue 中未修改 + tableRef?.value && tableRef?.value?.setPagination({ + total: Number(data.total) + }) + //update-end-author:liusq date:2023-4-04 for:issues/426 修复356时候引入的回归错误 JPopupOnlReportModal.vue 中未修改 + //update-end-author:taoyan date:2023-2-11 for:issues/356 在线报表分页有问题 + } else { + pagination.total = 0; + dataSource.value = []; + } + // 合计逻辑 [待优化 3.0] + handleSumColumn(columns.value, pagination.total); + } + + /** + * 获取查询参数 + */ + function getQueryParams() { + let paramTarget = {}; + if (unref(dynamicParam)) { + //处理自定义参数 + Object.keys(unref(dynamicParam)).map((key) => { + paramTarget['self_' + key] = unref(dynamicParam)[key]; + }); + } + let param = Object.assign(paramTarget, unref(queryParam), unref(iSorter)); + param.pageNo = pagination.current; + // 合计逻辑 [待优化 3.0] + // 实际查询时不使用table组件的pageSize,而使用自定义的realPageSize,realPageSize会在第一次获取到数据后变化 + param.pageSize = pagination.realPageSize; + return filterObj(param); + } + + /** + * 处理动态参数 + */ + function dynamicParamHandler(arr?) { + if (arr && arr.length > 0) { + //第一次加载查询条件前 初始化queryParam为空对象 + let queryTemp = {}; + for (let item of arr) { + if (item.mode === 'single') { + queryTemp[item.field] = ''; + } + } + queryParam.value = { ...queryTemp }; + } + // 合并路由参数 + if (props.routeQuery) { + queryParam.value = Object.assign(queryParam.value, props.routeQuery); + } + + let dynamicTemp = {}; + if (props.param) { + Object.keys(props.param).map((key) => { + let str = props.param[key]; + if (key in queryParam) { + if (str && str.startsWith("'") && str.endsWith("'")) { + str = str.substring(1, str.length - 1); + } + //如果查询条件包含参数 设置值 + unref(queryParam)[key] = str; + } + dynamicTemp[key] = props.param[key]; + }); + } + dynamicParam.value = { ...dynamicTemp }; + } + + /** + * 分页 + * @param page + * @param filters + * @param sorter + */ + function handleChangeInTable(page, filters, sorter) { + console.log(page, filters, sorter); + //分页、排序、筛选变化时触发 + if (Object.keys(sorter).length > 0) { + iSorter.value = { + column: sorter.field, + order: 'ascend' === sorter.order ? 'asc' : 'desc', + }; + // 排序字段受控 + unref(columns).forEach((col) => { + if (col['dataIndex'] === sorter.field) { + col['sortOrder'] = sorter.order; + } + }); + } + pagination.current = page.current; + pagination.pageSize = page.pageSize; + loadData(); + } + + /** + * 行点击事件 + * @param record + */ + function clickThenCheck(record) { + if (clickThenCheckFlag === true) { + let rowKey = combineRowKey(record); + if (!unref(checkedKeys) || unref(checkedKeys).length == 0) { + let arr1: any[] = [], + arr2: any[] = []; + arr1.push(record); + arr2.push(rowKey); + checkedKeys.value = arr2; + selectRows.value = arr1; + } else { + if (unref(checkedKeys).indexOf(rowKey) < 0) { + //不存在就选中 + checkedKeys.value.push(rowKey); + selectRows.value.push(record); + } else { + //已选中就取消 + let rowKey_index = unref(checkedKeys).indexOf(rowKey); + checkedKeys.value.splice(rowKey_index, 1); + selectRows.value.splice(rowKey_index, 1); + } + } + } + } + + //防止字典中有垃圾数据 + function initDictOptionData(arr) { + let obj = {}; + Object.keys(arr).map((k) => { + obj[k] = arr[k].filter((item) => { + return item != null; + }); + }); + dictOptions.value = obj; + } + + /** + * 过滤对象中为空的属性 + * @param obj + * @returns {*} + */ + function filterObj(obj) { + if (!(typeof obj == 'object')) { + return; + } + + for (let key in obj) { + if (obj.hasOwnProperty(key) && (obj[key] == null || obj[key] == undefined || obj[key] === '')) { + delete obj[key]; + } + } + return obj; + } + + // 样式 + const dialogStyle = { + top: 0, + left: 0, + height: '100%', + margin: 0, + padding: 0, + }; + + // 弹窗属性配置 + const hrefComponent = ref({ + model: { + title: '', + okText: '关闭', + width: '100%', + visible: false, + destroyOnClose: true, + style: dialogStyle, + // dialogStyle: dialogStyle, + bodyStyle: { + padding: '8px', + height: 'calc(100vh - 108px)', + overflow: 'auto', + overflowX: 'hidden', + }, + // 隐藏掉取消按钮 + cancelButtonProps: { style: { display: 'none' } }, + }, + on: { + ok: () => (hrefComponent.value.model.visible = false), + cancel: () => (hrefComponent.value.model.visible = false), + }, + is: null, + params: {}, + }); + + // 超链点击事件--> 打开一个modal窗口 + function openHrefCompModal(href) { + // 解析 href 参数 + let index = href.indexOf('?'); + let path = href; + if (index !== -1) { + path = href.substring(0, index); + let paramString = href.substring(index + 1, href.length); + let paramArray = paramString.split('&'); + let params = {}; + paramArray.forEach((paramObject) => { + let paramItem = paramObject.split('='); + params[paramItem[0]] = paramItem[1]; + }); + hrefComponent.value.params = params; + } else { + hrefComponent.value.params = {}; + } + hrefComponent.value.model.visible = true; + hrefComponent.value.model.title = '操作'; + hrefComponent.value.is = markRaw(defineAsyncComponent(() => importViewsFile(path))); + } + + //update-begin-author:taoyan date:2022-5-31 for: VUEN-1155 popup 选择数据时,会选择多条重复数据 + /** + * emit事件 获取选中的行数据 + */ + function getOkSelectRows(): any[] { + let arr = unref(selectRows); + let selectedRowKeys = checkedKeys.value; + console.log('arr', arr); + if (!selectedRowKeys || selectedRowKeys.length <= 0) { + return []; + } + if (!arr || arr.length <= 0) { + return []; + } + let rows: any = []; + for (let key of selectedRowKeys) { + for (let i = 0; i < arr.length; i++) { + let combineKey = combineRowKey(arr[i]); + if (key === combineKey) { + rows.push(toRaw(arr[i])); + break; + } + } + } + return rows; + } + //update-end-author:taoyan date:2022-5-31 for: VUEN-1155 popup 选择数据时,会选择多条重复数据 + + return [ + { + visibleChange, + loadColumnsInfo, + loadColumnsAndData, + dynamicParamHandler, + loadData, + handleChangeInTable, + combineRowKey, + clickThenCheck, + filterUnuseSelect, + handleExport, + getOkSelectRows, + }, + { + hrefComponent, + visible, + rowSelection, + checkedKeys, + selectRows, + pagination, + dataSource, + columns, + indexColumnProps, + loading, + title, + iSorter, + queryInfo, + queryParam, + dictOptions, + }, + ]; +} diff --git a/src/components/jeecg/OnLine/types/onlineConfig.ts b/src/components/jeecg/OnLine/types/onlineConfig.ts new file mode 100644 index 0000000..d89d77f --- /dev/null +++ b/src/components/jeecg/OnLine/types/onlineConfig.ts @@ -0,0 +1,43 @@ +interface ScopedSlots { + customRender: string; +} + +interface HrefSlots { + // 链接地址 + href: string; + // fieldHref_字段名 + slotName: string; +} + +interface OnlineColumn { + dataIndex?: string; + title?: string; + key?: string; + fieldType?: string; + width?: number | string; + align?: string; + sorter?: string | boolean; + isTotal?: string | number | boolean; + groupTitle?: string; + // 超链的时候 和HrefSlots中的slotName匹配 + scopedSlots?: ScopedSlots; + // 一般用于字典 字典传过来的是字典编码字符串 后转函数 + customRender?: string | Function; + // 这个类型不知道有什么用 + hrefSlotName?: string; + showLength?: number | string; + children?: OnlineColumn[]; + sortOrder?: string; + // 插槽对应控件类型(列表) + slots?: ScopedSlots; + //超过宽度将自动省略,暂不支持和排序筛选一起使用。 + ellipsis?: boolean; + // 是否固定列 + fixed?: boolean | 'left' | 'right'; + //字段类型 int/string + dbType?:string; + //他表字段用 + linkField?:string; +} + +export { OnlineColumn, HrefSlots }; diff --git a/src/components/jeecg/UserAvatar.vue b/src/components/jeecg/UserAvatar.vue new file mode 100644 index 0000000..e459fe8 --- /dev/null +++ b/src/components/jeecg/UserAvatar.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/src/components/jeecg/comment/CommentFiles.vue b/src/components/jeecg/comment/CommentFiles.vue new file mode 100644 index 0000000..e9e232a --- /dev/null +++ b/src/components/jeecg/comment/CommentFiles.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/src/components/jeecg/comment/CommentList.vue b/src/components/jeecg/comment/CommentList.vue new file mode 100644 index 0000000..5b02bba --- /dev/null +++ b/src/components/jeecg/comment/CommentList.vue @@ -0,0 +1,331 @@ + + + + + diff --git a/src/components/jeecg/comment/CommentPanel.vue b/src/components/jeecg/comment/CommentPanel.vue new file mode 100644 index 0000000..916230b --- /dev/null +++ b/src/components/jeecg/comment/CommentPanel.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/src/components/jeecg/comment/DataLogList.vue b/src/components/jeecg/comment/DataLogList.vue new file mode 100644 index 0000000..7cee493 --- /dev/null +++ b/src/components/jeecg/comment/DataLogList.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/src/components/jeecg/comment/HistoryFileList.vue b/src/components/jeecg/comment/HistoryFileList.vue new file mode 100644 index 0000000..ba039ee --- /dev/null +++ b/src/components/jeecg/comment/HistoryFileList.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/src/components/jeecg/comment/MyComment.vue b/src/components/jeecg/comment/MyComment.vue new file mode 100644 index 0000000..874e1f4 --- /dev/null +++ b/src/components/jeecg/comment/MyComment.vue @@ -0,0 +1,382 @@ + + + + + diff --git a/src/views/demo/comp/button/index.vue b/src/views/demo/comp/button/index.vue new file mode 100644 index 0000000..dda3462 --- /dev/null +++ b/src/views/demo/comp/button/index.vue @@ -0,0 +1,110 @@ + + diff --git a/src/views/demo/comp/card-list/index.vue b/src/views/demo/comp/card-list/index.vue new file mode 100644 index 0000000..f13af04 --- /dev/null +++ b/src/views/demo/comp/card-list/index.vue @@ -0,0 +1,32 @@ + + diff --git a/src/views/demo/comp/count-to/index.vue b/src/views/demo/comp/count-to/index.vue new file mode 100644 index 0000000..12b3ff3 --- /dev/null +++ b/src/views/demo/comp/count-to/index.vue @@ -0,0 +1,42 @@ + + + diff --git a/src/views/demo/comp/cropper/index.vue b/src/views/demo/comp/cropper/index.vue new file mode 100644 index 0000000..cac50fa --- /dev/null +++ b/src/views/demo/comp/cropper/index.vue @@ -0,0 +1,94 @@ + + + + diff --git a/src/views/demo/comp/desc/index.vue b/src/views/demo/comp/desc/index.vue new file mode 100644 index 0000000..f00c3c2 --- /dev/null +++ b/src/views/demo/comp/desc/index.vue @@ -0,0 +1,79 @@ + + diff --git a/src/views/demo/comp/drawer/Drawer1.vue b/src/views/demo/comp/drawer/Drawer1.vue new file mode 100644 index 0000000..7f29613 --- /dev/null +++ b/src/views/demo/comp/drawer/Drawer1.vue @@ -0,0 +1,13 @@ + + diff --git a/src/views/demo/comp/drawer/Drawer2.vue b/src/views/demo/comp/drawer/Drawer2.vue new file mode 100644 index 0000000..020b298 --- /dev/null +++ b/src/views/demo/comp/drawer/Drawer2.vue @@ -0,0 +1,17 @@ + + diff --git a/src/views/demo/comp/drawer/Drawer3.vue b/src/views/demo/comp/drawer/Drawer3.vue new file mode 100644 index 0000000..b8944f4 --- /dev/null +++ b/src/views/demo/comp/drawer/Drawer3.vue @@ -0,0 +1,35 @@ + + diff --git a/src/views/demo/comp/drawer/Drawer4.vue b/src/views/demo/comp/drawer/Drawer4.vue new file mode 100644 index 0000000..454156e --- /dev/null +++ b/src/views/demo/comp/drawer/Drawer4.vue @@ -0,0 +1,53 @@ + + diff --git a/src/views/demo/comp/drawer/Drawer5.vue b/src/views/demo/comp/drawer/Drawer5.vue new file mode 100644 index 0000000..5f0f6fe --- /dev/null +++ b/src/views/demo/comp/drawer/Drawer5.vue @@ -0,0 +1,13 @@ + + diff --git a/src/views/demo/comp/drawer/index.vue b/src/views/demo/comp/drawer/index.vue new file mode 100644 index 0000000..44f1e26 --- /dev/null +++ b/src/views/demo/comp/drawer/index.vue @@ -0,0 +1,69 @@ + + diff --git a/src/views/demo/comp/lazy/TargetContent.vue b/src/views/demo/comp/lazy/TargetContent.vue new file mode 100644 index 0000000..e098254 --- /dev/null +++ b/src/views/demo/comp/lazy/TargetContent.vue @@ -0,0 +1,19 @@ + + diff --git a/src/views/demo/comp/lazy/Transition.vue b/src/views/demo/comp/lazy/Transition.vue new file mode 100644 index 0000000..420dd98 --- /dev/null +++ b/src/views/demo/comp/lazy/Transition.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/views/demo/comp/lazy/index.vue b/src/views/demo/comp/lazy/index.vue new file mode 100644 index 0000000..426cc3a --- /dev/null +++ b/src/views/demo/comp/lazy/index.vue @@ -0,0 +1,52 @@ + + + diff --git a/src/views/demo/comp/loading/index.vue b/src/views/demo/comp/loading/index.vue new file mode 100644 index 0000000..f7ac1e8 --- /dev/null +++ b/src/views/demo/comp/loading/index.vue @@ -0,0 +1,101 @@ + + diff --git a/src/views/demo/comp/modal/Modal1.vue b/src/views/demo/comp/modal/Modal1.vue new file mode 100644 index 0000000..f9dfdca --- /dev/null +++ b/src/views/demo/comp/modal/Modal1.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/views/demo/comp/modal/Modal2.vue b/src/views/demo/comp/modal/Modal2.vue new file mode 100644 index 0000000..da9581d --- /dev/null +++ b/src/views/demo/comp/modal/Modal2.vue @@ -0,0 +1,23 @@ + + diff --git a/src/views/demo/comp/modal/Modal3.vue b/src/views/demo/comp/modal/Modal3.vue new file mode 100644 index 0000000..2ddd583 --- /dev/null +++ b/src/views/demo/comp/modal/Modal3.vue @@ -0,0 +1,15 @@ + + diff --git a/src/views/demo/comp/modal/Modal4.vue b/src/views/demo/comp/modal/Modal4.vue new file mode 100644 index 0000000..90894ea --- /dev/null +++ b/src/views/demo/comp/modal/Modal4.vue @@ -0,0 +1,81 @@ + + diff --git a/src/views/demo/comp/modal/index.vue b/src/views/demo/comp/modal/index.vue new file mode 100644 index 0000000..21137d9 --- /dev/null +++ b/src/views/demo/comp/modal/index.vue @@ -0,0 +1,112 @@ + + diff --git a/src/views/demo/comp/qrcode/index.vue b/src/views/demo/comp/qrcode/index.vue new file mode 100644 index 0000000..1ab6d9f --- /dev/null +++ b/src/views/demo/comp/qrcode/index.vue @@ -0,0 +1,117 @@ + + + diff --git a/src/views/demo/comp/scroll/Action.vue b/src/views/demo/comp/scroll/Action.vue new file mode 100644 index 0000000..78148a1 --- /dev/null +++ b/src/views/demo/comp/scroll/Action.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/views/demo/comp/scroll/VirtualScroll.vue b/src/views/demo/comp/scroll/VirtualScroll.vue new file mode 100644 index 0000000..f7ebc3b --- /dev/null +++ b/src/views/demo/comp/scroll/VirtualScroll.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/views/demo/comp/scroll/index.vue b/src/views/demo/comp/scroll/index.vue new file mode 100644 index 0000000..b9bb651 --- /dev/null +++ b/src/views/demo/comp/scroll/index.vue @@ -0,0 +1,31 @@ + + + diff --git a/src/views/demo/comp/strength-meter/index.vue b/src/views/demo/comp/strength-meter/index.vue new file mode 100644 index 0000000..a5c6293 --- /dev/null +++ b/src/views/demo/comp/strength-meter/index.vue @@ -0,0 +1,32 @@ + + + + diff --git a/src/views/demo/comp/time/index.vue b/src/views/demo/comp/time/index.vue new file mode 100644 index 0000000..49f6c57 --- /dev/null +++ b/src/views/demo/comp/time/index.vue @@ -0,0 +1,44 @@ + + diff --git a/src/views/demo/comp/transition/index.vue b/src/views/demo/comp/transition/index.vue new file mode 100644 index 0000000..177a4bc --- /dev/null +++ b/src/views/demo/comp/transition/index.vue @@ -0,0 +1,91 @@ + + + diff --git a/src/views/demo/comp/upload/index.vue b/src/views/demo/comp/upload/index.vue new file mode 100644 index 0000000..c9091e6 --- /dev/null +++ b/src/views/demo/comp/upload/index.vue @@ -0,0 +1,54 @@ + + diff --git a/src/views/demo/comp/verify/Rotate.vue b/src/views/demo/comp/verify/Rotate.vue new file mode 100644 index 0000000..1ef552d --- /dev/null +++ b/src/views/demo/comp/verify/Rotate.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/views/demo/comp/verify/index.vue b/src/views/demo/comp/verify/index.vue new file mode 100644 index 0000000..aa93473 --- /dev/null +++ b/src/views/demo/comp/verify/index.vue @@ -0,0 +1,97 @@ + + + diff --git a/src/views/demo/editor/json/index.vue b/src/views/demo/editor/json/index.vue new file mode 100644 index 0000000..622da81 --- /dev/null +++ b/src/views/demo/editor/json/index.vue @@ -0,0 +1,91 @@ + + diff --git a/src/views/demo/editor/markdown/Editor.vue b/src/views/demo/editor/markdown/Editor.vue new file mode 100644 index 0000000..6c731bd --- /dev/null +++ b/src/views/demo/editor/markdown/Editor.vue @@ -0,0 +1,53 @@ + + diff --git a/src/views/demo/editor/markdown/index.vue b/src/views/demo/editor/markdown/index.vue new file mode 100644 index 0000000..7d94947 --- /dev/null +++ b/src/views/demo/editor/markdown/index.vue @@ -0,0 +1,55 @@ + + diff --git a/src/views/demo/editor/tinymce/Editor.vue b/src/views/demo/editor/tinymce/Editor.vue new file mode 100644 index 0000000..b109c02 --- /dev/null +++ b/src/views/demo/editor/tinymce/Editor.vue @@ -0,0 +1,53 @@ + + diff --git a/src/views/demo/editor/tinymce/index.vue b/src/views/demo/editor/tinymce/index.vue new file mode 100644 index 0000000..9bba89b --- /dev/null +++ b/src/views/demo/editor/tinymce/index.vue @@ -0,0 +1,21 @@ + + diff --git a/src/views/demo/feat/breadcrumb/ChildrenList.vue b/src/views/demo/feat/breadcrumb/ChildrenList.vue new file mode 100644 index 0000000..cc2b26d --- /dev/null +++ b/src/views/demo/feat/breadcrumb/ChildrenList.vue @@ -0,0 +1,13 @@ + + diff --git a/src/views/demo/feat/breadcrumb/ChildrenListDetail.vue b/src/views/demo/feat/breadcrumb/ChildrenListDetail.vue new file mode 100644 index 0000000..4994c44 --- /dev/null +++ b/src/views/demo/feat/breadcrumb/ChildrenListDetail.vue @@ -0,0 +1,10 @@ + + diff --git a/src/views/demo/feat/breadcrumb/FlatList.vue b/src/views/demo/feat/breadcrumb/FlatList.vue new file mode 100644 index 0000000..d480bab --- /dev/null +++ b/src/views/demo/feat/breadcrumb/FlatList.vue @@ -0,0 +1,13 @@ + + diff --git a/src/views/demo/feat/breadcrumb/FlatListDetail.vue b/src/views/demo/feat/breadcrumb/FlatListDetail.vue new file mode 100644 index 0000000..1dfc75a --- /dev/null +++ b/src/views/demo/feat/breadcrumb/FlatListDetail.vue @@ -0,0 +1,8 @@ + + diff --git a/src/views/demo/feat/click-out-side/index.vue b/src/views/demo/feat/click-out-side/index.vue new file mode 100644 index 0000000..32652d9 --- /dev/null +++ b/src/views/demo/feat/click-out-side/index.vue @@ -0,0 +1,43 @@ + + + + diff --git a/src/views/demo/feat/context-menu/index.vue b/src/views/demo/feat/context-menu/index.vue new file mode 100644 index 0000000..0bde0cf --- /dev/null +++ b/src/views/demo/feat/context-menu/index.vue @@ -0,0 +1,85 @@ + + diff --git a/src/views/demo/feat/copy/index.vue b/src/views/demo/feat/copy/index.vue new file mode 100644 index 0000000..b442056 --- /dev/null +++ b/src/views/demo/feat/copy/index.vue @@ -0,0 +1,40 @@ + + diff --git a/src/views/demo/feat/download/imgBase64.ts b/src/views/demo/feat/download/imgBase64.ts new file mode 100644 index 0000000..306bdd1 --- /dev/null +++ b/src/views/demo/feat/download/imgBase64.ts @@ -0,0 +1 @@ +export default `data:image/png;base64,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`; diff --git a/src/views/demo/feat/download/index.vue b/src/views/demo/feat/download/index.vue new file mode 100644 index 0000000..47c8655 --- /dev/null +++ b/src/views/demo/feat/download/index.vue @@ -0,0 +1,59 @@ + + diff --git a/src/views/demo/feat/full-screen/index.vue b/src/views/demo/feat/full-screen/index.vue new file mode 100644 index 0000000..aefa3fe --- /dev/null +++ b/src/views/demo/feat/full-screen/index.vue @@ -0,0 +1,45 @@ + + diff --git a/src/views/demo/feat/icon/index.vue b/src/views/demo/feat/icon/index.vue new file mode 100644 index 0000000..7e3d50f --- /dev/null +++ b/src/views/demo/feat/icon/index.vue @@ -0,0 +1,96 @@ + + diff --git a/src/views/demo/feat/img-preview/index.vue b/src/views/demo/feat/img-preview/index.vue new file mode 100644 index 0000000..721dc2a --- /dev/null +++ b/src/views/demo/feat/img-preview/index.vue @@ -0,0 +1,38 @@ + + diff --git a/src/views/demo/feat/menu-params/index.vue b/src/views/demo/feat/menu-params/index.vue new file mode 100644 index 0000000..1a566b2 --- /dev/null +++ b/src/views/demo/feat/menu-params/index.vue @@ -0,0 +1,42 @@ + + diff --git a/src/views/demo/feat/msg/index.vue b/src/views/demo/feat/msg/index.vue new file mode 100644 index 0000000..f0eb5a3 --- /dev/null +++ b/src/views/demo/feat/msg/index.vue @@ -0,0 +1,85 @@ + + diff --git a/src/views/demo/feat/print/index.vue b/src/views/demo/feat/print/index.vue new file mode 100644 index 0000000..723e201 --- /dev/null +++ b/src/views/demo/feat/print/index.vue @@ -0,0 +1,46 @@ + + diff --git a/src/views/demo/feat/ripple/index.vue b/src/views/demo/feat/ripple/index.vue new file mode 100644 index 0000000..afd4b0a --- /dev/null +++ b/src/views/demo/feat/ripple/index.vue @@ -0,0 +1,31 @@ + + + + diff --git a/src/views/demo/feat/session-timeout/index.vue b/src/views/demo/feat/session-timeout/index.vue new file mode 100644 index 0000000..5ad7a92 --- /dev/null +++ b/src/views/demo/feat/session-timeout/index.vue @@ -0,0 +1,51 @@ + + diff --git a/src/views/demo/feat/tab-params/index.vue b/src/views/demo/feat/tab-params/index.vue new file mode 100644 index 0000000..c2e06fe --- /dev/null +++ b/src/views/demo/feat/tab-params/index.vue @@ -0,0 +1,27 @@ + + diff --git a/src/views/demo/feat/tabs/TabDetail.vue b/src/views/demo/feat/tabs/TabDetail.vue new file mode 100644 index 0000000..d768cca --- /dev/null +++ b/src/views/demo/feat/tabs/TabDetail.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/views/demo/feat/tabs/index.vue b/src/views/demo/feat/tabs/index.vue new file mode 100644 index 0000000..53422c3 --- /dev/null +++ b/src/views/demo/feat/tabs/index.vue @@ -0,0 +1,66 @@ + + diff --git a/src/views/demo/feat/watermark/index.vue b/src/views/demo/feat/watermark/index.vue new file mode 100644 index 0000000..b1acd7e --- /dev/null +++ b/src/views/demo/feat/watermark/index.vue @@ -0,0 +1,28 @@ + + diff --git a/src/views/demo/feat/ws/index.vue b/src/views/demo/feat/ws/index.vue new file mode 100644 index 0000000..348fe33 --- /dev/null +++ b/src/views/demo/feat/ws/index.vue @@ -0,0 +1,120 @@ + + diff --git a/src/views/demo/form/AdvancedForm.vue b/src/views/demo/form/AdvancedForm.vue new file mode 100644 index 0000000..c1e7f75 --- /dev/null +++ b/src/views/demo/form/AdvancedForm.vue @@ -0,0 +1,190 @@ + + diff --git a/src/views/demo/form/AppendForm.vue b/src/views/demo/form/AppendForm.vue new file mode 100644 index 0000000..91ee937 --- /dev/null +++ b/src/views/demo/form/AppendForm.vue @@ -0,0 +1,118 @@ + + diff --git a/src/views/demo/form/CustomerForm.vue b/src/views/demo/form/CustomerForm.vue new file mode 100644 index 0000000..abb384d --- /dev/null +++ b/src/views/demo/form/CustomerForm.vue @@ -0,0 +1,85 @@ + + diff --git a/src/views/demo/form/DynamicForm.vue b/src/views/demo/form/DynamicForm.vue new file mode 100644 index 0000000..077904c --- /dev/null +++ b/src/views/demo/form/DynamicForm.vue @@ -0,0 +1,258 @@ + + diff --git a/src/views/demo/form/RefForm.vue b/src/views/demo/form/RefForm.vue new file mode 100644 index 0000000..29b2136 --- /dev/null +++ b/src/views/demo/form/RefForm.vue @@ -0,0 +1,174 @@ + + diff --git a/src/views/demo/form/RuleForm.vue b/src/views/demo/form/RuleForm.vue new file mode 100644 index 0000000..958f496 --- /dev/null +++ b/src/views/demo/form/RuleForm.vue @@ -0,0 +1,260 @@ + + diff --git a/src/views/demo/form/UseForm.vue b/src/views/demo/form/UseForm.vue new file mode 100644 index 0000000..1abf4ce --- /dev/null +++ b/src/views/demo/form/UseForm.vue @@ -0,0 +1,189 @@ + + diff --git a/src/views/demo/form/index.vue b/src/views/demo/form/index.vue new file mode 100644 index 0000000..1ee30be --- /dev/null +++ b/src/views/demo/form/index.vue @@ -0,0 +1,621 @@ + + diff --git a/src/views/demo/jeecg/AsyncTreeTable.vue b/src/views/demo/jeecg/AsyncTreeTable.vue new file mode 100644 index 0000000..f3e24fa --- /dev/null +++ b/src/views/demo/jeecg/AsyncTreeTable.vue @@ -0,0 +1,57 @@ + + + diff --git a/src/views/demo/jeecg/ImgDragSort.vue b/src/views/demo/jeecg/ImgDragSort.vue new file mode 100644 index 0000000..cb289e5 --- /dev/null +++ b/src/views/demo/jeecg/ImgDragSort.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/src/views/demo/jeecg/ImgTurnPage.vue b/src/views/demo/jeecg/ImgTurnPage.vue new file mode 100644 index 0000000..9859c2e --- /dev/null +++ b/src/views/demo/jeecg/ImgTurnPage.vue @@ -0,0 +1,170 @@ + + + diff --git a/src/views/demo/jeecg/InnerExpandTable.vue b/src/views/demo/jeecg/InnerExpandTable.vue new file mode 100644 index 0000000..2b011ed --- /dev/null +++ b/src/views/demo/jeecg/InnerExpandTable.vue @@ -0,0 +1,243 @@ + + + + diff --git a/src/views/demo/jeecg/JCodeEditDemo.vue b/src/views/demo/jeecg/JCodeEditDemo.vue new file mode 100644 index 0000000..80c4233 --- /dev/null +++ b/src/views/demo/jeecg/JCodeEditDemo.vue @@ -0,0 +1,67 @@ + + diff --git a/src/views/demo/jeecg/JEditorDemo.vue b/src/views/demo/jeecg/JEditorDemo.vue new file mode 100644 index 0000000..10657eb --- /dev/null +++ b/src/views/demo/jeecg/JEditorDemo.vue @@ -0,0 +1,99 @@ + + + + + + + diff --git a/src/views/demo/jeecg/JUploadDemo.vue b/src/views/demo/jeecg/JUploadDemo.vue new file mode 100644 index 0000000..c7f2cd8 --- /dev/null +++ b/src/views/demo/jeecg/JUploadDemo.vue @@ -0,0 +1,84 @@ + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo1.vue b/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo1.vue new file mode 100644 index 0000000..32293bf --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo1.vue @@ -0,0 +1,384 @@ + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo2.vue b/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo2.vue new file mode 100644 index 0000000..b7ef461 --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo2.vue @@ -0,0 +1,179 @@ + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo3.vue b/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo3.vue new file mode 100644 index 0000000..3b94b40 --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo3.vue @@ -0,0 +1,127 @@ + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo4.vue b/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo4.vue new file mode 100644 index 0000000..d11f699 --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo4.vue @@ -0,0 +1,153 @@ + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo5.vue b/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo5.vue new file mode 100644 index 0000000..c756fc2 --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo5.vue @@ -0,0 +1,129 @@ + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/func-demo/JSBCDemo.vue b/src/views/demo/jeecg/JVxeTableDemo/func-demo/JSBCDemo.vue new file mode 100644 index 0000000..b44d4ef --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/func-demo/JSBCDemo.vue @@ -0,0 +1,224 @@ + + + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/func-demo/PopupSubTable.vue b/src/views/demo/jeecg/JVxeTableDemo/func-demo/PopupSubTable.vue new file mode 100644 index 0000000..6febff6 --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/func-demo/PopupSubTable.vue @@ -0,0 +1,244 @@ + + + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/func-demo/SocketReload.vue b/src/views/demo/jeecg/JVxeTableDemo/func-demo/SocketReload.vue new file mode 100644 index 0000000..1ee4c9d --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/func-demo/SocketReload.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/index.vue b/src/views/demo/jeecg/JVxeTableDemo/index.vue new file mode 100644 index 0000000..9e73f3c --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/index.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/layout-demo/ErpTemplate.vue b/src/views/demo/jeecg/JVxeTableDemo/layout-demo/ErpTemplate.vue new file mode 100644 index 0000000..c468134 --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/layout-demo/ErpTemplate.vue @@ -0,0 +1,319 @@ + + + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template1.vue b/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template1.vue new file mode 100644 index 0000000..37ab585 --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template1.vue @@ -0,0 +1,332 @@ + + + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template2.vue b/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template2.vue new file mode 100644 index 0000000..cb4e22c --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template2.vue @@ -0,0 +1,249 @@ + + + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template3.vue b/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template3.vue new file mode 100644 index 0000000..8ff7272 --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template3.vue @@ -0,0 +1,237 @@ + + + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template4.vue b/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template4.vue new file mode 100644 index 0000000..67f2411 --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template4.vue @@ -0,0 +1,340 @@ + + + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template5.vue b/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template5.vue new file mode 100644 index 0000000..a28076d --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template5.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/src/views/demo/jeecg/JVxeTableDemo/layout-demo/index.vue b/src/views/demo/jeecg/JVxeTableDemo/layout-demo/index.vue new file mode 100644 index 0000000..15a8832 --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/layout-demo/index.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/views/demo/jeecg/JeecgComponents.vue b/src/views/demo/jeecg/JeecgComponents.vue new file mode 100644 index 0000000..b12f70f --- /dev/null +++ b/src/views/demo/jeecg/JeecgComponents.vue @@ -0,0 +1,125 @@ + + + diff --git a/src/views/demo/jeecg/JeecgPdfView.vue b/src/views/demo/jeecg/JeecgPdfView.vue new file mode 100644 index 0000000..0a009e9 --- /dev/null +++ b/src/views/demo/jeecg/JeecgPdfView.vue @@ -0,0 +1,93 @@ + + + diff --git a/src/views/demo/jeecg/Native/less/TableExpand.less b/src/views/demo/jeecg/Native/less/TableExpand.less new file mode 100644 index 0000000..407ff14 --- /dev/null +++ b/src/views/demo/jeecg/Native/less/TableExpand.less @@ -0,0 +1,102 @@ +/** [表格主题样式一] 表格强制列不换行 */ +.j-table-force-nowrap { + td, + th { + white-space: nowrap; + } + + .ant-table-selection-column { + padding: 12px 22px !important; + } + + /** 列自适应,弊端会导致列宽失效 */ + + &.ant-table-wrapper .ant-table-content { + overflow-x: auto; + } +} + +/** 查询区域通用样式*/ +.table-page-search-wrapper { + .ant-form-inline { + .ant-form-item { + display: flex; + margin-bottom: 24px; + margin-right: 0; + + .ant-form-item-control-wrapper { + flex: 1 1; + display: inline-block; + vertical-align: middle; + } + + > .ant-form-item-label { + line-height: 32px; + padding-right: 8px; + width: auto; + } + + .ant-form-item-control { + height: 32px; + line-height: 32px; + } + } + } + + .table-page-search-submitButtons { + display: block; + margin-bottom: 24px; + white-space: nowrap; + } +} + +/*列表上方操作按钮区域*/ +.ant-card-body .table-operator { + margin-bottom: 8px; +} + +/** Button按钮间距 */ +.table-operator .ant-btn { + margin: 0 8px 8px 0; +} + +.table-operator .ant-btn-group .ant-btn { + margin: 0; +} + +.table-operator .ant-btn-group .ant-btn:last-child { + margin: 0 8px 8px 0; +} + +/*列表td的padding设置 可以控制列表大小*/ +.ant-table-tbody .ant-table-row td { + padding-top: 15px; + padding-bottom: 15px; +} + +/*列表页面弹出modal*/ +.ant-modal-cust-warp { + height: 100%; +} + +/*弹出modal Y轴滚动条*/ +.ant-modal-cust-warp .ant-modal-body { + height: calc(100% - 110px) !important; + overflow-y: auto; +} + +/*弹出modal 先有content后有body 故滚动条控制在body上*/ +.ant-modal-cust-warp .ant-modal-content { + height: 90% !important; + overflow-y: hidden; +} + +/*列表中有图片的加这个样式 参考用户管理*/ +.anty-img-wrap { + height: 25px; + position: relative; +} + +.antd-more a { + color: #000000; +} diff --git a/src/views/demo/jeecg/Native/one/OneNativeList.vue b/src/views/demo/jeecg/Native/one/OneNativeList.vue new file mode 100644 index 0000000..2896398 --- /dev/null +++ b/src/views/demo/jeecg/Native/one/OneNativeList.vue @@ -0,0 +1,418 @@ + + + diff --git a/src/views/demo/jeecg/Native/one/components/OneNativeForm.vue b/src/views/demo/jeecg/Native/one/components/OneNativeForm.vue new file mode 100644 index 0000000..092f7f9 --- /dev/null +++ b/src/views/demo/jeecg/Native/one/components/OneNativeForm.vue @@ -0,0 +1,455 @@ + + + + + diff --git a/src/views/demo/jeecg/Native/one/components/OneNativeModal.vue b/src/views/demo/jeecg/Native/one/components/OneNativeModal.vue new file mode 100644 index 0000000..5681df4 --- /dev/null +++ b/src/views/demo/jeecg/Native/one/components/OneNativeModal.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/src/views/demo/jeecg/PrintDemo.vue b/src/views/demo/jeecg/PrintDemo.vue new file mode 100644 index 0000000..c5ff362 --- /dev/null +++ b/src/views/demo/jeecg/PrintDemo.vue @@ -0,0 +1,202 @@ + + + diff --git a/src/views/demo/jeecg/TableTotal.vue b/src/views/demo/jeecg/TableTotal.vue new file mode 100644 index 0000000..d95e312 --- /dev/null +++ b/src/views/demo/jeecg/TableTotal.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/views/demo/jeecg/erplist/JeecgOrderCustomerList.vue b/src/views/demo/jeecg/erplist/JeecgOrderCustomerList.vue new file mode 100644 index 0000000..a8bde6b --- /dev/null +++ b/src/views/demo/jeecg/erplist/JeecgOrderCustomerList.vue @@ -0,0 +1,165 @@ + + + + + diff --git a/src/views/demo/jeecg/erplist/JeecgOrderTicketList.vue b/src/views/demo/jeecg/erplist/JeecgOrderTicketList.vue new file mode 100644 index 0000000..ebb3246 --- /dev/null +++ b/src/views/demo/jeecg/erplist/JeecgOrderTicketList.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/src/views/demo/jeecg/erplist/components/JeecgOrderCustomerModal.vue b/src/views/demo/jeecg/erplist/components/JeecgOrderCustomerModal.vue new file mode 100644 index 0000000..3590ea6 --- /dev/null +++ b/src/views/demo/jeecg/erplist/components/JeecgOrderCustomerModal.vue @@ -0,0 +1,57 @@ + + diff --git a/src/views/demo/jeecg/erplist/components/JeecgOrderModal.vue b/src/views/demo/jeecg/erplist/components/JeecgOrderModal.vue new file mode 100644 index 0000000..f5511cf --- /dev/null +++ b/src/views/demo/jeecg/erplist/components/JeecgOrderModal.vue @@ -0,0 +1,52 @@ + + diff --git a/src/views/demo/jeecg/erplist/components/JeecgOrderTicketModal.vue b/src/views/demo/jeecg/erplist/components/JeecgOrderTicketModal.vue new file mode 100644 index 0000000..3890222 --- /dev/null +++ b/src/views/demo/jeecg/erplist/components/JeecgOrderTicketModal.vue @@ -0,0 +1,57 @@ + + diff --git a/src/views/demo/jeecg/erplist/erplist.api.ts b/src/views/demo/jeecg/erplist/erplist.api.ts new file mode 100644 index 0000000..ca9509d --- /dev/null +++ b/src/views/demo/jeecg/erplist/erplist.api.ts @@ -0,0 +1,139 @@ +import { defHttp } from '/@/utils/http/axios'; +import { Modal } from 'ant-design-vue'; + +enum Api { + list = '/test/order/orderList', + save = '/test/order/add', + edit = '/test/order/edit', + deleteOne = '/test/order/delete', + deleteBatch = '/test/order/deleteBatch', + customList = '/test/order/listOrderCustomerByMainId', + saveCustomer = '/test/order/addCustomer', + editCustomer = '/test/order/editCustomer', + deleteCustomer = '/test/order/deleteCustomer', + deleteBatchCustomer = '/test/order/deleteBatchCustomer', + ticketList = '/test/order/listOrderTicketByMainId', + saveTicket = '/test/order/addTicket', + editTicket = '/test/order/editTicket', + deleteTicket = '/test/order/deleteTicket', + deleteBatchTicket = '/test/order/deleteBatchTicket', +} + +/** + * 列表接口 + * @param params + */ +export const list = (params) => defHttp.get({ url: Api.list, params }); + +/** + * 删除 + */ +export const deleteOne = (params, handleSuccess) => { + return defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; +/** + * 批量删除 + * @param params + */ +export const batchDelete = (params, handleSuccess) => { + Modal.confirm({ + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + }, + }); +}; +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, params }); +}; + +/** + * 列表接口 + * @param params + */ +export const customList = (params) => defHttp.get({ url: Api.customList, params }); + +/** + * 删除 + */ +export const deleteCustomer = (params, handleSuccess) => { + return defHttp.delete({ url: Api.deleteCustomer, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; +/** + * 批量删除 + * @param params + */ +export const deleteBatchCustomer = (params, handleSuccess) => { + Modal.confirm({ + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.deleteBatchCustomer, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + }, + }); +}; +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdateCustomer = (params, isUpdate) => { + let url = isUpdate ? Api.editCustomer : Api.saveCustomer; + return defHttp.post({ url: url, params }); +}; +/** + * 列表接口 + * @param params + */ +export const ticketList = (params) => defHttp.get({ url: Api.ticketList, params }); + +/** + * 删除 + */ +export const deleteTicket = (params, handleSuccess) => { + return defHttp.delete({ url: Api.deleteTicket, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; +/** + * 批量删除 + * @param params + */ +export const deleteBatchTicket = (params, handleSuccess) => { + Modal.confirm({ + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.deleteBatchTicket, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + }, + }); +}; +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdateTicket = (params, isUpdate) => { + let url = isUpdate ? Api.editTicket : Api.saveTicket; + return defHttp.post({ url: url, params }); +}; diff --git a/src/views/demo/jeecg/erplist/erplist.data.ts b/src/views/demo/jeecg/erplist/erplist.data.ts new file mode 100644 index 0000000..eb7a756 --- /dev/null +++ b/src/views/demo/jeecg/erplist/erplist.data.ts @@ -0,0 +1,238 @@ +import { BasicColumn } from '/@/components/Table'; +import { FormSchema } from '/@/components/Table'; +import { render } from '/@/utils/common/renderUtils'; + +export const columns: BasicColumn[] = [ + { + title: '订单号', + dataIndex: 'orderCode', + width: 260, + }, + { + title: '订单类型', + dataIndex: 'ctype', + width: 160, + customRender: ({ text }) => { + return text == '1' ? '国内订单' : text == '2' ? '国际订单' : ''; + }, + }, + { + title: '订单日期', + dataIndex: 'orderDate', + width: 300, + }, + { + title: '订单金额', + width: 200, + dataIndex: 'orderMoney', + }, + { + title: '订单备注', + width: 200, + dataIndex: 'content', + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + label: '订单号', + field: 'orderCode', + component: 'Input', + colProps: { span: 6 }, + }, + { + label: '订单类型', + field: 'ctype', + component: 'Select', + componentProps: { + options: [ + { + label: '国内订单', + value: '1', + key: '1', + }, + { + label: '国际订单', + value: '2', + key: '2', + }, + ], + }, + colProps: { span: 6 }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + label: '订单号', + field: 'orderCode', + component: 'Input', + required: true, + }, + { + label: '订单类型', + field: 'ctype', + component: 'Select', + componentProps: { + options: [ + { + label: '国内订单', + value: '1', + key: '1', + }, + { + label: '国际订单', + value: '2', + key: '2', + }, + ], + }, + }, + { + label: '订单日期', + field: 'orderDate', + component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD hh:mm:ss', + }, + }, + { + label: '订单金额', + field: 'orderMoney', + component: 'InputNumber', + }, + { + label: '订单备注', + field: 'content', + component: 'Input', + }, +]; + +export const customColumns: BasicColumn[] = [ + { + title: '客户名', + dataIndex: 'name', + width: 260, + }, + { + title: '性别', + dataIndex: 'sex', + width: 100, + customRender: ({ text }) => { + return render.renderDict(text, 'sex'); + }, + }, + { + title: '身份证号', + dataIndex: 'idcard', + width: 300, + }, + { + title: '电话', + width: 200, + dataIndex: 'telphone', + }, +]; + +export const customerFormSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + label: '客户姓名', + field: 'name', + component: 'Input', + required: true, + }, + { + label: '性别', + field: 'sex', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'sex', + placeholder: '请选择性别', + }, + }, + { + label: '身份证号码', + field: 'idcard', + component: 'Input', + }, + { + label: '身份证扫描件', + field: 'idcardPic', + component: 'JImageUpload', + componentProps: { + fileMax: 2, + }, + }, + { + label: '联系方式', + field: 'telphone', + component: 'Input', + rules: [{ required: false, pattern: /^1[3456789]\d{9}$/, message: '手机号码格式有误' }], + }, + { + label: 'orderId', + field: 'orderId', + component: 'Input', + show: false, + }, +]; + +export const ticketColumns: BasicColumn[] = [ + { + title: '航班号', + dataIndex: 'ticketCode', + }, + { + title: '航班时间', + dataIndex: 'tickectDate', + }, + { + title: '创建人', + dataIndex: 'createBy', + }, + { + title: '创建时间', + dataIndex: 'createTime', + }, +]; + +export const ticketFormSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + label: '航班号', + field: 'ticketCode', + component: 'Input', + required: true, + }, + { + label: '航班时间', + field: 'tickectDate', + component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD', + }, + }, + { + label: 'orderId', + field: 'orderId', + component: 'Input', + show: false, + }, +]; diff --git a/src/views/demo/jeecg/erplist/index.vue b/src/views/demo/jeecg/erplist/index.vue new file mode 100644 index 0000000..29db61d --- /dev/null +++ b/src/views/demo/jeecg/erplist/index.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/src/views/demo/jeecg/index.vue b/src/views/demo/jeecg/index.vue new file mode 100644 index 0000000..4f10c7f --- /dev/null +++ b/src/views/demo/jeecg/index.vue @@ -0,0 +1,54 @@ + + diff --git a/src/views/demo/jeecg/jeecgComponents.data.ts b/src/views/demo/jeecg/jeecgComponents.data.ts new file mode 100644 index 0000000..f8e0814 --- /dev/null +++ b/src/views/demo/jeecg/jeecgComponents.data.ts @@ -0,0 +1,692 @@ +import { FormSchema, JCronValidator } from '/@/components/Form'; +import { usePermission } from '/@/hooks/web/usePermission'; + +const { isDisabledAuth } = usePermission(); +export const schemas: FormSchema[] = [ + { + field: 'jdst', + component: 'JDictSelectTag', + label: '性别下拉', + helpMessage: ['component模式'], + componentProps: { + dictCode: 'sex', + }, + colProps: { + span: 12, + }, + }, + { + field: 'jdst', + component: 'JEllipsis', + label: '选中值', + colProps: { span: 12 }, + }, + { + field: 'jdst1', + component: 'JDictSelectTag', + label: '性别选择', + helpMessage: ['component模式'], + componentProps: { + dictCode: 'sex', + type: 'radioButton', + }, + colProps: { + span: 12, + }, + }, + { + field: 'jdst1', + component: 'JEllipsis', + label: '选中值', + colProps: { span: 12 }, + }, + { + field: 'jdst2', + component: 'JDictSelectTag', + label: '字典表下拉', + helpMessage: ['component模式'], + componentProps: { + dictCode: 'sys_user,realname,id', + }, + colProps: { + span: 12, + }, + }, + { + field: 'jdst2', + component: 'JEllipsis', + label: '选中值', + colProps: { span: 12 }, + }, + { + field: 'jdst3', + component: 'JDictSelectTag', + label: '字典表下拉(带条件)', + helpMessage: ['component模式'], + componentProps: { + dictCode: "sys_user,realname,id,username!='admin' order by create_time", + }, + colProps: { + span: 12, + }, + }, + { + field: 'jdst3', + component: 'JEllipsis', + label: '选中值', + colProps: { span: 12 }, + }, + { + field: 'jsst', + component: 'JSearchSelect', + label: '字典搜索(同步)', + colProps: { span: 12 }, + componentProps: { + //dict: "sys_depart,depart_name,id", + dictOptions: [ + { + text: '选项一', + value: '1', + }, + { + text: '选项二', + value: '2', + }, + { + text: '选项三', + value: '3', + }, + ], + }, + }, + { + field: 'jsst', + component: 'JEllipsis', + label: '选择值', + colProps: { span: 12 }, + }, + { + field: 'jsst2', + component: 'JSearchSelect', + label: '字典搜索(异步)', + colProps: { span: 12 }, + componentProps: { + dict: 'sys_depart,depart_name,id', + pageSize: 6, + async: true, + }, + }, + { + field: 'jsst2', + component: 'JEllipsis', + label: '选择值', + colProps: { span: 12 }, + }, + { + field: 'xldx', + component: 'JDictSelectTag', + label: '字典下拉多选', + colProps: { span: 12 }, + componentProps: { + dictCode: 'sex', + mode: 'multiple', + }, + }, + { + field: 'xldx', + component: 'JEllipsis', + label: '选择值', + colProps: { span: 12 }, + }, + { + field: 'xldx2', + component: 'JSelectMultiple', + label: '字典下拉多选2', + colProps: { span: 12 }, + componentProps: { + dictCode: 'sex', + }, + }, + { + field: 'xldx2', + component: 'JEllipsis', + label: '选择值', + colProps: { span: 12 }, + }, + { + field: 'dxxlk', + component: 'JDictSelectTag', + label: '字典下拉单选', + colProps: { span: 12 }, + componentProps: { + dictCode: 'sex', + }, + }, + { + field: 'dxxlk', + component: 'JEllipsis', + label: '选择值', + colProps: { span: 12 }, + }, + { + label: '可输入下拉', + field: 'selectInput', + component: 'JSelectInput', + componentProps: { + options: [ + { label: '选项一', value: '1' }, + { label: '选项二', value: '2' }, + { label: '选项三', value: '3' }, + ], + }, + colProps: { span: 12 }, + }, + { + field: 'selectInput', + component: 'JEllipsis', + label: '选择值', + colProps: { span: 12 }, + }, + { + field: 'depart3', + component: 'JSelectDept', + label: '选择部门—自定义值', + helpMessage: ['component模式'], + componentProps: { showButton: false, rowKey: 'orgCode', primaryKey: 'orgCode' }, + colProps: { + span: 12, + }, + }, + { + field: 'depart3', + component: 'JEllipsis', + label: '选中部门', + colProps: { span: 12 }, + }, + { + field: 'depart2', + component: 'JSelectDept', + label: '选择部门', + helpMessage: ['component模式'], + componentProps: { showButton: false }, + colProps: { + span: 12, + }, + }, + { + field: 'depart2', + component: 'JEllipsis', + label: '选中部门', + colProps: { span: 12 }, + }, + { + field: 'user2', + component: 'JSelectUser', + label: '用户选择组件', + helpMessage: ['component模式'], + componentProps: { + labelKey: 'realname', + rowKey: 'id', + showSelectTable: false, + }, + colProps: { + span: 12, + }, + }, + { + field: 'user2', + component: 'JEllipsis', + label: '选中用户', + colProps: { span: 12 }, + }, + { + field: 'user3', + component: 'JSelectUserByDept', + label: '部门选择用户', + helpMessage: ['component模式'], + componentProps: { + labelKey: 'realname', + rowKey: 'username', + }, + colProps: { + span: 12, + }, + }, + { + field: 'user3', + component: 'JEllipsis', + label: '选中用户', + colProps: { span: 12 }, + }, + { + field: 'role2', + component: 'JSelectRole', + label: '角色选择组件', + helpMessage: ['component模式'], + colProps: { + span: 12, + }, + }, + { + field: 'role2', + component: 'JEllipsis', + label: '选中角色', + colProps: { span: 12 }, + }, + { + field: 'position2', + component: 'JSelectPosition', + label: '职务选择组件', + helpMessage: ['component模式'], + colProps: { span: 12 }, + componentProps: { async: true, showSelectTable: true }, + }, + { + field: 'position2', + component: 'JEllipsis', + label: '选中职务', + colProps: { span: 12 }, + }, + { + field: 'checkbox1', + component: 'JCheckbox', + label: 'JCheckbox组件1', + helpMessage: ['component模式'], + defaultValue: '1,2', + componentProps: { + options: [ + { label: '男', value: '1' }, + { label: '女', value: '2' }, + ], + }, + colProps: { + span: 12, + }, + }, + { + field: 'checkbox1', + component: 'JEllipsis', + label: '选中值', + colProps: { span: 12 }, + }, + { + field: 'checkbox2', + component: 'Input', + label: 'JCheckbox组件2', + defaultValue: '1', + helpMessage: ['插槽模式'], + slot: 'JCheckbox', + colProps: { + span: 12, + }, + }, + { + field: 'checkbox2', + component: 'JEllipsis', + label: '选中值', + colProps: { span: 12 }, + }, + { + field: 'data1', + label: '日期选择', + component: 'DatePicker', + componentProps: { + showTime: true, + valueFormat: 'YYYY-MM-DD HH:mm:ss', + }, + colProps: { + span: 12, + }, + }, + { + field: 'data1', + component: 'JEllipsis', + label: '选中值', + colProps: { + span: 12, + }, + }, + { + field: 'data2', + label: '年份范围选择', + component: 'RangePicker', + componentProps: { + picker: 'year', + valueFormat: 'YYYY', + }, + colProps: { + span: 12, + }, + }, + { + field: 'data2', + component: 'JEllipsis', + label: '选中值', + colProps: { + span: 12, + }, + }, + { + field: 'hk', + component: 'Input', + label: '滑块验证码', + helpMessage: ['插槽模式'], + slot: 'dargVerify', + colProps: { + span: 12, + }, + }, + { + field: 'hk', + component: 'JEllipsis', + label: '选中值', + colProps: { + span: 12, + }, + }, + { + field: 'JTreeDict', + component: 'JTreeDict', + label: '树字典', + helpMessage: ['component模式'], + colProps: { span: 12 }, + }, + { + field: 'JTreeDict', + component: 'JEllipsis', + label: '选中值', + colProps: { + span: 12, + }, + }, + { + field: 'ts', + component: 'JTreeSelect', + label: '下拉树选择', + helpMessage: ['component模式'], + componentProps: { + dict: 'sys_permission,name,id', + pidField: 'parent_id', + hasChildField: 'is_leaf', + converIsLeafVal: 0, + }, + colProps: { + span: 12, + }, + }, + { + field: 'ts', + component: 'JEllipsis', + label: '选中值', + colProps: { span: 12 }, + }, + { + field: 'ts1', + component: 'JTreeSelect', + label: '下拉树多选', + helpMessage: ['component模式'], + componentProps: { + dict: 'sys_permission,name,id', + pidField: 'parent_id', + hasChildField: 'is_leaf', + converIsLeafVal: 0, + multiple: true, + }, + colProps: { + span: 12, + }, + }, + { + field: 'ts1', + component: 'JEllipsis', + label: '选中值', + colProps: { span: 12 }, + }, + { + field: 'category', + component: 'JCategorySelect', + label: '分类字典树', + helpMessage: ['component模式'], + defaultValue: '', + componentProps: { + pcode: 'B01', + multiple: true, + }, + colProps: { + span: 12, + }, + }, + { + field: 'category', + component: 'JEllipsis', + label: '选中值', + colProps: { span: 12 }, + }, + { + field: 'JEasyCron', + component: 'JEasyCron', + label: 'JEasyCron', + helpMessage: ['component模式'], + colProps: { span: 12 }, + defaultValue: '* * * * * ? *', + rules: [{ validator: JCronValidator }], + }, + { + field: 'JEasyCron', + component: 'JEllipsis', + label: '选择值', + colProps: { span: 12 }, + }, + { + field: 'JInput', + component: 'JInput', + label: '特殊查询组件', + helpMessage: ['插槽模式'], + slot: 'JInput', + colProps: { + span: 12, + }, + }, + { + field: 'jinputtype', + component: 'Select', + label: '查询类型', + componentProps: { + options: [ + { value: 'like', label: '模糊(like)' }, + { value: 'ne', label: '不等于(ne)' }, + { value: 'ge', label: '大于等于(ge)' }, + { value: 'le', label: '小于等于(le)' }, + ], + }, + colProps: { + span: 6, + }, + }, + { + field: 'JInput', + component: 'JEllipsis', + label: '输入值', + colProps: { span: 6 }, + }, + { + field: 'field1', + component: 'Select', + label: '省市区选择', + helpMessage: ['插槽模式'], + slot: 'jAreaLinkage', + colProps: { + span: 12, + }, + defaultValue: ['130000', '130200'], + }, + { + field: 'field1', + component: 'JEllipsis', + label: '选中值', + colProps: { + span: 12, + }, + }, + { + field: 'field0', + component: 'Select', + label: '禁用组件(方式一)', + helpMessage: ['插槽模式'], + slot: 'jAreaLinkage1', + colProps: { + span: 12, + }, + defaultValue: ['130000', '130200'], + }, + + { + field: 'field0', + component: 'JEllipsis', + label: '选中值', + colProps: { + span: 12, + }, + }, + { + field: 'field2', + component: 'JAreaLinkage', + label: '禁用组件(方式二)', + helpMessage: ['component模式'], + colProps: { + span: 12, + }, + dynamicDisabled: ({ values }) => { + console.log(values); + return isDisabledAuth(['demo.dbarray']); + }, + defaultValue: ['140000', '140300', '140302'], + }, + { + field: 'field2', + component: 'JEllipsis', + label: '选中值', + colProps: { + span: 12, + }, + }, + { + field: 'pca1', + component: 'JAreaSelect', + label: '省市区级联', + helpMessage: ['component模式'], + defaultValue: '140302', + colProps: { + span: 12, + }, + }, + { + field: 'pca1', + component: 'JEllipsis', + label: '选中值', + colProps: { + span: 12, + }, + }, + { + field: 'pop1', + component: 'Input', + label: 'JPopup示例', + helpMessage: ['插槽模式'], + slot: 'JPopup', + colProps: { + span: 12, + }, + }, + { + field: 'pop1', + component: 'JEllipsis', + label: '选中值', + colProps: { + span: 12, + }, + }, + { + field: 'JInputPop', + component: 'JInputPop', + label: 'JInputPop', + helpMessage: ['component模式'], + colProps: { span: 12 }, + }, + { + field: 'JInputPop', + component: 'JEllipsis', + label: '输入值', + colProps: { span: 12 }, + }, + { + field: 'JTreeDictAsync', + component: 'JTreeDict', + label: '异步JTreeDict', + helpMessage: ['component模式'], + colProps: { span: 12 }, + componentProps: { async: true }, + }, + { + field: 'JTreeDictAsync', + component: 'JEllipsis', + label: '选中值', + colProps: { span: 12 }, + }, + { + field: 'JSwitch', + component: 'JSwitch', + label: 'JSwitch', + helpMessage: ['component模式'], + colProps: { span: 12 }, + }, + { + field: 'JSwitch', + component: 'JEllipsis', + label: '选中值', + colProps: { span: 12 }, + }, + { + field: 'JSwitchSelect', + component: 'JSwitch', + label: 'JSwitchSelect', + helpMessage: ['component模式'], + colProps: { span: 12 }, + componentProps: { query: true }, + }, + { + field: 'JSwitchSelect', + component: 'JEllipsis', + label: '选中值', + colProps: { span: 12 }, + }, + + { + field: 'userSelect2', + component: 'UserSelect', + label: '高级用户选择', + helpMessage: ['component模式'], + colProps: { span: 12 }, + }, + { + field: 'userSelect2', + component: 'JEllipsis', + label: '选中值', + colProps: { span: 12 }, + }, + + { + field: 'superQuery', + component: 'Input', + label: '高级查询', + helpMessage: ['插槽模式'], + slot: 'superQuery', + colProps: { span: 12 }, + }, + { + field: 'superQuery', + component: 'JEllipsis', + label: '选中值', + colProps: { span: 12 }, + }, +]; diff --git a/src/views/demo/jeecg/model/JeecgOrderModal.vue b/src/views/demo/jeecg/model/JeecgOrderModal.vue new file mode 100644 index 0000000..760242b --- /dev/null +++ b/src/views/demo/jeecg/model/JeecgOrderModal.vue @@ -0,0 +1,94 @@ + + diff --git a/src/views/demo/level/Menu111.vue b/src/views/demo/level/Menu111.vue new file mode 100644 index 0000000..23305d3 --- /dev/null +++ b/src/views/demo/level/Menu111.vue @@ -0,0 +1,12 @@ + + diff --git a/src/views/demo/level/Menu12.vue b/src/views/demo/level/Menu12.vue new file mode 100644 index 0000000..2f69682 --- /dev/null +++ b/src/views/demo/level/Menu12.vue @@ -0,0 +1,12 @@ + + diff --git a/src/views/demo/level/Menu2.vue b/src/views/demo/level/Menu2.vue new file mode 100644 index 0000000..527ff2f --- /dev/null +++ b/src/views/demo/level/Menu2.vue @@ -0,0 +1,15 @@ + + diff --git a/src/views/demo/main-out/index.vue b/src/views/demo/main-out/index.vue new file mode 100644 index 0000000..7125067 --- /dev/null +++ b/src/views/demo/main-out/index.vue @@ -0,0 +1,6 @@ + diff --git a/src/views/demo/page/account/center/Application.vue b/src/views/demo/page/account/center/Application.vue new file mode 100644 index 0000000..ae0e281 --- /dev/null +++ b/src/views/demo/page/account/center/Application.vue @@ -0,0 +1,88 @@ + + + diff --git a/src/views/demo/page/account/center/Article.vue b/src/views/demo/page/account/center/Article.vue new file mode 100644 index 0000000..7addc32 --- /dev/null +++ b/src/views/demo/page/account/center/Article.vue @@ -0,0 +1,92 @@ + + + diff --git a/src/views/demo/page/account/center/Project.vue b/src/views/demo/page/account/center/Project.vue new file mode 100644 index 0000000..520ba13 --- /dev/null +++ b/src/views/demo/page/account/center/Project.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/views/demo/page/account/center/data.tsx b/src/views/demo/page/account/center/data.tsx new file mode 100644 index 0000000..e8251b3 --- /dev/null +++ b/src/views/demo/page/account/center/data.tsx @@ -0,0 +1,124 @@ +export interface ListItem { + title: string; + icon: string; + color?: string; +} + +export interface TabItem { + key: string; + name: string; + component: string; +} + +export const tags: string[] = ['很有想法的', '专注设计', '川妹子', '大长腿', '海纳百川', '前端开发', 'vue3']; +; +export const teams: ListItem[] = [ + { + icon: 'ri:alipay-fill', + title: '科学搬砖组', + color: '#ff4000', + }, + { + icon: 'emojione-monotone:letter-a', + title: '中二少年团', + color: '#7c51b8', + }, + { + icon: 'ri:alipay-fill', + title: '高逼格设计', + color: '#00adf7', + }, + { + icon: 'jam:codepen-circle', + title: '程序员日常', + color: '#00adf7', + }, + { + icon: 'fa:behance-square', + title: '科学搬砖组', + color: '#7c51b8', + }, + { + icon: 'jam:codepen-circle', + title: '程序员日常', + color: '#ff4000', + }, +]; + +export const details: ListItem[] = [ + { + icon: 'ic:outline-contacts', + title: '交互专家', + }, + { + icon: 'grommet-icons:cluster', + title: '某某某事业群', + }, + { + icon: 'bx:bx-home-circle', + title: '福建省厦门市', + }, +]; + +export const achieveList: TabItem[] = [ + { + key: '1', + name: '文章', + component: 'Article', + }, + { + key: '2', + name: '应用', + component: 'Application', + }, + { + key: '3', + name: '项目', + component: 'Project', + }, +]; + +export const actions: any[] = [ + { icon: 'clarity:star-line', text: '156', color: '#018ffb' }, + { icon: 'bx:bxs-like', text: '156', color: '#459ae8' }, + { icon: 'bx:bxs-message-dots', text: '2', color: '#42d27d' }, +]; + +export const articleList = (() => { + const result: any[] = []; + for (let i = 0; i < 4; i++) { + result.push({ + title: 'Jeecg Admin', + description: ['Jeecg', '设计语言', 'Typescript'], + content: '基于Vue Next, TypeScript, Ant Design实现的一套完整的企业级后台管理系统。', + time: '2020-11-14 11:20', + }); + } + return result; +})(); + +export const applicationList = (() => { + const result: any[] = []; + for (let i = 0; i < 8; i++) { + result.push({ + title: 'Jeecg Admin', + icon: 'emojione-monotone:letter-a', + color: '#1890ff', + active: '100', + new: '1,799', + download: 'bx:bx-download', + }); + } + return result; +})(); + +export const projectList = (() => { + const result: any[] = []; + for (let i = 0; i < 8; i++) { + result.push({ + title: 'Jeecg Admin', + content: '基于Vue Next, TypeScript, Ant Design实现的一套完整的企业级后台管理系统。', + }); + } + return result; +})(); diff --git a/src/views/demo/page/account/center/index.vue b/src/views/demo/page/account/center/index.vue new file mode 100644 index 0000000..1cce493 --- /dev/null +++ b/src/views/demo/page/account/center/index.vue @@ -0,0 +1,155 @@ + + + + diff --git a/src/views/demo/page/account/setting/AccountBind.vue b/src/views/demo/page/account/setting/AccountBind.vue new file mode 100644 index 0000000..b61beb6 --- /dev/null +++ b/src/views/demo/page/account/setting/AccountBind.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/views/demo/page/account/setting/BaseSetting.vue b/src/views/demo/page/account/setting/BaseSetting.vue new file mode 100644 index 0000000..768bab9 --- /dev/null +++ b/src/views/demo/page/account/setting/BaseSetting.vue @@ -0,0 +1,119 @@ + + + + diff --git a/src/views/demo/page/account/setting/MsgNotify.vue b/src/views/demo/page/account/setting/MsgNotify.vue new file mode 100644 index 0000000..c816a6e --- /dev/null +++ b/src/views/demo/page/account/setting/MsgNotify.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/views/demo/page/account/setting/SecureSetting.vue b/src/views/demo/page/account/setting/SecureSetting.vue new file mode 100644 index 0000000..0c95a31 --- /dev/null +++ b/src/views/demo/page/account/setting/SecureSetting.vue @@ -0,0 +1,68 @@ + + + diff --git a/src/views/demo/page/account/setting/data.ts b/src/views/demo/page/account/setting/data.ts new file mode 100644 index 0000000..2a21342 --- /dev/null +++ b/src/views/demo/page/account/setting/data.ts @@ -0,0 +1,167 @@ +import { FormSchema } from '/@/components/Form/index'; +import { rules } from '/@/utils/helper/validator'; + +export interface ListItem { + key: string; + title: string; + description: string; + extra?: string; + avatar?: string; + color?: string; +} + +// tab的list +export const settingList = [ + { + key: '1', + name: '基本设置', + component: 'BaseSetting', + }, + { + key: '2', + name: '安全设置', + component: 'SecureSetting', + }, + /* { + key: '3', + name: '账号绑定', + component: 'AccountBind', + }, + { + key: '4', + name: '新消息通知', + component: 'MsgNotify', + },*/ +]; + +// 基础设置 form +export const baseSetschemas: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + field: 'realname', + component: 'Input', + label: '昵称', + colProps: { span: 18 }, + }, + { + field: 'sex', + label: '性别', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'sex', + placeholder: '请选择性别', + stringToNumber: true, + }, + colProps: { span: 18 }, + }, + { + label: '生日', + field: 'birthday', + component: 'DatePicker', + colProps: { span: 18 }, + }, + { + field: 'email', + component: 'Input', + label: '邮箱', + colProps: { span: 18 }, + }, + { + field: 'phone', + component: 'Input', + label: '联系电话', + dynamicRules: ({ model, schema }) => { + return [ + { ...rules.duplicateCheckRule('sys_user', 'phone', model, schema, false)[0] }, + { pattern: /^1[3456789]\d{9}$/, message: '手机号码格式有误' }, + ]; + }, + colProps: { span: 18 }, + }, +]; + +// 安全设置 list +export const secureSettingList: ListItem[] = [ + { + key: '1', + title: '账户密码', + description: '当前密码强度::强', + extra: '修改', + }, + { + key: '2', + title: '密保手机', + description: '已绑定手机::138****8293', + extra: '修改', + }, + { + key: '3', + title: '密保问题', + description: '未设置密保问题,密保问题可有效保护账户安全', + extra: '修改', + }, + { + key: '4', + title: '备用邮箱', + description: '已绑定邮箱::ant***sign.com', + extra: '修改', + }, + { + key: '5', + title: 'MFA 设备', + description: '未绑定 MFA 设备,绑定后,可以进行二次确认', + extra: '修改', + }, +]; + +// 账号绑定 list +export const accountBindList: ListItem[] = [ + { + key: '1', + title: '绑定淘宝', + description: '当前未绑定淘宝账号', + extra: '绑定', + avatar: 'ri:taobao-fill', + color: '#ff4000', + }, + { + key: '2', + title: '绑定支付宝', + description: '当前未绑定支付宝账号', + extra: '绑定', + avatar: 'fa-brands:alipay', + color: '#2eabff', + }, + { + key: '3', + title: '绑定钉钉', + description: '当前未绑定钉钉账号', + extra: '绑定', + avatar: 'ri:dingding-fill', + color: '#2eabff', + }, +]; + +// 新消息通知 list +export const msgNotifyList: ListItem[] = [ + { + key: '1', + title: '账户密码', + description: '其他用户的消息将以站内信的形式通知', + }, + { + key: '2', + title: '系统消息', + description: '系统消息将以站内信的形式通知', + }, + { + key: '3', + title: '待办任务', + description: '待办任务将以站内信的形式通知', + }, +]; diff --git a/src/views/demo/page/account/setting/index.vue b/src/views/demo/page/account/setting/index.vue new file mode 100644 index 0000000..74920b8 --- /dev/null +++ b/src/views/demo/page/account/setting/index.vue @@ -0,0 +1,62 @@ + + + + diff --git a/src/views/demo/page/desc/basic/data.tsx b/src/views/demo/page/desc/basic/data.tsx new file mode 100644 index 0000000..d640b62 --- /dev/null +++ b/src/views/demo/page/desc/basic/data.tsx @@ -0,0 +1,196 @@ +import { DescItem } from '/@/components/Description/index'; +import { BasicColumn } from '/@/components/Table/src/types/table'; +import { Button } from '/@/components/Button'; + +import { Badge } from 'ant-design-vue'; + +export const refundData = { + a1: '1000000000', + a2: '已取货', + a3: '1234123421', + a4: '3214321432', +}; + +export const personData = { + b1: '付小小', + b2: '18100000000', + b3: '菜鸟仓储', + b4: '浙江省杭州市西湖区万塘路18号', + b5: '无', +}; +export const refundSchema: DescItem[] = [ + { + field: 'a1', + label: '取货单号', + }, + { + field: 'a2', + label: '状态', + }, + { + field: 'a3', + label: '销售单号', + }, + { + field: 'a4', + label: '子订单', + }, +]; +export const personSchema: DescItem[] = [ + { + field: 'b1', + label: '用户姓名', + }, + { + field: 'b2', + label: '联系电话', + }, + { + field: 'b3', + label: '常用快递', + }, + { + field: 'b4', + label: '取货地址', + }, + { + field: 'b5', + label: '备注', + }, +]; + +export const refundTableSchema: BasicColumn[] = [ + { + title: '商品编号', + width: 150, + dataIndex: 't1', + customRender: ({ record }) => { + return ( + + ); + }, + }, + { + title: '商品名称', + width: 150, + dataIndex: 't2', + }, + { + title: '商品条码', + width: 150, + dataIndex: 't3', + }, + { + title: '单价 ', + width: 150, + dataIndex: 't4', + }, + { + title: '数量(件) ', + width: 150, + dataIndex: 't5', + }, + { + title: '金额', + width: 150, + dataIndex: 't6', + }, +]; +export const refundTimeTableSchema: BasicColumn[] = [ + { + title: '时间', + width: 150, + dataIndex: 't1', + }, + { + title: '当前进度', + width: 150, + dataIndex: 't2', + }, + { + title: '状态', + width: 150, + dataIndex: 't3', + customRender: ({ record }) => { + return ; + }, + }, + { + title: '操作员ID ', + width: 150, + dataIndex: 't4', + }, + { + title: '耗时', + width: 150, + dataIndex: 't5', + }, +]; + +export const refundTableData: any[] = [ + { + t1: 1234561, + t2: '矿泉水 550ml', + t3: '12421432143214321', + t4: '2.00', + t5: 1, + t6: 2.0, + }, + { + t1: 1234562, + t2: '矿泉水 550ml', + t3: '12421432143214321', + t4: '2.00', + t5: 2, + t6: 2.0, + }, + { + t1: 1234562, + t2: '矿泉水 550ml', + t3: '12421432143214321', + t4: '2.00', + t5: 2, + t6: 2.0, + }, + { + t1: 1234562, + t2: '矿泉水 550ml', + t3: '12421432143214321', + t4: '2.00', + t5: 2, + t6: 2.0, + }, +]; + +export const refundTimeTableData: any[] = [ + { + t1: '2017-10-01 14:10', + t2: '联系客户', + t3: '进行中', + t4: '取货员 ID1234', + t5: '5mins', + }, + { + t1: '2017-10-01 14:10', + t2: '取货员出发', + t3: '成功', + t4: '取货员 ID1234', + t5: '5mins', + }, + { + t1: '2017-10-01 14:10', + t2: '取货员接单', + t3: '成功', + t4: '系统', + t5: '5mins', + }, + { + t1: '2017-10-01 14:10', + t2: '申请审批通过', + t3: '成功', + t4: '用户', + t5: '1h', + }, +]; diff --git a/src/views/demo/page/desc/basic/index.vue b/src/views/demo/page/desc/basic/index.vue new file mode 100644 index 0000000..7ff62fd --- /dev/null +++ b/src/views/demo/page/desc/basic/index.vue @@ -0,0 +1,84 @@ + + + diff --git a/src/views/demo/page/desc/high/data.tsx b/src/views/demo/page/desc/high/data.tsx new file mode 100644 index 0000000..ec7a7c3 --- /dev/null +++ b/src/views/demo/page/desc/high/data.tsx @@ -0,0 +1,65 @@ +import { BasicColumn } from '/@/components/Table/src/types/table'; + +import { Badge } from 'ant-design-vue'; + +export const refundTimeTableSchema: BasicColumn[] = [ + { + title: '时间', + width: 150, + dataIndex: 't1', + }, + { + title: '当前进度', + width: 150, + dataIndex: 't2', + }, + { + title: '状态', + width: 150, + dataIndex: 't3', + customRender: ({ record }) => { + return ; + }, + }, + { + title: '操作员ID ', + width: 150, + dataIndex: 't4', + }, + { + title: '耗时', + width: 150, + dataIndex: 't5', + }, +]; + +export const refundTimeTableData: any[] = [ + { + t1: '2017-10-01 14:10', + t2: '联系客户', + t3: '进行中', + t4: '取货员 ID1234', + t5: '5mins', + }, + { + t1: '2017-10-01 14:10', + t2: '取货员出发', + t3: '成功', + t4: '取货员 ID1234', + t5: '5mins', + }, + { + t1: '2017-10-01 14:10', + t2: '取货员接单', + t3: '成功', + t4: '系统', + t5: '5mins', + }, + { + t1: '2017-10-01 14:10', + t2: '申请审批通过', + t3: '成功', + t4: '用户', + t5: '1h', + }, +]; diff --git a/src/views/demo/page/desc/high/index.vue b/src/views/demo/page/desc/high/index.vue new file mode 100644 index 0000000..0263474 --- /dev/null +++ b/src/views/demo/page/desc/high/index.vue @@ -0,0 +1,123 @@ + + diff --git a/src/views/demo/page/form/basic/data.ts b/src/views/demo/page/form/basic/data.ts new file mode 100644 index 0000000..76d2965 --- /dev/null +++ b/src/views/demo/page/form/basic/data.ts @@ -0,0 +1,119 @@ +import { FormSchema } from '/@/components/Form'; + +export const schemas: FormSchema[] = [ + { + field: 'title', + component: 'Input', + label: '标题', + componentProps: { + placeholder: '给目标起个名字', + }, + required: true, + }, + { + field: 'time', + component: 'RangePicker', + label: '起止日期', + required: true, + }, + { + field: 'target', + component: 'InputTextArea', + label: '目标描述', + componentProps: { + placeholder: '请输入你的阶段性工作目标', + rows: 4, + }, + required: true, + }, + { + field: 'metrics', + component: 'InputTextArea', + label: '衡量标准', + componentProps: { + placeholder: '请输入衡量标准', + rows: 4, + }, + required: true, + }, + { + field: 'client', + component: 'Input', + label: '客户', + helpMessage: '目标的服务对象', + subLabel: '( 选填 )', + componentProps: { + placeholder: '请描述你服务的客户,内部客户直接 @姓名/工号', + }, + }, + { + field: 'inviteer', + component: 'Input', + label: '邀评人', + subLabel: '( 选填 )', + componentProps: { + placeholder: '请直接 @姓名/工号,最多可邀请 5 人', + }, + }, + { + field: 'weights', + component: 'InputNumber', + label: '权重', + subLabel: '( 选填 )', + componentProps: { + formatter: (value: string) => (value ? `${value}%` : ''), + parser: (value: string) => value.replace('%', ''), + placeholder: '请输入', + }, + }, + { + field: 'disclosure', + component: 'RadioGroup', + label: '目标公开', + itemProps: { + extra: '客户、邀评人默认被分享', + }, + componentProps: { + options: [ + { + label: '公开', + value: '1', + }, + { + label: '部分公开', + value: '2', + }, + { + label: '不公开', + value: '3', + }, + ], + }, + }, + { + field: 'disclosurer', + component: 'Select', + label: ' ', + show: ({ model }) => { + return model.disclosure === '2'; + }, + componentProps: { + placeholder: '公开给', + mode: 'multiple', + options: [ + { + label: '同事1', + value: '1', + }, + { + label: '同事2', + value: '2', + }, + { + label: '同事3', + value: '3', + }, + ], + }, + }, +]; diff --git a/src/views/demo/page/form/basic/index.vue b/src/views/demo/page/form/basic/index.vue new file mode 100644 index 0000000..407c176 --- /dev/null +++ b/src/views/demo/page/form/basic/index.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/views/demo/page/form/high/PersonTable.vue b/src/views/demo/page/form/high/PersonTable.vue new file mode 100644 index 0000000..47d250d --- /dev/null +++ b/src/views/demo/page/form/high/PersonTable.vue @@ -0,0 +1,137 @@ + + diff --git a/src/views/demo/page/form/high/data.ts b/src/views/demo/page/form/high/data.ts new file mode 100644 index 0000000..73d17d8 --- /dev/null +++ b/src/views/demo/page/form/high/data.ts @@ -0,0 +1,149 @@ +import { FormSchema } from '/@/components/Form'; + +const basicOptions: LabelValueOptions = [ + { + label: '付晓晓', + value: '1', + }, + { + label: '周毛毛', + value: '2', + }, +]; + +const storeTypeOptions: LabelValueOptions = [ + { + label: '私密', + value: '1', + }, + { + label: '公开', + value: '2', + }, +]; + +export const schemas: FormSchema[] = [ + { + field: 'f1', + component: 'Input', + label: '仓库名', + required: true, + }, + { + field: 'f2', + component: 'Input', + label: '仓库域名', + required: true, + componentProps: { + addonBefore: 'http://', + addonAfter: 'com', + }, + colProps: { + offset: 2, + }, + }, + { + field: 'f3', + component: 'Select', + label: '仓库管理员', + componentProps: { + options: basicOptions, + }, + required: true, + colProps: { + offset: 2, + }, + }, + { + field: 'f4', + component: 'Select', + label: '审批人', + componentProps: { + options: basicOptions, + }, + required: true, + }, + { + field: 'f5', + component: 'RangePicker', + label: '生效日期', + required: true, + colProps: { + offset: 2, + }, + }, + { + field: 'f6', + component: 'Select', + label: '仓库类型', + componentProps: { + options: storeTypeOptions, + }, + required: true, + colProps: { + offset: 2, + }, + }, +]; +export const taskSchemas: FormSchema[] = [ + { + field: 't1', + component: 'Input', + label: '任务名', + required: true, + }, + { + field: 't2', + component: 'Input', + label: '任务描述', + required: true, + colProps: { + offset: 2, + }, + }, + { + field: 't3', + component: 'Select', + label: '执行人', + componentProps: { + options: basicOptions, + }, + required: true, + colProps: { + offset: 2, + }, + }, + { + field: 't4', + component: 'Select', + label: '责任人', + componentProps: { + options: basicOptions, + }, + required: true, + }, + { + field: 't5', + component: 'TimePicker', + label: '生效日期', + required: true, + componentProps: { + style: { width: '100%' }, + }, + colProps: { + offset: 2, + }, + }, + { + field: 't6', + component: 'Select', + label: '任务类型', + componentProps: { + options: storeTypeOptions, + }, + required: true, + colProps: { + offset: 2, + }, + }, +]; diff --git a/src/views/demo/page/form/high/index.vue b/src/views/demo/page/form/high/index.vue new file mode 100644 index 0000000..64b1624 --- /dev/null +++ b/src/views/demo/page/form/high/index.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/views/demo/page/form/step/Step1.vue b/src/views/demo/page/form/step/Step1.vue new file mode 100644 index 0000000..74bae97 --- /dev/null +++ b/src/views/demo/page/form/step/Step1.vue @@ -0,0 +1,103 @@ + + + diff --git a/src/views/demo/page/form/step/Step2.vue b/src/views/demo/page/form/step/Step2.vue new file mode 100644 index 0000000..94782b5 --- /dev/null +++ b/src/views/demo/page/form/step/Step2.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/views/demo/page/form/step/Step3.vue b/src/views/demo/page/form/step/Step3.vue new file mode 100644 index 0000000..6d17d12 --- /dev/null +++ b/src/views/demo/page/form/step/Step3.vue @@ -0,0 +1,49 @@ + + + diff --git a/src/views/demo/page/form/step/data.tsx b/src/views/demo/page/form/step/data.tsx new file mode 100644 index 0000000..de4c98e --- /dev/null +++ b/src/views/demo/page/form/step/data.tsx @@ -0,0 +1,63 @@ +import { FormSchema } from '/@/components/Form'; + +export const step1Schemas: FormSchema[] = [ + { + field: 'account', + component: 'Select', + label: '付款账户', + required: true, + defaultValue: '1', + componentProps: { + options: [ + { + label: 'anncwb@126.com', + value: '1', + }, + ], + }, + }, + { + field: 'fac', + component: 'InputGroup', + label: '收款账户', + required: true, + defaultValue: 'test@example.com', + slot: 'fac', + }, + { + field: 'pay', + component: 'Input', + label: '', + defaultValue: 'zfb', + show: false, + }, + { + field: 'payeeName', + component: 'Input', + label: '收款人姓名', + defaultValue: 'Jeecg', + required: true, + }, + { + field: 'money', + component: 'Input', + label: '转账金额', + defaultValue: '500', + required: true, + renderComponentContent: () => { + return { + prefix: () => '¥', + }; + }, + }, +]; + +export const step2Schemas: FormSchema[] = [ + { + field: 'pwd', + component: 'InputPassword', + label: '支付密码', + required: true, + defaultValue: '123456', + }, +]; diff --git a/src/views/demo/page/form/step/index.vue b/src/views/demo/page/form/step/index.vue new file mode 100644 index 0000000..f762c6c --- /dev/null +++ b/src/views/demo/page/form/step/index.vue @@ -0,0 +1,86 @@ + + + diff --git a/src/views/demo/page/list/basic/data.tsx b/src/views/demo/page/list/basic/data.tsx new file mode 100644 index 0000000..193328d --- /dev/null +++ b/src/views/demo/page/list/basic/data.tsx @@ -0,0 +1,17 @@ +export const cardList = (() => { + const result: any[] = []; + for (let i = 0; i < 6; i++) { + result.push({ + id: i, + title: 'Jeecg Admin', + description: '基于Vue Next, TypeScript, Ant Design Vue实现的一套完整的企业级后台管理系统', + datetime: '2020-11-26 17:39', + extra: '编辑', + icon: 'logos:vue', + color: '#1890ff', + author: 'Jeecg', + percent: 20 * (i + 1), + }); + } + return result; +})(); diff --git a/src/views/demo/page/list/basic/index.vue b/src/views/demo/page/list/basic/index.vue new file mode 100644 index 0000000..7232195 --- /dev/null +++ b/src/views/demo/page/list/basic/index.vue @@ -0,0 +1,161 @@ + + + diff --git a/src/views/demo/page/list/card/data.tsx b/src/views/demo/page/list/card/data.tsx new file mode 100644 index 0000000..96d9c29 --- /dev/null +++ b/src/views/demo/page/list/card/data.tsx @@ -0,0 +1,14 @@ +export const cardList = (() => { + const result: any[] = []; + for (let i = 0; i < 12; i++) { + result.push({ + title: 'Jeecg Admin', + icon: 'logos:vue', + color: '#1890ff', + active: '100', + new: '1,799', + download: 'bx:bx-download', + }); + } + return result; +})(); diff --git a/src/views/demo/page/list/card/index.vue b/src/views/demo/page/list/card/index.vue new file mode 100644 index 0000000..f868653 --- /dev/null +++ b/src/views/demo/page/list/card/index.vue @@ -0,0 +1,102 @@ + + + diff --git a/src/views/demo/page/list/search/data.tsx b/src/views/demo/page/list/search/data.tsx new file mode 100644 index 0000000..948bf5b --- /dev/null +++ b/src/views/demo/page/list/search/data.tsx @@ -0,0 +1,37 @@ +import { FormSchema } from '/@/components/Form/index'; + +export const searchList = (() => { + const result: any[] = []; + for (let i = 0; i < 6; i++) { + result.push({ + id: i, + title: 'Jeecg Admin', + description: ['Jeecg', '设计语言', 'Typescript'], + content: '基于Vue Next, TypeScript, Ant Design实现的一套完整的企业级后台管理系统。', + time: '2020-11-14 11:20', + }); + } + return result; +})(); + +export const actions: any[] = [ + { icon: 'clarity:star-line', text: '156', color: '#018ffb' }, + { icon: 'bx:bxs-like', text: '156', color: '#459ae8' }, + { icon: 'bx:bxs-message-dots', text: '2', color: '#42d27d' }, +]; + +export const schemas: FormSchema[] = [ + { + field: 'field1', + component: 'InputSearch', + label: '项目名', + colProps: { + span: 8, + }, + componentProps: { + onChange: (e: any) => { + console.log(e); + }, + }, + }, +]; diff --git a/src/views/demo/page/list/search/index.vue b/src/views/demo/page/list/search/index.vue new file mode 100644 index 0000000..e498f9a --- /dev/null +++ b/src/views/demo/page/list/search/index.vue @@ -0,0 +1,125 @@ + + + diff --git a/src/views/demo/page/result/fail/index.vue b/src/views/demo/page/result/fail/index.vue new file mode 100644 index 0000000..73b65a9 --- /dev/null +++ b/src/views/demo/page/result/fail/index.vue @@ -0,0 +1,54 @@ + + + diff --git a/src/views/demo/page/result/success/index.vue b/src/views/demo/page/result/success/index.vue new file mode 100644 index 0000000..8389207 --- /dev/null +++ b/src/views/demo/page/result/success/index.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/views/demo/permission/CurrentPermissionMode.vue b/src/views/demo/permission/CurrentPermissionMode.vue new file mode 100644 index 0000000..43b9eb3 --- /dev/null +++ b/src/views/demo/permission/CurrentPermissionMode.vue @@ -0,0 +1,32 @@ + + diff --git a/src/views/demo/permission/back/Btn.vue b/src/views/demo/permission/back/Btn.vue new file mode 100644 index 0000000..87dde12 --- /dev/null +++ b/src/views/demo/permission/back/Btn.vue @@ -0,0 +1,88 @@ + + + diff --git a/src/views/demo/permission/back/index.vue b/src/views/demo/permission/back/index.vue new file mode 100644 index 0000000..84c44f3 --- /dev/null +++ b/src/views/demo/permission/back/index.vue @@ -0,0 +1,63 @@ + + + diff --git a/src/views/demo/permission/front/AuthPageA.vue b/src/views/demo/permission/front/AuthPageA.vue new file mode 100644 index 0000000..e5efa64 --- /dev/null +++ b/src/views/demo/permission/front/AuthPageA.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/views/demo/permission/front/AuthPageB.vue b/src/views/demo/permission/front/AuthPageB.vue new file mode 100644 index 0000000..ca58426 --- /dev/null +++ b/src/views/demo/permission/front/AuthPageB.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/views/demo/permission/front/Btn.vue b/src/views/demo/permission/front/Btn.vue new file mode 100644 index 0000000..d7d3f97 --- /dev/null +++ b/src/views/demo/permission/front/Btn.vue @@ -0,0 +1,85 @@ + + + diff --git a/src/views/demo/permission/front/index.vue b/src/views/demo/permission/front/index.vue new file mode 100644 index 0000000..8a405aa --- /dev/null +++ b/src/views/demo/permission/front/index.vue @@ -0,0 +1,57 @@ + + + diff --git a/src/views/demo/setup/index.vue b/src/views/demo/setup/index.vue new file mode 100644 index 0000000..17d254f --- /dev/null +++ b/src/views/demo/setup/index.vue @@ -0,0 +1,43 @@ + + diff --git a/src/views/demo/system/account/AccountDetail.vue b/src/views/demo/system/account/AccountDetail.vue new file mode 100644 index 0000000..150cc8b --- /dev/null +++ b/src/views/demo/system/account/AccountDetail.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/src/views/demo/system/account/AccountModal.vue b/src/views/demo/system/account/AccountModal.vue new file mode 100644 index 0000000..167bb72 --- /dev/null +++ b/src/views/demo/system/account/AccountModal.vue @@ -0,0 +1,74 @@ + + diff --git a/src/views/demo/system/account/DeptTree.vue b/src/views/demo/system/account/DeptTree.vue new file mode 100644 index 0000000..b67b4f0 --- /dev/null +++ b/src/views/demo/system/account/DeptTree.vue @@ -0,0 +1,42 @@ + + diff --git a/src/views/demo/system/account/account.data.ts b/src/views/demo/system/account/account.data.ts new file mode 100644 index 0000000..ade68c1 --- /dev/null +++ b/src/views/demo/system/account/account.data.ts @@ -0,0 +1,127 @@ +import { getAllRoleList, isAccountExist } from '/@/api/demo/system'; +import { BasicColumn } from '/@/components/Table'; +import { FormSchema } from '/@/components/Table'; + +export const columns: BasicColumn[] = [ + { + title: '用户名', + dataIndex: 'account', + width: 120, + }, + { + title: '昵称', + dataIndex: 'nickname', + width: 120, + }, + { + title: '邮箱', + dataIndex: 'email', + width: 120, + }, + { + title: '创建时间', + dataIndex: 'createTime', + width: 180, + }, + { + title: '角色', + dataIndex: 'role', + width: 200, + }, + { + title: '备注', + dataIndex: 'remark', + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'account', + label: '用户名', + component: 'Input', + colProps: { span: 8 }, + }, + { + field: 'nickname', + label: '昵称', + component: 'Input', + colProps: { span: 8 }, + }, +]; + +export const accountFormSchema: FormSchema[] = [ + { + field: 'account', + label: '用户名', + component: 'Input', + helpMessage: ['本字段演示异步验证', '不能输入带有admin的用户名'], + rules: [ + { + required: true, + message: '请输入用户名', + }, + { + validator(_, value) { + return new Promise((resolve, reject) => { + isAccountExist(value) + .then(() => resolve()) + .catch((err) => { + reject(err.message || '验证失败'); + }); + }); + }, + }, + ], + }, + { + field: 'pwd', + label: '密码', + component: 'InputPassword', + required: true, + ifShow: false, + }, + { + label: '角色', + field: 'role', + component: 'ApiSelect', + componentProps: { + api: getAllRoleList, + labelField: 'roleName', + valueField: 'roleValue', + }, + required: true, + }, + { + field: 'dept', + label: '所属部门', + component: 'TreeSelect', + componentProps: { + fieldNames: { + label: 'deptName', + key: 'id', + value: 'id', + }, + getPopupContainer: () => document.body, + }, + required: true, + }, + { + field: 'nickname', + label: '昵称', + component: 'Input', + required: true, + }, + + { + label: '邮箱', + field: 'email', + component: 'Input', + required: true, + }, + + { + label: '备注', + field: 'remark', + component: 'InputTextArea', + }, +]; diff --git a/src/views/demo/system/account/index.vue b/src/views/demo/system/account/index.vue new file mode 100644 index 0000000..2a73cdc --- /dev/null +++ b/src/views/demo/system/account/index.vue @@ -0,0 +1,137 @@ + + diff --git a/src/views/demo/system/dept/DeptModal.vue b/src/views/demo/system/dept/DeptModal.vue new file mode 100644 index 0000000..005148d --- /dev/null +++ b/src/views/demo/system/dept/DeptModal.vue @@ -0,0 +1,61 @@ + + diff --git a/src/views/demo/system/dept/dept.data.ts b/src/views/demo/system/dept/dept.data.ts new file mode 100644 index 0000000..6bdd1ca --- /dev/null +++ b/src/views/demo/system/dept/dept.data.ts @@ -0,0 +1,108 @@ +import { BasicColumn } from '/@/components/Table'; +import { FormSchema } from '/@/components/Table'; +import { h } from 'vue'; +import { Tag } from 'ant-design-vue'; + +export const columns: BasicColumn[] = [ + { + title: '部门名称', + dataIndex: 'deptName', + width: 160, + align: 'left', + }, + { + title: '排序', + dataIndex: 'orderNo', + width: 50, + }, + { + title: '状态', + dataIndex: 'status', + width: 80, + customRender: ({ record }) => { + const status = record.status; + const enable = ~~status === 0; + const color = enable ? 'green' : 'red'; + const text = enable ? '启用' : '停用'; + return h(Tag, { color: color }, () => text); + }, + }, + { + title: '创建时间', + dataIndex: 'createTime', + width: 180, + }, + { + title: '备注', + dataIndex: 'remark', + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'deptName', + label: '部门名称', + component: 'Input', + colProps: { span: 8 }, + }, + { + field: 'status', + label: '状态', + component: 'Select', + componentProps: { + options: [ + { label: '启用', value: '0' }, + { label: '停用', value: '1' }, + ], + }, + colProps: { span: 8 }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + field: 'deptName', + label: '部门名称', + component: 'Input', + required: true, + }, + { + field: 'parentDept', + label: '上级部门', + component: 'TreeSelect', + + componentProps: { + replaceFields: { + title: 'deptName', + key: 'id', + value: 'id', + }, + getPopupContainer: () => document.body, + }, + required: true, + }, + { + field: 'orderNo', + label: '排序', + component: 'InputNumber', + required: true, + }, + { + field: 'status', + label: '状态', + component: 'RadioButtonGroup', + defaultValue: '0', + componentProps: { + options: [ + { label: '启用', value: '0' }, + { label: '停用', value: '1' }, + ], + }, + required: true, + }, + { + label: '备注', + field: 'remark', + component: 'InputTextArea', + }, +]; diff --git a/src/views/demo/system/dept/index.vue b/src/views/demo/system/dept/index.vue new file mode 100644 index 0000000..b803ef0 --- /dev/null +++ b/src/views/demo/system/dept/index.vue @@ -0,0 +1,100 @@ + + diff --git a/src/views/demo/system/menu/MenuDrawer.vue b/src/views/demo/system/menu/MenuDrawer.vue new file mode 100644 index 0000000..606c3c7 --- /dev/null +++ b/src/views/demo/system/menu/MenuDrawer.vue @@ -0,0 +1,63 @@ + + diff --git a/src/views/demo/system/menu/index.vue b/src/views/demo/system/menu/index.vue new file mode 100644 index 0000000..8aa3185 --- /dev/null +++ b/src/views/demo/system/menu/index.vue @@ -0,0 +1,107 @@ + + diff --git a/src/views/demo/system/menu/menu.data.ts b/src/views/demo/system/menu/menu.data.ts new file mode 100644 index 0000000..834bd21 --- /dev/null +++ b/src/views/demo/system/menu/menu.data.ts @@ -0,0 +1,202 @@ +import { BasicColumn } from '/@/components/Table'; +import { FormSchema } from '/@/components/Table'; +import { h } from 'vue'; +import { Tag } from 'ant-design-vue'; +import { Icon } from '/@/components/Icon'; + +export const columns: BasicColumn[] = [ + { + title: '菜单名称', + dataIndex: 'menuName', + width: 200, + align: 'left', + }, + { + title: '图标', + dataIndex: 'icon', + width: 50, + customRender: ({ record }) => { + return h(Icon, { icon: record.icon }); + }, + }, + { + title: '权限标识', + dataIndex: 'permission', + width: 180, + }, + { + title: '组件', + dataIndex: 'component', + }, + { + title: '排序', + dataIndex: 'orderNo', + width: 50, + }, + { + title: '状态', + dataIndex: 'status', + width: 80, + customRender: ({ record }) => { + const status = record.status; + const enable = ~~status === 0; + const color = enable ? 'green' : 'red'; + const text = enable ? '启用' : '停用'; + return h(Tag, { color: color }, () => text); + }, + }, + { + title: '创建时间', + dataIndex: 'createTime', + width: 180, + }, +]; + +const isDir = (type: string) => type === '0'; +const isMenu = (type: string) => type === '1'; +const isButton = (type: string) => type === '2'; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'menuName', + label: '菜单名称', + component: 'Input', + colProps: { span: 8 }, + }, + { + field: 'status', + label: '状态', + component: 'Select', + componentProps: { + options: [ + { label: '启用', value: '0' }, + { label: '停用', value: '1' }, + ], + }, + colProps: { span: 8 }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + field: 'type', + label: '菜单类型', + component: 'RadioButtonGroup', + defaultValue: '0', + componentProps: { + options: [ + { label: '目录', value: '0' }, + { label: '菜单', value: '1' }, + { label: '按钮', value: '2' }, + ], + }, + colProps: { lg: 24, md: 24 }, + }, + { + field: 'menuName', + label: '菜单名称', + component: 'Input', + required: true, + }, + + { + field: 'parentMenu', + label: '上级菜单', + component: 'TreeSelect', + componentProps: { + replaceFields: { + title: 'menuName', + key: 'id', + value: 'id', + }, + getPopupContainer: () => document.body, + }, + }, + + { + field: 'orderNo', + label: '排序', + component: 'InputNumber', + required: true, + }, + { + field: 'icon', + label: '图标', + component: 'IconPicker', + required: true, + ifShow: ({ values }) => !isButton(values.type), + }, + + { + field: 'routePath', + label: '路由地址', + component: 'Input', + required: true, + ifShow: ({ values }) => !isButton(values.type), + }, + { + field: 'component', + label: '组件路径', + component: 'Input', + ifShow: ({ values }) => isMenu(values.type), + }, + { + field: 'permission', + label: '权限标识', + component: 'Input', + ifShow: ({ values }) => !isDir(values.type), + }, + { + field: 'status', + label: '状态', + component: 'RadioButtonGroup', + defaultValue: '0', + componentProps: { + options: [ + { label: '启用', value: '0' }, + { label: '禁用', value: '1' }, + ], + }, + }, + { + field: 'isExt', + label: '是否外链', + component: 'RadioButtonGroup', + defaultValue: '0', + componentProps: { + options: [ + { label: '否', value: '0' }, + { label: '是', value: '1' }, + ], + }, + ifShow: ({ values }) => !isButton(values.type), + }, + + { + field: 'keepalive', + label: '是否缓存', + component: 'RadioButtonGroup', + defaultValue: '0', + componentProps: { + options: [ + { label: '否', value: '0' }, + { label: '是', value: '1' }, + ], + }, + ifShow: ({ values }) => isMenu(values.type), + }, + + { + field: 'show', + label: '是否显示', + component: 'RadioButtonGroup', + defaultValue: '0', + componentProps: { + options: [ + { label: '是', value: '0' }, + { label: '否', value: '1' }, + ], + }, + ifShow: ({ values }) => !isButton(values.type), + }, +]; diff --git a/src/views/demo/system/password/index.vue b/src/views/demo/system/password/index.vue new file mode 100644 index 0000000..f5685ae --- /dev/null +++ b/src/views/demo/system/password/index.vue @@ -0,0 +1,44 @@ + + diff --git a/src/views/demo/system/password/pwd.data.ts b/src/views/demo/system/password/pwd.data.ts new file mode 100644 index 0000000..be5f9b1 --- /dev/null +++ b/src/views/demo/system/password/pwd.data.ts @@ -0,0 +1,46 @@ +import { FormSchema } from '/@/components/Form'; + +export const formSchema: FormSchema[] = [ + { + field: 'passwordOld', + label: '当前密码', + component: 'InputPassword', + required: true, + }, + { + field: 'passwordNew', + label: '新密码', + component: 'StrengthMeter', + componentProps: { + placeholder: '新密码', + }, + rules: [ + { + required: true, + message: '请输入新密码', + }, + ], + }, + { + field: 'confirmPassword', + label: '确认密码', + component: 'InputPassword', + + dynamicRules: ({ values }) => { + return [ + { + required: true, + validator: (_, value) => { + if (!value) { + return Promise.reject('不能为空'); + } + if (value !== values.passwordNew) { + return Promise.reject('两次输入的密码不一致!'); + } + return Promise.resolve(); + }, + }, + ]; + }, + }, +]; diff --git a/src/views/demo/system/role/RoleDrawer.vue b/src/views/demo/system/role/RoleDrawer.vue new file mode 100644 index 0000000..b1a5758 --- /dev/null +++ b/src/views/demo/system/role/RoleDrawer.vue @@ -0,0 +1,80 @@ + + diff --git a/src/views/demo/system/role/index.vue b/src/views/demo/system/role/index.vue new file mode 100644 index 0000000..488e5cf --- /dev/null +++ b/src/views/demo/system/role/index.vue @@ -0,0 +1,97 @@ + + diff --git a/src/views/demo/system/role/role.data.ts b/src/views/demo/system/role/role.data.ts new file mode 100644 index 0000000..f785427 --- /dev/null +++ b/src/views/demo/system/role/role.data.ts @@ -0,0 +1,124 @@ +import { BasicColumn } from '/@/components/Table'; +import { FormSchema } from '/@/components/Table'; +import { h } from 'vue'; +import { Switch } from 'ant-design-vue'; +import { setRoleStatus } from '/@/api/demo/system'; +import { useMessage } from '/@/hooks/web/useMessage'; + +export const columns: BasicColumn[] = [ + { + title: '角色名称', + dataIndex: 'roleName', + width: 200, + }, + { + title: '角色值', + dataIndex: 'roleValue', + width: 180, + }, + { + title: '排序', + dataIndex: 'orderNo', + width: 50, + }, + { + title: '状态', + dataIndex: 'status', + width: 120, + customRender: ({ record }) => { + if (!Reflect.has(record, 'pendingStatus')) { + record.pendingStatus = false; + } + return h(Switch, { + checked: record.status === '1', + checkedChildren: '已启用', + unCheckedChildren: '已禁用', + loading: record.pendingStatus, + onChange(checked: boolean) { + record.pendingStatus = true; + const newStatus = checked ? '1' : '0'; + const { createMessage } = useMessage(); + setRoleStatus(record.id, newStatus) + .then(() => { + record.status = newStatus; + createMessage.success(`已成功修改角色状态`); + }) + .catch(() => { + createMessage.error('修改角色状态失败'); + }) + .finally(() => { + record.pendingStatus = false; + }); + }, + }); + }, + }, + { + title: '创建时间', + dataIndex: 'createTime', + width: 180, + }, + { + title: '备注', + dataIndex: 'remark', + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'roleNme', + label: '角色名称', + component: 'Input', + colProps: { span: 8 }, + }, + { + field: 'status', + label: '状态', + component: 'Select', + componentProps: { + options: [ + { label: '启用', value: '0' }, + { label: '停用', value: '1' }, + ], + }, + colProps: { span: 8 }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + field: 'roleName', + label: '角色名称', + required: true, + component: 'Input', + }, + { + field: 'roleValue', + label: '角色值', + required: true, + component: 'Input', + }, + { + field: 'status', + label: '状态', + component: 'RadioButtonGroup', + defaultValue: '0', + componentProps: { + options: [ + { label: '启用', value: '0' }, + { label: '停用', value: '1' }, + ], + }, + }, + { + label: '备注', + field: 'remark', + component: 'InputTextArea', + }, + { + label: ' ', + field: 'menu', + slot: 'menu', + component: 'Input', + }, +]; diff --git a/src/views/demo/system/test/TestDrawer.vue b/src/views/demo/system/test/TestDrawer.vue new file mode 100644 index 0000000..264692f --- /dev/null +++ b/src/views/demo/system/test/TestDrawer.vue @@ -0,0 +1,59 @@ + + diff --git a/src/views/demo/system/test/index.vue b/src/views/demo/system/test/index.vue new file mode 100644 index 0000000..57850e6 --- /dev/null +++ b/src/views/demo/system/test/index.vue @@ -0,0 +1,97 @@ + + diff --git a/src/views/demo/system/test/test.data.ts b/src/views/demo/system/test/test.data.ts new file mode 100644 index 0000000..b8f9023 --- /dev/null +++ b/src/views/demo/system/test/test.data.ts @@ -0,0 +1,51 @@ +import { BasicColumn } from '/@/components/Table'; +import { FormSchema } from '/@/components/Table'; + +export const columns: BasicColumn[] = [ + { + title: '名称', + dataIndex: 'testName', + width: 200, + }, + { + title: '值', + dataIndex: 'testValue', + width: 180, + }, + { + title: '创建时间', + dataIndex: 'createTime', + width: 180, + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'testName', + label: '名称', + component: 'Input', + colProps: { span: 8 }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + field: 'testName', + label: '名称', + required: true, + component: 'Input', + }, + { + field: 'testValue', + label: '值', + required: true, + component: 'Input', + }, + + { + label: ' ', + field: 'menu', + slot: 'menu', + component: 'Input', + }, +]; diff --git a/src/views/demo/table/AuthColumn.vue b/src/views/demo/table/AuthColumn.vue new file mode 100644 index 0000000..a611324 --- /dev/null +++ b/src/views/demo/table/AuthColumn.vue @@ -0,0 +1,127 @@ + + diff --git a/src/views/demo/table/Basic.vue b/src/views/demo/table/Basic.vue new file mode 100644 index 0000000..4d8e88c --- /dev/null +++ b/src/views/demo/table/Basic.vue @@ -0,0 +1,81 @@ + + diff --git a/src/views/demo/table/CustomerCell.vue b/src/views/demo/table/CustomerCell.vue new file mode 100644 index 0000000..f2a83b3 --- /dev/null +++ b/src/views/demo/table/CustomerCell.vue @@ -0,0 +1,104 @@ + + diff --git a/src/views/demo/table/EditCellTable.vue b/src/views/demo/table/EditCellTable.vue new file mode 100644 index 0000000..530f806 --- /dev/null +++ b/src/views/demo/table/EditCellTable.vue @@ -0,0 +1,209 @@ + + diff --git a/src/views/demo/table/EditRowTable.vue b/src/views/demo/table/EditRowTable.vue new file mode 100644 index 0000000..cb0dd26 --- /dev/null +++ b/src/views/demo/table/EditRowTable.vue @@ -0,0 +1,253 @@ + + diff --git a/src/views/demo/table/ExpandTable.vue b/src/views/demo/table/ExpandTable.vue new file mode 100644 index 0000000..65fcd62 --- /dev/null +++ b/src/views/demo/table/ExpandTable.vue @@ -0,0 +1,74 @@ + + diff --git a/src/views/demo/table/FetchTable.vue b/src/views/demo/table/FetchTable.vue new file mode 100644 index 0000000..8d9efa3 --- /dev/null +++ b/src/views/demo/table/FetchTable.vue @@ -0,0 +1,43 @@ + + diff --git a/src/views/demo/table/FixedColumn.vue b/src/views/demo/table/FixedColumn.vue new file mode 100644 index 0000000..c02f5b8 --- /dev/null +++ b/src/views/demo/table/FixedColumn.vue @@ -0,0 +1,93 @@ + + diff --git a/src/views/demo/table/FixedHeight.vue b/src/views/demo/table/FixedHeight.vue new file mode 100644 index 0000000..389da36 --- /dev/null +++ b/src/views/demo/table/FixedHeight.vue @@ -0,0 +1,41 @@ + + diff --git a/src/views/demo/table/FooterTable.vue b/src/views/demo/table/FooterTable.vue new file mode 100644 index 0000000..e81780b --- /dev/null +++ b/src/views/demo/table/FooterTable.vue @@ -0,0 +1,50 @@ + + diff --git a/src/views/demo/table/FormTable.vue b/src/views/demo/table/FormTable.vue new file mode 100644 index 0000000..f73c59b --- /dev/null +++ b/src/views/demo/table/FormTable.vue @@ -0,0 +1,63 @@ + + diff --git a/src/views/demo/table/MergeHeader.vue b/src/views/demo/table/MergeHeader.vue new file mode 100644 index 0000000..2c3b612 --- /dev/null +++ b/src/views/demo/table/MergeHeader.vue @@ -0,0 +1,27 @@ + + diff --git a/src/views/demo/table/MultipleHeader.vue b/src/views/demo/table/MultipleHeader.vue new file mode 100644 index 0000000..fa0bf43 --- /dev/null +++ b/src/views/demo/table/MultipleHeader.vue @@ -0,0 +1,26 @@ + + diff --git a/src/views/demo/table/NestedTable.vue b/src/views/demo/table/NestedTable.vue new file mode 100644 index 0000000..fb71592 --- /dev/null +++ b/src/views/demo/table/NestedTable.vue @@ -0,0 +1,110 @@ + + diff --git a/src/views/demo/table/RefTable.vue b/src/views/demo/table/RefTable.vue new file mode 100644 index 0000000..f2a0c6d --- /dev/null +++ b/src/views/demo/table/RefTable.vue @@ -0,0 +1,125 @@ + + diff --git a/src/views/demo/table/TreeTable.vue b/src/views/demo/table/TreeTable.vue new file mode 100644 index 0000000..88afe63 --- /dev/null +++ b/src/views/demo/table/TreeTable.vue @@ -0,0 +1,41 @@ + + diff --git a/src/views/demo/table/UseTable.vue b/src/views/demo/table/UseTable.vue new file mode 100644 index 0000000..3c54997 --- /dev/null +++ b/src/views/demo/table/UseTable.vue @@ -0,0 +1,147 @@ + + diff --git a/src/views/demo/table/tableData.tsx b/src/views/demo/table/tableData.tsx new file mode 100644 index 0000000..6270ab4 --- /dev/null +++ b/src/views/demo/table/tableData.tsx @@ -0,0 +1,316 @@ +import { FormProps, FormSchema } from '/@/components/Table'; +import { BasicColumn } from '/@/components/Table/src/types/table'; + +export function getBasicColumns(): BasicColumn[] { + return [ + { + title: 'ID', + dataIndex: 'id', + fixed: 'left', + width: 200, + }, + { + title: '姓名', + dataIndex: 'name', + width: 150, + filters: [ + { text: 'Male', value: 'male' }, + { text: 'Female', value: 'female' }, + ], + }, + { + title: '地址', + dataIndex: 'address', + width: 300, + }, + { + title: '编号', + dataIndex: 'no', + width: 150, + sorter: true, + defaultHidden: true, + }, + { + title: '开始时间', + width: 150, + sorter: true, + dataIndex: 'beginTime', + }, + { + title: '结束时间', + width: 150, + sorter: true, + dataIndex: 'endTime', + }, + ]; +} + +export function getBasicShortColumns(): BasicColumn[] { + return [ + { + title: 'ID', + width: 150, + dataIndex: 'id', + sorter: true, + sortOrder: 'ascend', + }, + { + title: '姓名', + dataIndex: 'name', + width: 120, + }, + { + title: '地址', + dataIndex: 'address', + }, + { + title: '编号', + dataIndex: 'no', + width: 80, + }, + ]; +} + +export function getMultipleHeaderColumns(): BasicColumn[] { + return [ + { + title: 'ID', + dataIndex: 'id', + width: 200, + }, + { + title: '姓名', + dataIndex: 'name', + width: 120, + }, + { + title: '地址', + dataIndex: 'address', + sorter: true, + children: [ + { + title: '编号', + dataIndex: 'no', + width: 120, + filters: [ + { text: 'Male', value: 'male', children: [] }, + { text: 'Female', value: 'female', children: [] }, + ], + }, + + { + title: '开始时间', + dataIndex: 'beginTime', + width: 120, + }, + { + title: '结束时间', + dataIndex: 'endTime', + width: 120, + }, + ], + }, + ]; +} + +export function getCustomHeaderColumns(): BasicColumn[] { + return [ + { + title: 'ID', + dataIndex: 'id', + width: 200, + }, + { + // title: '姓名', + dataIndex: 'name', + width: 120, + slots: { title: 'customTitle' }, + }, + { + // title: '地址', + dataIndex: 'address', + width: 120, + slots: { title: 'customAddress' }, + sorter: true, + }, + + { + title: '编号', + dataIndex: 'no', + width: 120, + filters: [ + { text: 'Male', value: 'male', children: [] }, + { text: 'Female', value: 'female', children: [] }, + ], + }, + { + title: '开始时间', + dataIndex: 'beginTime', + width: 120, + }, + { + title: '结束时间', + dataIndex: 'endTime', + width: 120, + }, + ]; +} +const renderContent = ({ text, index }: { text: any; index: number }) => { + const obj: any = { + children: text, + attrs: {}, + }; + if (index === 9) { + obj.attrs.colSpan = 0; + } + return obj; +}; +export function getMergeHeaderColumns(): BasicColumn[] { + return [ + { + title: 'ID', + dataIndex: 'id', + width: 300, + customRender: renderContent, + }, + { + title: '姓名', + dataIndex: 'name', + width: 300, + customRender: renderContent, + }, + { + title: '地址', + dataIndex: 'address', + colSpan: 2, + width: 120, + sorter: true, + customRender: ({ text, index }: { text: any; index: number }) => { + const obj: any = { + children: text, + attrs: {}, + }; + if (index === 2) { + obj.attrs.rowSpan = 2; + } + if (index === 3) { + obj.attrs.colSpan = 0; + } + return obj; + }, + }, + { + title: '编号', + dataIndex: 'no', + colSpan: 0, + filters: [ + { text: 'Male', value: 'male', children: [] }, + { text: 'Female', value: 'female', children: [] }, + ], + customRender: renderContent, + }, + { + title: '开始时间', + dataIndex: 'beginTime', + width: 200, + customRender: renderContent, + }, + { + title: '结束时间', + dataIndex: 'endTime', + width: 200, + customRender: renderContent, + }, + ]; +} +export const getAdvanceSchema = (itemNumber = 6): FormSchema[] => { + const arr: any = []; + for (let index = 0; index < itemNumber; index++) { + arr.push({ + field: `field${index}`, + label: `字段${index}`, + component: 'Input', + colProps: { + xl: 12, + xxl: 8, + }, + }); + } + return arr; +}; +export function getFormConfig(): Partial { + return { + labelWidth: 100, + schemas: [ + ...getAdvanceSchema(5), + { + field: `field11`, + label: `Slot示例`, + component: 'Select', + slot: 'custom', + colProps: { + xl: 12, + xxl: 8, + }, + }, + ], + }; +} +export function getBasicData() { + const data: any = (() => { + const arr: any = []; + for (let index = 0; index < 40; index++) { + arr.push({ + id: `${index}`, + name: 'John Brown', + age: `1${index}`, + no: `${index + 10}`, + address: 'New York No. 1 Lake ParkNew York No. 1 Lake Park', + beginTime: new Date().toLocaleString(), + endTime: new Date().toLocaleString(), + }); + } + return arr; + })(); + return data; +} + +export function getTreeTableData() { + const data: any = (() => { + const arr: any = []; + for (let index = 0; index < 40; index++) { + arr.push({ + id: `${index}`, + name: 'John Brown', + age: `1${index}`, + no: `${index + 10}`, + address: 'New York No. 1 Lake ParkNew York No. 1 Lake Park', + beginTime: new Date().toLocaleString(), + endTime: new Date().toLocaleString(), + children: [ + { + id: `l2-${index}`, + name: 'John Brown', + age: `1${index}`, + no: `${index + 10}`, + address: 'New York No. 1 Lake ParkNew York No. 1 Lake Park', + beginTime: new Date().toLocaleString(), + endTime: new Date().toLocaleString(), + }, + { + id: `l3-${index}`, + name: 'John Mary', + age: `1${index}`, + no: `${index + 10}`, + address: 'New York No. 1 Lake ParkNew York No. 1 Lake Park', + beginTime: new Date().toLocaleString(), + endTime: new Date().toLocaleString(), + }, + ], + }); + } + return arr; + })(); + + return data; +} diff --git a/src/views/demo/tree/ActionTree.vue b/src/views/demo/tree/ActionTree.vue new file mode 100644 index 0000000..74538df --- /dev/null +++ b/src/views/demo/tree/ActionTree.vue @@ -0,0 +1,131 @@ + + diff --git a/src/views/demo/tree/EditTree.vue b/src/views/demo/tree/EditTree.vue new file mode 100644 index 0000000..4af04a2 --- /dev/null +++ b/src/views/demo/tree/EditTree.vue @@ -0,0 +1,83 @@ + + diff --git a/src/views/demo/tree/data.ts b/src/views/demo/tree/data.ts new file mode 100644 index 0000000..8fb40bf --- /dev/null +++ b/src/views/demo/tree/data.ts @@ -0,0 +1,35 @@ +import { TreeItem } from '/@/components/Tree/index'; + +export const treeData: TreeItem[] = [ + { + title: 'parent ', + key: '0-0', + children: [ + { title: 'leaf', key: '0-0-0' }, + { + title: 'leaf', + key: '0-0-1', + children: [ + { title: 'leaf', key: '0-0-0-0', children: [{ title: 'leaf', key: '0-0-0-0-1' }] }, + { title: 'leaf', key: '0-0-0-1' }, + ], + }, + ], + }, + { + title: 'parent 2', + key: '1-1', + children: [ + { title: 'leaf', key: '1-1-0' }, + { title: 'leaf', key: '1-1-1' }, + ], + }, + { + title: 'parent 3', + key: '2-2', + children: [ + { title: 'leaf', key: '2-2-0' }, + { title: 'leaf', key: '2-2-1' }, + ], + }, +]; diff --git a/src/views/demo/tree/index.vue b/src/views/demo/tree/index.vue new file mode 100644 index 0000000..539e1f1 --- /dev/null +++ b/src/views/demo/tree/index.vue @@ -0,0 +1,128 @@ + + diff --git a/src/views/demo/vextable/OneToOneModal.vue b/src/views/demo/vextable/OneToOneModal.vue new file mode 100644 index 0000000..2f5cd1e --- /dev/null +++ b/src/views/demo/vextable/OneToOneModal.vue @@ -0,0 +1,187 @@ + + + diff --git a/src/views/demo/vextable/VexTableModal.vue b/src/views/demo/vextable/VexTableModal.vue new file mode 100644 index 0000000..f15586b --- /dev/null +++ b/src/views/demo/vextable/VexTableModal.vue @@ -0,0 +1,190 @@ + + + diff --git a/src/views/demo/vextable/api.ts b/src/views/demo/vextable/api.ts new file mode 100644 index 0000000..c8021ab --- /dev/null +++ b/src/views/demo/vextable/api.ts @@ -0,0 +1,32 @@ +import { defHttp } from '/@/utils/http/axios'; + +enum Api { + list = '/test/jeecgOrderMain/list', + delete = '/test/jeecgOrderMain/delete', + orderCustomerList = '/test/jeecgOrderMain/queryOrderCustomerListByMainId', + orderTicketList = '/test/jeecgOrderMain/queryOrderTicketListByMainId', +} + +/** + * 列表接口 + * @param params + */ +export const list = (params) => defHttp.get({ url: Api.list, params }); +/** + * 子表单信息 + * @param params + */ +export const orderTicketList = (params) => defHttp.get({ url: Api.orderTicketList, params }); +/** + * 子表单信息 + * @param params + */ +export const orderCustomerList = (params) => defHttp.get({ url: Api.orderCustomerList, params }); +/** + * 删除用户 + */ +export const deleteOne = (params, handleSuccess) => { + return defHttp.delete({ url: Api.delete, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; diff --git a/src/views/demo/vextable/data.ts b/src/views/demo/vextable/data.ts new file mode 100644 index 0000000..cc9c39c --- /dev/null +++ b/src/views/demo/vextable/data.ts @@ -0,0 +1,154 @@ +import { BasicColumn, FormSchema } from '/@/components/Table'; +import { usePermission } from '/@/hooks/web/usePermission'; +import { JVxeColumn, JVxeTypes } from '/@/components/jeecg/JVxeTable/types'; +const { isDisabledAuth, hasPermission, initBpmFormData} = usePermission(); + +export const columns: BasicColumn[] = [ + { + title: '订单号', + dataIndex: 'orderCode', + width: 260, + }, + { + title: '订单类型', + dataIndex: 'ctype', + slots: { customRender: 'ctype' }, + }, + { + title: '订单日期', + dataIndex: 'orderDate', + width: 300, + }, + { + title: '订单金额', + width: 200, + dataIndex: 'orderMoney', + }, + { + title: '订单备注', + width: 200, + dataIndex: 'content', + }, + { + title: '流程状态', + width: 200, + dataIndex: 'bpmStatus', + customRender: ({ text }) => { + if (!text || text == '1') { + return '待提交'; + } else if (text == '2') { + return '处理中'; + } else if (text == '2') { + return '已完成'; + } else { + return text; + } + }, + }, +]; + +export function getBpmFormSchema(formData) { + //注入流程节点表单权限 + initBpmFormData(formData); + + const formSchema2: FormSchema[] = [ + { + label: '订单号', + field: 'orderCode', + component: 'Input', + show: ({ values }) => { + return hasPermission('order:orderCode'); + }, + }, + { + label: '订单类型', + field: 'ctype', + component: 'Select', + componentProps: { + options: [ + { label: '国内订单', value: '1', key: '1' }, + { label: '国际订单', value: '2', key: '2' }, + ], + }, + }, + { + label: '订单日期', + field: 'orderDate', + component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD HH:mm:ss', + style: { + width: '100%', + }, + }, + }, + { + label: '订单金额', + field: 'orderMoney', + component: 'Input', + }, + { + label: '订单备注', + field: 'content', + component: 'Input', + }, + ]; + return formSchema2; +} + +export function getOrderCustomerFormSchema(formData) { + //注入流程节点表单权限 + initBpmFormData(formData); + + const formSchema2: FormSchema[] = [ + { + label: '客户名', + field: 'name', + component: 'Input', + dynamicDisabled: ({ values }) => { + return isDisabledAuth('order:name'); + }, + }, + { + label: '性别', + field: 'sex', + component: 'Select', + componentProps: { + options: [ + { label: '男', value: '1', key: '1' }, + { label: '女', value: '2', key: '2' }, + ], + }, + }, + { + label: '身份证号', + field: 'idcard', + component: 'Input', + }, + { + label: '手机号', + field: 'telphone', + component: 'Input', + }, + ]; + return formSchema2; +} + +export const jeecgOrderTicketColumns: JVxeColumn[] = [ + { + title: '航班号', + key: 'ticketCode', + width: 180, + type: JVxeTypes.input, + placeholder: '请输入${title}', + defaultValue: '', + }, + { + title: '航班时间', + key: 'tickectDate', + width: 180, + type: JVxeTypes.date, + placeholder: '请选择${title}', + defaultValue: '', + }, +]; diff --git a/src/views/demo/vextable/drawer.vue b/src/views/demo/vextable/drawer.vue new file mode 100644 index 0000000..7f94b04 --- /dev/null +++ b/src/views/demo/vextable/drawer.vue @@ -0,0 +1,38 @@ + + diff --git a/src/views/demo/vextable/form/JeecgOrderCustomerForm.vue b/src/views/demo/vextable/form/JeecgOrderCustomerForm.vue new file mode 100644 index 0000000..3e456e5 --- /dev/null +++ b/src/views/demo/vextable/form/JeecgOrderCustomerForm.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/views/demo/vextable/form/JeecgOrderMainForm.vue b/src/views/demo/vextable/form/JeecgOrderMainForm.vue new file mode 100644 index 0000000..4a8fcc1 --- /dev/null +++ b/src/views/demo/vextable/form/JeecgOrderMainForm.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/src/views/demo/vextable/index.vue b/src/views/demo/vextable/index.vue new file mode 100644 index 0000000..efe0f7d --- /dev/null +++ b/src/views/demo/vextable/index.vue @@ -0,0 +1,144 @@ + + diff --git a/src/views/demo/vextable/index2.vue b/src/views/demo/vextable/index2.vue new file mode 100644 index 0000000..01a00ad --- /dev/null +++ b/src/views/demo/vextable/index2.vue @@ -0,0 +1,39 @@ + + + + diff --git a/src/views/demo/vextable/jvxetable/JVxeTableModal.vue b/src/views/demo/vextable/jvxetable/JVxeTableModal.vue new file mode 100644 index 0000000..f1083d3 --- /dev/null +++ b/src/views/demo/vextable/jvxetable/JVxeTableModal.vue @@ -0,0 +1,193 @@ + + + diff --git a/src/views/demo/vextable/jvxetable/jvxetable.api.ts b/src/views/demo/vextable/jvxetable/jvxetable.api.ts new file mode 100644 index 0000000..b00fb60 --- /dev/null +++ b/src/views/demo/vextable/jvxetable/jvxetable.api.ts @@ -0,0 +1,17 @@ +import { defHttp } from '/@/utils/http/axios'; +enum Api { + save = '/test/jeecgOrderMain/add', + edit = '/test/jeecgOrderMain/edit', + orderCustomerList = '/test/jeecgOrderMain/queryOrderCustomerListByMainId', + orderTicketList = '/test/jeecgOrderMain/queryOrderTicketListByMainId', +} +export const orderCustomerList = Api.orderCustomerList; +export const orderTicketList = Api.orderTicketList; +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, params }); +}; diff --git a/src/views/demo/vextable/jvxetable/jvxetable.data.ts b/src/views/demo/vextable/jvxetable/jvxetable.data.ts new file mode 100644 index 0000000..193fa31 --- /dev/null +++ b/src/views/demo/vextable/jvxetable/jvxetable.data.ts @@ -0,0 +1,73 @@ +import { JVxeTypes, JVxeColumn } from '/@/components/jeecg/JVxeTable/types'; + +export const columns: JVxeColumn[] = [ + { + title: '客户名', + key: 'name', + width: 180, + type: JVxeTypes.input, + defaultValue: '', + placeholder: '请输入${title}', + validateRules: [{ required: true, message: '${title}不能为空' }], + }, + { + title: '性别', + key: 'sex', + width: 180, + type: JVxeTypes.select, + options: [ + // 下拉选项 + { title: '男', value: '1' }, + { title: '女', value: '2' }, + ], + defaultValue: '', + placeholder: '请选择${title}', + }, + { + title: '身份证号', + key: 'idcard', + width: 180, + type: JVxeTypes.input, + defaultValue: '', + placeholder: '请输入${title}', + validateRules: [ + { + pattern: '^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[012])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|[xX])$', + message: '${title}格式不正确', + }, + ], + }, + { + title: '手机号', + key: 'telphone', + width: 180, + type: JVxeTypes.input, + defaultValue: '', + placeholder: '请输入${title}', + validateRules: [ + { + pattern: '^1[3456789]\\d{9}$', + message: '${title}格式不正确', + }, + ], + }, +]; +export const columns1: JVxeColumn[] = [ + { + title: '航班号', + key: 'ticketCode', + width: 180, + type: JVxeTypes.input, + defaultValue: '', + placeholder: '请输入${title}', + validateRules: [{ required: true, message: '${title}不能为空' }], + }, + { + title: '航班时间', + key: 'tickectDate', + width: 180, + type: JVxeTypes.date, + placeholder: '请选择${title}', + defaultValue: '', + }, +]; diff --git a/src/views/demo/vextable/modal.vue b/src/views/demo/vextable/modal.vue new file mode 100644 index 0000000..efd4ac7 --- /dev/null +++ b/src/views/demo/vextable/modal.vue @@ -0,0 +1,268 @@ + + + diff --git a/src/views/monitor/datalog/DataLogCompareModal.vue b/src/views/monitor/datalog/DataLogCompareModal.vue new file mode 100644 index 0000000..2911c92 --- /dev/null +++ b/src/views/monitor/datalog/DataLogCompareModal.vue @@ -0,0 +1,220 @@ + + + + diff --git a/src/views/monitor/datalog/DataLogModal.vue b/src/views/monitor/datalog/DataLogModal.vue new file mode 100644 index 0000000..743e8e6 --- /dev/null +++ b/src/views/monitor/datalog/DataLogModal.vue @@ -0,0 +1,111 @@ + + + + diff --git a/src/views/monitor/datalog/datalog.api.ts b/src/views/monitor/datalog/datalog.api.ts new file mode 100644 index 0000000..a50f12b --- /dev/null +++ b/src/views/monitor/datalog/datalog.api.ts @@ -0,0 +1,31 @@ +import { defHttp } from '/@/utils/http/axios'; + +enum Api { + list = '/sys/dataLog/list', + queryDataVerList = '/sys/dataLog/queryDataVerList', + queryCompareList = '/sys/dataLog/queryCompareList', +} + +/** + * 查询数据日志列表 + * @param params + */ +export const getDataLogList = (params) => { + return defHttp.get({ url: Api.list, params }); +}; + +/** + * 查询数据日志列表 + * @param params + */ +export const queryDataVerList = (params) => { + return defHttp.get({ url: Api.queryDataVerList, params }); +}; + +/** + * 查询对比数据 + * @param params + */ +export const queryCompareList = (params) => { + return defHttp.get({ url: Api.queryCompareList, params }); +}; diff --git a/src/views/monitor/datalog/datalog.data.ts b/src/views/monitor/datalog/datalog.data.ts new file mode 100644 index 0000000..07de096 --- /dev/null +++ b/src/views/monitor/datalog/datalog.data.ts @@ -0,0 +1,45 @@ +import { BasicColumn, FormSchema } from '/@/components/Table'; + +export const columns: BasicColumn[] = [ + { + title: '表名', + dataIndex: 'dataTable', + width: 150, + align: 'left', + }, + { + title: '数据ID', + dataIndex: 'dataId', + width: 350, + }, + { + title: '版本号', + dataIndex: 'dataVersion', + width: 100, + }, + { + title: '数据内容', + dataIndex: 'dataContent', + }, + { + title: '创建人', + dataIndex: 'createBy', + sorter: true, + width: 200, + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'dataTable', + label: '表名', + component: 'Input', + colProps: { span: 8 }, + }, + { + field: 'dataId', + label: '数据ID', + component: 'Input', + colProps: { span: 8 }, + }, +]; diff --git a/src/views/monitor/datalog/index.vue b/src/views/monitor/datalog/index.vue new file mode 100644 index 0000000..77bd99f --- /dev/null +++ b/src/views/monitor/datalog/index.vue @@ -0,0 +1,57 @@ + + diff --git a/src/views/monitor/datasource/DataSourceModal.vue b/src/views/monitor/datasource/DataSourceModal.vue new file mode 100644 index 0000000..e45d9d1 --- /dev/null +++ b/src/views/monitor/datasource/DataSourceModal.vue @@ -0,0 +1,87 @@ + + diff --git a/src/views/monitor/datasource/datasource.api.ts b/src/views/monitor/datasource/datasource.api.ts new file mode 100644 index 0000000..3aa0580 --- /dev/null +++ b/src/views/monitor/datasource/datasource.api.ts @@ -0,0 +1,83 @@ +import { defHttp } from '/@/utils/http/axios'; +import { Modal } from 'ant-design-vue'; + +enum Api { + list = '/sys/dataSource/list', + save = '/sys/dataSource/add', + edit = '/sys/dataSource/edit', + get = '/sys/dataSource/queryById', + delete = '/sys/dataSource/delete', + testConnection = '/online/cgreport/api/testConnection', + deleteBatch = '/sys/dataSource/deleteBatch', + exportXlsUrl = 'sys/dataSource/exportXls', + importExcelUrl = 'sys/dataSource/importExcel', +} +/** + * 导出api + */ +export const getExportUrl = Api.exportXlsUrl; +/** + * 导入api + */ +export const getImportUrl = Api.importExcelUrl; + +/** + * 查询数据源列表 + * @param params + */ +export const getDataSourceList = (params) => { + return defHttp.get({ url: Api.list, params }); +}; + +/** + * 保存或者更新数据源 + * @param params + */ +export const saveOrUpdateDataSource = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, params }); +}; + +/** + * 查询数据源详情 + * @param params + */ +export const getDataSourceById = (params) => { + return defHttp.get({ url: Api.get, params }); +}; + +/** + * 删除数据源 + * @param params + */ +export const deleteDataSource = (params, handleSuccess) => { + return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; + +/** + * 测试连接 + * @param params + */ +export const testConnection = (params) => { + return defHttp.post({ url: Api.testConnection, params }); +}; + +/** + * 批量删除数据源 + * @param params + */ +export const batchDeleteDataSource = (params, handleSuccess) => { + Modal.confirm({ + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + }, + }); +}; diff --git a/src/views/monitor/datasource/datasource.data.ts b/src/views/monitor/datasource/datasource.data.ts new file mode 100644 index 0000000..de403f8 --- /dev/null +++ b/src/views/monitor/datasource/datasource.data.ts @@ -0,0 +1,185 @@ +import { BasicColumn, FormSchema } from '/@/components/Table'; + +const dbDriverMap = { + // MySQL 数据库 + '1': { dbDriver: 'com.mysql.jdbc.Driver' }, + //MySQL5.7+ 数据库 + '4': { dbDriver: 'com.mysql.cj.jdbc.Driver' }, + // Oracle + '2': { dbDriver: 'oracle.jdbc.OracleDriver' }, + // SQLServer 数据库 + '3': { dbDriver: 'com.microsoft.sqlserver.jdbc.SQLServerDriver' }, + // marialDB 数据库 + '5': { dbDriver: 'org.mariadb.jdbc.Driver' }, + // postgresql 数据库 + '6': { dbDriver: 'org.postgresql.Driver' }, + // 达梦 数据库 + '7': { dbDriver: 'dm.jdbc.driver.DmDriver' }, + // 人大金仓 数据库 + '8': { dbDriver: 'com.kingbase8.Driver' }, + // 神通 数据库 + '9': { dbDriver: 'com.oscar.Driver' }, + // SQLite 数据库 + '10': { dbDriver: 'org.sqlite.JDBC' }, + // DB2 数据库 + '11': { dbDriver: 'com.ibm.db2.jcc.DB2Driver' }, + // Hsqldb 数据库 + '12': { dbDriver: 'org.hsqldb.jdbc.JDBCDriver' }, + // Derby 数据库 + '13': { dbDriver: 'org.apache.derby.jdbc.ClientDriver' }, + // H2 数据库 + '14': { dbDriver: 'org.h2.Driver' }, + // 其他数据库 + '15': { dbDriver: '' }, +}; +const dbUrlMap = { + // MySQL 数据库 + '1': { dbUrl: 'jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false' }, + //MySQL5.7+ 数据库 + '4': { + dbUrl: + 'jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai', + }, + // Oracle + '2': { dbUrl: 'jdbc:oracle:thin:@127.0.0.1:1521:ORCL' }, + // SQLServer 数据库 + '3': { dbUrl: 'jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=jeecgboot' }, + // Mariadb 数据库 + '5': { dbUrl: 'jdbc:mariadb://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useSSL=false' }, + // Postgresql 数据库 + '6': { dbUrl: 'jdbc:postgresql://127.0.0.1:5432/jeecg-boot' }, + // 达梦 数据库 + '7': { dbUrl: 'jdbc:dm://127.0.0.1:5236/?jeecg-boot&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8' }, + // 人大金仓 数据库 + '8': { dbUrl: 'jdbc:kingbase8://127.0.0.1:54321/jeecg-boot' }, + // 神通 数据库 + '9': { dbUrl: 'jdbc:oscar://192.168.1.125:2003/jeecg-boot' }, + // SQLite 数据库 + '10': { dbUrl: 'jdbc:sqlite://opt/test.db' }, + // DB2 数据库 + '11': { dbUrl: 'jdbc:db2://127.0.0.1:50000/jeecg-boot' }, + // Hsqldb 数据库 + '12': { dbUrl: 'jdbc:hsqldb:hsql://127.0.0.1/jeecg-boot' }, + // Derby 数据库 + '13': { dbUrl: 'jdbc:derby://127.0.0.1:1527/jeecg-boot' }, + // H2 数据库 + '14': { dbUrl: 'jdbc:h2:tcp://127.0.0.1:8082/jeecg-boot' }, + // 其他数据库 + '15': { dbUrl: '' }, +}; + +export const columns: BasicColumn[] = [ + { + title: '数据源名称', + dataIndex: 'name', + width: 200, + align: 'left', + }, + { + title: '数据库类型', + dataIndex: 'dbType_dictText', + width: 200, + }, + { + title: '驱动类', + dataIndex: 'dbDriver', + width: 200, + }, + { + title: '数据源地址', + dataIndex: 'dbUrl', + }, + { + title: '用户名', + dataIndex: 'dbUsername', + width: 200, + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'name', + label: '数据源名称', + component: 'Input', + colProps: { span: 8 }, + }, + { + field: 'dbType', + label: '数据库类型', + component: 'JDictSelectTag', + colProps: { span: 8 }, + componentProps: () => { + return { + dictCode: 'database_type', + }; + }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + field: 'id', + label: 'id', + component: 'Input', + show: false, + }, + { + field: 'code', + label: '数据源编码', + component: 'Input', + required: true, + dynamicDisabled: ({ values }) => { + return !!values.id; + }, + }, + { + field: 'name', + label: '数据源名称', + component: 'Input', + required: true, + }, + { + field: 'dbType', + label: '数据库类型', + component: 'JDictSelectTag', + required: true, + componentProps: ({ formModel }) => { + return { + dictCode: 'database_type', + onChange: (e: any) => { + formModel = Object.assign(formModel, dbDriverMap[e], dbUrlMap[e]); + }, + }; + }, + }, + { + field: 'dbDriver', + label: '驱动类', + required: true, + component: 'Input', + }, + { + field: 'dbUrl', + label: '数据源地址', + required: true, + component: 'Input', + }, + { + field: 'dbUsername', + label: '用户名', + required: true, + component: 'Input', + }, + { + field: 'dbPassword', + label: '密码', + required: true, + component: 'InputPassword', + slot: 'pwd', + }, + { + field: 'remark', + label: '备注', + component: 'InputTextArea', + }, +]; diff --git a/src/views/monitor/datasource/index.vue b/src/views/monitor/datasource/index.vue new file mode 100644 index 0000000..f12f5af --- /dev/null +++ b/src/views/monitor/datasource/index.vue @@ -0,0 +1,118 @@ + + diff --git a/src/views/monitor/disk/DiskInfo.vue b/src/views/monitor/disk/DiskInfo.vue new file mode 100644 index 0000000..7154678 --- /dev/null +++ b/src/views/monitor/disk/DiskInfo.vue @@ -0,0 +1,37 @@ + + diff --git a/src/views/monitor/disk/disk.api.ts b/src/views/monitor/disk/disk.api.ts new file mode 100644 index 0000000..ce01231 --- /dev/null +++ b/src/views/monitor/disk/disk.api.ts @@ -0,0 +1,12 @@ +import { defHttp } from '/@/utils/http/axios'; + +enum Api { + queryDiskInfo = '/sys/actuator/redis/queryDiskInfo', +} + +/** + * 详细信息 + */ +export const queryDiskInfo = () => { + return defHttp.get({ url: Api.queryDiskInfo }, { successMessageMode: 'none' }); +}; diff --git a/src/views/monitor/disk/gauge.vue b/src/views/monitor/disk/gauge.vue new file mode 100644 index 0000000..89224cf --- /dev/null +++ b/src/views/monitor/disk/gauge.vue @@ -0,0 +1,82 @@ + + diff --git a/src/views/monitor/log/index.vue b/src/views/monitor/log/index.vue new file mode 100644 index 0000000..1c07137 --- /dev/null +++ b/src/views/monitor/log/index.vue @@ -0,0 +1,74 @@ + + diff --git a/src/views/monitor/log/log.api.ts b/src/views/monitor/log/log.api.ts new file mode 100644 index 0000000..9676b58 --- /dev/null +++ b/src/views/monitor/log/log.api.ts @@ -0,0 +1,13 @@ +import { defHttp } from '/@/utils/http/axios'; + +enum Api { + list = '/sys/log/list', +} + +/** + * 查询日志列表 + * @param params + */ +export const getLogList = (params) => { + return defHttp.get({ url: Api.list, params }); +}; diff --git a/src/views/monitor/log/log.data.ts b/src/views/monitor/log/log.data.ts new file mode 100644 index 0000000..6659322 --- /dev/null +++ b/src/views/monitor/log/log.data.ts @@ -0,0 +1,73 @@ +import { BasicColumn, FormSchema } from '/@/components/Table'; + +export const columns: BasicColumn[] = [ + { + title: '日志内容', + dataIndex: 'logContent', + width: 100, + align: 'left', + }, + { + title: '操作人ID', + dataIndex: 'userid', + width: 80, + }, + { + title: '操作人', + dataIndex: 'username', + width: 80, + }, + { + title: 'IP', + dataIndex: 'ip', + width: 80, + }, + { + title: '耗时(毫秒)', + dataIndex: 'costTime', + width: 80, + }, + { + title: '创建时间', + dataIndex: 'createTime', + sorter: true, + width: 80, + }, + { + title: '日志类型', + dataIndex: 'logType_dictText', + width: 60, + }, +]; + +/** + * 操作日志需要操作类型 + */ +export const operationLogColumn: BasicColumn[] = [ + ...columns, + { + title: '操作类型', + dataIndex: 'operateType_dictText', + width: 40, + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'keyWord', + label: '搜索日志', + component: 'Input', + colProps: { span: 8 }, + }, + { + field: 'fieldTime', + component: 'RangePicker', + label: '创建时间', + componentProps: { + valueType: 'Date', + }, + colProps: { + span: 8, + }, + }, +]; diff --git a/src/views/monitor/mynews/DetailModal.vue b/src/views/monitor/mynews/DetailModal.vue new file mode 100644 index 0000000..467e9f9 --- /dev/null +++ b/src/views/monitor/mynews/DetailModal.vue @@ -0,0 +1,89 @@ + + + + diff --git a/src/views/monitor/mynews/DynamicNotice.vue b/src/views/monitor/mynews/DynamicNotice.vue new file mode 100644 index 0000000..7ff8c4e --- /dev/null +++ b/src/views/monitor/mynews/DynamicNotice.vue @@ -0,0 +1,35 @@ + + diff --git a/src/views/monitor/mynews/index.vue b/src/views/monitor/mynews/index.vue new file mode 100644 index 0000000..ae2a5fe --- /dev/null +++ b/src/views/monitor/mynews/index.vue @@ -0,0 +1,131 @@ + + diff --git a/src/views/monitor/mynews/mynews.api.ts b/src/views/monitor/mynews/mynews.api.ts new file mode 100644 index 0000000..c9c7724 --- /dev/null +++ b/src/views/monitor/mynews/mynews.api.ts @@ -0,0 +1,61 @@ +import { defHttp } from '/@/utils/http/axios'; +import { Modal } from 'ant-design-vue'; + +enum Api { + list = '/sys/sysAnnouncementSend/getMyAnnouncementSend', + editCementSend = '/sys/sysAnnouncementSend/editByAnntIdAndUserId', + readAllMsg = '/sys/sysAnnouncementSend/readAll', + syncNotic = '/sys/annountCement/syncNotic', + getOne = '/sys/sysAnnouncementSend/getOne', +} + +/** + * 查询消息列表 + * @param params + */ +export const getMyNewsList = (params) => { + return defHttp.get({ url: Api.list, params }); +}; + +/** + * 更新用户系统消息阅读状态 + * @param params + */ +export const editCementSend = (params) => { + return defHttp.put({ url: Api.editCementSend, params }); +}; + +/** + * 一键已读 + * @param params + */ +export const readAllMsg = (params, handleSuccess) => { + Modal.confirm({ + title: '确认操作', + content: '是否全部标注已读?', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.put({ url: Api.readAllMsg, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + }, + }); +}; + +/** + * 同步消息 + * @param params + */ +export const syncNotic = (params) => { + return defHttp.get({ url: Api.syncNotic, params }); +}; + +/** + * 根据消息发送记录ID获取消息内容 + * @param sendId + */ +export const getOne = (sendId) => { + return defHttp.get({ url: Api.getOne, params:{sendId} }); +}; + diff --git a/src/views/monitor/mynews/mynews.data.ts b/src/views/monitor/mynews/mynews.data.ts new file mode 100644 index 0000000..540cee0 --- /dev/null +++ b/src/views/monitor/mynews/mynews.data.ts @@ -0,0 +1,75 @@ +import { BasicColumn, FormSchema } from '/@/components/Table'; +import { render } from '/@/utils/common/renderUtils'; + +export const columns: BasicColumn[] = [ + { + title: '标题', + dataIndex: 'titile', + width: 100, + align: 'left', + }, + { + title: '消息类型', + dataIndex: 'msgCategory', + width: 80, + customRender: ({ text }) => { + return render.renderDictNative( + text, + [ + { label: '通知公告', value: '1', color: 'blue' }, + { label: '系统消息', value: '2' }, + ], + true + ); + }, + }, + { + title: '发布人', + dataIndex: 'sender', + width: 80, + }, + { + title: '发布时间', + dataIndex: 'sendTime', + width: 80, + }, + { + title: '优先级', + dataIndex: 'priority', + width: 80, + customRender: ({ text }) => { + const color = text == 'L' ? 'blue' : text == 'M' ? 'yellow' : 'red'; + return render.renderTag(render.renderDict(text, 'priority'), color); + }, + }, + { + title: '阅读状态', + dataIndex: 'readFlag', + width: 80, + customRender: ({ text }) => { + return render.renderDictNative( + text, + [ + { label: '未读', value: '0', color: 'red' }, + { label: '已读', value: '1' }, + ], + true + ); + }, + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'titile', + label: '标题', + component: 'Input', + colProps: { span: 8 }, + }, + { + field: 'sender', + label: '发布人', + component: 'Input', + colProps: { span: 8 }, + }, +]; diff --git a/src/views/monitor/quartz/QuartzModal.vue b/src/views/monitor/quartz/QuartzModal.vue new file mode 100644 index 0000000..285dc22 --- /dev/null +++ b/src/views/monitor/quartz/QuartzModal.vue @@ -0,0 +1,59 @@ + + diff --git a/src/views/monitor/quartz/index.vue b/src/views/monitor/quartz/index.vue new file mode 100644 index 0000000..dcfcc30 --- /dev/null +++ b/src/views/monitor/quartz/index.vue @@ -0,0 +1,177 @@ + + diff --git a/src/views/monitor/quartz/quartz.api.ts b/src/views/monitor/quartz/quartz.api.ts new file mode 100644 index 0000000..1b89b27 --- /dev/null +++ b/src/views/monitor/quartz/quartz.api.ts @@ -0,0 +1,107 @@ +import { defHttp } from '/@/utils/http/axios'; +import { Modal } from 'ant-design-vue'; + +enum Api { + list = '/sys/quartzJob/list', + save = '/sys/quartzJob/add', + edit = '/sys/quartzJob/edit', + get = '/sys/quartzJob/queryById', + pause = '/sys/quartzJob/pause', + resume = '/sys/quartzJob/resume', + delete = '/sys/quartzJob/delete', + exportXlsUrl = '/sys/quartzJob/exportXls', + importExcelUrl = '/sys/quartzJob/importExcel', + execute = '/sys/quartzJob/execute', + deleteBatch = '/sys/quartzJob/deleteBatch', +} + +/** + * 导出api + */ +export const getExportUrl = Api.exportXlsUrl; +/** + * 导入api + */ +export const getImportUrl = Api.importExcelUrl; +/** + * 查询任务列表 + * @param params + */ +export const getQuartzList = (params) => { + return defHttp.get({ url: Api.list, params }); +}; + +/** + * 保存或者更新任务 + * @param params + */ +export const saveOrUpdateQuartz = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, params }); +}; + +/** + * 查询任务详情 + * @param params + */ +export const getQuartzById = (params) => { + return defHttp.get({ url: Api.get, params }); +}; + +/** + * 删除任务 + * @param params + */ +export const deleteQuartz = (params, handleSuccess) => { + return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; + +/** + * 启动 + * @param params + */ +export const resumeJob = (params, handleSuccess) => { + return defHttp.get({ url: Api.resume, params }).then(() => { + handleSuccess(); + }); +}; + +/** + * 暂停 + * @param params + */ +export const pauseJob = (params, handleSuccess) => { + return defHttp.get({ url: Api.pause, params }).then(() => { + handleSuccess(); + }); +}; + +/** + * 立即执行 + * @param params + */ +export const executeImmediately = (params, handleSuccess) => { + return defHttp.get({ url: Api.execute, params }).then(() => { + handleSuccess(); + }); +}; + +/** + * 批量删除任务 + * @param params + */ +export const batchDeleteQuartz = (params, handleSuccess) => { + Modal.confirm({ + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + }, + }); +}; diff --git a/src/views/monitor/quartz/quartz.data.ts b/src/views/monitor/quartz/quartz.data.ts new file mode 100644 index 0000000..10d94f7 --- /dev/null +++ b/src/views/monitor/quartz/quartz.data.ts @@ -0,0 +1,124 @@ +import { BasicColumn, FormSchema } from '/@/components/Table'; +import { render } from '/@/utils/common/renderUtils'; +import { JCronValidator } from '/@/components/Form'; + +export const columns: BasicColumn[] = [ + { + title: '任务类名', + dataIndex: 'jobClassName', + width: 200, + align: 'left', + }, + { + title: 'Cron表达式', + dataIndex: 'cronExpression', + width: 200, + }, + { + title: '参数', + dataIndex: 'parameter', + width: 200, + }, + { + title: '描述', + dataIndex: 'description', + width: 200, + }, + { + title: '状态', + dataIndex: 'status', + width: 100, + customRender: ({ text }) => { + const color = text == '0' ? 'green' : text == '-1' ? 'red' : 'gray'; + return render.renderTag(render.renderDict(text, 'quartz_status'), color); + }, + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'jobClassName', + label: '任务类名', + component: 'Input', + colProps: { span: 8 }, + }, + { + field: 'status', + label: '任务状态', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'quartz_status', + stringToNumber: true, + }, + colProps: { span: 8 }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + field: 'id', + label: 'id', + component: 'Input', + show: false, + }, + { + field: 'jobClassName', + label: '任务类名', + component: 'Input', + required: true, + }, + { + field: 'cronExpression', + label: 'Cron表达式', + component: 'JEasyCron', + defaultValue: '* * * * * ? *', + rules: [{ required: true, message: '请输入Cron表达式' }, { validator: JCronValidator }], + }, + { + field: 'paramterType', + label: '参数类型', + component: 'Select', + defaultValue: 'string', + componentProps: { + options: [ + { label: '字符串', value: 'string' }, + { label: 'JSON对象', value: 'json' }, + ], + }, + }, + { + field: 'parameter', + label: '参数', + component: 'InputTextArea', + ifShow: ({ values }) => { + return values.paramterType == 'string'; + }, + }, + { + field: 'parameter', + label: '参数', + component: 'JAddInput', + helpMessage: '键值对形式填写', + ifShow: ({ values }) => { + return values.paramterType == 'json'; + }, + }, + { + field: 'status', + label: '状态', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'quartz_status', + type: 'radioButton', + stringToNumber: true, + dropdownStyle: { + maxHeight: '6vh', + }, + }, + }, + { + field: 'description', + label: '描述', + component: 'InputTextArea', + }, +]; diff --git a/src/views/monitor/redis/index.vue b/src/views/monitor/redis/index.vue new file mode 100644 index 0000000..9b9da3c --- /dev/null +++ b/src/views/monitor/redis/index.vue @@ -0,0 +1,189 @@ + + diff --git a/src/views/monitor/redis/redis.api.ts b/src/views/monitor/redis/redis.api.ts new file mode 100644 index 0000000..09734f3 --- /dev/null +++ b/src/views/monitor/redis/redis.api.ts @@ -0,0 +1,32 @@ +import { defHttp } from '/@/utils/http/axios'; + +enum Api { + keysSize = '/sys/actuator/redis/keysSize', + memoryInfo = '/sys/actuator/redis/memoryInfo', + info = '/sys/actuator/redis/info', +} + +/** + * key个数 + */ +export const getKeysSize = () => { + return defHttp.get({ url: Api.keysSize }, { isTransformResponse: false }); +}; + +/** + * 内存信息 + */ +export const getMemoryInfo = () => { + return defHttp.get({ url: Api.memoryInfo }, { isTransformResponse: false }); +}; + +/** + * 详细信息 + */ +export const getInfo = () => { + return defHttp.get({ url: Api.info }); +}; + +export const getRedisInfo = () => { + return Promise.all([getKeysSize(), getMemoryInfo()]); +}; diff --git a/src/views/monitor/redis/redis.data.ts b/src/views/monitor/redis/redis.data.ts new file mode 100644 index 0000000..d370f94 --- /dev/null +++ b/src/views/monitor/redis/redis.data.ts @@ -0,0 +1,19 @@ +import { BasicColumn } from '/@/components/Table'; + +export const columns: BasicColumn[] = [ + { + title: 'Key', + dataIndex: 'key', + width: 100, + }, + { + title: 'Description', + dataIndex: 'description', + width: 80, + }, + { + title: 'Value', + dataIndex: 'value', + width: 80, + }, +]; diff --git a/src/views/monitor/route/RouteModal.vue b/src/views/monitor/route/RouteModal.vue new file mode 100644 index 0000000..ba540ea --- /dev/null +++ b/src/views/monitor/route/RouteModal.vue @@ -0,0 +1,420 @@ + + diff --git a/src/views/monitor/route/index.vue b/src/views/monitor/route/index.vue new file mode 100644 index 0000000..7e96e83 --- /dev/null +++ b/src/views/monitor/route/index.vue @@ -0,0 +1,104 @@ + + diff --git a/src/views/monitor/route/route.api.ts b/src/views/monitor/route/route.api.ts new file mode 100644 index 0000000..d78e40a --- /dev/null +++ b/src/views/monitor/route/route.api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '/@/utils/http/axios'; + +enum Api { + list = '/sys/gatewayRoute/list', + save = '/sys/gatewayRoute/add', + edit = '/sys/gatewayRoute/updateAll', + delete = '/sys/gatewayRoute/delete', +} + +/** + * 查询路由列表 + * @param params + */ +export const getRouteList = (params) => { + return defHttp.get({ url: Api.list, params }); +}; + +/** + * 保存或者更新路由 + * @param params + */ +export const saveOrUpdateRoute = (params) => { + return defHttp.post({ url: Api.edit, params }); +}; + +/** + * 删除路由 + * @param params + */ +export const deleteRoute = (params, handleSuccess) => { + return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; diff --git a/src/views/monitor/route/route.data.ts b/src/views/monitor/route/route.data.ts new file mode 100644 index 0000000..9749f5b --- /dev/null +++ b/src/views/monitor/route/route.data.ts @@ -0,0 +1,52 @@ +import { BasicColumn, FormSchema } from '/@/components/Table'; + +export const columns: BasicColumn[] = [ + { + title: '路由ID', + dataIndex: 'routerId', + width: 200, + align: 'left', + }, + { + title: '路由名称', + dataIndex: 'name', + width: 200, + }, + { + title: '路由URI', + dataIndex: 'uri', + width: 200, + }, + { + title: '状态', + dataIndex: 'status', + slots: { customRender: 'status' }, + width: 200, + }, +]; + +export const formSchema: FormSchema[] = [ + { + field: 'name', + label: '路由ID', + component: 'Input', + required: true, + }, + { + field: 'name', + label: '路由名称', + component: 'InputNumber', + required: true, + }, + { + field: 'uri', + label: '路由URI', + component: 'Input', + }, + { + field: 'predicates', + label: '路由条件', + slot: 'predicates', + component: 'Input', + }, +]; diff --git a/src/views/monitor/server/index.vue b/src/views/monitor/server/index.vue new file mode 100644 index 0000000..7e0138e --- /dev/null +++ b/src/views/monitor/server/index.vue @@ -0,0 +1,107 @@ + + diff --git a/src/views/monitor/server/server.api.ts b/src/views/monitor/server/server.api.ts new file mode 100644 index 0000000..ff1776b --- /dev/null +++ b/src/views/monitor/server/server.api.ts @@ -0,0 +1,309 @@ +import { defHttp } from '/@/utils/http/axios'; + +enum Api { + cpuCount = '/actuator/metrics/system.cpu.count', + cpuUsage = '/actuator/metrics/system.cpu.usage', + processStartTime = '/actuator/metrics/process.start.time', + processUptime = '/actuator/metrics/process.uptime', + processCpuUsage = '/actuator/metrics/process.cpu.usage', + + jvmMemoryMax = '/actuator/metrics/jvm.memory.max', + jvmMemoryCommitted = '/actuator/metrics/jvm.memory.committed', + jvmMemoryUsed = '/actuator/metrics/jvm.memory.used', + jvmBufferMemoryUsed = '/actuator/metrics/jvm.buffer.memory.used', + jvmBufferCount = '/actuator/metrics/jvm.buffer.count', + jvmThreadsDaemon = '/actuator/metrics/jvm.threads.daemon', + jvmThreadsLive = '/actuator/metrics/jvm.threads.live', + jvmThreadsPeak = '/actuator/metrics/jvm.threads.peak', + jvmClassesLoaded = '/actuator/metrics/jvm.classes.loaded', + jvmClassesUnloaded = '/actuator/metrics/jvm.classes.unloaded', + jvmGcMemoryAllocated = '/actuator/metrics/jvm.gc.memory.allocated', + jvmGcMemoryPromoted = '/actuator/metrics/jvm.gc.memory.promoted', + jvmGcMaxDataSize = '/actuator/metrics/jvm.gc.max.data.size', + jvmGcLiveDataSize = '/actuator/metrics/jvm.gc.live.data.size', + jvmGcPause = '/actuator/metrics/jvm.gc.pause', + + tomcatSessionsCreated = '/actuator/metrics/tomcat.sessions.created', + tomcatSessionsExpired = '/actuator/metrics/tomcat.sessions.expired', + tomcatSessionsActiveCurrent = '/actuator/metrics/tomcat.sessions.active.current', + tomcatSessionsActiveMax = '/actuator/metrics/tomcat.sessions.active.max', + tomcatSessionsRejected = '/actuator/metrics/tomcat.sessions.rejected', +} + +/** + * 查询cpu数量 + */ +export const getCpuCount = () => { + return defHttp.get({ url: Api.cpuCount }, { isTransformResponse: false }); +}; + +/** + * 查询系统 CPU 使用率 + */ +export const getCpuUsage = () => { + return defHttp.get({ url: Api.cpuUsage }, { isTransformResponse: false }); +}; + +/** + * 查询应用启动时间点 + */ +export const getProcessStartTime = () => { + return defHttp.get({ url: Api.processStartTime }, { isTransformResponse: false }); +}; + +/** + * 查询应用已运行时间 + */ +export const getProcessUptime = () => { + return defHttp.get({ url: Api.processUptime }, { isTransformResponse: false }); +}; + +/** + * 查询当前应用 CPU 使用率 + */ +export const getProcessCpuUsage = () => { + return defHttp.get({ url: Api.processCpuUsage }, { isTransformResponse: false }); +}; + +/** + * 查询JVM 最大内存 + */ +export const getJvmMemoryMax = () => { + return defHttp.get({ url: Api.jvmMemoryMax }, { isTransformResponse: false }); +}; + +/** + * JVM 可用内存 + */ +export const getJvmMemoryCommitted = () => { + return defHttp.get({ url: Api.jvmMemoryCommitted }, { isTransformResponse: false }); +}; + +/** + * JVM 已用内存 + */ +export const getJvmMemoryUsed = () => { + return defHttp.get({ url: Api.jvmMemoryUsed }, { isTransformResponse: false }); +}; + +/** + * JVM 缓冲区已用内存 + */ +export const getJvmBufferMemoryUsed = () => { + return defHttp.get({ url: Api.jvmBufferMemoryUsed }, { isTransformResponse: false }); +}; + +/** + *JVM 当前缓冲区数量 + */ +export const getJvmBufferCount = () => { + return defHttp.get({ url: Api.jvmBufferCount }, { isTransformResponse: false }); +}; + +/** + **JVM 守护线程数量 + */ +export const getJvmThreadsDaemon = () => { + return defHttp.get({ url: Api.jvmThreadsDaemon }, { isTransformResponse: false }); +}; + +/** + *JVM 当前活跃线程数量 + */ +export const getJvmThreadsLive = () => { + return defHttp.get({ url: Api.jvmThreadsLive }, { isTransformResponse: false }); +}; + +/** + *JVM 峰值线程数量 + */ +export const getJvmThreadsPeak = () => { + return defHttp.get({ url: Api.jvmThreadsPeak }, { isTransformResponse: false }); +}; + +/** + *JVM 已加载 Class 数量 + */ +export const getJvmClassesLoaded = () => { + return defHttp.get({ url: Api.jvmClassesLoaded }, { isTransformResponse: false }); +}; + +/** + *JVM 未加载 Class 数量 + */ +export const getJvmClassesUnloaded = () => { + return defHttp.get({ url: Api.jvmClassesUnloaded }, { isTransformResponse: false }); +}; + +/** + **GC 时, 年轻代分配的内存空间 + */ +export const getJvmGcMemoryAllocated = () => { + return defHttp.get({ url: Api.jvmGcMemoryAllocated }, { isTransformResponse: false }); +}; + +/** + *GC 时, 老年代分配的内存空间 + */ +export const getJvmGcMemoryPromoted = () => { + return defHttp.get({ url: Api.jvmGcMemoryPromoted }, { isTransformResponse: false }); +}; + +/** + *GC 时, 老年代的最大内存空间 + */ +export const getJvmGcMaxDataSize = () => { + return defHttp.get({ url: Api.jvmGcMaxDataSize }, { isTransformResponse: false }); +}; + +/** + *FullGC 时, 老年代的内存空间 + */ +export const getJvmGcLiveDataSize = () => { + return defHttp.get({ url: Api.jvmGcLiveDataSize }, { isTransformResponse: false }); +}; + +/** + *系统启动以来GC 次数 + */ +export const getJvmGcPause = () => { + return defHttp.get({ url: Api.jvmGcPause }, { isTransformResponse: false }); +}; + +/** + *tomcat 已创建 session 数 + */ +export const getTomcatSessionsCreated = () => { + return defHttp.get({ url: Api.tomcatSessionsCreated }, { isTransformResponse: false }); +}; + +/** + *tomcat 已过期 session 数 + */ +export const getTomcatSessionsExpired = () => { + return defHttp.get({ url: Api.tomcatSessionsExpired }, { isTransformResponse: false }); +}; + +/** + *tomcat 当前活跃 session 数 + */ +export const getTomcatSessionsActiveCurrent = () => { + return defHttp.get({ url: Api.tomcatSessionsActiveCurrent }, { isTransformResponse: false }); +}; + +/** + *tomcat 活跃 session 数峰值 + */ +export const getTomcatSessionsActiveMax = () => { + return defHttp.get({ url: Api.tomcatSessionsActiveMax }, { isTransformResponse: false }); +}; + +/** + *超过session 最大配置后,拒绝的 session 个数 + */ +export const getTomcatSessionsRejected = () => { + return defHttp.get({ url: Api.tomcatSessionsRejected }, { isTransformResponse: false }); +}; + +export const getMoreInfo = (infoType) => { + if (infoType == '1') { + return {}; + } + if (infoType == '2') { + return { 'jvm.gc.pause': ['.count', '.totalTime'] }; + } + if (infoType == '3') { + return { + 'tomcat.global.request': ['.count', '.totalTime'], + 'tomcat.servlet.request': ['.count', '.totalTime'], + }; + } +}; + +export const getTextInfo = (infoType) => { + if (infoType == '1') { + return { + 'system.cpu.count': { color: 'green', text: 'CPU 数量', unit: '核' }, + 'system.cpu.usage': { color: 'green', text: '系统 CPU 使用率', unit: '%', valueType: 'Number' }, + 'process.start.time': { color: 'purple', text: '应用启动时间点', unit: '', valueType: 'Date' }, + 'process.uptime': { color: 'purple', text: '应用已运行时间', unit: '秒' }, + 'process.cpu.usage': { color: 'purple', text: '当前应用 CPU 使用率', unit: '%', valueType: 'Number' }, + }; + } + if (infoType == '2') { + return { + 'jvm.memory.max': { color: 'purple', text: 'JVM 最大内存', unit: 'MB', valueType: 'RAM' }, + 'jvm.memory.committed': { color: 'purple', text: 'JVM 可用内存', unit: 'MB', valueType: 'RAM' }, + 'jvm.memory.used': { color: 'purple', text: 'JVM 已用内存', unit: 'MB', valueType: 'RAM' }, + 'jvm.buffer.memory.used': { color: 'cyan', text: 'JVM 缓冲区已用内存', unit: 'MB', valueType: 'RAM' }, + 'jvm.buffer.count': { color: 'cyan', text: '当前缓冲区数量', unit: '个' }, + 'jvm.threads.daemon': { color: 'green', text: 'JVM 守护线程数量', unit: '个' }, + 'jvm.threads.live': { color: 'green', text: 'JVM 当前活跃线程数量', unit: '个' }, + 'jvm.threads.peak': { color: 'green', text: 'JVM 峰值线程数量', unit: '个' }, + 'jvm.classes.loaded': { color: 'orange', text: 'JVM 已加载 Class 数量', unit: '个' }, + 'jvm.classes.unloaded': { color: 'orange', text: 'JVM 未加载 Class 数量', unit: '个' }, + 'jvm.gc.memory.allocated': { color: 'pink', text: 'GC 时, 年轻代分配的内存空间', unit: 'MB', valueType: 'RAM' }, + 'jvm.gc.memory.promoted': { color: 'pink', text: 'GC 时, 老年代分配的内存空间', unit: 'MB', valueType: 'RAM' }, + 'jvm.gc.max.data.size': { color: 'pink', text: 'GC 时, 老年代的最大内存空间', unit: 'MB', valueType: 'RAM' }, + 'jvm.gc.live.data.size': { color: 'pink', text: 'FullGC 时, 老年代的内存空间', unit: 'MB', valueType: 'RAM' }, + 'jvm.gc.pause.count': { color: 'blue', text: '系统启动以来GC 次数', unit: '次' }, + 'jvm.gc.pause.totalTime': { color: 'blue', text: '系统启动以来GC 总耗时', unit: '秒' }, + }; + } + if (infoType == '3') { + return { + 'tomcat.sessions.created': { color: 'green', text: 'tomcat 已创建 session 数', unit: '个' }, + 'tomcat.sessions.expired': { color: 'green', text: 'tomcat 已过期 session 数', unit: '个' }, + 'tomcat.sessions.active.current': { color: 'green', text: 'tomcat 当前活跃 session 数', unit: '个' }, + 'tomcat.sessions.active.max': { color: 'green', text: 'tomcat 活跃 session 数峰值', unit: '个' }, + 'tomcat.sessions.rejected': { color: 'green', text: '超过session 最大配置后,拒绝的 session 个数', unit: '个' }, + 'tomcat.global.sent': { color: 'purple', text: '发送的字节数', unit: 'bytes' }, + 'tomcat.global.request.max': { color: 'purple', text: 'request 请求最长耗时', unit: '秒' }, + 'tomcat.global.request.count': { color: 'purple', text: '全局 request 请求次数', unit: '次' }, + 'tomcat.global.request.totalTime': { color: 'purple', text: '全局 request 请求总耗时', unit: '秒' }, + 'tomcat.servlet.request.max': { color: 'cyan', text: 'servlet 请求最长耗时', unit: '秒' }, + 'tomcat.servlet.request.count': { color: 'cyan', text: 'servlet 总请求次数', unit: '次' }, + 'tomcat.servlet.request.totalTime': { color: 'cyan', text: 'servlet 请求总耗时', unit: '秒' }, + 'tomcat.threads.current': { color: 'pink', text: 'tomcat 当前线程数(包括守护线程)', unit: '个' }, + 'tomcat.threads.config.max': { color: 'pink', text: 'tomcat 配置的线程最大数', unit: '个' }, + }; + } +}; + +/** + * 查询cpu数量 + * @param params + */ +export const getServerInfo = (infoType) => { + if (infoType == '1') { + return Promise.all([getCpuCount(), getCpuUsage(), getProcessStartTime(), getProcessUptime(), getProcessCpuUsage()]); + } + if (infoType == '2') { + return Promise.all([ + getJvmMemoryMax(), + getJvmMemoryCommitted(), + getJvmMemoryUsed(), + getJvmBufferCount(), + getJvmBufferMemoryUsed(), + getJvmThreadsDaemon(), + getJvmThreadsLive(), + getJvmThreadsPeak(), + getJvmClassesLoaded(), + getJvmClassesUnloaded(), + getJvmGcLiveDataSize(), + getJvmGcMaxDataSize(), + getJvmGcMemoryAllocated(), + getJvmGcMemoryPromoted(), + getJvmGcPause(), + ]); + } + if (infoType == '3') { + return Promise.all([ + getTomcatSessionsActiveCurrent(), + getTomcatSessionsActiveMax(), + getTomcatSessionsCreated(), + getTomcatSessionsExpired(), + getTomcatSessionsRejected(), + ]); + } +}; diff --git a/src/views/monitor/server/server.data.ts b/src/views/monitor/server/server.data.ts new file mode 100644 index 0000000..8b9fa54 --- /dev/null +++ b/src/views/monitor/server/server.data.ts @@ -0,0 +1,23 @@ +import { BasicColumn } from '/@/components/Table'; + +export const columns: BasicColumn[] = [ + { + title: '参数', + dataIndex: 'param', + width: 80, + align: 'left', + slots: { customRender: 'param' }, + }, + { + title: '描述', + dataIndex: 'text', + slots: { customRender: 'text' }, + width: 80, + }, + { + title: '当前值', + dataIndex: 'value', + slots: { customRender: 'value' }, + width: 80, + }, +]; diff --git a/src/views/monitor/trace/index.vue b/src/views/monitor/trace/index.vue new file mode 100644 index 0000000..b79ca97 --- /dev/null +++ b/src/views/monitor/trace/index.vue @@ -0,0 +1,47 @@ + + diff --git a/src/views/monitor/trace/trace.api.ts b/src/views/monitor/trace/trace.api.ts new file mode 100644 index 0000000..f41b093 --- /dev/null +++ b/src/views/monitor/trace/trace.api.ts @@ -0,0 +1,12 @@ +import { defHttp } from '/@/utils/http/axios'; + +enum Api { + actuatorList = '/actuator/httptrace', +} + +/** + * 追踪信息 + */ +export const getActuatorList = () => { + return defHttp.get({ url: Api.actuatorList }, { isTransformResponse: false }); +}; diff --git a/src/views/monitor/trace/trace.data.ts b/src/views/monitor/trace/trace.data.ts new file mode 100644 index 0000000..3b4f0f1 --- /dev/null +++ b/src/views/monitor/trace/trace.data.ts @@ -0,0 +1,84 @@ +import { BasicColumn } from '/@/components/Table'; +import dayjs from 'dayjs'; +import _get from 'lodash.get'; +import { h } from 'vue'; +import { Tag } from 'ant-design-vue'; + +export const columns: BasicColumn[] = [ + { + title: '请求时间', + dataIndex: 'timestamp', + width: 50, + customRender({ text }) { + return dayjs(text).format('YYYY-MM-DD HH:mm:ss'); + }, + }, + { + title: '请求方法', + dataIndex: 'request.method', + width: 20, + customRender({ record, column }) { + let value = _get(record, column.dataIndex!); + let color = ''; + if (value === 'GET') { + color = '#87d068'; + } + if (value === 'POST') { + color = '#2db7f5'; + } + if (value === 'PUT') { + color = '#ffba5a'; + } + if (value === 'DELETE') { + color = '#ff5500'; + } + return h(Tag, { color }, () => value); + }, + }, + { + title: '请求URL', + dataIndex: 'request.uri', + width: 200, + customRender({ record, column }) { + return _get(record, column.dataIndex!); + }, + }, + { + title: '响应状态', + dataIndex: 'response.status', + width: 50, + customRender({ record, column }) { + let value = _get(record, column.dataIndex!); + let color = ''; + if (value < 200) { + color = 'pink'; + } else if (value < 201) { + color = 'green'; + } else if (value < 399) { + color = 'cyan'; + } else if (value < 403) { + color = 'orange'; + } else if (value < 501) { + color = 'red'; + } + return h(Tag, { color }, () => value); + }, + }, + { + title: '请求耗时', + dataIndex: 'timeTaken', + width: 50, + customRender({ record, column }) { + let value = _get(record, column.dataIndex!); + let color = 'red'; + if (value < 500) { + color = 'green'; + } else if (value < 1000) { + color = 'cyan'; + } else if (value < 1500) { + color = 'orange'; + } + return h(Tag, { color }, () => `${value} ms`); + }, + }, +]; diff --git a/src/views/report/chartdemo/chartdemo.data.ts b/src/views/report/chartdemo/chartdemo.data.ts new file mode 100644 index 0000000..d87e020 --- /dev/null +++ b/src/views/report/chartdemo/chartdemo.data.ts @@ -0,0 +1,49 @@ +export const getData = (() => { + let dottedBase = +new Date(); + const barDataSource: any[] = []; + const barMultiData: any[] = []; + const barLineData: any[] = []; + + for (let i = 0; i < 20; i++) { + let obj = { name: '', value: 0 }; + const date = new Date((dottedBase += 1000 * 3600 * 24)); + obj.name = [date.getFullYear(), date.getMonth() + 1, date.getDate()].join('-'); + obj.value = Math.random() * 200; + barDataSource.push(obj); + } + + for (let j = 0; j < 2; j++) { + for (let i = 0; i < 20; i++) { + let obj = { name: '', value: 0, type: 2010 + j + '' }; + const date = new Date(dottedBase + 1000 * 3600 * 24 * i); + obj.name = [date.getFullYear(), date.getMonth() + 1, date.getDate()].join('-'); + obj.value = Math.random() * 200; + barMultiData.push(obj); + } + } + const pieData = [ + { value: 335, name: '客服电话' }, + { value: 310, name: '奥迪官网' }, + { value: 234, name: '媒体曝光' }, + { value: 135, name: '质检总局' }, + { value: 105, name: '其他' }, + ]; + const radarData = [ + { value: 75, name: '政治', type: '文综', max: 100 }, + { value: 65, name: '历史', type: '文综', max: 100 }, + { value: 55, name: '地理', type: '文综', max: 100 }, + { value: 74, name: '化学', type: '文综', max: 100 }, + { value: 38, name: '物理', type: '文综', max: 100 }, + { value: 88, name: '生物', type: '文综', max: 100 }, + ]; + for (let j = 0; j < 2; j++) { + for (let i = 0; i < 15; i++) { + let obj = { name: '', value: 0, type: 2010 + j + '', seriesType: j >= 1 ? 'line' : 'bar' }; + const date = new Date(dottedBase + 1000 * 3600 * 24 * i); + obj.name = [date.getFullYear(), date.getMonth() + 1, date.getDate()].join('-'); + obj.value = Math.random() * 200; + barLineData.push(obj); + } + } + return { barDataSource, barMultiData, pieData, barLineData, radarData }; +})(); diff --git a/src/views/report/chartdemo/index.vue b/src/views/report/chartdemo/index.vue new file mode 100644 index 0000000..4c81e9f --- /dev/null +++ b/src/views/report/chartdemo/index.vue @@ -0,0 +1,93 @@ + + + diff --git a/src/views/report/statisticst/index.vue b/src/views/report/statisticst/index.vue new file mode 100644 index 0000000..673a5d6 --- /dev/null +++ b/src/views/report/statisticst/index.vue @@ -0,0 +1,135 @@ + + + diff --git a/src/views/sys/about/index.vue b/src/views/sys/about/index.vue new file mode 100644 index 0000000..1b2cf37 --- /dev/null +++ b/src/views/sys/about/index.vue @@ -0,0 +1,98 @@ + + diff --git a/src/views/sys/error-log/DetailModal.vue b/src/views/sys/error-log/DetailModal.vue new file mode 100644 index 0000000..2047707 --- /dev/null +++ b/src/views/sys/error-log/DetailModal.vue @@ -0,0 +1,27 @@ + + diff --git a/src/views/sys/error-log/data.tsx b/src/views/sys/error-log/data.tsx new file mode 100644 index 0000000..3ffc2f4 --- /dev/null +++ b/src/views/sys/error-log/data.tsx @@ -0,0 +1,67 @@ +import { Tag } from 'ant-design-vue'; +import { BasicColumn } from '/@/components/Table/index'; +import { ErrorTypeEnum } from '/@/enums/exceptionEnum'; +import { useI18n } from '/@/hooks/web/useI18n'; + +const { t } = useI18n(); + +export function getColumns(): BasicColumn[] { + return [ + { + dataIndex: 'type', + title: t('sys.errorLog.tableColumnType'), + width: 80, + customRender: ({ text }) => { + const color = + text === ErrorTypeEnum.VUE + ? 'green' + : text === ErrorTypeEnum.RESOURCE + ? 'cyan' + : text === ErrorTypeEnum.PROMISE + ? 'blue' + : ErrorTypeEnum.AJAX + ? 'red' + : 'purple'; + return {() => text}; + }, + }, + { + dataIndex: 'url', + title: 'URL', + width: 200, + }, + { + dataIndex: 'time', + title: t('sys.errorLog.tableColumnDate'), + width: 160, + }, + { + dataIndex: 'file', + title: t('sys.errorLog.tableColumnFile'), + width: 200, + }, + { + dataIndex: 'name', + title: 'Name', + width: 200, + }, + { + dataIndex: 'message', + title: t('sys.errorLog.tableColumnMsg'), + width: 300, + }, + { + dataIndex: 'stack', + title: t('sys.errorLog.tableColumnStackMsg'), + }, + ]; +} + +export function getDescSchema(): any { + return getColumns().map((column) => { + return { + field: column.dataIndex!, + label: column.title, + }; + }); +} diff --git a/src/views/sys/error-log/index.vue b/src/views/sys/error-log/index.vue new file mode 100644 index 0000000..1895524 --- /dev/null +++ b/src/views/sys/error-log/index.vue @@ -0,0 +1,88 @@ + + + diff --git a/src/views/sys/exception/Exception.vue b/src/views/sys/exception/Exception.vue new file mode 100644 index 0000000..c3db956 --- /dev/null +++ b/src/views/sys/exception/Exception.vue @@ -0,0 +1,143 @@ + + diff --git a/src/views/sys/exception/NetworkErrorException.vue b/src/views/sys/exception/NetworkErrorException.vue new file mode 100644 index 0000000..e4ce2b9 --- /dev/null +++ b/src/views/sys/exception/NetworkErrorException.vue @@ -0,0 +1,11 @@ + + + diff --git a/src/views/sys/exception/NotAccessException.vue b/src/views/sys/exception/NotAccessException.vue new file mode 100644 index 0000000..a5b2a5f --- /dev/null +++ b/src/views/sys/exception/NotAccessException.vue @@ -0,0 +1,11 @@ + + + diff --git a/src/views/sys/exception/NotDataErrorException.vue b/src/views/sys/exception/NotDataErrorException.vue new file mode 100644 index 0000000..9a09dd0 --- /dev/null +++ b/src/views/sys/exception/NotDataErrorException.vue @@ -0,0 +1,11 @@ + + + diff --git a/src/views/sys/exception/ServerErrorException.vue b/src/views/sys/exception/ServerErrorException.vue new file mode 100644 index 0000000..9742f55 --- /dev/null +++ b/src/views/sys/exception/ServerErrorException.vue @@ -0,0 +1,11 @@ + + + diff --git a/src/views/sys/exception/index.ts b/src/views/sys/exception/index.ts new file mode 100644 index 0000000..fb57528 --- /dev/null +++ b/src/views/sys/exception/index.ts @@ -0,0 +1,5 @@ +export { default as Exception } from './Exception.vue'; +export { default as NotAccessException } from './NotAccessException.vue'; +export { default as NetworkErrorException } from './NetworkErrorException.vue'; +export { default as NotDataErrorException } from './NotDataErrorException.vue'; +export { default as ServerErrorException } from './ServerErrorException.vue'; diff --git a/src/views/sys/forget-password/step1.vue b/src/views/sys/forget-password/step1.vue new file mode 100644 index 0000000..7a7892f --- /dev/null +++ b/src/views/sys/forget-password/step1.vue @@ -0,0 +1,96 @@ + + diff --git a/src/views/sys/forget-password/step2.vue b/src/views/sys/forget-password/step2.vue new file mode 100644 index 0000000..b81d49e --- /dev/null +++ b/src/views/sys/forget-password/step2.vue @@ -0,0 +1,103 @@ + + diff --git a/src/views/sys/forget-password/step3.vue b/src/views/sys/forget-password/step3.vue new file mode 100644 index 0000000..77ab02b --- /dev/null +++ b/src/views/sys/forget-password/step3.vue @@ -0,0 +1,71 @@ + + diff --git a/src/views/sys/iframe/FrameBlank.vue b/src/views/sys/iframe/FrameBlank.vue new file mode 100644 index 0000000..a8a61f5 --- /dev/null +++ b/src/views/sys/iframe/FrameBlank.vue @@ -0,0 +1,9 @@ + + diff --git a/src/views/sys/iframe/index.vue b/src/views/sys/iframe/index.vue new file mode 100644 index 0000000..e73bef3 --- /dev/null +++ b/src/views/sys/iframe/index.vue @@ -0,0 +1,85 @@ + + + diff --git a/src/views/sys/lock/LockPage.vue b/src/views/sys/lock/LockPage.vue new file mode 100644 index 0000000..76262c3 --- /dev/null +++ b/src/views/sys/lock/LockPage.vue @@ -0,0 +1,215 @@ + + + diff --git a/src/views/sys/lock/index.vue b/src/views/sys/lock/index.vue new file mode 100644 index 0000000..e8c4d55 --- /dev/null +++ b/src/views/sys/lock/index.vue @@ -0,0 +1,13 @@ + + diff --git a/src/views/sys/lock/useNow.ts b/src/views/sys/lock/useNow.ts new file mode 100644 index 0000000..ee461fc --- /dev/null +++ b/src/views/sys/lock/useNow.ts @@ -0,0 +1,60 @@ +import { dateUtil } from '/@/utils/dateUtil'; +import { reactive, toRefs } from 'vue'; +import { tryOnMounted, tryOnUnmounted } from '@vueuse/core'; + +export function 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/views/sys/login/ForgetPasswordForm.vue b/src/views/sys/login/ForgetPasswordForm.vue new file mode 100644 index 0000000..4f2d152 --- /dev/null +++ b/src/views/sys/login/ForgetPasswordForm.vue @@ -0,0 +1,68 @@ + + diff --git a/src/views/sys/login/Login.vue b/src/views/sys/login/Login.vue new file mode 100644 index 0000000..59304c4 --- /dev/null +++ b/src/views/sys/login/Login.vue @@ -0,0 +1,208 @@ + + + diff --git a/src/views/sys/login/LoginForm.vue b/src/views/sys/login/LoginForm.vue new file mode 100644 index 0000000..6fdbac7 --- /dev/null +++ b/src/views/sys/login/LoginForm.vue @@ -0,0 +1,196 @@ + + diff --git a/src/views/sys/login/LoginFormTitle.vue b/src/views/sys/login/LoginFormTitle.vue new file mode 100644 index 0000000..a673636 --- /dev/null +++ b/src/views/sys/login/LoginFormTitle.vue @@ -0,0 +1,25 @@ + + diff --git a/src/views/sys/login/LoginSelect.vue b/src/views/sys/login/LoginSelect.vue new file mode 100644 index 0000000..975b050 --- /dev/null +++ b/src/views/sys/login/LoginSelect.vue @@ -0,0 +1,332 @@ + + + + + diff --git a/src/views/sys/login/MobileForm.vue b/src/views/sys/login/MobileForm.vue new file mode 100644 index 0000000..affdb2c --- /dev/null +++ b/src/views/sys/login/MobileForm.vue @@ -0,0 +1,89 @@ + + diff --git a/src/views/sys/login/OAuth2Login.vue b/src/views/sys/login/OAuth2Login.vue new file mode 100644 index 0000000..9b07a4f --- /dev/null +++ b/src/views/sys/login/OAuth2Login.vue @@ -0,0 +1,86 @@ + + + \ No newline at end of file diff --git a/src/views/sys/login/QrCodeForm.vue b/src/views/sys/login/QrCodeForm.vue new file mode 100644 index 0000000..3b36731 --- /dev/null +++ b/src/views/sys/login/QrCodeForm.vue @@ -0,0 +1,83 @@ + + diff --git a/src/views/sys/login/RegisterForm.vue b/src/views/sys/login/RegisterForm.vue new file mode 100644 index 0000000..528ddea --- /dev/null +++ b/src/views/sys/login/RegisterForm.vue @@ -0,0 +1,114 @@ + + diff --git a/src/views/sys/login/SessionTimeoutLogin.vue b/src/views/sys/login/SessionTimeoutLogin.vue new file mode 100644 index 0000000..d1a2f34 --- /dev/null +++ b/src/views/sys/login/SessionTimeoutLogin.vue @@ -0,0 +1,53 @@ + + + diff --git a/src/views/sys/login/ThirdModal.vue b/src/views/sys/login/ThirdModal.vue new file mode 100644 index 0000000..0adffa3 --- /dev/null +++ b/src/views/sys/login/ThirdModal.vue @@ -0,0 +1,64 @@ + + diff --git a/src/views/sys/login/TokenLoginPage.vue b/src/views/sys/login/TokenLoginPage.vue new file mode 100644 index 0000000..4c0ca0e --- /dev/null +++ b/src/views/sys/login/TokenLoginPage.vue @@ -0,0 +1,209 @@ + + + + + + \ No newline at end of file diff --git a/src/views/sys/login/useLogin.ts b/src/views/sys/login/useLogin.ts new file mode 100644 index 0000000..029abde --- /dev/null +++ b/src/views/sys/login/useLogin.ts @@ -0,0 +1,184 @@ +import type { ValidationRule } from 'ant-design-vue/lib/form/Form'; +import type { RuleObject } from 'ant-design-vue/lib/form/interface'; +import { ref, computed, unref, Ref } from 'vue'; +import { useI18n } from '/@/hooks/web/useI18n'; +import { checkOnlyUser } from '/@/api/sys/user'; +import { defHttp } from '/@/utils/http/axios'; + +export enum LoginStateEnum { + LOGIN, + REGISTER, + RESET_PASSWORD, + MOBILE, + QR_CODE, +} + +export enum SmsEnum { + LOGIN = '0', + REGISTER = '1', + FORGET_PASSWORD = '2', +} +const currentState = ref(LoginStateEnum.LOGIN); + +export function useLoginState() { + function setLoginState(state: LoginStateEnum) { + currentState.value = state; + } + + const getLoginState = computed(() => currentState.value); + + function handleBackLogin() { + setLoginState(LoginStateEnum.LOGIN); + } + + return { setLoginState, getLoginState, handleBackLogin }; +} + +export function useFormValid(formRef: Ref) { + async function validForm() { + const form = unref(formRef); + if (!form) return; + const data = await form.validate(); + return data as T; + } + + return { validForm }; +} + +export function useFormRules(formData?: Recordable) { + const { t } = useI18n(); + + const getAccountFormRule = computed(() => createRule(t('sys.login.accountPlaceholder'))); + const getPasswordFormRule = computed(() => createRule(t('sys.login.passwordPlaceholder'))); + const getSmsFormRule = computed(() => createRule(t('sys.login.smsPlaceholder'))); + const getMobileFormRule = computed(() => createRule(t('sys.login.mobilePlaceholder'))); + + const getRegisterAccountRule = computed(() => createRegisterAccountRule('account')); + const getRegisterMobileRule = computed(() => createRegisterAccountRule('mobile')); + + const validatePolicy = async (_: RuleObject, value: boolean) => { + return !value ? Promise.reject(t('sys.login.policyPlaceholder')) : Promise.resolve(); + }; + + const validateConfirmPassword = (password: string) => { + return async (_: RuleObject, value: string) => { + if (!value) { + return Promise.reject(t('sys.login.passwordPlaceholder')); + } + if (value !== password) { + return Promise.reject(t('sys.login.diffPwd')); + } + return Promise.resolve(); + }; + }; + + const getFormRules = computed((): { [k: string]: ValidationRule | ValidationRule[] } => { + const accountFormRule = unref(getAccountFormRule); + const passwordFormRule = unref(getPasswordFormRule); + const smsFormRule = unref(getSmsFormRule); + const mobileFormRule = unref(getMobileFormRule); + + const registerAccountRule = unref(getRegisterAccountRule); + const registerMobileRule = unref(getRegisterMobileRule); + + const mobileRule = { + sms: smsFormRule, + mobile: mobileFormRule, + }; + switch (unref(currentState)) { + // register form rules + case LoginStateEnum.REGISTER: + return { + account: registerAccountRule, + password: passwordFormRule, + mobile: registerMobileRule, + sms: smsFormRule, + confirmPassword: [{ validator: validateConfirmPassword(formData?.password), trigger: 'change' }], + policy: [{ validator: validatePolicy, trigger: 'change' }], + }; + + // reset password form rules + case LoginStateEnum.RESET_PASSWORD: + return { + username: accountFormRule, + confirmPassword: [{ validator: validateConfirmPassword(formData?.password), trigger: 'change' }], + ...mobileRule, + }; + + // mobile form rules + case LoginStateEnum.MOBILE: + return mobileRule; + + // login form rules + default: + return { + account: accountFormRule, + password: passwordFormRule, + }; + } + }); + return { getFormRules }; +} + +function createRule(message: string) { + return [ + { + required: true, + message, + trigger: 'change', + }, + ]; +} +function createRegisterAccountRule(type) { + return [ + { + validator: type == 'account' ? checkUsername : checkPhone, + trigger: 'change', + }, + ]; +} + +function checkUsername(rule, value, callback) { + const { t } = useI18n(); + if (!value) { + return Promise.reject(t('sys.login.accountPlaceholder')); + } else { + return new Promise((resolve, reject) => { + checkOnlyUser({ username: value }).then((res) => { + res.success ? resolve() : reject('用户名已存在!'); + }); + }); + } +} +async function checkPhone(rule, value, callback) { + const { t } = useI18n(); + var reg = /^1[3456789]\d{9}$/; + if (!reg.test(value)) { + return Promise.reject(new Error('请输入正确手机号')); + } else { + return new Promise((resolve, reject) => { + checkOnlyUser({ phone: value }).then((res) => { + res.success ? resolve() : reject('手机号已存在!'); + }); + }); + } +} + +//update-begin---author:wangshuai ---date:20220629 for:[issues/I5BG1I]vue3不支持auth2登录------------ +/** + * 判断是否是OAuth2APP环境 + */ +export function isOAuth2AppEnv() { + return /wxwork|dingtalk/i.test(navigator.userAgent); +} + +/** + * 后台构造oauth2登录地址 + * @param source + */ +export function sysOAuth2Login(source) { + let url = `${window._CONFIG['domianURL']}/sys/thirdLogin/oauth2/${source}/login`; + url += `?state=${encodeURIComponent(window.location.origin)}`; + window.location.href = url; +} +//update-end---author:wangshuai ---date:20220629 for:[issues/I5BG1I]vue3不支持auth2登录------------ \ No newline at end of file diff --git a/src/views/sys/redirect/index.vue b/src/views/sys/redirect/index.vue new file mode 100644 index 0000000..7aa5463 --- /dev/null +++ b/src/views/sys/redirect/index.vue @@ -0,0 +1,30 @@ + + diff --git a/src/views/system/address/address.api.ts b/src/views/system/address/address.api.ts new file mode 100644 index 0000000..4890d34 --- /dev/null +++ b/src/views/system/address/address.api.ts @@ -0,0 +1,19 @@ +import { defHttp } from '/@/utils/http/axios'; + +export enum Api { + list = '/sys/user/queryByOrgCodeForAddressList', + positionList = '/sys/position/list', + queryDepartTreeSync = '/sys/sysDepart/queryDepartTreeSync', +} +/** + * 获取部门树列表 + */ +export const queryDepartTreeSync = (params?) => defHttp.get({ url: Api.queryDepartTreeSync, params }); +/** + * 部门用户信息 + */ +export const list = (params?) => defHttp.get({ url: Api.list, params }); +/** + * 职务list + */ +export const positionList = (params?) => defHttp.get({ url: Api.positionList, params }); diff --git a/src/views/system/address/address.data.ts b/src/views/system/address/address.data.ts new file mode 100644 index 0000000..ffa5945 --- /dev/null +++ b/src/views/system/address/address.data.ts @@ -0,0 +1,51 @@ +import { FormSchema } from '/@/components/Form'; +import { BasicColumn } from '/@/components/Table'; + +export const columns: BasicColumn[] = [ + { + title: '姓名', + dataIndex: 'realname', + width: 150, + }, + { + title: '工号', + dataIndex: 'workNo', + width: 100, + }, + { + title: '部门', + dataIndex: 'departName', + width: 200, + }, + { + title: '职务', + dataIndex: 'post', + width: 150, + slots: { customRender: 'post' }, + }, + { + title: '手机', + width: 150, + dataIndex: 'telephone', + }, + { + title: '邮箱', + width: 150, + dataIndex: 'email', + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + label: '姓名', + field: 'realname', + component: 'Input', + colProps: { span: 6 }, + }, + { + label: '工号', + field: 'workNo', + component: 'Input', + colProps: { span: 6 }, + }, +]; diff --git a/src/views/system/address/components/DepartLeftTree.vue b/src/views/system/address/components/DepartLeftTree.vue new file mode 100644 index 0000000..1225fea --- /dev/null +++ b/src/views/system/address/components/DepartLeftTree.vue @@ -0,0 +1,158 @@ + + + diff --git a/src/views/system/address/index.less b/src/views/system/address/index.less new file mode 100644 index 0000000..e1f751a --- /dev/null +++ b/src/views/system/address/index.less @@ -0,0 +1,10 @@ +//noinspection LessUnresolvedVariable +@prefix-cls: ~'@{namespace}-depart-manage'; + +.@{prefix-cls} { + &--box { + .ant-tabs-nav { + padding: 0 20px; + } + } +} diff --git a/src/views/system/address/index.vue b/src/views/system/address/index.vue new file mode 100644 index 0000000..bd5eac3 --- /dev/null +++ b/src/views/system/address/index.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/src/views/system/category/category.api.ts b/src/views/system/category/category.api.ts new file mode 100644 index 0000000..9295745 --- /dev/null +++ b/src/views/system/category/category.api.ts @@ -0,0 +1,78 @@ +import { defHttp } from '/@/utils/http/axios'; +import { Modal } from 'ant-design-vue'; + +enum Api { + list = '/sys/category/rootList', + save = '/sys/category/add', + edit = '/sys/category/edit', + deleteCategory = '/sys/category/delete', + deleteBatch = '/sys/category/deleteBatch', + importExcel = '/sys/category/importExcel', + exportXls = '/sys/category/exportXls', + loadTreeData = '/sys/category/loadTreeRoot', + getChildList = '/sys/category/childList', + getChildListBatch = '/sys/category/getChildListBatch', +} +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; +/** + * 导入api + * @param params + */ +export const getImportUrl = Api.importExcel; +/** + * 列表接口 + * @param params + */ +export const list = (params) => defHttp.get({ url: Api.list, params }); +/** + * 删除 + */ +export const deleteCategory = (params, handleSuccess) => { + return defHttp.delete({ url: Api.deleteCategory, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; +/** + * 批量删除 + * @param params + */ +export const batchDeleteCategory = (params, handleSuccess) => { + Modal.confirm({ + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + }, + }); +}; +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdateDict = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, params }); +}; +/** + * 查询全部树形节点数据 + * @param params + */ +export const loadTreeData = (params) => defHttp.get({ url: Api.loadTreeData, params }); +/** + * 查询子节点数据 + * @param params + */ +export const getChildList = (params) => defHttp.get({ url: Api.getChildList, params }); +/** + * 批量查询子节点数据 + * @param params + */ +export const getChildListBatch = (params) => defHttp.get({ url: Api.getChildListBatch, params }, { isTransformResponse: false }); diff --git a/src/views/system/category/category.data.ts b/src/views/system/category/category.data.ts new file mode 100644 index 0000000..c1f117f --- /dev/null +++ b/src/views/system/category/category.data.ts @@ -0,0 +1,65 @@ +import { BasicColumn } from '/@/components/Table'; +import { FormSchema } from '/@/components/Table'; + +export const columns: BasicColumn[] = [ + { + title: '分类名称', + dataIndex: 'name', + width: 350, + align: 'left', + }, + { + title: '分类编码', + dataIndex: 'code', + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + label: '名称', + field: 'name', + component: 'Input', + colProps: { span: 6 }, + }, + { + label: '编码', + field: 'code', + component: 'Input', + colProps: { span: 6 }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + label: '父级节点', + field: 'pid', + component: 'TreeSelect', + componentProps: { + replaceFields: { + value: 'key', + }, + dropdownStyle: { + maxHeight: '50vh', + }, + getPopupContainer: () => document.body, + }, + show: ({ values }) => { + return values.pid !== '0'; + }, + dynamicDisabled: ({ values }) => { + return !!values.id; + }, + }, + { + label: '分类名称', + field: 'name', + required: true, + component: 'Input', + }, +]; diff --git a/src/views/system/category/components/CategoryModal.vue b/src/views/system/category/components/CategoryModal.vue new file mode 100644 index 0000000..5155f39 --- /dev/null +++ b/src/views/system/category/components/CategoryModal.vue @@ -0,0 +1,89 @@ + + diff --git a/src/views/system/category/index.vue b/src/views/system/category/index.vue new file mode 100644 index 0000000..fb339ef --- /dev/null +++ b/src/views/system/category/index.vue @@ -0,0 +1,295 @@ + + + + + diff --git a/src/views/system/checkRule/CheckRuleModal.vue b/src/views/system/checkRule/CheckRuleModal.vue new file mode 100644 index 0000000..466c3ba --- /dev/null +++ b/src/views/system/checkRule/CheckRuleModal.vue @@ -0,0 +1,247 @@ + + + diff --git a/src/views/system/checkRule/CheckRuleTestModal.vue b/src/views/system/checkRule/CheckRuleTestModal.vue new file mode 100644 index 0000000..06dd10c --- /dev/null +++ b/src/views/system/checkRule/CheckRuleTestModal.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/src/views/system/checkRule/check.rule.api.ts b/src/views/system/checkRule/check.rule.api.ts new file mode 100644 index 0000000..c4b5391 --- /dev/null +++ b/src/views/system/checkRule/check.rule.api.ts @@ -0,0 +1,86 @@ +import { defHttp } from '/@/utils/http/axios'; +import { Modal } from 'ant-design-vue'; + +enum Api { + list = '/sys/checkRule/list', + delete = '/sys/checkRule/delete', + deleteBatch = '/sys/checkRule/deleteBatch', + exportXls = 'sys/checkRule/exportXls', + importXls = 'sys/checkRule/importExcel', + checkByCode = '/sys/checkRule/checkByCode', + save = '/sys/checkRule/add', + edit = '/sys/checkRule/edit', +} + +/** + * 导出地址 + */ +export const exportUrl = Api.exportXls; +/** + * 导入地址 + */ +export const importUrl = Api.importXls; + +/** + * 列表查询 + * @param params + */ +export const getCheckRuleList = (params) => { + return defHttp.get({ url: Api.list, params }); +}; + +/** + * 删除 + * @param params + * @param handleSuccess + */ +export const deleteCheckRule = (params, handleSuccess) => { + return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; + +/** + * 批量删除 + * @param params + */ +export const batchDeleteCheckRule = (params, handleSuccess) => { + Modal.confirm({ + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + }, + }); +}; + +/** + * 根据编码校验规则code,校验传入的值是否合法 + * @param ruleCode + * @param value + */ +export const validateCheckRule = (ruleCode, value) => { + value = encodeURIComponent(value); + let params = { ruleCode, value }; + return defHttp.get({ url: Api.checkByCode, params }, { isTransformResponse: false }); +}; + +/** + * 保存 + * @param params + */ +export const saveCheckRule = (params) => { + return defHttp.post({ url: Api.save, params }); +}; + +/** + * 更新 + * @param params + */ +export const updateCheckRule = (params) => { + return defHttp.put({ url: Api.edit, params }); +}; diff --git a/src/views/system/checkRule/check.rule.data.ts b/src/views/system/checkRule/check.rule.data.ts new file mode 100644 index 0000000..59fe236 --- /dev/null +++ b/src/views/system/checkRule/check.rule.data.ts @@ -0,0 +1,152 @@ +import { BasicColumn, FormSchema } from '/@/components/Table'; +import { render } from '/@/utils/common/renderUtils'; +import { duplicateCheck } from '/@/views/system/user/user.api'; +import { validateCheckRule } from '/@/views/system/checkRule/check.rule.api'; +import { array } from 'vue-types'; + +export const columns: BasicColumn[] = [ + { + title: '规则名称', + dataIndex: 'ruleName', + width: 200, + align: 'center', + }, + { + title: '规则编码', + dataIndex: 'ruleCode', + width: 200, + align: 'center', + }, + { + title: '规则描述', + dataIndex: 'ruleDescription', + width: 300, + align: 'center', + customRender: function ({ text }) { + return render.renderTip(text, 30); + }, + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'ruleName', + label: '规则名称', + component: 'Input', + colProps: { span: 6 }, + }, + { + field: 'ruleCode', + label: '规则编码', + component: 'Input', + colProps: { span: 6 }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + field: 'ruleName', + label: '规则名称', + component: 'Input', + required: true, + colProps: { span: 24 }, + }, + { + field: 'ruleCode', + label: '规则编码', + component: 'Input', + colProps: { span: 24 }, + dynamicDisabled: ({ values }) => { + return !!values.id; + }, + dynamicRules: ({ model }) => { + return [ + { + required: true, + validator: (_, value) => { + return new Promise((resolve, reject) => { + if (!value) { + return reject('请输入规则编码!'); + } + let params = { + tableName: 'sys_check_rule', + fieldName: 'rule_code', + fieldVal: value, + dataId: model.id, + }; + duplicateCheck(params) + .then((res) => { + res.success ? resolve() : reject('规则编码已存在!'); + }) + .catch((err) => { + reject(err.message || '校验失败'); + }); + }); + }, + }, + ]; + }, + }, + { + field: 'ruleDescription', + label: '规则描述', + colProps: { span: 24 }, + component: 'InputTextArea', + componentProps: { + placeholder: '请输入规则描述', + rows: 2, + }, + }, +]; + +export const checkRuleInput: FormSchema[] = [ + { + label: '123', + field: 'ruleCode', + component: 'Input', + show: false, + }, + { + field: 'testValue', + label: '需要测试的值:', + component: 'Input', + componentProps: ({ formModel }) => { + return { + onChange: (e) => { + formModel.testValue = e.target.value; + }, + }; + }, + dynamicRules: ({ model }) => { + const { ruleCode } = model; + return [ + { + required: false, + validator: (_, value) => { + return new Promise((resolve, reject) => { + if (ruleCode && value) { + /*console.log({ruleCode,value})*/ + validateCheckRule(ruleCode, value) + .then((res) => { + //console.log(1233, res) + res['success'] ? resolve() : reject(res['message']); + }) + .catch((err) => { + reject(err.message || err); + }); + } else { + resolve(); + } + }); + }, + }, + ]; + }, + }, +]; diff --git a/src/views/system/checkRule/index.vue b/src/views/system/checkRule/index.vue new file mode 100644 index 0000000..9dbf249 --- /dev/null +++ b/src/views/system/checkRule/index.vue @@ -0,0 +1,150 @@ + + + diff --git a/src/views/system/depart/components/DepartDataRuleDrawer.vue b/src/views/system/depart/components/DepartDataRuleDrawer.vue new file mode 100644 index 0000000..3427872 --- /dev/null +++ b/src/views/system/depart/components/DepartDataRuleDrawer.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/views/system/depart/components/DepartFormModal.vue b/src/views/system/depart/components/DepartFormModal.vue new file mode 100644 index 0000000..7376154 --- /dev/null +++ b/src/views/system/depart/components/DepartFormModal.vue @@ -0,0 +1,92 @@ + + + diff --git a/src/views/system/depart/components/DepartFormTab.vue b/src/views/system/depart/components/DepartFormTab.vue new file mode 100644 index 0000000..895428d --- /dev/null +++ b/src/views/system/depart/components/DepartFormTab.vue @@ -0,0 +1,122 @@ + + + + diff --git a/src/views/system/depart/components/DepartLeftTree.vue b/src/views/system/depart/components/DepartLeftTree.vue new file mode 100644 index 0000000..cb313e9 --- /dev/null +++ b/src/views/system/depart/components/DepartLeftTree.vue @@ -0,0 +1,332 @@ + + + diff --git a/src/views/system/depart/components/DepartRuleTab.vue b/src/views/system/depart/components/DepartRuleTab.vue new file mode 100644 index 0000000..a4e4390 --- /dev/null +++ b/src/views/system/depart/components/DepartRuleTab.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/src/views/system/depart/depart.api.ts b/src/views/system/depart/depart.api.ts new file mode 100644 index 0000000..f224f49 --- /dev/null +++ b/src/views/system/depart/depart.api.ts @@ -0,0 +1,122 @@ +import { unref } from 'vue'; +import { defHttp } from '/@/utils/http/axios'; +import { useMessage } from '/@/hooks/web/useMessage'; + +const { createConfirm } = useMessage(); + +export enum Api { + queryDepartTreeSync = '/sys/sysDepart/queryDepartTreeSync', + save = '/sys/sysDepart/add', + edit = '/sys/sysDepart/edit', + delete = '/sys/sysDepart/delete', + deleteBatch = '/sys/sysDepart/deleteBatch', + exportXlsUrl = '/sys/sysDepart/exportXls', + importExcelUrl = '/sys/sysDepart/importExcel', + + roleQueryTreeList = '/sys/role/queryTreeList', + queryDepartPermission = '/sys/permission/queryDepartPermission', + saveDepartPermission = '/sys/permission/saveDepartPermission', + + dataRule = '/sys/sysDepartPermission/datarule', + + getCurrentUserDeparts = '/sys/user/getCurrentUserDeparts', + selectDepart = '/sys/selectDepart', + getUpdateDepartInfo = '/sys/user/getUpdateDepartInfo', + doUpdateDepartInfo = '/sys/user/doUpdateDepartInfo', + changeDepartChargePerson = '/sys/user/changeDepartChargePerson', +} + +/** + * 获取部门树列表 + */ +export const queryDepartTreeSync = (params?) => defHttp.get({ url: Api.queryDepartTreeSync, params }); + +/** + * 保存或者更新部门角色 + */ +export const saveOrUpdateDepart = (params, isUpdate) => { + if (isUpdate) { + return defHttp.put({ url: Api.edit, params }); + } else { + return defHttp.post({ url: Api.save, params }); + } +}; + +/** + * 批量删除部门角色 + */ +export const deleteBatchDepart = (params, confirm = false) => { + return new Promise((resolve, reject) => { + const doDelete = () => { + resolve(defHttp.delete({ url: Api.deleteBatch, params }, { joinParamsToUrl: true })); + }; + if (confirm) { + createConfirm({ + iconType: 'warning', + title: '删除', + content: '确定要删除吗?', + onOk: () => doDelete(), + onCancel: () => reject(), + }); + } else { + doDelete(); + } + }); +}; + +/** + * 获取权限树列表 + */ +export const queryRoleTreeList = (params?) => defHttp.get({ url: Api.roleQueryTreeList, params }); +/** + * 查询部门权限 + */ +export const queryDepartPermission = (params?) => defHttp.get({ url: Api.queryDepartPermission, params }); +/** + * 保存部门权限 + */ +export const saveDepartPermission = (params) => defHttp.post({ url: Api.saveDepartPermission, params }); + +/** + * 查询部门数据权限列表 + */ +export const queryDepartDataRule = (functionId, departId, params?) => { + let url = `${Api.dataRule}/${unref(functionId)}/${unref(departId)}`; + return defHttp.get({ url, params }); +}; +/** + * 保存部门数据权限 + */ +export const saveDepartDataRule = (params) => defHttp.post({ url: Api.dataRule, params }); +/** + * 获取登录用户部门信息 + */ +export const getUserDeparts = (params?) => defHttp.get({ url: Api.getCurrentUserDeparts, params }); +/** + * 切换选择部门 + */ +export const selectDepart = (params?) => defHttp.put({ url: Api.selectDepart, params }); + +/** + * 编辑部门前获取部门相关信息 + * @param id + */ +export const getUpdateDepartInfo = (id) => defHttp.get({ url: Api.getUpdateDepartInfo, params: {id} }); + +/** + * 编辑部门 + * @param params + */ +export const doUpdateDepartInfo = (params) => defHttp.put({ url: Api.doUpdateDepartInfo, params }); + +/** + * 删除部门 + * @param id + */ +export const deleteDepart = (id) => defHttp.delete({ url: Api.delete, params:{ id } }, { joinParamsToUrl: true }); + +/** + * 设置负责人 取消负责人 + * @param params + */ +export const changeDepartChargePerson = (params) => defHttp.put({ url: Api.changeDepartChargePerson, params }); diff --git a/src/views/system/depart/depart.data.ts b/src/views/system/depart/depart.data.ts new file mode 100644 index 0000000..9e0346e --- /dev/null +++ b/src/views/system/depart/depart.data.ts @@ -0,0 +1,90 @@ +import { FormSchema } from '/@/components/Form'; + +// 部门基础表单 +export function useBasicFormSchema() { + const basicFormSchema: FormSchema[] = [ + { + field: 'departName', + label: '机构名称', + component: 'Input', + componentProps: { + placeholder: '请输入机构/部门名称', + }, + rules: [{ required: true, message: '机构名称不能为空' }], + }, + { + field: 'parentId', + label: '上级部门', + component: 'TreeSelect', + componentProps: { + treeData: [], + placeholder: '无', + dropdownStyle: { maxHeight: '200px', overflow: 'auto' }, + }, + }, + { + field: 'orgCode', + label: '机构编码', + component: 'Input', + componentProps: { + placeholder: '请输入机构编码', + }, + }, + { + field: 'orgCategory', + label: '机构类型', + component: 'RadioButtonGroup', + componentProps: { options: [] }, + }, + { + field: 'departOrder', + label: '排序', + component: 'InputNumber', + componentProps: {}, + }, + { + field: 'mobile', + label: '电话', + component: 'Input', + componentProps: { + placeholder: '请输入电话', + }, + }, + { + field: 'fax', + label: '传真', + component: 'Input', + componentProps: { + placeholder: '请输入传真', + }, + }, + { + field: 'address', + label: '地址', + component: 'Input', + componentProps: { + placeholder: '请输入地址', + }, + }, + { + field: 'memo', + label: '备注', + component: 'InputTextArea', + componentProps: { + placeholder: '请输入备注', + }, + }, + ]; + return { basicFormSchema }; +} + +// 机构类型选项 +export const orgCategoryOptions = { + // 一级部门 + root: [{ value: '1', label: '公司' }], + // 子级部门 + child: [ + { value: '2', label: '部门' }, + { value: '3', label: '岗位' }, + ], +}; diff --git a/src/views/system/depart/index.less b/src/views/system/depart/index.less new file mode 100644 index 0000000..e1f751a --- /dev/null +++ b/src/views/system/depart/index.less @@ -0,0 +1,10 @@ +//noinspection LessUnresolvedVariable +@prefix-cls: ~'@{namespace}-depart-manage'; + +.@{prefix-cls} { + &--box { + .ant-tabs-nav { + padding: 0 20px; + } + } +} diff --git a/src/views/system/depart/index.vue b/src/views/system/depart/index.vue new file mode 100644 index 0000000..80e3d1e --- /dev/null +++ b/src/views/system/depart/index.vue @@ -0,0 +1,70 @@ + + + + + + diff --git a/src/views/system/departUser/components/DepartBaseInfoTab.vue b/src/views/system/departUser/components/DepartBaseInfoTab.vue new file mode 100644 index 0000000..911319f --- /dev/null +++ b/src/views/system/departUser/components/DepartBaseInfoTab.vue @@ -0,0 +1,40 @@ + + + diff --git a/src/views/system/departUser/components/DepartRoleAuthDrawer.vue b/src/views/system/departUser/components/DepartRoleAuthDrawer.vue new file mode 100644 index 0000000..e8d5d90 --- /dev/null +++ b/src/views/system/departUser/components/DepartRoleAuthDrawer.vue @@ -0,0 +1,158 @@ + + + diff --git a/src/views/system/departUser/components/DepartRoleDataRuleDrawer.vue b/src/views/system/departUser/components/DepartRoleDataRuleDrawer.vue new file mode 100644 index 0000000..04f2e45 --- /dev/null +++ b/src/views/system/departUser/components/DepartRoleDataRuleDrawer.vue @@ -0,0 +1,82 @@ + + + diff --git a/src/views/system/departUser/components/DepartRoleInfoTab.vue b/src/views/system/departUser/components/DepartRoleInfoTab.vue new file mode 100644 index 0000000..625ddc7 --- /dev/null +++ b/src/views/system/departUser/components/DepartRoleInfoTab.vue @@ -0,0 +1,196 @@ + + + diff --git a/src/views/system/departUser/components/DepartRoleModal.vue b/src/views/system/departUser/components/DepartRoleModal.vue new file mode 100644 index 0000000..4eec504 --- /dev/null +++ b/src/views/system/departUser/components/DepartRoleModal.vue @@ -0,0 +1,63 @@ + + + diff --git a/src/views/system/departUser/components/DepartRoleUserAuthDrawer.vue b/src/views/system/departUser/components/DepartRoleUserAuthDrawer.vue new file mode 100644 index 0000000..78dbc1b --- /dev/null +++ b/src/views/system/departUser/components/DepartRoleUserAuthDrawer.vue @@ -0,0 +1,91 @@ + + + diff --git a/src/views/system/departUser/components/DepartTree.vue b/src/views/system/departUser/components/DepartTree.vue new file mode 100644 index 0000000..2617d9f --- /dev/null +++ b/src/views/system/departUser/components/DepartTree.vue @@ -0,0 +1,149 @@ + + + + diff --git a/src/views/system/departUser/components/DepartUserInfoTab.vue b/src/views/system/departUser/components/DepartUserInfoTab.vue new file mode 100644 index 0000000..a941e8a --- /dev/null +++ b/src/views/system/departUser/components/DepartUserInfoTab.vue @@ -0,0 +1,229 @@ + + + diff --git a/src/views/system/departUser/depart.user.api.ts b/src/views/system/departUser/depart.user.api.ts new file mode 100644 index 0000000..d5a37ed --- /dev/null +++ b/src/views/system/departUser/depart.user.api.ts @@ -0,0 +1,159 @@ +import { unref } from 'vue'; +import { defHttp } from '/@/utils/http/axios'; +import { useMessage } from '/@/hooks/web/useMessage'; + +const { createConfirm } = useMessage(); + +enum Api { + treeList = '/sys/sysDepart/queryMyDeptTreeList', + queryIdTree = '/sys/sysDepart/queryIdTree', + searchBy = '/sys/sysDepart/searchBy', +} + +// 部门用户API +enum DepartUserApi { + list = '/sys/user/departUserList', + link = '/sys/user/editSysDepartWithUser', + unlink = '/sys/user/deleteUserInDepartBatch', +} + +// 部门角色API +enum DepartRoleApi { + list = '/sys/sysDepartRole/list', + deleteBatch = '/sys/sysDepartRole/deleteBatch', + save = '/sys/sysDepartRole/add', + edit = '/sys/sysDepartRole/edit', + queryTreeListForDeptRole = '/sys/sysDepartPermission/queryTreeListForDeptRole', + queryDeptRolePermission = '/sys/sysDepartPermission/queryDeptRolePermission', + saveDeptRolePermission = '/sys/sysDepartPermission/saveDeptRolePermission', + dataRule = '/sys/sysDepartRole/datarule', + getDeptRoleList = '/sys/sysDepartRole/getDeptRoleList', + getDeptRoleByUserId = '/sys/sysDepartRole/getDeptRoleByUserId', + saveDeptRoleUser = '/sys/sysDepartRole/deptRoleUserAdd', +} + +/** + * 获取部门树列表 + */ +export const queryMyDepartTreeList = (params?) => defHttp.get({ url: Api.treeList, params }, { isTransformResponse: false }); + +/** + * 查询数据,以树结构形式加载所有部门的名称 + */ +export const queryIdTree = (params?) => defHttp.get({ url: Api.queryIdTree, params }); + +/** + * 根据关键字搜索部门 + */ +export const searchByKeywords = (params) => defHttp.get({ url: Api.searchBy, params }); + +/** + * 查询部门下的用户信息 + */ +export const departUserList = (params) => defHttp.get({ url: DepartUserApi.list, params }); + +/** + * 批量添加部门和用户的关联关系 + * + * @param departId 部门ID + * @param userIdList 用户ID列表 + */ +export const linkDepartUserBatch = (departId: string, userIdList: string[]) => + defHttp.post({ url: DepartUserApi.link, params: { depId: departId, userIdList } }); + +/** + * 批量取消部门和用户的关联关系 + */ +export const unlinkDepartUserBatch = (params, confirm = false) => { + return new Promise((resolve, reject) => { + const doDelete = () => { + resolve(defHttp.delete({ url: DepartUserApi.unlink, params }, { joinParamsToUrl: true })); + }; + if (confirm) { + createConfirm({ + iconType: 'warning', + title: '取消关联', + content: '确定要取消关联吗?', + onOk: () => doDelete(), + onCancel: () => reject(), + }); + } else { + doDelete(); + } + }); +}; + +/** + * 查询部门角色信息 + */ +export const departRoleList = (params) => defHttp.get({ url: DepartRoleApi.list, params }); + +/** + * 保存或者更新部门角色 + */ +export const saveOrUpdateDepartRole = (params, isUpdate) => { + if (isUpdate) { + return defHttp.put({ url: DepartRoleApi.edit, params }); + } else { + return defHttp.post({ url: DepartRoleApi.save, params }); + } +}; + +/** + * 批量删除部门角色 + */ +export const deleteBatchDepartRole = (params, confirm = false) => { + return new Promise((resolve, reject) => { + const doDelete = () => { + resolve(defHttp.delete({ url: DepartRoleApi.deleteBatch, params }, { joinParamsToUrl: true })); + }; + if (confirm) { + createConfirm({ + iconType: 'warning', + title: '删除', + content: '确定要删除吗?', + onOk: () => doDelete(), + onCancel: () => reject(), + }); + } else { + doDelete(); + } + }); +}; + +/** + * 用户角色授权功能,查询菜单权限树 + */ +export const queryTreeListForDeptRole = (params) => defHttp.get({ url: DepartRoleApi.queryTreeListForDeptRole, params }); +/** + * 查询角色授权 + */ +export const queryDeptRolePermission = (params) => defHttp.get({ url: DepartRoleApi.queryDeptRolePermission, params }); +/** + * 保存角色授权 + */ +export const saveDeptRolePermission = (params) => defHttp.post({ url: DepartRoleApi.saveDeptRolePermission, params }); + +/** + * 查询部门角色数据权限列表 + */ +export const queryDepartRoleDataRule = (functionId, departId, roleId, params?) => { + let url = `${DepartRoleApi.dataRule}/${unref(functionId)}/${unref(departId)}/${unref(roleId)}`; + return defHttp.get({ url, params }); +}; +/** + * 保存部门角色数据权限 + */ +export const saveDepartRoleDataRule = (params) => defHttp.post({ url: DepartRoleApi.dataRule, params }); +/** + * 查询部门角色用户授权 + */ +export const queryDepartRoleUserList = (params) => defHttp.get({ url: DepartRoleApi.getDeptRoleList, params }); +/** + * 根据 userId 查询部门角色用户授权 + */ +export const queryDepartRoleByUserId = (params) => defHttp.get({ url: DepartRoleApi.getDeptRoleByUserId, params }); +/** + * 保存部门角色用户授权 + */ +export const saveDepartRoleUser = (params) => defHttp.post({ url: DepartRoleApi.saveDeptRoleUser, params }); diff --git a/src/views/system/departUser/depart.user.data.ts b/src/views/system/departUser/depart.user.data.ts new file mode 100644 index 0000000..6eaa191 --- /dev/null +++ b/src/views/system/departUser/depart.user.data.ts @@ -0,0 +1,195 @@ +import { Ref } from 'vue'; +import { duplicateCheck } from '/@/views/system/user/user.api'; +import { BasicColumn, FormSchema } from '/@/components/Table'; +import { DescItem } from '/@/components/Description'; +import { findTree } from '/@/utils/common/compUtils'; + +// 用户信息 columns +export const userInfoColumns: BasicColumn[] = [ + { + title: '用户账号', + dataIndex: 'username', + width: 150, + }, + { + title: '用户名称', + dataIndex: 'realname', + width: 180, + }, + { + title: '部门', + dataIndex: 'orgCode', + width: 200, + }, + { + title: '性别', + dataIndex: 'sex_dictText', + width: 80, + }, + { + title: '电话', + dataIndex: 'phone', + width: 120, + }, +]; + +// 用户信息查询条件表单 +export const userInfoSearchFormSchema: FormSchema[] = [ + { + field: 'username', + label: '用户账号', + component: 'Input', + }, +]; + +// 部门角色 columns +export const departRoleColumns: BasicColumn[] = [ + { + title: '部门角色名称', + dataIndex: 'roleName', + width: 100, + }, + { + title: '部门角色编码', + dataIndex: 'roleCode', + width: 100, + }, + { + title: '部门', + dataIndex: 'departId_dictText', + width: 100, + }, + { + title: '备注', + dataIndex: 'description', + width: 100, + }, +]; + +// 部门角色查询条件表单 +export const departRoleSearchFormSchema: FormSchema[] = [ + { + field: 'roleName', + label: '部门角色名称', + component: 'Input', + }, +]; + +// 部门角色弹窗form表单 +export const departRoleModalFormSchema: FormSchema[] = [ + { + label: 'id', + field: 'id', + component: 'Input', + show: false, + }, + { + field: 'roleName', + label: '部门角色名称', + component: 'Input', + rules: [ + { required: true, message: '部门角色名称不能为空!' }, + { min: 2, max: 30, message: '长度在 2 到 30 个字符', trigger: 'blur' }, + ], + }, + { + field: 'roleCode', + label: '部门角色编码', + component: 'Input', + dynamicDisabled: ({ values }) => { + return !!values.id; + }, + dynamicRules: ({ model }) => { + return [ + { required: true, message: '部门角色编码不能为空!' }, + { min: 0, max: 64, message: '长度不能超过 64 个字符', trigger: 'blur' }, + { + validator: (_, value) => { + if (/[\u4E00-\u9FA5]/g.test(value)) { + return Promise.reject('部门角色编码不可输入汉字!'); + } + return new Promise((resolve, reject) => { + let params = { + tableName: 'sys_depart_role', + fieldName: 'role_code', + fieldVal: value, + dataId: model.id, + }; + duplicateCheck(params) + .then((res) => { + res.success ? resolve() : reject(res.message || '校验失败'); + }) + .catch((err) => { + reject(err.message || '验证失败'); + }); + }); + }, + }, + ]; + }, + }, + { + field: 'description', + label: '描述', + component: 'Input', + rules: [{ min: 0, max: 126, message: '长度不能超过 126 个字符', trigger: 'blur' }], + }, +]; + +// 基本信息form +export function useBaseInfoForm(treeData: Ref) { + const descItems: DescItem[] = [ + { + field: 'departName', + label: '机构名称', + }, + { + field: 'parentId', + label: '上级部门', + render(val) { + if (val) { + let data = findTree(treeData.value, (item) => item.key == val); + return data?.title ?? val; + } + return val; + }, + }, + { + field: 'orgCode', + label: '机构编码', + }, + { + field: 'orgCategory', + label: '机构类型', + render(val) { + if (val === '1') { + return '公司'; + } else if (val === '2') { + return '部门'; + } else if (val === '3') { + return '岗位'; + } + return val; + }, + }, + { + field: 'departOrder', + label: '排序', + }, + + { + field: 'mobile', + label: '手机号', + }, + { + field: 'address', + label: '地址', + }, + { + field: 'memo', + label: '备注', + }, + ]; + + return { descItems }; +} diff --git a/src/views/system/departUser/index.less b/src/views/system/departUser/index.less new file mode 100644 index 0000000..df2d981 --- /dev/null +++ b/src/views/system/departUser/index.less @@ -0,0 +1,48 @@ +@prefix-cls: ~'@{namespace}-depart-user'; + +.@{prefix-cls} { + &--tree-search { + width: 100%; + margin: 10px 0 20px; + } + + &--base-info-form { + @media (min-width: 576px) { + .no-border { + border: 0; + box-shadow: none; + } + + .ant-select.ant-select-disabled { + .ant-select-selector { + border: 0; + color: black; + background-color: transparent; + } + + .ant-select-selector, + .ant-select-selection-item { + cursor: text !important; + user-select: initial !important; + } + + .ant-select-selection-search, + .ant-select-arrow { + display: none; + } + } + } + } +} + +// 夜间模式样式兼容 +[data-theme='dark'] .@{prefix-cls} { + &--base-info-form { + .ant-select.ant-select-disabled { + .ant-select-selector { + color: #c9d1d9; + background-color: transparent; + } + } + } +} diff --git a/src/views/system/departUser/index.vue b/src/views/system/departUser/index.vue new file mode 100644 index 0000000..8e053f3 --- /dev/null +++ b/src/views/system/departUser/index.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/views/system/dict/components/DictItemList.vue b/src/views/system/dict/components/DictItemList.vue new file mode 100644 index 0000000..8bca0c9 --- /dev/null +++ b/src/views/system/dict/components/DictItemList.vue @@ -0,0 +1,132 @@ + + + diff --git a/src/views/system/dict/components/DictItemModal.vue b/src/views/system/dict/components/DictItemModal.vue new file mode 100644 index 0000000..1fea1c8 --- /dev/null +++ b/src/views/system/dict/components/DictItemModal.vue @@ -0,0 +1,63 @@ + + diff --git a/src/views/system/dict/components/DictModal.vue b/src/views/system/dict/components/DictModal.vue new file mode 100644 index 0000000..812a788 --- /dev/null +++ b/src/views/system/dict/components/DictModal.vue @@ -0,0 +1,52 @@ + + diff --git a/src/views/system/dict/components/DictRecycleBinModal.vue b/src/views/system/dict/components/DictRecycleBinModal.vue new file mode 100644 index 0000000..c7e7cf5 --- /dev/null +++ b/src/views/system/dict/components/DictRecycleBinModal.vue @@ -0,0 +1,90 @@ + + diff --git a/src/views/system/dict/dict.api.ts b/src/views/system/dict/dict.api.ts new file mode 100644 index 0000000..1a839ac --- /dev/null +++ b/src/views/system/dict/dict.api.ts @@ -0,0 +1,135 @@ +import { defHttp } from '/@/utils/http/axios'; +import { Modal } from 'ant-design-vue'; +enum Api { + list = '/sys/dict/list', + save = '/sys/dict/add', + edit = '/sys/dict/edit', + duplicateCheck = '/sys/duplicate/check', + deleteDict = '/sys/dict/delete', + deleteBatch = '/sys/dict/deleteBatch', + importExcel = '/sys/dict/importExcel', + exportXls = '/sys/dict/exportXls', + recycleBinList = '/sys/dict/deleteList', + putRecycleBin = '/sys/dict/back', + deleteRecycleBin = '/sys/dict/deletePhysic', + itemList = '/sys/dictItem/list', + deleteItem = '/sys/dictItem/delete', + itemSave = '/sys/dictItem/add', + itemEdit = '/sys/dictItem/edit', + dictItemCheck = '/sys/dictItem/dictItemCheck', + refreshCache = '/sys/dict/refleshCache', + queryAllDictItems = '/sys/dict/queryAllDictItems', +} +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; +/** + * 导入api + * @param params + */ +export const getImportUrl = Api.importExcel; +/** + * 字典列表接口 + * @param params + */ +export const list = (params) => defHttp.get({ url: Api.list, params }); +/** + * 删除字典 + */ +export const deleteDict = (params, handleSuccess) => { + return defHttp.delete({ url: Api.deleteDict, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; +/** + * 批量删除字典 + * @param params + */ +export const batchDeleteDict = (params, handleSuccess) => { + Modal.confirm({ + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + }, + }); +}; +/** + * 保存或者更新字典 + * @param params + */ +export const saveOrUpdateDict = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, params }); +}; +/** + * 唯一校验 + * @param params + */ +export const duplicateCheck = (params) => defHttp.get({ url: Api.duplicateCheck, params }, { isTransformResponse: false }); +/** + * 字典回收站列表 + * @param params + */ +export const getRecycleBinList = (params) => defHttp.get({ url: Api.recycleBinList, params }); +/** + * 回收站还原 + * @param params + */ +export const putRecycleBin = (id, handleSuccess) => { + return defHttp.put({ url: Api.putRecycleBin + `/${id}` }).then(() => { + handleSuccess(); + }); +}; +/** + * 回收站删除 + * @param params + */ +export const deleteRecycleBin = (id, handleSuccess) => { + return defHttp.delete({ url: Api.deleteRecycleBin + `/${id}` }).then(() => { + handleSuccess(); + }); +}; +/** + * 字典配置列表 + * @param params + */ +export const itemList = (params) => defHttp.get({ url: Api.itemList, params }); +/** + * 字典配置删除 + * @param params + */ +export const deleteItem = (params, handleSuccess) => { + return defHttp.delete({ url: Api.deleteItem, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; +/** + * 保存或者更新字典配置 + * @param params + */ +export const saveOrUpdateDictItem = (params, isUpdate) => { + let url = isUpdate ? Api.itemEdit : Api.itemSave; + return defHttp.post({ url: url, params }); +}; +/** + * 校验字典数据值 + * @param params + */ +export const dictItemCheck = (params) => defHttp.get({ url: Api.dictItemCheck, params }, { isTransformResponse: false }); +/** + * 刷新字典 + * @param params + */ +export const refreshCache = () => defHttp.get({ url: Api.refreshCache }, { isTransformResponse: false }); +/** + * 获取所有字典项 + * @param params + */ +export const queryAllDictItems = () => defHttp.get({ url: Api.queryAllDictItems }, { isTransformResponse: false }); diff --git a/src/views/system/dict/dict.data.ts b/src/views/system/dict/dict.data.ts new file mode 100644 index 0000000..bd0b77d --- /dev/null +++ b/src/views/system/dict/dict.data.ts @@ -0,0 +1,184 @@ +import { BasicColumn } from '/@/components/Table'; +import { FormSchema } from '/@/components/Table'; +import { dictItemCheck } from './dict.api'; +import { rules } from '/@/utils/helper/validator'; +export const columns: BasicColumn[] = [ + { + title: '字典名称', + dataIndex: 'dictName', + width: 240, + }, + { + title: '字典编码', + dataIndex: 'dictCode', + width: 240, + }, + { + title: '描述', + dataIndex: 'description', + // width: 120 + }, +]; + +export const recycleBincolumns: BasicColumn[] = [ + { + title: '字典名称', + dataIndex: 'dictName', + width: 120, + }, + { + title: '字典编码', + dataIndex: 'dictCode', + width: 120, + }, + { + title: '描述', + dataIndex: 'description', + width: 120, + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + label: '字典名称', + field: 'dictName', + component: 'Input', + colProps: { span: 6 }, + }, + { + label: '字典编码', + field: 'dictCode', + component: 'Input', + colProps: { span: 6 }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + label: '字典名称', + field: 'dictName', + required: true, + component: 'Input', + }, + { + label: '字典编码', + field: 'dictCode', + component: 'Input', + dynamicDisabled: ({ values }) => { + return !!values.id; + }, + dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_dict', 'dict_code', model, schema, true), + }, + { + label: '描述', + field: 'description', + component: 'Input', + }, +]; + +export const dictItemColumns: BasicColumn[] = [ + { + title: '名称', + dataIndex: 'itemText', + width: 80, + }, + { + title: '数据值', + dataIndex: 'itemValue', + width: 80, + }, +]; + +export const dictItemSearchFormSchema: FormSchema[] = [ + { + label: '名称', + field: 'itemText', + component: 'Input', + }, + { + label: '状态', + field: 'status', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'dict_item_status', + stringToNumber: true, + }, + }, +]; + +export const itemFormSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + label: '名称', + field: 'itemText', + required: true, + component: 'Input', + }, + { + label: '数据值', + field: 'itemValue', + component: 'Input', + dynamicRules: ({ values, model }) => { + return [ + { + required: true, + validator: (_, value) => { + if (!value) { + return Promise.reject('请输入数据值'); + } + if (new RegExp("[`~!@#$^&*()=|{}'.<>《》/?!¥()—【】‘;:”“。,、?]").test(value)) { + return Promise.reject('数据值不能包含特殊字符!'); + } + return new Promise((resolve, reject) => { + let params = { + dictId: values.dictId, + id: model.id, + itemValue: value, + }; + dictItemCheck(params) + .then((res) => { + res.success ? resolve() : reject(res.message || '校验失败'); + }) + .catch((err) => { + reject(err.message || '验证失败'); + }); + }); + }, + }, + ]; + }, + }, + { + label: '描述', + field: 'description', + component: 'Input', + }, + { + field: 'sortOrder', + label: '排序', + component: 'InputNumber', + defaultValue: 1, + }, + { + field: 'status', + label: '是否启用', + defaultValue: 1, + component: 'JDictSelectTag', + componentProps: { + type: 'radioButton', + dictCode: 'dict_item_status', + stringToNumber: true, + }, + }, +]; diff --git a/src/views/system/dict/index.vue b/src/views/system/dict/index.vue new file mode 100644 index 0000000..bd932d1 --- /dev/null +++ b/src/views/system/dict/index.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/src/views/system/examples/demo/DemoModal.vue b/src/views/system/examples/demo/DemoModal.vue new file mode 100644 index 0000000..2a2d366 --- /dev/null +++ b/src/views/system/examples/demo/DemoModal.vue @@ -0,0 +1,69 @@ + + diff --git a/src/views/system/examples/demo/demo.api.ts b/src/views/system/examples/demo/demo.api.ts new file mode 100644 index 0000000..1cde92b --- /dev/null +++ b/src/views/system/examples/demo/demo.api.ts @@ -0,0 +1,73 @@ +import { defHttp } from '/@/utils/http/axios'; +import { Modal } from 'ant-design-vue'; + +enum Api { + list = '/test/jeecgDemo/list', + save = '/test/jeecgDemo/add', + edit = '/test/jeecgDemo/edit', + get = '/test/jeecgDemo/queryById', + delete = '/test/jeecgDemo/delete', + deleteBatch = '/test/jeecgDemo/deleteBatch', + exportXls = '/test/jeecgDemo/exportXls', + importExcel = '/test/jeecgDemo/importExcel', +} +/** + * 导出api + */ +export const getExportUrl = Api.exportXls; +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; +/** + * 查询示例列表 + * @param params + */ +export const getDemoList = (params) => { + return defHttp.get({ url: Api.list, params }); +}; + +/** + * 保存或者更新示例 + * @param params + */ +export const saveOrUpdateDemo = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, params }); +}; + +/** + * 查询示例详情 + * @param params + */ +export const getDemoById = (params) => { + return defHttp.get({ url: Api.get, params }); +}; + +/** + * 删除示例 + * @param params + */ +export const deleteDemo = (params, handleSuccess) => { + return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; + +/** + * 批量删除示例 + * @param params + */ +export const batchDeleteDemo = (params, handleSuccess) => { + Modal.confirm({ + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + }, + }); +}; diff --git a/src/views/system/examples/demo/demo.data.ts b/src/views/system/examples/demo/demo.data.ts new file mode 100644 index 0000000..19a820d --- /dev/null +++ b/src/views/system/examples/demo/demo.data.ts @@ -0,0 +1,220 @@ +import { BasicColumn } from '/@/components/Table'; +import { FormSchema } from '/@/components/Table'; +import { render } from '/@/utils/common/renderUtils'; + +export const columns: BasicColumn[] = [ + { + title: '姓名', + dataIndex: 'name', + width: 170, + align: 'left', + resizable: true, + sorter: { + multiple:1 + } + }, + { + title: '关键词', + dataIndex: 'keyWord', + width: 130, + resizable: true, + }, + { + title: '打卡时间', + dataIndex: 'punchTime', + width: 140, + resizable: true, + }, + { + title: '工资', + dataIndex: 'salaryMoney', + width: 140, + resizable: true, + sorter: { + multiple: 2 + } + }, + { + title: '奖金', + dataIndex: 'bonusMoney', + width: 140, + resizable: true, + }, + { + title: '性别', + dataIndex: 'sex', + sorter: { + multiple: 3 + }, + customRender: ({ record }) => { + return render.renderDict(record.sex, 'sex'); + // let v = record.sex ? (record.sex == '1' ? '男' : '女') : ''; + // return h('span', v); + }, + width: 120, + resizable: true, + }, + { + title: '生日', + dataIndex: 'birthday', + width: 120, + resizable: true, + }, + { + title: '邮箱', + dataIndex: 'email', + width: 120, + resizable: true, + }, + { + title: '个人简介', + dataIndex: 'content', + width: 120, + resizable: true, + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'name', + label: '姓名', + component: 'Input', + colProps: { span: 8 }, + }, + { + field: 'birthday', + label: '生日', + component: 'RangePicker', + componentProps: { + valueType: 'Date' + }, + colProps: { span: 8 }, + }, + { + field: 'age', + label: '年龄', + component: 'Input', + slot: 'age', + colProps: { span: 8 }, + }, + { + field: 'sex', + label: '性别', + colProps: { span: 8 }, + component: 'JDictSelectTag', + componentProps: { + dictCode: 'sex', + placeholder: '请选择性别', + }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + field: 'id', + label: 'id', + component: 'Input', + show: false, + }, + { + field: 'createBy', + label: 'createBy', + component: 'Input', + show: false, + }, + { + field: 'createTime', + label: 'createTime', + component: 'Input', + show: false, + }, + { + field: 'name', + label: '名字', + component: 'Input', + required: true, + componentProps: { + placeholder: '请输入名字', + }, + }, + { + field: 'keyWord', + label: '关键词', + component: 'Input', + componentProps: { + placeholder: '请输入关键词', + }, + }, + { + field: 'punchTime', + label: '打卡时间', + component: 'DatePicker', + componentProps: { + showTime: true, + valueFormat: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择打卡时间', + }, + }, + { + field: 'salaryMoney', + label: '工资', + component: 'Input', + componentProps: { + placeholder: '请输入工资', + }, + }, + { + field: 'sex', + label: '性别', + component: 'JDictSelectTag', + defaultValue: '1', + componentProps: { + type: 'radio', + dictCode: 'sex', + placeholder: '请选择性别', + }, + }, + { + field: 'age', + label: '年龄', + component: 'InputNumber', + defaultValue: 1, + componentProps: { + placeholder: '请输入年龄', + }, + }, + { + field: 'birthday', + label: '生日', + component: 'DatePicker', + defaultValue: '', + componentProps: { + valueFormat: 'YYYY-MM-DD', + placeholder: '请选择生日', + }, + }, + { + field: 'email', + label: '邮箱', + component: 'Input', + rules: [{ required: false, type: 'email', message: '邮箱格式不正确', trigger: 'blur' }], + componentProps: { + placeholder: '请输入邮箱', + }, + }, + { + field: 'content', + label: '个人简介 - To introduce myself', + component: 'InputTextArea', + labelLength: 4, + componentProps: { + placeholder: '请输入个人简介', + }, + }, + { + field: 'updateCount', + label: '乐观锁', + show: false, + component: 'Input', + }, +]; diff --git a/src/views/system/examples/demo/index.vue b/src/views/system/examples/demo/index.vue new file mode 100644 index 0000000..bedc7a1 --- /dev/null +++ b/src/views/system/examples/demo/index.vue @@ -0,0 +1,311 @@ + + + diff --git a/src/views/system/fillRule/FillRuleModal.vue b/src/views/system/fillRule/FillRuleModal.vue new file mode 100644 index 0000000..6dec588 --- /dev/null +++ b/src/views/system/fillRule/FillRuleModal.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/views/system/fillRule/fill.rule.api.ts b/src/views/system/fillRule/fill.rule.api.ts new file mode 100644 index 0000000..1348a12 --- /dev/null +++ b/src/views/system/fillRule/fill.rule.api.ts @@ -0,0 +1,83 @@ +import { defHttp } from '/@/utils/http/axios'; +import { Modal } from 'ant-design-vue'; + +enum Api { + list = '/sys/fillRule/list', + test = '/sys/fillRule/testFillRule', + save = '/sys/fillRule/add', + edit = '/sys/fillRule/edit', + delete = '/sys/fillRule/delete', + deleteBatch = '/sys/fillRule/deleteBatch', + exportXls = '/sys/fillRule/exportXls', + importExcel = '/sys/fillRule/importExcel', +} + +/** + * 导出地址 + */ +export const exportUrl = Api.exportXls; +/** + * 导入地址 + */ +export const importUrl = Api.importExcel; + +/** + * 列表查询 + * @param params + */ +export const getFillRuleList = (params) => { + return defHttp.get({ url: Api.list, params }); +}; + +/** + * 删除 + * @param params + * @param handleSuccess + */ +export const deleteFillRule = (params, handleSuccess) => { + return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; + +/** + * 批量删除 + * @param params + */ +export const batchDeleteFillRule = (params, handleSuccess) => { + Modal.confirm({ + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + }, + }); +}; + +/** + * 规则功能测试 + * @param params + */ +export const handleTest = (params) => { + return defHttp.get({ url: Api.test, params }, { isTransformResponse: false }); +}; + +/** + * 保存 + * @param params + */ +export const saveFillRule = (params) => { + return defHttp.post({ url: Api.save, params }); +}; + +/** + * 更新 + * @param params + */ +export const updateFillRule = (params) => { + return defHttp.put({ url: Api.edit, params }); +}; diff --git a/src/views/system/fillRule/fill.rule.data.ts b/src/views/system/fillRule/fill.rule.data.ts new file mode 100644 index 0000000..05676d6 --- /dev/null +++ b/src/views/system/fillRule/fill.rule.data.ts @@ -0,0 +1,112 @@ +import { BasicColumn, FormSchema } from '/@/components/Table'; +import { duplicateCheck } from '/@/views/system/user/user.api'; + +export const columns: BasicColumn[] = [ + { + title: '规则名称', + dataIndex: 'ruleName', + width: 200, + align: 'center', + }, + { + title: '规则编码', + dataIndex: 'ruleCode', + width: 200, + align: 'center', + }, + { + title: '规则实现类', + dataIndex: 'ruleClass', + width: 300, + align: 'center', + }, + { + title: '规则参数', + dataIndex: 'ruleParams', + width: 200, + align: 'center', + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'ruleName', + label: '规则名称', + component: 'Input', + colProps: { span: 6 }, + }, + { + field: 'ruleCode', + label: '规则编码', + component: 'Input', + colProps: { span: 6 }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + field: 'ruleName', + label: '规则名称', + component: 'Input', + required: true, + colProps: { span: 24 }, + }, + { + field: 'ruleCode', + label: '规则编码', + component: 'Input', + colProps: { span: 24 }, + dynamicDisabled: ({ values }) => { + return !!values.id; + }, + dynamicRules: ({ model }) => { + return [ + { + required: true, + validator: (_, value) => { + return new Promise((resolve, reject) => { + if (!value) { + return reject('请输入规则编码!'); + } + let params = { + tableName: 'sys_fill_rule', + fieldName: 'rule_code', + fieldVal: value, + dataId: model.id, + }; + duplicateCheck(params) + .then((res) => { + res.success ? resolve() : reject('规则编码已存在!'); + }) + .catch((err) => { + reject(err.message || '校验失败'); + }); + }); + }, + }, + ]; + }, + }, + { + field: 'ruleClass', + label: '规则实现类', + component: 'Input', + required: true, + colProps: { span: 24 }, + }, + { + field: 'ruleParams', + label: '规则参数', + colProps: { span: 24 }, + component: 'JAddInput', + componentProps: { + min: 0, + }, + }, +]; diff --git a/src/views/system/fillRule/index.vue b/src/views/system/fillRule/index.vue new file mode 100644 index 0000000..93d5e1c --- /dev/null +++ b/src/views/system/fillRule/index.vue @@ -0,0 +1,146 @@ + + + diff --git a/src/views/system/loginmini/MiniCodelogin.vue b/src/views/system/loginmini/MiniCodelogin.vue new file mode 100644 index 0000000..85e6c4d --- /dev/null +++ b/src/views/system/loginmini/MiniCodelogin.vue @@ -0,0 +1,165 @@ + + + + diff --git a/src/views/system/loginmini/MiniForgotpad.vue b/src/views/system/loginmini/MiniForgotpad.vue new file mode 100644 index 0000000..353c9ec --- /dev/null +++ b/src/views/system/loginmini/MiniForgotpad.vue @@ -0,0 +1,282 @@ + + + diff --git a/src/views/system/loginmini/MiniLogin.vue b/src/views/system/loginmini/MiniLogin.vue new file mode 100644 index 0000000..1b5a412 --- /dev/null +++ b/src/views/system/loginmini/MiniLogin.vue @@ -0,0 +1,557 @@ + + + + + + diff --git a/src/views/system/loginmini/MiniRegister.vue b/src/views/system/loginmini/MiniRegister.vue new file mode 100644 index 0000000..45eddc8 --- /dev/null +++ b/src/views/system/loginmini/MiniRegister.vue @@ -0,0 +1,266 @@ + + + + diff --git a/src/views/system/loginmini/OAuth2Login.vue b/src/views/system/loginmini/OAuth2Login.vue new file mode 100644 index 0000000..0e6c74d --- /dev/null +++ b/src/views/system/loginmini/OAuth2Login.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/views/system/menu/DataRuleList.vue b/src/views/system/menu/DataRuleList.vue new file mode 100644 index 0000000..9ccc1a4 --- /dev/null +++ b/src/views/system/menu/DataRuleList.vue @@ -0,0 +1,122 @@ + + diff --git a/src/views/system/menu/DataRuleModal.vue b/src/views/system/menu/DataRuleModal.vue new file mode 100644 index 0000000..1daa5a8 --- /dev/null +++ b/src/views/system/menu/DataRuleModal.vue @@ -0,0 +1,54 @@ + + diff --git a/src/views/system/menu/MenuDrawer.vue b/src/views/system/menu/MenuDrawer.vue new file mode 100644 index 0000000..2b067e9 --- /dev/null +++ b/src/views/system/menu/MenuDrawer.vue @@ -0,0 +1,112 @@ + + diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue new file mode 100644 index 0000000..c83a432 --- /dev/null +++ b/src/views/system/menu/index.vue @@ -0,0 +1,201 @@ + + diff --git a/src/views/system/menu/menu.api.ts b/src/views/system/menu/menu.api.ts new file mode 100644 index 0000000..0daec11 --- /dev/null +++ b/src/views/system/menu/menu.api.ts @@ -0,0 +1,119 @@ +import { defHttp } from '/@/utils/http/axios'; +import { Modal } from 'ant-design-vue'; + +enum Api { + list = '/sys/permission/list', + save = '/sys/permission/add', + edit = '/sys/permission/edit', + delete = '/sys/permission/delete', + deleteBatch = '/sys/permission/deleteBatch', + ruleList = '/sys/permission/queryPermissionRule', + ruleSave = '/sys/permission/addPermissionRule', + ruleEdit = '/sys/permission/editPermissionRule', + ruleDelete = '/sys/permission/deletePermissionRule', + checkPermDuplication = '/sys/permission/checkPermDuplication', +} + +/** + * 列表接口 + * @param params + */ +export const list = (params) => { + return defHttp.get({ url: Api.list, params }); +} + +/** + * 删除菜单 + */ +export const deleteMenu = (params, handleSuccess) => { + return defHttp.delete({ url: Api.delete, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; +/** + * 批量删除菜单 + * @param params + */ +export const batchDeleteMenu = (params, handleSuccess) => { + Modal.confirm({ + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + }, + }); +}; +/** + * 保存或者更新菜单 + * @param params + */ +export const saveOrUpdateMenu = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, params }); +}; +/** + * 菜单数据权限列表接口 + * @param params + */ +export const dataRuleList = (params) => defHttp.get({ url: Api.ruleList, params }); +/** + * 保存或者更新数据规则 + * @param params + */ +export const saveOrUpdateRule = (params, isUpdate) => { + let url = isUpdate ? Api.ruleEdit : Api.ruleSave; + return defHttp.post({ url: url, params }); +}; + +/** + * 删除数据权限 + */ +export const deleteRule = (params, handleSuccess) => { + return defHttp.delete({ url: Api.ruleDelete, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; +/** + * 根据code获取字典数值 + * @param params + */ +export const ajaxGetDictItems = (params) => defHttp.get({ url: `/sys/dict/getDictItems/${params.code}` }); + +/** + * 唯一校验 + * @param params + */ +export const getCheckPermDuplication = (params) => defHttp.get({ url: Api.checkPermDuplication, params }, { isTransformResponse: false }); + +/** + * 校验菜单是否存在 + * @param model + * @param schema + * @param required + */ +export const checkPermDuplication=(model, schema, required?)=>{ + return [ + { + validator: (_, value) => { + if (!value && required) { + return Promise.reject(`请输入${schema.label}`); + } + return new Promise((resolve, reject) => { + getCheckPermDuplication({ + id: model.id, + url:model.url, + alwaysShow:model.alwaysShow + }).then((res) => { + res.success ? resolve() : reject(res.message || '校验失败'); + }).catch((err) => { + reject(err.message || '验证失败'); + }); + }); + }, + }, + ]; +} diff --git a/src/views/system/menu/menu.data.ts b/src/views/system/menu/menu.data.ts new file mode 100644 index 0000000..750ff30 --- /dev/null +++ b/src/views/system/menu/menu.data.ts @@ -0,0 +1,415 @@ +import { BasicColumn } from '/@/components/Table'; +import { FormSchema } from '/@/components/Table'; +import { h } from 'vue'; +import { Icon } from '/@/components/Icon'; +import { duplicateCheck } from '../user/user.api'; +import { ajaxGetDictItems ,checkPermDuplication } from './menu.api'; +import { render } from '/@/utils/common/renderUtils'; + +const isDir = (type) => type === 0; +const isMenu = (type) => type === 1; +const isButton = (type) => type === 2; + +// 定义可选择的组件类型 +export enum ComponentTypes { + Default = 'layouts/default/index', + IFrame = 'sys/iframe/FrameBlank', +} + +export const columns: BasicColumn[] = [ + { + title: '菜单名称', + dataIndex: 'name', + width: 200, + align: 'left', + }, + { + title: '菜单类型', + dataIndex: 'menuType', + width: 150, + customRender: ({ text }) => { + return render.renderDict(text, 'menu_type'); + }, + }, + { + title: '图标', + dataIndex: 'icon', + width: 50, + customRender: ({ record }) => { + return h(Icon, { icon: record.icon }); + }, + }, + { + title: '组件', + dataIndex: 'component', + align: 'left', + width: 150, + }, + { + title: '路径', + dataIndex: 'url', + align: 'left', + width: 150, + }, + { + title: '排序', + dataIndex: 'sortNo', + width: 50, + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + field: 'name', + label: '菜单名称', + component: 'Input', + colProps: { span: 8 }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + label: 'id', + field: 'id', + component: 'Input', + show: false, + }, + { + field: 'menuType', + label: '菜单类型', + component: 'RadioButtonGroup', + defaultValue: 0, + componentProps: ({ formActionType, formModel }) => { + return { + options: [ + { label: '一级菜单', value: 0 }, + { label: '子菜单', value: 1 }, + { label: '按钮/权限', value: 2 }, + ], + onChange: (e) => { + const { updateSchema, clearValidate } = formActionType; + const label = isButton(e) ? '按钮/权限' : '菜单名称'; + //清除校验 + clearValidate(); + updateSchema([ + { + field: 'name', + label: label, + }, + { + field: 'url', + required: !isButton(e), + }, + ]); + //update-begin---author:wangshuai ---date:20220729 for:[VUEN-1834]只有一级菜单,才默认值,子菜单的时候,清空------------ + if (isMenu(e) && !formModel.id && formModel.component=='layouts/RouteView') { + formModel.component = ''; + } + //update-end---author:wangshuai ---date:20220729 for:[VUEN-1834]只有一级菜单,才默认值,子菜单的时候,清空------------ + }, + }; + }, + }, + { + field: 'name', + label: '菜单名称', + component: 'Input', + required: true, + }, + { + field: 'parentId', + label: '上级菜单', + component: 'TreeSelect', + required: true, + componentProps: { + replaceFields: { + title: 'name', + key: 'id', + value: 'id', + }, + dropdownStyle: { + maxHeight: '50vh', + }, + getPopupContainer: (node) => node.parentNode, + }, + ifShow: ({ values }) => !isDir(values.menuType), + }, + { + field: 'url', + label: '访问路径', + component: 'Input', + required: true, + ifShow: ({ values }) => !(values.component === ComponentTypes.IFrame && values.internalOrExternal) && values.menuType !== 2, + //update-begin-author:zyf date:2022-11-02 for: 聚合路由允许路径重复 + dynamicRules: ({ model, schema }) => { + return checkPermDuplication(model, schema, true); + }, + //update-end-author:zyf date:2022-11-02 for: 聚合路由允许路径重复 + }, + { + field: 'component', + label: '前端组件', + component: 'Input', + componentProps: { + placeholder: '请输入前端组件', + }, + defaultValue:'layouts/RouteView', + required: true, + ifShow: ({ values }) => !isButton(values.menuType), + }, + { + field: 'componentName', + label: '组件名称', + component: 'Input', + componentProps: { + placeholder: '请输入组件名称', + }, + helpMessage: [ + '此处名称应和vue组件的name属性保持一致。', + '组件名称不能重复,主要用于路由缓存功能。', + '如果组件名称和vue组件的name属性不一致,则会导致路由缓存失效。', + '非必填,留空则会根据访问路径自动生成。', + ], + defaultValue: '', + ifShow: ({ values }) => !isButton(values.menuType), + }, + { + field: 'frameSrc', + label: 'Iframe地址', + component: 'Input', + rules: [ + { required: true, message: '请输入Iframe地址' }, + { type: 'url', message: '请输入正确的url地址' }, + ], + ifShow: ({ values }) => !isButton(values.menuType) && values.component === ComponentTypes.IFrame, + }, + { + field: 'redirect', + label: '默认跳转地址', + component: 'Input', + ifShow: ({ values }) => isDir(values.menuType), + }, + { + field: 'perms', + label: '授权标识', + component: 'Input', + ifShow: ({ values }) => isButton(values.menuType), + // dynamicRules: ({ model }) => { + // return [ + // { + // required: false, + // validator: (_, value) => { + // return new Promise((resolve, reject) => { + // let params = { + // tableName: 'sys_permission', + // fieldName: 'perms', + // fieldVal: value, + // dataId: model.id, + // }; + // duplicateCheck(params) + // .then((res) => { + // res.success ? resolve() : reject(res.message || '校验失败'); + // }) + // .catch((err) => { + // reject(err.message || '校验失败'); + // }); + // }); + // }, + // }, + // ]; + // }, + }, + { + field: 'permsType', + label: '授权策略', + component: 'RadioGroup', + defaultValue: '1', + helpMessage: ['可见/可访问(授权后可见/可访问)', '可编辑(未授权时禁用)'], + componentProps: { + options: [ + { label: '可见/可访问', value: '1' }, + { label: '可编辑', value: '2' }, + ], + }, + ifShow: ({ values }) => isButton(values.menuType), + }, + { + field: 'status', + label: '状态', + component: 'RadioGroup', + defaultValue: '1', + componentProps: { + options: [ + { label: '有效', value: '1' }, + { label: '无效', value: '0' }, + ], + }, + ifShow: ({ values }) => isButton(values.menuType), + }, + { + field: 'icon', + label: '菜单图标', + component: 'IconPicker', + ifShow: ({ values }) => !isButton(values.menuType), + }, + { + field: 'sortNo', + label: '排序', + component: 'InputNumber', + defaultValue: 1, + ifShow: ({ values }) => !isButton(values.menuType), + }, + { + field: 'route', + label: '是否路由菜单', + component: 'Switch', + defaultValue: true, + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + ifShow: ({ values }) => !isButton(values.menuType), + }, + { + field: 'hidden', + label: '隐藏路由', + component: 'Switch', + defaultValue: 0, + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + ifShow: ({ values }) => !isButton(values.menuType), + }, + { + field: 'hideTab', + label: '隐藏Tab', + component: 'Switch', + defaultValue: 0, + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + ifShow: ({ values }) => !isButton(values.menuType), + }, + { + field: 'keepAlive', + label: '是否缓存路由', + component: 'Switch', + defaultValue: false, + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + ifShow: ({ values }) => !isButton(values.menuType), + }, + { + field: 'alwaysShow', + label: '聚合路由', + component: 'Switch', + defaultValue: false, + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + ifShow: ({ values }) => !isButton(values.menuType), + }, + { + field: 'internalOrExternal', + label: '打开方式', + component: 'Switch', + defaultValue: false, + componentProps: { + checkedChildren: '外部', + unCheckedChildren: '内部', + }, + ifShow: ({ values }) => !isButton(values.menuType), + }, +]; + +export const dataRuleColumns: BasicColumn[] = [ + { + title: '规则名称', + dataIndex: 'ruleName', + width: 150, + }, + { + title: '规则字段', + dataIndex: 'ruleColumn', + width: 100, + }, + { + title: '规则值', + dataIndex: 'ruleValue', + width: 100, + }, +]; + +export const dataRuleSearchFormSchema: FormSchema[] = [ + { + field: 'ruleName', + label: '规则名称', + component: 'Input', + colProps: { span: 6 }, + }, + { + field: 'ruleValue', + label: '规则值', + component: 'Input', + colProps: { span: 6 }, + }, +]; + +export const dataRuleFormSchema: FormSchema[] = [ + { + label: 'id', + field: 'id', + component: 'Input', + show: false, + }, + { + field: 'ruleName', + label: '规则名称', + component: 'Input', + required: true, + }, + { + field: 'ruleColumn', + label: '规则字段', + component: 'Input', + ifShow: ({ values }) => { + return values.ruleConditions !== 'USE_SQL_RULES'; + }, + }, + { + field: 'ruleConditions', + label: '条件规则', + required: true, + component: 'ApiSelect', + componentProps: { + api: ajaxGetDictItems, + params: { code: 'rule_conditions' }, + labelField: 'text', + valueField: 'value', + getPopupContainer: (node) => document.body, + }, + }, + { + field: 'ruleValue', + label: '规则值', + component: 'Input', + required: true, + }, + { + field: 'status', + label: '状态', + component: 'RadioButtonGroup', + defaultValue: '1', + componentProps: { + options: [ + { label: '无效', value: '0' }, + { label: '有效', value: '1' }, + ], + }, + }, +]; diff --git a/src/views/system/message/components/SysMessageList.vue b/src/views/system/message/components/SysMessageList.vue new file mode 100644 index 0000000..7254aab --- /dev/null +++ b/src/views/system/message/components/SysMessageList.vue @@ -0,0 +1,165 @@ + + + + + diff --git a/src/views/system/message/components/SysMessageModal.vue b/src/views/system/message/components/SysMessageModal.vue new file mode 100644 index 0000000..7e511f0 --- /dev/null +++ b/src/views/system/message/components/SysMessageModal.vue @@ -0,0 +1,487 @@ + + + + + diff --git a/src/views/system/message/components/useSysMessage.ts b/src/views/system/message/components/useSysMessage.ts new file mode 100644 index 0000000..e7d7b49 --- /dev/null +++ b/src/views/system/message/components/useSysMessage.ts @@ -0,0 +1,229 @@ +import { ref, reactive } from 'vue'; +import { defHttp } from '/@/utils/http/axios'; +import { getDictItemsByCode } from '/@/utils/dict/index'; +import { useRouter, useRoute } from 'vue-router' +import { useAppStore } from '/@/store/modules/app'; +import { useTabs } from '/@/hooks/web/useTabs'; +import { useModal } from '/@/components/Modal'; + +/** + * 列表接口 + * @param params + */ +const queryMessageList = (params) => { + const url = '/sys/annountCement/vue3List'; + return defHttp.get({ url, params }); +}; + +/** + * 获取消息列表数据 + */ +export function useSysMessage() { + const rangeDateArray = getDictItemsByCode('rangeDate'); + console.log('+++++++++++++++++++++'); + console.log('rangeDateArray', rangeDateArray); + console.log('+++++++++++++++++++++'); + + const messageList = ref([]); + const pageNo = ref(1) + let pageSize = 10; + + const searchParams = reactive({ + fromUser: '', + rangeDateKey: '', + rangeDate: [], + starFlag: '' + }); + + + function getQueryParams() { + let { fromUser, rangeDateKey, rangeDate, starFlag } = searchParams; + let params = { + fromUser, + starFlag, + rangeDateKey, + beginDate: '', + endDate: '', + pageNo: pageNo.value, + pageSize + }; + if (rangeDateKey == 'zdy') { + params.beginDate = rangeDate[0]+' 00:00:00'; + params.endDate = rangeDate[1]+' 23:59:59'; + } + return params; + } + + // 数据是否加载完了 + const loadEndStatus = ref(false); + + //请求数据 + async function loadData() { + if(loadEndStatus.value === true){ + return; + } + let params = getQueryParams(); + const data = await queryMessageList(params); + console.log('获取结果', data); + if(!data || data.length<=0){ + loadEndStatus.value = true; + return; + } + if(data.lengthitem.value === busType); + if(!temp || temp.length==0){ + console.error('当前业务类型不识别', busType); + return; + } + let path = temp[0].text; + path = path.replace('{DETAIL_ID}', busId) + //固定参数 detailId 用于查询表单数据 + let query:any = { + detailId: busId + }; + // 额外参数处理 + if(msgAbstract){ + try { + let json = JSON.parse(msgAbstract); + Object.keys(json).map(k=>{ + query[k] = json[k] + }); + }catch (e) { + console.error('msgAbstract参数不是JSON格式', msgAbstract) + } + } + // 跳转路由 + appStore.setMessageHrefParams(query); + if(rt.path.indexOf(path)>=0){ + await closeTab(); + await router.replace({ path: path, query:{ time: new Date().getTime() } }); + }else{ + closeSameRoute(path) + await router.push({ path: path }); + } + } + + /** + * 从首页的消息通知跳转消息列表打开modal + * @param record + */ + async function goPageFromOuter(record){ + //没有定义业务类型 直接跳转我的消息页面 + emit('detail', record) + } + + return { + goPage + } +} diff --git a/src/views/system/message/manage/ManageDrawer.vue b/src/views/system/message/manage/ManageDrawer.vue new file mode 100644 index 0000000..407888c --- /dev/null +++ b/src/views/system/message/manage/ManageDrawer.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/views/system/message/manage/index.less b/src/views/system/message/manage/index.less new file mode 100644 index 0000000..63b7bd0 --- /dev/null +++ b/src/views/system/message/manage/index.less @@ -0,0 +1,5 @@ +//noinspection LessUnresolvedVariable +@prefix-cls: ~'@{namespace}-message-manage'; + +.@{prefix-cls} { +} diff --git a/src/views/system/message/manage/index.vue b/src/views/system/message/manage/index.vue new file mode 100644 index 0000000..2602be1 --- /dev/null +++ b/src/views/system/message/manage/index.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/views/system/message/manage/manage.api.ts b/src/views/system/message/manage/manage.api.ts new file mode 100644 index 0000000..b83d6c2 --- /dev/null +++ b/src/views/system/message/manage/manage.api.ts @@ -0,0 +1,52 @@ +import { unref } from 'vue'; +import { defHttp } from '/@/utils/http/axios'; +import { useMessage } from '/@/hooks/web/useMessage'; + +const { createConfirm } = useMessage(); + +export enum Api { + list = '/sys/message/sysMessage/list', + delete = '/sys/message/sysMessage/delete', + deleteBatch = '/sys/message/sysMessage/deleteBatch', + exportXls = 'sys/message/sysMessage/exportXls', + importXls = 'sys/message/sysMessage/importExcel', + save = '/sys/message/sysMessage/add', + edit = '/sys/message/sysMessage/edit', +} + +export const list = (params) => defHttp.get({ url: Api.list, params }); + +/** + * 批量删除 + * @param params + * @param confirm + */ +export const deleteBatch = (params, confirm = false) => { + return new Promise((resolve, reject) => { + const doDelete = () => { + resolve(defHttp.delete({ url: Api.deleteBatch, params }, { joinParamsToUrl: true })); + }; + if (confirm) { + createConfirm({ + iconType: 'warning', + title: '删除', + content: '确定要删除吗?', + onOk: () => doDelete(), + onCancel: () => reject(), + }); + } else { + doDelete(); + } + }); +}; + +/** + * 保存或者更改消息模板 + */ +export const saveOrUpdate = (params, isUpdate) => { + if (unref(isUpdate)) { + return defHttp.put({ url: Api.edit, params }); + } else { + return defHttp.post({ url: Api.save, params }); + } +}; diff --git a/src/views/system/message/manage/manage.data.ts b/src/views/system/message/manage/manage.data.ts new file mode 100644 index 0000000..3806fda --- /dev/null +++ b/src/views/system/message/manage/manage.data.ts @@ -0,0 +1,134 @@ +import { BasicColumn, FormSchema } from '/@/components/Table'; + +export const columns: BasicColumn[] = [ + { + title: '消息标题', + dataIndex: 'esTitle', + width: 140, + }, + { + title: '发送内容', + dataIndex: 'esContent', + width: 200, + // slots: { customRender: 'esContent' }, + }, + { + title: '接收人', + dataIndex: 'esReceiver', + width: 140, + }, + { + title: '发送次数', + dataIndex: 'esSendNum', + width: 120, + }, + { + title: '发送状态', + dataIndex: 'esSendStatus_dictText', + width: 120, + }, + { + title: '发送时间', + dataIndex: 'esSendTime', + width: 140, + }, + { + title: '发送方式', + dataIndex: 'esType_dictText', + width: 120, + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + label: '消息标题', + field: 'esTitle', + component: 'Input', + }, + { + label: '发送状态', + field: 'esSendStatus', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'msgSendStatus', + }, + }, + { + label: '发送方式', + field: 'esType', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'messageType', + }, + }, +]; + +export const formSchemas: FormSchema[] = [ + { + label: 'ID', + field: 'id', + component: 'Input', + show: false, + }, + { + label: '消息标题', + field: 'esTitle', + component: 'Input', + componentProps: { readOnly: true }, + }, + { + label: '发送内容', + field: 'esContent', + component: 'InputTextArea', + componentProps: { readOnly: true }, + }, + { + label: '发送参数', + field: 'esParam', + component: 'Input', + componentProps: { readOnly: true }, + }, + + { + label: '接收人', + field: 'esReceiver', + component: 'Input', + componentProps: { readOnly: true }, + }, + { + label: '发送方式', + field: 'esType', + component: 'JDictSelectTag', + componentProps: { disabled: true, dictCode: 'messageType' }, + }, + { + label: '发送时间', + field: 'esSendTime', + component: 'Input', + componentProps: { readOnly: true }, + }, + { + label: '发送状态', + field: 'esSendStatus', + component: 'JDictSelectTag', + componentProps: { disabled: true, dictCode: 'msgSendStatus' }, + }, + { + label: '发送次数', + field: 'esSendNum', + component: 'Input', + componentProps: { readOnly: true }, + }, + { + label: '发送失败原因', + field: 'esResult', + component: 'Input', + componentProps: { readOnly: true }, + }, + { + label: '备注', + field: 'remark', + component: 'InputTextArea', + componentProps: { readOnly: true }, + }, +]; diff --git a/src/views/system/message/template/TemplateModal.vue b/src/views/system/message/template/TemplateModal.vue new file mode 100644 index 0000000..bc2885a --- /dev/null +++ b/src/views/system/message/template/TemplateModal.vue @@ -0,0 +1,51 @@ + + + diff --git a/src/views/system/message/template/TemplateTestModal.vue b/src/views/system/message/template/TemplateTestModal.vue new file mode 100644 index 0000000..eeea2f5 --- /dev/null +++ b/src/views/system/message/template/TemplateTestModal.vue @@ -0,0 +1,40 @@ + + + diff --git a/src/views/system/message/template/index.less b/src/views/system/message/template/index.less new file mode 100644 index 0000000..15e8d49 --- /dev/null +++ b/src/views/system/message/template/index.less @@ -0,0 +1,5 @@ +//noinspection LessUnresolvedVariable +@prefix-cls: ~'@{namespace}-message-template'; + +.@{prefix-cls} { +} diff --git a/src/views/system/message/template/index.vue b/src/views/system/message/template/index.vue new file mode 100644 index 0000000..d1b5945 --- /dev/null +++ b/src/views/system/message/template/index.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/src/views/system/message/template/template.api.ts b/src/views/system/message/template/template.api.ts new file mode 100644 index 0000000..fe4f03c --- /dev/null +++ b/src/views/system/message/template/template.api.ts @@ -0,0 +1,60 @@ +import { unref } from 'vue'; +import { defHttp } from '/@/utils/http/axios'; +import { useMessage } from '/@/hooks/web/useMessage'; + +const { createConfirm } = useMessage(); + +export enum Api { + list = '/sys/message/sysMessageTemplate/list', + delete = '/sys/message/sysMessageTemplate/delete', + deleteBatch = '/sys/message/sysMessageTemplate/deleteBatch', + exportXls = 'sys/message/sysMessageTemplate/exportXls', + importXls = 'sys/message/sysMessageTemplate/importExcel', + save = '/sys/message/sysMessageTemplate/add', + edit = '/sys/message/sysMessageTemplate/edit', + // 发送测试 + send = '/sys/message/sysMessageTemplate/sendMsg', +} + +export const list = (params) => defHttp.get({ url: Api.list, params }); + +/** + * 批量删除 + * @param params + * @param confirm + */ +export const deleteBatch = (params, confirm = false) => { + return new Promise((resolve, reject) => { + const doDelete = () => { + resolve(defHttp.delete({ url: Api.deleteBatch, params }, { joinParamsToUrl: true })); + }; + if (confirm) { + createConfirm({ + iconType: 'warning', + title: '删除', + content: '确定要删除吗?', + onOk: () => doDelete(), + onCancel: () => reject(), + }); + } else { + doDelete(); + } + }); +}; + +/** + * 保存或者更改消息模板 + */ +export const saveOrUpdate = (params, isUpdate) => { + if (unref(isUpdate)) { + return defHttp.put({ url: Api.edit, params }); + } else { + return defHttp.post({ url: Api.save, params }); + } +}; + +/** + * 发送消息测试 + * @param params + */ +export const sendMessageTest = (params) => defHttp.post({ url: Api.send, params }); diff --git a/src/views/system/message/template/template.data.ts b/src/views/system/message/template/template.data.ts new file mode 100644 index 0000000..005a2db --- /dev/null +++ b/src/views/system/message/template/template.data.ts @@ -0,0 +1,185 @@ +import { BasicColumn, FormSchema } from '/@/components/Table'; +import { rules } from '/@/utils/helper/validator'; +import { filterDictTextByCache } from '/@/utils/dict/JDictSelectUtil'; + +export const columns: BasicColumn[] = [ + { + title: '模板标题', + dataIndex: 'templateName', + width: 80, + }, + { + title: '模板编码', + dataIndex: 'templateCode', + width: 100, + }, + { + title: '通知模板', + dataIndex: 'templateContent', + width: 150, + }, + { + title: '模板类型', + dataIndex: 'templateType', + width: 100, + customRender: ({ text }) => filterDictTextByCache('msgType', text), + }, + { + title: '是否应用', + dataIndex: 'useStatus', + width: 90, + customRender: function ({ text }) { + if (text == '1') { + return '是'; + } else { + return '否'; + } + }, + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + label: '模板标题', + field: 'templateName', + component: 'Input', + }, + { + label: '模板编码', + field: 'templateCode', + component: 'Input', + }, + { + label: '模板类型', + field: 'templateType', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'msgType', + }, + }, +]; + +export const formSchemas: FormSchema[] = [ + { + label: 'ID', + field: 'id', + component: 'Input', + show: false, + }, + { + label: '模板标题', + field: 'templateName', + component: 'Input', + required: true, + }, + { + label: '模板编码', + field: 'templateCode', + component: 'Input', + dynamicRules: ({ model, schema }) => { + return [ ...rules.duplicateCheckRule('sys_sms_template', 'template_code', model, schema, true)]; + }, + // 编辑模式下不可修改编码 + dynamicDisabled: (params) => !!params.values.id, + }, + { + label: '模板类型', + field: 'templateType', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'msgType', + placeholder: '请选择模板类型', + }, + required: true, + }, + { + label: '是否应用', + field: 'useStatus', + component: 'JSwitch', + componentProps: { + options: ['1', '0'], + }, + }, + { + label: '模板内容', + field: 'templateContent', + component: 'InputTextArea', + componentProps: { + autoSize: { + minRows: 8, + maxRows: 8, + }, + }, + ifShow: ({ values }) => { + return !['2', '4', '5'].includes(values.templateType); + }, + }, + + { + label: '模板内容', + field: 'templateContent', + component: 'JEditor', + ifShow: ({ values }) => { + return ['2', '4'].includes(values.templateType); + }, + }, + { + label: '模板内容', + field: 'templateContent', + component: 'JMarkdownEditor', + ifShow: ({ values }) => { + return ['5'].includes(values.templateType); + }, + }, +]; + +export const sendTestFormSchemas: FormSchema[] = [ + { + label: '模板编码', + field: 'templateCode', + component: 'Input', + show: false, + }, + { + label: '模板标题', + field: 'templateName', + component: 'Input', + componentProps: { disabled: true }, + }, + { + label: '模板内容', + field: 'templateContent', + component: 'InputTextArea', + componentProps: { disabled: true, rows: 5 }, + }, + { + label: '测试数据', + field: 'testData', + component: 'InputTextArea', + required: true, + helpMessage: 'JSON数据', + defaultValue: '{}', + componentProps: { + placeholder: '请输入JSON格式测试数据', + rows: 5, + }, + }, + { + label: '消息类型', + field: 'msgType', + component: 'JDictSelectTag', + required: true, + defaultValue:'system', + componentProps: { dictCode: 'messageType',type:'radio' }, + }, + { + label: '消息接收方', + field: 'receiver', + required: true, + component: 'JSelectUser', + componentProps: { + labelKey: 'username', + rowKey: 'username', + }, + }, +]; diff --git a/src/views/system/notice/DetailModal.vue b/src/views/system/notice/DetailModal.vue new file mode 100644 index 0000000..7497e73 --- /dev/null +++ b/src/views/system/notice/DetailModal.vue @@ -0,0 +1,24 @@ +