From a11329c5022c7a4c78dc1c2517d1e42a303b3984 Mon Sep 17 00:00:00 2001 From: zwt13703 Date: Fri, 20 Feb 2026 13:20:28 +0800 Subject: [PATCH] updates --- .drone.yml | 73 + .editorconfig | 11 + .env | 63 + .env.dev | 26 + .env.prod | 23 + .env.test | 23 + .gitattributes | 13 + .gitignore | 35 + .npmrc | 4 + .vscode/extensions.json | 19 + .vscode/launch.json | 22 + .vscode/settings.json | 40 + CHANGELOG.md | 501 + LICENSE | 21 + README.md | 391 + School_Task1.md | 11 + build/config/index.ts | 2 + build/config/proxy.ts | 56 + build/config/time.ts | 12 + build/plugins/devtools.ts | 9 + build/plugins/html.ts | 13 + build/plugins/index.ts | 24 + build/plugins/router.ts | 44 + build/plugins/unocss.ts | 32 + build/plugins/unplugin.ts | 47 + docs/README.md | 11 + docs/art-school-import-export-api.md | 188 + docs/art-school-tag-major-tag-api.md | 117 + docs/java/VelocityUtils.java | 389 + docs/school-major-campus-api-requirement.md | 110 + docs/sql/sys_dict_data.sql | 59 + docs/sql/sys_menu.sql | 43 + docs/template/api/api.ts.vm | 41 + docs/template/index-tree.vue.vm | 232 + docs/template/index.vue.vm | 198 + docs/template/modules/operate-drawer.vue.vm | 257 + docs/template/modules/search.vue.vm | 130 + docs/template/typings/api.d.ts.vm | 51 + eslint.config.js | 24 + index.html | 14 + package.json | 127 + packages/alova/package.json | 20 + packages/alova/src/client.ts | 1 + packages/alova/src/constant.ts | 2 + packages/alova/src/fetch.ts | 2 + packages/alova/src/index.ts | 77 + packages/alova/src/mock.ts | 1 + packages/alova/src/type.ts | 52 + packages/alova/tsconfig.json | 20 + packages/axios/package.json | 21 + packages/axios/src/constant.ts | 8 + packages/axios/src/index.ts | 179 + packages/axios/src/options.ts | 60 + packages/axios/src/shared.ts | 79 + packages/axios/src/type.ts | 130 + packages/axios/tsconfig.json | 20 + packages/color/package.json | 16 + packages/color/src/constant/index.ts | 2 + packages/color/src/constant/name.ts | 1579 +++ packages/color/src/constant/palette.ts | 356 + packages/color/src/index.ts | 7 + packages/color/src/palette/antd.ts | 176 + packages/color/src/palette/index.ts | 45 + packages/color/src/palette/recommend.ts | 152 + packages/color/src/shared/colord.ts | 93 + packages/color/src/shared/index.ts | 2 + packages/color/src/shared/name.ts | 49 + packages/color/src/types/index.ts | 58 + packages/color/tsconfig.json | 20 + packages/hooks/package.json | 16 + packages/hooks/src/index.ts | 9 + packages/hooks/src/use-boolean.ts | 31 + packages/hooks/src/use-context.ts | 96 + packages/hooks/src/use-count-down.ts | 68 + packages/hooks/src/use-loading.ts | 16 + packages/hooks/src/use-request.ts | 82 + packages/hooks/src/use-svg-icon-render.ts | 50 + packages/hooks/src/use-table.ts | 131 + packages/hooks/tsconfig.json | 20 + packages/materials/package.json | 19 + packages/materials/src/index.ts | 6 + .../src/libs/admin-layout/index.module.css | 63 + .../libs/admin-layout/index.module.css.d.ts | 18 + .../materials/src/libs/admin-layout/index.ts | 5 + .../materials/src/libs/admin-layout/index.vue | 236 + .../materials/src/libs/admin-layout/shared.ts | 68 + .../src/libs/page-tab/button-tab.vue | 53 + .../src/libs/page-tab/chrome-tab-bg.vue | 31 + .../src/libs/page-tab/chrome-tab.vue | 58 + .../src/libs/page-tab/index.module.css | 121 + .../src/libs/page-tab/index.module.css.d.ts | 19 + packages/materials/src/libs/page-tab/index.ts | 3 + .../materials/src/libs/page-tab/index.vue | 77 + .../materials/src/libs/page-tab/shared.ts | 31 + .../src/libs/page-tab/slider-tab.vue | 53 + .../materials/src/libs/page-tab/svg-close.vue | 18 + .../src/libs/simple-scrollbar/index.ts | 3 + .../src/libs/simple-scrollbar/index.vue | 18 + packages/materials/src/types/index.ts | 291 + packages/materials/tsconfig.json | 20 + packages/scripts/bin.ts | 3 + packages/scripts/package.json | 28 + packages/scripts/src/commands/changelog.ts | 10 + packages/scripts/src/commands/cleanup.ts | 5 + packages/scripts/src/commands/git-commit.ts | 84 + packages/scripts/src/commands/index.ts | 6 + packages/scripts/src/commands/release.ts | 12 + packages/scripts/src/commands/router.ts | 90 + packages/scripts/src/commands/update-pkg.ts | 5 + packages/scripts/src/config/index.ts | 39 + packages/scripts/src/index.ts | 109 + packages/scripts/src/locales/index.ts | 82 + packages/scripts/src/shared/index.ts | 7 + packages/scripts/src/types/index.ts | 31 + packages/scripts/tsconfig.json | 20 + packages/uno-preset/package.json | 12 + packages/uno-preset/src/index.ts | 55 + packages/uno-preset/tsconfig.json | 20 + packages/utils/package.json | 22 + packages/utils/src/crypto.ts | 27 + packages/utils/src/index.ts | 4 + packages/utils/src/klona.ts | 3 + packages/utils/src/nanoid.ts | 3 + packages/utils/src/storage.ts | 77 + packages/utils/tsconfig.json | 20 + pnpm-lock.yaml | 10758 ++++++++++++++++ pnpm-workspace.yaml | 2 + public/favicon.svg | 4 + public/streamsaver/mitm.html | 179 + public/streamsaver/sw.js | 132 + src/App.vue | 59 + src/assets/imgs/soybean.jpg | Bin 0 -> 114241 bytes src/assets/svg-icon/activity.svg | 1 + src/assets/svg-icon/at-sign.svg | 1 + src/assets/svg-icon/avatar.svg | 1 + src/assets/svg-icon/banner.svg | 1 + src/assets/svg-icon/bell.svg | 1 + src/assets/svg-icon/cast.svg | 1 + src/assets/svg-icon/chrome.svg | 1 + src/assets/svg-icon/copy.svg | 1 + src/assets/svg-icon/custom-icon.svg | 1 + src/assets/svg-icon/empty-data.svg | 1 + src/assets/svg-icon/expectation.svg | 1 + src/assets/svg-icon/heart.svg | 1 + src/assets/svg-icon/login-background.svg | 1 + src/assets/svg-icon/logo.svg | 4 + src/assets/svg-icon/maxkey.svg | 3 + src/assets/svg-icon/menu/404.svg | 1 + src/assets/svg-icon/menu/bug.svg | 1 + src/assets/svg-icon/menu/build.svg | 1 + src/assets/svg-icon/menu/button.svg | 10 + src/assets/svg-icon/menu/caret-back.svg | 1 + src/assets/svg-icon/menu/caret-forward.svg | 1 + src/assets/svg-icon/menu/cascader.svg | 1 + src/assets/svg-icon/menu/category.svg | 1 + src/assets/svg-icon/menu/chart.svg | 1 + src/assets/svg-icon/menu/checkbox.svg | 1 + src/assets/svg-icon/menu/clipboard.svg | 1 + src/assets/svg-icon/menu/code.svg | 1 + src/assets/svg-icon/menu/color.svg | 1 + src/assets/svg-icon/menu/company.svg | 1 + src/assets/svg-icon/menu/component.svg | 1 + src/assets/svg-icon/menu/dashboard.svg | 1 + src/assets/svg-icon/menu/date-range.svg | 1 + src/assets/svg-icon/menu/date.svg | 1 + src/assets/svg-icon/menu/dict.svg | 1 + src/assets/svg-icon/menu/documentation.svg | 1 + src/assets/svg-icon/menu/download.svg | 1 + src/assets/svg-icon/menu/drag.svg | 1 + src/assets/svg-icon/menu/druid.svg | 1 + src/assets/svg-icon/menu/edit.svg | 1 + src/assets/svg-icon/menu/education.svg | 1 + src/assets/svg-icon/menu/email.svg | 1 + src/assets/svg-icon/menu/example.svg | 1 + src/assets/svg-icon/menu/excel.svg | 1 + src/assets/svg-icon/menu/exit-fullscreen.svg | 1 + src/assets/svg-icon/menu/eye-open.svg | 1 + src/assets/svg-icon/menu/eye.svg | 1 + src/assets/svg-icon/menu/finish.svg | 1 + src/assets/svg-icon/menu/form.svg | 1 + src/assets/svg-icon/menu/fullscreen.svg | 1 + src/assets/svg-icon/menu/gitee.svg | 1 + src/assets/svg-icon/menu/github.svg | 1 + src/assets/svg-icon/menu/guide.svg | 1 + src/assets/svg-icon/menu/icon.svg | 1 + src/assets/svg-icon/menu/input.svg | 1 + src/assets/svg-icon/menu/international.svg | 1 + src/assets/svg-icon/menu/job.svg | 1 + src/assets/svg-icon/menu/language.svg | 1 + src/assets/svg-icon/menu/link.svg | 1 + src/assets/svg-icon/menu/list.svg | 1 + src/assets/svg-icon/menu/lock.svg | 1 + src/assets/svg-icon/menu/log.svg | 1 + src/assets/svg-icon/menu/logininfor.svg | 1 + src/assets/svg-icon/menu/message.svg | 1 + src/assets/svg-icon/menu/model.svg | 1 + src/assets/svg-icon/menu/money.svg | 1 + src/assets/svg-icon/menu/monitor.svg | 2 + src/assets/svg-icon/menu/my-copy.svg | 1 + src/assets/svg-icon/menu/my-task.svg | 1 + src/assets/svg-icon/menu/nested.svg | 1 + src/assets/svg-icon/menu/number.svg | 1 + src/assets/svg-icon/menu/online.svg | 1 + src/assets/svg-icon/menu/password.svg | 1 + src/assets/svg-icon/menu/pdf.svg | 1 + src/assets/svg-icon/menu/people.svg | 1 + src/assets/svg-icon/menu/peoples.svg | 1 + src/assets/svg-icon/menu/phone.svg | 1 + src/assets/svg-icon/menu/post.svg | 1 + .../svg-icon/menu/process-definition.svg | 1 + src/assets/svg-icon/menu/qq.svg | 1 + src/assets/svg-icon/menu/question.svg | 1 + src/assets/svg-icon/menu/radio.svg | 1 + src/assets/svg-icon/menu/rate.svg | 1 + src/assets/svg-icon/menu/redis-list.svg | 2 + src/assets/svg-icon/menu/redis.svg | 1 + src/assets/svg-icon/menu/row.svg | 1 + src/assets/svg-icon/menu/search.svg | 1 + src/assets/svg-icon/menu/select.svg | 1 + src/assets/svg-icon/menu/server.svg | 1 + src/assets/svg-icon/menu/shopping.svg | 1 + src/assets/svg-icon/menu/size.svg | 1 + src/assets/svg-icon/menu/skill.svg | 1 + src/assets/svg-icon/menu/slider.svg | 1 + src/assets/svg-icon/menu/star.svg | 1 + src/assets/svg-icon/menu/swagger.svg | 1 + src/assets/svg-icon/menu/switch.svg | 1 + src/assets/svg-icon/menu/system.svg | 2 + src/assets/svg-icon/menu/tab.svg | 1 + src/assets/svg-icon/menu/table.svg | 1 + src/assets/svg-icon/menu/textarea.svg | 1 + src/assets/svg-icon/menu/theme.svg | 1 + src/assets/svg-icon/menu/time-range.svg | 1 + src/assets/svg-icon/menu/time.svg | 1 + src/assets/svg-icon/menu/tool.svg | 1 + src/assets/svg-icon/menu/tree-table.svg | 1 + src/assets/svg-icon/menu/tree.svg | 1 + src/assets/svg-icon/menu/upload.svg | 1 + src/assets/svg-icon/menu/user.svg | 1 + src/assets/svg-icon/menu/validCode.svg | 1 + src/assets/svg-icon/menu/waiting.svg | 1 + src/assets/svg-icon/menu/wechat.svg | 1 + src/assets/svg-icon/menu/workflow.svg | 1 + src/assets/svg-icon/menu/zip.svg | 1 + src/assets/svg-icon/network-error.svg | 1 + src/assets/svg-icon/no-icon.svg | 1 + src/assets/svg-icon/no-permission.svg | 1 + src/assets/svg-icon/not-found.svg | 1 + src/assets/svg-icon/service-error.svg | 1 + src/assets/svg-icon/topiam.svg | 29 + src/assets/svg-icon/wind.svg | 1 + .../advanced/table-column-setting.vue | 54 + .../advanced/table-header-operation.vue | 95 + .../advanced/table-row-check-alert.vue | 29 + .../advanced/table-sider-layout.vue | 109 + src/components/common/app-provider.vue | 56 + src/components/common/dark-mode-container.vue | 17 + src/components/common/data-table.vue | 35 + src/components/common/exception-base.vue | 43 + src/components/common/full-screen.vue | 22 + src/components/common/icon-tooltip.vue | 42 + src/components/common/lang-switch.vue | 61 + src/components/common/menu-toggler.vue | 53 + src/components/common/pin-toggler.vue | 26 + src/components/common/reload-button.vue | 21 + src/components/common/system-logo.vue | 9 + src/components/common/theme-schema-switch.vue | 56 + src/components/custom/better-scroll.vue | 53 + src/components/custom/boolean-tag.vue | 24 + src/components/custom/button-icon.vue | 91 + src/components/custom/count-to.vue | 88 + src/components/custom/dept-tree-select.vue | 51 + src/components/custom/dept-tree.vue | 154 + src/components/custom/dict-checkbox.vue | 28 + src/components/custom/dict-radio.vue | 28 + src/components/custom/dict-select.vue | 37 + src/components/custom/dict-tag.vue | 62 + src/components/custom/file-upload.vue | 212 + src/components/custom/form-tip.vue | 26 + src/components/custom/json-preview.vue | 52 + src/components/custom/look-forward.vue | 20 + src/components/custom/menu-tree-select.vue | 82 + src/components/custom/menu-tree.vue | 222 + src/components/custom/oss-upload.vue | 69 + src/components/custom/post-select.vue | 63 + src/components/custom/role-select.vue | 52 + src/components/custom/soybean-avatar.vue | 13 + src/components/custom/status-switch.vue | 61 + src/components/custom/svg-icon.vue | 54 + src/components/custom/tenant-select.vue | 103 + src/components/custom/umo-doc-editor.vue | 104 + src/components/custom/user-select.vue | 52 + src/components/custom/wave-bg.vue | 524 + src/constants/app.ts | 79 + src/constants/business.ts | 138 + src/constants/common.ts | 15 + src/constants/reg.ts | 25 + src/enum/business.ts | 4 + src/enum/index.ts | 9 + src/hooks/business/auth.ts | 46 + src/hooks/business/captcha.ts | 71 + src/hooks/business/dict.ts | 85 + src/hooks/business/download.ts | 166 + src/hooks/common/echarts.ts | 230 + src/hooks/common/form.ts | 112 + src/hooks/common/icon.ts | 10 + src/hooks/common/loading.ts | 25 + src/hooks/common/router.ts | 116 + src/hooks/common/table.ts | 477 + src/layouts/base-layout/index.vue | 170 + src/layouts/blank-layout/index.vue | 13 + .../modules/global-breadcrumb/index.vue | 47 + src/layouts/modules/global-content/index.vue | 63 + src/layouts/modules/global-footer/index.vue | 13 + .../components/message-button.vue | 152 + .../global-header/components/theme-button.vue | 20 + .../global-header/components/user-avatar.vue | 142 + src/layouts/modules/global-header/index.vue | 68 + src/layouts/modules/global-logo/index.vue | 27 + .../components/first-level-menu.vue | 109 + .../modules/global-menu/context/index.ts | 215 + src/layouts/modules/global-menu/index.vue | 40 + .../global-menu/modules/horizontal-menu.vue | 29 + .../modules/top-hybrid-header-first.vue | 89 + .../modules/top-hybrid-sidebar-first.vue | 64 + .../modules/vertical-hybrid-header-first.vue | 173 + .../global-menu/modules/vertical-menu.vue | 63 + .../global-menu/modules/vertical-mix-menu.vue | 127 + .../components/search-footer.vue | 36 + .../global-search/components/search-modal.vue | 123 + .../components/search-result.vue | 56 + src/layouts/modules/global-search/index.vue | 18 + src/layouts/modules/global-sider/index.vue | 36 + .../modules/global-tab/context-menu.vue | 146 + src/layouts/modules/global-tab/index.vue | 233 + .../components/layout-mode-card.vue | 101 + .../theme-drawer/components/setting-item.vue | 24 + src/layouts/modules/theme-drawer/index.vue | 66 + .../theme-drawer/modules/appearance/index.vue | 19 + .../appearance/modules/theme-color.vue | 83 + .../appearance/modules/theme-radius.vue | 22 + .../appearance/modules/theme-schema.vue | 76 + .../theme-drawer/modules/config-operation.vue | 58 + .../theme-drawer/modules/general/index.vue | 17 + .../general/modules/global-settings.vue | 39 + .../general/modules/watermark-settings.vue | 66 + .../theme-drawer/modules/layout/index.vue | 31 + .../layout/modules/content-settings.vue | 64 + .../layout/modules/footer-settings.vue | 61 + .../layout/modules/header-settings.vue | 47 + .../modules/layout/modules/layout-mode.vue | 84 + .../modules/layout/modules/sider-settings.vue | 60 + .../modules/layout/modules/tab-settings.vue | 62 + .../modules/layout/modules/table-settings.vue | 44 + .../theme-drawer/modules/preset/index.vue | 15 + .../modules/preset/modules/theme-preset.vue | 156 + .../theme-drawer/modules/table-props.vue | 44 + src/locales/dayjs.ts | 20 + src/locales/index.ts | 26 + src/locales/langs/en-us.ts | 1292 ++ src/locales/langs/zh-cn.ts | 1284 ++ src/locales/locale.ts | 9 + src/locales/naive.ts | 12 + src/main.ts | 31 + src/plugins/app.ts | 108 + src/plugins/assets.ts | 3 + src/plugins/dayjs.ts | 9 + src/plugins/iconify.ts | 10 + src/plugins/index.ts | 5 + src/plugins/loading.ts | 34 + src/plugins/nprogress.ts | 9 + src/router/elegant/imports.ts | 58 + src/router/elegant/routes.ts | 468 + src/router/elegant/transform.ts | 236 + src/router/guard/index.ts | 15 + src/router/guard/progress.ts | 11 + src/router/guard/route.ts | 192 + src/router/guard/title.ts | 13 + src/router/index.ts | 30 + src/router/routes/builtin.ts | 31 + src/router/routes/index.ts | 156 + src/service/api/art/school-campus.ts | 35 + src/service/api/art/school-college.ts | 35 + src/service/api/art/school-detail.ts | 56 + src/service/api/art/school-dorm.ts | 35 + src/service/api/art/school-enroll-plan.ts | 35 + src/service/api/art/school-major-tag.ts | 35 + src/service/api/art/school-major.ts | 35 + src/service/api/art/school-media.ts | 35 + src/service/api/art/school-name.ts | 35 + src/service/api/art/school-tag.ts | 35 + src/service/api/art/school.ts | 76 + src/service/api/auth.ts | 78 + src/service/api/demo/demo.ts | 36 + src/service/api/demo/index.ts | 2 + src/service/api/demo/tree.ts | 36 + src/service/api/index.ts | 2 + src/service/api/monitor/cache.ts | 8 + src/service/api/monitor/index.ts | 4 + src/service/api/monitor/login-infor.ts | 34 + src/service/api/monitor/online.ts | 42 + src/service/api/monitor/oper-log.ts | 26 + src/service/api/route.ts | 7 + src/service/api/system/client.ts | 45 + src/service/api/system/config.ts | 69 + src/service/api/system/dept.ts | 51 + src/service/api/system/dict-data.ts | 36 + src/service/api/system/dict.ts | 59 + src/service/api/system/index.ts | 8 + src/service/api/system/menu.ts | 69 + src/service/api/system/notice.ts | 36 + src/service/api/system/oss-config.ts | 45 + src/service/api/system/oss.ts | 40 + src/service/api/system/post.ts | 52 + src/service/api/system/role.ts | 98 + src/service/api/system/social.ts | 29 + src/service/api/system/tenant-package.ts | 52 + src/service/api/system/tenant.ts | 81 + src/service/api/system/user.ts | 136 + src/service/api/tool/gen.ts | 101 + src/service/api/tool/index.ts | 1 + src/service/request/index.ts | 225 + src/service/request/shared.ts | 63 + src/service/request/type.ts | 7 + src/store/index.ts | 12 + src/store/modules/app/index.ts | 166 + src/store/modules/auth/index.ts | 199 + src/store/modules/auth/shared.ts | 12 + src/store/modules/dict/index.ts | 42 + src/store/modules/notice/index.ts | 50 + src/store/modules/route/index.ts | 424 + src/store/modules/route/shared.ts | 335 + src/store/modules/tab/index.ts | 395 + src/store/modules/tab/shared.ts | 263 + src/store/modules/theme/index.ts | 303 + src/store/modules/theme/shared.ts | 269 + src/store/plugins/index.ts | 22 + src/styles/css/global.css | 16 + src/styles/css/nprogress.css | 83 + src/styles/css/reset.css | 385 + src/styles/css/transition.css | 82 + src/styles/scss/custom.scss | 5 + src/styles/scss/global.scss | 2 + src/styles/scss/loading.scss | 105 + src/styles/scss/scrollbar.scss | 28 + src/theme/preset/azir.json | 53 + src/theme/preset/compact.json | 41 + src/theme/preset/dark.json | 92 + src/theme/preset/default.json | 100 + src/theme/preset/soybean.json | 91 + src/theme/settings.ts | 104 + src/theme/vars.ts | 35 + src/typings/api/api.d.ts | 88 + src/typings/api/art.school-campus.api.d.ts | 56 + src/typings/api/art.school-college.api.d.ts | 52 + src/typings/api/art.school-detail.api.d.ts | 54 + src/typings/api/art.school-dorm.api.d.ts | 54 + .../api/art.school-enroll-plan.api.d.ts | 70 + src/typings/api/art.school-major-tag.api.d.ts | 42 + src/typings/api/art.school-major.api.d.ts | 87 + src/typings/api/art.school-media.api.d.ts | 54 + src/typings/api/art.school-name.api.d.ts | 44 + src/typings/api/art.school-tag.api.d.ts | 42 + src/typings/api/art.school.api.d.ts | 172 + src/typings/api/auth.d.ts | 110 + src/typings/api/demo.api.d.ts | 83 + src/typings/api/monitor.api.d.ts | 170 + src/typings/api/route.d.ts | 19 + src/typings/api/system.api.d.ts | 830 ++ src/typings/api/tool.api.d.ts | 190 + src/typings/app.d.ts | 1130 ++ src/typings/common.d.ts | 46 + src/typings/components.d.ts | 314 + src/typings/elegant-router.d.ts | 334 + src/typings/global.d.ts | 26 + src/typings/naive-ui.d.ts | 24 + src/typings/router.d.ts | 72 + src/typings/storage.d.ts | 52 + src/typings/union-key.d.ts | 165 + src/typings/vite-env.d.ts | 128 + src/utils/agent.ts | 7 + src/utils/common.ts | 210 + src/utils/copy.ts | 26 + src/utils/crypto.ts | 70 + src/utils/icon-tag-format.ts | 62 + src/utils/icon.ts | 19 + src/utils/jsencrypt.ts | 21 + src/utils/service.ts | 75 + src/utils/sse.ts | 58 + src/utils/storage.ts | 9 + src/utils/websocket.ts | 60 + src/views/_builtin/403/index.vue | 7 + src/views/_builtin/404/index.vue | 7 + src/views/_builtin/500/index.vue | 7 + src/views/_builtin/iframe-page/[url].vue | 15 + src/views/_builtin/login/index.vue | 107 + .../_builtin/login/modules/bind-wechat.vue | 11 + .../_builtin/login/modules/code-login.vue | 87 + .../_builtin/login/modules/pwd-login.vue | 258 + src/views/_builtin/login/modules/register.vue | 194 + .../_builtin/login/modules/reset-pwd.vue | 105 + src/views/_builtin/social-callback/index.vue | 125 + src/views/_builtin/user-center/index.vue | 244 + .../user-center/modules/online-table.vue | 125 + .../user-center/modules/social-card.vue | 114 + .../user-center/modules/user-avatar.vue | 211 + src/views/about/index.vue | 110 + src/views/art/school/index.vue | 385 + .../school/modules/school-campus/index.vue | 273 + .../modules/school-campus-operate-drawer.vue | 180 + .../modules/school-campus-search.vue | 89 + .../school/modules/school-college/index.vue | 259 + .../modules/school-college-operate-drawer.vue | 168 + .../modules/school-college-search.vue | 89 + .../school/modules/school-detail/index.vue | 249 + .../modules/school-detail-operate-drawer.vue | 178 + .../modules/school-detail-search.vue | 92 + .../art/school/modules/school-dorm/index.vue | 269 + .../modules/school-dorm-operate-drawer.vue | 195 + .../modules/school-dorm-search.vue | 104 + .../modules/school-enroll-plan/index.vue | 280 + .../school-enroll-plan-operate-drawer.vue | 195 + .../modules/school-enroll-plan-search.vue | 121 + .../school/modules/school-import-modal.vue | 225 + .../school/modules/school-major-tag/index.vue | 223 + .../school-major-tag-operate-drawer.vue | 131 + .../modules/school-major-tag-search.vue | 83 + .../art/school/modules/school-major/index.vue | 287 + .../modules/school-major-operate-drawer.vue | 371 + .../modules/school-major-search.vue | 196 + .../art/school/modules/school-media/index.vue | 272 + .../modules/school-media-operate-drawer.vue | 183 + .../modules/school-media-search.vue | 114 + .../art/school/modules/school-name/index.vue | 245 + .../modules/school-name-operate-drawer.vue | 154 + .../modules/school-name-search.vue | 94 + .../school/modules/school-operate-drawer.vue | 482 + .../art/school/modules/school-search.vue | 166 + .../school/modules/school-sub-table-modal.vue | 186 + .../art/school/modules/school-tag/index.vue | 238 + .../modules/school-tag-operate-drawer.vue | 141 + .../school-tag/modules/school-tag-search.vue | 80 + src/views/demo/demo/index.vue | 225 + .../demo/demo/modules/demo-operate-drawer.vue | 140 + src/views/demo/demo/modules/demo-search.vue | 80 + src/views/demo/tree/index.vue | 233 + .../demo/tree/modules/tree-operate-drawer.vue | 166 + src/views/demo/tree/modules/tree-search.vue | 77 + src/views/home/index.vue | 59 + src/views/home/modules/card-data.vue | 115 + src/views/home/modules/creativity-banner.vue | 17 + src/views/home/modules/header-banner.vue | 71 + src/views/home/modules/line-chart.vue | 152 + src/views/home/modules/pie-chart.vue | 109 + src/views/home/modules/project-news.vue | 40 + src/views/monitor/cache/index.vue | 690 + src/views/monitor/logininfor/index.vue | 279 + .../logininfor/modules/login-infor-search.vue | 101 + .../modules/login-infor-view-drawer.vue | 71 + src/views/monitor/online/index.vue | 172 + .../monitor/online/modules/online-search.vue | 74 + src/views/monitor/operlog/index.vue | 225 + .../operlog/modules/oper-log-search.vue | 112 + .../operlog/modules/oper-log-view-drawer.vue | 73 + src/views/system/client/index.vue | 275 + .../client/modules/client-operate-drawer.vue | 221 + .../system/client/modules/client-search.vue | 95 + src/views/system/config/index.vue | 240 + .../config/modules/config-operate-drawer.vue | 145 + .../system/config/modules/config-search.vue | 122 + src/views/system/dept/index.vue | 218 + .../dept/modules/dept-operate-drawer.vue | 248 + src/views/system/dept/modules/dept-search.vue | 82 + src/views/system/dict/index.vue | 519 + .../dict/modules/dict-data-operate-drawer.vue | 206 + .../system/dict/modules/dict-data-search.vue | 77 + .../dict/modules/dict-type-operate-drawer.vue | 132 + src/views/system/menu/index.vue | 581 + .../modules/menu-cascade-delete-modal.vue | 118 + .../menu/modules/menu-operate-drawer.vue | 511 + src/views/system/notice/index.vue | 200 + .../notice/modules/notice-operate-drawer.vue | 145 + .../system/notice/modules/notice-search.vue | 74 + src/views/system/oss-config/index.vue | 260 + .../modules/oss-config-operate-drawer.vue | 226 + .../oss-config/modules/oss-config-search.vue | 92 + src/views/system/oss/index.vue | 360 + src/views/system/oss/modules/oss-search.vue | 102 + .../system/oss/modules/oss-upload-modal.vue | 67 + src/views/system/post/index.vue | 358 + .../post/modules/post-operate-drawer.vue | 169 + src/views/system/post/modules/post-search.vue | 86 + src/views/system/role/index.vue | 293 + .../role/modules/role-auth-user-drawer.vue | 275 + .../role/modules/role-data-scope-drawer.vue | 154 + .../role/modules/role-operate-drawer.vue | 198 + src/views/system/role/modules/role-search.vue | 109 + src/views/system/tenant-package/index.vue | 237 + .../modules/tenant-package-operate-drawer.vue | 174 + .../modules/tenant-package-search.vue | 95 + src/views/system/tenant/index.vue | 302 + .../tenant/modules/tenant-operate-drawer.vue | 302 + .../system/tenant/modules/tenant-search.vue | 80 + src/views/system/user/index.vue | 442 + .../system/user/modules/user-import-modal.vue | 162 + .../user/modules/user-operate-drawer.vue | 248 + .../user/modules/user-password-drawer.vue | 115 + src/views/system/user/modules/user-search.vue | 122 + src/views/tool/gen/index.vue | 317 + .../tool/gen/modules/gen-table-db-search.vue | 76 + .../gen/modules/gen-table-import-drawer.vue | 148 + .../gen/modules/gen-table-operate-drawer.vue | 507 + .../gen/modules/gen-table-preview-drawer.vue | 240 + .../tool/gen/modules/gen-table-search.vue | 103 + tsconfig.json | 29 + uno.config.ts | 30 + vite.config.ts | 51 + 617 files changed, 66376 insertions(+) create mode 100644 .drone.yml create mode 100644 .editorconfig create mode 100644 .env create mode 100644 .env.dev create mode 100644 .env.prod create mode 100644 .env.test create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 School_Task1.md create mode 100644 build/config/index.ts create mode 100644 build/config/proxy.ts create mode 100644 build/config/time.ts create mode 100644 build/plugins/devtools.ts create mode 100644 build/plugins/html.ts create mode 100644 build/plugins/index.ts create mode 100644 build/plugins/router.ts create mode 100644 build/plugins/unocss.ts create mode 100644 build/plugins/unplugin.ts create mode 100644 docs/README.md create mode 100644 docs/art-school-import-export-api.md create mode 100644 docs/art-school-tag-major-tag-api.md create mode 100644 docs/java/VelocityUtils.java create mode 100644 docs/school-major-campus-api-requirement.md create mode 100644 docs/sql/sys_dict_data.sql create mode 100644 docs/sql/sys_menu.sql create mode 100644 docs/template/api/api.ts.vm create mode 100644 docs/template/index-tree.vue.vm create mode 100644 docs/template/index.vue.vm create mode 100644 docs/template/modules/operate-drawer.vue.vm create mode 100644 docs/template/modules/search.vue.vm create mode 100644 docs/template/typings/api.d.ts.vm create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package.json create mode 100644 packages/alova/package.json create mode 100644 packages/alova/src/client.ts create mode 100644 packages/alova/src/constant.ts create mode 100644 packages/alova/src/fetch.ts create mode 100644 packages/alova/src/index.ts create mode 100644 packages/alova/src/mock.ts create mode 100644 packages/alova/src/type.ts create mode 100644 packages/alova/tsconfig.json create mode 100644 packages/axios/package.json create mode 100644 packages/axios/src/constant.ts create mode 100644 packages/axios/src/index.ts create mode 100644 packages/axios/src/options.ts create mode 100644 packages/axios/src/shared.ts create mode 100644 packages/axios/src/type.ts create mode 100644 packages/axios/tsconfig.json create mode 100644 packages/color/package.json create mode 100644 packages/color/src/constant/index.ts create mode 100644 packages/color/src/constant/name.ts create mode 100644 packages/color/src/constant/palette.ts create mode 100644 packages/color/src/index.ts create mode 100644 packages/color/src/palette/antd.ts create mode 100644 packages/color/src/palette/index.ts create mode 100644 packages/color/src/palette/recommend.ts create mode 100644 packages/color/src/shared/colord.ts create mode 100644 packages/color/src/shared/index.ts create mode 100644 packages/color/src/shared/name.ts create mode 100644 packages/color/src/types/index.ts create mode 100644 packages/color/tsconfig.json create mode 100644 packages/hooks/package.json create mode 100644 packages/hooks/src/index.ts create mode 100644 packages/hooks/src/use-boolean.ts create mode 100644 packages/hooks/src/use-context.ts create mode 100644 packages/hooks/src/use-count-down.ts create mode 100644 packages/hooks/src/use-loading.ts create mode 100644 packages/hooks/src/use-request.ts create mode 100644 packages/hooks/src/use-svg-icon-render.ts create mode 100644 packages/hooks/src/use-table.ts create mode 100644 packages/hooks/tsconfig.json create mode 100644 packages/materials/package.json create mode 100644 packages/materials/src/index.ts create mode 100644 packages/materials/src/libs/admin-layout/index.module.css create mode 100644 packages/materials/src/libs/admin-layout/index.module.css.d.ts create mode 100644 packages/materials/src/libs/admin-layout/index.ts create mode 100644 packages/materials/src/libs/admin-layout/index.vue create mode 100644 packages/materials/src/libs/admin-layout/shared.ts create mode 100644 packages/materials/src/libs/page-tab/button-tab.vue create mode 100644 packages/materials/src/libs/page-tab/chrome-tab-bg.vue create mode 100644 packages/materials/src/libs/page-tab/chrome-tab.vue create mode 100644 packages/materials/src/libs/page-tab/index.module.css create mode 100644 packages/materials/src/libs/page-tab/index.module.css.d.ts create mode 100644 packages/materials/src/libs/page-tab/index.ts create mode 100644 packages/materials/src/libs/page-tab/index.vue create mode 100644 packages/materials/src/libs/page-tab/shared.ts create mode 100644 packages/materials/src/libs/page-tab/slider-tab.vue create mode 100644 packages/materials/src/libs/page-tab/svg-close.vue create mode 100644 packages/materials/src/libs/simple-scrollbar/index.ts create mode 100644 packages/materials/src/libs/simple-scrollbar/index.vue create mode 100644 packages/materials/src/types/index.ts create mode 100644 packages/materials/tsconfig.json create mode 100755 packages/scripts/bin.ts create mode 100644 packages/scripts/package.json create mode 100644 packages/scripts/src/commands/changelog.ts create mode 100644 packages/scripts/src/commands/cleanup.ts create mode 100644 packages/scripts/src/commands/git-commit.ts create mode 100644 packages/scripts/src/commands/index.ts create mode 100644 packages/scripts/src/commands/release.ts create mode 100644 packages/scripts/src/commands/router.ts create mode 100644 packages/scripts/src/commands/update-pkg.ts create mode 100644 packages/scripts/src/config/index.ts create mode 100755 packages/scripts/src/index.ts create mode 100644 packages/scripts/src/locales/index.ts create mode 100644 packages/scripts/src/shared/index.ts create mode 100644 packages/scripts/src/types/index.ts create mode 100644 packages/scripts/tsconfig.json create mode 100644 packages/uno-preset/package.json create mode 100644 packages/uno-preset/src/index.ts create mode 100644 packages/uno-preset/tsconfig.json create mode 100644 packages/utils/package.json create mode 100644 packages/utils/src/crypto.ts create mode 100644 packages/utils/src/index.ts create mode 100644 packages/utils/src/klona.ts create mode 100644 packages/utils/src/nanoid.ts create mode 100644 packages/utils/src/storage.ts create mode 100644 packages/utils/tsconfig.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 public/favicon.svg create mode 100644 public/streamsaver/mitm.html create mode 100644 public/streamsaver/sw.js create mode 100644 src/App.vue create mode 100644 src/assets/imgs/soybean.jpg create mode 100644 src/assets/svg-icon/activity.svg create mode 100644 src/assets/svg-icon/at-sign.svg create mode 100644 src/assets/svg-icon/avatar.svg create mode 100644 src/assets/svg-icon/banner.svg create mode 100644 src/assets/svg-icon/bell.svg create mode 100644 src/assets/svg-icon/cast.svg create mode 100644 src/assets/svg-icon/chrome.svg create mode 100644 src/assets/svg-icon/copy.svg create mode 100644 src/assets/svg-icon/custom-icon.svg create mode 100644 src/assets/svg-icon/empty-data.svg create mode 100644 src/assets/svg-icon/expectation.svg create mode 100644 src/assets/svg-icon/heart.svg create mode 100644 src/assets/svg-icon/login-background.svg create mode 100644 src/assets/svg-icon/logo.svg create mode 100644 src/assets/svg-icon/maxkey.svg create mode 100644 src/assets/svg-icon/menu/404.svg create mode 100644 src/assets/svg-icon/menu/bug.svg create mode 100644 src/assets/svg-icon/menu/build.svg create mode 100644 src/assets/svg-icon/menu/button.svg create mode 100644 src/assets/svg-icon/menu/caret-back.svg create mode 100644 src/assets/svg-icon/menu/caret-forward.svg create mode 100644 src/assets/svg-icon/menu/cascader.svg create mode 100644 src/assets/svg-icon/menu/category.svg create mode 100644 src/assets/svg-icon/menu/chart.svg create mode 100644 src/assets/svg-icon/menu/checkbox.svg create mode 100644 src/assets/svg-icon/menu/clipboard.svg create mode 100644 src/assets/svg-icon/menu/code.svg create mode 100644 src/assets/svg-icon/menu/color.svg create mode 100644 src/assets/svg-icon/menu/company.svg create mode 100644 src/assets/svg-icon/menu/component.svg create mode 100644 src/assets/svg-icon/menu/dashboard.svg create mode 100644 src/assets/svg-icon/menu/date-range.svg create mode 100644 src/assets/svg-icon/menu/date.svg create mode 100644 src/assets/svg-icon/menu/dict.svg create mode 100644 src/assets/svg-icon/menu/documentation.svg create mode 100644 src/assets/svg-icon/menu/download.svg create mode 100644 src/assets/svg-icon/menu/drag.svg create mode 100644 src/assets/svg-icon/menu/druid.svg create mode 100644 src/assets/svg-icon/menu/edit.svg create mode 100644 src/assets/svg-icon/menu/education.svg create mode 100644 src/assets/svg-icon/menu/email.svg create mode 100644 src/assets/svg-icon/menu/example.svg create mode 100644 src/assets/svg-icon/menu/excel.svg create mode 100644 src/assets/svg-icon/menu/exit-fullscreen.svg create mode 100644 src/assets/svg-icon/menu/eye-open.svg create mode 100644 src/assets/svg-icon/menu/eye.svg create mode 100644 src/assets/svg-icon/menu/finish.svg create mode 100644 src/assets/svg-icon/menu/form.svg create mode 100644 src/assets/svg-icon/menu/fullscreen.svg create mode 100644 src/assets/svg-icon/menu/gitee.svg create mode 100644 src/assets/svg-icon/menu/github.svg create mode 100644 src/assets/svg-icon/menu/guide.svg create mode 100644 src/assets/svg-icon/menu/icon.svg create mode 100644 src/assets/svg-icon/menu/input.svg create mode 100644 src/assets/svg-icon/menu/international.svg create mode 100644 src/assets/svg-icon/menu/job.svg create mode 100644 src/assets/svg-icon/menu/language.svg create mode 100644 src/assets/svg-icon/menu/link.svg create mode 100644 src/assets/svg-icon/menu/list.svg create mode 100644 src/assets/svg-icon/menu/lock.svg create mode 100644 src/assets/svg-icon/menu/log.svg create mode 100644 src/assets/svg-icon/menu/logininfor.svg create mode 100644 src/assets/svg-icon/menu/message.svg create mode 100644 src/assets/svg-icon/menu/model.svg create mode 100644 src/assets/svg-icon/menu/money.svg create mode 100644 src/assets/svg-icon/menu/monitor.svg create mode 100644 src/assets/svg-icon/menu/my-copy.svg create mode 100644 src/assets/svg-icon/menu/my-task.svg create mode 100644 src/assets/svg-icon/menu/nested.svg create mode 100644 src/assets/svg-icon/menu/number.svg create mode 100644 src/assets/svg-icon/menu/online.svg create mode 100644 src/assets/svg-icon/menu/password.svg create mode 100644 src/assets/svg-icon/menu/pdf.svg create mode 100644 src/assets/svg-icon/menu/people.svg create mode 100644 src/assets/svg-icon/menu/peoples.svg create mode 100644 src/assets/svg-icon/menu/phone.svg create mode 100644 src/assets/svg-icon/menu/post.svg create mode 100644 src/assets/svg-icon/menu/process-definition.svg create mode 100644 src/assets/svg-icon/menu/qq.svg create mode 100644 src/assets/svg-icon/menu/question.svg create mode 100644 src/assets/svg-icon/menu/radio.svg create mode 100644 src/assets/svg-icon/menu/rate.svg create mode 100644 src/assets/svg-icon/menu/redis-list.svg create mode 100644 src/assets/svg-icon/menu/redis.svg create mode 100644 src/assets/svg-icon/menu/row.svg create mode 100644 src/assets/svg-icon/menu/search.svg create mode 100644 src/assets/svg-icon/menu/select.svg create mode 100644 src/assets/svg-icon/menu/server.svg create mode 100644 src/assets/svg-icon/menu/shopping.svg create mode 100644 src/assets/svg-icon/menu/size.svg create mode 100644 src/assets/svg-icon/menu/skill.svg create mode 100644 src/assets/svg-icon/menu/slider.svg create mode 100644 src/assets/svg-icon/menu/star.svg create mode 100644 src/assets/svg-icon/menu/swagger.svg create mode 100644 src/assets/svg-icon/menu/switch.svg create mode 100644 src/assets/svg-icon/menu/system.svg create mode 100644 src/assets/svg-icon/menu/tab.svg create mode 100644 src/assets/svg-icon/menu/table.svg create mode 100644 src/assets/svg-icon/menu/textarea.svg create mode 100644 src/assets/svg-icon/menu/theme.svg create mode 100644 src/assets/svg-icon/menu/time-range.svg create mode 100644 src/assets/svg-icon/menu/time.svg create mode 100644 src/assets/svg-icon/menu/tool.svg create mode 100644 src/assets/svg-icon/menu/tree-table.svg create mode 100644 src/assets/svg-icon/menu/tree.svg create mode 100644 src/assets/svg-icon/menu/upload.svg create mode 100644 src/assets/svg-icon/menu/user.svg create mode 100644 src/assets/svg-icon/menu/validCode.svg create mode 100644 src/assets/svg-icon/menu/waiting.svg create mode 100644 src/assets/svg-icon/menu/wechat.svg create mode 100644 src/assets/svg-icon/menu/workflow.svg create mode 100644 src/assets/svg-icon/menu/zip.svg create mode 100644 src/assets/svg-icon/network-error.svg create mode 100644 src/assets/svg-icon/no-icon.svg create mode 100644 src/assets/svg-icon/no-permission.svg create mode 100644 src/assets/svg-icon/not-found.svg create mode 100644 src/assets/svg-icon/service-error.svg create mode 100644 src/assets/svg-icon/topiam.svg create mode 100644 src/assets/svg-icon/wind.svg create mode 100644 src/components/advanced/table-column-setting.vue create mode 100644 src/components/advanced/table-header-operation.vue create mode 100644 src/components/advanced/table-row-check-alert.vue create mode 100644 src/components/advanced/table-sider-layout.vue create mode 100644 src/components/common/app-provider.vue create mode 100644 src/components/common/dark-mode-container.vue create mode 100644 src/components/common/data-table.vue create mode 100644 src/components/common/exception-base.vue create mode 100644 src/components/common/full-screen.vue create mode 100644 src/components/common/icon-tooltip.vue create mode 100644 src/components/common/lang-switch.vue create mode 100644 src/components/common/menu-toggler.vue create mode 100644 src/components/common/pin-toggler.vue create mode 100644 src/components/common/reload-button.vue create mode 100644 src/components/common/system-logo.vue create mode 100644 src/components/common/theme-schema-switch.vue create mode 100644 src/components/custom/better-scroll.vue create mode 100644 src/components/custom/boolean-tag.vue create mode 100644 src/components/custom/button-icon.vue create mode 100644 src/components/custom/count-to.vue create mode 100644 src/components/custom/dept-tree-select.vue create mode 100644 src/components/custom/dept-tree.vue create mode 100644 src/components/custom/dict-checkbox.vue create mode 100644 src/components/custom/dict-radio.vue create mode 100644 src/components/custom/dict-select.vue create mode 100644 src/components/custom/dict-tag.vue create mode 100644 src/components/custom/file-upload.vue create mode 100644 src/components/custom/form-tip.vue create mode 100644 src/components/custom/json-preview.vue create mode 100644 src/components/custom/look-forward.vue create mode 100644 src/components/custom/menu-tree-select.vue create mode 100644 src/components/custom/menu-tree.vue create mode 100644 src/components/custom/oss-upload.vue create mode 100644 src/components/custom/post-select.vue create mode 100644 src/components/custom/role-select.vue create mode 100644 src/components/custom/soybean-avatar.vue create mode 100644 src/components/custom/status-switch.vue create mode 100644 src/components/custom/svg-icon.vue create mode 100644 src/components/custom/tenant-select.vue create mode 100644 src/components/custom/umo-doc-editor.vue create mode 100644 src/components/custom/user-select.vue create mode 100644 src/components/custom/wave-bg.vue create mode 100644 src/constants/app.ts create mode 100644 src/constants/business.ts create mode 100644 src/constants/common.ts create mode 100644 src/constants/reg.ts create mode 100644 src/enum/business.ts create mode 100644 src/enum/index.ts create mode 100644 src/hooks/business/auth.ts create mode 100644 src/hooks/business/captcha.ts create mode 100644 src/hooks/business/dict.ts create mode 100644 src/hooks/business/download.ts create mode 100644 src/hooks/common/echarts.ts create mode 100644 src/hooks/common/form.ts create mode 100644 src/hooks/common/icon.ts create mode 100644 src/hooks/common/loading.ts create mode 100644 src/hooks/common/router.ts create mode 100644 src/hooks/common/table.ts create mode 100644 src/layouts/base-layout/index.vue create mode 100644 src/layouts/blank-layout/index.vue create mode 100644 src/layouts/modules/global-breadcrumb/index.vue create mode 100644 src/layouts/modules/global-content/index.vue create mode 100644 src/layouts/modules/global-footer/index.vue create mode 100644 src/layouts/modules/global-header/components/message-button.vue create mode 100644 src/layouts/modules/global-header/components/theme-button.vue create mode 100644 src/layouts/modules/global-header/components/user-avatar.vue create mode 100644 src/layouts/modules/global-header/index.vue create mode 100644 src/layouts/modules/global-logo/index.vue create mode 100644 src/layouts/modules/global-menu/components/first-level-menu.vue create mode 100644 src/layouts/modules/global-menu/context/index.ts create mode 100644 src/layouts/modules/global-menu/index.vue create mode 100644 src/layouts/modules/global-menu/modules/horizontal-menu.vue create mode 100644 src/layouts/modules/global-menu/modules/top-hybrid-header-first.vue create mode 100644 src/layouts/modules/global-menu/modules/top-hybrid-sidebar-first.vue create mode 100644 src/layouts/modules/global-menu/modules/vertical-hybrid-header-first.vue create mode 100644 src/layouts/modules/global-menu/modules/vertical-menu.vue create mode 100644 src/layouts/modules/global-menu/modules/vertical-mix-menu.vue create mode 100644 src/layouts/modules/global-search/components/search-footer.vue create mode 100644 src/layouts/modules/global-search/components/search-modal.vue create mode 100644 src/layouts/modules/global-search/components/search-result.vue create mode 100644 src/layouts/modules/global-search/index.vue create mode 100644 src/layouts/modules/global-sider/index.vue create mode 100644 src/layouts/modules/global-tab/context-menu.vue create mode 100644 src/layouts/modules/global-tab/index.vue create mode 100644 src/layouts/modules/theme-drawer/components/layout-mode-card.vue create mode 100644 src/layouts/modules/theme-drawer/components/setting-item.vue create mode 100644 src/layouts/modules/theme-drawer/index.vue create mode 100644 src/layouts/modules/theme-drawer/modules/appearance/index.vue create mode 100644 src/layouts/modules/theme-drawer/modules/appearance/modules/theme-color.vue create mode 100644 src/layouts/modules/theme-drawer/modules/appearance/modules/theme-radius.vue create mode 100644 src/layouts/modules/theme-drawer/modules/appearance/modules/theme-schema.vue create mode 100644 src/layouts/modules/theme-drawer/modules/config-operation.vue create mode 100644 src/layouts/modules/theme-drawer/modules/general/index.vue create mode 100644 src/layouts/modules/theme-drawer/modules/general/modules/global-settings.vue create mode 100644 src/layouts/modules/theme-drawer/modules/general/modules/watermark-settings.vue create mode 100644 src/layouts/modules/theme-drawer/modules/layout/index.vue create mode 100644 src/layouts/modules/theme-drawer/modules/layout/modules/content-settings.vue create mode 100644 src/layouts/modules/theme-drawer/modules/layout/modules/footer-settings.vue create mode 100644 src/layouts/modules/theme-drawer/modules/layout/modules/header-settings.vue create mode 100644 src/layouts/modules/theme-drawer/modules/layout/modules/layout-mode.vue create mode 100644 src/layouts/modules/theme-drawer/modules/layout/modules/sider-settings.vue create mode 100644 src/layouts/modules/theme-drawer/modules/layout/modules/tab-settings.vue create mode 100644 src/layouts/modules/theme-drawer/modules/layout/modules/table-settings.vue create mode 100644 src/layouts/modules/theme-drawer/modules/preset/index.vue create mode 100644 src/layouts/modules/theme-drawer/modules/preset/modules/theme-preset.vue create mode 100644 src/layouts/modules/theme-drawer/modules/table-props.vue create mode 100644 src/locales/dayjs.ts create mode 100644 src/locales/index.ts create mode 100644 src/locales/langs/en-us.ts create mode 100644 src/locales/langs/zh-cn.ts create mode 100644 src/locales/locale.ts create mode 100644 src/locales/naive.ts create mode 100644 src/main.ts create mode 100644 src/plugins/app.ts create mode 100644 src/plugins/assets.ts create mode 100644 src/plugins/dayjs.ts create mode 100644 src/plugins/iconify.ts create mode 100644 src/plugins/index.ts create mode 100644 src/plugins/loading.ts create mode 100644 src/plugins/nprogress.ts create mode 100644 src/router/elegant/imports.ts create mode 100644 src/router/elegant/routes.ts create mode 100644 src/router/elegant/transform.ts create mode 100644 src/router/guard/index.ts create mode 100644 src/router/guard/progress.ts create mode 100644 src/router/guard/route.ts create mode 100644 src/router/guard/title.ts create mode 100644 src/router/index.ts create mode 100644 src/router/routes/builtin.ts create mode 100644 src/router/routes/index.ts create mode 100644 src/service/api/art/school-campus.ts create mode 100644 src/service/api/art/school-college.ts create mode 100644 src/service/api/art/school-detail.ts create mode 100644 src/service/api/art/school-dorm.ts create mode 100644 src/service/api/art/school-enroll-plan.ts create mode 100644 src/service/api/art/school-major-tag.ts create mode 100644 src/service/api/art/school-major.ts create mode 100644 src/service/api/art/school-media.ts create mode 100644 src/service/api/art/school-name.ts create mode 100644 src/service/api/art/school-tag.ts create mode 100644 src/service/api/art/school.ts create mode 100644 src/service/api/auth.ts create mode 100644 src/service/api/demo/demo.ts create mode 100644 src/service/api/demo/index.ts create mode 100644 src/service/api/demo/tree.ts create mode 100644 src/service/api/index.ts create mode 100644 src/service/api/monitor/cache.ts create mode 100644 src/service/api/monitor/index.ts create mode 100644 src/service/api/monitor/login-infor.ts create mode 100644 src/service/api/monitor/online.ts create mode 100644 src/service/api/monitor/oper-log.ts create mode 100644 src/service/api/route.ts create mode 100644 src/service/api/system/client.ts create mode 100644 src/service/api/system/config.ts create mode 100644 src/service/api/system/dept.ts create mode 100644 src/service/api/system/dict-data.ts create mode 100644 src/service/api/system/dict.ts create mode 100644 src/service/api/system/index.ts create mode 100644 src/service/api/system/menu.ts create mode 100644 src/service/api/system/notice.ts create mode 100644 src/service/api/system/oss-config.ts create mode 100644 src/service/api/system/oss.ts create mode 100644 src/service/api/system/post.ts create mode 100644 src/service/api/system/role.ts create mode 100644 src/service/api/system/social.ts create mode 100644 src/service/api/system/tenant-package.ts create mode 100644 src/service/api/system/tenant.ts create mode 100644 src/service/api/system/user.ts create mode 100644 src/service/api/tool/gen.ts create mode 100644 src/service/api/tool/index.ts create mode 100644 src/service/request/index.ts create mode 100644 src/service/request/shared.ts create mode 100644 src/service/request/type.ts create mode 100644 src/store/index.ts create mode 100644 src/store/modules/app/index.ts create mode 100644 src/store/modules/auth/index.ts create mode 100644 src/store/modules/auth/shared.ts create mode 100644 src/store/modules/dict/index.ts create mode 100644 src/store/modules/notice/index.ts create mode 100644 src/store/modules/route/index.ts create mode 100644 src/store/modules/route/shared.ts create mode 100644 src/store/modules/tab/index.ts create mode 100644 src/store/modules/tab/shared.ts create mode 100644 src/store/modules/theme/index.ts create mode 100644 src/store/modules/theme/shared.ts create mode 100644 src/store/plugins/index.ts create mode 100644 src/styles/css/global.css create mode 100644 src/styles/css/nprogress.css create mode 100644 src/styles/css/reset.css create mode 100644 src/styles/css/transition.css create mode 100644 src/styles/scss/custom.scss create mode 100644 src/styles/scss/global.scss create mode 100644 src/styles/scss/loading.scss create mode 100644 src/styles/scss/scrollbar.scss create mode 100644 src/theme/preset/azir.json create mode 100644 src/theme/preset/compact.json create mode 100644 src/theme/preset/dark.json create mode 100644 src/theme/preset/default.json create mode 100644 src/theme/preset/soybean.json create mode 100644 src/theme/settings.ts create mode 100644 src/theme/vars.ts create mode 100644 src/typings/api/api.d.ts create mode 100644 src/typings/api/art.school-campus.api.d.ts create mode 100644 src/typings/api/art.school-college.api.d.ts create mode 100644 src/typings/api/art.school-detail.api.d.ts create mode 100644 src/typings/api/art.school-dorm.api.d.ts create mode 100644 src/typings/api/art.school-enroll-plan.api.d.ts create mode 100644 src/typings/api/art.school-major-tag.api.d.ts create mode 100644 src/typings/api/art.school-major.api.d.ts create mode 100644 src/typings/api/art.school-media.api.d.ts create mode 100644 src/typings/api/art.school-name.api.d.ts create mode 100644 src/typings/api/art.school-tag.api.d.ts create mode 100644 src/typings/api/art.school.api.d.ts create mode 100644 src/typings/api/auth.d.ts create mode 100644 src/typings/api/demo.api.d.ts create mode 100644 src/typings/api/monitor.api.d.ts create mode 100644 src/typings/api/route.d.ts create mode 100644 src/typings/api/system.api.d.ts create mode 100644 src/typings/api/tool.api.d.ts create mode 100644 src/typings/app.d.ts create mode 100644 src/typings/common.d.ts create mode 100644 src/typings/components.d.ts create mode 100644 src/typings/elegant-router.d.ts create mode 100644 src/typings/global.d.ts create mode 100644 src/typings/naive-ui.d.ts create mode 100644 src/typings/router.d.ts create mode 100644 src/typings/storage.d.ts create mode 100644 src/typings/union-key.d.ts create mode 100644 src/typings/vite-env.d.ts create mode 100644 src/utils/agent.ts create mode 100644 src/utils/common.ts create mode 100644 src/utils/copy.ts create mode 100644 src/utils/crypto.ts create mode 100644 src/utils/icon-tag-format.ts create mode 100644 src/utils/icon.ts create mode 100644 src/utils/jsencrypt.ts create mode 100644 src/utils/service.ts create mode 100644 src/utils/sse.ts create mode 100644 src/utils/storage.ts create mode 100644 src/utils/websocket.ts create mode 100644 src/views/_builtin/403/index.vue create mode 100644 src/views/_builtin/404/index.vue create mode 100644 src/views/_builtin/500/index.vue create mode 100644 src/views/_builtin/iframe-page/[url].vue create mode 100644 src/views/_builtin/login/index.vue create mode 100644 src/views/_builtin/login/modules/bind-wechat.vue create mode 100644 src/views/_builtin/login/modules/code-login.vue create mode 100644 src/views/_builtin/login/modules/pwd-login.vue create mode 100644 src/views/_builtin/login/modules/register.vue create mode 100644 src/views/_builtin/login/modules/reset-pwd.vue create mode 100644 src/views/_builtin/social-callback/index.vue create mode 100644 src/views/_builtin/user-center/index.vue create mode 100644 src/views/_builtin/user-center/modules/online-table.vue create mode 100644 src/views/_builtin/user-center/modules/social-card.vue create mode 100644 src/views/_builtin/user-center/modules/user-avatar.vue create mode 100644 src/views/about/index.vue create mode 100644 src/views/art/school/index.vue create mode 100644 src/views/art/school/modules/school-campus/index.vue create mode 100644 src/views/art/school/modules/school-campus/modules/school-campus-operate-drawer.vue create mode 100644 src/views/art/school/modules/school-campus/modules/school-campus-search.vue create mode 100644 src/views/art/school/modules/school-college/index.vue create mode 100644 src/views/art/school/modules/school-college/modules/school-college-operate-drawer.vue create mode 100644 src/views/art/school/modules/school-college/modules/school-college-search.vue create mode 100644 src/views/art/school/modules/school-detail/index.vue create mode 100644 src/views/art/school/modules/school-detail/modules/school-detail-operate-drawer.vue create mode 100644 src/views/art/school/modules/school-detail/modules/school-detail-search.vue create mode 100644 src/views/art/school/modules/school-dorm/index.vue create mode 100644 src/views/art/school/modules/school-dorm/modules/school-dorm-operate-drawer.vue create mode 100644 src/views/art/school/modules/school-dorm/modules/school-dorm-search.vue create mode 100644 src/views/art/school/modules/school-enroll-plan/index.vue create mode 100644 src/views/art/school/modules/school-enroll-plan/modules/school-enroll-plan-operate-drawer.vue create mode 100644 src/views/art/school/modules/school-enroll-plan/modules/school-enroll-plan-search.vue create mode 100644 src/views/art/school/modules/school-import-modal.vue create mode 100644 src/views/art/school/modules/school-major-tag/index.vue create mode 100644 src/views/art/school/modules/school-major-tag/modules/school-major-tag-operate-drawer.vue create mode 100644 src/views/art/school/modules/school-major-tag/modules/school-major-tag-search.vue create mode 100644 src/views/art/school/modules/school-major/index.vue create mode 100644 src/views/art/school/modules/school-major/modules/school-major-operate-drawer.vue create mode 100644 src/views/art/school/modules/school-major/modules/school-major-search.vue create mode 100644 src/views/art/school/modules/school-media/index.vue create mode 100644 src/views/art/school/modules/school-media/modules/school-media-operate-drawer.vue create mode 100644 src/views/art/school/modules/school-media/modules/school-media-search.vue create mode 100644 src/views/art/school/modules/school-name/index.vue create mode 100644 src/views/art/school/modules/school-name/modules/school-name-operate-drawer.vue create mode 100644 src/views/art/school/modules/school-name/modules/school-name-search.vue create mode 100644 src/views/art/school/modules/school-operate-drawer.vue create mode 100644 src/views/art/school/modules/school-search.vue create mode 100644 src/views/art/school/modules/school-sub-table-modal.vue create mode 100644 src/views/art/school/modules/school-tag/index.vue create mode 100644 src/views/art/school/modules/school-tag/modules/school-tag-operate-drawer.vue create mode 100644 src/views/art/school/modules/school-tag/modules/school-tag-search.vue create mode 100644 src/views/demo/demo/index.vue create mode 100644 src/views/demo/demo/modules/demo-operate-drawer.vue create mode 100644 src/views/demo/demo/modules/demo-search.vue create mode 100644 src/views/demo/tree/index.vue create mode 100644 src/views/demo/tree/modules/tree-operate-drawer.vue create mode 100644 src/views/demo/tree/modules/tree-search.vue create mode 100644 src/views/home/index.vue create mode 100644 src/views/home/modules/card-data.vue create mode 100644 src/views/home/modules/creativity-banner.vue create mode 100644 src/views/home/modules/header-banner.vue create mode 100644 src/views/home/modules/line-chart.vue create mode 100644 src/views/home/modules/pie-chart.vue create mode 100644 src/views/home/modules/project-news.vue create mode 100644 src/views/monitor/cache/index.vue create mode 100644 src/views/monitor/logininfor/index.vue create mode 100644 src/views/monitor/logininfor/modules/login-infor-search.vue create mode 100644 src/views/monitor/logininfor/modules/login-infor-view-drawer.vue create mode 100644 src/views/monitor/online/index.vue create mode 100644 src/views/monitor/online/modules/online-search.vue create mode 100644 src/views/monitor/operlog/index.vue create mode 100644 src/views/monitor/operlog/modules/oper-log-search.vue create mode 100644 src/views/monitor/operlog/modules/oper-log-view-drawer.vue create mode 100644 src/views/system/client/index.vue create mode 100644 src/views/system/client/modules/client-operate-drawer.vue create mode 100644 src/views/system/client/modules/client-search.vue create mode 100644 src/views/system/config/index.vue create mode 100644 src/views/system/config/modules/config-operate-drawer.vue create mode 100644 src/views/system/config/modules/config-search.vue create mode 100644 src/views/system/dept/index.vue create mode 100644 src/views/system/dept/modules/dept-operate-drawer.vue create mode 100644 src/views/system/dept/modules/dept-search.vue create mode 100644 src/views/system/dict/index.vue create mode 100644 src/views/system/dict/modules/dict-data-operate-drawer.vue create mode 100644 src/views/system/dict/modules/dict-data-search.vue create mode 100644 src/views/system/dict/modules/dict-type-operate-drawer.vue create mode 100644 src/views/system/menu/index.vue create mode 100644 src/views/system/menu/modules/menu-cascade-delete-modal.vue create mode 100644 src/views/system/menu/modules/menu-operate-drawer.vue create mode 100644 src/views/system/notice/index.vue create mode 100644 src/views/system/notice/modules/notice-operate-drawer.vue create mode 100644 src/views/system/notice/modules/notice-search.vue create mode 100644 src/views/system/oss-config/index.vue create mode 100644 src/views/system/oss-config/modules/oss-config-operate-drawer.vue create mode 100644 src/views/system/oss-config/modules/oss-config-search.vue create mode 100644 src/views/system/oss/index.vue create mode 100644 src/views/system/oss/modules/oss-search.vue create mode 100644 src/views/system/oss/modules/oss-upload-modal.vue create mode 100644 src/views/system/post/index.vue create mode 100644 src/views/system/post/modules/post-operate-drawer.vue create mode 100644 src/views/system/post/modules/post-search.vue create mode 100644 src/views/system/role/index.vue create mode 100644 src/views/system/role/modules/role-auth-user-drawer.vue create mode 100644 src/views/system/role/modules/role-data-scope-drawer.vue create mode 100644 src/views/system/role/modules/role-operate-drawer.vue create mode 100644 src/views/system/role/modules/role-search.vue create mode 100644 src/views/system/tenant-package/index.vue create mode 100644 src/views/system/tenant-package/modules/tenant-package-operate-drawer.vue create mode 100644 src/views/system/tenant-package/modules/tenant-package-search.vue create mode 100644 src/views/system/tenant/index.vue create mode 100644 src/views/system/tenant/modules/tenant-operate-drawer.vue create mode 100644 src/views/system/tenant/modules/tenant-search.vue create mode 100644 src/views/system/user/index.vue create mode 100644 src/views/system/user/modules/user-import-modal.vue create mode 100644 src/views/system/user/modules/user-operate-drawer.vue create mode 100644 src/views/system/user/modules/user-password-drawer.vue create mode 100644 src/views/system/user/modules/user-search.vue create mode 100644 src/views/tool/gen/index.vue create mode 100644 src/views/tool/gen/modules/gen-table-db-search.vue create mode 100644 src/views/tool/gen/modules/gen-table-import-drawer.vue create mode 100644 src/views/tool/gen/modules/gen-table-operate-drawer.vue create mode 100644 src/views/tool/gen/modules/gen-table-preview-drawer.vue create mode 100644 src/views/tool/gen/modules/gen-table-search.vue create mode 100644 tsconfig.json create mode 100644 uno.config.ts create mode 100644 vite.config.ts diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..786f8d9 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,73 @@ +kind: pipeline +type: docker +name: Build and Deploy + +clone: + depth: 10 + +volumes: + - name: go_cache + host: + path: /data/drone_cache/go_cache + +steps: + - name: restore-cache + image: drillster/drone-volume-cache + volumes: + - name: go_cache + path: /cache + settings: + restore: true + mount: + - ./.npm-cache + - ./node_modules + + - name: build + image: node:alpine + pull: if-not-exists + commands: + - export NODE_OPTIONS=--max_old_space_size=6144 + - echo ${DRONE_BRANCH} + - echo ${DRONE_TAG} + - echo ${DRONE_COMMIT} + - echo ${DRONE_COMMIT:0-7} + - npm config set registry https://registry.npmmirror.com + - npm install -g pnpm + - pnpm config set registry https://registry.npmmirror.com + - pnpm i + - pnpm build + + - name: rebuild-cache + image: drillster/drone-volume-cache + volumes: + - name: go_cache + path: /cache + settings: + rebuild: true + mount: + - ./.npm-cache + - ./node_modules + + - name: scp files + image: appleboy/drone-scp + pull: if-not-exists + settings: + host: + from_secret: HOST + username: + from_secret: USERNAME + password: + from_secret: PASSWORD + port: + from_secret: PORT + target: + from_secret: TARGET_PATH + source: dist/* + overwrite: true + rm: true + +trigger: + branch: + - master + event: + - push diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0552777 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +# Editor configuration, see http://editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.env b/.env new file mode 100644 index 0000000..843cda9 --- /dev/null +++ b/.env @@ -0,0 +1,63 @@ +# the base url of the application, the default is "/" +# if use a sub directory, it must be end with "/", like "/admin/" but not "/admin" +VITE_BASE_URL=/ + +VITE_APP_TITLE=RuoYi Plus Soybean + +VITE_APP_DESC=RuoYi Plus Soybean 后台管理系统 + +# the prefix of the icon name +VITE_ICON_PREFIX=icon + +# the prefix of the local svg icon component, must include VITE_ICON_PREFIX +# format {VITE_ICON_PREFIX}-{local icon name} +VITE_ICON_LOCAL_PREFIX=icon-local + +# auth route mode: static | dynamic +VITE_AUTH_ROUTE_MODE=dynamic + +# static auth route home +VITE_ROUTE_HOME=home + +# default menu icon +VITE_MENU_ICON=mdi:menu + +# whether to enable http proxy when is dev mode +VITE_HTTP_PROXY=Y + +# vue-router mode: hash | history | memory +VITE_ROUTER_HISTORY_MODE=history + +# success code of backend service, when the code is received, the request is successful +VITE_SERVICE_SUCCESS_CODE=200 + +# logout codes of backend service, when the code is received, the user will be logged out and redirected to login page +VITE_SERVICE_LOGOUT_CODES=401 + +# modal logout codes of backend service, when the code is received, the user will be logged out by displaying a modal +VITE_SERVICE_MODAL_LOGOUT_CODES=401 + +# token expired codes of backend service, when the code is received, it will refresh the token and resend the request +VITE_SERVICE_EXPIRED_TOKEN_CODES=9999,9998,3333 + +# when the route mode is static, the defined super role +VITE_STATIC_SUPER_ROLE=R_SUPER + +# sourcemap +VITE_SOURCE_MAP=N + +# Used to differentiate storage across different domains +VITE_STORAGE_PREFIX=RY_ + +# used to control whether the program automatically detects updates +VITE_AUTOMATICALLY_DETECT_UPDATE=Y + +# watermark +VITE_WATERMARK=N + +# show proxy url log in terminal +VITE_PROXY_LOG=Y + +# used to control whether to launch editor +# by the way, this plugin is only available in dev mode, not in build mode +VITE_DEVTOOLS_LAUNCH_EDITOR=code diff --git a/.env.dev b/.env.dev new file mode 100644 index 0000000..5fa28ae --- /dev/null +++ b/.env.dev @@ -0,0 +1,26 @@ +# backend service base url, test environment +VITE_SERVICE_BASE_URL=http://localhost:8080 + +VITE_APP_BASE_API=/dev-api + +# watermark +VITE_WATERMARK=N +# 是否开启 SSE 功能 +VITE_APP_SSE=Y +# 是否开启 websocket 功能 +VITE_APP_WEBSOCKET=N + +# app client id +VITE_APP_CLIENT_ID=e5cd7e4891bf95d1d19206ce24a7b32e + +# 记住密码 AES 加密密钥 +VITE_REMEMBER_ME_AES_KEY=pC4aO6cD2uU7hA0bK6iD4vE1mV8sU8xG + +# 接口加密功能开关(如需关闭 后端也必须对应关闭) +VITE_APP_ENCRYPT=Y +# AES 加密头标识 +VITE_HEADER_FLAG=encrypt-key +# 接口加密传输 RSA 公钥与后端解密私钥对应 如更换需前后端一同更换 +VITE_APP_RSA_PUBLIC_KEY='MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' +# 接口响应解密 RSA 私钥与后端加密公钥对应 如更换需前后端一同更换 +VITE_APP_RSA_PRIVATE_KEY='MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=' diff --git a/.env.prod b/.env.prod new file mode 100644 index 0000000..8c47c8a --- /dev/null +++ b/.env.prod @@ -0,0 +1,23 @@ +VITE_APP_BASE_API=/prod-api + +# watermark +VITE_WATERMARK=Y +# 是否开启 SSE 功能 +VITE_APP_SSE=Y +# 是否开启 websocket 功能 +VITE_APP_WEBSOCKET=N + +# app client id +VITE_APP_CLIENT_ID=e5cd7e4891bf95d1d19206ce24a7b32e + +# 记住密码 AES 加密密钥 +VITE_REMEMBER_ME_AES_KEY=pC4aO6cD2uU7hA0bK6iD4vE1mV8sU8xG + +# 接口加密功能开关(如需关闭 后端也必须对应关闭) +VITE_APP_ENCRYPT=Y +# AES 加密头标识 +VITE_HEADER_FLAG=encrypt-key +# 接口加密传输 RSA 公钥与后端解密私钥对应 如更换需前后端一同更换 +VITE_APP_RSA_PUBLIC_KEY='MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' +# 接口响应解密 RSA 私钥与后端加密公钥对应 如更换需前后端一同更换 +VITE_APP_RSA_PRIVATE_KEY='MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=' diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..e45ccdc --- /dev/null +++ b/.env.test @@ -0,0 +1,23 @@ +VITE_APP_BASE_API=/test-api + +# watermark +VITE_WATERMARK=Y +# 是否开启 SSE 功能 +VITE_APP_SSE=Y +# 是否开启 websocket 功能 +VITE_APP_WEBSOCKET=N + +# app client id +VITE_APP_CLIENT_ID=e5cd7e4891bf95d1d19206ce24a7b32e + +# 记住密码 AES 加密密钥 +VITE_REMEMBER_ME_AES_KEY=pC4aO6cD2uU7hA0bK6iD4vE1mV8sU8xG + +# 接口加密功能开关(如需关闭 后端也必须对应关闭) +VITE_APP_ENCRYPT=Y +# AES 加密头标识 +VITE_HEADER_FLAG=encrypt-key +# 接口加密传输 RSA 公钥与后端解密私钥对应 如更换需前后端一同更换 +VITE_APP_RSA_PUBLIC_KEY='MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' +# 接口响应解密 RSA 私钥与后端加密公钥对应 如更换需前后端一同更换 +VITE_APP_RSA_PRIVATE_KEY='MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=' diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9553ccb --- /dev/null +++ b/.gitattributes @@ -0,0 +1,13 @@ +"*.vue" eol=lf +"*.js" eol=lf +"*.ts" eol=lf +"*.jsx" eol=lf +"*.tsx" eol=lf +"*.mjs" eol=lf +"*.json" eol=lf +"*.html" eol=lf +"*.css" eol=lf +"*.scss" eol=lf +"*.md" eol=lf +"*.yaml" eol=lf +"*.yml" eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fdd159a --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +!.vscode/settings.json +!.vscode/launch.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +package-lock.json +yarn.lock + +.VSCodeCounter diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..dfc2d68 --- /dev/null +++ b/.npmrc @@ -0,0 +1,4 @@ +registry=https://registry.npmmirror.com/ +shamefully-hoist=true +ignore-workspace-root-check=true +link-workspace-packages=true diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..83a3146 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,19 @@ +{ + "recommendations": [ + "afzalsayed96.icones", + "antfu.iconify", + "antfu.unocss", + "dbaeumer.vscode-eslint", + "editorconfig.editorconfig", + "lokalise.i18n-ally", + "mhutchie.git-graph", + "mikestead.dotenv", + "naumovs.color-highlight", + "pkief.material-icon-theme", + "sdras.vue-vscode-snippets", + "vue.volar", + "whtouche.vscode-js-console-utils", + "zhuangtongfa.material-theme", + "tu6ge.naive-ui-intelligence" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..e59c32b --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,22 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Vue Debugger", + "url": "http://localhost:9527", + "webRoot": "${workspaceFolder}" + }, + { + "type": "node", + "request": "launch", + "name": "TS Debugger", + "runtimeExecutable": "tsx", + "skipFiles": ["/**", "${workspaceFolder}/node_modules/**"], + "program": "${file}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..6236cf2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,40 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "never" + }, + "editor.formatOnSave": false, + "eslint.validate": [ + "html", + "css", + "scss", + "json", + "jsonc", + "javascript", + "javascriptreact", + "typescript", + "typescriptreact", + "vue" + ], + "i18n-ally.displayLanguage": "zh-cn", + "i18n-ally.enabledParsers": ["ts"], + "i18n-ally.enabledFrameworks": ["vue"], + "i18n-ally.editor.preferEditor": true, + "i18n-ally.keystyle": "nested", + "i18n-ally.localesPaths": ["src/locales/langs"], + "i18n-ally.parsers.typescript.compilerOptions": { + "moduleResolution": "node" + }, + "prettier.enable": false, + "typescript.tsdk": "node_modules/typescript/lib", + "unocss.root": ["./"], + "vue.server.hybridMode": true, + "files.exclude": { "/docs": true }, + "search.exclude": { + "/docs": true, + "**/dist/**": true, + "**/node_modules": true, + "node_modules/**": true, + }, + "cSpell.words": ["Axios", "tinymce"] +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..abe3e14 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,501 @@ +# 更新日志 + +## [v2.0.0](https://gitee.com/xlsea/ruoyi-plus-soybean/compare/v1.2.1...v2.0.0) (2025-12-25) + +###    🚀 新功能 + +- **components**: + - 列设置新增滚动条处理  -  by @m-xlsea [(6696d)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/6696da52) + - 优化文件上传组件提示内容  -  by @m-xlsea [(7bd11)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7bd115bf) + - 新增预设主题支持  -  by @m-xlsea [(c1063)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/c1063e3e) +- **docs**: + - 新增 GitCode star 徽章  -  by @m-xlsea [(5310d)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/5310d352) +- **hooks**: + - 优化表格响应数据处理  -  by @m-xlsea [(7d7f2)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7d7f28c4) + - 完成表格 Hooks 改造  -  by @m-xlsea [(46996)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/4699654f) + - 优化树形表格 hooks 封装  -  by @m-xlsea [(ccbb7)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/ccbb72c0) +- **project**: + - 优化业务代码语法格式  -  by @m-xlsea [(7f04b)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7f04b119) +- **projects**: + - 项目适配 Soybean 2.0  -  by @m-xlsea + - 客户端管理新增状态修改开关  -  by @m-xlsea [(ea6a9)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/ea6a92cd) + - Iframe 类型菜单传参更改  -  by @m-xlsea [(bf3d5)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/bf3d5cb3) + - 新增同步租户参数配置功能  -  by @m-xlsea [(901a6)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/901a65ad) + - 新增关于页面  -  by @m-xlsea [(7d851)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7d85127c) + - 菜单新增布局选择支持  -  by @m-xlsea [(13de6)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/13de6fbb) + - 优化控制台输出和 sql 导入文件  -  by @m-xlsea [(bfb71)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/bfb7169e) + - 登录记住密码加密保存  -  by @m-xlsea [(90c52)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/90c52d97) + - 使用 highlight.js 替换 monaco-editor  -  by @m-xlsea [(7dd7a)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7dd7a936) + - 演示页面新增字段排序 demo  -  by @m-xlsea [(41c25)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/41c25dcd) + - support pinning and unpinning of tabs  -  by @PChening [(b8a76)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/b8a767d7) + - hybrid layout mode auto select first deepest child menu  -  by @paynezhuang [(94019)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/9401925f) + +###    🐞 Bug 修复 + +- **hooks**: + - 修复 useTable 获取字段列表问题  -  by @m-xlsea [(0f83c)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/0f83cf5f) + - update pagination pageSize after data fetch.  -  by **Azir-11** [(64226)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/64226d9b) +- **projects**: + - 修复表单校验问题  -  by @m-xlsea [(62fb9)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/62fb9d90) + - 修复登录页面 logo 颜色问题  -  by @m-xlsea [(27cae)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/27cae756) + - 修复路由 name 与 path 不一致激活菜单异常问题  -  by @m-xlsea [(789a6)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/789a6bb9) + - fix the incorrect judgment of home by pin tab.  -  by **Azir-11** [(62a43)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/62a43c39) +- **project**: + - 修复导出时查询参数错误问题  -  by @m-xlsea [(52ad9)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/52ad93b2) +- **table**: + - 修复分页数据处理逻辑  -  by @imtzc [(a59fd)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/a59fdc58) +- **template**: + - 调整搜索模块的属性定义位置  -  by @imtzc [(bb039)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/bb039eff) + +###    🛠 优化 + +- **projects**: + - 修复菜单代码质量问题  -  by @m-xlsea [(6f349)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/6f34956e) + - 优化注释规范  -  by @m-xlsea [(4139a)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/4139a729) +- **styles**: + - 优化属性表格展开列样式  -  by @m-xlsea [(e40c3)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/e40c37a0) + +###    📖 文档 + +- **other**: + - 优化 sql 插入语句  -  by @m-xlsea [(f7d8d)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/f7d8d189) + - 优化工作流相关菜单  -  by @m-xlsea [(33155)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/3315552d) + - 移除 cursor 文件夹  -  by @m-xlsea [(5f950)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/5f950b46) + - 修复模板处理工具类内容错误  -  by @m-xlsea [(f6dcd)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/f6dcded8) +- **projects**: + - 更新 cursor 规则  -  by @m-xlsea [(e63fe)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/e63fee59) + +###    🏡 杂项 + +- **deps**: + - update deps  -  by @soybeanjs [(ec9f9)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/ec9f9af9) + - update umo-editor deps  -  by @m-xlsea [(39f8d)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/39f8d13b) +- **styles**: + - format code  -  by @soybeanjs [(098cd)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/098cd50e) + +###    ❤️ 贡献者 + +[![m-xlsea](https://github.com/m-xlsea.png?size=48)](https://github.com/m-xlsea)  [![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![imtzc](https://github.com/imtzc.png?size=48)](https://github.com/imtzc)  [![paynezhuang](https://github.com/paynezhuang.png?size=48)](https://github.com/paynezhuang)  [![PChening](https://github.com/PChening.png?size=48)](https://github.com/PChening)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![wenyuanw](https://github.com/wenyuanw.png?size=48)](https://github.com/wenyuanw)  [![CyberShen](https://github.com/CyberShen.png?size=48)](https://github.com/CyberShen)  [![Lruihao](https://github.com/Lruihao.png?size=48)](https://github.com/Lruihao)   +[刘璐](mailto:hi.alue@qq.com), [CyberShen123](mailto:s.lijun@qq.com), [whyang](mailto:whyang9701@gmail.com), [HongxuanG](mailto:1359774872@qq.com), [NicholasLD](mailto:878639947@qq.com),  + +## [v2.0.0-beta.2](https://gitee.com/xlsea/ruoyi-plus-soybean/compare/v2.0.0-beta.1...v2.0.0-beta.2) (2025-12-17) + +###    🚀 新功能 + +- **components**: + - 列设置新增滚动条处理  -  by @m-xlsea [(6696d)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/6696da52) +- **docs**: + - 新增 GitCode star 徽章  -  by @m-xlsea [(5310d)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/5310d352) +- **hooks**: + - 优化表格响应数据处理  -  by @m-xlsea [(7d7f2)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7d7f28c4) +- **project**: + - 优化业务代码语法格式  -  by @m-xlsea [(7f04b)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7f04b119) +- **projects**: + - 客户端管理新增状态修改开关  -  by @m-xlsea [(ea6a9)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/ea6a92cd) + - Iframe 类型菜单传参更改  -  by @m-xlsea [(bf3d5)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/bf3d5cb3) + - 新增同步租户参数配置功能  -  by @m-xlsea [(901a6)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/901a65ad) + - support pinning and unpinning of tabs  -  by @PChening [(b8a76)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/b8a767d7) + - hybrid layout mode auto select first deepest child menu  -  by @paynezhuang [(94019)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/9401925f) + - 新增关于页面  -  by @m-xlsea [(7d851)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7d85127c) + - 菜单新增布局选择支持  -  by @m-xlsea [(13de6)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/13de6fbb) + - 优化控制台输出和 sql 导入文件  -  by @m-xlsea [(bfb71)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/bfb7169e) + - 登录记住密码加密保存  -  by @m-xlsea [(90c52)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/90c52d97) + - 使用 highlight.js 替换 monaco-editor  -  by @m-xlsea [(7dd7a)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7dd7a936) + - 演示页面新增字段排序 demo  -  by @m-xlsea [(41c25)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/41c25dcd) + +###    🐞 Bug 修复 + +- **hooks**: + - update pagination pageSize after data fetch.  -  by **Azir-11** [(64226)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/64226d9b) +- **project**: + - 修复导出时查询参数错误问题  -  by @m-xlsea [(52ad9)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/52ad93b2) +- **projects**: + - fix the incorrect judgment of home by pin tab.  -  by **Azir-11** [(62a43)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/62a43c39) +- **table**: + - 修复分页数据处理逻辑  -  by @imtzc [(a59fd)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/a59fdc58) +- **template**: + - 调整搜索模块的属性定义位置  -  by @imtzc [(bb039)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/bb039eff) + +###    🛠 优化 + +- **projects**: + - 修复菜单代码质量问题  -  by @m-xlsea [(6f349)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/6f34956e) + - 优化注释规范  -  by @m-xlsea [(4139a)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/4139a729) + +###    📖 文档 + +- **other**: + - 更新 cursor 规则  -  by @m-xlsea [(1d6af)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/1d6af984) + - 优化 sql 插入语句  -  by @m-xlsea [(f7d8d)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/f7d8d189) + - 优化工作流相关菜单  -  by @m-xlsea [(33155)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/3315552d) + - 移除 cursor 文件夹  -  by @m-xlsea [(5f950)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/5f950b46) + - 修复模板处理工具类内容错误  -  by @m-xlsea [(f6dcd)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/f6dcded8) + +###    🏡 重构 + +- **deps**: + - update deps  -  by @soybeanjs [(7cf40)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7cf4083b) + - update umo-editor deps  -  by @m-xlsea [(39f8d)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/39f8d13b) +- **styles**: + - format code  -  by @soybeanjs [(098cd)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/098cd50e) + +###    ❤️ 贡献者 + +[![m-xlsea](https://github.com/m-xlsea.png?size=48)](https://github.com/m-xlsea)  [![imtzc](https://github.com/imtzc.png?size=48)](https://github.com/imtzc)  [![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![paynezhuang](https://github.com/paynezhuang.png?size=48)](https://github.com/paynezhuang)  [![PChening](https://github.com/PChening.png?size=48)](https://github.com/PChening)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)   + +## [v2.0.0-beta.1](https://gitee.com/xlsea/ruoyi-plus-soybean/compare/v1.2.1...v2.0.0-beta.1) (2025-12-04) + +###    🚀 新功能 + +- **projects**: + - 项目适配 Soybean 2.0  -  by @m-xlsea +- **components**: + - 新增预设主题支持  -  by @m-xlsea [(c1063)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/c1063e3e) +- **hooks**: + - 完成表格 Hooks 改造  -  by @m-xlsea [(46996)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/4699654f) + - 优化树形表格 hooks 封装  -  by @m-xlsea [(ccbb7)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/ccbb72c0) + +###    🐞 Bug 修复 + +- **projects**: + - 修复登录页面 logo 颜色问题  -  by @m-xlsea [(27cae)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/27cae756) + - 修复路由 name 与 path 不一致激活菜单异常问题  -  by @m-xlsea [(789a6)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/789a6bb9) + +###    ❤️ 贡献者 + +[![m-xlsea](https://github.com/m-xlsea.png?size=48)](https://github.com/m-xlsea)  [![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![wenyuanw](https://github.com/wenyuanw.png?size=48)](https://github.com/wenyuanw)  [![CyberShen](https://github.com/CyberShen.png?size=48)](https://github.com/CyberShen)  [![Lruihao](https://github.com/Lruihao.png?size=48)](https://github.com/Lruihao)   +[刘璐](mailto:hi.alue@qq.com), [CyberShen123](mailto:s.lijun@qq.com), [whyang](mailto:whyang9701@gmail.com), [HongxuanG](mailto:1359774872@qq.com), [NicholasLD](mailto:878639947@qq.com),  + +## [v1.2.1](https://gitee.com/xlsea/ruoyi-plus-soybean/compare/v1.2.0...v1.2.1) (2025-10-29) + +###    🚀 新功能 + +- **components**: + - 菜单树选择组件新增隐藏禁用标识  -  by @m-xlsea [(08cfa)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/08cfa167) + - 列设置新增滚动条处理  -  by @m-xlsea [(6696d)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/6696da52) +- **docs**: + - 新增 GitCode star 徽章  -  by @m-xlsea [(5310d)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/5310d352) +- **projects**: + - 优化字典操作  -  by @m-xlsea [(2400b)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/2400bf8c) + - 客户端管理新增状态修改开关  -  by @m-xlsea [(ea6a9)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/ea6a92cd) + - Iframe 类型菜单传参更改  -  by @m-xlsea [(bf3d5)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/bf3d5cb3) + - 新增同步租户参数配置功能  -  by @m-xlsea [(901a6)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/901a65ad) + +###    🐞 Bug 修复 + +- **projects**: 修复代码生成树模板问题  -  by **AN** [(fa7bc)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/fa7bc434) + +###    🛠 优化 + +- **projects**: + - 优化代码内容  -  by @m-xlsea [(9edbd)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/9edbd8e6) + - 修复菜单代码质量问题  -  by @m-xlsea [(6f349)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/6f34956e) + +###    📖 文档 + +- **other**: 更新 cursor 规则  -  by @m-xlsea [(1d6af)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/1d6af984) +- **projects**: 更新 cursor 规则  -  by @m-xlsea [(e63fe)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/e63fee59) + +###    🎨 样式 + +- **projects**: 优化注释规范  -  by @m-xlsea [(4139a)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/4139a729) + +###    ❤️ 贡献值 + +[![m-xlsea](https://github.com/m-xlsea.png?size=48)](https://gitee.com/xlsea)  [![Elio-An](https://github.com/Elio-An.png?size=48)](https://gitee.com/elio-an) + +## [v1.2.0](https://gitee.com/xlsea/ruoyi-plus-soybean/compare/v1.1.3...v1.2.0) (2025-09-26) + +###    🚀 新功能 + +- **components**: + - 新增 umodoc 编辑器集成  -  by @m-xlsea [(f182d)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/f182def5) +- **projects**: + - 重构登录页面样式  -  by @m-xlsea [(8412a)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/8412a8db) + - 路由兼容 activeMenu 选项  -  by @m-xlsea [(25ee3)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/25ee3207) + - 用户列表新增头像展示  -  by @m-xlsea [(3146c)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/3146c039) + - 新增岗位部门树接口  -  by **AN** [(28101)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/28101cb2) +- **styles**: + - 优化左侧树形结构样式  -  by @m-xlsea [(513dc)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/513dc31e) +- **utils**: + - 新增本地 Excel 导出工具类  -  by @m-xlsea [(7f2f3)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7f2f3bd0) + +###    🐞 Bug 修复 + +- **components**: + - 修复字典标签会修改字典数据值问题  -  by @m-xlsea [(90a14)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/90a14e33) +- **hooks**: + - 修复下载 hooks 错误未处理  -  by @m-xlsea [(5ef1c)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/5ef1c5de) +- **packages**: + - axios: fix json response. fixed #815  -  by @soybeanjs in https://gitee.com/xlsea/ruoyi-plus-soybean/issues/815 [(fd087)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/fd087f59) + - 修复tinymce层级问题  -  by **AN** [(2c248)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/2c248d82) +- **projects**: + - 修改代码生成功能模块名为驼峰时,路由错误问题  -  by **AN** [(2f794)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/2f794c4b) + - 修复新增部门时不显示上级部门问题  -  by **AN** [(d5bbc)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/d5bbc37d) + - 修复菜单弹窗打开未清空默认值问题  -  by @m-xlsea [(ad207)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/ad207255) + - 修复退出登录未清空消息列表问题  -  by @m-xlsea [(dc2fb)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/dc2fbbd5) + - 修复菜单默认图标问题  -  by @m-xlsea [(34ab7)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/34ab7d5d) + - 修复消息通知字典值未处理问题  -  by @m-xlsea [(3f148)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/3f148a4e) + - 修复登录页面跳转问题  -  by @m-xlsea [(8aeb7)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/8aeb7362) + - 修复登录页面样式问题  -  by @m-xlsea [(4e27f)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/4e27f3b5) +- **types**: + - fix proxy types  -  by @soybeanjs [(12b25)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/12b25e0d) +- **utils**: + - 修复请求工具响应解密问题  -  by @m-xlsea [(9ef0b)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/9ef0bd41) + +###    🛠 优化 + +- **components**: 补充国际化  -  by **AN** [(ecad1)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/ecad1c3e) +- **projects**: 字典状态使用枚举值  -  by @m-xlsea [(56fd5)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/56fd5434) + +###    📖 文档 + +- **other**: 更新 cursor 规则  -  by @m-xlsea [(e623b)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/e623b560) + +###    🏡 重构 + +- **deps**: + - update deps  -  by @soybeanjs [(e33f9)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/e33f944a) + - update deps  -  by @soybeanjs [(9fa95)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/9fa951aa) + +###    🎨 样式 + +- **components**: 修改json预览组件样式问题  -  by **AN** [(378aa)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/378aa869) +- **styles**: 修复字体样式导致下划线不可见问题  -  by **AN** [(4a424)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/4a4244b5) + +###    ❤️ 贡献者 + +[![m-xlsea](https://github.com/m-xlsea.png?size=48)](https://github.com/m-xlsea)  [![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![Elio-An](https://github.com/Elio-An.png?size=48)](https://gitee.com/elio-an) + +## [v1.1.3](https://gitee.com/xlsea/ruoyi-plus-soybean/compare/v1.1.2...v1.1.3) (2025-08-16) + +###    🐞 Bug 修复 + +- **hooks**: + - 非安全环境下不使用流式下载  -  by @m-xlsea [(f8983)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/f8983557) + - 修复oss下载时未转码问题  -  by **AN** [(2d31d)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/2d31d7dc) +- **project**: + - 关闭多租户功能后仍然遍历租户列表导致控制台报错的问题  -  by **wang_rui** [(b96c4)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/b96c46ba) + - 关闭多租户功能后仍然遍历租户列表导致控制台报错的问题 Merge pull request !25 from littleghost2016/dev  -  by **不寻俗** [(90276)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/9027632b) +- **projects**: + - 修复一级菜单隐藏失效问题  -  by **AN** [(8fcc7)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/8fcc70d7) + - 修复日期搜索条件清除问题  -  by **AN** [(52318)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/52318c10) + - 修复登录过期事件监听未被重置  -  by @m-xlsea [(71037)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/71037439) + - 修复用户新增时角色下拉包含超级管理员问题  -  by **AN** [(a15b6)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/a15b683b) + - 修复用户导入功能无法更新问题  -  by **AN** [(4e983)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/4e9839bd) + - Fix the icon size in the image preview toolbar  -  by @m-xlsea [(4539f)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/4539fe01) + - 修复新增用户未查询角色列表问题  -  by **AN** [(d6ae8)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/d6ae85d2) +- **readme**: + - update GitHub stars and forks links for gitee  -  by @soybeanjs [(923eb)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/923eb98a) + +###    💅 重构 + +- **menu**: + - 菜单管理中隐藏的菜单显示灰色  -  by **NicholasLD** [(adca2)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/adca2e26) + - 菜单管理中隐藏的菜单显示灰色 Merge pull request !24 from NicholasLD/N/A  -  by **不寻俗** [(4eb77)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/4eb77eac) +- **projects**: + - 菜单列表新增禁用菜单样式  -  by @m-xlsea [(e5383)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/e538355f) + +###    🏡 杂项 + +- **other**: update the ESLint validation configuration to support more file types.  -  by **Azir-11** [(8d7f9)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/8d7f91dc) +- **readme**: remove DartNode sponsorship badge from README files  -  by @soybeanjs [(33ade)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/33ade539) + +###    ❤️ 贡献者 + +[![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![m-xlsea](https://github.com/m-xlsea.png?size=48)](https://github.com/m-xlsea)  [![Elio-An](https://github.com/Elio-An.png?size=48)](https://gitee.com/elio-an)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [![Azir-11](https://github.com/NicholasLD.png?size=48)](https://github.com/NicholasLD)   +[wang_rui](mailto:wrr1996@163.com) + +## [v1.1.2](https://gitee.com/xlsea/ruoyi-plus-soybean/compare/v1.1.1...v1.1.2) (2025-07-24) + +###    🐞 Bug 修复 + +- 修复 api.d.ts.vm 代码生成模板bug  -  by **zygalaxy** [(4e8c8)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/4e8c8715) +- **projects**: + - 修复刷新时跳转至登录页问题  -  by **AN** [(2587f)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/2587f8cb) + - 修复登录过期不弹窗问题  -  by **AN** [(e485f)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/e485f680) + - 修复菜单结构变动后路由无法进入问题  -  by @m-xlsea [(f4038)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/f4038a2d) + +###    🛠 优化 + +- **projects**: 优化搜索框FormItem  -  by **AN** [(a1336)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/a1336d15) + +###    🏡 杂项 + +- **deps**: update deps  -  by @soybeanjs [(e89b8)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/e89b86ce) + +###    🎨 样式 + +- **projects**: 搜索FormItem占比调整  -  by **AN** [(cc29e)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/cc29ea85) + +###    ❤️ 贡献者 + +[![m-xlsea](https://github.com/m-xlsea.png?size=48)](https://github.com/m-xlsea)  [![Elio-An](https://github.com/Elio-An.png?size=48)](https://gitee.com/elio-an)  [![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)   +[zygalaxy](mailto:zygalaxy@qq.com) + +## [v1.1.1](https://gitee.com/xlsea/ruoyi-plus-soybean/compare/v1.1.0...v1.1.1) (2025-07-11) + +###    🚀 新功能 + +- **hooks**: + - 重构下载方法,支持流式下载  -  by @m-xlsea [(65067)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/650673e2) +- **projects**: + - 角色分配用户新增部门与时间查询条件  -  by @m-xlsea [(ad48d)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/ad48d8e8) + - 修改操作后列表查询方式  -  by @m-xlsea [(d8542)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/d85424ee) + +###    🐞 Bug 修复 + +- **hooks**: + - 解决 streamsaver 访问不到 Github 资源问题  -  by @m-xlsea [(566b2)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/566b2c2d) +- **other**: + - 修复代码生成类型定义文件重复问题  -  by @m-xlsea [(f7c7f)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/f7c7fc41) +- **packages**: + - 修复 cleanup 会删除富文本编辑器资源问题  -  by @m-xlsea [(9ca7c)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/9ca7ca8f) +- **projects**: + - 修复字典数据重复获取问题  -  by @m-xlsea [(3628c)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/3628c249) + - 修改强退在线设备接口  -  by **AN** [(dbcf8)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/dbcf8d42) + - 修复代码生成逻辑判断问题  -  by **AN** [(6fc7b)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/6fc7b11b) + - 修复部门字典 sys_normal_disable 重复获取 Merge pull request !11 from 素还真/N/A  -  by @m-xlsea [(ad938)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/ad9386eb) + - 修复未清空文件列表,上传回显问题  -  by **AN** [(229e0)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/229e0044) + - Fix i18n-ally not working when setting moduleResolution to bundler. fixed #780  -  by @xiaobao0505 in https://gitee.com/xlsea/ruoyi-plus-soybean/issues/780 [(41191)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/41191d54) + - 修复角色列表操作栏展示不全问题  -  by @m-xlsea [(62f2c)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/62f2c6d5) + - 修复用户导入结果信息未渲染标签问题  -  by **AN** [(efc95)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/efc953c0) + - 修复角色用户分配未调用接口问题  -  by @m-xlsea [(ff874)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/ff87415d) +- **styles**: + - 修复登录页平板界面滚动问题  -  by @m-xlsea [(90145)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/90145fa5) +- **utils**: + - 修复isNull和IsNotNull判断方法潜在问题  -  by **AN** [(90d32)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/90d32ee2) + +###    💅 重构 + +- **projects**: 调整租户套餐菜单接口  -  by **AN** [(b9999)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/b9999935) + +###    📖 文档 + +- **other**: 修改文档内容  -  by @m-xlsea [(3ae99)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/3ae9922d) +- **projects**: 优化 cursor 规则及 mcp  -  by @m-xlsea [(a3199)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/a31994dc) +- **readme**: 更新 README.md 文件  -  by @m-xlsea [(99675)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/99675cbc) + +###    🏡 杂项 + +- **deps**: + - update NodeJS and pnpm version requirements in package.json and documentation  -  by **Junior25306** [(a5c4b)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/a5c4b4e3) + - update deps  -  by @soybeanjs [(5cb1c)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/5cb1cebd) + - update deps  -  by @soybeanjs [(aeb63)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/aeb63690) + - update deps  -  by @m-xlsea [(89c71)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/89c716e1) +- **packages**: + - update Vite version to 7 in package.json and documentation.  -  by **Azir** [(03dd6)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/03dd64c5) +- **projects**: + - update pnpm-lock.yaml  -  by @m-xlsea [(7c6ca)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7c6ca91e) +- **vscode**: + - remove unused vue.server.hybridMode setting from .vscode/settings.json  -  by @soybeanjs [(13319)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/133196f3) + +###    ❤️ 贡献值 + +[![m-xlsea](https://github.com/m-xlsea.png?size=48)](https://github.com/m-xlsea)  [![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![xiaobao0505](https://github.com/xiaobao0505.png?size=48)](https://github.com/xiaobao0505)  [![Elio-An](https://github.com/Elio-An.png?size=48)](https://gitee.com/elio-an)  [![Azir-11](https://github.com/Azir-11.png?size=48)](https://github.com/Azir-11)  [Junior25306](mailto:dayu429@qq.com) + +## [v1.1.0](https://gitee.com/xlsea/ruoyi-plus-soybean/compare/v1.0.0...v1.1.0) (2025-07-01) + +###    🚀 新功能 + +- **components**: + - 新增表单上传组件  -  by @m-xlsea [(03c8a)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/03c8a7f5) +- **other**: + - 新增菜单字典多语言适配 SQL  -  by @m-xlsea [(0f33f)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/0f33f4a3) +- **projects**: + - add configurable user name watermark option  -  by @wenyuanw [(7c3da)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7c3dac42) + - 菜单字典适配 i18n  -  by @m-xlsea [(39dd9)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/39dd9acc) + - 新增字典多语言适配  -  by @m-xlsea [(8c840)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/8c84063a) +- **styles**: + - 修复登录页移动端显示问题  -  by @m-xlsea [(742e3)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/742e3858) + +###    🐞 Bug 修复 + +- **app**: + - replace console.error with window.console.error for consistency  -  by @soybeanjs [(7d840)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7d84062e) +- **auth**: + - remove redundant authStore declaration in resetStore function  -  by @soybeanjs [(c57f8)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/c57f88aa) +- **components**: + - 修复菜单树选择组件  -  by @m-xlsea [(bbda8)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/bbda803e) + - 修复树选择组件再次勾选父子联动导致全选问题  -  by @m-xlsea [(aeb73)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/aeb736eb) + - 修复部门选择组件非树结构,默认展开失败问题  -  by **AN** [(da1c1)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/da1c16e0) + - 修复上传组件回显问题,修改accept参数逻辑  -  by **AN** [(e16a0)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/e16a0fa6) + - 修复菜单选择标签渲染问题  -  by @m-xlsea [(6e6cc)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/6e6cc4d9) +- **other**: + - 修复代码生成问题  -  by @m-xlsea [(1ec10)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/1ec10991) + - 代码生成模板 dateRangeTime 错误  -  by @m-xlsea [(f0810)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/f0810bce) + - 修复代码生成字典相关问题  -  by @m-xlsea [(94d18)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/94d1863e) + - 修复代码生成类型定义文件重复问题  -  by @m-xlsea [(f7c7fc41)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/f7c7fc41) +- **projects**: + - 修复自定义数据权限没有保存角色部门bug  -  by **AN** [(a0f33)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/a0f33664) + - 修复登录过期后,重复弹窗问题  -  by **AN** [(cafee)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/cafee1db) + - 修复首页未从环境变量获取问题  -  by @m-xlsea [(031b7)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/031b7f69) + - 修复导出查询参数问题  -  by @m-xlsea [(ffa47)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/ffa47c37) + - 修复权限字符显示逻辑错误问题  -  by **AN** [(0ac0a)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/0ac0a093) + - 目录类型禁用iframe选项  -  by **AN** [(72b8f)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/72b8f56e) + - 修复切换用户或登录过期部分问题  -  by @m-xlsea [(27f06)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/27f06195) + - 修复接口请求异常拦截问题  -  by @m-xlsea [(031d0)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/031d071a) + - 修复个人信息-修改密码未加密且参数错误问题  -  by **AN** [(8b315)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/8b3151b8) + - 调整属性名  -  by **AN** [(62e6c)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/62e6c776) + - ensure proper text color when themes are inverted  -  by @wenyuanw [(afd60)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/afd60421) +- **styles**: + - 添加滚动条,去除页码  -  by **AN** [(d37ad)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/d37adc36) +- **types**: + - The environment variable VITE_ICON_LOCAL_PREFIX has the wrong type.  -  by **chenziwen** [(da149)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/da149e5b) +- **utils**: + - 修复 删除当前tab为最后一个时,tab切换错误bug.  -  by **AN** [(64bd1)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/64bd119c) + +###    🛠 优化 + +- **components**: + - optimize spacing for lang-switch dropdown options  -  by @wenyuanw [(fcb89)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/fcb89883) +- **projects**: + - optimize tab deletion logic. closed #755  -  by @wenyuanw in https://gitee.com/xlsea/ruoyi-plus-soybean/issues/755 [(e6044)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/e6044d0f) + - optimize tab deletion logic  -  by **AN** [(858c3)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/858c3180) + - 优化接口请求异常拦截代码  -  by @m-xlsea [(47191)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/471912e1) + +###    💅 重构 + +- **iframe-page**: remove unused lifecycle hooks and clean up script setup  -  by @soybeanjs [(276d8)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/276d836c) +- **projects**: 补充formTip信息  -  by **AN** [(f36ac)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/f36ac9ab) + +###    📖 文档 + +- **readme**: + - 更新 README.md 文件  -  by @m-xlsea [(99675cb)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/99675cb) + +###    🏡 杂项 + +- **deps**: + - update deps  -  by @soybeanjs [(3e4e1)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/3e4e17ab) + - update deps  -  by @soybeanjs [(dc674)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/dc674ce8) + - update deps  -  by @m-xlsea [(fec05)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/fec0563e) +- **projects**: + - 移除未使用代码  -  by **AN** [(d141e)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/d141ed5b) + - update deps & fix `moduleResolution`  -  by @soybeanjs [(dbd99)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/dbd995c1) + +###    🎨 样式 + +- **projects**: + - 更换 logo 与加载样式  -  by @m-xlsea [(7e4ec)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/7e4ecae6) + - 重构登录页样式  -  by @m-xlsea [(40680)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/406800de) + - 修改按钮文本颜色  -  by @m-xlsea [(907f0)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/907f0439) + - 优化移动端字体大小  -  by @m-xlsea [(8b4e4)](https://gitee.com/xlsea/ruoyi-plus-soybean/commit/8b4e41ce) + +###    ❤️ 贡献者 + +[![xlsea](https://github.com/m-xlsea.png?size=48)](https://gitee.com/xlsea)  [![soybeanjs](https://github.com/soybeanjs.png?size=48)](https://github.com/soybeanjs)  [![wenyuanw](https://github.com/wenyuanw.png?size=48)](https://github.com/wenyuanw)  [![Elio-An](https://github.com/Elio-An.png?size=48)](https://gitee.com/elio-an)  [![chen-ziwen](https://github.com/chen-ziwen.png?size=48)](https://github.com/chen-ziwen)   +[![wangzhongqi0917](https://gitee.com/wangzhongqi0917.png?width=48)](https://gitee.com/wangzhongqi0917)  [![qq1822213252](https://gitee.com/qq1822213252.png?width=48)](https://gitee.com/qq1822213252)  [![tangzc](https://gitee.com/tangzc.png?width=48)](https://gitee.com/tangzc), [metabytes](https://gitee.com/metabytes) + + +## [v1.0.0](https://gitee.com/xlsea/ruoyi-plus-soybean/releases/tag/v1.0.0) (2025-06-05) + +###    🚀 新功能 + +1.0.0 版本正式发布,此版本不包含工作流与多语言,请期待后续版本发布。 + +###    ❤️ 贡献者 + +首次发版不展示过多贡献者,敬请谅解 + +[![soybeanjs](https://github.com/honghuangdc.png?size=48)](https://github.com/honghuangdc)  [![xlsea](https://github.com/m-xlsea.png?size=48)](https://gitee.com/xlsea)  [![Elio-An](https://github.com/Elio-An.png?size=48)](https://gitee.com/elio-an)  [![wangqiqi95](https://github.com/wangqiqi95.png?size=48)](https://github.com/wangqiqi95)  diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5d56e4a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 xlsea + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8e3ddbf --- /dev/null +++ b/README.md @@ -0,0 +1,391 @@ +
+ +

RuoYi-Plus-Soybean

+
+ +
+ +
+

一个基于 RuoYi-Vue-Plus 的后端能力和 Soybean Admin 前端特性的现代化多租户管理系统

+

+ GitCode + Github + Gitee + vue + typescript + vite + naive-ui + license +

+
+ +# 📢 重要通知 + +2.0.0 版本已经正式发布(工作流版本请切换 [flow](https://gitee.com/xlsea/ruoyi-plus-soybean/tree/flow/) 分支查看),但仍然建议: +- 在生产环境使用前进行充分测试 +- 关注项目更新,及时获取最新版本 +- 积极反馈问题,帮助我们快速迭代 + +**后续规划** +- 多语言国际化完善 +- 性能优化和稳定性提升 + +> 如果对该项目感兴趣,可以给一个 Star 支持一下,谢谢! +> 请大家踊跃提交 PR 和 Issue,一起完善这个项目 + +# ❗开发前必看 + +

本项目强制使用 pnpm 构建,详细请看 安装步骤及说明

+ +

后端需要替换代码生成模板与菜单 SQL,详细请看 代码生成与菜单更新

+ +# 💎 友情链接 + +- [Snail Job Pro](https://pro.snailjob.opensnail.com/home) - 灵活,可靠和快速的分布式任务重试和分布式任务调度平台 +- [AiZuDa - 爱组搭(飞龙工作流企业版)](https://naiveui.aizuda.com) - 像搭积木一样进行低代码甚至零代码快速构建应用 + +## 📋 项目概述 + +RuoYi-Plus-Soybean 是一个现代化的企业级多租户管理系统,它结合了 RuoYi-Vue-Plus 的强大后端功能和 Soybean Admin 的现代化前端特性,为开发者提供了完整的企业管理解决方案。 + +### 🌟 项目特点 + +- **多租户架构**:完整支持SaaS多租户模式,灵活的租户管理能力 +- **现代前端技术栈**:基于Vue 3、TypeScript、Vite和Naive UI构建 +- **Monorepo工程管理**:使用pnpm workspaces管理多包结构 +- **丰富的组件库**:内置大量业务组件和布局选项 +- **主题定制**:支持多种布局模式和主题配色 +- **国际化**:内置多语言支持 +- **权限管理**:精细的基于角色的权限控制 + +## 🛠️ 技术栈 + +### 前端 +- **核心框架**:Vue 3.5.x +- **开发语言**:TypeScript 5.8.x +- **构建工具**:Vite 6.2.x +- **UI组件库**:Naive UI 2.41.x +- **状态管理**:Pinia 3.0.x +- **路由**:Vue Router 4.5.x +- **HTTP客户端**:Axios/Alova +- **CSS**:UnoCSS +- **包管理器**:pnpm 8.x+ + +### 后端(与RuoYi-Vue-Plus兼容) +- **核心框架**:Spring Boot +- **安全框架**:Spring Security +- **权限认证**:Sa-Token +- **数据操作**:MyBatis-Plus +- **数据库**:MySQL + +## 🏗️ 项目结构 + +``` +root +├── build # 构建配置和插件 +│ ├── config # 构建配置文件 +│ └── plugins # Vite 插件 +├── docs # 文档和模板 +│ ├── java # 代码生成工具类 +│ └── template # 代码生成模板 +├── packages # Monorepo包 +│ ├── alova # 使用Alova的HTTP客户端实现 +│ ├── axios # 使用Axios的HTTP客户端实现 +│ ├── color # 颜色管理工具 +│ ├── hooks # 可复用的Vue组合函数 +│ ├── materials # UI组件和材料 +│ ├── ofetch # 使用ofetch的HTTP客户端实现 +│ ├── scripts # 构建和开发脚本 +│ ├── uno-preset # UnoCSS预设配置 +│ └── utils # 通用工具函数 +├── public # 静态资源 +├── src # 主应用源代码 +│ ├── assets # 静态资源(图片、图标) +│ ├── components # 可复用的 Vue 组件 +│ ├── constants # 应用常量 +│ ├── enum # TypeScript 枚举 +│ ├── hooks # Vue 组合函数 +│ ├── layouts # 页面布局 +│ ├── locales # 国际化 +│ ├── plugins # Vue 插件 +│ ├── router # Vue Router 配置 +│ ├── service # API 服务 +│ ├── store # Pinia 存储模块 +│ ├── styles # 全局样式 +│ ├── theme # 主题配置 +│ ├── typings # TypeScript 类型定义 +│ ├── utils # 工具函数 +│ └── views # 页面组件 +└── vite.config.ts # Vite 配置 +``` + +## 🚀 环境要求与安装 + +### 环境要求 +- Node.js >= 20.19.0 +- pnpm >= 10.5.0 +- Git + +### 安装步骤及说明 + +1. 克隆仓库 +```bash +git clone https://gitee.com/xlsea/ruoyi-plus-soybean.git +cd ruoyi-plus-soybean +``` + +2. 安装 pnpm (如果未安装) + +```bash +npm install pnpm -g +``` + +设置淘宝镜像 +```bash +pnpm config set registry https://registry.npmmirror.com +``` + +3. 安装依赖 +```bash +pnpm install +``` + +4. 运行开发服务器 +```bash +pnpm dev +``` + +5. 构建生产版本 +```bash +pnpm build +``` + +### 代码生成与菜单更新 + +项目提供了代码生成工具和菜单SQL更新文件,在 docs 目录下: + +- **代码生成工具** + - 代码生成工具类位于 `docs/java` 目录,如果没有修改过VelocityUtils.java文件,直接替换即可 + - 代码生成模板位于 `docs/template` 目录,请在ruoyi-generator模块的`resource/vm`下新建 `soy`文件夹,并将所有模板拷贝至`soy`文件夹中 + +- **菜单SQL更新** + - 菜单数据更新SQL文件位于 `docs/sql` 目录 + - 在系统初始化或更新时,需要执行相应的SQL文件来更新菜单数据 + +## 📝 开发指南 + +### 可用的脚本命令 + +```bash +# 开发环境 +pnpm dev + +# 测试环境 +pnpm dev:test + +# 生产环境 +pnpm dev:prod + +# 构建生产版本 +pnpm build + +# 构建开发版本 +pnpm build:dev + +# 构建测试版本 +pnpm build:test + +# 预览构建 +pnpm preview + +# 类型检查 +pnpm typecheck + +# 代码规范检查并修复 +pnpm lint + +# 路由生成 +pnpm gen-route + +# 提交代码 +pnpm commit + +# 中文提交信息 +pnpm commit:zh + +# 依赖包更新 +pnpm update-pkg + +# 清理项目 +pnpm cleanup + +# 发布新版本 +pnpm release +``` + +### 代码规范与风格 + +项目使用ESLint进行代码检查,遵循以下规范: + +- **命名规范**: + - Vue组件: PascalCase (如 UserProfile.vue) + - TypeScript文件: camelCase (如 userService.ts) + - CSS/SCSS: kebab-case (如 user-profile.scss) + +- **代码风格**: + - 使用Vue 3 Composition API + - 使用TypeScript类型系统 + - 遵循单一职责原则 + +### 核心开发模式 + +#### 状态管理 +使用Pinia进行状态管理,模块位于`src/store/modules`目录: +- **app**: 应用全局状态 +- **theme**: 主题配置 +- **route**: 路由信息 +- **tab**: 标签页管理 +- **auth**: 认证信息 +- **dict**: 字典管理 +- **notice**: 通知管理 + +#### API交互 +项目支持多种HTTP客户端实现: + +- **Axios**: +```typescript +import { useRequest } from '@/hooks/common/request'; + +const { data, loading, error } = useRequest(() => api.getData(params)); +``` + +- **Hooks使用**: +```typescript +// 布尔值管理 +import { useBoolean } from '@sa/hooks'; +const { bool, setTrue, setFalse } = useBoolean(); + +// 加载状态管理 +import { useLoading } from '@sa/hooks'; +const { loading, startLoading, endLoading } = useLoading(); + +// 表格管理 +import { useTable } from '@/hooks/common/table'; +const { tableData, loading, getPaginationData } = useTable(fetchTableData); +``` + +#### 组件使用 +项目包含多种业务组件: + +- **表格组件**:支持列设置、搜索区域和高级操作 +- **表单组件**:集成验证和表单布局 +- **字典组件**:字典选择、标签和单选 +- **布局组件**:支持多种布局模式和主题 + +### UnoCSS使用指南 +项目优先使用 UnoCSS 来实现样式: + +```html +
+ 内容 +
+``` + +### 国际化 +项目使用vue-i18n实现国际化支持: + +```typescript +// 在组件中使用 +import { useI18n } from 'vue-i18n'; + +const { t } = useI18n(); +console.log(t('common.confirm')); +``` + +## 💎 特性与功能 + +### 前端特性 +- **多种布局模式**:支持垂直、水平、混合等多种布局 +- **可配置的主题**:明暗模式、主题色定制 +- **标签页管理**:多种标签风格、右键菜单 +- **组件封装**:进度条、图标、加载动画等 +- **路由生成**:基于目录结构的路由生成 +- **权限管理**:菜单和按钮级别的权限控制 + +### 业务功能 +- **用户管理**:用户信息维护、角色分配 +- **角色管理**:角色权限配置 +- **菜单管理**:系统功能配置 +- **部门管理**:组织架构维护 +- **字典管理**:数据字典配置 +- **租户管理**:多租户配置 +- **系统监控**:登录日志、操作日志、在线用户、缓存监控 +- **代码生成**:生成前后端代码,提升开发效率 + +## 🤝 贡献指南 + +### 开发流程 +1. Fork项目 +2. 创建功能分支 (`git checkout -b feature/amazing-feature`) +3. 提交更改 (`git commit -m 'feat: add amazing feature'`) +4. 推送到分支 (`git push origin feature/amazing-feature`) +5. 提交Pull Request + +### 提交规范 +项目使用约定式提交规范: + +- `feat`: 新功能 +- `fix`: 修复Bug +- `docs`: 文档更新 +- `style`: 代码风格调整 +- `refactor`: 代码重构 +- `perf`: 性能优化 +- `test`: 测试代码 +- `chore`: 构建或工具变动 + +## 📄 许可证 + +[MIT License](./LICENSE) + +## 🔗 相关链接 + +- [RuoYi-Vue-Plus](https://gitee.com/dromara/RuoYi-Vue-Plus) - 后端基础框架 +- [Soybean Admin](https://github.com/soybeanjs/soybean-admin) - 前端基础框架 +- [RuoYi-Plus-Soybean](https://ruoyi.xlsea.cn) - 官方演示站点 +- [RuoYi-Plus-Soybean-Docs](https://docs.ruoyi.xlsea.cn) - 项目文档 +- [Open Hives](https://openhives.com/questions) - OpenHives 问答社区 + +## 📮 联系方式 + +- **作者**: xlsea +- **邮箱**: m@xlsea.cn +- **作者主页**: https://gitee.com/xlsea + +更多周边生态请翻阅 [周边生态](https://docs.soybeanjs.cn/zh/awesome) 文档。 + + +- **作者**: Elio +- **邮箱**: 1983933789@qq.com +- **作者主页**: https://gitee.com/ahcode + +## 💬 交流群 + +**加群前请先阅读一下内容:** + +- 禁止内容:黄腔、暴力言论、政治话题,违者直接飞机票(踢出群) +- 遇到问题请先阅读 [项目文档](https://docs.ruoyi.xlsea.cn) 和 [Soybean 文档](https://docs.soybeanjs.cn/),某些简单问题不予理睬 +- 蜡笔小新头像为机器人助手,私聊不保证回复,问题请在群内讨论 + + + +添加作者微信备注:加群 + +## 🧧 捐献作者 + +作者为兼职做开源,平时还需要工作,如果帮到了您可以请作者吃个盒饭 + + + +## 🫡 捐赠列表 + +**捐赠列表已移至 [捐赠列表](https://docs.ruoyi.xlsea.cn/other/donate.html)** diff --git a/School_Task1.md b/School_Task1.md new file mode 100644 index 0000000..1fa8281 --- /dev/null +++ b/School_Task1.md @@ -0,0 +1,11 @@ +【开发需求】 +1. 功能扩展:在前端页面 `@src/views/art/school/index.vue` 的院校列表操作列中,新增子表操作按钮(院校名称管理、校区管理、专业管理等),按钮需绑定弹窗触发事件。 +2. 组件适配:基于已完成的子模块基础代码(路径:`src/views/art/school/modules/` 下 school-campus、school-college 等所有子组件),统一调整组件渲染形态为弹窗样式,需符合现有项目的弹窗UI规范。 +3. 数据关联:实现列表按钮点击时,将当前行的院校ID作为入参传递至对应子模块弹窗,确保子模块接口调用时携带该关联ID,完成子表数据与主表院校的关联管理。 +4. 接口对接:子模块需对接指定的TS接口文件(路径:`src/service/api/art/` 下 school-campus.ts、school-college.ts 等),并引用对应的TS类型定义文件(路径:`src/typings/api/` 下 art.school-campus.api.d.ts、art.school-college.api.d.ts 等),保证类型校验与接口调用的规范性。 + +【文件路径清单】 +- 主列表页面:@src/views/art/school/index.vue +- 子模块组件:src/views/art/school/modules/(school-campus/college/detail/dorm/enroll-plan/major/major-tag/media/name/tag) +- 接口层文件:src/service/api/art/(school-campus.ts/college.ts/detail.ts/dorm.ts/enroll-plan.ts/major-tag.ts/major.ts/media.ts/name.ts/tag.ts) +- 类型定义文件:src/typings/api/(art.school-campus.api.d.ts/college.api.d.ts/detail.api.d.ts/dorm.api.d.ts/enroll-plan.api.d.ts/major-tag.api.d.ts/major.api.d.ts/media.api.d.ts/name.api.d.ts/tag.api.d.ts/art.school.api.d.ts) diff --git a/build/config/index.ts b/build/config/index.ts new file mode 100644 index 0000000..8a9621a --- /dev/null +++ b/build/config/index.ts @@ -0,0 +1,2 @@ +export * from './proxy'; +export * from './time'; diff --git a/build/config/proxy.ts b/build/config/proxy.ts new file mode 100644 index 0000000..f2a53ed --- /dev/null +++ b/build/config/proxy.ts @@ -0,0 +1,56 @@ +import type { ProxyOptions } from 'vite'; +import { bgRed, bgYellow, green, lightBlue } from 'kolorist'; +import { consola } from 'consola'; +import { createServiceConfig } from '../../src/utils/service'; + +/** + * Set http proxy + * + * @param env - The current env + * @param enable - If enable http proxy + */ +export function createViteProxy(env: Env.ImportMeta, enable: boolean) { + const isEnableHttpProxy = enable && env.VITE_HTTP_PROXY === 'Y'; + + if (!isEnableHttpProxy) return undefined; + + const isEnableProxyLog = env.VITE_PROXY_LOG === 'Y'; + + const { baseURL, proxyPattern, ws, other } = createServiceConfig(env); + + const proxy: Record = createProxyItem({ baseURL, ws, proxyPattern }, isEnableProxyLog); + + other.forEach(item => { + Object.assign(proxy, createProxyItem(item, isEnableProxyLog)); + }); + + return proxy; +} + +function createProxyItem(item: App.Service.ServiceConfigItem, enableLog: boolean) { + const proxy: Record = {}; + + proxy[item.proxyPattern] = { + target: item.baseURL, + changeOrigin: true, + ws: item.ws, + configure: (_proxy, options) => { + _proxy.on('proxyReq', (_proxyReq, req, _res) => { + if (!enableLog) return; + + const requestUrl = `${lightBlue('[proxy url]')}: ${bgYellow(` ${req.method} `)} ${green(`${item.proxyPattern}${req.url}`)}`; + + const proxyUrl = `${lightBlue('[real request url]')}: ${green(`${options.target}${req.url}`)}`; + + consola.log(`\n${requestUrl}\n${proxyUrl}`); + }); + _proxy.on('error', (_err, req, _res) => { + if (!enableLog) return; + consola.log(bgRed(`Error: ${req.method} `), green(`${options.target}${req.url}`)); + }); + }, + rewrite: path => path.replace(new RegExp(`^${item.proxyPattern}`), '') + }; + + return proxy; +} diff --git a/build/config/time.ts b/build/config/time.ts new file mode 100644 index 0000000..3b57146 --- /dev/null +++ b/build/config/time.ts @@ -0,0 +1,12 @@ +import dayjs from 'dayjs'; +import utc from 'dayjs/plugin/utc'; +import timezone from 'dayjs/plugin/timezone'; + +export function getBuildTime() { + dayjs.extend(utc); + dayjs.extend(timezone); + + const buildTime = dayjs.tz(Date.now(), 'Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss'); + + return buildTime; +} diff --git a/build/plugins/devtools.ts b/build/plugins/devtools.ts new file mode 100644 index 0000000..34c08d1 --- /dev/null +++ b/build/plugins/devtools.ts @@ -0,0 +1,9 @@ +import VueDevtools from 'vite-plugin-vue-devtools'; + +export function setupDevtoolsPlugin(viteEnv: Env.ImportMeta) { + const { VITE_DEVTOOLS_LAUNCH_EDITOR } = viteEnv; + + return VueDevtools({ + launchEditor: VITE_DEVTOOLS_LAUNCH_EDITOR + }); +} diff --git a/build/plugins/html.ts b/build/plugins/html.ts new file mode 100644 index 0000000..b94d24f --- /dev/null +++ b/build/plugins/html.ts @@ -0,0 +1,13 @@ +import type { Plugin } from 'vite'; + +export function setupHtmlPlugin(buildTime: string) { + const plugin: Plugin = { + name: 'html-plugin', + apply: 'build', + transformIndexHtml(html) { + return html.replace('', `\n `); + } + }; + + return plugin; +} diff --git a/build/plugins/index.ts b/build/plugins/index.ts new file mode 100644 index 0000000..1243fc2 --- /dev/null +++ b/build/plugins/index.ts @@ -0,0 +1,24 @@ +import type { PluginOption } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import progress from 'vite-plugin-progress'; +import { setupElegantRouter } from './router'; +import { setupUnocss } from './unocss'; +import { setupUnplugin } from './unplugin'; +import { setupHtmlPlugin } from './html'; +import { setupDevtoolsPlugin } from './devtools'; + +export function setupVitePlugins(viteEnv: Env.ImportMeta, buildTime: string) { + const plugins: PluginOption = [ + vue(), + vueJsx(), + setupDevtoolsPlugin(viteEnv), + setupElegantRouter(), + setupUnocss(viteEnv), + ...setupUnplugin(viteEnv), + progress(), + setupHtmlPlugin(buildTime) + ]; + + return plugins; +} diff --git a/build/plugins/router.ts b/build/plugins/router.ts new file mode 100644 index 0000000..952e15d --- /dev/null +++ b/build/plugins/router.ts @@ -0,0 +1,44 @@ +import type { RouteMeta } from 'vue-router'; +import ElegantVueRouter from '@elegant-router/vue/vite'; +import type { RouteKey } from '@elegant-router/types'; + +export function setupElegantRouter() { + return ElegantVueRouter({ + layouts: { + base: 'src/layouts/base-layout/index.vue', + blank: 'src/layouts/blank-layout/index.vue' + }, + customRoutes: { + names: ['exception_403', 'exception_404', 'exception_500'] + }, + routePathTransformer(routeName, routePath) { + const key = routeName as RouteKey; + + if (key === 'login') { + const modules: UnionKey.LoginModule[] = ['pwd-login', 'code-login', 'register', 'reset-pwd', 'bind-wechat']; + + const moduleReg = modules.join('|'); + + return `/login/:module(${moduleReg})?`; + } + + return routePath; + }, + onRouteMetaGen(routeName) { + const key = routeName as RouteKey; + + const constantRoutes: RouteKey[] = ['login', '403', '404', '500']; + + const meta: Partial = { + title: key, + i18nKey: `route.${key}` as App.I18n.I18nKey + }; + + if (constantRoutes.includes(key)) { + meta.constant = true; + } + + return meta; + } + }); +} diff --git a/build/plugins/unocss.ts b/build/plugins/unocss.ts new file mode 100644 index 0000000..06b41d3 --- /dev/null +++ b/build/plugins/unocss.ts @@ -0,0 +1,32 @@ +import process from 'node:process'; +import path from 'node:path'; +import unocss from '@unocss/vite'; +import presetIcons from '@unocss/preset-icons'; +import { FileSystemIconLoader } from '@iconify/utils/lib/loader/node-loaders'; + +export function setupUnocss(viteEnv: Env.ImportMeta) { + const { VITE_ICON_PREFIX, VITE_ICON_LOCAL_PREFIX } = viteEnv; + + const localIconPath = path.join(process.cwd(), 'src/assets/svg-icon'); + + /** The name of the local icon collection */ + const collectionName = VITE_ICON_LOCAL_PREFIX.replace(`${VITE_ICON_PREFIX}-`, ''); + + return unocss({ + presets: [ + presetIcons({ + prefix: `${VITE_ICON_PREFIX}-`, + scale: 1, + extraProperties: { + display: 'inline-block' + }, + collections: { + [collectionName]: FileSystemIconLoader(localIconPath, svg => + svg.replace(/^ + svg.replace(/^ 子表均包含 `院校编码*`、`院校名称*` 用于与主表关联。 + +--- + +### 2.2 导出空模板 + +- **URL**: `POST /art/school/importTemplate` +- **权限**: `art:school:export` +- **响应**: 空模板 Excel(仅表头 + 模板说明) + +--- + +### 2.3 导入预检 + +- **URL**: `POST /art/school/importPreview` +- **权限**: `art:school:import` +- **Content-Type**: `multipart/form-data` +- **入参**: + - `file`(Excel 文件,必填) + +#### 返回示例 + +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "totalSchoolCount": 10, + "conflictCount": 3, + "invalidCount": 1, + "details": [ + { + "mainCode": "1001", + "mainName": "测试院校01", + "status": "CONFLICT", + "message": "系统已存在该院校数据,导入时需确认是否替换" + }, + { + "mainCode": "", + "mainName": "", + "status": "INVALID", + "message": "必填字段缺失:院校编码/院校名称不能为空" + } + ] + } +} +``` + +#### 状态说明 + +- `CONFLICT`: 系统已存在(按院校编码/名称命中) +- `INVALID`: 模板数据无效(缺失、重复、子表关联不到主表) + +--- + +### 2.4 导入执行 + +- **URL**: `POST /art/school/importData` +- **权限**: `art:school:import` +- **Content-Type**: `multipart/form-data` +- **入参**: + - `file`(Excel 文件,必填) + - `replaceAll`(boolean,选填,默认 `false`) + - `replaceMainCodes`(string[],选填,可多值传参) + +#### 前端推荐调用逻辑 + +1. 先调 `importPreview`。 +2. 对 `CONFLICT` 院校弹窗询问“是否替换”。 +3. 将用户同意替换的院校编码组装为 `replaceMainCodes`,再调 `importData`。 +4. 用户全量替换时可直接传 `replaceAll=true`。 + +#### 返回示例 + +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "totalSchoolCount": 10, + "successCount": 8, + "failCount": 1, + "skippedCount": 1, + "details": [ + { + "mainCode": "1001", + "mainName": "测试院校01", + "status": "SUCCESS", + "message": "替换成功" + }, + { + "mainCode": "1002", + "mainName": "测试院校02", + "status": "SKIPPED", + "message": "院校名称重复且用户取消替换" + }, + { + "mainCode": "1003", + "mainName": "测试院校03", + "status": "FAILED", + "message": "学院保存失败" + } + ] + } +} +``` + +#### 状态说明 + +- `SUCCESS`: 导入/替换成功 +- `SKIPPED`: 冲突且用户未选择替换 +- `FAILED`: 导入失败(事务回滚) +- `INVALID`: 文件预校验失败 + +--- + +## 3. 原子性与一致性 + +- 导入按“单院校”为最小事务单元: + - 该院校主表 + 子表(详情/校区/学院/专业/招生计划)要么全部成功,要么全部回滚。 +- 替换逻辑: + 1. 删除该院校历史主表及上述子表数据 + 2. 插入新主表数据 + 3. 插入新子表数据 + +--- + +## 4. 模板必填规则(简表) + +- `院校基本信息`: `院校编码*`、`院校名称*` +- `院校详情信息`: `院校编码*`、`院校名称*` +- `校区信息`: `院校编码*`、`院校名称*`、`校区名称*` +- `学院信息`: `院校编码*`、`院校名称*`、`学院名称*` +- `专业信息`: `院校编码*`、`院校名称*`、`学院ID*`、`专业名称*` +- `招生计划信息`: `院校编码*`、`院校名称*`、`年份*`、`招生省份*`、`专业名称*`、`计划数*` + +> `*` 表示模板必填字段。 + +--- + +## 5. 兼容说明 + +- 现有 `POST /art/school` 与 `PUT /art/school` 仍用于单院校编辑(`school + detail` 统一结构)。 +- 本文档新增导入导出接口可与现有列表/编辑功能并行使用。 diff --git a/docs/art-school-tag-major-tag-api.md b/docs/art-school-tag-major-tag-api.md new file mode 100644 index 0000000..c74ae9b --- /dev/null +++ b/docs/art-school-tag-major-tag-api.md @@ -0,0 +1,117 @@ +# 学校与专业标签联动接口补充文档 + +本文档仅说明本次新增字段: + +- `/art/school`:新增 `schoolTags` +- `/art/schoolMajor`:新增 `majorTags` + +## 1. /art/school 接口补充 + +### 1.1 GET `/art/school/{schoolId}` + +返回对象 `data` 中新增: + +| 字段 | 类型 | 说明 | +|---|---|---| +| schoolTags | string[] | 学校标签列表 | + +示例: + +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "schoolId": 1001, + "mainCode": "10531", + "mainName": "某某大学", + "enrollCodes": ["10531", "A10531"], + "schoolTags": ["985", "211", "双一流"] + } +} +``` + +### 1.2 POST `/art/school` + +请求体 `ArtSchoolSubmitBo` 新增: + +| 字段 | 类型 | 必填 | 说明 | +|---|---|---|---| +| schoolTags | string[] | 否 | 学校标签列表(全量替换语义) | + +### 1.3 PUT `/art/school` + +请求体 `ArtSchoolSubmitBo` 新增: + +| 字段 | 类型 | 必填 | 说明 | +|---|---|---|---| +| schoolTags | string[] | 否 | 学校标签列表(全量替换语义) | + +### 1.4 `schoolTags` 处理语义 + +- `schoolTags = null`:不修改已有标签 +- `schoolTags = []`:清空该学校全部标签 +- `schoolTags = ["985","211"]`:按传入值全量覆盖(去重后保存) + +--- + +## 2. /art/schoolMajor 接口补充 + +### 2.1 GET `/art/schoolMajor/{majorId}` + +返回对象 `data` 中新增: + +| 字段 | 类型 | 说明 | +|---|---|---| +| majorTags | string[] | 专业标签列表 | + +示例: + +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "majorId": 9001, + "majorName": "视觉传达设计", + "majorTags": ["国家级特色专业", "一流本科专业"] + } +} +``` + +### 2.2 GET `/art/schoolMajor/list` + +列表项中新增字段: + +| 字段 | 类型 | 说明 | +|---|---|---| +| majorTags | string[] | 专业标签列表 | + +### 2.3 POST `/art/schoolMajor` + +请求体 `ArtSchoolMajorBo` 新增: + +| 字段 | 类型 | 必填 | 说明 | +|---|---|---|---| +| majorTags | string[] | 否 | 专业标签列表(全量替换语义) | + +### 2.4 PUT `/art/schoolMajor` + +请求体 `ArtSchoolMajorBo` 新增: + +| 字段 | 类型 | 必填 | 说明 | +|---|---|---|---| +| majorTags | string[] | 否 | 专业标签列表(全量替换语义) | + +### 2.5 `majorTags` 处理语义 + +- `majorTags = null`:不修改已有标签 +- `majorTags = []`:清空该专业全部标签 +- `majorTags = ["A","B"]`:按传入值全量覆盖(去重后保存) + +--- + +## 3. 与旧字段兼容说明 + +- `ArtSchoolMajorBo` / `ArtSchoolMajorVo` 中旧字段 `tags` 仍保留,便于兼容历史前端。 +- 新增推荐字段为 `majorTags`(数组),后续前端优先使用该字段。 diff --git a/docs/java/VelocityUtils.java b/docs/java/VelocityUtils.java new file mode 100644 index 0000000..b9a50ce --- /dev/null +++ b/docs/java/VelocityUtils.java @@ -0,0 +1,389 @@ +package org.dromara.generator.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.StrUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.velocity.VelocityContext; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.enums.DataBaseType; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.generator.constant.GenConstants; +import org.dromara.generator.domain.GenTable; +import org.dromara.generator.domain.GenTableColumn; + +import java.util.*; + +/** + * 模板处理工具类 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class VelocityUtils { + + /** + * 项目空间路径 + */ + private static final String PROJECT_PATH = "main/java"; + + /** + * mybatis空间路径 + */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** + * 默认上级菜单,系统工具 + */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(GenTable genTable) { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", StrUtil.toSymbolCase(genTable.getModuleName(), '-')); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("business_name", StrUtil.toUnderlineCase(genTable.getBusinessName())); + velocityContext.put("business__name", StrUtil.toSymbolCase(genTable.getBusinessName(), '-')); + velocityContext.put("businessname", StrUtil.toSymbolCase(genTable.getBusinessName(), ' ')); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("dicts", getDicts(genTable)); + velocityContext.put("dictList", getDictList(genTable)); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + velocityContext.put("StrUtil", new StrUtil()); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) { + setTreeVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + context.put("tree_parent_code", paramsObj.get(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { + context.put("tree_name", paramsObj.get(GenConstants.TREE_NAME)); + } + } + + /** + * 获取模板信息 + * + * @return 模板列表 + */ + public static List getTemplateList(String tplCategory) { + List templates = new ArrayList<>(); + templates.add("vm/java/domain.java.vm"); + templates.add("vm/java/vo.java.vm"); + templates.add("vm/java/bo.java.vm"); + templates.add("vm/java/mapper.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + templates.add("vm/xml/mapper.xml.vm"); + DataBaseType dataBaseType = DataBaseHelper.getDataBaseType(); + if (dataBaseType.isOracle()) { + templates.add("vm/sql/oracle/sql.vm"); + } else if (dataBaseType.isPostgreSql()) { + templates.add("vm/sql/postgres/sql.vm"); + } else if (dataBaseType.isSqlServer()) { + templates.add("vm/sql/sqlserver/sql.vm"); + } else { + templates.add("vm/sql/sql.vm"); + } + templates.add("vm/soy/typings/api.d.ts.vm"); + templates.add("vm/soy/api/api.ts.vm"); + templates.add("vm/soy/modules/search.vue.vm"); + templates.add("vm/soy/modules/operate-drawer.vue.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) { + templates.add("vm/soy/index.vue.vm"); + } else if (GenConstants.TPL_TREE.equals(tplCategory)) { + templates.add("vm/soy/index-tree.vue.vm"); + } + return templates; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) { + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + // 大写类名 + String className = genTable.getClassName(); + // 业务名称 + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String soybeanPath = "soy"; + String soybeanModuleName = StrUtil.toSymbolCase(moduleName, '-'); + if (template.contains("domain.java.vm")) { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("vo.java.vm")) { + fileName = StringUtils.format("{}/domain/vo/{}Vo.java", javaPath, className); + } + if (template.contains("bo.java.vm")) { + fileName = StringUtils.format("{}/domain/bo/{}Bo.java", javaPath, className); + } + if (template.contains("mapper.java.vm")) { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } else if (template.contains("service.java.vm")) { + fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); + } else if (template.contains("serviceImpl.java.vm")) { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } else if (template.contains("controller.java.vm")) { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } else if (template.contains("mapper.xml.vm")) { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } else if (template.contains("sql.vm")) { + fileName = businessName + "Menu.sql"; + } else if (template.contains("index.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", soybeanPath, soybeanModuleName, StrUtil.toSymbolCase(businessName, '-')); + } else if (template.contains("index-tree.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", soybeanPath, soybeanModuleName, StrUtil.toSymbolCase(businessName, '-')); + } else if (template.contains("api.d.ts.vm")) { + fileName = StringUtils.format("{}/typings/api/{}.{}.api.d.ts", soybeanPath, soybeanModuleName, StrUtil.toSymbolCase(businessName, '-')); + } else if (template.contains("api.ts.vm")) { + fileName = StringUtils.format("{}/service/api/{}/{}.ts", soybeanPath, soybeanModuleName, StrUtil.toSymbolCase(businessName, '-')); + } else if (template.contains("search.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/modules/{}-search.vue", soybeanPath, soybeanModuleName, StrUtil.toSymbolCase(businessName, '-'), StrUtil.toSymbolCase(businessName, '-')); + } else if (template.contains("operate-drawer.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/modules/{}-operate-drawer.vue", soybeanPath, soybeanModuleName, StrUtil.toSymbolCase(businessName, '-'), StrUtil.toSymbolCase(businessName, '-')); + } + return fileName; + } + + /** + * 获取包前缀 + * + * @param packageName 包名称 + * @return 包前缀名称 + */ + public static String getPackagePrefix(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + return StringUtils.substring(packageName, 0, lastIndex); + } + + /** + * 根据列类型获取导入包 + * + * @param genTable 业务表对象 + * @return 返回需要导入的包列表 + */ + public static HashSet getImportList(GenTable genTable) { + List columns = genTable.getColumns(); + HashSet importList = new HashSet<>(); + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) { + importList.add("java.math.BigDecimal"); + } else if (!column.isSuperColumn() && "imageUpload".equals(column.getHtmlType())) { + importList.add("org.dromara.common.translation.annotation.Translation"); + importList.add("org.dromara.common.translation.constant.TransConstant"); + } + } + return importList; + } + + /** + * 根据列类型获取字典组 + * + * @param genTable 业务表对象 + * @return 返回字典组 + */ + public static String getDicts(GenTable genTable) { + List columns = genTable.getColumns(); + Set dicts = new HashSet<>(); + addDicts(dicts, columns); + return StringUtils.join(dicts, ", "); + } + + /** + * 添加字典列表 + * + * @param dicts 字典列表 + * @param columns 列集合 + */ + public static void addDicts(Set dicts, List columns) { + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX)) { + dicts.add("'" + column.getDictType() + "'"); + } + } + } + + /** + * 根据列类型获取字典组 + * + * @param genTable 业务表对象 + * @return 返回字典组 + */ + public static Set> getDictList(GenTable genTable) { + List columns = genTable.getColumns(); + Set> dicts = new HashSet<>(); + addDictList(dicts, columns); + return dicts; + } + + /** + * 添加字典列表 + * + * @param dicts 字典列表 + * @param columns 列集合 + */ + public static void addDictList(Set> dicts, List columns) { + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX)) { + Map dict = new HashMap<>(); + dict.put("type", column.getDictType()); + dict.put("name", StringUtils.toCamelCase(column.getDictType())); + dict.put("immediate", column.isList()); + dicts.add(dict); + } + } + } + + /** + * 获取权限前缀 + * + * @param moduleName 模块名称 + * @param businessName 业务名称 + * @return 返回权限前缀 + */ + public static String getPermissionPrefix(String moduleName, String businessName) { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 获取上级菜单ID字段 + * + * @param paramsObj 生成其他选项 + * @return 上级菜单ID字段 + */ + public static String getParentMenuId(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getStr(GenConstants.PARENT_MENU_ID))) { + return paramsObj.getStr(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 获取树编码 + * + * @param paramsObj 生成其他选项 + * @return 树编码 + */ + public static String getTreecode(Map paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) { + return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE))); + } + return StringUtils.EMPTY; + } + + /** + * 获取树父编码 + * + * @param paramsObj 生成其他选项 + * @return 树父编码 + */ + public static String getTreeParentCode(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树名称 + * + * @param paramsObj 生成其他选项 + * @return 树名称 + */ + public static String getTreeName(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) { + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 获取需要在哪一列上面显示展开按钮 + * + * @param genTable 业务表对象 + * @return 展开按钮列序号 + */ + public static int getExpandColumn(GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String treeName = paramsObj.getStr(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) { + if (column.isList()) { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) { + break; + } + } + } + return num; + } +} diff --git a/docs/school-major-campus-api-requirement.md b/docs/school-major-campus-api-requirement.md new file mode 100644 index 0000000..f2a3cd3 --- /dev/null +++ b/docs/school-major-campus-api-requirement.md @@ -0,0 +1,110 @@ +# 专业/宿舍关联校区接口评估与需求 + +## 1. 当前可用能力评估 + +### 1.1 宿舍管理(可支撑) +- 已有校区列表接口:`GET /art/schoolCampus/list` + - 支持入参 `schoolId`,可按学校查询校区。 +- 已有宿舍新增/修改接口: + - `POST /art/schoolDorm` + - `PUT /art/schoolDorm` + - 入参已包含 `campusId`,可直接做“校区下拉选择后提交关联”。 + +### 1.2 专业管理(当前不可完全支撑) +- 专业接口当前为: + - `GET /art/schoolMajor/list` + - `POST /art/schoolMajor` + - `PUT /art/schoolMajor` +- 现有专业模型/类型无 `campusId` 字段,仅有 `schoolId`、`collegeId` 等。 +- 结论:前端可加载校区列表,但无法通过现有专业接口保存“专业 -> 校区”关联。 + +## 2. 专业管理所需接口改造(建议) + +## 2.1 方案:在专业主模型中新增 `campusId`(单校区关联) + +### 专业列表查询 +- URL: `GET /art/schoolMajor/list` +- 新增查询入参: + - `campusId` `number|string` 可选 +- 返回字段新增: + - `campusId` `number|string` + - `campusName` `string`(建议返回,便于表格展示) + +#### 查询入参示例 +```json +{ + "pageNum": 1, + "pageSize": 10, + "schoolId": 1001, + "campusId": 2001, + "majorName": "视觉传达设计" +} +``` + +#### 查询返回 rows 单项示例 +```json +{ + "majorId": 3001, + "schoolId": 1001, + "campusId": 2001, + "campusName": "主校区", + "collegeId": 5001, + "majorName": "视觉传达设计" +} +``` + +### 专业新增 +- URL: `POST /art/schoolMajor` +- 新增必填入参: + - `campusId` `number|string` + +#### 新增入参示例 +```json +{ + "schoolId": 1001, + "campusId": 2001, + "collegeId": 5001, + "majorCode": "130502", + "majorName": "视觉传达设计", + "educationLevel": "本科", + "durationYears": 4 +} +``` + +### 专业修改 +- URL: `PUT /art/schoolMajor` +- 新增必填入参: + - `campusId` `number|string` + +#### 修改入参示例 +```json +{ + "majorId": 3001, + "schoolId": 1001, + "campusId": 2002, + "collegeId": 5001, + "majorName": "视觉传达设计" +} +``` + +## 3. 统一返回格式建议 + +### 列表接口返回(保持现有 RuoYi 分页结构) +```json +{ + "code": 200, + "msg": "操作成功", + "rows": [], + "total": 0 +} +``` + +### 新增/修改接口返回 +```json +{ + "code": 200, + "msg": "操作成功", + "data": true +} +``` + diff --git a/docs/sql/sys_dict_data.sql b/docs/sql/sys_dict_data.sql new file mode 100644 index 0000000..7f61ef4 --- /dev/null +++ b/docs/sql/sys_dict_data.sql @@ -0,0 +1,59 @@ +-- 修改字典数据表的 list_class 字段,将 danger 改为 error +UPDATE `sys_dict_data` SET `list_class` = 'error' WHERE `list_class` = 'danger'; + +-- 字典适配多语言 +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_user_sex.male', `dict_type` = 'sys_user_sex' WHERE `dict_code` = 1; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_user_sex.female', `dict_type` = 'sys_user_sex' WHERE `dict_code` = 2; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_user_sex.unknown', `dict_type` = 'sys_user_sex' WHERE `dict_code` = 3; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_show_hide.show', `dict_type` = 'sys_show_hide' WHERE `dict_code` = 4; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_show_hide.hide', `dict_type` = 'sys_show_hide' WHERE `dict_code` = 5; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_normal_disable.normal', `dict_type` = 'sys_normal_disable' WHERE `dict_code` = 6; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_normal_disable.disable', `dict_type` = 'sys_normal_disable' WHERE `dict_code` = 7; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_yes_no.yes', `dict_type` = 'sys_yes_no' WHERE `dict_code` = 12; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_yes_no.no', `dict_type` = 'sys_yes_no' WHERE `dict_code` = 13; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_notice_type.notice', `dict_type` = 'sys_notice_type' WHERE `dict_code` = 14; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_notice_type.announcement', `dict_type` = 'sys_notice_type' WHERE `dict_code` = 15; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_notice_status.normal', `dict_type` = 'sys_notice_status' WHERE `dict_code` = 16; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_notice_status.close', `dict_type` = 'sys_notice_status' WHERE `dict_code` = 17; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_oper_type.insert', `dict_type` = 'sys_oper_type' WHERE `dict_code` = 18; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_oper_type.update', `dict_type` = 'sys_oper_type' WHERE `dict_code` = 19; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_oper_type.delete', `dict_type` = 'sys_oper_type' WHERE `dict_code` = 20; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_oper_type.grant', `dict_type` = 'sys_oper_type' WHERE `dict_code` = 21; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_oper_type.export', `dict_type` = 'sys_oper_type' WHERE `dict_code` = 22; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_oper_type.import', `dict_type` = 'sys_oper_type' WHERE `dict_code` = 23; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_oper_type.force', `dict_type` = 'sys_oper_type' WHERE `dict_code` = 24; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_oper_type.gencode', `dict_type` = 'sys_oper_type' WHERE `dict_code` = 25; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_oper_type.clean', `dict_type` = 'sys_oper_type' WHERE `dict_code` = 26; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_common_status.success', `dict_type` = 'sys_common_status' WHERE `dict_code` = 27; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_common_status.fail', `dict_type` = 'sys_common_status' WHERE `dict_code` = 28; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_oper_type.other', `dict_type` = 'sys_oper_type' WHERE `dict_code` = 29; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_grant_type.password', `dict_type` = 'sys_grant_type' WHERE `dict_code` = 30; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_grant_type.sms', `dict_type` = 'sys_grant_type' WHERE `dict_code` = 31; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_grant_type.email', `dict_type` = 'sys_grant_type' WHERE `dict_code` = 32; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_grant_type.miniapp', `dict_type` = 'sys_grant_type' WHERE `dict_code` = 33; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_grant_type.social', `dict_type` = 'sys_grant_type' WHERE `dict_code` = 34; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_device_type.pc', `dict_type` = 'sys_device_type' WHERE `dict_code` = 35; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_device_type.android', `dict_type` = 'sys_device_type' WHERE `dict_code` = 36; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_device_type.ios', `dict_type` = 'sys_device_type' WHERE `dict_code` = 37; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.sys_device_type.miniapp', `dict_type` = 'sys_device_type' WHERE `dict_code` = 38; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_business_status.revoked', `dict_type` = 'wf_business_status' WHERE `dict_code` = 39; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_business_status.draft', `dict_type` = 'wf_business_status' WHERE `dict_code` = 40; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_business_status.pending', `dict_type` = 'wf_business_status' WHERE `dict_code` = 41; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_business_status.completed', `dict_type` = 'wf_business_status' WHERE `dict_code` = 42; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_business_status.cancelled', `dict_type` = 'wf_business_status' WHERE `dict_code` = 43; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_business_status.returned', `dict_type` = 'wf_business_status' WHERE `dict_code` = 44; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_business_status.terminated', `dict_type` = 'wf_business_status' WHERE `dict_code` = 45; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_form_type.custom_form', `dict_type` = 'wf_form_type' WHERE `dict_code` = 46; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_form_type.dynamic_form', `dict_type` = 'wf_form_type' WHERE `dict_code` = 47; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_task_status.revoke', `dict_type` = 'wf_task_status' WHERE `dict_code` = 48; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_task_status.pass', `dict_type` = 'wf_task_status' WHERE `dict_code` = 49; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_task_status.pending_review', `dict_type` = 'wf_task_status' WHERE `dict_code` = 50; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_task_status.cancel', `dict_type` = 'wf_task_status' WHERE `dict_code` = 51; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_task_status.return', `dict_type` = 'wf_task_status' WHERE `dict_code` = 52; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_task_status.terminate', `dict_type` = 'wf_task_status' WHERE `dict_code` = 53; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_task_status.transfer', `dict_type` = 'wf_task_status' WHERE `dict_code` = 54; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_task_status.delegate', `dict_type` = 'wf_task_status' WHERE `dict_code` = 55; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_task_status.copy', `dict_type` = 'wf_task_status' WHERE `dict_code` = 56; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_task_status.add_sign', `dict_type` = 'wf_task_status' WHERE `dict_code` = 57; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_task_status.minus_sign', `dict_type` = 'wf_task_status' WHERE `dict_code` = 58; +UPDATE `sys_dict_data` SET `dict_label` = 'dict.wf_task_status.timeout', `dict_type` = 'wf_task_status' WHERE `dict_code` = 59; diff --git a/docs/sql/sys_menu.sql b/docs/sql/sys_menu.sql new file mode 100644 index 0000000..ec5f107 --- /dev/null +++ b/docs/sql/sys_menu.sql @@ -0,0 +1,43 @@ +-- 目录类型菜单 +UPDATE `sys_menu` SET `component` = 'Layout', `icon` = 'carbon:cloud-service-management', `menu_name` = 'route.system' WHERE `menu_id` = 1; +UPDATE `sys_menu` SET `component` = 'Layout', `icon` = 'stash:dashboard', `menu_name` = 'route.monitor' WHERE `menu_id` = 2; +UPDATE `sys_menu` SET `component` = 'Layout', `icon` = 'tabler:tools', `menu_name` = 'route.tool' WHERE `menu_id` = 3; +UPDATE `sys_menu` SET `component` = 'Layout', `icon` = 'material-symbols:kid-star-outline', `menu_name` = 'route.demo' WHERE `menu_id` = 5; +UPDATE `sys_menu` SET `component` = 'Layout', `icon` = 'tabler:building-cog', `menu_name` = 'menu.system_tenant' WHERE `menu_id` = 6; +UPDATE `sys_menu` SET `component` = 'Layout', `icon` = 'tabler:logs', `menu_name` = 'menu.system_log' WHERE `menu_id` = 108; + +-- 页面类型 +UPDATE `sys_menu` SET `icon` = 'ic:round-manage-accounts', `menu_name` = 'route.system_user' WHERE `menu_id` = 100; +UPDATE `sys_menu` SET `icon` = 'carbon:user-role', `menu_name` = 'route.system_role' WHERE `menu_id` = 101; +UPDATE `sys_menu` SET `icon` = 'material-symbols:route', `menu_name` = 'route.system_menu' WHERE `menu_id` = 102; +UPDATE `sys_menu` SET `icon` = 'mingcute:department-line', `menu_name` = 'route.system_dept' WHERE `menu_id` = 103; +UPDATE `sys_menu` SET `icon` = 'hugeicons:permanent-job', `menu_name` = 'route.system_post' WHERE `menu_id` = 104; +UPDATE `sys_menu` SET `icon` = 'qlementine-icons:dictionary-16', `menu_name` = 'route.system_dict' WHERE `menu_id` = 105; +UPDATE `sys_menu` SET `icon` = 'carbon:parameter', `menu_name` = 'route.system_config' WHERE `menu_id` = 106; +UPDATE `sys_menu` SET `icon` = 'solar:chat-line-outline', `menu_name` = 'route.system_notice' WHERE `menu_id` = 107; +UPDATE `sys_menu` SET `icon` = 'majesticons:status-online-line', `menu_name` = 'route.monitor_online' WHERE `menu_id` = 109; +UPDATE `sys_menu` SET `icon` = 'simple-icons:redis', `menu_name` = 'route.monitor_cache' WHERE `menu_id` = 113; +UPDATE `sys_menu` SET `icon` = 'material-symbols:code-blocks-outline', `menu_name` = 'route.tool_gen' WHERE `menu_id` = 115; +UPDATE `sys_menu` SET `icon` = 'material-symbols:attach-file', `menu_name` = 'route.system_oss' WHERE `menu_id` = 118; +UPDATE `sys_menu` SET `icon` = 'tabler:building-skyscraper', `menu_name` = 'route.system_tenant' WHERE `menu_id` = 121; +UPDATE `sys_menu` SET `icon` = 'lets-icons:package-box-alt', `menu_name` = 'route.system_tenant-package' WHERE `menu_id` = 122; +UPDATE `sys_menu` SET `icon` = 'tabler:device-imac-cog', `menu_name` = 'route.system_client' WHERE `menu_id` = 123; +UPDATE `sys_menu` SET `icon` = 'carbon:operations-record', `menu_name` = 'route.monitor_operlog' WHERE `menu_id` = 500; +UPDATE `sys_menu` SET `icon` = 'tabler:login-2', `menu_name` = 'route.monitor_logininfor' WHERE `menu_id` = 501; +UPDATE `sys_menu` SET `icon` = 'gg:debug', `menu_name` = 'route.demo_demo' WHERE `menu_id` = 1500; +UPDATE `sys_menu` SET `icon` = 'gg:debug', `menu_name` = 'route.demo_tree' WHERE `menu_id` = 1506; +UPDATE `sys_menu` SET `path` = 'oss/config', `component` = 'system/oss-config/index', `icon` = 'hugeicons:configuration-01', `menu_name` = 'route.system_oss-config' WHERE `menu_id` = 133; +INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (9, 'route.about', 0, 99, 'about', 'about/index', '', 1, 1, 'C', '0', '0', '', 'fluent:book-information-24-regular', 103, 1, sysdate(), null, null, '关于页面') ON DUPLICATE KEY UPDATE `update_time` = sysdate(); + +-- IFrame 类型 +UPDATE `sys_menu` SET `component` = 'FrameView', `query_param` = '{"url": "https://ruoyi.xlsea.cn/admin/"}', `is_frame` = 2, `icon` = 'bx:bxl-spring-boot', `menu_name` = 'menu.monitor_admin' WHERE `menu_id` = 117; +UPDATE `sys_menu` SET `component` = 'FrameView', `query_param` = '{"url": "https://preview.snailjob.opensnail.com/"}', `is_frame` = 2, `icon` = 'gridicons:scheduled', `menu_name` = 'menu.monitor_snail-job' WHERE `menu_id` = 120; +-- 外链类型 +UPDATE `sys_menu` SET `menu_name` = 'RuoYi-Vue-Plus', `order_num` = 100, `path` = 'https://gitee.com/dromara/RuoYi-Vue-Plus', `component` = 'FrameView', `icon` = 'local-icon-gitee', `remark` = 'RuoYi-Vue-Plus 仓库地址' WHERE `menu_id` = 4; +INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (7, 'Soybean Admin', 0, 100, 'https://github.com/soybeanjs', 'FrameView', '', 0, 0, 'M', '0', '0', '', 'mdi:github', 103, 1, sysdate(), null, null, 'Soybean Admin 仓库地址') ON DUPLICATE KEY UPDATE `update_time` = sysdate(); +INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (8, 'RuoYi-Plus-Soybean', 0, 100, 'https://gitee.com/xlsea/ruoyi-plus-soybean', 'FrameView', '', 0, 0, 'M', '0', '0', '', 'local-icon-gitee', 103, 1, sysdate(), null, null, 'RuoYi-Plus-Soybean 仓库地址') ON DUPLICATE KEY UPDATE `update_time` = sysdate(); + +-- plus-ui 需要禁用的页面 +UPDATE `sys_menu` SET `status` = '1' WHERE `menu_id` IN ( '116', '130', '131', '132' ); +-- 工作流需要禁用的页面 +UPDATE `sys_menu` SET `status` = '1' WHERE `menu_id` IN ( '11616', '11618', '11638', '11700', '11701' ); diff --git a/docs/template/api/api.ts.vm b/docs/template/api/api.ts.vm new file mode 100644 index 0000000..f910941 --- /dev/null +++ b/docs/template/api/api.ts.vm @@ -0,0 +1,41 @@ +import { request } from '@/service/request'; +#set($responseType = "") +#if($tplCategory == "tree") + #set($responseType = "Api.${ModuleName}.${BusinessName}[]") +#else + #set($responseType = "Api.${ModuleName}.${BusinessName}List") +#end + +/** 获取${functionName}列表 */ +export function fetchGet${BusinessName}List (params?: Api.${ModuleName}.${BusinessName}SearchParams) { + return request<$responseType>({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params + }); +} +/** 新增${functionName} */ +export function fetchCreate${BusinessName} (data: Api.${ModuleName}.${BusinessName}OperateParams) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data + }); +} + +/** 修改${functionName} */ +export function fetchUpdate${BusinessName} (data: Api.${ModuleName}.${BusinessName}OperateParams) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data + }); +} + +/** 批量删除${functionName} */ +export function fetchBatchDelete${BusinessName} (${pkColumn.javaField}s: CommonType.IdType[]) { + return request({ + url: `/${moduleName}/${businessName}/${${pkColumn.javaField}s.join(',')}`, + method: 'delete' + }); +} diff --git a/docs/template/index-tree.vue.vm b/docs/template/index-tree.vue.vm new file mode 100644 index 0000000..5a0a99a --- /dev/null +++ b/docs/template/index-tree.vue.vm @@ -0,0 +1,232 @@ + + + + + diff --git a/docs/template/index.vue.vm b/docs/template/index.vue.vm new file mode 100644 index 0000000..f1cc6dc --- /dev/null +++ b/docs/template/index.vue.vm @@ -0,0 +1,198 @@ + + + + + diff --git a/docs/template/modules/operate-drawer.vue.vm b/docs/template/modules/operate-drawer.vue.vm new file mode 100644 index 0000000..60725e4 --- /dev/null +++ b/docs/template/modules/operate-drawer.vue.vm @@ -0,0 +1,257 @@ + + + + + diff --git a/docs/template/modules/search.vue.vm b/docs/template/modules/search.vue.vm new file mode 100644 index 0000000..4cd4aba --- /dev/null +++ b/docs/template/modules/search.vue.vm @@ -0,0 +1,130 @@ +#set($ModuleName=$moduleName.substring(0, 1).toUpperCase() + $moduleName.substring(1)) + + + + + diff --git a/docs/template/typings/api.d.ts.vm b/docs/template/typings/api.d.ts.vm new file mode 100644 index 0000000..e65af2c --- /dev/null +++ b/docs/template/typings/api.d.ts.vm @@ -0,0 +1,51 @@ +#set($BaseEntity = ['createDept', 'createBy', 'createTime', 'updateBy', 'updateTime']) +#set($ModuleName = $moduleName.substring(0, 1).toUpperCase() + $moduleName.substring(1)) +/** + * Namespace Api + * + * All backend api type + */ +declare namespace Api { + /** + * namespace ${ModuleName} + * + * backend api module: "${ModuleName}" + */ + namespace ${ModuleName} { + /** ${businessname} */ + type ${BusinessName} = Common.CommonRecord<{ + #foreach($column in $columns)#if(!$BaseEntity.contains($column.javaField)) + /** $column.columnComment */ + $column.javaField:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) CommonType.IdType; #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; #elseif($column.javaType == 'Boolean') boolean; #else string; #end + #end#end + }>; + + /** ${businessname} search params */ + type ${BusinessName}SearchParams = CommonType.RecordNullable< + Pick< + Api.${ModuleName}.${BusinessName}, + #foreach($column in $columns) + #if($column.query && $column.queryType != 'BETWEEN') + | '${column.javaField}' + #end + #end + > & + Api.Common.CommonSearchParams + >; + + /** ${businessname} operate params */ + type ${BusinessName}OperateParams = CommonType.RecordNullable< + Pick< + Api.${ModuleName}.${BusinessName}, + #foreach($column in $columns) + #if($column.insert || $column.edit) + | '${column.javaField}' + #end + #end + > + >; + + /** ${businessname} list */ + type ${BusinessName}List = Api.Common.PaginatingQueryRecord<${BusinessName}>; + } +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..00537e3 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,24 @@ +import { defineConfig } from '@soybeanjs/eslint-config'; + +export default defineConfig( + { vue: true, unocss: true }, + { + rules: { + 'vue/multi-word-component-names': [ + 'warn', + { + ignores: ['index', 'App', 'Register', '[id]', '[url]'] + } + ], + 'vue/component-name-in-template-casing': [ + 'warn', + 'PascalCase', + { + registeredComponentsOnly: false, + ignores: ['/^icon-/'] + } + ], + 'unocss/order-attributify': 'off' + } + } +); diff --git a/index.html b/index.html new file mode 100644 index 0000000..b04ac55 --- /dev/null +++ b/index.html @@ -0,0 +1,14 @@ + + + + + + + + %VITE_APP_TITLE% + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..78024af --- /dev/null +++ b/package.json @@ -0,0 +1,127 @@ +{ + "name": "ruoyi-vue-plus", + "type": "module", + "version": "2.0.0", + "description": "结合了 RuoYi-Vue-Plus 的强大后端功能和 Soybean Admin 的现代化前端特性,为开发者提供了完整的企业管理解决方案。", + "author": { + "name": "xlsea", + "email": "m@xlsea.cn", + "url": "https://gitee.com/xlsea" + }, + "license": "MIT", + "homepage": "https://docs.ruoyi.xlsea.cn", + "repository": { + "url": "https://gitee.com/xlsea/ruoyi-plus-soybean.git" + }, + "bugs": { + "url": "https://gitee.com/xlsea/ruoyi-plus-soybean/issues" + }, + "keywords": [ + "RuoYi-Vue-Plus", + "Soybean Admin", + "Vue3 admin ", + "vue-admin-template", + "Vite7", + "TypeScript", + "naive-ui", + "naive-ui-admin", + "ant-design-vue v4", + "UnoCSS" + ], + "contributors": [ + { + "name": "Elio", + "email": "1983933789@qq.com", + "url": "https://gitee.com/elio-an" + } + ], + "engines": { + "node": ">=20.19.0", + "pnpm": ">=10.5.0" + }, + "scripts": { + "build": "vite build --mode prod", + "build:dev": "vite build --mode dev", + "build:test": "vite build --mode test", + "cleanup": "sa cleanup", + "commit": "sa git-commit", + "commit:zh": "sa git-commit -l=zh-cn", + "dev": "vite --mode dev", + "dev:prod": "vite --mode prod", + "dev:test": "vite --mode test", + "gen-route": "sa gen-route", + "lint": "eslint . --fix", + "prepare": "simple-git-hooks", + "preview": "vite preview", + "release": "sa release", + "typecheck": "vue-tsc --noEmit --skipLibCheck", + "update-pkg": "sa update-pkg" + }, + "dependencies": { + "@better-scroll/core": "2.5.1", + "@iconify/vue": "5.0.0", + "@sa/axios": "workspace:*", + "@sa/color": "workspace:*", + "@sa/hooks": "workspace:*", + "@sa/materials": "workspace:*", + "@sa/utils": "workspace:*", + "@types/streamsaver": "^2.0.5", + "@umoteam/editor": "^9.0.1", + "@vueuse/core": "14.1.0", + "clipboard": "2.0.11", + "dayjs": "1.11.19", + "defu": "6.1.4", + "echarts": "6.0.0", + "highlight.js": "^11.11.1", + "jsencrypt": "^3.5.4", + "json5": "2.2.3", + "naive-ui": "2.43.2", + "nprogress": "0.2.0", + "pinia": "3.0.4", + "streamsaver": "^2.0.6", + "tailwind-merge": "3.4.0", + "vue": "3.5.26", + "vue-advanced-cropper": "^2.8.9", + "vue-draggable-plus": "0.6.0", + "vue-i18n": "11.2.7", + "vue-router": "4.6.4" + }, + "devDependencies": { + "@elegant-router/vue": "0.3.8", + "@iconify/json": "2.2.417", + "@sa/scripts": "workspace:*", + "@sa/uno-preset": "workspace:*", + "@soybeanjs/eslint-config": "1.7.4", + "@types/node": "25.0.3", + "@types/nprogress": "0.2.3", + "@unocss/eslint-config": "66.5.10", + "@unocss/preset-icons": "66.5.10", + "@unocss/preset-uno": "66.5.10", + "@unocss/transformer-directives": "66.5.10", + "@unocss/transformer-variant-group": "66.5.10", + "@unocss/vite": "66.5.10", + "@vitejs/plugin-vue": "6.0.3", + "@vitejs/plugin-vue-jsx": "5.1.2", + "consola": "3.4.2", + "eslint": "9.39.2", + "eslint-plugin-vue": "10.6.2", + "kolorist": "1.8.0", + "sass": "1.97.1", + "simple-git-hooks": "2.13.1", + "tsx": "4.21.0", + "typescript": "5.9.3", + "unplugin-icons": "22.5.0", + "unplugin-vue-components": "30.0.0", + "vite": "7.3.0", + "vite-plugin-progress": "0.0.7", + "vite-plugin-svg-icons": "2.0.1", + "vite-plugin-vue-devtools": "8.0.5", + "vue-eslint-parser": "10.2.0", + "vue-tsc": "3.2.1" + }, + "simple-git-hooks": { + "commit-msg": "pnpm sa git-commit-verify", + "pre-commit": "pnpm typecheck && pnpm lint && git diff --exit-code" + }, + "website": "https://ruoyi.xlsea.cn" +} diff --git a/packages/alova/package.json b/packages/alova/package.json new file mode 100644 index 0000000..a4d7434 --- /dev/null +++ b/packages/alova/package.json @@ -0,0 +1,20 @@ +{ + "name": "@sa/alova", + "version": "2.0.2", + "exports": { + ".": "./src/index.ts", + "./fetch": "./src/fetch.ts", + "./client": "./src/client.ts", + "./mock": "./src/mock.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + }, + "dependencies": { + "@alova/mock": "2.0.18", + "@sa/utils": "workspace:*", + "alova": "3.4.1" + } +} diff --git a/packages/alova/src/client.ts b/packages/alova/src/client.ts new file mode 100644 index 0000000..0d76ebb --- /dev/null +++ b/packages/alova/src/client.ts @@ -0,0 +1 @@ +export * from 'alova/client'; diff --git a/packages/alova/src/constant.ts b/packages/alova/src/constant.ts new file mode 100644 index 0000000..be5c43c --- /dev/null +++ b/packages/alova/src/constant.ts @@ -0,0 +1,2 @@ +/** the backend error code key */ +export const BACKEND_ERROR_CODE = 'BACKEND_ERROR'; diff --git a/packages/alova/src/fetch.ts b/packages/alova/src/fetch.ts new file mode 100644 index 0000000..8511ce4 --- /dev/null +++ b/packages/alova/src/fetch.ts @@ -0,0 +1,2 @@ +import adapterFetch from 'alova/fetch'; +export default adapterFetch; diff --git a/packages/alova/src/index.ts b/packages/alova/src/index.ts new file mode 100644 index 0000000..4264253 --- /dev/null +++ b/packages/alova/src/index.ts @@ -0,0 +1,77 @@ +import { createAlova } from 'alova'; +import type { AlovaDefaultCacheAdapter, AlovaGenerics, AlovaGlobalCacheAdapter, AlovaRequestAdapter } from 'alova'; +import VueHook from 'alova/vue'; +import type { VueHookType } from 'alova/vue'; +import adapterFetch from 'alova/fetch'; +import { createServerTokenAuthentication } from 'alova/client'; +import type { FetchRequestInit } from 'alova/fetch'; +import { BACKEND_ERROR_CODE } from './constant'; +import type { CustomAlovaConfig, RequestOptions } from './type'; + +export const createAlovaRequest = < + RequestConfig = FetchRequestInit, + ResponseType = Response, + ResponseHeader = Headers, + L1Cache extends AlovaGlobalCacheAdapter = AlovaDefaultCacheAdapter, + L2Cache extends AlovaGlobalCacheAdapter = AlovaDefaultCacheAdapter +>( + customConfig: CustomAlovaConfig< + AlovaGenerics + >, + options: RequestOptions> +) => { + const { tokenRefresher } = options; + const { onAuthRequired, onResponseRefreshToken } = createServerTokenAuthentication< + VueHookType, + AlovaRequestAdapter + >({ + refreshTokenOnSuccess: { + isExpired: (response, method) => tokenRefresher?.isExpired(response, method) || false, + handler: async (response, method) => tokenRefresher?.handler(response, method) + }, + refreshTokenOnError: { + isExpired: (response, method) => tokenRefresher?.isExpired(response, method) || false, + handler: async (response, method) => tokenRefresher?.handler(response, method) + } + }); + + const instance = createAlova({ + ...customConfig, + timeout: customConfig.timeout ?? 10 * 1000, + requestAdapter: (customConfig.requestAdapter as any) ?? adapterFetch(), + statesHook: VueHook, + beforeRequest: onAuthRequired(options.onRequest as any), + responded: onResponseRefreshToken({ + onSuccess: async (response, method) => { + // check if http status is success + let error: any = null; + let transformedData: any = null; + try { + if (await options.isBackendSuccess(response)) { + transformedData = await options.transformBackendResponse(response); + } else { + error = new Error('the backend request error'); + error.code = BACKEND_ERROR_CODE; + } + } catch (err) { + error = err; + } + + if (error) { + await options.onError?.(error, response, method); + throw error; + } + + return transformedData; + }, + onComplete: options.onComplete, + onError: (error, method) => options.onError?.(error, null, method) + }) + }); + + return instance; +}; + +export { BACKEND_ERROR_CODE }; +export type * from './type'; +export type * from 'alova'; diff --git a/packages/alova/src/mock.ts b/packages/alova/src/mock.ts new file mode 100644 index 0000000..f3aaf08 --- /dev/null +++ b/packages/alova/src/mock.ts @@ -0,0 +1 @@ +export * from '@alova/mock'; diff --git a/packages/alova/src/type.ts b/packages/alova/src/type.ts new file mode 100644 index 0000000..27b84b2 --- /dev/null +++ b/packages/alova/src/type.ts @@ -0,0 +1,52 @@ +import type { AlovaGenerics, AlovaOptions, AlovaRequestAdapter, Method, ResponseCompleteHandler } from 'alova'; + +export type CustomAlovaConfig = Omit< + AlovaOptions, + 'statesHook' | 'beforeRequest' | 'responded' | 'requestAdapter' +> & { + /** request adapter. all request of alova will be sent by it. */ + requestAdapter?: AlovaRequestAdapter; +}; + +export interface RequestOptions { + /** + * The hook before request + * + * For example: You can add header token in this hook + * + * @param method alova Method Instance + */ + onRequest?: AlovaOptions['beforeRequest']; + /** + * The hook to check backend response is success or not + * + * @param response alova response + */ + isBackendSuccess: (response: AG['Response']) => Promise; + + /** The config to refresh token */ + tokenRefresher?: { + /** detect the token is expired */ + isExpired(response: AG['Response'], Method: Method): Promise | boolean; + /** refresh token handler */ + handler(response: AG['Response'], Method: Method): Promise; + }; + + /** The hook after backend request complete */ + onComplete?: ResponseCompleteHandler; + + /** + * The hook to handle error + * + * For example: You can show error message in this hook + * + * @param error + */ + onError?: (error: any, response: AG['Response'] | null, methodInstance: Method) => any | Promise; + /** + * transform backend response when the responseType is json + * + * @param response alova response + */ + transformBackendResponse: (response: AG['Response']) => any; +} diff --git a/packages/alova/tsconfig.json b/packages/alova/tsconfig.json new file mode 100644 index 0000000..5823ed5 --- /dev/null +++ b/packages/alova/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/axios/package.json b/packages/axios/package.json new file mode 100644 index 0000000..902101e --- /dev/null +++ b/packages/axios/package.json @@ -0,0 +1,21 @@ +{ + "name": "@sa/axios", + "version": "2.0.2", + "exports": { + ".": "./src/index.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + }, + "dependencies": { + "@sa/utils": "workspace:*", + "axios": "1.13.2", + "axios-retry": "4.5.0", + "qs": "6.14.0" + }, + "devDependencies": { + "@types/qs": "6.14.0" + } +} diff --git a/packages/axios/src/constant.ts b/packages/axios/src/constant.ts new file mode 100644 index 0000000..e85ded3 --- /dev/null +++ b/packages/axios/src/constant.ts @@ -0,0 +1,8 @@ +/** request id key */ +export const REQUEST_ID_KEY = 'X-Request-Id'; + +/** the backend error code key */ +export const BACKEND_ERROR_CODE = 'BACKEND_ERROR'; + +/** the request canceled code */ +export const REQUEST_CANCELED_CODE = 'ERR_CANCELED'; diff --git a/packages/axios/src/index.ts b/packages/axios/src/index.ts new file mode 100644 index 0000000..08af572 --- /dev/null +++ b/packages/axios/src/index.ts @@ -0,0 +1,179 @@ +import axios, { AxiosError } from 'axios'; +import type { AxiosResponse, CreateAxiosDefaults, InternalAxiosRequestConfig } from 'axios'; +import axiosRetry from 'axios-retry'; +import { nanoid } from '@sa/utils'; +import { createAxiosConfig, createDefaultOptions, createRetryOptions } from './options'; +import { transformResponse } from './shared'; +import { BACKEND_ERROR_CODE, REQUEST_ID_KEY } from './constant'; +import type { + CustomAxiosRequestConfig, + FlatRequestInstance, + MappedType, + RequestInstance, + RequestOption, + ResponseType +} from './type'; + +function createCommonRequest< + ResponseData, + ApiData = ResponseData, + State extends Record = Record +>(axiosConfig?: CreateAxiosDefaults, options?: Partial>) { + const opts = createDefaultOptions(options); + + const axiosConf = createAxiosConfig(axiosConfig); + const instance = axios.create(axiosConf); + + const abortControllerMap = new Map(); + + // config axios retry + const retryOptions = createRetryOptions(axiosConf); + axiosRetry(instance, retryOptions); + + instance.interceptors.request.use(conf => { + const config: InternalAxiosRequestConfig = { ...conf }; + + // set request id + const requestId = nanoid(); + config.headers.set(REQUEST_ID_KEY, requestId); + + // config abort controller + if (!config.signal) { + const abortController = new AbortController(); + config.signal = abortController.signal; + abortControllerMap.set(requestId, abortController); + } + + // handle config by hook + const handledConfig = opts.onRequest?.(config) || config; + + return handledConfig; + }); + + instance.interceptors.response.use( + async response => { + const responseType: ResponseType = (response.config?.responseType as ResponseType) || 'json'; + + await transformResponse(response); + + if (responseType !== 'json' || opts.isBackendSuccess(response)) { + return Promise.resolve(response); + } + + const fail = await opts.onBackendFail(response, instance); + if (fail) { + return fail; + } + + const backendError = new AxiosError( + 'the backend request error', + BACKEND_ERROR_CODE, + response.config, + response.request, + response + ); + + await opts.onError(backendError); + + return Promise.reject(backendError); + }, + async (error: AxiosError) => { + await opts.onError(error); + + return Promise.reject(error); + } + ); + + function cancelAllRequest() { + abortControllerMap.forEach(abortController => { + abortController.abort(); + }); + abortControllerMap.clear(); + } + + return { + instance, + opts, + cancelAllRequest + }; +} + +/** + * create a request instance + * + * @param axiosConfig axios config + * @param options request options + */ +export function createRequest>( + axiosConfig?: CreateAxiosDefaults, + options?: Partial> +) { + const { instance, opts, cancelAllRequest } = createCommonRequest(axiosConfig, options); + + const request: RequestInstance = async function request< + T extends ApiData = ApiData, + R extends ResponseType = 'json' + >(config: CustomAxiosRequestConfig) { + const response: AxiosResponse = await instance(config); + + const responseType = response.config?.responseType || 'json'; + + if (responseType === 'json') { + return opts.transform(response); + } + + return response.data as MappedType; + } as RequestInstance; + + request.cancelAllRequest = cancelAllRequest; + request.state = {} as State; + + return request; +} + +/** + * create a flat request instance + * + * The response data is a flat object: { data: any, error: AxiosError } + * + * @param axiosConfig axios config + * @param options request options + */ +export function createFlatRequest>( + axiosConfig?: CreateAxiosDefaults, + options?: Partial> +) { + const { instance, opts, cancelAllRequest } = createCommonRequest(axiosConfig, options); + + const flatRequest: FlatRequestInstance = async function flatRequest< + T extends ApiData = ApiData, + R extends ResponseType = 'json' + >(config: CustomAxiosRequestConfig) { + try { + const response: AxiosResponse = await instance(config); + + const responseType = response.config?.responseType || 'json'; + + if (responseType === 'json') { + const data = await opts.transform(response); + + return { data, error: null, response }; + } + + return { data: response.data as MappedType, error: null, response }; + } catch (error) { + return { data: null, error, response: (error as AxiosError).response }; + } + } as FlatRequestInstance; + + flatRequest.cancelAllRequest = cancelAllRequest; + flatRequest.state = { + ...opts.defaultState + } as State; + + return flatRequest; +} + +export { BACKEND_ERROR_CODE, REQUEST_ID_KEY }; +export type * from './type'; +export type { CreateAxiosDefaults, AxiosError }; diff --git a/packages/axios/src/options.ts b/packages/axios/src/options.ts new file mode 100644 index 0000000..e786639 --- /dev/null +++ b/packages/axios/src/options.ts @@ -0,0 +1,60 @@ +import type { CreateAxiosDefaults } from 'axios'; +import type { IAxiosRetryConfig } from 'axios-retry'; +import { stringify } from 'qs'; +import { isHttpSuccess } from './shared'; +import type { RequestOption } from './type'; + +export function createDefaultOptions< + ResponseData, + ApiData = ResponseData, + State extends Record = Record +>(options?: Partial>) { + const opts: RequestOption = { + defaultState: {} as State, + transform: async response => response.data as unknown as ApiData, + transformBackendResponse: async response => response.data as unknown as ApiData, + onRequest: async config => config, + isBackendSuccess: _response => true, + onBackendFail: async () => {}, + onError: async () => {} + }; + + if (options?.transform) { + opts.transform = options.transform; + } else { + opts.transform = options?.transformBackendResponse || opts.transform; + } + + Object.assign(opts, options); + + return opts; +} + +export function createRetryOptions(config?: Partial) { + const retryConfig: IAxiosRetryConfig = { + retries: 0 + }; + + Object.assign(retryConfig, config); + + return retryConfig; +} + +export function createAxiosConfig(config?: Partial) { + const TEN_SECONDS = 10 * 1000; + + const axiosConfig: CreateAxiosDefaults = { + timeout: TEN_SECONDS, + headers: { + 'Content-Type': 'application/json' + }, + validateStatus: isHttpSuccess, + paramsSerializer: params => { + return stringify(params); + } + }; + + Object.assign(axiosConfig, config); + + return axiosConfig; +} diff --git a/packages/axios/src/shared.ts b/packages/axios/src/shared.ts new file mode 100644 index 0000000..1bb68f0 --- /dev/null +++ b/packages/axios/src/shared.ts @@ -0,0 +1,79 @@ +import type { AxiosHeaderValue, AxiosResponse, InternalAxiosRequestConfig } from 'axios'; +import type { ResponseType } from './type'; + +export function getContentType(config: InternalAxiosRequestConfig) { + const contentType: AxiosHeaderValue = config.headers?.['Content-Type'] || 'application/json'; + + return contentType; +} + +/** + * check if http status is success + * + * @param status + */ +export function isHttpSuccess(status: number) { + const isSuccessCode = status >= 200 && status < 300; + return isSuccessCode || status === 304; +} + +/** + * is response json + * + * @param response axios response + */ +export function isResponseJson(response: AxiosResponse) { + const { responseType } = response.config; + + return responseType === 'json' || responseType === undefined; +} + +export async function transformResponse(response: AxiosResponse) { + const responseType: ResponseType = (response.config?.responseType as ResponseType) || 'json'; + if (responseType === 'json') return; + + const isJson = response.headers['content-type']?.includes('application/json'); + if (!isJson) return; + + if (responseType === 'blob') { + await transformBlobToJson(response); + } + + if (responseType === 'arrayBuffer') { + await transformArrayBufferToJson(response); + } +} + +export async function transformBlobToJson(response: AxiosResponse) { + try { + let data = response.data; + + if (typeof data === 'string') { + data = JSON.parse(data); + } + + if (Object.prototype.toString.call(data) === '[object Blob]') { + const json = await data.text(); + data = JSON.parse(json); + } + + response.data = data; + } catch {} +} + +export async function transformArrayBufferToJson(response: AxiosResponse) { + try { + let data = response.data; + + if (typeof data === 'string') { + data = JSON.parse(data); + } + + if (Object.prototype.toString.call(data) === '[object ArrayBuffer]') { + const json = new TextDecoder().decode(data); + data = JSON.parse(json); + } + + response.data = data; + } catch {} +} diff --git a/packages/axios/src/type.ts b/packages/axios/src/type.ts new file mode 100644 index 0000000..0fa6caa --- /dev/null +++ b/packages/axios/src/type.ts @@ -0,0 +1,130 @@ +import type { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'; + +export type ContentType = + | 'text/html' + | 'text/plain' + | 'multipart/form-data' + | 'application/json' + | 'application/x-www-form-urlencoded' + | 'application/octet-stream'; + +export type ResponseTransform = (input: Input) => Output | Promise; + +export interface RequestOption< + ResponseData, + ApiData = ResponseData, + State extends Record = Record +> { + /** + * The default state + */ + defaultState?: State; + /** + * transform the response data to the api data + * + * @param response Axios response + */ + transform: ResponseTransform, ApiData>; + /** + * transform the response data to the api data + * + * @deprecated use `transform` instead, will be removed in the next major version v3 + * @param response Axios response + */ + transformBackendResponse: ResponseTransform, ApiData>; + /** + * The hook before request + * + * For example: You can add header token in this hook + * + * @param config Axios config + */ + onRequest: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig | Promise; + /** + * The hook to check backend response is success or not + * + * @param response Axios response + */ + isBackendSuccess: (response: AxiosResponse) => boolean; + /** + * The hook after backend request fail + * + * For example: You can handle the expired token in this hook + * + * @param response Axios response + * @param instance Axios instance + */ + onBackendFail: ( + response: AxiosResponse, + instance: AxiosInstance + ) => Promise | Promise; + /** + * The hook to handle error + * + * For example: You can show error message in this hook + * + * @param error + */ + onError: (error: AxiosError) => void | Promise; +} + +interface ResponseMap { + blob: Blob; + text: string; + arrayBuffer: ArrayBuffer; + stream: ReadableStream; + document: Document; +} +export type ResponseType = keyof ResponseMap | 'json'; + +export type MappedType = R extends keyof ResponseMap + ? ResponseMap[R] + : JsonType; + +export type CustomAxiosRequestConfig = Omit & { + responseType?: R; +}; + +export interface RequestInstanceCommon> { + /** + * cancel all request + * + * if the request provide abort controller sign from config, it will not collect in the abort controller map + */ + cancelAllRequest: () => void; + /** you can set custom state in the request instance */ + state: State; +} + +/** The request instance */ +export interface RequestInstance> extends RequestInstanceCommon { + ( + config: CustomAxiosRequestConfig + ): Promise>; +} + +export type FlatResponseSuccessData = { + data: ApiData; + error: null; + response: AxiosResponse; +}; + +export type FlatResponseFailData = { + data: null; + error: AxiosError; + response: AxiosResponse; +}; + +export type FlatResponseData = + | FlatResponseSuccessData + | FlatResponseFailData; + +export interface FlatRequestInstance< + ResponseData, + ApiData, + State extends Record +> extends RequestInstanceCommon { + ( + config: CustomAxiosRequestConfig + ): Promise>>; +} diff --git a/packages/axios/tsconfig.json b/packages/axios/tsconfig.json new file mode 100644 index 0000000..5823ed5 --- /dev/null +++ b/packages/axios/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/color/package.json b/packages/color/package.json new file mode 100644 index 0000000..2668a42 --- /dev/null +++ b/packages/color/package.json @@ -0,0 +1,16 @@ +{ + "name": "@sa/color", + "version": "2.0.2", + "exports": { + ".": "./src/index.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + }, + "dependencies": { + "@sa/utils": "workspace:*", + "colord": "2.9.3" + } +} diff --git a/packages/color/src/constant/index.ts b/packages/color/src/constant/index.ts new file mode 100644 index 0000000..cefbcdb --- /dev/null +++ b/packages/color/src/constant/index.ts @@ -0,0 +1,2 @@ +export * from './name'; +export * from './palette'; diff --git a/packages/color/src/constant/name.ts b/packages/color/src/constant/name.ts new file mode 100644 index 0000000..36648c3 --- /dev/null +++ b/packages/color/src/constant/name.ts @@ -0,0 +1,1579 @@ +export const colorNames: [hex: string, name: string][] = [ + ['#000000', 'Black'], + ['#000080', 'Navy Blue'], + ['#0000c8', 'Dark Blue'], + ['#0000ff', 'Blue'], + ['#000741', 'Stratos'], + ['#001b1c', 'Swamp'], + ['#002387', 'Resolution Blue'], + ['#002900', 'Deep Fir'], + ['#002e20', 'Burnham'], + ['#002fa7', 'International Klein Blue'], + ['#003153', 'Prussian Blue'], + ['#003366', 'Midnight Blue'], + ['#003399', 'Smalt'], + ['#003532', 'Deep Teal'], + ['#003e40', 'Cyprus'], + ['#004620', 'Kaitoke Green'], + ['#0047ab', 'Cobalt'], + ['#004816', 'Crusoe'], + ['#004950', 'Sherpa Blue'], + ['#0056a7', 'Endeavour'], + ['#00581a', 'Camarone'], + ['#0066cc', 'Science Blue'], + ['#0066ff', 'Blue Ribbon'], + ['#00755e', 'Tropical Rain Forest'], + ['#0076a3', 'Allports'], + ['#007ba7', 'Deep Cerulean'], + ['#007ec7', 'Lochmara'], + ['#007fff', 'Azure Radiance'], + ['#008080', 'Teal'], + ['#0095b6', 'Bondi Blue'], + ['#009dc4', 'Pacific Blue'], + ['#00a693', 'Persian Green'], + ['#00a86b', 'Jade'], + ['#00cc99', 'Caribbean Green'], + ['#00cccc', "Robin's Egg Blue"], + ['#00ff00', 'Green'], + ['#00ff7f', 'Spring Green'], + ['#00ffff', 'Cyan Aqua'], + ['#010d1a', 'Blue Charcoal'], + ['#011635', 'Midnight'], + ['#011d13', 'Holly'], + ['#012731', 'Daintree'], + ['#01361c', 'Cardin Green'], + ['#01371a', 'County Green'], + ['#013e62', 'Astronaut Blue'], + ['#013f6a', 'Regal Blue'], + ['#014b43', 'Aqua Deep'], + ['#015e85', 'Orient'], + ['#016162', 'Blue Stone'], + ['#016d39', 'Fun Green'], + ['#01796f', 'Pine Green'], + ['#017987', 'Blue Lagoon'], + ['#01826b', 'Deep Sea'], + ['#01a368', 'Green Haze'], + ['#022d15', 'English Holly'], + ['#02402c', 'Sherwood Green'], + ['#02478e', 'Congress Blue'], + ['#024e46', 'Evening Sea'], + ['#026395', 'Bahama Blue'], + ['#02866f', 'Observatory'], + ['#02a4d3', 'Cerulean'], + ['#03163c', 'Tangaroa'], + ['#032b52', 'Green Vogue'], + ['#036a6e', 'Mosque'], + ['#041004', 'Midnight Moss'], + ['#041322', 'Black Pearl'], + ['#042e4c', 'Blue Whale'], + ['#044022', 'Zuccini'], + ['#044259', 'Teal Blue'], + ['#051040', 'Deep Cove'], + ['#051657', 'Gulf Blue'], + ['#055989', 'Venice Blue'], + ['#056f57', 'Watercourse'], + ['#062a78', 'Catalina Blue'], + ['#063537', 'Tiber'], + ['#069b81', 'Gossamer'], + ['#06a189', 'Niagara'], + ['#073a50', 'Tarawera'], + ['#080110', 'Jaguar'], + ['#081910', 'Black Bean'], + ['#082567', 'Deep Sapphire'], + ['#088370', 'Elf Green'], + ['#08e8de', 'Bright Turquoise'], + ['#092256', 'Downriver'], + ['#09230f', 'Palm Green'], + ['#09255d', 'Madison'], + ['#093624', 'Bottle Green'], + ['#095859', 'Deep Sea Green'], + ['#097f4b', 'Salem'], + ['#0a001c', 'Black Russian'], + ['#0a480d', 'Dark Fern'], + ['#0a6906', 'Japanese Laurel'], + ['#0a6f75', 'Atoll'], + ['#0b0b0b', 'Cod Gray'], + ['#0b0f08', 'Marshland'], + ['#0b1107', 'Gordons Green'], + ['#0b1304', 'Black Forest'], + ['#0b6207', 'San Felix'], + ['#0bda51', 'Malachite'], + ['#0c0b1d', 'Ebony'], + ['#0c0d0f', 'Woodsmoke'], + ['#0c1911', 'Racing Green'], + ['#0c7a79', 'Surfie Green'], + ['#0c8990', 'Blue Chill'], + ['#0d0332', 'Black Rock'], + ['#0d1117', 'Bunker'], + ['#0d1c19', 'Aztec'], + ['#0d2e1c', 'Bush'], + ['#0e0e18', 'Cinder'], + ['#0e2a30', 'Firefly'], + ['#0f2d9e', 'Torea Bay'], + ['#10121d', 'Vulcan'], + ['#101405', 'Green Waterloo'], + ['#105852', 'Eden'], + ['#110c6c', 'Arapawa'], + ['#120a8f', 'Ultramarine'], + ['#123447', 'Elephant'], + ['#126b40', 'Jewel'], + ['#130000', 'Diesel'], + ['#130a06', 'Asphalt'], + ['#13264d', 'Blue Zodiac'], + ['#134f19', 'Parsley'], + ['#140600', 'Nero'], + ['#1450aa', 'Tory Blue'], + ['#151f4c', 'Bunting'], + ['#1560bd', 'Denim'], + ['#15736b', 'Genoa'], + ['#161928', 'Mirage'], + ['#161d10', 'Hunter Green'], + ['#162a40', 'Big Stone'], + ['#163222', 'Celtic'], + ['#16322c', 'Timber Green'], + ['#163531', 'Gable Green'], + ['#171f04', 'Pine Tree'], + ['#175579', 'Chathams Blue'], + ['#182d09', 'Deep Forest Green'], + ['#18587a', 'Blumine'], + ['#19330e', 'Palm Leaf'], + ['#193751', 'Nile Blue'], + ['#1959a8', 'Fun Blue'], + ['#1a1a68', 'Lucky Point'], + ['#1ab385', 'Mountain Meadow'], + ['#1b0245', 'Tolopea'], + ['#1b1035', 'Haiti'], + ['#1b127b', 'Deep Koamaru'], + ['#1b1404', 'Acadia'], + ['#1b2f11', 'Seaweed'], + ['#1b3162', 'Biscay'], + ['#1b659d', 'Matisse'], + ['#1c1208', 'Crowshead'], + ['#1c1e13', 'Rangoon Green'], + ['#1c39bb', 'Persian Blue'], + ['#1c402e', 'Everglade'], + ['#1c7c7d', 'Elm'], + ['#1d6142', 'Green Pea'], + ['#1e0f04', 'Creole'], + ['#1e1609', 'Karaka'], + ['#1e1708', 'El Paso'], + ['#1e385b', 'Cello'], + ['#1e433c', 'Te Papa Green'], + ['#1e90ff', 'Dodger Blue'], + ['#1e9ab0', 'Eastern Blue'], + ['#1f120f', 'Night Rider'], + ['#1fc2c2', 'Java'], + ['#20208d', 'Jacksons Purple'], + ['#202e54', 'Cloud Burst'], + ['#204852', 'Blue Dianne'], + ['#211a0e', 'Eternity'], + ['#220878', 'Deep Blue'], + ['#228b22', 'Forest Green'], + ['#233418', 'Mallard'], + ['#240a40', 'Violet'], + ['#240c02', 'Kilamanjaro'], + ['#242a1d', 'Log Cabin'], + ['#242e16', 'Black Olive'], + ['#24500f', 'Green House'], + ['#251607', 'Graphite'], + ['#251706', 'Cannon Black'], + ['#251f4f', 'Port Gore'], + ['#25272c', 'Shark'], + ['#25311c', 'Green Kelp'], + ['#2596d1', 'Curious Blue'], + ['#260368', 'Paua'], + ['#26056a', 'Paris M'], + ['#261105', 'Wood Bark'], + ['#261414', 'Gondola'], + ['#262335', 'Steel Gray'], + ['#26283b', 'Ebony Clay'], + ['#273a81', 'Bay Of Many'], + ['#27504b', 'Plantation'], + ['#278a5b', 'Eucalyptus'], + ['#281e15', 'Oil'], + ['#283a77', 'Astronaut'], + ['#286acd', 'Mariner'], + ['#290c5e', 'Violent Violet'], + ['#292130', 'Bastille'], + ['#292319', 'Zeus'], + ['#292937', 'Charade'], + ['#297b9a', 'Jelly Bean'], + ['#29ab87', 'Jungle Green'], + ['#2a0359', 'Cherry Pie'], + ['#2a140e', 'Coffee Bean'], + ['#2a2630', 'Baltic Sea'], + ['#2a380b', 'Turtle Green'], + ['#2a52be', 'Cerulean Blue'], + ['#2b0202', 'Sepia Black'], + ['#2b194f', 'Valhalla'], + ['#2b3228', 'Heavy Metal'], + ['#2c0e8c', 'Blue Gem'], + ['#2c1632', 'Revolver'], + ['#2c2133', 'Bleached Cedar'], + ['#2c8c84', 'Lochinvar'], + ['#2d2510', 'Mikado'], + ['#2d383a', 'Outer Space'], + ['#2d569b', 'St Tropaz'], + ['#2e0329', 'Jacaranda'], + ['#2e1905', 'Jacko Bean'], + ['#2e3222', 'Rangitoto'], + ['#2e3f62', 'Rhino'], + ['#2e8b57', 'Sea Green'], + ['#2ebfd4', 'Scooter'], + ['#2f270e', 'Onion'], + ['#2f3cb3', 'Governor Bay'], + ['#2f519e', 'Sapphire'], + ['#2f5a57', 'Spectra'], + ['#2f6168', 'Casal'], + ['#300529', 'Melanzane'], + ['#301f1e', 'Cocoa Brown'], + ['#302a0f', 'Woodrush'], + ['#304b6a', 'San Juan'], + ['#30d5c8', 'Turquoise'], + ['#311c17', 'Eclipse'], + ['#314459', 'Pickled Bluewood'], + ['#315ba1', 'Azure'], + ['#31728d', 'Calypso'], + ['#317d82', 'Paradiso'], + ['#32127a', 'Persian Indigo'], + ['#32293a', 'Blackcurrant'], + ['#323232', 'Mine Shaft'], + ['#325d52', 'Stromboli'], + ['#327c14', 'Bilbao'], + ['#327da0', 'Astral'], + ['#33036b', 'Christalle'], + ['#33292f', 'Thunder'], + ['#33cc99', 'Shamrock'], + ['#341515', 'Tamarind'], + ['#350036', 'Mardi Gras'], + ['#350e42', 'Valentino'], + ['#350e57', 'Jagger'], + ['#353542', 'Tuna'], + ['#354e8c', 'Chambray'], + ['#363050', 'Martinique'], + ['#363534', 'Tuatara'], + ['#363c0d', 'Waiouru'], + ['#36747d', 'Ming'], + ['#368716', 'La Palma'], + ['#370202', 'Chocolate'], + ['#371d09', 'Clinker'], + ['#37290e', 'Brown Tumbleweed'], + ['#373021', 'Birch'], + ['#377475', 'Oracle'], + ['#380474', 'Blue Diamond'], + ['#381a51', 'Grape'], + ['#383533', 'Dune'], + ['#384555', 'Oxford Blue'], + ['#384910', 'Clover'], + ['#394851', 'Limed Spruce'], + ['#396413', 'Dell'], + ['#3a0020', 'Toledo'], + ['#3a2010', 'Sambuca'], + ['#3a2a6a', 'Jacarta'], + ['#3a686c', 'William'], + ['#3a6a47', 'Killarney'], + ['#3ab09e', 'Keppel'], + ['#3b000b', 'Temptress'], + ['#3b0910', 'Aubergine'], + ['#3b1f1f', 'Jon'], + ['#3b2820', 'Treehouse'], + ['#3b7a57', 'Amazon'], + ['#3b91b4', 'Boston Blue'], + ['#3c0878', 'Windsor'], + ['#3c1206', 'Rebel'], + ['#3c1f76', 'Meteorite'], + ['#3c2005', 'Dark Ebony'], + ['#3c3910', 'Camouflage'], + ['#3c4151', 'Bright Gray'], + ['#3c4443', 'Cape Cod'], + ['#3c493a', 'Lunar Green'], + ['#3d0c02', 'Bean '], + ['#3d2b1f', 'Bistre'], + ['#3d7d52', 'Goblin'], + ['#3e0480', 'Kingfisher Daisy'], + ['#3e1c14', 'Cedar'], + ['#3e2b23', 'English Walnut'], + ['#3e2c1c', 'Black Marlin'], + ['#3e3a44', 'Ship Gray'], + ['#3eabbf', 'Pelorous'], + ['#3f2109', 'Bronze'], + ['#3f2500', 'Cola'], + ['#3f3002', 'Madras'], + ['#3f307f', 'Minsk'], + ['#3f4c3a', 'Cabbage Pont'], + ['#3f583b', 'Tom Thumb'], + ['#3f5d53', 'Mineral Green'], + ['#3fc1aa', 'Puerto Rico'], + ['#3fff00', 'Harlequin'], + ['#401801', 'Brown Pod'], + ['#40291d', 'Cork'], + ['#403b38', 'Masala'], + ['#403d19', 'Thatch Green'], + ['#405169', 'Fiord'], + ['#40826d', 'Viridian'], + ['#40a860', 'Chateau Green'], + ['#410056', 'Ripe Plum'], + ['#411f10', 'Paco'], + ['#412010', 'Deep Oak'], + ['#413c37', 'Merlin'], + ['#414257', 'Gun Powder'], + ['#414c7d', 'East Bay'], + ['#4169e1', 'Royal Blue'], + ['#41aa78', 'Ocean Green'], + ['#420303', 'Burnt Maroon'], + ['#423921', 'Lisbon Brown'], + ['#427977', 'Faded Jade'], + ['#431560', 'Scarlet Gum'], + ['#433120', 'Iroko'], + ['#433e37', 'Armadillo'], + ['#434c59', 'River Bed'], + ['#436a0d', 'Green Leaf'], + ['#44012d', 'Barossa'], + ['#441d00', 'Morocco Brown'], + ['#444954', 'Mako'], + ['#454936', 'Kelp'], + ['#456cac', 'San Marino'], + ['#45b1e8', 'Picton Blue'], + ['#460b41', 'Loulou'], + ['#462425', 'Crater Brown'], + ['#465945', 'Gray Asparagus'], + ['#4682b4', 'Steel Blue'], + ['#480404', 'Rustic Red'], + ['#480607', 'Bulgarian Rose'], + ['#480656', 'Clairvoyant'], + ['#481c1c', 'Cocoa Bean'], + ['#483131', 'Woody Brown'], + ['#483c32', 'Taupe'], + ['#49170c', 'Van Cleef'], + ['#492615', 'Brown Derby'], + ['#49371b', 'Metallic Bronze'], + ['#495400', 'Verdun Green'], + ['#496679', 'Blue Bayoux'], + ['#497183', 'Bismark'], + ['#4a2a04', 'Bracken'], + ['#4a3004', 'Deep Bronze'], + ['#4a3c30', 'Mondo'], + ['#4a4244', 'Tundora'], + ['#4a444b', 'Gravel'], + ['#4a4e5a', 'Trout'], + ['#4b0082', 'Pigment Indigo'], + ['#4b5d52', 'Nandor'], + ['#4c3024', 'Saddle'], + ['#4c4f56', 'Abbey'], + ['#4d0135', 'Blackberry'], + ['#4d0a18', 'Cab Sav'], + ['#4d1e01', 'Indian Tan'], + ['#4d282d', 'Cowboy'], + ['#4d282e', 'Livid Brown'], + ['#4d3833', 'Rock'], + ['#4d3d14', 'Punga'], + ['#4d400f', 'Bronzetone'], + ['#4d5328', 'Woodland'], + ['#4e0606', 'Mahogany'], + ['#4e2a5a', 'Bossanova'], + ['#4e3b41', 'Matterhorn'], + ['#4e420c', 'Bronze Olive'], + ['#4e4562', 'Mulled Wine'], + ['#4e6649', 'Axolotl'], + ['#4e7f9e', 'Wedgewood'], + ['#4eabd1', 'Shakespeare'], + ['#4f1c70', 'Honey Flower'], + ['#4f2398', 'Daisy Bush'], + ['#4f69c6', 'Indigo'], + ['#4f7942', 'Fern Green'], + ['#4f9d5d', 'Fruit Salad'], + ['#4fa83d', 'Apple'], + ['#504351', 'Mortar'], + ['#507096', 'Kashmir Blue'], + ['#507672', 'Cutty Sark'], + ['#50c878', 'Emerald'], + ['#514649', 'Emperor'], + ['#516e3d', 'Chalet Green'], + ['#517c66', 'Como'], + ['#51808f', 'Smalt Blue'], + ['#52001f', 'Castro'], + ['#520c17', 'Maroon Oak'], + ['#523c94', 'Gigas'], + ['#533455', 'Voodoo'], + ['#534491', 'Victoria'], + ['#53824b', 'Hippie Green'], + ['#541012', 'Heath'], + ['#544333', 'Judge Gray'], + ['#54534d', 'Fuscous Gray'], + ['#549019', 'Vida Loca'], + ['#55280c', 'Cioccolato'], + ['#555b10', 'Saratoga'], + ['#556d56', 'Finlandia'], + ['#5590d9', 'Havelock Blue'], + ['#56b4be', 'Fountain Blue'], + ['#578363', 'Spring Leaves'], + ['#583401', 'Saddle Brown'], + ['#585562', 'Scarpa Flow'], + ['#587156', 'Cactus'], + ['#589aaf', 'Hippie Blue'], + ['#591d35', 'Wine Berry'], + ['#592804', 'Brown Bramble'], + ['#593737', 'Congo Brown'], + ['#594433', 'Millbrook'], + ['#5a6e9c', 'Waikawa Gray'], + ['#5a87a0', 'Horizon'], + ['#5b3013', 'Jambalaya'], + ['#5c0120', 'Bordeaux'], + ['#5c0536', 'Mulberry Wood'], + ['#5c2e01', 'Carnaby Tan'], + ['#5c5d75', 'Comet'], + ['#5d1e0f', 'Redwood'], + ['#5d4c51', 'Don Juan'], + ['#5d5c58', 'Chicago'], + ['#5d5e37', 'Verdigris'], + ['#5d7747', 'Dingley'], + ['#5da19f', 'Breaker Bay'], + ['#5e483e', 'Kabul'], + ['#5e5d3b', 'Hemlock'], + ['#5f3d26', 'Irish Coffee'], + ['#5f5f6e', 'Mid Gray'], + ['#5f6672', 'Shuttle Gray'], + ['#5fa777', 'Aqua Forest'], + ['#5fb3ac', 'Tradewind'], + ['#604913', 'Horses Neck'], + ['#605b73', 'Smoky'], + ['#606e68', 'Corduroy'], + ['#6093d1', 'Danube'], + ['#612718', 'Espresso'], + ['#614051', 'Eggplant'], + ['#615d30', 'Costa Del Sol'], + ['#61845f', 'Glade Green'], + ['#622f30', 'Buccaneer'], + ['#623f2d', 'Quincy'], + ['#624e9a', 'Butterfly Bush'], + ['#625119', 'West Coast'], + ['#626649', 'Finch'], + ['#639a8f', 'Patina'], + ['#63b76c', 'Fern'], + ['#6456b7', 'Blue Violet'], + ['#646077', 'Dolphin'], + ['#646463', 'Storm Dust'], + ['#646a54', 'Siam'], + ['#646e75', 'Nevada'], + ['#6495ed', 'Cornflower Blue'], + ['#64ccdb', 'Viking'], + ['#65000b', 'Rosewood'], + ['#651a14', 'Cherrywood'], + ['#652dc1', 'Purple Heart'], + ['#657220', 'Fern Frond'], + ['#65745d', 'Willow Grove'], + ['#65869f', 'Hoki'], + ['#660045', 'Pompadour'], + ['#660099', 'Purple'], + ['#66023c', 'Tyrian Purple'], + ['#661010', 'Dark Tan'], + ['#66b58f', 'Silver Tree'], + ['#66ff00', 'Bright Green'], + ['#66ff66', 'Screamin Green'], + ['#67032d', 'Black Rose'], + ['#675fa6', 'Scampi'], + ['#676662', 'Ironside Gray'], + ['#678975', 'Viridian Green'], + ['#67a712', 'Christi'], + ['#683600', 'Nutmeg Wood Finish'], + ['#685558', 'Zambezi'], + ['#685e6e', 'Salt Box'], + ['#692545', 'Tawny Port'], + ['#692d54', 'Finn'], + ['#695f62', 'Scorpion'], + ['#697e9a', 'Lynch'], + ['#6a442e', 'Spice'], + ['#6a5d1b', 'Himalaya'], + ['#6a6051', 'Soya Bean'], + ['#6b2a14', 'Hairy Heath'], + ['#6b3fa0', 'Royal Purple'], + ['#6b4e31', 'Shingle Fawn'], + ['#6b5755', 'Dorado'], + ['#6b8ba2', 'Bermuda Gray'], + ['#6b8e23', 'Olive Drab'], + ['#6c3082', 'Eminence'], + ['#6cdae7', 'Turquoise Blue'], + ['#6d0101', 'Lonestar'], + ['#6d5e54', 'Pine Cone'], + ['#6d6c6c', 'Dove Gray'], + ['#6d9292', 'Juniper'], + ['#6d92a1', 'Gothic'], + ['#6e0902', 'Red Oxide'], + ['#6e1d14', 'Moccaccino'], + ['#6e4826', 'Pickled Bean'], + ['#6e4b26', 'Dallas'], + ['#6e6d57', 'Kokoda'], + ['#6e7783', 'Pale Sky'], + ['#6f440c', 'Cafe Royale'], + ['#6f6a61', 'Flint'], + ['#6f8e63', 'Highland'], + ['#6f9d02', 'Limeade'], + ['#6fd0c5', 'Downy'], + ['#701c1c', 'Persian Plum'], + ['#704214', 'Sepia'], + ['#704a07', 'Antique Bronze'], + ['#704f50', 'Ferra'], + ['#706555', 'Coffee'], + ['#708090', 'Slate Gray'], + ['#711a00', 'Cedar Wood Finish'], + ['#71291d', 'Metallic Copper'], + ['#714693', 'Affair'], + ['#714ab2', 'Studio'], + ['#715d47', 'Tobacco Brown'], + ['#716338', 'Yellow Metal'], + ['#716b56', 'Peat'], + ['#716e10', 'Olivetone'], + ['#717486', 'Storm Gray'], + ['#718080', 'Sirocco'], + ['#71d9e2', 'Aquamarine Blue'], + ['#72010f', 'Venetian Red'], + ['#724a2f', 'Old Copper'], + ['#726d4e', 'Go Ben'], + ['#727b89', 'Raven'], + ['#731e8f', 'Seance'], + ['#734a12', 'Raw Umber'], + ['#736c9f', 'Kimberly'], + ['#736d58', 'Crocodile'], + ['#737829', 'Crete'], + ['#738678', 'Xanadu'], + ['#74640d', 'Spicy Mustard'], + ['#747d63', 'Limed Ash'], + ['#747d83', 'Rolling Stone'], + ['#748881', 'Blue Smoke'], + ['#749378', 'Laurel'], + ['#74c365', 'Mantis'], + ['#755a57', 'Russett'], + ['#7563a8', 'Deluge'], + ['#76395d', 'Cosmic'], + ['#7666c6', 'Blue Marguerite'], + ['#76bd17', 'Lima'], + ['#76d7ea', 'Sky Blue'], + ['#770f05', 'Dark Burgundy'], + ['#771f1f', 'Crown Of Thorns'], + ['#773f1a', 'Walnut'], + ['#776f61', 'Pablo'], + ['#778120', 'Pacifika'], + ['#779e86', 'Oxley'], + ['#77dd77', 'Pastel Green'], + ['#780109', 'Japanese Maple'], + ['#782d19', 'Mocha'], + ['#782f16', 'Peanut'], + ['#78866b', 'Camouflage Green'], + ['#788a25', 'Wasabi'], + ['#788bba', 'Ship Cove'], + ['#78a39c', 'Sea Nymph'], + ['#795d4c', 'Roman Coffee'], + ['#796878', 'Old Lavender'], + ['#796989', 'Rum'], + ['#796a78', 'Fedora'], + ['#796d62', 'Sandstone'], + ['#79deec', 'Spray'], + ['#7a013a', 'Siren'], + ['#7a58c1', 'Fuchsia Blue'], + ['#7a7a7a', 'Boulder'], + ['#7a89b8', 'Wild Blue Yonder'], + ['#7ac488', 'De York'], + ['#7b3801', 'Red Beech'], + ['#7b3f00', 'Cinnamon'], + ['#7b6608', 'Yukon Gold'], + ['#7b7874', 'Tapa'], + ['#7b7c94', 'Waterloo '], + ['#7b8265', 'Flax Smoke'], + ['#7b9f80', 'Amulet'], + ['#7ba05b', 'Asparagus'], + ['#7c1c05', 'Kenyan Copper'], + ['#7c7631', 'Pesto'], + ['#7c778a', 'Topaz'], + ['#7c7b7a', 'Concord'], + ['#7c7b82', 'Jumbo'], + ['#7c881a', 'Trendy Green'], + ['#7ca1a6', 'Gumbo'], + ['#7cb0a1', 'Acapulco'], + ['#7cb7bb', 'Neptune'], + ['#7d2c14', 'Pueblo'], + ['#7da98d', 'Bay Leaf'], + ['#7dc8f7', 'Malibu'], + ['#7dd8c6', 'Bermuda'], + ['#7e3a15', 'Copper Canyon'], + ['#7f1734', 'Claret'], + ['#7f3a02', 'Peru Tan'], + ['#7f626d', 'Falcon'], + ['#7f7589', 'Mobster'], + ['#7f76d3', 'Moody Blue'], + ['#7fff00', 'Chartreuse'], + ['#7fffd4', 'Aquamarine'], + ['#800000', 'Maroon'], + ['#800b47', 'Rose Bud Cherry'], + ['#801818', 'Falu Red'], + ['#80341f', 'Red Robin'], + ['#803790', 'Vivid Violet'], + ['#80461b', 'Russet'], + ['#807e79', 'Friar Gray'], + ['#808000', 'Olive'], + ['#808080', 'Gray'], + ['#80b3ae', 'Gulf Stream'], + ['#80b3c4', 'Glacier'], + ['#80ccea', 'Seagull'], + ['#81422c', 'Nutmeg'], + ['#816e71', 'Spicy Pink'], + ['#817377', 'Empress'], + ['#819885', 'Spanish Green'], + ['#826f65', 'Sand Dune'], + ['#828685', 'Gunsmoke'], + ['#828f72', 'Battleship Gray'], + ['#831923', 'Merlot'], + ['#837050', 'Shadow'], + ['#83aa5d', 'Chelsea Cucumber'], + ['#83d0c6', 'Monte Carlo'], + ['#843179', 'Plum'], + ['#84a0a0', 'Granny Smith'], + ['#8581d9', 'Chetwode Blue'], + ['#858470', 'Bandicoot'], + ['#859faf', 'Bali Hai'], + ['#85c4cc', 'Half Baked'], + ['#860111', 'Red Devil'], + ['#863c3c', 'Lotus'], + ['#86483c', 'Ironstone'], + ['#864d1e', 'Bull Shot'], + ['#86560a', 'Rusty Nail'], + ['#868974', 'Bitter'], + ['#86949f', 'Regent Gray'], + ['#871550', 'Disco'], + ['#87756e', 'Americano'], + ['#877c7b', 'Hurricane'], + ['#878d91', 'Oslo Gray'], + ['#87ab39', 'Sushi'], + ['#885342', 'Spicy Mix'], + ['#886221', 'Kumera'], + ['#888387', 'Suva Gray'], + ['#888d65', 'Avocado'], + ['#893456', 'Camelot'], + ['#893843', 'Solid Pink'], + ['#894367', 'Cannon Pink'], + ['#897d6d', 'Makara'], + ['#8a3324', 'Burnt Umber'], + ['#8a73d6', 'True V'], + ['#8a8360', 'Clay Creek'], + ['#8a8389', 'Monsoon'], + ['#8a8f8a', 'Stack'], + ['#8ab9f1', 'Jordy Blue'], + ['#8b00ff', 'Electric Violet'], + ['#8b0723', 'Monarch'], + ['#8b6b0b', 'Corn Harvest'], + ['#8b8470', 'Olive Haze'], + ['#8b847e', 'Schooner'], + ['#8b8680', 'Natural Gray'], + ['#8b9c90', 'Mantle'], + ['#8b9fee', 'Portage'], + ['#8ba690', 'Envy'], + ['#8ba9a5', 'Cascade'], + ['#8be6d8', 'Riptide'], + ['#8c055e', 'Cardinal Pink'], + ['#8c472f', 'Mule Fawn'], + ['#8c5738', 'Potters Clay'], + ['#8c6495', 'Trendy Pink'], + ['#8d0226', 'Paprika'], + ['#8d3d38', 'Sanguine Brown'], + ['#8d3f3f', 'Tosca'], + ['#8d7662', 'Cement'], + ['#8d8974', 'Granite Green'], + ['#8d90a1', 'Manatee'], + ['#8da8cc', 'Polo Blue'], + ['#8e0000', 'Red Berry'], + ['#8e4d1e', 'Rope'], + ['#8e6f70', 'Opium'], + ['#8e775e', 'Domino'], + ['#8e8190', 'Mamba'], + ['#8eabc1', 'Nepal'], + ['#8f021c', 'Pohutukawa'], + ['#8f3e33', 'El Salva'], + ['#8f4b0e', 'Korma'], + ['#8f8176', 'Squirrel'], + ['#8fd6b4', 'Vista Blue'], + ['#900020', 'Burgundy'], + ['#901e1e', 'Old Brick'], + ['#907874', 'Hemp'], + ['#907b71', 'Almond Frost'], + ['#908d39', 'Sycamore'], + ['#92000a', 'Sangria'], + ['#924321', 'Cumin'], + ['#926f5b', 'Beaver'], + ['#928573', 'Stonewall'], + ['#928590', 'Venus'], + ['#9370db', 'Medium Purple'], + ['#93ccea', 'Cornflower'], + ['#93dfb8', 'Algae Green'], + ['#944747', 'Copper Rust'], + ['#948771', 'Arrowtown'], + ['#950015', 'Scarlett'], + ['#956387', 'Strikemaster'], + ['#959396', 'Mountain Mist'], + ['#960018', 'Carmine'], + ['#964b00', 'Brown'], + ['#967059', 'Leather'], + ['#9678b6', "Purple Mountain's Majesty"], + ['#967bb6', 'Lavender Purple'], + ['#96a8a1', 'Pewter'], + ['#96bbab', 'Summer Green'], + ['#97605d', 'Au Chico'], + ['#9771b5', 'Wisteria'], + ['#97cd2d', 'Atlantis'], + ['#983d61', 'Vin Rouge'], + ['#9874d3', 'Lilac Bush'], + ['#98777b', 'Bazaar'], + ['#98811b', 'Hacienda'], + ['#988d77', 'Pale Oyster'], + ['#98ff98', 'Mint Green'], + ['#990066', 'Fresh Eggplant'], + ['#991199', 'Violet Eggplant'], + ['#991613', 'Tamarillo'], + ['#991b07', 'Totem Pole'], + ['#996666', 'Copper Rose'], + ['#9966cc', 'Amethyst'], + ['#997a8d', 'Mountbatten Pink'], + ['#9999cc', 'Blue Bell'], + ['#9a3820', 'Prairie Sand'], + ['#9a6e61', 'Toast'], + ['#9a9577', 'Gurkha'], + ['#9ab973', 'Olivine'], + ['#9ac2b8', 'Shadow Green'], + ['#9b4703', 'Oregon'], + ['#9b9e8f', 'Lemon Grass'], + ['#9c3336', 'Stiletto'], + ['#9d5616', 'Hawaiian Tan'], + ['#9dacb7', 'Gull Gray'], + ['#9dc209', 'Pistachio'], + ['#9de093', 'Granny Smith Apple'], + ['#9de5ff', 'Anakiwa'], + ['#9e5302', 'Chelsea Gem'], + ['#9e5b40', 'Sepia Skin'], + ['#9ea587', 'Sage'], + ['#9ea91f', 'Citron'], + ['#9eb1cd', 'Rock Blue'], + ['#9edee0', 'Morning Glory'], + ['#9f381d', 'Cognac'], + ['#9f821c', 'Reef Gold'], + ['#9f9f9c', 'Star Dust'], + ['#9fa0b1', 'Santas Gray'], + ['#9fd7d3', 'Sinbad'], + ['#9fdd8c', 'Feijoa'], + ['#a02712', 'Tabasco'], + ['#a1750d', 'Buttered Rum'], + ['#a1adb5', 'Hit Gray'], + ['#a1c50a', 'Citrus'], + ['#a1dad7', 'Aqua Island'], + ['#a1e9de', 'Water Leaf'], + ['#a2006d', 'Flirt'], + ['#a23b6c', 'Rouge'], + ['#a26645', 'Cape Palliser'], + ['#a2aab3', 'Gray Chateau'], + ['#a2aeab', 'Edward'], + ['#a3807b', 'Pharlap'], + ['#a397b4', 'Amethyst Smoke'], + ['#a3e3ed', 'Blizzard Blue'], + ['#a4a49d', 'Delta'], + ['#a4a6d3', 'Wistful'], + ['#a4af6e', 'Green Smoke'], + ['#a50b5e', 'Jazzberry Jam'], + ['#a59b91', 'Zorba'], + ['#a5cb0c', 'Bahia'], + ['#a62f20', 'Roof Terracotta'], + ['#a65529', 'Paarl'], + ['#a68b5b', 'Barley Corn'], + ['#a69279', 'Donkey Brown'], + ['#a6a29a', 'Dawn'], + ['#a72525', 'Mexican Red'], + ['#a7882c', 'Luxor Gold'], + ['#a85307', 'Rich Gold'], + ['#a86515', 'Reno Sand'], + ['#a86b6b', 'Coral Tree'], + ['#a8989b', 'Dusty Gray'], + ['#a899e6', 'Dull Lavender'], + ['#a8a589', 'Tallow'], + ['#a8ae9c', 'Bud'], + ['#a8af8e', 'Locust'], + ['#a8bd9f', 'Norway'], + ['#a8e3bd', 'Chinook'], + ['#a9a491', 'Gray Olive'], + ['#a9acb6', 'Aluminium'], + ['#a9b2c3', 'Cadet Blue'], + ['#a9b497', 'Schist'], + ['#a9bdbf', 'Tower Gray'], + ['#a9bef2', 'Perano'], + ['#a9c6c2', 'Opal'], + ['#aa375a', 'Night Shadz'], + ['#aa4203', 'Fire'], + ['#aa8b5b', 'Muesli'], + ['#aa8d6f', 'Sandal'], + ['#aaa5a9', 'Shady Lady'], + ['#aaa9cd', 'Logan'], + ['#aaabb7', 'Spun Pearl'], + ['#aad6e6', 'Regent St Blue'], + ['#aaf0d1', 'Magic Mint'], + ['#ab0563', 'Lipstick'], + ['#ab3472', 'Royal Heath'], + ['#ab917a', 'Sandrift'], + ['#aba0d9', 'Cold Purple'], + ['#aba196', 'Bronco'], + ['#ac8a56', 'Limed Oak'], + ['#ac91ce', 'East Side'], + ['#ac9e22', 'Lemon Ginger'], + ['#aca494', 'Napa'], + ['#aca586', 'Hillary'], + ['#aca59f', 'Cloudy'], + ['#acacac', 'Silver Chalice'], + ['#acb78e', 'Swamp Green'], + ['#accbb1', 'Spring Rain'], + ['#acdd4d', 'Conifer'], + ['#ace1af', 'Celadon'], + ['#ad781b', 'Mandalay'], + ['#adbed1', 'Casper'], + ['#addfad', 'Moss Green'], + ['#ade6c4', 'Padua'], + ['#adff2f', 'Green Yellow'], + ['#ae4560', 'Hippie Pink'], + ['#ae6020', 'Desert'], + ['#ae809e', 'Bouquet'], + ['#af4035', 'Medium Carmine'], + ['#af4d43', 'Apple Blossom'], + ['#af593e', 'Brown Rust'], + ['#af8751', 'Driftwood'], + ['#af8f2c', 'Alpine'], + ['#af9f1c', 'Lucky'], + ['#afa09e', 'Martini'], + ['#afb1b8', 'Bombay'], + ['#afbdd9', 'Pigeon Post'], + ['#b04c6a', 'Cadillac'], + ['#b05d54', 'Matrix'], + ['#b05e81', 'Tapestry'], + ['#b06608', 'Mai Tai'], + ['#b09a95', 'Del Rio'], + ['#b0e0e6', 'Powder Blue'], + ['#b0e313', 'Inch Worm'], + ['#b10000', 'Bright Red'], + ['#b14a0b', 'Vesuvius'], + ['#b1610b', 'Pumpkin Skin'], + ['#b16d52', 'Santa Fe'], + ['#b19461', 'Teak'], + ['#b1e2c1', 'Fringy Flower'], + ['#b1f4e7', 'Ice Cold'], + ['#b20931', 'Shiraz'], + ['#b2a1ea', 'Biloba Flower'], + ['#b32d29', 'Tall Poppy'], + ['#b35213', 'Fiery Orange'], + ['#b38007', 'Hot Toddy'], + ['#b3af95', 'Taupe Gray'], + ['#b3c110', 'La Rioja'], + ['#b43332', 'Well Read'], + ['#b44668', 'Blush'], + ['#b4cfd3', 'Jungle Mist'], + ['#b57281', 'Turkish Rose'], + ['#b57edc', 'Lavender'], + ['#b5a27f', 'Mongoose'], + ['#b5b35c', 'Olive Green'], + ['#b5d2ce', 'Jet Stream'], + ['#b5ecdf', 'Cruise'], + ['#b6316c', 'Hibiscus'], + ['#b69d98', 'Thatch'], + ['#b6b095', 'Heathered Gray'], + ['#b6baa4', 'Eagle'], + ['#b6d1ea', 'Spindle'], + ['#b6d3bf', 'Gum Leaf'], + ['#b7410e', 'Rust'], + ['#b78e5c', 'Muddy Waters'], + ['#b7a214', 'Sahara'], + ['#b7a458', 'Husk'], + ['#b7b1b1', 'Nobel'], + ['#b7c3d0', 'Heather'], + ['#b7f0be', 'Madang'], + ['#b81104', 'Milano Red'], + ['#b87333', 'Copper'], + ['#b8b56a', 'Gimblet'], + ['#b8c1b1', 'Green Spring'], + ['#b8c25d', 'Celery'], + ['#b8e0f9', 'Sail'], + ['#b94e48', 'Chestnut'], + ['#b95140', 'Crail'], + ['#b98d28', 'Marigold'], + ['#b9c46a', 'Wild Willow'], + ['#b9c8ac', 'Rainee'], + ['#ba0101', 'Guardsman Red'], + ['#ba450c', 'Rock Spray'], + ['#ba6f1e', 'Bourbon'], + ['#ba7f03', 'Pirate Gold'], + ['#bab1a2', 'Nomad'], + ['#bac7c9', 'Submarine'], + ['#baeef9', 'Charlotte'], + ['#bb3385', 'Medium Red Violet'], + ['#bb8983', 'Brandy Rose'], + ['#bbd009', 'Rio Grande'], + ['#bbd7c1', 'Surf'], + ['#bcc9c2', 'Powder Ash'], + ['#bd5e2e', 'Tuscany'], + ['#bd978e', 'Quicksand'], + ['#bdb1a8', 'Silk'], + ['#bdb2a1', 'Malta'], + ['#bdb3c7', 'Chatelle'], + ['#bdbbd7', 'Lavender Gray'], + ['#bdbdc6', 'French Gray'], + ['#bdc8b3', 'Clay Ash'], + ['#bdc9ce', 'Loblolly'], + ['#bdedfd', 'French Pass'], + ['#bea6c3', 'London Hue'], + ['#beb5b7', 'Pink Swan'], + ['#bede0d', 'Fuego'], + ['#bf5500', 'Rose Of Sharon'], + ['#bfb8b0', 'Tide'], + ['#bfbed8', 'Blue Haze'], + ['#bfc1c2', 'Silver Sand'], + ['#bfc921', 'Key Lime Pie'], + ['#bfdbe2', 'Ziggurat'], + ['#bfff00', 'Lime'], + ['#c02b18', 'Thunderbird'], + ['#c04737', 'Mojo'], + ['#c08081', 'Old Rose'], + ['#c0c0c0', 'Silver'], + ['#c0d3b9', 'Pale Leaf'], + ['#c0d8b6', 'Pixie Green'], + ['#c1440e', 'Tia Maria'], + ['#c154c1', 'Fuchsia Pink'], + ['#c1a004', 'Buddha Gold'], + ['#c1b7a4', 'Bison Hide'], + ['#c1bab0', 'Tea'], + ['#c1becd', 'Gray Suit'], + ['#c1d7b0', 'Sprout'], + ['#c1f07c', 'Sulu'], + ['#c26b03', 'Indochine'], + ['#c2955d', 'Twine'], + ['#c2bdb6', 'Cotton Seed'], + ['#c2cac4', 'Pumice'], + ['#c2e8e5', 'Jagged Ice'], + ['#c32148', 'Maroon Flush'], + ['#c3b091', 'Indian Khaki'], + ['#c3bfc1', 'Pale Slate'], + ['#c3c3bd', 'Gray Nickel'], + ['#c3cde6', 'Periwinkle Gray'], + ['#c3d1d1', 'Tiara'], + ['#c3ddf9', 'Tropical Blue'], + ['#c41e3a', 'Cardinal'], + ['#c45655', 'Fuzzy Wuzzy Brown'], + ['#c45719', 'Orange Roughy'], + ['#c4c4bc', 'Mist Gray'], + ['#c4d0b0', 'Coriander'], + ['#c4f4eb', 'Mint Tulip'], + ['#c54b8c', 'Mulberry'], + ['#c59922', 'Nugget'], + ['#c5994b', 'Tussock'], + ['#c5dbca', 'Sea Mist'], + ['#c5e17a', 'Yellow Green'], + ['#c62d42', 'Brick Red'], + ['#c6726b', 'Contessa'], + ['#c69191', 'Oriental Pink'], + ['#c6a84b', 'Roti'], + ['#c6c3b5', 'Ash'], + ['#c6c8bd', 'Kangaroo'], + ['#c6e610', 'Las Palmas'], + ['#c7031e', 'Monza'], + ['#c71585', 'Red Violet'], + ['#c7bca2', 'Coral Reef'], + ['#c7c1ff', 'Melrose'], + ['#c7c4bf', 'Cloud'], + ['#c7c9d5', 'Ghost'], + ['#c7cd90', 'Pine Glade'], + ['#c7dde5', 'Botticelli'], + ['#c88a65', 'Antique Brass'], + ['#c8a2c8', 'Lilac'], + ['#c8a528', 'Hokey Pokey'], + ['#c8aabf', 'Lily'], + ['#c8b568', 'Laser'], + ['#c8e3d7', 'Edgewater'], + ['#c96323', 'Piper'], + ['#c99415', 'Pizza'], + ['#c9a0dc', 'Light Wisteria'], + ['#c9b29b', 'Rodeo Dust'], + ['#c9b35b', 'Sundance'], + ['#c9b93b', 'Earls Green'], + ['#c9c0bb', 'Silver Rust'], + ['#c9d9d2', 'Conch'], + ['#c9ffa2', 'Reef'], + ['#c9ffe5', 'Aero Blue'], + ['#ca3435', 'Flush Mahogany'], + ['#cabb48', 'Turmeric'], + ['#cadcd4', 'Paris White'], + ['#cae00d', 'Bitter Lemon'], + ['#cae6da', 'Skeptic'], + ['#cb8fa9', 'Viola'], + ['#cbcab6', 'Foggy Gray'], + ['#cbd3b0', 'Green Mist'], + ['#cbdbd6', 'Nebula'], + ['#cc3333', 'Persian Red'], + ['#cc5500', 'Burnt Orange'], + ['#cc7722', 'Ochre'], + ['#cc8899', 'Puce'], + ['#cccaa8', 'Thistle Green'], + ['#ccccff', 'Periwinkle'], + ['#ccff00', 'Electric Lime'], + ['#cd5700', 'Tenn'], + ['#cd5c5c', 'Chestnut Rose'], + ['#cd8429', 'Brandy Punch'], + ['#cdf4ff', 'Onahau'], + ['#ceb98f', 'Sorrell Brown'], + ['#cebaba', 'Cold Turkey'], + ['#cec291', 'Yuma'], + ['#cec7a7', 'Chino'], + ['#cfa39d', 'Eunry'], + ['#cfb53b', 'Old Gold'], + ['#cfdccf', 'Tasman'], + ['#cfe5d2', 'Surf Crest'], + ['#cff9f3', 'Humming Bird'], + ['#cffaf4', 'Scandal'], + ['#d05f04', 'Red Stage'], + ['#d06da1', 'Hopbush'], + ['#d07d12', 'Meteor'], + ['#d0bef8', 'Perfume'], + ['#d0c0e5', 'Prelude'], + ['#d0f0c0', 'Tea Green'], + ['#d18f1b', 'Geebung'], + ['#d1bea8', 'Vanilla'], + ['#d1c6b4', 'Soft Amber'], + ['#d1d2ca', 'Celeste'], + ['#d1d2dd', 'Mischka'], + ['#d1e231', 'Pear'], + ['#d2691e', 'Hot Cinnamon'], + ['#d27d46', 'Raw Sienna'], + ['#d29eaa', 'Careys Pink'], + ['#d2b48c', 'Tan'], + ['#d2da97', 'Deco'], + ['#d2f6de', 'Blue Romance'], + ['#d2f8b0', 'Gossip'], + ['#d3cbba', 'Sisal'], + ['#d3cdc5', 'Swirl'], + ['#d47494', 'Charm'], + ['#d4b6af', 'Clam Shell'], + ['#d4bf8d', 'Straw'], + ['#d4c4a8', 'Akaroa'], + ['#d4cd16', 'Bird Flower'], + ['#d4d7d9', 'Iron'], + ['#d4dfe2', 'Geyser'], + ['#d4e2fc', 'Hawkes Blue'], + ['#d54600', 'Grenadier'], + ['#d591a4', 'Can Can'], + ['#d59a6f', 'Whiskey'], + ['#d5d195', 'Winter Hazel'], + ['#d5f6e3', 'Granny Apple'], + ['#d69188', 'My Pink'], + ['#d6c562', 'Tacha'], + ['#d6cef6', 'Moon Raker'], + ['#d6d6d1', 'Quill Gray'], + ['#d6ffdb', 'Snowy Mint'], + ['#d7837f', 'New York Pink'], + ['#d7c498', 'Pavlova'], + ['#d7d0ff', 'Fog'], + ['#d84437', 'Valencia'], + ['#d87c63', 'Japonica'], + ['#d8bfd8', 'Thistle'], + ['#d8c2d5', 'Maverick'], + ['#d8fcfa', 'Foam'], + ['#d94972', 'Cabaret'], + ['#d99376', 'Burning Sand'], + ['#d9b99b', 'Cameo'], + ['#d9d6cf', 'Timberwolf'], + ['#d9dcc1', 'Tana'], + ['#d9e4f5', 'Link Water'], + ['#d9f7ff', 'Mabel'], + ['#da3287', 'Cerise'], + ['#da5b38', 'Flame Pea'], + ['#da6304', 'Bamboo'], + ['#da6a41', 'Red Damask'], + ['#da70d6', 'Orchid'], + ['#da8a67', 'Copperfield'], + ['#daa520', 'Golden Grass'], + ['#daecd6', 'Zanah'], + ['#daf4f0', 'Iceberg'], + ['#dafaff', 'Oyster Bay'], + ['#db5079', 'Cranberry'], + ['#db9690', 'Petite Orchid'], + ['#db995e', 'Di Serria'], + ['#dbdbdb', 'Alto'], + ['#dbfff8', 'Frosted Mint'], + ['#dc143c', 'Crimson'], + ['#dc4333', 'Punch'], + ['#dcb20c', 'Galliano'], + ['#dcb4bc', 'Blossom'], + ['#dcd747', 'Wattle'], + ['#dcd9d2', 'Westar'], + ['#dcddcc', 'Moon Mist'], + ['#dcedb4', 'Caper'], + ['#dcf0ea', 'Swans Down'], + ['#ddd6d5', 'Swiss Coffee'], + ['#ddf9f1', 'White Ice'], + ['#de3163', 'Cerise Red'], + ['#de6360', 'Roman'], + ['#dea681', 'Tumbleweed'], + ['#deba13', 'Gold Tips'], + ['#dec196', 'Brandy'], + ['#decbc6', 'Wafer'], + ['#ded4a4', 'Sapling'], + ['#ded717', 'Barberry'], + ['#dee5c0', 'Beryl Green'], + ['#def5ff', 'Pattens Blue'], + ['#df73ff', 'Heliotrope'], + ['#dfbe6f', 'Apache'], + ['#dfcd6f', 'Chenin'], + ['#dfcfdb', 'Lola'], + ['#dfecda', 'Willow Brook'], + ['#dfff00', 'Chartreuse Yellow'], + ['#e0b0ff', 'Mauve'], + ['#e0b646', 'Anzac'], + ['#e0b974', 'Harvest Gold'], + ['#e0c095', 'Calico'], + ['#e0ffff', 'Baby Blue'], + ['#e16865', 'Sunglo'], + ['#e1bc64', 'Equator'], + ['#e1c0c8', 'Pink Flare'], + ['#e1e6d6', 'Periglacial Blue'], + ['#e1ead4', 'Kidnapper'], + ['#e1f6e8', 'Tara'], + ['#e25465', 'Mandy'], + ['#e2725b', 'Terracotta'], + ['#e28913', 'Golden Bell'], + ['#e292c0', 'Shocking'], + ['#e29418', 'Dixie'], + ['#e29cd2', 'Light Orchid'], + ['#e2d8ed', 'Snuff'], + ['#e2ebed', 'Mystic'], + ['#e2f3ec', 'Apple Green'], + ['#e30b5c', 'Razzmatazz'], + ['#e32636', 'Alizarin Crimson'], + ['#e34234', 'Cinnabar'], + ['#e3bebe', 'Cavern Pink'], + ['#e3f5e1', 'Peppermint'], + ['#e3f988', 'Mindaro'], + ['#e47698', 'Deep Blush'], + ['#e49b0f', 'Gamboge'], + ['#e4c2d5', 'Melanie'], + ['#e4cfde', 'Twilight'], + ['#e4d1c0', 'Bone'], + ['#e4d422', 'Sunflower'], + ['#e4d5b7', 'Grain Brown'], + ['#e4d69b', 'Zombie'], + ['#e4f6e7', 'Frostee'], + ['#e4ffd1', 'Snow Flurry'], + ['#e52b50', 'Amaranth'], + ['#e5841b', 'Zest'], + ['#e5ccc9', 'Dust Storm'], + ['#e5d7bd', 'Stark White'], + ['#e5d8af', 'Hampton'], + ['#e5e0e1', 'Bon Jour'], + ['#e5e5e5', 'Mercury'], + ['#e5f9f6', 'Polar'], + ['#e64e03', 'Trinidad'], + ['#e6be8a', 'Gold Sand'], + ['#e6bea5', 'Cashmere'], + ['#e6d7b9', 'Double Spanish White'], + ['#e6e4d4', 'Satin Linen'], + ['#e6f2ea', 'Harp'], + ['#e6f8f3', 'Off Green'], + ['#e6ffe9', 'Hint Of Green'], + ['#e6ffff', 'Tranquil'], + ['#e77200', 'Mango Tango'], + ['#e7730a', 'Christine'], + ['#e79f8c', 'Tonys Pink'], + ['#e79fc4', 'Kobi'], + ['#e7bcb4', 'Rose Fog'], + ['#e7bf05', 'Corn'], + ['#e7cd8c', 'Putty'], + ['#e7ece6', 'Gray Nurse'], + ['#e7f8ff', 'Lily White'], + ['#e7feff', 'Bubbles'], + ['#e89928', 'Fire Bush'], + ['#e8b9b3', 'Shilo'], + ['#e8e0d5', 'Pearl Bush'], + ['#e8ebe0', 'Green White'], + ['#e8f1d4', 'Chrome White'], + ['#e8f2eb', 'Gin'], + ['#e8f5f2', 'Aqua Squeeze'], + ['#e96e00', 'Clementine'], + ['#e97451', 'Burnt Sienna'], + ['#e97c07', 'Tahiti Gold'], + ['#e9cecd', 'Oyster Pink'], + ['#e9d75a', 'Confetti'], + ['#e9e3e3', 'Ebb'], + ['#e9f8ed', 'Ottoman'], + ['#e9fffd', 'Clear Day'], + ['#ea88a8', 'Carissma'], + ['#eaae69', 'Porsche'], + ['#eab33b', 'Tulip Tree'], + ['#eac674', 'Rob Roy'], + ['#eadab8', 'Raffia'], + ['#eae8d4', 'White Rock'], + ['#eaf6ee', 'Panache'], + ['#eaf6ff', 'Solitude'], + ['#eaf9f5', 'Aqua Spring'], + ['#eafffe', 'Dew'], + ['#eb9373', 'Apricot'], + ['#ebc2af', 'Zinnwaldite'], + ['#eca927', 'Fuel Yellow'], + ['#ecc54e', 'Ronchi'], + ['#ecc7ee', 'French Lilac'], + ['#eccdb9', 'Just Right'], + ['#ece090', 'Wild Rice'], + ['#ecebbd', 'Fall Green'], + ['#ecebce', 'Aths Special'], + ['#ecf245', 'Starship'], + ['#ed0a3f', 'Red Ribbon'], + ['#ed7a1c', 'Tango'], + ['#ed9121', 'Carrot Orange'], + ['#ed989e', 'Sea Pink'], + ['#edb381', 'Tacao'], + ['#edc9af', 'Desert Sand'], + ['#edcdab', 'Pancho'], + ['#eddcb1', 'Chamois'], + ['#edea99', 'Primrose'], + ['#edf5dd', 'Frost'], + ['#edf5f5', 'Aqua Haze'], + ['#edf6ff', 'Zumthor'], + ['#edf9f1', 'Narvik'], + ['#edfc84', 'Honeysuckle'], + ['#ee82ee', 'Lavender Magenta'], + ['#eec1be', 'Beauty Bush'], + ['#eed794', 'Chalky'], + ['#eed9c4', 'Almond'], + ['#eedc82', 'Flax'], + ['#eededa', 'Bizarre'], + ['#eee3ad', 'Double Colonial White'], + ['#eeeee8', 'Cararra'], + ['#eeef78', 'Manz'], + ['#eef0c8', 'Tahuna Sands'], + ['#eef0f3', 'Athens Gray'], + ['#eef3c3', 'Tusk'], + ['#eef4de', 'Loafer'], + ['#eef6f7', 'Catskill White'], + ['#eefdff', 'Twilight Blue'], + ['#eeff9a', 'Jonquil'], + ['#eeffe2', 'Rice Flower'], + ['#ef863f', 'Jaffa'], + ['#efefef', 'Gallery'], + ['#eff2f3', 'Porcelain'], + ['#f091a9', 'Mauvelous'], + ['#f0d52d', 'Golden Dream'], + ['#f0db7d', 'Golden Sand'], + ['#f0dc82', 'Buff'], + ['#f0e2ec', 'Prim'], + ['#f0e68c', 'Khaki'], + ['#f0eefd', 'Selago'], + ['#f0eeff', 'Titan White'], + ['#f0f8ff', 'Alice Blue'], + ['#f0fcea', 'Feta'], + ['#f18200', 'Gold Drop'], + ['#f19bab', 'Wewak'], + ['#f1e788', 'Sahara Sand'], + ['#f1e9d2', 'Parchment'], + ['#f1e9ff', 'Blue Chalk'], + ['#f1eec1', 'Mint Julep'], + ['#f1f1f1', 'Seashell'], + ['#f1f7f2', 'Saltpan'], + ['#f1ffad', 'Tidal'], + ['#f1ffc8', 'Chiffon'], + ['#f2552a', 'Flamingo'], + ['#f28500', 'Tangerine'], + ['#f2c3b2', 'Mandys Pink'], + ['#f2f2f2', 'Concrete'], + ['#f2fafa', 'Black Squeeze'], + ['#f34723', 'Pomegranate'], + ['#f3ad16', 'Buttercup'], + ['#f3d69d', 'New Orleans'], + ['#f3d9df', 'Vanilla Ice'], + ['#f3e7bb', 'Sidecar'], + ['#f3e9e5', 'Dawn Pink'], + ['#f3edcf', 'Wheatfield'], + ['#f3fb62', 'Canary'], + ['#f3fbd4', 'Orinoco'], + ['#f3ffd8', 'Carla'], + ['#f400a1', 'Hollywood Cerise'], + ['#f4a460', 'Sandy brown'], + ['#f4c430', 'Saffron'], + ['#f4d81c', 'Ripe Lemon'], + ['#f4ebd3', 'Janna'], + ['#f4f2ee', 'Pampas'], + ['#f4f4f4', 'Wild Sand'], + ['#f4f8ff', 'Zircon'], + ['#f57584', 'Froly'], + ['#f5c85c', 'Cream Can'], + ['#f5c999', 'Manhattan'], + ['#f5d5a0', 'Maize'], + ['#f5deb3', 'Wheat'], + ['#f5e7a2', 'Sandwisp'], + ['#f5e7e2', 'Pot Pourri'], + ['#f5e9d3', 'Albescent White'], + ['#f5edef', 'Soft Peach'], + ['#f5f3e5', 'Ecru White'], + ['#f5f5dc', 'Beige'], + ['#f5fb3d', 'Golden Fizz'], + ['#f5ffbe', 'Australian Mint'], + ['#f64a8a', 'French Rose'], + ['#f653a6', 'Brilliant Rose'], + ['#f6a4c9', 'Illusion'], + ['#f6f0e6', 'Merino'], + ['#f6f7f7', 'Black Haze'], + ['#f6ffdc', 'Spring Sun'], + ['#f7468a', 'Violet Red'], + ['#f77703', 'Chilean Fire'], + ['#f77fbe', 'Persian Pink'], + ['#f7b668', 'Rajah'], + ['#f7c8da', 'Azalea'], + ['#f7dbe6', 'We Peep'], + ['#f7f2e1', 'Quarter Spanish White'], + ['#f7f5fa', 'Whisper'], + ['#f7faf7', 'Snow Drift'], + ['#f8b853', 'Casablanca'], + ['#f8c3df', 'Chantilly'], + ['#f8d9e9', 'Cherub'], + ['#f8db9d', 'Marzipan'], + ['#f8dd5c', 'Energy Yellow'], + ['#f8e4bf', 'Givry'], + ['#f8f0e8', 'White Linen'], + ['#f8f4ff', 'Magnolia'], + ['#f8f6f1', 'Spring Wood'], + ['#f8f7dc', 'Coconut Cream'], + ['#f8f7fc', 'White Lilac'], + ['#f8f8f7', 'Desert Storm'], + ['#f8f99c', 'Texas'], + ['#f8facd', 'Corn Field'], + ['#f8fdd3', 'Mimosa'], + ['#f95a61', 'Carnation'], + ['#f9bf58', 'Saffron Mango'], + ['#f9e0ed', 'Carousel Pink'], + ['#f9e4bc', 'Dairy Cream'], + ['#f9e663', 'Portica'], + ['#f9eaf3', 'Amour'], + ['#f9f8e4', 'Rum Swizzle'], + ['#f9ff8b', 'Dolly'], + ['#f9fff6', 'Sugar Cane'], + ['#fa7814', 'Ecstasy'], + ['#fa9d5a', 'Tan Hide'], + ['#fad3a2', 'Corvette'], + ['#fadfad', 'Peach Yellow'], + ['#fae600', 'Turbo'], + ['#faeab9', 'Astra'], + ['#faeccc', 'Champagne'], + ['#faf0e6', 'Linen'], + ['#faf3f0', 'Fantasy'], + ['#faf7d6', 'Citrine White'], + ['#fafafa', 'Alabaster'], + ['#fafde4', 'Hint Of Yellow'], + ['#faffa4', 'Milan'], + ['#fb607f', 'Brink Pink'], + ['#fb8989', 'Geraldine'], + ['#fba0e3', 'Lavender Rose'], + ['#fba129', 'Sea Buckthorn'], + ['#fbac13', 'Sun'], + ['#fbaed2', 'Lavender Pink'], + ['#fbb2a3', 'Rose Bud'], + ['#fbbeda', 'Cupid'], + ['#fbcce7', 'Classic Rose'], + ['#fbceb1', 'Apricot Peach'], + ['#fbe7b2', 'Banana Mania'], + ['#fbe870', 'Marigold Yellow'], + ['#fbe96c', 'Festival'], + ['#fbea8c', 'Sweet Corn'], + ['#fbec5d', 'Candy Corn'], + ['#fbf9f9', 'Hint Of Red'], + ['#fbffba', 'Shalimar'], + ['#fc0fc0', 'Shocking Pink'], + ['#fc80a5', 'Tickle Me Pink'], + ['#fc9c1d', 'Tree Poppy'], + ['#fcc01e', 'Lightning Yellow'], + ['#fcd667', 'Goldenrod'], + ['#fcd917', 'Candlelight'], + ['#fcda98', 'Cherokee'], + ['#fcf4d0', 'Double Pearl Lusta'], + ['#fcf4dc', 'Pearl Lusta'], + ['#fcf8f7', 'Vista White'], + ['#fcfbf3', 'Bianca'], + ['#fcfeda', 'Moon Glow'], + ['#fcffe7', 'China Ivory'], + ['#fcfff9', 'Ceramic'], + ['#fd0e35', 'Torch Red'], + ['#fd5b78', 'Wild Watermelon'], + ['#fd7b33', 'Crusta'], + ['#fd7c07', 'Sorbus'], + ['#fd9fa2', 'Sweet Pink'], + ['#fdd5b1', 'Light Apricot'], + ['#fdd7e4', 'Pig Pink'], + ['#fde1dc', 'Cinderella'], + ['#fde295', 'Golden Glow'], + ['#fde910', 'Lemon'], + ['#fdf5e6', 'Old Lace'], + ['#fdf6d3', 'Half Colonial White'], + ['#fdf7ad', 'Drover'], + ['#fdfeb8', 'Pale Prim'], + ['#fdffd5', 'Cumulus'], + ['#fe28a2', 'Persian Rose'], + ['#fe4c40', 'Sunset Orange'], + ['#fe6f5e', 'Bittersweet'], + ['#fe9d04', 'California'], + ['#fea904', 'Yellow Sea'], + ['#febaad', 'Melon'], + ['#fed33c', 'Bright Sun'], + ['#fed85d', 'Dandelion'], + ['#fedb8d', 'Salomie'], + ['#fee5ac', 'Cape Honey'], + ['#feebf3', 'Remy'], + ['#feefce', 'Oasis'], + ['#fef0ec', 'Bridesmaid'], + ['#fef2c7', 'Beeswax'], + ['#fef3d8', 'Bleach White'], + ['#fef4cc', 'Pipi'], + ['#fef4db', 'Half Spanish White'], + ['#fef4f8', 'Wisp Pink'], + ['#fef5f1', 'Provincial Pink'], + ['#fef7de', 'Half Dutch White'], + ['#fef8e2', 'Solitaire'], + ['#fef8ff', 'White Pointer'], + ['#fef9e3', 'Off Yellow'], + ['#fefced', 'Orange White'], + ['#ff0000', 'Red'], + ['#ff007f', 'Rose'], + ['#ff00cc', 'Purple Pizzazz'], + ['#ff00ff', 'Magenta Fuchsia'], + ['#ff2400', 'Scarlet'], + ['#ff3399', 'Wild Strawberry'], + ['#ff33cc', 'Razzle Dazzle Rose'], + ['#ff355e', 'Radical Red'], + ['#ff3f34', 'Red Orange'], + ['#ff4040', 'Coral Red'], + ['#ff4d00', 'Vermilion'], + ['#ff4f00', 'International Orange'], + ['#ff6037', 'Outrageous Orange'], + ['#ff6600', 'Blaze Orange'], + ['#ff66ff', 'Pink Flamingo'], + ['#ff681f', 'Orange'], + ['#ff69b4', 'Hot Pink'], + ['#ff6b53', 'Persimmon'], + ['#ff6fff', 'Blush Pink'], + ['#ff7034', 'Burning Orange'], + ['#ff7518', 'Pumpkin'], + ['#ff7d07', 'Flamenco'], + ['#ff7f00', 'Flush Orange'], + ['#ff7f50', 'Coral'], + ['#ff8c69', 'Salmon'], + ['#ff9000', 'Pizazz'], + ['#ff910f', 'West Side'], + ['#ff91a4', 'Pink Salmon'], + ['#ff9933', 'Neon Carrot'], + ['#ff9966', 'Atomic Tangerine'], + ['#ff9980', 'Vivid Tangerine'], + ['#ff9e2c', 'Sunshade'], + ['#ffa000', 'Orange Peel'], + ['#ffa194', 'Mona Lisa'], + ['#ffa500', 'Web Orange'], + ['#ffa6c9', 'Carnation Pink'], + ['#ffab81', 'Hit Pink'], + ['#ffae42', 'Yellow Orange'], + ['#ffb0ac', 'Cornflower Lilac'], + ['#ffb1b3', 'Sundown'], + ['#ffb31f', 'My Sin'], + ['#ffb555', 'Texas Rose'], + ['#ffb7d5', 'Cotton Candy'], + ['#ffb97b', 'Macaroni And Cheese'], + ['#ffba00', 'Selective Yellow'], + ['#ffbd5f', 'Koromiko'], + ['#ffbf00', 'Amber'], + ['#ffc0a8', 'Wax Flower'], + ['#ffc0cb', 'Pink'], + ['#ffc3c0', 'Your Pink'], + ['#ffc901', 'Supernova'], + ['#ffcba4', 'Flesh'], + ['#ffcc33', 'Sunglow'], + ['#ffcc5c', 'Golden Tainoi'], + ['#ffcc99', 'Peach Orange'], + ['#ffcd8c', 'Chardonnay'], + ['#ffd1dc', 'Pastel Pink'], + ['#ffd2b7', 'Romantic'], + ['#ffd38c', 'Grandis'], + ['#ffd700', 'Gold'], + ['#ffd800', 'School Bus Yellow'], + ['#ffd8d9', 'Cosmos'], + ['#ffdb58', 'Mustard'], + ['#ffdcd6', 'Peach Schnapps'], + ['#ffddaf', 'Caramel'], + ['#ffddcd', 'Tuft Bush'], + ['#ffddcf', 'Watusi'], + ['#ffddf4', 'Pink Lace'], + ['#ffdead', 'Navajo White'], + ['#ffdeb3', 'Frangipani'], + ['#ffe1df', 'Pippin'], + ['#ffe1f2', 'Pale Rose'], + ['#ffe2c5', 'Negroni'], + ['#ffe5a0', 'Cream Brulee'], + ['#ffe5b4', 'Peach'], + ['#ffe6c7', 'Tequila'], + ['#ffe772', 'Kournikova'], + ['#ffeac8', 'Sandy Beach'], + ['#ffead4', 'Karry'], + ['#ffec13', 'Broom'], + ['#ffedbc', 'Colonial White'], + ['#ffeed8', 'Derby'], + ['#ffefa1', 'Vis Vis'], + ['#ffefc1', 'Egg White'], + ['#ffefd5', 'Papaya Whip'], + ['#ffefec', 'Fair Pink'], + ['#fff0db', 'Peach Cream'], + ['#fff0f5', 'Lavender Blush'], + ['#fff14f', 'Gorse'], + ['#fff1b5', 'Buttermilk'], + ['#fff1d8', 'Pink Lady'], + ['#fff1ee', 'Forget Me Not'], + ['#fff1f9', 'Tutu'], + ['#fff39d', 'Picasso'], + ['#fff3f1', 'Chardon'], + ['#fff46e', 'Paris Daisy'], + ['#fff4ce', 'Barley White'], + ['#fff4dd', 'Egg Sour'], + ['#fff4e0', 'Sazerac'], + ['#fff4e8', 'Serenade'], + ['#fff4f3', 'Chablis'], + ['#fff5ee', 'Seashell Peach'], + ['#fff5f3', 'Sauvignon'], + ['#fff6d4', 'Milk Punch'], + ['#fff6df', 'Varden'], + ['#fff6f5', 'Rose White'], + ['#fff8d1', 'Baja White'], + ['#fff9e2', 'Gin Fizz'], + ['#fff9e6', 'Early Dawn'], + ['#fffacd', 'Lemon Chiffon'], + ['#fffaf4', 'Bridal Heath'], + ['#fffbdc', 'Scotch Mist'], + ['#fffbf9', 'Soapstone'], + ['#fffc99', 'Witch Haze'], + ['#fffcea', 'Buttery White'], + ['#fffcee', 'Island Spice'], + ['#fffdd0', 'Cream'], + ['#fffde6', 'Chilean Heath'], + ['#fffde8', 'Travertine'], + ['#fffdf3', 'Orchid White'], + ['#fffdf4', 'Quarter Pearl Lusta'], + ['#fffee1', 'Half And Half'], + ['#fffeec', 'Apricot White'], + ['#fffef0', 'Rice Cake'], + ['#fffef6', 'Black White'], + ['#fffefd', 'Romance'], + ['#ffff00', 'Yellow'], + ['#ffff66', 'Laser Lemon'], + ['#ffff99', 'Pale Canary'], + ['#ffffb4', 'Portafino'], + ['#fffff0', 'Ivory'], + ['#ffffff', 'White'] +]; + +/** + * Map Of hex color values to color names + * + * - key: hex value + * - value: color name + */ +export const colorNameMap = colorNames.reduce>((acc, [hex, name]) => { + acc[hex] = name; + return acc; +}, {}); diff --git a/packages/color/src/constant/palette.ts b/packages/color/src/constant/palette.ts new file mode 100644 index 0000000..9f62664 --- /dev/null +++ b/packages/color/src/constant/palette.ts @@ -0,0 +1,356 @@ +import type { ColorPaletteFamily } from '../types'; + +export const colorPalettes: ColorPaletteFamily[] = [ + { + name: 'Slate', + palettes: [ + { hex: '#f8fafc', number: 50 }, + { hex: '#f1f5f9', number: 100 }, + { hex: '#e2e8f0', number: 200 }, + { hex: '#cbd5e1', number: 300 }, + { hex: '#94a3b8', number: 400 }, + { hex: '#64748b', number: 500 }, + { hex: '#475569', number: 600 }, + { hex: '#334155', number: 700 }, + { hex: '#1e293b', number: 800 }, + { hex: '#0f172a', number: 900 }, + { hex: '#020617', number: 950 } + ] + }, + { + name: 'Gray', + palettes: [ + { hex: '#f9fafb', number: 50 }, + { hex: '#f3f4f6', number: 100 }, + { hex: '#e5e7eb', number: 200 }, + { hex: '#d1d5db', number: 300 }, + { hex: '#9ca3af', number: 400 }, + { hex: '#6b7280', number: 500 }, + { hex: '#4b5563', number: 600 }, + { hex: '#374151', number: 700 }, + { hex: '#1f2937', number: 800 }, + { hex: '#111827', number: 900 }, + { hex: '#030712', number: 950 } + ] + }, + { + name: 'Zinc', + palettes: [ + { hex: '#fafafa', number: 50 }, + { hex: '#f4f4f5', number: 100 }, + { hex: '#e4e4e7', number: 200 }, + { hex: '#d4d4d8', number: 300 }, + { hex: '#a1a1aa', number: 400 }, + { hex: '#71717a', number: 500 }, + { hex: '#52525b', number: 600 }, + { hex: '#3f3f46', number: 700 }, + { hex: '#27272a', number: 800 }, + { hex: '#18181b', number: 900 }, + { hex: '#09090b', number: 950 } + ] + }, + { + name: 'Neutral', + palettes: [ + { hex: '#fafafa', number: 50 }, + { hex: '#f5f5f5', number: 100 }, + { hex: '#e5e5e5', number: 200 }, + { hex: '#d4d4d4', number: 300 }, + { hex: '#a3a3a3', number: 400 }, + { hex: '#737373', number: 500 }, + { hex: '#525252', number: 600 }, + { hex: '#404040', number: 700 }, + { hex: '#262626', number: 800 }, + { hex: '#171717', number: 900 }, + { hex: '#0a0a0a', number: 950 } + ] + }, + { + name: 'Stone', + palettes: [ + { hex: '#fafaf9', number: 50 }, + { hex: '#f5f5f4', number: 100 }, + { hex: '#e7e5e4', number: 200 }, + { hex: '#d6d3d1', number: 300 }, + { hex: '#a8a29e', number: 400 }, + { hex: '#78716c', number: 500 }, + { hex: '#57534e', number: 600 }, + { hex: '#44403c', number: 700 }, + { hex: '#292524', number: 800 }, + { hex: '#1c1917', number: 900 }, + { hex: '#0c0a09', number: 950 } + ] + }, + { + name: 'Red', + palettes: [ + { hex: '#fef2f2', number: 50 }, + { hex: '#fee2e2', number: 100 }, + { hex: '#fecaca', number: 200 }, + { hex: '#fca5a5', number: 300 }, + { hex: '#f87171', number: 400 }, + { hex: '#ef4444', number: 500 }, + { hex: '#dc2626', number: 600 }, + { hex: '#b91c1c', number: 700 }, + { hex: '#991b1b', number: 800 }, + { hex: '#7f1d1d', number: 900 }, + { hex: '#450a0a', number: 950 } + ] + }, + { + name: 'Orange', + palettes: [ + { hex: '#fff7ed', number: 50 }, + { hex: '#ffedd5', number: 100 }, + { hex: '#fed7aa', number: 200 }, + { hex: '#fdba74', number: 300 }, + { hex: '#fb923c', number: 400 }, + { hex: '#f97316', number: 500 }, + { hex: '#ea580c', number: 600 }, + { hex: '#c2410c', number: 700 }, + { hex: '#9a3412', number: 800 }, + { hex: '#7c2d12', number: 900 }, + { hex: '#431407', number: 950 } + ] + }, + { + name: 'Amber', + palettes: [ + { hex: '#fffbeb', number: 50 }, + { hex: '#fef3c7', number: 100 }, + { hex: '#fde68a', number: 200 }, + { hex: '#fcd34d', number: 300 }, + { hex: '#fbbf24', number: 400 }, + { hex: '#f59e0b', number: 500 }, + { hex: '#d97706', number: 600 }, + { hex: '#b45309', number: 700 }, + { hex: '#92400e', number: 800 }, + { hex: '#78350f', number: 900 }, + { hex: '#451a03', number: 950 } + ] + }, + { + name: 'Yellow', + palettes: [ + { hex: '#fefce8', number: 50 }, + { hex: '#fef9c3', number: 100 }, + { hex: '#fef08a', number: 200 }, + { hex: '#fde047', number: 300 }, + { hex: '#facc15', number: 400 }, + { hex: '#eab308', number: 500 }, + { hex: '#ca8a04', number: 600 }, + { hex: '#a16207', number: 700 }, + { hex: '#854d0e', number: 800 }, + { hex: '#713f12', number: 900 }, + { hex: '#422006', number: 950 } + ] + }, + { + name: 'Lime', + palettes: [ + { hex: '#f7fee7', number: 50 }, + { hex: '#ecfccb', number: 100 }, + { hex: '#d9f99d', number: 200 }, + { hex: '#bef264', number: 300 }, + { hex: '#a3e635', number: 400 }, + { hex: '#84cc16', number: 500 }, + { hex: '#65a30d', number: 600 }, + { hex: '#4d7c0f', number: 700 }, + { hex: '#3f6212', number: 800 }, + { hex: '#365314', number: 900 }, + { hex: '#1a2e05', number: 950 } + ] + }, + { + name: 'Green', + palettes: [ + { hex: '#f0fdf4', number: 50 }, + { hex: '#dcfce7', number: 100 }, + { hex: '#bbf7d0', number: 200 }, + { hex: '#86efac', number: 300 }, + { hex: '#4ade80', number: 400 }, + { hex: '#22c55e', number: 500 }, + { hex: '#16a34a', number: 600 }, + { hex: '#15803d', number: 700 }, + { hex: '#166534', number: 800 }, + { hex: '#14532d', number: 900 }, + { hex: '#052e16', number: 950 } + ] + }, + { + name: 'Emerald', + palettes: [ + { hex: '#ecfdf5', number: 50 }, + { hex: '#d1fae5', number: 100 }, + { hex: '#a7f3d0', number: 200 }, + { hex: '#6ee7b7', number: 300 }, + { hex: '#34d399', number: 400 }, + { hex: '#10b981', number: 500 }, + { hex: '#059669', number: 600 }, + { hex: '#047857', number: 700 }, + { hex: '#065f46', number: 800 }, + { hex: '#064e3b', number: 900 }, + { hex: '#022c22', number: 950 } + ] + }, + { + name: 'Teal', + palettes: [ + { hex: '#f0fdfa', number: 50 }, + { hex: '#ccfbf1', number: 100 }, + { hex: '#99f6e4', number: 200 }, + { hex: '#5eead4', number: 300 }, + { hex: '#2dd4bf', number: 400 }, + { hex: '#14b8a6', number: 500 }, + { hex: '#0d9488', number: 600 }, + { hex: '#0f766e', number: 700 }, + { hex: '#115e59', number: 800 }, + { hex: '#134e4a', number: 900 }, + { hex: '#042f2e', number: 950 } + ] + }, + { + name: 'Cyan', + palettes: [ + { hex: '#ecfeff', number: 50 }, + { hex: '#cffafe', number: 100 }, + { hex: '#a5f3fc', number: 200 }, + { hex: '#67e8f9', number: 300 }, + { hex: '#22d3ee', number: 400 }, + { hex: '#06b6d4', number: 500 }, + { hex: '#0891b2', number: 600 }, + { hex: '#0e7490', number: 700 }, + { hex: '#155e75', number: 800 }, + { hex: '#164e63', number: 900 }, + { hex: '#083344', number: 950 } + ] + }, + { + name: 'Sky', + palettes: [ + { hex: '#f0f9ff', number: 50 }, + { hex: '#e0f2fe', number: 100 }, + { hex: '#bae6fd', number: 200 }, + { hex: '#7dd3fc', number: 300 }, + { hex: '#38bdf8', number: 400 }, + { hex: '#0ea5e9', number: 500 }, + { hex: '#0284c7', number: 600 }, + { hex: '#0369a1', number: 700 }, + { hex: '#075985', number: 800 }, + { hex: '#0c4a6e', number: 900 }, + { hex: '#082f49', number: 950 } + ] + }, + { + name: 'Blue', + palettes: [ + { hex: '#eff6ff', number: 50 }, + { hex: '#dbeafe', number: 100 }, + { hex: '#bfdbfe', number: 200 }, + { hex: '#93c5fd', number: 300 }, + { hex: '#60a5fa', number: 400 }, + { hex: '#3b82f6', number: 500 }, + { hex: '#2563eb', number: 600 }, + { hex: '#1d4ed8', number: 700 }, + { hex: '#1e40af', number: 800 }, + { hex: '#1e3a8a', number: 900 }, + { hex: '#172554', number: 950 } + ] + }, + { + name: 'Indigo', + palettes: [ + { hex: '#eef2ff', number: 50 }, + { hex: '#e0e7ff', number: 100 }, + { hex: '#c7d2fe', number: 200 }, + { hex: '#a5b4fc', number: 300 }, + { hex: '#818cf8', number: 400 }, + { hex: '#6366f1', number: 500 }, + { hex: '#4f46e5', number: 600 }, + { hex: '#4338ca', number: 700 }, + { hex: '#3730a3', number: 800 }, + { hex: '#312e81', number: 900 }, + { hex: '#1e1b4b', number: 950 } + ] + }, + { + name: 'Violet', + palettes: [ + { hex: '#f5f3ff', number: 50 }, + { hex: '#ede9fe', number: 100 }, + { hex: '#ddd6fe', number: 200 }, + { hex: '#c4b5fd', number: 300 }, + { hex: '#a78bfa', number: 400 }, + { hex: '#8b5cf6', number: 500 }, + { hex: '#7c3aed', number: 600 }, + { hex: '#6d28d9', number: 700 }, + { hex: '#5b21b6', number: 800 }, + { hex: '#4c1d95', number: 900 }, + { hex: '#2e1065', number: 950 } + ] + }, + { + name: 'Purple', + palettes: [ + { hex: '#faf5ff', number: 50 }, + { hex: '#f3e8ff', number: 100 }, + { hex: '#e9d5ff', number: 200 }, + { hex: '#d8b4fe', number: 300 }, + { hex: '#c084fc', number: 400 }, + { hex: '#a855f7', number: 500 }, + { hex: '#9333ea', number: 600 }, + { hex: '#7e22ce', number: 700 }, + { hex: '#6b21a8', number: 800 }, + { hex: '#581c87', number: 900 }, + { hex: '#3b0764', number: 950 } + ] + }, + { + name: 'Fuchsia', + palettes: [ + { hex: '#fdf4ff', number: 50 }, + { hex: '#fae8ff', number: 100 }, + { hex: '#f5d0fe', number: 200 }, + { hex: '#f0abfc', number: 300 }, + { hex: '#e879f9', number: 400 }, + { hex: '#d946ef', number: 500 }, + { hex: '#c026d3', number: 600 }, + { hex: '#a21caf', number: 700 }, + { hex: '#86198f', number: 800 }, + { hex: '#701a75', number: 900 }, + { hex: '#4a044e', number: 950 } + ] + }, + { + name: 'Pink', + palettes: [ + { hex: '#fdf2f8', number: 50 }, + { hex: '#fce7f3', number: 100 }, + { hex: '#fbcfe8', number: 200 }, + { hex: '#f9a8d4', number: 300 }, + { hex: '#f472b6', number: 400 }, + { hex: '#ec4899', number: 500 }, + { hex: '#db2777', number: 600 }, + { hex: '#be185d', number: 700 }, + { hex: '#9d174d', number: 800 }, + { hex: '#831843', number: 900 }, + { hex: '#500724', number: 950 } + ] + }, + { + name: 'Rose', + palettes: [ + { hex: '#fff1f2', number: 50 }, + { hex: '#ffe4e6', number: 100 }, + { hex: '#fecdd3', number: 200 }, + { hex: '#fda4af', number: 300 }, + { hex: '#fb7185', number: 400 }, + { hex: '#f43f5e', number: 500 }, + { hex: '#e11d48', number: 600 }, + { hex: '#be123c', number: 700 }, + { hex: '#9f1239', number: 800 }, + { hex: '#881337', number: 900 }, + { hex: '#4c0519', number: 950 } + ] + } +]; diff --git a/packages/color/src/index.ts b/packages/color/src/index.ts new file mode 100644 index 0000000..42a4d54 --- /dev/null +++ b/packages/color/src/index.ts @@ -0,0 +1,7 @@ +import { colorPalettes } from './constant'; + +export * from './palette'; +export * from './shared'; +export { colorPalettes }; + +export * from './types'; diff --git a/packages/color/src/palette/antd.ts b/packages/color/src/palette/antd.ts new file mode 100644 index 0000000..c3d5b48 --- /dev/null +++ b/packages/color/src/palette/antd.ts @@ -0,0 +1,176 @@ +import type { AnyColor, HsvColor } from 'colord'; +import { getHex, getHsv, isValidColor, mixColor } from '../shared'; +import type { ColorIndex } from '../types'; + +/** Hue step */ +const hueStep = 2; +/** Saturation step, light color part */ +const saturationStep = 16; +/** Saturation step, dark color part */ +const saturationStep2 = 5; +/** Brightness step, light color part */ +const brightnessStep1 = 5; +/** Brightness step, dark color part */ +const brightnessStep2 = 15; +/** Light color count, main color up */ +const lightColorCount = 5; +/** Dark color count, main color down */ +const darkColorCount = 4; + +/** + * Get AntD palette color by index + * + * @param color - Color + * @param index - The color index of color palette (the main color index is 6) + * @returns Hex color + */ +export function getAntDPaletteColorByIndex(color: AnyColor, index: ColorIndex): string { + if (!isValidColor(color)) { + throw new Error('invalid input color value'); + } + + if (index === 6) { + return getHex(color); + } + + const isLight = index < 6; + const hsv = getHsv(color); + const i = isLight ? lightColorCount + 1 - index : index - lightColorCount - 1; + + const newHsv: HsvColor = { + h: getHue(hsv, i, isLight), + s: getSaturation(hsv, i, isLight), + v: getValue(hsv, i, isLight) + }; + + return getHex(newHsv); +} + +/** Map of dark color index and opacity */ +const darkColorMap = [ + { index: 7, opacity: 0.15 }, + { index: 6, opacity: 0.25 }, + { index: 5, opacity: 0.3 }, + { index: 5, opacity: 0.45 }, + { index: 5, opacity: 0.65 }, + { index: 5, opacity: 0.85 }, + { index: 5, opacity: 0.9 }, + { index: 4, opacity: 0.93 }, + { index: 3, opacity: 0.95 }, + { index: 2, opacity: 0.97 }, + { index: 1, opacity: 0.98 } +]; + +/** + * Get AntD color palette + * + * @param color - Color + * @param darkTheme - Dark theme + * @param darkThemeMixColor - Dark theme mix color (default: #141414) + */ +export function getAntDColorPalette(color: AnyColor, darkTheme = false, darkThemeMixColor = '#141414'): string[] { + const indexes: ColorIndex[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + + const patterns = indexes.map(index => getAntDPaletteColorByIndex(color, index)); + + if (darkTheme) { + const darkPatterns = darkColorMap.map(({ index, opacity }) => { + const darkColor = mixColor(darkThemeMixColor, patterns[index], opacity); + + return darkColor; + }); + + return darkPatterns.map(item => getHex(item)); + } + + return patterns; +} + +/** + * Get hue + * + * @param hsv - Hsv format color + * @param i - The relative distance from 6 + * @param isLight - Is light color + */ +function getHue(hsv: HsvColor, i: number, isLight: boolean) { + let hue: number; + + const hsvH = Math.round(hsv.h); + + if (hsvH >= 60 && hsvH <= 240) { + hue = isLight ? hsvH - hueStep * i : hsvH + hueStep * i; + } else { + hue = isLight ? hsvH + hueStep * i : hsvH - hueStep * i; + } + + if (hue < 0) { + hue += 360; + } + + if (hue >= 360) { + hue -= 360; + } + + return hue; +} + +/** + * Get saturation + * + * @param hsv - Hsv format color + * @param i - The relative distance from 6 + * @param isLight - Is light color + */ +function getSaturation(hsv: HsvColor, i: number, isLight: boolean) { + if (hsv.h === 0 && hsv.s === 0) { + return hsv.s; + } + + let saturation: number; + + if (isLight) { + saturation = hsv.s - saturationStep * i; + } else if (i === darkColorCount) { + saturation = hsv.s + saturationStep; + } else { + saturation = hsv.s + saturationStep2 * i; + } + + if (saturation > 100) { + saturation = 100; + } + + if (isLight && i === lightColorCount && saturation > 10) { + saturation = 10; + } + + if (saturation < 6) { + saturation = 6; + } + + return saturation; +} + +/** + * Get value of hsv + * + * @param hsv - Hsv format color + * @param i - The relative distance from 6 + * @param isLight - Is light color + */ +function getValue(hsv: HsvColor, i: number, isLight: boolean) { + let value: number; + + if (isLight) { + value = hsv.v + brightnessStep1 * i; + } else { + value = hsv.v - brightnessStep2 * i; + } + + if (value > 100) { + value = 100; + } + + return value; +} diff --git a/packages/color/src/palette/index.ts b/packages/color/src/palette/index.ts new file mode 100644 index 0000000..ba3b853 --- /dev/null +++ b/packages/color/src/palette/index.ts @@ -0,0 +1,45 @@ +import type { AnyColor } from 'colord'; +import { getHex } from '../shared'; +import type { ColorPaletteNumber } from '../types'; +import { getRecommendedColorPalette } from './recommend'; +import { getAntDColorPalette } from './antd'; + +/** + * get color palette by provided color + * + * @param color + * @param recommended whether to get recommended color palette (the provided color may not be the main color) + */ +export function getColorPalette(color: AnyColor, recommended = false) { + const colorMap = new Map(); + + if (recommended) { + const colorPalette = getRecommendedColorPalette(getHex(color)); + colorPalette.palettes.forEach(palette => { + colorMap.set(palette.number, palette.hex); + }); + } else { + const colors = getAntDColorPalette(color); + + const colorNumbers: ColorPaletteNumber[] = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950]; + + colorNumbers.forEach((number, index) => { + colorMap.set(number, colors[index]); + }); + } + + return colorMap; +} + +/** + * get color palette color by number + * + * @param color the provided color + * @param number the color palette number + * @param recommended whether to get recommended color palette (the provided color may not be the main color) + */ +export function getPaletteColorByNumber(color: AnyColor, number: ColorPaletteNumber, recommended = false) { + const colorMap = getColorPalette(color, recommended); + + return colorMap.get(number as ColorPaletteNumber)!; +} diff --git a/packages/color/src/palette/recommend.ts b/packages/color/src/palette/recommend.ts new file mode 100644 index 0000000..904cae2 --- /dev/null +++ b/packages/color/src/palette/recommend.ts @@ -0,0 +1,152 @@ +import { getColorName, getDeltaE, getHsl, isValidColor, transformHslToHex } from '../shared'; +import { colorPalettes } from '../constant'; +import type { + ColorPalette, + ColorPaletteFamily, + ColorPaletteFamilyWithNearestPalette, + ColorPaletteMatch, + ColorPaletteNumber +} from '../types'; + +/** + * get recommended color palette by provided color + * + * @param color the provided color + */ +export function getRecommendedColorPalette(color: string) { + const colorPaletteFamily = getRecommendedColorPaletteFamily(color); + + const colorMap = new Map(); + + colorPaletteFamily.palettes.forEach(palette => { + colorMap.set(palette.number, palette); + }); + + const mainColor = colorMap.get(500)!; + const matchColor = colorPaletteFamily.palettes.find(palette => palette.hex === color)!; + + const colorPalette: ColorPaletteMatch = { + ...colorPaletteFamily, + colorMap, + main: mainColor, + match: matchColor + }; + + return colorPalette; +} + +/** + * get recommended palette color by provided color + * + * @param color the provided color + * @param number the color palette number + */ +export function getRecommendedPaletteColorByNumber(color: string, number: ColorPaletteNumber) { + const colorPalette = getRecommendedColorPalette(color); + + const { hex } = colorPalette.colorMap.get(number)!; + + return hex; +} + +/** + * get color palette family by provided color and color name + * + * @param color the provided color + */ +export function getRecommendedColorPaletteFamily(color: string) { + if (!isValidColor(color)) { + throw new Error('Invalid color, please check color value!'); + } + + let colorName = getColorName(color); + + colorName = colorName.toLowerCase().replace(/\s/g, '-'); + + const { h: h1, s: s1 } = getHsl(color); + + const { nearestLightnessPalette, palettes } = getNearestColorPaletteFamily(color, colorPalettes); + + const { number, hex } = nearestLightnessPalette; + + const { h: h2, s: s2 } = getHsl(hex); + + const deltaH = h1 - h2; + + const sRatio = s1 / s2; + + const colorPaletteFamily: ColorPaletteFamily = { + name: colorName, + palettes: palettes.map(palette => { + let hexValue = color; + + const isSame = number === palette.number; + + if (!isSame) { + const { h: h3, s: s3, l } = getHsl(palette.hex); + + const newH = deltaH < 0 ? h3 + deltaH : h3 - deltaH; + const newS = s3 * sRatio; + + hexValue = transformHslToHex({ + h: newH, + s: newS, + l + }); + } + + return { + hex: hexValue, + number: palette.number + }; + }) + }; + + return colorPaletteFamily; +} + +/** + * get nearest color palette family + * + * @param color color + * @param families color palette families + */ +function getNearestColorPaletteFamily(color: string, families: ColorPaletteFamily[]) { + const familyWithConfig = families.map(family => { + const palettes = family.palettes.map(palette => { + return { + ...palette, + delta: getDeltaE(color, palette.hex) + }; + }); + + const nearestPalette = palettes.reduce((prev, curr) => (prev.delta < curr.delta ? prev : curr)); + + return { + ...family, + palettes, + nearestPalette + }; + }); + + const nearestPaletteFamily = familyWithConfig.reduce((prev, curr) => + prev.nearestPalette.delta < curr.nearestPalette.delta ? prev : curr + ); + + const { l } = getHsl(color); + + const paletteFamily: ColorPaletteFamilyWithNearestPalette = { + ...nearestPaletteFamily, + nearestLightnessPalette: nearestPaletteFamily.palettes.reduce((prev, curr) => { + const { l: prevLightness } = getHsl(prev.hex); + const { l: currLightness } = getHsl(curr.hex); + + const deltaPrev = Math.abs(prevLightness - l); + const deltaCurr = Math.abs(currLightness - l); + + return deltaPrev < deltaCurr ? prev : curr; + }) + }; + + return paletteFamily; +} diff --git a/packages/color/src/shared/colord.ts b/packages/color/src/shared/colord.ts new file mode 100644 index 0000000..4c52330 --- /dev/null +++ b/packages/color/src/shared/colord.ts @@ -0,0 +1,93 @@ +import { colord, extend } from 'colord'; +import namesPlugin from 'colord/plugins/names'; +import mixPlugin from 'colord/plugins/mix'; +import labPlugin from 'colord/plugins/lab'; +import type { AnyColor, HslColor, RgbColor } from 'colord'; + +extend([namesPlugin, mixPlugin, labPlugin]); + +export function isValidColor(color: AnyColor) { + return colord(color).isValid(); +} + +export function getHex(color: AnyColor) { + return colord(color).toHex(); +} + +export function getRgb(color: AnyColor) { + return colord(color).toRgb(); +} + +export function getHsl(color: AnyColor) { + return colord(color).toHsl(); +} + +export function getHsv(color: AnyColor) { + return colord(color).toHsv(); +} + +export function getDeltaE(color1: AnyColor, color2: AnyColor) { + return colord(color1).delta(color2); +} + +export function transformHslToHex(color: HslColor) { + return colord(color).toHex(); +} + +/** + * Add color alpha + * + * @param color - Color + * @param alpha - Alpha (0 - 1) + */ +export function addColorAlpha(color: AnyColor, alpha: number) { + return colord(color).alpha(alpha).toHex(); +} + +/** + * Mix color + * + * @param firstColor - First color + * @param secondColor - Second color + * @param ratio - The ratio of the second color (0 - 1) + */ +export function mixColor(firstColor: AnyColor, secondColor: AnyColor, ratio: number) { + return colord(firstColor).mix(secondColor, ratio).toHex(); +} + +/** + * Transform color with opacity to similar color without opacity + * + * @param color - Color + * @param alpha - Alpha (0 - 1) + * @param bgColor Background color (usually white or black) + */ +export function transformColorWithOpacity(color: AnyColor, alpha: number, bgColor = '#ffffff') { + const originColor = addColorAlpha(color, alpha); + const { r: oR, g: oG, b: oB } = colord(originColor).toRgb(); + + const { r: bgR, g: bgG, b: bgB } = colord(bgColor).toRgb(); + + function calRgb(or: number, bg: number, al: number) { + return bg + (or - bg) * al; + } + + const resultRgb: RgbColor = { + r: calRgb(oR, bgR, alpha), + g: calRgb(oG, bgG, alpha), + b: calRgb(oB, bgB, alpha) + }; + + return colord(resultRgb).toHex(); +} + +/** + * Is white color + * + * @param color - Color + */ +export function isWhiteColor(color: AnyColor) { + return colord(color).isEqual('#ffffff'); +} + +export { colord }; diff --git a/packages/color/src/shared/index.ts b/packages/color/src/shared/index.ts new file mode 100644 index 0000000..ae293ce --- /dev/null +++ b/packages/color/src/shared/index.ts @@ -0,0 +1,2 @@ +export * from './colord'; +export * from './name'; diff --git a/packages/color/src/shared/name.ts b/packages/color/src/shared/name.ts new file mode 100644 index 0000000..866bd33 --- /dev/null +++ b/packages/color/src/shared/name.ts @@ -0,0 +1,49 @@ +import { colorNames } from '../constant'; +import { getHex, getHsl, getRgb } from './colord'; + +/** + * Get color name + * + * @param color + */ +export function getColorName(color: string) { + const hex = getHex(color); + const rgb = getRgb(color); + const hsl = getHsl(color); + + let ndf = 0; + let ndf1 = 0; + let ndf2 = 0; + let cl = -1; + let df = -1; + + let name = ''; + + colorNames.some((item, index) => { + const [hexValue, colorName] = item; + + const match = hex === hexValue; + + if (match) { + name = colorName; + } else { + const { r, g, b } = getRgb(hexValue); + const { h, s, l } = getHsl(hexValue); + + ndf1 = (rgb.r - r) ** 2 + (rgb.g - g) ** 2 + (rgb.b - b) ** 2; + ndf2 = (hsl.h - h) ** 2 + (hsl.s - s) ** 2 + (hsl.l - l) ** 2; + + ndf = ndf1 + ndf2 * 2; + if (df < 0 || df > ndf) { + df = ndf; + cl = index; + } + } + + return match; + }); + + name = colorNames[cl][1]; + + return name; +} diff --git a/packages/color/src/types/index.ts b/packages/color/src/types/index.ts new file mode 100644 index 0000000..3a63bc8 --- /dev/null +++ b/packages/color/src/types/index.ts @@ -0,0 +1,58 @@ +/** + * the color palette number + * + * the main color number is 500 + */ +export type ColorPaletteNumber = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950; + +/** the color palette */ +export type ColorPalette = { + /** the color hex value */ + hex: string; + /** + * the color number + * + * - 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950 + */ + number: ColorPaletteNumber; +}; + +/** the color palette family */ +export type ColorPaletteFamily = { + /** the color palette family name */ + name: string; + /** the color palettes */ + palettes: ColorPalette[]; +}; + +/** the color palette with delta */ +export type ColorPaletteWithDelta = ColorPalette & { + delta: number; +}; + +/** the color palette family with nearest palette */ +export type ColorPaletteFamilyWithNearestPalette = ColorPaletteFamily & { + nearestPalette: ColorPaletteWithDelta; + nearestLightnessPalette: ColorPaletteWithDelta; +}; + +/** the color palette match */ +export type ColorPaletteMatch = ColorPaletteFamily & { + /** the color map of the palette */ + colorMap: Map; + /** + * the main color of the palette + * + * which number is 500 + */ + main: ColorPalette; + /** the match color of the palette */ + match: ColorPalette; +}; + +/** + * The color index of color palette + * + * From left to right, the color is from light to dark, 6 is main color + */ +export type ColorIndex = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11; diff --git a/packages/color/tsconfig.json b/packages/color/tsconfig.json new file mode 100644 index 0000000..5823ed5 --- /dev/null +++ b/packages/color/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/hooks/package.json b/packages/hooks/package.json new file mode 100644 index 0000000..301ffdc --- /dev/null +++ b/packages/hooks/package.json @@ -0,0 +1,16 @@ +{ + "name": "@sa/hooks", + "version": "2.0.2", + "exports": { + ".": "./src/index.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + }, + "dependencies": { + "@sa/axios": "workspace:*", + "@sa/utils": "workspace:*" + } +} diff --git a/packages/hooks/src/index.ts b/packages/hooks/src/index.ts new file mode 100644 index 0000000..3a73bbc --- /dev/null +++ b/packages/hooks/src/index.ts @@ -0,0 +1,9 @@ +import useBoolean from './use-boolean'; +import useLoading from './use-loading'; +import useCountDown from './use-count-down'; +import useContext from './use-context'; +import useSvgIconRender from './use-svg-icon-render'; +import useTable from './use-table'; + +export { useBoolean, useLoading, useCountDown, useContext, useSvgIconRender, useTable }; +export type * from './use-table'; diff --git a/packages/hooks/src/use-boolean.ts b/packages/hooks/src/use-boolean.ts new file mode 100644 index 0000000..a60d45a --- /dev/null +++ b/packages/hooks/src/use-boolean.ts @@ -0,0 +1,31 @@ +import { ref } from 'vue'; + +/** + * Boolean + * + * @param initValue Init value + */ +export default function useBoolean(initValue = false) { + const bool = ref(initValue); + + function setBool(value: boolean) { + bool.value = value; + } + function setTrue() { + setBool(true); + } + function setFalse() { + setBool(false); + } + function toggle() { + setBool(!bool.value); + } + + return { + bool, + setBool, + setTrue, + setFalse, + toggle + }; +} diff --git a/packages/hooks/src/use-context.ts b/packages/hooks/src/use-context.ts new file mode 100644 index 0000000..cea9164 --- /dev/null +++ b/packages/hooks/src/use-context.ts @@ -0,0 +1,96 @@ +import { inject, provide } from 'vue'; + +/** + * Use context + * + * @example + * ```ts + * // there are three vue files: A.vue, B.vue, C.vue, and A.vue is the parent component of B.vue and C.vue + * + * // context.ts + * import { ref } from 'vue'; + * import { useContext } from '@sa/hooks'; + * + * export const [provideDemoContext, useDemoContext] = useContext('demo', () => { + * const count = ref(0); + * + * function increment() { + * count.value++; + * } + * + * function decrement() { + * count.value--; + * } + * + * return { + * count, + * increment, + * decrement + * }; + * }) + * ``` // A.vue + * ```vue + * + * + * ``` // B.vue + * ```vue + * + * + * ```; + * + * // C.vue is same as B.vue + * + * @param contextName Context name + * @param fn Context function + */ +export default function useContext, T>( + contextName: string, + composable: (...args: Arguments) => T +) { + const key = Symbol(contextName); + + /** + * Injects the context value. + * + * @param consumerName - The name of the component that is consuming the context. If provided, the component must be + * used within the context provider. + * @param defaultValue - The default value to return if the context is not provided. + * @returns The context value. + */ + const useInject = ( + consumerName?: N, + defaultValue?: T + ): N extends null | undefined ? T | null : T => { + const value = inject(key, defaultValue); + + if (consumerName && !value) { + throw new Error(`\`${consumerName}\` must be used within \`${contextName}\``); + } + + // @ts-expect-error - we want to return null if the value is undefined or null + return value || null; + }; + + const useProvide = (...args: Arguments) => { + const value = composable(...args); + + provide(key, value); + + return value; + }; + + return [useProvide, useInject] as const; +} diff --git a/packages/hooks/src/use-count-down.ts b/packages/hooks/src/use-count-down.ts new file mode 100644 index 0000000..4f95b73 --- /dev/null +++ b/packages/hooks/src/use-count-down.ts @@ -0,0 +1,68 @@ +import { computed, onScopeDispose, ref } from 'vue'; +import { useRafFn } from '@vueuse/core'; + +/** + * A hook for implementing a countdown timer. It uses `requestAnimationFrame` for smooth and accurate timing, + * independent of the screen refresh rate. + * + * @param initialSeconds - The total number of seconds for the countdown. + */ +export default function useCountDown(initialSeconds: number) { + const remainingSeconds = ref(0); + + const count = computed(() => Math.ceil(remainingSeconds.value)); + + const isCounting = computed(() => remainingSeconds.value > 0); + + const { pause, resume } = useRafFn( + ({ delta }) => { + // delta: milliseconds elapsed since the last frame. + + // If countdown already reached zero or below, ensure it's 0 and stop. + if (remainingSeconds.value <= 0) { + remainingSeconds.value = 0; + pause(); + return; + } + + // Calculate seconds passed since the last frame. + const secondsPassed = delta / 1000; + remainingSeconds.value -= secondsPassed; + + // If countdown has finished after decrementing. + if (remainingSeconds.value <= 0) { + remainingSeconds.value = 0; + pause(); + } + }, + { immediate: false } // The timer does not start automatically. + ); + + /** + * Starts the countdown. + * + * @param [updatedSeconds=initialSeconds] - Optionally, start with a new duration. Default is `initialSeconds` + */ + function start(updatedSeconds: number = initialSeconds) { + remainingSeconds.value = updatedSeconds; + resume(); + } + + /** Stops the countdown and resets the remaining time to 0. */ + function stop() { + remainingSeconds.value = 0; + pause(); + } + + // Ensure the rAF loop is cleaned up when the component is unmounted. + onScopeDispose(() => { + pause(); + }); + + return { + count, + isCounting, + start, + stop + }; +} diff --git a/packages/hooks/src/use-loading.ts b/packages/hooks/src/use-loading.ts new file mode 100644 index 0000000..b8f89ad --- /dev/null +++ b/packages/hooks/src/use-loading.ts @@ -0,0 +1,16 @@ +import useBoolean from './use-boolean'; + +/** + * Loading + * + * @param initValue Init value + */ +export default function useLoading(initValue = false) { + const { bool: loading, setTrue: startLoading, setFalse: endLoading } = useBoolean(initValue); + + return { + loading, + startLoading, + endLoading + }; +} diff --git a/packages/hooks/src/use-request.ts b/packages/hooks/src/use-request.ts new file mode 100644 index 0000000..51784af --- /dev/null +++ b/packages/hooks/src/use-request.ts @@ -0,0 +1,82 @@ +import { ref } from 'vue'; +import type { Ref } from 'vue'; +import { createFlatRequest } from '@sa/axios'; +import type { + AxiosError, + CreateAxiosDefaults, + CustomAxiosRequestConfig, + MappedType, + RequestInstanceCommon, + RequestOption, + ResponseType +} from '@sa/axios'; +import useLoading from './use-loading'; + +export type HookRequestInstanceResponseSuccessData = { + data: Ref; + error: Ref; +}; + +export type HookRequestInstanceResponseFailData = { + data: Ref; + error: Ref>; +}; + +export type HookRequestInstanceResponseData = { + loading: Ref; +} & (HookRequestInstanceResponseSuccessData | HookRequestInstanceResponseFailData); + +export interface HookRequestInstance< + ResponseData, + ApiData, + State extends Record +> extends RequestInstanceCommon { + ( + config: CustomAxiosRequestConfig + ): HookRequestInstanceResponseData>; +} + +/** + * create a hook request instance + * + * @param axiosConfig + * @param options + */ +export default function createHookRequest>( + axiosConfig?: CreateAxiosDefaults, + options?: Partial> +) { + const request = createFlatRequest(axiosConfig, options); + + const hookRequest: HookRequestInstance = function hookRequest< + T extends ApiData = ApiData, + R extends ResponseType = 'json' + >(config: CustomAxiosRequestConfig) { + const { loading, startLoading, endLoading } = useLoading(); + + const data = ref(null) as Ref>; + const error = ref(null) as Ref | null>; + + startLoading(); + + request(config).then(res => { + if (res.data) { + data.value = res.data as MappedType; + } else { + error.value = res.error; + } + + endLoading(); + }); + + return { + loading, + data, + error + }; + } as HookRequestInstance; + + hookRequest.cancelAllRequest = request.cancelAllRequest; + + return hookRequest; +} diff --git a/packages/hooks/src/use-svg-icon-render.ts b/packages/hooks/src/use-svg-icon-render.ts new file mode 100644 index 0000000..62c2206 --- /dev/null +++ b/packages/hooks/src/use-svg-icon-render.ts @@ -0,0 +1,50 @@ +import { h } from 'vue'; +import type { Component } from 'vue'; + +/** + * Svg icon render hook + * + * @param SvgIcon Svg icon component + */ +export default function useSvgIconRender(SvgIcon: Component) { + interface IconConfig { + /** Iconify icon name */ + icon?: string; + /** Local icon name */ + localIcon?: string; + /** Icon color */ + color?: string; + /** Icon size */ + fontSize?: number; + } + + type IconStyle = Partial>; + + /** + * Svg icon VNode + * + * @param config + */ + const SvgIconVNode = (config: IconConfig) => { + const { color, fontSize, icon, localIcon } = config; + + const style: IconStyle = {}; + + if (color) { + style.color = color; + } + if (fontSize) { + style.fontSize = `${fontSize}px`; + } + + if (!icon && !localIcon) { + return undefined; + } + + return () => h(SvgIcon, { icon, localIcon, style }); + }; + + return { + SvgIconVNode + }; +} diff --git a/packages/hooks/src/use-table.ts b/packages/hooks/src/use-table.ts new file mode 100644 index 0000000..7323e7f --- /dev/null +++ b/packages/hooks/src/use-table.ts @@ -0,0 +1,131 @@ +import { computed, ref } from 'vue'; +import type { Ref, VNodeChild } from 'vue'; +import useBoolean from './use-boolean'; +import useLoading from './use-loading'; + +export interface PaginationData { + data: T[]; + pageNum: number; + total: number; +} + +type GetApiData = Pagination extends true ? PaginationData : ApiData[]; + +type Transform = ( + response: ResponseData +) => GetApiData; + +export type TableColumnCheckTitle = string | ((...args: any) => VNodeChild); + +export type TableColumnCheck = { + key: string; + title: TableColumnCheckTitle; + checked: boolean; + visible: boolean; +}; + +export interface UseTableOptions { + /** + * api function to get table data + */ + api: () => Promise; + /** + * whether to enable pagination + */ + pagination?: Pagination; + /** + * transform api response to table data + */ + transform: Transform; + /** + * columns factory + */ + columns: () => Column[]; + /** + * get column checks + */ + getColumnChecks: (columns: Column[]) => TableColumnCheck[]; + /** + * get columns + */ + getColumns: (columns: Column[], checks: TableColumnCheck[]) => Column[]; + /** + * callback when response fetched + */ + onFetched?: (data: GetApiData) => void | Promise; + /** + * whether to get data immediately + * + * @default true + */ + immediate?: boolean; +} + +export default function useTable( + options: UseTableOptions +) { + const { loading, startLoading, endLoading } = useLoading(); + const { bool: empty, setBool: setEmpty } = useBoolean(); + + const { api, pagination, transform, columns, getColumnChecks, getColumns, onFetched, immediate = true } = options; + + const data = ref([]) as Ref; + + const columnChecks = ref(getColumnChecks(columns())) as Ref; + + const $columns = computed(() => getColumns(columns(), columnChecks.value)); + + function reloadColumns() { + const checkMap = new Map(columnChecks.value.map(col => [col.key, col.checked])); + + const defaultChecks = getColumnChecks(columns()); + + columnChecks.value = defaultChecks.map(col => ({ + ...col, + checked: checkMap.get(col.key) ?? col.checked + })); + } + + async function getData() { + try { + startLoading(); + + const response = await api(); + + const transformed = transform(response); + + data.value = getTableData(transformed, pagination); + + setEmpty(data.value.length === 0); + + await onFetched?.(transformed); + } finally { + endLoading(); + } + } + + if (immediate) { + getData(); + } + + return { + loading, + empty, + data, + columns: $columns, + columnChecks, + reloadColumns, + getData + }; +} + +function getTableData( + data: GetApiData, + pagination?: Pagination +) { + if (pagination) { + return (data as PaginationData).data; + } + + return data as ApiData[]; +} diff --git a/packages/hooks/tsconfig.json b/packages/hooks/tsconfig.json new file mode 100644 index 0000000..5823ed5 --- /dev/null +++ b/packages/hooks/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/materials/package.json b/packages/materials/package.json new file mode 100644 index 0000000..4f70202 --- /dev/null +++ b/packages/materials/package.json @@ -0,0 +1,19 @@ +{ + "name": "@sa/materials", + "version": "2.0.2", + "exports": { + ".": "./src/index.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + }, + "dependencies": { + "@sa/utils": "workspace:*", + "simplebar-vue": "2.4.2" + }, + "devDependencies": { + "typed-css-modules": "0.9.1" + } +} diff --git a/packages/materials/src/index.ts b/packages/materials/src/index.ts new file mode 100644 index 0000000..f6ca01d --- /dev/null +++ b/packages/materials/src/index.ts @@ -0,0 +1,6 @@ +import AdminLayout, { LAYOUT_MAX_Z_INDEX, LAYOUT_SCROLL_EL_ID } from './libs/admin-layout'; +import PageTab from './libs/page-tab'; +import SimpleScrollbar from './libs/simple-scrollbar'; + +export { AdminLayout, LAYOUT_SCROLL_EL_ID, LAYOUT_MAX_Z_INDEX, PageTab, SimpleScrollbar }; +export * from './types'; diff --git a/packages/materials/src/libs/admin-layout/index.module.css b/packages/materials/src/libs/admin-layout/index.module.css new file mode 100644 index 0000000..e5c8ac8 --- /dev/null +++ b/packages/materials/src/libs/admin-layout/index.module.css @@ -0,0 +1,63 @@ +/* @type */ + +.layout-header, +.layout-header-placement { + height: var(--soy-header-height); +} + +.layout-header { + z-index: var(--soy-header-z-index); +} + +.layout-tab { + top: var(--soy-header-height); + height: var(--soy-tab-height); + z-index: var(--soy-tab-z-index); +} + +.layout-tab-placement { + height: var(--soy-tab-height); +} + +.layout-sider { + width: var(--soy-sider-width); + z-index: var(--soy-sider-z-index); +} + +.layout-mobile-sider { + z-index: var(--soy-sider-z-index); +} + +.layout-mobile-sider-mask { + z-index: var(--soy-mobile-sider-z-index); +} + +.layout-sider_collapsed { + width: var(--soy-sider-collapsed-width); + z-index: var(--soy-sider-z-index); +} + +.layout-footer, +.layout-footer-placement { + height: var(--soy-footer-height); +} + +.layout-footer { + z-index: var(--soy-footer-z-index); +} + +.left-gap { + padding-left: var(--soy-sider-width); +} + +.left-gap_collapsed { + padding-left: var(--soy-sider-collapsed-width); +} + +.sider-padding-top { + padding-top: var(--soy-header-height); +} + +.sider-padding-bottom { + padding-bottom: var(--soy-footer-height); +} diff --git a/packages/materials/src/libs/admin-layout/index.module.css.d.ts b/packages/materials/src/libs/admin-layout/index.module.css.d.ts new file mode 100644 index 0000000..c326c84 --- /dev/null +++ b/packages/materials/src/libs/admin-layout/index.module.css.d.ts @@ -0,0 +1,18 @@ +declare const styles: { + readonly 'layout-header': string; + readonly 'layout-header-placement': string; + readonly 'layout-tab': string; + readonly 'layout-tab-placement': string; + readonly 'layout-sider': string; + readonly 'layout-mobile-sider': string; + readonly 'layout-mobile-sider-mask': string; + readonly 'layout-sider_collapsed': string; + readonly 'layout-footer': string; + readonly 'layout-footer-placement': string; + readonly 'left-gap': string; + readonly 'left-gap_collapsed': string; + readonly 'sider-padding-top': string; + readonly 'sider-padding-bottom': string; +}; + +export default styles; diff --git a/packages/materials/src/libs/admin-layout/index.ts b/packages/materials/src/libs/admin-layout/index.ts new file mode 100644 index 0000000..0687362 --- /dev/null +++ b/packages/materials/src/libs/admin-layout/index.ts @@ -0,0 +1,5 @@ +import AdminLayout from './index.vue'; +import { LAYOUT_MAX_Z_INDEX, LAYOUT_SCROLL_EL_ID } from './shared'; + +export default AdminLayout; +export { LAYOUT_SCROLL_EL_ID, LAYOUT_MAX_Z_INDEX }; diff --git a/packages/materials/src/libs/admin-layout/index.vue b/packages/materials/src/libs/admin-layout/index.vue new file mode 100644 index 0000000..8bbc552 --- /dev/null +++ b/packages/materials/src/libs/admin-layout/index.vue @@ -0,0 +1,236 @@ + + + + + diff --git a/packages/materials/src/libs/admin-layout/shared.ts b/packages/materials/src/libs/admin-layout/shared.ts new file mode 100644 index 0000000..940451e --- /dev/null +++ b/packages/materials/src/libs/admin-layout/shared.ts @@ -0,0 +1,68 @@ +import type { AdminLayoutProps, LayoutCssVars, LayoutCssVarsProps } from '../../types'; + +/** The id of the scroll element of the layout */ +export const LAYOUT_SCROLL_EL_ID = '__SCROLL_EL_ID__'; + +/** The max z-index of the layout */ +export const LAYOUT_MAX_Z_INDEX = 100; + +/** + * Create layout css vars by css vars props + * + * @param props Css vars props + */ +function createLayoutCssVarsByCssVarsProps(props: LayoutCssVarsProps) { + const cssVars: LayoutCssVars = { + '--soy-header-height': `${props.headerHeight}px`, + '--soy-header-z-index': props.headerZIndex, + '--soy-tab-height': `${props.tabHeight}px`, + '--soy-tab-z-index': props.tabZIndex, + '--soy-sider-width': `${props.siderWidth}px`, + '--soy-sider-collapsed-width': `${props.siderCollapsedWidth}px`, + '--soy-sider-z-index': props.siderZIndex, + '--soy-mobile-sider-z-index': props.mobileSiderZIndex, + '--soy-footer-height': `${props.footerHeight}px`, + '--soy-footer-z-index': props.footerZIndex + }; + + return cssVars; +} + +/** + * Create layout css vars + * + * @param props + */ +export function createLayoutCssVars(props: AdminLayoutProps) { + const { + mode, + isMobile, + maxZIndex = LAYOUT_MAX_Z_INDEX, + headerHeight, + tabHeight, + siderWidth, + siderCollapsedWidth, + footerHeight + } = props; + + const headerZIndex = maxZIndex - 3; + const tabZIndex = maxZIndex - 5; + const siderZIndex = mode === 'vertical' || isMobile ? maxZIndex - 1 : maxZIndex - 4; + const mobileSiderZIndex = isMobile ? maxZIndex - 2 : 0; + const footerZIndex = maxZIndex - 5; + + const cssProps: LayoutCssVarsProps = { + headerHeight, + headerZIndex, + tabHeight, + tabZIndex, + siderWidth, + siderZIndex, + mobileSiderZIndex, + siderCollapsedWidth, + footerHeight, + footerZIndex + }; + + return createLayoutCssVarsByCssVarsProps(cssProps); +} diff --git a/packages/materials/src/libs/page-tab/button-tab.vue b/packages/materials/src/libs/page-tab/button-tab.vue new file mode 100644 index 0000000..0826e71 --- /dev/null +++ b/packages/materials/src/libs/page-tab/button-tab.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/packages/materials/src/libs/page-tab/chrome-tab-bg.vue b/packages/materials/src/libs/page-tab/chrome-tab-bg.vue new file mode 100644 index 0000000..151e03a --- /dev/null +++ b/packages/materials/src/libs/page-tab/chrome-tab-bg.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/packages/materials/src/libs/page-tab/chrome-tab.vue b/packages/materials/src/libs/page-tab/chrome-tab.vue new file mode 100644 index 0000000..e4509b0 --- /dev/null +++ b/packages/materials/src/libs/page-tab/chrome-tab.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/packages/materials/src/libs/page-tab/index.module.css b/packages/materials/src/libs/page-tab/index.module.css new file mode 100644 index 0000000..d2baf65 --- /dev/null +++ b/packages/materials/src/libs/page-tab/index.module.css @@ -0,0 +1,121 @@ +/* @type */ + +.button-tab { + border-color: #e5e7eb; +} + +.button-tab_dark { + border-color: #ffffff3d; +} + +.button-tab:hover { + color: var(--soy-primary-color); + border-color: var(--soy-primary-color-opacity3); +} + +.button-tab_active { + color: var(--soy-primary-color); + border-color: var(--soy-primary-color-opacity3); + background-color: var(--soy-primary-color-opacity1); +} + +.button-tab_active_dark { + background-color: var(--soy-primary-color-opacity2); +} + +.button-tab .svg-close:hover { + font-size: 12px; + color: #ffffff; + background-color: var(--soy-primary-color); +} + +.button-tab_dark .svg-close:hover { + color: #000000; +} + +.chrome-tab:hover { + z-index: 9; +} + +.chrome-tab_active { + z-index: 10; + color: var(--soy-primary-color); +} + +.chrome-tab__bg { + color: transparent; +} + +.chrome-tab_active .chrome-tab__bg { + color: var(--soy-primary-color1); +} + +.chrome-tab_active_dark .chrome-tab__bg { + color: var(--soy-primary-color2); +} + +.chrome-tab:hover .chrome-tab__bg { + color: #dee1e6; +} + +.chrome-tab_active:hover .chrome-tab__bg { + color: var(--soy-primary-color1); +} + +.chrome-tab_dark:hover .chrome-tab__bg { + color: #333333; +} + +.chrome-tab_active_dark:hover .chrome-tab__bg { + color: var(--soy-primary-color2); +} + +.chrome-tab .svg-close:hover { + font-size: 12px; + color: #ffffff; + background-color: #9ca3af; +} + +.chrome-tab_active .svg-close:hover { + background-color: var(--soy-primary-color); +} + +.chrome-tab_dark .svg-close:hover { + color: #000000; +} + +.chrome-tab_active .chrome-tab-divider { + opacity: 0; +} + +.chrome-tab:hover .chrome-tab-divider { + opacity: 0; +} + +.chrome-tab_dark .chrome-tab-divider { + background-color: rgba(255, 255, 255, 0.9); +} + +.slider-tab { + background-color: transparent; + height: 100%; + border-bottom: 2px solid transparent; +} + +.slider-tab_dark { + background-color: transparent; +} + +.slider-tab:hover { + color: var(--soy-primary-color); +} + +.slider-tab_active { + color: var(--soy-primary-color); + background-color: var(--soy-primary-color-opacity1); + border-bottom-color: var(--soy-primary-color); +} + +.slider-tab_active_dark { + background-color: var(--soy-primary-color-opacity2); +} diff --git a/packages/materials/src/libs/page-tab/index.module.css.d.ts b/packages/materials/src/libs/page-tab/index.module.css.d.ts new file mode 100644 index 0000000..47c5999 --- /dev/null +++ b/packages/materials/src/libs/page-tab/index.module.css.d.ts @@ -0,0 +1,19 @@ +declare const styles: { + readonly 'button-tab': string; + readonly 'button-tab_dark': string; + readonly 'button-tab_active': string; + readonly 'button-tab_active_dark': string; + readonly 'chrome-tab': string; + readonly 'chrome-tab_active': string; + readonly 'chrome-tab__bg': string; + readonly 'chrome-tab_active_dark': string; + readonly 'chrome-tab_dark': string; + readonly 'chrome-tab-divider': string; + readonly 'svg-close': string; + readonly 'slider-tab': string; + readonly 'slider-tab_active': string; + readonly 'slider-tab_active_dark': string; + readonly 'slider-tab_dark': string; +}; + +export default styles; diff --git a/packages/materials/src/libs/page-tab/index.ts b/packages/materials/src/libs/page-tab/index.ts new file mode 100644 index 0000000..b402adf --- /dev/null +++ b/packages/materials/src/libs/page-tab/index.ts @@ -0,0 +1,3 @@ +import PageTab from './index.vue'; + +export default PageTab; diff --git a/packages/materials/src/libs/page-tab/index.vue b/packages/materials/src/libs/page-tab/index.vue new file mode 100644 index 0000000..c1f6b62 --- /dev/null +++ b/packages/materials/src/libs/page-tab/index.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/packages/materials/src/libs/page-tab/shared.ts b/packages/materials/src/libs/page-tab/shared.ts new file mode 100644 index 0000000..db71f5d --- /dev/null +++ b/packages/materials/src/libs/page-tab/shared.ts @@ -0,0 +1,31 @@ +import { addColorAlpha, transformColorWithOpacity } from '@sa/color'; +import type { PageTabCssVars, PageTabCssVarsProps } from '../../types'; + +/** The active color of the tab */ +export const ACTIVE_COLOR = '#1890ff'; + +function createCssVars(props: PageTabCssVarsProps) { + const cssVars: PageTabCssVars = { + '--soy-primary-color': props.primaryColor, + '--soy-primary-color1': props.primaryColor1, + '--soy-primary-color2': props.primaryColor2, + '--soy-primary-color-opacity1': props.primaryColorOpacity1, + '--soy-primary-color-opacity2': props.primaryColorOpacity2, + '--soy-primary-color-opacity3': props.primaryColorOpacity3 + }; + + return cssVars; +} + +export function createTabCssVars(primaryColor: string) { + const cssProps: PageTabCssVarsProps = { + primaryColor, + primaryColor1: transformColorWithOpacity(primaryColor, 0.1, '#ffffff'), + primaryColor2: transformColorWithOpacity(primaryColor, 0.3, '#000000'), + primaryColorOpacity1: addColorAlpha(primaryColor, 0.1), + primaryColorOpacity2: addColorAlpha(primaryColor, 0.15), + primaryColorOpacity3: addColorAlpha(primaryColor, 0.3) + }; + + return createCssVars(cssProps); +} diff --git a/packages/materials/src/libs/page-tab/slider-tab.vue b/packages/materials/src/libs/page-tab/slider-tab.vue new file mode 100644 index 0000000..3521e5f --- /dev/null +++ b/packages/materials/src/libs/page-tab/slider-tab.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/packages/materials/src/libs/page-tab/svg-close.vue b/packages/materials/src/libs/page-tab/svg-close.vue new file mode 100644 index 0000000..26ba07a --- /dev/null +++ b/packages/materials/src/libs/page-tab/svg-close.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/packages/materials/src/libs/simple-scrollbar/index.ts b/packages/materials/src/libs/simple-scrollbar/index.ts new file mode 100644 index 0000000..1453a06 --- /dev/null +++ b/packages/materials/src/libs/simple-scrollbar/index.ts @@ -0,0 +1,3 @@ +import SimpleScrollbar from './index.vue'; + +export default SimpleScrollbar; diff --git a/packages/materials/src/libs/simple-scrollbar/index.vue b/packages/materials/src/libs/simple-scrollbar/index.vue new file mode 100644 index 0000000..1e8076b --- /dev/null +++ b/packages/materials/src/libs/simple-scrollbar/index.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/packages/materials/src/types/index.ts b/packages/materials/src/types/index.ts new file mode 100644 index 0000000..e0649f1 --- /dev/null +++ b/packages/materials/src/types/index.ts @@ -0,0 +1,291 @@ +/** Header config */ +interface AdminLayoutHeaderConfig { + /** + * Whether header is visible + * + * @default true + */ + headerVisible?: boolean; + /** + * Header height + * + * @default 56px + */ + headerHeight?: number; +} + +/** Tab config */ +interface AdminLayoutTabConfig { + /** + * Whether tab is visible + * + * @default true + */ + tabVisible?: boolean; + /** + * Tab class + * + * @default '' + */ + tabClass?: string; + /** + * Tab height + * + * @default 48px + */ + tabHeight?: number; +} + +/** Sider config */ +interface AdminLayoutSiderConfig { + /** + * Whether sider is visible + * + * @default true + */ + siderVisible?: boolean; + /** + * Sider class + * + * @default '' + */ + siderClass?: string; + /** + * Mobile sider class + * + * @default '' + */ + mobileSiderClass?: string; + /** + * Sider collapse status + * + * @default false + */ + siderCollapse?: boolean; + /** + * Sider width when collapse is false + * + * @default '220px' + */ + siderWidth?: number; + /** + * Sider width when collapse is true + * + * @default '64px' + */ + siderCollapsedWidth?: number; +} + +/** Content config */ +export interface AdminLayoutContentConfig { + /** + * Content class + * + * @default '' + */ + contentClass?: string; + /** + * Whether content is full the page + * + * If true, other elements will be hidden by `display: none` + */ + fullContent?: boolean; +} + +/** Footer config */ +export interface AdminLayoutFooterConfig { + /** + * Whether footer is visible + * + * @default true + */ + footerVisible?: boolean; + /** + * Whether footer is fixed + * + * @default true + */ + fixedFooter?: boolean; + /** + * Footer class + * + * @default '' + */ + footerClass?: string; + /** + * Footer height + * + * @default 48px + */ + footerHeight?: number; + /** + * Whether footer is on the right side + * + * When the layout is vertical, the footer is on the right side + */ + rightFooter?: boolean; +} + +/** + * Layout mode + * + * - Horizontal + * - Vertical + */ +export type LayoutMode = 'horizontal' | 'vertical'; + +/** + * The scroll mode when content overflow + * + * - Wrapper: the layout component's wrapper element has a scrollbar + * - Content: the layout component's content element has a scrollbar + * + * @default 'wrapper' + */ +export type LayoutScrollMode = 'wrapper' | 'content'; + +/** Admin layout props */ +export interface AdminLayoutProps + extends + AdminLayoutHeaderConfig, + AdminLayoutTabConfig, + AdminLayoutSiderConfig, + AdminLayoutContentConfig, + AdminLayoutFooterConfig { + /** + * Layout mode + * + * - {@link LayoutMode} + */ + mode?: LayoutMode; + /** Is mobile layout */ + isMobile?: boolean; + /** + * Scroll mode + * + * - {@link ScrollMode} + */ + scrollMode?: LayoutScrollMode; + /** + * The id of the scroll element of the layout + * + * It can be used to get the corresponding Dom and scroll it + * + * @example + * use the default id by import + * ```ts + * import { adminLayoutScrollElId } from '@sa/vue-materials'; + * ``` + * + * @default + * ```ts + * const adminLayoutScrollElId = '__ADMIN_LAYOUT_SCROLL_EL_ID__' + * ``` + */ + scrollElId?: string; + /** The class of the scroll element */ + scrollElClass?: string; + /** The class of the scroll wrapper element */ + scrollWrapperClass?: string; + /** + * The common class of the layout + * + * Is can be used to configure the transition animation + * + * @default 'transition-all-300' + */ + commonClass?: string; + /** + * Whether fix the header and tab + * + * @default true + */ + fixedTop?: boolean; + /** + * The max z-index of the layout + * + * The z-index of Header,Tab,Sider and Footer will not exceed this value + */ + maxZIndex?: number; +} + +type Kebab = S extends Uncapitalize ? S : `-${Uncapitalize}`; + +type KebabCase = S extends `${infer Start}${infer End}` + ? `${Uncapitalize}${KebabCase>}` + : S; + +type Prefix = '--soy-'; + +export type LayoutCssVarsProps = Pick< + AdminLayoutProps, + 'headerHeight' | 'tabHeight' | 'siderWidth' | 'siderCollapsedWidth' | 'footerHeight' +> & { + headerZIndex?: number; + tabZIndex?: number; + siderZIndex?: number; + mobileSiderZIndex?: number; + footerZIndex?: number; +}; + +export type LayoutCssVars = { + [K in keyof LayoutCssVarsProps as `${Prefix}${KebabCase}`]: string | number; +}; + +/** + * The mode of the tab + * + * - Button: button style + * - Chrome: chrome style + * + * @default chrome + */ +export type PageTabMode = 'button' | 'chrome' | 'slider'; + +export interface PageTabProps { + /** Whether is dark mode */ + darkMode?: boolean; + /** + * The mode of the tab + * + * - {@link TabMode} + */ + mode?: PageTabMode; + /** + * The common class of the layout + * + * Is can be used to configure the transition animation + * + * @default 'transition-all-300' + */ + commonClass?: string; + /** The class of the button tab */ + buttonClass?: string; + /** The class of the chrome tab */ + chromeClass?: string; + /** The class of the title tab */ + sliderClass?: string; + /** Whether the tab is active */ + active?: boolean; + /** The color of the active tab */ + activeColor?: string; + /** + * Whether the tab is closable + * + * Show the close icon when true + */ + closable?: boolean; +} + +export type PageTabCssVarsProps = { + primaryColor: string; + primaryColor1: string; + primaryColor2: string; + primaryColorOpacity1: string; + primaryColorOpacity2: string; + primaryColorOpacity3: string; +}; + +export type PageTabCssVars = { + [K in keyof PageTabCssVarsProps as `${Prefix}${KebabCase}`]: string | number; +}; diff --git a/packages/materials/tsconfig.json b/packages/materials/tsconfig.json new file mode 100644 index 0000000..5823ed5 --- /dev/null +++ b/packages/materials/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/scripts/bin.ts b/packages/scripts/bin.ts new file mode 100755 index 0000000..1a1817b --- /dev/null +++ b/packages/scripts/bin.ts @@ -0,0 +1,3 @@ +#!/usr/bin/env tsx + +import './src/index.ts'; diff --git a/packages/scripts/package.json b/packages/scripts/package.json new file mode 100644 index 0000000..60589a1 --- /dev/null +++ b/packages/scripts/package.json @@ -0,0 +1,28 @@ +{ + "name": "@sa/scripts", + "version": "2.0.2", + "bin": { + "sa": "./bin.ts" + }, + "exports": { + ".": "./src/index.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + }, + "devDependencies": { + "@soybeanjs/changelog": "0.3.25", + "bumpp": "10.3.2", + "c12": "3.3.3", + "cac": "6.7.14", + "consola": "3.4.2", + "enquirer": "2.4.1", + "execa": "9.6.1", + "kolorist": "1.8.0", + "npm-check-updates": "19.2.0", + "picomatch": "4.0.3", + "rimraf": "6.1.2" + } +} diff --git a/packages/scripts/src/commands/changelog.ts b/packages/scripts/src/commands/changelog.ts new file mode 100644 index 0000000..e01ce40 --- /dev/null +++ b/packages/scripts/src/commands/changelog.ts @@ -0,0 +1,10 @@ +import { generateChangelog, generateTotalChangelog } from '@soybeanjs/changelog'; +import type { ChangelogOption } from '@soybeanjs/changelog'; + +export async function genChangelog(options?: Partial, total = false) { + if (total) { + await generateTotalChangelog(options); + } else { + await generateChangelog(options); + } +} diff --git a/packages/scripts/src/commands/cleanup.ts b/packages/scripts/src/commands/cleanup.ts new file mode 100644 index 0000000..a9d3990 --- /dev/null +++ b/packages/scripts/src/commands/cleanup.ts @@ -0,0 +1,5 @@ +import { rimraf } from 'rimraf'; + +export async function cleanup(paths: string[]) { + await rimraf(paths, { glob: true }); +} diff --git a/packages/scripts/src/commands/git-commit.ts b/packages/scripts/src/commands/git-commit.ts new file mode 100644 index 0000000..35c0df5 --- /dev/null +++ b/packages/scripts/src/commands/git-commit.ts @@ -0,0 +1,84 @@ +import path from 'node:path'; +import { readFileSync } from 'node:fs'; +import { prompt } from 'enquirer'; +import { execCommand } from '../shared'; +import { locales } from '../locales'; +import type { Lang } from '../locales'; + +interface PromptObject { + types: string; + scopes: string; + description: string; +} + +/** + * Git commit with Conventional Commits standard + * + * @param lang + */ +export async function gitCommit(lang: Lang = 'en-us') { + const { gitCommitMessages, gitCommitTypes, gitCommitScopes } = locales[lang]; + + const typesChoices = gitCommitTypes.map(([value, msg]) => { + const nameWithSuffix = `${value}:`; + + const message = `${nameWithSuffix.padEnd(12)}${msg}`; + + return { + name: value, + message + }; + }); + + const scopesChoices = gitCommitScopes.map(([value, msg]) => ({ + name: value, + message: `${value.padEnd(30)} (${msg})` + })); + + const result = await prompt([ + { + name: 'types', + type: 'select', + message: gitCommitMessages.types, + choices: typesChoices + }, + { + name: 'scopes', + type: 'select', + message: gitCommitMessages.scopes, + choices: scopesChoices + }, + { + name: 'description', + type: 'text', + message: gitCommitMessages.description + } + ]); + + const breaking = result.description.startsWith('!') ? '!' : ''; + + const description = result.description.replace(/^!/, '').trim(); + + const commitMsg = `${result.types}(${result.scopes})${breaking}: ${description}`; + + await execCommand('git', ['commit', '-m', commitMsg], { stdio: 'inherit' }); +} + +/** Git commit message verify */ +export async function gitCommitVerify(lang: Lang = 'en-us', ignores: RegExp[] = []) { + const gitPath = await execCommand('git', ['rev-parse', '--show-toplevel']); + + const gitMsgPath = path.join(gitPath, '.git', 'COMMIT_EDITMSG'); + + const commitMsg = readFileSync(gitMsgPath, 'utf8').trim(); + + if (ignores.some(regExp => regExp.test(commitMsg))) return; + + const REG_EXP = /(?[a-z]+)(?:\((?.+)\))?(?!)?: (?.+)/i; + + if (!REG_EXP.test(commitMsg)) { + const errorMsg = locales[lang].gitCommitVerify; + + throw new Error(errorMsg); + } +} diff --git a/packages/scripts/src/commands/index.ts b/packages/scripts/src/commands/index.ts new file mode 100644 index 0000000..db4fc15 --- /dev/null +++ b/packages/scripts/src/commands/index.ts @@ -0,0 +1,6 @@ +export * from './git-commit'; +export * from './cleanup'; +export * from './update-pkg'; +export * from './changelog'; +export * from './release'; +export * from './router'; diff --git a/packages/scripts/src/commands/release.ts b/packages/scripts/src/commands/release.ts new file mode 100644 index 0000000..1cf3bc3 --- /dev/null +++ b/packages/scripts/src/commands/release.ts @@ -0,0 +1,12 @@ +import { versionBump } from 'bumpp'; + +export async function release(execute = 'pnpm sa changelog', push = true) { + await versionBump({ + files: ['**/package.json', '!**/node_modules'], + execute, + all: true, + tag: true, + commit: 'chore(projects): release v%s', + push + }); +} diff --git a/packages/scripts/src/commands/router.ts b/packages/scripts/src/commands/router.ts new file mode 100644 index 0000000..f407589 --- /dev/null +++ b/packages/scripts/src/commands/router.ts @@ -0,0 +1,90 @@ +import process from 'node:process'; +import path from 'node:path'; +import { writeFile } from 'node:fs/promises'; +import { existsSync, mkdirSync } from 'node:fs'; +import { prompt } from 'enquirer'; +import { green, red } from 'kolorist'; + +interface PromptObject { + routeName: string; + addRouteParams: boolean; + routeParams: string; +} + +/** generate route */ +export async function generateRoute() { + const result = await prompt([ + { + name: 'routeName', + type: 'text', + message: 'please enter route name', + initial: 'demo-route_child' + }, + { + name: 'addRouteParams', + type: 'confirm', + message: 'add route params?', + initial: false + } + ]); + + if (result.addRouteParams) { + const answers = await prompt({ + name: 'routeParams', + type: 'text', + message: 'please enter route params', + initial: 'id' + }); + + Object.assign(result, answers); + } + + const PAGE_DIR_NAME_PATTERN = /^[\w-]+[0-9a-zA-Z]+$/; + + if (!PAGE_DIR_NAME_PATTERN.test(result.routeName)) { + throw new Error(`${red('route name is invalid, it only allow letters, numbers, "-" or "_"')}. +For example: +(1) one level route: ${green('demo-route')} +(2) two level route: ${green('demo-route_child')} +(3) multi level route: ${green('demo-route_child_child')} +(4) group route: ${green('_ignore_demo-route')}' +`); + } + + const PARAM_REG = /^\w+$/g; + + if (result.routeParams && !PARAM_REG.test(result.routeParams)) { + throw new Error(red('route params is invalid, it only allow letters, numbers or "_".')); + } + + const cwd = process.cwd(); + + const [dir, ...rest] = result.routeName.split('_') as string[]; + + let routeDir = path.join(cwd, 'src', 'views', dir); + + if (rest.length) { + routeDir = path.join(routeDir, rest.join('_')); + } + + if (!existsSync(routeDir)) { + mkdirSync(routeDir, { recursive: true }); + } else { + throw new Error(red('route already exists')); + } + + const fileName = result.routeParams ? `[${result.routeParams}].vue` : 'index.vue'; + + const vueTemplate = ` + + + + +`; + + const filePath = path.join(routeDir, fileName); + + await writeFile(filePath, vueTemplate); +} diff --git a/packages/scripts/src/commands/update-pkg.ts b/packages/scripts/src/commands/update-pkg.ts new file mode 100644 index 0000000..25e168e --- /dev/null +++ b/packages/scripts/src/commands/update-pkg.ts @@ -0,0 +1,5 @@ +import { execCommand } from '../shared'; + +export async function updatePkg(args: string[] = ['--deep', '-u']) { + execCommand('npx', ['npm-check-updates', ...args], { stdio: 'inherit' }); +} diff --git a/packages/scripts/src/config/index.ts b/packages/scripts/src/config/index.ts new file mode 100644 index 0000000..02b0a58 --- /dev/null +++ b/packages/scripts/src/config/index.ts @@ -0,0 +1,39 @@ +import process from 'node:process'; +import { loadConfig } from 'c12'; +import type { CliOption } from '../types'; + +const defaultOptions: CliOption = { + cwd: process.cwd(), + cleanupDirs: [ + 'dist', + '**/package-lock.json', + '**/yarn.lock', + '**/pnpm-lock.yaml', + '**/node_modules', + '!node_modules/**' + ], + ncuCommandArgs: ['--deep', '-u'], + changelogOptions: {}, + gitCommitVerifyIgnores: [ + /^((Merge pull request)|(Merge (.*?) into (.*?)|(Merge branch (.*?)))(?:\r?\n)*$)/m, + /^(Merge tag (.*?))(?:\r?\n)*$/m, + /^(R|r)evert (.*)/, + /^(amend|fixup|squash)!/, + /^(Merged (.*?)(in|into) (.*)|Merged PR (.*): (.*))/, + /^Merge remote-tracking branch(\s*)(.*)/, + /^Automatic merge(.*)/, + /^Auto-merged (.*?) into (.*)/ + ] +}; + +export async function loadCliOptions(overrides?: Partial, cwd = process.cwd()) { + const { config } = await loadConfig>({ + name: 'soybean', + defaults: defaultOptions, + overrides, + cwd, + packageJson: true + }); + + return config as CliOption; +} diff --git a/packages/scripts/src/index.ts b/packages/scripts/src/index.ts new file mode 100755 index 0000000..34367d7 --- /dev/null +++ b/packages/scripts/src/index.ts @@ -0,0 +1,109 @@ +import cac from 'cac'; +import { blue, lightGreen } from 'kolorist'; +import { version } from '../package.json'; +import { cleanup, genChangelog, generateRoute, gitCommit, gitCommitVerify, release, updatePkg } from './commands'; +import { loadCliOptions } from './config'; +import type { Lang } from './locales'; + +type Command = 'cleanup' | 'update-pkg' | 'git-commit' | 'git-commit-verify' | 'changelog' | 'release' | 'gen-route'; + +type CommandAction = (args?: A) => Promise | void; + +type CommandWithAction = Record }>; + +interface CommandArg { + /** Execute additional command after bumping and before git commit. Defaults to 'pnpm sa changelog' */ + execute?: string; + /** Indicates whether to push the git commit and tag. Defaults to true */ + push?: boolean; + /** Generate changelog by total tags */ + total?: boolean; + /** + * The glob pattern of dirs to clean up + * + * If not set, it will use the default value + * + * Multiple values use "," to separate them + */ + cleanupDir?: string; + /** + * display lang of cli + * + * @default 'en-us' + */ + lang?: Lang; +} + +export async function setupCli() { + const cliOptions = await loadCliOptions(); + + const cli = cac(blue('soybean-admin')); + + cli + .version(lightGreen(version)) + .option( + '-e, --execute [command]', + "Execute additional command after bumping and before git commit. Defaults to 'npx soy changelog'" + ) + .option('-p, --push', 'Indicates whether to push the git commit and tag') + .option('-t, --total', 'Generate changelog by total tags') + .option( + '-c, --cleanupDir ', + 'The glob pattern of dirs to cleanup, If not set, it will use the default value, Multiple values use "," to separate them' + ) + .option('-l, --lang ', 'display lang of cli', { default: 'en-us', type: [String] }) + .help(); + + const commands: CommandWithAction = { + cleanup: { + desc: 'delete dirs: node_modules, dist, etc.', + action: async () => { + await cleanup(cliOptions.cleanupDirs); + } + }, + 'update-pkg': { + desc: 'update package.json dependencies versions', + action: async () => { + await updatePkg(cliOptions.ncuCommandArgs); + } + }, + 'git-commit': { + desc: 'git commit, generate commit message which match Conventional Commits standard', + action: async args => { + await gitCommit(args?.lang); + } + }, + 'git-commit-verify': { + desc: 'verify git commit message, make sure it match Conventional Commits standard', + action: async args => { + await gitCommitVerify(args?.lang, cliOptions.gitCommitVerifyIgnores); + } + }, + changelog: { + desc: 'generate changelog', + action: async args => { + await genChangelog(cliOptions.changelogOptions, args?.total); + } + }, + release: { + desc: 'release: update version, generate changelog, commit code', + action: async args => { + await release(args?.execute, args?.push); + } + }, + 'gen-route': { + desc: 'generate route', + action: async () => { + await generateRoute(); + } + } + }; + + for (const [command, { desc, action }] of Object.entries(commands)) { + cli.command(command, lightGreen(desc)).action(action); + } + + cli.parse(); +} + +setupCli(); diff --git a/packages/scripts/src/locales/index.ts b/packages/scripts/src/locales/index.ts new file mode 100644 index 0000000..74321d0 --- /dev/null +++ b/packages/scripts/src/locales/index.ts @@ -0,0 +1,82 @@ +import { bgRed, green, red, yellow } from 'kolorist'; + +export type Lang = 'zh-cn' | 'en-us'; + +export const locales = { + 'zh-cn': { + gitCommitMessages: { + types: '请选择提交类型', + scopes: '请选择提交范围', + description: `请输入描述信息(${yellow('!')}开头表示破坏性改动` + }, + gitCommitTypes: [ + ['feat', '新功能'], + ['feat-wip', '开发中的功能,比如某功能的部分代码'], + ['fix', '修复Bug'], + ['docs', '只涉及文档更新'], + ['typo', '代码或文档勘误,比如错误拼写'], + ['style', '修改代码风格,不影响代码含义的变更'], + ['refactor', '代码重构,既不修复 bug 也不添加功能的代码变更'], + ['perf', '可提高性能的代码更改'], + ['optimize', '优化代码质量的代码更改'], + ['test', '添加缺失的测试或更正现有测试'], + ['build', '影响构建系统或外部依赖项的更改'], + ['ci', '对 CI 配置文件和脚本的更改'], + ['chore', '没有修改src或测试文件的其他变更'], + ['revert', '还原先前的提交'] + ] as [string, string][], + gitCommitScopes: [ + ['projects', '项目'], + ['packages', '包'], + ['components', '组件'], + ['hooks', '钩子函数'], + ['utils', '工具函数'], + ['types', 'TS类型声明'], + ['styles', '代码风格'], + ['deps', '项目依赖'], + ['release', '发布项目新版本'], + ['other', '其他的变更'] + ] as [string, string][], + gitCommitVerify: `${bgRed(' 错误 ')} ${red('git 提交信息必须符合 Conventional Commits 标准!')}\n\n${green( + '推荐使用命令 `pnpm commit` 生成符合 Conventional Commits 标准的提交信息。\n获取有关 Conventional Commits 的更多信息,请访问此链接: https://conventionalcommits.org' + )}` + }, + 'en-us': { + gitCommitMessages: { + types: 'Please select a type', + scopes: 'Please select a scope', + description: `Please enter a description (add prefix ${yellow('!')} to indicate breaking change)` + }, + gitCommitTypes: [ + ['feat', 'A new feature'], + ['feat-wip', 'Features in development, such as partial code for a certain feature'], + ['fix', 'A bug fix'], + ['docs', 'Documentation only changes'], + ['typo', 'Code or document corrections, such as spelling errors'], + ['style', 'Changes that do not affect the meaning of the code'], + ['refactor', 'A code change that neither fixes a bug nor adds a feature'], + ['perf', 'A code change that improves performance'], + ['optimize', 'A code change that optimizes code quality'], + ['test', 'Adding missing tests or correcting existing tests'], + ['build', 'Changes that affect the build system or external dependencies'], + ['ci', 'Changes to our CI configuration files and scripts'], + ['chore', "Other changes that don't modify src or test files"], + ['revert', 'Reverts a previous commit'] + ] as [string, string][], + gitCommitScopes: [ + ['projects', 'project'], + ['packages', 'packages'], + ['components', 'components'], + ['hooks', 'hook functions'], + ['utils', 'utils functions'], + ['types', 'TS declaration'], + ['styles', 'style'], + ['deps', 'project dependencies'], + ['release', 'release project'], + ['other', 'other changes'] + ] as [string, string][], + gitCommitVerify: `${bgRed(' ERROR ')} ${red('git commit message must match the Conventional Commits standard!')}\n\n${green( + 'Recommended to use the command `pnpm commit` to generate Conventional Commits compliant commit information.\nGet more info about Conventional Commits, follow this link: https://conventionalcommits.org' + )}` + } +} satisfies Record>; diff --git a/packages/scripts/src/shared/index.ts b/packages/scripts/src/shared/index.ts new file mode 100644 index 0000000..9b1763f --- /dev/null +++ b/packages/scripts/src/shared/index.ts @@ -0,0 +1,7 @@ +import type { Options } from 'execa'; + +export async function execCommand(cmd: string, args: string[], options?: Options) { + const { execa } = await import('execa'); + const res = await execa(cmd, args, options); + return (res?.stdout as string)?.trim() || ''; +} diff --git a/packages/scripts/src/types/index.ts b/packages/scripts/src/types/index.ts new file mode 100644 index 0000000..32bc091 --- /dev/null +++ b/packages/scripts/src/types/index.ts @@ -0,0 +1,31 @@ +import type { ChangelogOption } from '@soybeanjs/changelog'; + +export interface CliOption { + /** The project root directory */ + cwd: string; + /** + * Cleanup dirs + * + * Glob pattern syntax {@link https://github.com/isaacs/minimatch} + * + * @default + * ```json + * ["** /dist", "** /pnpm-lock.yaml", "** /node_modules", "!node_modules/**"] + * ``` + */ + cleanupDirs: string[]; + /** + * Npm-check-updates command args + * + * @default ['--deep', '-u'] + */ + ncuCommandArgs: string[]; + /** + * Options of generate changelog + * + * @link https://github.com/soybeanjs/changelog + */ + changelogOptions: Partial; + /** The ignore pattern list of git commit verify */ + gitCommitVerifyIgnores: RegExp[]; +} diff --git a/packages/scripts/tsconfig.json b/packages/scripts/tsconfig.json new file mode 100644 index 0000000..67ab8a4 --- /dev/null +++ b/packages/scripts/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*", "typings/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/uno-preset/package.json b/packages/uno-preset/package.json new file mode 100644 index 0000000..5412cb2 --- /dev/null +++ b/packages/uno-preset/package.json @@ -0,0 +1,12 @@ +{ + "name": "@sa/uno-preset", + "version": "2.0.2", + "exports": { + ".": "./src/index.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + } +} diff --git a/packages/uno-preset/src/index.ts b/packages/uno-preset/src/index.ts new file mode 100644 index 0000000..6a1ae42 --- /dev/null +++ b/packages/uno-preset/src/index.ts @@ -0,0 +1,55 @@ +// @unocss-include + +import type { Preset } from '@unocss/core'; +import type { Theme } from '@unocss/preset-uno'; + +export function presetSoybeanAdmin(): Preset { + const preset: Preset = { + name: 'preset-soybean-admin', + shortcuts: [ + { + 'flex-center': 'flex justify-center items-center', + 'flex-x-center': 'flex justify-center', + 'flex-y-center': 'flex items-center', + 'flex-col': 'flex flex-col', + 'flex-col-center': 'flex-center flex-col', + 'flex-col-stretch': 'flex-col items-stretch', + 'i-flex-center': 'inline-flex justify-center items-center', + 'i-flex-x-center': 'inline-flex justify-center', + 'i-flex-y-center': 'inline-flex items-center', + 'i-flex-col': 'flex-col inline-flex', + 'i-flex-col-center': 'flex-col i-flex-center', + 'i-flex-col-stretch': 'i-flex-col items-stretch', + 'flex-1-hidden': 'flex-1 overflow-hidden' + }, + { + 'absolute-lt': 'absolute left-0 top-0', + 'absolute-lb': 'absolute left-0 bottom-0', + 'absolute-rt': 'absolute right-0 top-0', + 'absolute-rb': 'absolute right-0 bottom-0', + 'absolute-tl': 'absolute-lt', + 'absolute-tr': 'absolute-rt', + 'absolute-bl': 'absolute-lb', + 'absolute-br': 'absolute-rb', + 'absolute-center': 'absolute-lt flex-center size-full', + 'fixed-lt': 'fixed left-0 top-0', + 'fixed-lb': 'fixed left-0 bottom-0', + 'fixed-rt': 'fixed right-0 top-0', + 'fixed-rb': 'fixed right-0 bottom-0', + 'fixed-tl': 'fixed-lt', + 'fixed-tr': 'fixed-rt', + 'fixed-bl': 'fixed-lb', + 'fixed-br': 'fixed-rb', + 'fixed-center': 'fixed-lt flex-center size-full' + }, + { + 'nowrap-hidden': 'overflow-hidden whitespace-nowrap', + 'ellipsis-text': 'nowrap-hidden text-ellipsis' + } + ] + }; + + return preset; +} + +export default presetSoybeanAdmin; diff --git a/packages/uno-preset/tsconfig.json b/packages/uno-preset/tsconfig.json new file mode 100644 index 0000000..5823ed5 --- /dev/null +++ b/packages/uno-preset/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 0000000..7074bca --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,22 @@ +{ + "name": "@sa/utils", + "version": "2.0.2", + "exports": { + ".": "./src/index.ts" + }, + "typesVersions": { + "*": { + "*": ["./src/*"] + } + }, + "dependencies": { + "colord": "2.9.3", + "crypto-js": "4.2.0", + "klona": "2.0.6", + "localforage": "1.10.0", + "nanoid": "5.1.6" + }, + "devDependencies": { + "@types/crypto-js": "4.2.2" + } +} diff --git a/packages/utils/src/crypto.ts b/packages/utils/src/crypto.ts new file mode 100644 index 0000000..dc173c8 --- /dev/null +++ b/packages/utils/src/crypto.ts @@ -0,0 +1,27 @@ +import CryptoJS from 'crypto-js'; + +export class Crypto { + /** Secret */ + secret: string; + + constructor(secret: string) { + this.secret = secret; + } + + encrypt(data: T): string { + const dataString = JSON.stringify(data); + const encrypted = CryptoJS.AES.encrypt(dataString, this.secret); + return encrypted.toString(); + } + + decrypt(encrypted: string) { + const decrypted = CryptoJS.AES.decrypt(encrypted, this.secret); + const dataString = decrypted.toString(CryptoJS.enc.Utf8); + try { + return JSON.parse(dataString) as T; + } catch { + // avoid parse error + return null; + } + } +} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts new file mode 100644 index 0000000..079fba6 --- /dev/null +++ b/packages/utils/src/index.ts @@ -0,0 +1,4 @@ +export * from './crypto'; +export * from './storage'; +export * from './nanoid'; +export * from './klona'; diff --git a/packages/utils/src/klona.ts b/packages/utils/src/klona.ts new file mode 100644 index 0000000..2fe5927 --- /dev/null +++ b/packages/utils/src/klona.ts @@ -0,0 +1,3 @@ +import { klona as jsonClone } from 'klona/json'; + +export { jsonClone }; diff --git a/packages/utils/src/nanoid.ts b/packages/utils/src/nanoid.ts new file mode 100644 index 0000000..5cc1d2e --- /dev/null +++ b/packages/utils/src/nanoid.ts @@ -0,0 +1,3 @@ +import { nanoid } from 'nanoid'; + +export { nanoid }; diff --git a/packages/utils/src/storage.ts b/packages/utils/src/storage.ts new file mode 100644 index 0000000..e4aad14 --- /dev/null +++ b/packages/utils/src/storage.ts @@ -0,0 +1,77 @@ +import localforage from 'localforage'; + +/** The storage type */ +export type StorageType = 'local' | 'session'; + +export function createStorage(type: StorageType, storagePrefix: string) { + const stg = type === 'session' ? window.sessionStorage : window.localStorage; + + const storage = { + /** + * Set session + * + * @param key Session key + * @param value Session value + */ + set(key: K, value: T[K]) { + const json = JSON.stringify(value); + + stg.setItem(`${storagePrefix}${key as string}`, json); + }, + /** + * Get session + * + * @param key Session key + */ + get(key: K): T[K] | null { + const json = stg.getItem(`${storagePrefix}${key as string}`); + if (json) { + let storageData: T[K] | null = null; + + try { + storageData = JSON.parse(json); + } catch {} + + // storageData may be `false` if it is boolean type + if (storageData !== null) { + return storageData as T[K]; + } + } + + stg.removeItem(`${storagePrefix}${key as string}`); + + return null; + }, + remove(key: keyof T) { + stg.removeItem(`${storagePrefix}${key as string}`); + }, + clear() { + stg.clear(); + } + }; + return storage; +} + +type LocalForage = Omit & { + getItem(key: K, callback?: (err: any, value: T[K] | null) => void): Promise; + + setItem(key: K, value: T[K], callback?: (err: any, value: T[K]) => void): Promise; + + removeItem(key: keyof T, callback?: (err: any) => void): Promise; +}; + +type LocalforageDriver = 'local' | 'indexedDB' | 'webSQL'; + +export function createLocalforage(driver: LocalforageDriver) { + const driverMap: Record = { + local: localforage.LOCALSTORAGE, + indexedDB: localforage.INDEXEDDB, + webSQL: localforage.WEBSQL + }; + + localforage.config({ + driver: driverMap[driver] + }); + + return localforage as LocalForage; +} diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json new file mode 100644 index 0000000..5823ed5 --- /dev/null +++ b/packages/utils/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "node", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..185bc20 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,10758 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@better-scroll/core': + specifier: 2.5.1 + version: 2.5.1 + '@iconify/vue': + specifier: 5.0.0 + version: 5.0.0(vue@3.5.26(typescript@5.9.3)) + '@sa/axios': + specifier: workspace:* + version: link:packages/axios + '@sa/color': + specifier: workspace:* + version: link:packages/color + '@sa/hooks': + specifier: workspace:* + version: link:packages/hooks + '@sa/materials': + specifier: workspace:* + version: link:packages/materials + '@sa/utils': + specifier: workspace:* + version: link:packages/utils + '@types/streamsaver': + specifier: ^2.0.5 + version: 2.0.5 + '@umoteam/editor': + specifier: ^9.0.1 + version: 9.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + '@vueuse/core': + specifier: 14.1.0 + version: 14.1.0(vue@3.5.26(typescript@5.9.3)) + clipboard: + specifier: 2.0.11 + version: 2.0.11 + dayjs: + specifier: 1.11.19 + version: 1.11.19 + defu: + specifier: 6.1.4 + version: 6.1.4 + echarts: + specifier: 6.0.0 + version: 6.0.0 + highlight.js: + specifier: ^11.11.1 + version: 11.11.1 + jsencrypt: + specifier: ^3.5.4 + version: 3.5.4 + json5: + specifier: 2.2.3 + version: 2.2.3 + naive-ui: + specifier: 2.43.2 + version: 2.43.2(vue@3.5.26(typescript@5.9.3)) + nprogress: + specifier: 0.2.0 + version: 0.2.0 + pinia: + specifier: 3.0.4 + version: 3.0.4(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + streamsaver: + specifier: ^2.0.6 + version: 2.0.6 + tailwind-merge: + specifier: 3.4.0 + version: 3.4.0 + vue: + specifier: 3.5.26 + version: 3.5.26(typescript@5.9.3) + vue-advanced-cropper: + specifier: ^2.8.9 + version: 2.8.9(vue@3.5.26(typescript@5.9.3)) + vue-draggable-plus: + specifier: 0.6.0 + version: 0.6.0(@types/sortablejs@1.15.9) + vue-i18n: + specifier: 11.2.7 + version: 11.2.7(vue@3.5.26(typescript@5.9.3)) + vue-router: + specifier: 4.6.4 + version: 4.6.4(vue@3.5.26(typescript@5.9.3)) + devDependencies: + '@elegant-router/vue': + specifier: 0.3.8 + version: 0.3.8 + '@iconify/json': + specifier: 2.2.417 + version: 2.2.417 + '@sa/scripts': + specifier: workspace:* + version: link:packages/scripts + '@sa/uno-preset': + specifier: workspace:* + version: link:packages/uno-preset + '@soybeanjs/eslint-config': + specifier: 1.7.4 + version: 1.7.4(@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(@unocss/eslint-config@66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))))(eslint@9.39.2(jiti@2.6.1))(svelte-eslint-parser@1.4.1)(typescript@5.9.3)(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))) + '@types/node': + specifier: 25.0.3 + version: 25.0.3 + '@types/nprogress': + specifier: 0.2.3 + version: 0.2.3 + '@unocss/eslint-config': + specifier: 66.5.10 + version: 66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@unocss/preset-icons': + specifier: 66.5.10 + version: 66.5.10 + '@unocss/preset-uno': + specifier: 66.5.10 + version: 66.5.10 + '@unocss/transformer-directives': + specifier: 66.5.10 + version: 66.5.10 + '@unocss/transformer-variant-group': + specifier: 66.5.10 + version: 66.5.10 + '@unocss/vite': + specifier: 66.5.10 + version: 66.5.10(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitejs/plugin-vue': + specifier: 6.0.3 + version: 6.0.3(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + '@vitejs/plugin-vue-jsx': + specifier: 5.1.2 + version: 5.1.2(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + consola: + specifier: 3.4.2 + version: 3.4.2 + eslint: + specifier: 9.39.2 + version: 9.39.2(jiti@2.6.1) + eslint-plugin-vue: + specifier: 10.6.2 + version: 10.6.2(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))) + kolorist: + specifier: 1.8.0 + version: 1.8.0 + sass: + specifier: 1.97.1 + version: 1.97.1 + simple-git-hooks: + specifier: 2.13.1 + version: 2.13.1 + tsx: + specifier: 4.21.0 + version: 4.21.0 + typescript: + specifier: 5.9.3 + version: 5.9.3 + unplugin-icons: + specifier: 22.5.0 + version: 22.5.0(@vue/compiler-sfc@3.5.26) + unplugin-vue-components: + specifier: 30.0.0 + version: 30.0.0(@babel/parser@7.28.5)(vue@3.5.26(typescript@5.9.3)) + vite: + specifier: 7.3.0 + version: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite-plugin-progress: + specifier: 0.0.7 + version: 0.0.7(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + vite-plugin-svg-icons: + specifier: 2.0.1 + version: 2.0.1(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + vite-plugin-vue-devtools: + specifier: 8.0.5 + version: 8.0.5(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + vue-eslint-parser: + specifier: 10.2.0 + version: 10.2.0(eslint@9.39.2(jiti@2.6.1)) + vue-tsc: + specifier: 3.2.1 + version: 3.2.1(typescript@5.9.3) + + packages/alova: + dependencies: + '@alova/mock': + specifier: 2.0.18 + version: 2.0.18(alova@3.4.1) + '@sa/utils': + specifier: workspace:* + version: link:../utils + alova: + specifier: 3.4.1 + version: 3.4.1 + + packages/axios: + dependencies: + '@sa/utils': + specifier: workspace:* + version: link:../utils + axios: + specifier: 1.13.2 + version: 1.13.2 + axios-retry: + specifier: 4.5.0 + version: 4.5.0(axios@1.13.2) + qs: + specifier: 6.14.0 + version: 6.14.0 + devDependencies: + '@types/qs': + specifier: 6.14.0 + version: 6.14.0 + + packages/color: + dependencies: + '@sa/utils': + specifier: workspace:* + version: link:../utils + colord: + specifier: 2.9.3 + version: 2.9.3 + + packages/hooks: + dependencies: + '@sa/axios': + specifier: workspace:* + version: link:../axios + '@sa/utils': + specifier: workspace:* + version: link:../utils + + packages/materials: + dependencies: + '@sa/utils': + specifier: workspace:* + version: link:../utils + simplebar-vue: + specifier: 2.4.2 + version: 2.4.2(vue@3.5.26(typescript@5.9.3)) + devDependencies: + typed-css-modules: + specifier: 0.9.1 + version: 0.9.1 + + packages/scripts: + devDependencies: + '@soybeanjs/changelog': + specifier: 0.3.25 + version: 0.3.25(@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(@unocss/eslint-config@66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))))(eslint@9.39.2(jiti@2.6.1))(svelte-eslint-parser@1.4.1)(typescript@5.9.3)(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))) + bumpp: + specifier: 10.3.2 + version: 10.3.2(magicast@0.3.4) + c12: + specifier: 3.3.3 + version: 3.3.3(magicast@0.3.4) + cac: + specifier: 6.7.14 + version: 6.7.14 + consola: + specifier: 3.4.2 + version: 3.4.2 + enquirer: + specifier: 2.4.1 + version: 2.4.1 + execa: + specifier: 9.6.1 + version: 9.6.1 + kolorist: + specifier: 1.8.0 + version: 1.8.0 + npm-check-updates: + specifier: 19.2.0 + version: 19.2.0 + picomatch: + specifier: 4.0.3 + version: 4.0.3 + rimraf: + specifier: 6.1.2 + version: 6.1.2 + + packages/uno-preset: {} + + packages/utils: + dependencies: + colord: + specifier: 2.9.3 + version: 2.9.3 + crypto-js: + specifier: 4.2.0 + version: 4.2.0 + klona: + specifier: 2.0.6 + version: 2.0.6 + localforage: + specifier: 1.10.0 + version: 1.10.0 + nanoid: + specifier: 5.1.6 + version: 5.1.6 + devDependencies: + '@types/crypto-js': + specifier: 4.2.2 + version: 4.2.2 + +packages: + + '@alova/mock@2.0.18': + resolution: {integrity: sha512-XMwn0Nsmd5pNz+/+iHYy5UQCkb3PobbsMj5of1wlRqRymxyPBc00NImExchkE1wJkTt0sT3BDHnv1jDP9SJE6w==} + peerDependencies: + alova: ^3.0.20 + + '@alova/shared@1.3.2': + resolution: {integrity: sha512-1XvDLWgYpVZ99MmLl1f3Fw4T6S6pPYk5afz5cwRVjuq8JXEGsDn9IygDKfvRyWqkqCBx7Jif07LIct1O+MVEow==} + + '@antfu/eslint-define-config@1.23.0-2': + resolution: {integrity: sha512-LvxY21+ZhpuBf/aHeBUtGQhSEfad4PkNKXKvDOSvukaM3XVTfBhwmHX2EKwAsdq5DlfjbT3qqYyMiueBIO5iDQ==} + engines: {node: '>=18.0.0', npm: '>=9.0.0', pnpm: '>= 8.6.0'} + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.5': + resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-proposal-decorators@7.28.0': + resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.27.1': + resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.5': + resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@better-scroll/core@2.5.1': + resolution: {integrity: sha512-koKOuYA55dQ04FJRIVUpMGDr1hbCfWmfX0MGp1hKagkQSWSRpwblqACiwtggVauoj9aaJRJZ9hDsTM4weaavlg==} + + '@better-scroll/shared-utils@2.5.1': + resolution: {integrity: sha512-AplkfSjXVYP9LZiD6JsKgmgQJ/mG4uuLmBuwLz8W5OsYc7AYTfN8kw6GqZ5OwCGoXkVhBGyd8NeC4xwYItp0aw==} + + '@braintree/sanitize-url@7.1.1': + resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + + '@css-render/plugin-bem@0.15.14': + resolution: {integrity: sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==} + peerDependencies: + css-render: ~0.15.14 + + '@css-render/vue3-ssr@0.15.14': + resolution: {integrity: sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==} + peerDependencies: + vue: ^3.0.11 + + '@elegant-router/core@0.3.8': + resolution: {integrity: sha512-q8CihD9la9V2H+/OYIzMLftXSBkbT234UMwhMxDL1Gq7BGKU3kEIEJvifRM7htbiRD77bkQhwMGBY3WZacqw8A==} + + '@elegant-router/vue@0.3.8': + resolution: {integrity: sha512-K9x2275vw9kQB25WnZ7ROTLsT3o8bxu8acvwF09Do8hexIKG2i6elV0+pWxaufNZ4XCuBxT+lKHfHeyBbRhtYQ==} + + '@emnapi/core@1.7.1': + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@emotion/hash@0.8.0': + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/compat@1.4.1': + resolution: {integrity: sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.40 || 9 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@iconify/json@2.2.417': + resolution: {integrity: sha512-/MzthgckJ4vEwdHmAbAn6Bph5WnR4tzVcHMs/nZl3v5hOVRw80SK28UPnG7jjsCB41WWjWPnWdMEdOZfUMZS5w==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.1.0': + resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + + '@iconify/vue@5.0.0': + resolution: {integrity: sha512-C+KuEWIF5nSBrobFJhT//JS87OZ++QDORB6f2q2Wm6fl2mueSTpFBeBsveK0KW9hWiZ4mNiPjsh6Zs4jjdROSg==} + peerDependencies: + vue: '>=3' + + '@imgly/background-removal@1.5.5': + resolution: {integrity: sha512-tULjwGmuPTUCWVQsP2KpSOEv7/mNGQhULM3WEe+eap1nmobGkQp3Gwj3gmVK7mw/b9FSzoM5nD4pJdvffYmr5A==} + bundledDependencies: [] + + '@intlify/core-base@10.0.8': + resolution: {integrity: sha512-FoHslNWSoHjdUBLy35bpm9PV/0LVI/DSv9L6Km6J2ad8r/mm0VaGg06C40FqlE8u2ADcGUM60lyoU7Myo4WNZQ==} + engines: {node: '>= 16'} + + '@intlify/core-base@11.2.7': + resolution: {integrity: sha512-+Ra9I/LAzXDnmv/IrTO03WMCiLya7pHRmGJvNl9fKwx/W4REJ0xaMk2PxCRqnxcBsX443amEMdebQ3R1geiuIw==} + engines: {node: '>= 16'} + + '@intlify/message-compiler@10.0.8': + resolution: {integrity: sha512-DV+sYXIkHVd5yVb2mL7br/NEUwzUoLBsMkV3H0InefWgmYa34NLZUvMCGi5oWX+Hqr2Y2qUxnVrnOWF4aBlgWg==} + engines: {node: '>= 16'} + + '@intlify/message-compiler@11.2.7': + resolution: {integrity: sha512-TFamC+GzJAotAFwUNvbtRVBgvuSn2nCwKNresmPUHv3IIVMmXJt7QQJj/DORI1h8hs46ZF6L0Fs2xBohSOE4iQ==} + engines: {node: '>= 16'} + + '@intlify/shared@10.0.8': + resolution: {integrity: sha512-BcmHpb5bQyeVNrptC3UhzpBZB/YHHDoEREOUERrmF2BRxsyOEuRrq+Z96C/D4+2KJb8kuHiouzAei7BXlG0YYw==} + engines: {node: '>= 16'} + + '@intlify/shared@11.2.7': + resolution: {integrity: sha512-uvlkvc/0uQ4FDlHQZccpUnmcOwNcaI3i+69ck2YJ+GqM35AoVbuS63b+YfirV4G0SZh64Ij2UMcFRMmB4nr95w==} + engines: {node: '>= 16'} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@juggle/resize-observer@3.4.0': + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + + '@mermaid-js/parser@0.6.3': + resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==} + + '@napi-rs/canvas-android-arm64@0.1.86': + resolution: {integrity: sha512-IjkZFKUr6GzMzzrawJaN3v+yY3Fvpa71e0DcbePfxWelFKnESIir+XUcdAbim29JOd0JE0/hQJdfUCb5t/Fjrw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/canvas-darwin-arm64@0.1.86': + resolution: {integrity: sha512-PUCxDq0wSSJbtaOqoKj3+t5tyDbtxWumziOTykdn3T839hu6koMaBFpGk9lXpsGaPNgyFpPqjxhtsPljBGnDHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/canvas-darwin-x64@0.1.86': + resolution: {integrity: sha512-rlCFLv4Rrg45qFZq7mysrKnsUbMhwdNg3YPuVfo9u4RkOqm7ooAJvdyDFxiqfSsJJTqupYqa9VQCUt8WKxKhNQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.86': + resolution: {integrity: sha512-6xWwyMc9BlDBt+9XHN/GzUo3MozHta/2fxQHMb80x0K2zpZuAdDKUYHmYzx9dFWDY3SbPYnx6iRlQl6wxnwS1w==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/canvas-linux-arm64-gnu@0.1.86': + resolution: {integrity: sha512-r2OX3w50xHxrToTovOSQWwkVfSq752CUzH9dzlVXyr8UDKFV8dMjfa9hePXvAJhN3NBp4TkHcGx15QCdaCIwnA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@napi-rs/canvas-linux-arm64-musl@0.1.86': + resolution: {integrity: sha512-jbXuh8zVFUPw6a9SGpgc6EC+fRbGGyP1NFfeQiVqGLs6bN93ROtPLPL6MH9Bp6yt0CXUFallk2vgKdWDbmW+bw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.86': + resolution: {integrity: sha512-9IwHR2qbq2HceM9fgwyL7x37Jy3ptt1uxvikQEuWR0FisIx9QEdt7F3huljCky76aoouF2vSd0R2fHo3ESRoPw==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@napi-rs/canvas-linux-x64-gnu@0.1.86': + resolution: {integrity: sha512-Jor+rhRN6ubix+D2QkNn9XlPPVAYl+2qFrkZ4oZN9UgtqIUZ+n+HljxhlkkDFRaX1mlxXOXPQjxaZg17zDSFcQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@napi-rs/canvas-linux-x64-musl@0.1.86': + resolution: {integrity: sha512-A28VTy91DbclopSGZ2tIon3p8hcVI1JhnNpDpJ5N9rYlUnVz1WQo4waEMh+FICTZF07O3coxBNZc4Vu4doFw7A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@napi-rs/canvas-win32-arm64-msvc@0.1.86': + resolution: {integrity: sha512-q6G1YXUt3gBCAS2bcDMCaBL4y20di8eVVBi1XhjUqZSVyZZxxwIuRQHy31NlPJUCMiyNiMuc6zeI0uqgkWwAmA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/canvas-win32-x64-msvc@0.1.86': + resolution: {integrity: sha512-X0g46uRVgnvCM1cOjRXAOSFSG63ktUFIf/TIfbKCUc7QpmYUcHmSP9iR6DGOYfk+SggLsXoJCIhPTotYeZEAmg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/canvas@0.1.86': + resolution: {integrity: sha512-hOkywnrkdFdVpsuaNsZWfEY7kc96eROV2DuMTTvGF15AZfwobzdG2w0eDlU5UBx3Lg/XlWUnqVT5zLUWyo5h6A==} + engines: {node: '>= 10'} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@remirror/core-constants@3.0.0': + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + + '@rolldown/pluginutils@1.0.0-beta.53': + resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} + + '@rolldown/pluginutils@1.0.0-beta.56': + resolution: {integrity: sha512-cw9jwAgCs024Nic4OB8PeFDLBHLD1Athcv3bRvyYATIVD9B/gL5X5cJkezT94Y7m7Dk9HXaUMcvb7ypvSX46sA==} + + '@rollup/rollup-android-arm-eabi@4.54.0': + resolution: {integrity: sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.54.0': + resolution: {integrity: sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.54.0': + resolution: {integrity: sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.54.0': + resolution: {integrity: sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.54.0': + resolution: {integrity: sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.54.0': + resolution: {integrity: sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.54.0': + resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.54.0': + resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.54.0': + resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.54.0': + resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.54.0': + resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-gnu@4.54.0': + resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.54.0': + resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.54.0': + resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.54.0': + resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.54.0': + resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.54.0': + resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openharmony-arm64@4.54.0': + resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.54.0': + resolution: {integrity: sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.54.0': + resolution: {integrity: sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.54.0': + resolution: {integrity: sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.54.0': + resolution: {integrity: sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==} + cpu: [x64] + os: [win32] + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@soybeanjs/changelog@0.3.25': + resolution: {integrity: sha512-WtntSBlZ8w4i5pW95GShb6JFwZ2+8LzDYtRa7448vlZBge/mUa4ZekA4Mk8G8isy/VYiBMF/cB3aalWMtSPPTg==} + engines: {node: '>=16', pnpm: '>=9'} + + '@soybeanjs/eslint-config@1.7.4': + resolution: {integrity: sha512-N+CQLLN72cahzuCpEult61d66w7OD6Kz1RTlNEhrfvdqPZzs7xlQJTaJvLN9dbG091nY6opatGvaGuZ+zHO3Aw==} + peerDependencies: + '@toml-tools/parser': '*' + '@unocss/eslint-config': '>=0.58.0' + eslint: '>=8.40.0' + eslint-plugin-astro: '>=0.30.0' + eslint-plugin-react: '>=7.0.0' + eslint-plugin-react-hooks: '>=4.0.0' + eslint-plugin-react-native: '>=4.0.0' + eslint-plugin-react-refresh: '>=0.4.0' + eslint-plugin-solid: '>=0.10.0' + eslint-plugin-svelte: '>=2.0.0' + eslint-plugin-vue: '>=9.19.0' + prettier-plugin-astro: '>=0.12.0' + prettier-plugin-svelte: '>=3.0.0' + prettier-plugin-toml: '>=2.0.0' + svelte-eslint-parser: '>=1.0.0' + typescript: '>=5.0.0' + vue-eslint-parser: '>=9.3.2' + peerDependenciesMeta: + '@toml-tools/parser': + optional: true + '@unocss/eslint-config': + optional: true + eslint-plugin-astro: + optional: true + eslint-plugin-react: + optional: true + eslint-plugin-react-hooks: + optional: true + eslint-plugin-react-native: + optional: true + eslint-plugin-react-refresh: + optional: true + eslint-plugin-solid: + optional: true + eslint-plugin-svelte: + optional: true + eslint-plugin-vue: + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-svelte: + optional: true + prettier-plugin-toml: + optional: true + vue-eslint-parser: + optional: true + + '@tato30/vue-pdf@1.11.5': + resolution: {integrity: sha512-SV6GQx9sD0C0uO/bnAdG1k5D8OtM3lHtYKIgodCq2MbhOaHHpQoyhlSaec9Mo5JifSG4zYDFVNvbcZiMOBkyeQ==} + peerDependencies: + vue: ^3.2.33 + + '@tiptap-extend/columns@2.1.6': + resolution: {integrity: sha512-Wfox+cC3I2Qf4xwaTib+uamHnyrDPWCFIax4ipIn0z/MOtwUFTq4xEq06FlyO0catD8ES9MCXpAOendJV8f0/Q==} + peerDependencies: + '@tiptap/core': ^2.0.0 + prosemirror-model: ^1.0.0 + prosemirror-state: ^1.0.0 + + '@tiptap/core@2.11.5': + resolution: {integrity: sha512-jb0KTdUJaJY53JaN7ooY3XAxHQNoMYti/H6ANo707PsLXVeEqJ9o8+eBup1JU5CuwzrgnDc2dECt2WIGX9f8Jw==} + peerDependencies: + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-blockquote@2.27.1': + resolution: {integrity: sha512-QrUX3muElDrNjKM3nqCSAtm3H3pT33c6ON8kwRiQboOAjT/9D57Cs7XEVY7r6rMaJPeKztrRUrNVF9w/w/6B0A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bold@2.11.5': + resolution: {integrity: sha512-OAq03MHEbl7MtYCUzGuwb0VpOPnM0k5ekMbEaRILFU5ZC7cEAQ36XmPIw1dQayrcuE8GZL35BKub2qtRxyC9iA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bubble-menu@2.11.5': + resolution: {integrity: sha512-rx+rMd7EEdht5EHLWldpkzJ56SWYA9799b33ustePqhXd6linnokJCzBqY13AfZ9+xp3RsR6C0ZHI9GGea0tIA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-bullet-list@2.11.5': + resolution: {integrity: sha512-VXwHlX6A/T6FAspnyjbKDO0TQ+oetXuat6RY1/JxbXphH42nLuBaGWJ6pgy6xMl6XY8/9oPkTNrfJw/8/eeRwA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-character-count@2.11.5': + resolution: {integrity: sha512-Da2VGb7ClmKwXdQdQC2735qylYD8/MQAPA0skPEcHxcDTDuI8ibyIDnMPnczgS/hR5g0TYE2DQp/dkhJXeovkQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-code-block-lowlight@2.11.5': + resolution: {integrity: sha512-EIE+mAGsp8C69dI0Yyg+VH1x36rgyPJc93SfA7h4xFF6Oth18z4YhJtiLaZcwCMyOOVs2efApZ0R3/Fnz2VlqA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/extension-code-block': ^2.7.0 + '@tiptap/pm': ^2.7.0 + highlight.js: ^11 + lowlight: ^2 || ^3 + + '@tiptap/extension-code-block@2.11.5': + resolution: {integrity: sha512-ksxMMvqLDlC+ftcQLynqZMdlJT1iHYZorXsXw/n+wuRd7YElkRkd6YWUX/Pq/njFY6lDjKiqFLEXBJB8nrzzBA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-code@2.27.1': + resolution: {integrity: sha512-i65wUGJevzBTIIUBHBc1ggVa27bgemvGl/tY1/89fEuS/0Xmre+OQjw8rCtSLevoHSiYYLgLRlvjtUSUhE4kgg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-collaboration@2.11.5': + resolution: {integrity: sha512-3tMMq0E+FM3/3YBUMq5rLvks2DC/t1XLH2Kz/VcuVCxqg1Zg5s9nKOl6CcUZ8gbdvZoEd/GYoQyROJ957v9wzw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + y-prosemirror: ^1.2.11 + + '@tiptap/extension-color@2.11.5': + resolution: {integrity: sha512-9gZF6EIpfOJYUt1TtFY37e8iqwKcOmBl8CkFaxq+4mWVvYd2D7KbA0r4tYTxSO0fOBJ5fA/1qJrpvgRlyocp/A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/extension-text-style': ^2.7.0 + + '@tiptap/extension-document@2.11.5': + resolution: {integrity: sha512-7I4BRTpIux2a0O2qS3BDmyZ5LGp3pszKbix32CmeVh7lN9dV7W5reDqtJJ9FCZEEF+pZ6e1/DQA362dflwZw2g==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-dropcursor@2.11.5': + resolution: {integrity: sha512-uIN7L3FU0904ec7FFFbndO7RQE/yiON4VzAMhNn587LFMyWO8US139HXIL4O8dpZeYwYL3d1FnDTflZl6CwLlg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-floating-menu@2.27.1': + resolution: {integrity: sha512-nUk/8DbiXO69l6FDwkWso94BTf52IBoWALo+YGWT6o+FO6cI9LbUGghEX2CdmQYXCvSvwvISF2jXeLQWNZvPZQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-focus@2.11.5': + resolution: {integrity: sha512-syXFVCaXKOeSkMMozurM5y7clIXqGt2xbi7q2Fnkrm7PqACeZU6Ybv+r6uxeAvP0s3dCQLwS2KT8sUmB3i7vsw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-font-family@2.11.5': + resolution: {integrity: sha512-QIuJNGyVkUjKVuJaTNYXs2ISoHRXszNsOQxwc7HcU9WZoKBbZE8ZsrFXI7CVKEvdpV04NYuBa47TGeW717fVCA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/extension-text-style': ^2.7.0 + + '@tiptap/extension-gapcursor@2.27.1': + resolution: {integrity: sha512-A9e1jr+jGhDWzNSXtIO6PYVYhf5j/udjbZwMja+wCE/3KvZU9V3IrnGKz1xNW+2Q2BDOe1QO7j5uVL9ElR6nTA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-hard-break@2.27.1': + resolution: {integrity: sha512-W4hHa4Io6QCTwpyTlN6UAvqMIQ7t56kIUByZhyY9EWrg/+JpbfpxE1kXFLPB4ZGgwBknFOw+e4bJ1j3oAbTJFw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-heading@2.11.5': + resolution: {integrity: sha512-x/MV53psJ9baRcZ4k4WjnCUBMt8zCX7mPlKVT+9C/o+DEs/j/qxPLs95nHeQv70chZpSwCQCt93xMmuF0kPoAg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-highlight@2.11.5': + resolution: {integrity: sha512-VBZfT869L9CiTLF8qr+3FBUtJcmlyUTECORNo0ceEiNDg4H6V9uNPwaROMXrWiQCc+DYVCOkx541QrXwNMzxlg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-history@2.11.5': + resolution: {integrity: sha512-b+wOS33Dz1azw6F1i9LFTEIJ/gUui0Jwz5ZvmVDpL2ZHBhq1Ui0/spTT+tuZOXq7Y/uCbKL8Liu4WoedIvhboQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-horizontal-rule@2.11.5': + resolution: {integrity: sha512-3up2r1Du8/5/4ZYzTC0DjTwhgPI3dn8jhOCLu73m5F3OGvK/9whcXoeWoX103hYMnGDxBlfOje71yQuN35FL4A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-image@2.11.5': + resolution: {integrity: sha512-HbUq9AL8gb8eSuQfY/QKkvMc66ZFN/b6jvQAILGArNOgalUfGizoC6baKTJShaExMSPjBZlaAHtJiQKPaGRHaA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-italic@2.27.1': + resolution: {integrity: sha512-rcm0GyniWW0UhcNI9+1eIK64GqWQLyIIrWGINslvqSUoBc+WkfocLvv4CMpRkzKlfsAxwVIBuH2eLxHKDtAREA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-link@2.11.5': + resolution: {integrity: sha512-4Iu/aPzevbYpe50xDI0ZkqRa6nkZ9eF270Ue2qaF3Ab47nehj+9Jl78XXzo8+LTyFMnrETI73TAs1aC/IGySeQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-list-item@2.27.1': + resolution: {integrity: sha512-dtsxvtzxfwOJP6dKGf0vb2MJAoDF2NxoiWzpq0XTvo7NGGYUHfuHjX07Zp0dYqb4seaDXjwsi5BIQUOp3+WMFQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-mention@2.11.5': + resolution: {integrity: sha512-xj0/P4WSQWiDHzQLSIqdPUEu8LlC+ptSYA+y9IDChG51j1jVqcmolnS4sxpyrfr/t0ug0smNmJ4PDjQtXaG63A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + '@tiptap/suggestion': ^2.7.0 + + '@tiptap/extension-ordered-list@2.11.5': + resolution: {integrity: sha512-Cu8KwruBNWAaEfshRQR0yOSaUKAeEwxW7UgbvF9cN/zZuKgK5uZosPCPTehIFCcRe+TBpRtZQh+06f/gNYpYYg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-paragraph@2.27.1': + resolution: {integrity: sha512-R3QdrHcUdFAsdsn2UAIvhY0yWyHjqGyP/Rv8RRdN0OyFiTKtwTPqreKMHKJOflgX4sMJl/OpHTpNG1Kaf7Lo2A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-placeholder@2.11.5': + resolution: {integrity: sha512-Pr+0Ju/l2ZvXMd9VQxtaoSZbs0BBp1jbBDqwms88ctpyvQFRfLSfSkqudQcSHyw2ROOz2E31p/7I7fpI8Y0CLA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-strike@2.27.1': + resolution: {integrity: sha512-S9I//K8KPgfFTC5I5lorClzXk0g4lrAv9y5qHzHO5EOWt7AFl0YTg2oN8NKSIBK4bHRnPIrjJJKv+dDFnUp5jQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-subscript@2.11.5': + resolution: {integrity: sha512-VpaSzxku/Bcvf4SgDB2K5d0E+FNA/56iJHMygg/WXsq2F4tMMUEivQHI/n+17ndUEO4Wybz0wItnM1G2JfRuLQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-superscript@2.11.5': + resolution: {integrity: sha512-sK6v2G0zFfGW+j9CmYp2e+tyZ3FTa3dP0xY4kJzefgZcHhMJLlLnjxBRwHCSi/jj5ie6WdZT4KoEooxnPs1Vzw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-table-cell@2.11.5': + resolution: {integrity: sha512-S967Au0pgeULstP3FaasOf/LEh72p61Ooh1PcUMF/az4x8EeGgpcEUARpVUxsGxLFvogv6LmhPHZdtcGgdHcBw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-table-header@2.11.5': + resolution: {integrity: sha512-O1iBtzZP1XZDi4h1Xmgq1T63il+fpKPvBIMZ0JJH9TyCw5i5rcrMLL2dyy5zaWK3BFRJuYBNSke4c+VWnr/g6w==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-table-row@2.11.5': + resolution: {integrity: sha512-+/VWhCuW24BcM5aaIc/f0bC6ZR1Q5gnuqw13MIo7gyPx7iIY6BXK8roGiZSs8wYAN4uBEf3EKFm0bSZwQuAeyg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-table@2.11.5': + resolution: {integrity: sha512-NKXLhKWdAdURklm98YkCd2ai4fh8jY8HS/+X2s/2QiQt8Z98CU1keCm35fJEEExM234iB/hCqG5vY4JgTc0Tvw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-task-item@2.11.5': + resolution: {integrity: sha512-Xvvww8cleM6fcNejP916vzhL31yJnAmuBvABsOV0kHGtAqkqUVCSDcN/1qjI4ihVNeIWEJBHDczjDfZzvLy1xA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-task-list@2.11.5': + resolution: {integrity: sha512-DJpIrBu/bjXYmyYoWQDH2GkpvRmizT9Fvbx5MscFYyfmSsYryD3vRBtCDz08gviwoRII+pFBrG4Ynb0XuQ7DsA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text-align@2.11.5': + resolution: {integrity: sha512-Ei0zDpH5N9EV59ogydK4HTKa4lCPicCsQllM5n/Nf2tUJPir3aiYxzJ73FzhComD4Hpo1ANYnmssBhy8QeoPZA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text-style@2.11.5': + resolution: {integrity: sha512-YUmYl0gILSd/u/ZkOmNxjNXVw+mu8fpC2f8G4I4tLODm0zCx09j9DDEJXSrM5XX72nxJQqtSQsCpNKnL0hfeEQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text@2.27.1': + resolution: {integrity: sha512-a4GCT+GZ9tUwl82F4CEum9/+WsuW0/De9Be/NqrMmi7eNfAwbUTbLCTFU0gEvv25WMHCoUzaeNk/qGmzeVPJ1Q==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-typography@2.11.5': + resolution: {integrity: sha512-K+mwkyyH3bhnw8f6dKt0AIIh7ipPPVTY5XiWxm1ZMnS6p7TkXeqSJRU6mT1a47YLX4IGBEMlTQdvDVvJ1hwTjA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-underline@2.11.5': + resolution: {integrity: sha512-YpWHXNIkSoRSuzT2cvgKpyJ2tTz3LzqkTM64uC+uTJ8cUkvXIWUWejJR42q8ma/mTlQe4lHff4IQ0Sf58Digtw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/pm@2.11.5': + resolution: {integrity: sha512-z9JFtqc5ZOsdQLd9vRnXfTCQ8v5ADAfRt9Nm7SqP6FUHII8E1hs38ACzf5xursmth/VonJYb5+73Pqxk1hGIPw==} + + '@tiptap/starter-kit@2.11.5': + resolution: {integrity: sha512-SLI7Aj2ruU1t//6Mk8f+fqW+18uTqpdfLUJYgwu0CkqBckrkRZYZh6GVLk/02k3H2ki7QkFxiFbZrdbZdng0JA==} + + '@tiptap/suggestion@2.11.5': + resolution: {integrity: sha512-uafwGgB5YuKX/xLRjnt2H5eA21I8HcNXpdbH4Du2gg3KM71RpUbkyjaV7KEMA/5qwCEo+sddlpuErj4wBycZ5Q==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/vue-3@2.11.5': + resolution: {integrity: sha512-etOURQq85MpfkMPeTG0r79s7wmLM7PqLD4aj19m7Fk5rkWuoEZyBinnA+9jfIKEttnhQ1G8PQnHNaqJhfIHQfA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + vue: ^3.0.0 + + '@tool-belt/type-predicates@1.4.1': + resolution: {integrity: sha512-hxVezXhUV8bNOggi2ypjK9ZoAQlAdgiOc48b7Kr8qD9tAHjZBHgAt2cSs5HsbhZIjApZONPnSfXW7/HvQZ1UPA==} + engines: {node: '>=18.0.0'} + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/crypto-js@4.2.2': + resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} + + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-shape@3.1.7': + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.21': + resolution: {integrity: sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/ndarray@1.0.14': + resolution: {integrity: sha512-oANmFZMnFQvb219SSBIhI1Ih/r4CvHDOzkWyJS/XRqkMrGH5/kaPSA1hQhdIBzouaE+5KpE/f5ylI9cujmckQg==} + + '@types/node@10.17.60': + resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} + + '@types/node@20.3.3': + resolution: {integrity: sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==} + + '@types/node@25.0.3': + resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} + + '@types/nprogress@0.2.3': + resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/sortablejs@1.15.9': + resolution: {integrity: sha512-7HP+rZGE2p886PKV9c9OJzLBI6BBJu1O7lJGYnPyG3fS4/duUCcngkNCjsLwIMV+WMqANe3tt4irrXHSIe68OQ==} + + '@types/streamsaver@2.0.5': + resolution: {integrity: sha512-93o0zjV8swEhR2YI57h/2ytbJF8bJh7sI9GNB02TLJHdM4fWDxZuChwfWhyD8vt2ub4kw4rsfZ0C0yAUX+3gcg==} + + '@types/svg64@1.1.2': + resolution: {integrity: sha512-kIsgEdYo12kMpR7bD0r3eGEp3Pen9c8HH5H7w+2iWxanwrt7h3QWua8ujjkDE8BpKAatAYI9lE9k7rF4USMUAg==} + + '@types/svgo@2.6.4': + resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@typescript-eslint/eslint-plugin@8.50.1': + resolution: {integrity: sha512-PKhLGDq3JAg0Jk/aK890knnqduuI/Qj+udH7wCf0217IGi4gt+acgCyPVe79qoT+qKUvHMDQkwJeKW9fwl8Cyw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.50.1 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.50.1': + resolution: {integrity: sha512-hM5faZwg7aVNa819m/5r7D0h0c9yC4DUlWAOvHAtISdFTc8xB86VmX5Xqabrama3wIPJ/q9RbGS1worb6JfnMg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.50.1': + resolution: {integrity: sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.50.1': + resolution: {integrity: sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.50.1': + resolution: {integrity: sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.50.1': + resolution: {integrity: sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.50.1': + resolution: {integrity: sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.50.1': + resolution: {integrity: sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.50.1': + resolution: {integrity: sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.50.1': + resolution: {integrity: sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@umoteam/editor-external@8.1.0': + resolution: {integrity: sha512-YySP20GgOl9bqDu5F7fekSBGAZnR6O2I5omC140jB38uvswTVIMRE4fGL1E5fAI3rOocQqW5UbJvKIZYjAkoGQ==} + + '@umoteam/editor-external@9.0.0': + resolution: {integrity: sha512-cAioi0SK3qPrIm9c7eqJimSBGztxd+la6OLihVCVoH6dawA9KCuZ62SHQ7lsl/rdRHp0VL0aYbW5NxFlEUpbJA==} + + '@umoteam/editor@8.1.0': + resolution: {integrity: sha512-yvHXn5lOgeplS39lpjNh5nhCMYEq35jY4qyymQF5eavqtD5uLBLxZ7QWTvbPyAHtAiMCpNLXoRdOVeeZ4Oht3w==} + engines: {node: '>=18.0.0'} + + '@umoteam/editor@9.0.1': + resolution: {integrity: sha512-KReeYw6g9/BpwZXlJPr8+fZd4IuG1jS9a9dFTqgjRp/tx4q6A9gMod8RKqc3dZScpuaRb61vN6PO7300rbv35w==} + engines: {node: '>=18.0.0'} + + '@umoteam/viewer@0.1.9': + resolution: {integrity: sha512-aQ3DDbWm/V/wC3SFhCanqKl1XTW2xMzdSbEmS2vE8y1dwI18bgIeiKZnyWcj2aXXsxVmWuQMcnJ367DDengozg==} + + '@umoteam/viewer@0.3.0': + resolution: {integrity: sha512-0YJMnzN86AdXWbHUWluHmfQZpzUNcxHIDfwr/Qw+OTwkeQsTHLicabqm4t66MdCIAtgMeybAejQawRwBxbrknQ==} + + '@unocss/config@66.5.10': + resolution: {integrity: sha512-udBhfMe+2MU70ZdjnRLnwLQ+0EHYJ4f5JjjvHsfmQ0If4KeYmSStWBuX+/LHNQidhl487JiwW1lBDQ8pKHmbiw==} + engines: {node: '>=14'} + + '@unocss/core@66.5.10': + resolution: {integrity: sha512-SEmPE4pWNn9VcCvZqovPwFGuG/j69W3zh+x1Ky4z/I2pnyoB0Y0lBmq22KVu/dwExe+ZKKTQpxa0j5rbE27rDQ==} + + '@unocss/eslint-config@66.5.10': + resolution: {integrity: sha512-kDoXTBZcI7RCdWPekKrjgiuRcNYfdwjEkG6HtS1++jM0LhK6QgaMfu4p+4j0gfAz86ZNotghM3u8aWO6Fu0nRA==} + engines: {node: '>=14'} + + '@unocss/eslint-plugin@66.5.10': + resolution: {integrity: sha512-Fzvl5ISMoGnALo9tqI15nNNWZza2ICqmzyujQCyzsxDZEVZzajNvt8wACVHoEz+dUZykjMPJqqdmX5ZijcPZ1w==} + engines: {node: '>=14'} + + '@unocss/extractor-arbitrary-variants@66.5.10': + resolution: {integrity: sha512-9JsAY1a68WZaIbSiwQa7LLAO+t4T5nnhgmNxY3MGaK58k6Qa9ayZb4AG4fqOpw+Zn8tmKd7yXJ0s+27sx1n2BA==} + + '@unocss/inspector@66.5.10': + resolution: {integrity: sha512-L/Nvi4bkXFxbGNOi7TPNnIIDfY1zKghfJ+cF7To/WrXplP1Y4nEZa2kGwcVBcsaysACri0whU19Dh3yf+bG+Pg==} + + '@unocss/preset-icons@66.5.10': + resolution: {integrity: sha512-zf4Sev/F2QQgVjGjKBCw3BKc15HQAtvUrNX2zymXXbAjt83Lf27ofYzTAUVUO9mi/oQhXcP5sQrIGIe7iQX3hw==} + + '@unocss/preset-mini@66.5.10': + resolution: {integrity: sha512-jRmweaPhaTGBSDKFuhEGayGyuGr66rTRRqzv5EAdHH4x43TFlJ1RO5SVlzzJdo1zJy4vyGSINIVKeI49FYhEKQ==} + + '@unocss/preset-uno@66.5.10': + resolution: {integrity: sha512-O3R99td+Jt3XAJh1pVbOSTu3z7jUosg80y90iu6JQIpvXI/pGanWJEhoEz95SgJmRV+vXNEn4f6tIvfUXkTd/w==} + + '@unocss/preset-wind3@66.5.10': + resolution: {integrity: sha512-N2Wgu+AnTSr4jIEAfajOfUtwESE/Zzr0GxwW88+MHIw6Tzj6tZeCEKNNKFzsgwfGkoNjvwIeIbkaIrIGJ7SveA==} + + '@unocss/rule-utils@66.5.10': + resolution: {integrity: sha512-497GPWZpArNG25cto0Yq3/Yw+i0x7/N/ySq1HHeE3lB43sdmCv6+m6QEv14I/9/e5WJhQOmrY5LmHZYXC7xxMw==} + engines: {node: '>=14'} + + '@unocss/transformer-directives@66.5.10': + resolution: {integrity: sha512-EDak3DGW+rSYjoZNwU8xJIXbwif+q9e3cjhCZy48ll1nfyg2E1Znqtwv/X8vLRr8fJ0gWn75P2uGi4jfGLZzMg==} + + '@unocss/transformer-variant-group@66.5.10': + resolution: {integrity: sha512-9DWi9bLOGwdw6whCTdywVD9+lA5lkeqcgy9sMoizfUa4CfT1bSdMT27VoAbYhxeEznV92BCW2jCYt0I8M00phw==} + + '@unocss/vite@66.5.10': + resolution: {integrity: sha512-GegFDmcWe0V2CR/uN1f+iQuDh2R1vA6EAwSvl1nyL+6ue0/zLyF9yhdVnypIVlJnS6RK/xaLPOP6vWJnqRGhZg==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + + '@vitejs/plugin-vue-jsx@5.1.2': + resolution: {integrity: sha512-3a2BOryRjG/Iih87x87YXz5c8nw27eSlHytvSKYfp8ZIsp5+FgFQoKeA7k2PnqWpjJrv6AoVTMnvmuKUXb771A==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + vue: ^3.0.0 + + '@vitejs/plugin-vue@6.0.3': + resolution: {integrity: sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vue: ^3.2.25 + + '@volar/language-core@2.4.27': + resolution: {integrity: sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==} + + '@volar/source-map@2.4.27': + resolution: {integrity: sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==} + + '@volar/typescript@2.4.27': + resolution: {integrity: sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==} + + '@vue/babel-helper-vue-transform-on@1.5.0': + resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} + + '@vue/babel-helper-vue-transform-on@2.0.1': + resolution: {integrity: sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==} + + '@vue/babel-plugin-jsx@1.5.0': + resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-jsx@2.0.1': + resolution: {integrity: sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.5.0': + resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/babel-plugin-resolve-type@2.0.1': + resolution: {integrity: sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/compiler-core@3.5.26': + resolution: {integrity: sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==} + + '@vue/compiler-dom@3.5.26': + resolution: {integrity: sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==} + + '@vue/compiler-sfc@3.5.26': + resolution: {integrity: sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==} + + '@vue/compiler-ssr@3.5.26': + resolution: {integrity: sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/devtools-api@7.7.9': + resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} + + '@vue/devtools-core@8.0.5': + resolution: {integrity: sha512-dpCw8nl0GDBuiL9SaY0mtDxoGIEmU38w+TQiYEPOLhW03VDC0lfNMYXS/qhl4I0YlysGp04NLY4UNn6xgD0VIQ==} + peerDependencies: + vue: ^3.0.0 + + '@vue/devtools-kit@7.7.9': + resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} + + '@vue/devtools-kit@8.0.5': + resolution: {integrity: sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==} + + '@vue/devtools-shared@7.7.9': + resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} + + '@vue/devtools-shared@8.0.5': + resolution: {integrity: sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==} + + '@vue/language-core@3.2.1': + resolution: {integrity: sha512-g6oSenpnGMtpxHGAwKuu7HJJkNZpemK/zg3vZzZbJ6cnnXq1ssxuNrXSsAHYM3NvH8p4IkTw+NLmuxyeYz4r8A==} + + '@vue/reactivity@3.5.26': + resolution: {integrity: sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==} + + '@vue/runtime-core@3.5.26': + resolution: {integrity: sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==} + + '@vue/runtime-dom@3.5.26': + resolution: {integrity: sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==} + + '@vue/server-renderer@3.5.26': + resolution: {integrity: sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==} + peerDependencies: + vue: 3.5.26 + + '@vue/shared@3.5.26': + resolution: {integrity: sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==} + + '@vueuse/core@11.3.0': + resolution: {integrity: sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==} + + '@vueuse/core@13.9.0': + resolution: {integrity: sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/core@14.1.0': + resolution: {integrity: sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/metadata@11.3.0': + resolution: {integrity: sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==} + + '@vueuse/metadata@13.9.0': + resolution: {integrity: sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==} + + '@vueuse/metadata@14.1.0': + resolution: {integrity: sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==} + + '@vueuse/shared@11.3.0': + resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==} + + '@vueuse/shared@13.9.0': + resolution: {integrity: sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/shared@14.1.0': + resolution: {integrity: sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==} + peerDependencies: + vue: ^3.5.0 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + alien-signals@3.1.1: + resolution: {integrity: sha512-ogkIWbVrLwKtHY6oOAXaYkAxP+cTH7V5FZ5+Tm4NZFd8VDZ6uNMDrfzqctTZ42eTMCSR3ne3otpcxmqSnFfPYA==} + + alova@3.4.1: + resolution: {integrity: sha512-xGChKIiCHDqcMglF9RyuWAsk+ltwnja8Dp4MgRIRbUlhOi8XFiQnaoWwIQzJcODKeblmmiFAK7YrYnpskFZWLA==} + engines: {node: '>= 18.0.0'} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + args-tokenizer@0.3.0: + resolution: {integrity: sha512-xXAd7G2Mll5W8uo37GETpQ2VrE84M181Z7ugHFGQnJZ50M2mbOv0osSZ9VsSgPfJQ+LVG0prSi0th+ELMsno7Q==} + + arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + + arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios-retry@4.5.0: + resolution: {integrity: sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==} + peerDependencies: + axios: 0.x || 1.x + + axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + + baseline-browser-mapping@2.9.11: + resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} + hasBin: true + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-image-size@0.6.4: + resolution: {integrity: sha512-nEh+kZOPY1w+gcCMobZ6ETUp9WfibndnosbpwB1iJk/8Gt5ZF2bhS6+B6bPYz424KtwsR6Rflc3tCz1/ghX2dQ==} + engines: {node: '>=4.0'} + + builtin-modules@5.0.0: + resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} + engines: {node: '>=18.20'} + + bumpp@10.3.2: + resolution: {integrity: sha512-yUUkVx5zpTywLNX97MlrqtpanI7eMMwFwLntWR2EBVDw3/Pm3aRIzCoDEGHATLIiHK9PuJC7xWI4XNWqXItSPg==} + engines: {node: '>=18'} + hasBin: true + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + c12@3.3.3: + resolution: {integrity: sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==} + peerDependencies: + magicast: '*' + peerDependenciesMeta: + magicast: + optional: true + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001761: + resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + + chevrotain-allstar@0.3.1: + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + + chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + engines: {node: '>=8'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + cli-progress@3.12.0: + resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} + engines: {node: '>=4'} + + clipboard@2.0.11: + resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + convert-gitmoji@0.1.5: + resolution: {integrity: sha512-4wqOafJdk2tqZC++cjcbGcaJ13BZ3kwldf06PTiAQRAB76Z1KJwZNL1SaRZMi2w1FM9RYTgZ6QErS8NUl/GBmQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + + copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + + core-js-compat@3.47.0: + resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} + + core-js@3.47.0: + resolution: {integrity: sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + css-render@0.15.14: + resolution: {integrity: sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==} + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + + csstype@3.0.11: + resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + custom-event-polyfill@1.0.7: + resolution: {integrity: sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.33.1: + resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.13: + resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + date-fns-tz@3.2.0: + resolution: {integrity: sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==} + peerDependencies: + date-fns: ^3.0.0 || ^4.0.0 + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + dayjs@1.11.15: + resolution: {integrity: sha512-MC+DfnSWiM9APs7fpiurHGCoeIx0Gdl6QZBy+5lu8MbYKN5FZEXqOgrundfibdfhGZ15o9hzmZ2xJjZnbvgKXQ==} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.4.0: + resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} + engines: {node: '>=18'} + + default-passive-events@4.0.0: + resolution: {integrity: sha512-0whk/GqfDOjc0AJIpacXUSqX6kV9TjL3GFSXIxFvuXQYcK+bEdJ6rpJnAEfP4YYMYWibM+jhlwmdlVrlifoepg==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + + define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + + define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegate@3.2.0: + resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-to-image-more@3.7.2: + resolution: {integrity: sha512-uQf+pHv6eQhgfI8t2bFuinV0KsPyT8TZgCLwcSU8uBVgN9v6leb0mMpvp6HQAlAcplP3NCcGjxbdqef6pTzvmw==} + + domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + dompurify@3.3.1: + resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} + + domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + easy-bem@1.1.1: + resolution: {integrity: sha512-GJRqdiy2h+EXy6a8E6R+ubmqUM08BK0FWNq41k24fup6045biQ8NXxoXimiwegMQvFFV3t1emADdGNL1TlS61A==} + + echarts@5.6.0: + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} + + echarts@6.0.0: + resolution: {integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==} + + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + engines: {node: '>=10.13.0'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@7.0.0: + resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==} + engines: {node: '>=0.12'} + + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-drager@1.2.11: + resolution: {integrity: sha512-36c7+Tz+Z+3NoUzk82M6PL84yA0fIEbz2eRC+qX6TymRLq3ApGdQXdtLZTcPtvXTKjeedJSMgYwb51oRISvrLA==} + peerDependencies: + vue: '>=3.2.0' + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-config-flat-gitignore@2.1.0: + resolution: {integrity: sha512-cJzNJ7L+psWp5mXM7jBX+fjHtBvvh06RBlcweMhKD8jWqQw0G78hOW5tpVALGHGFPsBV+ot2H+pdDGJy6CV8pA==} + peerDependencies: + eslint: ^9.5.0 + + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-context@0.1.9: + resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + + eslint-parser-plain@0.1.1: + resolution: {integrity: sha512-KRgd6wuxH4U8kczqPp+Oyk4irThIhHWxgFgLDtpgjUGVIS3wGrJntvZW/p6hHq1T4FOwnOtCNkvAI4Kr+mQ/Hw==} + + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + + eslint-plugin-import-x@4.16.1: + resolution: {integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/utils': ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + eslint-import-resolver-node: '*' + peerDependenciesMeta: + '@typescript-eslint/utils': + optional: true + eslint-import-resolver-node: + optional: true + + eslint-plugin-n@17.23.1: + resolution: {integrity: sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.23.0' + + eslint-plugin-prettier@5.5.4: + resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-unicorn@62.0.0: + resolution: {integrity: sha512-HIlIkGLkvf29YEiS/ImuDZQbP12gWyx5i3C6XrRxMvVdqMroCI9qoVYCoIl17ChN+U89pn9sVwLxhIWj5nEc7g==} + engines: {node: ^20.10.0 || >=21.0.0} + peerDependencies: + eslint: '>=9.38.0' + + eslint-plugin-vue@10.6.2: + resolution: {integrity: sha512-nA5yUs/B1KmKzvC42fyD0+l9Yd+LtEpVhWRbXuDj0e+ZURcTtyRbMDWUeJmTAh2wC6jC83raS63anNM2YT3NPw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + '@typescript-eslint/parser': ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + vue-eslint-parser: ^10.0.0 + peerDependenciesMeta: + '@stylistic/eslint-plugin': + optional: true + '@typescript-eslint/parser': + optional: true + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + evtd@0.2.4: + resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==} + + execa@9.6.0: + resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} + engines: {node: ^18.19.0 || >=20.5.0} + + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + + expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + + extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + file-saver@2.0.5: + resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} + + file64@1.0.5: + resolution: {integrity: sha512-GQLvUJk6RIMUJhULultcZ5cQfKUIgcBWmiYdVMXAAljhNJAmEj+H16LGiaR5ZbF+XEBm4CGjVFv5FzuL6EeceA==} + engines: {node: '>=18'} + + fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatbuffers@1.12.0: + resolution: {integrity: sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + + get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + + giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + hasBin: true + + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + good-listener@1.2.2: + resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + guid-typescript@1.0.9: + resolution: {integrity: sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + + has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + + has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + + has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + hotkeys-js@3.13.15: + resolution: {integrity: sha512-gHh8a/cPTCpanraePpjRxyIlxDFrIhYqjuh01UHWEwDpglJKCnvLW8kqSx5gQtOuSsJogNZXLhOdbSExpgUiqg==} + + htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + icss-replace-symbols@1.1.0: + resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + iota-array@1.0.0: + resolution: {integrity: sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==} + + is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-builtin-module@5.0.0: + resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} + engines: {node: '>=18.20'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + + is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-there@4.5.2: + resolution: {integrity: sha512-ixMkfz3rtS1vEsLf0TjgjqUn96Q0ukpUVDMnPYVocJyTzu2G/QgEtqYddcHZawHO+R31cKVPggJmBLrm1vJCOg==} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-base64@2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsbarcode@3.12.1: + resolution: {integrity: sha512-QZQSqIknC2Rr/YOUyOkCBqsoiBAOTYK+7yNN3JsqfoUtJtkazxNw1dmPpxuv7VVvqW13kA3/mKiLq+s/e3o9hQ==} + + jsencrypt@3.5.4: + resolution: {integrity: sha512-kNjfYEMNASxrDGsmcSQh/rUTmcoRfSUkxnAz+MMywM8jtGu+fFEZ3nJjHM58zscVnwR0fYmG9sGkTDjqUdpiwA==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + katex@0.16.27: + resolution: {integrity: sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + + kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + langium@3.3.1: + resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} + engines: {node: '>=16.0.0'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lib0@0.2.115: + resolution: {integrity: sha512-noaW4yNp6hCjOgDnWWxW0vGXE3kZQI5Kqiwz+jIWXavI9J9WyfJ9zjsbQlQlgjIbHBrvlA/x3TSIXBUJj+0L6g==} + engines: {node: '>=16'} + hasBin: true + + lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + linkifyjs@4.3.2: + resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} + + loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + + loadjs@4.3.0: + resolution: {integrity: sha512-vNX4ZZLJBeDEOBvdr2v/F+0aN5oMuPu7JTqrMwp+DtgK+AryOlpy6Xtm2/HpNr+azEa828oQjOtWsB6iDtSfSQ==} + + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + + localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash-es@4.17.22: + resolution: {integrity: sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + lowlight@3.3.0: + resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.3.4: + resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + merge-options@1.0.1: + resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==} + engines: {node: '>=4'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mermaid@11.12.2: + resolution: {integrity: sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==} + + micromatch@3.1.0: + resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==} + engines: {node: '>=0.10.0'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + naive-ui@2.43.2: + resolution: {integrity: sha512-YlLMnGrwGTOc+zMj90sG3ubaH5/7czsgLgGcjTLA981IUaz8r6t4WIujNt8r9PNr+dqv6XNEr0vxkARgPPjfBQ==} + peerDependencies: + vue: ^3.0.0 + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + + nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + ndarray@1.0.19: + resolution: {integrity: sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-check-updates@19.2.0: + resolution: {integrity: sha512-XSIuL0FNgzXPDZa4lje7+OwHjiyEt84qQm6QMsQRbixNY5EHEM9nhgOjxjlK9jIbN+ysvSqOV8DKNS0zydwbdg==} + engines: {node: '>=20.0.0', npm: '>=8.12.1'} + hasBin: true + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nypm@0.6.2: + resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + + nzh@1.0.14: + resolution: {integrity: sha512-wKgaqCSZdrySvB4RWop5g+v6IDv2IErsT6rjq06Bg0yiT9hiHYZO12GMGx/xweGVLcO2lDjX5RqWD0S/Jy9z5Q==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + onnxruntime-common@1.18.0: + resolution: {integrity: sha512-lufrSzX6QdKrktAELG5x5VkBpapbCeS3dQwrXbN0eD9rHvU0yAWl7Ztju9FvgAKWvwd/teEKJNj3OwM6eTZh3Q==} + + onnxruntime-web@1.18.0: + resolution: {integrity: sha512-o1UKj4ABIj1gmG7ae0RKJ3/GT+3yoF0RRpfDfeoe0huzRW4FDRLfbkDETmdFAvnJEXuYDE0YT+hhkia0352StQ==} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + + pathe@0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pdfjs-dist@5.4.296: + resolution: {integrity: sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==} + engines: {node: '>=20.16.0 || >=22.3.0'} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + perfect-debounce@2.0.0: + resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pinia@3.0.4: + resolution: {integrity: sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==} + peerDependencies: + typescript: '>=4.5.0' + vue: ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + platform@1.3.6: + resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + plyr@3.8.3: + resolution: {integrity: sha512-0+iI5uw0WRvtKBpgPCkmQQv7ucHVQKTEo6UFJjgJ8cy/JZhy0dQqshHQVitHXV6l2O3MzhgnuvQ95VSkWcWeSw==} + + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + + posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-prefix-selector@1.16.1: + resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==} + peerDependencies: + postcss: '>4 <9' + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@5.2.18: + resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} + engines: {node: '>=0.12'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + posthtml-parser@0.2.1: + resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==} + + posthtml-rename-id@1.0.12: + resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==} + + posthtml-render@1.4.0: + resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==} + engines: {node: '>=10'} + + posthtml-svg-mode@1.0.3: + resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==} + + posthtml@0.9.2: + resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==} + engines: {node: '>=0.10.0'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier-plugin-json-sort@0.0.2: + resolution: {integrity: sha512-xd5VVfneeUBdWhTm5uh0rAto3qnkkosbte6poO5WVTZEAiQdndMQMRPv1SROXx968zfyAlS+Z+C6rkr4jbVOgg==} + peerDependencies: + prettier: '>=2.0.0' + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + prettier@3.7.4: + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + engines: {node: '>=14'} + hasBin: true + + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prosemirror-changeset@2.3.1: + resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==} + + prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + + prosemirror-commands@1.7.1: + resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} + + prosemirror-dropcursor@1.8.2: + resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + + prosemirror-gapcursor@1.4.0: + resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==} + + prosemirror-history@1.5.0: + resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + + prosemirror-inputrules@1.5.1: + resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} + + prosemirror-keymap@1.2.3: + resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} + + prosemirror-markdown@1.13.2: + resolution: {integrity: sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==} + + prosemirror-menu@1.2.5: + resolution: {integrity: sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==} + + prosemirror-model@1.25.4: + resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} + + prosemirror-schema-basic@1.2.4: + resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} + + prosemirror-schema-list@1.5.1: + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} + + prosemirror-state@1.4.4: + resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} + + prosemirror-tables@1.8.4: + resolution: {integrity: sha512-CGr2BK5sLdZx+ARbeLO4HBZYa3qSG3FmwOVmzYs0Zp7n5SkrGqj+1CeNuubFNZEr64yMAQ20SanbFyIyHWZc8w==} + + prosemirror-trailing-node@3.0.0: + resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} + peerDependencies: + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + + prosemirror-transform@1.10.5: + resolution: {integrity: sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==} + + prosemirror-view@1.41.4: + resolution: {integrity: sha512-WkKgnyjNncri03Gjaz3IFWvCAE94XoiEgvtr0/r2Xw7R8/IjK3sKLSiDoCHWcsXSAinVaKlGRZDvMCsF1kbzjA==} + + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-svg-code@1.0.6: + resolution: {integrity: sha512-uxq2BMTdnKW7jDghpLJrczCd9KDOdyghFtEEpfomqMJkUM83/N+W7sFJPJ3AxBf0mJ3xtxAycl6NW8p6F53jEw==} + + qrcode-svg@1.1.0: + resolution: {integrity: sha512-XyQCIXux1zEIA3NPb0AeR8UMYvXZzWEhgdBgBjH9gO7M48H9uoHzviNz8pXw3UzrAcxRRRn9gxHewAVK7bn9qw==} + hasBin: true + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + + query-string@4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} + engines: {node: '>=0.10.0'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + rangetouch@2.0.1: + resolution: {integrity: sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==} + + rate-limiter-flexible@5.0.5: + resolution: {integrity: sha512-+/dSQfo+3FYwYygUs/V2BBdwGa9nFtakDwKt4l0bnvNB53TNT++QSFewwHX9qXrZJuMe9j+TUaU21lm5ARgqdQ==} + + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + + rd@2.0.1: + resolution: {integrity: sha512-/XdKU4UazUZTXFmI0dpABt8jSXPWcEyaGdk340KdHnsEOdkTctlX23aAK7ChQDn39YGNlAJr1M5uvaKt4QnpNw==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + recast@0.23.9: + resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} + engines: {node: '>= 4'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + hasBin: true + + repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@6.1.2: + resolution: {integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==} + engines: {node: 20 || >=22} + hasBin: true + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@4.54.0: + resolution: {integrity: sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass@1.97.1: + resolution: {integrity: sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A==} + engines: {node: '>=14.0.0'} + hasBin: true + + seemly@0.3.10: + resolution: {integrity: sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q==} + + select@1.1.2: + resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + sign-canvas-plus@2.0.3: + resolution: {integrity: sha512-EHcE9Z8SATs5UvQC/G5zLGmdznlepaar552i/w6W81+893NizjNEMUxXPaB46fEpwq/M+8T1C4BnTSk4NtpJsA==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-git-hooks@2.13.1: + resolution: {integrity: sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ==} + hasBin: true + + simplebar-core@1.3.2: + resolution: {integrity: sha512-qKgTTuTqapjsFGkNhCjyPhysnbZGpQqNmjk0nOYjFN5ordC/Wjvg+RbYCyMSnW60l/Z0ZS82GbNltly6PMUH1w==} + + simplebar-vue@2.4.2: + resolution: {integrity: sha512-QQKzQ6wQdld5Nwop4Bfd7hitzmWqwfhRaJbtgan/xu7V6WcvspXrAH9fapJNH2Lqny34P43m4rRREp97NcdiiQ==} + peerDependencies: + vue: '>=2.5.17' + + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + smooth-signature@1.1.0: + resolution: {integrity: sha512-wXBsbWmGxtNPftE7RoCWl5VrFkTT2hxT6/rJHQLOMviVeHB3B38+rh7F41Vd1Zwy9P+568ZDyutN/GWk1VfD+w==} + + snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + + snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + + snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + + stable-hash-x@0.2.0: + resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} + engines: {node: '>=12.0.0'} + + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + streamsaver@2.0.6: + resolution: {integrity: sha512-LK4e7TfCV8HzuM0PKXuVUfKyCB1FtT9L0EGxsFk5Up8njj0bXK8pJM9+Wq2Nya7/jslmCQwRK39LFm55h7NBTw==} + + strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-indent@4.1.1: + resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + svelte-eslint-parser@1.4.1: + resolution: {integrity: sha512-1eqkfQ93goAhjAXxZiu1SaKI9+0/sxp4JIWQwUpsz7ybehRE5L8dNuz7Iry7K22R47p5/+s9EM+38nHV2OlgXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.24.0} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + svg-baker@1.7.0: + resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==} + + svg64@2.0.0: + resolution: {integrity: sha512-EVgAisxMctUNDSjKGFcx4tkcFrvdqtLIy/MdbBdqcwfpPwsBcwoSKQi+WYoc82c4XWFNVVIwpCup3rpY+M9KJw==} + + svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + engines: {node: ^14.18.0 || >=16.0.0} + + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tippy.js@6.3.7: + resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} + + to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + + to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + traverse@0.6.11: + resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==} + engines: {node: '>= 0.4'} + + treemate@0.3.11: + resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-declaration-location@1.0.7: + resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} + peerDependencies: + typescript: '>=4.0.0' + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typed-css-modules@0.9.1: + resolution: {integrity: sha512-W2HWKncdKd+bLWsnuWB2EyuQBzZ7KJ9Byr/67KLiiyGegcN52rOveun9JR8yAvuL5IXunRMxt0eORMtAUj5bmA==} + engines: {node: '>=18.0.0'} + hasBin: true + + typedarray.prototype.slice@1.0.5: + resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==} + engines: {node: '>= 0.4'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + unconfig-core@7.4.2: + resolution: {integrity: sha512-VgPCvLWugINbXvMQDf8Jh0mlbvNjNC6eSUziHsBCMpxR05OPrNrvDnyatdMjRgcHaaNsCqz+wjNXxNw1kRLHUg==} + + unconfig@7.4.2: + resolution: {integrity: sha512-nrMlWRQ1xdTjSnSUqvYqJzbTBFugoqHobQj58B2bc8qxHKBBHMNNsWQFP3Cd3/JZK907voM2geYPWqD4VK3MPQ==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unplugin-icons@22.5.0: + resolution: {integrity: sha512-MBlMtT5RuMYZy4TZgqUL2OTtOdTUVsS1Mhj6G1pEzMlFJlEnq6mhUfoIt45gBWxHcsOdXJDWLg3pRZ+YmvAVWQ==} + peerDependencies: + '@svgr/core': '>=7.0.0' + '@svgx/core': ^1.0.1 + '@vue/compiler-sfc': ^3.0.2 || ^2.7.0 + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 + vue-template-compiler: ^2.6.12 + vue-template-es2015-compiler: ^1.9.0 + peerDependenciesMeta: + '@svgr/core': + optional: true + '@svgx/core': + optional: true + '@vue/compiler-sfc': + optional: true + svelte: + optional: true + vue-template-compiler: + optional: true + vue-template-es2015-compiler: + optional: true + + unplugin-utils@0.3.1: + resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} + engines: {node: '>=20.19.0'} + + unplugin-vue-components@30.0.0: + resolution: {integrity: sha512-4qVE/lwCgmdPTp6h0qsRN2u642tt4boBQtcpn4wQcWZAsr8TQwq+SPT3NDu/6kBFxzo/sSEK4ioXhOOBrXc3iw==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 || ^4.0.0 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + + unplugin@1.12.0: + resolution: {integrity: sha512-KeczzHl2sATPQUx1gzo+EnUkmN4VmGBYRRVOZSGvGITE9rGHRDGqft6ONceP3vgXcyJ2XjX5axG5jMWUwNCYLw==} + engines: {node: '>=14.0.0'} + + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + + unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + url-polyfill@1.1.14: + resolution: {integrity: sha512-p4f3TTAG6ADVF3mwbXw7hGw+QJyw5CnNGvYh5fCuQQZIiuKUswqcznyV3pGDP9j0TSmC4UvRKm8kl1QsX1diiQ==} + + use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vdirs@0.1.8: + resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==} + peerDependencies: + vue: ^3.0.11 + + vite-dev-rpc@1.1.0: + resolution: {integrity: sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 + + vite-hot-client@2.1.0: + resolution: {integrity: sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + + vite-plugin-inspect@11.3.3: + resolution: {integrity: sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + vite-plugin-progress@0.0.7: + resolution: {integrity: sha512-zyvKdcc/X+6hnw3J1HVV1TKrlFKC4Rh8GnDnWG/2qhRXjqytTcM++xZ+SAPnoDsSyWl8O93ymK0wZRgHAoglEQ==} + engines: {node: '>=14', pnpm: '>=7.0.0'} + peerDependencies: + vite: '>2.0.0-0' + + vite-plugin-svg-icons@2.0.1: + resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==} + peerDependencies: + vite: '>=2.0.0' + + vite-plugin-vue-devtools@8.0.5: + resolution: {integrity: sha512-p619BlKFOqQXJ6uDWS1vUPQzuJOD6xJTfftj57JXBGoBD/yeQCowR7pnWcr/FEX4/HVkFbreI6w2uuGBmQOh6A==} + engines: {node: '>=v14.21.3'} + peerDependencies: + vite: ^6.0.0 || ^7.0.0-0 + + vite-plugin-vue-inspector@5.3.2: + resolution: {integrity: sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==} + peerDependencies: + vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + + vite@7.3.0: + resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vooks@0.2.12: + resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==} + peerDependencies: + vue: ^3.0.0 + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-advanced-cropper@2.8.9: + resolution: {integrity: sha512-1jc5gO674kVGpJKekoaol6ZlwaF5VYDLSBwBOUpViW0IOrrRsyLw6XNszjEqgbavvqinlKNS6Kqlom3B5M72Tw==} + engines: {node: '>=8', npm: '>=5'} + peerDependencies: + vue: ^3.0.0 + + vue-demi@0.13.11: + resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-draggable-plus@0.6.0: + resolution: {integrity: sha512-G5TSfHrt9tX9EjdG49InoFJbt2NYk0h3kgjgKxkFWr3ulIUays0oFObr5KZ8qzD4+QnhtALiRwIqY6qul4egqw==} + peerDependencies: + '@types/sortablejs': ^1.15.0 + '@vue/composition-api': '*' + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-eslint-parser@10.2.0: + resolution: {integrity: sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + vue-flow-layout@0.2.0: + resolution: {integrity: sha512-zKgsWWkXq0xrus7H4Mc+uFs1ESrmdTXlO0YNbR6wMdPaFvosL3fMB8N7uTV308UhGy9UvTrGhIY7mVz9eN+L0Q==} + + vue-i18n@10.0.8: + resolution: {integrity: sha512-mIjy4utxMz9lMMo6G9vYePv7gUFt4ztOMhY9/4czDJxZ26xPeJ49MAGa9wBAE3XuXbYCrtVPmPxNjej7JJJkZQ==} + engines: {node: '>= 16'} + peerDependencies: + vue: ^3.0.0 + + vue-i18n@11.2.7: + resolution: {integrity: sha512-LPv8bAY5OA0UvFEXl4vBQOBqJzRrlExy92tWgRuwW7tbykHf7CH71G2Y4TM2OwGcIS4+hyqKHS2EVBqaYwPY9Q==} + engines: {node: '>= 16'} + peerDependencies: + vue: ^3.0.0 + + vue-router@4.6.4: + resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} + peerDependencies: + vue: ^3.5.0 + + vue-tsc@3.2.1: + resolution: {integrity: sha512-I23Rk8dkQfmcSbxDO0dmg9ioMLjKA1pjlU3Lz6Jfk2pMGu3Uryu9810XkcZH24IzPbhzPCnkKo2rEMRX0skSrw==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.26: + resolution: {integrity: sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vueuc@0.4.65: + resolution: {integrity: sha512-lXuMl+8gsBmruudfxnMF9HW4be8rFziylXFu1VHVNbLVhRTXXV4njvpRuJapD/8q+oFEMSfQMH16E/85VoWRyQ==} + peerDependencies: + vue: ^3.0.11 + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + y-prosemirror@1.3.7: + resolution: {integrity: sha512-NpM99WSdD4Fx4if5xOMDpPtU3oAmTSjlzh5U4353ABbRHl1HtAFUx6HlebLZfyFxXN9jzKMDkVbcRjqOZVkYQg==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + prosemirror-model: ^1.7.1 + prosemirror-state: ^1.2.3 + prosemirror-view: ^1.9.10 + y-protocols: ^1.0.1 + yjs: ^13.5.38 + + y-protocols@1.0.7: + resolution: {integrity: sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + yjs: ^13.0.0 + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yjs@13.6.28: + resolution: {integrity: sha512-EgnDOXs8+hBVm6mq3/S89Kiwzh5JRbn7w2wXwbrMRyKy/8dOFsLvuIfC+x19ZdtaDc0tA9rQmdZzbqqNHG44wA==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zod@4.2.1: + resolution: {integrity: sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==} + + zrender@5.6.1: + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + + zrender@6.0.0: + resolution: {integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==} + +snapshots: + + '@alova/mock@2.0.18(alova@3.4.1)': + dependencies: + '@alova/shared': 1.3.2 + alova: 3.4.1 + + '@alova/shared@1.3.2': {} + + '@antfu/eslint-define-config@1.23.0-2': {} + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.6.0 + tinyexec: 1.0.2 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@better-scroll/core@2.5.1': + dependencies: + '@better-scroll/shared-utils': 2.5.1 + + '@better-scroll/shared-utils@2.5.1': {} + + '@braintree/sanitize-url@7.1.1': {} + + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/regexp-to-ast@11.0.3': {} + + '@chevrotain/types@11.0.3': {} + + '@chevrotain/utils@11.0.3': {} + + '@css-render/plugin-bem@0.15.14(css-render@0.15.14)': + dependencies: + css-render: 0.15.14 + + '@css-render/vue3-ssr@0.15.14(vue@3.5.26(typescript@5.9.3))': + dependencies: + vue: 3.5.26(typescript@5.9.3) + + '@elegant-router/core@0.3.8': + dependencies: + chokidar: 3.6.0 + consola: 3.2.3 + fast-glob: 3.3.2 + kolorist: 1.8.0 + micromatch: 4.0.7 + + '@elegant-router/vue@0.3.8': + dependencies: + '@elegant-router/core': 0.3.8 + consola: 3.2.3 + kolorist: 1.8.0 + magic-string: 0.30.11 + magicast: 0.3.4 + prettier: 3.3.3 + recast: 0.23.9 + unplugin: 1.12.0 + + '@emnapi/core@1.7.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.7.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emotion/hash@0.8.0': {} + + '@esbuild/aix-ppc64@0.27.2': + optional: true + + '@esbuild/android-arm64@0.27.2': + optional: true + + '@esbuild/android-arm@0.27.2': + optional: true + + '@esbuild/android-x64@0.27.2': + optional: true + + '@esbuild/darwin-arm64@0.27.2': + optional: true + + '@esbuild/darwin-x64@0.27.2': + optional: true + + '@esbuild/freebsd-arm64@0.27.2': + optional: true + + '@esbuild/freebsd-x64@0.27.2': + optional: true + + '@esbuild/linux-arm64@0.27.2': + optional: true + + '@esbuild/linux-arm@0.27.2': + optional: true + + '@esbuild/linux-ia32@0.27.2': + optional: true + + '@esbuild/linux-loong64@0.27.2': + optional: true + + '@esbuild/linux-mips64el@0.27.2': + optional: true + + '@esbuild/linux-ppc64@0.27.2': + optional: true + + '@esbuild/linux-riscv64@0.27.2': + optional: true + + '@esbuild/linux-s390x@0.27.2': + optional: true + + '@esbuild/linux-x64@0.27.2': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': + optional: true + + '@esbuild/netbsd-x64@0.27.2': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.6.1))': + dependencies: + eslint: 9.39.2(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/compat@1.4.1(eslint@9.39.2(jiti@2.6.1))': + dependencies: + '@eslint/core': 0.17.0 + optionalDependencies: + eslint: 9.39.2(jiti@2.6.1) + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.2': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@iconify/json@2.2.417': + dependencies: + '@iconify/types': 2.0.0 + pathe: 2.0.3 + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.1.0': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/types': 2.0.0 + mlly: 1.8.0 + + '@iconify/vue@5.0.0(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@iconify/types': 2.0.0 + vue: 3.5.26(typescript@5.9.3) + + '@imgly/background-removal@1.5.5': + dependencies: + '@types/lodash-es': 4.17.12 + '@types/ndarray': 1.0.14 + '@types/node': 20.3.3 + lodash-es: 4.17.22 + ndarray: 1.0.19 + onnxruntime-web: 1.18.0 + zod: 3.25.76 + + '@intlify/core-base@10.0.8': + dependencies: + '@intlify/message-compiler': 10.0.8 + '@intlify/shared': 10.0.8 + + '@intlify/core-base@11.2.7': + dependencies: + '@intlify/message-compiler': 11.2.7 + '@intlify/shared': 11.2.7 + + '@intlify/message-compiler@10.0.8': + dependencies: + '@intlify/shared': 10.0.8 + source-map-js: 1.2.1 + + '@intlify/message-compiler@11.2.7': + dependencies: + '@intlify/shared': 11.2.7 + source-map-js: 1.2.1 + + '@intlify/shared@10.0.8': {} + + '@intlify/shared@11.2.7': {} + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@juggle/resize-observer@3.4.0': {} + + '@mermaid-js/parser@0.6.3': + dependencies: + langium: 3.3.1 + + '@napi-rs/canvas-android-arm64@0.1.86': + optional: true + + '@napi-rs/canvas-darwin-arm64@0.1.86': + optional: true + + '@napi-rs/canvas-darwin-x64@0.1.86': + optional: true + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.86': + optional: true + + '@napi-rs/canvas-linux-arm64-gnu@0.1.86': + optional: true + + '@napi-rs/canvas-linux-arm64-musl@0.1.86': + optional: true + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.86': + optional: true + + '@napi-rs/canvas-linux-x64-gnu@0.1.86': + optional: true + + '@napi-rs/canvas-linux-x64-musl@0.1.86': + optional: true + + '@napi-rs/canvas-win32-arm64-msvc@0.1.86': + optional: true + + '@napi-rs/canvas-win32-x64-msvc@0.1.86': + optional: true + + '@napi-rs/canvas@0.1.86': + optionalDependencies: + '@napi-rs/canvas-android-arm64': 0.1.86 + '@napi-rs/canvas-darwin-arm64': 0.1.86 + '@napi-rs/canvas-darwin-x64': 0.1.86 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.86 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.86 + '@napi-rs/canvas-linux-arm64-musl': 0.1.86 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.86 + '@napi-rs/canvas-linux-x64-gnu': 0.1.86 + '@napi-rs/canvas-linux-x64-musl': 0.1.86 + '@napi-rs/canvas-win32-arm64-msvc': 0.1.86 + '@napi-rs/canvas-win32-x64-msvc': 0.1.86 + optional: true + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.2.9': {} + + '@polka/url@1.0.0-next.29': {} + + '@popperjs/core@2.11.8': {} + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + + '@remirror/core-constants@3.0.0': {} + + '@rolldown/pluginutils@1.0.0-beta.53': {} + + '@rolldown/pluginutils@1.0.0-beta.56': {} + + '@rollup/rollup-android-arm-eabi@4.54.0': + optional: true + + '@rollup/rollup-android-arm64@4.54.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.54.0': + optional: true + + '@rollup/rollup-darwin-x64@4.54.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.54.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.54.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.54.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.54.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.54.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.54.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.54.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.54.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.54.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.54.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.54.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.54.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.54.0': + optional: true + + '@sec-ant/readable-stream@0.4.1': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@soybeanjs/changelog@0.3.25(@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(@unocss/eslint-config@66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))))(eslint@9.39.2(jiti@2.6.1))(svelte-eslint-parser@1.4.1)(typescript@5.9.3)(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1)))': + dependencies: + '@soybeanjs/eslint-config': 1.7.4(@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(@unocss/eslint-config@66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))))(eslint@9.39.2(jiti@2.6.1))(svelte-eslint-parser@1.4.1)(typescript@5.9.3)(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))) + cli-progress: 3.12.0 + convert-gitmoji: 0.1.5 + dayjs: 1.11.15 + execa: 9.6.0 + ofetch: 1.4.1 + semver: 7.7.2 + transitivePeerDependencies: + - '@toml-tools/parser' + - '@types/eslint' + - '@typescript-eslint/utils' + - '@unocss/eslint-config' + - eslint + - eslint-import-resolver-node + - eslint-plugin-astro + - eslint-plugin-react + - eslint-plugin-react-hooks + - eslint-plugin-react-native + - eslint-plugin-react-refresh + - eslint-plugin-solid + - eslint-plugin-svelte + - eslint-plugin-vue + - prettier-plugin-astro + - prettier-plugin-svelte + - prettier-plugin-toml + - supports-color + - svelte-eslint-parser + - typescript + - vue-eslint-parser + + '@soybeanjs/eslint-config@1.7.4(@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(@unocss/eslint-config@66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))))(eslint@9.39.2(jiti@2.6.1))(svelte-eslint-parser@1.4.1)(typescript@5.9.3)(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1)))': + dependencies: + '@antfu/eslint-define-config': 1.23.0-2 + '@antfu/install-pkg': 1.1.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@typescript-eslint/eslint-plugin': 8.50.1(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + eslint-config-flat-gitignore: 2.1.0(eslint@9.39.2(jiti@2.6.1)) + eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + eslint-parser-plain: 0.1.1 + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-n: 17.23.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-prettier: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@3.7.4) + eslint-plugin-unicorn: 62.0.0(eslint@9.39.2(jiti@2.6.1)) + globals: 16.5.0 + local-pkg: 1.1.2 + prettier: 3.7.4 + prettier-plugin-json-sort: 0.0.2(prettier@3.7.4) + prompts: 2.4.2 + svelte-eslint-parser: 1.4.1 + typescript: 5.9.3 + optionalDependencies: + '@unocss/eslint-config': 66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-vue: 10.6.2(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))) + vue-eslint-parser: 10.2.0(eslint@9.39.2(jiti@2.6.1)) + transitivePeerDependencies: + - '@types/eslint' + - '@typescript-eslint/utils' + - eslint-import-resolver-node + - supports-color + + '@tato30/vue-pdf@1.11.5(vue@3.5.26(typescript@5.9.3))': + dependencies: + pdfjs-dist: 5.4.296 + vue: 3.5.26(typescript@5.9.3) + + '@tiptap-extend/columns@2.1.6(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + tslib: 2.8.1 + + '@tiptap/core@2.11.5(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-blockquote@2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-bold@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-bubble-menu@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + tippy.js: 6.3.7 + + '@tiptap/extension-bullet-list@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-character-count@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-code-block-lowlight@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/extension-code-block@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(highlight.js@11.11.1)(lowlight@3.3.0)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/extension-code-block': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + highlight.js: 11.11.1 + lowlight: 3.3.0 + + '@tiptap/extension-code-block@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-code@2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-collaboration@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + y-prosemirror: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28) + + '@tiptap/extension-color@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/extension-text-style@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/extension-text-style': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + + '@tiptap/extension-document@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-dropcursor@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-floating-menu@2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + tippy.js: 6.3.7 + + '@tiptap/extension-focus@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-font-family@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/extension-text-style@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/extension-text-style': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + + '@tiptap/extension-gapcursor@2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-hard-break@2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-heading@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-highlight@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-history@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-horizontal-rule@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-image@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-italic@2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-link@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + linkifyjs: 4.3.2 + + '@tiptap/extension-list-item@2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-mention@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(@tiptap/suggestion@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + '@tiptap/suggestion': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + + '@tiptap/extension-ordered-list@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-paragraph@2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-placeholder@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-strike@2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-subscript@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-superscript@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-table-cell@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-table-header@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-table-row@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-table@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-task-item@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-task-list@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-text-align@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-text-style@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-text@2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-typography@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-underline@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/pm@2.11.5': + dependencies: + prosemirror-changeset: 2.3.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.4.0 + prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-markdown: 1.13.2 + prosemirror-menu: 1.2.5 + prosemirror-model: 1.25.4 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.4 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4) + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + + '@tiptap/starter-kit@2.11.5': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/extension-blockquote': 2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-bold': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-bullet-list': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-code': 2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-code-block': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-document': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-dropcursor': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-gapcursor': 2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-hard-break': 2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-heading': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-history': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-horizontal-rule': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-italic': 2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-list-item': 2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-ordered-list': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-paragraph': 2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-strike': 2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-text': 2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-text-style': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/pm': 2.11.5 + + '@tiptap/suggestion@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/vue-3@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/extension-bubble-menu': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-floating-menu': 2.27.1(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + vue: 3.5.26(typescript@5.9.3) + + '@tool-belt/type-predicates@1.4.1': {} + + '@trysound/sax@0.2.0': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/crypto-js@4.2.2': {} + + '@types/d3-array@3.2.2': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.2 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.7': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.3': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-shape@3.1.7': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + + '@types/estree@1.0.8': {} + + '@types/geojson@7946.0.16': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/katex@0.16.7': {} + + '@types/linkify-it@5.0.0': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.21 + + '@types/lodash@4.17.21': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdurl@2.0.0': {} + + '@types/ndarray@1.0.14': {} + + '@types/node@10.17.60': {} + + '@types/node@20.3.3': {} + + '@types/node@25.0.3': + dependencies: + undici-types: 7.16.0 + + '@types/nprogress@0.2.3': {} + + '@types/qs@6.14.0': {} + + '@types/sortablejs@1.15.9': {} + + '@types/streamsaver@2.0.5': {} + + '@types/svg64@1.1.2': {} + + '@types/svgo@2.6.4': + dependencies: + '@types/node': 25.0.3 + + '@types/trusted-types@2.0.7': + optional: true + + '@types/unist@3.0.3': {} + + '@types/web-bluetooth@0.0.20': {} + + '@types/web-bluetooth@0.0.21': {} + + '@typescript-eslint/eslint-plugin@8.50.1(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.50.1 + '@typescript-eslint/type-utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.50.1 + eslint: 9.39.2(jiti@2.6.1) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.50.1 + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.50.1 + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.50.1(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3) + '@typescript-eslint/types': 8.50.1 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.50.1': + dependencies: + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/visitor-keys': 8.50.1 + + '@typescript-eslint/tsconfig-utils@8.50.1(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.50.1': {} + + '@typescript-eslint/typescript-estree@8.50.1(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.50.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3) + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/visitor-keys': 8.50.1 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.50.1 + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.50.1': + dependencies: + '@typescript-eslint/types': 8.50.1 + eslint-visitor-keys: 4.2.1 + + '@umoteam/editor-external@8.1.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@umoteam/editor': 8.1.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + '@umoteam/viewer': 0.1.9(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - prosemirror-model + - prosemirror-state + - prosemirror-view + - typescript + - vue + + '@umoteam/editor-external@9.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@umoteam/editor': 9.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + '@umoteam/viewer': 0.3.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - prosemirror-model + - prosemirror-state + - prosemirror-view + - typescript + - vue + + '@umoteam/editor@8.1.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@eslint/object-schema': 2.1.7 + '@imgly/background-removal': 1.5.5 + '@tiptap-extend/columns': 2.1.6(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(prosemirror-model@1.25.4)(prosemirror-state@1.4.4) + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/extension-bold': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-bubble-menu': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-bullet-list': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-character-count': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-code-block': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-code-block-lowlight': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/extension-code-block@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(highlight.js@11.11.1)(lowlight@3.3.0) + '@tiptap/extension-collaboration': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28)) + '@tiptap/extension-color': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/extension-text-style@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))) + '@tiptap/extension-document': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-dropcursor': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-focus': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-font-family': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/extension-text-style@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))) + '@tiptap/extension-heading': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-highlight': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-history': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-horizontal-rule': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-image': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-link': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-mention': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(@tiptap/suggestion@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)) + '@tiptap/extension-ordered-list': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-placeholder': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-subscript': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-superscript': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-table': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-table-cell': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-table-header': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-table-row': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-task-item': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-task-list': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-text-align': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-text-style': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-typography': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-underline': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/pm': 2.11.5 + '@tiptap/starter-kit': 2.11.5 + '@tiptap/suggestion': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/vue-3': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(vue@3.5.26(typescript@5.9.3)) + '@tool-belt/type-predicates': 1.4.1 + '@types/svg64': 1.1.2 + '@umoteam/editor-external': 8.1.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + '@umoteam/viewer': 0.1.9(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + '@vueuse/core': 11.3.0(vue@3.5.26(typescript@5.9.3)) + buffer-image-size: 0.6.4 + dom-to-image-more: 3.7.2 + es-drager: 1.2.11(vue@3.5.26(typescript@5.9.3)) + file-saver: 2.0.5 + file64: 1.0.5 + highlight.js: 11.11.1 + hotkeys-js: 3.13.15 + jsbarcode: 3.12.1 + katex: 0.16.27 + lowlight: 3.3.0 + mermaid: 11.12.2 + nzh: 1.0.14 + plyr: 3.8.3 + pretty-bytes: 6.1.1 + prosemirror-transform: 1.10.5 + qrcode-svg: 1.1.0 + sign-canvas-plus: 2.0.3(typescript@5.9.3) + smooth-signature: 1.1.0 + svg64: 2.0.0 + tippy.js: 6.3.7 + vue-i18n: 10.0.8(vue@3.5.26(typescript@5.9.3)) + y-prosemirror: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28) + y-protocols: 1.0.7(yjs@13.6.28) + yjs: 13.6.28 + transitivePeerDependencies: + - '@vue/composition-api' + - prosemirror-model + - prosemirror-state + - prosemirror-view + - typescript + - vue + + '@umoteam/editor@9.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@eslint/object-schema': 2.1.7 + '@imgly/background-removal': 1.5.5 + '@tiptap-extend/columns': 2.1.6(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(prosemirror-model@1.25.4)(prosemirror-state@1.4.4) + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/extension-bold': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-bubble-menu': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-bullet-list': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-character-count': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-code-block': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-code-block-lowlight': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/extension-code-block@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(highlight.js@11.11.1)(lowlight@3.3.0) + '@tiptap/extension-collaboration': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28)) + '@tiptap/extension-color': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/extension-text-style@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))) + '@tiptap/extension-document': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-dropcursor': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-focus': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-font-family': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/extension-text-style@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))) + '@tiptap/extension-heading': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-highlight': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-history': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-horizontal-rule': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-image': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-link': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-mention': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(@tiptap/suggestion@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)) + '@tiptap/extension-ordered-list': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-placeholder': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-subscript': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-superscript': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-table': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-table-cell': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-table-header': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-table-row': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-task-item': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-task-list': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-text-align': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-text-style': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-typography': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-underline': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/pm': 2.11.5 + '@tiptap/starter-kit': 2.11.5 + '@tiptap/suggestion': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/vue-3': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(vue@3.5.26(typescript@5.9.3)) + '@tool-belt/type-predicates': 1.4.1 + '@types/svg64': 1.1.2 + '@umoteam/editor-external': 9.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + '@umoteam/viewer': 0.3.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + '@vueuse/core': 11.3.0(vue@3.5.26(typescript@5.9.3)) + buffer-image-size: 0.6.4 + dom-to-image-more: 3.7.2 + es-drager: 1.2.11(vue@3.5.26(typescript@5.9.3)) + file-saver: 2.0.5 + file64: 1.0.5 + highlight.js: 11.11.1 + hotkeys-js: 3.13.15 + jsbarcode: 3.12.1 + katex: 0.16.27 + lowlight: 3.3.0 + mermaid: 11.12.2 + nzh: 1.0.14 + plyr: 3.8.3 + pretty-bytes: 6.1.1 + prosemirror-transform: 1.10.5 + pure-svg-code: 1.0.6 + sign-canvas-plus: 2.0.3(typescript@5.9.3) + smooth-signature: 1.1.0 + svg64: 2.0.0 + tippy.js: 6.3.7 + vue-i18n: 10.0.8(vue@3.5.26(typescript@5.9.3)) + y-prosemirror: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28) + y-protocols: 1.0.7(yjs@13.6.28) + yjs: 13.6.28 + transitivePeerDependencies: + - '@vue/composition-api' + - prosemirror-model + - prosemirror-state + - prosemirror-view + - typescript + - vue + + '@umoteam/viewer@0.1.9(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@tato30/vue-pdf': 1.11.5(vue@3.5.26(typescript@5.9.3)) + '@umoteam/editor': 8.1.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + '@vueuse/core': 13.9.0(vue@3.5.26(typescript@5.9.3)) + echarts: 5.6.0 + plyr: 3.8.3 + zod: 4.2.1 + transitivePeerDependencies: + - '@vue/composition-api' + - prosemirror-model + - prosemirror-state + - prosemirror-view + - typescript + - vue + + '@umoteam/viewer@0.3.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@tato30/vue-pdf': 1.11.5(vue@3.5.26(typescript@5.9.3)) + '@umoteam/editor': 8.1.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + '@vueuse/core': 13.9.0(vue@3.5.26(typescript@5.9.3)) + default-passive-events: 4.0.0 + echarts: 5.6.0 + plyr: 3.8.3 + zod: 4.2.1 + transitivePeerDependencies: + - '@vue/composition-api' + - prosemirror-model + - prosemirror-state + - prosemirror-view + - typescript + - vue + + '@unocss/config@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + unconfig: 7.4.2 + + '@unocss/core@66.5.10': {} + + '@unocss/eslint-config@66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@unocss/eslint-plugin': 66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@unocss/eslint-plugin@66.5.10(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@unocss/config': 66.5.10 + '@unocss/core': 66.5.10 + '@unocss/rule-utils': 66.5.10 + magic-string: 0.30.21 + synckit: 0.11.11 + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@unocss/extractor-arbitrary-variants@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + + '@unocss/inspector@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + '@unocss/rule-utils': 66.5.10 + colorette: 2.0.20 + gzip-size: 6.0.0 + sirv: 3.0.2 + vue-flow-layout: 0.2.0 + + '@unocss/preset-icons@66.5.10': + dependencies: + '@iconify/utils': 3.1.0 + '@unocss/core': 66.5.10 + ofetch: 1.5.1 + + '@unocss/preset-mini@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + '@unocss/extractor-arbitrary-variants': 66.5.10 + '@unocss/rule-utils': 66.5.10 + + '@unocss/preset-uno@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + '@unocss/preset-wind3': 66.5.10 + + '@unocss/preset-wind3@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + '@unocss/preset-mini': 66.5.10 + '@unocss/rule-utils': 66.5.10 + + '@unocss/rule-utils@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + magic-string: 0.30.21 + + '@unocss/transformer-directives@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + '@unocss/rule-utils': 66.5.10 + css-tree: 3.1.0 + + '@unocss/transformer-variant-group@66.5.10': + dependencies: + '@unocss/core': 66.5.10 + + '@unocss/vite@66.5.10(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))': + dependencies: + '@jridgewell/remapping': 2.3.5 + '@unocss/config': 66.5.10 + '@unocss/core': 66.5.10 + '@unocss/inspector': 66.5.10 + chokidar: 3.6.0 + magic-string: 0.30.21 + pathe: 2.0.3 + tinyglobby: 0.2.15 + unplugin-utils: 0.3.1 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true + + '@vitejs/plugin-vue-jsx@5.1.2(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + '@rolldown/pluginutils': 1.0.0-beta.56 + '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.28.5) + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vue: 3.5.26(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@6.0.3(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@rolldown/pluginutils': 1.0.0-beta.53 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vue: 3.5.26(typescript@5.9.3) + + '@volar/language-core@2.4.27': + dependencies: + '@volar/source-map': 2.4.27 + + '@volar/source-map@2.4.27': {} + + '@volar/typescript@2.4.27': + dependencies: + '@volar/language-core': 2.4.27 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/babel-helper-vue-transform-on@1.5.0': {} + + '@vue/babel-helper-vue-transform-on@2.0.1': {} + + '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.5)': + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@vue/babel-helper-vue-transform-on': 1.5.0 + '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.28.5) + '@vue/shared': 3.5.26 + optionalDependencies: + '@babel/core': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-jsx@2.0.1(@babel/core@7.28.5)': + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@vue/babel-helper-vue-transform-on': 2.0.1 + '@vue/babel-plugin-resolve-type': 2.0.1(@babel/core@7.28.5) + '@vue/shared': 3.5.26 + optionalDependencies: + '@babel/core': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.28.5)': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/parser': 7.28.5 + '@vue/compiler-sfc': 3.5.26 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.28.5)': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/parser': 7.28.5 + '@vue/compiler-sfc': 3.5.26 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.5.26': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.26 + entities: 7.0.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.26': + dependencies: + '@vue/compiler-core': 3.5.26 + '@vue/shared': 3.5.26 + + '@vue/compiler-sfc@3.5.26': + dependencies: + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.26 + '@vue/compiler-dom': 3.5.26 + '@vue/compiler-ssr': 3.5.26 + '@vue/shared': 3.5.26 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.26': + dependencies: + '@vue/compiler-dom': 3.5.26 + '@vue/shared': 3.5.26 + + '@vue/devtools-api@6.6.4': {} + + '@vue/devtools-api@7.7.9': + dependencies: + '@vue/devtools-kit': 7.7.9 + + '@vue/devtools-core@8.0.5(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@vue/devtools-kit': 8.0.5 + '@vue/devtools-shared': 8.0.5 + mitt: 3.0.1 + nanoid: 5.1.6 + pathe: 2.0.3 + vite-hot-client: 2.1.0(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + vue: 3.5.26(typescript@5.9.3) + transitivePeerDependencies: + - vite + + '@vue/devtools-kit@7.7.9': + dependencies: + '@vue/devtools-shared': 7.7.9 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-kit@8.0.5': + dependencies: + '@vue/devtools-shared': 8.0.5 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 2.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@7.7.9': + dependencies: + rfdc: 1.4.1 + + '@vue/devtools-shared@8.0.5': + dependencies: + rfdc: 1.4.1 + + '@vue/language-core@3.2.1': + dependencies: + '@volar/language-core': 2.4.27 + '@vue/compiler-dom': 3.5.26 + '@vue/shared': 3.5.26 + alien-signals: 3.1.1 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + picomatch: 4.0.3 + + '@vue/reactivity@3.5.26': + dependencies: + '@vue/shared': 3.5.26 + + '@vue/runtime-core@3.5.26': + dependencies: + '@vue/reactivity': 3.5.26 + '@vue/shared': 3.5.26 + + '@vue/runtime-dom@3.5.26': + dependencies: + '@vue/reactivity': 3.5.26 + '@vue/runtime-core': 3.5.26 + '@vue/shared': 3.5.26 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.26(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.26 + '@vue/shared': 3.5.26 + vue: 3.5.26(typescript@5.9.3) + + '@vue/shared@3.5.26': {} + + '@vueuse/core@11.3.0(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 11.3.0 + '@vueuse/shared': 11.3.0(vue@3.5.26(typescript@5.9.3)) + vue-demi: 0.14.10(vue@3.5.26(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/core@13.9.0(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 13.9.0 + '@vueuse/shared': 13.9.0(vue@3.5.26(typescript@5.9.3)) + vue: 3.5.26(typescript@5.9.3) + + '@vueuse/core@14.1.0(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.1.0 + '@vueuse/shared': 14.1.0(vue@3.5.26(typescript@5.9.3)) + vue: 3.5.26(typescript@5.9.3) + + '@vueuse/metadata@11.3.0': {} + + '@vueuse/metadata@13.9.0': {} + + '@vueuse/metadata@14.1.0': {} + + '@vueuse/shared@11.3.0(vue@3.5.26(typescript@5.9.3))': + dependencies: + vue-demi: 0.14.10(vue@3.5.26(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/shared@13.9.0(vue@3.5.26(typescript@5.9.3))': + dependencies: + vue: 3.5.26(typescript@5.9.3) + + '@vueuse/shared@14.1.0(vue@3.5.26(typescript@5.9.3))': + dependencies: + vue: 3.5.26(typescript@5.9.3) + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + alien-signals@3.1.1: {} + + alova@3.4.1: + dependencies: + '@alova/shared': 1.3.2 + rate-limiter-flexible: 5.0.5 + + ansi-colors@4.1.3: {} + + ansi-regex@2.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@2.2.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + ansis@4.2.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@2.0.1: {} + + args-tokenizer@0.3.0: {} + + arr-diff@4.0.0: {} + + arr-flatten@1.1.0: {} + + arr-union@3.1.0: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-unique@0.3.2: {} + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + assign-symbols@1.0.0: {} + + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + + async-function@1.0.0: {} + + async-validator@4.2.5: {} + + asynckit@0.4.0: {} + + atob@2.1.2: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axios-retry@4.5.0(axios@1.13.2): + dependencies: + axios: 1.13.2 + is-retry-allowed: 2.2.0 + + axios@1.13.2: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base@0.11.2: + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + + baseline-browser-mapping@2.9.11: {} + + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + birpc@2.9.0: {} + + bluebird@3.7.2: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@2.3.2: + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.11 + caniuse-lite: 1.0.30001761 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + buffer-image-size@0.6.4: + dependencies: + '@types/node': 25.0.3 + + builtin-modules@5.0.0: {} + + bumpp@10.3.2(magicast@0.3.4): + dependencies: + ansis: 4.2.0 + args-tokenizer: 0.3.0 + c12: 3.3.3(magicast@0.3.4) + cac: 6.7.14 + escalade: 3.2.0 + jsonc-parser: 3.3.1 + package-manager-detector: 1.6.0 + semver: 7.7.3 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + yaml: 2.8.2 + transitivePeerDependencies: + - magicast + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + c12@3.3.3(magicast@0.3.4): + dependencies: + chokidar: 5.0.0 + confbox: 0.2.2 + defu: 6.1.4 + dotenv: 17.2.3 + exsolve: 1.0.8 + giget: 2.0.0 + jiti: 2.6.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.0.0 + pkg-types: 2.3.0 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.4 + + cac@6.7.14: {} + + cache-base@1.0.1: + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001761: {} + + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + change-case@5.4.4: {} + + chevrotain-allstar@0.3.1(chevrotain@11.0.3): + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.22 + + chevrotain@11.0.3: + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.21 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + ci-info@4.3.1: {} + + citty@0.1.6: + dependencies: + consola: 3.4.2 + + class-utils@0.3.6: + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + + classnames@2.5.1: {} + + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + cli-progress@3.12.0: + dependencies: + string-width: 4.2.3 + + clipboard@2.0.11: + dependencies: + good-listener: 1.2.2 + select: 1.1.2 + tiny-emitter: 2.1.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@2.1.2: {} + + collection-visit@1.0.0: + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colord@2.9.3: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@7.2.0: {} + + commander@8.3.0: {} + + comment-parser@1.4.1: {} + + component-emitter@1.3.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + confbox@0.2.2: {} + + consola@3.2.3: {} + + consola@3.4.2: {} + + convert-gitmoji@0.1.5: {} + + convert-source-map@2.0.0: {} + + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + + copy-descriptor@0.1.1: {} + + core-js-compat@3.47.0: + dependencies: + browserslist: 4.28.1 + + core-js@3.47.0: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + + crelt@1.0.6: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-js@4.2.0: {} + + css-render@0.15.14: + dependencies: + '@emotion/hash': 0.8.0 + csstype: 3.0.11 + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + csso@4.2.0: + dependencies: + css-tree: 1.1.3 + + csstype@3.0.11: {} + + csstype@3.2.3: {} + + custom-event-polyfill@1.0.7: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.33.1 + + cytoscape-fcose@2.2.0(cytoscape@3.33.1): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.33.1 + + cytoscape@3.33.1: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.13: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.22 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + date-fns-tz@3.2.0(date-fns@4.1.0): + dependencies: + date-fns: 4.1.0 + + date-fns@4.1.0: {} + + dayjs@1.11.15: {} + + dayjs@1.11.19: {} + + debounce@1.2.1: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-uri-component@0.2.2: {} + + deep-is@0.1.4: {} + + default-browser-id@5.0.1: {} + + default-browser@5.4.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + default-passive-events@4.0.0: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@3.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + define-property@0.2.5: + dependencies: + is-descriptor: 0.1.7 + + define-property@1.0.0: + dependencies: + is-descriptor: 1.0.3 + + define-property@2.0.2: + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + + defu@6.1.4: {} + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + + delayed-stream@1.0.0: {} + + delegate@3.2.0: {} + + dequal@2.0.3: {} + + destr@2.0.5: {} + + detect-libc@1.0.3: + optional: true + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dom-serializer@0.2.2: + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + dom-to-image-more@3.7.2: {} + + domelementtype@1.3.1: {} + + domelementtype@2.3.0: {} + + domhandler@2.4.2: + dependencies: + domelementtype: 1.3.1 + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + dompurify@3.3.1: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + domutils@1.7.0: + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + dotenv@17.2.3: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + easy-bem@1.1.1: {} + + echarts@5.6.0: + dependencies: + tslib: 2.3.0 + zrender: 5.6.1 + + echarts@6.0.0: + dependencies: + tslib: 2.3.0 + zrender: 6.0.0 + + electron-to-chromium@1.5.267: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojis-list@3.0.0: {} + + enhanced-resolve@5.18.4: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + entities@1.1.2: {} + + entities@2.2.0: {} + + entities@4.5.0: {} + + entities@7.0.0: {} + + error-stack-parser-es@1.0.5: {} + + es-abstract@1.24.1: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-drager@1.2.11(vue@3.5.26(typescript@5.9.3)): + dependencies: + vue: 3.5.26(typescript@5.9.3) + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-compat-utils@0.5.1(eslint@9.39.2(jiti@2.6.1)): + dependencies: + eslint: 9.39.2(jiti@2.6.1) + semver: 7.7.3 + + eslint-config-flat-gitignore@2.1.0(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@eslint/compat': 1.4.1(eslint@9.39.2(jiti@2.6.1)) + eslint: 9.39.2(jiti@2.6.1) + + eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)): + dependencies: + eslint: 9.39.2(jiti@2.6.1) + + eslint-import-context@0.1.9(unrs-resolver@1.11.1): + dependencies: + get-tsconfig: 4.13.0 + stable-hash-x: 0.2.0 + optionalDependencies: + unrs-resolver: 1.11.1 + + eslint-parser-plain@0.1.1: {} + + eslint-plugin-es-x@7.8.0(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + eslint: 9.39.2(jiti@2.6.1) + eslint-compat-utils: 0.5.1(eslint@9.39.2(jiti@2.6.1)) + + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@typescript-eslint/types': 8.50.1 + comment-parser: 1.4.1 + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) + is-glob: 4.0.3 + minimatch: 10.1.1 + semver: 7.7.3 + stable-hash-x: 0.2.0 + unrs-resolver: 1.11.1 + optionalDependencies: + '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + + eslint-plugin-n@17.23.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + enhanced-resolve: 5.18.4 + eslint: 9.39.2(jiti@2.6.1) + eslint-plugin-es-x: 7.8.0(eslint@9.39.2(jiti@2.6.1)) + get-tsconfig: 4.13.0 + globals: 15.15.0 + globrex: 0.1.2 + ignore: 5.3.2 + semver: 7.7.3 + ts-declaration-location: 1.0.7(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@3.7.4): + dependencies: + eslint: 9.39.2(jiti@2.6.1) + prettier: 3.7.4 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.11 + optionalDependencies: + eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + + eslint-plugin-unicorn@62.0.0(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + '@eslint/plugin-kit': 0.4.1 + change-case: 5.4.4 + ci-info: 4.3.1 + clean-regexp: 1.0.0 + core-js-compat: 3.47.0 + eslint: 9.39.2(jiti@2.6.1) + esquery: 1.6.0 + find-up-simple: 1.0.1 + globals: 16.5.0 + indent-string: 5.0.0 + is-builtin-module: 5.0.0 + jsesc: 3.1.0 + pluralize: 8.0.0 + regexp-tree: 0.1.27 + regjsparser: 0.13.0 + semver: 7.7.3 + strip-indent: 4.1.1 + + eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + eslint: 9.39.2(jiti@2.6.1) + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 7.1.1 + semver: 7.7.3 + vue-eslint-parser: 10.2.0(eslint@9.39.2(jiti@2.6.1)) + xml-name-validator: 4.0.0 + optionalDependencies: + '@typescript-eslint/parser': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.39.2(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + evtd@0.2.4: {} + + execa@9.6.0: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + + expand-brackets@2.1.4: + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + exsolve@1.0.8: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend-shallow@3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + extglob@2.0.4: + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + file-saver@2.0.5: {} + + file64@1.0.5: {} + + fill-range@4.0.0: + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up-simple@1.0.1: {} + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatbuffers@1.12.0: {} + + flatted@3.3.3: {} + + follow-redirects@1.15.11: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + for-in@1.0.2: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fragment-cache@0.2.1: + dependencies: + map-cache: 0.2.2 + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + get-value@2.0.6: {} + + giget@2.0.0: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + defu: 6.1.4 + node-fetch-native: 1.6.7 + nypm: 0.6.2 + pathe: 2.0.3 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@13.0.0: + dependencies: + minimatch: 10.1.1 + minipass: 7.1.2 + path-scurry: 2.0.1 + + globals@14.0.0: {} + + globals@15.15.0: {} + + globals@16.5.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globrex@0.1.2: {} + + good-listener@1.2.2: + dependencies: + delegate: 3.2.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + guid-typescript@1.0.9: {} + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + hachure-fill@0.5.2: {} + + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + + has-bigints@1.1.0: {} + + has-flag@1.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + has-value@0.3.1: + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + + has-value@1.0.0: + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + + has-values@0.1.4: {} + + has-values@1.0.0: + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + highlight.js@11.11.1: {} + + hookable@5.5.3: {} + + hotkeys-js@3.13.15: {} + + htmlparser2@3.10.1: + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + + human-signals@8.0.1: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + icss-replace-symbols@1.1.0: {} + + icss-utils@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + image-size@0.5.5: {} + + immediate@3.0.6: {} + + immutable@5.1.4: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@5.0.0: {} + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + iota-array@1.0.0: {} + + is-accessor-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-builtin-module@5.0.0: + dependencies: + builtin-modules: 5.0.0 + + is-callable@1.2.7: {} + + is-data-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-descriptor@0.1.7: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-descriptor@1.0.3: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@3.0.0: + dependencies: + kind-of: 3.2.2 + + is-number@7.0.0: {} + + is-plain-obj@1.1.0: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-retry-allowed@2.2.0: {} + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@4.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-there@4.5.2: {} + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-unicode-supported@2.1.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-what@5.5.0: {} + + is-windows@1.0.2: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@2.1.0: + dependencies: + isarray: 1.0.0 + + isobject@3.0.1: {} + + isomorphic.js@0.2.5: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@2.6.1: {} + + js-base64@2.6.4: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsbarcode@3.12.1: {} + + jsencrypt@3.5.4: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsonc-parser@3.3.1: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + katex@0.16.27: + dependencies: + commander: 8.3.0 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + khroma@2.1.0: {} + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kind-of@4.0.0: + dependencies: + is-buffer: 1.1.6 + + kind-of@5.1.0: {} + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + klona@2.0.6: {} + + kolorist@1.8.0: {} + + langium@3.3.1: + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lib0@0.2.115: + dependencies: + isomorphic.js: 0.2.5 + + lie@3.1.1: + dependencies: + immediate: 3.0.6 + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + linkifyjs@4.3.2: {} + + loader-utils@1.4.2: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + + loadjs@4.3.0: {} + + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + + localforage@1.10.0: + dependencies: + lie: 3.1.1 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.17.21: {} + + lodash-es@4.17.22: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + long@5.3.2: {} + + lowlight@3.3.0: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + highlight.js: 11.11.1 + + lru-cache@10.4.3: {} + + lru-cache@11.2.4: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.3.4: + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + source-map-js: 1.2.1 + + map-cache@0.2.2: {} + + map-visit@1.0.0: + dependencies: + object-visit: 1.0.1 + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + marked@16.4.2: {} + + math-intrinsics@1.1.0: {} + + mdn-data@2.0.14: {} + + mdn-data@2.12.2: {} + + mdurl@2.0.0: {} + + merge-options@1.0.1: + dependencies: + is-plain-obj: 1.1.0 + + merge2@1.4.1: {} + + mermaid@11.12.2: + dependencies: + '@braintree/sanitize-url': 7.1.1 + '@iconify/utils': 3.1.0 + '@mermaid-js/parser': 0.6.3 + '@types/d3': 7.4.3 + cytoscape: 3.33.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) + cytoscape-fcose: 2.2.0(cytoscape@3.33.1) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.13 + dayjs: 1.11.19 + dompurify: 3.3.1 + katex: 0.16.27 + khroma: 2.1.0 + lodash-es: 4.17.22 + marked: 16.4.2 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 11.1.0 + + micromatch@3.1.0: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 1.0.0 + extend-shallow: 2.0.1 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 5.1.0 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + optional: true + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mitt@3.0.1: {} + + mixin-deep@1.3.2: + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + + mkdirp@3.0.1: {} + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + mrmime@2.0.1: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + naive-ui@2.43.2(vue@3.5.26(typescript@5.9.3)): + dependencies: + '@css-render/plugin-bem': 0.15.14(css-render@0.15.14) + '@css-render/vue3-ssr': 0.15.14(vue@3.5.26(typescript@5.9.3)) + '@types/katex': 0.16.7 + '@types/lodash': 4.17.21 + '@types/lodash-es': 4.17.12 + async-validator: 4.2.5 + css-render: 0.15.14 + csstype: 3.2.3 + date-fns: 4.1.0 + date-fns-tz: 3.2.0(date-fns@4.1.0) + evtd: 0.2.4 + highlight.js: 11.11.1 + lodash: 4.17.21 + lodash-es: 4.17.22 + seemly: 0.3.10 + treemate: 0.3.11 + vdirs: 0.1.8(vue@3.5.26(typescript@5.9.3)) + vooks: 0.2.12(vue@3.5.26(typescript@5.9.3)) + vue: 3.5.26(typescript@5.9.3) + vueuc: 0.4.65(vue@3.5.26(typescript@5.9.3)) + + nanoid@3.3.11: {} + + nanoid@5.1.6: {} + + nanomatch@1.2.13: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + napi-postinstall@0.3.4: {} + + natural-compare@1.4.0: {} + + ndarray@1.0.19: + dependencies: + iota-array: 1.0.0 + is-buffer: 1.1.6 + + node-addon-api@7.1.1: + optional: true + + node-fetch-native@1.6.7: {} + + node-releases@2.0.27: {} + + normalize-path@3.0.0: {} + + npm-check-updates@19.2.0: {} + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nypm@0.6.2: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + pathe: 2.0.3 + pkg-types: 2.3.0 + tinyexec: 1.0.2 + + nzh@1.0.14: {} + + object-assign@4.1.1: {} + + object-copy@0.1.0: + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object-visit@1.0.1: + dependencies: + isobject: 3.0.1 + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.pick@1.3.0: + dependencies: + isobject: 3.0.1 + + ofetch@1.4.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.1 + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.1 + + ohash@2.0.11: {} + + onnxruntime-common@1.18.0: {} + + onnxruntime-web@1.18.0: + dependencies: + flatbuffers: 1.12.0 + guid-typescript: 1.0.9 + long: 5.3.2 + onnxruntime-common: 1.18.0 + platform: 1.3.6 + protobufjs: 7.5.4 + + open@10.2.0: + dependencies: + default-browser: 5.4.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + orderedmap@2.1.1: {} + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + package-manager-detector@1.6.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-ms@4.0.0: {} + + pascalcase@0.1.1: {} + + path-browserify@1.0.1: {} + + path-data-parser@0.1.0: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.4 + minipass: 7.1.2 + + pathe@0.2.0: {} + + pathe@2.0.3: {} + + pdfjs-dist@5.4.296: + optionalDependencies: + '@napi-rs/canvas': 0.1.86 + + perfect-debounce@1.0.0: {} + + perfect-debounce@2.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pinia@3.0.4(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 7.7.9 + vue: 3.5.26(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.8 + pathe: 2.0.3 + + platform@1.3.6: {} + + pluralize@8.0.0: {} + + plyr@3.8.3: + dependencies: + core-js: 3.47.0 + custom-event-polyfill: 1.0.7 + loadjs: 4.3.0 + rangetouch: 2.0.1 + url-polyfill: 1.1.14 + + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + + posix-character-classes@0.1.1: {} + + possible-typed-array-names@1.1.0: {} + + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + + postcss-modules-values@4.0.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-prefix-selector@1.16.1(postcss@5.2.18): + dependencies: + postcss: 5.2.18 + + postcss-scss@4.0.9(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@5.2.18: + dependencies: + chalk: 1.1.3 + js-base64: 2.6.4 + source-map: 0.5.7 + supports-color: 3.2.3 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + posthtml-parser@0.2.1: + dependencies: + htmlparser2: 3.10.1 + isobject: 2.1.0 + + posthtml-rename-id@1.0.12: + dependencies: + escape-string-regexp: 1.0.5 + + posthtml-render@1.4.0: {} + + posthtml-svg-mode@1.0.3: + dependencies: + merge-options: 1.0.1 + posthtml: 0.9.2 + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + + posthtml@0.9.2: + dependencies: + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier-plugin-json-sort@0.0.2(prettier@3.7.4): + dependencies: + prettier: 3.7.4 + + prettier@3.3.3: {} + + prettier@3.7.4: {} + + pretty-bytes@6.1.1: {} + + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + + progress@2.0.3: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prosemirror-changeset@2.3.1: + dependencies: + prosemirror-transform: 1.10.5 + + prosemirror-collab@1.3.1: + dependencies: + prosemirror-state: 1.4.4 + + prosemirror-commands@1.7.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + prosemirror-dropcursor@1.8.2: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + + prosemirror-gapcursor@1.4.0: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.4 + + prosemirror-history@1.5.0: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + rope-sequence: 1.3.4 + + prosemirror-inputrules@1.5.1: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + prosemirror-keymap@1.2.3: + dependencies: + prosemirror-state: 1.4.4 + w3c-keyname: 2.2.8 + + prosemirror-markdown@1.13.2: + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + prosemirror-model: 1.25.4 + + prosemirror-menu@1.2.5: + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.7.1 + prosemirror-history: 1.5.0 + prosemirror-state: 1.4.4 + + prosemirror-model@1.25.4: + dependencies: + orderedmap: 2.1.1 + + prosemirror-schema-basic@1.2.4: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-schema-list@1.5.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + prosemirror-state@1.4.4: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + + prosemirror-tables@1.8.4: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4): + dependencies: + '@remirror/core-constants': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.4 + + prosemirror-transform@1.10.5: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-view@1.41.4: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + protobufjs@7.5.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 25.0.3 + long: 5.3.2 + + proxy-from-env@1.1.0: {} + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + pure-svg-code@1.0.6: {} + + qrcode-svg@1.1.0: {} + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + quansync@0.2.11: {} + + quansync@1.0.0: {} + + query-string@4.3.4: + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + + queue-microtask@1.2.3: {} + + rangetouch@2.0.1: {} + + rate-limiter-flexible@5.0.5: {} + + rc9@2.1.2: + dependencies: + defu: 6.1.4 + destr: 2.0.5 + + rd@2.0.1: + dependencies: + '@types/node': 10.17.60 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + readdirp@5.0.0: {} + + recast@0.23.9: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regex-not@1.0.2: + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + + regexp-tree@0.1.27: {} + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regjsparser@0.13.0: + dependencies: + jsesc: 3.1.0 + + repeat-element@1.1.4: {} + + repeat-string@1.6.1: {} + + require-directory@2.1.1: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve-url@0.2.1: {} + + ret@0.1.15: {} + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rimraf@6.1.2: + dependencies: + glob: 13.0.0 + package-json-from-dist: 1.0.1 + + robust-predicates@3.0.2: {} + + rollup@4.54.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.54.0 + '@rollup/rollup-android-arm64': 4.54.0 + '@rollup/rollup-darwin-arm64': 4.54.0 + '@rollup/rollup-darwin-x64': 4.54.0 + '@rollup/rollup-freebsd-arm64': 4.54.0 + '@rollup/rollup-freebsd-x64': 4.54.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.54.0 + '@rollup/rollup-linux-arm-musleabihf': 4.54.0 + '@rollup/rollup-linux-arm64-gnu': 4.54.0 + '@rollup/rollup-linux-arm64-musl': 4.54.0 + '@rollup/rollup-linux-loong64-gnu': 4.54.0 + '@rollup/rollup-linux-ppc64-gnu': 4.54.0 + '@rollup/rollup-linux-riscv64-gnu': 4.54.0 + '@rollup/rollup-linux-riscv64-musl': 4.54.0 + '@rollup/rollup-linux-s390x-gnu': 4.54.0 + '@rollup/rollup-linux-x64-gnu': 4.54.0 + '@rollup/rollup-linux-x64-musl': 4.54.0 + '@rollup/rollup-openharmony-arm64': 4.54.0 + '@rollup/rollup-win32-arm64-msvc': 4.54.0 + '@rollup/rollup-win32-ia32-msvc': 4.54.0 + '@rollup/rollup-win32-x64-gnu': 4.54.0 + '@rollup/rollup-win32-x64-msvc': 4.54.0 + fsevents: 2.3.3 + + rope-sequence@1.3.4: {} + + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + + run-applescript@7.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rw@1.3.3: {} + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-regex@1.1.0: + dependencies: + ret: 0.1.15 + + safer-buffer@2.1.2: {} + + sass@1.97.1: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.4 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + seemly@0.3.10: {} + + select@1.1.2: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + semver@7.7.3: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + set-value@2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + sign-canvas-plus@2.0.3(typescript@5.9.3): + dependencies: + vue: 3.5.26(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + signal-exit@4.1.0: {} + + simple-git-hooks@2.13.1: {} + + simplebar-core@1.3.2: + dependencies: + lodash: 4.17.21 + lodash-es: 4.17.22 + + simplebar-vue@2.4.2(vue@3.5.26(typescript@5.9.3)): + dependencies: + simplebar-core: 1.3.2 + vue: 3.5.26(typescript@5.9.3) + vue-demi: 0.13.11(vue@3.5.26(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + smooth-signature@1.1.0: {} + + snapdragon-node@2.1.1: + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + + snapdragon-util@3.0.1: + dependencies: + kind-of: 3.2.2 + + snapdragon@0.8.2: + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + + source-map-js@1.2.1: {} + + source-map-resolve@0.5.3: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + + source-map-url@0.4.1: {} + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + speakingurl@14.0.1: {} + + split-string@3.1.0: + dependencies: + extend-shallow: 3.0.2 + + stable-hash-x@0.2.0: {} + + stable@0.1.8: {} + + static-extend@0.1.2: + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + streamsaver@2.0.6: {} + + strict-uri-encode@1.1.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-final-newline@4.0.0: {} + + strip-indent@4.1.1: {} + + strip-json-comments@3.1.1: {} + + stylis@4.3.6: {} + + superjson@2.2.6: + dependencies: + copy-anything: 4.0.5 + + supports-color@2.0.0: {} + + supports-color@3.2.3: + dependencies: + has-flag: 1.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + svelte-eslint-parser@1.4.1: + dependencies: + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + postcss: 8.5.6 + postcss-scss: 4.0.9(postcss@8.5.6) + postcss-selector-parser: 7.1.1 + + svg-baker@1.7.0: + dependencies: + bluebird: 3.7.2 + clone: 2.1.2 + he: 1.2.0 + image-size: 0.5.5 + loader-utils: 1.4.2 + merge-options: 1.0.1 + micromatch: 3.1.0 + postcss: 5.2.18 + postcss-prefix-selector: 1.16.1(postcss@5.2.18) + posthtml-rename-id: 1.0.12 + posthtml-svg-mode: 1.0.3 + query-string: 4.3.4 + traverse: 0.6.11 + transitivePeerDependencies: + - supports-color + + svg64@2.0.0: {} + + svgo@2.8.0: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.1.1 + stable: 0.1.8 + + synckit@0.11.11: + dependencies: + '@pkgr/core': 0.2.9 + + tailwind-merge@3.4.0: {} + + tapable@2.3.0: {} + + tiny-emitter@2.1.0: {} + + tiny-invariant@1.3.3: {} + + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tippy.js@6.3.7: + dependencies: + '@popperjs/core': 2.11.8 + + to-object-path@0.3.0: + dependencies: + kind-of: 3.2.2 + + to-regex-range@2.1.1: + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + to-regex@3.0.2: + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + + totalist@3.0.1: {} + + traverse@0.6.11: + dependencies: + gopd: 1.2.0 + typedarray.prototype.slice: 1.0.5 + which-typed-array: 1.1.19 + + treemate@0.3.11: {} + + ts-api-utils@2.1.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-declaration-location@1.0.7(typescript@5.9.3): + dependencies: + picomatch: 4.0.3 + typescript: 5.9.3 + + ts-dedent@2.2.0: {} + + tslib@2.3.0: {} + + tslib@2.8.1: {} + + tsx@4.21.0: + dependencies: + esbuild: 0.27.2 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typed-css-modules@0.9.1: + dependencies: + camelcase: 6.3.0 + chalk: 4.1.2 + chokidar: 3.6.0 + glob: 10.5.0 + icss-replace-symbols: 1.1.0 + is-there: 4.5.2 + mkdirp: 3.0.1 + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) + yargs: 17.7.2 + + typedarray.prototype.slice@1.0.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + math-intrinsics: 1.1.0 + typed-array-buffer: 1.0.3 + typed-array-byte-offset: 1.0.4 + + typescript@5.9.3: {} + + uc.micro@2.1.0: {} + + ufo@1.6.1: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + unconfig-core@7.4.2: + dependencies: + '@quansync/fs': 1.0.0 + quansync: 1.0.0 + + unconfig@7.4.2: + dependencies: + '@quansync/fs': 1.0.0 + defu: 6.1.4 + jiti: 2.6.1 + quansync: 1.0.0 + unconfig-core: 7.4.2 + + undici-types@7.16.0: {} + + unicorn-magic@0.3.0: {} + + union-value@1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + + universalify@2.0.1: {} + + unplugin-icons@22.5.0(@vue/compiler-sfc@3.5.26): + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/utils': 3.1.0 + debug: 4.4.3 + local-pkg: 1.1.2 + unplugin: 2.3.11 + optionalDependencies: + '@vue/compiler-sfc': 3.5.26 + transitivePeerDependencies: + - supports-color + + unplugin-utils@0.3.1: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.3 + + unplugin-vue-components@30.0.0(@babel/parser@7.28.5)(vue@3.5.26(typescript@5.9.3)): + dependencies: + chokidar: 4.0.3 + debug: 4.4.3 + local-pkg: 1.1.2 + magic-string: 0.30.21 + mlly: 1.8.0 + tinyglobby: 0.2.15 + unplugin: 2.3.11 + unplugin-utils: 0.3.1 + vue: 3.5.26(typescript@5.9.3) + optionalDependencies: + '@babel/parser': 7.28.5 + transitivePeerDependencies: + - supports-color + + unplugin@1.12.0: + dependencies: + acorn: 8.15.0 + chokidar: 3.6.0 + webpack-sources: 3.3.3 + webpack-virtual-modules: 0.6.2 + + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + + unrs-resolver@1.11.1: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + + unset-value@1.0.0: + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + urix@0.1.0: {} + + url-polyfill@1.1.14: {} + + use@3.1.1: {} + + util-deprecate@1.0.2: {} + + uuid@11.1.0: {} + + vary@1.1.2: {} + + vdirs@0.1.8(vue@3.5.26(typescript@5.9.3)): + dependencies: + evtd: 0.2.4 + vue: 3.5.26(typescript@5.9.3) + + vite-dev-rpc@1.1.0(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + birpc: 2.9.0 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite-hot-client: 2.1.0(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + + vite-hot-client@2.1.0(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + + vite-plugin-inspect@11.3.3(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + ansis: 4.2.0 + debug: 4.4.3 + error-stack-parser-es: 1.0.5 + ohash: 2.0.11 + open: 10.2.0 + perfect-debounce: 2.0.0 + sirv: 3.0.2 + unplugin-utils: 0.3.1 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite-dev-rpc: 1.1.0(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + transitivePeerDependencies: + - supports-color + + vite-plugin-progress@0.0.7(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + picocolors: 1.1.1 + progress: 2.0.3 + rd: 2.0.1 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + + vite-plugin-svg-icons@2.0.1(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + '@types/svgo': 2.6.4 + cors: 2.8.5 + debug: 4.4.3 + etag: 1.8.1 + fs-extra: 10.1.0 + pathe: 0.2.0 + svg-baker: 1.7.0 + svgo: 2.8.0 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + + vite-plugin-vue-devtools@8.0.5(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)): + dependencies: + '@vue/devtools-core': 8.0.5(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + '@vue/devtools-kit': 8.0.5 + '@vue/devtools-shared': 8.0.5 + sirv: 3.0.2 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + vite-plugin-inspect: 11.3.3(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + vite-plugin-vue-inspector: 5.3.2(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)) + transitivePeerDependencies: + - '@nuxt/kit' + - supports-color + - vue + + vite-plugin-vue-inspector@5.3.2(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) + '@vue/compiler-dom': 3.5.26 + kolorist: 1.8.0 + magic-string: 0.30.21 + vite: 7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + + vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.8.2): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.54.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.0.3 + fsevents: 2.3.3 + jiti: 2.6.1 + sass: 1.97.1 + tsx: 4.21.0 + yaml: 2.8.2 + + vooks@0.2.12(vue@3.5.26(typescript@5.9.3)): + dependencies: + evtd: 0.2.4 + vue: 3.5.26(typescript@5.9.3) + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-uri@3.0.8: {} + + vscode-uri@3.1.0: {} + + vue-advanced-cropper@2.8.9(vue@3.5.26(typescript@5.9.3)): + dependencies: + classnames: 2.5.1 + debounce: 1.2.1 + easy-bem: 1.1.1 + vue: 3.5.26(typescript@5.9.3) + + vue-demi@0.13.11(vue@3.5.26(typescript@5.9.3)): + dependencies: + vue: 3.5.26(typescript@5.9.3) + + vue-demi@0.14.10(vue@3.5.26(typescript@5.9.3)): + dependencies: + vue: 3.5.26(typescript@5.9.3) + + vue-draggable-plus@0.6.0(@types/sortablejs@1.15.9): + dependencies: + '@types/sortablejs': 1.15.9 + + vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1)): + dependencies: + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + + vue-flow-layout@0.2.0: {} + + vue-i18n@10.0.8(vue@3.5.26(typescript@5.9.3)): + dependencies: + '@intlify/core-base': 10.0.8 + '@intlify/shared': 10.0.8 + '@vue/devtools-api': 6.6.4 + vue: 3.5.26(typescript@5.9.3) + + vue-i18n@11.2.7(vue@3.5.26(typescript@5.9.3)): + dependencies: + '@intlify/core-base': 11.2.7 + '@intlify/shared': 11.2.7 + '@vue/devtools-api': 6.6.4 + vue: 3.5.26(typescript@5.9.3) + + vue-router@4.6.4(vue@3.5.26(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.26(typescript@5.9.3) + + vue-tsc@3.2.1(typescript@5.9.3): + dependencies: + '@volar/typescript': 2.4.27 + '@vue/language-core': 3.2.1 + typescript: 5.9.3 + + vue@3.5.26(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.26 + '@vue/compiler-sfc': 3.5.26 + '@vue/runtime-dom': 3.5.26 + '@vue/server-renderer': 3.5.26(vue@3.5.26(typescript@5.9.3)) + '@vue/shared': 3.5.26 + optionalDependencies: + typescript: 5.9.3 + + vueuc@0.4.65(vue@3.5.26(typescript@5.9.3)): + dependencies: + '@css-render/vue3-ssr': 0.15.14(vue@3.5.26(typescript@5.9.3)) + '@juggle/resize-observer': 3.4.0 + css-render: 0.15.14 + evtd: 0.2.4 + seemly: 0.3.10 + vdirs: 0.1.8(vue@3.5.26(typescript@5.9.3)) + vooks: 0.2.12(vue@3.5.26(typescript@5.9.3)) + vue: 3.5.26(typescript@5.9.3) + + w3c-keyname@2.2.8: {} + + webpack-sources@3.3.3: {} + + webpack-virtual-modules@0.6.2: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 + + xml-name-validator@4.0.0: {} + + y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28): + dependencies: + lib0: 0.2.115 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.4 + y-protocols: 1.0.7(yjs@13.6.28) + yjs: 13.6.28 + + y-protocols@1.0.7(yjs@13.6.28): + dependencies: + lib0: 0.2.115 + yjs: 13.6.28 + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@2.8.2: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yjs@13.6.28: + dependencies: + lib0: 0.2.115 + + yocto-queue@0.1.0: {} + + yoctocolors@2.1.2: {} + + zod@3.25.76: {} + + zod@4.2.1: {} + + zrender@5.6.1: + dependencies: + tslib: 2.3.0 + + zrender@6.0.0: + dependencies: + tslib: 2.3.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..dee51e9 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - "packages/*" diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..1b50f85 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/streamsaver/mitm.html b/public/streamsaver/mitm.html new file mode 100644 index 0000000..f6d94e2 --- /dev/null +++ b/public/streamsaver/mitm.html @@ -0,0 +1,179 @@ + + diff --git a/public/streamsaver/sw.js b/public/streamsaver/sw.js new file mode 100644 index 0000000..f6cb4c3 --- /dev/null +++ b/public/streamsaver/sw.js @@ -0,0 +1,132 @@ +/* eslint-disable */ +/* global self ReadableStream Response */ + +self.addEventListener('install', () => { + self.skipWaiting(); +}); + +self.addEventListener('activate', event => { + event.waitUntil(self.clients.claim()); +}); + +const map = new Map(); + +// This should be called once per download +// Each event has a dataChannel that the data will be piped through +self.onmessage = event => { + // We send a heartbeat every x second to keep the + // service worker alive if a transferable stream is not sent + if (event.data === 'ping') { + return; + } + + const data = event.data; + const downloadUrl = + data.url || `${self.registration.scope + Math.random()}/${typeof data === 'string' ? data : data.filename}`; + const port = event.ports[0]; + const metadata = Array.from({ length: 3 }); // [stream, data, port] + + metadata[1] = data; + metadata[2] = port; + + // Note to self: + // old streamsaver v1.2.0 might still use `readableStream`... + // but v2.0.0 will always transfer the stream through MessageChannel #94 + if (event.data.readableStream) { + metadata[0] = event.data.readableStream; + } else if (event.data.transferringReadable) { + port.onmessage = evt => { + port.onmessage = null; + metadata[0] = evt.data.readableStream; + }; + } else { + metadata[0] = createStream(port); + } + + map.set(downloadUrl, metadata); + port.postMessage({ download: downloadUrl }); +}; + +function createStream(port) { + // ReadableStream is only supported by chrome 52 + return new ReadableStream({ + start(controller) { + // When we receive data on the messageChannel, we write + port.onmessage = ({ data }) => { + if (data === 'end') { + return controller.close(); + } + + if (data === 'abort') { + controller.error('Aborted the download'); + return; + } + + controller.enqueue(data); + }; + }, + cancel(reason) { + console.log('user aborted', reason); + port.postMessage({ abort: true }); + } + }); +} + +self.onfetch = event => { + const url = event.request.url; + + // this only works for Firefox + if (url.endsWith('/ping')) { + return event.respondWith(new Response('pong')); + } + + const hijacke = map.get(url); + + if (!hijacke) return null; + + const [stream, data, port] = hijacke; + + map.delete(url); + + // Not comfortable letting any user control all headers + // so we only copy over the length & disposition + const responseHeaders = new Headers({ + 'Content-Type': 'application/octet-stream; charset=utf-8', + + // To be on the safe side, The link can be opened in a iframe. + // but octet-stream should stop it. + 'Content-Security-Policy': "default-src 'none'", + 'X-Content-Security-Policy': "default-src 'none'", + 'X-WebKit-CSP': "default-src 'none'", + 'X-XSS-Protection': '1; mode=block', + 'Cross-Origin-Embedder-Policy': 'require-corp' + }); + + const headers = new Headers(data.headers || {}); + + if (headers.has('Content-Length')) { + responseHeaders.set('Content-Length', headers.get('Content-Length')); + } + + if (headers.has('Content-Disposition')) { + responseHeaders.set('Content-Disposition', headers.get('Content-Disposition')); + } + + // data, data.filename and size should not be used anymore + if (data.size) { + console.warn('Depricated'); + responseHeaders.set('Content-Length', data.size); + } + + let fileName = typeof data === 'string' ? data : data.filename; + if (fileName) { + console.warn('Depricated'); + // Make filename RFC5987 compatible + fileName = encodeURIComponent(fileName).replace(/['()]/g, escape).replace(/\*/g, '%2A'); + responseHeaders.set('Content-Disposition', `attachment; filename*=UTF-8''${fileName}`); + } + + event.respondWith(new Response(stream, { headers: responseHeaders })); + + port.postMessage({ debug: 'Download started' }); +}; diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..eb499a2 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/src/assets/imgs/soybean.jpg b/src/assets/imgs/soybean.jpg new file mode 100644 index 0000000000000000000000000000000000000000..75457d5015acebac780047ca61b0f8dbd8525ddf GIT binary patch literal 114241 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

>@yuk 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 z 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 literal 0 HcmV?d00001 diff --git a/src/assets/svg-icon/activity.svg b/src/assets/svg-icon/activity.svg new file mode 100644 index 0000000..abe892f --- /dev/null +++ b/src/assets/svg-icon/activity.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/at-sign.svg b/src/assets/svg-icon/at-sign.svg new file mode 100644 index 0000000..625214d --- /dev/null +++ b/src/assets/svg-icon/at-sign.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/avatar.svg b/src/assets/svg-icon/avatar.svg new file mode 100644 index 0000000..66fe6f2 --- /dev/null +++ b/src/assets/svg-icon/avatar.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/banner.svg b/src/assets/svg-icon/banner.svg new file mode 100644 index 0000000..192b637 --- /dev/null +++ b/src/assets/svg-icon/banner.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/bell.svg b/src/assets/svg-icon/bell.svg new file mode 100644 index 0000000..bffd0ce --- /dev/null +++ b/src/assets/svg-icon/bell.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/cast.svg b/src/assets/svg-icon/cast.svg new file mode 100644 index 0000000..4f008d3 --- /dev/null +++ b/src/assets/svg-icon/cast.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/chrome.svg b/src/assets/svg-icon/chrome.svg new file mode 100644 index 0000000..6314173 --- /dev/null +++ b/src/assets/svg-icon/chrome.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/copy.svg b/src/assets/svg-icon/copy.svg new file mode 100644 index 0000000..ab25601 --- /dev/null +++ b/src/assets/svg-icon/copy.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/custom-icon.svg b/src/assets/svg-icon/custom-icon.svg new file mode 100644 index 0000000..b33a43f --- /dev/null +++ b/src/assets/svg-icon/custom-icon.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/empty-data.svg b/src/assets/svg-icon/empty-data.svg new file mode 100644 index 0000000..293486c --- /dev/null +++ b/src/assets/svg-icon/empty-data.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/expectation.svg b/src/assets/svg-icon/expectation.svg new file mode 100644 index 0000000..1d87d5e --- /dev/null +++ b/src/assets/svg-icon/expectation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/heart.svg b/src/assets/svg-icon/heart.svg new file mode 100644 index 0000000..56e59b4 --- /dev/null +++ b/src/assets/svg-icon/heart.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/login-background.svg b/src/assets/svg-icon/login-background.svg new file mode 100644 index 0000000..89fda3e --- /dev/null +++ b/src/assets/svg-icon/login-background.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/logo.svg b/src/assets/svg-icon/logo.svg new file mode 100644 index 0000000..d3a984f --- /dev/null +++ b/src/assets/svg-icon/logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/svg-icon/maxkey.svg b/src/assets/svg-icon/maxkey.svg new file mode 100644 index 0000000..f8f8a7d --- /dev/null +++ b/src/assets/svg-icon/maxkey.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svg-icon/menu/404.svg b/src/assets/svg-icon/menu/404.svg new file mode 100644 index 0000000..6df5019 --- /dev/null +++ b/src/assets/svg-icon/menu/404.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/bug.svg b/src/assets/svg-icon/menu/bug.svg new file mode 100644 index 0000000..05a150d --- /dev/null +++ b/src/assets/svg-icon/menu/bug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/build.svg b/src/assets/svg-icon/menu/build.svg new file mode 100644 index 0000000..57fe4a0 --- /dev/null +++ b/src/assets/svg-icon/menu/build.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/button.svg b/src/assets/svg-icon/menu/button.svg new file mode 100644 index 0000000..8b97436 --- /dev/null +++ b/src/assets/svg-icon/menu/button.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/src/assets/svg-icon/menu/caret-back.svg b/src/assets/svg-icon/menu/caret-back.svg new file mode 100644 index 0000000..9bae722 --- /dev/null +++ b/src/assets/svg-icon/menu/caret-back.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/caret-forward.svg b/src/assets/svg-icon/menu/caret-forward.svg new file mode 100644 index 0000000..1ec3f7d --- /dev/null +++ b/src/assets/svg-icon/menu/caret-forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/cascader.svg b/src/assets/svg-icon/menu/cascader.svg new file mode 100644 index 0000000..b372ff0 --- /dev/null +++ b/src/assets/svg-icon/menu/cascader.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/category.svg b/src/assets/svg-icon/menu/category.svg new file mode 100644 index 0000000..df92526 --- /dev/null +++ b/src/assets/svg-icon/menu/category.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/chart.svg b/src/assets/svg-icon/menu/chart.svg new file mode 100644 index 0000000..27728fb --- /dev/null +++ b/src/assets/svg-icon/menu/chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/checkbox.svg b/src/assets/svg-icon/menu/checkbox.svg new file mode 100644 index 0000000..eae8be6 --- /dev/null +++ b/src/assets/svg-icon/menu/checkbox.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/clipboard.svg b/src/assets/svg-icon/menu/clipboard.svg new file mode 100644 index 0000000..90923ff --- /dev/null +++ b/src/assets/svg-icon/menu/clipboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/code.svg b/src/assets/svg-icon/menu/code.svg new file mode 100644 index 0000000..ddbfc48 --- /dev/null +++ b/src/assets/svg-icon/menu/code.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/color.svg b/src/assets/svg-icon/menu/color.svg new file mode 100644 index 0000000..a3c1e14 --- /dev/null +++ b/src/assets/svg-icon/menu/color.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/company.svg b/src/assets/svg-icon/menu/company.svg new file mode 100644 index 0000000..7af5327 --- /dev/null +++ b/src/assets/svg-icon/menu/company.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/component.svg b/src/assets/svg-icon/menu/component.svg new file mode 100644 index 0000000..d5b6b30 --- /dev/null +++ b/src/assets/svg-icon/menu/component.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/dashboard.svg b/src/assets/svg-icon/menu/dashboard.svg new file mode 100644 index 0000000..5317d37 --- /dev/null +++ b/src/assets/svg-icon/menu/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/date-range.svg b/src/assets/svg-icon/menu/date-range.svg new file mode 100644 index 0000000..27e9e9e --- /dev/null +++ b/src/assets/svg-icon/menu/date-range.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/date.svg b/src/assets/svg-icon/menu/date.svg new file mode 100644 index 0000000..fc1051b --- /dev/null +++ b/src/assets/svg-icon/menu/date.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/dict.svg b/src/assets/svg-icon/menu/dict.svg new file mode 100644 index 0000000..eacaa5e --- /dev/null +++ b/src/assets/svg-icon/menu/dict.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/documentation.svg b/src/assets/svg-icon/menu/documentation.svg new file mode 100644 index 0000000..7043122 --- /dev/null +++ b/src/assets/svg-icon/menu/documentation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/download.svg b/src/assets/svg-icon/menu/download.svg new file mode 100644 index 0000000..f58aa25 --- /dev/null +++ b/src/assets/svg-icon/menu/download.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/drag.svg b/src/assets/svg-icon/menu/drag.svg new file mode 100644 index 0000000..4185d3c --- /dev/null +++ b/src/assets/svg-icon/menu/drag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/druid.svg b/src/assets/svg-icon/menu/druid.svg new file mode 100644 index 0000000..d3d9a6a --- /dev/null +++ b/src/assets/svg-icon/menu/druid.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/edit.svg b/src/assets/svg-icon/menu/edit.svg new file mode 100644 index 0000000..d26101f --- /dev/null +++ b/src/assets/svg-icon/menu/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/education.svg b/src/assets/svg-icon/menu/education.svg new file mode 100644 index 0000000..7bfb01d --- /dev/null +++ b/src/assets/svg-icon/menu/education.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/email.svg b/src/assets/svg-icon/menu/email.svg new file mode 100644 index 0000000..74d25e2 --- /dev/null +++ b/src/assets/svg-icon/menu/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/example.svg b/src/assets/svg-icon/menu/example.svg new file mode 100644 index 0000000..46f42b5 --- /dev/null +++ b/src/assets/svg-icon/menu/example.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/excel.svg b/src/assets/svg-icon/menu/excel.svg new file mode 100644 index 0000000..74d97b8 --- /dev/null +++ b/src/assets/svg-icon/menu/excel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/exit-fullscreen.svg b/src/assets/svg-icon/menu/exit-fullscreen.svg new file mode 100644 index 0000000..485c128 --- /dev/null +++ b/src/assets/svg-icon/menu/exit-fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/eye-open.svg b/src/assets/svg-icon/menu/eye-open.svg new file mode 100644 index 0000000..88dcc98 --- /dev/null +++ b/src/assets/svg-icon/menu/eye-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/eye.svg b/src/assets/svg-icon/menu/eye.svg new file mode 100644 index 0000000..16ed2d8 --- /dev/null +++ b/src/assets/svg-icon/menu/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/finish.svg b/src/assets/svg-icon/menu/finish.svg new file mode 100644 index 0000000..4685c23 --- /dev/null +++ b/src/assets/svg-icon/menu/finish.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/form.svg b/src/assets/svg-icon/menu/form.svg new file mode 100644 index 0000000..dcbaa18 --- /dev/null +++ b/src/assets/svg-icon/menu/form.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/fullscreen.svg b/src/assets/svg-icon/menu/fullscreen.svg new file mode 100644 index 0000000..0e86b6f --- /dev/null +++ b/src/assets/svg-icon/menu/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/gitee.svg b/src/assets/svg-icon/menu/gitee.svg new file mode 100644 index 0000000..b4c8bfb --- /dev/null +++ b/src/assets/svg-icon/menu/gitee.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/github.svg b/src/assets/svg-icon/menu/github.svg new file mode 100644 index 0000000..7573111 --- /dev/null +++ b/src/assets/svg-icon/menu/github.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/guide.svg b/src/assets/svg-icon/menu/guide.svg new file mode 100644 index 0000000..b271001 --- /dev/null +++ b/src/assets/svg-icon/menu/guide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/icon.svg b/src/assets/svg-icon/menu/icon.svg new file mode 100644 index 0000000..82be8ee --- /dev/null +++ b/src/assets/svg-icon/menu/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/input.svg b/src/assets/svg-icon/menu/input.svg new file mode 100644 index 0000000..1e49c89 --- /dev/null +++ b/src/assets/svg-icon/menu/input.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/international.svg b/src/assets/svg-icon/menu/international.svg new file mode 100644 index 0000000..e9b56ee --- /dev/null +++ b/src/assets/svg-icon/menu/international.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/job.svg b/src/assets/svg-icon/menu/job.svg new file mode 100644 index 0000000..9225ffd --- /dev/null +++ b/src/assets/svg-icon/menu/job.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/language.svg b/src/assets/svg-icon/menu/language.svg new file mode 100644 index 0000000..0082b57 --- /dev/null +++ b/src/assets/svg-icon/menu/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/link.svg b/src/assets/svg-icon/menu/link.svg new file mode 100644 index 0000000..48197ba --- /dev/null +++ b/src/assets/svg-icon/menu/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/list.svg b/src/assets/svg-icon/menu/list.svg new file mode 100644 index 0000000..20259ed --- /dev/null +++ b/src/assets/svg-icon/menu/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/lock.svg b/src/assets/svg-icon/menu/lock.svg new file mode 100644 index 0000000..74fee54 --- /dev/null +++ b/src/assets/svg-icon/menu/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/log.svg b/src/assets/svg-icon/menu/log.svg new file mode 100644 index 0000000..f4ef0e0 --- /dev/null +++ b/src/assets/svg-icon/menu/log.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/logininfor.svg b/src/assets/svg-icon/menu/logininfor.svg new file mode 100644 index 0000000..3e863d3 --- /dev/null +++ b/src/assets/svg-icon/menu/logininfor.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/message.svg b/src/assets/svg-icon/menu/message.svg new file mode 100644 index 0000000..14ca817 --- /dev/null +++ b/src/assets/svg-icon/menu/message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/model.svg b/src/assets/svg-icon/menu/model.svg new file mode 100644 index 0000000..0c57d70 --- /dev/null +++ b/src/assets/svg-icon/menu/model.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/money.svg b/src/assets/svg-icon/menu/money.svg new file mode 100644 index 0000000..c1580de --- /dev/null +++ b/src/assets/svg-icon/menu/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/monitor.svg b/src/assets/svg-icon/menu/monitor.svg new file mode 100644 index 0000000..c617440 --- /dev/null +++ b/src/assets/svg-icon/menu/monitor.svg @@ -0,0 +1,2 @@ + diff --git a/src/assets/svg-icon/menu/my-copy.svg b/src/assets/svg-icon/menu/my-copy.svg new file mode 100644 index 0000000..49f69fa --- /dev/null +++ b/src/assets/svg-icon/menu/my-copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/my-task.svg b/src/assets/svg-icon/menu/my-task.svg new file mode 100644 index 0000000..1f1ea44 --- /dev/null +++ b/src/assets/svg-icon/menu/my-task.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/nested.svg b/src/assets/svg-icon/menu/nested.svg new file mode 100644 index 0000000..06713a8 --- /dev/null +++ b/src/assets/svg-icon/menu/nested.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/number.svg b/src/assets/svg-icon/menu/number.svg new file mode 100644 index 0000000..a3f7f79 --- /dev/null +++ b/src/assets/svg-icon/menu/number.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/online.svg b/src/assets/svg-icon/menu/online.svg new file mode 100644 index 0000000..f419cc4 --- /dev/null +++ b/src/assets/svg-icon/menu/online.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/password.svg b/src/assets/svg-icon/menu/password.svg new file mode 100644 index 0000000..48785d5 --- /dev/null +++ b/src/assets/svg-icon/menu/password.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/pdf.svg b/src/assets/svg-icon/menu/pdf.svg new file mode 100644 index 0000000..957aa0c --- /dev/null +++ b/src/assets/svg-icon/menu/pdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/people.svg b/src/assets/svg-icon/menu/people.svg new file mode 100644 index 0000000..2bd54ae --- /dev/null +++ b/src/assets/svg-icon/menu/people.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/peoples.svg b/src/assets/svg-icon/menu/peoples.svg new file mode 100644 index 0000000..739e953 --- /dev/null +++ b/src/assets/svg-icon/menu/peoples.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/phone.svg b/src/assets/svg-icon/menu/phone.svg new file mode 100644 index 0000000..5396034 --- /dev/null +++ b/src/assets/svg-icon/menu/phone.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/post.svg b/src/assets/svg-icon/menu/post.svg new file mode 100644 index 0000000..69db31b --- /dev/null +++ b/src/assets/svg-icon/menu/post.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/process-definition.svg b/src/assets/svg-icon/menu/process-definition.svg new file mode 100644 index 0000000..202d200 --- /dev/null +++ b/src/assets/svg-icon/menu/process-definition.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/qq.svg b/src/assets/svg-icon/menu/qq.svg new file mode 100644 index 0000000..ee13d4e --- /dev/null +++ b/src/assets/svg-icon/menu/qq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/question.svg b/src/assets/svg-icon/menu/question.svg new file mode 100644 index 0000000..a1446f6 --- /dev/null +++ b/src/assets/svg-icon/menu/question.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/radio.svg b/src/assets/svg-icon/menu/radio.svg new file mode 100644 index 0000000..96d2af5 --- /dev/null +++ b/src/assets/svg-icon/menu/radio.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/rate.svg b/src/assets/svg-icon/menu/rate.svg new file mode 100644 index 0000000..dd3c680 --- /dev/null +++ b/src/assets/svg-icon/menu/rate.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/redis-list.svg b/src/assets/svg-icon/menu/redis-list.svg new file mode 100644 index 0000000..ff6da89 --- /dev/null +++ b/src/assets/svg-icon/menu/redis-list.svg @@ -0,0 +1,2 @@ + diff --git a/src/assets/svg-icon/menu/redis.svg b/src/assets/svg-icon/menu/redis.svg new file mode 100644 index 0000000..e35ade3 --- /dev/null +++ b/src/assets/svg-icon/menu/redis.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/row.svg b/src/assets/svg-icon/menu/row.svg new file mode 100644 index 0000000..0dc8d53 --- /dev/null +++ b/src/assets/svg-icon/menu/row.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/search.svg b/src/assets/svg-icon/menu/search.svg new file mode 100644 index 0000000..84233dd --- /dev/null +++ b/src/assets/svg-icon/menu/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/select.svg b/src/assets/svg-icon/menu/select.svg new file mode 100644 index 0000000..a5b9d00 --- /dev/null +++ b/src/assets/svg-icon/menu/select.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/server.svg b/src/assets/svg-icon/menu/server.svg new file mode 100644 index 0000000..8411165 --- /dev/null +++ b/src/assets/svg-icon/menu/server.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/shopping.svg b/src/assets/svg-icon/menu/shopping.svg new file mode 100644 index 0000000..87513e7 --- /dev/null +++ b/src/assets/svg-icon/menu/shopping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/size.svg b/src/assets/svg-icon/menu/size.svg new file mode 100644 index 0000000..ddb25b8 --- /dev/null +++ b/src/assets/svg-icon/menu/size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/skill.svg b/src/assets/svg-icon/menu/skill.svg new file mode 100644 index 0000000..a3b7312 --- /dev/null +++ b/src/assets/svg-icon/menu/skill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/slider.svg b/src/assets/svg-icon/menu/slider.svg new file mode 100644 index 0000000..8b33fb0 --- /dev/null +++ b/src/assets/svg-icon/menu/slider.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/star.svg b/src/assets/svg-icon/menu/star.svg new file mode 100644 index 0000000..6cf86e6 --- /dev/null +++ b/src/assets/svg-icon/menu/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/swagger.svg b/src/assets/svg-icon/menu/swagger.svg new file mode 100644 index 0000000..895e387 --- /dev/null +++ b/src/assets/svg-icon/menu/swagger.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/switch.svg b/src/assets/svg-icon/menu/switch.svg new file mode 100644 index 0000000..d545532 --- /dev/null +++ b/src/assets/svg-icon/menu/switch.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/system.svg b/src/assets/svg-icon/menu/system.svg new file mode 100644 index 0000000..6d8d34c --- /dev/null +++ b/src/assets/svg-icon/menu/system.svg @@ -0,0 +1,2 @@ + diff --git a/src/assets/svg-icon/menu/tab.svg b/src/assets/svg-icon/menu/tab.svg new file mode 100644 index 0000000..b4b48e4 --- /dev/null +++ b/src/assets/svg-icon/menu/tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/table.svg b/src/assets/svg-icon/menu/table.svg new file mode 100644 index 0000000..0e3dc9d --- /dev/null +++ b/src/assets/svg-icon/menu/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/textarea.svg b/src/assets/svg-icon/menu/textarea.svg new file mode 100644 index 0000000..5e5acdf --- /dev/null +++ b/src/assets/svg-icon/menu/textarea.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/theme.svg b/src/assets/svg-icon/menu/theme.svg new file mode 100644 index 0000000..5982a2f --- /dev/null +++ b/src/assets/svg-icon/menu/theme.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/time-range.svg b/src/assets/svg-icon/menu/time-range.svg new file mode 100644 index 0000000..ea756ea --- /dev/null +++ b/src/assets/svg-icon/menu/time-range.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/time.svg b/src/assets/svg-icon/menu/time.svg new file mode 100644 index 0000000..1c302c7 --- /dev/null +++ b/src/assets/svg-icon/menu/time.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/tool.svg b/src/assets/svg-icon/menu/tool.svg new file mode 100644 index 0000000..c8f143c --- /dev/null +++ b/src/assets/svg-icon/menu/tool.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/tree-table.svg b/src/assets/svg-icon/menu/tree-table.svg new file mode 100644 index 0000000..8aafdb8 --- /dev/null +++ b/src/assets/svg-icon/menu/tree-table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/tree.svg b/src/assets/svg-icon/menu/tree.svg new file mode 100644 index 0000000..dd4b7dd --- /dev/null +++ b/src/assets/svg-icon/menu/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/upload.svg b/src/assets/svg-icon/menu/upload.svg new file mode 100644 index 0000000..3074272 --- /dev/null +++ b/src/assets/svg-icon/menu/upload.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/user.svg b/src/assets/svg-icon/menu/user.svg new file mode 100644 index 0000000..8f4b10a --- /dev/null +++ b/src/assets/svg-icon/menu/user.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/validCode.svg b/src/assets/svg-icon/menu/validCode.svg new file mode 100644 index 0000000..ee0f0e3 --- /dev/null +++ b/src/assets/svg-icon/menu/validCode.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/menu/waiting.svg b/src/assets/svg-icon/menu/waiting.svg new file mode 100644 index 0000000..2c2042d --- /dev/null +++ b/src/assets/svg-icon/menu/waiting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/wechat.svg b/src/assets/svg-icon/menu/wechat.svg new file mode 100644 index 0000000..c586e55 --- /dev/null +++ b/src/assets/svg-icon/menu/wechat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/workflow.svg b/src/assets/svg-icon/menu/workflow.svg new file mode 100644 index 0000000..2f7423a --- /dev/null +++ b/src/assets/svg-icon/menu/workflow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/menu/zip.svg b/src/assets/svg-icon/menu/zip.svg new file mode 100644 index 0000000..f806fc4 --- /dev/null +++ b/src/assets/svg-icon/menu/zip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svg-icon/network-error.svg b/src/assets/svg-icon/network-error.svg new file mode 100644 index 0000000..52f97ab --- /dev/null +++ b/src/assets/svg-icon/network-error.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/no-icon.svg b/src/assets/svg-icon/no-icon.svg new file mode 100644 index 0000000..f6dcdd0 --- /dev/null +++ b/src/assets/svg-icon/no-icon.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/no-permission.svg b/src/assets/svg-icon/no-permission.svg new file mode 100644 index 0000000..4c408ca --- /dev/null +++ b/src/assets/svg-icon/no-permission.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/not-found.svg b/src/assets/svg-icon/not-found.svg new file mode 100644 index 0000000..a513656 --- /dev/null +++ b/src/assets/svg-icon/not-found.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/service-error.svg b/src/assets/svg-icon/service-error.svg new file mode 100644 index 0000000..0120f1e --- /dev/null +++ b/src/assets/svg-icon/service-error.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg-icon/topiam.svg b/src/assets/svg-icon/topiam.svg new file mode 100644 index 0000000..e7ea057 --- /dev/null +++ b/src/assets/svg-icon/topiam.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svg-icon/wind.svg b/src/assets/svg-icon/wind.svg new file mode 100644 index 0000000..7c90590 --- /dev/null +++ b/src/assets/svg-icon/wind.svg @@ -0,0 +1 @@ + diff --git a/src/components/advanced/table-column-setting.vue b/src/components/advanced/table-column-setting.vue new file mode 100644 index 0000000..5c24075 --- /dev/null +++ b/src/components/advanced/table-column-setting.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/src/components/advanced/table-header-operation.vue b/src/components/advanced/table-header-operation.vue new file mode 100644 index 0000000..6cae68d --- /dev/null +++ b/src/components/advanced/table-header-operation.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/src/components/advanced/table-row-check-alert.vue b/src/components/advanced/table-row-check-alert.vue new file mode 100644 index 0000000..db4e32d --- /dev/null +++ b/src/components/advanced/table-row-check-alert.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/components/advanced/table-sider-layout.vue b/src/components/advanced/table-sider-layout.vue new file mode 100644 index 0000000..bd6b675 --- /dev/null +++ b/src/components/advanced/table-sider-layout.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/src/components/common/app-provider.vue b/src/components/common/app-provider.vue new file mode 100644 index 0000000..f6aa527 --- /dev/null +++ b/src/components/common/app-provider.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/components/common/dark-mode-container.vue b/src/components/common/dark-mode-container.vue new file mode 100644 index 0000000..71f2733 --- /dev/null +++ b/src/components/common/dark-mode-container.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/common/data-table.vue b/src/components/common/data-table.vue new file mode 100644 index 0000000..cc5ce08 --- /dev/null +++ b/src/components/common/data-table.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/components/common/exception-base.vue b/src/components/common/exception-base.vue new file mode 100644 index 0000000..418e965 --- /dev/null +++ b/src/components/common/exception-base.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/components/common/full-screen.vue b/src/components/common/full-screen.vue new file mode 100644 index 0000000..41c1c56 --- /dev/null +++ b/src/components/common/full-screen.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/src/components/common/icon-tooltip.vue b/src/components/common/icon-tooltip.vue new file mode 100644 index 0000000..d98db32 --- /dev/null +++ b/src/components/common/icon-tooltip.vue @@ -0,0 +1,42 @@ + + + diff --git a/src/components/common/lang-switch.vue b/src/components/common/lang-switch.vue new file mode 100644 index 0000000..bd9d2ec --- /dev/null +++ b/src/components/common/lang-switch.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/src/components/common/menu-toggler.vue b/src/components/common/menu-toggler.vue new file mode 100644 index 0000000..31cb1b9 --- /dev/null +++ b/src/components/common/menu-toggler.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/src/components/common/pin-toggler.vue b/src/components/common/pin-toggler.vue new file mode 100644 index 0000000..aecc92d --- /dev/null +++ b/src/components/common/pin-toggler.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/components/common/reload-button.vue b/src/components/common/reload-button.vue new file mode 100644 index 0000000..2881d03 --- /dev/null +++ b/src/components/common/reload-button.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/src/components/common/system-logo.vue b/src/components/common/system-logo.vue new file mode 100644 index 0000000..7f23cc1 --- /dev/null +++ b/src/components/common/system-logo.vue @@ -0,0 +1,9 @@ + + + + + diff --git a/src/components/common/theme-schema-switch.vue b/src/components/common/theme-schema-switch.vue new file mode 100644 index 0000000..78050d4 --- /dev/null +++ b/src/components/common/theme-schema-switch.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/components/custom/better-scroll.vue b/src/components/custom/better-scroll.vue new file mode 100644 index 0000000..7d2559c --- /dev/null +++ b/src/components/custom/better-scroll.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/src/components/custom/boolean-tag.vue b/src/components/custom/boolean-tag.vue new file mode 100644 index 0000000..627aea6 --- /dev/null +++ b/src/components/custom/boolean-tag.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/custom/button-icon.vue b/src/components/custom/button-icon.vue new file mode 100644 index 0000000..604a491 --- /dev/null +++ b/src/components/custom/button-icon.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/components/custom/count-to.vue b/src/components/custom/count-to.vue new file mode 100644 index 0000000..910b4cc --- /dev/null +++ b/src/components/custom/count-to.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/src/components/custom/dept-tree-select.vue b/src/components/custom/dept-tree-select.vue new file mode 100644 index 0000000..457c4cf --- /dev/null +++ b/src/components/custom/dept-tree-select.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/src/components/custom/dept-tree.vue b/src/components/custom/dept-tree.vue new file mode 100644 index 0000000..25ef2e8 --- /dev/null +++ b/src/components/custom/dept-tree.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/src/components/custom/dict-checkbox.vue b/src/components/custom/dict-checkbox.vue new file mode 100644 index 0000000..6483166 --- /dev/null +++ b/src/components/custom/dict-checkbox.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/src/components/custom/dict-radio.vue b/src/components/custom/dict-radio.vue new file mode 100644 index 0000000..cf83004 --- /dev/null +++ b/src/components/custom/dict-radio.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/src/components/custom/dict-select.vue b/src/components/custom/dict-select.vue new file mode 100644 index 0000000..6956dfe --- /dev/null +++ b/src/components/custom/dict-select.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/src/components/custom/dict-tag.vue b/src/components/custom/dict-tag.vue new file mode 100644 index 0000000..a96a6e3 --- /dev/null +++ b/src/components/custom/dict-tag.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/src/components/custom/file-upload.vue b/src/components/custom/file-upload.vue new file mode 100644 index 0000000..249c7fa --- /dev/null +++ b/src/components/custom/file-upload.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/src/components/custom/form-tip.vue b/src/components/custom/form-tip.vue new file mode 100644 index 0000000..352ad59 --- /dev/null +++ b/src/components/custom/form-tip.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/components/custom/json-preview.vue b/src/components/custom/json-preview.vue new file mode 100644 index 0000000..e815806 --- /dev/null +++ b/src/components/custom/json-preview.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/components/custom/look-forward.vue b/src/components/custom/look-forward.vue new file mode 100644 index 0000000..d0494f9 --- /dev/null +++ b/src/components/custom/look-forward.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/src/components/custom/menu-tree-select.vue b/src/components/custom/menu-tree-select.vue new file mode 100644 index 0000000..a08c910 --- /dev/null +++ b/src/components/custom/menu-tree-select.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/src/components/custom/menu-tree.vue b/src/components/custom/menu-tree.vue new file mode 100644 index 0000000..64f6853 --- /dev/null +++ b/src/components/custom/menu-tree.vue @@ -0,0 +1,222 @@ + + + + + diff --git a/src/components/custom/oss-upload.vue b/src/components/custom/oss-upload.vue new file mode 100644 index 0000000..1dcb07c --- /dev/null +++ b/src/components/custom/oss-upload.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/src/components/custom/post-select.vue b/src/components/custom/post-select.vue new file mode 100644 index 0000000..57cfee9 --- /dev/null +++ b/src/components/custom/post-select.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/components/custom/role-select.vue b/src/components/custom/role-select.vue new file mode 100644 index 0000000..00872d7 --- /dev/null +++ b/src/components/custom/role-select.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/components/custom/soybean-avatar.vue b/src/components/custom/soybean-avatar.vue new file mode 100644 index 0000000..8d3278a --- /dev/null +++ b/src/components/custom/soybean-avatar.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/src/components/custom/status-switch.vue b/src/components/custom/status-switch.vue new file mode 100644 index 0000000..d2856c4 --- /dev/null +++ b/src/components/custom/status-switch.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/src/components/custom/svg-icon.vue b/src/components/custom/svg-icon.vue new file mode 100644 index 0000000..504763e --- /dev/null +++ b/src/components/custom/svg-icon.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/src/components/custom/tenant-select.vue b/src/components/custom/tenant-select.vue new file mode 100644 index 0000000..de90188 --- /dev/null +++ b/src/components/custom/tenant-select.vue @@ -0,0 +1,103 @@ + + + diff --git a/src/components/custom/umo-doc-editor.vue b/src/components/custom/umo-doc-editor.vue new file mode 100644 index 0000000..10b85e4 --- /dev/null +++ b/src/components/custom/umo-doc-editor.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/components/custom/user-select.vue b/src/components/custom/user-select.vue new file mode 100644 index 0000000..91dba79 --- /dev/null +++ b/src/components/custom/user-select.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/components/custom/wave-bg.vue b/src/components/custom/wave-bg.vue new file mode 100644 index 0000000..bc58438 --- /dev/null +++ b/src/components/custom/wave-bg.vue @@ -0,0 +1,524 @@ + + + + + + diff --git a/src/constants/app.ts b/src/constants/app.ts new file mode 100644 index 0000000..a607e61 --- /dev/null +++ b/src/constants/app.ts @@ -0,0 +1,79 @@ +import { transformRecordToOption } from '@/utils/common'; + +export const GLOBAL_HEADER_MENU_ID = '__GLOBAL_HEADER_MENU__'; + +export const GLOBAL_SIDER_MENU_ID = '__GLOBAL_SIDER_MENU__'; + +export const themeSchemaRecord: Record = { + light: 'theme.appearance.themeSchema.light', + dark: 'theme.appearance.themeSchema.dark', + auto: 'theme.appearance.themeSchema.auto' +}; + +export const themeSchemaOptions = transformRecordToOption(themeSchemaRecord); + +export const loginModuleRecord: Record = { + 'pwd-login': 'page.login.pwdLogin.title', + 'code-login': 'page.login.codeLogin.title', + register: 'page.login.register.title', + 'reset-pwd': 'page.login.resetPwd.title', + 'bind-wechat': 'page.login.bindWeChat.title' +}; + +export const themeLayoutModeRecord: Record = { + vertical: 'theme.layout.layoutMode.vertical', + 'vertical-mix': 'theme.layout.layoutMode.vertical-mix', + 'vertical-hybrid-header-first': 'theme.layout.layoutMode.vertical-hybrid-header-first', + horizontal: 'theme.layout.layoutMode.horizontal', + 'top-hybrid-sidebar-first': 'theme.layout.layoutMode.top-hybrid-sidebar-first', + 'top-hybrid-header-first': 'theme.layout.layoutMode.top-hybrid-header-first' +}; + +export const themeLayoutModeOptions = transformRecordToOption(themeLayoutModeRecord); + +export const themeScrollModeRecord: Record = { + wrapper: 'theme.layout.content.scrollMode.wrapper', + content: 'theme.layout.content.scrollMode.content' +}; + +export const themeScrollModeOptions = transformRecordToOption(themeScrollModeRecord); + +export const themeTabModeRecord: Record = { + chrome: 'theme.layout.tab.mode.chrome', + button: 'theme.layout.tab.mode.button', + slider: 'theme.layout.tab.mode.slider' +}; + +export const themeTabModeOptions = transformRecordToOption(themeTabModeRecord); + +export const themePageAnimationModeRecord: Record = { + 'fade-slide': 'theme.layout.content.page.mode.fade-slide', + fade: 'theme.layout.content.page.mode.fade', + 'fade-bottom': 'theme.layout.content.page.mode.fade-bottom', + 'fade-scale': 'theme.layout.content.page.mode.fade-scale', + 'zoom-fade': 'theme.layout.content.page.mode.zoom-fade', + 'zoom-out': 'theme.layout.content.page.mode.zoom-out', + none: 'theme.layout.content.page.mode.none' +}; + +export const themePageAnimationModeOptions = transformRecordToOption(themePageAnimationModeRecord); + +export const DARK_CLASS = 'dark'; + +export const watermarkTimeFormatOptions = [ + { label: 'YYYY-MM-DD HH:mm', value: 'YYYY-MM-DD HH:mm' }, + { label: 'YYYY-MM-DD HH:mm:ss', value: 'YYYY-MM-DD HH:mm:ss' }, + { label: 'YYYY/MM/DD HH:mm', value: 'YYYY/MM/DD HH:mm' }, + { label: 'YYYY/MM/DD HH:mm:ss', value: 'YYYY/MM/DD HH:mm:ss' }, + { label: 'HH:mm', value: 'HH:mm' }, + { label: 'HH:mm:ss', value: 'HH:mm:ss' }, + { label: 'MM-DD HH:mm', value: 'MM-DD HH:mm' } +]; + +export const themeTableSizeRecord: Record = { + small: 'theme.table.size.small', + medium: 'theme.table.size.medium', + large: 'theme.table.size.large' +}; + +export const themeTableSizeOptions = transformRecordToOption(themeTableSizeRecord); diff --git a/src/constants/business.ts b/src/constants/business.ts new file mode 100644 index 0000000..6c3a709 --- /dev/null +++ b/src/constants/business.ts @@ -0,0 +1,138 @@ +import { transformRecordToOption } from '@/utils/common'; + +/** enable status */ +export const enableStatusRecord: Record = { + '0': '正常', + '1': '停用' +}; + +export const enableStatusOptions = transformRecordToOption(enableStatusRecord); + +/** yes or no status */ +export const yesOrNoStatusRecord: Record = { + Y: '是', + N: '否' +}; + +export const yesOrNoStatusOptions = transformRecordToOption(yesOrNoStatusRecord); + +/** menu type */ +export const menuTypeRecord: Record = { + M: '目录', + C: '菜单', + F: '按钮' +}; + +export const menuTypeOptions = transformRecordToOption(menuTypeRecord); + +/** menu is frame */ +export const menuIsFrameRecord: Record = { + '0': '是', + '1': '否', + '2': 'iframe' +}; + +export const menuIsFrameOptions = transformRecordToOption(menuIsFrameRecord); + +/** menu icon type */ +export const menuIconTypeRecord: Record = { + '1': 'iconify', + '2': '本地图标' +}; + +export const menuIconTypeOptions = transformRecordToOption(menuIconTypeRecord); + +/** menu layout */ +export const menuLayoutRecord: Record = { + '0': '默认布局', + '1': '空白布局' +}; + +export const menuLayoutOptions = transformRecordToOption(menuLayoutRecord); + +/** gen java type */ +export const genJavaTypeRecord: Record = { + Long: 'Long', + String: 'String', + Integer: 'Integer', + Double: 'Double', + BigDecimal: 'BigDecimal', + Date: 'Date', + Boolean: 'Boolean' +}; + +export const genJavaTypeOptions = transformRecordToOption(genJavaTypeRecord); + +/** gen query type */ +export const genQueryTypeRecord: Record = { + EQ: '=', + NE: '!=', + GT: '>', + GE: '>=', + LT: '<', + LE: '<=', + LIKE: 'LIKE', + BETWEEN: 'BETWEEN' +}; + +export const genQueryTypeOptions = transformRecordToOption(genQueryTypeRecord); + +/** gen html type */ +export const genHtmlTypeRecord: Record = { + input: '文本框', + textarea: '文本域', + select: '下拉框', + radio: '单选框', + checkbox: '复选框', + datetime: '日期时间控件', + imageUpload: '图片上传', + fileUpload: '文件上传', + editor: '富文本控件' +}; + +export const genHtmlTypeOptions = transformRecordToOption(genHtmlTypeRecord); + +/** gen type */ +export const genTypeRecord: Record = { + '0': 'ZIP 压缩包', + '1': '自定义路径' +}; + +export const genTypeOptions = transformRecordToOption(genTypeRecord); + +/** gen type */ +export const genTplCategoryRecord: Record = { + crud: '单表(增删改查)', + tree: '树表(增删改查)' +}; + +export const genTplCategoryOptions = transformRecordToOption(genTplCategoryRecord); + +/** oss config is https */ +export const ossConfigIsHttpsRecord: Record = { + Y: 'https://', + N: 'http://' +}; + +export const ossConfigIsHttpsOptions = transformRecordToOption(ossConfigIsHttpsRecord); + +/** oss access policy */ +export const ossAccessPolicyRecord: Record = { + '0': '私有', + '1': '公有', + '2': '自定义' +}; + +export const ossAccessPolicyOptions = transformRecordToOption(ossAccessPolicyRecord); + +/** data scope */ +export const dataScopeRecord: Record = { + '1': '全部数据权限', + '2': '自定数据权限', + '3': '本部门数据权限', + '4': '本部门及以下数据权限', + '5': '仅本人数据权限', + '6': '部门及以下或本人数据权限' +}; + +export const dataScopeOptions = transformRecordToOption(dataScopeRecord); diff --git a/src/constants/common.ts b/src/constants/common.ts new file mode 100644 index 0000000..f4a45b1 --- /dev/null +++ b/src/constants/common.ts @@ -0,0 +1,15 @@ +import { transformRecordToOption } from '@/utils/common'; + +export const yesOrNoRecord: Record = { + Y: 'common.yesOrNo.yes', + N: 'common.yesOrNo.no' +}; + +export const yesOrNoOptions = transformRecordToOption(yesOrNoRecord); + +export const errorCodeRecord: Record = { + '401': '认证失败,无法访问系统资源', + '403': '当前操作没有权限', + '404': '访问资源不存在', + default: '系统未知错误,请反馈给管理员' +}; diff --git a/src/constants/reg.ts b/src/constants/reg.ts new file mode 100644 index 0000000..d8bc32b --- /dev/null +++ b/src/constants/reg.ts @@ -0,0 +1,25 @@ +export const REG_USER_NAME = /^[\u4E00-\u9FA5a-zA-Z0-9_-]{4,16}$/; + +/** Phone reg */ +export const REG_PHONE = + /^[1](([3][0-9])|([4][01456789])|([5][012356789])|([6][2567])|([7][0-8])|([8][0-9])|([9][012356789]))[0-9]{8}$/; + +/** + * Password reg + * + * 6-18 characters, including letters, numbers, and underscores + */ +export const REG_PWD = /^(?![a-zA-Z]+$)(?!\d+$)(?![^\da-zA-Z\s]+$).{6,18}$/; + +/** Email reg */ +export const REG_EMAIL = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; + +/** Six digit code reg */ +export const REG_CODE_SIX = /^\d{6}$/; + +/** Four digit code reg */ +export const REG_CODE_FOUR = /^\d{4}$/; + +/** Url reg */ +export const REG_URL = + /(((^https?:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))?)$/; diff --git a/src/enum/business.ts b/src/enum/business.ts new file mode 100644 index 0000000..e5b62ec --- /dev/null +++ b/src/enum/business.ts @@ -0,0 +1,4 @@ +export enum AcceptType { + Image = '.jpg,.jpeg,.png,.gif,.bmp,.webp', + File = '.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.pdf,.zip,.rar,.7z' +} diff --git a/src/enum/index.ts b/src/enum/index.ts new file mode 100644 index 0000000..7b6c20a --- /dev/null +++ b/src/enum/index.ts @@ -0,0 +1,9 @@ +export enum SetupStoreId { + App = 'app-store', + Theme = 'theme-store', + Auth = 'auth-store', + Route = 'route-store', + Tab = 'tab-store', + Notice = 'notice-store', + Dict = 'dict-store' +} diff --git a/src/hooks/business/auth.ts b/src/hooks/business/auth.ts new file mode 100644 index 0000000..633818b --- /dev/null +++ b/src/hooks/business/auth.ts @@ -0,0 +1,46 @@ +import { useAuthStore } from '@/store/modules/auth'; + +export function useAuth() { + const authStore = useAuthStore(); + + function hasAuth(codes: string | string[]) { + if (!authStore.isLogin) { + return false; + } + + const { permissions } = authStore.userInfo; + + // 超级管理员拥有所有权限 + if (permissions.includes('*:*:*')) { + return true; + } + + // 将单个权限转换为数组统一处理 + const codeList = Array.isArray(codes) ? codes : [codes]; + + return codeList.some(code => permissions.includes(code)); + } + + function hasRole(roleCodes: string | string[]) { + if (!authStore.isLogin) { + return false; + } + + const { roles } = authStore.userInfo; + + // 超级管理员拥有所有角色权限 + if (roles.includes('superadmin') || roles.includes('admin')) { + return true; + } + + // 将单个角色转换为数组统一处理 + const codeList = Array.isArray(roleCodes) ? roleCodes : [roleCodes]; + + return codeList.some(code => roles.includes(code)); + } + + return { + hasAuth, + hasRole + }; +} diff --git a/src/hooks/business/captcha.ts b/src/hooks/business/captcha.ts new file mode 100644 index 0000000..98124d9 --- /dev/null +++ b/src/hooks/business/captcha.ts @@ -0,0 +1,71 @@ +import { computed } from 'vue'; +import { useCountDown, useLoading } from '@sa/hooks'; +import { REG_PHONE } from '@/constants/reg'; +import { $t } from '@/locales'; + +export function useCaptcha() { + const { loading, startLoading, endLoading } = useLoading(); + const { count, start, stop, isCounting } = useCountDown(10); + + const label = computed(() => { + let text = $t('page.login.codeLogin.getCode'); + + const countingLabel = $t('page.login.codeLogin.reGetCode', { time: count.value }); + + if (loading.value) { + text = ''; + } + + if (isCounting.value) { + text = countingLabel; + } + + return text; + }); + + function isPhoneValid(phone: string) { + if (phone.trim() === '') { + window.$message?.error?.($t('form.phone.required')); + + return false; + } + + if (!REG_PHONE.test(phone)) { + window.$message?.error?.($t('form.phone.invalid')); + + return false; + } + + return true; + } + + async function getCaptcha(phone: string) { + const valid = isPhoneValid(phone); + + if (!valid || loading.value) { + return; + } + + startLoading(); + + // request + await new Promise(resolve => { + setTimeout(resolve, 500); + }); + + window.$message?.success?.($t('page.login.codeLogin.sendCodeSuccess')); + + start(); + + endLoading(); + } + + return { + label, + start, + stop, + isCounting, + loading, + getCaptcha + }; +} diff --git a/src/hooks/business/dict.ts b/src/hooks/business/dict.ts new file mode 100644 index 0000000..03c0b49 --- /dev/null +++ b/src/hooks/business/dict.ts @@ -0,0 +1,85 @@ +import { ref, watch } from 'vue'; +import { storeToRefs } from 'pinia'; +import { fetchGetDictDataByType } from '@/service/api/system'; +import { useDictStore } from '@/store/modules/dict'; +import { isNull } from '@/utils/common'; +import { $t } from '@/locales'; + +export function useDict(dictType: string, immediate: boolean = true) { + const dictStore = useDictStore(); + const { dictData: dictList } = storeToRefs(dictStore); + + const data = ref([]); + const record = ref>({}); + const options = ref([]); + + async function getData() { + const dicts = dictStore.getDict(dictType); + if (dicts) { + data.value = dicts; + return; + } + const { data: dictData, error } = await fetchGetDictDataByType(dictType); + if (error) return; + dictData.forEach(dict => { + if (dict.dictLabel?.startsWith(`dict.${dictType}.`)) { + dict.dictLabel = $t(dict.dictLabel as App.I18n.I18nKey); + } + }); + dictStore.setDict(dictType, dictData); + data.value = dictData; + } + + async function getRecord() { + if (!data.value.length) { + await getData(); + } + data.value.forEach(dict => { + record.value[dict.dictValue!] = dict.dictLabel!; + }); + } + + async function getOptions() { + if (!data.value.length) { + await getData(); + } + + options.value = data.value.map(dict => ({ label: dict.dictLabel!, value: dict.dictValue! })); + } + + function transformDictData(dictValue: string[] | number[] | string | number) { + if (!data.value.length || isNull(dictValue)) return undefined; + if (Array.isArray(dictValue)) { + return data.value.filter(dict => dictValue.some(value => dict.dictValue === value.toString())); + } + return data.value.filter(dict => dict.dictValue === dictValue.toString()); + } + + if (immediate) { + getData().then(() => { + getRecord(); + getOptions(); + }); + } else { + watch( + () => dictList.value[dictType], + val => { + if (val && val.length) { + getRecord(); + getOptions(); + } + }, + { immediate: true } + ); + } + + return { + data, + record, + options, + getData, + getRecord, + getOptions, + transformDictData + }; +} diff --git a/src/hooks/business/download.ts b/src/hooks/business/download.ts new file mode 100644 index 0000000..357680d --- /dev/null +++ b/src/hooks/business/download.ts @@ -0,0 +1,166 @@ +import StreamSaver from 'streamsaver'; +import { errorCodeRecord } from '@/constants/common'; +import { localStg } from '@/utils/storage'; +import { getServiceBaseURL } from '@/utils/service'; +import { transformToURLSearchParams } from '@/utils/common'; + +interface RequestConfig { + method: 'GET' | 'POST'; + url: string; + params?: Record; + filename?: string; + contentType?: string; +} + +export function useDownload() { + const isHttpProxy = import.meta.env.DEV && import.meta.env.VITE_HTTP_PROXY === 'Y'; + const { baseURL } = getServiceBaseURL(import.meta.env, isHttpProxy); + + const isHttps = () => { + const protocol = document.location.protocol; + const hostname = document.location.hostname; + return protocol === 'https' || hostname === 'localhost' || hostname === '127.0.0.1'; + }; + + /** 获取通用请求头 */ + const getCommonHeaders = (contentType = 'application/octet-stream') => ({ + Authorization: `Bearer ${localStg.get('token')}`, + Clientid: import.meta.env.VITE_APP_CLIENT_ID!, + 'Content-Type': contentType + }); + + /** 通用下载方法 */ + function downloadByData(data: BlobPart, filename: string, type = 'application/octet-stream') { + const blob = new Blob([data], { type }); + const blobURL = window.URL.createObjectURL(blob); + + const tempLink = Object.assign(document.createElement('a'), { + style: { display: 'none' }, + href: blobURL, + download: filename + }); + + if (typeof tempLink.download === 'undefined') { + tempLink.setAttribute('target', '_blank'); + } + + document.body.appendChild(tempLink); + tempLink.click(); + document.body.removeChild(tempLink); + window.URL.revokeObjectURL(blobURL); + } + + /** 流式下载 */ + async function downloadByStream( + readableStream: ReadableStream, + filename: string, + contentLength?: number + ): Promise { + window.$loading?.endLoading(); + StreamSaver.mitm = '/streamsaver/mitm.html?version=2.0.0'; + const fileStream = StreamSaver.createWriteStream(filename, { size: contentLength }); + + if (window.WritableStream && readableStream?.pipeTo) { + await readableStream.pipeTo(fileStream); + window.$message?.success('下载完成'); + return; + } + + // 降级处理 + const writer = fileStream.getWriter(); + const reader = readableStream.getReader(); + + const pump = async (): Promise => { + const { done, value } = await reader.read(); + if (done) return writer.close(); + await writer.write(value); + return pump(); + }; + + await pump(); + } + + /** 处理响应 */ + async function handleResponse(response: Response) { + if (response.headers.get('Content-Type')?.includes('application/json')) { + const res = await response.json(); + const code = res.code as CommonType.ErrorCode; + throw new Error(errorCodeRecord[code] || res.msg || errorCodeRecord.default); + } + } + + /** 核心下载逻辑 */ + async function executeDownload(config: RequestConfig): Promise { + const { method, url, params, filename, contentType } = config; + const timestamp = Date.now(); + const fullUrl = `${baseURL}${url}${url.includes('?') ? '&' : '?'}t=${timestamp}`; + + window.$loading?.startLoading('正在下载数据,请稍候...'); + + try { + const requestOptions: RequestInit = { + method, + headers: getCommonHeaders(contentType) + }; + + if (method === 'POST' && params) { + requestOptions.body = transformToURLSearchParams(params); + requestOptions.headers = { + ...requestOptions.headers, + 'Content-Type': 'application/x-www-form-urlencoded' + }; + } + + const response = await fetch(fullUrl, requestOptions); + + if (response.status !== 200) { + throw new Error(errorCodeRecord.default); + } + + await handleResponse(response); + + const rawHeader = response.headers.get('Download-Filename'); + const finalFilename = filename || (rawHeader ? decodeURIComponent(rawHeader) : null) || `download-${timestamp}`; + + if (response.body && isHttps()) { + const contentLength = Number(response.headers.get('Content-Length')); + await downloadByStream(response.body, finalFilename, contentLength); + return; + } + + const responseContentType = response.headers.get('Content-Type'); + const mainType = responseContentType?.split(';')[0]?.trim() || 'application/octet-stream'; + downloadByData(await response.blob(), finalFilename, mainType); + } catch (error: any) { + window.$message?.error(error.message); + } finally { + window.$loading?.endLoading(); + } + } + + /** 公共下载接口 */ + const download = (url: string, params: Record, filename: string) => + executeDownload({ method: 'POST', url, params, filename }); + + /** OSS文件下载 */ + const oss = (ossId: CommonType.IdType) => + executeDownload({ + method: 'GET', + url: `/resource/oss/download/${ossId}` + }); + + /** ZIP文件下载 */ + const zip = (url: string, filename: string) => + executeDownload({ + method: 'GET', + url, + filename, + contentType: 'application/octet-stream' + }); + + return { + oss, + zip, + download + }; +} diff --git a/src/hooks/common/echarts.ts b/src/hooks/common/echarts.ts new file mode 100644 index 0000000..8e7c728 --- /dev/null +++ b/src/hooks/common/echarts.ts @@ -0,0 +1,230 @@ +import { computed, effectScope, nextTick, onScopeDispose, shallowRef, watch } from 'vue'; +import { useElementSize } from '@vueuse/core'; +import * as echarts from 'echarts/core'; +import { BarChart, GaugeChart, LineChart, PictorialBarChart, PieChart, RadarChart, ScatterChart } from 'echarts/charts'; +import type { + BarSeriesOption, + GaugeSeriesOption, + LineSeriesOption, + PictorialBarSeriesOption, + PieSeriesOption, + RadarSeriesOption, + ScatterSeriesOption +} from 'echarts/charts'; +import { + DatasetComponent, + GridComponent, + LegendComponent, + TitleComponent, + ToolboxComponent, + TooltipComponent, + TransformComponent +} from 'echarts/components'; +import type { + DatasetComponentOption, + GridComponentOption, + LegendComponentOption, + TitleComponentOption, + ToolboxComponentOption, + TooltipComponentOption +} from 'echarts/components'; +import { LabelLayout, UniversalTransition } from 'echarts/features'; +import { CanvasRenderer } from 'echarts/renderers'; +import { useThemeStore } from '@/store/modules/theme'; + +export type ECOption = echarts.ComposeOption< + | BarSeriesOption + | LineSeriesOption + | PieSeriesOption + | ScatterSeriesOption + | PictorialBarSeriesOption + | RadarSeriesOption + | GaugeSeriesOption + | TitleComponentOption + | LegendComponentOption + | TooltipComponentOption + | GridComponentOption + | ToolboxComponentOption + | DatasetComponentOption +>; + +echarts.use([ + TitleComponent, + LegendComponent, + TooltipComponent, + GridComponent, + DatasetComponent, + TransformComponent, + ToolboxComponent, + BarChart, + LineChart, + PieChart, + ScatterChart, + PictorialBarChart, + RadarChart, + GaugeChart, + LabelLayout, + UniversalTransition, + CanvasRenderer +]); + +interface ChartHooks { + onRender?: (chart: echarts.ECharts) => void | Promise; + onUpdated?: (chart: echarts.ECharts) => void | Promise; + onDestroy?: (chart: echarts.ECharts) => void | Promise; +} + +/** + * use echarts + * + * @param optionsFactory echarts options factory function + * @param darkMode dark mode + */ +export function useEcharts(optionsFactory: () => T, hooks: ChartHooks = {}) { + const scope = effectScope(); + + const themeStore = useThemeStore(); + const darkMode = computed(() => themeStore.darkMode); + + const domRef = shallowRef(null); + const initialSize = { width: 0, height: 0 }; + const { width, height } = useElementSize(domRef, initialSize); + + const chart = shallowRef(null); + const chartOptions: T = optionsFactory(); + + const { + onRender = instance => { + const textColor = darkMode.value ? 'rgb(224, 224, 224)' : 'rgb(31, 31, 31)'; + const maskColor = darkMode.value ? 'rgba(0, 0, 0, 0.4)' : 'rgba(255, 255, 255, 0.8)'; + + instance.showLoading({ + color: themeStore.themeColor, + textColor, + fontSize: 14, + maskColor + }); + }, + onUpdated = instance => { + instance.hideLoading(); + }, + onDestroy + } = hooks; + + /** is chart rendered */ + function isRendered() { + return Boolean(domRef.value && chart.value); + } + + /** + * update chart options + * + * @param callback callback function + */ + async function updateOptions(callback: (opts: T, optsFactory: () => T) => ECOption = () => chartOptions) { + const updatedOpts = callback(chartOptions, optionsFactory); + + Object.assign(chartOptions, updatedOpts); + + await nextTick(); + + if (!isRendered()) return; + + if (isRendered()) { + chart.value?.clear(); + } + + chart.value?.setOption({ ...updatedOpts, backgroundColor: 'transparent' }); + + await onUpdated?.(chart.value!); + } + + function setOptions(options: T) { + chart.value?.setOption(options); + } + + /** render chart */ + async function render() { + if (isRendered()) return; + + const chartTheme = darkMode.value ? 'dark' : 'light'; + + chart.value = echarts.init(domRef.value, chartTheme); + + chart.value?.setOption({ ...chartOptions, backgroundColor: 'transparent' }); + + await onRender?.(chart.value!); + } + + /** resize chart */ + function resize() { + chart.value?.resize(); + } + + /** destroy chart */ + async function destroy() { + if (!chart.value) return; + + await onDestroy?.(chart.value); + chart.value?.dispose(); + chart.value = null; + } + + /** change chart theme */ + async function changeTheme() { + await destroy(); + await render(); + await onUpdated?.(chart.value!); + } + + /** + * render chart by size + * + * @param w width + * @param h height + */ + async function renderChartBySize(w: number, h: number) { + initialSize.width = w; + initialSize.height = h; + + // resize chart + if (isRendered()) { + resize(); + + return; + } + + // render chart + await render(); + + if (chart.value) { + await onUpdated?.(chart.value); + } + } + + scope.run(() => { + watch( + [width, height], + ([newWidth, newHeight]) => { + renderChartBySize(newWidth, newHeight); + }, + { flush: 'post' } + ); + + watch(darkMode, () => { + changeTheme(); + }); + }); + + onScopeDispose(() => { + destroy(); + scope.stop(); + }); + + return { + domRef, + chart, + updateOptions, + setOptions + }; +} diff --git a/src/hooks/common/form.ts b/src/hooks/common/form.ts new file mode 100644 index 0000000..fa6ce6f --- /dev/null +++ b/src/hooks/common/form.ts @@ -0,0 +1,112 @@ +import { ref, toValue } from 'vue'; +import type { ComputedRef, Ref } from 'vue'; +import type { FormInst } from 'naive-ui'; +import { REG_CODE_SIX, REG_EMAIL, REG_PHONE, REG_PWD, REG_USER_NAME } from '@/constants/reg'; +import { isNull } from '@/utils/common'; +import { $t } from '@/locales'; + +export function useFormRules() { + const patternRules = { + userName: { + pattern: REG_USER_NAME, + message: $t('form.userName.invalid'), + trigger: ['change', 'blur'] + }, + phone: { + pattern: REG_PHONE, + message: $t('form.phone.invalid'), + trigger: 'change' + }, + pwd: { + pattern: REG_PWD, + message: $t('form.pwd.invalid'), + trigger: ['change', 'blur'] + }, + code: { + pattern: REG_CODE_SIX, + message: $t('form.code.invalid'), + trigger: 'change' + }, + email: { + pattern: REG_EMAIL, + message: $t('form.email.invalid'), + trigger: 'change' + } + } satisfies Record; + + const formRules = { + userName: [createRequiredRule($t('form.userName.required')), patternRules.userName], + phone: [createRequiredRule($t('form.phone.required')), patternRules.phone], + pwd: [createRequiredRule($t('form.pwd.required')), patternRules.pwd], + code: [createRequiredRule($t('form.code.required')), patternRules.code], + email: [createRequiredRule($t('form.email.required')), patternRules.email], + tenantId: [createRequiredRule('请选择/输入公司名称')] + } satisfies Record; + + /** the default required rule */ + const defaultRequiredRule = createRequiredRule($t('form.required')); + + /** the default number required rule */ + + function createRequiredRule(message: string): App.Global.FormRule { + return { + required: true, + trigger: ['input', 'blur'], + validator: (_rule: any, value: any) => { + if (isNull(value) || (Array.isArray(value) && value.length === 0)) { + return new Error(message); + } + return true; + } + }; + } + + function createNumberRequiredRule(message: string): App.Global.FormRule { + return { ...createRequiredRule(message), type: 'number' }; + } + + /** create a rule for confirming the password */ + function createConfirmPwdRule(pwd: string | Ref | ComputedRef) { + const confirmPwdRule: App.Global.FormRule[] = [ + { required: true, message: $t('form.confirmPwd.required') }, + { + asyncValidator: (rule, value) => { + if (value.trim() !== '' && value !== toValue(pwd)) { + return Promise.reject(rule.message); + } + return Promise.resolve(); + }, + message: $t('form.confirmPwd.invalid'), + trigger: 'input' + } + ]; + return confirmPwdRule; + } + + return { + patternRules, + formRules, + defaultRequiredRule, + createRequiredRule, + createConfirmPwdRule, + createNumberRequiredRule + }; +} + +export function useNaiveForm() { + const formRef = ref(null); + + async function validate() { + await formRef.value?.validate(); + } + + async function restoreValidation() { + formRef.value?.restoreValidation(); + } + + return { + formRef, + validate, + restoreValidation + }; +} diff --git a/src/hooks/common/icon.ts b/src/hooks/common/icon.ts new file mode 100644 index 0000000..8998f60 --- /dev/null +++ b/src/hooks/common/icon.ts @@ -0,0 +1,10 @@ +import { useSvgIconRender } from '@sa/hooks'; +import SvgIcon from '@/components/custom/svg-icon.vue'; + +export function useSvgIcon() { + const { SvgIconVNode } = useSvgIconRender(SvgIcon); + + return { + SvgIconVNode + }; +} diff --git a/src/hooks/common/loading.ts b/src/hooks/common/loading.ts new file mode 100644 index 0000000..27ddc41 --- /dev/null +++ b/src/hooks/common/loading.ts @@ -0,0 +1,25 @@ +import { ref } from 'vue'; +import { useLoading } from '@sa/hooks'; + +/** Content Loading */ +export default function useContentLoading() { + const description = ref('loading...'); + const loading = useLoading(); + + function startLoading(desc: string = 'loading...') { + description.value = desc; + loading.startLoading(); + } + + function endLoading() { + description.value = 'loading...'; + loading.endLoading(); + } + + return { + loading: loading.loading, + description, + startLoading, + endLoading + }; +} diff --git a/src/hooks/common/router.ts b/src/hooks/common/router.ts new file mode 100644 index 0000000..3fadcbe --- /dev/null +++ b/src/hooks/common/router.ts @@ -0,0 +1,116 @@ +import { useRouter } from 'vue-router'; +import type { RouteLocationRaw } from 'vue-router'; +import type { RouteKey } from '@elegant-router/types'; +import { router as globalRouter } from '@/router'; + +/** + * Router push + * + * Jump to the specified route, it can replace function router.push + * + * @param inSetup Whether is in vue script setup + */ +export function useRouterPush(inSetup = true) { + const router = inSetup ? useRouter() : globalRouter; + const route = globalRouter.currentRoute; + + const routerPush = router.push; + + const routerBack = router.back; + + async function routerPushByKey(key: RouteKey, options?: App.Global.RouterPushOptions) { + const { query, params } = options || {}; + + const routeLocation: RouteLocationRaw = { + name: key + }; + + if (Object.keys(query || {}).length) { + routeLocation.query = query; + } + + if (Object.keys(params || {}).length) { + routeLocation.params = params; + } + + return routerPush(routeLocation); + } + + function routerPushByKeyWithMetaQuery(key: RouteKey) { + const allRoutes = router.getRoutes(); + const meta = allRoutes.find(item => item.name === key)?.meta || null; + + const query: Record = {}; + + meta?.query?.forEach(item => { + query[item.key] = item.value; + }); + + return routerPushByKey(key, { query }); + } + + async function toHome() { + return routerPushByKey('root'); + } + + /** + * Navigate to login page + * + * @param loginModule The login module + * @param redirectUrl The redirect url, if not specified, it will be the current route fullPath + */ + async function toLogin(loginModule?: UnionKey.LoginModule, redirectUrl?: string) { + const module = loginModule || 'pwd-login'; + + const options: App.Global.RouterPushOptions = { + params: { + module + } + }; + + const redirect = redirectUrl || route.value.fullPath; + + options.query = { + redirect + }; + + return routerPushByKey('login', options); + } + + /** + * Toggle login module + * + * @param module + */ + async function toggleLoginModule(module: UnionKey.LoginModule) { + const query = route.value.query as Record; + + return routerPushByKey('login', { query, params: { module } }); + } + + /** + * Redirect from login + * + * @param [needRedirect=true] Whether to redirect after login. Default is `true` + */ + async function redirectFromLogin(needRedirect = true) { + const redirect = route.value.query?.redirect as string; + + if (needRedirect && redirect) { + await routerPush(redirect); + } else { + await toHome(); + } + } + + return { + routerPush, + routerBack, + routerPushByKey, + routerPushByKeyWithMetaQuery, + toLogin, + toggleLoginModule, + redirectFromLogin, + toHome + }; +} diff --git a/src/hooks/common/table.ts b/src/hooks/common/table.ts new file mode 100644 index 0000000..096fcf5 --- /dev/null +++ b/src/hooks/common/table.ts @@ -0,0 +1,477 @@ +import { computed, effectScope, onScopeDispose, reactive, ref, shallowRef, watch } from 'vue'; +import type { Ref } from 'vue'; +import type { PaginationProps } from 'naive-ui'; +import { useBoolean, useTable } from '@sa/hooks'; +import type { PaginationData, TableColumnCheck, UseTableOptions } from '@sa/hooks'; +import type { FlatResponseData } from '@sa/axios'; +import { jsonClone } from '@sa/utils'; +import { useAppStore } from '@/store/modules/app'; +import { handleTree } from '@/utils/common'; +import { $t } from '@/locales'; + +export type UseNaiveTableOptions = Omit< + UseTableOptions, Pagination>, + 'pagination' | 'getColumnChecks' | 'getColumns' +> & { + /** + * get column visible + * + * @param column + * + * @default true + * + * @returns true if the column is visible, false otherwise + */ + getColumnVisible?: (column: NaiveUI.TableColumn) => boolean; +}; + +const SELECTION_KEY = '__selection__'; + +const EXPAND_KEY = '__expand__'; + +export function useNaiveTable(options: UseNaiveTableOptions) { + const scope = effectScope(); + const appStore = useAppStore(); + + const result = useTable, false>({ + ...options, + getColumnChecks: cols => getColumnChecks(cols, options.getColumnVisible), + getColumns + }); + + // calculate the total width of the table this is used for horizontal scrolling + const scrollX = computed(() => { + return result.columns.value.reduce((acc, column) => { + return acc + Number(column.width ?? column.minWidth ?? 120); + }, 0); + }); + + scope.run(() => { + watch( + () => appStore.locale, + () => { + result.reloadColumns(); + } + ); + }); + + onScopeDispose(() => { + scope.stop(); + }); + + return { + ...result, + scrollX + }; +} + +type PaginationParams = Pick; + +type UseNaivePaginatedTableOptions = UseNaiveTableOptions & { + paginationProps?: Omit; + /** + * whether to show the total count of the table + * + * @default true + */ + showTotal?: boolean; + onPaginationParamsChange?: (params: PaginationParams) => void | Promise; +}; + +export function useNaivePaginatedTable( + options: UseNaivePaginatedTableOptions +) { + const scope = effectScope(); + const appStore = useAppStore(); + + const isMobile = computed(() => appStore.isMobile); + + const showTotal = computed(() => options.showTotal ?? true); + + const pagination = reactive({ + page: 1, + pageSize: 10, + itemCount: 0, + showSizePicker: true, + pageSizes: [10, 15, 20, 25, 30], + prefix: showTotal.value ? page => $t('datatable.itemCount', { total: page.itemCount }) : undefined, + onUpdatePage(page) { + pagination.page = page; + }, + onUpdatePageSize(pageSize) { + pagination.pageSize = pageSize; + pagination.page = 1; + }, + ...options.paginationProps + }) as PaginationProps; + + // this is for mobile, if the system does not support mobile, you can use `pagination` directly + const mobilePagination = computed(() => { + const p: PaginationProps = { + ...pagination, + pageSlot: isMobile.value ? 3 : 9, + prefix: !isMobile.value && showTotal.value ? pagination.prefix : undefined + }; + + return p; + }); + + const paginationParams = computed(() => { + const { page, pageSize } = pagination; + + return { + page, + pageSize + }; + }); + + const result = useTable, true>({ + ...options, + pagination: true, + getColumnChecks: cols => getColumnChecks(cols, options.getColumnVisible), + getColumns, + onFetched: data => { + pagination.itemCount = data.total; + } + }); + + // calculate the total width of the table this is used for horizontal scrolling + const scrollX = computed(() => { + return result.columns.value.reduce((acc, column) => { + return acc + Number(column.width ?? column.minWidth ?? 120); + }, 0); + }); + + async function getDataByPage(page: number = 1) { + if (page !== pagination.page) { + pagination.page = page; + + return; + } + + await result.getData(); + } + + scope.run(() => { + watch( + () => appStore.locale, + () => { + result.reloadColumns(); + } + ); + + watch(paginationParams, async newVal => { + await options.onPaginationParamsChange?.(newVal); + + await result.getData(); + }); + }); + + onScopeDispose(() => { + scope.stop(); + }); + + return { + ...result, + scrollX, + getDataByPage, + pagination, + mobilePagination + }; +} + +export function useTableOperate( + data: Ref, + idKey: keyof TableData, + getData: () => Promise +) { + const { bool: drawerVisible, setTrue: openDrawer, setFalse: closeDrawer } = useBoolean(); + + const operateType = shallowRef('add'); + + function handleAdd() { + operateType.value = 'add'; + openDrawer(); + } + + /** the editing row data */ + const editingData = shallowRef(null); + + function handleEdit(id: TableData[keyof TableData]) { + operateType.value = 'edit'; + const findItem = data.value.find(item => item[idKey] === id) || null; + editingData.value = jsonClone(findItem); + + openDrawer(); + } + + /** the checked row keys of table */ + const checkedRowKeys = shallowRef([]); + + /** the hook after the batch delete operation is completed */ + async function onBatchDeleted() { + window.$message?.success($t('common.deleteSuccess')); + + checkedRowKeys.value = []; + + await getData(); + } + + /** the hook after the delete operation is completed */ + async function onDeleted() { + window.$message?.success($t('common.deleteSuccess')); + + await getData(); + } + + return { + drawerVisible, + openDrawer, + closeDrawer, + operateType, + handleAdd, + editingData, + handleEdit, + checkedRowKeys, + onBatchDeleted, + onDeleted + }; +} + +export function defaultTransform( + response: FlatResponseData> +): PaginationData { + const { data, error } = response; + + if (error) { + return { + data: [], + pageNum: 1, + total: 0 + }; + } + + const { rows: records, pageNum: current, total } = data; + + return { + data: records, + pageNum: current, + total + }; +} + +type TreeTableTransformResult = { + /** tree data for display */ + tree: ApiData[]; + /** flat data for operations */ + flatData: ApiData[]; +}; + +type UseNaiveTreeTableOptions = Omit< + UseNaiveTableOptions, + 'transform' +> & { + keyField: keyof ApiData; + defaultExpandAll?: boolean; + /** + * transform api response to tree table data + */ + transform: (response: ResponseData) => TreeTableTransformResult; +}; + +export function useNaiveTreeTable(options: UseNaiveTreeTableOptions) { + const scope = effectScope(); + const appStore = useAppStore(); + const rows: Ref = ref([]); + + const result = useTable, false>({ + ...options, + pagination: false, + transform: response => { + const transformed = options.transform(response); + // save flat data for operations + rows.value = transformed.flatData; + // return tree data for display + return transformed.tree; + }, + getColumnChecks: cols => getColumnChecks(cols, options.getColumnVisible), + getColumns + }); + + // calculate the total width of the table this is used for horizontal scrolling + const scrollX = computed(() => { + return result.columns.value.reduce((acc, column) => { + return acc + Number(column.width ?? column.minWidth ?? 120); + }, 0); + }); + + const { keyField = 'id', defaultExpandAll = false } = options; + + const expandedRowKeys = ref([]); + const { bool: isCollapse, toggle: toggleCollapse } = useBoolean(defaultExpandAll); + + /** expand all nodes */ + function expandAll() { + toggleCollapse(); + expandedRowKeys.value = rows.value.map(item => item[keyField as keyof ApiData]); + } + + /** collapse all nodes */ + function collapseAll() { + toggleCollapse(); + expandedRowKeys.value = []; + } + + scope.run(() => { + watch( + () => appStore.locale, + () => { + result.reloadColumns(); + } + ); + }); + + onScopeDispose(() => { + scope.stop(); + }); + + return { + ...result, + scrollX, + rows, + isCollapse, + expandedRowKeys, + expandAll, + collapseAll + }; +} + +export function useTreeTableOperate(data: Ref, idKey: keyof ApiData, getData: () => Promise) { + const { bool: drawerVisible, setTrue: openDrawer, setFalse: closeDrawer } = useBoolean(); + + const operateType = shallowRef('add'); + + function handleAdd() { + operateType.value = 'add'; + openDrawer(); + } + + /** the editing row data */ + const editingData = shallowRef(null); + + function handleEdit(id: ApiData[keyof ApiData]) { + operateType.value = 'edit'; + const findItem = data.value.find(item => item[idKey] === id) || null; + editingData.value = jsonClone(findItem); + + openDrawer(); + } + + /** the checked row keys of table */ + const checkedRowKeys = shallowRef([]); + + /** the hook after the batch delete operation is completed */ + async function onBatchDeleted() { + window.$message?.success($t('common.deleteSuccess')); + + checkedRowKeys.value = []; + + await getData(); + } + + /** the hook after the delete operation is completed */ + async function onDeleted() { + window.$message?.success($t('common.deleteSuccess')); + + await getData(); + } + + return { + drawerVisible, + openDrawer, + closeDrawer, + operateType, + handleAdd, + editingData, + handleEdit, + checkedRowKeys, + onBatchDeleted, + onDeleted + }; +} + +export function treeTransform( + response: FlatResponseData, + options: CommonType.TreeConfig = {} +): TreeTableTransformResult { + const { data, error } = response; + + if (!error) { + return handleTree(data, options); + } + + return { + tree: [], + flatData: [] + }; +} + +function getColumnChecks>( + cols: Column[], + getColumnVisible?: (column: Column) => boolean +) { + const checks: TableColumnCheck[] = []; + + cols.forEach(column => { + if (isTableColumnHasKey(column)) { + checks.push({ + key: column.key as string, + title: column.title!, + checked: true, + visible: getColumnVisible?.(column) ?? true + }); + } else if (column.type === 'selection') { + checks.push({ + key: SELECTION_KEY, + title: $t('common.check'), + checked: true, + visible: getColumnVisible?.(column) ?? false + }); + } else if (column.type === 'expand') { + checks.push({ + key: EXPAND_KEY, + title: $t('common.expandColumn'), + checked: true, + visible: getColumnVisible?.(column) ?? false + }); + } + }); + + return checks; +} + +function getColumns>(cols: Column[], checks: TableColumnCheck[]) { + const columnMap = new Map(); + + cols.forEach(column => { + if (isTableColumnHasKey(column)) { + columnMap.set(column.key as string, column); + } else if (column.type === 'selection') { + columnMap.set(SELECTION_KEY, column); + } else if (column.type === 'expand') { + columnMap.set(EXPAND_KEY, column); + } + }); + + // Filter out any checks that do not have a corresponding column (can happen when column definitions change). + const filteredColumns = checks + .filter(item => item.checked) + .map(check => columnMap.get(check.key)) + .filter((col): col is Column => Boolean(col)); + + return filteredColumns; +} + +export function isTableColumnHasKey(column: NaiveUI.TableColumn): column is NaiveUI.TableColumnWithKey { + return Boolean((column as NaiveUI.TableColumnWithKey).key); +} diff --git a/src/layouts/base-layout/index.vue b/src/layouts/base-layout/index.vue new file mode 100644 index 0000000..99b163e --- /dev/null +++ b/src/layouts/base-layout/index.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/src/layouts/blank-layout/index.vue b/src/layouts/blank-layout/index.vue new file mode 100644 index 0000000..2e393f0 --- /dev/null +++ b/src/layouts/blank-layout/index.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/src/layouts/modules/global-breadcrumb/index.vue b/src/layouts/modules/global-breadcrumb/index.vue new file mode 100644 index 0000000..0a17907 --- /dev/null +++ b/src/layouts/modules/global-breadcrumb/index.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/src/layouts/modules/global-content/index.vue b/src/layouts/modules/global-content/index.vue new file mode 100644 index 0000000..cff3c44 --- /dev/null +++ b/src/layouts/modules/global-content/index.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/layouts/modules/global-footer/index.vue b/src/layouts/modules/global-footer/index.vue new file mode 100644 index 0000000..ba50b6a --- /dev/null +++ b/src/layouts/modules/global-footer/index.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/src/layouts/modules/global-header/components/message-button.vue b/src/layouts/modules/global-header/components/message-button.vue new file mode 100644 index 0000000..c235481 --- /dev/null +++ b/src/layouts/modules/global-header/components/message-button.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/src/layouts/modules/global-header/components/theme-button.vue b/src/layouts/modules/global-header/components/theme-button.vue new file mode 100644 index 0000000..06c40ec --- /dev/null +++ b/src/layouts/modules/global-header/components/theme-button.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/src/layouts/modules/global-header/components/user-avatar.vue b/src/layouts/modules/global-header/components/user-avatar.vue new file mode 100644 index 0000000..9cc2971 --- /dev/null +++ b/src/layouts/modules/global-header/components/user-avatar.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/src/layouts/modules/global-header/index.vue b/src/layouts/modules/global-header/index.vue new file mode 100644 index 0000000..786047b --- /dev/null +++ b/src/layouts/modules/global-header/index.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/src/layouts/modules/global-logo/index.vue b/src/layouts/modules/global-logo/index.vue new file mode 100644 index 0000000..1f854c3 --- /dev/null +++ b/src/layouts/modules/global-logo/index.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/src/layouts/modules/global-menu/components/first-level-menu.vue b/src/layouts/modules/global-menu/components/first-level-menu.vue new file mode 100644 index 0000000..d0a6fdf --- /dev/null +++ b/src/layouts/modules/global-menu/components/first-level-menu.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/src/layouts/modules/global-menu/context/index.ts b/src/layouts/modules/global-menu/context/index.ts new file mode 100644 index 0000000..351b5f1 --- /dev/null +++ b/src/layouts/modules/global-menu/context/index.ts @@ -0,0 +1,215 @@ +import { computed, ref, watch } from 'vue'; +import { useRoute } from 'vue-router'; +import { useContext } from '@sa/hooks'; +import type { RouteKey } from '@elegant-router/types'; +import { useRouteStore } from '@/store/modules/route'; +import { useThemeStore } from '@/store/modules/theme'; +import { useRouterPush } from '@/hooks/common/router'; + +export const [provideMixMenuContext, useMixMenuContext] = useContext('MixMenu', useMixMenu); + +function useMixMenu() { + const route = useRoute(); + const routeStore = useRouteStore(); + const themeStore = useThemeStore(); + const { selectedKey } = useMenu(); + const { routerPushByKeyWithMetaQuery } = useRouterPush(); + + const allMenus = computed(() => routeStore.menus); + + const firstLevelMenus = computed(() => + routeStore.menus.map(menu => { + const { children: _, ...rest } = menu; + + return rest; + }) + ); + + const activeFirstLevelMenuKey = ref(''); + + function setActiveFirstLevelMenuKey(key: string) { + activeFirstLevelMenuKey.value = key; + } + + function getActiveFirstLevelMenuKey() { + const currentKey = selectedKey.value; + + const firstLevelMenu = allMenus.value.find(menu => { + if (menu.key === currentKey) { + return true; + } + + if (menu.children && menu.children.length > 0) { + return findMenuByKey(menu.children, currentKey); + } + + return false; + }); + + if (firstLevelMenu) { + setActiveFirstLevelMenuKey(firstLevelMenu.key); + } else { + const [firstLevelRouteName] = currentKey.split('_'); + setActiveFirstLevelMenuKey(firstLevelRouteName); + } + } + + function findMenuByKey(menus: App.Global.Menu[], key: string): boolean { + return menus.some(menu => { + if (menu.key === key) { + return true; + } + + if (menu.children && menu.children.length > 0) { + return findMenuByKey(menu.children, key); + } + + return false; + }); + } + + const isActiveFirstLevelMenuHasChildren = computed(() => { + if (!activeFirstLevelMenuKey.value) { + return false; + } + + const findItem = allMenus.value.find(item => item.key === activeFirstLevelMenuKey.value); + + return Boolean(findItem?.children?.length); + }); + + function handleSelectFirstLevelMenu(key: RouteKey) { + setActiveFirstLevelMenuKey(key); + + if (!isActiveFirstLevelMenuHasChildren.value) { + routerPushByKeyWithMetaQuery(key); + } + } + + const secondLevelMenus = computed( + () => allMenus.value.find(menu => menu.key === activeFirstLevelMenuKey.value)?.children || [] + ); + + const activeSecondLevelMenuKey = ref(''); + + function setActiveSecondLevelMenuKey(key: string) { + activeSecondLevelMenuKey.value = key; + } + + function getActiveSecondLevelMenuKey() { + const keys = selectedKey.value.split('_'); + + if (keys.length < 2) { + setActiveSecondLevelMenuKey(''); + return; + } + + const [firstLevelRouteName, level2SuffixName] = keys; + + const secondLevelRouteName = `${firstLevelRouteName}_${level2SuffixName}`; + + setActiveSecondLevelMenuKey(secondLevelRouteName); + } + + const isActiveSecondLevelMenuHasChildren = computed(() => { + if (!activeSecondLevelMenuKey.value) { + return false; + } + + const findItem = secondLevelMenus.value.find(item => item.key === activeSecondLevelMenuKey.value); + + return Boolean(findItem?.children?.length); + }); + + function handleSelectSecondLevelMenu(key: RouteKey) { + setActiveSecondLevelMenuKey(key); + + if (!isActiveSecondLevelMenuHasChildren.value) { + routerPushByKeyWithMetaQuery(key); + } + } + + const childLevelMenus = computed( + () => secondLevelMenus.value.find(menu => menu.key === activeSecondLevelMenuKey.value)?.children || [] + ); + + const hasChildLevelMenus = computed(() => childLevelMenus.value.length > 0); + + function getDeepestLevelMenuKey(): RouteKey | null { + if (!secondLevelMenus.value.length || !themeStore.sider.autoSelectFirstMenu) { + return null; + } + + const secondLevelFirstMenu = secondLevelMenus.value[0]; + + if (!secondLevelFirstMenu) { + return null; + } + + function findDeepest(menu: App.Global.Menu): RouteKey { + if (!menu.children?.length) { + return menu.routeKey; + } + + return findDeepest(menu.children[0]); + } + + return findDeepest(secondLevelFirstMenu); + } + + function activeDeepestLevelMenuKey() { + const deepestLevelMenuKey = getDeepestLevelMenuKey(); + if (!deepestLevelMenuKey) return; + + // select the deepest second level menu + handleSelectSecondLevelMenu(deepestLevelMenuKey); + } + + watch( + () => route.name, + () => { + getActiveFirstLevelMenuKey(); + // if there are child level menus, get the active second level menu key + if (hasChildLevelMenus.value) { + getActiveSecondLevelMenuKey(); + } + }, + { immediate: true } + ); + + return { + firstLevelMenus, + activeFirstLevelMenuKey, + setActiveFirstLevelMenuKey, + isActiveFirstLevelMenuHasChildren, + handleSelectFirstLevelMenu, + getActiveFirstLevelMenuKey, + secondLevelMenus, + activeSecondLevelMenuKey, + setActiveSecondLevelMenuKey, + isActiveSecondLevelMenuHasChildren, + handleSelectSecondLevelMenu, + getActiveSecondLevelMenuKey, + childLevelMenus, + hasChildLevelMenus, + getDeepestLevelMenuKey, + activeDeepestLevelMenuKey + }; +} + +export function useMenu() { + const route = useRoute(); + + const selectedKey = computed(() => { + const { hideInMenu, activeMenu } = route.meta; + const name = route.name as string; + + const routeName = (hideInMenu ? activeMenu : name) || name; + + return routeName; + }); + + return { + selectedKey + }; +} diff --git a/src/layouts/modules/global-menu/index.vue b/src/layouts/modules/global-menu/index.vue new file mode 100644 index 0000000..571e19f --- /dev/null +++ b/src/layouts/modules/global-menu/index.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/layouts/modules/global-menu/modules/horizontal-menu.vue b/src/layouts/modules/global-menu/modules/horizontal-menu.vue new file mode 100644 index 0000000..b696a30 --- /dev/null +++ b/src/layouts/modules/global-menu/modules/horizontal-menu.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/layouts/modules/global-menu/modules/top-hybrid-header-first.vue b/src/layouts/modules/global-menu/modules/top-hybrid-header-first.vue new file mode 100644 index 0000000..b312f42 --- /dev/null +++ b/src/layouts/modules/global-menu/modules/top-hybrid-header-first.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/src/layouts/modules/global-menu/modules/top-hybrid-sidebar-first.vue b/src/layouts/modules/global-menu/modules/top-hybrid-sidebar-first.vue new file mode 100644 index 0000000..d12189e --- /dev/null +++ b/src/layouts/modules/global-menu/modules/top-hybrid-sidebar-first.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/src/layouts/modules/global-menu/modules/vertical-hybrid-header-first.vue b/src/layouts/modules/global-menu/modules/vertical-hybrid-header-first.vue new file mode 100644 index 0000000..a689fd4 --- /dev/null +++ b/src/layouts/modules/global-menu/modules/vertical-hybrid-header-first.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/src/layouts/modules/global-menu/modules/vertical-menu.vue b/src/layouts/modules/global-menu/modules/vertical-menu.vue new file mode 100644 index 0000000..d42275b --- /dev/null +++ b/src/layouts/modules/global-menu/modules/vertical-menu.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/layouts/modules/global-menu/modules/vertical-mix-menu.vue b/src/layouts/modules/global-menu/modules/vertical-mix-menu.vue new file mode 100644 index 0000000..9d60652 --- /dev/null +++ b/src/layouts/modules/global-menu/modules/vertical-mix-menu.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/layouts/modules/global-search/components/search-footer.vue b/src/layouts/modules/global-search/components/search-footer.vue new file mode 100644 index 0000000..0fa6c8f --- /dev/null +++ b/src/layouts/modules/global-search/components/search-footer.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/layouts/modules/global-search/components/search-modal.vue b/src/layouts/modules/global-search/components/search-modal.vue new file mode 100644 index 0000000..39f18a8 --- /dev/null +++ b/src/layouts/modules/global-search/components/search-modal.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/src/layouts/modules/global-search/components/search-result.vue b/src/layouts/modules/global-search/components/search-result.vue new file mode 100644 index 0000000..bb13952 --- /dev/null +++ b/src/layouts/modules/global-search/components/search-result.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/layouts/modules/global-search/index.vue b/src/layouts/modules/global-search/index.vue new file mode 100644 index 0000000..95c2a7b --- /dev/null +++ b/src/layouts/modules/global-search/index.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/src/layouts/modules/global-sider/index.vue b/src/layouts/modules/global-sider/index.vue new file mode 100644 index 0000000..0deece5 --- /dev/null +++ b/src/layouts/modules/global-sider/index.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/layouts/modules/global-tab/context-menu.vue b/src/layouts/modules/global-tab/context-menu.vue new file mode 100644 index 0000000..1145ee2 --- /dev/null +++ b/src/layouts/modules/global-tab/context-menu.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/src/layouts/modules/global-tab/index.vue b/src/layouts/modules/global-tab/index.vue new file mode 100644 index 0000000..5e3c92d --- /dev/null +++ b/src/layouts/modules/global-tab/index.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/components/layout-mode-card.vue b/src/layouts/modules/theme-drawer/components/layout-mode-card.vue new file mode 100644 index 0000000..e056350 --- /dev/null +++ b/src/layouts/modules/theme-drawer/components/layout-mode-card.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/components/setting-item.vue b/src/layouts/modules/theme-drawer/components/setting-item.vue new file mode 100644 index 0000000..07316a6 --- /dev/null +++ b/src/layouts/modules/theme-drawer/components/setting-item.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/index.vue b/src/layouts/modules/theme-drawer/index.vue new file mode 100644 index 0000000..b874671 --- /dev/null +++ b/src/layouts/modules/theme-drawer/index.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/modules/appearance/index.vue b/src/layouts/modules/theme-drawer/modules/appearance/index.vue new file mode 100644 index 0000000..a7f65e4 --- /dev/null +++ b/src/layouts/modules/theme-drawer/modules/appearance/index.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-color.vue b/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-color.vue new file mode 100644 index 0000000..6c38897 --- /dev/null +++ b/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-color.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-radius.vue b/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-radius.vue new file mode 100644 index 0000000..499403b --- /dev/null +++ b/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-radius.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-schema.vue b/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-schema.vue new file mode 100644 index 0000000..c8b689a --- /dev/null +++ b/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-schema.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/layouts/modules/theme-drawer/modules/config-operation.vue b/src/layouts/modules/theme-drawer/modules/config-operation.vue new file mode 100644 index 0000000..f2df602 --- /dev/null +++ b/src/layouts/modules/theme-drawer/modules/config-operation.vue @@ -0,0 +1,58 @@ + + +