From 7f0964c62764b2c861501f18e76e54dd6a706343 Mon Sep 17 00:00:00 2001 From: zhouwentao <1577701412@qq.com> Date: Sun, 10 Mar 2024 21:57:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 19 + .env | 22 + .env.development | 23 + .env.production | 34 + .eslintignore | 15 + .eslintrc.js | 78 + .gitignore | 34 + .gitpod.yml | 6 + .prettierignore | 9 + .stylelintignore | 3 + .yarnclean | 48 + Dockerfile | 30 + LICENSE | 35 + README.md | 448 + 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 | 82 + build/vite/plugin/mock.ts | 19 + build/vite/plugin/pwa.ts | 34 + 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 | 303 + pnpm-lock.yaml | 14599 ++++++++++++++++ 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 | 372 + .../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 | 259 + .../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 | 160 + .../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 | 169 + .../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 | 358 + .../src/jeecg/components/JUpload/JUpload.vue | 437 + .../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 | 288 + .../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 | 72 + .../components/JVxeSelectDictSearchCell.ts | 288 + .../src/components/JVxeUserSelectCell.vue | 101 + .../JVxeCustom/src/hooks/useFileCell.ts | 97 + 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 | 549 + src/components/Table/src/componentMap.ts | 26 + .../src/components/CustomSelectHeader.vue | 50 + .../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 | 118 + .../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 | 331 + .../Table/src/hooks/useColumnsCache.ts | 137 + .../Table/src/hooks/useCustomRow.ts | 94 + .../Table/src/hooks/useCustomSelection.tsx | 491 + .../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 | 127 + 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 | 62 + .../Table/src/hooks/useTableForm.ts | 51 + .../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 | 464 + 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 | 108 + src/components/chart/ChartCard.vue | 110 + src/components/chart/Gauge.vue | 101 + src/components/chart/HeadInfo.vue | 75 + src/components/chart/Line.vue | 81 + src/components/chart/LineMulti.vue | 110 + 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 | 80 + .../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 | 257 + .../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 | 864 + .../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 | 116 + 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 | 103 + 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 | 158 + 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 | 285 + 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 | 385 + .../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 | 416 + .../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 | 194 + 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 + .../super/drag/page/components/CardList.vue | 473 + .../drag/page/components/DragPageModal.vue | 187 + .../super/drag/page/components/PageModal.vue | 71 + .../drag/page/components/PasswordModal.vue | 105 + src/views/super/drag/page/page.api.ts | 74 + src/views/super/drag/page/page.data.ts | 66 + src/views/super/drag/page/pageList.vue | 176 + src/views/super/drag/page/useExportImage.ts | 65 + src/views/super/drag/page/view.vue | 158 + 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 | 13 + src/views/system/address/index.vue | 89 + 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 | 296 + 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 | 128 + .../depart/components/DepartLeftTree.vue | 332 + .../depart/components/DepartRuleTab.vue | 170 + src/views/system/depart/depart.api.ts | 122 + src/views/system/depart/depart.data.ts | 90 + src/views/system/depart/index.less | 14 + src/views/system/depart/index.vue | 63 + .../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 | 120 + src/views/system/position/position.api.ts | 79 + src/views/system/position/position.data.ts | 71 + 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 + src/views/yx/MyIndex.vue | 13 + src/views/yx/yxArticle/YxArticle.api.ts | 73 + src/views/yx/yxArticle/YxArticle.data.ts | 106 + src/views/yx/yxArticle/YxArticleList.vue | 216 + .../yx/yxArticle/components/YxArticleForm.vue | 213 + .../yxArticle/components/YxArticleModal.vue | 75 + .../YxFirstLevelDisciplines.api.ts | 64 + .../YxFirstLevelDisciplines.data.ts | 79 + .../YxFirstLevelDisciplinesList.vue | 191 + .../YxFirstLevelDisciplines_menu_insert.sql | 26 + .../YxFirstLevelDisciplinesForm.vue | 70 + .../YxFirstLevelDisciplinesModal.vue | 66 + .../YxHistoryMajorEnroll.api.ts | 64 + .../YxHistoryMajorEnroll.data.ts | 147 + .../YxHistoryMajorEnrollList.vue | 173 + .../components/YxHistoryMajorEnrollForm.vue | 70 + .../components/YxHistoryMajorEnrollModal.vue | 66 + src/views/yx/yxMajor/YxMajor.api.ts | 64 + src/views/yx/yxMajor/YxMajor.data.ts | 148 + src/views/yx/yxMajor/YxMajorList.vue | 173 + .../yx/yxMajor/components/YxMajorForm.vue | 70 + .../yx/yxMajor/components/YxMajorModal.vue | 66 + src/views/yx/yxOrder/YxOrder.api.ts | 64 + src/views/yx/yxOrder/YxOrder.data.ts | 91 + src/views/yx/yxOrder/YxOrderList.vue | 173 + .../yx/yxOrder/components/YxOrderForm.vue | 70 + .../yx/yxOrder/components/YxOrderModal.vue | 66 + src/views/yx/yxSchool/YxSchool.api.ts | 64 + src/views/yx/yxSchool/YxSchool.data.ts | 307 + src/views/yx/yxSchool/YxSchoolList.vue | 173 + .../yx/yxSchool/components/YxSchoolForm.vue | 70 + .../yx/yxSchool/components/YxSchoolModal.vue | 66 + .../yx/yxSchoolMajor/YxSchoolMajor.api.ts | 64 + .../yx/yxSchoolMajor/YxSchoolMajor.data.ts | 139 + .../yx/yxSchoolMajor/YxSchoolMajorList.vue | 175 + .../components/YxSchoolMajorForm.vue | 70 + .../components/YxSchoolMajorModal.vue | 66 + src/views/yx/yxVipCard/YxVipCard.api.ts | 64 + src/views/yx/yxVipCard/YxVipCard.data.ts | 64 + src/views/yx/yxVipCard/YxVipCardList.vue | 173 + .../yx/yxVipCard/components/YxVipCardForm.vue | 70 + .../yxVipCard/components/YxVipCardModal.vue | 66 + src/views/yx/yxVipSku/YxVipSku.api.ts | 64 + src/views/yx/yxVipSku/YxVipSku.data.ts | 87 + src/views/yx/yxVipSku/YxVipSkuList.vue | 173 + .../yx/yxVipSku/components/YxVipSkuForm.vue | 70 + .../yx/yxVipSku/components/YxVipSkuModal.vue | 66 + star.bat | 1 + 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 + vite.config.ts | 112 + windi.config.ts | 74 + 1386 files changed, 161375 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/CustomSelectHeader.vue 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/useCustomSelection.tsx 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/super/drag/page/components/CardList.vue create mode 100644 src/views/super/drag/page/components/DragPageModal.vue create mode 100644 src/views/super/drag/page/components/PageModal.vue create mode 100644 src/views/super/drag/page/components/PasswordModal.vue create mode 100644 src/views/super/drag/page/page.api.ts create mode 100644 src/views/super/drag/page/page.data.ts create mode 100644 src/views/super/drag/page/pageList.vue create mode 100644 src/views/super/drag/page/useExportImage.ts create mode 100644 src/views/super/drag/page/view.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 src/views/yx/MyIndex.vue create mode 100644 src/views/yx/yxArticle/YxArticle.api.ts create mode 100644 src/views/yx/yxArticle/YxArticle.data.ts create mode 100644 src/views/yx/yxArticle/YxArticleList.vue create mode 100644 src/views/yx/yxArticle/components/YxArticleForm.vue create mode 100644 src/views/yx/yxArticle/components/YxArticleModal.vue create mode 100644 src/views/yx/yxFirstLevelDisciplines/YxFirstLevelDisciplines.api.ts create mode 100644 src/views/yx/yxFirstLevelDisciplines/YxFirstLevelDisciplines.data.ts create mode 100644 src/views/yx/yxFirstLevelDisciplines/YxFirstLevelDisciplinesList.vue create mode 100644 src/views/yx/yxFirstLevelDisciplines/YxFirstLevelDisciplines_menu_insert.sql create mode 100644 src/views/yx/yxFirstLevelDisciplines/components/YxFirstLevelDisciplinesForm.vue create mode 100644 src/views/yx/yxFirstLevelDisciplines/components/YxFirstLevelDisciplinesModal.vue create mode 100644 src/views/yx/yxHistoryMajorEnroll/YxHistoryMajorEnroll.api.ts create mode 100644 src/views/yx/yxHistoryMajorEnroll/YxHistoryMajorEnroll.data.ts create mode 100644 src/views/yx/yxHistoryMajorEnroll/YxHistoryMajorEnrollList.vue create mode 100644 src/views/yx/yxHistoryMajorEnroll/components/YxHistoryMajorEnrollForm.vue create mode 100644 src/views/yx/yxHistoryMajorEnroll/components/YxHistoryMajorEnrollModal.vue create mode 100644 src/views/yx/yxMajor/YxMajor.api.ts create mode 100644 src/views/yx/yxMajor/YxMajor.data.ts create mode 100644 src/views/yx/yxMajor/YxMajorList.vue create mode 100644 src/views/yx/yxMajor/components/YxMajorForm.vue create mode 100644 src/views/yx/yxMajor/components/YxMajorModal.vue create mode 100644 src/views/yx/yxOrder/YxOrder.api.ts create mode 100644 src/views/yx/yxOrder/YxOrder.data.ts create mode 100644 src/views/yx/yxOrder/YxOrderList.vue create mode 100644 src/views/yx/yxOrder/components/YxOrderForm.vue create mode 100644 src/views/yx/yxOrder/components/YxOrderModal.vue create mode 100644 src/views/yx/yxSchool/YxSchool.api.ts create mode 100644 src/views/yx/yxSchool/YxSchool.data.ts create mode 100644 src/views/yx/yxSchool/YxSchoolList.vue create mode 100644 src/views/yx/yxSchool/components/YxSchoolForm.vue create mode 100644 src/views/yx/yxSchool/components/YxSchoolModal.vue create mode 100644 src/views/yx/yxSchoolMajor/YxSchoolMajor.api.ts create mode 100644 src/views/yx/yxSchoolMajor/YxSchoolMajor.data.ts create mode 100644 src/views/yx/yxSchoolMajor/YxSchoolMajorList.vue create mode 100644 src/views/yx/yxSchoolMajor/components/YxSchoolMajorForm.vue create mode 100644 src/views/yx/yxSchoolMajor/components/YxSchoolMajorModal.vue create mode 100644 src/views/yx/yxVipCard/YxVipCard.api.ts create mode 100644 src/views/yx/yxVipCard/YxVipCard.data.ts create mode 100644 src/views/yx/yxVipCard/YxVipCardList.vue create mode 100644 src/views/yx/yxVipCard/components/YxVipCardForm.vue create mode 100644 src/views/yx/yxVipCard/components/YxVipCardModal.vue create mode 100644 src/views/yx/yxVipSku/YxVipSku.api.ts create mode 100644 src/views/yx/yxVipSku/YxVipSku.data.ts create mode 100644 src/views/yx/yxVipSku/YxVipSkuList.vue create mode 100644 src/views/yx/yxVipSku/components/YxVipSkuForm.vue create mode 100644 src/views/yx/yxVipSku/components/YxVipSkuModal.vue create mode 100644 star.bat 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 vite.config.ts create mode 100644 windi.config.ts 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..77cc403 --- /dev/null +++ b/.env @@ -0,0 +1,22 @@ +# port +VITE_PORT = 3100 + +# 网站标题 +VITE_GLOB_APP_TITLE = 后台管理系统 + +# 简称,用于配置文件名字 不要出现空格、数字开头等特殊字符 +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..d7894be --- /dev/null +++ b/.env.development @@ -0,0 +1,23 @@ +# 是否打开mock +VITE_USE_MOCK = true + +# 发布路径 +VITE_PUBLIC_PATH = / + +# 跨域代理,您可以配置多个 ,请注意,没有换行符 +VITE_PROXY = [["/jeecgboot","http://localhost:8080/jeecg-boot"],["/upload","http://localhost:3300/upload"]] + +# 控制台不输出 +VITE_DROP_CONSOLE = false + +#后台接口父地址(必填) +VITE_GLOB_API_URL=/jeecgboot + +#后台接口全路径地址(必填) +VITE_GLOB_DOMAIN_URL=http://localhost:8080/jeecg-boot + +# 接口前缀 +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..de33204 --- /dev/null +++ b/.env.production @@ -0,0 +1,34 @@ +# 是否启用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..ea32b1c --- /dev/null +++ b/LICENSE @@ -0,0 +1,35 @@ +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底层依赖的非开源功能:online lib依赖、仪表盘lib依赖等,统一采用LGPL开源协议(不二次改造、不拆分出jeecgboot之外使用,就不产生侵权) + 3.不得基于该平台软件的基础,修改包装成一个与JeecgBoot平台软件功能类似的产品进行发布、销售,或与JeecgBoot参与同类软件产品市场的竞争。 + 违反此条款属于侵权行为,须赔偿侵权经济损失,同时立即停止著作权侵权行为。 + + 总结:在遵循Apache开源协议和开源协议补充条款下,允许商用使用,不会造成侵权行为! + 解释权归:http://www.jeecg.com diff --git a/README.md b/README.md new file mode 100644 index 0000000..9f5dd48 --- /dev/null +++ b/README.md @@ -0,0 +1,448 @@ +JEECG BOOT 低代码开发平台(Vue3前端) +=============== +当前最新版本: 3.5.3(发布时间:2023-07-24) + +[![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.3-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后台项目(支持微服务) | + +## 开发环境搭建 + +- [前端开发环境准备](https://help.jeecg.com/setup/dev.html) +- [前端项目快速启动](https://help.jeecg.com/setup/startup.html) +- [通过IDEA启动项目](https://help.jeecg.com/java/setup/idea/startup.html) + +## 技术文档 + +- 官方文档:[http://help.jeecg.com](http://help.jeecg.com) +- 官方网站: [http://www.jeecg.com](http://www.jeecg.com) +- 快速入门:[快速入门](http://jeecg.com/doc/quickstart) | [常见问题](http://help.jeecg.com/qa.html) | [视频教程](https://www.bilibili.com/video/BV1V34y187Y9 "入门视频") | [ 代码生成](http://help.jeecg.com/vue3/codegen/online.html) +- QQ交流群:⑦791696430、683903138 +- 在线演示 : [Vue3演示](http://boot3.jeecg.com) | [Vue2演示](http://boot3.jeecg.com) | [APP演示](http://jeecg.com/appIndex) +> 演示系统的登录账号密码,请点击 [获取账号密码](http://jeecg.com/doc/demo) 获取 + + +## 安装与使用 + + + > 环境要求: 版本要求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..5362a89 --- /dev/null +++ b/build/vite/plugin/index.ts @@ -0,0 +1,82 @@ +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'; +//update-begin-author:liusq date:2023-06-06 for: [issues/555]开发环境,vscode断点调试,文件或行数对不上 +import vueSetupExtend from 'vite-plugin-vue-setup-extend-plus'; +//update-end-author:liusq date:2023-06-06 for: [issues/555]开发环境,vscode断点调试,文件或行数对不上 +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..a102cad --- /dev/null +++ b/build/vite/plugin/pwa.ts @@ -0,0 +1,34 @@ +/** + * Zero-config PWA for Vite + * https://github.com/antfu/vite-plugin-pwa + * vite-plugin-pwa是vite的一个官方插件,它的功能就是通过简单的配置将你的vite项目变成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..6c0aa17 --- /dev/null +++ b/package.json @@ -0,0 +1,303 @@ +{ + "name": "jeecgboot-vue3", + "version": "3.5.3", + "author": { + "name": "jeecg", + "email": "jeecgos@163.com", + "url": "https://github.com/jeecgboot/jeecgboot-vue3" + }, + "scripts": { + "bootstrap": "pnpm 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.5.3-beta3", + "@qiaoqiaoyun/drag-free": "^1.0.52", + "@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.20", + "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.47", + "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.2.3", + "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-plus": "^0.1.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..cd1081a --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,14599 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + bin-wrapper: npm:bin-wrapper-china + rollup: ^2.72.0 + +dependencies: + '@ant-design/colors': + specifier: ^6.0.0 + version: 6.0.0 + '@ant-design/icons-vue': + specifier: ^6.1.0 + version: 6.1.0(vue@3.2.47) + '@iconify/iconify': + specifier: ^2.2.1 + version: 2.2.1 + '@jeecg/online': + specifier: 3.5.3-beta3 + version: 3.5.3-beta3 + '@logicflow/core': + specifier: ^1.1.13 + version: 1.1.13 + '@logicflow/extension': + specifier: ^1.1.13 + version: 1.1.13 + '@qiaoqiaoyun/drag-free': + specifier: ^1.0.52 + version: 1.0.52(@aesoper/normal-utils@0.1.5)(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26)(@popperjs/core@2.11.8)(gradient-parser@1.0.2)(tinycolor2@1.6.0) + '@vue/runtime-core': + specifier: ^3.2.33 + version: 3.2.33 + '@vue/shared': + specifier: ^3.2.33 + version: 3.2.33 + '@vueuse/core': + specifier: ^8.3.0 + version: 8.3.0(vue@3.2.47) + '@vueuse/shared': + specifier: ^8.3.0 + version: 8.3.0(vue@3.2.47) + '@zxcvbn-ts/core': + specifier: ^2.0.1 + version: 2.0.1 + ant-design-vue: + specifier: ^3.2.20 + version: 3.2.20(vue@3.2.47) + axios: + specifier: ^0.26.1 + version: 0.26.1(debug@4.3.4) + china-area-data: + specifier: ^5.0.1 + version: 5.0.1 + clipboard: + specifier: ^2.0.8 + version: 2.0.8 + codemirror: + specifier: ^5.65.3 + version: 5.65.3 + cron-parser: + specifier: ^3.5.0 + version: 3.5.0 + cropperjs: + specifier: ^1.5.12 + version: 1.5.12 + crypto-js: + specifier: ^4.1.1 + version: 4.1.1 + dayjs: + specifier: ^1.11.1 + version: 1.11.1 + dom-align: + specifier: ^1.12.2 + version: 1.12.2 + echarts: + specifier: ^5.3.2 + version: 5.3.2 + emoji-mart-vue-fast: + specifier: ^11.1.1 + version: 11.1.1(vue@3.2.47) + enquire.js: + specifier: ^2.1.6 + version: 2.1.6 + intro.js: + specifier: ^5.1.0 + version: 5.1.0 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + lodash.get: + specifier: ^4.4.2 + version: 4.4.2 + md5: + specifier: ^2.3.0 + version: 2.3.0 + mockjs: + specifier: ^1.1.0 + version: 1.1.0 + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + path-to-regexp: + specifier: ^6.2.0 + version: 6.2.0 + pinia: + specifier: 2.0.12 + version: 2.0.12(typescript@4.6.3)(vue@3.2.47) + pinyin-pro: + specifier: ^3.11.0 + version: 3.11.0 + print-js: + specifier: ^1.6.0 + version: 1.6.0 + qrcode: + specifier: ^1.5.0 + version: 1.5.0 + qrcodejs2: + specifier: 0.0.2 + version: 0.0.2 + qs: + specifier: ^6.10.3 + version: 6.10.3 + resize-observer-polyfill: + specifier: ^1.5.1 + version: 1.5.1 + showdown: + specifier: ^2.1.0 + version: 2.1.0 + sortablejs: + specifier: ^1.15.0 + version: 1.15.0 + tinymce: + specifier: ^5.10.3 + version: 5.10.3 + vditor: + specifier: ^3.8.13 + version: 3.8.13 + vue: + specifier: ^3.2.47 + version: 3.2.47 + vue-cropper: + specifier: ^0.5.6 + version: 0.5.6 + vue-cropperjs: + specifier: ^5.0.0 + version: 5.0.0(vue@3.2.47) + vue-i18n: + specifier: ^9.1.9 + version: 9.1.9(vue@3.2.47) + vue-infinite-scroll: + specifier: ^2.0.2 + version: 2.0.2 + vue-json-pretty: + specifier: ^2.0.6 + version: 2.0.6(vue@3.2.47) + vue-print-nb-jeecg: + specifier: ^1.0.12 + version: 1.0.12 + vue-router: + specifier: ^4.0.14 + version: 4.0.14(vue@3.2.47) + vue-types: + specifier: ^4.1.1 + version: 4.1.1(vue@3.2.47) + vuedraggable: + specifier: ^4.1.0 + version: 4.1.0(vue@3.2.47) + vxe-table: + specifier: 4.1.0 + version: 4.1.0(vue@3.2.47)(xe-utils@3.3.1) + vxe-table-plugin-antd: + specifier: 3.0.5 + version: 3.0.5(vxe-table@4.1.0) + xe-utils: + specifier: ^3.3.1 + version: 3.3.1 + xss: + specifier: ^1.0.13 + version: 1.0.13 + +devDependencies: + '@commitlint/cli': + specifier: ^16.2.3 + version: 16.2.3 + '@commitlint/config-conventional': + specifier: ^16.2.1 + version: 16.2.1 + '@iconify/json': + specifier: ^2.1.30 + version: 2.1.30 + '@purge-icons/generated': + specifier: ^0.8.1 + version: 0.8.1 + '@rys-fe/vite-plugin-theme': + specifier: ^0.8.6 + version: 0.8.6(vite@3.2.3) + '@types/codemirror': + specifier: ^5.60.5 + version: 5.60.5 + '@types/crypto-js': + specifier: ^4.1.1 + version: 4.1.1 + '@types/fs-extra': + specifier: ^9.0.13 + version: 9.0.13 + '@types/inquirer': + specifier: ^8.2.1 + version: 8.2.1 + '@types/intro.js': + specifier: ^3.0.2 + version: 3.0.2 + '@types/jest': + specifier: ^27.0.2 + version: 27.0.2 + '@types/lodash-es': + specifier: ^4.17.6 + version: 4.17.6 + '@types/mockjs': + specifier: ^1.0.6 + version: 1.0.6 + '@types/node': + specifier: ^17.0.25 + version: 17.0.25 + '@types/nprogress': + specifier: ^0.2.0 + version: 0.2.0 + '@types/pinyin': + specifier: ^2.10.0 + version: 2.10.0 + '@types/qrcode': + specifier: ^1.4.2 + version: 1.4.2 + '@types/qs': + specifier: ^6.9.7 + version: 6.9.7 + '@types/showdown': + specifier: ^1.9.4 + version: 1.9.4 + '@types/sortablejs': + specifier: ^1.10.7 + version: 1.10.7 + '@typescript-eslint/eslint-plugin': + specifier: ^5.20.0 + version: 5.20.0(@typescript-eslint/parser@5.20.0)(eslint@8.22.0)(typescript@4.6.3) + '@typescript-eslint/parser': + specifier: ^5.20.0 + version: 5.20.0(eslint@8.22.0)(typescript@4.6.3) + '@vitejs/plugin-legacy': + specifier: ^2.0.0 + version: 2.0.0(terser@5.29.1)(vite@3.2.3) + '@vitejs/plugin-vue': + specifier: ^3.0.1 + version: 3.0.1(vite@3.2.3)(vue@3.2.47) + '@vitejs/plugin-vue-jsx': + specifier: ^1.3.10 + version: 1.3.10 + '@vue/compiler-sfc': + specifier: ^3.2.33 + version: 3.2.33 + '@vue/test-utils': + specifier: ^2.0.0-rc.21 + version: 2.0.0-rc.21(vue@3.2.47) + autoprefixer: + specifier: ^10.4.4 + version: 10.4.4(postcss@8.4.12) + commitizen: + specifier: ^4.2.4 + version: 4.2.4(@types/node@17.0.25)(typescript@4.6.3) + conventional-changelog-cli: + specifier: ^2.2.2 + version: 2.2.2 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + cz-git: + specifier: ^1.3.9 + version: 1.3.9 + czg: + specifier: ^1.3.9 + version: 1.3.9 + dotenv: + specifier: ^16.0.0 + version: 16.0.0 + eslint: + specifier: ^8.22.0 + version: 8.22.0 + eslint-config-prettier: + specifier: ^8.6.0 + version: 8.6.0(eslint@8.22.0) + eslint-define-config: + specifier: ^1.14.0 + version: 1.14.0 + eslint-plugin-jest: + specifier: ^27.2.1 + version: 27.2.1(@typescript-eslint/eslint-plugin@5.20.0)(eslint@8.22.0)(jest@27.3.1)(typescript@4.6.3) + eslint-plugin-prettier: + specifier: ^4.2.1 + version: 4.2.1(eslint-config-prettier@8.6.0)(eslint@8.22.0)(prettier@2.6.2) + eslint-plugin-vue: + specifier: ^9.9.0 + version: 9.9.0(eslint@8.22.0) + esno: + specifier: ^0.14.1 + version: 0.14.1 + fs-extra: + specifier: ^10.1.0 + version: 10.1.0 + http-server: + specifier: ^14.0.0 + version: 14.0.0 + husky: + specifier: ^7.0.4 + version: 7.0.4 + inquirer: + specifier: ^8.2.2 + version: 8.2.2 + is-ci: + specifier: ^3.0.0 + version: 3.0.0 + jest: + specifier: ^27.3.1 + version: 27.3.1(ts-node@10.7.0) + less: + specifier: ^4.1.2 + version: 4.1.2 + lint-staged: + specifier: 12.3.7 + version: 12.3.7 + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + picocolors: + specifier: ^1.0.0 + version: 1.0.0 + postcss: + specifier: ^8.4.12 + version: 8.4.12 + postcss-html: + specifier: ^1.4.1 + version: 1.4.1 + postcss-less: + specifier: ^6.0.0 + version: 6.0.0(postcss@8.4.12) + prettier: + specifier: ^2.6.2 + version: 2.6.2 + pretty-quick: + specifier: ^3.1.1 + version: 3.1.1(prettier@2.6.2) + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + rollup: + specifier: ^2.70.2 + version: 2.72.0 + rollup-plugin-visualizer: + specifier: ^5.6.0 + version: 5.6.0(rollup@2.72.0) + stylelint: + specifier: ^14.7.1 + version: 14.7.1 + stylelint-config-prettier: + specifier: ^9.0.3 + version: 9.0.3(stylelint@14.7.1) + stylelint-config-recommended: + specifier: ^7.0.0 + version: 7.0.0(stylelint@14.7.1) + stylelint-config-recommended-vue: + specifier: ^1.4.0 + version: 1.4.0(postcss-html@1.4.1)(stylelint@14.7.1) + stylelint-config-standard: + specifier: ^25.0.0 + version: 25.0.0(stylelint@14.7.1) + stylelint-order: + specifier: ^5.0.0 + version: 5.0.0(stylelint@14.7.1) + ts-jest: + specifier: ^27.0.7 + version: 27.0.7(@babel/core@7.24.0)(@types/jest@27.0.2)(jest@27.3.1)(typescript@4.6.3) + ts-node: + specifier: ^10.7.0 + version: 10.7.0(@types/node@17.0.25)(typescript@4.6.3) + typescript: + specifier: ^4.6.3 + version: 4.6.3 + vite: + specifier: ^3.2.3 + version: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + vite-plugin-compression: + specifier: ^0.5.1 + version: 0.5.1(vite@3.2.3) + vite-plugin-html: + specifier: ^3.2.0 + version: 3.2.0(vite@3.2.3) + vite-plugin-imagemin: + specifier: ^0.6.1 + version: 0.6.1(vite@3.2.3) + vite-plugin-mkcert: + specifier: ^1.10.1 + version: 1.10.1(vite@3.2.3) + vite-plugin-mock: + specifier: ^2.9.6 + version: 2.9.6(mockjs@1.1.0)(rollup@2.72.0)(vite@3.2.3) + vite-plugin-optimize-persist: + specifier: ^0.1.2 + version: 0.1.2(vite-plugin-package-config@0.1.1)(vite@3.2.3) + vite-plugin-package-config: + specifier: ^0.1.1 + version: 0.1.1(vite@3.2.3) + vite-plugin-purge-icons: + specifier: ^0.8.2 + version: 0.8.2(vite@3.2.3) + vite-plugin-pwa: + specifier: ^0.12.3 + version: 0.12.3(vite@3.2.3)(workbox-build@6.6.0)(workbox-window@6.6.0) + vite-plugin-style-import: + specifier: ^2.0.0 + version: 2.0.0(vite@3.2.3) + vite-plugin-svg-icons: + specifier: ^2.0.1 + version: 2.0.1(vite@3.2.3) + vite-plugin-vue-setup-extend-plus: + specifier: ^0.1.0 + version: 0.1.0 + vite-plugin-windicss: + specifier: ^1.8.7 + version: 1.8.7(vite@3.2.3) + vue-eslint-parser: + specifier: ^8.3.0 + version: 8.3.0(eslint@8.22.0) + vue-tsc: + specifier: ^0.33.9 + version: 0.33.9(typescript@4.6.3) + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@aesoper/normal-utils@0.1.5: + resolution: {integrity: sha512-LFF/6y6h5mfwhnJaWqqxuC8zzDaHCG62kMRkd8xhDtq62TQj9dM17A9DhE87W7DhiARJsHLgcina/9P4eNCN1w==} + dev: false + + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@ant-design/colors@6.0.0: + resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} + dependencies: + '@ctrl/tinycolor': 3.6.1 + dev: false + + /@ant-design/icons-svg@4.4.2: + resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + dev: false + + /@ant-design/icons-vue@6.1.0(vue@3.2.47): + resolution: {integrity: sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==} + peerDependencies: + vue: '>=3.0.3' + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-svg': 4.4.2 + vue: 3.2.47 + dev: false + + /@antfu/utils@0.5.2: + resolution: {integrity: sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==} + dev: true + + /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + dependencies: + ajv: 8.12.0 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: true + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: true + + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.24.0: + resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) + '@babel/helpers': 7.24.0 + '@babel/parser': 7.24.0 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.0 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@9.4.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.24.0(@babel/core@7.24.0): + resolution: {integrity: sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.0): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + + /@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.24.0): + resolution: {integrity: sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + debug: 4.3.4(supports-color@9.4.0) + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-plugin-utils@7.24.0: + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.0): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + dev: true + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.24.0): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + dev: true + + /@babel/helpers@7.24.0: + resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.0 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.24.0: + resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.24.0) + dev: true + + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.24.0): + resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.0): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.0): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.0): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.0): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.0): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.0): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.0): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.0): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.0): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.0): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.24.0): + resolution: {integrity: sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.0) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.24.0): + resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.24.0): + resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-classes@7.23.8(@babel/core@7.24.0): + resolution: {integrity: sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/template': 7.24.0 + dev: true + + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.24.0): + resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.24.0): + resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.24.0): + resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.24.0): + resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.24.0): + resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-systemjs@7.23.9(@babel/core@7.24.0): + resolution: {integrity: sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.0): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.24.0): + resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.24.0): + resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-object-rest-spread@7.24.0(@babel/core@7.24.0): + resolution: {integrity: sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.24.0 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.24.0): + resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.24.0): + resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.24.0): + resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + regenerator-transform: 0.15.2 + dev: true + + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.24.0): + resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0) + dev: true + + /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.24.0): + resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/polyfill@7.12.1: + resolution: {integrity: sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==} + deprecated: 🚨 This package has been deprecated in favor of separate inclusion of a polyfill and regenerator-runtime (when needed). See the @babel/polyfill docs (https://babeljs.io/docs/en/babel-polyfill) for more information. + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.13.11 + dev: false + + /@babel/preset-env@7.24.0(@babel/core@7.24.0): + resolution: {integrity: sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.24.0 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.24.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.0) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.0) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-async-generator-functions': 7.23.9(@babel/core@7.24.0) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.24.0) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.24.0) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.24.0) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.24.0) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.24.0) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.24.0) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.24.0) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.24.0) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-modules-systemjs': 7.23.9(@babel/core@7.24.0) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.0) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.24.0) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.24.0) + '@babel/plugin-transform-object-rest-spread': 7.24.0(@babel/core@7.24.0) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.24.0) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.24.0) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.24.0) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.24.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.0) + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.24.0) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.24.0) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.24.0) + core-js-compat: 3.36.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.0): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/types': 7.24.0 + esutils: 2.0.3 + dev: true + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: true + + /@babel/runtime@7.24.0: + resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + + /@babel/standalone@7.24.0: + resolution: {integrity: sha512-yIZ/X3EAASgX/MW1Bn8iZKxCwixgYJAUaIScoZ9C6Gapw5l3eKIbtVSgO/IGldQed9QXm22yurKVWyWj5/j+SQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/template@7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 + dev: true + + /@babel/traverse@7.24.0: + resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 + debug: 4.3.4(supports-color@9.4.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@commitlint/cli@16.2.3: + resolution: {integrity: sha512-VsJBQLvhhlOgEfxs/Z5liYuK0dXqLE5hz1VJzLBxiOxG31kL/X5Q4OvK292BmO7IGZcm1yJE3XQPWSiFaEHbWA==} + engines: {node: '>=v12'} + hasBin: true + dependencies: + '@commitlint/format': 16.2.1 + '@commitlint/lint': 16.2.4 + '@commitlint/load': 16.3.0 + '@commitlint/read': 16.2.1 + '@commitlint/types': 16.2.1 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/config-conventional@16.2.1: + resolution: {integrity: sha512-cP9gArx7gnaj4IqmtCIcHdRjTYdRUi6lmGE+lOzGGjGe45qGOS8nyQQNvkNy2Ey2VqoSWuXXkD8zCUh6EHf1Ww==} + engines: {node: '>=v12'} + dependencies: + conventional-changelog-conventionalcommits: 4.6.3 + dev: true + + /@commitlint/config-validator@16.2.1: + resolution: {integrity: sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + ajv: 6.12.6 + dev: true + + /@commitlint/config-validator@19.0.3: + resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} + engines: {node: '>=v18'} + requiresBuild: true + dependencies: + '@commitlint/types': 19.0.3 + ajv: 8.12.0 + dev: true + optional: true + + /@commitlint/ensure@16.2.1: + resolution: {integrity: sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + lodash: 4.17.21 + dev: true + + /@commitlint/execute-rule@16.2.1: + resolution: {integrity: sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/execute-rule@19.0.0: + resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} + engines: {node: '>=v18'} + requiresBuild: true + dev: true + optional: true + + /@commitlint/format@16.2.1: + resolution: {integrity: sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored@16.2.4: + resolution: {integrity: sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + semver: 7.3.7 + dev: true + + /@commitlint/lint@16.2.4: + resolution: {integrity: sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/is-ignored': 16.2.4 + '@commitlint/parse': 16.2.1 + '@commitlint/rules': 16.2.4 + '@commitlint/types': 16.2.1 + dev: true + + /@commitlint/load@16.3.0: + resolution: {integrity: sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/config-validator': 16.2.1 + '@commitlint/execute-rule': 16.2.1 + '@commitlint/resolve-extends': 16.2.1 + '@commitlint/types': 16.2.1 + '@types/node': 17.0.25 + chalk: 4.1.2 + cosmiconfig: 7.1.0 + cosmiconfig-typescript-loader: 2.0.2(@types/node@17.0.25)(cosmiconfig@7.1.0)(typescript@4.6.3) + lodash: 4.17.21 + resolve-from: 5.0.0 + typescript: 4.6.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/load@19.0.3(@types/node@17.0.25)(typescript@4.6.3): + resolution: {integrity: sha512-18Tk/ZcDFRKIoKfEcl7kC+bYkEQ055iyKmGsYDoYWpKf6FUvBrP9bIWapuy/MB+kYiltmP9ITiUx6UXtqC9IRw==} + engines: {node: '>=v18'} + requiresBuild: true + dependencies: + '@commitlint/config-validator': 19.0.3 + '@commitlint/execute-rule': 19.0.0 + '@commitlint/resolve-extends': 19.0.3 + '@commitlint/types': 19.0.3 + chalk: 5.3.0 + cosmiconfig: 8.3.6(typescript@4.6.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@17.0.25)(cosmiconfig@8.3.6)(typescript@4.6.3) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - typescript + dev: true + optional: true + + /@commitlint/message@16.2.1: + resolution: {integrity: sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/parse@16.2.1: + resolution: {integrity: sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + dev: true + + /@commitlint/read@16.2.1: + resolution: {integrity: sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/top-level': 16.2.1 + '@commitlint/types': 16.2.1 + fs-extra: 10.1.0 + git-raw-commits: 2.0.11 + dev: true + + /@commitlint/resolve-extends@16.2.1: + resolution: {integrity: sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/config-validator': 16.2.1 + '@commitlint/types': 16.2.1 + import-fresh: 3.3.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/resolve-extends@19.0.3: + resolution: {integrity: sha512-18BKmta8OC8+Ub+Q3QGM9l27VjQaXobloVXOrMvu8CpEwJYv62vC/t7Ka5kJnsW0tU9q1eMqJFZ/nN9T/cOaIA==} + engines: {node: '>=v18'} + requiresBuild: true + dependencies: + '@commitlint/config-validator': 19.0.3 + '@commitlint/types': 19.0.3 + global-directory: 4.0.1 + import-meta-resolve: 4.0.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + dev: true + optional: true + + /@commitlint/rules@16.2.4: + resolution: {integrity: sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/ensure': 16.2.1 + '@commitlint/message': 16.2.1 + '@commitlint/to-lines': 16.2.1 + '@commitlint/types': 16.2.1 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines@16.2.1: + resolution: {integrity: sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/top-level@16.2.1: + resolution: {integrity: sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==} + engines: {node: '>=v12'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types@16.2.1: + resolution: {integrity: sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==} + engines: {node: '>=v12'} + dependencies: + chalk: 4.1.2 + dev: true + + /@commitlint/types@19.0.3: + resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} + engines: {node: '>=v18'} + requiresBuild: true + dependencies: + '@types/conventional-commits-parser': 5.0.0 + chalk: 5.3.0 + dev: true + optional: true + + /@cspotcode/source-map-consumer@0.8.0: + resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} + engines: {node: '>= 12'} + dev: true + + /@cspotcode/source-map-support@0.7.0: + resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} + engines: {node: '>=12'} + dependencies: + '@cspotcode/source-map-consumer': 0.8.0 + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@ctrl/tinycolor@3.6.1: + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + dev: false + + /@esbuild/aix-ppc64@0.20.1: + resolution: {integrity: sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.20.1: + resolution: {integrity: sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.15.18: + resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.20.1: + resolution: {integrity: sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.20.1: + resolution: {integrity: sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.20.1: + resolution: {integrity: sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.20.1: + resolution: {integrity: sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.20.1: + resolution: {integrity: sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.20.1: + resolution: {integrity: sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.20.1: + resolution: {integrity: sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.20.1: + resolution: {integrity: sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.20.1: + resolution: {integrity: sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.14.54: + resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.15.18: + resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.20.1: + resolution: {integrity: sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.20.1: + resolution: {integrity: sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.20.1: + resolution: {integrity: sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.20.1: + resolution: {integrity: sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.20.1: + resolution: {integrity: sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.20.1: + resolution: {integrity: sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.20.1: + resolution: {integrity: sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.20.1: + resolution: {integrity: sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.20.1: + resolution: {integrity: sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.20.1: + resolution: {integrity: sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.20.1: + resolution: {integrity: sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.20.1: + resolution: {integrity: sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.22.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.22.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint/eslintrc@1.4.1: + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@9.4.0) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@fullcalendar/common@5.10.1: + resolution: {integrity: sha512-EumKIJcQTvQdTs75/9dmeREFgjcRVWzqHJS1Xvlz5mNsmB+w9EINCHETRjChtAQg1WD/lTQyVj4sHsKO7vCMSw==} + dependencies: + tslib: 2.6.2 + dev: false + + /@fullcalendar/core@5.10.1: + resolution: {integrity: sha512-8sVuC6ywXV+cxqsqTZaR1hgUqeyjVed20NyZ7lGW9AY0kma1GIEwLgqPS5Q6uVhHyin68lmgecKfJCwhxENE8w==} + dependencies: + '@fullcalendar/common': 5.10.1 + preact: 10.19.6 + tslib: 2.6.2 + dev: false + + /@fullcalendar/daygrid@5.10.1: + resolution: {integrity: sha512-sfUMP+rew0krsBffgNcWWKhBCiyytGfRKZJoc64E8ohX7VWjPcPZuB1xgO5U4wPLmNkT0rZiHoGeQGTXw1+ZKg==} + dependencies: + '@fullcalendar/common': 5.10.1 + tslib: 2.6.2 + dev: false + + /@fullcalendar/interaction@5.10.1: + resolution: {integrity: sha512-H1g1QeXg7yXtUcKmVtfg7uzm5R5ElFTvYniiXU+8kJda69IDg7Lee+Y7UDv5dvLb5/HxO86RhPVxRtcOQ8XdXw==} + dependencies: + '@fullcalendar/common': 5.10.1 + tslib: 2.6.2 + dev: false + + /@fullcalendar/timegrid@5.10.1: + resolution: {integrity: sha512-0O0m+JzFBlg8gxYr/rIjZViRlbndCtjZlDjjIylQHFBeWC32e3cpHEavKGbTIBLN8SDilUYAJnE21abSqC2G/w==} + dependencies: + '@fullcalendar/common': 5.10.1 + '@fullcalendar/daygrid': 5.10.1 + tslib: 2.6.2 + dev: false + + /@fullcalendar/vue3@5.10.1(vue@3.2.47): + resolution: {integrity: sha512-Unc0Ya/PBbh1zXc3b8NYV9YlDD2J+V5+DbZ0Hbir4J+8tFgNZbSe94R0iAxvvygvj4RltoJz7cRE0Sp2J47G5Q==} + peerDependencies: + vue: ^3.0.11 + dependencies: + '@fullcalendar/core': 5.10.1 + tslib: 2.6.2 + vue: 3.2.47 + dev: false + + /@humanwhocodes/config-array@0.10.7: + resolution: {integrity: sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@9.4.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/gitignore-to-minimatch@1.0.2: + resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==} + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@hutson/parse-repository-url@3.0.2: + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@iconify/iconify@2.1.2: + resolution: {integrity: sha512-QcUzFeEWkE/mW+BVtEGmcWATClcCOIJFiYUD/PiCWuTcdEA297o8D4oN6Ra44WrNOHu1wqNW4J0ioaDIiqaFOQ==} + deprecated: no longer maintained, switch to modern iconify-icon web component + dependencies: + cross-fetch: 3.1.8 + transitivePeerDependencies: + - encoding + dev: true + + /@iconify/iconify@2.2.1: + resolution: {integrity: sha512-WJzw+3iicrF/tbjbxxRinSgy5FHdJoz/egTqwi3xCDkNRJPq482RX1iyaWrjNuY2vMNSPkQMuqHvZDXgA+WnwQ==} + deprecated: no longer maintained, switch to modern iconify-icon web component + + /@iconify/json@2.1.30: + resolution: {integrity: sha512-mxaB9gr4sSAKUq6GJdXV42YC7tkJ9WOZW6/8zGXciiA1cjLLyHe73GJl6qpnc53G8SDSSXWClQC5RHWNz/HIBQ==} + dependencies: + '@iconify/types': 1.1.0 + pathe: 0.2.0 + dev: true + + /@iconify/types@1.1.0: + resolution: {integrity: sha512-Jh0llaK2LRXQoYsorIH8maClebsnzTcve+7U3rQUSnC11X4jtPnFuyatqFLvMxZ8MLG8dB4zfHsbPfuvxluONw==} + dev: true + + /@interactjs/actions@1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26): + resolution: {integrity: sha512-MiZVpNmvNVziK2LuPUFLojGhRcH3zVWyyCqT5RFhVGSNmYBPWzhpLa387D56oGZkglUJ9VQJKilLhPzLL4jSSw==} + peerDependencies: + '@interactjs/core': 1.10.26 + '@interactjs/utils': 1.10.26 + dependencies: + '@interactjs/core': 1.10.26(@interactjs/utils@1.10.26) + '@interactjs/utils': 1.10.26 + optionalDependencies: + '@interactjs/interact': 1.10.26 + dev: false + + /@interactjs/auto-scroll@1.10.26(@interactjs/utils@1.10.26): + resolution: {integrity: sha512-oNDJ2uMk2dBUOajuoJkjQGQOaNCN2oUxGfwyv6YnjPWTpoQtmZ9GP+Ywr4LWQ5z8VMyctzl4u7c3gTMwU4d7/w==} + peerDependencies: + '@interactjs/utils': 1.10.26 + dependencies: + '@interactjs/utils': 1.10.26 + optionalDependencies: + '@interactjs/interact': 1.10.26 + dev: false + + /@interactjs/auto-start@1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26): + resolution: {integrity: sha512-CnYH3quBJuHR8IuDW258npf18tnI3Ornk4bVBi6o42jGf54X5FIb4Uu+H2mAFQm8xH81lTqa59CHb+m8KcouYg==} + peerDependencies: + '@interactjs/core': 1.10.26 + '@interactjs/utils': 1.10.26 + dependencies: + '@interactjs/core': 1.10.26(@interactjs/utils@1.10.26) + '@interactjs/utils': 1.10.26 + optionalDependencies: + '@interactjs/interact': 1.10.26 + dev: false + + /@interactjs/core@1.10.26(@interactjs/utils@1.10.26): + resolution: {integrity: sha512-UcxCkUlf2iqhqCKvGo+YGAat19OPYIlKGlyDmxLU3reyVHDvv8+FSckX4/sfQakz4yyMpUh+r8Ali9rFH9Rt9w==} + peerDependencies: + '@interactjs/utils': 1.10.26 + dependencies: + '@interactjs/utils': 1.10.26 + dev: false + + /@interactjs/dev-tools@1.10.26(@interactjs/modifiers@1.10.26)(@interactjs/utils@1.10.26): + resolution: {integrity: sha512-bg0uvk+9cDNjksLKoFHjQmWJNnAnJPs++OqMqWE1KgSShhfNpna3Vyfcx7rMkcspirY7MYH5mdpokLyzCsvMzw==} + peerDependencies: + '@interactjs/modifiers': 1.10.26 + '@interactjs/utils': 1.10.26 + dependencies: + '@interactjs/modifiers': 1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26) + '@interactjs/utils': 1.10.26 + optionalDependencies: + '@interactjs/interact': 1.10.26 + vue: 3.2.47 + dev: false + + /@interactjs/inertia@1.10.26(@interactjs/core@1.10.26)(@interactjs/modifiers@1.10.26)(@interactjs/utils@1.10.26): + resolution: {integrity: sha512-W7nBCPavFNAT6iVJBAqWZPmOT4qAersceqAsjc5L8nb9AnO+IllZrNRS9EF3cnIhkg+HxdoVnAGegYl1CS3Rjg==} + peerDependencies: + '@interactjs/core': 1.10.26 + '@interactjs/modifiers': 1.10.26 + '@interactjs/utils': 1.10.26 + dependencies: + '@interactjs/core': 1.10.26(@interactjs/utils@1.10.26) + '@interactjs/modifiers': 1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26) + '@interactjs/offset': 1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26) + '@interactjs/utils': 1.10.26 + optionalDependencies: + '@interactjs/interact': 1.10.26 + dev: false + + /@interactjs/interact@1.10.26: + resolution: {integrity: sha512-thxSJDxLV8s2Nn7i0HWjW5V6dFE/Qv2AgtNkH+QV3PdAb0AtOZpidCiKS4ni/TMen+skoalirMIxnUo9yXPVvg==} + dependencies: + '@interactjs/core': 1.10.26(@interactjs/utils@1.10.26) + '@interactjs/utils': 1.10.26 + dev: false + + /@interactjs/interactjs@1.10.26: + resolution: {integrity: sha512-Ta75sQy84yaSHzLBdXAbc2PvWEJ/9jy1YNpgrlsTuCfI3+g5Ixd2jrqPhT7K7iIaClWV/Wx2ejCH+dM0vqQwSQ==} + dependencies: + '@interactjs/actions': 1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26) + '@interactjs/auto-scroll': 1.10.26(@interactjs/utils@1.10.26) + '@interactjs/auto-start': 1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26) + '@interactjs/core': 1.10.26(@interactjs/utils@1.10.26) + '@interactjs/dev-tools': 1.10.26(@interactjs/modifiers@1.10.26)(@interactjs/utils@1.10.26) + '@interactjs/inertia': 1.10.26(@interactjs/core@1.10.26)(@interactjs/modifiers@1.10.26)(@interactjs/utils@1.10.26) + '@interactjs/interact': 1.10.26 + '@interactjs/modifiers': 1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26) + '@interactjs/offset': 1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26) + '@interactjs/pointer-events': 1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26) + '@interactjs/reflow': 1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26) + '@interactjs/utils': 1.10.26 + dev: false + + /@interactjs/modifiers@1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26): + resolution: {integrity: sha512-Y7V7Qw9kD0KrBRKzpd7h1U2IDlL/J7aN2B4HzPS/JzH+mjTgzcGY2RPpGJZeX3ld5HWlfGKTgT0+1L/SBlCXbA==} + peerDependencies: + '@interactjs/core': 1.10.26 + '@interactjs/utils': 1.10.26 + dependencies: + '@interactjs/core': 1.10.26(@interactjs/utils@1.10.26) + '@interactjs/snappers': 1.10.26(@interactjs/utils@1.10.26) + '@interactjs/utils': 1.10.26 + optionalDependencies: + '@interactjs/interact': 1.10.26 + dev: false + + /@interactjs/offset@1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26): + resolution: {integrity: sha512-7dSCldNhkfr23ytZU7VWb3RPb1sKaIP07v0XbMun6Z0CnpruoHfvc8DXJulixRB2EZqFpm0xY8E4CGaO/QwwDQ==} + peerDependencies: + '@interactjs/core': 1.10.26 + '@interactjs/utils': 1.10.26 + dependencies: + '@interactjs/core': 1.10.26(@interactjs/utils@1.10.26) + '@interactjs/utils': 1.10.26 + optionalDependencies: + '@interactjs/interact': 1.10.26 + dev: false + + /@interactjs/pointer-events@1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26): + resolution: {integrity: sha512-vEvnq5qay4rtNLqMYlDXL3wFLcTas30dQzBbmy/f/IA0uIDBzYJAof/cpee+5HRc5/X4+M46pUdWUj2iz+HZrA==} + peerDependencies: + '@interactjs/core': 1.10.26 + '@interactjs/utils': 1.10.26 + dependencies: + '@interactjs/core': 1.10.26(@interactjs/utils@1.10.26) + '@interactjs/utils': 1.10.26 + optionalDependencies: + '@interactjs/interact': 1.10.26 + dev: false + + /@interactjs/reflow@1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26): + resolution: {integrity: sha512-9mOqW1p255Bgc1ocbXYdyLTDCgc3vHZpeDbnvbdyrUYQdHTvVKsy6/FrcAICEbZ0qgjjN5qstiB1S5i+MmxW7Q==} + peerDependencies: + '@interactjs/core': 1.10.26 + '@interactjs/utils': 1.10.26 + dependencies: + '@interactjs/core': 1.10.26(@interactjs/utils@1.10.26) + '@interactjs/utils': 1.10.26 + optionalDependencies: + '@interactjs/interact': 1.10.26 + dev: false + + /@interactjs/snappers@1.10.26(@interactjs/utils@1.10.26): + resolution: {integrity: sha512-WSNQLsaprLjShqmPBcz51SX+OOoYv9gYnE4M7HfakxTl2kSd5ae4d/HkM9n41J8IcCCEOBn2l49AO00qyRmnqw==} + peerDependencies: + '@interactjs/utils': 1.10.26 + dependencies: + '@interactjs/utils': 1.10.26 + optionalDependencies: + '@interactjs/interact': 1.10.26 + dev: false + + /@interactjs/utils@1.10.26: + resolution: {integrity: sha512-tTmHsvQrLY4KDXyXqU5Y68Z2a3IzPD1WF87x+3ike1/Tu8dHb9Ea2gN1LBTbtSj7Nv3U/vA39opgrHBFha1DGA==} + dev: false + + /@intlify/core-base@9.1.9: + resolution: {integrity: sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw==} + engines: {node: '>= 10'} + dependencies: + '@intlify/devtools-if': 9.1.9 + '@intlify/message-compiler': 9.1.9 + '@intlify/message-resolver': 9.1.9 + '@intlify/runtime': 9.1.9 + '@intlify/shared': 9.1.9 + '@intlify/vue-devtools': 9.1.9 + dev: false + + /@intlify/devtools-if@9.1.9: + resolution: {integrity: sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ==} + engines: {node: '>= 10'} + dependencies: + '@intlify/shared': 9.1.9 + dev: false + + /@intlify/message-compiler@9.1.9: + resolution: {integrity: sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ==} + engines: {node: '>= 10'} + dependencies: + '@intlify/message-resolver': 9.1.9 + '@intlify/shared': 9.1.9 + source-map: 0.6.1 + dev: false + + /@intlify/message-resolver@9.1.9: + resolution: {integrity: sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA==} + engines: {node: '>= 10'} + dev: false + + /@intlify/runtime@9.1.9: + resolution: {integrity: sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg==} + engines: {node: '>= 10'} + dependencies: + '@intlify/message-compiler': 9.1.9 + '@intlify/message-resolver': 9.1.9 + '@intlify/shared': 9.1.9 + dev: false + + /@intlify/shared@9.1.9: + resolution: {integrity: sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw==} + engines: {node: '>= 10'} + dev: false + + /@intlify/vue-devtools@9.1.9: + resolution: {integrity: sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og==} + engines: {node: '>= 10'} + dependencies: + '@intlify/message-resolver': 9.1.9 + '@intlify/runtime': 9.1.9 + '@intlify/shared': 9.1.9 + dev: false + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jeecg/online@3.5.3-beta3: + resolution: {integrity: sha512-Nx1+zu0+nn+oc3RjlPGtRhxORAq4EWMJbLOOGT17WFYGn4sDXLYinBKzBxv9xrk0JbRouNYrayRf2TQpiU7qCg==} + dev: false + + /@jest/console@27.5.1: + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 17.0.25 + chalk: 4.1.2 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + dev: true + + /@jest/core@27.5.1(ts-node@10.7.0): + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + 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': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.25 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 27.5.1 + jest-config: 27.5.1(ts-node@10.7.0) + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.5 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@jest/environment@27.5.1: + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.25 + jest-mock: 27.5.1 + dev: true + + /@jest/fake-timers@27.5.1: + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@sinonjs/fake-timers': 8.1.0 + '@types/node': 17.0.25 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: true + + /@jest/globals@27.5.1: + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/types': 27.5.1 + expect: 27.5.1 + dev: true + + /@jest/reporters@27.5.1: + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} + 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': 0.2.3 + '@jest/console': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.25 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-haste-map: 27.5.1 + jest-resolve: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 4.0.2 + terminal-link: 2.1.1 + v8-to-istanbul: 8.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/source-map@27.5.1: + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.11 + source-map: 0.6.1 + dev: true + + /@jest/test-result@27.5.1: + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/types': 27.5.1 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@27.5.1: + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-runtime: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/transform@27.5.1: + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.24.0 + '@jest/types': 27.5.1 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-regex-util: 27.5.1 + jest-util: 27.5.1 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 17.0.25 + '@types/yargs': 16.0.9 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@logicflow/core@1.1.13: + resolution: {integrity: sha512-BfdzJMJO+qRnVzYYvr5RQsDmw1cYzmgKZ9VehnH1nboFpPowAd6/TNkYxNLlFKNZvwJmZOLvNKqRjShkZO2wWg==} + dependencies: + '@types/mousetrap': 1.6.15 + mousetrap: 1.6.5 + preact: 10.19.6 + dev: false + + /@logicflow/extension@1.1.13: + resolution: {integrity: sha512-Iidqm1iu8+N3vsnTYuw6t7PLfSWoTsB6qOuXmNheJtPVsw6edFUN6BG9pUpgChQRbxTIiP12dRfvwZkusCmIZA==} + dependencies: + '@logicflow/core': 1.1.13 + ids: 1.0.5 + preact: 10.19.6 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + dev: true + + /@octokit/auth-token@3.0.4: + resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} + engines: {node: '>= 14'} + dev: true + + /@octokit/core@4.2.4: + resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/auth-token': 3.0.4 + '@octokit/graphql': 5.0.6 + '@octokit/request': 6.2.8 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/endpoint@7.0.6: + resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.1 + dev: true + + /@octokit/graphql@5.0.6: + resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/request': 6.2.8 + '@octokit/types': 9.3.2 + universal-user-agent: 6.0.1 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/openapi-types@18.1.1: + resolution: {integrity: sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==} + dev: true + + /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): + resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=4' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/tsconfig': 1.0.2 + '@octokit/types': 9.3.2 + dev: true + + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + dev: true + + /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): + resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/types': 10.0.0 + dev: true + + /@octokit/request-error@3.0.3: + resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request@6.2.8: + resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/endpoint': 7.0.6 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + node-fetch: 2.7.0 + universal-user-agent: 6.0.1 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/rest@19.0.13: + resolution: {integrity: sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==} + engines: {node: '>= 14'} + dependencies: + '@octokit/core': 4.2.4 + '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) + '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/tsconfig@1.0.2: + resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} + dev: true + + /@octokit/types@10.0.0: + resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} + dependencies: + '@octokit/openapi-types': 18.1.1 + dev: true + + /@octokit/types@9.3.2: + resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} + dependencies: + '@octokit/openapi-types': 18.1.1 + dev: true + + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false + + /@purge-icons/core@0.8.0: + resolution: {integrity: sha512-8L6hP1U9XQO5B7kvquVJ5N7jzFvO0LZLXhBCjUQzzJzi42i6MAUanVKROApqbBuh21o9tmPwvNUg0xPe/uftRA==} + dependencies: + '@iconify/iconify': 2.1.2 + axios: 0.26.1(debug@4.3.4) + debug: 4.3.4(supports-color@9.4.0) + fast-glob: 3.3.2 + fs-extra: 10.1.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@purge-icons/generated@0.8.1: + resolution: {integrity: sha512-rIExGA33EGKEToqtc8WfpboaR7or1XRp+KV1Y5v/P0Rq7G5Me95DmP3ow/MpG7ql+XZ9xPzyS2naGRx5358+6Q==} + dependencies: + '@iconify/iconify': 2.2.1 + dev: true + + /@qiaoqiaoyun/drag-free@1.0.52(@aesoper/normal-utils@0.1.5)(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26)(@popperjs/core@2.11.8)(gradient-parser@1.0.2)(tinycolor2@1.6.0): + resolution: {integrity: sha512-WPNoJWwav2lwImcBy8uJXJJWstIS7Un+v9QOy0mCo/My/vPSbsyQ3uOBrigfTbrukt8bn+LwwvVtdjWTE5X7kA==} + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-vue': 6.1.0(vue@3.2.47) + '@fullcalendar/core': 5.10.1 + '@fullcalendar/daygrid': 5.10.1 + '@fullcalendar/interaction': 5.10.1 + '@fullcalendar/timegrid': 5.10.1 + '@fullcalendar/vue3': 5.10.1(vue@3.2.47) + '@types/echarts': 4.9.22 + '@vueuse/core': 6.9.2(vue@3.2.47) + ant-design-vue: 3.2.20(vue@3.2.47) + axios: 0.24.0 + china-area-data: 5.0.1 + codemirror: 5.65.3 + core-js: 3.36.0 + crypto-js: 4.1.1 + dayjs: 1.11.1 + echarts: 5.3.2 + echarts-gl: 2.0.9(echarts@5.3.2) + echarts-liquidfill: 3.1.0(echarts@5.3.2) + html2canvas: 1.4.1 + jspdf: 2.5.1 + lodash-es: 4.17.21 + md5: 2.3.0 + mitt: 3.0.1 + qs: 6.12.0 + tinymce: 5.10.3 + vue: 3.2.47 + vue-clipboard3: 2.0.0 + vue-count-to2: 1.0.6(vue@3.2.47) + vue-grid-layout: 3.0.0-beta1(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26) + vue-types: 4.1.1(vue@3.2.47) + vue3-colorpicker: 2.3.0(@aesoper/normal-utils@0.1.5)(@popperjs/core@2.11.8)(@vueuse/core@6.9.2)(gradient-parser@1.0.2)(lodash-es@4.17.21)(tinycolor2@1.6.0)(vue-types@4.1.1)(vue@3.2.47) + vuedraggable: 4.1.0(vue@3.2.47) + xlsx: 0.17.5 + transitivePeerDependencies: + - '@aesoper/normal-utils' + - '@interactjs/core' + - '@interactjs/utils' + - '@popperjs/core' + - '@vue/composition-api' + - debug + - gradient-parser + - tinycolor2 + dev: false + + /@rollup/plugin-babel@5.3.1(@babel/core@7.24.0)(rollup@2.79.1): + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + 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': 7.24.0 + '@babel/helper-module-imports': 7.22.15 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + rollup: 2.79.1 + dev: true + + /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + '@types/resolve': 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.8 + rollup: 2.79.1 + dev: true + + /@rollup/plugin-node-resolve@13.3.0(rollup@2.72.0): + resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^2.42.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.72.0) + '@types/resolve': 1.17.1 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.8 + rollup: 2.72.0 + dev: true + + /@rollup/plugin-replace@2.4.2(rollup@2.79.1): + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + magic-string: 0.25.9 + rollup: 2.79.1 + dev: true + + /@rollup/pluginutils@3.1.0(rollup@2.72.0): + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.72.0 + dev: true + + /@rollup/pluginutils@3.1.0(rollup@2.79.1): + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: true + + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@rys-fe/vite-plugin-theme@0.8.6(vite@3.2.3): + resolution: {integrity: sha512-9j6yMhNRCDxv4Wpimo0EDZf/KU5FgJtjMPVYBaFv4SPClLOEx5kkpcRuDrVBaB4IzM1qizRlxUK4jd9Klxyqig==} + peerDependencies: + vite: '>=2.0.0-beta.49' + dependencies: + '@types/node': 14.18.63 + '@types/tinycolor2': 1.4.6 + chalk: 4.1.2 + clean-css: 5.3.3 + debug: 4.3.4(supports-color@9.4.0) + esbuild: 0.11.23 + esbuild-plugin-alias: 0.1.2 + tinycolor2: 1.6.0 + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@simonwep/pickr@1.8.2: + resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==} + dependencies: + core-js: 3.36.0 + nanopop: 2.4.2 + dev: false + + /@sindresorhus/is@0.7.0: + resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==} + engines: {node: '>=4'} + dev: true + + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /@surma/rollup-plugin-off-main-thread@2.2.3: + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + dependencies: + ejs: 3.1.9 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.10 + dev: true + + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: true + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: true + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 + dev: true + + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@types/codemirror@5.60.5: + resolution: {integrity: sha512-TiECZmm8St5YxjFUp64LK0c8WU5bxMDt9YaAek1UqUb9swrSCoJhh92fWu1p3mTEqlHjhB5sY7OFBhWroJXZVg==} + dependencies: + '@types/tern': 0.23.9 + dev: true + + /@types/conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + requiresBuild: true + dependencies: + '@types/node': 17.0.25 + dev: true + optional: true + + /@types/crypto-js@4.1.1: + resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==} + dev: true + + /@types/echarts@4.9.22: + resolution: {integrity: sha512-7Fo6XdWpoi8jxkwP7BARUOM7riq8bMhmsCtSG8gzUcJmFhLo387tihoBYS/y5j7jl3PENT5RxeWZdN9RiwO7HQ==} + dependencies: + '@types/zrender': 4.0.6 + dev: false + + /@types/estree@0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + + /@types/fs-extra@9.0.13: + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + dependencies: + '@types/node': 17.0.25 + dev: true + + /@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 17.0.25 + dev: true + + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + dependencies: + '@types/node': 17.0.25 + dev: true + + /@types/imagemin-gifsicle@7.0.4: + resolution: {integrity: sha512-ZghMBd/Jgqg5utTJNPmvf6DkuHzMhscJ8vgf/7MUGCpO+G+cLrhYltL+5d+h3A1B4W73S2SrmJZ1jS5LACpX+A==} + dependencies: + '@types/imagemin': 7.0.1 + dev: true + + /@types/imagemin-jpegtran@5.0.4: + resolution: {integrity: sha512-PSMxOeJa8q94Y+qx8Yriw+qj1+vH5xWpvar63o6SGO0Xi5RlKuwHHfJmN2GRUngPrlhe394jOUmpVq8jQlVmFA==} + dependencies: + '@types/imagemin': 7.0.1 + dev: true + + /@types/imagemin-mozjpeg@8.0.4: + resolution: {integrity: sha512-ZCAxV8SYJB8ehwHpnbRpHjg5Wc4HcyuAMiDhXbkgC7gujDoOTyHO3dhDkUtZ1oK1DLBRZapqG9etdLVhUml7yQ==} + dependencies: + '@types/imagemin': 7.0.1 + dev: true + + /@types/imagemin-optipng@5.2.4: + resolution: {integrity: sha512-mvKnDMC8eCYZetAQudjs1DbgpR84WhsTx1wgvdiXnpuUEti3oJ+MaMYBRWPY0JlQ4+y4TXKOfa7+LOuT8daegQ==} + dependencies: + '@types/imagemin': 7.0.1 + dev: true + + /@types/imagemin-svgo@10.0.5: + resolution: {integrity: sha512-9U2Rf7vWBHeqJvzmWNP3vYAKqR0208QqQ9Mkrq9OLIL5AeoF/dRVRou6iUYCufBSim57BpBpCJhZLrTgfS3k1g==} + dependencies: + '@types/imagemin': 7.0.1 + '@types/svgo': 2.6.4 + dev: true + + /@types/imagemin-webp@7.0.3: + resolution: {integrity: sha512-C2/EMohS4bzsvY5VJvdzHFdcfmnZoui54DmM/9bFtK57/CgGmKkc+p6n49euPGmMFDDvwm4yVl60nwxcZOmH5A==} + dependencies: + '@types/imagemin': 7.0.1 + dev: true + + /@types/imagemin@7.0.1: + resolution: {integrity: sha512-xEn5+M3lDBtI3JxLy6eU3ksoVurygnlG7OYhTqJfGGP4PcvYnfn+IABCmMve7ziM/SneHDm5xgJFKC8hCYPicw==} + dependencies: + '@types/node': 17.0.25 + dev: true + + /@types/inquirer@8.2.1: + resolution: {integrity: sha512-wKW3SKIUMmltbykg4I5JzCVzUhkuD9trD6efAmYgN2MrSntY0SMRQzEnD3mkyJ/rv9NLbTC7g3hKKE86YwEDLw==} + dependencies: + '@types/through': 0.0.33 + rxjs: 7.8.1 + dev: true + + /@types/intro.js@3.0.2: + resolution: {integrity: sha512-kow8REgIIG42atN9vAaIdpEqVzj6WzV9m0PII8oce+an4Lc3eyfQF32/FbabbGmfWuF7TceTdd+gh74kOrXkPw==} + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/jest@27.0.2: + resolution: {integrity: sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==} + dependencies: + jest-diff: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 17.0.25 + dev: true + + /@types/lodash-es@4.17.6: + resolution: {integrity: sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==} + dependencies: + '@types/lodash': 4.14.202 + dev: true + + /@types/lodash@4.14.202: + resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + dev: true + + /@types/minimatch@3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: true + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true + + /@types/mockjs@1.0.6: + resolution: {integrity: sha512-Yu5YlqbYZyqsd6LjO4e8ONJDN9pTSnciHDcRP4teNOh/au2b8helFhgRx+3w8xsTFEnwr9jtfTVJbAx+eYmlHA==} + dev: true + + /@types/mousetrap@1.6.15: + resolution: {integrity: sha512-qL0hyIMNPow317QWW/63RvL1x5MVMV+Ru3NaY9f/CuEpCqrmb7WeuK2071ZY5hczOnm38qExWM2i2WtkXLSqFw==} + dev: false + + /@types/node@14.18.63: + resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} + dev: true + + /@types/node@17.0.25: + resolution: {integrity: sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==} + dev: true + + /@types/node@17.0.45: + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + dev: true + + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true + + /@types/nprogress@0.2.0: + resolution: {integrity: sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==} + dev: true + + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + dev: true + + /@types/pinyin@2.10.0: + resolution: {integrity: sha512-YLty6FPYiBgxNbQNaTRJquvflRdG026jjOpjNXR7HdGEJPGtmPBp1x9LkWePCNA/ClaTT0hYem080TbRCMLbew==} + dev: true + + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + + /@types/qrcode@1.4.2: + resolution: {integrity: sha512-7uNT9L4WQTNJejHTSTdaJhfBSCN73xtXaHFyBJ8TSwiLhe4PRuTue7Iph0s2nG9R/ifUaSnGhLUOZavlBEqDWQ==} + dependencies: + '@types/node': 17.0.25 + dev: true + + /@types/qs@6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + dev: true + + /@types/raf@3.4.3: + resolution: {integrity: sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==} + dev: false + optional: true + + /@types/resolve@1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 17.0.25 + dev: true + + /@types/responselike@1.0.3: + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + dependencies: + '@types/node': 17.0.25 + dev: true + + /@types/semver@7.5.8: + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + dev: true + + /@types/showdown@1.9.4: + resolution: {integrity: sha512-50ehC3IAijfkvoNqmQ+VL73S7orOxmAK8ljQAFBv8o7G66lAZyxQj1L3BAv2dD86myLXI+sgKP1kcxAaxW356w==} + dev: true + + /@types/sortablejs@1.10.7: + resolution: {integrity: sha512-lGCwwgpj8zW/ZmaueoPVSP7nnc9t8VqVWXS+ASX3eoUUENmiazv0rlXyTRludXzuX9ALjPsMqBu85TgJNWbTOg==} + dev: true + + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + dev: true + + /@types/svgo@2.6.4: + resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} + dependencies: + '@types/node': 17.0.25 + dev: true + + /@types/tern@0.23.9: + resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} + dependencies: + '@types/estree': 1.0.5 + dev: true + + /@types/through@0.0.33: + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + dependencies: + '@types/node': 17.0.25 + dev: true + + /@types/tinycolor2@1.4.6: + resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + dev: true + + /@types/trusted-types@2.0.7: + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + dev: true + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: true + + /@types/yargs@16.0.9: + resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@types/zrender@4.0.6: + resolution: {integrity: sha512-1jZ9bJn2BsfmYFPBHtl5o3uV+ILejAtGrDcYSpT4qaVKEI/0YY+arw3XHU04Ebd8Nca3SQ7uNcLaqiL+tTFVMg==} + dev: false + + /@typescript-eslint/eslint-plugin@5.20.0(@typescript-eslint/parser@5.20.0)(eslint@8.22.0)(typescript@4.6.3): + resolution: {integrity: sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q==} + 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': 5.20.0(eslint@8.22.0)(typescript@4.6.3) + '@typescript-eslint/scope-manager': 5.20.0 + '@typescript-eslint/type-utils': 5.20.0(eslint@8.22.0)(typescript@4.6.3) + '@typescript-eslint/utils': 5.20.0(eslint@8.22.0)(typescript@4.6.3) + debug: 4.3.4(supports-color@9.4.0) + eslint: 8.22.0 + functional-red-black-tree: 1.0.1 + ignore: 5.3.1 + regexpp: 3.2.0 + semver: 7.6.0 + tsutils: 3.21.0(typescript@4.6.3) + typescript: 4.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.20.0(eslint@8.22.0)(typescript@4.6.3): + resolution: {integrity: sha512-UWKibrCZQCYvobmu3/N8TWbEeo/EPQbS41Ux1F9XqPzGuV7pfg6n50ZrFo6hryynD8qOTTfLHtHjjdQtxJ0h/w==} + 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': 5.20.0 + '@typescript-eslint/types': 5.20.0 + '@typescript-eslint/typescript-estree': 5.20.0(typescript@4.6.3) + debug: 4.3.4(supports-color@9.4.0) + eslint: 8.22.0 + typescript: 4.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.20.0: + resolution: {integrity: sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.20.0 + '@typescript-eslint/visitor-keys': 5.20.0 + dev: true + + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/type-utils@5.20.0(eslint@8.22.0)(typescript@4.6.3): + resolution: {integrity: sha512-WxNrCwYB3N/m8ceyoGCgbLmuZwupvzN0rE8NBuwnl7APgjv24ZJIjkNzoFBXPRCGzLNkoU/WfanW0exvp/+3Iw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/utils': 5.20.0(eslint@8.22.0)(typescript@4.6.3) + debug: 4.3.4(supports-color@9.4.0) + eslint: 8.22.0 + tsutils: 3.21.0(typescript@4.6.3) + typescript: 4.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.20.0: + resolution: {integrity: sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.20.0(typescript@4.6.3): + resolution: {integrity: sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.20.0 + '@typescript-eslint/visitor-keys': 5.20.0 + debug: 4.3.4(supports-color@9.4.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.0 + tsutils: 3.21.0(typescript@4.6.3) + typescript: 4.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@5.62.0(typescript@4.6.3): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4(supports-color@9.4.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.0 + tsutils: 3.21.0(typescript@4.6.3) + typescript: 4.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.20.0(eslint@8.22.0)(typescript@4.6.3): + resolution: {integrity: sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w==} + 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': 7.0.15 + '@typescript-eslint/scope-manager': 5.20.0 + '@typescript-eslint/types': 5.20.0 + '@typescript-eslint/typescript-estree': 5.20.0(typescript@4.6.3) + eslint: 8.22.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0(eslint@8.22.0) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@5.62.0(eslint@8.22.0)(typescript@4.6.3): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.22.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.6.3) + eslint: 8.22.0 + eslint-scope: 5.1.1 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.20.0: + resolution: {integrity: sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.20.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@vitejs/plugin-legacy@2.0.0(terser@5.29.1)(vite@3.2.3): + resolution: {integrity: sha512-cuc45C4BQo2VlOsHZML4fc3MPfSjOEFeezHxr+WWlOOmi+muy1rz2snnFiePtyjVc1CYGTsnxk13cXpzQvMZaw==} + engines: {node: '>=14.18.0'} + peerDependencies: + terser: ^5.4.0 + vite: ^3.0.0 + dependencies: + '@babel/standalone': 7.24.0 + core-js: 3.36.0 + magic-string: 0.26.7 + regenerator-runtime: 0.13.11 + systemjs: 6.14.3 + terser: 5.29.1 + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + dev: true + + /@vitejs/plugin-vue-jsx@1.3.10: + resolution: {integrity: sha512-Cf5zznh4yNMiEMBfTOztaDVDmK1XXfgxClzOSUVUc8WAmHzogrCUeM8B05ABzuGtg0D1amfng+mUmSIOFGP3Pw==} + engines: {node: '>=12.0.0'} + dependencies: + '@babel/core': 7.24.0 + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.24.0) + '@rollup/pluginutils': 4.2.1 + '@vue/babel-plugin-jsx': 1.2.1(@babel/core@7.24.0) + hash-sum: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-vue@3.0.1(vite@3.2.3)(vue@3.2.47): + resolution: {integrity: sha512-Ll9JgxG7ONIz/XZv3dssfoMUDu9qAnlJ+km+pBA0teYSXzwPCIzS/e1bmwNYl5dcQGs677D21amgfYAnzMl17A==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 + vue: ^3.2.25 + dependencies: + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + vue: 3.2.47 + dev: true + + /@volar/code-gen@0.33.9: + resolution: {integrity: sha512-HI+XemEjvOv9uSjqaNXIL1brSTaBy9vRTcXqz9787nL5VKktI8aU1Zk4w9yJR88eTqw7mlPIdMaib7Ps/QPq8Q==} + dependencies: + '@volar/source-map': 0.33.9 + dev: true + + /@volar/pug-language-service@0.33.9: + resolution: {integrity: sha512-3oOV0HmoqkCyPAiHXSMoDzbLrSEQQv3d1dY/Lfo4H8hGoS8kUYJ958328TuLFc90yzsSmYnuvIux5AUok138pg==} + dependencies: + '@volar/code-gen': 0.33.9 + '@volar/shared': 0.33.9 + '@volar/source-map': 0.33.9 + '@volar/transforms': 0.33.9 + pug-lexer: 5.0.1 + pug-parser: 6.0.0 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + dev: true + + /@volar/shared@0.33.9: + resolution: {integrity: sha512-YqEBYT1SjyO+/W73lyKZlftumimsrYGvd98pHrIyvgc6HNhFnCcthRbyHskstjU6P8Bgj90mRl+7Sb29J+Z5ng==} + dependencies: + upath: 2.0.1 + vscode-jsonrpc: 8.2.0 + vscode-uri: 3.0.8 + dev: true + + /@volar/source-map@0.33.9: + resolution: {integrity: sha512-SE7dfumZ8pLsbj4DtiSDTg2/d/JT45nF51rUnuz1UNSBPEeXBexlzvz5EQ2AyrX0FjAAd2ijrRtirTk1a0SFhQ==} + dev: true + + /@volar/transforms@0.33.9: + resolution: {integrity: sha512-qdc2d0ZW/G6jCx1pBmoMjMJTY245pZJjpPL/OCT3zgbDLGvLvqhowXxQYQd2YiNXqxJvbadEKviH5LiZL3sU9g==} + dependencies: + '@volar/shared': 0.33.9 + vscode-languageserver-types: 3.17.5 + dev: true + + /@volar/vue-code-gen@0.33.9: + resolution: {integrity: sha512-qRCXcBhm1kUlI06sW5zolavn8gqZdSC2eIWw7jgbW68K/cGlTyXHGGZgJPM9P22cF9pcrjV1ByehO18ke2u+aA==} + dependencies: + '@volar/code-gen': 0.33.9 + '@volar/source-map': 0.33.9 + '@vue/compiler-core': 3.4.21 + '@vue/compiler-dom': 3.4.21 + '@vue/shared': 3.2.33 + dev: true + + /@volar/vue-typescript@0.33.9: + resolution: {integrity: sha512-UUViaQfzAV7z49TB+IsGCT6ls7zdEUib2N0L4k8U9nZbd2BQA4kcR9nyS/8oDOU5fK3ErP+pPlC+XzGGamKhcw==} + deprecated: 'WARNING: This project has been renamed to @vue/typescript. Install using @vue/typescript instead.' + dependencies: + '@volar/code-gen': 0.33.9 + '@volar/pug-language-service': 0.33.9 + '@volar/source-map': 0.33.9 + '@volar/vue-code-gen': 0.33.9 + '@vue/compiler-sfc': 3.2.33 + '@vue/reactivity': 3.4.21 + dev: true + + /@vue/babel-helper-vue-transform-on@1.2.1: + resolution: {integrity: sha512-jtEXim+pfyHWwvheYwUwSXm43KwQo8nhOBDyjrUITV6X2tB7lJm6n/+4sqR8137UVZZul5hBzWHdZ2uStYpyRQ==} + dev: true + + /@vue/babel-plugin-jsx@1.2.1(@babel/core@7.24.0): + resolution: {integrity: sha512-Yy9qGktktXhB39QE99So/BO2Uwm/ZG+gpL9vMg51ijRRbINvgbuhyJEi4WYmGRMx/MSTfK0xjgZ3/MyY+iLCEg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.0 + '@babel/types': 7.24.0 + '@vue/babel-helper-vue-transform-on': 1.2.1 + '@vue/babel-plugin-resolve-type': 1.2.1(@babel/core@7.24.0) + camelcase: 6.3.0 + html-tags: 3.3.1 + svg-tags: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@vue/babel-plugin-resolve-type@1.2.1(@babel/core@7.24.0): + resolution: {integrity: sha512-IOtnI7pHunUzHS/y+EG/yPABIAp0VN8QhQ0UCS09jeMVxgAnI9qdOzO85RXdQGxq+aWCdv8/+k3W0aYO6j/8fQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/core': 7.24.0 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/parser': 7.24.0 + '@vue/compiler-sfc': 3.4.21 + dev: true + + /@vue/compiler-core@3.2.33: + resolution: {integrity: sha512-AAmr52ji3Zhk7IKIuigX2osWWsb2nQE5xsdFYjdnmtQ4gymmqXbjLvkSE174+fF3A3kstYrTgGkqgOEbsdLDpw==} + dependencies: + '@babel/parser': 7.24.0 + '@vue/shared': 3.2.33 + estree-walker: 2.0.2 + source-map: 0.6.1 + dev: true + + /@vue/compiler-core@3.2.47: + resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} + dependencies: + '@babel/parser': 7.24.0 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + source-map: 0.6.1 + + /@vue/compiler-core@3.4.21: + resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} + dependencies: + '@babel/parser': 7.24.0 + '@vue/shared': 3.4.21 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: true + + /@vue/compiler-dom@3.2.33: + resolution: {integrity: sha512-GhiG1C8X98Xz9QUX/RlA6/kgPBWJkjq0Rq6//5XTAGSYrTMBgcLpP9+CnlUg1TFxnnCVughAG+KZl28XJqw8uQ==} + dependencies: + '@vue/compiler-core': 3.2.33 + '@vue/shared': 3.2.33 + dev: true + + /@vue/compiler-dom@3.2.47: + resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} + dependencies: + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/compiler-dom@3.4.21: + resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==} + requiresBuild: true + dependencies: + '@vue/compiler-core': 3.4.21 + '@vue/shared': 3.4.21 + dev: true + + /@vue/compiler-sfc@3.2.33: + resolution: {integrity: sha512-H8D0WqagCr295pQjUYyO8P3IejM3vEzeCO1apzByAEaAR/WimhMYczHfZVvlCE/9yBaEu/eu9RdiWr0kF8b71Q==} + dependencies: + '@babel/parser': 7.24.0 + '@vue/compiler-core': 3.2.33 + '@vue/compiler-dom': 3.2.33 + '@vue/compiler-ssr': 3.2.33 + '@vue/reactivity-transform': 3.2.33 + '@vue/shared': 3.2.33 + estree-walker: 2.0.2 + magic-string: 0.25.9 + postcss: 8.4.12 + source-map: 0.6.1 + dev: true + + /@vue/compiler-sfc@3.2.47: + resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} + dependencies: + '@babel/parser': 7.24.0 + '@vue/compiler-core': 3.2.47 + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-ssr': 3.2.47 + '@vue/reactivity-transform': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + postcss: 8.4.12 + source-map: 0.6.1 + + /@vue/compiler-sfc@3.4.21: + resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} + dependencies: + '@babel/parser': 7.24.0 + '@vue/compiler-core': 3.4.21 + '@vue/compiler-dom': 3.4.21 + '@vue/compiler-ssr': 3.4.21 + '@vue/shared': 3.4.21 + estree-walker: 2.0.2 + magic-string: 0.30.8 + postcss: 8.4.35 + source-map-js: 1.0.2 + dev: true + + /@vue/compiler-ssr@3.2.33: + resolution: {integrity: sha512-XQh1Xdk3VquDpXsnoCd7JnMoWec9CfAzQDQsaMcSU79OrrO2PNR0ErlIjm/mGq3GmBfkQjzZACV+7GhfRB8xMQ==} + dependencies: + '@vue/compiler-dom': 3.2.33 + '@vue/shared': 3.2.33 + dev: true + + /@vue/compiler-ssr@3.2.47: + resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/compiler-ssr@3.4.21: + resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==} + dependencies: + '@vue/compiler-dom': 3.4.21 + '@vue/shared': 3.4.21 + dev: true + + /@vue/devtools-api@6.6.1: + resolution: {integrity: sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==} + dev: false + + /@vue/reactivity-transform@3.2.33: + resolution: {integrity: sha512-4UL5KOIvSQb254aqenW4q34qMXbfZcmEsV/yVidLUgvwYQQ/D21bGX3DlgPUGI3c4C+iOnNmDCkIxkILoX/Pyw==} + dependencies: + '@babel/parser': 7.24.0 + '@vue/compiler-core': 3.2.33 + '@vue/shared': 3.2.33 + estree-walker: 2.0.2 + magic-string: 0.25.9 + dev: true + + /@vue/reactivity-transform@3.2.47: + resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} + dependencies: + '@babel/parser': 7.24.0 + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + + /@vue/reactivity@3.2.33: + resolution: {integrity: sha512-62Sq0mp9/0bLmDuxuLD5CIaMG2susFAGARLuZ/5jkU1FCf9EDbwUuF+BO8Ub3Rbodx0ziIecM/NsmyjardBxfQ==} + dependencies: + '@vue/shared': 3.2.33 + dev: false + + /@vue/reactivity@3.2.47: + resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==} + dependencies: + '@vue/shared': 3.2.47 + + /@vue/reactivity@3.4.21: + resolution: {integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==} + dependencies: + '@vue/shared': 3.4.21 + dev: true + + /@vue/runtime-core@3.2.33: + resolution: {integrity: sha512-N2D2vfaXsBPhzCV3JsXQa2NECjxP3eXgZlFqKh4tgakp3iX6LCGv76DLlc+IfFZq+TW10Y8QUfeihXOupJ1dGw==} + dependencies: + '@vue/reactivity': 3.2.33 + '@vue/shared': 3.2.33 + dev: false + + /@vue/runtime-core@3.2.47: + resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==} + dependencies: + '@vue/reactivity': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/runtime-dom@3.2.47: + resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==} + dependencies: + '@vue/runtime-core': 3.2.47 + '@vue/shared': 3.2.47 + csstype: 2.6.21 + + /@vue/server-renderer@3.2.47(vue@3.2.47): + resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==} + peerDependencies: + vue: 3.2.47 + dependencies: + '@vue/compiler-ssr': 3.2.47 + '@vue/shared': 3.2.47 + vue: 3.2.47 + + /@vue/shared@3.2.33: + resolution: {integrity: sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg==} + + /@vue/shared@3.2.47: + resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} + + /@vue/shared@3.4.21: + resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} + dev: true + + /@vue/test-utils@2.0.0-rc.21(vue@3.2.47): + resolution: {integrity: sha512-wIJR4e/jISBKVKfiod3DV32BlDsoD744WVCuCaGtaSKvhvTL9gI5vl2AYSy00V51YaM8dCOFi3zcpCON8G1WqA==} + peerDependencies: + vue: ^3.0.1 + dependencies: + vue: 3.2.47 + dev: true + + /@vueuse/core@6.9.2(vue@3.2.47): + resolution: {integrity: sha512-FRwl4ccSFuHZBHLGgS9TMv/+Dd6XFaL4o9nph2qtgQIV+z29RBFokw08XjHfykiENRzB01MjYHJ7iRUnsIFQXg==} + peerDependencies: + '@vue/composition-api': ^1.1.0 + vue: ^2.6.0 || ^3.2.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + vue: + optional: true + dependencies: + '@vueuse/shared': 6.9.2(vue@3.2.47) + vue: 3.2.47 + vue-demi: 0.14.7(vue@3.2.47) + dev: false + + /@vueuse/core@8.3.0(vue@3.2.47): + resolution: {integrity: sha512-GDHM0vr/E3mw1fbh3yj4DJCJ/KvTXtOtT0OR2kCKuEUOo0Btk45MDGI6MdIqsHMjI0OXBJl8jH8WFv64KU2mOQ==} + peerDependencies: + '@vue/composition-api': ^1.1.0 + vue: ^2.6.0 || ^3.2.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + vue: + optional: true + dependencies: + '@vueuse/metadata': 8.3.0 + '@vueuse/shared': 8.3.0(vue@3.2.47) + vue: 3.2.47 + vue-demi: 0.14.7(vue@3.2.47) + dev: false + + /@vueuse/metadata@8.3.0: + resolution: {integrity: sha512-7R/LNPQWp1r/owa2e71l3dFlJ21p89YE3ks14ZclP2VOTvhC6AzDRcpk+ChISNetv8spsFbWZj/Z7sFjbFZfuw==} + dev: false + + /@vueuse/shared@6.9.2(vue@3.2.47): + resolution: {integrity: sha512-lAiMh6XROs0kSKVd0Yb/6GKoQMxC1fYrFDi6opvQWISPtcqRNluRrQxLUZ3WTI78ovtoKRLktjhkFAtydcfFDg==} + 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: 3.2.47 + vue-demi: 0.14.7(vue@3.2.47) + dev: false + + /@vueuse/shared@8.3.0(vue@3.2.47): + resolution: {integrity: sha512-xehtLfevPw9nsVIGFe/tWMtFvbvZjeAfXh7DT9Fptt/6/C5rLwpJtxsVguIBtPybjwobO4KCpQYS78aa9fg5Sw==} + 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: 3.2.47 + vue-demi: 0.14.7(vue@3.2.47) + dev: false + + /@windicss/config@1.8.7: + resolution: {integrity: sha512-8n+/Y36j5L3rw2tgMdLjeGRuNV7VYfKoHoraLK6Bk9OJ1MTPd5vv7pekof/uOPWVV7WWjVeZ6CTO8SDbDDW3iw==} + dependencies: + debug: 4.3.4(supports-color@9.4.0) + jiti: 1.21.0 + windicss: 3.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@windicss/plugin-utils@1.8.7: + resolution: {integrity: sha512-dfj95olNZyGFDPFMBvE5oq8hA5f0ooUJZjVdWlthS4ek4W1/xNOHDxB6ygWR8LE9zCOXZykApjt1LOhy9Ky2QA==} + dependencies: + '@antfu/utils': 0.5.2 + '@windicss/config': 1.8.7 + debug: 4.3.4(supports-color@9.4.0) + fast-glob: 3.3.2 + magic-string: 0.26.7 + micromatch: 4.0.5 + windicss: 3.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@zxcvbn-ts/core@2.0.1: + resolution: {integrity: sha512-i3viYattwORK5liqS/d9WaIWSLki75oKVog5Elg9Ls9d8L6zKLwpAkj6PT/P4LZqJHIVRPnKjgajpP6SLerr6Q==} + dependencies: + fastest-levenshtein: 1.0.12 + dev: false + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + dev: true + + /acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: true + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + dev: true + + /adler-32@1.2.0: + resolution: {integrity: sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==} + engines: {node: '>=0.8'} + hasBin: true + dependencies: + exit-on-epipe: 1.0.1 + printj: 1.1.2 + dev: false + + /adler-32@1.3.1: + resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} + engines: {node: '>=0.8'} + dev: false + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4(supports-color@9.4.0) + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-escapes@3.2.0: + resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} + engines: {node: '>=4'} + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + dev: true + + /ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /ant-design-vue@3.2.20(vue@3.2.47): + resolution: {integrity: sha512-YWpMfGaGoRastIXEYfCoJiaRiDHk4chqtYhlKQM5GqPt6NfvrM1Vg2e60yHtjxlZjed91wCMm0rAmyUr7Hwzdg==} + engines: {node: '>=12.22.0'} + peerDependencies: + vue: '>=3.2.0' + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-vue': 6.1.0(vue@3.2.47) + '@babel/runtime': 7.24.0 + '@ctrl/tinycolor': 3.6.1 + '@simonwep/pickr': 1.8.2 + array-tree-filter: 2.1.0 + async-validator: 4.2.5 + dayjs: 1.11.1 + dom-align: 1.12.2 + dom-scroll-into-view: 2.0.1 + lodash: 4.17.21 + lodash-es: 4.17.21 + resize-observer-polyfill: 1.5.1 + scroll-into-view-if-needed: 2.2.31 + shallow-equal: 1.2.1 + vue: 3.2.47 + vue-types: 3.0.2(vue@3.2.47) + warning: 4.0.3 + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + dev: true + + /archive-type@4.0.0: + resolution: {integrity: sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==} + engines: {node: '>=4'} + dependencies: + file-type: 4.4.0 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: true + + /array-differ@3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} + dev: true + + /array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + dev: true + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /array-tree-filter@2.1.0: + resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} + dev: false + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + dev: true + + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + dev: true + + /assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + dev: true + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + dev: false + + /async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + dependencies: + lodash: 4.17.21 + dev: true + + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + /autoprefixer@10.4.4(postcss@8.4.12): + resolution: {integrity: sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001596 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 + dev: true + + /axios@0.21.4(debug@4.3.4): + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.5(debug@4.3.4) + transitivePeerDependencies: + - debug + dev: true + + /axios@0.24.0: + resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} + dependencies: + follow-redirects: 1.15.5(debug@4.3.4) + transitivePeerDependencies: + - debug + dev: false + + /axios@0.26.1(debug@4.3.4): + resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} + dependencies: + follow-redirects: 1.15.5(debug@4.3.4) + transitivePeerDependencies: + - debug + + /babel-jest@27.5.1(@babel/core@7.24.0): + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.24.0 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1(@babel/core@7.24.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.24.0 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@27.5.1: + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.5 + dev: true + + /babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.24.0): + resolution: {integrity: sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.24.0 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.24.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.24.0): + resolution: {integrity: sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.24.0) + core-js-compat: 3.36.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.24.0): + resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.24.0) + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-transform-runtime@6.23.0: + resolution: {integrity: sha512-cpGMVC1vt/772y3jx1gwSaTitQVZuFDlllgreMsZ+rTYC6jlYXRyf5FQOgSnckOiA5QmzbXTyBY2A5AmZXF1fA==} + dependencies: + babel-runtime: 6.26.0 + dev: false + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.0): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.0) + dev: true + + /babel-preset-jest@27.5.1(@babel/core@7.24.0): + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) + dev: true + + /babel-runtime@6.26.0: + resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.11.1 + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + dev: true + + /base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + + /basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /batch-processor@1.0.0: + resolution: {integrity: sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==} + dev: false + + /before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + dev: true + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: true + + /bin-build@3.0.0: + resolution: {integrity: sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==} + engines: {node: '>=4'} + dependencies: + decompress: 4.2.1 + download: 6.2.5 + execa: 0.7.0 + p-map-series: 1.0.0 + tempfile: 2.0.0 + dev: true + + /bin-check@4.1.0: + resolution: {integrity: sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==} + engines: {node: '>=4'} + dependencies: + execa: 0.7.0 + executable: 4.1.1 + dev: true + + /bin-version-check@4.0.0: + resolution: {integrity: sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==} + engines: {node: '>=6'} + dependencies: + bin-version: 3.1.0 + semver: 5.7.2 + semver-truncate: 1.1.2 + dev: true + + /bin-version@3.1.0: + resolution: {integrity: sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==} + engines: {node: '>=6'} + dependencies: + execa: 1.0.0 + find-versions: 3.2.0 + dev: true + + /bin-wrapper-china@0.1.0: + resolution: {integrity: sha512-1UCm17WYEbgry50tup+AQN+JGVEVzoW4f8HMl899k1lvuFxWKGZXl/G2fgxQxAckRjnloO3ijLVVEsv8zescUg==} + engines: {node: '>=8.3'} + hasBin: true + dependencies: + bin-check: 4.1.0 + bin-version-check: 4.0.0 + binary-mirror-config: 1.41.0 + download: 7.1.0 + import-lazy: 4.0.0 + os-filter-obj: 2.0.0 + pify: 4.0.1 + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /binary-mirror-config@1.41.0: + resolution: {integrity: sha512-ZiIhR1s6Sv1Fv6qCQqfPjx0Cj86BgFlhqNxZgHkQOWcxJcMbO3mj1iqsuVjowYqJqeZL8e52+IEv7IRnSX6T6w==} + dev: true + + /bl@1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + dev: true + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true + + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001596 + electron-to-chromium: 1.4.697 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: true + + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /btoa@1.2.1: + resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} + engines: {node: '>= 0.4.0'} + hasBin: true + dev: false + + /buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + dev: true + + /buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + dev: true + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /builtins@4.1.0: + resolution: {integrity: sha512-1bPRZQtmKaO6h7qV1YHXNtr6nCK28k0Zo95KM4dXfILcZZwoHJBN1m3lfLv9LPkcOZlrSr+J1bzMaZFO98Yq0w==} + dependencies: + semver: 7.6.0 + dev: true + + /cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + + /cacheable-request@2.1.4: + resolution: {integrity: sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==} + dependencies: + clone-response: 1.0.2 + get-stream: 3.0.0 + http-cache-semantics: 3.8.1 + keyv: 3.0.0 + lowercase-keys: 1.0.0 + normalize-url: 2.0.1 + responselike: 1.0.2 + dev: true + + /cachedir@2.2.0: + resolution: {integrity: sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==} + engines: {node: '>=6'} + dev: true + + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.1 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.2 + dev: true + + /camelcase-keys@2.1.0: + resolution: {integrity: sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==} + engines: {node: '>=0.10.0'} + dependencies: + camelcase: 2.1.1 + map-obj: 1.0.1 + dev: true + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@2.1.1: + resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} + engines: {node: '>=0.10.0'} + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite@1.0.30001596: + resolution: {integrity: sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==} + dev: true + + /canvg@3.0.10: + resolution: {integrity: sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.0 + '@types/raf': 3.4.3 + core-js: 3.36.0 + raf: 3.4.1 + regenerator-runtime: 0.13.11 + rgbcolor: 1.0.1 + stackblur-canvas: 2.7.0 + svg-pathdata: 6.0.3 + dev: false + optional: true + + /capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case-first: 2.0.2 + dev: true + + /caw@2.0.1: + resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==} + engines: {node: '>=4'} + dependencies: + get-proxy: 2.1.0 + isurl: 1.0.0 + tunnel-agent: 0.6.0 + url-to-options: 1.0.1 + dev: true + + /cfb@1.2.2: + resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} + engines: {node: '>=0.8'} + dependencies: + adler-32: 1.3.1 + crc-32: 1.2.2 + dev: false + + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + requiresBuild: true + dev: true + optional: true + + /change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /character-parser@2.2.0: + resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} + dependencies: + is-regex: 1.1.4 + dev: true + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + + /charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: false + + /china-area-data@5.0.1: + resolution: {integrity: sha512-BQDPpiv5Nn+018ekcJK2oSD9PAD+E1bvXB0wgabc//dFVS/KvRqCgg0QOEUt3vBkx9XzB5a9BmkJCEZDBxVjVw==} + dev: false + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true + + /class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + + /claygl@1.3.0: + resolution: {integrity: sha512-+gGtJjT6SSHD2l2yC3MCubW/sCV40tZuSs5opdtn79vFSGUgp/lH139RNEQ6Jy078/L0aV8odCw8RSrUcMfLaQ==} + dev: false + + /clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-cursor@2.1.0: + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} + dependencies: + restore-cursor: 2.0.0 + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: true + + /cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /cli-width@2.2.1: + resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} + dev: true + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: true + + /clipboard@2.0.8: + resolution: {integrity: sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==} + dependencies: + good-listener: 1.2.2 + select: 1.1.2 + tiny-emitter: 2.1.0 + dev: false + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: false + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-regexp@2.2.0: + resolution: {integrity: sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==} + engines: {node: '>=6'} + dependencies: + is-regexp: 2.1.0 + dev: true + + /clone-response@1.0.2: + resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} + dependencies: + mimic-response: 1.0.1 + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: true + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /codemirror@5.65.3: + resolution: {integrity: sha512-kCC0iwGZOVZXHEKW3NDTObvM7pTIyowjty4BUqeREROc/3I6bWbgZDA3fGDwlA+rbgRjvnRnfqs9SfXynel1AQ==} + dev: false + + /codepage@1.15.0: + resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} + engines: {node: '>=0.8'} + dev: false + + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true + + /collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + dev: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander@12.0.0: + resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} + engines: {node: '>=18'} + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: true + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: false + + /commitizen@4.2.4(@types/node@17.0.25)(typescript@4.6.3): + resolution: {integrity: sha512-LlZChbDzg3Ir3O2S7jSo/cgWp5/QwylQVr59K4xayVq8S4/RdKzSyJkghAiZZHfhh5t4pxunUoyeg0ml1q/7aw==} + engines: {node: '>= 10'} + hasBin: true + dependencies: + cachedir: 2.2.0 + cz-conventional-changelog: 3.2.0(@types/node@17.0.25)(typescript@4.6.3) + dedent: 0.7.0 + detect-indent: 6.0.0 + find-node-modules: 2.1.3 + find-root: 1.1.0 + fs-extra: 8.1.0 + glob: 7.1.4 + inquirer: 6.5.2 + is-utf8: 0.2.1 + lodash: 4.17.21 + minimist: 1.2.5 + strip-bom: 4.0.0 + strip-json-comments: 3.0.1 + transitivePeerDependencies: + - '@types/node' + - typescript + dev: true + + /common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + dev: true + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + dev: true + + /compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: true + + /connect-history-api-fallback@1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} + engines: {node: '>=0.8'} + dev: true + + /connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + dev: true + + /console-stream@0.1.1: + resolution: {integrity: sha512-QC/8l9e6ofi6nqZ5PawlDgzmMw3OxIXtvolBzap/F4UDBJlDaZRSNbL/lb41C29FcbSJncBFlJFj2WJoNyZRfQ==} + dev: true + + /console@0.7.2: + resolution: {integrity: sha512-+JSDwGunA4MTEgAV/4VBKwUHonP8CzJ/6GIuwPi6acKFqFfHUdSGCm89ZxZ5FfGWdZfkdgAroy5bJ5FSeN/t4g==} + dev: true + + /constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case: 2.0.2 + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-atom@2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-cli@2.2.2: + resolution: {integrity: sha512-8grMV5Jo8S0kP3yoMeJxV2P5R6VJOqK72IiSV9t/4H5r/HiRqEBQ83bYGuz4Yzfdj4bjaAEhZN/FFbsFXr5bOA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + add-stream: 1.0.0 + conventional-changelog: 3.1.25 + lodash: 4.17.21 + meow: 8.1.2 + tempfile: 3.0.0 + dev: true + + /conventional-changelog-codemirror@2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + dev: true + + /conventional-changelog-core@4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 5.0.1 + conventional-commits-parser: 3.2.4 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 2.0.11 + git-remote-origin-url: 2.0.0 + git-semver-tags: 4.1.1 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + q: 1.5.1 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + through2: 4.0.2 + dev: true + + /conventional-changelog-ember@2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-eslint@3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-express@2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-jquery@3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-jshint@2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-preset-loader@2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + dev: true + + /conventional-changelog-writer@5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + conventional-commits-filter: 2.0.7 + dateformat: 3.0.3 + handlebars: 4.7.8 + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + meow: 8.1.2 + semver: 6.3.1 + split: 1.0.1 + through2: 4.0.2 + dev: true + + /conventional-changelog@3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} + dependencies: + conventional-changelog-angular: 5.0.13 + conventional-changelog-atom: 2.0.8 + conventional-changelog-codemirror: 2.0.8 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-changelog-core: 4.2.4 + conventional-changelog-ember: 2.0.9 + conventional-changelog-eslint: 3.0.9 + conventional-changelog-express: 2.0.6 + conventional-changelog-jquery: 3.0.11 + conventional-changelog-jshint: 2.0.9 + conventional-changelog-preset-loader: 2.3.4 + dev: true + + /conventional-commit-types@3.0.0: + resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} + dev: true + + /conventional-commits-filter@2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + dev: true + + /conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + dependencies: + is-what: 3.14.1 + dev: true + + /copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + dev: true + + /core-js-compat@3.36.0: + resolution: {integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==} + dependencies: + browserslist: 4.23.0 + dev: true + + /core-js@2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + 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 + + /core-js@3.36.0: + resolution: {integrity: sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==} + requiresBuild: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: true + + /corser@2.0.1: + resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} + engines: {node: '>= 0.4.0'} + dev: true + + /cosmiconfig-typescript-loader@2.0.2(@types/node@17.0.25)(cosmiconfig@7.1.0)(typescript@4.6.3): + resolution: {integrity: sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + typescript: '>=3' + dependencies: + '@types/node': 17.0.25 + cosmiconfig: 7.1.0 + ts-node: 10.9.2(@types/node@17.0.25)(typescript@4.6.3) + typescript: 4.6.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /cosmiconfig-typescript-loader@5.0.0(@types/node@17.0.25)(cosmiconfig@8.3.6)(typescript@4.6.3): + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + requiresBuild: true + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + dependencies: + '@types/node': 17.0.25 + cosmiconfig: 8.3.6(typescript@4.6.3) + jiti: 1.21.0 + typescript: 4.6.3 + dev: true + optional: true + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + + /cosmiconfig@8.3.6(typescript@4.6.3): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + requiresBuild: true + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 4.6.3 + dev: true + optional: true + + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: false + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cron-parser@3.5.0: + resolution: {integrity: sha512-wyVZtbRs6qDfFd8ap457w3XVntdvqcwBGxBoTvJQH9KGVKL/fB+h2k3C8AqiVxvUQKN1Ps/Ns46CNViOpVDhfQ==} + engines: {node: '>=0.8'} + dependencies: + is-nan: 1.3.2 + luxon: 1.28.1 + dev: false + + /cropperjs@1.5.12: + resolution: {integrity: sha512-re7UdjE5UnwdrovyhNzZ6gathI4Rs3KGCBSc8HCIjUo5hO42CtzyblmWLj6QWVw7huHyDMfpKxhiO2II77nhDw==} + dev: false + + /cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dev: true + + /cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: true + + /cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: false + + /crypto-js@4.1.1: + resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} + dev: false + + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: true + + /css-functions-list@3.2.1: + resolution: {integrity: sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==} + engines: {node: '>=12 || >=16'} + dev: true + + /css-line-break@2.1.0: + resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} + dependencies: + utrie: 1.0.2 + dev: false + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: true + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /cssfilter@0.0.10: + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} + dev: false + + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: true + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: true + + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + + /csstype@2.6.21: + resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} + + /currently-unhandled@0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} + engines: {node: '>=0.10.0'} + dependencies: + array-find-index: 1.0.2 + dev: true + + /cwebp-bin@6.1.2: + resolution: {integrity: sha512-NLEZ/BVAl9g426hwUX/qrQ7b/EfQH7BS1tr+CzPo2EgDQbcdzmUVE+fIfsi64lsL638lWgzTEViMAL4pxV1GOg==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + bin-build: 3.0.0 + bin-wrapper: /bin-wrapper-china@0.1.0 + dev: true + + /cz-conventional-changelog@3.2.0(@types/node@17.0.25)(typescript@4.6.3): + resolution: {integrity: sha512-yAYxeGpVi27hqIilG1nh4A9Bnx4J3Ov+eXy4koL3drrR+IO9GaWPsKjik20ht608Asqi8TQPf0mczhEeyAtMzg==} + engines: {node: '>= 10'} + dependencies: + chalk: 2.4.2 + commitizen: 4.2.4(@types/node@17.0.25)(typescript@4.6.3) + conventional-commit-types: 3.0.0 + lodash.map: 4.6.0 + longest: 2.0.1 + word-wrap: 1.2.5 + optionalDependencies: + '@commitlint/load': 19.0.3(@types/node@17.0.25)(typescript@4.6.3) + transitivePeerDependencies: + - '@types/node' + - typescript + dev: true + + /cz-git@1.3.9: + resolution: {integrity: sha512-S7XpI+XtJ/foh9MYB1pBB+YGsQyzhQpUzmNaN3Y17KeYf0EvRQt0OR7GVf3xZ5clLEdQh2nY5TjdGZ4ctXUTuA==} + dev: true + + /czg@1.3.9: + resolution: {integrity: sha512-8VD7wNXlnkY9ZfHDkGBKQupR9wQAeblIzk9qB3LeijlrnI7YBp5wVShR3z0SMRDL+Zg/NYYuC5fopxu0fG8WrQ==} + hasBin: true + dev: true + + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + + /data-urls@2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + dev: true + + /dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + dev: true + + /dayjs@1.11.1: + resolution: {integrity: sha512-ER7EjqVAMkRRsxNCC5YqJ9d9VQYuWdGt7aiH2qA5R5wt8ZmWaP2dLUSIK6y/kVzLMlmh1Tvu5xUf4M/wdGJ5KA==} + dev: false + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.3.4(supports-color@9.4.0): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 9.4.0 + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: true + + /decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + dependencies: + mimic-response: 1.0.1 + dev: true + + /decompress-tar@4.1.1: + resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} + engines: {node: '>=4'} + dependencies: + file-type: 5.2.0 + is-stream: 1.1.0 + tar-stream: 1.6.2 + dev: true + + /decompress-tarbz2@4.1.1: + resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} + engines: {node: '>=4'} + dependencies: + decompress-tar: 4.1.1 + file-type: 6.2.0 + is-stream: 1.1.0 + seek-bzip: 1.0.6 + unbzip2-stream: 1.4.3 + dev: true + + /decompress-targz@4.1.1: + resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} + engines: {node: '>=4'} + dependencies: + decompress-tar: 4.1.1 + file-type: 5.2.0 + is-stream: 1.1.0 + dev: true + + /decompress-unzip@4.0.1: + resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} + engines: {node: '>=4'} + dependencies: + file-type: 3.9.0 + get-stream: 2.3.1 + pify: 2.3.0 + yauzl: 2.10.0 + dev: true + + /decompress@4.2.1: + resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} + engines: {node: '>=4'} + dependencies: + decompress-tar: 4.1.1 + decompress-tarbz2: 4.1.1 + decompress-targz: 4.1.1 + decompress-unzip: 4.0.1 + graceful-fs: 4.2.11 + make-dir: 1.3.0 + pify: 2.3.0 + strip-dirs: 2.1.0 + dev: true + + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + /define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.7 + dev: true + + /define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + dev: true + + /define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /delegate@3.2.0: + resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} + dev: false + + /deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dev: true + + /detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + dev: true + + /detect-indent@6.0.0: + resolution: {integrity: sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==} + engines: {node: '>=8'} + dev: true + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + dev: false + + /diff-sequences@27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dev: false + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-align@1.12.2: + resolution: {integrity: sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg==} + dev: false + + /dom-scroll-into-view@2.0.1: + resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==} + dev: false + + /dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dev: true + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + dev: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domexception@2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + deprecated: Use your platform's native DOMException instead + dependencies: + webidl-conversions: 5.0.0 + dev: true + + /domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + dependencies: + domelementtype: 1.3.1 + dev: true + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /dompurify@2.4.7: + resolution: {integrity: sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==} + requiresBuild: true + dev: false + optional: true + + /domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + dev: true + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /dotenv-expand@8.0.3: + resolution: {integrity: sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==} + engines: {node: '>=12'} + dev: true + + /dotenv@16.0.0: + resolution: {integrity: sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==} + engines: {node: '>=12'} + dev: true + + /download@6.2.5: + resolution: {integrity: sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==} + engines: {node: '>=4'} + dependencies: + caw: 2.0.1 + content-disposition: 0.5.4 + decompress: 4.2.1 + ext-name: 5.0.0 + file-type: 5.2.0 + filenamify: 2.1.0 + get-stream: 3.0.0 + got: 7.1.0 + make-dir: 1.3.0 + p-event: 1.3.0 + pify: 3.0.0 + dev: true + + /download@7.1.0: + resolution: {integrity: sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==} + engines: {node: '>=6'} + dependencies: + archive-type: 4.0.0 + caw: 2.0.1 + content-disposition: 0.5.4 + decompress: 4.2.1 + ext-name: 5.0.0 + file-type: 8.1.0 + filenamify: 2.1.0 + get-stream: 3.0.0 + got: 8.3.2 + make-dir: 1.3.0 + p-event: 2.3.1 + pify: 3.0.0 + dev: true + + /duplexer3@0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /echarts-gl@2.0.9(echarts@5.3.2): + resolution: {integrity: sha512-oKeMdkkkpJGWOzjgZUsF41DOh6cMsyrGGXimbjK2l6Xeq/dBQu4ShG2w2Dzrs/1bD27b2pLTGSaUzouY191gzA==} + peerDependencies: + echarts: ^5.1.2 + dependencies: + claygl: 1.3.0 + echarts: 5.3.2 + zrender: 5.5.0 + dev: false + + /echarts-liquidfill@3.1.0(echarts@5.3.2): + resolution: {integrity: sha512-5Dlqs/jTsdTUAsd+K5LPLLTgrbbNORUSBQyk8PSy1Mg2zgHDWm83FmvA4s0ooNepCJojFYRITTQ4GU1UUSKYLw==} + peerDependencies: + echarts: ^5.0.1 + dependencies: + echarts: 5.3.2 + dev: false + + /echarts@5.3.2: + resolution: {integrity: sha512-LWCt7ohOKdJqyiBJ0OGBmE9szLdfA9sGcsMEi+GGoc6+Xo75C+BkcT/6NNGRHAWtnQl2fNow05AQjznpap28TQ==} + dependencies: + tslib: 2.3.0 + zrender: 5.3.1 + dev: false + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true + + /ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.8.7 + dev: true + + /electron-to-chromium@1.4.697: + resolution: {integrity: sha512-iPS+iUNUrqTkPRFjMYv1FGXIUYhj2K4rc/93nrDsDtQGMUqyRouCq/xABOSOljKbriEiwg0bEQHGaeD4OaU56g==} + dev: true + + /element-resize-detector@1.2.4: + resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} + dependencies: + batch-processor: 1.0.0 + dev: false + + /emittery@0.8.1: + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} + engines: {node: '>=10'} + dev: true + + /emoji-mart-vue-fast@11.1.1(vue@3.2.47): + resolution: {integrity: sha512-mMN49N2lCQCjanSzLYBS1PlBO+7Do092FnrsWwogwmOo4p+L8N3L8TjcDk30ByXMCjSEcCDsjupCxIcaBpVNKg==} + peerDependencies: + vue: '>2.0.0' + dependencies: + '@babel/polyfill': 7.12.1 + '@babel/runtime': 7.24.0 + vue: 3.2.47 + vue-virtual-scroller: 1.1.2(vue@3.2.47) + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: true + + /encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + dev: false + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /enquire.js@2.1.6: + resolution: {integrity: sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==} + dev: false + + /entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + dev: true + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + requiresBuild: true + dependencies: + prr: 1.0.1 + dev: true + optional: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.22.5: + resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.1 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.0 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.5 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.14 + dev: true + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + /es-module-lexer@0.9.3: + resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + dev: true + + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.1 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild-android-64@0.14.54: + resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-64@0.15.18: + resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64@0.14.54: + resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64@0.15.18: + resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64@0.14.54: + resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64@0.15.18: + resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64@0.14.54: + resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64@0.15.18: + resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64@0.14.54: + resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64@0.15.18: + resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64@0.14.54: + resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64@0.15.18: + resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32@0.14.54: + resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32@0.15.18: + resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64@0.14.54: + resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64@0.15.18: + resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64@0.14.54: + resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64@0.15.18: + resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm@0.14.54: + resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm@0.15.18: + resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le@0.14.54: + resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le@0.15.18: + resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le@0.14.54: + resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le@0.15.18: + resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64@0.14.54: + resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64@0.15.18: + resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x@0.14.54: + resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x@0.15.18: + resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64@0.14.54: + resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64@0.15.18: + resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-node-loader@0.6.5: + resolution: {integrity: sha512-uPP+dllWm38cFvDysdocutN3lfe5pTIbddAHp1ENyLzpHYqE2r+3Wo+pfg9X3p8DFWwzIisft5YkeBIthIcixw==} + dependencies: + esbuild: 0.20.1 + dev: true + + /esbuild-openbsd-64@0.14.54: + resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64@0.15.18: + resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-plugin-alias@0.1.2: + resolution: {integrity: sha512-WsX0OJy8IGOsGZV+4oHEU5B6XQUpxOsZN1iSoYf9COTDbY7WXcOwd1oCLYNWUIWCExyGXSghIGq2k7sXBldxwQ==} + dev: true + + /esbuild-register@3.5.0(esbuild@0.20.1): + resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + peerDependencies: + esbuild: '>=0.12 <1' + dependencies: + debug: 4.3.4(supports-color@9.4.0) + esbuild: 0.20.1 + transitivePeerDependencies: + - supports-color + dev: true + + /esbuild-sunos-64@0.14.54: + resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64@0.15.18: + resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32@0.14.54: + resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32@0.15.18: + resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64@0.14.54: + resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64@0.15.18: + resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64@0.14.54: + resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64@0.15.18: + resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild@0.11.23: + resolution: {integrity: sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==} + hasBin: true + requiresBuild: true + dev: true + + /esbuild@0.11.3: + resolution: {integrity: sha512-BzVRHcCtFepjS9WcqRjqoIxLqgpK21a8J4Zi4msSGxDxiXVO1IbcqT1KjhdDDnJxKfe7bvzZrvMEX+bVO0Elcw==} + hasBin: true + requiresBuild: true + dev: true + + /esbuild@0.14.54: + resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/linux-loong64': 0.14.54 + esbuild-android-64: 0.14.54 + esbuild-android-arm64: 0.14.54 + esbuild-darwin-64: 0.14.54 + esbuild-darwin-arm64: 0.14.54 + esbuild-freebsd-64: 0.14.54 + esbuild-freebsd-arm64: 0.14.54 + esbuild-linux-32: 0.14.54 + esbuild-linux-64: 0.14.54 + esbuild-linux-arm: 0.14.54 + esbuild-linux-arm64: 0.14.54 + esbuild-linux-mips64le: 0.14.54 + esbuild-linux-ppc64le: 0.14.54 + esbuild-linux-riscv64: 0.14.54 + esbuild-linux-s390x: 0.14.54 + esbuild-netbsd-64: 0.14.54 + esbuild-openbsd-64: 0.14.54 + esbuild-sunos-64: 0.14.54 + esbuild-windows-32: 0.14.54 + esbuild-windows-64: 0.14.54 + esbuild-windows-arm64: 0.14.54 + dev: true + + /esbuild@0.15.18: + resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.15.18 + '@esbuild/linux-loong64': 0.15.18 + esbuild-android-64: 0.15.18 + esbuild-android-arm64: 0.15.18 + esbuild-darwin-64: 0.15.18 + esbuild-darwin-arm64: 0.15.18 + esbuild-freebsd-64: 0.15.18 + esbuild-freebsd-arm64: 0.15.18 + esbuild-linux-32: 0.15.18 + esbuild-linux-64: 0.15.18 + esbuild-linux-arm: 0.15.18 + esbuild-linux-arm64: 0.15.18 + esbuild-linux-mips64le: 0.15.18 + esbuild-linux-ppc64le: 0.15.18 + esbuild-linux-riscv64: 0.15.18 + esbuild-linux-s390x: 0.15.18 + esbuild-netbsd-64: 0.15.18 + esbuild-openbsd-64: 0.15.18 + esbuild-sunos-64: 0.15.18 + esbuild-windows-32: 0.15.18 + esbuild-windows-64: 0.15.18 + esbuild-windows-arm64: 0.15.18 + dev: true + + /esbuild@0.20.1: + resolution: {integrity: sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.1 + '@esbuild/android-arm': 0.20.1 + '@esbuild/android-arm64': 0.20.1 + '@esbuild/android-x64': 0.20.1 + '@esbuild/darwin-arm64': 0.20.1 + '@esbuild/darwin-x64': 0.20.1 + '@esbuild/freebsd-arm64': 0.20.1 + '@esbuild/freebsd-x64': 0.20.1 + '@esbuild/linux-arm': 0.20.1 + '@esbuild/linux-arm64': 0.20.1 + '@esbuild/linux-ia32': 0.20.1 + '@esbuild/linux-loong64': 0.20.1 + '@esbuild/linux-mips64el': 0.20.1 + '@esbuild/linux-ppc64': 0.20.1 + '@esbuild/linux-riscv64': 0.20.1 + '@esbuild/linux-s390x': 0.20.1 + '@esbuild/linux-x64': 0.20.1 + '@esbuild/netbsd-x64': 0.20.1 + '@esbuild/openbsd-x64': 0.20.1 + '@esbuild/sunos-x64': 0.20.1 + '@esbuild/win32-arm64': 0.20.1 + '@esbuild/win32-ia32': 0.20.1 + '@esbuild/win32-x64': 0.20.1 + dev: true + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: true + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-prettier@8.6.0(eslint@8.22.0): + resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.22.0 + dev: true + + /eslint-define-config@1.14.0: + resolution: {integrity: sha512-NREt5SzMwKmLAY28YdaqIiTSJxfPpuZ+1ZLJxY2Wbj02dYF4QX81z0q9MPMjZB8C+SlCu66qAhcPpFJyhXOiuA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13', pnpm: '>= 7.0.0'} + dev: true + + /eslint-plugin-jest@27.2.1(@typescript-eslint/eslint-plugin@5.20.0)(eslint@8.22.0)(jest@27.3.1)(typescript@4.6.3): + resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.20.0(@typescript-eslint/parser@5.20.0)(eslint@8.22.0)(typescript@4.6.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.22.0)(typescript@4.6.3) + eslint: 8.22.0 + jest: 27.3.1(ts-node@10.7.0) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.6.0)(eslint@8.22.0)(prettier@2.6.2): + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + 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: 8.22.0 + eslint-config-prettier: 8.6.0(eslint@8.22.0) + prettier: 2.6.2 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-plugin-vue@9.9.0(eslint@8.22.0): + resolution: {integrity: sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.22.0 + eslint-utils: 3.0.0(eslint@8.22.0) + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.0.15 + semver: 7.6.0 + vue-eslint-parser: 9.4.2(eslint@8.22.0) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils@3.0.0(eslint@8.22.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.22.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.22.0: + resolution: {integrity: sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.4.1 + '@humanwhocodes/config-array': 0.10.7 + '@humanwhocodes/gitignore-to-minimatch': 1.0.2 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@9.4.0) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-utils: 3.0.0(eslint@8.22.0) + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + functional-red-black-tree: 1.0.1 + glob-parent: 6.0.2 + globals: 13.24.0 + globby: 11.1.0 + grapheme-splitter: 1.0.4 + ignore: 5.3.1 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + v8-compile-cache: 2.4.0 + transitivePeerDependencies: + - supports-color + dev: true + + /esno@0.14.1: + resolution: {integrity: sha512-yDFYw6dGUjCT1qKsdG7WOc/RzIh/qwxUEVZ+ohCltaxBxEFMNqeqbQL9xjRl6Yvdwrfc5OCjUA9JbFmuu/8BKg==} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + esbuild: 0.20.1 + esbuild-node-loader: 0.6.5 + esbuild-register: 3.5.0(esbuild@0.20.1) + import-meta-resolve: 1.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + + /exec-buffer@3.2.0: + resolution: {integrity: sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==} + engines: {node: '>=4'} + dependencies: + execa: 0.7.0 + p-finally: 1.0.0 + pify: 3.0.0 + rimraf: 2.7.1 + tempfile: 2.0.0 + dev: true + + /execa@0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} + engines: {node: '>=4'} + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + + /execa@1.0.0: + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} + engines: {node: '>=6'} + dependencies: + cross-spawn: 6.0.5 + get-stream: 4.1.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + + /execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execall@2.0.0: + resolution: {integrity: sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==} + engines: {node: '>=8'} + dependencies: + clone-regexp: 2.2.0 + dev: true + + /executable@4.1.1: + resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} + engines: {node: '>=4'} + dependencies: + pify: 2.3.0 + dev: true + + /exit-on-epipe@1.0.1: + resolution: {integrity: sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==} + engines: {node: '>=0.8'} + dev: false + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + dev: true + + /expect@27.5.1: + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-get-type: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + dev: true + + /ext-list@2.2.2: + resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} + engines: {node: '>=0.10.0'} + dependencies: + mime-db: 1.52.0 + dev: true + + /ext-name@5.0.0: + resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} + engines: {node: '>=4'} + dependencies: + ext-list: 2.2.2 + sort-keys-length: 1.0.1 + dev: true + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: true + + /extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-xml-parser@4.3.5: + resolution: {integrity: sha512-sWvP1Pl8H03B8oFJpFR3HE31HUfwtX7Rlf9BNsvdpujD4n7WMhfmu8h9wOV2u+c1k0ZilTADhPqypzx2J690ZQ==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: true + + /fastest-levenshtein@1.0.12: + resolution: {integrity: sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==} + dev: false + + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + dev: true + + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + dependencies: + reusify: 1.0.4 + dev: true + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + + /fflate@0.4.8: + resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} + dev: false + + /figures@1.7.0: + resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: 1.0.5 + object-assign: 4.1.1 + dev: true + + /figures@2.0.0: + resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /file-type@10.11.0: + resolution: {integrity: sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==} + engines: {node: '>=6'} + dev: true + + /file-type@12.4.2: + resolution: {integrity: sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==} + engines: {node: '>=8'} + dev: true + + /file-type@3.9.0: + resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} + engines: {node: '>=0.10.0'} + dev: true + + /file-type@4.4.0: + resolution: {integrity: sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==} + engines: {node: '>=4'} + dev: true + + /file-type@5.2.0: + resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} + engines: {node: '>=4'} + dev: true + + /file-type@6.2.0: + resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} + engines: {node: '>=4'} + dev: true + + /file-type@8.1.0: + resolution: {integrity: sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==} + engines: {node: '>=6'} + dev: true + + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + dev: true + + /filename-reserved-regex@2.0.0: + resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} + engines: {node: '>=4'} + dev: true + + /filenamify@2.1.0: + resolution: {integrity: sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==} + engines: {node: '>=4'} + dependencies: + filename-reserved-regex: 2.0.0 + strip-outer: 1.0.1 + trim-repeated: 1.0.0 + dev: true + + /fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /find-node-modules@2.1.3: + resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} + dependencies: + findup-sync: 4.0.0 + merge: 2.1.1 + dev: true + + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: true + + /find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + dev: true + + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-versions@3.2.0: + resolution: {integrity: sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==} + engines: {node: '>=6'} + dependencies: + semver-regex: 2.0.0 + dev: true + + /findup-sync@4.0.0: + resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} + engines: {node: '>= 8'} + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.5 + resolve-dir: 1.0.1 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: true + + /follow-redirects@1.15.5(debug@4.3.4): + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.4(supports-color@9.4.0) + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: true + + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /frac@1.1.2: + resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} + engines: {node: '>=0.8'} + dev: false + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + + /fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: true + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + functions-have-names: 1.2.3 + dev: true + + /functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.1 + + /get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + dev: true + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + dev: true + + /get-proxy@2.1.0: + resolution: {integrity: sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==} + engines: {node: '>=4'} + dependencies: + npm-conf: 1.1.3 + dev: true + + /get-stdin@4.0.1: + resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} + engines: {node: '>=0.10.0'} + dev: true + + /get-stdin@8.0.0: + resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} + engines: {node: '>=10'} + dev: true + + /get-stream@2.3.1: + resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} + engines: {node: '>=0.10.0'} + dependencies: + object-assign: 4.1.1 + pinkie-promise: 2.0.1 + dev: true + + /get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + dev: true + + /get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + dependencies: + pump: 3.0.0 + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + dev: true + + /get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + dev: true + + /gifsicle@5.2.0: + resolution: {integrity: sha512-vOIS3j0XoTCxq9pkGj43gEix82RkI5FveNgaFZutjbaui/HH+4fR8Y56dwXDuxYo8hR4xOo6/j2h1WHoQW6XLw==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + bin-build: 3.0.0 + bin-wrapper: /bin-wrapper-china@0.1.0 + execa: 5.1.1 + logalot: 2.1.0 + dev: true + + /git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + dev: true + + /git-semver-tags@4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + meow: 8.1.2 + semver: 6.3.1 + dev: true + + /gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + dependencies: + ini: 1.3.8 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.1.4: + resolution: {integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + requiresBuild: true + dependencies: + ini: 4.1.1 + dev: true + optional: true + + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + + /global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + dev: true + + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + dev: true + + /global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + dev: true + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + dev: true + + /globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + glob: 7.2.3 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + dev: true + + /good-listener@1.2.2: + resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} + dependencies: + delegate: 3.2.0 + dev: false + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.4 + + /got@7.1.0: + resolution: {integrity: sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==} + engines: {node: '>=4'} + dependencies: + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.3 + decompress-response: 3.3.0 + duplexer3: 0.1.5 + get-stream: 3.0.0 + is-plain-obj: 1.1.0 + is-retry-allowed: 1.2.0 + is-stream: 1.1.0 + isurl: 1.0.0 + lowercase-keys: 1.0.1 + p-cancelable: 0.3.0 + p-timeout: 1.2.1 + safe-buffer: 5.2.1 + timed-out: 4.0.1 + url-parse-lax: 1.0.0 + url-to-options: 1.0.1 + dev: true + + /got@8.3.2: + resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==} + engines: {node: '>=4'} + dependencies: + '@sindresorhus/is': 0.7.0 + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.3 + cacheable-request: 2.1.4 + decompress-response: 3.3.0 + duplexer3: 0.1.5 + get-stream: 3.0.0 + into-stream: 3.1.0 + is-retry-allowed: 1.2.0 + isurl: 1.0.0 + lowercase-keys: 1.0.1 + mimic-response: 1.0.1 + p-cancelable: 0.4.1 + p-timeout: 2.0.1 + pify: 3.0.0 + safe-buffer: 5.2.1 + timed-out: 4.0.1 + url-parse-lax: 3.0.0 + url-to-options: 1.0.1 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /gradient-parser@1.0.2: + resolution: {integrity: sha512-gR6nY33xC9yJoH4wGLQtZQMXDi6RI3H37ERu7kQCVUzlXjNedpZM7xcA489Opwbq0BSGohtWGsWsntupmxelMg==} + engines: {node: '>=0.10.0'} + dev: false + + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + /has-symbol-support-x@1.4.2: + resolution: {integrity: sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-to-string-tag-x@1.4.1: + resolution: {integrity: sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==} + dependencies: + has-symbol-support-x: 1.4.2 + dev: true + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + + /has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + + /has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + dev: true + + /has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + + /hash-sum@2.0.0: + resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} + dev: true + + /hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + dependencies: + capital-case: 1.0.4 + tslib: 2.6.2 + dev: true + + /homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: true + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /html-encoding-sniffer@2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + dev: true + + /html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + dependencies: + whatwg-encoding: 2.0.0 + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.29.1 + dev: true + + /html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + dev: true + + /html2canvas@1.4.1: + resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} + engines: {node: '>=8.0.0'} + dependencies: + css-line-break: 2.1.0 + text-segmentation: 1.0.3 + dev: false + + /htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /htmlparser2@7.2.0: + resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 3.0.1 + dev: true + + /http-cache-semantics@3.8.1: + resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==} + dev: true + + /http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@9.4.0) + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.5(debug@4.3.4) + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: true + + /http-server@14.0.0: + resolution: {integrity: sha512-XTePIXAo5x72bI8SlKFSqsg7UuSHwsOa4+RJIe56YeMUvfTvGDy7TxFkTEhfIRmM/Dnf6x29ut541ythSBZdkQ==} + engines: {node: '>=12'} + hasBin: true + dependencies: + basic-auth: 2.0.1 + colors: 1.4.0 + corser: 2.0.1 + he: 1.2.0 + html-encoding-sniffer: 3.0.0 + http-proxy: 1.18.1 + mime: 1.6.0 + minimist: 1.2.8 + opener: 1.5.2 + portfinder: 1.0.32 + secure-compare: 3.0.1 + union: 0.5.0 + url-join: 4.0.1 + transitivePeerDependencies: + - debug + - supports-color + dev: true + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@9.4.0) + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /husky@7.0.4: + resolution: {integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==} + engines: {node: '>=12'} + hasBin: true + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + dev: true + + /ids@1.0.5: + resolution: {integrity: sha512-XQ0yom/4KWTL29sLG+tyuycy7UmeaM/79GRtSJq6IG9cJGIPeBz5kwDCguie3TwxaMNIc3WtPi0cTa1XYHicpw==} + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true + + /image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + requiresBuild: true + dev: true + + /imagemin-gifsicle@7.0.0: + resolution: {integrity: sha512-LaP38xhxAwS3W8PFh4y5iQ6feoTSF+dTAXFRUEYQWYst6Xd+9L/iPk34QGgK/VO/objmIlmq9TStGfVY2IcHIA==} + engines: {node: '>=10'} + dependencies: + execa: 1.0.0 + gifsicle: 5.2.0 + is-gif: 3.0.0 + dev: true + + /imagemin-jpegtran@7.0.0: + resolution: {integrity: sha512-MJoyTCW8YjMJf56NorFE41SR/WkaGA3IYk4JgvMlRwguJEEd3PnP9UxA8Y2UWjquz8d+On3Ds/03ZfiiLS8xTQ==} + engines: {node: '>=10'} + dependencies: + exec-buffer: 3.2.0 + is-jpg: 2.0.0 + jpegtran-bin: 5.0.2 + dev: true + + /imagemin-mozjpeg@9.0.0: + resolution: {integrity: sha512-TwOjTzYqCFRgROTWpVSt5UTT0JeCuzF1jswPLKALDd89+PmrJ2PdMMYeDLYZ1fs9cTovI9GJd68mRSnuVt691w==} + engines: {node: '>=10'} + dependencies: + execa: 4.1.0 + is-jpg: 2.0.0 + mozjpeg: 7.1.1 + dev: true + + /imagemin-optipng@8.0.0: + resolution: {integrity: sha512-CUGfhfwqlPjAC0rm8Fy+R2DJDBGjzy2SkfyT09L8rasnF9jSoHFqJ1xxSZWK6HVPZBMhGPMxCTL70OgTHlLF5A==} + engines: {node: '>=10'} + dependencies: + exec-buffer: 3.2.0 + is-png: 2.0.0 + optipng-bin: 7.0.1 + dev: true + + /imagemin-pngquant@9.0.2: + resolution: {integrity: sha512-cj//bKo8+Frd/DM8l6Pg9pws1pnDUjgb7ae++sUX1kUVdv2nrngPykhiUOgFeE0LGY/LmUbCf4egCHC4YUcZSg==} + engines: {node: '>=10'} + dependencies: + execa: 4.1.0 + is-png: 2.0.0 + is-stream: 2.0.1 + ow: 0.17.0 + pngquant-bin: 6.0.1 + dev: true + + /imagemin-svgo@9.0.0: + resolution: {integrity: sha512-uNgXpKHd99C0WODkrJ8OO/3zW3qjgS4pW7hcuII0RcHN3tnKxDjJWcitdVC/TZyfIqSricU8WfrHn26bdSW62g==} + engines: {node: '>=10'} + dependencies: + is-svg: 4.4.0 + svgo: 2.8.0 + dev: true + + /imagemin-webp@6.1.0: + resolution: {integrity: sha512-i8ZluZV1pfQX9aVzmZ/VZh9KBSdPwUlp5VruAa9c30GZnX/nMl5n7h+oUMnI7Mg7+SUpu9mYBsw2nsYGUEllWQ==} + engines: {node: '>=10'} + dependencies: + cwebp-bin: 6.1.2 + exec-buffer: 3.2.0 + is-cwebp-readable: 3.0.0 + dev: true + + /imagemin@7.0.1: + resolution: {integrity: sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==} + engines: {node: '>=8'} + dependencies: + file-type: 12.4.2 + globby: 10.0.2 + graceful-fs: 4.2.11 + junk: 3.1.0 + make-dir: 3.1.0 + p-pipe: 3.1.0 + replace-ext: 1.0.1 + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /import-meta-resolve@1.1.1: + resolution: {integrity: sha512-JiTuIvVyPaUg11eTrNDx5bgQ/yMKMZffc7YSjvQeSMXy58DO2SQ8BtAf3xteZvmzvjYh14wnqNjL8XVeDy2o9A==} + dependencies: + builtins: 4.1.0 + dev: true + + /import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + requiresBuild: true + dev: true + optional: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@2.1.0: + resolution: {integrity: sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==} + engines: {node: '>=0.10.0'} + dependencies: + repeating: 2.0.1 + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + requiresBuild: true + dev: true + optional: true + + /inquirer@6.5.2: + resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} + engines: {node: '>=6.0.0'} + dependencies: + ansi-escapes: 3.2.0 + chalk: 2.4.2 + cli-cursor: 2.1.0 + cli-width: 2.2.1 + external-editor: 3.1.0 + figures: 2.0.0 + lodash: 4.17.21 + mute-stream: 0.0.7 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 2.1.1 + strip-ansi: 5.2.0 + through: 2.3.8 + dev: true + + /inquirer@8.2.2: + resolution: {integrity: sha512-pG7I/si6K/0X7p1qU+rfWnpTE1UIkTONN1wxtzh0d+dHXtT/JG6qBgLxoyHVsQa8cFABxAPh0pD6uUUHiAoaow==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + dev: true + + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.1 + side-channel: 1.0.6 + dev: true + + /into-stream@3.1.0: + resolution: {integrity: sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==} + engines: {node: '>=4'} + dependencies: + from2: 2.3.0 + p-is-promise: 1.1.0 + dev: true + + /intro.js@5.1.0: + resolution: {integrity: sha512-zwWl/duTh00eeNcZRU4o4/xxloNYPFKs4n4lMRDNx59jZr+qRI0jSOnzqYMOuVftD4beGrmxBHz4k8qp9/dCMA==} + dev: false + + /is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + dependencies: + hasown: 2.0.1 + dev: true + + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-ci@3.0.0: + resolution: {integrity: sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==} + hasBin: true + dependencies: + ci-info: 3.9.0 + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.1 + dev: true + + /is-cwebp-readable@3.0.0: + resolution: {integrity: sha512-bpELc7/Q1/U5MWHn4NdHI44R3jxk0h9ew9ljzabiRl70/UIjL/ZAqRMb52F5+eke/VC8yTiv4Ewryo1fPWidvA==} + dependencies: + file-type: 10.11.0 + dev: true + + /is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.1 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + dev: true + + /is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-expression@4.0.0: + resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} + dependencies: + acorn: 7.4.1 + object-assign: 4.1.1 + dev: true + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: true + + /is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-finite@1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-gif@3.0.0: + resolution: {integrity: sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==} + engines: {node: '>=6'} + dependencies: + file-type: 10.11.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + + /is-jpg@2.0.0: + resolution: {integrity: sha512-ODlO0ruzhkzD3sdynIainVP5eoOFNN85rxA1+cwwnPe4dKyX0r5+hxNO5XpCrxlHcmb9vkOit9mhRD2JVuimHg==} + engines: {node: '>=6'} + dev: true + + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + + /is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + dev: false + + /is-natural-number@4.0.1: + resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} + dev: true + + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-object@1.0.2: + resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-plain-object@3.0.1: + resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} + engines: {node: '>=0.10.0'} + dev: false + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + /is-png@2.0.0: + resolution: {integrity: sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==} + engines: {node: '>=8'} + dev: true + + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-regexp@2.1.0: + resolution: {integrity: sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==} + engines: {node: '>=6'} + dev: true + + /is-retry-allowed@1.2.0: + resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + dev: true + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-svg@4.4.0: + resolution: {integrity: sha512-v+AgVwiK5DsGtT9ng+m4mClp6zDAmwrW8nZi6Gg15qzvBnRWWdfWA1TGaXyCDnWq5g5asofIgMVl3PjKxvk1ug==} + engines: {node: '>=6'} + dependencies: + fast-xml-parser: 4.3.5 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: true + + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.14 + dev: true + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.7 + dev: true + + /is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.24.0 + '@babel/parser': 7.24.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4(supports-color@9.4.0) + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /isurl@1.0.0: + resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==} + engines: {node: '>= 4'} + dependencies: + has-to-string-tag-x: 1.4.1 + is-object: 1.0.2 + dev: true + + /jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.5 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + dev: true + + /jest-changed-files@27.5.1: + resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + execa: 5.1.1 + throat: 6.0.2 + dev: true + + /jest-circus@27.5.1: + resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.25 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli@27.5.1(ts-node@10.7.0): + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + 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': 27.5.1(ts-node@10.7.0) + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 27.5.1(ts-node@10.7.0) + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-config@27.5.1(ts-node@10.7.0): + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + 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': 7.24.0 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1(@babel/core@7.24.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.7.0(@types/node@17.0.25)(typescript@4.6.3) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-diff@27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-docblock@27.5.1: + resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@27.5.1: + resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + jest-get-type: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-environment-jsdom@27.5.1: + resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.25 + jest-mock: 27.5.1 + jest-util: 27.5.1 + jsdom: 16.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-environment-node@27.5.1: + resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.25 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: true + + /jest-get-type@27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-haste-map@27.5.1: + resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/graceful-fs': 4.1.9 + '@types/node': 17.0.25 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 27.5.1 + jest-serializer: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /jest-jasmine2@27.5.1: + resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.25 + chalk: 4.1.2 + co: 4.6.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-leak-detector@27.5.1: + resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-matcher-utils@27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-message-util@27.5.1: + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/code-frame': 7.23.5 + '@jest/types': 27.5.1 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 17.0.25 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 27.5.1 + dev: true + + /jest-regex-util@27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-resolve-dependencies@27.5.1: + resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-regex-util: 27.5.1 + jest-snapshot: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@27.5.1: + resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1) + jest-util: 27.5.1 + jest-validate: 27.5.1 + resolve: 1.22.8 + resolve.exports: 1.1.1 + slash: 3.0.0 + dev: true + + /jest-runner@27.5.1: + resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.25 + chalk: 4.1.2 + emittery: 0.8.1 + graceful-fs: 4.2.11 + jest-docblock: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-haste-map: 27.5.1 + jest-leak-detector: 27.5.1 + jest-message-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runtime: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + source-map-support: 0.5.21 + throat: 6.0.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-runtime@27.5.1: + resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/globals': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + execa: 5.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-serializer@27.5.1: + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/node': 17.0.25 + graceful-fs: 4.2.11 + dev: true + + /jest-snapshot@27.5.1: + resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.24.0 + '@babel/generator': 7.23.6 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0) + '@babel/traverse': 7.24.0 + '@babel/types': 7.24.0 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__traverse': 7.20.5 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) + chalk: 4.1.2 + expect: 27.5.1 + graceful-fs: 4.2.11 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + jest-haste-map: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + natural-compare: 1.4.0 + pretty-format: 27.5.1 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 17.0.25 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@27.5.1: + resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 27.5.1 + leven: 3.1.0 + pretty-format: 27.5.1 + dev: true + + /jest-watcher@27.5.1: + resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.25 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest-util: 27.5.1 + string-length: 4.0.2 + dev: true + + /jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 17.0.45 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 17.0.25 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@27.3.1(ts-node@10.7.0): + resolution: {integrity: sha512-U2AX0AgQGd5EzMsiZpYt8HyZ+nSVIh5ujQ9CPp9EQZJMjXIiSZpJNweZl0swatKRoqHWgGKM3zaSwm4Zaz87ng==} + 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': 27.5.1(ts-node@10.7.0) + import-local: 3.1.0 + jest-cli: 27.5.1(ts-node@10.7.0) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: true + + /jpegtran-bin@5.0.2: + resolution: {integrity: sha512-4FSmgIcr8d5+V6T1+dHbPZjaFH0ogVyP4UVsE+zri7S9YLO4qAT2our4IN3sW3STVgNTbqPermdIgt2XuAJ4EA==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + bin-build: 3.0.0 + bin-wrapper: /bin-wrapper-china@0.1.0 + logalot: 2.1.0 + dev: true + + /jpegtran-bin@6.0.1: + resolution: {integrity: sha512-WohhhHhqe22de7PU8hXs6Sr5d4BAvkrfA93NR5tGlHyPnFLgvEW/bH+q7fv65JgoiQDsd7SBwwQ/OGRBivU3Mw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + requiresBuild: true + dependencies: + bin-build: 3.0.0 + bin-wrapper: /bin-wrapper-china@0.1.0 + dev: true + + /js-base64@2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsdom@16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.11.3 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.4.3 + domexception: 2.0.1 + escodegen: 2.1.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.9 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-buffer@3.0.0: + resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + + /jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: true + + /jspdf@2.5.1: + resolution: {integrity: sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==} + dependencies: + '@babel/runtime': 7.24.0 + atob: 2.1.2 + btoa: 1.2.1 + fflate: 0.4.8 + optionalDependencies: + canvg: 3.0.10 + core-js: 3.36.0 + dompurify: 2.4.7 + html2canvas: 1.4.1 + dev: false + + /junk@3.1.0: + resolution: {integrity: sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==} + engines: {node: '>=8'} + dev: true + + /keyv@3.0.0: + resolution: {integrity: sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==} + dependencies: + json-buffer: 3.0.0 + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /known-css-properties@0.24.0: + resolution: {integrity: sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA==} + dev: true + + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + + /less@4.1.2: + resolution: {integrity: sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.6.2 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 2.9.1 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lilconfig@2.0.4: + resolution: {integrity: sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lint-staged@12.3.7: + resolution: {integrity: sha512-/S4D726e2GIsDVWIk1XGvheCaDm1SJRQp8efamZFWJxQMVEbOwSysp7xb49Oo73KYCdy97mIWinhlxcoNqIfIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + cli-truncate: 3.1.0 + colorette: 2.0.20 + commander: 8.3.0 + debug: 4.3.4(supports-color@9.4.0) + execa: 5.1.1 + lilconfig: 2.0.4 + listr2: 4.0.5 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-inspect: 1.13.1 + pidtree: 0.5.0 + string-argv: 0.3.2 + supports-color: 9.4.0 + yaml: 1.10.2 + transitivePeerDependencies: + - enquirer + dev: true + + /listr2@4.0.5: + resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==} + engines: {node: '>=12'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.1 + rxjs: 7.8.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + dev: true + + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + dev: true + + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: false + + /lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + requiresBuild: true + dev: true + optional: true + + /lodash.map@4.6.0: + resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} + dev: true + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + requiresBuild: true + dev: true + optional: true + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + + /lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: true + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + requiresBuild: true + dev: true + optional: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + dev: true + + /logalot@2.1.0: + resolution: {integrity: sha512-Ah4CgdSRfeCJagxQhcVNMi9BfGYyEKLa6d7OA6xSbld/Hg3Cf2QiOa1mDpmG7Ve8LOH6DN3mdttzjQAvWTyVkw==} + engines: {node: '>=0.10.0'} + dependencies: + figures: 1.7.0 + squeak: 1.3.0 + dev: true + + /longest@1.0.1: + resolution: {integrity: sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==} + engines: {node: '>=0.10.0'} + dev: true + + /longest@2.0.1: + resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} + engines: {node: '>=0.10.0'} + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /loud-rejection@1.6.0: + resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} + engines: {node: '>=0.10.0'} + dependencies: + currently-unhandled: 0.4.1 + signal-exit: 3.0.7 + dev: true + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.2 + dev: true + + /lowercase-keys@1.0.0: + resolution: {integrity: sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==} + engines: {node: '>=0.10.0'} + dev: true + + /lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + dev: true + + /lpad-align@1.1.2: + resolution: {integrity: sha512-MMIcFmmR9zlGZtBcFOows6c2COMekHCIFJz3ew/rRpKZ1wR4mXDPzvcVqLarux8M33X4TPSq2Jdw8WJj0q0KbQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + get-stdin: 4.0.1 + indent-string: 2.1.0 + longest: 1.0.1 + meow: 3.7.0 + dev: true + + /lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /luxon@1.28.1: + resolution: {integrity: sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==} + dev: false + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + + /magic-string@0.26.7: + resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + pify: 4.0.1 + semver: 5.7.2 + dev: true + optional: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: true + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.6.0 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: true + + /mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + dev: true + + /md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + dev: false + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: true + + /memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + dev: true + + /meow@3.7.0: + resolution: {integrity: sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==} + engines: {node: '>=0.10.0'} + dependencies: + camelcase-keys: 2.1.0 + decamelize: 1.2.0 + loud-rejection: 1.6.0 + map-obj: 1.0.1 + minimist: 1.2.8 + normalize-package-data: 2.5.0 + object-assign: 4.1.1 + read-pkg-up: 1.0.1 + redent: 1.0.0 + trim-newlines: 1.0.0 + dev: true + + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-options@1.0.1: + resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==} + engines: {node: '>=4'} + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /merge@2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + dev: true + + /micromatch@3.1.0: + resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 1.0.0 + extend-shallow: 2.0.1 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 5.1.0 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + requiresBuild: true + dev: true + + /mimic-fn@1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.5: + resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mitt@2.1.0: + resolution: {integrity: sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==} + dev: false + + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + dev: false + + /mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mockjs@1.1.0: + resolution: {integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==} + hasBin: true + dependencies: + commander: 12.0.0 + + /modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + dev: true + + /mousetrap@1.6.5: + resolution: {integrity: sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==} + dev: false + + /mozjpeg@7.1.1: + resolution: {integrity: sha512-iIDxWvzhWvLC9mcRJ1uSkiKaj4drF58oCqK2bITm5c2Jt6cJ8qQjSSru2PCaysG+hLIinryj8mgz5ZJzOYTv1A==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + bin-build: 3.0.0 + bin-wrapper: /bin-wrapper-china@0.1.0 + dev: true + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /multimatch@4.0.0: + resolution: {integrity: sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==} + engines: {node: '>=8'} + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 3.0.0 + array-union: 2.1.0 + arrify: 2.0.1 + minimatch: 3.1.2 + dev: true + + /mute-stream@0.0.7: + resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} + dev: true + + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /nanopop@2.4.2: + resolution: {integrity: sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==} + dev: false + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /needle@2.9.1: + resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + requiresBuild: true + dependencies: + debug: 3.2.7 + iconv-lite: 0.4.24 + sax: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-html-parser@5.4.2: + resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==} + dependencies: + css-select: 4.3.0 + he: 1.2.0 + dev: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.13.1 + semver: 7.6.0 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-selector@0.2.0: + resolution: {integrity: sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==} + dev: true + + /normalize-url@2.0.1: + resolution: {integrity: sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==} + engines: {node: '>=4'} + dependencies: + prepend-http: 2.0.0 + query-string: 5.1.1 + sort-keys: 2.0.0 + dev: true + + /npm-conf@1.1.3: + resolution: {integrity: sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==} + engines: {node: '>=4'} + dependencies: + config-chain: 1.1.13 + pify: 3.0.0 + dev: true + + /npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.1 + string.prototype.padend: 3.1.5 + dev: true + + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + dev: false + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@2.0.1: + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} + dependencies: + mimic-fn: 1.2.0 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /optipng-bin@7.0.1: + resolution: {integrity: sha512-W99mpdW7Nt2PpFiaO+74pkht7KEqkXkeRomdWXfEz3SALZ6hns81y/pm1dsGZ6ItUIfchiNIP6ORDr1zETU1jA==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + bin-build: 3.0.0 + bin-wrapper: /bin-wrapper-china@0.1.0 + dev: true + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /os-filter-obj@2.0.0: + resolution: {integrity: sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==} + engines: {node: '>=4'} + dependencies: + arch: 2.2.0 + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /ow@0.17.0: + resolution: {integrity: sha512-i3keDzDQP5lWIe4oODyDFey1qVrq2hXKTuTH2VpqwpYtzPiKZt2ziRI4NBQmgW40AnV5Euz17OyWweCb+bNEQA==} + engines: {node: '>=10'} + dependencies: + type-fest: 0.11.0 + dev: true + + /p-cancelable@0.3.0: + resolution: {integrity: sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==} + engines: {node: '>=4'} + dev: true + + /p-cancelable@0.4.1: + resolution: {integrity: sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==} + engines: {node: '>=4'} + dev: true + + /p-event@1.3.0: + resolution: {integrity: sha512-hV1zbA7gwqPVFcapfeATaNjQ3J0NuzorHPyG8GPL9g/Y/TplWVBVoCKCXL6Ej2zscrCEv195QNWJXuBH6XZuzA==} + engines: {node: '>=4'} + dependencies: + p-timeout: 1.2.1 + dev: true + + /p-event@2.3.1: + resolution: {integrity: sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==} + engines: {node: '>=6'} + dependencies: + p-timeout: 2.0.1 + dev: true + + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + + /p-is-promise@1.1.0: + resolution: {integrity: sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==} + engines: {node: '>=4'} + dev: true + + /p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map-series@1.0.0: + resolution: {integrity: sha512-4k9LlvY6Bo/1FcIdV33wqZQES0Py+iKISU9Uc8p8AjWoZPnFKMpVIVD3s0EYn4jzLh1I+WeUZkJ0Yoa4Qfw3Kg==} + engines: {node: '>=4'} + dependencies: + p-reduce: 1.0.0 + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-pipe@3.1.0: + resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==} + engines: {node: '>=8'} + dev: true + + /p-reduce@1.0.0: + resolution: {integrity: sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==} + engines: {node: '>=4'} + dev: true + + /p-timeout@1.2.1: + resolution: {integrity: sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==} + engines: {node: '>=4'} + dependencies: + p-finally: 1.0.0 + dev: true + + /p-timeout@2.0.1: + resolution: {integrity: sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==} + engines: {node: '>=4'} + dependencies: + p-finally: 1.0.0 + dev: true + + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + dependencies: + error-ex: 1.3.2 + dev: true + + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + dev: true + + /parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: true + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + dev: true + + /path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie-promise: 2.0.1 + dev: true + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-to-regexp@6.2.0: + resolution: {integrity: sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==} + + /path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: true + + /path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} + dev: true + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: false + optional: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pidtree@0.5.0: + resolution: {integrity: sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /pinia@2.0.12(typescript@4.6.3)(vue@3.2.47): + resolution: {integrity: sha512-tUeuYGFrLU5irmGyRAIxp35q1OTcZ8sKpGT4XkPeVcG35W4R6cfXDbCGexzmVqH5lTQJJTXXbNGutIu9yS5yew==} + 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': 6.6.1 + typescript: 4.6.3 + vue: 3.2.47 + vue-demi: 0.14.7(vue@3.2.47) + dev: false + + /pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: true + + /pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: true + + /pinyin-pro@3.11.0: + resolution: {integrity: sha512-l2JDFyEIMdTIyff3OkuoSIJCpYTwrxrR2KuMyGMjdNEcHGcEVSKIEb7mvKEKOhJaZLp2FB++Jax+MD0BWafbhg==} + dev: false + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + dev: false + + /pngquant-bin@6.0.1: + resolution: {integrity: sha512-Q3PUyolfktf+hYio6wsg3SanQzEU/v8aICg/WpzxXcuCMRb7H2Q81okfpcEztbMvw25ILjd3a87doj2N9kvbpQ==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + bin-build: 3.0.0 + bin-wrapper: /bin-wrapper-china@0.1.0 + execa: 4.1.0 + dev: true + + /portfinder@1.0.32: + resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} + engines: {node: '>= 0.12.0'} + dependencies: + async: 2.6.4 + debug: 3.2.7 + mkdirp: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + dev: true + + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: true + + /postcss-html@1.4.1: + resolution: {integrity: sha512-OKihuWxPuBQrQeLNsavP7ytJ9IYNj/ViAXB2v7Qjh56LnfESKrkahKA9si4VfPN8xtz6oqUE6KdL0bTPrHJr6g==} + engines: {node: ^12 || >=14} + dependencies: + htmlparser2: 7.2.0 + postcss: 8.4.12 + postcss-safe-parser: 6.0.0(postcss@8.4.12) + dev: true + + /postcss-less@6.0.0(postcss@8.4.12): + resolution: {integrity: sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==} + engines: {node: '>=12'} + peerDependencies: + postcss: ^8.3.5 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + dev: true + + /postcss-prefix-selector@1.16.0(postcss@5.2.18): + resolution: {integrity: sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==} + peerDependencies: + postcss: '>4 <9' + dependencies: + postcss: 5.2.18 + dev: true + + /postcss-resolve-nested-selector@0.1.1: + resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==} + dev: true + + /postcss-safe-parser@6.0.0(postcss@8.4.12): + resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.3.3 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-sorting@7.0.1(postcss@8.4.12): + resolution: {integrity: sha512-iLBFYz6VRYyLJEJsBJ8M3TCqNcckVzz4wFounSc5Oez35ogE/X+aoC5fFu103Ot7NyvjU3/xqIXn93Gp3kJk4g==} + peerDependencies: + postcss: ^8.3.9 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss@5.2.18: + resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} + engines: {node: '>=0.12'} + dependencies: + chalk: 1.1.3 + js-base64: 2.6.4 + source-map: 0.5.7 + supports-color: 3.2.3 + dev: true + + /postcss@8.4.12: + resolution: {integrity: sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /posthtml-parser@0.2.1: + resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==} + dependencies: + htmlparser2: 3.10.1 + isobject: 2.1.0 + dev: true + + /posthtml-rename-id@1.0.12: + resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /posthtml-render@1.4.0: + resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==} + engines: {node: '>=10'} + dev: true + + /posthtml-svg-mode@1.0.3: + resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==} + dependencies: + merge-options: 1.0.1 + posthtml: 0.9.2 + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + dev: true + + /posthtml@0.9.2: + resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==} + engines: {node: '>=0.10.0'} + dependencies: + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + dev: true + + /preact@10.19.6: + resolution: {integrity: sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==} + dev: false + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prepend-http@1.0.4: + resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} + engines: {node: '>=0.10.0'} + dev: true + + /prepend-http@2.0.0: + resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} + engines: {node: '>=4'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@2.6.2: + resolution: {integrity: sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: true + + /pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /pretty-quick@3.1.1(prettier@2.6.2): + resolution: {integrity: sha512-ZYLGiMoV2jcaas3vTJrLvKAYsxDoXQBUn8OSTxkl67Fyov9lyXivJTl0+2WVh+y6EovGcw7Lm5ThYpH+Sh3XxQ==} + engines: {node: '>=10.13'} + hasBin: true + peerDependencies: + prettier: '>=2.0.0' + dependencies: + chalk: 3.0.0 + execa: 4.1.0 + find-up: 4.1.0 + ignore: 5.3.1 + mri: 1.2.0 + multimatch: 4.0.0 + prettier: 2.6.2 + dev: true + + /print-js@1.6.0: + resolution: {integrity: sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==} + dev: false + + /printj@1.1.2: + resolution: {integrity: sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: true + + /prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + dev: true + optional: true + + /pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: true + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + + /pug-error@2.0.0: + resolution: {integrity: sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==} + dev: true + + /pug-lexer@5.0.1: + resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} + dependencies: + character-parser: 2.2.0 + is-expression: 4.0.0 + pug-error: 2.0.0 + dev: true + + /pug-parser@6.0.0: + resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} + dependencies: + pug-error: 2.0.0 + token-stream: 1.0.0 + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + + /qrcode@1.5.0: + resolution: {integrity: sha512-9MgRpgVc+/+47dFvQeD6U2s0Z92EsKzcHogtum4QB+UNd025WOJSHvn/hjk9xmzj7Stj95CyUAs31mrjxliEsQ==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + dijkstrajs: 1.0.3 + encode-utf8: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + dev: false + + /qrcodejs2@0.0.2: + resolution: {integrity: sha512-+Y4HA+cb6qUzdgvI3KML8GYpMFwB24dFwzMkS/yXq6hwtUGNUnZQdUnksrV1XGMc2mid5ROw5SAuY9XhI3ValA==} + dev: false + + /qs@6.10.3: + resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + + /qs@6.12.0: + resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + dev: false + + /query-string@4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} + engines: {node: '>=0.10.0'} + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + dev: true + + /query-string@5.1.1: + resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} + engines: {node: '>=0.10.0'} + dependencies: + decode-uri-component: 0.2.2 + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + dependencies: + performance-now: 2.1.0 + dev: false + optional: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + dev: true + + /read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + dev: true + + /read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /redent@1.0.0: + resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==} + engines: {node: '>=0.10.0'} + dependencies: + indent-string: 2.1.0 + strip-indent: 1.0.1 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime@0.11.1: + resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} + dev: false + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.24.0 + dev: true + + /regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + dev: true + + /regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: true + + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: true + + /repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: true + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true + + /repeating@2.0.1: + resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} + engines: {node: '>=0.10.0'} + dependencies: + is-finite: 1.1.0 + dev: true + + /replace-ext@1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} + engines: {node: '>= 0.10'} + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + dev: false + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: true + + /resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + /resolve.exports@1.1.1: + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} + engines: {node: '>=10'} + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /responselike@1.0.2: + resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} + dependencies: + lowercase-keys: 1.0.1 + dev: true + + /restore-cursor@2.0.0: + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + dev: true + + /rgbcolor@1.0.1: + resolution: {integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==} + engines: {node: '>= 0.8.15'} + dev: false + optional: true + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup-plugin-purge-icons@0.8.1: + resolution: {integrity: sha512-7ktMV+gWtXAdOIShE8EtTcnpGhozi5H2hKk1MQVGt+7FmlLkjR+XKu1Nyzjocwd6xJvKube2Lh+SfcJ8FYYySw==} + engines: {node: '>= 12'} + dependencies: + '@purge-icons/core': 0.8.0 + '@purge-icons/generated': 0.8.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /rollup-plugin-terser@7.0.2(rollup@2.79.1): + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + 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': 7.23.5 + jest-worker: 26.6.2 + rollup: 2.79.1 + serialize-javascript: 4.0.0 + terser: 5.29.1 + dev: true + + /rollup-plugin-visualizer@5.6.0(rollup@2.72.0): + resolution: {integrity: sha512-CKcc8GTUZjC+LsMytU8ocRr/cGZIfMR7+mdy4YnlyetlmIl/dM8BMnOEpD4JPIGt+ZVW7Db9ZtSsbgyeBH3uTA==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + rollup: ^2.0.0 + dependencies: + nanoid: 3.3.7 + open: 8.4.2 + rollup: 2.72.0 + source-map: 0.7.4 + yargs: 17.7.2 + dev: true + + /rollup@2.72.0: + resolution: {integrity: sha512-KqtR2YcO35/KKijg4nx4STO3569aqCUeGRkKWnJ6r+AvBBrVY9L4pmf4NHVrQr4mTOq6msbohflxr2kpihhaOA==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: true + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + dev: true + + /safe-array-concat@1.1.0: + resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + dev: true + + /safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + dev: true + optional: true + + /saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + dependencies: + compute-scroll-into-view: 1.0.20 + dev: false + + /scrollparent@2.1.0: + resolution: {integrity: sha512-bnnvJL28/Rtz/kz2+4wpBjHzWoEzXhVg/TE8BeVGJHUqE8THNIRnDxDWMktwM+qahvlRdvlLdsQfYe+cuqfZeA==} + dev: false + + /secure-compare@3.0.1: + resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} + dev: true + + /seek-bzip@1.0.6: + resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} + hasBin: true + dependencies: + commander: 2.20.3 + dev: true + + /select@1.1.2: + resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} + dev: false + + /semver-regex@2.0.0: + resolution: {integrity: sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==} + engines: {node: '>=6'} + dev: true + + /semver-truncate@1.1.2: + resolution: {integrity: sha512-V1fGg9i4CL3qesB6U0L6XAm4xOJiHmt4QAacazumuasc03BvtFGIMCduv01JWQ69Nv+JST9TqhSCiJoxoY031w==} + engines: {node: '>=0.10.0'} + dependencies: + semver: 5.7.2 + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case-first: 2.0.2 + dev: true + + /serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + + /set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + + /shallow-equal@1.2.1: + resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} + dev: false + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /showdown@2.1.0: + resolution: {integrity: sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==} + hasBin: true + dependencies: + commander: 9.5.0 + dev: false + + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + + /snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /sort-keys-length@1.0.1: + resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} + engines: {node: '>=0.10.0'} + dependencies: + sort-keys: 1.1.2 + dev: true + + /sort-keys@1.1.2: + resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /sort-keys@2.0.0: + resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} + engines: {node: '>=4'} + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /sortablejs@1.14.0: + resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==} + dev: false + + /sortablejs@1.15.0: + resolution: {integrity: sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==} + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + dev: true + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.17 + dev: true + + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 + dev: true + + /spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + dev: true + + /specificity@0.4.1: + resolution: {integrity: sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==} + hasBin: true + dev: true + + /split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: true + + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + dependencies: + through: 2.3.8 + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /squeak@1.3.0: + resolution: {integrity: sha512-YQL1ulInM+ev8nXX7vfXsCsDh6IqXlrremc1hzi77776BtpWgYJUMto3UM05GSAaGzJgWekszjoKDrVNB5XG+A==} + engines: {node: '>=0.10.0'} + dependencies: + chalk: 1.1.3 + console-stream: 0.1.1 + lpad-align: 1.1.2 + dev: true + + /ssf@0.11.2: + resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} + engines: {node: '>=0.8'} + dependencies: + frac: 1.1.2 + dev: false + + /stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + 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 + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stackblur-canvas@2.7.0: + resolution: {integrity: sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==} + engines: {node: '>=0.1.14'} + dev: false + optional: true + + /static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: true + + /strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + dev: true + + /string.prototype.padend@3.1.5: + resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + dev: true + + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + dev: true + + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + dev: true + + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + dev: true + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + dependencies: + ansi-regex: 3.0.1 + dev: true + + /strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + dependencies: + ansi-regex: 4.1.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + dev: true + + /strip-dirs@2.1.0: + resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} + dependencies: + is-natural-number: 4.0.1 + dev: true + + /strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-indent@1.0.1: + resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + get-stdin: 4.0.1 + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.0.1: + resolution: {integrity: sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==} + engines: {node: '>=8'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strip-outer@1.0.1: + resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: true + + /style-search@0.1.0: + resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} + dev: true + + /stylelint-config-html@1.1.0(postcss-html@1.4.1)(stylelint@14.7.1): + resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==} + engines: {node: ^12 || >=14} + peerDependencies: + postcss-html: ^1.0.0 + stylelint: '>=14.0.0' + dependencies: + postcss-html: 1.4.1 + stylelint: 14.7.1 + dev: true + + /stylelint-config-prettier@9.0.3(stylelint@14.7.1): + resolution: {integrity: sha512-5n9gUDp/n5tTMCq1GLqSpA30w2sqWITSSEiAWQlpxkKGAUbjcemQ0nbkRvRUa0B1LgD3+hCvdL7B1eTxy1QHJg==} + engines: {node: '>= 12'} + hasBin: true + peerDependencies: + stylelint: '>=11.0.0' + dependencies: + stylelint: 14.7.1 + dev: true + + /stylelint-config-recommended-vue@1.4.0(postcss-html@1.4.1)(stylelint@14.7.1): + resolution: {integrity: sha512-DVJqyX2KvMCn9U0+keL12r7xlsH26K4Vg8NrIZuq5MoF7g82DpMp326Om4E0Q+Il1o+bTHuUyejf2XAI0iD04Q==} + engines: {node: ^12 || >=14} + peerDependencies: + postcss-html: ^1.0.0 + stylelint: '>=14.0.0' + dependencies: + postcss-html: 1.4.1 + semver: 7.6.0 + stylelint: 14.7.1 + stylelint-config-html: 1.1.0(postcss-html@1.4.1)(stylelint@14.7.1) + stylelint-config-recommended: 7.0.0(stylelint@14.7.1) + dev: true + + /stylelint-config-recommended@7.0.0(stylelint@14.7.1): + resolution: {integrity: sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==} + peerDependencies: + stylelint: ^14.4.0 + dependencies: + stylelint: 14.7.1 + dev: true + + /stylelint-config-standard@25.0.0(stylelint@14.7.1): + resolution: {integrity: sha512-21HnP3VSpaT1wFjFvv9VjvOGDtAviv47uTp3uFmzcN+3Lt+RYRv6oAplLaV51Kf792JSxJ6svCJh/G18E9VnCA==} + peerDependencies: + stylelint: ^14.4.0 + dependencies: + stylelint: 14.7.1 + stylelint-config-recommended: 7.0.0(stylelint@14.7.1) + dev: true + + /stylelint-order@5.0.0(stylelint@14.7.1): + resolution: {integrity: sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw==} + peerDependencies: + stylelint: ^14.0.0 + dependencies: + postcss: 8.4.12 + postcss-sorting: 7.0.1(postcss@8.4.12) + stylelint: 14.7.1 + dev: true + + /stylelint@14.7.1: + resolution: {integrity: sha512-rUOWm67hrzGXXyO/cInENEejF4urh1dLgOb9cr/3XLDb/t/A+rXQp3p6+no8o8QCKTgBUdhVUq/bXMgE988PJw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 7.1.0 + css-functions-list: 3.2.1 + debug: 4.3.4(supports-color@9.4.0) + execall: 2.0.0 + fast-glob: 3.3.2 + fastest-levenshtein: 1.0.16 + file-entry-cache: 6.0.1 + get-stdin: 8.0.0 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 5.3.1 + import-lazy: 4.0.0 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.24.0 + mathml-tag-names: 2.1.3 + meow: 9.0.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + normalize-selector: 0.2.0 + picocolors: 1.0.0 + postcss: 8.4.12 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.1 + postcss-safe-parser: 6.0.0(postcss@8.4.12) + postcss-selector-parser: 6.0.15 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + specificity: 0.4.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + style-search: 0.1.0 + supports-hyperlinks: 2.3.0 + svg-tags: 1.0.0 + table: 6.8.1 + v8-compile-cache: 2.4.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: true + + /supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + dependencies: + has-flag: 1.0.0 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svg-baker@1.7.0: + resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==} + dependencies: + bluebird: 3.7.2 + clone: 2.1.2 + he: 1.2.0 + image-size: 0.5.5 + loader-utils: 1.4.2 + merge-options: 1.0.1 + micromatch: 3.1.0 + postcss: 5.2.18 + postcss-prefix-selector: 1.16.0(postcss@5.2.18) + posthtml-rename-id: 1.0.12 + posthtml-svg-mode: 1.0.3 + query-string: 4.3.4 + traverse: 0.6.8 + transitivePeerDependencies: + - supports-color + dev: true + + /svg-pathdata@6.0.3: + resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} + engines: {node: '>=12.0.0'} + dev: false + optional: true + + /svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + dev: true + + /svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: true + + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /systemjs@6.14.3: + resolution: {integrity: sha512-hQv45irdhXudAOr8r6SVSpJSGtogdGZUbJBRKCE5nsIS7tsxxvnIHqT4IOPWj+P+HcSzeWzHlGCGpmhPDIKe+w==} + dev: true + + /table@6.8.1: + resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.12.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + dependencies: + bl: 1.2.3 + buffer-alloc: 1.2.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + readable-stream: 2.3.8 + to-buffer: 1.1.1 + xtend: 4.0.2 + dev: true + + /temp-dir@1.0.0: + resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} + engines: {node: '>=4'} + dev: true + + /temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + dev: true + + /tempfile@2.0.0: + resolution: {integrity: sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==} + engines: {node: '>=4'} + dependencies: + temp-dir: 1.0.0 + uuid: 3.4.0 + dev: true + + /tempfile@3.0.0: + resolution: {integrity: sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==} + engines: {node: '>=8'} + dependencies: + temp-dir: 2.0.0 + uuid: 3.4.0 + dev: true + + /tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + dev: true + + /terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: true + + /terser@5.29.1: + resolution: {integrity: sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true + + /text-segmentation@1.0.3: + resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} + dependencies: + utrie: 1.0.2 + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /throat@6.0.2: + resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} + dev: true + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: true + + /through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + dev: true + + /tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + dev: false + + /tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + + /tinymce@5.10.3: + resolution: {integrity: sha512-O59ssHNnujWvSk5Gt8hIGrdNCMKVWVQv9F8siAgLTRgTh0t3NDHrP1UlLtCxArUi9DPWZvlBeUz8D5fJTu7vnA==} + dev: false + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-buffer@1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + + /token-stream@1.0.0: + resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} + dev: true + + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.1 + dev: true + + /tr46@2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.3.1 + dev: true + + /traverse@0.6.8: + resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} + engines: {node: '>= 0.4'} + dev: true + + /trim-newlines@1.0.0: + resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==} + engines: {node: '>=0.10.0'} + dev: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /trim-repeated@1.0.0: + resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /ts-jest@27.0.7(@babel/core@7.24.0)(@types/jest@27.0.2)(jest@27.3.1)(typescript@4.6.3): + resolution: {integrity: sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q==} + 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' + jest: ^27.0.0 + typescript: '>=3.8 <5.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/jest': + optional: true + babel-jest: + optional: true + dependencies: + '@babel/core': 7.24.0 + '@types/jest': 27.0.2 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 27.3.1(ts-node@10.7.0) + jest-util: 27.5.1 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.0 + typescript: 4.6.3 + yargs-parser: 20.2.9 + dev: true + + /ts-node@10.7.0(@types/node@17.0.25)(typescript@4.6.3): + resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} + 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': 0.7.0 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 17.0.25 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.6.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-node@10.9.2(@types/node@17.0.25)(typescript@4.6.3): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + 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': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 17.0.25 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.6.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tsutils@3.21.0(typescript@4.6.3): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + 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: 1.14.1 + typescript: 4.6.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.11.0: + resolution: {integrity: sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-length@1.0.5: + resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typescript@4.6.3: + resolution: {integrity: sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==} + engines: {node: '>=4.2.0'} + hasBin: true + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + dev: true + + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: true + + /union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + + /union@0.5.0: + resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} + engines: {node: '>= 0.8.0'} + dependencies: + qs: 6.10.3 + dev: true + + /unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: true + + /universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + dev: true + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + + /unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + + /upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: true + + /upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + dev: true + + /upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + dependencies: + tslib: 2.6.2 + dev: true + + /upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + dependencies: + tslib: 2.6.2 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + /url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + dev: true + + /url-parse-lax@1.0.0: + resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} + engines: {node: '>=0.10.0'} + dependencies: + prepend-http: 1.0.4 + dev: true + + /url-parse-lax@3.0.0: + resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} + engines: {node: '>=4'} + dependencies: + prepend-http: 2.0.0 + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + + /url-to-options@1.0.1: + resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==} + engines: {node: '>= 4'} + dev: true + + /use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: true + + /utrie@1.0.2: + resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} + dependencies: + base64-arraybuffer: 1.0.2 + dev: false + + /uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + 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 + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /v8-compile-cache@2.4.0: + resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} + dev: true + + /v8-to-istanbul@8.1.1: + resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} + engines: {node: '>=10.12.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 1.9.0 + source-map: 0.7.4 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + + /vditor@3.8.13: + resolution: {integrity: sha512-vp6OF1n9wIduKtLvvTYtn+7Gr1Az6MqDIEBpLzik+PTQ208YjrcQ+Ba4AHXMMvJgDtbYP3PdY8OixWKecFzo2A==} + dependencies: + diff-match-patch: 1.0.5 + dev: false + + /vite-plugin-compression@0.5.1(vite@3.2.3): + resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + chalk: 4.1.2 + debug: 4.3.4(supports-color@9.4.0) + fs-extra: 10.1.0 + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-html@3.2.0(vite@3.2.3): + resolution: {integrity: sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@rollup/pluginutils': 4.2.1 + colorette: 2.0.20 + connect-history-api-fallback: 1.6.0 + consola: 2.15.3 + dotenv: 16.0.0 + dotenv-expand: 8.0.3 + ejs: 3.1.9 + fast-glob: 3.3.2 + fs-extra: 10.1.0 + html-minifier-terser: 6.1.0 + node-html-parser: 5.4.2 + pathe: 0.2.0 + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + dev: true + + /vite-plugin-imagemin@0.6.1(vite@3.2.3): + resolution: {integrity: sha512-cP7LDn8euPrji7WYtDoNQpJEB9nkMxJHm/A+QZnvMrrCSuyo/clpMy/T1v7suDXPBavsDiDdFdVQB5p7VGD2cg==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@types/imagemin': 7.0.1 + '@types/imagemin-gifsicle': 7.0.4 + '@types/imagemin-jpegtran': 5.0.4 + '@types/imagemin-mozjpeg': 8.0.4 + '@types/imagemin-optipng': 5.2.4 + '@types/imagemin-svgo': 10.0.5 + '@types/imagemin-webp': 7.0.3 + '@types/svgo': 2.6.4 + chalk: 4.1.2 + debug: 4.3.4(supports-color@9.4.0) + esbuild: 0.14.54 + fs-extra: 10.1.0 + gifsicle: 5.2.0 + imagemin: 7.0.1 + imagemin-gifsicle: 7.0.0 + imagemin-jpegtran: 7.0.0 + imagemin-mozjpeg: 9.0.0 + imagemin-optipng: 8.0.0 + imagemin-pngquant: 9.0.2 + imagemin-svgo: 9.0.0 + imagemin-webp: 6.1.0 + jpegtran-bin: 6.0.1 + pathe: 0.2.0 + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-mkcert@1.10.1(vite@3.2.3): + resolution: {integrity: sha512-fNNC0z+AcBZExKedjWC7bWlDMf4+WZJqO/4aYf7C/vYY1dqYVOM+zowwTYV0xSx5ZQgplfangPkZk+RwdUlpBg==} + engines: {node: '>=v16.0.0'} + peerDependencies: + vite: '>=3' + dependencies: + '@octokit/rest': 19.0.13 + axios: 0.21.4(debug@4.3.4) + debug: 4.3.4(supports-color@9.4.0) + picocolors: 1.0.0 + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /vite-plugin-mock@2.9.6(mockjs@1.1.0)(rollup@2.72.0)(vite@3.2.3): + resolution: {integrity: sha512-/Rm59oPppe/ncbkSrUuAxIQihlI2YcBmnbR4ST1RA2VzM1C0tEQc1KlbQvnUGhXECAGTaQN2JyasiwXP6EtKgg==} + engines: {node: '>=12.0.0'} + peerDependencies: + mockjs: '>=1.1.0' + vite: '>=2.0.0' + dependencies: + '@rollup/plugin-node-resolve': 13.3.0(rollup@2.72.0) + '@types/mockjs': 1.0.6 + chalk: 4.1.2 + chokidar: 3.6.0 + connect: 3.7.0 + debug: 4.3.4(supports-color@9.4.0) + esbuild: 0.11.3 + fast-glob: 3.3.2 + mockjs: 1.1.0 + path-to-regexp: 6.2.0 + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + transitivePeerDependencies: + - rollup + - supports-color + dev: true + + /vite-plugin-optimize-persist@0.1.2(vite-plugin-package-config@0.1.1)(vite@3.2.3): + resolution: {integrity: sha512-H/Ebn2kZO8PvwUF08SsT5K5xMJNCWKoGX71+e9/ER3yNj7GHiFjNQlvGg5ih/zEx09MZ9m7WCxOwmEKbeIVzww==} + peerDependencies: + vite: ^2.0.0 + vite-plugin-package-config: ^0.1.0 + dependencies: + debug: 4.3.4(supports-color@9.4.0) + fs-extra: 10.1.0 + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + vite-plugin-package-config: 0.1.1(vite@3.2.3) + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-package-config@0.1.1(vite@3.2.3): + resolution: {integrity: sha512-w9B3I8ZnqoyhlbzimXjXNk85imrMZgvI9m8f6j3zonK5IVA5KXzpT+PZOHlDz8lqh1vqvoEI1uhy+ZDoLAiA/w==} + peerDependencies: + vite: ^2.0.0 + dependencies: + debug: 4.3.4(supports-color@9.4.0) + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-purge-icons@0.8.2(vite@3.2.3): + resolution: {integrity: sha512-rW3RcNKj7QY3M7wcnwYVc3Ig+WwSQQ/Z67v+xdtk/8MA+ON05A3zc3qGaPdi6+8BUKYDpqvviKYiuLgRjleUOQ==} + engines: {node: '>= 12'} + peerDependencies: + vite: ^2.0.0-beta.3 || ^3.0.0 + dependencies: + '@purge-icons/core': 0.8.0 + '@purge-icons/generated': 0.8.1 + rollup-plugin-purge-icons: 0.8.1 + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /vite-plugin-pwa@0.12.3(vite@3.2.3)(workbox-build@6.6.0)(workbox-window@6.6.0): + resolution: {integrity: sha512-gmYdIVXpmBuNjzbJFPZFzxWYrX4lHqwMAlOtjmXBbxApiHjx9QPXKQPJjSpeTeosLKvVbNcKSAAhfxMda0QVNQ==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0-0 + workbox-build: ^6.4.0 + workbox-window: ^6.4.0 + dependencies: + debug: 4.3.4(supports-color@9.4.0) + fast-glob: 3.3.2 + pretty-bytes: 6.1.1 + rollup: 2.72.0 + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + workbox-build: 6.6.0 + workbox-window: 6.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-style-import@2.0.0(vite@3.2.3): + resolution: {integrity: sha512-qtoHQae5dSUQPo/rYz/8p190VU5y19rtBaeV7ryLa/AYAU/e9CG89NrN/3+k7MR8mJy/GPIu91iJ3zk9foUOSA==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@rollup/pluginutils': 4.2.1 + change-case: 4.1.2 + console: 0.7.2 + es-module-lexer: 0.9.3 + fs-extra: 10.1.0 + magic-string: 0.25.9 + pathe: 0.2.0 + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + dev: true + + /vite-plugin-svg-icons@2.0.1(vite@3.2.3): + resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@types/svgo': 2.6.4 + cors: 2.8.5 + debug: 4.3.4(supports-color@9.4.0) + etag: 1.8.1 + fs-extra: 10.1.0 + pathe: 0.2.0 + svg-baker: 1.7.0 + svgo: 2.8.0 + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-vue-setup-extend-plus@0.1.0: + resolution: {integrity: sha512-pa27KIsHIBvBMv4xz9uB3UCfAuP2tr7PLlFhCS9vw+aXd326LEHsvhqd3hCQDOR5MjlQVyQH6vwuGr3u+KRiiw==} + dev: true + + /vite-plugin-windicss@1.8.7(vite@3.2.3): + resolution: {integrity: sha512-/zwQ8+RV+MSkbG0IGqsEma6r2R01NzN/aNpNjJD7VVAkxAptNznqDXOObFTskkWfZ+9m6KJZCOuCPgAFtQIzEA==} + peerDependencies: + vite: ^2.0.1 || ^3.0.0 + dependencies: + '@windicss/plugin-utils': 1.8.7 + debug: 4.3.4(supports-color@9.4.0) + kolorist: 1.8.0 + vite: 3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1) + windicss: 3.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /vite@3.2.3(@types/node@17.0.25)(less@4.1.2)(terser@5.29.1): + resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==} + 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': 17.0.25 + esbuild: 0.15.18 + less: 4.1.2 + postcss: 8.4.35 + resolve: 1.22.8 + rollup: 2.72.0 + terser: 5.29.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + dev: true + + /vscode-languageserver-textdocument@1.0.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + dev: true + + /vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + dev: true + + /vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + dev: true + + /vue-clipboard3@2.0.0: + resolution: {integrity: sha512-Q9S7dzWGax7LN5iiSPcu/K1GGm2gcBBlYwmMsUc5/16N6w90cbKow3FnPmPs95sungns4yvd9/+JhbAznECS2A==} + dependencies: + clipboard: 2.0.8 + dev: false + + /vue-count-to2@1.0.6(vue@3.2.47): + resolution: {integrity: sha512-Mm56aA2nxgw/qTfU2XaauUh1W4bdM6lIeihhDIahQOGNUxVPVARyvLUbUFbOrynOJ5Ab26fuTguspX+xBGhVKw==} + peerDependencies: + vue: '>= 3 < 4' + dependencies: + core-js: 3.36.0 + vue: 3.2.47 + vue-count-to: 1.0.13 + dev: false + + /vue-count-to@1.0.13: + resolution: {integrity: sha512-6R4OVBVNtQTlcbXu6SJ8ENR35M2/CdWt3Jmv57jOUM+1ojiFmjVGvZPH8DfHpMDSA+ITs+EW5V6qthADxeyYOQ==} + dev: false + + /vue-cropper@0.5.6: + resolution: {integrity: sha512-54Z/AipXDBcE5nzJweTM+BryzSAcC0FCTMQLvLt6f4XanP4AWB3mPkQw3PG3NRICo7knljHO+N+pjZxYAKoTLQ==} + dev: false + + /vue-cropperjs@5.0.0(vue@3.2.47): + resolution: {integrity: sha512-RhnC8O33uRZNkn74aiHZwNHnBJOXWlS4P6gsRI0lw4cZlWjKSCywZI9oSI9POlIPI6OYv30jvnHMXGch85tw7w==} + peerDependencies: + vue: '>=3.0.0' + dependencies: + cropperjs: 1.5.12 + vue: 3.2.47 + dev: false + + /vue-demi@0.14.7(vue@3.2.47): + resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} + 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: 3.2.47 + dev: false + + /vue-eslint-parser@8.3.0(eslint@8.22.0): + resolution: {integrity: sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.3.4(supports-color@9.4.0) + eslint: 8.22.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + lodash: 4.17.21 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /vue-eslint-parser@9.4.2(eslint@8.22.0): + resolution: {integrity: sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.3.4(supports-color@9.4.0) + eslint: 8.22.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + lodash: 4.17.21 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /vue-grid-layout@3.0.0-beta1(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26): + resolution: {integrity: sha512-MsW0yfYNtnAO/uDhfZvkP6effxSJxvhAFbIL37x6Rn3vW9xf0WHVefKaSbQMLpSq3mXnR6ut0pg2Cd5lqIIZzg==} + dependencies: + '@interactjs/actions': 1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26) + '@interactjs/auto-start': 1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26) + '@interactjs/dev-tools': 1.10.26(@interactjs/modifiers@1.10.26)(@interactjs/utils@1.10.26) + '@interactjs/interactjs': 1.10.26 + '@interactjs/modifiers': 1.10.26(@interactjs/core@1.10.26)(@interactjs/utils@1.10.26) + element-resize-detector: 1.2.4 + mitt: 2.1.0 + transitivePeerDependencies: + - '@interactjs/core' + - '@interactjs/utils' + dev: false + + /vue-i18n@9.1.9(vue@3.2.47): + resolution: {integrity: sha512-JeRdNVxS2OGp1E+pye5XB6+M6BBkHwAv9C80Q7+kzoMdUDGRna06tjC0vCB/jDX9aWrl5swxOMFcyAr7or8XTA==} + engines: {node: '>= 10'} + peerDependencies: + vue: ^3.0.0 + dependencies: + '@intlify/core-base': 9.1.9 + '@intlify/shared': 9.1.9 + '@intlify/vue-devtools': 9.1.9 + '@vue/devtools-api': 6.6.1 + vue: 3.2.47 + dev: false + + /vue-infinite-scroll@2.0.2: + resolution: {integrity: sha512-n+YghR059YmciANGJh9SsNWRi1YZEBVlODtmnb/12zI+4R72QZSWd+EuZ5mW6auEo/yaJXgxzwsuhvALVnm73A==} + dev: false + + /vue-json-pretty@2.0.6(vue@3.2.47): + resolution: {integrity: sha512-aVdxw8ZRGR/Uj8GEaJ1/W2Ks/MdCfv5t2HRbbd+ICp3nL7msKRLN+1qOkSzaMvDygbDPxGhwUHBxZz8nxP+r3A==} + engines: {node: '>= 10.0.0', npm: '>= 5.0.0'} + peerDependencies: + vue: '>=3.0.0' + dependencies: + vue: 3.2.47 + dev: false + + /vue-observe-visibility@0.4.6: + resolution: {integrity: sha512-xo0CEVdkjSjhJoDdLSvoZoQrw/H2BlzB5jrCBKGZNXN2zdZgMuZ9BKrxXDjNP2AxlcCoKc8OahI3F3r3JGLv2Q==} + dev: false + + /vue-print-nb-jeecg@1.0.12: + resolution: {integrity: sha512-jHyWm6/TxB1iU2nHL7upQdHVdxb1SJQ9n3XKeYTaruFdbSphLo1vDtTunS2qVCjupk8lui7FlF5rxxSNr0zjZg==} + dependencies: + babel-plugin-transform-runtime: 6.23.0 + dev: false + + /vue-resize@0.4.5(vue@3.2.47): + resolution: {integrity: sha512-bhP7MlgJQ8TIkZJXAfDf78uJO+mEI3CaLABLjv0WNzr4CcGRGPIAItyWYnP6LsPA4Oq0WE+suidNs6dgpO4RHg==} + peerDependencies: + vue: ^2.3.0 + dependencies: + vue: 3.2.47 + dev: false + + /vue-router@4.0.14(vue@3.2.47): + resolution: {integrity: sha512-wAO6zF9zxA3u+7AkMPqw9LjoUCjSxfFvINQj3E/DceTt6uEz1XZLraDhdg2EYmvVwTBSGlLYsUw8bDmx0754Mw==} + peerDependencies: + vue: ^3.2.0 + dependencies: + '@vue/devtools-api': 6.6.1 + vue: 3.2.47 + dev: false + + /vue-tsc@0.33.9(typescript@4.6.3): + resolution: {integrity: sha512-s/+r4JNsCh4e3MUdsYrjEA8IgPPDzHL5kEah/OznxIHd1XMlYiIkXGdiyU6JE5J+lzXNOKdOlNliqwwpeETQWw==} + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@volar/vue-typescript': 0.33.9 + typescript: 4.6.3 + dev: true + + /vue-types@3.0.2(vue@3.2.47): + resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==} + engines: {node: '>=10.15.0'} + peerDependencies: + vue: ^3.0.0 + dependencies: + is-plain-object: 3.0.1 + vue: 3.2.47 + dev: false + + /vue-types@4.1.1(vue@3.2.47): + resolution: {integrity: sha512-Jq2GZ/w6rExJbLA/h7nHBFLciu+YNekgox0DB64wN1snZ4IIJMq+qnqp1/vE4fc7vEjZcP5KGhLzkkSjIHLRzw==} + engines: {node: '>=12.16.0'} + peerDependencies: + vue: ^2.0.0 || ^3.0.0 + dependencies: + is-plain-object: 5.0.0 + vue: 3.2.47 + dev: false + + /vue-virtual-scroller@1.1.2(vue@3.2.47): + resolution: {integrity: sha512-SkUyc7QHCJFB5h1Fya7LxVizlVzOZZuFVipBGHYoTK8dwLs08bIz/tclvRApYhksaJIm/nn51inzO2UjpGJPMQ==} + peerDependencies: + vue: ^2.6.11 + dependencies: + scrollparent: 2.1.0 + vue: 3.2.47 + vue-observe-visibility: 0.4.6 + vue-resize: 0.4.5(vue@3.2.47) + dev: false + + /vue3-colorpicker@2.3.0(@aesoper/normal-utils@0.1.5)(@popperjs/core@2.11.8)(@vueuse/core@6.9.2)(gradient-parser@1.0.2)(lodash-es@4.17.21)(tinycolor2@1.6.0)(vue-types@4.1.1)(vue@3.2.47): + resolution: {integrity: sha512-e3lLmBcy7mkRrNQVeUny1DjOd6E11L8H5ok5Bx4MdXmrG+RzyacRF7KkhrEWmRYPhKAsaoUrWsFkmpPAaYnE5A==} + peerDependencies: + '@aesoper/normal-utils': ^0.1.5 + '@popperjs/core': ^2.11.8 + '@vueuse/core': ^10.1.2 + gradient-parser: ^1.0.2 + lodash-es: ^4.17.21 + tinycolor2: ^1.4.2 + vue: ^3.2.6 + vue-types: ^4.1.0 + dependencies: + '@aesoper/normal-utils': 0.1.5 + '@popperjs/core': 2.11.8 + '@vueuse/core': 6.9.2(vue@3.2.47) + gradient-parser: 1.0.2 + lodash-es: 4.17.21 + tinycolor2: 1.6.0 + vue: 3.2.47 + vue-types: 4.1.1(vue@3.2.47) + dev: false + + /vue@3.2.47: + resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-sfc': 3.2.47 + '@vue/runtime-dom': 3.2.47 + '@vue/server-renderer': 3.2.47(vue@3.2.47) + '@vue/shared': 3.2.47 + + /vuedraggable@4.1.0(vue@3.2.47): + resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==} + peerDependencies: + vue: ^3.0.1 + dependencies: + sortablejs: 1.14.0 + vue: 3.2.47 + dev: false + + /vxe-table-plugin-antd@3.0.5(vxe-table@4.1.0): + resolution: {integrity: sha512-qZXIxNKSqdvfVncvVopId7byy9FYUW+ygX4vwUhPceHwsUq0eyX5SVX/LLafqfsnkq4l8+EZ4zQ5/xQ6AfZ31Q==} + peerDependencies: + vxe-table: ^4.0.30 + dependencies: + vxe-table: 4.1.0(vue@3.2.47)(xe-utils@3.3.1) + dev: false + + /vxe-table@4.1.0(vue@3.2.47)(xe-utils@3.3.1): + resolution: {integrity: sha512-FX4nc4ckkQGWG/W94z97KBIGrfZsbcni3pm+4uMzNQUcEgxgchnY78/4PrRC4ZRsHJIMv4mtNrzdfJDCTfA65g==} + peerDependencies: + vue: ^3.2.2 + xe-utils: ^3.2.0 + dependencies: + vue: 3.2.47 + xe-utils: 3.3.1 + dev: false + + /w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: true + + /w3c-xmlserializer@2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + dev: true + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + + /webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: true + + /webidl-conversions@6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + dev: true + + /whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: true + + /whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + dependencies: + iconv-lite: 0.6.3 + dev: true + + /whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + + /whatwg-url@8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: false + + /which-typed-array@1.1.14: + resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /windicss@3.5.6: + resolution: {integrity: sha512-P1mzPEjgFMZLX0ZqfFht4fhV/FX8DTG7ERG1fBLiWvd34pTLVReS5CVsewKn9PApSgXnVfPWwvq+qUsRwpnwFA==} + engines: {node: '>= 12'} + hasBin: true + dev: true + + /wmf@1.0.2: + resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} + engines: {node: '>=0.8'} + dev: false + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /word@0.3.0: + resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} + engines: {node: '>=0.8'} + dev: false + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /workbox-background-sync@6.6.0: + resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==} + dependencies: + idb: 7.1.1 + workbox-core: 6.6.0 + dev: true + + /workbox-broadcast-update@6.6.0: + resolution: {integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==} + dependencies: + workbox-core: 6.6.0 + dev: true + + /workbox-build@6.6.0: + resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) + '@babel/core': 7.24.0 + '@babel/preset-env': 7.24.0(@babel/core@7.24.0) + '@babel/runtime': 7.24.0 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.0)(rollup@2.79.1) + '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) + '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) + '@surma/rollup-plugin-off-main-thread': 2.2.3 + ajv: 8.12.0 + common-tags: 1.8.2 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + lodash: 4.17.21 + pretty-bytes: 5.6.0 + rollup: 2.79.1 + rollup-plugin-terser: 7.0.2(rollup@2.79.1) + source-map: 0.8.0-beta.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 6.6.0 + workbox-broadcast-update: 6.6.0 + workbox-cacheable-response: 6.6.0 + workbox-core: 6.6.0 + workbox-expiration: 6.6.0 + workbox-google-analytics: 6.6.0 + workbox-navigation-preload: 6.6.0 + workbox-precaching: 6.6.0 + workbox-range-requests: 6.6.0 + workbox-recipes: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + workbox-streams: 6.6.0 + workbox-sw: 6.6.0 + workbox-window: 6.6.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: true + + /workbox-cacheable-response@6.6.0: + resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==} + deprecated: workbox-background-sync@6.6.0 + dependencies: + workbox-core: 6.6.0 + dev: true + + /workbox-core@6.6.0: + resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==} + dev: true + + /workbox-expiration@6.6.0: + resolution: {integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==} + dependencies: + idb: 7.1.1 + workbox-core: 6.6.0 + dev: true + + /workbox-google-analytics@6.6.0: + resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==} + deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained + dependencies: + workbox-background-sync: 6.6.0 + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + dev: true + + /workbox-navigation-preload@6.6.0: + resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==} + dependencies: + workbox-core: 6.6.0 + dev: true + + /workbox-precaching@6.6.0: + resolution: {integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==} + dependencies: + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + dev: true + + /workbox-range-requests@6.6.0: + resolution: {integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==} + dependencies: + workbox-core: 6.6.0 + dev: true + + /workbox-recipes@6.6.0: + resolution: {integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==} + dependencies: + workbox-cacheable-response: 6.6.0 + workbox-core: 6.6.0 + workbox-expiration: 6.6.0 + workbox-precaching: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + dev: true + + /workbox-routing@6.6.0: + resolution: {integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==} + dependencies: + workbox-core: 6.6.0 + dev: true + + /workbox-strategies@6.6.0: + resolution: {integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==} + dependencies: + workbox-core: 6.6.0 + dev: true + + /workbox-streams@6.6.0: + resolution: {integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==} + dependencies: + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + dev: true + + /workbox-sw@6.6.0: + resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==} + dev: true + + /workbox-window@6.6.0: + resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} + dependencies: + '@types/trusted-types': 2.0.7 + workbox-core: 6.6.0 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + + /write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + 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 + + /xe-utils@3.3.1: + resolution: {integrity: sha512-OdQgl9WPV9dK3/djneFPrGX8z1M4neX+VOkzra5oONjoNsCKQhwdiut99WlxceNMQ5vXDv4EQ/wKA2fux3Gdug==} + dev: false + + /xlsx@0.17.5: + resolution: {integrity: sha512-lXNU0TuYsvElzvtI6O7WIVb9Zar1XYw7Xb3VAx2wn8N/n0whBYrCnHMxtFyIiUU1Wjf09WzmLALDfBO5PqTb1g==} + engines: {node: '>=0.8'} + hasBin: true + dependencies: + adler-32: 1.2.0 + cfb: 1.2.2 + codepage: 1.15.0 + crc-32: 1.2.2 + ssf: 0.11.2 + wmf: 1.0.2 + word: 0.3.0 + dev: false + + /xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: true + + /xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + + /xss@1.0.13: + resolution: {integrity: sha512-clu7dxTm1e8Mo5fz3n/oW3UCXBfV89xZ72jM8yzo1vR/pIS0w3sgB3XV2H8Vm6zfGnHL0FzvLJPJEBhd86/z4Q==} + engines: {node: '>= 0.10.0'} + hasBin: true + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 + dev: false + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: false + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /zrender@5.3.1: + resolution: {integrity: sha512-7olqIjy0gWfznKr6vgfnGBk7y4UtdMvdwFmK92vVQsQeDPyzkHW1OlrLEKg6GHz1W5ePf0FeN1q2vkl/HFqhXw==} + dependencies: + tslib: 2.3.0 + dev: false + + /zrender@5.5.0: + resolution: {integrity: sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==} + dependencies: + 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 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 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 zcmaJ_2{@GP_m=R9Bw6|-8YCez_A!A0eK{(+xjS$C_x4bs_q|@kj=!Gu8U5cPQ>CZu-GemyJ(8S z60rmn76;JQ{;_L-)5dTF8nYXe_)%qStYUy65aAdE(g3C|LdOB3(atImMIBv;B3NEm z5vn6AtD~d^mX%f3kyn;imQ$2fgh2OdVOWHh2NFZvt9AZWtMJF#-GT7H(L2MCc(gat zSr?D>0Q^|E3i{7nWdDfwZ>{s6xyb#o7DOil+CARij(aaepP}8`pTkRcevUs9L!Ws( zeYklC=QJ4@4vrbXpccOUvnlL2ix2z_HC6uLsw5_bpoItVYWwTiZu2lfdAKZ&yT;mv z2iVQ7$eLs-AN<(U*xQxheOxuYH09-C59gB9m^3Y@19M&pE9@{6Nh~(%FY5D-s)6|` zVUrRiNL61|h3oS7wn3ZF17ow0nr}n%YUF66Q%y1l-NMWBJY}w(8FSy~D7wLRq>=xi z6yHQ-)wrXCZRYAaN(y8+Ga0G()wbD+p)EPdSHzf_PrlO-&N9sFXkTPGFyD2m|IUkC zU=zD1L48wKJHy7uC88o{^U&NR^1-qfXCg17yBJ7s2)gzBVB3Kpue%h(C`rxBLrj=B zpR=Cao>Q#@{buL#yq03RPOOd!OB?zWH_Y+hF41-WyYl zm23w|L1m2E4ypOCqK=}ZWT?#j{}Xx!#07j1m@+(?LC<;oYAp0RX@|2>T?Vuz1!GG>tRe=jk5F#jH^v>e?mPO3&mOaMTg=SQbDor+<W&Zras z1jsFX7(;>vFk$j&t{)%udDA@dqsr|NzNd%%S)*w^dZQWr!e* zv?otCSa?72TcD0n%_$cjpXGU4lYG~;#2!&`riaHLr55jj3W8Q|vrPJPG!p<Rq*(}Pv3`&-_AQ3ukF-!4FUuJ>e~ zh}K3=_A=PJF~HJtSz+Pdmc5^Uhs+pnL8l7jiUt$cm2m6(s8m8sR6 zZ{u(iE0BqAslqx$1*-Myg<^o8c}UBB;YH|umFd@9n4^jCaXaBVnHSjKjoCu_u%F5* z%^i?kBeXs9^OI>|@B8hfe3T(d7s%dgts`XRlkeaII_I?&> z8xQmB+ZlPrHPidtkdcqm?^UIteCvw9?!2=O&0^0$&%>C3ivm&Q-ON;#s|n^eo9f$n zRu^w{mFx^H_k1Oo43-IYtZu=Yd^UOr+sl|f>&NOVv66h5`{qBKLiyzDh%2YZL%(&1 zXggK8o6SE{S8mo@KWIXpUh~W}-RYPxK9Cc3at`lutmzH%h_iF#gD|cHfI(cCj?m`h zNsR!)c_zU!;=?-L?~xFw>ShjJDfyY>@q1l4krPB<%m!IZq%liNQXZjrbs|sgSfAUHU1S=OaIdk8!kBi&soC7H&9M-5&| z3{Z`y_49;&wiJr!I=|kKHO#E;+thvHSduHJVvb3iA;W2D&Wg0Hek#RL&`B~}ir2qe z74Dy>L>&$3O1WW#^b{C3s6_Zb3@ijsCx*sXl4dnyGq7x367}NOVbjR;v&3Gruu2X7 zra-oG-hg%!;*VWnX$!m(kC=2%IYSW z(>ymzoKqKV=jEL?uze>&oK$|suPZ3BB6r!NzAME4me%m0=;!s!`&A0E5cZ2A=gOKD z9G@5+X?yl2iI|(Mfem{nq%NRhR$1F@ z?&7Q@Vrkfme2O$$LEC1|Jt-oQvvD90livAs#1B}dzG22pDz}`e&UZQQ(XixTgQ8O~ zO?at>ldVe2$}9A%aln!y6}{D*PbFCoh2*}~aIV%2(h6%wdLGS-ZOH9(`5=+^G-|{u z*42~}F+T>2slC+O=Wb!&c}5h}#z);AsXaa1D=g)|bWUi-v3n)Eh8?$`r9Y2PPJN{! z_v6m@i5_j0}|)o>-0s>;2q)`dKR>X%Gd%E53miatrA4h?OM%Zi zJs+Cotse?aV4FziJz69%?y^REVRXXYh`v(g!A?(R>Ca>`<=sAuK3F9veCeF{m4aGK z-1bobwrbY&Z_qZQhPOEH3`sZj$_X=meDlX(Q8-t8_ARZ1vdUSaU=M$x&hsuIiMDPN z`@W`yg%|f)q}`R2T+ztHygqBo9LtO=!=|>)Qny|Uni&YP_|nSu`K5EV*u+3z-xIYb zA=TUw*@g{YQNGXyr0wH+IkXhHa1&7~n>J#+IM8r&`c*_gb=hf2wQFZo5za-U`jZBL zt;HAL_%JWbhDY!d*>^qHn&nY%R`;c&KE@f*CZEJ-Zp3**4I=~1`OH`#;$J_|0@M4n zCAve4`KTA6hjeyU_1xIo^mzPG1IeiY?bih=;>?r48!R(4^QzZE8h;m;AAvNj22e^S zL$9mr(n8yn;R9bcMQ$}Qfv|; zVr4zC$A*ISIALfVoz{G}7mg0-htl8|;LJ9rq5%E&dSl)So0FID!QhG;-UDTYQiMxA zpD6i_z2m|8@XbQu==exewc)vaycezovPL8oGy(IrVK@w#nppVOa~xy4d!r1&Ym zU#462F7?4wTnVRVT4d?JoY3L8!lcHCZ4ryDiH5inJ0*oQthx?i|S5FNp^~hj=yvUb1JPMxpU`aJbI3%OzZ#J-!h4!BZNw`j(oN3DPN@z1m@6457qr~Z-vYc(3AbL??cgU3 zh>)FPe7GX#`<5J7Aa<54bK8fMrAh9^AC_X=AYK>l*~JO@XOy>IB^72c->3?YaiOwr1Dan*qQ$EplQa!kmA#o9&OPS1KPvxJ? zU)l*Jvrg|vX;~+iPL}fVKB7iuUJ%#h4t(4G$W66>LD`X<>Ttb<6h;=G{P& z`E4@qRh%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/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�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 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&! 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�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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 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
  • 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..3a1d784 --- /dev/null +++ b/src/components/Form/src/components/FormItem.vue @@ -0,0 +1,372 @@ + 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..c457c92 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JCategorySelect.vue @@ -0,0 +1,259 @@ + + + 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..a143933 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JPopup.vue @@ -0,0 +1,160 @@ + + + + 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..fb63fd7 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JSelectUser.vue @@ -0,0 +1,169 @@ + + + + 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..783d0ce --- /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..bec6027 --- /dev/null +++ b/src/components/Form/src/jeecg/components/JTreeSelect.vue @@ -0,0 +1,358 @@ + + + + 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..35bca3a --- /dev/null +++ b/src/components/Form/src/jeecg/components/JUpload/JUpload.vue @@ -0,0 +1,437 @@ + + + + + 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..80ca90e --- /dev/null +++ b/src/components/Form/src/jeecg/components/modal/JPopupOnlReportModal.vue @@ -0,0 +1,288 @@ + + + + + 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..d3811ba --- /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..95c08ac --- /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..383b0d0 --- /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..e440308 --- /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..8d90b73 --- /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: 50, + }; + + /** + * 加载列表数据集 + * @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..5efe444 --- /dev/null +++ b/src/components/JVxeCustom/src/components/JVxePopupCell.vue @@ -0,0 +1,72 @@ + + 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..e86abdc --- /dev/null +++ b/src/components/JVxeCustom/src/hooks/useFileCell.ts @@ -0,0 +1,97 @@ +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); + } else { + //update-begin-author:liusq date:2023-06-05 for: [issues/530]JVxeTable 的JVxeTypes.image类型,无法全部删除上传图片 + handleChangeCommon(null); + //update-end-author:liusq date:2023-06-05 for: [issues/530]JVxeTable 的JVxeTypes.image类型,无法全部删除上传图片 + } + } + + 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..0c2fdc7 --- /dev/null +++ b/src/components/Table/src/BasicTable.vue @@ -0,0 +1,549 @@ + + + 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/CustomSelectHeader.vue b/src/components/Table/src/components/CustomSelectHeader.vue new file mode 100644 index 0000000..5467ba4 --- /dev/null +++ b/src/components/Table/src/components/CustomSelectHeader.vue @@ -0,0 +1,50 @@ + + + + + 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..da0d925 --- /dev/null +++ b/src/components/Table/src/components/TableFooter.vue @@ -0,0 +1,118 @@ + + 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..5fbbc3f --- /dev/null +++ b/src/components/Table/src/hooks/useColumns.ts @@ -0,0 +1,331 @@ +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'; +import { CUS_SEL_COLUMN_KEY } from "./useCustomSelection"; + +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, + handleCustomSelectColumn: Fn +) { + 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); + // update-begin--author:sunjianlei---date:220230630---for:【QQYUN-5571】自封装选择列,解决数据行选择卡顿问题 + handleCustomSelectColumn(columns); + // update-end--author:sunjianlei---date:220230630---for:【QQYUN-5571】自封装选择列,解决数据行选择卡顿问题 + + 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) => { + // update-begin--author:liaozhiyang---date:20230718---for: 【issues-179】antd3 一些警告以及报错(针对表格) + if(column.slots?.customRender) { + // slots的备份,兼容老的写法,转成新写法避免控制台警告 + column.slotsBak = column.slots; + delete column.slots; + } + // update-end--author:liaozhiyang---date:20230718---for: 【issues-179】antd3 一些警告以及报错(针对表格) + + 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); + } + // update-begin--author:sunjianlei---date:220230630---for:【QQYUN-5571】自封装选择列,解决数据行选择卡顿问题 + // 过滤自定义选择列 + columns = columns.filter((item) => item.key !== CUS_SEL_COLUMN_KEY); + // update-enb--author:sunjianlei---date:220230630---for:【QQYUN-5571】自封装选择列,解决数据行选择卡顿问题 + + 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/useCustomSelection.tsx b/src/components/Table/src/hooks/useCustomSelection.tsx new file mode 100644 index 0000000..3d36da6 --- /dev/null +++ b/src/components/Table/src/hooks/useCustomSelection.tsx @@ -0,0 +1,491 @@ +import type { BasicColumn } from '/@/components/Table'; +import type { Ref, ComputedRef } from 'vue'; +import type { BasicTableProps, PaginationProps, TableRowSelection } from '/@/components/Table'; +import { computed, nextTick, onUnmounted, ref, toRaw, unref, watch, watchEffect } from 'vue'; +import { omit } from 'lodash-es'; +import { throttle } from 'lodash-es'; +import { Checkbox, Radio } from 'ant-design-vue'; +import { isFunction } from '/@/utils/is'; +import { findNodeAll } from '/@/utils/helper/treeHelper'; +import { ROW_KEY } from '/@/components/Table/src/const'; +import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated'; +import { useMessage } from '/@/hooks/web/useMessage'; +import { ModalFunc } from 'ant-design-vue/lib/modal/Modal'; + +// 自定义选择列的key +export const CUS_SEL_COLUMN_KEY = 'j-custom-selected-column'; + +/** + * 自定义选择列 + */ +export function useCustomSelection( + propsRef: ComputedRef, + emit: EmitType, + wrapRef: Ref, + getPaginationRef: ComputedRef, + tableData: Ref, + childrenColumnName: ComputedRef +) { + const { createConfirm } = useMessage(); + // 表格body元素 + const bodyEl = ref(); + // body元素高度 + const bodyHeight = ref(0); + // 表格tr高度 + const rowHeight = ref(0); + // body 滚动高度 + const scrollTop = ref(0); + // 选择的key + const selectedKeys = ref([]); + // 选择的行 + const selectedRows = ref([]); + + // 扁平化数据,children数据也会放到一起 + const flattedData = computed(() => { + return flattenData(tableData.value, childrenColumnName.value); + }); + + const getRowSelectionRef = computed((): TableRowSelection | null => { + const { rowSelection } = unref(propsRef); + if (!rowSelection) { + return null; + } + + return { + preserveSelectedRowKeys: true, + // selectedRowKeys: unref(selectedKeys), + // onChange: (selectedRowKeys: string[]) => { + // setSelectedRowKeys(selectedRowKeys); + // }, + ...omit(rowSelection, ['onChange', 'selectedRowKeys']), + }; + }); + + // 是否是单选 + const isRadio = computed(() => { + return getRowSelectionRef.value?.type === 'radio'; + }); + + const getAutoCreateKey = computed(() => { + return unref(propsRef).autoCreateKey && !unref(propsRef).rowKey; + }); + + // 列key字段 + const getRowKey = computed(() => { + const { rowKey } = unref(propsRef); + return unref(getAutoCreateKey) ? ROW_KEY : rowKey; + }); + // 获取行的key字段数据 + const getRecordKey = (record) => { + if (!getRowKey.value) { + return record[ROW_KEY]; + } else if (isFunction(getRowKey.value)) { + return getRowKey.value(record); + } else { + return record[getRowKey.value]; + } + }; + + // 分页配置 + const getPagination = computed(() => { + return typeof getPaginationRef.value === 'boolean' ? {} : getPaginationRef.value; + }); + // 当前页条目数量 + const currentPageSize = computed(() => { + const { pageSize = 10, total = flattedData.value.length } = getPagination.value; + return pageSize > total ? total : pageSize; + }); + + // 选择列表头props + const selectHeaderProps = computed(() => { + return { + onSelectAll, + isRadio: isRadio.value, + selectedLength: flattedData.value.filter((data) => selectedKeys.value.includes(getRecordKey(data))).length, + pageSize: currentPageSize.value, + }; + }); + + // 监听传入的selectedRowKeys + watch( + () => unref(propsRef)?.rowSelection?.selectedRowKeys, + (val: string[]) => { + if (Array.isArray(val)) { + setSelectedRowKeys(val); + } + }, + { immediate: true } + ); + + // 当任意一个变化时,触发同步检测 + watch([selectedKeys, selectedRows], () => { + nextTick(() => { + syncSelectedRows(); + }); + }); + + // 监听滚动条事件 + const onScrollTopChange = throttle((e) => (scrollTop.value = e?.target?.scrollTop), 150); + + let bodyResizeObserver: Nullable = null; + // 获取首行行高 + watchEffect(() => { + if (bodyEl.value) { + // 监听div高度变化 + bodyResizeObserver = new ResizeObserver((entries) => { + for (let entry of entries) { + if (entry.target === bodyEl.value && entry.contentRect) { + const { height } = entry.contentRect; + bodyHeight.value = Math.ceil(height); + } + } + }); + bodyResizeObserver.observe(bodyEl.value); + const el = bodyEl.value?.querySelector('tbody.ant-table-tbody tr.ant-table-row') as HTMLDivElement; + if (el) { + rowHeight.value = el.offsetHeight; + return; + } + } + rowHeight.value = 50; + // 这种写法是为了监听到 size 的变化 + propsRef.value.size && void 0; + }); + + onMountedOrActivated(async () => { + bodyEl.value = await getTableBody(wrapRef.value!); + bodyEl.value.addEventListener('scroll', onScrollTopChange); + }); + onUnmounted(() => { + if (bodyEl.value) { + bodyEl.value?.removeEventListener('scroll', onScrollTopChange); + } + if (bodyResizeObserver != null) { + bodyResizeObserver.disconnect(); + } + }); + + // 选择全部 + function onSelectAll(checked: boolean) { + // 取消全选 + if (!checked) { + selectedKeys.value = []; + selectedRows.value = []; + emitChange(); + return; + } + let modal: Nullable> = null; + // 全选 + const checkAll = () => { + if (modal != null) { + modal.update({ + content: '正在分批全选,请稍后……', + cancelButtonProps: { disabled: true }, + }); + } + let showCount = 0; + // 最小选中数量 + let minSelect = 100; + const hidden: Recordable[] = []; + flattedData.value.forEach((item, index, array) => { + if (array.length > 120) { + if (showCount <= minSelect && recordIsShow(index, Math.max((minSelect - 10) / 2, 3))) { + showCount++; + updateSelected(item, checked); + } else { + hidden.push(item); + } + } else { + updateSelected(item, checked); + } + }); + if (hidden.length > 0) { + return batchesSelectAll(hidden, checked, minSelect); + } else { + emitChange(); + } + }; + + // 当数据量大于120条时,全选会导致页面卡顿,需进行慢速全选 + if (flattedData.value.length > 120) { + modal = createConfirm({ + title: '全选', + content: '当前数据量较大,全选可能会导致页面卡顿,确定要执行此操作吗?', + iconType: 'warning', + onOk: () => checkAll(), + }); + } else { + checkAll(); + } + } + + // 分批全选 + function batchesSelectAll(hidden: Recordable[], checked: boolean, minSelect: number) { + return new Promise((resolve) => { + (function call() { + // 每隔半秒钟,选择100条数据 + setTimeout(() => { + const list = hidden.splice(0, minSelect); + if (list.length > 0) { + list.forEach((item) => { + updateSelected(item, checked); + }); + call(); + } else { + setTimeout(() => { + emitChange(); + resolve(); + }, 500); + } + }, 300); + })(); + }); + } + + // 选中单个 + function onSelect(record, checked) { + updateSelected(record, checked); + emitChange(); + } + + function updateSelected(record, checked) { + const recordKey = getRecordKey(record); + if (isRadio.value) { + selectedKeys.value = [recordKey]; + selectedRows.value = [record]; + return; + } + const index = selectedKeys.value.findIndex((key) => key === recordKey); + if (checked) { + if (index === -1) { + selectedKeys.value.push(recordKey); + selectedRows.value.push(record); + } + } else { + if (index !== -1) { + selectedKeys.value.splice(index, 1); + selectedRows.value.splice(index, 1); + } + } + } + + // 调用用户自定义的onChange事件 + function emitChange() { + const { rowSelection } = unref(propsRef); + if (rowSelection) { + const { onChange } = rowSelection; + if (onChange && isFunction(onChange)) { + setTimeout(() => { + onChange(selectedKeys.value, selectedRows.value); + }, 0); + } + } + emit('selection-change', { + keys: getSelectRowKeys(), + rows: getSelectRows(), + }); + } + + // 用于判断是否是自定义选择列 + function isCustomSelection(column: BasicColumn) { + return column.key === CUS_SEL_COLUMN_KEY; + } + + /** + * 判断当前行是否可视,虚拟滚动用 + * @param index 行下标 + * @param threshold 前后阈值,默认可视区域前后显示3条 + */ + function recordIsShow(index: number, threshold = 3) { + // 只有数据量大于50条时,才会进行虚拟滚动 + const isVirtual = flattedData.value.length > 50; + if (isVirtual) { + // 根据 scrollTop、bodyHeight、rowHeight 计算出当前行是否可视(阈值前后3条) + // flag1 = 判断当前行是否在可视区域上方3条 + const flag1 = scrollTop.value - rowHeight.value * threshold < index * rowHeight.value; + // flag2 = 判断当前行是否在可视区域下方3条 + const flag2 = index * rowHeight.value < scrollTop.value + bodyHeight.value + rowHeight.value * threshold; + // 全部条件满足时,才显示当前行 + return flag1 && flag2; + } + return true; + } + + // 自定义渲染Body + function bodyCustomRender(params) { + const { index } = params; + if (!recordIsShow(index)) { + return ''; + } + if (isRadio.value) { + return renderRadioComponent(params); + } else { + return renderCheckboxComponent(params); + } + } + + /** + * 渲染checkbox组件 + */ + function renderCheckboxComponent({ record }) { + const recordKey = getRecordKey(record); + // 获取用户自定义checkboxProps + const checkboxProps = ((getCheckboxProps) => { + if (typeof getCheckboxProps === 'function') { + try { + return getCheckboxProps(record) ?? {}; + } catch (error) { + console.error(error); + } + } + return {}; + })(propsRef.value.rowSelection?.getCheckboxProps); + return ( + onSelect(record, checked)} + /> + ); + } + + /** + * 渲染radio组件 + */ + function renderRadioComponent({ record }) { + const recordKey = getRecordKey(record); + return ( + onSelect(record, checked)} + /> + ); + } + + // 创建选择列 + function handleCustomSelectColumn(columns: BasicColumn[]) { + if (!propsRef.value.rowSelection) { + return; + } + const isFixedLeft = columns.some((item) => item.fixed === 'left'); + + columns.unshift({ + title: '选择列', + flag: 'CHECKBOX', + key: CUS_SEL_COLUMN_KEY, + width: 50, + minWidth: 50, + maxWidth: 50, + align: 'center', + ...(isFixedLeft ? { fixed: 'left' } : {}), + customRender: bodyCustomRender, + }); + } + + // 清空所有选择 + function clearSelectedRowKeys() { + onSelectAll(false); + } + + // 通过 selectedKeys 同步 selectedRows + function syncSelectedRows() { + if (selectedKeys.value.length !== selectedRows.value.length) { + setSelectedRowKeys(selectedKeys.value); + } + } + + // 设置选择的key + function setSelectedRowKeys(rowKeys: string[]) { + selectedKeys.value = rowKeys; + const allSelectedRows = findNodeAll( + toRaw(unref(flattedData)).concat(toRaw(unref(selectedRows))), + (item) => rowKeys.includes(getRecordKey(item)), + { + children: propsRef.value.childrenColumnName ?? 'children', + } + ); + const trueSelectedRows: any[] = []; + rowKeys.forEach((key: string) => { + const found = allSelectedRows.find((item) => getRecordKey(item) === key); + found && trueSelectedRows.push(found); + }); + selectedRows.value = trueSelectedRows; + emitChange(); + } + + function getSelectRows() { + return unref(selectedRows) as T[]; + } + + function getSelectRowKeys() { + return unref(selectedKeys); + } + + function getRowSelection() { + return unref(getRowSelectionRef)!; + } + + function deleteSelectRowByKey(key: string) { + const index = selectedKeys.value.findIndex((item) => item === key); + if (index !== -1) { + selectedKeys.value.splice(index, 1); + selectedRows.value.splice(index, 1); + } + } + + // 【QQYUN-5837】动态计算 expandIconColumnIndex + const getExpandIconColumnIndex = computed(() => { + const { expandIconColumnIndex } = unref(propsRef); + // 未设置选择列,则保持不变 + if (getRowSelectionRef.value == null) { + return expandIconColumnIndex; + } + // 设置了选择列,并且未传入 index 参数,则返回 1 + if (expandIconColumnIndex == null) { + return 1; + } + return expandIconColumnIndex; + }); + + return { + getRowSelection, + getRowSelectionRef, + getSelectRows, + getSelectRowKeys, + setSelectedRowKeys, + deleteSelectRowByKey, + selectHeaderProps, + isCustomSelection, + handleCustomSelectColumn, + clearSelectedRowKeys, + getExpandIconColumnIndex, + }; +} + +function getTableBody(wrap: HTMLDivElement) { + return new Promise((resolve) => { + (function fn() { + const bodyEl = wrap.querySelector('.ant-table-wrapper .ant-table-body') as HTMLDivElement; + if (bodyEl) { + resolve(bodyEl); + } else { + setTimeout(fn, 100); + } + })(); + }); +} + +function flattenData(data: RecordType[] | undefined, childrenColumnName: string): RecordType[] { + let list: RecordType[] = []; + (data || []).forEach((record) => { + list.push(record); + + if (record && typeof record === 'object' && childrenColumnName in record) { + list = [...list, ...flattenData((record as any)[childrenColumnName], childrenColumnName)]; + } + }); + + return list; +} 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..c9ee5e2 --- /dev/null +++ b/src/components/Table/src/hooks/useRowSelection.ts @@ -0,0 +1,127 @@ +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()); + } + //update-begin---author:scott ---date:2023-06-19 for:【issues/503】table行选择时卡顿明显 #503--- + //table行选择时卡顿明显 #503 + if (unref(tableData).length > 0) { + emit('selection-change', { + keys: getSelectRowKeys(), + rows: getSelectRows(), + }); + } + //update-end---author:scott ---date::2023-06-19 for:【issues/503】table行选择时卡顿明显 #503--- + }); + }, + { 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..261998a --- /dev/null +++ b/src/components/Table/src/hooks/useTableFooter.ts @@ -0,0 +1,62 @@ +import type { ComputedRef, Ref, Slots } 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, + slots: Slots, + scrollRef: ComputedRef<{ + x: string | number | true; + y: Nullable; + scrollToFirstRowOnChange: boolean; + }>, + tableElRef: Ref, + getDataSourceRef: ComputedRef +) { + const getIsEmptyData = computed(() => { + return (unref(getDataSourceRef) || []).length === 0; + }); + + // 是否有展开行 + const hasExpandedRow = computed(() => Object.keys(slots).includes('expandedRowRender')) + + const getFooterProps = computed((): Recordable | undefined => { + const { summaryFunc, showSummary, summaryData, bordered } = unref(propsRef); + return showSummary && !unref(getIsEmptyData) ? () => h(TableFooter, { + bordered, + summaryFunc, + summaryData, + scroll: unref(scrollRef), + hasExpandedRow: hasExpandedRow.value + }) : 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..2add5e1 --- /dev/null +++ b/src/components/Table/src/hooks/useTableForm.ts @@ -0,0 +1,51 @@ +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, autoSubmitOnEnter} = formConfig || {}; + return { + showAdvancedButton: true, + ...formConfig, + submitButtonOptions: { loading: unref(getLoading), ...submitButtonOptions }, + compact: true, + //update-begin-author:liusq---date:20230605--for: [issues/568]设置 autoSubmitOnEnter: false 不生效 --- + autoSubmitOnEnter: autoSubmitOnEnter, + //update-end-author:liusq---date:20230605--for: [issues/568]设置 autoSubmitOnEnter: false 不生效 --- + }; + }); + + 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..03ca664 --- /dev/null +++ b/src/components/Table/src/types/table.ts @@ -0,0 +1,464 @@ +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; + // slots的备份,兼容老的写法,转成新写法避免控制台警告 + slotsBak?: 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..6d668e0 --- /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..94feb23 --- /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..350d776 --- /dev/null +++ b/src/components/chart/BarMulti.vue @@ -0,0 +1,108 @@ + + 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..a7c906e --- /dev/null +++ b/src/components/chart/Gauge.vue @@ -0,0 +1,101 @@ + + 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..97f48fb --- /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..f74fe90 --- /dev/null +++ b/src/components/chart/LineMulti.vue @@ -0,0 +1,110 @@ + + diff --git a/src/components/chart/Pie.vue b/src/components/chart/Pie.vue new file mode 100644 index 0000000..b01370c --- /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..bd811db --- /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..d570d4a --- /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..7ce591e --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/components/cells/JVxeInputCell.vue @@ -0,0 +1,80 @@ + + + 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..567d8b1 --- /dev/null +++ b/src/components/jeecg/JVxeTable/src/hooks/useJVxeComponent.ts @@ -0,0 +1,257 @@ +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, force = false) { + const newValue = enhanced.getValue($value, ctx); + const oldValue = value.value; + // update-begin--author:liaozhiyang---date:20230718---for:【issues-5025】JVueTable的事件 @valueChange重复触发问题 + const execute = force ? true : newValue !== oldValue; + if (execute) { + trigger('change', { value: newValue }); + // 触发valueChange事件 + parentTrigger('valueChange', { + type: props.type, + value: newValue, + oldValue: oldValue, + col: originColumn.value, + rowIndex: rowIndex.value, + columnIndex: columnIndex.value, + }); + } + // update-end--author:liaozhiyang---date:20230718---for:【issues-5025】JVueTable的事件 @valueChange重复触发问题 + } + + /** 通用处理 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..e8e70de --- /dev/null +++ b/src/components/jeecg/OnLine/hooks/usePopBiz.ts @@ -0,0 +1,864 @@ +import { reactive, ref, unref, defineAsyncComponent, toRaw, markRaw, isRef, watch, onUnmounted } 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(ob, tableRef?) { + // update-begin--author:liaozhiyang---date:20230811---for:【issues/675】子表字段Popup弹框数据不更新 + let props: any; + if (isRef(ob)) { + props = ob.value; + const stopWatch = watch(ob, (newVal) => { + props = newVal; + }); + onUnmounted(() => stopWatch()); + } else { + props = ob; + } + // update-end--author:liaozhiyang---date:20230811---for:【issues/675】子表字段Popup弹框数据不更新 + 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 = reactive({ + 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,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wAAAAAzJ3zzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAB3RJTUUH5AodAjIGrlVB/QAAABBjYU52AAAAygAAAMAAAAAFAAAAAASpeQ4AAC6ASURBVHja7b133G1Vdaj9jDnXWruXt7+ncDhIEVCKaCiidATsgIjRm1gTu1FjTbl++ZmYqMmNRPOZm5tc400+Y65iwUQFEUSRIkixgNI5cA6nvX33veYc3x97v2IBpZzzzvdw1sNvc/5gH/ZYY80xy5ijQEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkbG7kZCC7CaeevLu3QSyPXBKBL3RSIHKOE050EtULdqakaXvr/E+EiR9kbLRz6Wvc5HSxRagNVMIw+bnhyz/m6HbTtNvGjsAQENMNZk+FGB1EOjBfu9okLvbvj6N0Nra88kmzIegte+yDEapbRKMPp/EuZe3rcqOm37sjFKqQOKMDSFFUXxRFicVO1mqZi7/QMLS70DahS2QO9guOB92St9NGQrwEPgUBZFKHZVtr28p3ko5PucWko5MZfKmD5oACuKAM5jU6WP5S7N8+W0XLm6NYomHuZMaM3teWQG8BAkKoypknThoAM3c9ed6548lcrrJvpyTFElBUQDyCUKqUK3iMYJaTevhdufZG470LEzl0dSpyHE2qPJ1stf4vfO6eOdYTTpykc+V9BXn+02rvP+NQf25C1jTkaWvxfEADy4BJJJGB+D+aLcdGXefPCGIpf859tpvPUjsF8v5Ue5iP/9nuzVPhKyFeCXaKSGMsIb0qa+71yopsnhY44Xl5SKCpqysk6gn/+ttsHZEm6yhh2PiaI+B6y1+tI7nNz8nI/RqKXIxVWrLlsHHjHZrnHI61/S4/Uv7ZFDeJZxfK1TN7f7/NSY46RJJ4fESuQGXxV50CGz2z8CMjxxCHl8voKvxBgDWvFa3q+vJ2zo6bPmYgovWPSMpDDi4R1/mVnBIyEzgCG5rrJUEwq5vlxUUX5U0uJG6b90BP+CopcIFdUAW0ZhsAqkIloti5muSZxYJPVIrDCd6uRBHf3dExf1hOtKhn+/aompLqzph9bonkFmAMAdP/XMN6HaFSYMVNqKWibXpJw27uQAA6oS5rwkCl7QbpFOroIbSTSyg+MATtCSYg/qc+z+PZ711QrF9adWGffIXAR/8iHlbR/LVoJfR2YAQLEIb7kgIul6+br36lLqlT7PH03NYWUnKGEOvTC48PIWLdehUhq+sKEwDsQAk47ilOPkw1uc8pp5H310Ek0FZhPo5kJrd3WTGQCQ7oC/f5Njcga+9zlHtctR421eVVT2UyHI1gcGP9q3eM3jp8ok4wkJyi9cQHjAojrZ12MP6uorjTf7vmIzTPSQdV1lrB1au6ubvd4AvvLvjn4VvvWdlD/+RsynPpVbW0NOnOyZA4pecKEEU8CD5PDxiPQLOSVGf+X+wQ8/U07tfqkeVVROcnVG3nMe2lKRpoW3fzTbBj0ce70BnPYyKBeRe7SAyL9ptSPPGlF5YcmRN0DIg29LcKaAn6pi8xGSPvzds+SAMafTa1N96VifA//gIjhiUbHAfDmUdlc/e60BvOF8x++90DNzr3DZxxwX/YGamdYr1ud2csaY40hjNHYSaO8ztLo0jy+U0fFY45xg/MN/nZ6gBU9h354+c21fT7m3Rm1tpHLMnZ5SCu/6s2wVeCj22ouwnKRcMJ6w9m+cbF4b6fQDfuTWd7tzp3bIs+siSIR6DTP+vYJa0XodGauptYLob4g8ciAxMOG1tK7NuYd57v2vgrnw+3V6hy8if310sHP8qmavNYA2lnXXwuw+0L3Hs7kvk/v25XkGDogi1AWa/I1Cx+B6eXrrStjRhFiV33gWWQ6TThQ29DiyqZx6TY5vrumxfawPR18PZ/6ZosAHP5CFSSyzV26B3vrbbSIVzjsk5e++bjUp6/iagp6xIWcOq0UiyzkvIXADt44UalAuKMnQ1fmI/u7wz3HVaK3j2HWOM+uqxU9UVU/30JS99IX/GvZKfex3f0JsUk7ZIfLBs1uMOPesMe9fVVKdMhrG7SkMLr16gto8ur6quXpC7PxgS/RI8QOD0RGvh+6X6msnvDzlBT1ho1MZ8craYG6t1cleZQB/9D7HO/5bj1LJUBDkhb+1qD+tMz7iOGayL4cmTsSF2h0Mb9t8gZ6tS7eUg/gxhF0rkAIjXuVJTp9ad3pyLmXqdTs62jHCJgt/+sHsOLDMXmUAqXpmY88t9Y7cU3T6h/cW4jUNe1alL88pOyLDYAZdabmEwfalLfhCCZmsYhID/jGm3OjwQDzqtTLtOXfa8YwPTeb54LVLxEB7xVN5Vi97jQH80XsdiRdG+obygvDZf/oP+mI2TLTlnHpfjgLESxi3z3Ca17SAq5Qx0wm5+Ne4PR8JPUGtEq93+oy1Ts/YHsn0l44smcOcp+DhT/9S+dM/z1aCvcYA2nenfOPGNgbkK2+J9V3v+92xInLmSCqHVYf7nlDDwQ/jGcoj4ksVQUQfd8aZBzGKjnk1E16fs1b1JTcUTeXzIwZyyP0VKHYDPfAqYq8xABk1PP/wMhNtOO0rjmKffcdTObfsZR8TsNDJstuzk9P+aFFlJFHj9NEdfB/yeQEVxCo67fSgjY6zxDC5TwtGVZlogJ4Z4olXF3uFAbz9vC65kkH3gbKK6IiZKC7oaeN9jsoriZNAs7+CejAJ5Gui1Ty2AGZXWeJynFDdI2t7evhYX5+vjrGvedFKpFI8Hj6wZe/eBu0VBjCRxnQ3p3Lx3U3uKXqJ73Sn5nb680upVKxIuHgfgZ6IzxdF14xIVEwwzu9aY/SDrDKtqq5f1+Y1ky2OO/tvPS+51NP8O/jRxEo/+eriCW0Af/CylLe/LKWRE/JdWLNTmO27ymiLZ4515PDIY0IUuAKWR7l2inSlQq+WqI1BdoebPgVKCvumesC4cuJt/2w2HPy1lOQLcPB2+MB3995V4AltAHnnmE0MHdfjmprq+n5UGk/NC6qYE6sqkQx2IEFwHvpAuYKMVjAJu08YD2KBuiee9PrcdX1OfSs5ueZyiArI/DMDKWEV8IQ1gHed5zjurp2M9ZWSE9m/bTBi9htL7e+UHYcLoIGC3YyCM2iaJx0rEU/nyBkZpDnuDoTBKiComXZ66IYl/7zKPPs/8zo1T/lXpdKC9/+x8icf2vtWgiesASjwzSdPoqry8f1RiUytqHL8VN8cXHWCH+T5BsErSILPjZAWSuqjXeD2fCS/iYG6USbu02Mn/1V/e8f1Mv3pUdHkfyNLFZiIw+gjJE/YaFAnUOjDvj3Pq+5T8s4fOdKTV5Q8kxboBywK1ha8yalfVxFbSTDpLj74PhQ/c4sKOrbEuo0NnteM+cZxli0HtT3NimG2GEoj4XjCGcA7X+oxCqjy5Jl76FYOkK7vjU/1/emjqT0mUpJUwvj9ZRjvo3l8riI6kiMqgFmpCibLcUIVA+usHrQt5nl35GTLeTXu3bTFs5B7wm4IHpYn3BP3XYcj5n+Egnxr7QFsikkqXk4vOfOcqpPYarh4Hw/0EV8qi47XRWKLPNZ4n8fK0OWrZdX6Oqe/8yT09Fcfa+Rd/8MwbldaK+F5whmAtxGfnSqS81Dpe3qG8njfnF53cmSkA997qHgfD76V125SVDeWDDK9QkQnpwKxh7WODdOeJ31rEcOVUA7kFAjJE8oA3nxel09cGnNwdyMfeqGqVa3lvD9rxMlxFSfx8s1oCJwHNUi5hqmXMXnBmEBOF8NgImgLSx1YrMVAZeCW3dt4whjAxW9OOeqS7fzes3tUUy9v/KrDqj+4lvpXl7w/wGqYCg8wrO8jqMvhJmsSjRUkVh5/vM9jxSjSNvTvzfGdTTn53ifm8Hrkq1mM9r684SeMAYwlcMqrxpksiXxgCp2LbbHiePpUj8OKTqyXQC93GO+jOVIzIp1CXjU3LDQaQiAD2gNmI3lgZ1k+/aM1fLdxi+dtf/spFgpBNBSUJ4wB9EX5xBbh6S/YobV9YyZa7sRaKudXnNRCzf7L9X3aoFEe1taIStGuj/d5pBggAlkUadwfyXfnErl+dInuTwuG28vQyg7Bex63vc9z27s8zS7cP6dyzsvW8qYf9iZrPZ470ud4A7ELNPvL0OpcDpevwESiuYJgAqblageYtdy21crnupbtf/dGaAj6uxen1HvhBAvFHn8P8JrrPd+50NL9oOGz38grf05hBE4SJ0ePOLFGBiVOQmz+vYKz+GKNtFoTMaKDW+AAslgGq84OI90dVq7sK9/acS+NT/4p0i6jL/98DJ8PIFhg9vgVoBgr3Aqttsq17/GkjolJJ+eVHUfYYaJLiAFnBhUefCvRXrWETOQ1EkFCHHwVsApOJJ2xcvkDVr783G5//t6N0IjRhT1+FDx29uhHf+fLPO8/0PCfn0r55Lcts11GL93sTs935Zi6Ss5JOLenejAR5OtCpYQtgl0+E6w0BrQrsN3QmjdyyQMR1x7RhDNngc6gmNbeyh577PmD8/psfa5l583Q3NaVzlp0c1OOaSz4t1S7cmgJsT5AU4vl3kZdwZuS+MkJMaNFjPFhOkvCoLzKkpH+3bFcsT2Wz6jRu7ZHIg2ErTF88I/3uvuvn7FHrgBvO29wZXP/n30N1/O8++tet47GSaEnT6/1zDMSL0lQt6dCL0ffV7RbTVQKDCo8BOksyaCx35Llztmc/NNckRv+n39rs6lg1NZgbC8vkbJHmv47XtJjcylmfdvJA7Hoho7mvPFn7NMz71rX5dmRH0SDrjTC4OCbKmpHceNT4qbymiSChOjcaIYybRe6dyfmwvsK8t6W5f6RPrLZoh95PwTq/LRq2ONWgA+/wfHDO3qs73gS5ymkjqbxIyM9zq729TgT6IIJBm5PBe0WSEtlmM6Ti02Ywb9MH2jGcnMjz5dqkc41q5CL0dfNe/7mL8LJtVrY4wwA4APvKIF6/urd29R6SYoqx46l9ohaKhGgPmCii7doUqNfrJDaZYsIIIsFnMKckXa/IF9fv1a++vr/2W4eN6dy0hh8qW541168919mjzOAnnhmroNS28kb/3qMqnMH1nv66qLXg4cn+mDxPh3QXqxuskQ8kScGgvn9I4W+0N1i5aodkXz70zfRPFJzRCVRm4f3vj8b/LCHGcCH3+iInfAPNzZ45mhCdSSulVROGE85vuC14AYN7YJgBvV9fFLD1wrYooTzsMnQ7TlnZWnW8qUlw02f2ejkhBdbWg5u2hlKstXHHmUA57/CEMeGr3/3B5z16Vs03+PpZS8vqjkp5zRcfR8UOuCjAn58REw+gdQRxBqFwfX+kpH+1kiubxr51pYWM/8yZ3lz3OO4Frz07dnsv8weEwrx7vM77FsC11R55f95ph6zlUJ6kzup1OfZsZKE2vcP9/jazkmvWkbHE03ygkkDbX0E1KtI08iPdsbyqbboHX85plwwY/TWiYReGkhPq5Q9YgV49/kdDgL+7IKUH06lut83++UdP07PyLX19JqTohCunakfdHKXchUzVsPmLUbCDX4UZKdRv81yc8Py7WYsnX/cIRJbuOy2QEpaxewRK0CnkvJDZyg3kNp9qs1Uxkd65vykJ0fGDKodhAov7gnay9GfKiMTeSIhnNvTMEh3nInl+q2Jfq0iMjsXQdPBnIGPf1z4eBjRVi2rfgV4x3ldnoKQaxv+4tKcakRcUI6c6JunVZ3J+zBbbWAQ7+MjvKnRKxTV50RlOfl9pTGgTmFWZHEuks9vrpv/fP3tvr9P22OKovW9Md/xEbDqDaBr4c6FiKmuyBvP7FJsm6NKqXlNWdkYq6KPoY3QrkCAjqLEsKZKMpIn8j6g2xOkZejfb7l5ZyTfm5jT1hfHlW5sWMzOvA/LqjWAt5/teNfZPQookRNeviWmK1Kq9OXZo105MXHkQsX7yNDqfB5na6SjeeKiwQa88NW2B5/I1skx+ewBY9z6zv8uFNcZPaqqFDvw9j/NrOChWLVngA5QBCQV/nJjn/GOkdE+R1e9nDyamlIEOAlT3NADKWhcwo2MiI+tqneB6owyMMYdIp68XH/CPvJfVy3o9p/8PXLG0aI8A04IkhGxZ7BqV4BTeoZRJxScl9+/Dx7I92vjfc6uOk62qNn91TQfGjPw+mgz0X6hiKzJaRIbTKiD77DekMxbbn4gki9TYNszXyBM1EWxIFNh5NpTWJUG8LazlWuTPnPW88Fvpxq7QiXy5qR6KidUnRQ0dKILQqkmVKtIQbChAvDMMO5p1oifM3LVXMSlpL73hj9Wdrbh3h/Cpr8JpKg9hFVpALMemlFMUY38/kklYmVt1cv5ZSf7J4ORHyzepye4Xo7+WFVktIBd7ucVKM9XUiHdHssNC5F842LH5nNefI9/xgbB5mDjK4UNv5Ntf34dq84A3nOuUgFihX17cE0spuw5ciI1x5eUsg8Y74OHNMH7Gr1KXikN9RdIHnUKLTGzjUj+v5kyV+wowZkffpJctsOT7OWJLo+UVXcI/knU5cmaY7YOjW7EaT3/7Ir6V1Q805EX0kBpjqrQU8jlseMjxJUEE6q9jDCwvCWBbYbbO3DVPovMv21J5WtHbtdrTt7Ki3oxR1z5490vi4Iay32ThtkDxoE68dLd9Kv7h1HOo2RVGcBLL2hw5DU5miDtFnpzmfz+bU4ec5ycUwlW23YY1k8vT69aQSfymhQMkg7jL1ZaIBnYo6TYu2Zj/cyPpxt3/OA9ZUb/eQs/nJ6TSs/iVuCUZHTQZaSXeNpFUVgCGugelGm+agzg5rtT/uKiDjt3wpsnvP53cWa8HT1tIpVjxlJTtqh6CVPiZLmbQKGCq9ZEE1HEhdk/Dp1fsiSmO5PTb85X0/9YKvVmL1n4Fw6/+niFBF0hLYkqNhVKM4LrCOsnLKU4TztKMbqVS2Q6gIYeHavGAHqp8rT9DZft05QjOqlOOzN5kk9e1hF77KwFL4pnZWfb5S4aTsW7mP5oVSQtk2yBQY+lAPIYBa/idsb+zhunG3dc/NSttXbO5Q+/6pgCpD5aqZvx4aroBWmVTTo7aeZ+WosXpLWdSlpkKdkz2tCvGgN4xgER/3xll298qQuxY+msZOONvnfcjsjURQdLfogBJ6r4yPT9SPxAeVQqhTxjzj/YYmalDsCD31KMmo6J3c7u2Lx/YP3MGc2kc5R4ceLFDgtSrJSKVME4QTpFu3WpwmWjre636ozMO9cUuEcv1xYny+ruu7QqDOCYP0yBLt++QeUzX6xqPmHynf/SOvm2NF2/uSDByogDoNqVUjTv18R9VzSDRNtQojiLxL6bjC9tqazZOZ0UWk+13iAefABflHHgLbSqZq5bZd99Ef2pn76ECu2/YZyTKLCP3sN9sjGYzn7jM4QWAODog4SrfmK55eN36stP/H+5d7s72qDniDJlFKyqWFVW7MPwTw82tvNSiuZMZCatMmIZlBm0rNBHf+5PxSX5brs8sTOOi+0ENYhf7jy2oiz/XifNm83NehRRNKcr7rcvN+2Nr2UH/8iCABzL6q65HnQFOOiNHVDBo/zeJxfgzKfK77/wkH0uur57snP6lFIsEg0CPlf27KsPfrQQ4WtJhJE8Ts0vfGel8ACC5PpbctXGjkKuM21UR7w3g/8QAOOhVzTdual4sV21OYHKdtxxf8LsCRNED/yUDfPPZgvrsBT0LtrypBBi/kaCGsD6OMdOB1++2ks1HtOD1pFceFXnNCQ9vRBLPo4CNbMebPCd5sxOLUddzZkxwIbai6kKqPik1G4nY/Me4+vem1wQYZb1o8z38jK/NGrr/ZiSBRbxU1fROhfMbXkal3fpYshzGDluDibsryfYFmif189ze39+cGqLOsz0UyT264s5PSsXc5gIEi7TRUGkTyWa0aJNUa2iGmyyEFFnk3R7UmuYuNRcL9bHBOryvRwK3s/LbLNmG/0cNUUKgBrIWeT4BE7LY0dOo0ANkZuZ4UzdynXaCaXChyXcGcArxkIjXZI4cVrIt8d7rvU8I+5pkSzXWgiFpMTSphTVJGfGGBwLgqDOgNFuMrqwKa4vdhAdU5UwPd0H6W4KtBpjcX5hKprwVnLDtAwZFgYuAqc2cc+5FC3MoVqnJoeRo78KW5AFMYDD3t8gzg3udNPU0e+kONyTU9JzvOoGXXkX+4N4IDENrSVbtGBzKloLXD6zZyK3GNeXSlGxMxj8gWZ/FNTQ65bM5kbdpN2cjKsMyr7//Lc8engKL4qRtaDM0+UWety2CvtQBjGANRtytFse8YYFr6qxmRQvp4jKEUCY2W2AgvY1b9u+FhuNJCJUWWcGe3+TuMW43twaFdsTiK4JNvgBk+I0ktbiuE3bFRPJw5bXlwL4Y2vIadeyT0U5SGdIZQnPvnpPMPkf8plC/Gja7GJFiIp9pkfVaE9PUMcLVLU6/EqYgy+giZ3Vgu0SyQZEaiH0MxBEFC8uKrdahemdXZvvGnWBvdZCo1cw843RaLqTM1PLvRB++VuDLZFuEPT862g/Tfgm13Ab51PmeFbXxdiKavTkD3c49eM97t8M/Y6XO/5uJ6LJOlU9BdXDV1qeX2C5b2klams97mPIDdwvIWQRAG8Stzkqt5dsobMv1lcf7//2sSI6dHuWTH9xMu50iybh1zRXGeyUxDbxT/tnFk85l6eugZ6ewBYET1HvCvUov8KKDrjL3/ttJqZjDjg0L2/56Ki+8otPLoroc1Q5USFHyIOvSE9js11LkZA3dQyhWmwsGwBJrbGUjCx4xI/jJQmmm8HRd7ZTNs3FUVvzlug3eAXEIHTQyo10nnchSyfCgXYTnn+nKeXVcf8KrKABHPK6BX734tPpO+W+29r8+5832XZv+iSf6ouBg4dTbaCDr4KVPpVkh+ZthNdxNFxxW0WdSdxcPLIYR+XmCCjqwwyaYWSd7xXNzmbddvsJEx7JP6K/C9YiR8XIWWVY36JDGWE7Hc5YJW7RFdNqzwg/urjJj77blJFiXuOEybtv6ZzWbesR1krI+RbAayyp1qIyOVNCw0mjXjCxW4xHlu6MSi0jolME7OUmHvVGegsTcWFxNBrxhuiRKkcGa5kBju3iXwDR6CJe15GXkymQrgK36IoZQN5DY6djy1KXOzctsjSbHtZYTM9NnU4PAx3CHHwVSOwM1Xir5k0FQ2XF5fh5vDgTu35udD5v852qOhOvWID/Q4ljafaK9r5m3dhuwgg8qhc1TKbT/VI42yAHQpPNzDCD41jyXK6tUI8GrJABPOkNi6gqncRRz+Wo2miCmJNNJE8XISbk3l9xWrBtrSUpljw+VD6TDNyeuXQ2rjVmo2JrrURuNJheAJvi3MDt2e8WJZFB6MxjMcZY0SNzcOZfsXHqt9moH2VOAF7LjpCPuDIGUCzm6EYixVyBHJK0RU9LRU8HzQXd+4MnlnmKNtKc2YBIIdzWB0VxcbU5l5ucXZA4zauTcLFag6vIhW7ZdBbHzD69REaXm+49SkRAwY8Kes52eid8hlGjPEm/RJNnBY4W3a0K3v/NKT5t0uum9L2Suj7WyLT3cqZXjpCQtzqDg6/TWjyj1SgGnUbDuScEUon8zrjcJiq2N4hoIdzBd5B93a6Y5uJE1OrnzRSPY7JUBrWUUvSQr9E67R623fwF5u8oEvvzKVPSu/AQJGJ0t2vY2Bz9vpPEODXeV7zT01COFTRcNOOAHrGZpxxFmrclQkTVD1FvwKom9caOqNowIn6NasBIXZVUYGezZtOlkajmDfI4B4qYQQ+H+Fa6J3+BpedCXHAIn6YhFuFwwgyH3WYA+78lBf0JzvVJ05ROx+FVD/bOvwT1+y0rJshTeyAybS3HM5qzdZRJJOQlHKlJ0qVkfM7ElUZOFQ0Z7amGtFsyO1o1a/sJU7Br7iBkcEF2YIQ8rwAHdZmhgtDAESFB3KK77aW7Xg/kENCejKzdpkmpPA56AvijlIAHXx38SwvWaT02GpsIH6658MDtmc7F5cYmW2jXET8VNA7Woy6WdG46LjTrtgSYXekTHp4jDkvhHGF0QwN0X2K5kjVB3KK7zQBsUgCUl757VH/wrxegytGq8mKFZc9GoCkOT2K3aSma05wZxfCILnV2CyrgBVvopcnEPDbpl9WbZMUz4H6mGlDLfLdgtjRrptiLqMqunRqW3aITDn2hok9L2Y+7uUbfy1wQt+guN4B9Xtdg3WuXQDyu15V/+It75IDn//2UOn8aym8x2NuGmeOGM72WbINK1MdQRTVgiIGqSdzOqNpsxZXmtESuEHDro8bhennbWhyPer2c5GWwUu8OgQzoQQY965XsPBA28BFuF4CT+faKPvcuN4Buv89E1eJ7HfL5go4kU8V+t3ma9/1nK+SQFa9u8jNE8BLLEsWooAU7CRKF3Pogksb1xgO50YUFMa6uKiEdA4phvl0zLI5H+6SxKe+m7cGwmozmQc9skz5XObagHK2fZlGUM1b0oXe5p2H7nKdcUJx30mg31RpZo/gXq+phBE10UTQybarx/VqKqkCdkG5YlVSMW0qqzUJUbo4BOQL1eh1OSdoqm7mlUUsaMz3IcNx9Pzl80n2vo3Pqi9h69Tb6N1xLO/0v2pT1bgAast/j+IlHxi59yJvvTuEOIYm8bPpMXrs9al79SQi/BYH8XA/SJzZtrcaR5kwBr4YQCfcMZn+JXDepL22OKo2cGL+GUKHgAuLpKcwujVjTrJqyyO4XRhAVhHvoP+MiGudcS38sIeZCmiLAaSv0+LvsOTt9z+EbLaeeG5N6B0c36afuiNS5l6C6XCQyULyPQmwalOyS5swaDOMrLscvyCTO5nuN/ORsLyq2rXoJFnwnHtTQ7ZbMzlYtKvdjmdKVCb4TBm7RNRHy3AI87VAKxtNDgCtWSCG7zABy0WBs33i3k0++oaSvPy83gvBs9XIMoWP9FbRo2zqatIkkWHmT5fhIE/mdcbk7awud9Rg3PtiJhdn+GK/0C8bPrY2TdsUkK119e+gW3ejh7FvpPKVAXtqktFZIjF260n36sh6z/1bX0w6LYq/6LEHPUtX68D+H2m+nxGa7FqKez9lxNRIHM0U/yPONK61ufny2J3FaHbg9A6HgRXZ0i7KjWbf11EpphU1x2S1acugZDn12Hxk3lHErJMAuOwRf+N0+Lzsh4d7/aNuLv58eum3Ov9Aanm4G2gxz+PUKRlTL8TzlKAEdxz/eW/3HjgpOrFuMq0tpVF0cRdSETHQRj+tUpLk0FvX6ESXCFCRYtrkNoKcL/n6le9EwTmy3T1W7zAA+/KWuXPDVvnZ7Pv7K99KnzDf9ofmYvAgapLrbACW2XapRnqItoBqswZJ6gzG+n9SWNkXVZk7R9UK4+j7i1amRhaXRKLcwFo14S2LC7VKHvU/0ADCHgrtopXbMu8wAbt2WaqcnFCKcWt1ajmQxEUFDKdUrxHaBSrRFC3ZEhXqw1pIAHjWJ7yUjS/mo3KyikoTKuRcP3kjarthtrbotphHTITrv/LxIDCzgTsHfqitYeH6Xrb9rppTIwYYy6dS0/2Ec6ZXesyXI+B8U1PXkTE+rsWpkCnjdXbeaj0CeYZpjrbklrjSrErkxAjoFjKOrkSwsTti4VbLFcEfwgXaGn83ApcDV8aCA1oroZ9dtQFPL+vWGbV8tKt7M5ZLo63FkLkMkXS65sxIP9DNis6DFqKd5sw5DJWSFB/WitthdSiZmliTXi9UFjPdR8JZWp2zmm7VovB/LRMDZXxkoomkwlxjMlYLOpOQxe5oX6IP3VnnKVIX15yt3/uud6bFPLf+gXIovE8PWFXU7Dpr2ei3bWa1Fi2oooIHSHIcVFYzVWVvqpFGpvUGsq4UubNup2HRuOpZeQeKwtQh+Nv1vjpAvV8n/qI/3EUJhhdIhdpkBvHPdTpo9pZizTJ25UW66pdXPJfZqQS5RkSVWqqOQSF+smacYWc3bMSRgYdvBQJe4tjSXG5tvi01H8YEOvgOcwgPtklls1OyoN5KErjXn0RkHl3q4sUUvjYjxeGorFKS7y56/ms+zo9kl7Xqq5bz+8IIi5UJ8J8oXBe5ckafxihhxWopmtBDlEKYI2gNBUoncfDyy6OPaYl5EJeTBF8V3KnaxWbfeWWoasA7rsJ8ZJeKb11D6wjTF7U2uY5qSGgw7WZmw6F02OH7y18NqIn+UckhHWf/aBfGqfWvkJhH5jsC+io6wO+8EFNVYer4eowVjf1buMATeINa140rz/qjYroGuUSTMVmwQ75O6RBqLk1GlMWZLGGxIt+cw5W12lPwVz2f6ujx0v8Vz5ARq+rEVPB7t8hXwOGB8tEQUGT2gUgXDNhHzBRW5YTjud9fgh1hmfSnapgVTx1ALub1VDzZONTcxZ6JSu4CXYPV9xIOPpdWu2M3NqpHUUFvBbpK/ohoGv50ClyWYr/89LP0P1rIPZf3bFRZmlxvA1R+K2DHbJooM97aaYiVKxZjrgMuBneyOOXk54K1gu9SSFCtlfMCkewWTuLm41toRVVojEqflgI5GNY5umkhrYSpKugWTD+z2XGYz6FfLRDcD7MP1fJnncTormxe8W85AP/lEiW4vRQwqvRbdfrNpjHzLGK4Q6O36X1RPxKIWI6FoJwgY7zPo52U0KrfnkvH5OROlZZwJVvxGFPGWxU7Vtho1u64fyUhgn78AS4K5TDHX3sSObsSdch+38Sy+wKWysqrabU4AI5a4INh8HvGRJAXzfRvJV0TY+XPKePwM4n1SrcSbtRI1VKiiGuxwJ4oXo4241I7iSmOtGF8MdvBVRRRt12xvfiJK0+SR1/XcrXIhd1rs5xNyt++HIyZWqFMIkBKx235x0/+qECXgOoYksfi+64jwPYUrURrsulXYYU2bSpyjaKug4WZ/bxCjaVJb2hzXF3pi3IQSrrkeKj01bGnVbK9ZNWMq2NCFyRVmgCsM5vuC9rdQlD6GA5jkGys8+8NuTvzpNpTI9okKsR58fhWTjzdF+fhzEpnbHtTH40ABa9qUop3ko5qKTIbK8hrK44jSZjI2l0aVZqyKDZbm6EGN+FY1WmjWrHURoxCw1OJQrAjzvYT4yxaZq1AmJtIyOTbRDSLQbjWAuz9ZhYKlNF3kpxd1JRkpNAuTpSttbK9Vpf24B6uqat50dCRuaSLgQuX4DsqbSOSbUaUzY4vdSbF+3cDrE+zWN01jac9NRbVm1dT5WeuiIKhH8egMRJeNMnZ1k9/pLdJkP9bRoU0vUCPt3b4i3vGJKrkqJMVY1x8DlWl2iuGrgn4PHkd8pqJYmaEQLfmcmVIj5ZVU3C/KoqgKUbHTz0/NtG2xk6iXx1pJ+XEjCi6W+U7Fbm5XTC41VHZxfZ/HIlLbwzdT5Iot3NuBvxKIeQFCV/YNJtiKbAkbW1Jc23PLZ2dIKjhBrxK4BFgYfuXRvZyB2QiluKWVqI+VUcIm3XuJ/FxUbi3GlUZNojQJWd/HOrq9vHQWJm2S5iRvHkw6CYGmKKOYzc+n/OU3Ufux41ucw/76JhL+gW2BxBqwIgZw64di4iTCRjF3fmVG+jt7s8B3EK5HSHm0L0fwRNLUSiSUo8qggXOoRJdBnm9Ubu2I64stET+Jl5CtENVFzLZrxjdqZkNqKYd3e2pzgug7f87oNYdA67mcLRcywRgRszL9uH/k8bBiTgGHY/auHUSVCCmCWLlJjHxeRLb8nLJ+M6pgpaOl6F4tWK/COAFbCKGiYrWX1Bu5pLpUQzQOleZovKLgGyO2tTge91wUNPBuiADmBynmc0eQ2/QmapxCUQG+szuuhB4lK/ambv1QxNHP2x9A1VhRkSURvo3KdSAdHuEqIJ5BXf9qbDVviniNQ9b3MZFrx7Xmpri6ZCRyEyup018VSDpYtjZGItuqmFFWoL7PI2AW5Irt+GtHuD9NuEvexfu5gg4Xy0Ro2VZWP7f9eB4Z/mPEgMr9IBcJ8tPhV379KqBAJEsUo3nydhwjI4H0NsCLSpJ2cuOz7ajYjtSbXOB4n16rFs23K6bojIwScmXkZ76xqy1y8SJufp4ODhSewUkBfP4PxYoawKZ/GkFV8baqznmZ6dsGxl6iwnfhN5wFBpGdqsVoQUfiOY0lRgNdMimggkTaiIrtVlRurZM4HQ9ZaVGUtJuXdHZNVG2XTUGCXogwaHGAzgjyX3ny1/4W9/lRYhyGs3huOMl+iRVfIe/9xzqWFCTS6kiJpXpxm8BlwA0wSAZ9aMRhWNC8xRfsNDZcPy+GxSWiSmsxPzk3Z5J+IWSiy9Dtub1TNltbZVN1QilwsJsADYUrBK529No3sFYc8EymgtYm+GWCzKDqu1TiiF67QTrbo1wqXdV36Vd6Lj3QqY7IL+cMDOJ9oBzPaSUyGJkIOsEJTsQ34nKzF9caFTHeBqvv41Gj9Fp121uYiCMXST7w1l8VlYjonjyF/xsR3THD0dS5Wg2W77M9qN//lwmiKK/CLZt3MFkq0+sL9811HohILuv0uKWfqv+VXbTisNL2tdhpObLDm6cwGvMGBB9X2jviStOIuPWDUt9hEMG5WGYaIyZp1uwGbyQfOs1R0VZMfM0k01dVqDWmuEmexhQm8KXXQxFEV/f9rxLVeomeh4lynqPW1cjH9qe5yHzRGu7Vny8MMzj4NrUYbdGcKSFMEDK4XkEi55LRBaLqUqwQBZz98Vb6jVE736zbvjfkw0d7KgLfE+SLFdjxcmKKlDQFdq5QZuyjIdhkcVC9inrHu8+JVJNFWTdiZv/w7NzXDloT3djto84P+suKV4iNaj32JFLAay7Y9mcw+JfiSmtLVG0UTJLWh9X1g2A8TWeYWRy1xXbR1AyhAq+XtQMgcyCXAVd/FPof5jaZYY57aLOBw8NJ9zAEiw68/oKIf7nU86oXtbjyuhLHH4JCcteNd6eX3HSve6qIHhQZgcgsUYoaWopGiSQfrLKzDsKd42KnnRubW7K5Xh1nisHKmiukiXRadbvYrth1zkgtWPmLoUhAH+Rqgcs7tOZO5UYS6lqlyn1Bm988PEG3i1ffqjDuOf4Qo3LKgohs6ni4BJFLRekO6gZH230tmcdQDrnXBlQs7ajU0bjSmDZxvxwu0QWMV9ctGz+3Ni71ChIHTHCH4ewvyAOCXCjIDSkpeUakx+2E35Y9PEEN4H++1XL1xRVSL5x1SqRwE59+a/Eer3KFwE/ESEuLtqRFO46QC+Q/Ux3G9MfVxvbc+Py8SdK66q7pnfuYBALvrDzQrpiFdsmMeSQfPt6HJnAV6NUgrYhEQDTPoSwwE06630Dwm/LjDrb8eJPja5/pc/jbT5XohUsaW3OdzUWf10p8OyU7imGKUCVFBkVFkMj3kvqijapLNRUSQhSbk2EoiBHXGIv80qgteqFM2PcoAAa5xWI/Z7CbInJYrAI4eizKuoDi/XpCZwgBcOR+ESd9oMNd21VlC9TXR/e5WC/zFbuP5mwBqCH44etfiQpzy78hgBFDx0R+0SQpYtOSYlIUGXa83N08KIsgopp6kVarajutapRTQc2DprFSZZWXFxwF4kGDSXNtQnKtQLNHX8qUdZFF+rL/Cojz2FkVBgBw8x1dqsUcx312kRveN5JOTLvvgbkJiPFIuGh2BUQHQc8IXgLKAsMAN1UZiMIw+Cho/ykApJfiO5OsZ5ZtupPtIE8JJtUjZdUYQKlkKJcs37kQ6rUGUa6S9mKTYuTBdI4Qb3n5Vk4UMQpmOcQ9kKKGxe58BB4h8OGX5RcjQJEKs2zF4yhSXqHiho+PVWMAkYlodlL2u7yO32BJ+w76RvAKNnBkiw7q/SwfhoOPOcD2Fat+0FcltDAMMlR7NNUQ4ehjwh8vMzIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJWHf8/ftAmPsVSYvIAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjAtMTAtMjlUMDI6NTA6MDYrMDA6MDASZ++eAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIwLTEwLTI5VDAyOjUwOjA2KzAwOjAwYzpXIgAAAABJRU5ErkJggg==`; 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..949a10a --- /dev/null +++ b/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo1.vue @@ -0,0 +1,385 @@ + + + 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..731c587 --- /dev/null +++ b/src/views/demo/jeecg/Native/one/OneNativeList.vue @@ -0,0 +1,416 @@ + + + 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..5dd9ec8 --- /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..69cc4bd --- /dev/null +++ b/src/views/monitor/redis/index.vue @@ -0,0 +1,194 @@ + + 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/super/drag/page/components/CardList.vue b/src/views/super/drag/page/components/CardList.vue new file mode 100644 index 0000000..cebb7ae --- /dev/null +++ b/src/views/super/drag/page/components/CardList.vue @@ -0,0 +1,473 @@ + + + diff --git a/src/views/super/drag/page/components/DragPageModal.vue b/src/views/super/drag/page/components/DragPageModal.vue new file mode 100644 index 0000000..ce76d9b --- /dev/null +++ b/src/views/super/drag/page/components/DragPageModal.vue @@ -0,0 +1,187 @@ + + + + diff --git a/src/views/super/drag/page/components/PageModal.vue b/src/views/super/drag/page/components/PageModal.vue new file mode 100644 index 0000000..387736b --- /dev/null +++ b/src/views/super/drag/page/components/PageModal.vue @@ -0,0 +1,71 @@ + + diff --git a/src/views/super/drag/page/components/PasswordModal.vue b/src/views/super/drag/page/components/PasswordModal.vue new file mode 100644 index 0000000..685623b --- /dev/null +++ b/src/views/super/drag/page/components/PasswordModal.vue @@ -0,0 +1,105 @@ + + + diff --git a/src/views/super/drag/page/page.api.ts b/src/views/super/drag/page/page.api.ts new file mode 100644 index 0000000..90587d8 --- /dev/null +++ b/src/views/super/drag/page/page.api.ts @@ -0,0 +1,74 @@ +import { defHttp } from '/@/utils/http/axios'; +import { Modal } from 'ant-design-vue'; + +enum Api { + list = '/drag/page/list', + queryById = '/drag/page/queryById', + queryPageById = '/drag/page/queryPageById', + save = '/drag/page/add', + edit = '/drag/page/edit', + copyPage = '/drag/page/copyPage', + deleteOne = '/drag/page/delete', + deleteBatch = '/drag/page/deleteBatch', +} + +/** + * 列表 + * @param params + */ +export const list = (params) => defHttp.get({ url: Api.list, params }); +/** + * 根据id查询 + * @param params + */ +export const queryById = (params) => defHttp.get({ url: Api.queryById, params }, { isTransformResponse: false }); +/** + * 根据id查询(不租户隔离) + * @param params + */ +export const queryPageById = (params) => defHttp.get({ url: Api.queryPageById, params }, { isTransformResponse: false }); + +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, 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(); + }); + }, + }); +}; + +/** + * 复制 + */ +export const copyPage = (params, handleSuccess) => { + return defHttp.get({ url: Api.copyPage, params }, { isTransformResponse: false }).then(() => { + handleSuccess(); + }); +}; + diff --git a/src/views/super/drag/page/page.data.ts b/src/views/super/drag/page/page.data.ts new file mode 100644 index 0000000..fbd47ac --- /dev/null +++ b/src/views/super/drag/page/page.data.ts @@ -0,0 +1,66 @@ +import { BasicColumn, FormSchema } from '/@/components/Table'; + +export const columns: BasicColumn[] = [ + { + title: '名称', + align: 'center', + dataIndex: 'name', + }, +]; +export const searchFormSchema: FormSchema[] = [ + { + label: '名称', + field: 'name', + component: 'Input', + colProps: { span: 6 }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + label: '名称', + field: 'name', + component: 'Input', + required: true, + }, + { + label: '封面图', + field: 'coverUrl', + component: 'JImageUpload', + componentProps: { + fileMax: 1, + }, + }, + { + label: '分类', + field: 'type', + component: 'Select', + defaultValue: '1', + required: true, + componentProps: { + options: [ + { + label: '仪表盘设计', + value: '1', + key: '1', + }, + { + label: '门户设计器', + value: '2', + key: '2', + } + ] + } + }, + { + label: '保护码', + field: 'protectionCode', + component: 'StrengthMeter' + } +]; diff --git a/src/views/super/drag/page/pageList.vue b/src/views/super/drag/page/pageList.vue new file mode 100644 index 0000000..6289f29 --- /dev/null +++ b/src/views/super/drag/page/pageList.vue @@ -0,0 +1,176 @@ + + diff --git a/src/views/super/drag/page/useExportImage.ts b/src/views/super/drag/page/useExportImage.ts new file mode 100644 index 0000000..48ac8f9 --- /dev/null +++ b/src/views/super/drag/page/useExportImage.ts @@ -0,0 +1,65 @@ + +import {ref} from 'vue' +import html2canvas from 'html2canvas'; + +/** + * 用于导出生成image + */ +export function useExportImage() { + + const exportRef = ref(); + + /** + * 导出图片触发事件 + * @param fileName + */ + function onExportImage(fileName) { + let ele = exportRef.value; + if(!ele){ + console.error('没有导出对象') + return; + } + const size = { + width: ele.offsetWidth, + height: ele.offsetHeight + } + html2canvas(ele, { useCORS: true, logging: true }).then(async (canvas) => { + const dataURL = canvas.toDataURL('image/png'); + await download(dataURL, size, fileName); + }); + } + + async function download(imgUrl, size, fileName) { + const dataUrl = await getBase64(imgUrl, size); + const link:any = document.createElement('a'); + link.href = dataUrl; + link.download = `${fileName}.png`; + link.click(); + } + + function getBase64(url, size){ + return new Promise((resolve) => { + let canvas:any = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + const img = new Image(); + // 允许跨域 + img.crossOrigin = 'Anonymous'; + img.src = url; + img.onload = () => { + // eslint-disable-next-line prefer-destructuring + canvas.height = size.height; + // eslint-disable-next-line prefer-destructuring + canvas.width = size.width; + ctx!.drawImage(img, 0, 0, size.width, size.height); + const dataURL = canvas.toDataURL('image/png'); + canvas = null; + resolve(dataURL); + }; + }); + } + + return { + exportRef, + onExportImage + } +} \ No newline at end of file diff --git a/src/views/super/drag/page/view.vue b/src/views/super/drag/page/view.vue new file mode 100644 index 0000000..f3aa04a --- /dev/null +++ b/src/views/super/drag/page/view.vue @@ -0,0 +1,158 @@ + + + + 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..878a60c --- /dev/null +++ b/src/views/sys/login/TokenLoginPage.vue @@ -0,0 +1,209 @@ + + + + + + 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..61b73d4 --- /dev/null +++ b/src/views/system/address/index.less @@ -0,0 +1,13 @@ +//noinspection LessUnresolvedVariable +@prefix-cls: ~'@{namespace}-address-list'; + +.@{prefix-cls} { + // update-begin-author:liusq date:20230625 for: [issues/563]暗色主题部分失效 + background-color: @component-background; + // update-end-author:liusq date:20230625 for: [issues/563]暗色主题部分失效 + &--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..302f969 --- /dev/null +++ b/src/views/system/address/index.vue @@ -0,0 +1,89 @@ + + + + + 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..bb4a998 --- /dev/null +++ b/src/views/system/category/index.vue @@ -0,0 +1,296 @@ + + + + + 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..23cc921 --- /dev/null +++ b/src/views/system/depart/components/DepartFormTab.vue @@ -0,0 +1,128 @@ + + + + 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..b87222f --- /dev/null +++ b/src/views/system/depart/components/DepartRuleTab.vue @@ -0,0 +1,170 @@ + + + + + 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..67e0e08 --- /dev/null +++ b/src/views/system/depart/index.less @@ -0,0 +1,14 @@ +//noinspection LessUnresolvedVariable +@prefix-cls: ~'@{namespace}-depart-manage'; + +.@{prefix-cls} { + // update-begin-author:liusq date:20230625 for: [issues/563]暗色主题部分失效 + background: @component-background; + // update-end-author:liusq date:20230625 for: [issues/563]暗色主题部分失效 + + &--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..406347f --- /dev/null +++ b/src/views/system/depart/index.vue @@ -0,0 +1,63 @@ + + + + + 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 @@ +