From 2e1cd65b07dcc94f785be89cbb2665a761ec4bde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=88=90?= Date: Wed, 8 Oct 2025 15:10:33 +0800 Subject: [PATCH] init --- .gitignore | 26 + babel.config.js | 15 + build.bat | 76 + build.sh | 65 + package-lock.json | 4861 +++++++++++++++++ package.json | 49 + src/api/system/fileServe.js | 15 + src/api/system/hot_city_qr_config_server.js | 51 + src/api/system/index.js | 17 + src/api/system/pla_account_server.js | 38 + src/api/system/rolePermissionServer.js | 30 + src/api/system/roleServer.js | 26 + src/api/system/shpProfitServer.js | 15 + src/api/system/specificationServer.js | 25 + src/api/system/sysAddressServer.js | 10 + src/api/system/sysModuleServer.js | 30 + src/api/system/sys_log_serve.js | 30 + src/api/system/systemType_server.js | 38 + src/api/system/tableServer.js | 31 + src/api/system/userServer.js | 40 + src/api/system/wch_professions_server.js | 33 + src/api/system_high/formFieldServer.js | 30 + src/api/system_high/formServer.js | 35 + src/api/system_high/index.js | 10 + src/api/system_high/menuServer.js | 49 + src/api/system_high/modelFieldServer.js | 32 + src/api/system_high/modelServer.js | 40 + src/api/system_high/paramSetupServer.js | 29 + src/api/system_high/sysControlTypeServer.js | 29 + src/assets/css/animate.css | 3688 +++++++++++++ src/assets/css/base.less | 149 + src/assets/css/ivewExpand.less | 322 ++ src/assets/icons/iconfont.css | 37 + src/assets/icons/iconfont.eot | Bin 0 -> 3856 bytes src/assets/icons/iconfont.svg | 56 + src/assets/icons/iconfont.ttf | Bin 0 -> 3688 bytes src/assets/icons/iconfont.woff | Bin 0 -> 2180 bytes src/assets/images/administrato.png | Bin 0 -> 4665 bytes src/assets/images/bigmeter.png | Bin 0 -> 1326 bytes src/assets/images/error-page/error-401.svg | 1 + src/assets/images/error-page/error-404.svg | 1 + src/assets/images/error-page/error-500.svg | 1 + src/assets/images/famen.png | Bin 0 -> 1583 bytes src/assets/images/flowarrow.png | Bin 0 -> 2069 bytes src/assets/images/flowarrow2.png | Bin 0 -> 1017 bytes src/assets/images/load.gif | Bin 0 -> 3211 bytes src/assets/images/login-bg.jpg | Bin 0 -> 21684 bytes src/assets/images/logo.png | Bin 0 -> 3886 bytes src/assets/images/meter.png | Bin 0 -> 1344 bytes src/assets/images/mincompanyLogo.png | Bin 0 -> 5286 bytes src/assets/images/secondaryflowMeter.png | Bin 0 -> 1354 bytes src/assets/images/start.png | Bin 0 -> 1203 bytes src/assets/images/unbigmeter.png | Bin 0 -> 1883 bytes src/assets/images/unfamen.png | Bin 0 -> 1412 bytes src/assets/images/unmeter.png | Bin 0 -> 1636 bytes src/assets/images/unsecondaryflowMeter.png | Bin 0 -> 1353 bytes src/assets/three/OrbitControls.js | 1019 ++++ src/components/asyncModal/index.vue | 49 + src/components/common-icon/common-icon.vue | 42 + src/components/common-icon/index.js | 2 + src/components/cron-input/index.vue | 105 + src/components/cropper/index.js | 2 + src/components/cropper/index.less | 36 + src/components/cropper/index.vue | 155 + src/components/editor/index.vue | 95 + src/components/info-card/index.js | 2 + src/components/info-card/infor-card.vue | 94 + src/components/load-flower/index.vue | 32 + src/components/login-form/index.js | 2 + src/components/login-form/login-form.vue | 68 + .../main/components/a-back-top/index.js | 2 + .../main/components/a-back-top/index.vue | 94 + .../main/components/fullscreen/fullscreen.vue | 90 + .../main/components/fullscreen/index.js | 2 + .../custom-bread-crumb.less | 4 + .../custom-bread-crumb/custom-bread-crumb.vue | 46 + .../header-bar/custom-bread-crumb/index.js | 2 + .../components/header-bar/header-bar.less | 18 + .../main/components/header-bar/header-bar.vue | 39 + .../main/components/header-bar/index.js | 2 + .../header-bar/sider-trigger/index.js | 2 + .../sider-trigger/sider-trigger.less | 21 + .../sider-trigger/sider-trigger.vue | 27 + .../main/components/language/index.js | 2 + .../main/components/language/language.vue | 51 + .../components/side-menu/collapsed-menu.vue | 58 + .../main/components/side-menu/index.js | 2 + .../main/components/side-menu/item-mixin.js | 21 + .../main/components/side-menu/mixin.js | 18 + .../components/side-menu/side-menu-item.vue | 25 + .../main/components/side-menu/side-menu.less | 39 + .../main/components/side-menu/side-menu.vue | 112 + .../main/components/terminal/index.vue | 63 + .../main/components/terminal/terminal.vue | 62 + src/components/main/components/user/index.js | 2 + src/components/main/components/user/user.less | 12 + src/components/main/components/user/user.vue | 68 + src/components/main/index.js | 2 + src/components/main/main.less | 109 + src/components/main/main.vue | 145 + src/components/main/pageHead.vue | 23 + src/components/markdown/index.js | 2 + src/components/markdown/markdown.vue | 78 + src/components/md-icons/icons.vue | 34 + src/components/md-icons/index.js | 2 + src/components/parent-view/index.js | 2 + src/components/parent-view/parent-view.vue | 18 + src/components/paste-editor/index.js | 2 + src/components/paste-editor/paste-editor.less | 26 + src/components/paste-editor/paste-editor.vue | 120 + .../paste-editor/plugins/placeholder.js | 61 + src/components/split-pane/index.js | 2 + src/components/split-pane/index.less | 114 + src/components/split-pane/split.vue | 188 + src/components/split-pane/trigger.vue | 45 + src/components/tables/editModal.vue | 279 + src/components/tables/fieldItem.vue | 17 + src/components/tables/index.vue | 270 + src/components/tables/templateRender.js | 9 + src/components/text-area/index.vue | 21 + .../treeGrid/component/renderCol.vue | 24 + .../treeGrid/component/subColmns.vue | 23 + .../treeGrid/component/subThead.vue | 31 + .../treeGrid/component/subTreeGrid.vue | 341 ++ src/components/treeGrid/index.vue | 54 + src/components/upload/Custom.vue | 108 + src/components/upload/Multiple.vue | 93 + src/components/upload/Single.vue | 75 + src/components/upload/mod/fileBtn.vue | 51 + src/components/upload/mod/fileListModal.vue | 177 + src/components/upload/upload.less | 40 + src/config/index.js | 9 + src/index.js | 335 ++ src/router/index.js | 68 + src/store/app.js | 63 + src/store/index.js | 10 + src/store/user.js | 103 + src/utils/http.js | 219 + src/utils/tools.js | 502 ++ src/utils/uiTool.js | 198 + src/views/error-page/401.vue | 19 + src/views/error-page/404.vue | 19 + src/views/error-page/500.vue | 19 + src/views/error-page/back-btn-group.vue | 38 + src/views/error-page/error-content.vue | 30 + src/views/error-page/error.less | 46 + src/views/login/login.less | 29 + src/views/login/login.vue | 83 + src/views/system/sys_log.vue | 176 + src/views/system/sys_param_setup.vue | 111 + src/views/system/sys_role.vue | 149 + src/views/system/sys_user.vue | 139 + src/views/system/wch_cities.vue | 145 + src/views/system/wch_professions.vue | 239 + src/views/system_high/com/databaseType.vue | 33 + .../system_high/com/frontEndControlType.vue | 251 + src/views/system_high/sys_control.vue | 148 + src/views/system_high/sys_menu.vue | 402 ++ src/views/system_high/sys_title.vue | 63 + webpack.config.js | 208 + 完整使用文档.md | 879 +++ 161 files changed, 19936 insertions(+) create mode 100644 .gitignore create mode 100644 babel.config.js create mode 100644 build.bat create mode 100644 build.sh create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/api/system/fileServe.js create mode 100644 src/api/system/hot_city_qr_config_server.js create mode 100644 src/api/system/index.js create mode 100644 src/api/system/pla_account_server.js create mode 100644 src/api/system/rolePermissionServer.js create mode 100644 src/api/system/roleServer.js create mode 100644 src/api/system/shpProfitServer.js create mode 100644 src/api/system/specificationServer.js create mode 100644 src/api/system/sysAddressServer.js create mode 100644 src/api/system/sysModuleServer.js create mode 100644 src/api/system/sys_log_serve.js create mode 100644 src/api/system/systemType_server.js create mode 100644 src/api/system/tableServer.js create mode 100644 src/api/system/userServer.js create mode 100644 src/api/system/wch_professions_server.js create mode 100644 src/api/system_high/formFieldServer.js create mode 100644 src/api/system_high/formServer.js create mode 100644 src/api/system_high/index.js create mode 100644 src/api/system_high/menuServer.js create mode 100644 src/api/system_high/modelFieldServer.js create mode 100644 src/api/system_high/modelServer.js create mode 100644 src/api/system_high/paramSetupServer.js create mode 100644 src/api/system_high/sysControlTypeServer.js create mode 100644 src/assets/css/animate.css create mode 100644 src/assets/css/base.less create mode 100644 src/assets/css/ivewExpand.less create mode 100644 src/assets/icons/iconfont.css create mode 100644 src/assets/icons/iconfont.eot create mode 100644 src/assets/icons/iconfont.svg create mode 100644 src/assets/icons/iconfont.ttf create mode 100644 src/assets/icons/iconfont.woff create mode 100644 src/assets/images/administrato.png create mode 100644 src/assets/images/bigmeter.png create mode 100644 src/assets/images/error-page/error-401.svg create mode 100644 src/assets/images/error-page/error-404.svg create mode 100644 src/assets/images/error-page/error-500.svg create mode 100644 src/assets/images/famen.png create mode 100644 src/assets/images/flowarrow.png create mode 100644 src/assets/images/flowarrow2.png create mode 100644 src/assets/images/load.gif create mode 100644 src/assets/images/login-bg.jpg create mode 100644 src/assets/images/logo.png create mode 100644 src/assets/images/meter.png create mode 100644 src/assets/images/mincompanyLogo.png create mode 100644 src/assets/images/secondaryflowMeter.png create mode 100644 src/assets/images/start.png create mode 100644 src/assets/images/unbigmeter.png create mode 100644 src/assets/images/unfamen.png create mode 100644 src/assets/images/unmeter.png create mode 100644 src/assets/images/unsecondaryflowMeter.png create mode 100644 src/assets/three/OrbitControls.js create mode 100644 src/components/asyncModal/index.vue create mode 100644 src/components/common-icon/common-icon.vue create mode 100644 src/components/common-icon/index.js create mode 100644 src/components/cron-input/index.vue create mode 100644 src/components/cropper/index.js create mode 100644 src/components/cropper/index.less create mode 100644 src/components/cropper/index.vue create mode 100644 src/components/editor/index.vue create mode 100644 src/components/info-card/index.js create mode 100644 src/components/info-card/infor-card.vue create mode 100644 src/components/load-flower/index.vue create mode 100644 src/components/login-form/index.js create mode 100644 src/components/login-form/login-form.vue create mode 100644 src/components/main/components/a-back-top/index.js create mode 100644 src/components/main/components/a-back-top/index.vue create mode 100644 src/components/main/components/fullscreen/fullscreen.vue create mode 100644 src/components/main/components/fullscreen/index.js create mode 100644 src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less create mode 100644 src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.vue create mode 100644 src/components/main/components/header-bar/custom-bread-crumb/index.js create mode 100644 src/components/main/components/header-bar/header-bar.less create mode 100644 src/components/main/components/header-bar/header-bar.vue create mode 100644 src/components/main/components/header-bar/index.js create mode 100644 src/components/main/components/header-bar/sider-trigger/index.js create mode 100644 src/components/main/components/header-bar/sider-trigger/sider-trigger.less create mode 100644 src/components/main/components/header-bar/sider-trigger/sider-trigger.vue create mode 100644 src/components/main/components/language/index.js create mode 100644 src/components/main/components/language/language.vue create mode 100644 src/components/main/components/side-menu/collapsed-menu.vue create mode 100644 src/components/main/components/side-menu/index.js create mode 100644 src/components/main/components/side-menu/item-mixin.js create mode 100644 src/components/main/components/side-menu/mixin.js create mode 100644 src/components/main/components/side-menu/side-menu-item.vue create mode 100644 src/components/main/components/side-menu/side-menu.less create mode 100644 src/components/main/components/side-menu/side-menu.vue create mode 100644 src/components/main/components/terminal/index.vue create mode 100644 src/components/main/components/terminal/terminal.vue create mode 100644 src/components/main/components/user/index.js create mode 100644 src/components/main/components/user/user.less create mode 100644 src/components/main/components/user/user.vue create mode 100644 src/components/main/index.js create mode 100644 src/components/main/main.less create mode 100644 src/components/main/main.vue create mode 100644 src/components/main/pageHead.vue create mode 100644 src/components/markdown/index.js create mode 100644 src/components/markdown/markdown.vue create mode 100644 src/components/md-icons/icons.vue create mode 100644 src/components/md-icons/index.js create mode 100644 src/components/parent-view/index.js create mode 100644 src/components/parent-view/parent-view.vue create mode 100644 src/components/paste-editor/index.js create mode 100644 src/components/paste-editor/paste-editor.less create mode 100644 src/components/paste-editor/paste-editor.vue create mode 100644 src/components/paste-editor/plugins/placeholder.js create mode 100644 src/components/split-pane/index.js create mode 100644 src/components/split-pane/index.less create mode 100644 src/components/split-pane/split.vue create mode 100644 src/components/split-pane/trigger.vue create mode 100644 src/components/tables/editModal.vue create mode 100644 src/components/tables/fieldItem.vue create mode 100644 src/components/tables/index.vue create mode 100644 src/components/tables/templateRender.js create mode 100644 src/components/text-area/index.vue create mode 100644 src/components/treeGrid/component/renderCol.vue create mode 100644 src/components/treeGrid/component/subColmns.vue create mode 100644 src/components/treeGrid/component/subThead.vue create mode 100644 src/components/treeGrid/component/subTreeGrid.vue create mode 100644 src/components/treeGrid/index.vue create mode 100644 src/components/upload/Custom.vue create mode 100644 src/components/upload/Multiple.vue create mode 100644 src/components/upload/Single.vue create mode 100644 src/components/upload/mod/fileBtn.vue create mode 100644 src/components/upload/mod/fileListModal.vue create mode 100644 src/components/upload/upload.less create mode 100644 src/config/index.js create mode 100644 src/index.js create mode 100644 src/router/index.js create mode 100644 src/store/app.js create mode 100644 src/store/index.js create mode 100644 src/store/user.js create mode 100644 src/utils/http.js create mode 100644 src/utils/tools.js create mode 100644 src/utils/uiTool.js create mode 100644 src/views/error-page/401.vue create mode 100644 src/views/error-page/404.vue create mode 100644 src/views/error-page/500.vue create mode 100644 src/views/error-page/back-btn-group.vue create mode 100644 src/views/error-page/error-content.vue create mode 100644 src/views/error-page/error.less create mode 100644 src/views/login/login.less create mode 100644 src/views/login/login.vue create mode 100644 src/views/system/sys_log.vue create mode 100644 src/views/system/sys_param_setup.vue create mode 100644 src/views/system/sys_role.vue create mode 100644 src/views/system/sys_user.vue create mode 100644 src/views/system/wch_cities.vue create mode 100644 src/views/system/wch_professions.vue create mode 100644 src/views/system_high/com/databaseType.vue create mode 100644 src/views/system_high/com/frontEndControlType.vue create mode 100644 src/views/system_high/sys_control.vue create mode 100644 src/views/system_high/sys_menu.vue create mode 100644 src/views/system_high/sys_title.vue create mode 100644 webpack.config.js create mode 100644 完整使用文档.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fa231f7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# Dependencies +node_modules/ + +# Build output +dist/ + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# OS +.DS_Store +Thumbs.db + diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..94d0bb8 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,15 @@ +module.exports = { + presets: [ + [ + '@babel/preset-env', + { + modules: false, + targets: { + browsers: ['>1%', 'last 2 versions', 'not ie <= 8'] + } + } + ], + '@vue/babel-preset-jsx' + ] +} + diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..9f7edf6 --- /dev/null +++ b/build.bat @@ -0,0 +1,76 @@ +@echo off +chcp 65001 >nul +setlocal enabledelayedexpansion + +echo ================================ +echo Admin Framework 构建工具 +echo ================================ +echo. + +REM 检查 Node.js 是否安装 +where node >nul 2>nul +if %errorlevel% neq 0 ( + echo ❌ 错误: 未检测到 Node.js,请先安装 Node.js + pause + exit /b 1 +) + +for /f "tokens=*" %%i in ('node -v') do set NODE_VERSION=%%i +for /f "tokens=*" %%i in ('npm -v') do set NPM_VERSION=%%i + +echo ✅ Node.js 版本: %NODE_VERSION% +echo ✅ NPM 版本: %NPM_VERSION% +echo. + +REM 检查是否已安装依赖 +if not exist "node_modules" ( + echo 📦 正在安装依赖... + call npm install + if !errorlevel! neq 0 ( + echo ❌ 依赖安装失败 + pause + exit /b 1 + ) + echo ✅ 依赖安装成功 + echo. +) else ( + echo ✅ 依赖已安装 + echo. +) + +REM 执行打包 +echo 🔨 正在打包框架... +call npm run build + +if %errorlevel% equ 0 ( + echo. + echo ================================ + echo ✅ 打包成功! + echo ================================ + echo. + echo 📦 输出文件: dist\admin-framework.js + + REM 显示文件大小 + if exist "dist\admin-framework.js" ( + for %%A in (dist\admin-framework.js) do ( + set SIZE=%%~zA + set /a SIZE_KB=!SIZE! / 1024 + echo 📊 文件大小: !SIZE_KB! KB + ) + ) + + echo. + echo 📚 下一步: + echo 1. 将 dist\admin-framework.js 复制到你的项目 + echo 2. 查看 QUICK_START.md 了解如何使用 + echo 3. 查看 USAGE_EXAMPLE.md 了解详细示例 + echo. +) else ( + echo. + echo ❌ 打包失败,请检查错误信息 + pause + exit /b 1 +) + +pause + diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..86d7a1d --- /dev/null +++ b/build.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +# Admin Framework 构建脚本 + +echo "================================" +echo " Admin Framework 构建工具" +echo "================================" +echo "" + +# 检查 Node.js 是否安装 +if ! command -v node &> /dev/null +then + echo "❌ 错误: 未检测到 Node.js,请先安装 Node.js" + exit 1 +fi + +echo "✅ Node.js 版本: $(node -v)" +echo "✅ NPM 版本: $(npm -v)" +echo "" + +# 检查是否已安装依赖 +if [ ! -d "node_modules" ]; then + echo "📦 正在安装依赖..." + npm install + if [ $? -ne 0 ]; then + echo "❌ 依赖安装失败" + exit 1 + fi + echo "✅ 依赖安装成功" + echo "" +else + echo "✅ 依赖已安装" + echo "" +fi + +# 执行打包 +echo "🔨 正在打包框架..." +npm run build + +if [ $? -eq 0 ]; then + echo "" + echo "================================" + echo " ✅ 打包成功!" + echo "================================" + echo "" + echo "📦 输出文件: dist/admin-framework.js" + + # 显示文件大小 + if [ -f "dist/admin-framework.js" ]; then + SIZE=$(du -h dist/admin-framework.js | cut -f1) + echo "📊 文件大小: $SIZE" + fi + + echo "" + echo "📚 下一步:" + echo " 1. 将 dist/admin-framework.js 复制到你的项目" + echo " 2. 查看 QUICK_START.md 了解如何使用" + echo " 3. 查看 USAGE_EXAMPLE.md 了解详细示例" + echo "" +else + echo "" + echo "❌ 打包失败,请检查错误信息" + exit 1 +fi + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..dccebe1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4861 @@ +{ + "name": "admin-framework", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "admin-framework", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@vue/babel-preset-jsx": "^1.4.0", + "brace": "^0.11.1", + "dayjs": "^1.10.0", + "js-cookie": "^2.2.1", + "vue2-ace-editor": "^0.0.15", + "vuex-persistedstate": "^4.0.0" + }, + "devDependencies": { + "@babel/core": "^7.12.0", + "@babel/preset-env": "^7.12.0", + "babel-loader": "^8.2.0", + "css-loader": "^5.0.0", + "file-loader": "^6.2.0", + "less": "^4.0.0", + "less-loader": "^7.0.0", + "style-loader": "^2.0.0", + "url-loader": "^4.1.0", + "vue-loader": "^15.9.0", + "vue-style-loader": "^4.1.0", + "vue-template-compiler": "^2.6.0", + "webpack": "^5.0.0", + "webpack-cli": "^4.0.0" + }, + "peerDependencies": { + "axios": "^0.21.0", + "view-design": "^4.0.0", + "vue": "^2.6.0", + "vue-router": "^3.0.0", + "vuex": "^3.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.7.0", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.7.0.tgz", + "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.14.0" + } + }, + "node_modules/@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz", + "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==", + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz", + "integrity": "sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-preset-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz", + "integrity": "sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==", + "license": "MIT", + "dependencies": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "@vue/babel-sugar-composition-api-inject-h": "^1.4.0", + "@vue/babel-sugar-composition-api-render-instance": "^1.4.0", + "@vue/babel-sugar-functional-vue": "^1.4.0", + "@vue/babel-sugar-inject-h": "^1.4.0", + "@vue/babel-sugar-v-model": "^1.4.0", + "@vue/babel-sugar-v-on": "^1.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "vue": "*" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-sugar-composition-api-inject-h": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz", + "integrity": "sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-render-instance": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz", + "integrity": "sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-functional-vue": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz", + "integrity": "sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-inject-h": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz", + "integrity": "sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz", + "integrity": "sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-on": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz", + "integrity": "sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "camelcase": "^5.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "2.7.16", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", + "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==", + "peer": true, + "dependencies": { + "@babel/parser": "^7.23.5", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + }, + "optionalDependencies": { + "prettier": "^1.18.2 || ^2.0.0" + } + }, + "node_modules/@vue/component-compiler-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", + "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.36", + "postcss-selector-parser": "^6.0.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "optionalDependencies": { + "prettier": "^1.18.2 || ^2.0.0" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vue/component-compiler-utils/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/async-validator": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-3.5.2.tgz", + "integrity": "sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ==", + "license": "MIT", + "peer": true + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmmirror.com/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "license": "MIT", + "peer": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/babel-loader": { + "version": "8.4.1", + "resolved": "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.4.1.tgz", + "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.4", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.12", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.12.tgz", + "integrity": "sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/batch-processor": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/batch-processor/-/batch-processor-1.0.0.tgz", + "integrity": "sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==", + "license": "MIT", + "peer": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace": { + "version": "0.11.1", + "resolved": "https://registry.npmmirror.com/brace/-/brace-0.11.1.tgz", + "integrity": "sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q==", + "license": "MIT" + }, + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001748", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001748.tgz", + "integrity": "sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmmirror.com/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/core-js-compat": { + "version": "3.45.1", + "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "5.2.7", + "resolved": "https://registry.npmmirror.com/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT", + "peer": true + }, + "node_modules/dayjs": { + "version": "1.11.18", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.18.tgz", + "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.232", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.232.tgz", + "integrity": "sha512-ENirSe7wf8WzyPCibqKUG1Cg43cPaxH4wRR7AJsX7MCABCHBIOFqvaYODSLKUuZdraxUTHRE/0A2Aq8BYKEHOg==", + "license": "ISC" + }, + "node_modules/element-resize-detector": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/element-resize-detector/-/element-resize-detector-1.2.4.tgz", + "integrity": "sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==", + "license": "MIT", + "peer": true, + "dependencies": { + "batch-processor": "1.0.0" + } + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.17.0", + "resolved": "https://registry.npmmirror.com/envinfo/-/envinfo-7.17.0.tgz", + "integrity": "sha512-GpfViocsFM7viwClFgxK26OtjMlKN67GCR5v6ASFkotxtpBWd9d+vNy+AH7F2E1TUkMDZ8P/dDPZX71/NG8xnQ==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmmirror.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/js-calendar": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/js-calendar/-/js-calendar-1.2.3.tgz", + "integrity": "sha512-dAA1/Zbp4+c5E+ARCVTIuKepXsNLzSYfzvOimiYD4S5eeP9QuplSHLcdhfqFSwyM1o1u6ku6RRRCyaZ0YAjiBw==", + "license": "ISC", + "peer": true + }, + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/less": { + "version": "4.4.2", + "resolved": "https://registry.npmmirror.com/less/-/less-4.4.2.tgz", + "integrity": "sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "7.3.0", + "resolved": "https://registry.npmmirror.com/less-loader/-/less-loader-7.3.0.tgz", + "integrity": "sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/less-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "license": "MIT", + "peer": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.23", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmmirror.com/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "license": "MIT", + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmmirror.com/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shvl": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/shvl/-/shvl-2.0.3.tgz", + "integrity": "sha512-V7C6S9Hlol6SzOJPnQ7qzOVEWUQImt3BNmmzh40wObhla3XOYMe4gGiYzLrJd5TFa+cI2f9LKIRJTTKZSTbWgw==", + "deprecated": "older versions vulnerable to prototype pollution", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/style-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT", + "peer": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/undici-types": { + "version": "7.14.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/v-click-outside-x": { + "version": "3.7.1", + "resolved": "https://registry.npmmirror.com/v-click-outside-x/-/v-click-outside-x-3.7.1.tgz", + "integrity": "sha512-WmUgmcIXr9clVpm1AYS/FgHtcDicfnfoxgQCNg4O6vfk9GVnxA0vSqO321ogUo0b7czYTidj7fQENvWFMWOkUg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.11.4", + "npm": "6.4.1" + } + }, + "node_modules/view-design": { + "version": "4.7.0", + "resolved": "https://registry.npmmirror.com/view-design/-/view-design-4.7.0.tgz", + "integrity": "sha512-WRvVRfsZciN0aJYlz+6b1zxs5G8tLFb4OUKOu+PiN0QyIGmdgWVziEyEmioYtJahQpueWiQpRYGzyxrpz3UkWQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "async-validator": "^3.3.0", + "deepmerge": "^2.2.1", + "element-resize-detector": "^1.2.0", + "js-calendar": "^1.2.3", + "lodash.throttle": "^4.1.1", + "popper.js": "^1.14.6", + "tinycolor2": "^1.4.1", + "v-click-outside-x": "^3.7.1" + }, + "engines": { + "node": ">=8.9.1", + "npm": ">=5.5.1", + "yarn": ">=1.3.2" + }, + "peerDependencies": { + "vue": "^2.6.10" + } + }, + "node_modules/vue": { + "version": "2.7.16", + "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.16.tgz", + "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", + "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-sfc": "2.7.16", + "csstype": "^3.1.0" + } + }, + "node_modules/vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmmirror.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-loader": { + "version": "15.11.1", + "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.11.1.tgz", + "integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "peerDependencies": { + "css-loader": "*", + "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "cache-loader": { + "optional": true + }, + "prettier": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/vue-loader/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/vue-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/vue-router": { + "version": "3.6.5", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-3.6.5.tgz", + "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==", + "license": "MIT", + "peer": true + }, + "node_modules/vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/vue-style-loader/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/vue-style-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.16", + "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue2-ace-editor": { + "version": "0.0.15", + "resolved": "https://registry.npmmirror.com/vue2-ace-editor/-/vue2-ace-editor-0.0.15.tgz", + "integrity": "sha512-e3TR9OGXc71cGpvYcW068lNpRcFt3+OONCC81oxHL/0vwl/V3OgqnNMw2/RRolgQkO/CA5AjqVHWmANWKOtNnQ==", + "license": "MIT", + "dependencies": { + "brace": "^0.11.0" + } + }, + "node_modules/vuex": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz", + "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "vue": "^2.0.0" + } + }, + "node_modules/vuex-persistedstate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/vuex-persistedstate/-/vuex-persistedstate-4.1.0.tgz", + "integrity": "sha512-3SkEj4NqwM69ikJdFVw6gObeB0NHyspRYMYkR/EbhR0hbvAKyR5gksVhtAfY1UYuWUOCCA0QNGwv9pOwdj+XUQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.2.2", + "shvl": "^2.0.3" + }, + "peerDependencies": { + "vuex": "^3.0 || ^4.0.0-rc" + } + }, + "node_modules/vuex-persistedstate/node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.102.0", + "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.102.0.tgz", + "integrity": "sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.2.3", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmmirror.com/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..dc0fad4 --- /dev/null +++ b/package.json @@ -0,0 +1,49 @@ +{ + "name": "admin-framework", + "version": "1.0.0", + "description": "通用后台管理系统框架 - 包含系统功能、登录、路由管理、布局等", + "main": "dist/admin-framework.js", + "scripts": { + "build": "webpack --mode production", + "dev": "webpack --mode development --watch" + }, + "keywords": [ + "admin", + "framework", + "vue", + "management-system" + ], + "author": "", + "license": "MIT", + "peerDependencies": { + "axios": "^0.21.0", + "view-design": "^4.0.0", + "vue": "^2.6.0", + "vue-router": "^3.0.0", + "vuex": "^3.0.0" + }, + "dependencies": { + "@vue/babel-preset-jsx": "^1.4.0", + "brace": "^0.11.1", + "dayjs": "^1.10.0", + "js-cookie": "^2.2.1", + "vue2-ace-editor": "^0.0.15", + "vuex-persistedstate": "^4.0.0" + }, + "devDependencies": { + "@babel/core": "^7.12.0", + "@babel/preset-env": "^7.12.0", + "babel-loader": "^8.2.0", + "css-loader": "^5.0.0", + "file-loader": "^6.2.0", + "less": "^4.0.0", + "less-loader": "^7.0.0", + "style-loader": "^2.0.0", + "url-loader": "^4.1.0", + "vue-loader": "^15.9.0", + "vue-style-loader": "^4.1.0", + "vue-template-compiler": "^2.6.0", + "webpack": "^5.0.0", + "webpack-cli": "^4.0.0" + } +} diff --git a/src/api/system/fileServe.js b/src/api/system/fileServe.js new file mode 100644 index 0000000..bac6313 --- /dev/null +++ b/src/api/system/fileServe.js @@ -0,0 +1,15 @@ +import http from "@/utils/http"; +class FileServe { + async upload_oos_img(row) { + let res = await http.postFormData("/sys_file/upload_oos_img", row); + return res; + } + + async upload_Img(row) { + let res = await http.postFormData("/file/upload_Img", row); + return res; + } +} + +const fileServe = new FileServe(); +export default fileServe; diff --git a/src/api/system/hot_city_qr_config_server.js b/src/api/system/hot_city_qr_config_server.js new file mode 100644 index 0000000..8f56de9 --- /dev/null +++ b/src/api/system/hot_city_qr_config_server.js @@ -0,0 +1,51 @@ +import http from '@/utils/http'; + +/** + * 热门城市二维码配置相关API + */ + +// 获取配置列表 +const getHotCityQrConfigList = (params) => { + return http.get('/wch_hot_city_qr_config/list', { params }); +}; + +// 获取所有配置 +const getAllHotCityQrConfig = () => { + return http.get('/wch_hot_city_qr_config/all'); +}; + +// 获取配置详情 +const getHotCityQrConfigDetail = (id) => { + return http.get(`/wch_hot_city_qr_config/detail/${id}`); +}; + +// 创建配置 +const createHotCityQrConfig = (data) => { + return http.post('/wch_hot_city_qr_config/create', data); +}; + +// 更新配置 +const updateHotCityQrConfig = (id, data) => { + return http.post(`/wch_hot_city_qr_config/update/${id}`, data); +}; + +// 删除配置 +const deleteHotCityQrConfig = (id) => { + return http.post(`/wch_hot_city_qr_config/delete/${id}`); +}; + +// 批量删除配置 +const batchDeleteHotCityQrConfig = (ids) => { + return http.post('/wch_hot_city_qr_config/batch_delete', { ids }); +}; + +export default { + getHotCityQrConfigList, + getAllHotCityQrConfig, + getHotCityQrConfigDetail, + createHotCityQrConfig, + updateHotCityQrConfig, + deleteHotCityQrConfig, + batchDeleteHotCityQrConfig +}; + diff --git a/src/api/system/index.js b/src/api/system/index.js new file mode 100644 index 0000000..df0d200 --- /dev/null +++ b/src/api/system/index.js @@ -0,0 +1,17 @@ +// 系统 API 统一导出 + +export { default as fileServe } from './fileServe' +export { default as hotCityQrConfigServer } from './hot_city_qr_config_server' +export { default as plaAccountServer } from './pla_account_server' +export { default as rolePermissionServer } from './rolePermissionServer' +export { default as roleServer } from './roleServer' +export { default as shpProfitServer } from './shpProfitServer' +export { default as specificationServer } from './specificationServer' +export { default as sysAddressServer } from './sysAddressServer' +export { default as sysModuleServer } from './sysModuleServer' +export { default as sysLogServe } from './sys_log_serve' +export { default as systemTypeServer } from './systemType_server' +export { default as tableServer } from './tableServer' +export { default as userServer } from './userServer' +export { default as wchProfessionsServer } from './wch_professions_server' + diff --git a/src/api/system/pla_account_server.js b/src/api/system/pla_account_server.js new file mode 100644 index 0000000..228c9df --- /dev/null +++ b/src/api/system/pla_account_server.js @@ -0,0 +1,38 @@ +import http from '@/utils/http' + +export default { + // 获取所有平台账户 + all(param) { + return http.get('/pla_account/all', param) + }, + + // 获取平台账户详情 + detail(param) { + return http.get('/pla_account/detail', param) + }, + + // 分页查询平台账户 + page(param) { + return http.post('/pla_account/page', param) + }, + + // 新增平台账户 + add(param) { + return http.post('/pla_account/add', param) + }, + + // 编辑平台账户 + edit(param) { + return http.post('/pla_account/edit', param) + }, + + // 删除平台账户 + del(param) { + return http.post('/pla_account/del', param) + }, + + // 导出平台账户数据 + exportCsv(param) { + return http.post('/pla_account/export', param) + } +} \ No newline at end of file diff --git a/src/api/system/rolePermissionServer.js b/src/api/system/rolePermissionServer.js new file mode 100644 index 0000000..7911b0c --- /dev/null +++ b/src/api/system/rolePermissionServer.js @@ -0,0 +1,30 @@ +import http from '@/utils/http' +class RolePermissionServer { + async getRoles(callback) { + let res = await http.get('/SysRolePermission/Query', {}) + return res + } + + async getRole(row) { + let res = await http.get('/SysRolePermission/QueryByRoleId', row) + return res + } + + async add(row) { + let res = await http.post('/SysRolePermission/add', row) + return res + } + + async edit(row) { + let res = await http.post('/SysRolePermission/edit', row) + return res + } + + async del(row) { + let res = await http.post('/SysRolePermission/del', row) + return res + } +} + +const rolePermissionServer = new RolePermissionServer() +export default rolePermissionServer diff --git a/src/api/system/roleServer.js b/src/api/system/roleServer.js new file mode 100644 index 0000000..896fe1a --- /dev/null +++ b/src/api/system/roleServer.js @@ -0,0 +1,26 @@ +import http from "@/utils/http"; +class RoleServer { + async list() { + let res = await http.get("/sys_role/index", {}); + return res; + } + + async add(row) { + let res = await http.post("/sys_role/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_role/edit", row); + + return res; + } + + async del(row) { + let res = await http.post("/sys_role/del", row); + return res; + } +} + +const roleServer = new RoleServer(); +export default roleServer; \ No newline at end of file diff --git a/src/api/system/shpProfitServer.js b/src/api/system/shpProfitServer.js new file mode 100644 index 0000000..42e7511 --- /dev/null +++ b/src/api/system/shpProfitServer.js @@ -0,0 +1,15 @@ +import http from '@/utils/http' +class ShpProfitServer { + async report(param) { + let res = await http.post('/shpProfit/report', param) + return res + } + + async list(param) { + let res = await http.post('/shpProfit/list', param) + return res + } +} + +const shpProfitServer = new ShpProfitServer() +export default shpProfitServer diff --git a/src/api/system/specificationServer.js b/src/api/system/specificationServer.js new file mode 100644 index 0000000..df329f3 --- /dev/null +++ b/src/api/system/specificationServer.js @@ -0,0 +1,25 @@ +import http from '@/utils/http' +class SpecificationServer { + async list() { + let res = await http.post('/specification/list', {}) + return res + } + + async add(row) { + let res = await http.post('/specification/add', row) + return res + } + + async edit(row) { + let res = await http.post('/specification/edit', row) + return res + } + + async del(row) { + let res = await http.post('/specification/del', row) + return res + } +} + +const specificationServer = new SpecificationServer() +export default specificationServer diff --git a/src/api/system/sysAddressServer.js b/src/api/system/sysAddressServer.js new file mode 100644 index 0000000..5902b29 --- /dev/null +++ b/src/api/system/sysAddressServer.js @@ -0,0 +1,10 @@ +import http from "@/utils/http"; +class SysAddress { + async index(param) { + let res = await http.get("/sys_address/index", param); + return res; + } +} + +const sysAddress = new SysAddress(); +export default sysAddress; diff --git a/src/api/system/sysModuleServer.js b/src/api/system/sysModuleServer.js new file mode 100644 index 0000000..7ce1b07 --- /dev/null +++ b/src/api/system/sysModuleServer.js @@ -0,0 +1,30 @@ +import http from "@/utils/http"; +class SysModuleServer { + async all() { + let res = await http.get("/sys_menu/all", {}); + return res; + } + + async list(row) { + let res = await http.get("/sys_menu/all", row); + return res; + } + + async add(row) { + let res = await http.post("/sys_menu/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_menu/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_menu/del", row); + return res; + } +} + +const sysModuleServer = new SysModuleServer(); +export default sysModuleServer; \ No newline at end of file diff --git a/src/api/system/sys_log_serve.js b/src/api/system/sys_log_serve.js new file mode 100644 index 0000000..9121304 --- /dev/null +++ b/src/api/system/sys_log_serve.js @@ -0,0 +1,30 @@ +import http from "@/utils/http"; +class SysLogServe { + async all(param) { + let res = await http.get("/sys_log/all", param); + return res; + } + + async detail(param) { + let res = await http.get("/sys_log/detail", param); + return res; + } + + async delete(param) { + let res = await http.get("/sys_log/delete", param); + return res; + } + + async delete_all(param) { + let res = await http.get("/sys_log/delete_all", param); + return res; + } + + async operates(param) { + let res = await http.get("/sys_log/operates", param); + return res; + } +} + +const sys_log_serve = new SysLogServe(); +export default sys_log_serve; diff --git a/src/api/system/systemType_server.js b/src/api/system/systemType_server.js new file mode 100644 index 0000000..46f4d74 --- /dev/null +++ b/src/api/system/systemType_server.js @@ -0,0 +1,38 @@ +import http from '@/utils/http'; +class systemTypeClServer { + async all(param) { + let res= await http.get('/sys_project_type/all', param); + return res; + } + + + async page(row) { + let res= await http.post('/sys_project_type/page', row); + return res; + } + + + async exportCsv(row) { + let res = http.fileExport("/sys_project_type/export", row); + return res; + } + + async add(row) { + let res= await http.post('/sys_project_type/add', row); + return res; + } + + async edit(row) { + let res= await http.post('/sys_project_type/edit', row); + return res; + } + + async del(row) { + let res= await http.post('/sys_project_type/del', row); + return res; + } +} + +const systemTypeServer = new systemTypeClServer(); +export default systemTypeServer; + \ No newline at end of file diff --git a/src/api/system/tableServer.js b/src/api/system/tableServer.js new file mode 100644 index 0000000..2650df6 --- /dev/null +++ b/src/api/system/tableServer.js @@ -0,0 +1,31 @@ +import http from '@/utils/http' +class TableServer { + async getAll(callback) { + return await http.get('/table/index', {}) + } + + async add(row, callback) { + return await http.post('/table/add', row) + } + + async edit(row, callback) { + return await http.post('/table/edit', row, function(res) { + callback && callback(res) + }) + } + + async del(row, callback) { + return await http.post('/table/del', row) + } + + async autoApi(id) { + return await http.get('/template/api', { id: id }) + } + + async autoDb(id) { + return await http.get('/template/autoDb', { id: id }) + } +} + +const tableServer = new TableServer() +export default tableServer diff --git a/src/api/system/userServer.js b/src/api/system/userServer.js new file mode 100644 index 0000000..23529ce --- /dev/null +++ b/src/api/system/userServer.js @@ -0,0 +1,40 @@ +import http from "@/utils/http"; +class UserServer { + async login(row) { + let res = await http.post("/sys_user/login", row); + return res; + } + + async all() { + let res = await http.get("/sys_user/index", {}); + return res; + } + + async exportCsv(row) { + let res = http.fileExport("/sys_user/export", row); + return res; + } + + async authorityMenus() { + let res = await http.post("/sys_user/authorityMenus", {}); + return res; + } + + async add(row) { + let res = await http.post("/sys_user/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_user/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_user/del", row); + return res; + } +} + +const userServer = new UserServer(); +export default userServer; diff --git a/src/api/system/wch_professions_server.js b/src/api/system/wch_professions_server.js new file mode 100644 index 0000000..fb939fa --- /dev/null +++ b/src/api/system/wch_professions_server.js @@ -0,0 +1,33 @@ +import http from '@/utils/http' + +export default { + // 获取职业列表 + page: (params) => { + return http.post('/wch_professions/page', params) + }, + + // 获取所有职业 + all: (params) => { + return http.post('/wch_professions/all', params) + }, + + // 新增职业 + add: (params) => { + return http.post('/wch_professions/add', params) + }, + + // 更新职业 + edit: (params) => { + return http.post('/wch_professions/edit', params) + }, + + // 删除职业 + del: (params) => { + return http.post('/wch_professions/del', params) + }, + + // 导出职业数据 + exportCsv: (params) => { + return http.post('/wch_professions/exportCsv', params) + } +} \ No newline at end of file diff --git a/src/api/system_high/formFieldServer.js b/src/api/system_high/formFieldServer.js new file mode 100644 index 0000000..1e843ea --- /dev/null +++ b/src/api/system_high/formFieldServer.js @@ -0,0 +1,30 @@ +import http from "@/utils/http"; +class FormFieldServer { + async all(param) { + let res = await http.get("/sys_form_field/all", param); + return res; + } + + async page(row) { + let res = await http.post("/sys_form_field/page", row); + return res; + } + + async add(row) { + let res = await http.post("/sys_form_field/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_form_field/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_form_field/del", row); + return res; + } +} + +const formFieldServer = new FormFieldServer(); +export default formFieldServer; diff --git a/src/api/system_high/formServer.js b/src/api/system_high/formServer.js new file mode 100644 index 0000000..e47ba25 --- /dev/null +++ b/src/api/system_high/formServer.js @@ -0,0 +1,35 @@ +import http from "@/utils/http"; +class FormServer { + async all(param) { + let res = await http.get("/sys_form/all", param); + return res; + } + + async page(row) { + let res = await http.post("/sys_form/page", row); + return res; + } + + async generate(row) { + let res = await http.post("/sys_form/generate", row); + return res; + } + + async add(row) { + let res = await http.post("/sys_form/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_form/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_form/del", row); + return res; + } +} + +const formServer = new FormServer(); +export default formServer; diff --git a/src/api/system_high/index.js b/src/api/system_high/index.js new file mode 100644 index 0000000..dee6035 --- /dev/null +++ b/src/api/system_high/index.js @@ -0,0 +1,10 @@ +// 高级系统 API 统一导出 + +export { default as formFieldServer } from './formFieldServer' +export { default as formServer } from './formServer' +export { default as menuServer } from './menuServer' +export { default as modelFieldServer } from './modelFieldServer' +export { default as modelServer } from './modelServer' +export { default as paramSetupServer } from './paramSetupServer' +export { default as sysControlTypeServer } from './sysControlTypeServer' + diff --git a/src/api/system_high/menuServer.js b/src/api/system_high/menuServer.js new file mode 100644 index 0000000..e36be2e --- /dev/null +++ b/src/api/system_high/menuServer.js @@ -0,0 +1,49 @@ +import http from "@/utils/http"; + +class MenuServer { + async list(row) { + let res = await http.get("/sys_menu/index", row); + return res; + } + + async generate(row) { + let res = await http.post("/sys_menu/generate", row); + return res; + } + + async add(row) { + let res = await http.post("/sys_menu/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_menu/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_menu/del", row); + return res; + } + + async generate(row) { + let res = await http.post("/form/generate", row); + return res; + } + async generateModel(row) { + let res = await http.post("/model/generate", row); + return res; + } + + + async modelAll(row) { + let res = await http.post("/model/all", row); + return res; + } + async modelInterface(row) { + let res = await http.post("/model/interface", row); + return res; + } +} +const menuServer = new MenuServer(); +export default menuServer; diff --git a/src/api/system_high/modelFieldServer.js b/src/api/system_high/modelFieldServer.js new file mode 100644 index 0000000..6929014 --- /dev/null +++ b/src/api/system_high/modelFieldServer.js @@ -0,0 +1,32 @@ +import http from "@/utils/http"; +class ModelFieldServer { + async all(row) { + let res = await http.get("/sys_model_field/all", row); + return res; + } + + async allByKey(row) { + let res = await http.get("/sys_model_field/allByKey", row, { + hideLoad: true + }); + return res; + } + + async add(row) { + let res = await http.post("/sys_model_field/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_model_field/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_model_field/del", row); + return res; + } +} + +const modelFieldServer = new ModelFieldServer(); +export default modelFieldServer; \ No newline at end of file diff --git a/src/api/system_high/modelServer.js b/src/api/system_high/modelServer.js new file mode 100644 index 0000000..5b20d87 --- /dev/null +++ b/src/api/system_high/modelServer.js @@ -0,0 +1,40 @@ +import http from "@/utils/http"; +class ModelServer { + async interface(row) { + let res = await http.post("/sys_model/interface", row); + return res; + } + + async all() { + let res = await http.get("/sys_model/all", {}); + return res; + } + + async detail(row) { + let res = await http.get("/sys_model/detail", row); + return res; + } + + async regenerate(row) { + let res = await http.post("/sys_model/regenerate", row); + return res; + } + + async add(row) { + let res = await http.post("/sys_model/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_model/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_model/del", row); + return res; + } +} + +const modelServer = new ModelServer(); +export default modelServer; diff --git a/src/api/system_high/paramSetupServer.js b/src/api/system_high/paramSetupServer.js new file mode 100644 index 0000000..590dadf --- /dev/null +++ b/src/api/system_high/paramSetupServer.js @@ -0,0 +1,29 @@ +import http from "@/utils/http"; +class ParamSetupServer { + async getAll() { + return await http.get("/sys_parameter/index", {}); + } + + async getOne(key) { + return await http.get("/sys_parameter/key", { key }); + } + + async add(row) { + return await http.post("/sys_parameter/add", row); + } + + async edit(row) { + return await http.post("/sys_parameter/edit", row); + } + + async setSysConfig(row) { + return await http.post("/sys_parameter/setSysConfig", row); + } + + async del(row) { + return await http.post("/sys_parameter/del", row); + } +} + +const paramSetupServer = new ParamSetupServer(); +export default paramSetupServer; diff --git a/src/api/system_high/sysControlTypeServer.js b/src/api/system_high/sysControlTypeServer.js new file mode 100644 index 0000000..e2c831f --- /dev/null +++ b/src/api/system_high/sysControlTypeServer.js @@ -0,0 +1,29 @@ +import http from "@/utils/http"; +class SysControlTypeServer { + async all(param) { + let res = await http.get("/sys_control_type/all", param); + return res; + } + + async page(row) { + let res = await http.post("/sys_control_type/page", row); + return res; + } + + async add(param) { + let res = await http.post("/sys_control_type/add", param); + return res; + } + + async edit(param) { + let res = await http.post("/sys_control_type/edit", param); + return res; + } + async del(param) { + let res = await http.post("/sys_control_type/del", param); + return res; + } +} + +const sysControlTypeServer = new SysControlTypeServer(); +export default sysControlTypeServer; diff --git a/src/assets/css/animate.css b/src/assets/css/animate.css new file mode 100644 index 0000000..f47d78b --- /dev/null +++ b/src/assets/css/animate.css @@ -0,0 +1,3688 @@ +@charset "UTF-8"; +/*! + * animate.css -http://daneden.me/animate + * Version - 3.7.0 + * Licensed under the MIT license - http://opensource.org/licenses/MIT + * + * Copyright (c) 2018 Daniel Eden + */ + +@-webkit-keyframes bounce { + + from, + 20%, + 53%, + 80%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 40%, + 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -4px, 0); + transform: translate3d(0, -4px, 0); + } +} + +@keyframes bounce { + + from, + 20%, + 53%, + 80%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 40%, + 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -4px, 0); + transform: translate3d(0, -4px, 0); + } +} + +.bounce { + -webkit-animation-name: bounce; + animation-name: bounce; + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} + +@-webkit-keyframes flash { + + from, + 50%, + to { + opacity: 1; + } + + 25%, + 75% { + opacity: 0; + } +} + +@keyframes flash { + + from, + 50%, + to { + opacity: 1; + } + + 25%, + 75% { + opacity: 0; + } +} + +.flash { + -webkit-animation-name: flash; + animation-name: flash; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.pulse { + -webkit-animation-name: pulse; + animation-name: pulse; +} + +@-webkit-keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(0.95, 1.05, 1); + transform: scale3d(0.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, 0.95, 1); + transform: scale3d(1.05, 0.95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(0.95, 1.05, 1); + transform: scale3d(0.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, 0.95, 1); + transform: scale3d(1.05, 0.95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.rubberBand { + -webkit-animation-name: rubberBand; + animation-name: rubberBand; +} + +@-webkit-keyframes shake { + + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } +} + +@keyframes shake { + + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } +} + +.shake { + -webkit-animation-name: shake; + animation-name: shake; +} + +@-webkit-keyframes headShake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 6.5% { + -webkit-transform: translateX(-6px) rotateY(-9deg); + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + -webkit-transform: translateX(5px) rotateY(7deg); + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + -webkit-transform: translateX(-3px) rotateY(-5deg); + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + -webkit-transform: translateX(2px) rotateY(3deg); + transform: translateX(2px) rotateY(3deg); + } + + 50% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes headShake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 6.5% { + -webkit-transform: translateX(-6px) rotateY(-9deg); + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + -webkit-transform: translateX(5px) rotateY(7deg); + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + -webkit-transform: translateX(-3px) rotateY(-5deg); + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + -webkit-transform: translateX(2px) rotateY(3deg); + transform: translateX(2px) rotateY(3deg); + } + + 50% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +.headShake { + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + -webkit-animation-name: headShake; + animation-name: headShake; +} + +@-webkit-keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +@keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +.swing { + -webkit-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing; +} + +@-webkit-keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + } + + 30%, + 50%, + 70%, + 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, + 60%, + 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + } + + 30%, + 50%, + 70%, + 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, + 60%, + 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.tada { + -webkit-animation-name: tada; + animation-name: tada; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes wobble { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.wobble { + -webkit-animation-name: wobble; + animation-name: wobble; +} + +@-webkit-keyframes jello { + + from, + 11.1%, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +@keyframes jello { + + from, + 11.1%, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +.jello { + -webkit-animation-name: jello; + animation-name: jello; + -webkit-transform-origin: center; + transform-origin: center; +} + +@-webkit-keyframes heartBeat { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 14% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 28% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 42% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 70% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes heartBeat { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 14% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 28% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 42% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 70% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +.heartBeat { + -webkit-animation-name: heartBeat; + animation-name: heartBeat; + -webkit-animation-duration: 1.3s; + animation-duration: 1.3s; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; +} + +@-webkit-keyframes bounceIn { + + from, + 20%, + 40%, + 60%, + 80%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(0.97, 0.97, 0.97); + transform: scale3d(0.97, 0.97, 0.97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes bounceIn { + + from, + 20%, + 40%, + 60%, + 80%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(0.97, 0.97, 0.97); + transform: scale3d(0.97, 0.97, 0.97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.bounceIn { + -webkit-animation-duration: 0.75s; + animation-duration: 0.75s; + -webkit-animation-name: bounceIn; + animation-name: bounceIn; +} + +@-webkit-keyframes bounceInDown { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes bounceInDown { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.bounceInDown { + -webkit-animation-name: bounceInDown; + animation-name: bounceInDown; +} + +@-webkit-keyframes bounceInLeft { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes bounceInLeft { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} + +@-webkit-keyframes bounceInRight { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes bounceInRight { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.bounceInRight { + -webkit-animation-name: bounceInRight; + animation-name: bounceInRight; +} + +@-webkit-keyframes bounceInUp { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes bounceInUp { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.bounceInUp { + -webkit-animation-name: bounceInUp; + animation-name: bounceInUp; +} + +@-webkit-keyframes bounceOut { + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 50%, + 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } +} + +@keyframes bounceOut { + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 50%, + 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } +} + +.bounceOut { + -webkit-animation-duration: 0.75s; + animation-duration: 0.75s; + -webkit-animation-name: bounceOut; + animation-name: bounceOut; +} + +@-webkit-keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} + +@-webkit-keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} + +@-webkit-keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} + +@-webkit-keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} + +@-webkit-keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} + +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} + +@-webkit-keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} + +@-webkit-keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} + +@-webkit-keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} + +@-webkit-keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} + +@-webkit-keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} + +@-webkit-keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} + +@-webkit-keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} + +@-webkit-keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +@keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +@-webkit-keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} + +@-webkit-keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} + +@-webkit-keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} + +@-webkit-keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} + +@-webkit-keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} + +@-webkit-keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} + +@-webkit-keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} + +@-webkit-keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} + +@-webkit-keyframes flip { + from { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +@keyframes flip { + from { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible; + backface-visibility: visible; + -webkit-animation-name: flip; + animation-name: flip; +} + +@-webkit-keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInX; + animation-name: flipInX; +} + +@-webkit-keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInY; + animation-name: flipInY; +} + +@-webkit-keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +.flipOutX { + -webkit-animation-duration: 0.75s; + animation-duration: 0.75s; + -webkit-animation-name: flipOutX; + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; +} + +@-webkit-keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-animation-duration: 0.75s; + animation-duration: 0.75s; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + animation-name: flipOutY; +} + +@-webkit-keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} + +@-webkit-keyframes lightSpeedOut { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +@keyframes lightSpeedOut { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} + +@-webkit-keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +@keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +.rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn; +} + +@-webkit-keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} + +@-webkit-keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +@keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} + +@-webkit-keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} + +@-webkit-keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +@keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} + +@-webkit-keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +.rotateOut { + -webkit-animation-name: rotateOut; + animation-name: rotateOut; +} + +@-webkit-keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} + +@-webkit-keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} + +@-webkit-keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} + +@-webkit-keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} + +@-webkit-keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, + 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, + 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +@keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, + 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, + 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +.hinge { + -webkit-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-name: hinge; + animation-name: hinge; +} + +@-webkit-keyframes jackInTheBox { + from { + opacity: 0; + -webkit-transform: scale(0.1) rotate(30deg); + transform: scale(0.1) rotate(30deg); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + } + + 50% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg); + } + + 70% { + -webkit-transform: rotate(3deg); + transform: rotate(3deg); + } + + to { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes jackInTheBox { + from { + opacity: 0; + -webkit-transform: scale(0.1) rotate(30deg); + transform: scale(0.1) rotate(30deg); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + } + + 50% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg); + } + + 70% { + -webkit-transform: rotate(3deg); + transform: rotate(3deg); + } + + to { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} + +.jackInTheBox { + -webkit-animation-name: jackInTheBox; + animation-name: jackInTheBox; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.rollIn { + -webkit-animation-name: rollIn; + animation-name: rollIn; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +@keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +.rollOut { + -webkit-animation-name: rollOut; + animation-name: rollOut; +} + +@-webkit-keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 50% { + opacity: 1; + } +} + +@keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 50% { + opacity: 1; + } +} + +.zoomIn { + -webkit-animation-name: zoomIn; + animation-name: zoomIn; +} + +@-webkit-keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +@keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +.zoomInDown { + -webkit-animation-name: zoomInDown; + animation-name: zoomInDown; +} + +@-webkit-keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +@keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +.zoomInLeft { + -webkit-animation-name: zoomInLeft; + animation-name: zoomInLeft; +} + +@-webkit-keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +@keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +.zoomInRight { + -webkit-animation-name: zoomInRight; + animation-name: zoomInRight; +} + +@-webkit-keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +@keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +.zoomInUp { + -webkit-animation-name: zoomInUp; + animation-name: zoomInUp; +} + +@-webkit-keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + to { + opacity: 0; + } +} + +@keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + to { + opacity: 0; + } +} + +.zoomOut { + -webkit-animation-name: zoomOut; + animation-name: zoomOut; +} + +@-webkit-keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +@keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +.zoomOutDown { + -webkit-animation-name: zoomOutDown; + animation-name: zoomOutDown; +} + +@-webkit-keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); + transform: scale(0.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +@keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); + transform: scale(0.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +.zoomOutLeft { + -webkit-animation-name: zoomOutLeft; + animation-name: zoomOutLeft; +} + +@-webkit-keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); + transform: scale(0.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +@keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); + transform: scale(0.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +.zoomOutRight { + -webkit-animation-name: zoomOutRight; + animation-name: zoomOutRight; +} + +@-webkit-keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +@keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +.zoomOutUp { + -webkit-animation-name: zoomOutUp; + animation-name: zoomOutUp; +} + +@-webkit-keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInDown { + -webkit-animation-name: slideInDown; + animation-name: slideInDown; +} + +@-webkit-keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInLeft { + -webkit-animation-name: slideInLeft; + animation-name: slideInLeft; +} + +@-webkit-keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInRight { + -webkit-animation-name: slideInRight; + animation-name: slideInRight; +} + +@-webkit-keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInUp { + -webkit-animation-name: slideInUp; + animation-name: slideInUp; +} + +@-webkit-keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.slideOutDown { + -webkit-animation-name: slideOutDown; + animation-name: slideOutDown; +} + +@-webkit-keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} + +@-webkit-keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.slideOutRight { + -webkit-animation-name: slideOutRight; + animation-name: slideOutRight; +} + +@-webkit-keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.slideOutUp { + -webkit-animation-name: slideOutUp; + animation-name: slideOutUp; +} + +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} + +.animated.delay-1s { + -webkit-animation-delay: 1s; + animation-delay: 1s; +} + +.animated.delay-2s { + -webkit-animation-delay: 2s; + animation-delay: 2s; +} + +.animated.delay-3s { + -webkit-animation-delay: 3s; + animation-delay: 3s; +} + +.animated.delay-4s { + -webkit-animation-delay: 4s; + animation-delay: 4s; +} + +.animated.delay-5s { + -webkit-animation-delay: 5s; + animation-delay: 5s; +} + +.animated.fast { + -webkit-animation-duration: 800ms; + animation-duration: 800ms; +} + +.animated.faster { + -webkit-animation-duration: 500ms; + animation-duration: 500ms; +} + +.animated.slow { + -webkit-animation-duration: 2s; + animation-duration: 2s; +} + +.animated.slower { + -webkit-animation-duration: 3s; + animation-duration: 3s; +} + +@media (prefers-reduced-motion) { + .animated { + -webkit-animation: unset !important; + animation: unset !important; + -webkit-transition: none !important; + transition: none !important; + } +} + +.loopJump { + animation: shake 2s infinite; + -webkit-animation: shake 2s infinite; + color: red; + +} + + +@keyframes ani-demo-spin { + from { + transform: rotate(0deg); + } + + 50% { + transform: rotate(180deg); + } + + to { + transform: rotate(360deg); + } +} + +.spin-icon-load { + + animation: ani-demo-spin 1s linear infinite; +} + +@keyframes loopload { + from { + width: 0px; + } + + 50% { + width: 7px; + } + + to { + width: 15px; + } +} + + +.spin-loopload { + overflow: hidden; + animation: loopload 1s linear infinite; +} + + + +@keyframes call-police { + + from { + color: #495060; + } + + to { + color: red; + } +} + +.call-police-icon { + animation: call-police 0.5s linear infinite; +} diff --git a/src/assets/css/base.less b/src/assets/css/base.less new file mode 100644 index 0000000..764f73a --- /dev/null +++ b/src/assets/css/base.less @@ -0,0 +1,149 @@ +body, +div, +dl, +dt, +dd, +ul, +ol, +li, +h1, +h2, +h3, +h4, +h5, +h6, +pre, +code, +form, +fieldset, +legend, +input, +button, +textarea, +p, +blockquote, +th, +td { + margin: 0; + padding: 0; +} + +body { + background: #fff; + color: #495060; + font-size: 14px; + font-family: Verdana, Arial, Helvetica, sans-serif; +} + +td, +th, +caption { + font-size: 14px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: normal; + font-size: 100%; +} + +a { + color: #495060; + text-decoration: none; + font-weight: bold; +} + +a:hover { + text-decoration: underline; +} + +img { + border: none; +} + +ol, +ul, +li { + list-style: none; +} + +input, +textarea, +select, +button { + font: 14px Verdana, Helvetica, Arial, sans-serif; +} + +html { + overflow-y: auto; +} + +/*滚动条整体样式*/ +*::-webkit-scrollbar { + width: 10px; + /*高宽分别对应横竖滚动条的尺寸*/ + height: 10px; +} + +*::-webkit-scrollbar-thumb { + /*滚动条里面小方块*/ + border-radius: 5px; + -webkit-box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.1); + background: #9ca6bb; +} + +*::-webkit-scrollbar-track { + /*滚动条里面轨道*/ + -webkit-box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.1); + border-radius: 5px; + background: #dcdee2; +} + +.ml(@i) when(@i <= 300) { + .ml@{i} { + margin-left: @i + 0px; + } + .ml((@i + 5)); +} + +.ml(5); + +.mt(@i) when(@i <= 100) { + .mt@{i} { + margin-top: @i + 0px; + } + .mt((@i + 5)); +} + +.mt(5); + +.pa(@i) when(@i <= 100) { + .pa@{i} { + padding: @i + 0px; + } + .pa((@i + 5)); +} + +.pa(5); + +.w(@i) when(@i <= 100) { + .w@{i} { + width: @i + 0%; + } + .w((@i + 5)); +} + +.w(5); + +.h(@i) when(@i <= 100) { + .h@{i} { + height: @i + 0%; + } + .h((@i + 5)); +} + +.h(5); diff --git a/src/assets/css/ivewExpand.less b/src/assets/css/ivewExpand.less new file mode 100644 index 0000000..a91adba --- /dev/null +++ b/src/assets/css/ivewExpand.less @@ -0,0 +1,322 @@ +.ace_print-margin-layer { + display: none; +} + +.ivu-select-dropdown { + z-index: 999999; +} + +.ivu-select-dropdown-list { + height: 200px !important; + overflow: auto; +} + +.float-right { + float: right; + margin-right: 10px; +} +.ivu-tooltip-inner { + background: #fff; + color: #495060; +} + +.flex { + display: flex; + flex: 1; + align-items: center; +} + +.flex-left { + justify-content: flex-start; + flex-direction: row; +} + +.flex-right { + justify-content: flex-end; + margin-right: 10px; +} + +.ivu-layout-header { + background-color: #f5f7f9; + + padding: 0px 0.05rem; +} + +.mt10 { + margin-top: 10px; +} + +.mt20 { + margin-top: 20px; +} + +.mt30 { + margin-top: 30px; +} + +.ml5 { + margin-left: 5px; +} + +.ml10 { + margin-left: 10px; +} + +.ml20 { + margin-left: 20px; +} + +.ml30 { + margin-left: 30px; +} + +.ml100 { + margin-left: 100px; +} + +.pa-5 { + padding: 0.05rem; +} + +.pa-10 { + padding: 0.1rem; +} + +.pa-20 { + padding: 0.2rem; +} + +.pa-30 { + padding: 0.3rem; +} + +.red { + color: red; +} + +.buld { + color: green; +} + +.bold { + font-weight: bold; +} + +.float-right { + float: right; +} + +.chart-element { + width: 100%; + height: 100%; + flex: 1; + flex-direction: column; +} + +.table-warp { + .ivu-card-body { + height: 100%; + display: flex; + flex-direction: column; + } +} + +.w-e-text-container { + min-height: 800px !important; +} + +.ivu-card-body { + padding: 5px; +} + +.ivu-btn { + margin: 0px 5px; +} + +.head-tool-box { + padding: 5px; + background-color: #dcdee2; + width: 100%; +} + +.h50 { + height: 0.5rem; + line-height: 0.5rem; +} + +.mr10 { + margin-right: 10px; +} + +.content-view { + flex: 1; + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + background-color: #fff; + padding: 5px; + height: 100%; + overflow: hidden; + + .table-head-tool { + width: 100%; + padding: 10px; + line-height: 35px; + display: flex; + justify-content: space-between; + flex-shrink: 0; + + .ivu-form-item { + margin-bottom: 5px; + } + } + + .table-body { + display: flex; + flex-direction: column; + width: 100%; + flex: 1; + overflow: hidden; + min-height: 0; + } +} + +.ivu-table-cell { + padding-left: 5px; + padding-right: 5px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* 自适应表格宽度 */ +.ivu-table-wrapper { + width: 100%; + height: 100%; + overflow-x: auto; + overflow-y: auto; + flex: 1; + display: flex; + flex-direction: column; +} + +.ivu-table { + width: 100% !important; + flex: 1; +} + +/* 移除 table-layout: auto,使用 iView 默认的 fixed 布局以确保列对齐 */ +/* .ivu-table table { + table-layout: auto; +} */ + +.ivu-table-body { + overflow-y: auto; + flex: 1; +} + +/* 按钮风格一致 */ +.ivu-btn { + border-radius: 4px; +} + +.ivu-btn + .ivu-btn { + margin-left: 8px; +} + +/* 常用按钮容器(可选) */ +.btn-group { + display: flex; + gap: 8px; + flex-wrap: wrap; +} + +.arrowBox { + cursor: pointer; + position: absolute; + width: 13px; + height: 50px; + margin-top: -25px; + top: 49%; + right: 1px; + background-color: #043250; + border-radius: 4px 0 0 4px; + overflow: hidden; + + .ivu-icon { + position: relative; + font-size: 36px; + color: #515a6e; + top: 8px; + left: -12px; + } +} + +.ivu-badge-count { + top: 3px; +} + +.datetime-box { + .ivu-date-picker-cells-cell:not(.ivu-date-picker-cells-cell-disabled) { + background-color: rgba(10, 255, 0, 0.3); + color: #000000; + } +} + +.sub-title { + font-size: 20px; + font-weight: bold; +} + +.tip-info { + color: #ff9900; + font-size: 12px; +} + +.tc { + text-align: center; +} + +.seach-input { + width: 300px; + float: right; + margin: 10px; +} + +.item-right { + position: absolute; + right: 10px; +} + +.sort-num { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + i { + margin: 5px; + font-size: 20px; + cursor: pointer; + &.ivu-icon-md-arrow-up { + color: green; + } + + &.ivu-icon-md-arrow-down { + color: indianred; + } + } +} + + +.view-log-info +{ + + background-color: #292A2A; + color: #fff; + line-height: 30px; + padding: 5px; + white-space: pre-wrap; + overflow:auto; +} \ No newline at end of file diff --git a/src/assets/icons/iconfont.css b/src/assets/icons/iconfont.css new file mode 100644 index 0000000..80a476c --- /dev/null +++ b/src/assets/icons/iconfont.css @@ -0,0 +1,37 @@ + +@font-face {font-family: "iconfont"; + src: url('iconfont.eot?t=1541579316141'); /* IE9*/ + src: url('iconfont.eot?t=1541579316141#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), + url('iconfont.ttf?t=1541579316141') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('iconfont.svg?t=1541579316141#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family:"iconfont" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-bear:before { content: "\e600"; } + +.icon-resize-vertical:before { content: "\e7c3"; } + +.icon-chuizhifanzhuan:before { content: "\e661"; } + +.icon-shuipingfanzhuan:before { content: "\e662"; } + +.icon-qq:before { content: "\e609"; } + +.icon-frown:before { content: "\e77e"; } + +.icon-meh:before { content: "\e780"; } + +.icon-smile:before { content: "\e783"; } + +.icon-man:before { content: "\e7e2"; } + +.icon-woman:before { content: "\e7e5"; } + diff --git a/src/assets/icons/iconfont.eot b/src/assets/icons/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..045499d521c94452caa6750aebf899c25a2aebd6 GIT binary patch literal 3856 zcmd^CZETxY6+Y+vbnL{57OxaPzi}2Lt2sG7eniyLXi+d{ZVOEVQdUFMr@P#gWyMFbME`Trg7Tw zqljNz``r87bI(2Z+phF8}G)LI;2_4Iq0` zO5&t-@Ha~|NHP#j5kvlfzfAZSL_Mi&abp0gRnm8h`U9DKGGTb#I7#!Ff%~$Fja6(X zqXG9(-;+yZmC?D%1u`&2>t$E-YsHPXE?)&`x=rIRGu!!6wFJinRjWV~iNCv;R1R@x zK3$spTJy-?!9-G2ZX0fdYi+e!y&#Y#>Kk--X_`#11TvFSxkfM&BJ0({Rx&~d3;;ec z`P3ZE)D&woF_T_N5Kr&X7#l_6AV@lw`U2pqAcBGWHuqcNzM{4G2?UYm-j5j?t1C0h z6DMJ88_IXJ{gds_lYqW^wiG)Nt!4Q0iH1ZX7MlZ_82(7tbCtME;{dg^bK(oYg3d;v z#DlO6+YQ@G<%{J~`T6pV^2g=7%(E&tv6oA;>I;$<_H*p|G5bZPnNCPnJ<*`9%g*cn zy)>!^a7jM~^2RnnM$ALo4H_{|ZYMONbA)Yr5*e`oC|}fwMPIq35sU3I#SJ4CtK}OS zv1l)UtPzmz@?DM8_$N`g3_pjzpbbk{;d0zx`8ZEeOi$7G=_yJ=FGOJqzDx-T&?YlHxeG@LP3Xf6xAve?BFms%7y)0mzlHur;ZqO*rYCRI4XeOKl7cpZ@vA} z5x>8EaIB|)+UZwPihti!fA68e_ItlGTFkO+wpd%642Gsw9FClr^!X-FoYERxF}60z za#O3-Vm27emdg9Sczh-v=YBjDT1+M0yf{65@y$ePF*M~J54HEYEmo_=-P;}-uMFFJ z1F=Al-QGh@uf1}s?ZC*y$bmM!!GZd5kIiMZx@_z$t0gtNn7~daLb2@tXB1*y;6rj> z$kH8ic5`s2@}VeV=bby)DT>fPBjx-(HKVW~te1T~WY{~q@(^0rJ_ zycw+Eq%}J2oidSV?~E|&4cWUHVF%u>__p}D#qT6nF#piZ&FKj+LdDQK` z;&yMGKYw1+UHuvF2 zwR(a717)mn0ITGX%_vI_rz7g5%IT0;XA~ojP|O*OIUTW4?DJ#aD8`~S9Q85|{b{Bd zukZr$qjoE{yZQxQwEMXIcH8iY^;v_^)W{i!BS*jKYHbdo=P{!+)YfRTI%CLj*kDKg zSKrS~;#4osejtIh#fK)o$1q_;19M=^aS> zjQP<@Tkc}p@rG%$v1rgqBMzG^^^%ay8Hy5@9v26ph#zq#fNj1u`r|7#^o@6RL~-XG zwSF=@KJnVb;gxomt37oeR(?IcC>jDX3Xx|b0?Gk{xQM^EF+FWIt-&KT9i(YzG~}w+ zpeeh~%|9+9O5R}5D)kp|o_>`5Uf=Cij`>;5UH{}S@dnE2L(H41 zQ$n&IyS0Q($vYDE_Ql9m6sH7Hdsb;fX5>%Z6A{I$Ti(UM!PIPj|7@yAO^0g>#kh!; zO6Rc+j@vk<*1SPwZn-*iF=`G57QI_nnT~r+mYtEBC{3WCV|n#&{1x5`UxWzR*5_?j zNpjPwpIYcmpkww;XxA}Ek>=7dPy8Mo3xw%AQ=KVNo)7C- zBK{#A8=;@xx|)oMvQL5XHVX9ihW+q@j*-6HuIZSg%fodY^TdBo#{%IGbS%=>*=IVI zpappy8({&hIyQk9)5gOEB~esPdX~<5(#d>oIiD*UYv8D|aypYJ)Vj5HK`E@I^EuCu zKTu;$DLJK3)3dg|5-b*%J8l}sk@SuNyGDaoQgRV=O^92{f|F}^>U&r;Go zOxsrI!=p&`N$}9;`&p{@-kXdMaO!VSd*%1`AAZByD>X$n=llsk0q5E8hum@Jvu~VccNz#5usk2t$APmy4b`z}0`_&s_mIVquA8KKD zmWLG+a>%2AB1)7b4cLH2G+`qMOG={9Tu|21=ad8MN}-reCNj;*)amrORC+m)JC{10 o$hE9de>I(3sWG_co)gJYXL5X2Nr`LObVlK`iJW*QPc>WqUwC|^DgXcg literal 0 HcmV?d00001 diff --git a/src/assets/icons/iconfont.svg b/src/assets/icons/iconfont.svg new file mode 100644 index 0000000..6aa3270 --- /dev/null +++ b/src/assets/icons/iconfont.svg @@ -0,0 +1,56 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/iconfont.ttf b/src/assets/icons/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0c557de0da3bd8a4ddeef49bc1cf7452ed2290cd GIT binary patch literal 3688 zcmd^CYiwLs5uUlv^{&0ndS5B_KK!~~VrRYCw_?k2o%&HhTPJ=9hXl0VTzfa#hr8Z5 zPC}wZr8JbN1?NwxREUJck0Lcl@Qb3R5Fty5qWp-|C{S98;zg87{6X*|-eu0ccfodA zegyH0vpe^EGiT16nKS3i-US2z3siuI(B#bA*pF&I{ult0BprKZW-vT_{>gWV{|fQ* z>3nKs@D=3)0FGELxSTt`^oKk1UI1YVK=x4WqQ>-LGwez@6V^!SFi&LG`^pBe<77uM`ml6$iWP)mtQHame=37 zdL5wUE{(qgu#gtDyQW*wMqjVjF9~Fc zc#{?y8(@|!un00^G^rWPgvfiXv2inaVF2)niO_P6LZ<+6v+&Z#@Hy51VJ*S z#0!Am0ufByH@IJu^ku!rk06XRmjjU}=_j=5rSa1+x&_tydi>=3bEIZO&z534qW27c zI?<3w#MT+m)$j*~o$DlJ76+)O$Vo0hnRo~6BZ;sDTTNSw)yvgN^||V;>W9_)EVG(4 zwO2~Bb~hv|?Bm+;Vg8HEGVPG8Wui%2m+ja8du!G<;EJ&gl#MNdj97-Ynsj2B+)C+0 z`v_Zf6B)4sP`#`ZJAKuPPV8(~>D(}4XSI4uCwAJaAL;~TyLw+I?fjD}T!o*)pU{C7 ztZ@bI&wP@nQ%tw$yL5}v&+Oh))rOqCp+u<1>FlAd*IB#MesFkv_+Y!y;lS>3 zzr$mlLlKSing;LTB3r?l>eA;3INh#MYf~cXM#B_P!`$=e>K_DT=lCUmdMf zMj7!H;_mGj-5#%0uu`EEf>ud@e~0@zWm~3d)e3fS(;A)5PMJt_cE%X>Mx5P@(2I9# zflYqx!He9DS`+@A=&sLK3;2B8^Bd1h9QXOI`F!gaFJ9Db*MGtX`2O9t?d0%I;$smf zqwS524<;wSFK9FH`MG6h>yv_YqtgA_G@NVU)f!%zsFPL@C%rJnW_smqV6%Ny*`k z#7Rom#YHFzUG=*do zVo%2eltU(Q0e|aYcG?|!hsPQ=$kO&m#IxIiZtNyE_qdEGDdDgpAeR}Lq{1>tJ zbxN|+E6&8XqOp@6j$X10nf;klVg)iOz19(x(t|>PI2^sDbWI z>lkJFQR2P1GpiiSvsSzQ!C&D`RMQW!Y-&k~$U*GZ3pN$+SXAjtP^##h5=8y3Qb1PZ z&pZ$j#p|2OLg;X2roVqCQ>M=A*+elZqOI0>Vx8mGPiRlxqzN}YUPFz#!=VLb^E$Kf zpvAU5+)$+nbm&-J{VRWsx5H;4M!xkatr|%_eAqv?>j=gN>2mGz@1+BhbaGY_`vqa{ z%3dd5n3bdhf-rkh*sksHllvoSpPCZ{nmhZ#UT?1$11F{JFYR`hJZ^*Ev+Acc`Xw+h zdna@nn4^>CF)&Z^9s>)6={-}MDN>z}8dxIv5d)i{pMG_99Sc>T64h-K=+_$#!1D%1 zdULyBU=FNs)4)8*-!ZU2_&o!Q^mg{KfhE|7yn)Ryk9GrFK*6l}Xh}_#)zkjP^ZsnQ zSXe3+%H{?*t}dU=rAiI9(a)=;)oiigKNJi#M3ZVkEj8?{t}Tbl3JIb^!k3Do>@pkk^WXJY0on0 z?UfuS{be`{IhtE~XmqdkJZYC;mGqcZKV6L=gdUnTNm>O>bFV+Eutuwe$;&eNbT zr97bt!$Xxk$r1L$iZ*tJ?4(IM2pMhG3LJ((`ZOYH=m)h(^X#C|{m>fw&+;?7Unp!Gn)2Uo*I&(IAA(LH76)t4XrV9I3iC@VU hmKy@@*=I#c)VTtmS2N;jKAThde5xRxE7FrK|4%mOlJWom literal 0 HcmV?d00001 diff --git a/src/assets/icons/iconfont.woff b/src/assets/icons/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..105adab4734b3ba08f9118a8353653af1713e1fe GIT binary patch literal 2180 zcmY*Zc{J2*8~)9V!C1$xg%DENWy?NxvSbh`X0c_NER(ER#@J1kO1(t#rWsq|%hEpH-+j(?p8L9bfGVrpm7nqpit+`0 zSpZ-I^EsrZ2VEuoeX!mDz^(|!se#ZEQeoiyK@rq2AeRCm%P|hi@((6Pf?5K|g+VAP z0xVY0Rs8R`TOb$z4bH!~EP}C-U|;qskRJmf1vv^32-sjBQ0oTYV-EHYHgrCS3%MFj z1n2!-ivWTWS(Ei3vIvjy#$cv!Irx4oh8Vhyz)oQ>*aRSl2XF5iE#t_;fH7(luJB3u zlG30+#&MVf@NW(lQ`FkZXnix-NlZyhEIo$Oc%v%-M1>a_G8-?Sz3 z%DOZk|DVowGF4l3ns@H4?1qselpN+FlY9bFnOY&e3bz|Nu6@6+$T>aT`LTWUA@5t( zzV1UJbzg2&c!>}*cjl|@l!7%xV))jm+v6*AR(vJ?#`+VQT8V_M!Y7K{y^C}~yZd;W z%{sNQV~X0tEc)_i2jDMU)qdK#j8 z7{MlUetqxKBlQck{=U_SvgYX3m9@1`9+f>Qm$d^U^zmjsx&huZ5j};D8t_Kds*1Pb z>J>~Wt+ToYx`*{RH_lyUJ;=+MPev(7?j9sbbOu8F9BR3#x1wj*s5 z@yap@pp9R)LL@PlW@)a04DF$|p>MepyTnR(wQJ^-+)qlJ?WA;;m0L?mhZ$YdDZmCL zGd?^e@QY{6^`}R> zm_v62HqPTI)jx+O#(vQ}SskicytCJ;jKy9ZeU;4}_u&N+QnkmvC%`OA`DA97ksurJ z+;vEkCAx1Rap# z0sd6~kTzYGEAGK$%A0(XP<>G+?{ThojI-EfRVIA=|wX+j+yCSMx`@qmOeW zL%et~wg~1))4AEpC(kQh!^0(pN(}e&y2~jS-e#RXIWir)Xpyt0Zq>1B_@b{|b^W-> zm=ejk!`&ILfOr?yc`mc9Rd3rbzl;rrweTJQ@BUykqB(vzKOEYzx(_YJrnx!hzH<5OKaK+oHyRtyd|hez!9 zYPkV@-$P4+ErmVmFw_{uS%I&&x~o=O%xO0AM3#%JFeD<%0YDN6h1qSi1(ab+e=M)5 zdMz)?Jb_y9{HewA7c#{!vA651*%n4T1x-$Aj{EqeR*cecfaTvBYjpBhXyTY4mG)p8&9#*u|neeEEemcDEk7t zQ~@awA6Vf+Ayywm~|#h${#7{UOda!4lF z%jc$@{aaNe+3P3A-+~oXOzIpQ2T|A;s3f>K2QV)aC(G>%Po*EHR}aEMBq^;39q3qs z-iFnQLajUW$(K=h2ViW9Ly|J7#LP9gq^=jnE7l}dgN{cMa=elY{bya8%=hg^=o;m1 z!9;8nX}Afun|vM1FA>W*9FpxYeRfA>n*AS-rgXhuT#fykD{Y1go)?<3Emd~ut|~>I zw0Ve>Vbet!5%>HGMCDoQEJpR` zm45h<#jW#C#L^{`<>%e-2MzC`lu$TXjxS3MCGMTZSX$C^@%{d!*0jwt#?_!_k?0{j z$Os5} literal 0 HcmV?d00001 diff --git a/src/assets/images/administrato.png b/src/assets/images/administrato.png new file mode 100644 index 0000000000000000000000000000000000000000..8c3d02abf4964f2d52a26e61a22281315eaed549 GIT binary patch literal 4665 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 Fe*s4li(>!) literal 0 HcmV?d00001 diff --git a/src/assets/images/bigmeter.png b/src/assets/images/bigmeter.png new file mode 100644 index 0000000000000000000000000000000000000000..bf6310f8e05729164c85969254c05c0e50f42218 GIT binary patch literal 1326 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cW~I!Kh>{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v)=f4rG*mD%(=#+N zH8V5RQ7|$vG}1Q!A~Rh>6Dw0QDv55FG|-pw6wGYnPFt43sj+7T$xvrSfQI&tPC^3CAB!YD6^m>Ge1uOWMX1cerbuV z640d(FXR@$jm;~D1`{yA^eYkz^bPe4Kwg3=^!3HBG&dKny0|1L72#g21{a4^7NqJ2 zr55Lx79|5CE=?I^Re_arQEFmIeo;t%ehw@Y12XbU@{2R_3lyA#%@j1kGxJjN%ZoL^ z>V18!JoAc667!N%JzZ>-fF|f=W~NvfJDM09SQwdG7&^Kb8oF9qxLG<{7`d5RxH!5v zT9`Y-^t$9Hm*%GCmB93-AoN<`)C)=qxdlL*T~doO%TiO^it=+6z+Se>#O)SSoaRCG zrr>sq8BV?WK*#8VA{Hs4VM4&v17gCHEsz6G_^Elo)LsNk*0ZW}9x*U5F7kA745_%a z=BmFplcNM%fw|H`k5?&kw={Efwh78MDg0s)3v>w(aEkq~FTYN-H?LFA8Y( zEUFhtk-nN)o%VgE)Uuh|4z$jA1|G1)VrF~T+-sexiyNBPTp!qe}+UWO6ixZJ;Y=0|AKq>In{tB%^e(`YIh2*oA_F*uB}=9-Cudz+U;vtVm~HaVBh^_ z^4qT)4lg`$Ab3WzoJUd5}Q9xzw9Q_oXoeYt#*>J_HX;9hd+Y&*)N-NZoc!U pubzR0{mr_!4W+mKihs~Nz@Q_sSH>hbO%YUrdAjtasting \ No newline at end of file diff --git a/src/assets/images/error-page/error-404.svg b/src/assets/images/error-page/error-404.svg new file mode 100644 index 0000000..77d97f7 --- /dev/null +++ b/src/assets/images/error-page/error-404.svg @@ -0,0 +1 @@ +drone_delivery \ No newline at end of file diff --git a/src/assets/images/error-page/error-500.svg b/src/assets/images/error-page/error-500.svg new file mode 100644 index 0000000..ef72fd3 --- /dev/null +++ b/src/assets/images/error-page/error-500.svg @@ -0,0 +1 @@ +co-working \ No newline at end of file diff --git a/src/assets/images/famen.png b/src/assets/images/famen.png new file mode 100644 index 0000000000000000000000000000000000000000..61f20c7e855b2c55fe2048521fe37e349a9c1cdb GIT binary patch literal 1583 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngd!3HEhbh*6;Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?_nZLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}+T7#d8#0MoBXEYLU9GXQxBrqI_HztY@Xxa#7Ppj3o=u^L<)Qdy9y zACy|0Us{w5jJPyqkW~d%&PAz-CHX}m`T04pPz=b(FUc>?$S+WE4mMNJ2+zz*$uBR~ z1grP;werj>E=kNwPW5!LRRWrzmzkMjWoTk-ZtCV@Vq{?IVrb}UX<_bS;B4+{WNzVV zX>M$30MqM|pIn-onpXnTn}X15ic>ErDdZLaZFWg5$}CGwaVyHtRRDY0DigO`jBuI< z)tiFbEyg(Y>H{644~kf%h=vIPQxAvk&A!r{Klc>f)s2uh-B>Y$*-b0Eo;O_9jJ4p6P|AYG zes^BY$O-(q+Lt%=$yLDj%`=r+IP{`@pI(9 zBlDFMwtt=)8z=DKI9sJa$l324fj?%3-(NW?__&&5M)2{;QOupEh2+jp`%ri|>Gb_a z>)Nv=3*B<=R4;V-abq9H-Tj*sWqxmHV9Tm9Ecz%J-e+MX(K?yk^u%+s zv`j^|lRi7EIvsM(g&!9C@vO(_Ql-xK@84V;KeEX`=VAQSZh!E|>Ue?NqPraC-i-MQ zJiA&Qrk=Pi#m63?^Q67{rjoSJvPbb}>n=25sdEGs;hwI3F6*2UngEOK BTp0iW literal 0 HcmV?d00001 diff --git a/src/assets/images/flowarrow.png b/src/assets/images/flowarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..97b9157a080a472fe9550c646044fd42bf47e9a2 GIT binary patch literal 2069 zcmbVN3rrJd94{(}6$Rr!C(hlDs2IK8gZAj%sERF0)iNGc(8a~;-PdxV?VWcAEzAdz zsqukx%3^c_Gkj$x!$&lWbI!*UoFQ&mwm6*{GqNx<8M?_NCc1rBN{3FJ+2yYH-S_>z z-~ac2eE+U5ESNLGIL>G=7)Chr9mViHR(}!`;P1_ltrxzA$@z;^gJJk+{fRT|{177I zABgTUt;{u_<)wg$6C@8Xg#$7~8w@!!!ZOEK01fc~pBS{E-6u|=h$z_5Qj3dl$#zgK z=GQ2oq^7{l*HrL~fXZ;sRZAccGofmERnU!SK%R zw`K?{`RirCtU4{=NetNIc~DM;_ok7SiLfVrGIDFo8Dn zn3eN*v22<%3m&UEi(oAMY;PzcJd>P%AgiuQfQ*!v;4D0!jaexRg$dbaFJ>j_Y>eQ6 zhcagYfu=8Gy!b9MAAm4Ic@kzYh2^}}+!elBb%uNMRm(CD=Ilz6<5<>>xU zIe?_ksggeHs^rx|oC0!vFm^9ei1@Sgt6bId)xTIa`(!<#{@;cBKh;Nr!&F-Iy|jmYyFysdm0+2`CUct#7~^n zI*6Z?@rU=uidXM1=|0~Y-Z^E;My8U!uXT5?x@7Bo>)hD7Q|6>q{zWs>?!4VmGG=G# zYWd{R!NzwDNgXGeei)^-mIm0=BrH!t2Y1A z?)$EnU6VNY_~oBo>6tkCdVSzg*X|#i_J7bBzhL*|nO&3rOh4UOwJ^E;-q4FHs?WC{ zx>C39`5n-xv(c%#qV(X~H zoJ*g4JgsqDS7pzR!v~Jmj&X8lHYPf@7M-4P)Ntfl&b6~|N;~G=JkznZdDGlIDXA&- zb@vVoUU&P!$hwxIEenh}vkNoXqz&KKZQEi_{-$9<%Dl|`BQ50QrMHg_**AB;^wpk& z?XRb~E?~zebnZQO;oIvEe&0t^n6DvDE~`meb6MNI^ygj0>Dy9j5=xiFb*J2YEw}Y{ z$^4Q05;8r>M-Sb#CHd1^IbXC4LWdpMThiD&B-Go{yt1jZ;h}t__OImd(AxbiE88Y~ R6tDkrJM#)0Ewh%c{u=>#$~^!8 literal 0 HcmV?d00001 diff --git a/src/assets/images/flowarrow2.png b/src/assets/images/flowarrow2.png new file mode 100644 index 0000000000000000000000000000000000000000..1919b7008ddc59e2db2243228c1a5242b6e682ca GIT binary patch literal 1017 zcmaJ=O=#0l9M4vqqiis7OgF*3WtRyyUv1Mitj@N{TwxidtE?AcY4WzlEqO6{v)K?F zGDKmA-Mo2m2Spg{CJ25GVFxb*FM^05c$6JP@#IU_b{?$Z<$dw{{r;cteqrWHZ+Iw7 zQB-e!N-mPMhy2~$U1Wa$_52}O2C-7cvuFX=G#64C163f%TiPNlLd{scu@A>7Dny&5 zGA^srl8!7!3owjtIfPA7;}gE4=}QoU3S2bpH2wYgOB$F)nx2cRoa*FY)tp*$;q2N> zNncyiQwBY835@#^5wIZEfNw3^p5&+Lx~@d_!8J>RIs`AJ=_9AgY60Ys3qhQTMs$wn zfhaP3EG~-tMIdmzz;a}W5k4lxMM+42#zzxtuCX8$<;jLEa!S)xj2($(Yqc6vi!#Vv zWcgGo6=(=Tgdif`s*N>2Vtb=a1sQs}YdY9OHV7283R=Nwns|B?g5|ViZLg6gk}%fS z9F}LeAfzTxRsRpQtQOkCMR@G*KZU*0ssq^~^w5f{lfo^G2BsV-=Ryr5w}jAgGmC{P z!pN&42jpf&Fg9n}2C8`%>UdR^^0tRHTZef$O%nyiGz}?}iYcOy%uFho1kWqUWLC-K zVsbVrCln#BC{3=6^c4%*xXCq+x!JbdpcO2KSeBt{-h{@ai!4wNSu)%El5DHj;2Q0H zNwwvGdy>|cd$UXktzwym}$hgRc5n{>NN+FINE^n*MJD=%kC{>RGnL+5um6ncAo z?8Upw6xXpU_9dvptDwu=Ia!I^8roieHgNCrsYip`U!r|KJ9m5f9*pd3A9@a6o!Gm* z{_9Ms^W6M~Ht;y|q;Ps~tN&Uqy!n*NY~B5~(LWLzsE}!$3Q=!5hKJ9-t}?-6%quhU IPImszA1j7F0RR91 literal 0 HcmV?d00001 diff --git a/src/assets/images/load.gif b/src/assets/images/load.gif new file mode 100644 index 0000000000000000000000000000000000000000..16e7b6450b4442a10aa2b8b32ff06ff53d8d680e GIT binary patch literal 3211 zcmc(iYfw{X9*6PdFPv<43)P@Ad1~^YZdKIy!1=YgsH7kH?#sn0Wm7ad&t37hik< zg5cb-xn=e*1K)_qC{uo_sq2A=6rZ?=NUP}BeQ|nbzk*8^4*Ux05#|qmByRHv+Rk?M z_gHVm#Le%0Iln)DuO9f!f6%KXS~ELr9^+H7ww|{vxH*s=AeZ+t5jCrP+KOqr!TQFb zvxgZ%a_>u~ApvuwKVh=<>&^gPmKMKzvIP+?%j58(KC=z3LADpeZrRyrKa)&mUH$3Y z*+>eKoWgMq#S`~a@VUvJ{Ctz6u&c9-N#KRmg-ILrObTbqY^yLDQ+z_3b9r z%#QPkj55yz>GAkbC(lf)Y;wQ!LM7pfjQ<^ZrxAa^&tty>zB-c=8gA9&{J{0^egSm} z`A>n_Fn*uF%KoKu!v6P}4SNgUMNOMfCM>a%d-?nHHo4DfSkSR#G5hR1dxUy+_*n$U zgIdokr8Ea}#^myNW6z7;`8RuBcKhh+^QKn4S(6`nC}s8YV#+ntfI<%=QG)!dO(;2* zy#}>(0{&aNtLg7+Zs)eiXr2^eqM1$Tx$lqhU_%B@h(AifXRbcL6cdXn2Mam-)0i2c z)G6DEkhiO8msn7iqE>QR@Wj-Xrk0bf;^vOZT@B2ti?nXexiXqoqVG={A^ci@oQi}B`J8nredA4 zaYw_Z3wD!+gJ!@V_`qWPpXTtR?dR~#9XvfE!z;eLs|-Z?&+Yio3&O|P6Ok!FcCH@id6Daf^bcGpr0zLOOagePveNHOWS)5BB1G*CNm z_0f;dfz~Uumv(QTg*vqs&SE#z1iN?QlVM_i1N!+(YBSkY((+FUz%5oVpZ*!s=Gozs zW?Q2u^%}Z?GH~#STpmcdufn!ZT{*mYT}Oo~33*SK-d`mlQ^O>yqiopvu|R(@CHF?g zxWN){GbZ(igAoxGsLrT9IC13~$qfx1oJvNQ{P4xgObxMy-0mG1C$c3E<}o9}FFt z*cdhZm2a==&-8O+Z*gVP2vQNCgOHj zABGXm8oxw$C}NLs0zTE`pu4$mbqyJvi_i7gK3v89M1$F!3!pt2)xD+|-J+ z@E%=lfr&ml%v;{uL;utS&|(iS7I~p%g8kM%bSKvAiD!BJ!Y3+KPwrgvtg5xscdK$FoISnD8r9Y9{Qg1WWf|W% zi@Ta_&Xq{XU||uIoW4a;BnQi6+zPNHTF5GBbO2LwxOf(mjB16K&(}!0wT-Arvm~b(5SynE&-(!Osy==YS<8cIiT?tVo_w zpkRdLad9AMZ<6cKq|Iigs~7}G3qtecc-T$9O?8mEmjoJtFpT&#@dL795@`Uv1rYk- zQVBFdGQ5RiQ2&4w9q9!gl9B#)E;#ZCdyaMXOCFP6KD#~BpJF@$uN_o;Jz2Xn#9%2C z8Jt;>d(3*(rz%7iJ9zVdav*ZhNAg^)=Vl*dr&DQoRHMmH3M0dP!|8Ui9(^b7CIgKpTbo7+_r$Hbr z=70V_g@8~5Wg9FMfxio~i3;i3Rf4;n<++!R^i&-%4aOiejqMd}hSw1wod-lXbBEeK6E>t8B`C3+CI)AWm^^{%wXm74r@_s-@k3yV)xIHx{Mk zjhWbD>E{4X@@WEyi{bxk0-~1vrv<&ojO9Cf4t&@apTK36ShgvaMHYJbmkt_OpoZSd zf+jq_tx|GO77;h}`L3^xHL_e(*(S4MHRbhaS7ziw!e+t!UJ8X!D_iQ?6jhGAO13o-1hcwWRGR*!zUmCi z%b0l|RAA&Ax3UwvcnQji9U0)S4Cw_Ou#E6^Jj>xj22b#Y+&zkOT&Eu8iY-5Uh6YO^HI1#a(n*hi8|A2+{Z!V?Gng9R* literal 0 HcmV?d00001 diff --git a/src/assets/images/login-bg.jpg b/src/assets/images/login-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..298e55075bb947179a1f86dee8d06e6edf1ee149 GIT binary patch literal 21684 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/meter.png b/src/assets/images/meter.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4102618e67194e9e8d34eabb50e4384f419bbb GIT binary patch literal 1344 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cW~I!Kh>{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v)=f4rG*mD%(=#+N zH8V5RQ7|$vG}1Q!A~Rh>6Dw0QDv55FG|-pw6wGYnPFt43sj+7T$xvrSfQI&tPC^3CAB!YD6^m>Ge1uOWMX1cerbuV z640d(FXR@$jm;~D1`{yA^eYkz^bPe4Kwg3=^!3HBG&dKny0|1L72#g21{a4^7NqJ2 zr55Lx79|5CE=?I^Re_arQEFmIeo;t%ehw@Y12XbU@{2R_3lyA#%@j1kGxJjN%ZoL^ z>V18!JoAc667!N%JzZ>-fF|f=W~Nw~n3=e`I9WPd7&^Kb8oF9KnVOqey11CQnOM3x z8k(BJ^t$9Hm*%GCmB93-AoRN6)C)=qxdlL*T~doO%TiO^it=+6z+Se>#O)SGoaRCG zrr>sq6HdMQK*#8VA{Hs4VM4&v17gCHEsz6G_^Elo)LsNk)-yk|6Qr3KI>L#Y*+v`5@`Jt$3VN+xSy{7!(USqRq)+g~3$C_ljSb4=f zvQ8B%SE~2F{(brTt8*{s%s%?(mGRx;cQfDr-Fr^|fkmI!a@MEn3!Jun*Igj)Qs1vx z$`N*8*~<-!^FkbKOgPLMD=#qYJ7D_Vx#ST8Pjhap!Ql@J9XD{lIv|q4`gTF@`N<1} zaso|`mhiJX{E=U|i>_LMiK`E0wEsF_Y2aGGz3YI`iAQm^H?Fgucd#rDVbs&P z_q2hfqe1CO%GV+$L#;MLMybl;Lv!qsAM~a_`P*~9pul(8X&Lpt zCod=cKB~Y!ry+2|zx$OhW`*o!zw&`?Zd2$zjo%Hv%l~p1Fx-96sJWs;;S8uu^K|ud JS?83{1OSOq>;?b; literal 0 HcmV?d00001 diff --git a/src/assets/images/mincompanyLogo.png b/src/assets/images/mincompanyLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..e08bb49872ebbe3483f4782df7ca95c230febca8 GIT binary patch literal 5286 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/secondaryflowMeter.png b/src/assets/images/secondaryflowMeter.png new file mode 100644 index 0000000000000000000000000000000000000000..b23bf54bd79eb3b3e0da3bfb40e872520d50e6cb GIT binary patch literal 1354 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cW~I!Kh>{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v)=f4rG*mD%(=#+N zH8V5RQ7|$vG}1Q!A~Rh>6Dw0QDv55FG|-pw6wGYnPFt43sj+7T$xvrSfQI&tPC^3CAB!YD6^m>Ge1uOWMX1cerbuV z640d(FXR@$jm;~D1`{yA^eYkz^bPe4Kwg3=^!3HBG&dKny0|1L72#g21{a4^7NqJ2 zr55Lx79|5CE=?I^Re_arQEFmIeo;t%ehw@Y12XbU@{2R_3lyA#%@j1kGxJjN%ZoL^ z>V18!JoAc667!N%JzZ>-fF|f=W~Nw~7&sdk8JL<_7&^Kb8oF9Kx;Z*KIl8#GIUBhd zTDY3Q^t$9Hm*%GCmB93-AoQBz)C)=qxdlL*T~doO%TiO^it=+6z+Se>#O)R%oaRCG zrr>sqF;2buK*#8VA{Hs4VM4&v17gCHEsz6G_^Elo)LsNk)^cYSyD~5^?(=kU45_%a zW~#S_OQ6K@*xut=8#a7Aq0B9mFEAeRx`O) zrDJZM6Wv8L`%R8~{r_pcRq@>F<4OB|ovpl6{lE5k^&CT=%RSvocRo38{a|Z#9B-6^ zq=AEgPLuB4({=OzhX*82P2if+tY2{YFWUwFK1co=8|x(23%+KmUcl1RAQix#Whu}0 zGhz0k`u;T$>N6hOaQfVs^I+m*l?f_7uUWVq8$O#AV>ElFS<+FPJh|(fJ;h=x!dX=X=O;{UTGo4G;?t0m z33KO_t!N5LH-B*Qm@$8LKzQ2u2Thh86$eW`yg9JYQfVJ|b;Y3_OEotJ_PEr!o-fW)PFDIttJ)A$i zdv@~Fb<>Y7&P#pYE8cu{-@(J9+lpv8#PB_x*|D`Inyx z-| literal 0 HcmV?d00001 diff --git a/src/assets/images/start.png b/src/assets/images/start.png new file mode 100644 index 0000000000000000000000000000000000000000..4f232f006c8ec62bf2501f40e11a32eb51108657 GIT binary patch literal 1203 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz6!3HEJ^yqE{Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?_nZLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}+T7#d8#0MoBXEYLU9GXQxBrqI_HztY@Xxa#7Ppj3o=u^L<)Qdy9y zACy|0Us{w5jJPyqkW~d%&PAz-CHX}m`T04pPz=b(FUc>?$S+WE4mMNJ2+zz*$uBR~ z1grP;werj>E=kNwPW5!LRRWrzmzkMj1=H2YGLRC40TsaOJh?fM*~wAXBTHz zM@wU8m|mCsATTyZNovV9y->C9DlU*eCt4R@lb+C_?6!81u(O1u-X~#|)47 z6__1ou}ZFBzSq3Rrn9jsK}cuX&4wQ=0@9N*FH|aQV|Wz5!Q&_E5k7~SDLjY!oWA}$ zG>va(Lj}J;v{2@aLWMHMNBKX5w($wXt6g%4RoLg0b?q?wmrl^lI6BYyY6FA1o&Nu(OWq6E)*pN1J7I>9fI9QXas@u8X)GKD4Bxo@Z$1|8Iu0sE NJYD@<);T3K0RX47k4^vp literal 0 HcmV?d00001 diff --git a/src/assets/images/unbigmeter.png b/src/assets/images/unbigmeter.png new file mode 100644 index 0000000000000000000000000000000000000000..a5d4f0a0b45e9115b4d9a7577e50c66006cb1555 GIT binary patch literal 1883 zcmaJ?X;c$u6b%H~6jZdXScf4hDr8SEkswKiK-3_F2&iBU$p9%#CMJVPfEE-*K?P+K zQ4208C@O*rqAZF9V?}GRE?A5Ef?A5GfNLiz+8?EJX69SYz4yKMy*p>p0|WdV?8n&? z2m}YQKP1J+k><_EEtW#^l~js;49Hc7!V`!Xjlr%mByte*o#0Q zf+|@U7ABd?RiFr2ZpM%ehz4g92wt-c8o44C#(+pTTBYWJohRx+K&9k?p)3hiq7lL| zD*ps69Gnm!QzXPHI7)DqH{fO9;sOYa$pHfrr`B-|Jn*9~7oVHADIo9>g2nQ{Pf3MI z0s$eag#i|s;h~_?XaJi{rZHJ;Hq9NNQ)zSx6~EaYG$xnD=F&ZZ&liYC(<-C5Qb_bU z7QW(vF&L)dQYd=8o~&n(QEfDZ#^G?x8g#k`j_}YK)tKDiq1L(fD?qSLp;c)x6{-fz zitgPhJA|8R& zSU*?!l`9&MYqkQS!6QSkR<#UPinJ&Kd@Px(8aNl>fO?;~%7Jr%2INxkWGLpw{;Sdb zTey47(=WEg7hjAIt8uq$aa;42(RldRa#0NNWrnt-`7K$kA;Tsn-*4;-xFYAxd+UPg*3QoG8sn2!s9lI~tk%` zGW%wZTm5)b=)tYvR%w~l-n~&NK_i!UzDfMf>kZ>j+6V8_o@1NqZYH7*s@rI^vO?jP zl>`;97r7F5K)yMovSbMs_toSo-?On zWtLCMQO@hry7KXfuYPE-JL+dm&A8U#li}c0`Z5Om%O#oms5UMC=-`f)QIm5mNwn}q z5xnj=#oZ}?j%<%7hwP1a6kTVx4R)rcD;y_Zs2O7*4>@|QxHV$s!kuLQCuCTAf@a6FEL%~i38L!qpO_SMTDsbH zRJW8f#@pY<>OkshCokFUB~wFxwBOCyRpplS%{lnUjhj`WcT=+6_njHE{L;$vmkUky zL!B;y*13acA7ItZtGg#!zULaCEA?|8cA}&zSA~!Y*HxR2v_EwZ^aoRNpkI@L^kE*_FDfuAA`dDi@hsQxd~3$cxH)k=Jmj9wo>83N8ImbX}Mlef4t9o{g17>ADL; zEYdDdN_gXKxwe^jvCqE85i}Kyjq;5cRcUfryb(PYHQ_|kg8j12+dn_g-=VkQHH(6d zbuE@vY?=A+P~!A8hu7U2$DMO_evw^88ZfK4x4uNof7f-RW0u9fBixZ)2Z78zRJ){_ zCG%SkFLUW$y6+}Ub5C$5$J53y)A~+CgQw*XLK!EUl`!0rZ~onheFLBaf+Z{d0qtMx A`Tzg` literal 0 HcmV?d00001 diff --git a/src/assets/images/unfamen.png b/src/assets/images/unfamen.png new file mode 100644 index 0000000000000000000000000000000000000000..24109229e8883835fb5f8e8199cac02c03b401fa GIT binary patch literal 1412 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngd!3HEhbh*6;Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?_nZLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}+T7#d8#0MoBXEYLU9GXQxBrqI_HztY@Xxa#7Ppj3o=u^L<)Qdy9y zACy|0Us{w5jJPyqkW~d%&PAz-CHX}m`T04pPz=b(FUc>?$S+WE4mMNJ2+zz*$uBR~ z1grP;werj>E=kNwPW5!LRRWrzmzkMjWocyYY-#G~WMp9KVrb}UX=!L==xSi$Z06|d zWNKn&0n_V}pIn-onpXnTn}X2mj8iWtDdZLaZFWg5$}CGwaVyHtRRDY0DigO`EOD9# z)tiFbEsi+#>H{644~kf%h=vIPQxAv_}u_VEp0f;uunK zYfjL9Zy86Cy7zD2txV-e zhN@E1VzH>`mrvW>HV8f0b9e5{n&R!%S*L6&c3T_Y|9*D+d)sZ-F8yzNFDGu#edLhH zUDqc|LIg}YFUXYK-cS}DKQrUBM08xmnJd5cEOt6~NS0xX!lBPImCH`rcwL+KXfu1| z+=olOT2^uW5nb9;d1ph4c6w@_i2C}CdF{Kk*A%OXPJ6?6h5L@h+O0QJw(Y%f%DI0| z=;E(BA6OF@9@>8X@a)KxsbLI1jw;Qcv4eX-^5V(wKa>Q`UMyo%&JNG-M?n9W@P!a@>A7=>My$s+>YLsmN_BOb*=CI&&g#^ z=iRwE>o#klBolMSMV`sBZnEE6mr9HKwQ6N>94=7y`{MpwU}Heu;@8hr+m4)N`{u1M zS8DO~4Sy9wy5__Rux;HKJg>mM;CDTu2ulc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij}dUxuvC< zn~8~|k%6nFp`nGTo1>+(iJ6i2T`e8WoSiHT zP0TEuj4e%EERA7$J@bl767!N%VfJPM?S<;Kz^m8FxhOTUB)=#mKR*YS0s=DfOY(~| z@(UE4gUu8)!ZY(y^2>`gLD2*8txIZAW?5>ATTyd$a1; zM?15!1D+0w4F>Z&m=%sNHq;1o)(fbg;5{L~+(ALWSgzWLhmvy6{)$;9w?yDsm$@0;gZUg%_e&dR{rh;azFKVd>ul@q@9(bFwX3pVTl|Ro_{NM`N51U%K70S?Igch6 zJG`jg^1XPvTH%@Rx96M3?W_LFb;NV8_tGRumB_}l-OQE=zK3@3?=xpAVW?WoyJ^vf zpxJA$J)U`UX68Ku&uRL`?3J@Vuv}?Y;W}8H!_my}O8k~VsFw4rWj(?ni+uHCcHet? zs>|uXM&Au>%;(M=YwKmcZP1XRC2~4-!H>I!Z4VR{Ds(N#WSy(MJd-DMFQ>`!J?v-l zRz@)gPFfJMZcaa|R_R=3Sz*t%XPWHlfi)VZz1r75mWVmd?&He|+4^ncYwt}?JvN6M`}Et`10^1;xa7U?y}od0?2(!AQ$!{8JrCu`J^cRt z>8yQCPVRfYzNwkhd{foI;7R2%E4%hL<~8;iA|`9+KfS4Ub~AIR_5yFwblZIr^{f&M YC!R0w+Pmn&LQuKy>FVdQ&MBb@0Q8__=Kufz literal 0 HcmV?d00001 diff --git a/src/assets/images/unsecondaryflowMeter.png b/src/assets/images/unsecondaryflowMeter.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa3ff73ec43c57d6940bc3fdb089aa5874ecdf3 GIT binary patch literal 1353 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cW~I!Kh>{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v)=f4rG*mD%(=#+N zH8V5RQ7|$vG}1Q!A~Rh>6Dw0QDv55FG|-pw6wGYnPFt43sj+7T$xvrSfQI&tPC^3CAB!YD6^m>Ge1uOWMX1cerbuV z640d(FXR@$jm;~D1`{yA^eYkz^bPe4Kwg3=^!3HBG&dKny0|1L72#g21{a4^7NqJ2 zr55Lx79|5CE=?I^Re_arQEFmIeo;t%ehw@Y12XbU@{2R_3lyA#%@j1kGxJjN%ZoL^ z>V18!JoAc667!N%JzZ>-fF|f=W~Nw~8#tO78o60o7&^Kb8oF9KxjDPKS{NG}x)~We z8JU>D^t$9Hm*%GCmB93-AoM!o)C)=qxdlL*T~doO%TiO^it=+6z+Se>#O)SyoaRCG zrr>sq1x~&CK*#8VA{Hs4VM4&v17gCHEsz6G_^Elo)LsNk)}<*4+Zh-b_j#@O61{7BZQT9!3y!TiD6)bj{=u~0y$K95&2bx&{~81;U*rAeASuCEx`6RYu^kWB zK{MC?a*-SL431ZF&DdahQ2Ds0g6E8DoMO!k&)+_{^Ngi@0q2>fl(sZ+nJCuq1MJ^b z%)-s??K~)PG;YUsmZGZ?RStp@sb-sVk9bwyVOlp?;Fb~E~$&8v)P-epwHCVs~83iq<+bauY8f?s2g92P#N>)hE}<)c1XDOzfv0gf;`GO&PW8UnJ+@_+m*rez~e3SmBmQA_VQ}Lhm4~GH6^Nk5#fAs0h P02OYYu6{1-oD!M<-}>e> literal 0 HcmV?d00001 diff --git a/src/assets/three/OrbitControls.js b/src/assets/three/OrbitControls.js new file mode 100644 index 0000000..930d4f3 --- /dev/null +++ b/src/assets/three/OrbitControls.js @@ -0,0 +1,1019 @@ +/** + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com + * @author ScieCode / http://github.com/sciecode + */ + +import { + EventDispatcher, + MOUSE, + Quaternion, + Spherical, + TOUCH, + Vector2, + Vector3 +} from "three"; + +// This set of controls performs orbiting, dollying (zooming), and panning. +// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). +// +// Orbit - left mouse / touch: one-finger move +// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish +// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move + +var OrbitControls = function(object, domElement) { + this.object = object; + + this.domElement = domElement !== undefined ? domElement : document; + + // Set to false to disable this control + this.enabled = true; + + // "target" sets the location of focus, where the object orbits around + this.target = new Vector3(); + + // How far you can dolly in and out ( PerspectiveCamera only ) + this.minDistance = 0; + this.maxDistance = Infinity; + + // How far you can zoom in and out ( OrthographicCamera only ) + this.minZoom = 0; + this.maxZoom = Infinity; + + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + this.minPolarAngle = 0; // radians + this.maxPolarAngle = Math.PI; // radians + + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + this.minAzimuthAngle = -Infinity; // radians + this.maxAzimuthAngle = Infinity; // radians + + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + this.enableDamping = false; + this.dampingFactor = 0.05; + + // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + this.enableZoom = true; + this.zoomSpeed = 1.0; + + // Set to false to disable rotating + this.enableRotate = true; + this.rotateSpeed = 1.0; + + // Set to false to disable panning + this.enablePan = true; + this.panSpeed = 1.0; + this.screenSpacePanning = false; // if true, pan in screen-space + this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + this.autoRotate = false; + this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + + // Set to false to disable use of the keys + this.enableKeys = true; + + // The four arrow keys + this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + + // Mouse buttons + this.mouseButtons = { + LEFT: MOUSE.ROTATE, + MIDDLE: MOUSE.DOLLY, + RIGHT: MOUSE.PAN + }; + + // Touch fingers + this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN }; + + // for reset + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.zoom0 = this.object.zoom; + + // + // public methods + // + + this.getPolarAngle = function() { + return spherical.phi; + }; + + this.getAzimuthalAngle = function() { + return spherical.theta; + }; + + this.saveState = function() { + scope.target0.copy(scope.target); + scope.position0.copy(scope.object.position); + scope.zoom0 = scope.object.zoom; + }; + + this.reset = function() { + scope.target.copy(scope.target0); + scope.object.position.copy(scope.position0); + scope.object.zoom = scope.zoom0; + + scope.object.updateProjectionMatrix(); + scope.dispatchEvent(changeEvent); + + scope.update(); + + state = STATE.NONE; + }; + + // this method is exposed, but perhaps it would be better if we can make it private... + this.update = (function() { + var offset = new Vector3(); + + // so camera.up is the orbit axis + var quat = new Quaternion().setFromUnitVectors( + object.up, + new Vector3(0, 1, 0) + ); + var quatInverse = quat.clone().inverse(); + + var lastPosition = new Vector3(); + var lastQuaternion = new Quaternion(); + + return function update() { + var position = scope.object.position; + + offset.copy(position).sub(scope.target); + + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion(quat); + + // angle from z-axis around y-axis + spherical.setFromVector3(offset); + + if (scope.autoRotate && state === STATE.NONE) { + rotateLeft(getAutoRotationAngle()); + } + + if (scope.enableDamping) { + spherical.theta += sphericalDelta.theta * scope.dampingFactor; + spherical.phi += sphericalDelta.phi * scope.dampingFactor; + } else { + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; + } + + // restrict theta to be between desired limits + spherical.theta = Math.max( + scope.minAzimuthAngle, + Math.min(scope.maxAzimuthAngle, spherical.theta) + ); + + // restrict phi to be between desired limits + spherical.phi = Math.max( + scope.minPolarAngle, + Math.min(scope.maxPolarAngle, spherical.phi) + ); + + spherical.makeSafe(); + + spherical.radius *= scale; + + // restrict radius to be between desired limits + spherical.radius = Math.max( + scope.minDistance, + Math.min(scope.maxDistance, spherical.radius) + ); + + // move target to panned location + + if (scope.enableDamping === true) { + scope.target.addScaledVector(panOffset, scope.dampingFactor); + } else { + scope.target.add(panOffset); + } + + offset.setFromSpherical(spherical); + + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion(quatInverse); + + position.copy(scope.target).add(offset); + + scope.object.lookAt(scope.target); + + if (scope.enableDamping === true) { + sphericalDelta.theta *= 1 - scope.dampingFactor; + sphericalDelta.phi *= 1 - scope.dampingFactor; + + panOffset.multiplyScalar(1 - scope.dampingFactor); + } else { + sphericalDelta.set(0, 0, 0); + + panOffset.set(0, 0, 0); + } + + scale = 1; + + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if ( + zoomChanged || + lastPosition.distanceToSquared(scope.object.position) > EPS || + 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS + ) { + scope.dispatchEvent(changeEvent); + + lastPosition.copy(scope.object.position); + lastQuaternion.copy(scope.object.quaternion); + zoomChanged = false; + + return true; + } + + return false; + }; + })(); + + this.dispose = function() { + scope.domElement.removeEventListener("contextmenu", onContextMenu, false); + scope.domElement.removeEventListener("mousedown", onMouseDown, false); + scope.domElement.removeEventListener("wheel", onMouseWheel, false); + + scope.domElement.removeEventListener("touchstart", onTouchStart, false); + scope.domElement.removeEventListener("touchend", onTouchEnd, false); + scope.domElement.removeEventListener("touchmove", onTouchMove, false); + + document.removeEventListener("mousemove", onMouseMove, false); + document.removeEventListener("mouseup", onMouseUp, false); + + window.removeEventListener("keydown", onKeyDown, false); + + //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here? + }; + + // + // internals + // + + var scope = this; + + var changeEvent = { type: "change" }; + var startEvent = { type: "start" }; + var endEvent = { type: "end" }; + + var STATE = { + NONE: -1, + ROTATE: 0, + DOLLY: 1, + PAN: 2, + TOUCH_ROTATE: 3, + TOUCH_PAN: 4, + TOUCH_DOLLY_PAN: 5, + TOUCH_DOLLY_ROTATE: 6 + }; + + var state = STATE.NONE; + + var EPS = 0.000001; + + // current position in spherical coordinates + var spherical = new Spherical(); + var sphericalDelta = new Spherical(); + + var scale = 1; + var panOffset = new Vector3(); + var zoomChanged = false; + + var rotateStart = new Vector2(); + var rotateEnd = new Vector2(); + var rotateDelta = new Vector2(); + + var panStart = new Vector2(); + var panEnd = new Vector2(); + var panDelta = new Vector2(); + + var dollyStart = new Vector2(); + var dollyEnd = new Vector2(); + var dollyDelta = new Vector2(); + + function getAutoRotationAngle() { + return ((2 * Math.PI) / 60 / 60) * scope.autoRotateSpeed; + } + + function getZoomScale() { + return Math.pow(0.95, scope.zoomSpeed); + } + + function rotateLeft(angle) { + sphericalDelta.theta -= angle; + } + + function rotateUp(angle) { + sphericalDelta.phi -= angle; + } + + var panLeft = (function() { + var v = new Vector3(); + + return function panLeft(distance, objectMatrix) { + v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix + v.multiplyScalar(-distance); + + panOffset.add(v); + }; + })(); + + var panUp = (function() { + var v = new Vector3(); + + return function panUp(distance, objectMatrix) { + if (scope.screenSpacePanning === true) { + v.setFromMatrixColumn(objectMatrix, 1); + } else { + v.setFromMatrixColumn(objectMatrix, 0); + v.crossVectors(scope.object.up, v); + } + + v.multiplyScalar(distance); + + panOffset.add(v); + }; + })(); + + // deltaX and deltaY are in pixels; right and down are positive + var pan = (function() { + var offset = new Vector3(); + + return function pan(deltaX, deltaY) { + var element = + scope.domElement === document + ? scope.domElement.body + : scope.domElement; + + if (scope.object.isPerspectiveCamera) { + // perspective + var position = scope.object.position; + offset.copy(position).sub(scope.target); + var targetDistance = offset.length(); + + // half of the fov is center to top of screen + targetDistance *= Math.tan(((scope.object.fov / 2) * Math.PI) / 180.0); + + // we use only clientHeight here so aspect ratio does not distort speed + panLeft( + (2 * deltaX * targetDistance) / element.clientHeight, + scope.object.matrix + ); + panUp( + (2 * deltaY * targetDistance) / element.clientHeight, + scope.object.matrix + ); + } else if (scope.object.isOrthographicCamera) { + // orthographic + panLeft( + (deltaX * (scope.object.right - scope.object.left)) / + scope.object.zoom / + element.clientWidth, + scope.object.matrix + ); + panUp( + (deltaY * (scope.object.top - scope.object.bottom)) / + scope.object.zoom / + element.clientHeight, + scope.object.matrix + ); + } else { + // camera neither orthographic nor perspective + console.warn( + "WARNING: OrbitControls.js encountered an unknown camera type - pan disabled." + ); + scope.enablePan = false; + } + }; + })(); + + function dollyIn(dollyScale) { + if (scope.object.isPerspectiveCamera) { + scale /= dollyScale; + } else if (scope.object.isOrthographicCamera) { + scope.object.zoom = Math.max( + scope.minZoom, + Math.min(scope.maxZoom, scope.object.zoom * dollyScale) + ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + } else { + console.warn( + "WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled." + ); + scope.enableZoom = false; + } + } + + function dollyOut(dollyScale) { + if (scope.object.isPerspectiveCamera) { + scale *= dollyScale; + } else if (scope.object.isOrthographicCamera) { + scope.object.zoom = Math.max( + scope.minZoom, + Math.min(scope.maxZoom, scope.object.zoom / dollyScale) + ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + } else { + console.warn( + "WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled." + ); + scope.enableZoom = false; + } + } + + // + // event callbacks - update the object state + // + + function handleMouseDownRotate(event) { + rotateStart.set(event.clientX, event.clientY); + } + + function handleMouseDownDolly(event) { + dollyStart.set(event.clientX, event.clientY); + } + + function handleMouseDownPan(event) { + panStart.set(event.clientX, event.clientY); + } + + function handleMouseMoveRotate(event) { + rotateEnd.set(event.clientX, event.clientY); + + rotateDelta + .subVectors(rotateEnd, rotateStart) + .multiplyScalar(scope.rotateSpeed); + + var element = + scope.domElement === document ? scope.domElement.body : scope.domElement; + + rotateLeft((2 * Math.PI * rotateDelta.x) / element.clientHeight); // yes, height + + rotateUp((2 * Math.PI * rotateDelta.y) / element.clientHeight); + + rotateStart.copy(rotateEnd); + + scope.update(); + } + + function handleMouseMoveDolly(event) { + dollyEnd.set(event.clientX, event.clientY); + + dollyDelta.subVectors(dollyEnd, dollyStart); + + if (dollyDelta.y > 0) { + dollyIn(getZoomScale()); + } else if (dollyDelta.y < 0) { + dollyOut(getZoomScale()); + } + + dollyStart.copy(dollyEnd); + + scope.update(); + } + + function handleMouseMovePan(event) { + panEnd.set(event.clientX, event.clientY); + + panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed); + + pan(panDelta.x, panDelta.y); + + panStart.copy(panEnd); + + scope.update(); + } + + function handleMouseUp(/*event*/) { + // no-op + } + + function handleMouseWheel(event) { + if (event.deltaY < 0) { + dollyOut(getZoomScale()); + } else if (event.deltaY > 0) { + dollyIn(getZoomScale()); + } + + scope.update(); + } + + function handleKeyDown(event) { + var needsUpdate = false; + + switch (event.keyCode) { + case scope.keys.UP: + pan(0, scope.keyPanSpeed); + needsUpdate = true; + break; + + case scope.keys.BOTTOM: + pan(0, -scope.keyPanSpeed); + needsUpdate = true; + break; + + case scope.keys.LEFT: + pan(scope.keyPanSpeed, 0); + needsUpdate = true; + break; + + case scope.keys.RIGHT: + pan(-scope.keyPanSpeed, 0); + needsUpdate = true; + break; + } + + if (needsUpdate) { + // prevent the browser from scrolling on cursor keys + event.preventDefault(); + + scope.update(); + } + } + + function handleTouchStartRotate(event) { + if (event.touches.length == 1) { + rotateStart.set(event.touches[0].pageX, event.touches[0].pageY); + } else { + var x = 0.5 * (event.touches[0].pageX + event.touches[1].pageX); + var y = 0.5 * (event.touches[0].pageY + event.touches[1].pageY); + + rotateStart.set(x, y); + } + } + + function handleTouchStartPan(event) { + if (event.touches.length == 1) { + panStart.set(event.touches[0].pageX, event.touches[0].pageY); + } else { + var x = 0.5 * (event.touches[0].pageX + event.touches[1].pageX); + var y = 0.5 * (event.touches[0].pageY + event.touches[1].pageY); + + panStart.set(x, y); + } + } + + function handleTouchStartDolly(event) { + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + + var distance = Math.sqrt(dx * dx + dy * dy); + + dollyStart.set(0, distance); + } + + function handleTouchStartDollyPan(event) { + if (scope.enableZoom) handleTouchStartDolly(event); + + if (scope.enablePan) handleTouchStartPan(event); + } + + function handleTouchStartDollyRotate(event) { + if (scope.enableZoom) handleTouchStartDolly(event); + + if (scope.enableRotate) handleTouchStartRotate(event); + } + + function handleTouchMoveRotate(event) { + if (event.touches.length == 1) { + rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY); + } else { + var x = 0.5 * (event.touches[0].pageX + event.touches[1].pageX); + var y = 0.5 * (event.touches[0].pageY + event.touches[1].pageY); + + rotateEnd.set(x, y); + } + + rotateDelta + .subVectors(rotateEnd, rotateStart) + .multiplyScalar(scope.rotateSpeed); + + var element = + scope.domElement === document ? scope.domElement.body : scope.domElement; + + rotateLeft((2 * Math.PI * rotateDelta.x) / element.clientHeight); // yes, height + + rotateUp((2 * Math.PI * rotateDelta.y) / element.clientHeight); + + rotateStart.copy(rotateEnd); + } + + function handleTouchMovePan(event) { + if (event.touches.length == 1) { + panEnd.set(event.touches[0].pageX, event.touches[0].pageY); + } else { + var x = 0.5 * (event.touches[0].pageX + event.touches[1].pageX); + var y = 0.5 * (event.touches[0].pageY + event.touches[1].pageY); + + panEnd.set(x, y); + } + + panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed); + + pan(panDelta.x, panDelta.y); + + panStart.copy(panEnd); + } + + function handleTouchMoveDolly(event) { + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + + var distance = Math.sqrt(dx * dx + dy * dy); + + dollyEnd.set(0, distance); + + dollyDelta.set(0, Math.pow(dollyEnd.y / dollyStart.y, scope.zoomSpeed)); + + dollyIn(dollyDelta.y); + + dollyStart.copy(dollyEnd); + } + + function handleTouchMoveDollyPan(event) { + if (scope.enableZoom) handleTouchMoveDolly(event); + + if (scope.enablePan) handleTouchMovePan(event); + } + + function handleTouchMoveDollyRotate(event) { + if (scope.enableZoom) handleTouchMoveDolly(event); + + if (scope.enableRotate) handleTouchMoveRotate(event); + } + + function handleTouchEnd(/*event*/) { + // no-op + } + + // + // event handlers - FSM: listen for events and reset state + // + + function onMouseDown(event) { + if (scope.enabled === false) return; + + // Prevent the browser from scrolling. + + event.preventDefault(); + + // Manually set the focus since calling preventDefault above + // prevents the browser from setting it automatically. + + scope.domElement.focus ? scope.domElement.focus() : window.focus(); + + switch (event.button) { + case 0: + switch (scope.mouseButtons.LEFT) { + case MOUSE.ROTATE: + if (event.ctrlKey || event.metaKey || event.shiftKey) { + if (scope.enablePan === false) return; + + handleMouseDownPan(event); + + state = STATE.PAN; + } else { + if (scope.enableRotate === false) return; + + handleMouseDownRotate(event); + + state = STATE.ROTATE; + } + + break; + + case MOUSE.PAN: + if (event.ctrlKey || event.metaKey || event.shiftKey) { + if (scope.enableRotate === false) return; + + handleMouseDownRotate(event); + + state = STATE.ROTATE; + } else { + if (scope.enablePan === false) return; + + handleMouseDownPan(event); + + state = STATE.PAN; + } + + break; + + default: + state = STATE.NONE; + } + + break; + + case 1: + switch (scope.mouseButtons.MIDDLE) { + case MOUSE.DOLLY: + if (scope.enableZoom === false) return; + + handleMouseDownDolly(event); + + state = STATE.DOLLY; + + break; + + default: + state = STATE.NONE; + } + + break; + + case 2: + switch (scope.mouseButtons.RIGHT) { + case MOUSE.ROTATE: + if (scope.enableRotate === false) return; + + handleMouseDownRotate(event); + + state = STATE.ROTATE; + + break; + + case MOUSE.PAN: + if (scope.enablePan === false) return; + + handleMouseDownPan(event); + + state = STATE.PAN; + + break; + + default: + state = STATE.NONE; + } + + break; + } + + if (state !== STATE.NONE) { + document.addEventListener("mousemove", onMouseMove, false); + document.addEventListener("mouseup", onMouseUp, false); + + scope.dispatchEvent(startEvent); + } + } + + function onMouseMove(event) { + if (scope.enabled === false) return; + + event.preventDefault(); + + switch (state) { + case STATE.ROTATE: + if (scope.enableRotate === false) return; + + handleMouseMoveRotate(event); + + break; + + case STATE.DOLLY: + if (scope.enableZoom === false) return; + + handleMouseMoveDolly(event); + + break; + + case STATE.PAN: + if (scope.enablePan === false) return; + + handleMouseMovePan(event); + + break; + } + } + + function onMouseUp(event) { + if (scope.enabled === false) return; + + handleMouseUp(event); + + document.removeEventListener("mousemove", onMouseMove, false); + document.removeEventListener("mouseup", onMouseUp, false); + + scope.dispatchEvent(endEvent); + + state = STATE.NONE; + } + + function onMouseWheel(event) { + if ( + scope.enabled === false || + scope.enableZoom === false || + (state !== STATE.NONE && state !== STATE.ROTATE) + ) + return; + + event.preventDefault(); + event.stopPropagation(); + + scope.dispatchEvent(startEvent); + + handleMouseWheel(event); + + scope.dispatchEvent(endEvent); + } + + function onKeyDown(event) { + if ( + scope.enabled === false || + scope.enableKeys === false || + scope.enablePan === false + ) + return; + + handleKeyDown(event); + } + + function onTouchStart(event) { + if (scope.enabled === false) return; + + event.preventDefault(); + + switch (event.touches.length) { + case 1: + switch (scope.touches.ONE) { + case TOUCH.ROTATE: + if (scope.enableRotate === false) return; + + handleTouchStartRotate(event); + + state = STATE.TOUCH_ROTATE; + + break; + + case TOUCH.PAN: + if (scope.enablePan === false) return; + + handleTouchStartPan(event); + + state = STATE.TOUCH_PAN; + + break; + + default: + state = STATE.NONE; + } + + break; + + case 2: + switch (scope.touches.TWO) { + case TOUCH.DOLLY_PAN: + if (scope.enableZoom === false && scope.enablePan === false) return; + + handleTouchStartDollyPan(event); + + state = STATE.TOUCH_DOLLY_PAN; + + break; + + case TOUCH.DOLLY_ROTATE: + if (scope.enableZoom === false && scope.enableRotate === false) + return; + + handleTouchStartDollyRotate(event); + + state = STATE.TOUCH_DOLLY_ROTATE; + + break; + + default: + state = STATE.NONE; + } + + break; + + default: + state = STATE.NONE; + } + + if (state !== STATE.NONE) { + scope.dispatchEvent(startEvent); + } + } + + function onTouchMove(event) { + if (scope.enabled === false) return; + + event.preventDefault(); + event.stopPropagation(); + + switch (state) { + case STATE.TOUCH_ROTATE: + if (scope.enableRotate === false) return; + + handleTouchMoveRotate(event); + + scope.update(); + + break; + + case STATE.TOUCH_PAN: + if (scope.enablePan === false) return; + + handleTouchMovePan(event); + + scope.update(); + + break; + + case STATE.TOUCH_DOLLY_PAN: + if (scope.enableZoom === false && scope.enablePan === false) return; + + handleTouchMoveDollyPan(event); + + scope.update(); + + break; + + case STATE.TOUCH_DOLLY_ROTATE: + if (scope.enableZoom === false && scope.enableRotate === false) return; + + handleTouchMoveDollyRotate(event); + + scope.update(); + + break; + + default: + state = STATE.NONE; + } + } + + function onTouchEnd(event) { + if (scope.enabled === false) return; + + handleTouchEnd(event); + + scope.dispatchEvent(endEvent); + + state = STATE.NONE; + } + + function onContextMenu(event) { + if (scope.enabled === false) return; + + event.preventDefault(); + } + + // + + scope.domElement.addEventListener("contextmenu", onContextMenu, false); + + scope.domElement.addEventListener("mousedown", onMouseDown, false); + scope.domElement.addEventListener("wheel", onMouseWheel, false); + + scope.domElement.addEventListener("touchstart", onTouchStart, false); + scope.domElement.addEventListener("touchend", onTouchEnd, false); + scope.domElement.addEventListener("touchmove", onTouchMove, false); + + window.addEventListener("keydown", onKeyDown, false); + + // force an update at start + + this.update(); +}; + +OrbitControls.prototype = Object.create(EventDispatcher.prototype); +OrbitControls.prototype.constructor = OrbitControls; + +// This set of controls performs orbiting, dollying (zooming), and panning. +// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). +// This is very similar to OrbitControls, another set of touch behavior +// +// Orbit - right mouse, or left mouse + ctrl/meta/shiftKey / touch: two-finger rotate +// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish +// Pan - left mouse, or arrow keys / touch: one-finger move + +var MapControls = function(object, domElement) { + OrbitControls.call(this, object, domElement); + + this.mouseButtons.LEFT = MOUSE.PAN; + this.mouseButtons.RIGHT = MOUSE.ROTATE; + + this.touches.ONE = TOUCH.PAN; + this.touches.TWO = TOUCH.DOLLY_ROTATE; +}; + +MapControls.prototype = Object.create(EventDispatcher.prototype); +MapControls.prototype.constructor = MapControls; + +export { OrbitControls, MapControls }; diff --git a/src/components/asyncModal/index.vue b/src/components/asyncModal/index.vue new file mode 100644 index 0000000..dd20f5e --- /dev/null +++ b/src/components/asyncModal/index.vue @@ -0,0 +1,49 @@ + + + + \ No newline at end of file diff --git a/src/components/common-icon/common-icon.vue b/src/components/common-icon/common-icon.vue new file mode 100644 index 0000000..cf266b6 --- /dev/null +++ b/src/components/common-icon/common-icon.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/components/common-icon/index.js b/src/components/common-icon/index.js new file mode 100644 index 0000000..1207d15 --- /dev/null +++ b/src/components/common-icon/index.js @@ -0,0 +1,2 @@ +import CommonIcon from './common-icon.vue' +export default CommonIcon diff --git a/src/components/cron-input/index.vue b/src/components/cron-input/index.vue new file mode 100644 index 0000000..d3c9082 --- /dev/null +++ b/src/components/cron-input/index.vue @@ -0,0 +1,105 @@ + + + + + \ No newline at end of file diff --git a/src/components/cropper/index.js b/src/components/cropper/index.js new file mode 100644 index 0000000..e7db5ea --- /dev/null +++ b/src/components/cropper/index.js @@ -0,0 +1,2 @@ +import Cropper from './index.vue' +export default Cropper diff --git a/src/components/cropper/index.less b/src/components/cropper/index.less new file mode 100644 index 0000000..3057f88 --- /dev/null +++ b/src/components/cropper/index.less @@ -0,0 +1,36 @@ +.bg{ + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC") +} +.cropper-wrapper{ + width:100%; + height: 100%; + .img-box{ + height: 600px; + width: 600px; + border: 1px solid #ebebeb; + display: inline-block; + .bg; + img{ + max-width: 100%; + display: block; + } + } + .right-con{ + display: inline-block; + width: 170px; + vertical-align: top; + box-sizing: border-box; + padding: 0 10px; + margin-left: 30px; + .preview-box{ + height: 150px !important; + width: 100% !important; + overflow: hidden; + border: 1px solid #ebebeb; + .bg; + } + .button-box{ + padding: 10px 0 0; + } + } +} diff --git a/src/components/cropper/index.vue b/src/components/cropper/index.vue new file mode 100644 index 0000000..3bd9fb9 --- /dev/null +++ b/src/components/cropper/index.vue @@ -0,0 +1,155 @@ + + + diff --git a/src/components/editor/index.vue b/src/components/editor/index.vue new file mode 100644 index 0000000..9280bbd --- /dev/null +++ b/src/components/editor/index.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/src/components/info-card/index.js b/src/components/info-card/index.js new file mode 100644 index 0000000..354419b --- /dev/null +++ b/src/components/info-card/index.js @@ -0,0 +1,2 @@ +import InforCard from './infor-card.vue' +export default InforCard diff --git a/src/components/info-card/infor-card.vue b/src/components/info-card/infor-card.vue new file mode 100644 index 0000000..f113306 --- /dev/null +++ b/src/components/info-card/infor-card.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/src/components/load-flower/index.vue b/src/components/load-flower/index.vue new file mode 100644 index 0000000..27288c6 --- /dev/null +++ b/src/components/load-flower/index.vue @@ -0,0 +1,32 @@ + + + + diff --git a/src/components/login-form/index.js b/src/components/login-form/index.js new file mode 100644 index 0000000..d480c28 --- /dev/null +++ b/src/components/login-form/index.js @@ -0,0 +1,2 @@ +import LoginForm from './login-form.vue' +export default LoginForm diff --git a/src/components/login-form/login-form.vue b/src/components/login-form/login-form.vue new file mode 100644 index 0000000..e0399a6 --- /dev/null +++ b/src/components/login-form/login-form.vue @@ -0,0 +1,68 @@ + + diff --git a/src/components/main/components/a-back-top/index.js b/src/components/main/components/a-back-top/index.js new file mode 100644 index 0000000..4da0014 --- /dev/null +++ b/src/components/main/components/a-back-top/index.js @@ -0,0 +1,2 @@ +import ABackTop from './index.vue' +export default ABackTop diff --git a/src/components/main/components/a-back-top/index.vue b/src/components/main/components/a-back-top/index.vue new file mode 100644 index 0000000..0da3bac --- /dev/null +++ b/src/components/main/components/a-back-top/index.vue @@ -0,0 +1,94 @@ + + diff --git a/src/components/main/components/fullscreen/fullscreen.vue b/src/components/main/components/fullscreen/fullscreen.vue new file mode 100644 index 0000000..749ccb3 --- /dev/null +++ b/src/components/main/components/fullscreen/fullscreen.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/src/components/main/components/fullscreen/index.js b/src/components/main/components/fullscreen/index.js new file mode 100644 index 0000000..422c7c1 --- /dev/null +++ b/src/components/main/components/fullscreen/index.js @@ -0,0 +1,2 @@ +import Fullscreen from './fullscreen.vue' +export default Fullscreen diff --git a/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less b/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less new file mode 100644 index 0000000..1ace1eb --- /dev/null +++ b/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less @@ -0,0 +1,4 @@ +.custom-bread-crumb{ + display: inline-block; + vertical-align: top; +} diff --git a/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.vue b/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.vue new file mode 100644 index 0000000..30d3307 --- /dev/null +++ b/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.vue @@ -0,0 +1,46 @@ + + diff --git a/src/components/main/components/header-bar/custom-bread-crumb/index.js b/src/components/main/components/header-bar/custom-bread-crumb/index.js new file mode 100644 index 0000000..a590fe0 --- /dev/null +++ b/src/components/main/components/header-bar/custom-bread-crumb/index.js @@ -0,0 +1,2 @@ +import customBreadCrumb from './custom-bread-crumb.vue' +export default customBreadCrumb diff --git a/src/components/main/components/header-bar/header-bar.less b/src/components/main/components/header-bar/header-bar.less new file mode 100644 index 0000000..1594d65 --- /dev/null +++ b/src/components/main/components/header-bar/header-bar.less @@ -0,0 +1,18 @@ +.header-bar { + width: 100%; + height: 100%; + position: relative; + height: 64px; + display: flex; + flex-direction: row; + + .custom-content-con { + height: 64px; + padding-right: 120px; + line-height: 64px; + display: inline-block; + vertical-align: top; + flex: 1; + } + +} diff --git a/src/components/main/components/header-bar/header-bar.vue b/src/components/main/components/header-bar/header-bar.vue new file mode 100644 index 0000000..0774b8c --- /dev/null +++ b/src/components/main/components/header-bar/header-bar.vue @@ -0,0 +1,39 @@ + + diff --git a/src/components/main/components/header-bar/index.js b/src/components/main/components/header-bar/index.js new file mode 100644 index 0000000..3d4a170 --- /dev/null +++ b/src/components/main/components/header-bar/index.js @@ -0,0 +1,2 @@ +import HeaderBar from './header-bar' +export default HeaderBar diff --git a/src/components/main/components/header-bar/sider-trigger/index.js b/src/components/main/components/header-bar/sider-trigger/index.js new file mode 100644 index 0000000..15853f4 --- /dev/null +++ b/src/components/main/components/header-bar/sider-trigger/index.js @@ -0,0 +1,2 @@ +import siderTrigger from './sider-trigger.vue' +export default siderTrigger diff --git a/src/components/main/components/header-bar/sider-trigger/sider-trigger.less b/src/components/main/components/header-bar/sider-trigger/sider-trigger.less new file mode 100644 index 0000000..eb50999 --- /dev/null +++ b/src/components/main/components/header-bar/sider-trigger/sider-trigger.less @@ -0,0 +1,21 @@ +.trans{ + transition: transform .2s ease; +} +@size: 40px; +.sider-trigger-a{ + padding: 6px; + width: @size; + height: @size; + display: inline-block; + text-align: center; + color: #5c6b77; + margin-top: 12px; + i{ + .trans; + vertical-align: top; + } + &.collapsed i{ + transform: rotateZ(90deg); + .trans; + } +} diff --git a/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue b/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue new file mode 100644 index 0000000..86ab9ca --- /dev/null +++ b/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue @@ -0,0 +1,27 @@ + + + diff --git a/src/components/main/components/language/index.js b/src/components/main/components/language/index.js new file mode 100644 index 0000000..de2a90a --- /dev/null +++ b/src/components/main/components/language/index.js @@ -0,0 +1,2 @@ +import Language from './language.vue' +export default Language diff --git a/src/components/main/components/language/language.vue b/src/components/main/components/language/language.vue new file mode 100644 index 0000000..692c437 --- /dev/null +++ b/src/components/main/components/language/language.vue @@ -0,0 +1,51 @@ + + + diff --git a/src/components/main/components/side-menu/collapsed-menu.vue b/src/components/main/components/side-menu/collapsed-menu.vue new file mode 100644 index 0000000..70454fa --- /dev/null +++ b/src/components/main/components/side-menu/collapsed-menu.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/components/main/components/side-menu/index.js b/src/components/main/components/side-menu/index.js new file mode 100644 index 0000000..5b36868 --- /dev/null +++ b/src/components/main/components/side-menu/index.js @@ -0,0 +1,2 @@ +import SideMenu from './side-menu.vue' +export default SideMenu diff --git a/src/components/main/components/side-menu/item-mixin.js b/src/components/main/components/side-menu/item-mixin.js new file mode 100644 index 0000000..e5a9367 --- /dev/null +++ b/src/components/main/components/side-menu/item-mixin.js @@ -0,0 +1,21 @@ +export default { + props: { + parentItem: { + type: Object, + default: () => {} + }, + theme: String, + iconSize: Number + }, + computed: { + parentName() { + return this.parentItem.name + }, + children() { + return this.parentItem.children + }, + textColor() { + return this.theme === 'dark' ? '#fff' : '#495060' + } + } +} diff --git a/src/components/main/components/side-menu/mixin.js b/src/components/main/components/side-menu/mixin.js new file mode 100644 index 0000000..59ff021 --- /dev/null +++ b/src/components/main/components/side-menu/mixin.js @@ -0,0 +1,18 @@ +import CommonIcon from "@component/common-icon"; +import { showTitle } from "@/utils/tools"; +export default { + components: { + CommonIcon + }, + methods: { + showTitle(item) { + return showTitle(item, this); + }, + showChildren(item) { + return item.type === "菜单"; + }, + getNameOrHref(item, children0) { + return item.href ? `isTurnByHref_${item.href}` : item.name; + } + } +}; \ No newline at end of file diff --git a/src/components/main/components/side-menu/side-menu-item.vue b/src/components/main/components/side-menu/side-menu-item.vue new file mode 100644 index 0000000..07ffba7 --- /dev/null +++ b/src/components/main/components/side-menu/side-menu-item.vue @@ -0,0 +1,25 @@ + + diff --git a/src/components/main/components/side-menu/side-menu.less b/src/components/main/components/side-menu/side-menu.less new file mode 100644 index 0000000..d154b77 --- /dev/null +++ b/src/components/main/components/side-menu/side-menu.less @@ -0,0 +1,39 @@ +.side-menu-wrapper { + user-select: none; + .menu-collapsed { + padding-top: 10px; + + .ivu-dropdown { + width: 100%; + .ivu-dropdown-rel a { + width: 100%; + } + } + .ivu-tooltip { + width: 100%; + .ivu-tooltip-rel { + width: 100%; + } + + .ivu-tooltip-popper .ivu-tooltip-content { + .ivu-tooltip-arrow { + border-right-color: #fff; + } + .ivu-tooltip-inner { + background: #fff; + color: #495060; + } + } + } + } + a.drop-menu-a { + display: inline-block; + padding: 6px 15px; + width: 100%; + text-align: center; + color: #495060; + } +} +.menu-title { + padding-left: 6px; +} diff --git a/src/components/main/components/side-menu/side-menu.vue b/src/components/main/components/side-menu/side-menu.vue new file mode 100644 index 0000000..a9e263f --- /dev/null +++ b/src/components/main/components/side-menu/side-menu.vue @@ -0,0 +1,112 @@ + + + diff --git a/src/components/main/components/terminal/index.vue b/src/components/main/components/terminal/index.vue new file mode 100644 index 0000000..0316132 --- /dev/null +++ b/src/components/main/components/terminal/index.vue @@ -0,0 +1,63 @@ + + + + + \ No newline at end of file diff --git a/src/components/main/components/terminal/terminal.vue b/src/components/main/components/terminal/terminal.vue new file mode 100644 index 0000000..7f98205 --- /dev/null +++ b/src/components/main/components/terminal/terminal.vue @@ -0,0 +1,62 @@ + + + + + \ No newline at end of file diff --git a/src/components/main/components/user/index.js b/src/components/main/components/user/index.js new file mode 100644 index 0000000..3d04a5c --- /dev/null +++ b/src/components/main/components/user/index.js @@ -0,0 +1,2 @@ +import User from './user.vue' +export default User diff --git a/src/components/main/components/user/user.less b/src/components/main/components/user/user.less new file mode 100644 index 0000000..a3c95af --- /dev/null +++ b/src/components/main/components/user/user.less @@ -0,0 +1,12 @@ +.user{ + &-avator-dropdown{ + cursor: pointer; + display: inline-block; + // height: 64px; + vertical-align: middle; + // line-height: 64px; + .ivu-badge-dot{ + top: 16px; + } + } +} diff --git a/src/components/main/components/user/user.vue b/src/components/main/components/user/user.vue new file mode 100644 index 0000000..554a0e2 --- /dev/null +++ b/src/components/main/components/user/user.vue @@ -0,0 +1,68 @@ + + + + diff --git a/src/components/main/index.js b/src/components/main/index.js new file mode 100644 index 0000000..7df2a08 --- /dev/null +++ b/src/components/main/index.js @@ -0,0 +1,2 @@ +import Main from './main.vue' +export default Main diff --git a/src/components/main/main.less b/src/components/main/main.less new file mode 100644 index 0000000..ef792c3 --- /dev/null +++ b/src/components/main/main.less @@ -0,0 +1,109 @@ +.main { + .logo-con { + height: 64px; + padding: 10px; + padding-left: 0px; + color: white; + + img { + width: auto; + display: block; + margin: 0 auto; + } + } + + .header-con { + padding: 0px 10px; + width: 100%; + background: #fff; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1); + margin-bottom: 5px; + } + + .main-content-con { + height: 100%; + overflow: hidden; + color: darkgray; + display: flex; + } + + .main-layout-con { + display: flex; + display: -webkit-flex; + overflow: hidden; + } + + .tag-nav-wrapper { + padding: 0; + height: 40px; + background: #f0f0f0; + } + + .content-wrapper { + padding: 0px 0.05rem; + height: ~"calc(100% - 40px)"; + display: flex; + display: -webkit-flex; + flex-direction: column; + overflow: auto; + } + + .left-sider { + .ivu-layout-sider-children { + overflow-y: scroll; + margin-right: -10px; + } + } +} + +.ivu-menu-item > i { + margin-right: 12px !important; +} + +.ivu-menu-submenu > .ivu-menu > .ivu-menu-item > i { + margin-right: 8px !important; +} + +.collased-menu-dropdown { + width: 100%; + margin: 0; + line-height: normal; + padding: 7px 0 6px 16px; + clear: both; + font-size: 12px !important; + white-space: nowrap; + list-style: none; + cursor: pointer; + transition: background 0.2s ease-in-out; + + &:hover { + background: rgba(100, 100, 100, 0.1); + } + + & * { + color: #515a6e; + } + + .ivu-menu-item > i { + margin-right: 12px !important; + } + + .ivu-menu-submenu > .ivu-menu > .ivu-menu-item > i { + margin-right: 8px !important; + } +} + +.ivu-select-dropdown.ivu-dropdown-transfer { + max-height: 400px; +} + +.police-box { + margin-left: 10px; + color: darkgoldenrod; + overflow: hidden; + height: 100%; + + span { + margin: 0px 5px; + } +} diff --git a/src/components/main/main.vue b/src/components/main/main.vue new file mode 100644 index 0000000..2977966 --- /dev/null +++ b/src/components/main/main.vue @@ -0,0 +1,145 @@ + + + diff --git a/src/components/main/pageHead.vue b/src/components/main/pageHead.vue new file mode 100644 index 0000000..3b33018 --- /dev/null +++ b/src/components/main/pageHead.vue @@ -0,0 +1,23 @@ + + + + \ No newline at end of file diff --git a/src/components/markdown/index.js b/src/components/markdown/index.js new file mode 100644 index 0000000..99e0cda --- /dev/null +++ b/src/components/markdown/index.js @@ -0,0 +1,2 @@ +import MarkdownEditor from './markdown.vue' +export default MarkdownEditor diff --git a/src/components/markdown/markdown.vue b/src/components/markdown/markdown.vue new file mode 100644 index 0000000..d47a388 --- /dev/null +++ b/src/components/markdown/markdown.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/src/components/md-icons/icons.vue b/src/components/md-icons/icons.vue new file mode 100644 index 0000000..68c9ff5 --- /dev/null +++ b/src/components/md-icons/icons.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/src/components/md-icons/index.js b/src/components/md-icons/index.js new file mode 100644 index 0000000..bdc38b2 --- /dev/null +++ b/src/components/md-icons/index.js @@ -0,0 +1,2 @@ +import Icons from './icons.vue' +export default Icons diff --git a/src/components/parent-view/index.js b/src/components/parent-view/index.js new file mode 100644 index 0000000..a959c65 --- /dev/null +++ b/src/components/parent-view/index.js @@ -0,0 +1,2 @@ +import ParentView from './parent-view.vue' +export default ParentView diff --git a/src/components/parent-view/parent-view.vue b/src/components/parent-view/parent-view.vue new file mode 100644 index 0000000..37471ee --- /dev/null +++ b/src/components/parent-view/parent-view.vue @@ -0,0 +1,18 @@ + + diff --git a/src/components/paste-editor/index.js b/src/components/paste-editor/index.js new file mode 100644 index 0000000..f02331a --- /dev/null +++ b/src/components/paste-editor/index.js @@ -0,0 +1,2 @@ +import PasteEditor from './paste-editor.vue' +export default PasteEditor diff --git a/src/components/paste-editor/paste-editor.less b/src/components/paste-editor/paste-editor.less new file mode 100644 index 0000000..2ffd2bd --- /dev/null +++ b/src/components/paste-editor/paste-editor.less @@ -0,0 +1,26 @@ +.paste-editor-wrapper{ + width: 100%; + height: 100%; + border: 1px dashed gainsboro; + textarea.textarea-el{ + width: 100%; + height: 100%; + } + .CodeMirror{ + height: 100%; + padding: 0; + .CodeMirror-code div .CodeMirror-line > span > span.cm-tab{ + &::after{ + content: '→'; + color: #BFBFBF; + } + } + } + .first-row{ + font-weight: 700; + font-size: 14px; + } + .incorrect-row{ + background: #F5CBD1; + } +} diff --git a/src/components/paste-editor/paste-editor.vue b/src/components/paste-editor/paste-editor.vue new file mode 100644 index 0000000..e407381 --- /dev/null +++ b/src/components/paste-editor/paste-editor.vue @@ -0,0 +1,120 @@ + + + diff --git a/src/components/paste-editor/plugins/placeholder.js b/src/components/paste-editor/plugins/placeholder.js new file mode 100644 index 0000000..26f75a1 --- /dev/null +++ b/src/components/paste-editor/plugins/placeholder.js @@ -0,0 +1,61 @@ +export default codemirror => { + ;(function(mod) { + mod(codemirror) + })(function(CodeMirror) { + CodeMirror.defineOption('placeholder', '', function(cm, val, old) { + var prev = old && old !== CodeMirror.Init + if (val && !prev) { + cm.on('blur', onBlur) + cm.on('change', onChange) + cm.on('swapDoc', onChange) + onChange(cm) + } else if (!val && prev) { + cm.off('blur', onBlur) + cm.off('change', onChange) + cm.off('swapDoc', onChange) + clearPlaceholder(cm) + var wrapper = cm.getWrapperElement() + wrapper.className = wrapper.className.replace(' CodeMirror-empty', '') + } + + if (val && !cm.hasFocus()) onBlur(cm) + }) + + function clearPlaceholder(cm) { + if (cm.state.placeholder) { + cm.state.placeholder.parentNode.removeChild(cm.state.placeholder) + cm.state.placeholder = null + } + } + function setPlaceholder(cm) { + clearPlaceholder(cm) + var elt = (cm.state.placeholder = document.createElement('pre')) + elt.style.cssText = 'height: 0; overflow: visible; color: #80848f;' + elt.style.direction = cm.getOption('direction') + elt.className = 'CodeMirror-placeholder' + var placeHolder = cm.getOption('placeholder') + if (typeof placeHolder === 'string') + placeHolder = document.createTextNode(placeHolder) + elt.appendChild(placeHolder) + cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild) + } + + function onBlur(cm) { + if (isEmpty(cm)) setPlaceholder(cm) + } + function onChange(cm) { + let wrapper = cm.getWrapperElement() + let empty = isEmpty(cm) + wrapper.className = + wrapper.className.replace(' CodeMirror-empty', '') + + (empty ? ' CodeMirror-empty' : '') + + if (empty) setPlaceholder(cm) + else clearPlaceholder(cm) + } + + function isEmpty(cm) { + return cm.lineCount() === 1 && cm.getLine(0) === '' + } + }) +} diff --git a/src/components/split-pane/index.js b/src/components/split-pane/index.js new file mode 100644 index 0000000..f5ed60e --- /dev/null +++ b/src/components/split-pane/index.js @@ -0,0 +1,2 @@ +import Split from './split.vue' +export default Split diff --git a/src/components/split-pane/index.less b/src/components/split-pane/index.less new file mode 100644 index 0000000..2583d90 --- /dev/null +++ b/src/components/split-pane/index.less @@ -0,0 +1,114 @@ +@split-prefix-cls: ~"ivu-split"; +@box-shadow: 0 0 4px 0 rgba(28, 36, 56, 0.4); +@trigger-bar-background: rgba(23, 35, 61, 0.25); +@trigger-background: #F8F8F9; +@trigger-width: 6px; +@trigger-bar-width: 4px; +@trigger-bar-offset: (@trigger-width - @trigger-bar-width) / 2; +@trigger-bar-interval: 3px; +@trigger-bar-weight: 1px; +@trigger-bar-con-height: (@trigger-bar-weight + @trigger-bar-interval) * 8; + +.@{split-prefix-cls}{ + &-wrapper{ + position: relative; + width: 100%; + height: 100%; + } + &-pane{ + position: absolute; + &.left-pane, &.right-pane{ + top: 0px; + bottom: 0px; + } + &.left-pane{ + left: 0px; + } + &.right-pane{ + right: 0px; + } + &.top-pane, &.bottom-pane{ + left: 0px; + right: 0px; + } + &.top-pane{ + top: 0px; + } + &.bottom-pane{ + bottom: 0px; + } + } + &-trigger{ + &-con{ + position: absolute; + transform: translate(-50%, -50%); + z-index: 10; + } + &-bar-con{ + position: absolute; + overflow: hidden; + &.vertical{ + left: @trigger-bar-offset; + top: 50%; + height: @trigger-bar-con-height; + transform: translate(0, -50%); + } + &.horizontal{ + left: 50%; + top: @trigger-bar-offset; + width: @trigger-bar-con-height; + transform: translate(-50%, 0); + } + } + &-vertical{ + width: @trigger-width; + height: 100%; + background: @trigger-background; + box-shadow: @box-shadow; + cursor: col-resize; + .@{split-prefix-cls}-trigger-bar{ + width: @trigger-bar-width; + height: 1px; + background: @trigger-bar-background; + float: left; + margin-top: @trigger-bar-interval; + } + } + &-horizontal{ + height: @trigger-width; + width: 100%; + background: @trigger-background; + box-shadow: @box-shadow; + cursor: row-resize; + .@{split-prefix-cls}-trigger-bar{ + height: @trigger-bar-width; + width: 1px; + background: @trigger-bar-background; + float: left; + margin-right: @trigger-bar-interval; + } + } + } + &-horizontal{ + .@{split-prefix-cls}-trigger-con{ + top: 50%; + height: 100%; + width: 0; + } + } + &-vertical{ + .@{split-prefix-cls}-trigger-con{ + left: 50%; + height: 0; + width: 100%; + } + } + .no-select{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } +} diff --git a/src/components/split-pane/split.vue b/src/components/split-pane/split.vue new file mode 100644 index 0000000..6123432 --- /dev/null +++ b/src/components/split-pane/split.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/src/components/split-pane/trigger.vue b/src/components/split-pane/trigger.vue new file mode 100644 index 0000000..0948fc3 --- /dev/null +++ b/src/components/split-pane/trigger.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/components/tables/editModal.vue b/src/components/tables/editModal.vue new file mode 100644 index 0000000..95ab03f --- /dev/null +++ b/src/components/tables/editModal.vue @@ -0,0 +1,279 @@ + + + diff --git a/src/components/tables/fieldItem.vue b/src/components/tables/fieldItem.vue new file mode 100644 index 0000000..c1f8908 --- /dev/null +++ b/src/components/tables/fieldItem.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/tables/index.vue b/src/components/tables/index.vue new file mode 100644 index 0000000..70005c9 --- /dev/null +++ b/src/components/tables/index.vue @@ -0,0 +1,270 @@ + + + + diff --git a/src/components/tables/templateRender.js b/src/components/tables/templateRender.js new file mode 100644 index 0000000..3ed3642 --- /dev/null +++ b/src/components/tables/templateRender.js @@ -0,0 +1,9 @@ +export default { + name: 'templateRender', + props: ['render', 'value'], + functional: true, + render: (h, ctx) => { + const params = ctx.props.value + return ctx.props.render(h, params) + }, +} \ No newline at end of file diff --git a/src/components/text-area/index.vue b/src/components/text-area/index.vue new file mode 100644 index 0000000..f66ce96 --- /dev/null +++ b/src/components/text-area/index.vue @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/src/components/treeGrid/component/renderCol.vue b/src/components/treeGrid/component/renderCol.vue new file mode 100644 index 0000000..ab2837a --- /dev/null +++ b/src/components/treeGrid/component/renderCol.vue @@ -0,0 +1,24 @@ + diff --git a/src/components/treeGrid/component/subColmns.vue b/src/components/treeGrid/component/subColmns.vue new file mode 100644 index 0000000..dc595c9 --- /dev/null +++ b/src/components/treeGrid/component/subColmns.vue @@ -0,0 +1,23 @@ + + + diff --git a/src/components/treeGrid/component/subThead.vue b/src/components/treeGrid/component/subThead.vue new file mode 100644 index 0000000..2251793 --- /dev/null +++ b/src/components/treeGrid/component/subThead.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/src/components/treeGrid/component/subTreeGrid.vue b/src/components/treeGrid/component/subTreeGrid.vue new file mode 100644 index 0000000..aa6284c --- /dev/null +++ b/src/components/treeGrid/component/subTreeGrid.vue @@ -0,0 +1,341 @@ + + + + + diff --git a/src/components/treeGrid/index.vue b/src/components/treeGrid/index.vue new file mode 100644 index 0000000..9055ee3 --- /dev/null +++ b/src/components/treeGrid/index.vue @@ -0,0 +1,54 @@ + + + + diff --git a/src/components/upload/Custom.vue b/src/components/upload/Custom.vue new file mode 100644 index 0000000..4b0adef --- /dev/null +++ b/src/components/upload/Custom.vue @@ -0,0 +1,108 @@ + + + + diff --git a/src/components/upload/Multiple.vue b/src/components/upload/Multiple.vue new file mode 100644 index 0000000..bb8ffe9 --- /dev/null +++ b/src/components/upload/Multiple.vue @@ -0,0 +1,93 @@ + + diff --git a/src/components/upload/Single.vue b/src/components/upload/Single.vue new file mode 100644 index 0000000..300f54e --- /dev/null +++ b/src/components/upload/Single.vue @@ -0,0 +1,75 @@ + + + diff --git a/src/components/upload/mod/fileBtn.vue b/src/components/upload/mod/fileBtn.vue new file mode 100644 index 0000000..568eb1c --- /dev/null +++ b/src/components/upload/mod/fileBtn.vue @@ -0,0 +1,51 @@ + + + + \ No newline at end of file diff --git a/src/components/upload/mod/fileListModal.vue b/src/components/upload/mod/fileListModal.vue new file mode 100644 index 0000000..c6764a2 --- /dev/null +++ b/src/components/upload/mod/fileListModal.vue @@ -0,0 +1,177 @@ + + + + + \ No newline at end of file diff --git a/src/components/upload/upload.less b/src/components/upload/upload.less new file mode 100644 index 0000000..32abbb0 --- /dev/null +++ b/src/components/upload/upload.less @@ -0,0 +1,40 @@ +.upload-list { + display: inline-block; + width: 100px; + height: 100px; + text-align: center; + line-height: 100px; + border: 1px solid transparent; + border-radius: 4px; + overflow: hidden; + background: #fff; + position: relative; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); + margin-right: 4px; + + img { + width: 100%; + height: 100%; + } +} + +.upload-list-cover { + display: none; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, 0.6); +} + +.upload-list:hover .upload-list-cover { + display: block; +} + +.upload-list-cover i { + color: #fff; + font-size: 20px; + cursor: pointer; + margin: 0 2px; +} diff --git a/src/config/index.js b/src/config/index.js new file mode 100644 index 0000000..45785e3 --- /dev/null +++ b/src/config/index.js @@ -0,0 +1,9 @@ +// 框架默认配置(使用时会被项目配置覆盖) +module.exports = { + title: "Admin Framework", + homeName: "首页", + apiUrl: "/api/", + cookieExpires: 1, + uploadMaxLimitSize: 10 +} + diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..077943c --- /dev/null +++ b/src/index.js @@ -0,0 +1,335 @@ +/** + * Admin Framework - 通用后台管理系统框架 + * 版本: 1.0.0 + * + * 功能包含: + * - 系统管理功能 (sys_*) + * - 用户登录和权限管理 + * - 动态路由管理 + * - 主布局和页面布局 + * - 全局组件 + * - 工具库 + * - Vuex 状态管理 + */ + +// ==================== 工具库 ==================== +import uiTool from './utils/uiTool' +import http from './utils/http' +import * as tools from './utils/tools' + +// ==================== Store 模块 ==================== +import storeModules, { userModule, appModule } from './store' +import { setUserServer } from './store/user' +import { setParamSetupServer } from './store/app' + +// ==================== 路由配置 ==================== +import routerConfig, { createBaseRoutes, setupRouterGuards } from './router' + +// ==================== 系统页面 ==================== +// system 页面 +import SysLog from './views/system/sys_log.vue' +import SysParamSetup from './views/system/sys_param_setup.vue' +import SysRole from './views/system/sys_role.vue' +import SysUser from './views/system/sys_user.vue' + +// system_high 页面 +import SysControl from './views/system_high/sys_control.vue' +import SysMenu from './views/system_high/sys_menu.vue' +import SysTitle from './views/system_high/sys_title.vue' + +// 登录和错误页面 +import LoginPage from './views/login/login.vue' +import Page401 from './views/error-page/401.vue' +import Page404 from './views/error-page/404.vue' +import Page500 from './views/error-page/500.vue' + +// 布局组件 +import Main from './components/main' +import ParentView from './components/parent-view' + +// ==================== 系统 API ==================== +// system API +import * as systemApi from './api/system' +// system_high API +import * as systemHighApi from './api/system_high' + +// 自动设置 API +setUserServer(systemApi.userServer) +setParamSetupServer(systemHighApi.paramSetupServer) + +// ==================== 框架类 ==================== +class AdminFramework { + constructor() { + this.version = '1.0.0' + this.installed = false + this.config = {} + this.store = null + this.router = null + + // 导出工具 + this.tools = tools + this.uiTool = uiTool + this.http = http + + // 导出 Store 模块 + this.storeModules = storeModules + this.userModule = userModule + this.appModule = appModule + + // 导出路由配置 + this.createBaseRoutes = createBaseRoutes + this.setupRouterGuards = setupRouterGuards + + // 导出组件 + this.Main = Main + this.ParentView = ParentView + this.LoginPage = LoginPage + this.Page401 = Page401 + this.Page404 = Page404 + this.Page500 = Page500 + + // 导出系统页面 + this.SysLog = SysLog + this.SysParamSetup = SysParamSetup + this.SysRole = SysRole + this.SysUser = SysUser + this.SysControl = SysControl + this.SysMenu = SysMenu + this.SysTitle = SysTitle + + // 导出 API + this.systemApi = systemApi + this.systemHighApi = systemHighApi + } + + /** + * Vue 插件安装方法 - 自动完成所有初始化 + * @param {Object} Vue - Vue 实例 + * @param {Object} options - 配置选项 + * @param {Object} options.config - 应用配置 + * @param {Object} options.ViewUI - ViewUI 实例(可选,框架会自动处理) + * @param {Object} options.VueRouter - VueRouter 实例(可选) + * @param {Object} options.Vuex - Vuex 实例(可选) + * @param {Function} options.createPersistedState - vuex-persistedstate(可选) + */ + install(Vue, options = {}) { + if (this.installed) return + this.installed = true + + const { config = {}, ViewUI, VueRouter, Vuex, createPersistedState } = options + this.config = config + + // 自动注册 ViewUI + if (ViewUI) { + Vue.use(ViewUI) + } + + // 挂载全局配置和工具 + Vue.prototype.$config = config + Vue.prototype.$http = http + Vue.prototype.$tools = tools + Vue.prototype.$uiTool = uiTool + + // 自动注册全局组件 + this.registerGlobalComponents(Vue) + + // 如果提供了 Vuex,自动创建 Store + if (Vuex && !this.store) { + this.store = this.createStore(Vuex, {}, createPersistedState) + // 自动初始化 HTTP + http.init(config, this.store) + } + + // 如果提供了 VueRouter,自动创建 Router + if (VueRouter && !this.router) { + this.router = this.createRouter(VueRouter, { + Main, + ParentView, + LoginPage, + Page401, + Page404, + Page500 + }, [], ViewUI) + + // 自动添加动态路由 + const mainRoutes = this.getRoutes({ Main, ParentView, Page404 }) + this.router.addRoutes([mainRoutes]) + } + } + + /** + * 自动注册全局组件 + */ + registerGlobalComponents(Vue) { + // 注册布局组件 + Vue.component('Main', Main) + Vue.component('ParentView', ParentView) + + // 注册错误页面 + Vue.component('Page401', Page401) + Vue.component('Page404', Page404) + Vue.component('Page500', Page500) + + // 注册登录页面 + Vue.component('LoginPage', LoginPage) + } + + /** + * 初始化 HTTP 配置 + * @param {Object} config - HTTP 配置 + * @param {Object} store - Vuex Store 实例 + */ + initHttp(config, store) { + http.init(config, store) + this.store = store + } + + /** + * 设置用户服务实例 + * @param {Object} userServer - 用户服务实例 + */ + setUserServer(userServer) { + setUserServer(userServer) + } + + /** + * 设置参数设置服务实例 + * @param {Object} paramSetupServer - 参数设置服务实例 + */ + setParamSetupServer(paramSetupServer) { + setParamSetupServer(paramSetupServer) + } + + /** + * 创建路由实例 + * @param {Object} Router - VueRouter 类 + * @param {Object} components - 组件对象 + * @param {Array} customRoutes - 自定义路由 + * @param {Object} ViewUI - ViewUI 实例 + * @param {String} homeName - 首页名称 + * @returns {Object} router 实例 + */ + createRouter(Router, components = {}, customRoutes = [], ViewUI, homeName = 'home') { + const { LoginPage, Page401, Page404, Page500 } = components + + if (!LoginPage || !Page401 || !Page404 || !Page500) { + console.error('Missing required page components') + return null + } + + const baseRoutes = createBaseRoutes(LoginPage, Page401, Page404, Page500) + + const router = new Router({ + routes: [...baseRoutes, ...customRoutes], + mode: 'hash' + }) + + if (ViewUI) { + setupRouterGuards(router, ViewUI, homeName) + } + + return router + } + + /** + * 创建 Store 实例 + * @param {Object} Vuex - Vuex 类 + * @param {Object} customModules - 自定义模块 + * @param {Object} createPersistedState - vuex-persistedstate 插件 + * @returns {Object} store 实例 + */ + createStore(Vuex, customModules = {}, createPersistedState) { + const store = new Vuex.Store({ + modules: { + user: userModule, + app: appModule, + ...customModules + }, + plugins: createPersistedState ? [ + createPersistedState({ + storage: window.localStorage + }) + ] : [] + }) + + this.store = store + return store + } + + /** + * 获取动态路由 + * @param {Object} components - 组件对象 + * @returns {Object} 主路由配置 + */ + getRoutes(components = {}) { + const { Main, ParentView, Page404 } = components + + if (!Main || !ParentView || !Page404) { + console.error('Missing required layout components') + return null + } + + return uiTool.getRoutes(Main, ParentView, Page404) + } + + /** + * 注册全局组件 + * @param {Object} Vue - Vue 实例 + * @param {Object} components - 组件对象 + */ + registerComponents(Vue, components = {}) { + Object.keys(components).forEach(name => { + Vue.component(name, components[name]) + }) + } +} + +// ==================== 创建实例并导出 ==================== +const framework = new AdminFramework() + +// 默认导出框架实例 +export default framework + +// 按需导出 +export { + // 工具库 + tools, + uiTool, + http, + + // Store 模块 + storeModules, + userModule, + appModule, + + // 路由配置 + createBaseRoutes, + setupRouterGuards, + + // 系统页面 + SysLog, + SysParamSetup, + SysRole, + SysUser, + SysControl, + SysMenu, + SysTitle, + + // 登录和错误页面 + LoginPage, + Page401, + Page404, + Page500, + + // 布局组件 + Main, + ParentView, + + // 系统 API + systemApi, + systemHighApi, + + // 框架类 + AdminFramework +} + diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..d938180 --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,68 @@ +import { getToken } from '../utils/tools' + +// 基础路由配置(不包含具体组件,需要在使用时注入) +export const createBaseRoutes = (LoginPage, Page401, Page404, Page500) => { + return [ + { + path: '/login', + name: 'login', + component: LoginPage + }, + { + path: '/401', + name: 'error_401', + component: Page401 + }, + { + path: '/404', + name: 'error_404', + component: Page404 + }, + { + path: '/500', + name: 'error_500', + component: Page500 + }, + { + path: '*', + name: 'error_404_wildcard', + component: Page404 + } + ] +} + +// 路由守卫配置 +export const setupRouterGuards = (router, ViewUI, homeName = 'home') => { + router.beforeEach((to, from, next) => { + const token = getToken() + ViewUI.LoadingBar.start() + + if (to.name === 'view_log') { + next() + return + } + + if (!token && to.name !== 'login') { + next({ name: 'login' }) + } else if (!token && to.name === 'login') { + next() + } else if (token && to.name === 'login') { + next({ name: homeName }) + } else { + next() + } + }) + + router.afterEach(to => { + ViewUI.LoadingBar.finish() + window.scrollTo(0, 0) + }) + + return router +} + +export default { + createBaseRoutes, + setupRouterGuards +} + diff --git a/src/store/app.js b/src/store/app.js new file mode 100644 index 0000000..b10ad39 --- /dev/null +++ b/src/store/app.js @@ -0,0 +1,63 @@ +import { getBreadCrumbList, getHomeRoute } from '../utils/tools' + +// 注意:这里的 paramSetupServer 需要在使用时注入 +let paramSetupServerInstance = null + +export const setParamSetupServer = (server) => { + paramSetupServerInstance = server +} + +export default { + namespaced: true, + state: { + sysFormModel: { title: '', logoUrl: '' }, + breadCrumbList: [], + homeRoute: {} + }, + getters: { + sysFormModel: state => state.sysFormModel, + breadCrumbList: state => state.breadCrumbList, + homeRoute: state => state.homeRoute + }, + mutations: { + setBreadCrumb(state, route) { + state.breadCrumbList = getBreadCrumbList(route, state.homeRoute) + }, + setHomeRoute(state, routes) { + state.homeRoute = getHomeRoute(routes, 'home') + }, + setSysTitle(state, reload) { + state.sysFormModel = reload + } + }, + actions: { + async getSysTitle({ state, commit }, { defaultTitle = '智能代码平台', defaultLogo = '' }) { + let formModel = { + title: defaultTitle, + logoUrl: defaultLogo + } + + if (!paramSetupServerInstance) { + commit('setSysTitle', formModel) + return + } + + try { + let res1 = await paramSetupServerInstance.getOne('sys_title') + if (res1.data) { + formModel.title = res1.data.value + document.title = res1.data.value + } + let res2 = await paramSetupServerInstance.getOne('sys_logo') + if (res2.data) { + formModel.logoUrl = res2.data.value + } + } catch (error) { + console.error('Failed to get sys title:', error) + } + + commit('setSysTitle', formModel) + } + } +} + diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 0000000..e6756aa --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,10 @@ +import userModule from './user' +import appModule from './app' + +export { userModule, appModule } + +export default { + user: userModule, + app: appModule +} + diff --git a/src/store/user.js b/src/store/user.js new file mode 100644 index 0000000..12e07cb --- /dev/null +++ b/src/store/user.js @@ -0,0 +1,103 @@ +import { setToken, getToken } from '../utils/tools' +import uiTool from '../utils/uiTool' + +// 注意:这里的 userServer 需要在使用时注入 +let userServerInstance = null + +export const setUserServer = (server) => { + userServerInstance = server +} + +export default { + namespaced: true, + state: { + userName: '', + avatorImgPath: '', + token: getToken(), + authorityMenus: [], + menuList: [] + }, + mutations: { + setAvator(state, avatorPath) { + state.avatorImgPath = avatorPath + }, + setUserName(state, userName) { + state.userName = userName + localStorage.userName = state.userName + }, + setToken(state, token) { + state.token = token + setToken(token) + }, + setAuthorityMenus(state, menus) { + state.authorityMenus = menus + localStorage.authorityMenus = menus + }, + setMenuList(state, menus) { + state.menuList = menus + } + }, + getters: { + avatorImgPath: state => state.avatorImgPath, + userName(state) { + if (!state.userName) { + state.userName = localStorage.userName + } + return state.userName + }, + menuList: state => state.menuList + }, + actions: { + async setAuthorityMenus({ state, commit }, { Main, ParentView, Page404 }) { + if (!userServerInstance) { + console.error('userServer not initialized') + return + } + + let res = await userServerInstance.authorityMenus() + let authorityMenus = res.data + commit('setAuthorityMenus', JSON.stringify(authorityMenus)) + + let mainMenu = uiTool.getRoutes(Main, ParentView, Page404) + commit('setMenuList', mainMenu.children) + }, + async handleLogin({ state, commit, dispatch }, { userFrom, Main, ParentView, Page404 }) { + if (!userServerInstance) { + throw new Error('userServer not initialized') + } + + let promise = new Promise(async (resolve, reject) => { + try { + let res = await userServerInstance.login(userFrom) + + let token = res.data.token + let name = res.data.user.name.trim() + + if (res.data.shop) { + let shopId = res.data.shop.id + commit('shop/setShopId', shopId, { root: true }) + } + + commit('setUserName', name) + commit('setToken', token) + + await dispatch('setAuthorityMenus', { Main, ParentView, Page404 }) + resolve(res) + } catch (error) { + reject(error) + } + }) + + return promise + }, + async handleLogOut({ state, commit }, vue) { + commit('setToken', '') + commit('setAuthorityMenus', '[]') + if (state.shop) { + commit('shop/setShopId', '', { root: true }) + } + window.location.reload() + } + } +} + diff --git a/src/utils/http.js b/src/utils/http.js new file mode 100644 index 0000000..37f9b72 --- /dev/null +++ b/src/utils/http.js @@ -0,0 +1,219 @@ +import axios from 'axios' +import { formatDate } from './tools' + +class Http { + constructor() { + this.config = { + apiUrl: '', + timeout: 300000 + } + this.store = null + } + + init(config, store) { + this.config = { ...this.config, ...config } + this.store = store + } + + baseUrl() { + return this.config.apiUrl + } + + ImgSrc(src) { + return this.baseUrl() + src + } + + getHttpInstance(config) { + let defaultConfig = { + timeout: this.config.timeout, + headers: {}, + baseURL: this.baseUrl(), + responseType: 'json', + transformResponse: [ + function(data) { + return data + } + ] + } + let newConfig = Object.assign({}, defaultConfig, config) + + if (this.store && this.store.state.user) { + newConfig.headers['admin-token'] = this.store.state.user.token + } + + let instance = axios.create(newConfig) + + instance.interceptors.request.use( + config => { + return config + }, + error => { + return Promise.reject(error) + } + ) + + instance.interceptors.response.use( + response => { + if (response.status === 200) { + if (response.data && response.data.code === 0) { + return response + } else { + this.hideLoad() + let msg = response.data.message + this.showError(msg) + return Promise.reject(msg) + } + } else { + this.hideLoad() + return Promise.reject(response) + } + }, + error => { + this.hideLoad() + + if (error && error.response && error.response.status === 401) { + if (this.store) { + this.store.commit('user/setToken', '') + } + if (window.rootVue && window.rootVue.$router) { + window.rootVue.$router.push({ name: 'login' }) + } + return Promise.reject(error) + } + + let msg = error.message + if (msg.indexOf('Network Error') > -1) { + msg = '网络错误,请刷新后重试' + } else if (msg.indexOf('timeout of') > -1) { + msg = '请求超时,请稍后后重试' + } + this.showError(msg) + return Promise.reject(error) + } + ) + + return instance + } + + showLoad() { + let loadWarp = document.getElementById('spin-box-one') + if (loadWarp) { + loadWarp.style.display = 'block' + } + } + + hideLoad() { + let loadWarp = document.getElementById('spin-box-one') + if (loadWarp) { + loadWarp.style.display = 'none' + } + } + + showError(msg) { + if (window.rootVue && window.rootVue.$Message) { + window.rootVue.$Message.error({ content: msg, duration: 3 }) + } + } + + formatParamete(param) { + param = param || {} + + if (param) { + for (let key in param) { + if (param[key] && param[key].getFullYear) { + param[key] = formatDate(param[key], 'YYYY-MM-DD HH:mm:ss') + } + } + } + + param = JSON.parse(JSON.stringify(param)) + return param + } + + formatFormDataParam(param) { + let formData = new FormData() + Object.keys(param).forEach(key => { + formData.append(key, param[key]) + }) + return formData + } + + async get(url, param, config) { + let instance = this.getHttpInstance() + param = this.formatParamete(param) + let promise = new Promise((resolve, reject) => { + if (!config || !config.hideLoad) { + this.showLoad() + } + + instance.get(url, { params: param }).then(async response => { + this.hideLoad() + resolve(response.data) + }).catch(error => { + reject(error) + }) + }) + + return promise + } + + async postFormData(url, data) { + let instance = this.getHttpInstance({ + headers: { 'Content-Type': 'application/x-www-form-urlencoded' } + }) + let param = this.formatFormDataParam(data) + let promise = new Promise((resolve, reject) => { + instance.post(url, param).then(response => { + this.hideLoad() + resolve(response.data) + }).catch(error => { + reject(error) + }) + }) + return promise + } + + async post(url, param, config) { + let instance = this.getHttpInstance(config) + param = this.formatParamete(param) + + let promise = new Promise((resolve, reject) => { + this.showLoad() + instance.post(url, param).then(response => { + this.hideLoad() + resolve(response.data) + }).catch(error => { + reject(error) + }) + }) + + return promise + } + + async fileExport(url, param) { + let formData = this.formatFormDataParam(param) + + let config = { + headers: { + 'admin-token': this.store ? this.store.state.user.token : '', + 'Content-Type': 'application/json' + }, + baseURL: this.baseUrl(), + url: url, + responseType: 'blob' + } + let res = await axios.post(url, formData, config) + const filename = res.headers.filename + const a = document.createElement('a') + const href = window.URL.createObjectURL(res.data) + a.href = href + a.download = filename + a.click() + window.URL.revokeObjectURL(url) + } +} + +const http = new Http() + +export default http + diff --git a/src/utils/tools.js b/src/utils/tools.js new file mode 100644 index 0000000..988c2e0 --- /dev/null +++ b/src/utils/tools.js @@ -0,0 +1,502 @@ +// 数组工具方法 +export const forEach = (arr, fn) => { + if (!arr.length || !fn) return + let i = -1 + let len = arr.length + while (++i < len) { + let item = arr[i] + fn(item, i, arr) + } +} + +export const reverse = (arr) => { + let arrResult = [] + let j = 0 + for (let i = arr.length - 1; i >= 0; i--, j++) { + arrResult[j] = arr[i] + } + return arrResult +} + +import dayjs from 'dayjs' +import Cookies from 'js-cookie' + +export const getIntersection = (arr1, arr2) => { + let len = Math.min(arr1.length, arr2.length) + let i = -1 + let res = [] + while (++i < len) { + const item = arr2[i] + if (arr1.indexOf(item) > -1) res.push(item) + } + return res +} + +export const getUnion = (arr1, arr2) => { + return Array.from(new Set([...arr1, ...arr2])) +} + +export const hasOneOf = (targetarr, arr) => { + return targetarr.some(_ => arr.indexOf(_) > -1) +} + +export function oneOf(value, validList) { + for (let i = 0; i < validList.length; i++) { + if (value === validList[i]) { + return true + } + } + return false +} + +export const hasKey = (obj, key) => { + if (key) return key in obj + else { + let keysArr = Object.keys(obj) + return keysArr.length + } +} + +// 对象工具方法 +export const objEqual = (obj1, obj2) => { + const keysArr1 = Object.keys(obj1) + const keysArr2 = Object.keys(obj2) + if (keysArr1.length !== keysArr2.length) return false + else if (keysArr1.length === 0 && keysArr2.length === 0) return true + else return !keysArr1.some(key => obj1[key] !== obj2[key]) +} + +export const isObjectEqual = (a, b) => { + let isEqual = true + for (var key in a) { + if (a[key] !== b[key]) { + isEqual = false + break + } + } + return isEqual +} + +// 文件下载工具方法 +export const downStream = res => { + const fileName = new Date().getTime() + '.xlsx' + let blob = new Blob([res.data]) + let downloadElement = document.createElement('a') + let href = window.URL.createObjectURL(blob) + downloadElement.href = href + downloadElement.download = fileName + document.body.appendChild(downloadElement) + downloadElement.click() + document.body.removeChild(downloadElement) + window.URL.revokeObjectURL(href) +} + +export const downloadImg = (url, name) => { + const aLink = document.createElement('a') + aLink.download = name + aLink.href = url + aLink.dispatchEvent(new MouseEvent('click', {})) +} + +// 数据验证工具方法 +export const isNullorEmpty = (obj) => { + if (typeof obj === 'undefined' || obj == null || obj === '') { + return true + } + return false +} + +export const removeEmptyObject = (data) => { + data = data || {} + for (let index in data) { + if (data[index] === '' || data[index] === '全部') { + delete data[index] + } + } + return data +} + +// 随机数生成工具方法 +export const generateUUID = () => { + var d = new Date().getTime() + if (window.performance && typeof window.performance.now === 'function') { + d += performance.now() + } + var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace( + /[xy]/g, + function(c) { + var r = (d + Math.random() * 16) % 16 | 0 + d = Math.floor(d / 16) + return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16) + } + ) + return uuid +} + +export const createCode = (codeLength = 4) => { + var code = '' + var random = '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]' + random = JSON.parse(random) + for (var i = 0; i < codeLength; i++) { + var index = Math.floor(Math.random() * 36) + code += random[index] + } + return code +} + +export const getRandomNum = (minNum, maxNum) => { + switch (arguments.length) { + case 1: + return parseInt(Math.random() * minNum + 1, 10) + case 2: + return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10) + default: + return 0 + } +} + +// 数据转换工具方法 +export const toJson = (data) => { + return JSON.parse(JSON.stringify(data)) +} + +// Cookie 工具方法 +export const setCookie = (name, value) => { + var exdate = new Date() + var expiredays = 7 + exdate.setDate(exdate.getDate() + expiredays) + document.cookie = + name + + '=' + + escape(value) + + (expiredays == null ? '' : ';expires=' + exdate.toGMTString()) +} + +export const getCookie = (name) => { + if (document.cookie.length > 0) { + var c_start = document.cookie.indexOf(name + '=') + if (c_start !== -1) { + c_start = c_start + name.length + 1 + var c_end = document.cookie.indexOf(';', c_start) + if (c_end === -1) c_end = document.cookie.length + return unescape(document.cookie.substring(c_start, c_end)) + } + } + return '' +} + +// 日期格式化工具方法 +export const formatDate = (val, fmt) => { + val = val || new Date() + if (!isNullorEmpty(val)) { + fmt = fmt || 'YYYY-MM-DD' + if (!val.getDate) { + val = new Date(val) + } + var date = dayjs(val).format(fmt) + return date + } + return val +} + +// 组件高度计算工具方法 +export const getComponentHeight = (diffHegiht) => { + let curBodyHeight = document.documentElement.clientHeight + let height = curBodyHeight - diffHegiht + return height +} + +// URL 参数获取工具方法 +export const getUrlParam = (key) => { + var index = window.location.href.indexOf('?') + 1 + var reg = new RegExp('(^|&)' + key + '=([^&]*)(&|$)') + var r = window.location.href.substr(index).match(reg) + if (r != null) return unescape(r[2]) + return null +} + +// 日期验证工具方法 +export const isDate = (date) => { + var reDateTime = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/ + var isDateTime = reDateTime.test(date) + return isDateTime +} + +// 安全检查字符串工具方法 +export const getCheckString = (value) => { + let curTemp = !isNullorEmpty(value) ? value : '' + return curTemp +} + +// Token 管理工具方法 +export const TOKEN_KEY = 'token' +export const MENU_KEY = 'authoritymenu' + +export const setToken = (token, cookieExpires = 7) => { + Cookies.set(TOKEN_KEY, token, { + expires: cookieExpires + }) +} + +export const getToken = () => { + const token = Cookies.get(TOKEN_KEY) + if (token) return token + else return false +} + +// 路由和菜单工具方法 +export const hasChild = item => { + return item.children && item.children.length !== 0 +} + +const showThisMenuEle = (item, access) => { + if (item.meta && item.meta.access && item.meta.access.length) { + if (hasOneOf(item.meta.access, access)) return true + else return false + } else return true +} + +export const getMenuByRouter = (list, access) => { + let res = [] + forEach(list, item => { + if (!item.meta || (item.meta && !item.meta.hideInMenu)) { + let obj = { + icon: (item.meta && item.meta.icon) || '', + name: item.name, + meta: item.meta + } + if ( + (hasChild(item) || (item.meta && item.meta.showAlways)) && + showThisMenuEle(item, access) + ) { + obj.children = getMenuByRouter(item.children, access) + } + if (item.meta && item.meta.href) obj.href = item.meta.href + if (showThisMenuEle(item, access)) res.push(obj) + } + }) + return res +} + +export const getBreadCrumbList = (route, homeRoute) => { + let routeMetched = route.matched + + let res = routeMetched + .filter(item => { + return item.meta === undefined || !item.meta.hideInBread + }) + .map(item => { + let meta = { ...item.meta } + if (meta.title && typeof meta.title === 'function') { + meta.__titleIsFunction__ = true + meta.title = meta.title(route) + } + let obj = { + icon: (item.meta && item.meta.icon) || '', + name: item.name, + meta: meta + } + + if (item.name === homeRoute.name) { + obj.to = homeRoute.path + } + return obj + }) + + res = res.filter(item => { + return !item.meta.hideInMenu + }) + + res.splice(0, 1) + + return [...res] +} + +export const getRouteTitleHandled = route => { + let router = { ...route } + let meta = { ...route.meta } + let title = '' + if (meta.title) { + if (typeof meta.title === 'function') { + meta.__titleIsFunction__ = true + title = meta.title(router) + } else title = meta.title + } + meta.title = title + router.meta = meta + return router +} + +export const showTitle = (item, vm) => { + let title = item.name + if (!title) return + return title +} + +export const setTagNavListInLocalstorage = list => { + localStorage.tagNaveList = JSON.stringify(list) +} + +export const getTagNavListFromLocalstorage = () => { + const list = localStorage.tagNaveList + return list ? JSON.parse(list) : [] +} + +export const getHomeRoute = (routers, homeName = 'home') => { + let homeRoute = routers.find(item => { + return item.name === homeName + }) + if (homeRoute) { + delete homeRoute.children + delete homeRoute.component + } + return homeRoute || {} +} + +export const getNewTagList = (list, newRoute) => { + const { name, path, meta } = newRoute + let newList = [...list] + if (newList.findIndex(item => item.name === name) >= 0) return newList + else { + newList.push({ name, path, meta }) + } + return newList +} + +const hasAccess = (access, route) => { + if (route.meta && route.meta.access) + return hasOneOf(access, route.meta.access) + else return true +} + +export const canTurnTo = (name, access, routes) => { + const routePermissionJudge = list => { + return list.some(item => { + if (item.children && item.children.length) { + return routePermissionJudge(item.children) + } else if (item.name === name) { + return hasAccess(access, item) + } + }) + } + + return routePermissionJudge(routes) +} + +export const getParams = url => { + const keyValueArr = url.split('?')[1].split('&') + let paramObj = {} + keyValueArr.forEach(item => { + const keyValue = item.split('=') + paramObj[keyValue[0]] = keyValue[1] + }) + return paramObj +} + +export const getNextRoute = (list, route) => { + let res = {} + if (list.length === 2) { + res = getHomeRoute(list) + } else { + const index = list.findIndex(item => routeEqual(item, route)) + if (index === list.length - 1) res = list[list.length - 2] + else res = list[index + 1] + } + return res +} + +export const routeEqual = (route1, route2) => { + const params1 = route1.params || {} + const params2 = route2.params || {} + const query1 = route1.query || {} + const query2 = route2.query || {} + return ( + route1.name === route2.name && + objEqual(params1, params2) && + objEqual(query1, query2) + ) +} + +export const localSave = (key, value) => { + localStorage.setItem(key, value) +} + +export const localRead = key => { + return localStorage.getItem(key) || '' +} + +export const filterMenu = menu => { + if (menu && menu.length > 0) { + menu = menu.filter(p => { + return !(p.meta && p.meta.isMenu === false) + }) + menu.forEach(p => { + if (p.children && p.children.length > 0) { + p.children = filterMenu(p.children) + } + }) + return menu + } + return menu +} + +// DOM 操作工具方法 +export const findNodeUpperByClasses = (ele, classes) => { + let parentNode = ele.parentNode + if (parentNode) { + let classList = parentNode.classList + if (classList && classes.every(className => classList.contains(className))) { + return parentNode + } else { + return findNodeUpperByClasses(parentNode, classes) + } + } +} + +export const scrollTop = (el, from = 0, to, duration = 500, endCallback) => { + if (!window.requestAnimationFrame) { + window.requestAnimationFrame = ( + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.msRequestAnimationFrame || + function (callback) { + return window.setTimeout(callback, 1000/60) + } + ) + } + const difference = Math.abs(from - to) + const step = Math.ceil(difference / duration * 50) + + function scroll (start, end, step) { + if (start === end) { + endCallback && endCallback() + return + } + + let d = (start + step > end) ? end : start + step + if (start > end) { + d = (start - step < end) ? end : start - step + } + + if (el === window) { + window.scrollTo(d, d) + } else { + el.scrollTop = d + } + window.requestAnimationFrame(() => scroll(d, end, step)) + } + scroll(from, to, step) +} + +export const on = (element, event, handler) => { + if (element && event && handler) { + element.addEventListener(event, handler, false) + } +} + +export const off = (element, event, handler) => { + if (element && event && handler) { + element.removeEventListener(event, handler, false) + } +} + diff --git a/src/utils/uiTool.js b/src/utils/uiTool.js new file mode 100644 index 0000000..c62e3f7 --- /dev/null +++ b/src/utils/uiTool.js @@ -0,0 +1,198 @@ +import http from './http' + +export default class uiTool { + static setRem() { + let whdef = 100 / 1920 + let bodyWidth = document.body.clientWidth + if (bodyWidth < 1360) { + bodyWidth = 1360 + } + + let rem = bodyWidth * whdef + document.documentElement.style.fontSize = rem + 'px' + console.log('自适应html字体大小', parseInt(rem)) + console.log('自适应缩放比列', (rem / 100).toFixed(3)) + window.$whdef = rem + } + + static getImgSrc(src) { + if (src) { + return http.baseUrl() + src + } else { + return '/assets/img/noImg.png' + } + } + + static getBtn(h, options) { + let rets = [] + if (!options) { + options = [options] + } + + options.forEach(item => { + rets.push( + h( + 'Button', + { + props: { + type: 'text', + ghost: true, + loading: item.loading + }, + style: { + margin: '2px', + color: '#2d8cf0' + }, + on: { + click: () => { + item.click && item.click() + } + } + }, + item.title + ) + ) + }) + + return h('div', { style: { margin: '5px' } }, rets) + } + + static getDropdown(h, items) { + let btns = [] + if (items && items.length > 0) { + items.forEach(item => { + btns.push( + h( + 'DropdownItem', + { + on: { + click: () => { + item.click && item.click() + } + } + }, + item.title + ) + ) + }) + } + + return h('Dropdown', {}, [ + h('a', {}, ['更多', h('Icon', { props: { type: 'ios-arrow-down' } })]), + h('DropdownMenu', { slot: 'list' }, btns) + ]) + } + + static delConfirm(callback) { + if (window.rootVue && window.rootVue.$Modal) { + window.rootVue.$Modal.confirm({ + title: '温馨提示', + content: '

你确定删除吗?

', + onOk: () => { + callback && callback() + } + }) + } + } + + static showConfirm({ title = '温馨提示', content = '内容' }, callback) { + if (window.rootVue && window.rootVue.$Modal) { + window.rootVue.$Modal.confirm({ + title, + content, + onOk: () => { + callback && callback() + } + }) + } + } + + static subTree(curTree, tree, callback) { + if (curTree && curTree.length > 0) { + curTree.forEach(p => { + let childrenTree = tree.filter(p2 => p.id === p2.parent_id) + if (childrenTree) { + let subTree = uiTool.subTree(childrenTree, tree, callback) + p.children = subTree || [] + } + }) + + if (callback) { + return curTree.map(p => { + return callback(p) + }) + } + + return curTree + } + + return [] + } + + static transformTree(tree, callback) { + let rootTree = tree.filter(p => p.parent_id === 0) + let curTrees = uiTool.subTree(rootTree, tree, callback) + return curTrees + } + + static menuToRoute(menus, ParentView, Page404) { + if (menus && menus.length > 0) { + menus.forEach(item => { + if (item.type === '菜单') { + item.component = ParentView + } else if (item.type === '页面' || item.type === '功能') { + try { + let componentName = item.component + // 这里需要在使用时动态导入 + item.componentPath = componentName + item.component = Page404 + } catch (e) { + item.component = Page404 + } + } else { + item.component = ParentView + } + + item.meta = { + icon: item.icon, + isMenu: item.is_show_menu, + type: item.type + } + + if (item.children && item.children.length > 0) { + item.children = uiTool.menuToRoute(item.children, ParentView, Page404) + } + }) + return menus + } + return [] + } + + static getRoutes(Main, ParentView, Page404) { + let mainRoute = { + path: '/', + name: '主视图', + redirect: '/home', + component: Main, + meta: { title: '首页', notCache: true }, + children: [] + } + + if ( + localStorage.authorityMenus && + localStorage.authorityMenus !== 'undefined' + ) { + let authorityMenus = JSON.parse(localStorage.authorityMenus) || [] + + if (authorityMenus && authorityMenus.length > 0) { + let menus = uiTool.transformTree(authorityMenus) + let curRoutes = uiTool.menuToRoute(menus, ParentView, Page404) + + mainRoute.children = curRoutes + } + } + + return mainRoute + } +} + diff --git a/src/views/error-page/401.vue b/src/views/error-page/401.vue new file mode 100644 index 0000000..8ea2a0f --- /dev/null +++ b/src/views/error-page/401.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/views/error-page/404.vue b/src/views/error-page/404.vue new file mode 100644 index 0000000..edf8a9f --- /dev/null +++ b/src/views/error-page/404.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/views/error-page/500.vue b/src/views/error-page/500.vue new file mode 100644 index 0000000..b6752a0 --- /dev/null +++ b/src/views/error-page/500.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/views/error-page/back-btn-group.vue b/src/views/error-page/back-btn-group.vue new file mode 100644 index 0000000..729a03d --- /dev/null +++ b/src/views/error-page/back-btn-group.vue @@ -0,0 +1,38 @@ + + + diff --git a/src/views/error-page/error-content.vue b/src/views/error-page/error-content.vue new file mode 100644 index 0000000..60c7de1 --- /dev/null +++ b/src/views/error-page/error-content.vue @@ -0,0 +1,30 @@ + + + + diff --git a/src/views/error-page/error.less b/src/views/error-page/error.less new file mode 100644 index 0000000..dd0f20b --- /dev/null +++ b/src/views/error-page/error.less @@ -0,0 +1,46 @@ +.error-page{ + width: 100%; + height: 100%; + position: relative; + background: #f8f8f9; + .content-con{ + width: 700px; + height: 600px; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + img{ + display: block; + width: 100%; + height: 100%; + } + .text-con{ + position: absolute; + left: 0px; + top: 0px; + h4{ + position: absolute; + left: 0px; + top: 0px; + font-size: 80px; + font-weight: 700; + color: #348EED; + } + h5{ + position: absolute; + width: 700px; + left: 0px; + top: 100px; + font-size: 20px; + font-weight: 700; + color: #67647D; + } + } + .back-btn-group{ + position: absolute; + right: 0px; + bottom: 20px; + } + } +} diff --git a/src/views/login/login.less b/src/views/login/login.less new file mode 100644 index 0000000..bed8930 --- /dev/null +++ b/src/views/login/login.less @@ -0,0 +1,29 @@ +.login { + width: 100%; + height: 100%; + background-image: url("../../assets/images/login-bg.jpg"); + background-size: cover; + + position: relative; + &-con { + position: absolute; + right: 160px; + top: 50%; + transform: translateY(-60%); + width: 300px; + &-header { + font-size: 16px; + font-weight: 300; + text-align: center; + padding: 30px 0; + } + .form-con { + padding: 10px 0 0; + } + .login-tip { + font-size: 10px; + text-align: center; + color: #c3c3c3; + } + } +} diff --git a/src/views/login/login.vue b/src/views/login/login.vue new file mode 100644 index 0000000..6076089 --- /dev/null +++ b/src/views/login/login.vue @@ -0,0 +1,83 @@ + + + + + + + diff --git a/src/views/system/sys_log.vue b/src/views/system/sys_log.vue new file mode 100644 index 0000000..ecf4171 --- /dev/null +++ b/src/views/system/sys_log.vue @@ -0,0 +1,176 @@ + + + + + \ No newline at end of file diff --git a/src/views/system/sys_param_setup.vue b/src/views/system/sys_param_setup.vue new file mode 100644 index 0000000..42526c0 --- /dev/null +++ b/src/views/system/sys_param_setup.vue @@ -0,0 +1,111 @@ + + diff --git a/src/views/system/sys_role.vue b/src/views/system/sys_role.vue new file mode 100644 index 0000000..c7ff6d9 --- /dev/null +++ b/src/views/system/sys_role.vue @@ -0,0 +1,149 @@ + + diff --git a/src/views/system/sys_user.vue b/src/views/system/sys_user.vue new file mode 100644 index 0000000..635f58f --- /dev/null +++ b/src/views/system/sys_user.vue @@ -0,0 +1,139 @@ + + diff --git a/src/views/system/wch_cities.vue b/src/views/system/wch_cities.vue new file mode 100644 index 0000000..1021cad --- /dev/null +++ b/src/views/system/wch_cities.vue @@ -0,0 +1,145 @@ + + diff --git a/src/views/system/wch_professions.vue b/src/views/system/wch_professions.vue new file mode 100644 index 0000000..df5d705 --- /dev/null +++ b/src/views/system/wch_professions.vue @@ -0,0 +1,239 @@ + + + diff --git a/src/views/system_high/com/databaseType.vue b/src/views/system_high/com/databaseType.vue new file mode 100644 index 0000000..d56833c --- /dev/null +++ b/src/views/system_high/com/databaseType.vue @@ -0,0 +1,33 @@ + + + + + \ No newline at end of file diff --git a/src/views/system_high/com/frontEndControlType.vue b/src/views/system_high/com/frontEndControlType.vue new file mode 100644 index 0000000..ea953e2 --- /dev/null +++ b/src/views/system_high/com/frontEndControlType.vue @@ -0,0 +1,251 @@ + + + + + \ No newline at end of file diff --git a/src/views/system_high/sys_control.vue b/src/views/system_high/sys_control.vue new file mode 100644 index 0000000..8f09797 --- /dev/null +++ b/src/views/system_high/sys_control.vue @@ -0,0 +1,148 @@ + + + + \ No newline at end of file diff --git a/src/views/system_high/sys_menu.vue b/src/views/system_high/sys_menu.vue new file mode 100644 index 0000000..fbff28c --- /dev/null +++ b/src/views/system_high/sys_menu.vue @@ -0,0 +1,402 @@ + + + + + diff --git a/src/views/system_high/sys_title.vue b/src/views/system_high/sys_title.vue new file mode 100644 index 0000000..6edc255 --- /dev/null +++ b/src/views/system_high/sys_title.vue @@ -0,0 +1,63 @@ + + + + + \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..675124b --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,208 @@ +/** + * Admin Framework Webpack 配置 + * + * 文件命名规则说明: + * + * 1. 图片文件 (images/) + * - SVG 图标: images/svg/[name].[hash:7].svg + * - PNG 图片: images/png/[name].[hash:7].png + * - JPG 图片: images/jpg/[name].[hash:7].jpg + * - GIF 动图: images/gif/[name].[hash:7].gif + * + * 2. 字体文件 (fonts/) + * - WOFF/WOFF2: fonts/woff/[name].[hash:7].woff(2) + * - TTF: fonts/ttf/[name].[hash:7].ttf + * - EOT: fonts/eot/[name].[hash:7].eot + * - OTF: fonts/otf/[name].[hash:7].otf + * + * 3. 媒体文件 (media/) + * - 视频: media/video/[name].[hash:7].mp4/webm/ogg + * - 音频: media/audio/[name].[hash:7].mp3/wav/flac/aac + * + * 4. 数据文件 (data/) + * - JSON: data/[name].[hash:7].json + * + * 5. 其他资源 (assets/) + * - TXT/XML/MD: assets/[name].[hash:7].txt/xml/md + * + * 命名占位符说明: + * - [name]: 原始文件名 + * - [hash:7]: 7 位内容哈希(用于缓存控制) + * - [ext]: 文件扩展名(包含点号) + */ + +const path = require('path') +const { VueLoaderPlugin } = require('vue-loader') + +module.exports = { + mode: 'production', // 明确指定生产模式 + entry: './src/index.js', + output: { + path: path.resolve(__dirname, 'dist'), + filename: 'admin-framework.js', + library: 'AdminFramework', + libraryTarget: 'umd', + libraryExport: 'default', + globalObject: 'typeof self !== \'undefined\' ? self : this', + clean: true // 构建前清理 dist 目录 + }, + externals: { + vue: { + commonjs: 'vue', + commonjs2: 'vue', + amd: 'vue', + root: 'Vue' + }, + 'vue-router': { + commonjs: 'vue-router', + commonjs2: 'vue-router', + amd: 'vue-router', + root: 'VueRouter' + }, + vuex: { + commonjs: 'vuex', + commonjs2: 'vuex', + amd: 'vuex', + root: 'Vuex' + }, + 'view-design': { + commonjs: 'view-design', + commonjs2: 'view-design', + amd: 'view-design', + root: 'iview' + }, + axios: { + commonjs: 'axios', + commonjs2: 'axios', + amd: 'axios', + root: 'axios' + } + }, + module: { + rules: [ + { + test: /\.vue$/, + loader: 'vue-loader' + }, + { + test: /\.js$/, + loader: 'babel-loader', + exclude: /node_modules/ + }, + { + test: /\.css$/, + use: [ + 'vue-style-loader', + 'css-loader' + ] + }, + { + test: /\.less$/, + use: [ + 'vue-style-loader', + 'css-loader', + 'less-loader' + ] + }, + { + // 图片文件:根据文件类型分类存放 + test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, // 小于 10KB 转为 base64 + name: (resourcePath, resourceQuery) => { + // 根据文件扩展名分类 + const ext = path.extname(resourcePath).toLowerCase() + if (ext === '.svg') { + return 'images/svg/[name].[hash:7][ext]' + } else if (ext === '.png') { + return 'images/png/[name].[hash:7][ext]' + } else if (ext === '.jpg' || ext === '.jpeg') { + return 'images/jpg/[name].[hash:7][ext]' + } else if (ext === '.gif') { + return 'images/gif/[name].[hash:7][ext]' + } + return 'images/[name].[hash:7][ext]' + }, + esModule: false + } + }, + { + // 字体文件:根据字体类型分类存放 + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, // 小于 10KB 转为 base64 + name: (resourcePath, resourceQuery) => { + // 根据文件扩展名分类 + const ext = path.extname(resourcePath).toLowerCase() + if (ext === '.woff' || ext === '.woff2') { + return 'fonts/woff/[name].[hash:7][ext]' + } else if (ext === '.ttf') { + return 'fonts/ttf/[name].[hash:7][ext]' + } else if (ext === '.eot') { + return 'fonts/eot/[name].[hash:7][ext]' + } else if (ext === '.otf') { + return 'fonts/otf/[name].[hash:7][ext]' + } + return 'fonts/[name].[hash:7][ext]' + }, + esModule: false + } + }, + { + // 媒体文件:视频和音频 + test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: (resourcePath, resourceQuery) => { + const ext = path.extname(resourcePath).toLowerCase() + if (['.mp4', '.webm', '.ogg'].includes(ext)) { + return 'media/video/[name].[hash:7][ext]' + } else if (['.mp3', '.wav', '.flac', '.aac'].includes(ext)) { + return 'media/audio/[name].[hash:7][ext]' + } + return 'media/[name].[hash:7][ext]' + }, + esModule: false + } + }, + { + // JSON 文件 + test: /\.json$/, + type: 'asset/resource', + generator: { + filename: 'data/[name].[hash:7][ext]' + } + }, + { + // 其他资源文件 + test: /\.(txt|xml|md)$/, + type: 'asset/resource', + generator: { + filename: 'assets/[name].[hash:7][ext]' + } + } + ] + }, + plugins: [ + new VueLoaderPlugin() + ], + resolve: { + extensions: ['.js', '.vue', '.json'], + alias: { + '@': path.resolve(__dirname, 'src'), + '@component': path.resolve(__dirname, 'src/components'), + '@utils': path.resolve(__dirname, 'src/utils'), + '@api': path.resolve(__dirname, 'src/api'), + '@config': path.resolve(__dirname, 'src/config'), + '@assets': path.resolve(__dirname, 'src/assets'), + 'vue$': 'vue/dist/vue.esm.js' + } + }, + optimization: { + minimize: true + } +} + diff --git a/完整使用文档.md b/完整使用文档.md new file mode 100644 index 0000000..b4b896e --- /dev/null +++ b/完整使用文档.md @@ -0,0 +1,879 @@ +# Admin Framework 完整使用文档 + +通用后台管理系统框架 - 包含系统功能、登录、路由管理、布局等核心功能 + +--- + +## 📑 目录 + +- [特性](#特性) +- [快速开始](#快速开始) +- [完整使用示例](#完整使用示例) +- [API 文档](#api-文档) +- [系统页面和 API](#系统页面和-api) +- [开发指南](#开发指南) +- [常见问题](#常见问题) + +--- + +## ✨ 特性 + +✅ **系统管理页面**(sys 开头的所有页面和功能) +✅ **系统 API**(system 和 system_high 所有 API) +✅ **全局组件**(Tables、Editor、Upload 等) +✅ **布局组件**(Main、ParentView) +✅ **登录和错误页面**(Login、401、404、500) +✅ **用户登录和权限管理** +✅ **动态路由管理** +✅ **工具库**(HTTP、日期、Token、Cookie 等) +✅ **Vuex 状态管理** +✅ **路由守卫** + +--- + +## 🚀 快速开始 + +### 一、打包框架 + +#### 1. 进入框架目录 +```bash +cd admin-framework +``` + +#### 2. 安装依赖 +```bash +npm install +``` + +#### 3. 打包 +```bash +npm run build +``` + +打包完成后,会在 `dist` 目录生成 `admin-framework.js` 文件(约 200-300KB)。 + +### 二、在新项目中使用 + +#### 方式一:直接复制打包文件(推荐) + +1. 将 `dist/admin-framework.js` 复制到新项目的 `src/libs/` 目录 + +2. 在 `main.js` 中引入: +```javascript +import AdminFramework from './libs/admin-framework.js' +``` + +#### 方式二:作为 npm 包使用 + +1. 在 `admin-framework` 目录执行: +```bash +npm link +``` + +2. 在新项目目录执行: +```bash +npm link admin-framework +``` + +3. 在 `main.js` 中引入: +```javascript +import AdminFramework from 'admin-framework' +``` + +### 三、最小化使用示例 + +#### 1. 框架已包含的内容 + +**无需从原项目复制**: + +✅ **已包含**: +- 所有系统页面(system、system_high) +- 所有系统 API(system、system_high) +- 所有全局组件(Tables、Editor、Upload 等) +- 布局组件(Main、ParentView) +- 登录和错误页面 +- 工具库和 Store 模块 + +**只需准备**: +``` +├── config/index.js # 配置文件(根据你的项目修改) +└── App.vue # 应用根组件 +``` + +#### 2. 创建 main.js(只需 10 行代码!) + +```javascript +import Vue from 'vue' +import VueRouter from 'vue-router' +import Vuex from 'vuex' +import ViewUI from 'view-design' +import createPersistedState from 'vuex-persistedstate' +import AdminFramework from './libs/admin-framework.js' +import App from './App.vue' +import config from './config' + +// 🎉 只需这一行!框架自动完成所有初始化 +Vue.use(AdminFramework, { + config, + ViewUI, + VueRouter, + Vuex, + createPersistedState +}) + +// 创建 Vue 实例 +window.rootVue = new Vue({ + el: '#app', + router: AdminFramework.router, // 使用框架自动创建的 router + store: AdminFramework.store, // 使用框架自动创建的 store + render: h => h(App), + mounted() { + AdminFramework.uiTool.setRem() + this.$store.dispatch('user/setAuthorityMenus', { + Main: AdminFramework.Main, + ParentView: AdminFramework.ParentView, + Page404: AdminFramework.Page404 + }) + } +}) + +// 响应式适配 +window.addEventListener('load', AdminFramework.uiTool.setRem) +window.addEventListener('resize', AdminFramework.uiTool.setRem) +``` + +**就这么简单!** 框架会自动: +- ✅ 注册 ViewUI +- ✅ 创建 Store(包含用户、应用模块) +- ✅ 创建 Router(包含所有基础路由和动态路由) +- ✅ 初始化 HTTP +- ✅ 设置 API 服务 +- ✅ 注册全局组件 +- ✅ 配置路由守卫 + +#### 3. 安装依赖 + +```bash +npm install vue vue-router vuex view-design axios dayjs js-cookie vuex-persistedstate +``` + +#### 4. 运行项目 + +```bash +npm run dev +``` + +--- + +## 📖 完整使用示例 + +### 步骤 1: 准备项目结构 + +``` +your-project/ +├── src/ +│ ├── config/ +│ │ └── index.js +│ ├── libs/ +│ │ └── admin-framework.js ← 框架文件 +│ ├── App.vue +│ └── main.js +├── package.json +└── webpack.config.js +``` + +### 步骤 2: 创建配置文件 + +在 `src/config/index.js` 中: + +```javascript +module.exports = { + title: '你的系统名称', + homeName: '首页', + apiUrl: 'http://localhost:9090/admin_api/', + cookieExpires: 7, + uploadMaxLimitSize: 10, + oss: { + region: 'oss-cn-shanghai', + accessKeyId: 'your-key', + accessKeySecret: 'your-secret', + bucket: 'your-bucket', + url: 'http://your-bucket.oss-cn-shanghai.aliyuncs.com', + basePath: 'your-path/' + } +} +``` + +### 步骤 3: 创建 App.vue + +```vue + + + +``` + +### 步骤 4: 开发业务功能 + +#### 创建业务页面 + +```vue + + + + +``` + +#### 创建业务 API + +```javascript +// src/api/business/productServer.js +import http from '@/utils/admin-framework.js' + +class ProductServer { + async getList(params) { + return await http.http.get('/product/list', params) + } + + async save(data) { + return await http.http.post('/product/save', data) + } + + async delete(id) { + return await http.http.post('/product/delete', { id }) + } +} + +export default new ProductServer() +``` + +--- + +## 📚 API 文档 + +### 框架实例方法 + +#### install(Vue, options) +安装 Vue 插件 + +```javascript +Vue.use(AdminFramework, { + config: yourConfig, + ViewUI: ViewUI, + VueRouter: VueRouter, + Vuex: Vuex, + createPersistedState: createPersistedState +}) +``` + +**参数说明:** +- `config`: 项目配置对象 +- `ViewUI`: ViewUI 实例 +- `VueRouter`: VueRouter 类 +- `Vuex`: Vuex 类 +- `createPersistedState`: vuex-persistedstate 插件 + +#### initHttp(config, store) +初始化 HTTP 配置 + +```javascript +AdminFramework.initHttp({ + apiUrl: 'http://localhost:9090/admin_api/', + timeout: 300000 +}, store) +``` + +#### setUserServer(userServer) +设置用户服务实例 + +```javascript +AdminFramework.setUserServer(userServer) +``` + +#### setParamSetupServer(paramSetupServer) +设置参数设置服务实例 + +```javascript +AdminFramework.setParamSetupServer(paramSetupServer) +``` + +#### createRouter(Router, components, customRoutes, ViewUI, homeName) +创建路由实例 + +```javascript +const router = AdminFramework.createRouter( + VueRouter, + { LoginPage, Page401, Page404, Page500 }, + customRoutes, // 自定义业务路由 + ViewUI, + 'home' +) +``` + +#### createStore(Vuex, customModules, createPersistedState) +创建 Store 实例 + +```javascript +const store = AdminFramework.createStore( + Vuex, + { business: businessModule }, // 自定义业务模块 + createPersistedState +) +``` + +#### getRoutes(components) +获取动态路由 + +```javascript +const mainRoutes = AdminFramework.getRoutes({ + Main, + ParentView, + Page404 +}) +``` + +#### registerComponents(Vue, components) +注册全局组件 + +```javascript +AdminFramework.registerComponents(Vue, { + 'my-component': MyComponent +}) +``` + +### 工具库 + +#### http - HTTP 请求工具 + +```javascript +// GET 请求 +AdminFramework.http.get('/api/users', { page: 1 }) + +// POST 请求 +AdminFramework.http.post('/api/users', { name: 'test' }) + +// 文件导出 +AdminFramework.http.fileExport('/api/export', { type: 'excel' }) +``` + +**在组件中使用:** +```javascript +export default { + async mounted() { + const res = await this.$http.get('/api/users') + } +} +``` + +#### util - 工具函数 + +```javascript +// Token 管理 +AdminFramework.util.setToken(token) +AdminFramework.util.getToken() + +// 路由工具 +AdminFramework.util.getBreadCrumbList(route, homeRoute) +AdminFramework.util.getHomeRoute(routes, 'home') +``` + +**在组件中使用:** +```javascript +export default { + methods: { + getToken() { + return this.$util.getToken() + } + } +} +``` + +#### tools - 功能工具 + +```javascript +// 日期格式化 +AdminFramework.tools.formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss') + +// UUID 生成 +AdminFramework.tools.generateUUID() + +// Cookie 操作 +AdminFramework.tools.setCookie('name', 'value') +AdminFramework.tools.getCookie('name') +``` + +**在组件中使用:** +```javascript +export default { + methods: { + formatDate() { + return this.$tools.formatDate(new Date(), 'YYYY-MM-DD') + } + } +} +``` + +#### uiTool - UI 工具 + +```javascript +// 设置响应式字体 +AdminFramework.uiTool.setRem() + +// 删除确认 +AdminFramework.uiTool.delConfirm(() => { + // 删除逻辑 +}) + +// 树形转换 +AdminFramework.uiTool.transformTree(treeData) +``` + +**在组件中使用:** +```javascript +export default { + methods: { + handleDelete() { + this.$uiTool.delConfirm(() => { + // 执行删除 + }) + } + } +} +``` + +### Store 模块 + +#### user 模块 + +```javascript +// 登录 +this.$store.dispatch('user/handleLogin', { + userFrom: { username, password }, + Main, + ParentView, + Page404 +}) + +// 登出 +this.$store.dispatch('user/handleLogOut') + +// 设置权限菜单 +this.$store.dispatch('user/setAuthorityMenus', { + Main, + ParentView, + Page404 +}) + +// 获取用户信息 +this.$store.getters['user/userName'] +this.$store.state.user.token +``` + +#### app 模块 + +```javascript +// 设置面包屑 +this.$store.commit('app/setBreadCrumb', route) + +// 获取系统标题 +this.$store.dispatch('app/getSysTitle', { + defaultTitle: '系统名称', + defaultLogo: '/logo.png' +}) + +// 获取系统配置 +this.$store.getters['app/sysFormModel'] +``` + +--- + +## 🗂️ 系统页面和 API + +### 已包含的系统页面 + +框架已内置所有系统管理页面,可直接从框架导入使用: + +#### system 目录页面 +```javascript +import { + SysLog, // 系统日志管理 + SysParamSetup, // 参数设置 + SysRole, // 角色管理 + SysUser, // 用户管理 + WchCities, // 城市管理 + WchProfessions // 职业管理 +} from 'admin-framework' +``` + +#### system_high 目录页面 +```javascript +import { + SysControl, // 控制器管理 + SysMenu, // 菜单管理 + SysTitle // 系统标题设置 +} from 'admin-framework' +``` + +#### 在路由中使用 +```javascript +import { SysUser, SysRole, SysMenu } from 'admin-framework' + +const routes = [ + { + path: '/system/user', + name: 'sys_user', + component: SysUser + }, + { + path: '/system/role', + name: 'sys_role', + component: SysRole + }, + { + path: '/system_high/menu', + name: 'sys_menu', + component: SysMenu + } +] +``` + +### 已包含的系统 API + +#### system API +```javascript +import { systemApi } from 'admin-framework' + +// 使用示例 +const { + userServer, + roleServer, + sysLogServe, + fileServe, + // ... 其他 API +} = systemApi + +// 调用 API +const users = await userServer.getList({ page: 1 }) +const roles = await roleServer.getList() +``` + +#### system_high API +```javascript +import { systemHighApi } from 'admin-framework' + +// 使用示例 +const { + menuServer, + paramSetupServer, + modelServer, + // ... 其他 API +} = systemHighApi + +// 调用 API +const menus = await menuServer.getTree() +const params = await paramSetupServer.getOne('sys_title') +``` + +### 全局组件 + +框架已包含所有全局组件,打包后会自动注册: + +```vue + +``` + +--- + +## 🛠️ 开发指南 + +### 开发模式 + +```bash +npm run dev +``` + +### 生产构建 + +```bash +npm run build +``` + +### 目录结构 + +``` +admin-framework/ +├── src/ +│ ├── utils/ # 工具库 +│ │ ├── tools.js # 功能工具 +│ │ ├── http.js # HTTP 工具 +│ │ ├── tools.js # 通用工具 +│ │ ├── uiTool.js # UI 工具 +│ │ └── util.js # 工具函数 +│ ├── store/ # Vuex 模块 +│ │ ├── user.js # 用户模块 +│ │ ├── app.js # 应用模块 +│ │ └── index.js # 导出 +│ ├── router/ # 路由配置 +│ │ └── index.js # 路由配置 +│ └── index.js # 入口文件 +├── dist/ # 打包输出 +│ └── admin-framework.js # 打包后的文件 +├── webpack.config.js # Webpack 配置 +├── package.json # 依赖配置 +└── README.md # 说明文档 +``` + +### 依赖说明 + +#### peerDependencies(需要在使用项目中安装) + +- vue: ^2.6.0 +- vue-router: ^3.0.0 +- vuex: ^3.0.0 +- view-design: ^4.0.0 +- axios: ^0.21.0 + +#### dependencies + +- dayjs: ^1.10.0 +- js-cookie: ^2.2.1 +- vuex-persistedstate: ^4.0.0 + +--- + +## ❓ 常见问题 + +### Q1: 打包后文件太大怎么办? + +A: 框架已经将 Vue、VueRouter、Vuex、ViewUI、Axios 设置为外部依赖,不会打包进去。确保在项目中单独安装这些依赖。 + +### Q2: 如何只使用部分功能? + +A: 可以按需导入: +```javascript +import { http, util, tools } from './libs/admin-framework.js' +``` + +### Q3: 如何自定义配置? + +A: 修改 `config/index.js` 文件: +```javascript +module.exports = { + title: '你的系统名称', + apiUrl: 'http://your-api-url/', + // ... 其他配置 +} +``` + +### Q4: 如何添加业务路由? + +A: 在创建路由时传入: +```javascript +const businessRoutes = [ + { + path: '/business/product', + component: () => import('@/view/business/product.vue') + } +] + +const router = AdminFramework.createRouter( + VueRouter, + { LoginPage, Page401, Page404, Page500 }, + businessRoutes, // ← 传入业务路由 + ViewUI +) +``` + +### Q5: 如何自定义路由守卫? + +A: 你可以在创建路由后添加自己的守卫: + +```javascript +const router = AdminFramework.createRouter(...) + +router.beforeEach((to, from, next) => { + // 你的自定义逻辑 + next() +}) +``` + +### Q6: 如何扩展 Store 模块? + +A: 在创建 Store 时传入自定义模块: + +```javascript +const store = AdminFramework.createStore(Vuex, { + myModule: { + namespaced: true, + state: { ... }, + mutations: { ... }, + actions: { ... } + } +}) +``` + +### Q7: 如何使用登录功能? + +A: 在组件中: +```javascript +export default { + methods: { + async login() { + await this.$store.dispatch('user/handleLogin', { + userFrom: { username: 'admin', password: '123456' }, + Main: AdminFramework.Main, + ParentView: AdminFramework.ParentView, + Page404: AdminFramework.Page404 + }) + this.$router.push({ name: 'home' }) + } + } +} +``` + +### Q8: 需要复制哪些文件到新项目? + +A: **框架已包含所有系统功能,只需准备:** +- `config/index.js` - 配置文件 +- `App.vue` - 应用根组件 +- `main.js` - 入口文件 + +其他所有系统页面、API、组件都已在框架中,无需复制! + +--- + +## 📦 完整的项目结构示例 + +``` +your-project/ +├── src/ +│ ├── api/ +│ │ └── business/ # 你的业务 API +│ ├── assets/ +│ │ ├── css/ # 样式文件 +│ │ └── images/ # 图片 +│ ├── config/ +│ │ └── index.js # 配置文件 +│ ├── libs/ +│ │ └── admin-framework.js # 框架文件 +│ ├── view/ +│ │ └── business/ # 你的业务页面 +│ ├── App.vue +│ └── main.js +├── package.json +└── webpack.config.js +``` + +--- + +## 📝 版本信息 + +**当前版本**: 1.0.0 + +**更新日志**: +- v1.0.0 - 初始版本,包含所有核心功能 + +--- + +## 📄 许可证 + +MIT License + +--- + +## 💬 技术支持 + +如有问题,请查看本文档或联系开发团队。 + +--- + +## 🎯 快速参考 + +### 最小化代码示例(10行) + +```javascript +import Vue from 'vue' +import AdminFramework from './libs/admin-framework.js' +import App from './App.vue' +import config from './config' + +Vue.use(AdminFramework, { config, ViewUI, VueRouter, Vuex, createPersistedState }) + +new Vue({ + el: '#app', + router: AdminFramework.router, + store: AdminFramework.store, + render: h => h(App) +}) +``` + +### 常用API速查 + +```javascript +// HTTP请求 +this.$http.get(url, params) +this.$http.post(url, data) + +// Token操作 +this.$util.setToken(token) +this.$util.getToken() + +// 日期格式化 +this.$tools.formatDate(date, 'YYYY-MM-DD') + +// 删除确认 +this.$uiTool.delConfirm(() => { /* 删除逻辑 */ }) + +// 登录 +this.$store.dispatch('user/handleLogin', { userFrom, Main, ParentView, Page404 }) + +// 登出 +this.$store.dispatch('user/handleLogOut') +``` + +--- + +**祝开发愉快!** 🎉 +